From 1420ad04d233b37b3f7a273276c7a7e97e411ffb Mon Sep 17 00:00:00 2001 From: Shubham Yadav Date: Mon, 14 Aug 2023 23:56:55 +0100 Subject: [PATCH 01/47] feat: add transferrable bool field for stream NFT --- src/SablierV2LockupDynamic.sol | 8 ++++++++ src/SablierV2LockupLinear.sol | 8 ++++++++ src/interfaces/ISablierV2Lockup.sol | 5 +++++ src/interfaces/ISablierV2LockupDynamic.sol | 2 ++ src/interfaces/ISablierV2LockupLinear.sol | 2 ++ src/types/DataTypes.sol | 12 ++++++++++++ test/utils/Defaults.sol | 6 ++++++ 7 files changed, 43 insertions(+) diff --git a/src/SablierV2LockupDynamic.sol b/src/SablierV2LockupDynamic.sol index 8bf388d6d..7dd29a197 100644 --- a/src/SablierV2LockupDynamic.sol +++ b/src/SablierV2LockupDynamic.sol @@ -187,6 +187,11 @@ contract SablierV2LockupDynamic is } /// @inheritdoc ISablierV2Lockup + function isTransferrable(uint256 streamId) external view override notNull(streamId) returns (bool result) { + result = _streams[streamId].isTransferrable; + } + + /// @inheritdoc ISablierV2Lockup function isDepleted(uint256 streamId) public view @@ -266,6 +271,7 @@ contract SablierV2LockupDynamic is asset: params.asset, broker: params.broker, cancelable: params.cancelable, + transferrable: params.transferrable, recipient: params.recipient, segments: segments, sender: params.sender, @@ -553,6 +559,7 @@ contract SablierV2LockupDynamic is stream.amounts.deposited = createAmounts.deposit; stream.asset = params.asset; stream.isCancelable = params.cancelable; + stream.isTransferrable = params.transferrable; stream.isStream = true; stream.sender = params.sender; @@ -601,6 +608,7 @@ contract SablierV2LockupDynamic is amounts: createAmounts, asset: params.asset, cancelable: params.cancelable, + transferrable: params.transferrable, segments: params.segments, range: LockupDynamic.Range({ start: stream.startTime, end: stream.endTime }), broker: params.broker.account diff --git a/src/SablierV2LockupLinear.sol b/src/SablierV2LockupLinear.sol index 82efe356a..1ae0d910d 100644 --- a/src/SablierV2LockupLinear.sol +++ b/src/SablierV2LockupLinear.sol @@ -169,6 +169,11 @@ contract SablierV2LockupLinear is } } + /// @inheritdoc ISablierV2Lockup + function isTransferrable(uint256 streamId) external view override notNull(streamId) returns (bool result) { + result = _streams[streamId].isTransferrable; + } + /// @inheritdoc ISablierV2Lockup function isDepleted(uint256 streamId) public @@ -257,6 +262,7 @@ contract SablierV2LockupLinear is asset: params.asset, broker: params.broker, cancelable: params.cancelable, + transferrable: params.transferrable, range: range, recipient: params.recipient, sender: params.sender, @@ -467,6 +473,7 @@ contract SablierV2LockupLinear is cliffTime: params.range.cliff, endTime: params.range.end, isCancelable: params.cancelable, + isTransferrable: params.transferrable, isDepleted: false, isStream: true, sender: params.sender, @@ -508,6 +515,7 @@ contract SablierV2LockupLinear is amounts: createAmounts, asset: params.asset, cancelable: params.cancelable, + transferrable: params.transferrable, range: params.range, broker: params.broker.account }); diff --git a/src/interfaces/ISablierV2Lockup.sol b/src/interfaces/ISablierV2Lockup.sol index 7049dff2c..930d33c7b 100644 --- a/src/interfaces/ISablierV2Lockup.sol +++ b/src/interfaces/ISablierV2Lockup.sol @@ -103,6 +103,11 @@ interface ISablierV2Lockup is /// @param streamId The stream id for the query. function isCancelable(uint256 streamId) external view returns (bool result); + /// @notice Retrieves a flag indicating whether the stream NFT can be transferred. + /// @dev Reverts if `streamId` references a null stream. + /// @param streamId The stream id for the query. + function isTransferrable(uint256 streamId) external view returns (bool result); + /// @notice Retrieves a flag indicating whether the stream is cold, i.e. settled, canceled, or depleted. /// @dev Reverts if `streamId` references a null stream. /// @param streamId The stream id for the query. diff --git a/src/interfaces/ISablierV2LockupDynamic.sol b/src/interfaces/ISablierV2LockupDynamic.sol index a2f99301f..c32a986c8 100644 --- a/src/interfaces/ISablierV2LockupDynamic.sol +++ b/src/interfaces/ISablierV2LockupDynamic.sol @@ -22,6 +22,7 @@ interface ISablierV2LockupDynamic is ISablierV2Lockup { /// broker fee amount, all denoted in units of the asset's decimals. /// @param asset The contract address of the ERC-20 asset used for streaming. /// @param cancelable Boolean indicating whether the stream will be cancelable or not. + /// @param transferrable Boolean indicating whether the stream NFT is transferrable or not. /// @param segments The segments the protocol uses to compose the custom streaming curve. /// @param range Struct containing (i) the stream's start time and (ii) end time, both as Unix timestamps. /// @param broker The address of the broker who has helped create the stream, e.g. a front-end website. @@ -33,6 +34,7 @@ interface ISablierV2LockupDynamic is ISablierV2Lockup { Lockup.CreateAmounts amounts, IERC20 indexed asset, bool cancelable, + bool transferrable, LockupDynamic.Segment[] segments, LockupDynamic.Range range, address broker diff --git a/src/interfaces/ISablierV2LockupLinear.sol b/src/interfaces/ISablierV2LockupLinear.sol index 90e5dd7f2..115afba1b 100644 --- a/src/interfaces/ISablierV2LockupLinear.sol +++ b/src/interfaces/ISablierV2LockupLinear.sol @@ -22,6 +22,7 @@ interface ISablierV2LockupLinear is ISablierV2Lockup { /// broker fee amount, all denoted in units of the asset's decimals. /// @param asset The contract address of the ERC-20 asset used for streaming. /// @param cancelable Boolean indicating whether the stream will be cancelable or not. + /// @param transferrable Boolean indicating whether the stream NFT is transferrable or not. /// @param range Struct containing (i) the stream's start time, (ii) cliff time, and (iii) end time, all as Unix /// timestamps. /// @param broker The address of the broker who has helped create the stream, e.g. a front-end website. @@ -33,6 +34,7 @@ interface ISablierV2LockupLinear is ISablierV2Lockup { Lockup.CreateAmounts amounts, IERC20 indexed asset, bool cancelable, + bool transferrable, LockupLinear.Range range, address broker ); diff --git a/src/types/DataTypes.sol b/src/types/DataTypes.sol index 7e1bf1ab3..0c85f7e00 100644 --- a/src/types/DataTypes.sol +++ b/src/types/DataTypes.sol @@ -78,6 +78,7 @@ library LockupDynamic { /// fees, all denoted in units of the asset's decimals. /// @param asset The contract address of the ERC-20 asset used for streaming. /// @param cancelable Indicates if the stream is cancelable. + /// @param transferrable Indicates if the stream NFT is transferrable. /// @param broker Struct containing (i) the address of the broker assisting in creating the stream, and (ii) the /// percentage fee paid to the broker from `totalAmount`, denoted as a fixed-point number. Both can be set to zero. /// @param segments Segments with deltas used to compose the custom streaming curve. Milestones are calculated by @@ -85,6 +86,7 @@ library LockupDynamic { struct CreateWithDeltas { address sender; bool cancelable; + bool transferrable; address recipient; uint128 totalAmount; IERC20 asset; @@ -98,6 +100,7 @@ library LockupDynamic { /// same as `msg.sender`. /// @param startTime The Unix timestamp indicating the stream's start. /// @param cancelable Indicates if the stream is cancelable. + /// @param transferrable Indicates if the stream NFT is transferrable. /// @param recipient The address receiving the assets. /// @param totalAmount The total amount of ERC-20 assets to be paid, including the stream deposit and any potential /// fees, all denoted in units of the asset's decimals. @@ -109,6 +112,7 @@ library LockupDynamic { address sender; uint40 startTime; bool cancelable; + bool transferrable; address recipient; uint128 totalAmount; IERC20 asset; @@ -155,6 +159,7 @@ library LockupDynamic { /// @param asset The contract address of the ERC-20 asset used for streaming. /// @param isDepleted Boolean indicating if the stream is depleted. /// @param isStream Boolean indicating if the struct entity exists. + /// @param isTransferrable BooleaniIndicating if the stream NFT is transferrable. /// @param amounts Struct containing the deposit, withdrawn, and refunded amounts, all denoted in units of the /// asset's decimals. /// @param segments Segments used to compose the custom streaming curve. @@ -169,6 +174,7 @@ library LockupDynamic { IERC20 asset; bool isDepleted; bool isStream; + bool isTransferrable; // slot 2 and 3 Lockup.Amounts amounts; // slots [4..n] @@ -186,6 +192,7 @@ library LockupLinear { /// fees, all denoted in units of the asset's decimals. /// @param asset The contract address of the ERC-20 asset used for streaming. /// @param cancelable Indicates if the stream is cancelable. + /// @param transferrable Indicates if the stream NFT is transferrable. /// @param durations Struct containing (i) cliff period duration and (ii) total stream duration, both in seconds. /// @param broker Struct containing (i) the address of the broker assisting in creating the stream, and (ii) the /// percentage fee paid to the broker from `totalAmount`, denoted as a fixed-point number. Both can be set to zero. @@ -195,6 +202,7 @@ library LockupLinear { uint128 totalAmount; IERC20 asset; bool cancelable; + bool transferrable; Durations durations; Broker broker; } @@ -207,6 +215,7 @@ library LockupLinear { /// fees, all denoted in units of the asset's decimals. /// @param asset The contract address of the ERC-20 asset used for streaming. /// @param cancelable Indicates if the stream is cancelable. + /// @param transferrable Indicates if the stream NFT is transferrable. /// @param range Struct containing (i) the stream's start time, (ii) cliff time, and (iii) end time, all as Unix /// timestamps. /// @param broker Struct containing (i) the address of the broker assisting in creating the stream, and (ii) the @@ -217,6 +226,7 @@ library LockupLinear { uint128 totalAmount; IERC20 asset; bool cancelable; + bool transferrable; Range range; Broker broker; } @@ -250,6 +260,7 @@ library LockupLinear { /// @param endTime The Unix timestamp indicating the stream's end. /// @param isDepleted Boolean indicating if the stream is depleted. /// @param isStream Boolean indicating if the struct entity exists. + /// @param isTransferrable BooleaniIndicating if the stream NFT is transferrable. /// @param amounts Struct containing the deposit, withdrawn, and refunded amounts, all denoted in units of the /// asset's decimals. struct Stream { @@ -264,6 +275,7 @@ library LockupLinear { uint40 endTime; bool isDepleted; bool isStream; + bool isTransferrable; // slot 2 and 3 Lockup.Amounts amounts; } diff --git a/test/utils/Defaults.sol b/test/utils/Defaults.sol index cfc5061a7..220bca765 100644 --- a/test/utils/Defaults.sol +++ b/test/utils/Defaults.sol @@ -104,6 +104,7 @@ contract Defaults is Constants { isCancelable: true, isDepleted: false, isStream: true, + isTransferrable: true, segments: segments(), sender: users.sender, startTime: START_TIME, @@ -122,6 +123,7 @@ contract Defaults is Constants { cliffTime: CLIFF_TIME, endTime: END_TIME, isCancelable: true, + isTransferrable: true, isDepleted: false, isStream: true, sender: users.sender, @@ -185,6 +187,7 @@ contract Defaults is Constants { asset: asset, broker: broker(), cancelable: true, + transferrable: true, recipient: users.recipient, segments: segmentsWithDeltas(), sender: users.sender, @@ -197,6 +200,7 @@ contract Defaults is Constants { asset: asset, broker: broker(), cancelable: true, + transferrable: true, durations: durations(), recipient: users.recipient, sender: users.sender, @@ -209,6 +213,7 @@ contract Defaults is Constants { asset: asset, broker: broker(), cancelable: true, + transferrable: true, recipient: users.recipient, segments: segments(), sender: users.sender, @@ -222,6 +227,7 @@ contract Defaults is Constants { asset: asset, broker: broker(), cancelable: true, + transferrable: true, range: lockupLinearRange(), recipient: users.recipient, sender: users.sender, From 586b452ce0a6bce9efc309b86cc8263284b7afcb Mon Sep 17 00:00:00 2001 From: Shubham Yadav Date: Thu, 24 Aug 2023 17:56:34 +0100 Subject: [PATCH 02/47] feat: override _beforeTokenTransfer for Stream NFT and test cases --- script/Init.s.sol | 3 ++ src/SablierV2LockupDynamic.sol | 31 ++++++++++++++++++- src/SablierV2LockupLinear.sol | 29 +++++++++++++++++ src/libraries/Errors.sol | 7 +++++ src/types/DataTypes.sol | 2 +- test/fork/LockupDynamic.t.sol | 3 ++ test/fork/LockupLinear.t.sol | 3 ++ .../create-with-deltas/createWithDeltas.t.sol | 4 +++ .../createWithMilestones.t.sol | 4 +++ .../createWithDurations.t.sol | 4 +++ .../create-with-range/createWithRange.t.sol | 4 +++ .../lockup-dynamic/createWithDeltas.t.sol | 2 ++ .../lockup-dynamic/createWithMilestones.t.sol | 3 ++ .../lockup-linear/createWithDurations.t.sol | 1 + .../fuzz/lockup-linear/createWithRange.t.sol | 3 ++ test/utils/Events.sol | 2 ++ 16 files changed, 103 insertions(+), 2 deletions(-) diff --git a/script/Init.s.sol b/script/Init.s.sol index 16f2db254..1c9c0bf20 100644 --- a/script/Init.s.sol +++ b/script/Init.s.sol @@ -30,6 +30,7 @@ contract Init is BaseScript { { address sender = broadcaster; address recipient = vm.addr(vm.deriveKey({ mnemonic: mnemonic, index: 1 })); + bool isTransferrable = true; /*////////////////////////////////////////////////////////////////////////// COMPTROLLER @@ -73,6 +74,7 @@ contract Init is BaseScript { totalAmount: totalAmounts[i], asset: asset, cancelable: true, + transferrable: isTransferrable, durations: LockupLinear.Durations({ cliff: cliffDurations[i], total: totalDurations[i] }), broker: Broker(address(0), ud60x18(0)) }) @@ -98,6 +100,7 @@ contract Init is BaseScript { asset: asset, broker: Broker(address(0), ud60x18(0)), cancelable: true, + transferrable: isTransferrable, recipient: recipient, sender: sender, segments: segments, diff --git a/src/SablierV2LockupDynamic.sol b/src/SablierV2LockupDynamic.sol index 7dd29a197..7822cae22 100644 --- a/src/SablierV2LockupDynamic.sol +++ b/src/SablierV2LockupDynamic.sol @@ -20,6 +20,8 @@ import { Errors } from "./libraries/Errors.sol"; import { Helpers } from "./libraries/Helpers.sol"; import { Lockup, LockupDynamic } from "./types/DataTypes.sol"; +import "forge-std/console.sol"; + /* ███████╗ █████╗ ██████╗ ██╗ ██╗███████╗██████╗ ██╗ ██╗██████╗ @@ -84,6 +86,17 @@ contract SablierV2LockupDynamic is nextStreamId = 1; } + /*////////////////////////////////////////////////////////////////////////// + ERC721 TRANFER HOOK FUNCTION + //////////////////////////////////////////////////////////////////////////*/ + + function _beforeTokenTransfer(address, address, uint256 streamId, uint256) internal view override(ERC721) { + console.logBool(_streams[streamId].isTransferrable); + if (!_streams[streamId].isTransferrable) { + revert Errors.SablierV2NFT_NotTransferrable(streamId); + } + } + /*////////////////////////////////////////////////////////////////////////// USER-FACING CONSTANT FUNCTIONS //////////////////////////////////////////////////////////////////////////*/ @@ -185,8 +198,8 @@ contract SablierV2LockupDynamic is result = _streams[streamId].isCancelable; } } - /// @inheritdoc ISablierV2Lockup + /// @inheritdoc ISablierV2Lockup function isTransferrable(uint256 streamId) external view override notNull(streamId) returns (bool result) { result = _streams[streamId].isTransferrable; } @@ -292,6 +305,22 @@ contract SablierV2LockupDynamic is streamId = _createWithMilestones(params); } + function toggleTransfer(uint256 streamId) public updateMetadata(streamId) { + // Checks: the stream is neither depleted nor canceled. This also checks that the stream is not null. + if (isDepleted(streamId)) { + revert Errors.SablierV2Lockup_StreamDepleted(streamId); + } else if (wasCanceled(streamId)) { + revert Errors.SablierV2Lockup_StreamCanceled(streamId); + } + + // Checks: `msg.sender` is the stream's sender + if (!_isCallerStreamSender(streamId)) { + revert Errors.SablierV2Lockup_Unauthorized(streamId, msg.sender); + } + + _streams[streamId].isTransferrable = !_streams[streamId].isTransferrable; + } + /*////////////////////////////////////////////////////////////////////////// INTERNAL CONSTANT FUNCTIONS //////////////////////////////////////////////////////////////////////////*/ diff --git a/src/SablierV2LockupLinear.sol b/src/SablierV2LockupLinear.sol index 1ae0d910d..7a73569b9 100644 --- a/src/SablierV2LockupLinear.sol +++ b/src/SablierV2LockupLinear.sol @@ -17,6 +17,8 @@ import { Errors } from "./libraries/Errors.sol"; import { Helpers } from "./libraries/Helpers.sol"; import { Lockup, LockupLinear } from "./types/DataTypes.sol"; +import "forge-std/console.sol"; + /* ███████╗ █████╗ ██████╗ ██╗ ██╗███████╗██████╗ ██╗ ██╗██████╗ @@ -69,6 +71,17 @@ contract SablierV2LockupLinear is nextStreamId = 1; } + /*////////////////////////////////////////////////////////////////////////// + ERC721 TRANFER HOOK FUNCTION + //////////////////////////////////////////////////////////////////////////*/ + + function _beforeTokenTransfer(address, address, uint256 streamId, uint256) internal view override(ERC721) { + console.logBool(_streams[streamId].isTransferrable); + if (!_streams[streamId].isTransferrable) { + revert Errors.SablierV2NFT_NotTransferrable(streamId); + } + } + /*////////////////////////////////////////////////////////////////////////// USER-FACING CONSTANT FUNCTIONS //////////////////////////////////////////////////////////////////////////*/ @@ -282,6 +295,22 @@ contract SablierV2LockupLinear is streamId = _createWithRange(params); } + function toggleTransfer(uint256 streamId) public updateMetadata(streamId) { + // Checks: the stream is neither depleted nor canceled. This also checks that the stream is not null. + if (isDepleted(streamId)) { + revert Errors.SablierV2Lockup_StreamDepleted(streamId); + } else if (wasCanceled(streamId)) { + revert Errors.SablierV2Lockup_StreamCanceled(streamId); + } + + // Checks: `msg.sender` is the stream's sender + if (!_isCallerStreamSender(streamId)) { + revert Errors.SablierV2Lockup_Unauthorized(streamId, msg.sender); + } + + _streams[streamId].isTransferrable = !_streams[streamId].isTransferrable; + } + /*////////////////////////////////////////////////////////////////////////// INTERNAL CONSTANT FUNCTIONS //////////////////////////////////////////////////////////////////////////*/ diff --git a/src/libraries/Errors.sol b/src/libraries/Errors.sol index 4eb1a17a3..c739532c5 100644 --- a/src/libraries/Errors.sol +++ b/src/libraries/Errors.sol @@ -137,4 +137,11 @@ library Errors { /// @notice Thrown when trying to generate the token URI for an unknown ERC-721 NFT contract. error SablierV2NFTDescriptor_UnknownNFT(IERC721Metadata nft, string symbol); + + /*////////////////////////////////////////////////////////////////////////// + SABLIER-V2-NFT-TRANSFERABILITY + //////////////////////////////////////////////////////////////////////////*/ + + /// @notice Thrown when trying to transfer Stream NFT when transferrability is disabled. + error SablierV2NFT_NotTransferrable(uint256 tokenId); } diff --git a/src/types/DataTypes.sol b/src/types/DataTypes.sol index 0c85f7e00..d185dab29 100644 --- a/src/types/DataTypes.sol +++ b/src/types/DataTypes.sol @@ -260,7 +260,7 @@ library LockupLinear { /// @param endTime The Unix timestamp indicating the stream's end. /// @param isDepleted Boolean indicating if the stream is depleted. /// @param isStream Boolean indicating if the struct entity exists. - /// @param isTransferrable BooleaniIndicating if the stream NFT is transferrable. + /// @param isTransferrable Boolean indicating if the stream NFT is transferrable. /// @param amounts Struct containing the deposit, withdrawn, and refunded amounts, all denoted in units of the /// asset's decimals. struct Stream { diff --git a/test/fork/LockupDynamic.t.sol b/test/fork/LockupDynamic.t.sol index dace293ab..c47073d18 100644 --- a/test/fork/LockupDynamic.t.sol +++ b/test/fork/LockupDynamic.t.sol @@ -42,6 +42,7 @@ abstract contract LockupDynamic_Fork_Test is Fork_Test { uint40 warpTimestamp; LockupDynamic.Segment[] segments; uint128 withdrawAmount; + bool transferrable; } struct Vars { @@ -165,6 +166,7 @@ abstract contract LockupDynamic_Fork_Test is Fork_Test { amounts: vars.createAmounts, asset: asset, cancelable: true, + transferrable: params.transferrable, segments: params.segments, range: vars.range, broker: params.broker.account @@ -176,6 +178,7 @@ abstract contract LockupDynamic_Fork_Test is Fork_Test { asset: asset, broker: params.broker, cancelable: true, + transferrable: params.transferrable, recipient: params.recipient, segments: params.segments, sender: params.sender, diff --git a/test/fork/LockupLinear.t.sol b/test/fork/LockupLinear.t.sol index eba56cdfb..b2b7a8f8b 100644 --- a/test/fork/LockupLinear.t.sol +++ b/test/fork/LockupLinear.t.sol @@ -42,6 +42,7 @@ abstract contract LockupLinear_Fork_Test is Fork_Test { uint128 totalAmount; uint40 warpTimestamp; uint128 withdrawAmount; + bool transferrable; } struct Vars { @@ -167,6 +168,7 @@ abstract contract LockupLinear_Fork_Test is Fork_Test { amounts: vars.createAmounts, asset: asset, cancelable: true, + transferrable: params.transferrable, range: params.range, broker: params.broker.account }); @@ -177,6 +179,7 @@ abstract contract LockupLinear_Fork_Test is Fork_Test { asset: asset, broker: params.broker, cancelable: true, + transferrable: params.transferrable, range: params.range, recipient: params.recipient, sender: params.sender, diff --git a/test/integration/concrete/lockup-dynamic/create-with-deltas/createWithDeltas.t.sol b/test/integration/concrete/lockup-dynamic/create-with-deltas/createWithDeltas.t.sol index f5b6105e0..5773802b9 100644 --- a/test/integration/concrete/lockup-dynamic/create-with-deltas/createWithDeltas.t.sol +++ b/test/integration/concrete/lockup-dynamic/create-with-deltas/createWithDeltas.t.sol @@ -135,6 +135,9 @@ contract CreateWithDeltas_LockupDynamic_Integration_Concrete_Test is segments[0].milestone = range.start + segmentsWithDeltas[0].delta; segments[1].milestone = segments[0].milestone + segmentsWithDeltas[1].delta; + // make NFT transferrable + bool transferrable = true; + // Expect the assets to be transferred from the funder to {SablierV2LockupDynamic}. expectCallToTransferFrom({ from: funder, @@ -155,6 +158,7 @@ contract CreateWithDeltas_LockupDynamic_Integration_Concrete_Test is amounts: defaults.lockupCreateAmounts(), asset: dai, cancelable: true, + transferrable: transferrable, segments: segments, range: range, broker: users.broker diff --git a/test/integration/concrete/lockup-dynamic/create-with-milestones/createWithMilestones.t.sol b/test/integration/concrete/lockup-dynamic/create-with-milestones/createWithMilestones.t.sol index 7f3c7693c..2b929bb9a 100644 --- a/test/integration/concrete/lockup-dynamic/create-with-milestones/createWithMilestones.t.sol +++ b/test/integration/concrete/lockup-dynamic/create-with-milestones/createWithMilestones.t.sol @@ -343,6 +343,9 @@ contract CreateWithMilestones_LockupDynamic_Integration_Concrete_Test is // Make the Sender the stream's funder. address funder = users.sender; + // make NFT transferrable + bool transferrable = true; + // Expect the assets to be transferred from the funder to {SablierV2LockupDynamic}. expectCallToTransferFrom({ asset: IERC20(asset), @@ -370,6 +373,7 @@ contract CreateWithMilestones_LockupDynamic_Integration_Concrete_Test is segments: defaults.segments(), asset: IERC20(asset), cancelable: true, + transferrable: transferrable, range: defaults.lockupDynamicRange(), broker: users.broker }); diff --git a/test/integration/concrete/lockup-linear/create-with-durations/createWithDurations.t.sol b/test/integration/concrete/lockup-linear/create-with-durations/createWithDurations.t.sol index 4fa4d6ce8..44055a4ef 100644 --- a/test/integration/concrete/lockup-linear/create-with-durations/createWithDurations.t.sol +++ b/test/integration/concrete/lockup-linear/create-with-durations/createWithDurations.t.sol @@ -100,6 +100,9 @@ contract CreateWithDurations_LockupLinear_Integration_Concrete_Test is end: currentTime + defaults.TOTAL_DURATION() }); + // make NFT transferrable + bool transferrable = true; + // Expect the assets to be transferred from the funder to {SablierV2LockupLinear}. expectCallToTransferFrom({ from: funder, @@ -120,6 +123,7 @@ contract CreateWithDurations_LockupLinear_Integration_Concrete_Test is amounts: defaults.lockupCreateAmounts(), asset: dai, cancelable: true, + transferrable: transferrable, range: range, broker: users.broker }); diff --git a/test/integration/concrete/lockup-linear/create-with-range/createWithRange.t.sol b/test/integration/concrete/lockup-linear/create-with-range/createWithRange.t.sol index 33d7ae280..f08190aa0 100644 --- a/test/integration/concrete/lockup-linear/create-with-range/createWithRange.t.sol +++ b/test/integration/concrete/lockup-linear/create-with-range/createWithRange.t.sol @@ -181,6 +181,9 @@ contract CreateWithRange_LockupLinear_Integration_Concrete_Test is // Make the Sender the stream's funder. address funder = users.sender; + // make NFT transferrable + bool transferrable = true; + // Expect the assets to be transferred from the funder to {SablierV2LockupLinear}. expectCallToTransferFrom({ asset: IERC20(asset), @@ -207,6 +210,7 @@ contract CreateWithRange_LockupLinear_Integration_Concrete_Test is amounts: defaults.lockupCreateAmounts(), asset: IERC20(asset), cancelable: true, + transferrable: transferrable, range: defaults.lockupLinearRange(), broker: users.broker }); diff --git a/test/integration/fuzz/lockup-dynamic/createWithDeltas.t.sol b/test/integration/fuzz/lockup-dynamic/createWithDeltas.t.sol index 51a1a5ce8..243cde5f8 100644 --- a/test/integration/fuzz/lockup-dynamic/createWithDeltas.t.sol +++ b/test/integration/fuzz/lockup-dynamic/createWithDeltas.t.sol @@ -91,6 +91,7 @@ contract CreateWithDeltas_LockupDynamic_Integration_Fuzz_Test is amounts: vars.createAmounts, asset: dai, cancelable: true, + transferrable: true, segments: vars.segmentsWithMilestones, range: range, broker: users.broker @@ -113,6 +114,7 @@ contract CreateWithDeltas_LockupDynamic_Integration_Fuzz_Test is assertEq(actualStream.asset, dai, "asset"); assertEq(actualStream.endTime, range.end, "endTime"); assertEq(actualStream.isCancelable, vars.isCancelable, "isCancelable"); + assertEq(actualStream.isTransferrable, true, "isTransferrable"); assertEq(actualStream.isDepleted, false, "isDepleted"); assertEq(actualStream.isStream, true, "isStream"); assertEq(actualStream.segments, vars.segmentsWithMilestones, "segments"); diff --git a/test/integration/fuzz/lockup-dynamic/createWithMilestones.t.sol b/test/integration/fuzz/lockup-dynamic/createWithMilestones.t.sol index c30911a5f..c1cd8bdbf 100644 --- a/test/integration/fuzz/lockup-dynamic/createWithMilestones.t.sol +++ b/test/integration/fuzz/lockup-dynamic/createWithMilestones.t.sol @@ -277,6 +277,7 @@ contract CreateWithMilestones_LockupDynamic_Integration_Fuzz_Test is amounts: vars.createAmounts, asset: dai, cancelable: params.cancelable, + transferrable: params.transferrable, segments: params.segments, range: range, broker: params.broker.account @@ -288,6 +289,7 @@ contract CreateWithMilestones_LockupDynamic_Integration_Fuzz_Test is asset: dai, broker: params.broker, cancelable: params.cancelable, + transferrable: params.transferrable, recipient: params.recipient, segments: params.segments, sender: params.sender, @@ -307,6 +309,7 @@ contract CreateWithMilestones_LockupDynamic_Integration_Fuzz_Test is assertEq(actualStream.asset, dai, "asset"); assertEq(actualStream.endTime, range.end, "endTime"); assertEq(actualStream.isCancelable, vars.isCancelable, "isCancelable"); + assertEq(actualStream.isTransferrable, true, "isTransferrable"); assertEq(actualStream.isDepleted, false, "isStream"); assertEq(actualStream.isStream, true, "isStream"); assertEq(actualStream.sender, params.sender, "sender"); diff --git a/test/integration/fuzz/lockup-linear/createWithDurations.t.sol b/test/integration/fuzz/lockup-linear/createWithDurations.t.sol index 73dc6930c..0b05bb536 100644 --- a/test/integration/fuzz/lockup-linear/createWithDurations.t.sol +++ b/test/integration/fuzz/lockup-linear/createWithDurations.t.sol @@ -117,6 +117,7 @@ contract CreateWithDurations_LockupLinear_Integration_Fuzz_Test is amounts: defaults.lockupCreateAmounts(), asset: dai, cancelable: true, + transferrable: true, range: range, broker: users.broker }); diff --git a/test/integration/fuzz/lockup-linear/createWithRange.t.sol b/test/integration/fuzz/lockup-linear/createWithRange.t.sol index 2bd4b8f3d..88c431680 100644 --- a/test/integration/fuzz/lockup-linear/createWithRange.t.sol +++ b/test/integration/fuzz/lockup-linear/createWithRange.t.sol @@ -147,6 +147,7 @@ contract CreateWithRange_LockupLinear_Integration_Fuzz_Test is params.range.end = boundUint40(params.range.end, params.range.cliff + 1 seconds, MAX_UNIX_TIMESTAMP); params.broker.fee = _bound(params.broker.fee, 0, MAX_FEE); protocolFee = _bound(protocolFee, 0, MAX_FEE); + params.transferrable = true; // Calculate the fee amounts and the deposit amount. Vars memory vars; @@ -189,6 +190,7 @@ contract CreateWithRange_LockupLinear_Integration_Fuzz_Test is amounts: vars.createAmounts, asset: dai, cancelable: params.cancelable, + transferrable: params.transferrable, range: params.range, broker: params.broker.account }); @@ -201,6 +203,7 @@ contract CreateWithRange_LockupLinear_Integration_Fuzz_Test is cancelable: params.cancelable, range: params.range, recipient: params.recipient, + transferrable: params.transferrable, sender: params.sender, totalAmount: params.totalAmount }) diff --git a/test/utils/Events.sol b/test/utils/Events.sol index fccfbeed3..d1934e767 100644 --- a/test/utils/Events.sol +++ b/test/utils/Events.sol @@ -96,6 +96,7 @@ abstract contract Events { Lockup.CreateAmounts amounts, IERC20 indexed asset, bool cancelable, + bool transferrable, LockupDynamic.Segment[] segments, LockupDynamic.Range range, address broker @@ -113,6 +114,7 @@ abstract contract Events { Lockup.CreateAmounts amounts, IERC20 indexed asset, bool cancelable, + bool transferrable, LockupLinear.Range range, address broker ); From 9a4e244a05f0da4f5a156b015964d3f0b621caf0 Mon Sep 17 00:00:00 2001 From: Shubham Yadav Date: Fri, 25 Aug 2023 20:06:05 +0100 Subject: [PATCH 03/47] test: Add test for NFT transfer functionality --- script/Init.s.sol | 5 +- src/SablierV2LockupDynamic.sol | 7 +- src/SablierV2LockupLinear.sol | 7 +- src/interfaces/ISablierV2Lockup.sol | 14 +++ test/fork/LockupDynamic.t.sol | 2 + test/fork/LockupLinear.t.sol | 2 + .../lockup-dynamic/LockupDynamic.t.sol | 15 ++++ .../concrete/lockup-linear/LockupLinear.t.sol | 15 ++++ .../is-transferrable/isTransferrable.t.sol | 89 +++++++++++++++++++ .../is-transferrable/isTransferrable.tree | 14 +++ .../lockup-dynamic/createWithDeltas.t.sol | 1 + .../lockup-dynamic/createWithMilestones.t.sol | 1 + .../fuzz/lockup-linear/createWithRange.t.sol | 1 + .../shared/lockup-dynamic/LockupDynamic.t.sol | 2 + .../handlers/LockupDynamicCreateHandler.sol | 6 ++ .../handlers/LockupLinearCreateHandler.sol | 6 ++ test/utils/Assertions.sol | 2 + 17 files changed, 176 insertions(+), 13 deletions(-) create mode 100644 test/integration/concrete/lockup/is-transferrable/isTransferrable.t.sol create mode 100644 test/integration/concrete/lockup/is-transferrable/isTransferrable.tree diff --git a/script/Init.s.sol b/script/Init.s.sol index 1c9c0bf20..7b667a2ee 100644 --- a/script/Init.s.sol +++ b/script/Init.s.sol @@ -30,7 +30,6 @@ contract Init is BaseScript { { address sender = broadcaster; address recipient = vm.addr(vm.deriveKey({ mnemonic: mnemonic, index: 1 })); - bool isTransferrable = true; /*////////////////////////////////////////////////////////////////////////// COMPTROLLER @@ -74,7 +73,7 @@ contract Init is BaseScript { totalAmount: totalAmounts[i], asset: asset, cancelable: true, - transferrable: isTransferrable, + transferrable: true, durations: LockupLinear.Durations({ cliff: cliffDurations[i], total: totalDurations[i] }), broker: Broker(address(0), ud60x18(0)) }) @@ -100,7 +99,7 @@ contract Init is BaseScript { asset: asset, broker: Broker(address(0), ud60x18(0)), cancelable: true, - transferrable: isTransferrable, + transferrable: true, recipient: recipient, sender: sender, segments: segments, diff --git a/src/SablierV2LockupDynamic.sol b/src/SablierV2LockupDynamic.sol index 7822cae22..b732a109f 100644 --- a/src/SablierV2LockupDynamic.sol +++ b/src/SablierV2LockupDynamic.sol @@ -20,8 +20,6 @@ import { Errors } from "./libraries/Errors.sol"; import { Helpers } from "./libraries/Helpers.sol"; import { Lockup, LockupDynamic } from "./types/DataTypes.sol"; -import "forge-std/console.sol"; - /* ███████╗ █████╗ ██████╗ ██╗ ██╗███████╗██████╗ ██╗ ██╗██████╗ @@ -90,8 +88,7 @@ contract SablierV2LockupDynamic is ERC721 TRANFER HOOK FUNCTION //////////////////////////////////////////////////////////////////////////*/ - function _beforeTokenTransfer(address, address, uint256 streamId, uint256) internal view override(ERC721) { - console.logBool(_streams[streamId].isTransferrable); + function _beforeTokenTransfer(address, address, uint256 streamId, uint256) internal view override { if (!_streams[streamId].isTransferrable) { revert Errors.SablierV2NFT_NotTransferrable(streamId); } @@ -305,7 +302,7 @@ contract SablierV2LockupDynamic is streamId = _createWithMilestones(params); } - function toggleTransfer(uint256 streamId) public updateMetadata(streamId) { + function toggleTransfer(uint256 streamId) public updateMetadata(streamId) notNull(streamId) { // Checks: the stream is neither depleted nor canceled. This also checks that the stream is not null. if (isDepleted(streamId)) { revert Errors.SablierV2Lockup_StreamDepleted(streamId); diff --git a/src/SablierV2LockupLinear.sol b/src/SablierV2LockupLinear.sol index 7a73569b9..86aaa90d9 100644 --- a/src/SablierV2LockupLinear.sol +++ b/src/SablierV2LockupLinear.sol @@ -17,8 +17,6 @@ import { Errors } from "./libraries/Errors.sol"; import { Helpers } from "./libraries/Helpers.sol"; import { Lockup, LockupLinear } from "./types/DataTypes.sol"; -import "forge-std/console.sol"; - /* ███████╗ █████╗ ██████╗ ██╗ ██╗███████╗██████╗ ██╗ ██╗██████╗ @@ -75,8 +73,7 @@ contract SablierV2LockupLinear is ERC721 TRANFER HOOK FUNCTION //////////////////////////////////////////////////////////////////////////*/ - function _beforeTokenTransfer(address, address, uint256 streamId, uint256) internal view override(ERC721) { - console.logBool(_streams[streamId].isTransferrable); + function _beforeTokenTransfer(address, address, uint256 streamId, uint256) internal view override { if (!_streams[streamId].isTransferrable) { revert Errors.SablierV2NFT_NotTransferrable(streamId); } @@ -295,7 +292,7 @@ contract SablierV2LockupLinear is streamId = _createWithRange(params); } - function toggleTransfer(uint256 streamId) public updateMetadata(streamId) { + function toggleTransfer(uint256 streamId) public updateMetadata(streamId) notNull(streamId) { // Checks: the stream is neither depleted nor canceled. This also checks that the stream is not null. if (isDepleted(streamId)) { revert Errors.SablierV2Lockup_StreamDepleted(streamId); diff --git a/src/interfaces/ISablierV2Lockup.sol b/src/interfaces/ISablierV2Lockup.sol index 930d33c7b..b23286ed4 100644 --- a/src/interfaces/ISablierV2Lockup.sol +++ b/src/interfaces/ISablierV2Lockup.sol @@ -222,6 +222,20 @@ interface ISablierV2Lockup is /// @param streamId The id of the stream to renounce. function renounce(uint256 streamId) external; + /// @notice Toggle stream NFT transferrability. + /// + /// @dev Emits a {MetadataUpdate} event. + /// + /// Notes: + /// - This function attempts to invoke _beforeTokenTransfer() hook on the stream's NFT. + /// + /// Requirements: + /// - `streamId` must not reference a null or depleted or canceled stream. + /// - `msg.sender` must be the stream's sender. + /// + /// @param streamId The id of the stream. + function toggleTransfer(uint256 streamId) external; + /// @notice Sets a new NFT descriptor contract, which produces the URI describing the Sablier stream NFTs. /// /// @dev Emits a {SetNFTDescriptor} and {BatchMetadataUpdate} event. diff --git a/test/fork/LockupDynamic.t.sol b/test/fork/LockupDynamic.t.sol index c47073d18..25f6d746a 100644 --- a/test/fork/LockupDynamic.t.sol +++ b/test/fork/LockupDynamic.t.sol @@ -120,6 +120,7 @@ abstract contract LockupDynamic_Fork_Test is Fork_Test { params.broker.fee = _bound(params.broker.fee, 0, MAX_FEE); params.protocolFee = _bound(params.protocolFee, 0, MAX_FEE); params.startTime = boundUint40(params.startTime, 0, defaults.START_TIME()); + params.transferrable = true; // Fuzz the segment milestones. fuzzSegmentMilestones(params.segments, params.startTime); @@ -199,6 +200,7 @@ abstract contract LockupDynamic_Fork_Test is Fork_Test { assertEq(actualStream.endTime, vars.range.end, "endTime"); assertEq(actualStream.isCancelable, vars.isCancelable, "isCancelable"); assertEq(actualStream.isDepleted, false, "isDepleted"); + assertEq(actualStream.isTransferrable, true, "isTransferrable"); assertEq(actualStream.isStream, true, "isStream"); assertEq(actualStream.segments, params.segments, "segments"); assertEq(actualStream.sender, params.sender, "sender"); diff --git a/test/fork/LockupLinear.t.sol b/test/fork/LockupLinear.t.sol index b2b7a8f8b..f97cbce17 100644 --- a/test/fork/LockupLinear.t.sol +++ b/test/fork/LockupLinear.t.sol @@ -122,6 +122,7 @@ abstract contract LockupLinear_Fork_Test is Fork_Test { params.range.start = boundUint40(params.range.start, currentTime - 1000 seconds, currentTime + 10_000 seconds); params.range.cliff = boundUint40(params.range.cliff, params.range.start, params.range.start + 52 weeks); params.totalAmount = boundUint128(params.totalAmount, 1, uint128(initialHolderBalance)); + params.transferrable = true; // Bound the end time so that it is always greater than both the current time and the cliff time (this is // a requirement of the protocol). @@ -195,6 +196,7 @@ abstract contract LockupLinear_Fork_Test is Fork_Test { assertEq(actualStream.endTime, params.range.end, "endTime"); assertEq(actualStream.isCancelable, true, "isCancelable"); assertEq(actualStream.isDepleted, false, "isDepleted"); + assertEq(actualStream.isTransferrable, true, "isTransferrable"); assertEq(actualStream.isStream, true, "isStream"); assertEq(actualStream.sender, params.sender, "sender"); assertEq(actualStream.startTime, params.range.start, "startTime"); diff --git a/test/integration/concrete/lockup-dynamic/LockupDynamic.t.sol b/test/integration/concrete/lockup-dynamic/LockupDynamic.t.sol index 5bfb3d2c6..976017527 100644 --- a/test/integration/concrete/lockup-dynamic/LockupDynamic.t.sol +++ b/test/integration/concrete/lockup-dynamic/LockupDynamic.t.sol @@ -22,6 +22,7 @@ import { GetWithdrawnAmount_Integration_Concrete_Test } from "../lockup/get-with import { IsCancelable_Integration_Concrete_Test } from "../lockup/is-cancelable/isCancelable.t.sol"; import { IsCold_Integration_Concrete_Test } from "../lockup/is-cold/isCold.t.sol"; import { IsDepleted_Integration_Concrete_Test } from "../lockup/is-depleted/isDepleted.t.sol"; +import { IsTransferrable_Integration_Concrete_Test } from "../lockup/is-transferrable/isTransferrable.t.sol"; import { IsStream_Integration_Concrete_Test } from "../lockup/is-stream/isStream.t.sol"; import { IsWarm_Integration_Concrete_Test } from "../lockup/is-warm/isWarm.t.sol"; import { RefundableAmountOf_Integration_Concrete_Test } from "../lockup/refundable-amount-of/refundableAmountOf.t.sol"; @@ -292,6 +293,20 @@ contract IsDepleted_LockupDynamic_Integration_Concrete_Test is } } +contract IsTransferrable_LockupDynamic_Integration_Concrete_Test is + LockupDynamic_Integration_Concrete_Test, + IsTransferrable_Integration_Concrete_Test +{ + function setUp() + public + virtual + override(LockupDynamic_Integration_Concrete_Test, IsTransferrable_Integration_Concrete_Test) + { + LockupDynamic_Integration_Concrete_Test.setUp(); + IsTransferrable_Integration_Concrete_Test.setUp(); + } +} + contract IsStream_LockupDynamic_Integration_Concrete_Test is LockupDynamic_Integration_Concrete_Test, IsStream_Integration_Concrete_Test diff --git a/test/integration/concrete/lockup-linear/LockupLinear.t.sol b/test/integration/concrete/lockup-linear/LockupLinear.t.sol index 9715b771b..b8ef0443f 100644 --- a/test/integration/concrete/lockup-linear/LockupLinear.t.sol +++ b/test/integration/concrete/lockup-linear/LockupLinear.t.sol @@ -23,6 +23,7 @@ import { GetWithdrawnAmount_Integration_Concrete_Test } from "../lockup/get-with import { IsCancelable_Integration_Concrete_Test } from "../lockup/is-cancelable/isCancelable.t.sol"; import { IsCold_Integration_Concrete_Test } from "../lockup/is-cold/isCold.t.sol"; import { IsDepleted_Integration_Concrete_Test } from "../lockup/is-depleted/isDepleted.t.sol"; +import { IsTransferrable_Integration_Concrete_Test } from "../lockup/is-transferrable/isTransferrable.t.sol"; import { IsStream_Integration_Concrete_Test } from "../lockup/is-stream/isStream.t.sol"; import { IsWarm_Integration_Concrete_Test } from "../lockup/is-warm/isWarm.t.sol"; import { RefundableAmountOf_Integration_Concrete_Test } from "../lockup/refundable-amount-of/refundableAmountOf.t.sol"; @@ -265,6 +266,20 @@ contract IsDepleted_LockupLinear_Integration_Concrete_Test is } } +contract IsTransferrable_LockupLinear_Integration_Concrete_Test is + LockupLinear_Integration_Concrete_Test, + IsTransferrable_Integration_Concrete_Test +{ + function setUp() + public + virtual + override(LockupLinear_Integration_Concrete_Test, IsTransferrable_Integration_Concrete_Test) + { + LockupLinear_Integration_Concrete_Test.setUp(); + IsTransferrable_Integration_Concrete_Test.setUp(); + } +} + contract IsStream_LockupLinear_Integration_Concrete_Test is LockupLinear_Integration_Concrete_Test, IsStream_Integration_Concrete_Test diff --git a/test/integration/concrete/lockup/is-transferrable/isTransferrable.t.sol b/test/integration/concrete/lockup/is-transferrable/isTransferrable.t.sol new file mode 100644 index 000000000..af3b0ff67 --- /dev/null +++ b/test/integration/concrete/lockup/is-transferrable/isTransferrable.t.sol @@ -0,0 +1,89 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >=0.8.19 <0.9.0; + +import { Errors } from "src/libraries/Errors.sol"; + +import { Lockup_Integration_Shared_Test } from "../../../shared/lockup/Lockup.t.sol"; +import { Integration_Test } from "../../../Integration.t.sol"; + +abstract contract IsTransferrable_Integration_Concrete_Test is Integration_Test, Lockup_Integration_Shared_Test { + uint256 internal defaultStreamId; + + function setUp() public virtual override(Integration_Test, Lockup_Integration_Shared_Test) { } + + function test_RevertGiven_Null() external { + uint256 nullStreamId = 1729; + vm.expectRevert(abi.encodeWithSelector(Errors.SablierV2Lockup_Null.selector, nullStreamId)); + lockup.isTransferrable(nullStreamId); + } + + modifier givenNotNull() { + defaultStreamId = createDefaultStream(); + _; + } + + function test_RevertGiven_StatusDepleted() external givenNotNull { + vm.warp({ timestamp: defaults.END_TIME() }); + lockup.withdrawMax({ streamId: defaultStreamId, to: users.recipient }); + vm.expectRevert(abi.encodeWithSelector(Errors.SablierV2Lockup_StreamDepleted.selector, defaultStreamId)); + lockup.toggleTransfer(defaultStreamId); + } + + modifier givenStreamNotDepleted() { + _; + } + + function test_RevertGiven_StatusCanceled() external givenNotNull givenStreamNotDepleted { + vm.warp({ timestamp: defaults.CLIFF_TIME() }); + lockup.cancel(defaultStreamId); + vm.expectRevert(abi.encodeWithSelector(Errors.SablierV2Lockup_StreamCanceled.selector, defaultStreamId)); + lockup.toggleTransfer(defaultStreamId); + } + + modifier givenStreamNotCanceled() { + _; + } + + function test_RevertWhen_CallerUnauthorized() external givenNotNull givenStreamNotDepleted givenStreamNotCanceled { + // Make Eve the caller in this test. + changePrank({ msgSender: users.eve }); + + // Run the test. + vm.expectRevert( + abi.encodeWithSelector(Errors.SablierV2Lockup_Unauthorized.selector, defaultStreamId, users.eve) + ); + lockup.toggleTransfer(defaultStreamId); + } + + modifier whenCallerAuthorized() { + _; + } + + function test_IsTransferrable_Stream() + external + givenNotNull + givenStreamNotDepleted + givenStreamNotCanceled + whenCallerAuthorized + { + bool isTransferrable = lockup.isTransferrable(defaultStreamId); + assertTrue(isTransferrable, "isTransferrable"); + } + + modifier givenStreamNotTransferrable() { + _; + } + + function test_IsTransferrable_StreamNotTransferrable() + external + givenNotNull + givenStreamNotDepleted + givenStreamNotCanceled + whenCallerAuthorized + givenStreamNotTransferrable + { + lockup.toggleTransfer(defaultStreamId); + bool isTransferrable = lockup.isTransferrable(defaultStreamId); + assertFalse(isTransferrable, "isTransferrable"); + } +} diff --git a/test/integration/concrete/lockup/is-transferrable/isTransferrable.tree b/test/integration/concrete/lockup/is-transferrable/isTransferrable.tree new file mode 100644 index 000000000..1756b7408 --- /dev/null +++ b/test/integration/concrete/lockup/is-transferrable/isTransferrable.tree @@ -0,0 +1,14 @@ +isTransferrable.t.sol +├── given the id references a null stream +│ └── it should revert +└── given the id does not reference a null stream + ├── given the stream is cold + │ ├── given the stream's status is "DEPLETED" + │ │ └── it should revert + │ └── given the stream's status is "CANCELED" + │ └── it should revert + └── given the stream is warm + ├── when caller is not the stream's sender + │ └── it should revert + └── when caller is the stream's sender + └── it should toggle the stream's transfer status \ No newline at end of file diff --git a/test/integration/fuzz/lockup-dynamic/createWithDeltas.t.sol b/test/integration/fuzz/lockup-dynamic/createWithDeltas.t.sol index 243cde5f8..7bf03a5d7 100644 --- a/test/integration/fuzz/lockup-dynamic/createWithDeltas.t.sol +++ b/test/integration/fuzz/lockup-dynamic/createWithDeltas.t.sol @@ -101,6 +101,7 @@ contract CreateWithDeltas_LockupDynamic_Integration_Fuzz_Test is LockupDynamic.CreateWithDeltas memory params = defaults.createWithDeltas(); params.segments = segments; params.totalAmount = vars.totalAmount; + params.transferrable = true; lockupDynamic.createWithDeltas(params); // Check if the stream is settled. It is possible for a Lockup Dynamic stream to settle at the time of creation diff --git a/test/integration/fuzz/lockup-dynamic/createWithMilestones.t.sol b/test/integration/fuzz/lockup-dynamic/createWithMilestones.t.sol index c1cd8bdbf..0eaef897e 100644 --- a/test/integration/fuzz/lockup-dynamic/createWithMilestones.t.sol +++ b/test/integration/fuzz/lockup-dynamic/createWithMilestones.t.sol @@ -227,6 +227,7 @@ contract CreateWithMilestones_LockupDynamic_Integration_Fuzz_Test is params.broker.fee = _bound(params.broker.fee, 0, MAX_FEE); protocolFee = _bound(protocolFee, 0, MAX_FEE); params.startTime = boundUint40(params.startTime, 0, defaults.START_TIME()); + params.transferrable = true; // Fuzz the segment milestones. fuzzSegmentMilestones(params.segments, params.startTime); diff --git a/test/integration/fuzz/lockup-linear/createWithRange.t.sol b/test/integration/fuzz/lockup-linear/createWithRange.t.sol index 88c431680..fe85e4424 100644 --- a/test/integration/fuzz/lockup-linear/createWithRange.t.sol +++ b/test/integration/fuzz/lockup-linear/createWithRange.t.sol @@ -217,6 +217,7 @@ contract CreateWithRange_LockupLinear_Integration_Fuzz_Test is assertEq(actualStream.endTime, params.range.end, "endTime"); assertEq(actualStream.isCancelable, params.cancelable, "isCancelable"); assertEq(actualStream.isDepleted, false, "isStream"); + assertEq(actualStream.isTransferrable, true, "isTransferrable"); assertEq(actualStream.isStream, true, "isStream"); assertEq(actualStream.sender, params.sender, "sender"); assertEq(actualStream.startTime, params.range.start, "startTime"); diff --git a/test/integration/shared/lockup-dynamic/LockupDynamic.t.sol b/test/integration/shared/lockup-dynamic/LockupDynamic.t.sol index f257a3d34..541f3b32b 100644 --- a/test/integration/shared/lockup-dynamic/LockupDynamic.t.sol +++ b/test/integration/shared/lockup-dynamic/LockupDynamic.t.sol @@ -26,6 +26,7 @@ abstract contract LockupDynamic_Integration_Shared_Test is Lockup_Integration_Sh _params.createWithDeltas.totalAmount = defaults.TOTAL_AMOUNT(); _params.createWithDeltas.asset = dai; _params.createWithDeltas.cancelable = true; + _params.createWithDeltas.transferrable = true; _params.createWithDeltas.broker = defaults.broker(); _params.createWithMilestones.sender = users.sender; @@ -33,6 +34,7 @@ abstract contract LockupDynamic_Integration_Shared_Test is Lockup_Integration_Sh _params.createWithMilestones.totalAmount = defaults.TOTAL_AMOUNT(); _params.createWithMilestones.asset = dai; _params.createWithMilestones.cancelable = true; + _params.createWithMilestones.transferrable = true; _params.createWithMilestones.startTime = defaults.START_TIME(); _params.createWithMilestones.broker = defaults.broker(); diff --git a/test/invariant/handlers/LockupDynamicCreateHandler.sol b/test/invariant/handlers/LockupDynamicCreateHandler.sol index 025cf43fd..a33886c54 100644 --- a/test/invariant/handlers/LockupDynamicCreateHandler.sol +++ b/test/invariant/handlers/LockupDynamicCreateHandler.sol @@ -87,6 +87,9 @@ contract LockupDynamicCreateHandler is BaseHandler { // Create the stream. params.asset = asset; + + // make stream NFT transferrable + params.transferrable = true; uint256 streamId = lockupDynamic.createWithDeltas(params); // Store the stream id. @@ -135,6 +138,9 @@ contract LockupDynamicCreateHandler is BaseHandler { // Create the stream. params.asset = asset; + + // make stream NFT transferrable + params.transferrable = true; uint256 streamId = lockupDynamic.createWithMilestones(params); // Store the stream id. diff --git a/test/invariant/handlers/LockupLinearCreateHandler.sol b/test/invariant/handlers/LockupLinearCreateHandler.sol index a6c2c82d8..5fdb73b47 100644 --- a/test/invariant/handlers/LockupLinearCreateHandler.sol +++ b/test/invariant/handlers/LockupLinearCreateHandler.sol @@ -71,6 +71,9 @@ contract LockupLinearCreateHandler is BaseHandler { // Create the stream. params.asset = asset; + + // make stream NFT transferrable + params.transferrable = true; uint256 streamId = lockupLinear.createWithDurations(params); // Store the stream id. @@ -114,6 +117,9 @@ contract LockupLinearCreateHandler is BaseHandler { // Create the stream. params.asset = asset; + + // make stream NFT transferrable + params.transferrable = true; uint256 streamId = lockupLinear.createWithRange(params); // Store the stream id. diff --git a/test/utils/Assertions.sol b/test/utils/Assertions.sol index ebd3020c0..5e221d2a7 100644 --- a/test/utils/Assertions.sol +++ b/test/utils/Assertions.sol @@ -47,6 +47,7 @@ abstract contract Assertions is PRBTest, PRBMathAssertions { assertEq(a.endTime, b.endTime, "endTime"); assertEq(a.isCancelable, b.isCancelable, "isCancelable"); assertEq(a.isDepleted, b.isDepleted, "isDepleted"); + assertEq(a.isTransferrable, b.isTransferrable, "isTransferrable"); assertEq(a.isStream, b.isStream, "isStream"); assertEq(a.sender, b.sender, "sender"); assertEq(a.startTime, b.startTime, "startTime"); @@ -59,6 +60,7 @@ abstract contract Assertions is PRBTest, PRBMathAssertions { assertEq(a.endTime, b.endTime, "endTime"); assertEq(a.isCancelable, b.isCancelable, "isCancelable"); assertEq(a.isDepleted, b.isDepleted, "isDepleted"); + assertEq(a.isTransferrable, b.isTransferrable, "isTransferrable"); assertEq(a.isStream, b.isStream, "isStream"); assertEq(a.segments, b.segments, "segments"); assertEq(a.sender, b.sender, "sender"); From 5fe3088c1f01876a2789891f562f73a71619147f Mon Sep 17 00:00:00 2001 From: Shubham Yadav Date: Tue, 29 Aug 2023 17:06:23 +0100 Subject: [PATCH 04/47] test: add more testing and resolve https://github.com/sablier-labs/v2-core/discussions/669 --- src/SablierV2LockupDynamic.sol | 30 +++---- src/SablierV2LockupLinear.sol | 30 +++---- src/abstracts/SablierV2Lockup.sol | 12 +++ src/interfaces/ISablierV2Lockup.sol | 24 ++--- .../lockup-dynamic/LockupDynamic.t.sol | 15 ---- .../is-transferrable/isTransferrable.t.sol | 41 +++++++++ .../is-transferrable/isTransferrable.tree | 8 ++ .../concrete/lockup-linear/LockupLinear.t.sol | 15 ---- .../is-transferrable/isTransferrable.t.sol | 41 +++++++++ .../is-transferrable/isTransferrable.tree | 8 ++ .../is-transferrable/isTransferrable.t.sol | 89 ------------------- .../is-transferrable/isTransferrable.tree | 14 --- .../withdrawMaxAndTransfer.t.sol | 25 +++++- .../withdrawMaxAndTransfer.tree | 27 +++--- .../fuzz/lockup/withdrawMaxAndTransfer.t.sol | 1 + .../shared/lockup-dynamic/LockupDynamic.t.sol | 7 ++ .../shared/lockup-linear/LockupLinear.t.sol | 7 ++ test/integration/shared/lockup/Lockup.t.sol | 3 + .../lockup/withdrawMaxAndTransfer.t.sol | 4 + test/invariant/handlers/LockupHandler.sol | 10 +++ 20 files changed, 205 insertions(+), 206 deletions(-) create mode 100644 test/integration/concrete/lockup-dynamic/is-transferrable/isTransferrable.t.sol create mode 100644 test/integration/concrete/lockup-dynamic/is-transferrable/isTransferrable.tree create mode 100644 test/integration/concrete/lockup-linear/is-transferrable/isTransferrable.t.sol create mode 100644 test/integration/concrete/lockup-linear/is-transferrable/isTransferrable.tree delete mode 100644 test/integration/concrete/lockup/is-transferrable/isTransferrable.t.sol delete mode 100644 test/integration/concrete/lockup/is-transferrable/isTransferrable.tree diff --git a/src/SablierV2LockupDynamic.sol b/src/SablierV2LockupDynamic.sol index b732a109f..74f6ab24e 100644 --- a/src/SablierV2LockupDynamic.sol +++ b/src/SablierV2LockupDynamic.sol @@ -88,8 +88,8 @@ contract SablierV2LockupDynamic is ERC721 TRANFER HOOK FUNCTION //////////////////////////////////////////////////////////////////////////*/ - function _beforeTokenTransfer(address, address, uint256 streamId, uint256) internal view override { - if (!_streams[streamId].isTransferrable) { + function _beforeTokenTransfer(address from, address to, uint256 streamId, uint256) internal view override { + if (!isTransferrable(streamId) && to != address(0) && from != address(0)) { revert Errors.SablierV2NFT_NotTransferrable(streamId); } } @@ -196,8 +196,14 @@ contract SablierV2LockupDynamic is } } - /// @inheritdoc ISablierV2Lockup - function isTransferrable(uint256 streamId) external view override notNull(streamId) returns (bool result) { + /// @inheritdoc SablierV2Lockup + function isTransferrable(uint256 streamId) + public + view + override(ISablierV2Lockup, SablierV2Lockup) + notNull(streamId) + returns (bool result) + { result = _streams[streamId].isTransferrable; } @@ -302,22 +308,6 @@ contract SablierV2LockupDynamic is streamId = _createWithMilestones(params); } - function toggleTransfer(uint256 streamId) public updateMetadata(streamId) notNull(streamId) { - // Checks: the stream is neither depleted nor canceled. This also checks that the stream is not null. - if (isDepleted(streamId)) { - revert Errors.SablierV2Lockup_StreamDepleted(streamId); - } else if (wasCanceled(streamId)) { - revert Errors.SablierV2Lockup_StreamCanceled(streamId); - } - - // Checks: `msg.sender` is the stream's sender - if (!_isCallerStreamSender(streamId)) { - revert Errors.SablierV2Lockup_Unauthorized(streamId, msg.sender); - } - - _streams[streamId].isTransferrable = !_streams[streamId].isTransferrable; - } - /*////////////////////////////////////////////////////////////////////////// INTERNAL CONSTANT FUNCTIONS //////////////////////////////////////////////////////////////////////////*/ diff --git a/src/SablierV2LockupLinear.sol b/src/SablierV2LockupLinear.sol index 86aaa90d9..61d20fe39 100644 --- a/src/SablierV2LockupLinear.sol +++ b/src/SablierV2LockupLinear.sol @@ -73,8 +73,8 @@ contract SablierV2LockupLinear is ERC721 TRANFER HOOK FUNCTION //////////////////////////////////////////////////////////////////////////*/ - function _beforeTokenTransfer(address, address, uint256 streamId, uint256) internal view override { - if (!_streams[streamId].isTransferrable) { + function _beforeTokenTransfer(address from, address to, uint256 streamId, uint256) internal view override { + if (!isTransferrable(streamId) && to != address(0) && from != address(0)) { revert Errors.SablierV2NFT_NotTransferrable(streamId); } } @@ -179,8 +179,14 @@ contract SablierV2LockupLinear is } } - /// @inheritdoc ISablierV2Lockup - function isTransferrable(uint256 streamId) external view override notNull(streamId) returns (bool result) { + /// @inheritdoc SablierV2Lockup + function isTransferrable(uint256 streamId) + public + view + override(ISablierV2Lockup, SablierV2Lockup) + notNull(streamId) + returns (bool result) + { result = _streams[streamId].isTransferrable; } @@ -292,22 +298,6 @@ contract SablierV2LockupLinear is streamId = _createWithRange(params); } - function toggleTransfer(uint256 streamId) public updateMetadata(streamId) notNull(streamId) { - // Checks: the stream is neither depleted nor canceled. This also checks that the stream is not null. - if (isDepleted(streamId)) { - revert Errors.SablierV2Lockup_StreamDepleted(streamId); - } else if (wasCanceled(streamId)) { - revert Errors.SablierV2Lockup_StreamCanceled(streamId); - } - - // Checks: `msg.sender` is the stream's sender - if (!_isCallerStreamSender(streamId)) { - revert Errors.SablierV2Lockup_Unauthorized(streamId, msg.sender); - } - - _streams[streamId].isTransferrable = !_streams[streamId].isTransferrable; - } - /*////////////////////////////////////////////////////////////////////////// INTERNAL CONSTANT FUNCTIONS //////////////////////////////////////////////////////////////////////////*/ diff --git a/src/abstracts/SablierV2Lockup.sol b/src/abstracts/SablierV2Lockup.sol index e644483d6..3ca872ec6 100644 --- a/src/abstracts/SablierV2Lockup.sol +++ b/src/abstracts/SablierV2Lockup.sol @@ -63,6 +63,14 @@ abstract contract SablierV2Lockup is _; } + /// @dev Checks that stream has transfer enabled on its NFT. + modifier canStreamTransfer(uint256 streamId) { + if (!isTransferrable(streamId)) { + revert Errors.SablierV2NFT_NotTransferrable(streamId); + } + _; + } + /// @dev Emits an ERC-4906 event to trigger an update of the NFT metadata. modifier updateMetadata(uint256 streamId) { _; @@ -123,6 +131,9 @@ abstract contract SablierV2Lockup is withdrawableAmount = _withdrawableAmountOf(streamId); } + /// @inheritdoc ISablierV2Lockup + function isTransferrable(uint256 streamId) public view virtual returns (bool); + /*////////////////////////////////////////////////////////////////////////// USER-FACING NON-CONSTANT FUNCTIONS //////////////////////////////////////////////////////////////////////////*/ @@ -271,6 +282,7 @@ abstract contract SablierV2Lockup is noDelegateCall notNull(streamId) updateMetadata(streamId) + canStreamTransfer(streamId) { // Checks: the caller is the current recipient. This also checks that the NFT was not burned. address currentRecipient = _ownerOf(streamId); diff --git a/src/interfaces/ISablierV2Lockup.sol b/src/interfaces/ISablierV2Lockup.sol index b23286ed4..b38a66bac 100644 --- a/src/interfaces/ISablierV2Lockup.sol +++ b/src/interfaces/ISablierV2Lockup.sol @@ -103,11 +103,6 @@ interface ISablierV2Lockup is /// @param streamId The stream id for the query. function isCancelable(uint256 streamId) external view returns (bool result); - /// @notice Retrieves a flag indicating whether the stream NFT can be transferred. - /// @dev Reverts if `streamId` references a null stream. - /// @param streamId The stream id for the query. - function isTransferrable(uint256 streamId) external view returns (bool result); - /// @notice Retrieves a flag indicating whether the stream is cold, i.e. settled, canceled, or depleted. /// @dev Reverts if `streamId` references a null stream. /// @param streamId The stream id for the query. @@ -157,6 +152,11 @@ interface ISablierV2Lockup is /// @param streamId The stream id for the query. function withdrawableAmountOf(uint256 streamId) external view returns (uint128 withdrawableAmount); + /// @notice Retrieves a flag indicating whether the stream NFT can be transferred. + /// @dev Reverts if `streamId` references a null stream. + /// @param streamId The stream id for the query. + function isTransferrable(uint256 streamId) external view returns (bool); + /*////////////////////////////////////////////////////////////////////////// NON-CONSTANT FUNCTIONS //////////////////////////////////////////////////////////////////////////*/ @@ -222,20 +222,6 @@ interface ISablierV2Lockup is /// @param streamId The id of the stream to renounce. function renounce(uint256 streamId) external; - /// @notice Toggle stream NFT transferrability. - /// - /// @dev Emits a {MetadataUpdate} event. - /// - /// Notes: - /// - This function attempts to invoke _beforeTokenTransfer() hook on the stream's NFT. - /// - /// Requirements: - /// - `streamId` must not reference a null or depleted or canceled stream. - /// - `msg.sender` must be the stream's sender. - /// - /// @param streamId The id of the stream. - function toggleTransfer(uint256 streamId) external; - /// @notice Sets a new NFT descriptor contract, which produces the URI describing the Sablier stream NFTs. /// /// @dev Emits a {SetNFTDescriptor} and {BatchMetadataUpdate} event. diff --git a/test/integration/concrete/lockup-dynamic/LockupDynamic.t.sol b/test/integration/concrete/lockup-dynamic/LockupDynamic.t.sol index 976017527..5bfb3d2c6 100644 --- a/test/integration/concrete/lockup-dynamic/LockupDynamic.t.sol +++ b/test/integration/concrete/lockup-dynamic/LockupDynamic.t.sol @@ -22,7 +22,6 @@ import { GetWithdrawnAmount_Integration_Concrete_Test } from "../lockup/get-with import { IsCancelable_Integration_Concrete_Test } from "../lockup/is-cancelable/isCancelable.t.sol"; import { IsCold_Integration_Concrete_Test } from "../lockup/is-cold/isCold.t.sol"; import { IsDepleted_Integration_Concrete_Test } from "../lockup/is-depleted/isDepleted.t.sol"; -import { IsTransferrable_Integration_Concrete_Test } from "../lockup/is-transferrable/isTransferrable.t.sol"; import { IsStream_Integration_Concrete_Test } from "../lockup/is-stream/isStream.t.sol"; import { IsWarm_Integration_Concrete_Test } from "../lockup/is-warm/isWarm.t.sol"; import { RefundableAmountOf_Integration_Concrete_Test } from "../lockup/refundable-amount-of/refundableAmountOf.t.sol"; @@ -293,20 +292,6 @@ contract IsDepleted_LockupDynamic_Integration_Concrete_Test is } } -contract IsTransferrable_LockupDynamic_Integration_Concrete_Test is - LockupDynamic_Integration_Concrete_Test, - IsTransferrable_Integration_Concrete_Test -{ - function setUp() - public - virtual - override(LockupDynamic_Integration_Concrete_Test, IsTransferrable_Integration_Concrete_Test) - { - LockupDynamic_Integration_Concrete_Test.setUp(); - IsTransferrable_Integration_Concrete_Test.setUp(); - } -} - contract IsStream_LockupDynamic_Integration_Concrete_Test is LockupDynamic_Integration_Concrete_Test, IsStream_Integration_Concrete_Test diff --git a/test/integration/concrete/lockup-dynamic/is-transferrable/isTransferrable.t.sol b/test/integration/concrete/lockup-dynamic/is-transferrable/isTransferrable.t.sol new file mode 100644 index 000000000..24128aab5 --- /dev/null +++ b/test/integration/concrete/lockup-dynamic/is-transferrable/isTransferrable.t.sol @@ -0,0 +1,41 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >=0.8.19 <0.9.0; + +import { Errors } from "src/libraries/Errors.sol"; + +import { LockupDynamic_Integration_Concrete_Test } from "../LockupDynamic.t.sol"; + +contract IsTransferrable_LockupDynamic_Integration_Concrete_Test is LockupDynamic_Integration_Concrete_Test { + uint256 internal defaultStreamId; + + function setUp() public virtual override { + LockupDynamic_Integration_Concrete_Test.setUp(); + defaultStreamId = createDefaultStream(); + } + + function test_RevertGiven_Null() external { + uint256 nullStreamId = 1729; + vm.expectRevert(abi.encodeWithSelector(Errors.SablierV2Lockup_Null.selector, nullStreamId)); + lockupDynamic.isTransferrable(nullStreamId); + } + + modifier givenNotNull() { + defaultStreamId = createDefaultStream(); + _; + } + + function test_RevertGiven_StreamTransferNotEnabled() external givenNotNull { + uint256 noTransferStreamId = createDefaultStreamWithTransferDisabled(); + bool isTransferrable = lockupDynamic.isTransferrable(noTransferStreamId); + assertFalse(isTransferrable, "isTransferrable"); + } + + modifier givenStreamTransferEnabled() { + _; + } + + function test_IsTransferrable_Stream() external givenNotNull givenStreamTransferEnabled { + bool isTransferrable = lockupDynamic.isTransferrable(defaultStreamId); + assertTrue(isTransferrable, "isTransferrable"); + } +} diff --git a/test/integration/concrete/lockup-dynamic/is-transferrable/isTransferrable.tree b/test/integration/concrete/lockup-dynamic/is-transferrable/isTransferrable.tree new file mode 100644 index 000000000..dd6a2092d --- /dev/null +++ b/test/integration/concrete/lockup-dynamic/is-transferrable/isTransferrable.tree @@ -0,0 +1,8 @@ +isTransferrable.t.sol +├── given the id references a null stream +│ └── it should revert +└── given the id does not reference a null stream + ├── given the stream is not transferrable + │ └── it should return false + └── given the stream is transferrable + └── it should return true \ No newline at end of file diff --git a/test/integration/concrete/lockup-linear/LockupLinear.t.sol b/test/integration/concrete/lockup-linear/LockupLinear.t.sol index b8ef0443f..9715b771b 100644 --- a/test/integration/concrete/lockup-linear/LockupLinear.t.sol +++ b/test/integration/concrete/lockup-linear/LockupLinear.t.sol @@ -23,7 +23,6 @@ import { GetWithdrawnAmount_Integration_Concrete_Test } from "../lockup/get-with import { IsCancelable_Integration_Concrete_Test } from "../lockup/is-cancelable/isCancelable.t.sol"; import { IsCold_Integration_Concrete_Test } from "../lockup/is-cold/isCold.t.sol"; import { IsDepleted_Integration_Concrete_Test } from "../lockup/is-depleted/isDepleted.t.sol"; -import { IsTransferrable_Integration_Concrete_Test } from "../lockup/is-transferrable/isTransferrable.t.sol"; import { IsStream_Integration_Concrete_Test } from "../lockup/is-stream/isStream.t.sol"; import { IsWarm_Integration_Concrete_Test } from "../lockup/is-warm/isWarm.t.sol"; import { RefundableAmountOf_Integration_Concrete_Test } from "../lockup/refundable-amount-of/refundableAmountOf.t.sol"; @@ -266,20 +265,6 @@ contract IsDepleted_LockupLinear_Integration_Concrete_Test is } } -contract IsTransferrable_LockupLinear_Integration_Concrete_Test is - LockupLinear_Integration_Concrete_Test, - IsTransferrable_Integration_Concrete_Test -{ - function setUp() - public - virtual - override(LockupLinear_Integration_Concrete_Test, IsTransferrable_Integration_Concrete_Test) - { - LockupLinear_Integration_Concrete_Test.setUp(); - IsTransferrable_Integration_Concrete_Test.setUp(); - } -} - contract IsStream_LockupLinear_Integration_Concrete_Test is LockupLinear_Integration_Concrete_Test, IsStream_Integration_Concrete_Test diff --git a/test/integration/concrete/lockup-linear/is-transferrable/isTransferrable.t.sol b/test/integration/concrete/lockup-linear/is-transferrable/isTransferrable.t.sol new file mode 100644 index 000000000..cfc41a8d9 --- /dev/null +++ b/test/integration/concrete/lockup-linear/is-transferrable/isTransferrable.t.sol @@ -0,0 +1,41 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >=0.8.19 <0.9.0; + +import { Errors } from "src/libraries/Errors.sol"; + +import { LockupLinear_Integration_Concrete_Test } from "../LockupLinear.t.sol"; + +contract IsTransferrable_LockupLinear_Integration_Concrete_Test is LockupLinear_Integration_Concrete_Test { + uint256 internal defaultStreamId; + + function setUp() public virtual override { + LockupLinear_Integration_Concrete_Test.setUp(); + defaultStreamId = createDefaultStream(); + } + + function test_RevertGiven_Null() external { + uint256 nullStreamId = 1729; + vm.expectRevert(abi.encodeWithSelector(Errors.SablierV2Lockup_Null.selector, nullStreamId)); + lockupLinear.isTransferrable(nullStreamId); + } + + modifier givenNotNull() { + defaultStreamId = createDefaultStream(); + _; + } + + function test_RevertGiven_StreamTransferNotEnabled() external givenNotNull { + uint256 noTransferStreamId = createDefaultStreamWithTransferDisabled(); + bool isTransferrable = lockupLinear.isTransferrable(noTransferStreamId); + assertFalse(isTransferrable, "isTransferrable"); + } + + modifier givenStreamTransferEnabled() { + _; + } + + function test_IsTransferrable_Stream() external givenNotNull givenStreamTransferEnabled { + bool isTransferrable = lockupLinear.isTransferrable(defaultStreamId); + assertTrue(isTransferrable, "isTransferrable"); + } +} diff --git a/test/integration/concrete/lockup-linear/is-transferrable/isTransferrable.tree b/test/integration/concrete/lockup-linear/is-transferrable/isTransferrable.tree new file mode 100644 index 000000000..dd6a2092d --- /dev/null +++ b/test/integration/concrete/lockup-linear/is-transferrable/isTransferrable.tree @@ -0,0 +1,8 @@ +isTransferrable.t.sol +├── given the id references a null stream +│ └── it should revert +└── given the id does not reference a null stream + ├── given the stream is not transferrable + │ └── it should return false + └── given the stream is transferrable + └── it should return true \ No newline at end of file diff --git a/test/integration/concrete/lockup/is-transferrable/isTransferrable.t.sol b/test/integration/concrete/lockup/is-transferrable/isTransferrable.t.sol deleted file mode 100644 index af3b0ff67..000000000 --- a/test/integration/concrete/lockup/is-transferrable/isTransferrable.t.sol +++ /dev/null @@ -1,89 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity >=0.8.19 <0.9.0; - -import { Errors } from "src/libraries/Errors.sol"; - -import { Lockup_Integration_Shared_Test } from "../../../shared/lockup/Lockup.t.sol"; -import { Integration_Test } from "../../../Integration.t.sol"; - -abstract contract IsTransferrable_Integration_Concrete_Test is Integration_Test, Lockup_Integration_Shared_Test { - uint256 internal defaultStreamId; - - function setUp() public virtual override(Integration_Test, Lockup_Integration_Shared_Test) { } - - function test_RevertGiven_Null() external { - uint256 nullStreamId = 1729; - vm.expectRevert(abi.encodeWithSelector(Errors.SablierV2Lockup_Null.selector, nullStreamId)); - lockup.isTransferrable(nullStreamId); - } - - modifier givenNotNull() { - defaultStreamId = createDefaultStream(); - _; - } - - function test_RevertGiven_StatusDepleted() external givenNotNull { - vm.warp({ timestamp: defaults.END_TIME() }); - lockup.withdrawMax({ streamId: defaultStreamId, to: users.recipient }); - vm.expectRevert(abi.encodeWithSelector(Errors.SablierV2Lockup_StreamDepleted.selector, defaultStreamId)); - lockup.toggleTransfer(defaultStreamId); - } - - modifier givenStreamNotDepleted() { - _; - } - - function test_RevertGiven_StatusCanceled() external givenNotNull givenStreamNotDepleted { - vm.warp({ timestamp: defaults.CLIFF_TIME() }); - lockup.cancel(defaultStreamId); - vm.expectRevert(abi.encodeWithSelector(Errors.SablierV2Lockup_StreamCanceled.selector, defaultStreamId)); - lockup.toggleTransfer(defaultStreamId); - } - - modifier givenStreamNotCanceled() { - _; - } - - function test_RevertWhen_CallerUnauthorized() external givenNotNull givenStreamNotDepleted givenStreamNotCanceled { - // Make Eve the caller in this test. - changePrank({ msgSender: users.eve }); - - // Run the test. - vm.expectRevert( - abi.encodeWithSelector(Errors.SablierV2Lockup_Unauthorized.selector, defaultStreamId, users.eve) - ); - lockup.toggleTransfer(defaultStreamId); - } - - modifier whenCallerAuthorized() { - _; - } - - function test_IsTransferrable_Stream() - external - givenNotNull - givenStreamNotDepleted - givenStreamNotCanceled - whenCallerAuthorized - { - bool isTransferrable = lockup.isTransferrable(defaultStreamId); - assertTrue(isTransferrable, "isTransferrable"); - } - - modifier givenStreamNotTransferrable() { - _; - } - - function test_IsTransferrable_StreamNotTransferrable() - external - givenNotNull - givenStreamNotDepleted - givenStreamNotCanceled - whenCallerAuthorized - givenStreamNotTransferrable - { - lockup.toggleTransfer(defaultStreamId); - bool isTransferrable = lockup.isTransferrable(defaultStreamId); - assertFalse(isTransferrable, "isTransferrable"); - } -} diff --git a/test/integration/concrete/lockup/is-transferrable/isTransferrable.tree b/test/integration/concrete/lockup/is-transferrable/isTransferrable.tree deleted file mode 100644 index 1756b7408..000000000 --- a/test/integration/concrete/lockup/is-transferrable/isTransferrable.tree +++ /dev/null @@ -1,14 +0,0 @@ -isTransferrable.t.sol -├── given the id references a null stream -│ └── it should revert -└── given the id does not reference a null stream - ├── given the stream is cold - │ ├── given the stream's status is "DEPLETED" - │ │ └── it should revert - │ └── given the stream's status is "CANCELED" - │ └── it should revert - └── given the stream is warm - ├── when caller is not the stream's sender - │ └── it should revert - └── when caller is the stream's sender - └── it should toggle the stream's transfer status \ No newline at end of file diff --git a/test/integration/concrete/lockup/withdraw-max-and-transfer/withdrawMaxAndTransfer.t.sol b/test/integration/concrete/lockup/withdraw-max-and-transfer/withdrawMaxAndTransfer.t.sol index 3d6ad1339..de90be401 100644 --- a/test/integration/concrete/lockup/withdraw-max-and-transfer/withdrawMaxAndTransfer.t.sol +++ b/test/integration/concrete/lockup/withdraw-max-and-transfer/withdrawMaxAndTransfer.t.sol @@ -7,6 +7,8 @@ import { Errors } from "src/libraries/Errors.sol"; import { WithdrawMaxAndTransfer_Integration_Shared_Test } from "../../../shared/lockup/withdrawMaxAndTransfer.t.sol"; import { Integration_Test } from "../../../Integration.t.sol"; +import "forge-std/console.sol"; + abstract contract WithdrawMaxAndTransfer_Integration_Concrete_Test is Integration_Test, WithdrawMaxAndTransfer_Integration_Shared_Test @@ -27,7 +29,18 @@ abstract contract WithdrawMaxAndTransfer_Integration_Concrete_Test is lockup.withdrawMaxAndTransfer({ streamId: nullStreamId, newRecipient: users.recipient }); } - function test_RevertWhen_CallerNotCurrentRecipient() external whenNotDelegateCalled givenNotNull { + function test_RevertGiven_StreamTransferNotEnabled() external whenNotDelegateCalled { + uint256 noTransferStreamId = createDefaultStreamWithTransferDisabled(); + vm.expectRevert(abi.encodeWithSelector(Errors.SablierV2NFT_NotTransferrable.selector, noTransferStreamId)); + lockup.withdrawMaxAndTransfer({ streamId: noTransferStreamId, newRecipient: users.recipient }); + } + + function test_RevertWhen_CallerNotCurrentRecipient() + external + givenStreamTransferEnabled + whenNotDelegateCalled + givenNotNull + { // Make Eve the caller in this test. changePrank({ msgSender: users.eve }); @@ -38,7 +51,13 @@ abstract contract WithdrawMaxAndTransfer_Integration_Concrete_Test is lockup.withdrawMaxAndTransfer({ streamId: defaultStreamId, newRecipient: users.eve }); } - function test_RevertGiven_NFTBurned() external whenNotDelegateCalled givenNotNull whenCallerCurrentRecipient { + function test_RevertGiven_NFTBurned() + external + givenStreamTransferEnabled + whenNotDelegateCalled + givenNotNull + whenCallerCurrentRecipient + { // Deplete the stream. vm.warp({ timestamp: defaults.END_TIME() }); lockup.withdrawMax({ streamId: defaultStreamId, to: users.recipient }); @@ -55,6 +74,7 @@ abstract contract WithdrawMaxAndTransfer_Integration_Concrete_Test is function test_WithdrawMaxAndTransfer_WithdrawableAmountZero() external + givenStreamTransferEnabled whenNotDelegateCalled givenNotNull whenCallerCurrentRecipient @@ -67,6 +87,7 @@ abstract contract WithdrawMaxAndTransfer_Integration_Concrete_Test is function test_WithdrawMaxAndTransfer() external + givenStreamTransferEnabled whenNotDelegateCalled givenNotNull whenCallerCurrentRecipient diff --git a/test/integration/concrete/lockup/withdraw-max-and-transfer/withdrawMaxAndTransfer.tree b/test/integration/concrete/lockup/withdraw-max-and-transfer/withdrawMaxAndTransfer.tree index 166704694..a3554297f 100644 --- a/test/integration/concrete/lockup/withdraw-max-and-transfer/withdrawMaxAndTransfer.tree +++ b/test/integration/concrete/lockup/withdraw-max-and-transfer/withdrawMaxAndTransfer.tree @@ -5,17 +5,20 @@ withdrawMaxAndTransfer.t.sol ├── given the id references a null stream │ └── it should revert └── given the id does not reference a null stream - ├── when the caller is not the current recipient + ├── given the NFT transfer is not enabled │ └── it should revert - └── when the caller is the current recipient - ├── given the NFT has been burned + ├── given the NFT transfer is enabled + ├── when the caller is not the current recipient │ └── it should revert - └── given the NFT has not been burned - ├── given the withdrawable amount is zero - │ └── it should skip the withdrawal - └── given the withdrawable amount is not zero - ├── it should make the max withdrawal - ├── it should update the withdrawn amount - ├── it should transfer the NFT - ├── it should emit a {WithdrawFromLockupStream} event - └── it should emit a {Transfer} event + └── when the caller is the current recipient + ├── given the NFT has been burned + │ └── it should revert + └── given the NFT has not been burned + ├── given the withdrawable amount is zero + │ └── it should skip the withdrawal + └── given the withdrawable amount is not zero + ├── it should make the max withdrawal + ├── it should update the withdrawn amount + ├── it should transfer the NFT + ├── it should emit a {WithdrawFromLockupStream} event + └── it should emit a {Transfer} event diff --git a/test/integration/fuzz/lockup/withdrawMaxAndTransfer.t.sol b/test/integration/fuzz/lockup/withdrawMaxAndTransfer.t.sol index 3392e4cb7..dcefe5ae8 100644 --- a/test/integration/fuzz/lockup/withdrawMaxAndTransfer.t.sol +++ b/test/integration/fuzz/lockup/withdrawMaxAndTransfer.t.sol @@ -25,6 +25,7 @@ abstract contract WithdrawMaxAndTransfer_Integration_Fuzz_Test is givenNotNull whenCallerCurrentRecipient givenNFTNotBurned + givenStreamTransferEnabled { vm.assume(newRecipient != address(0)); timeJump = _bound(timeJump, 0, defaults.TOTAL_DURATION() * 2); diff --git a/test/integration/shared/lockup-dynamic/LockupDynamic.t.sol b/test/integration/shared/lockup-dynamic/LockupDynamic.t.sol index 541f3b32b..d6a0f9c36 100644 --- a/test/integration/shared/lockup-dynamic/LockupDynamic.t.sol +++ b/test/integration/shared/lockup-dynamic/LockupDynamic.t.sol @@ -140,4 +140,11 @@ abstract contract LockupDynamic_Integration_Shared_Test is Lockup_Integration_Sh params.totalAmount = totalAmount; streamId = lockupDynamic.createWithMilestones(params); } + + /// @dev Creates the default stream with the NFT transfer disabled. + function createDefaultStreamWithTransferDisabled() internal override returns (uint256 streamId) { + LockupDynamic.CreateWithMilestones memory params = _params.createWithMilestones; + params.transferrable = false; + streamId = lockupDynamic.createWithMilestones(params); + } } diff --git a/test/integration/shared/lockup-linear/LockupLinear.t.sol b/test/integration/shared/lockup-linear/LockupLinear.t.sol index a45e38c21..941bd3af2 100644 --- a/test/integration/shared/lockup-linear/LockupLinear.t.sol +++ b/test/integration/shared/lockup-linear/LockupLinear.t.sol @@ -109,4 +109,11 @@ abstract contract LockupLinear_Integration_Shared_Test is Lockup_Integration_Sha params.totalAmount = totalAmount; streamId = lockupLinear.createWithRange(params); } + + /// @dev Creates the default stream with the NFT transfer disabled. + function createDefaultStreamWithTransferDisabled() internal override returns (uint256 streamId) { + LockupLinear.CreateWithRange memory params = _params.createWithRange; + params.transferrable = false; + streamId = lockupLinear.createWithRange(params); + } } diff --git a/test/integration/shared/lockup/Lockup.t.sol b/test/integration/shared/lockup/Lockup.t.sol index 4cc656927..3e85fb73f 100644 --- a/test/integration/shared/lockup/Lockup.t.sol +++ b/test/integration/shared/lockup/Lockup.t.sol @@ -67,4 +67,7 @@ abstract contract Lockup_Integration_Shared_Test is Base_Test { /// @dev Creates the default stream with the provided total amount. function createDefaultStreamWithTotalAmount(uint128 totalAmount) internal virtual returns (uint256 streamId); + + /// @dev Creates the default stream with the NFT transfer disabled. + function createDefaultStreamWithTransferDisabled() internal virtual returns (uint256 streamId); } diff --git a/test/integration/shared/lockup/withdrawMaxAndTransfer.t.sol b/test/integration/shared/lockup/withdrawMaxAndTransfer.t.sol index da1c44fc5..83b97d917 100644 --- a/test/integration/shared/lockup/withdrawMaxAndTransfer.t.sol +++ b/test/integration/shared/lockup/withdrawMaxAndTransfer.t.sol @@ -23,6 +23,10 @@ abstract contract WithdrawMaxAndTransfer_Integration_Shared_Test is Lockup_Integ _; } + modifier givenStreamTransferEnabled() { + _; + } + modifier givenNFTNotBurned() { _; } diff --git a/test/invariant/handlers/LockupHandler.sol b/test/invariant/handlers/LockupHandler.sol index 7b39b6d01..cae4045a2 100644 --- a/test/invariant/handlers/LockupHandler.sol +++ b/test/invariant/handlers/LockupHandler.sol @@ -288,6 +288,11 @@ abstract contract LockupHandler is BaseHandler { return; } + // skip if NFT transfer is not enabled + if (!lockup.isTransferrable(currentStreamId)) { + return; + } + // The protocol doesn't allow a zero amount to be withdrawn. uint128 withdrawableAmount = lockup.withdrawableAmountOf(currentStreamId); if (withdrawableAmount == 0) { @@ -326,6 +331,11 @@ abstract contract LockupHandler is BaseHandler { return; } + // skip if NFT transfer is not enabled + if (!lockup.isTransferrable(currentStreamId)) { + return; + } + // Transfer the NFT to the new recipient. lockup.transferFrom({ from: currentRecipient, to: newRecipient, tokenId: currentStreamId }); From 4d9428469c46687bc02baa45e4591953cbb1d422 Mon Sep 17 00:00:00 2001 From: Paul Razvan Berg Date: Tue, 29 Aug 2023 20:30:00 +0300 Subject: [PATCH 05/47] perf: dry "_beforeTokenTransfer" refactor: remove "canStreamTransfer" refactor: remove double "r" in "transferrable" refactor: simplify implementation test: allow non-transferable streams in invariant tests test: dry tests for "isTransferable" test: improve function and test names --- script/Init.s.sol | 4 +- src/SablierV2LockupDynamic.sol | 20 ++--- src/SablierV2LockupLinear.sol | 20 ++--- src/abstracts/SablierV2Lockup.sol | 21 +++--- src/interfaces/ISablierV2Lockup.sol | 2 +- src/interfaces/ISablierV2LockupDynamic.sol | 4 +- src/interfaces/ISablierV2LockupLinear.sol | 4 +- src/libraries/Errors.sol | 10 +-- src/types/DataTypes.sol | 24 +++--- test/fork/LockupDynamic.t.sol | 10 +-- test/fork/LockupLinear.t.sol | 10 +-- .../lockup-dynamic/LockupDynamic.t.sol | 73 +++++++++++-------- .../create-with-deltas/createWithDeltas.t.sol | 5 +- .../createWithMilestones.t.sol | 5 +- .../is-transferrable/isTransferrable.t.sol | 41 ----------- .../concrete/lockup-linear/LockupLinear.t.sol | 17 ++++- .../createWithDurations.t.sol | 5 +- .../create-with-range/createWithRange.t.sol | 5 +- .../is-transferrable/isTransferrable.t.sol | 41 ----------- .../is-transferrable/isTransferrable.tree | 8 -- .../is-transferable/isTransferable.t.sol | 39 ++++++++++ .../is-transferable/isTransferable.tree} | 8 +- .../withdrawMaxAndTransfer.t.sol | 41 +++++------ .../withdrawMaxAndTransfer.tree | 20 ++--- .../lockup-dynamic/createWithDeltas.t.sol | 6 +- .../lockup-dynamic/createWithMilestones.t.sol | 8 +- .../lockup-linear/createWithDurations.t.sol | 2 +- .../fuzz/lockup-linear/createWithRange.t.sol | 8 +- .../fuzz/lockup/withdrawMaxAndTransfer.t.sol | 2 +- .../shared/lockup-dynamic/LockupDynamic.t.sol | 18 ++--- .../shared/lockup-linear/LockupLinear.t.sol | 14 ++-- test/integration/shared/lockup/Lockup.t.sol | 6 +- .../lockup/withdrawMaxAndTransfer.t.sol | 2 +- .../handlers/LockupDynamicCreateHandler.sol | 6 -- test/invariant/handlers/LockupHandler.sol | 8 +- .../handlers/LockupLinearCreateHandler.sol | 6 -- test/utils/Assertions.sol | 4 +- test/utils/Defaults.sol | 12 +-- test/utils/Events.sol | 4 +- 39 files changed, 235 insertions(+), 308 deletions(-) delete mode 100644 test/integration/concrete/lockup-dynamic/is-transferrable/isTransferrable.t.sol delete mode 100644 test/integration/concrete/lockup-linear/is-transferrable/isTransferrable.t.sol delete mode 100644 test/integration/concrete/lockup-linear/is-transferrable/isTransferrable.tree create mode 100644 test/integration/concrete/lockup/is-transferable/isTransferable.t.sol rename test/integration/concrete/{lockup-dynamic/is-transferrable/isTransferrable.tree => lockup/is-transferable/isTransferable.tree} (52%) diff --git a/script/Init.s.sol b/script/Init.s.sol index 7b667a2ee..1e4f293b1 100644 --- a/script/Init.s.sol +++ b/script/Init.s.sol @@ -73,7 +73,7 @@ contract Init is BaseScript { totalAmount: totalAmounts[i], asset: asset, cancelable: true, - transferrable: true, + transferable: true, durations: LockupLinear.Durations({ cliff: cliffDurations[i], total: totalDurations[i] }), broker: Broker(address(0), ud60x18(0)) }) @@ -99,7 +99,7 @@ contract Init is BaseScript { asset: asset, broker: Broker(address(0), ud60x18(0)), cancelable: true, - transferrable: true, + transferable: true, recipient: recipient, sender: sender, segments: segments, diff --git a/src/SablierV2LockupDynamic.sol b/src/SablierV2LockupDynamic.sol index 74f6ab24e..28fd0e835 100644 --- a/src/SablierV2LockupDynamic.sol +++ b/src/SablierV2LockupDynamic.sol @@ -84,16 +84,6 @@ contract SablierV2LockupDynamic is nextStreamId = 1; } - /*////////////////////////////////////////////////////////////////////////// - ERC721 TRANFER HOOK FUNCTION - //////////////////////////////////////////////////////////////////////////*/ - - function _beforeTokenTransfer(address from, address to, uint256 streamId, uint256) internal view override { - if (!isTransferrable(streamId) && to != address(0) && from != address(0)) { - revert Errors.SablierV2NFT_NotTransferrable(streamId); - } - } - /*////////////////////////////////////////////////////////////////////////// USER-FACING CONSTANT FUNCTIONS //////////////////////////////////////////////////////////////////////////*/ @@ -197,14 +187,14 @@ contract SablierV2LockupDynamic is } /// @inheritdoc SablierV2Lockup - function isTransferrable(uint256 streamId) + function isTransferable(uint256 streamId) public view override(ISablierV2Lockup, SablierV2Lockup) notNull(streamId) returns (bool result) { - result = _streams[streamId].isTransferrable; + result = _streams[streamId].isTransferable; } /// @inheritdoc ISablierV2Lockup @@ -287,7 +277,7 @@ contract SablierV2LockupDynamic is asset: params.asset, broker: params.broker, cancelable: params.cancelable, - transferrable: params.transferrable, + transferable: params.transferable, recipient: params.recipient, segments: segments, sender: params.sender, @@ -575,7 +565,7 @@ contract SablierV2LockupDynamic is stream.amounts.deposited = createAmounts.deposit; stream.asset = params.asset; stream.isCancelable = params.cancelable; - stream.isTransferrable = params.transferrable; + stream.isTransferable = params.transferable; stream.isStream = true; stream.sender = params.sender; @@ -624,7 +614,7 @@ contract SablierV2LockupDynamic is amounts: createAmounts, asset: params.asset, cancelable: params.cancelable, - transferrable: params.transferrable, + transferable: params.transferable, segments: params.segments, range: LockupDynamic.Range({ start: stream.startTime, end: stream.endTime }), broker: params.broker.account diff --git a/src/SablierV2LockupLinear.sol b/src/SablierV2LockupLinear.sol index 61d20fe39..db75cf7cb 100644 --- a/src/SablierV2LockupLinear.sol +++ b/src/SablierV2LockupLinear.sol @@ -69,16 +69,6 @@ contract SablierV2LockupLinear is nextStreamId = 1; } - /*////////////////////////////////////////////////////////////////////////// - ERC721 TRANFER HOOK FUNCTION - //////////////////////////////////////////////////////////////////////////*/ - - function _beforeTokenTransfer(address from, address to, uint256 streamId, uint256) internal view override { - if (!isTransferrable(streamId) && to != address(0) && from != address(0)) { - revert Errors.SablierV2NFT_NotTransferrable(streamId); - } - } - /*////////////////////////////////////////////////////////////////////////// USER-FACING CONSTANT FUNCTIONS //////////////////////////////////////////////////////////////////////////*/ @@ -180,14 +170,14 @@ contract SablierV2LockupLinear is } /// @inheritdoc SablierV2Lockup - function isTransferrable(uint256 streamId) + function isTransferable(uint256 streamId) public view override(ISablierV2Lockup, SablierV2Lockup) notNull(streamId) returns (bool result) { - result = _streams[streamId].isTransferrable; + result = _streams[streamId].isTransferable; } /// @inheritdoc ISablierV2Lockup @@ -278,7 +268,7 @@ contract SablierV2LockupLinear is asset: params.asset, broker: params.broker, cancelable: params.cancelable, - transferrable: params.transferrable, + transferable: params.transferable, range: range, recipient: params.recipient, sender: params.sender, @@ -489,7 +479,7 @@ contract SablierV2LockupLinear is cliffTime: params.range.cliff, endTime: params.range.end, isCancelable: params.cancelable, - isTransferrable: params.transferrable, + isTransferable: params.transferable, isDepleted: false, isStream: true, sender: params.sender, @@ -531,7 +521,7 @@ contract SablierV2LockupLinear is amounts: createAmounts, asset: params.asset, cancelable: params.cancelable, - transferrable: params.transferrable, + transferable: params.transferable, range: params.range, broker: params.broker.account }); diff --git a/src/abstracts/SablierV2Lockup.sol b/src/abstracts/SablierV2Lockup.sol index 3ca872ec6..5e7c8909d 100644 --- a/src/abstracts/SablierV2Lockup.sol +++ b/src/abstracts/SablierV2Lockup.sol @@ -63,14 +63,6 @@ abstract contract SablierV2Lockup is _; } - /// @dev Checks that stream has transfer enabled on its NFT. - modifier canStreamTransfer(uint256 streamId) { - if (!isTransferrable(streamId)) { - revert Errors.SablierV2NFT_NotTransferrable(streamId); - } - _; - } - /// @dev Emits an ERC-4906 event to trigger an update of the NFT metadata. modifier updateMetadata(uint256 streamId) { _; @@ -132,7 +124,7 @@ abstract contract SablierV2Lockup is } /// @inheritdoc ISablierV2Lockup - function isTransferrable(uint256 streamId) public view virtual returns (bool); + function isTransferable(uint256 streamId) public view virtual returns (bool); /*////////////////////////////////////////////////////////////////////////// USER-FACING NON-CONSTANT FUNCTIONS @@ -282,7 +274,6 @@ abstract contract SablierV2Lockup is noDelegateCall notNull(streamId) updateMetadata(streamId) - canStreamTransfer(streamId) { // Checks: the caller is the current recipient. This also checks that the NFT was not burned. address currentRecipient = _ownerOf(streamId); @@ -333,6 +324,16 @@ abstract contract SablierV2Lockup is INTERNAL CONSTANT FUNCTIONS //////////////////////////////////////////////////////////////////////////*/ + /// @notice Overrides the internal ERC-721 transfer function to check that the stream is transferable. + /// @dev There are two cases when the transferable flag is ignored: + /// - If `from` is 0, then the transfer is a mint and is allowed. + /// - If `to` is 0, then the transfer is a burn and is also allowed. + function _beforeTokenTransfer(address from, address to, uint256 streamId, uint256) internal view override { + if (!isTransferable(streamId) && to != address(0) && from != address(0)) { + revert Errors.SablierV2Lockup_NotTransferrable(streamId); + } + } + /// @notice Checks whether `msg.sender` is the stream's recipient or an approved third party. /// @param streamId The stream id for the query. function _isCallerStreamRecipientOrApproved(uint256 streamId) internal view returns (bool) { diff --git a/src/interfaces/ISablierV2Lockup.sol b/src/interfaces/ISablierV2Lockup.sol index b38a66bac..94b8fb5b3 100644 --- a/src/interfaces/ISablierV2Lockup.sol +++ b/src/interfaces/ISablierV2Lockup.sol @@ -155,7 +155,7 @@ interface ISablierV2Lockup is /// @notice Retrieves a flag indicating whether the stream NFT can be transferred. /// @dev Reverts if `streamId` references a null stream. /// @param streamId The stream id for the query. - function isTransferrable(uint256 streamId) external view returns (bool); + function isTransferable(uint256 streamId) external view returns (bool); /*////////////////////////////////////////////////////////////////////////// NON-CONSTANT FUNCTIONS diff --git a/src/interfaces/ISablierV2LockupDynamic.sol b/src/interfaces/ISablierV2LockupDynamic.sol index c32a986c8..d117d9c8a 100644 --- a/src/interfaces/ISablierV2LockupDynamic.sol +++ b/src/interfaces/ISablierV2LockupDynamic.sol @@ -22,7 +22,7 @@ interface ISablierV2LockupDynamic is ISablierV2Lockup { /// broker fee amount, all denoted in units of the asset's decimals. /// @param asset The contract address of the ERC-20 asset used for streaming. /// @param cancelable Boolean indicating whether the stream will be cancelable or not. - /// @param transferrable Boolean indicating whether the stream NFT is transferrable or not. + /// @param transferable Boolean indicating whether the stream NFT is transferable or not. /// @param segments The segments the protocol uses to compose the custom streaming curve. /// @param range Struct containing (i) the stream's start time and (ii) end time, both as Unix timestamps. /// @param broker The address of the broker who has helped create the stream, e.g. a front-end website. @@ -34,7 +34,7 @@ interface ISablierV2LockupDynamic is ISablierV2Lockup { Lockup.CreateAmounts amounts, IERC20 indexed asset, bool cancelable, - bool transferrable, + bool transferable, LockupDynamic.Segment[] segments, LockupDynamic.Range range, address broker diff --git a/src/interfaces/ISablierV2LockupLinear.sol b/src/interfaces/ISablierV2LockupLinear.sol index 115afba1b..be1edebd3 100644 --- a/src/interfaces/ISablierV2LockupLinear.sol +++ b/src/interfaces/ISablierV2LockupLinear.sol @@ -22,7 +22,7 @@ interface ISablierV2LockupLinear is ISablierV2Lockup { /// broker fee amount, all denoted in units of the asset's decimals. /// @param asset The contract address of the ERC-20 asset used for streaming. /// @param cancelable Boolean indicating whether the stream will be cancelable or not. - /// @param transferrable Boolean indicating whether the stream NFT is transferrable or not. + /// @param transferable Boolean indicating whether the stream NFT is transferable or not. /// @param range Struct containing (i) the stream's start time, (ii) cliff time, and (iii) end time, all as Unix /// timestamps. /// @param broker The address of the broker who has helped create the stream, e.g. a front-end website. @@ -34,7 +34,7 @@ interface ISablierV2LockupLinear is ISablierV2Lockup { Lockup.CreateAmounts amounts, IERC20 indexed asset, bool cancelable, - bool transferrable, + bool transferable, LockupLinear.Range range, address broker ); diff --git a/src/libraries/Errors.sol b/src/libraries/Errors.sol index c739532c5..1631329f0 100644 --- a/src/libraries/Errors.sol +++ b/src/libraries/Errors.sol @@ -57,6 +57,9 @@ library Errors { /// @notice Thrown when the stream's sender tries to withdraw to an address other than the recipient's. error SablierV2Lockup_InvalidSenderWithdrawal(uint256 streamId, address sender, address to); + /// @notice Thrown when trying to transfer Stream NFT when transferability is disabled. + error SablierV2Lockup_NotTransferrable(uint256 tokenId); + /// @notice Thrown when the id references a null stream. error SablierV2Lockup_Null(uint256 streamId); @@ -137,11 +140,4 @@ library Errors { /// @notice Thrown when trying to generate the token URI for an unknown ERC-721 NFT contract. error SablierV2NFTDescriptor_UnknownNFT(IERC721Metadata nft, string symbol); - - /*////////////////////////////////////////////////////////////////////////// - SABLIER-V2-NFT-TRANSFERABILITY - //////////////////////////////////////////////////////////////////////////*/ - - /// @notice Thrown when trying to transfer Stream NFT when transferrability is disabled. - error SablierV2NFT_NotTransferrable(uint256 tokenId); } diff --git a/src/types/DataTypes.sol b/src/types/DataTypes.sol index d185dab29..7b7f92122 100644 --- a/src/types/DataTypes.sol +++ b/src/types/DataTypes.sol @@ -78,7 +78,7 @@ library LockupDynamic { /// fees, all denoted in units of the asset's decimals. /// @param asset The contract address of the ERC-20 asset used for streaming. /// @param cancelable Indicates if the stream is cancelable. - /// @param transferrable Indicates if the stream NFT is transferrable. + /// @param transferable Indicates if the stream NFT is transferable. /// @param broker Struct containing (i) the address of the broker assisting in creating the stream, and (ii) the /// percentage fee paid to the broker from `totalAmount`, denoted as a fixed-point number. Both can be set to zero. /// @param segments Segments with deltas used to compose the custom streaming curve. Milestones are calculated by @@ -86,7 +86,7 @@ library LockupDynamic { struct CreateWithDeltas { address sender; bool cancelable; - bool transferrable; + bool transferable; address recipient; uint128 totalAmount; IERC20 asset; @@ -100,7 +100,7 @@ library LockupDynamic { /// same as `msg.sender`. /// @param startTime The Unix timestamp indicating the stream's start. /// @param cancelable Indicates if the stream is cancelable. - /// @param transferrable Indicates if the stream NFT is transferrable. + /// @param transferable Indicates if the stream NFT is transferable. /// @param recipient The address receiving the assets. /// @param totalAmount The total amount of ERC-20 assets to be paid, including the stream deposit and any potential /// fees, all denoted in units of the asset's decimals. @@ -112,7 +112,7 @@ library LockupDynamic { address sender; uint40 startTime; bool cancelable; - bool transferrable; + bool transferable; address recipient; uint128 totalAmount; IERC20 asset; @@ -159,7 +159,7 @@ library LockupDynamic { /// @param asset The contract address of the ERC-20 asset used for streaming. /// @param isDepleted Boolean indicating if the stream is depleted. /// @param isStream Boolean indicating if the struct entity exists. - /// @param isTransferrable BooleaniIndicating if the stream NFT is transferrable. + /// @param isTransferable BooleaniIndicating if the stream NFT is transferable. /// @param amounts Struct containing the deposit, withdrawn, and refunded amounts, all denoted in units of the /// asset's decimals. /// @param segments Segments used to compose the custom streaming curve. @@ -174,7 +174,7 @@ library LockupDynamic { IERC20 asset; bool isDepleted; bool isStream; - bool isTransferrable; + bool isTransferable; // slot 2 and 3 Lockup.Amounts amounts; // slots [4..n] @@ -192,7 +192,7 @@ library LockupLinear { /// fees, all denoted in units of the asset's decimals. /// @param asset The contract address of the ERC-20 asset used for streaming. /// @param cancelable Indicates if the stream is cancelable. - /// @param transferrable Indicates if the stream NFT is transferrable. + /// @param transferable Indicates if the stream NFT is transferable. /// @param durations Struct containing (i) cliff period duration and (ii) total stream duration, both in seconds. /// @param broker Struct containing (i) the address of the broker assisting in creating the stream, and (ii) the /// percentage fee paid to the broker from `totalAmount`, denoted as a fixed-point number. Both can be set to zero. @@ -202,7 +202,7 @@ library LockupLinear { uint128 totalAmount; IERC20 asset; bool cancelable; - bool transferrable; + bool transferable; Durations durations; Broker broker; } @@ -215,7 +215,7 @@ library LockupLinear { /// fees, all denoted in units of the asset's decimals. /// @param asset The contract address of the ERC-20 asset used for streaming. /// @param cancelable Indicates if the stream is cancelable. - /// @param transferrable Indicates if the stream NFT is transferrable. + /// @param transferable Indicates if the stream NFT is transferable. /// @param range Struct containing (i) the stream's start time, (ii) cliff time, and (iii) end time, all as Unix /// timestamps. /// @param broker Struct containing (i) the address of the broker assisting in creating the stream, and (ii) the @@ -226,7 +226,7 @@ library LockupLinear { uint128 totalAmount; IERC20 asset; bool cancelable; - bool transferrable; + bool transferable; Range range; Broker broker; } @@ -260,7 +260,7 @@ library LockupLinear { /// @param endTime The Unix timestamp indicating the stream's end. /// @param isDepleted Boolean indicating if the stream is depleted. /// @param isStream Boolean indicating if the struct entity exists. - /// @param isTransferrable Boolean indicating if the stream NFT is transferrable. + /// @param isTransferable Boolean indicating if the stream NFT is transferable. /// @param amounts Struct containing the deposit, withdrawn, and refunded amounts, all denoted in units of the /// asset's decimals. struct Stream { @@ -275,7 +275,7 @@ library LockupLinear { uint40 endTime; bool isDepleted; bool isStream; - bool isTransferrable; + bool isTransferable; // slot 2 and 3 Lockup.Amounts amounts; } diff --git a/test/fork/LockupDynamic.t.sol b/test/fork/LockupDynamic.t.sol index 25f6d746a..425f66101 100644 --- a/test/fork/LockupDynamic.t.sol +++ b/test/fork/LockupDynamic.t.sol @@ -42,7 +42,7 @@ abstract contract LockupDynamic_Fork_Test is Fork_Test { uint40 warpTimestamp; LockupDynamic.Segment[] segments; uint128 withdrawAmount; - bool transferrable; + bool transferable; } struct Vars { @@ -120,7 +120,7 @@ abstract contract LockupDynamic_Fork_Test is Fork_Test { params.broker.fee = _bound(params.broker.fee, 0, MAX_FEE); params.protocolFee = _bound(params.protocolFee, 0, MAX_FEE); params.startTime = boundUint40(params.startTime, 0, defaults.START_TIME()); - params.transferrable = true; + params.transferable = true; // Fuzz the segment milestones. fuzzSegmentMilestones(params.segments, params.startTime); @@ -167,7 +167,7 @@ abstract contract LockupDynamic_Fork_Test is Fork_Test { amounts: vars.createAmounts, asset: asset, cancelable: true, - transferrable: params.transferrable, + transferable: params.transferable, segments: params.segments, range: vars.range, broker: params.broker.account @@ -179,7 +179,7 @@ abstract contract LockupDynamic_Fork_Test is Fork_Test { asset: asset, broker: params.broker, cancelable: true, - transferrable: params.transferrable, + transferable: params.transferable, recipient: params.recipient, segments: params.segments, sender: params.sender, @@ -200,7 +200,7 @@ abstract contract LockupDynamic_Fork_Test is Fork_Test { assertEq(actualStream.endTime, vars.range.end, "endTime"); assertEq(actualStream.isCancelable, vars.isCancelable, "isCancelable"); assertEq(actualStream.isDepleted, false, "isDepleted"); - assertEq(actualStream.isTransferrable, true, "isTransferrable"); + assertEq(actualStream.isTransferable, true, "isTransferable"); assertEq(actualStream.isStream, true, "isStream"); assertEq(actualStream.segments, params.segments, "segments"); assertEq(actualStream.sender, params.sender, "sender"); diff --git a/test/fork/LockupLinear.t.sol b/test/fork/LockupLinear.t.sol index f97cbce17..3161994ed 100644 --- a/test/fork/LockupLinear.t.sol +++ b/test/fork/LockupLinear.t.sol @@ -42,7 +42,7 @@ abstract contract LockupLinear_Fork_Test is Fork_Test { uint128 totalAmount; uint40 warpTimestamp; uint128 withdrawAmount; - bool transferrable; + bool transferable; } struct Vars { @@ -122,7 +122,7 @@ abstract contract LockupLinear_Fork_Test is Fork_Test { params.range.start = boundUint40(params.range.start, currentTime - 1000 seconds, currentTime + 10_000 seconds); params.range.cliff = boundUint40(params.range.cliff, params.range.start, params.range.start + 52 weeks); params.totalAmount = boundUint128(params.totalAmount, 1, uint128(initialHolderBalance)); - params.transferrable = true; + params.transferable = true; // Bound the end time so that it is always greater than both the current time and the cliff time (this is // a requirement of the protocol). @@ -169,7 +169,7 @@ abstract contract LockupLinear_Fork_Test is Fork_Test { amounts: vars.createAmounts, asset: asset, cancelable: true, - transferrable: params.transferrable, + transferable: params.transferable, range: params.range, broker: params.broker.account }); @@ -180,7 +180,7 @@ abstract contract LockupLinear_Fork_Test is Fork_Test { asset: asset, broker: params.broker, cancelable: true, - transferrable: params.transferrable, + transferable: params.transferable, range: params.range, recipient: params.recipient, sender: params.sender, @@ -196,7 +196,7 @@ abstract contract LockupLinear_Fork_Test is Fork_Test { assertEq(actualStream.endTime, params.range.end, "endTime"); assertEq(actualStream.isCancelable, true, "isCancelable"); assertEq(actualStream.isDepleted, false, "isDepleted"); - assertEq(actualStream.isTransferrable, true, "isTransferrable"); + assertEq(actualStream.isTransferable, true, "isTransferable"); assertEq(actualStream.isStream, true, "isStream"); assertEq(actualStream.sender, params.sender, "sender"); assertEq(actualStream.startTime, params.range.start, "startTime"); diff --git a/test/integration/concrete/lockup-dynamic/LockupDynamic.t.sol b/test/integration/concrete/lockup-dynamic/LockupDynamic.t.sol index 5bfb3d2c6..bc5fe2328 100644 --- a/test/integration/concrete/lockup-dynamic/LockupDynamic.t.sol +++ b/test/integration/concrete/lockup-dynamic/LockupDynamic.t.sol @@ -13,7 +13,6 @@ import { ClaimProtocolRevenues_Integration_Concrete_Test } from import { GetAsset_Integration_Concrete_Test } from "../lockup/get-asset/getAsset.t.sol"; import { GetDepositedAmount_Integration_Concrete_Test } from "../lockup/get-deposited-amount/getDepositedAmount.t.sol"; import { GetEndTime_Integration_Concrete_Test } from "../lockup/get-end-time/getEndTime.t.sol"; -import { ProtocolRevenues_Integration_Concrete_Test } from "../lockup/protocol-revenues/protocolRevenues.t.sol"; import { GetRecipient_Integration_Concrete_Test } from "../lockup/get-recipient/getRecipient.t.sol"; import { GetRefundedAmount_Integration_Concrete_Test } from "../lockup/get-refunded-amount/getRefundedAmount.t.sol"; import { GetSender_Integration_Concrete_Test } from "../lockup/get-sender/getSender.t.sol"; @@ -23,7 +22,9 @@ import { IsCancelable_Integration_Concrete_Test } from "../lockup/is-cancelable/ import { IsCold_Integration_Concrete_Test } from "../lockup/is-cold/isCold.t.sol"; import { IsDepleted_Integration_Concrete_Test } from "../lockup/is-depleted/isDepleted.t.sol"; import { IsStream_Integration_Concrete_Test } from "../lockup/is-stream/isStream.t.sol"; +import { IsTransferable_Integration_Concrete_Test } from "../lockup/is-transferable/isTransferable.t.sol"; import { IsWarm_Integration_Concrete_Test } from "../lockup/is-warm/isWarm.t.sol"; +import { ProtocolRevenues_Integration_Concrete_Test } from "../lockup/protocol-revenues/protocolRevenues.t.sol"; import { RefundableAmountOf_Integration_Concrete_Test } from "../lockup/refundable-amount-of/refundableAmountOf.t.sol"; import { Renounce_Integration_Concrete_Test } from "../lockup/renounce/renounce.t.sol"; import { SetComptroller_Integration_Concrete_Test } from "../lockup/set-comptroller/setComptroller.t.sol"; @@ -180,34 +181,6 @@ contract GetRefundedAmount_LockupDynamic_Integration_Concrete_Test is } } -contract ProtocolRevenues_LockupDynamic_Integration_Concrete_Test is - LockupDynamic_Integration_Concrete_Test, - ProtocolRevenues_Integration_Concrete_Test -{ - function setUp() - public - virtual - override(LockupDynamic_Integration_Concrete_Test, ProtocolRevenues_Integration_Concrete_Test) - { - LockupDynamic_Integration_Concrete_Test.setUp(); - ProtocolRevenues_Integration_Concrete_Test.setUp(); - } -} - -contract RefundableAmountOf_LockupDynamic_Integration_Concrete_Test is - LockupDynamic_Integration_Concrete_Test, - RefundableAmountOf_Integration_Concrete_Test -{ - function setUp() - public - virtual - override(LockupDynamic_Integration_Concrete_Test, RefundableAmountOf_Integration_Concrete_Test) - { - LockupDynamic_Integration_Concrete_Test.setUp(); - RefundableAmountOf_Integration_Concrete_Test.setUp(); - } -} - contract GetSender_LockupDynamic_Integration_Concrete_Test is LockupDynamic_Integration_Concrete_Test, GetSender_Integration_Concrete_Test @@ -306,6 +279,20 @@ contract IsStream_LockupDynamic_Integration_Concrete_Test is } } +contract IsTransferable_LockupDynamic_Integration_Concrete_Test is + LockupDynamic_Integration_Concrete_Test, + IsTransferable_Integration_Concrete_Test +{ + function setUp() + public + virtual + override(LockupDynamic_Integration_Concrete_Test, IsTransferable_Integration_Concrete_Test) + { + LockupDynamic_Integration_Concrete_Test.setUp(); + IsTransferable_Integration_Concrete_Test.setUp(); + } +} + contract IsWarm_LockupDynamic_Integration_Concrete_Test is LockupDynamic_Integration_Concrete_Test, IsWarm_Integration_Concrete_Test @@ -320,6 +307,34 @@ contract IsWarm_LockupDynamic_Integration_Concrete_Test is } } +contract ProtocolRevenues_LockupDynamic_Integration_Concrete_Test is + LockupDynamic_Integration_Concrete_Test, + ProtocolRevenues_Integration_Concrete_Test +{ + function setUp() + public + virtual + override(LockupDynamic_Integration_Concrete_Test, ProtocolRevenues_Integration_Concrete_Test) + { + LockupDynamic_Integration_Concrete_Test.setUp(); + ProtocolRevenues_Integration_Concrete_Test.setUp(); + } +} + +contract RefundableAmountOf_LockupDynamic_Integration_Concrete_Test is + LockupDynamic_Integration_Concrete_Test, + RefundableAmountOf_Integration_Concrete_Test +{ + function setUp() + public + virtual + override(LockupDynamic_Integration_Concrete_Test, RefundableAmountOf_Integration_Concrete_Test) + { + LockupDynamic_Integration_Concrete_Test.setUp(); + RefundableAmountOf_Integration_Concrete_Test.setUp(); + } +} + contract Renounce_LockupDynamic_Integration_Concrete_Test is LockupDynamic_Integration_Concrete_Test, Renounce_Integration_Concrete_Test diff --git a/test/integration/concrete/lockup-dynamic/create-with-deltas/createWithDeltas.t.sol b/test/integration/concrete/lockup-dynamic/create-with-deltas/createWithDeltas.t.sol index 5773802b9..4ad1b9bee 100644 --- a/test/integration/concrete/lockup-dynamic/create-with-deltas/createWithDeltas.t.sol +++ b/test/integration/concrete/lockup-dynamic/create-with-deltas/createWithDeltas.t.sol @@ -135,9 +135,6 @@ contract CreateWithDeltas_LockupDynamic_Integration_Concrete_Test is segments[0].milestone = range.start + segmentsWithDeltas[0].delta; segments[1].milestone = segments[0].milestone + segmentsWithDeltas[1].delta; - // make NFT transferrable - bool transferrable = true; - // Expect the assets to be transferred from the funder to {SablierV2LockupDynamic}. expectCallToTransferFrom({ from: funder, @@ -158,7 +155,7 @@ contract CreateWithDeltas_LockupDynamic_Integration_Concrete_Test is amounts: defaults.lockupCreateAmounts(), asset: dai, cancelable: true, - transferrable: transferrable, + transferable: true, segments: segments, range: range, broker: users.broker diff --git a/test/integration/concrete/lockup-dynamic/create-with-milestones/createWithMilestones.t.sol b/test/integration/concrete/lockup-dynamic/create-with-milestones/createWithMilestones.t.sol index 2b929bb9a..82e5d54c9 100644 --- a/test/integration/concrete/lockup-dynamic/create-with-milestones/createWithMilestones.t.sol +++ b/test/integration/concrete/lockup-dynamic/create-with-milestones/createWithMilestones.t.sol @@ -343,9 +343,6 @@ contract CreateWithMilestones_LockupDynamic_Integration_Concrete_Test is // Make the Sender the stream's funder. address funder = users.sender; - // make NFT transferrable - bool transferrable = true; - // Expect the assets to be transferred from the funder to {SablierV2LockupDynamic}. expectCallToTransferFrom({ asset: IERC20(asset), @@ -373,7 +370,7 @@ contract CreateWithMilestones_LockupDynamic_Integration_Concrete_Test is segments: defaults.segments(), asset: IERC20(asset), cancelable: true, - transferrable: transferrable, + transferable: true, range: defaults.lockupDynamicRange(), broker: users.broker }); diff --git a/test/integration/concrete/lockup-dynamic/is-transferrable/isTransferrable.t.sol b/test/integration/concrete/lockup-dynamic/is-transferrable/isTransferrable.t.sol deleted file mode 100644 index 24128aab5..000000000 --- a/test/integration/concrete/lockup-dynamic/is-transferrable/isTransferrable.t.sol +++ /dev/null @@ -1,41 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity >=0.8.19 <0.9.0; - -import { Errors } from "src/libraries/Errors.sol"; - -import { LockupDynamic_Integration_Concrete_Test } from "../LockupDynamic.t.sol"; - -contract IsTransferrable_LockupDynamic_Integration_Concrete_Test is LockupDynamic_Integration_Concrete_Test { - uint256 internal defaultStreamId; - - function setUp() public virtual override { - LockupDynamic_Integration_Concrete_Test.setUp(); - defaultStreamId = createDefaultStream(); - } - - function test_RevertGiven_Null() external { - uint256 nullStreamId = 1729; - vm.expectRevert(abi.encodeWithSelector(Errors.SablierV2Lockup_Null.selector, nullStreamId)); - lockupDynamic.isTransferrable(nullStreamId); - } - - modifier givenNotNull() { - defaultStreamId = createDefaultStream(); - _; - } - - function test_RevertGiven_StreamTransferNotEnabled() external givenNotNull { - uint256 noTransferStreamId = createDefaultStreamWithTransferDisabled(); - bool isTransferrable = lockupDynamic.isTransferrable(noTransferStreamId); - assertFalse(isTransferrable, "isTransferrable"); - } - - modifier givenStreamTransferEnabled() { - _; - } - - function test_IsTransferrable_Stream() external givenNotNull givenStreamTransferEnabled { - bool isTransferrable = lockupDynamic.isTransferrable(defaultStreamId); - assertTrue(isTransferrable, "isTransferrable"); - } -} diff --git a/test/integration/concrete/lockup-linear/LockupLinear.t.sol b/test/integration/concrete/lockup-linear/LockupLinear.t.sol index 9715b771b..edc46b988 100644 --- a/test/integration/concrete/lockup-linear/LockupLinear.t.sol +++ b/test/integration/concrete/lockup-linear/LockupLinear.t.sol @@ -15,7 +15,6 @@ import { GetAsset_Integration_Concrete_Test } from "../lockup/get-asset/getAsset import { GetDepositedAmount_Integration_Concrete_Test } from "../lockup/get-deposited-amount/getDepositedAmount.t.sol"; import { GetEndTime_Integration_Concrete_Test } from "../lockup/get-end-time/getEndTime.t.sol"; import { GetRefundedAmount_Integration_Concrete_Test } from "../lockup/get-refunded-amount/getRefundedAmount.t.sol"; -import { ProtocolRevenues_Integration_Concrete_Test } from "../lockup/protocol-revenues/protocolRevenues.t.sol"; import { GetRecipient_Integration_Concrete_Test } from "../lockup/get-recipient/getRecipient.t.sol"; import { GetSender_Integration_Concrete_Test } from "../lockup/get-sender/getSender.t.sol"; import { GetStartTime_Integration_Concrete_Test } from "../lockup/get-start-time/getStartTime.t.sol"; @@ -24,7 +23,9 @@ import { IsCancelable_Integration_Concrete_Test } from "../lockup/is-cancelable/ import { IsCold_Integration_Concrete_Test } from "../lockup/is-cold/isCold.t.sol"; import { IsDepleted_Integration_Concrete_Test } from "../lockup/is-depleted/isDepleted.t.sol"; import { IsStream_Integration_Concrete_Test } from "../lockup/is-stream/isStream.t.sol"; +import { IsTransferable_Integration_Concrete_Test } from "../lockup/is-transferable/isTransferable.t.sol"; import { IsWarm_Integration_Concrete_Test } from "../lockup/is-warm/isWarm.t.sol"; +import { ProtocolRevenues_Integration_Concrete_Test } from "../lockup/protocol-revenues/protocolRevenues.t.sol"; import { RefundableAmountOf_Integration_Concrete_Test } from "../lockup/refundable-amount-of/refundableAmountOf.t.sol"; import { Renounce_Integration_Concrete_Test } from "../lockup/renounce/renounce.t.sol"; import { SetComptroller_Integration_Concrete_Test } from "../lockup/set-comptroller/setComptroller.t.sol"; @@ -279,6 +280,20 @@ contract IsStream_LockupLinear_Integration_Concrete_Test is } } +contract IsTransferable_LockupLinear_Integration_Concrete_Test is + LockupLinear_Integration_Concrete_Test, + IsTransferable_Integration_Concrete_Test +{ + function setUp() + public + virtual + override(LockupLinear_Integration_Concrete_Test, IsTransferable_Integration_Concrete_Test) + { + LockupLinear_Integration_Concrete_Test.setUp(); + IsTransferable_Integration_Concrete_Test.setUp(); + } +} + contract IsWarm_LockupLinear_Integration_Concrete_Test is LockupLinear_Integration_Concrete_Test, IsWarm_Integration_Concrete_Test diff --git a/test/integration/concrete/lockup-linear/create-with-durations/createWithDurations.t.sol b/test/integration/concrete/lockup-linear/create-with-durations/createWithDurations.t.sol index 44055a4ef..dc5543c3c 100644 --- a/test/integration/concrete/lockup-linear/create-with-durations/createWithDurations.t.sol +++ b/test/integration/concrete/lockup-linear/create-with-durations/createWithDurations.t.sol @@ -100,9 +100,6 @@ contract CreateWithDurations_LockupLinear_Integration_Concrete_Test is end: currentTime + defaults.TOTAL_DURATION() }); - // make NFT transferrable - bool transferrable = true; - // Expect the assets to be transferred from the funder to {SablierV2LockupLinear}. expectCallToTransferFrom({ from: funder, @@ -123,7 +120,7 @@ contract CreateWithDurations_LockupLinear_Integration_Concrete_Test is amounts: defaults.lockupCreateAmounts(), asset: dai, cancelable: true, - transferrable: transferrable, + transferable: true, range: range, broker: users.broker }); diff --git a/test/integration/concrete/lockup-linear/create-with-range/createWithRange.t.sol b/test/integration/concrete/lockup-linear/create-with-range/createWithRange.t.sol index f08190aa0..a96f874c2 100644 --- a/test/integration/concrete/lockup-linear/create-with-range/createWithRange.t.sol +++ b/test/integration/concrete/lockup-linear/create-with-range/createWithRange.t.sol @@ -181,9 +181,6 @@ contract CreateWithRange_LockupLinear_Integration_Concrete_Test is // Make the Sender the stream's funder. address funder = users.sender; - // make NFT transferrable - bool transferrable = true; - // Expect the assets to be transferred from the funder to {SablierV2LockupLinear}. expectCallToTransferFrom({ asset: IERC20(asset), @@ -210,7 +207,7 @@ contract CreateWithRange_LockupLinear_Integration_Concrete_Test is amounts: defaults.lockupCreateAmounts(), asset: IERC20(asset), cancelable: true, - transferrable: transferrable, + transferable: true, range: defaults.lockupLinearRange(), broker: users.broker }); diff --git a/test/integration/concrete/lockup-linear/is-transferrable/isTransferrable.t.sol b/test/integration/concrete/lockup-linear/is-transferrable/isTransferrable.t.sol deleted file mode 100644 index cfc41a8d9..000000000 --- a/test/integration/concrete/lockup-linear/is-transferrable/isTransferrable.t.sol +++ /dev/null @@ -1,41 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity >=0.8.19 <0.9.0; - -import { Errors } from "src/libraries/Errors.sol"; - -import { LockupLinear_Integration_Concrete_Test } from "../LockupLinear.t.sol"; - -contract IsTransferrable_LockupLinear_Integration_Concrete_Test is LockupLinear_Integration_Concrete_Test { - uint256 internal defaultStreamId; - - function setUp() public virtual override { - LockupLinear_Integration_Concrete_Test.setUp(); - defaultStreamId = createDefaultStream(); - } - - function test_RevertGiven_Null() external { - uint256 nullStreamId = 1729; - vm.expectRevert(abi.encodeWithSelector(Errors.SablierV2Lockup_Null.selector, nullStreamId)); - lockupLinear.isTransferrable(nullStreamId); - } - - modifier givenNotNull() { - defaultStreamId = createDefaultStream(); - _; - } - - function test_RevertGiven_StreamTransferNotEnabled() external givenNotNull { - uint256 noTransferStreamId = createDefaultStreamWithTransferDisabled(); - bool isTransferrable = lockupLinear.isTransferrable(noTransferStreamId); - assertFalse(isTransferrable, "isTransferrable"); - } - - modifier givenStreamTransferEnabled() { - _; - } - - function test_IsTransferrable_Stream() external givenNotNull givenStreamTransferEnabled { - bool isTransferrable = lockupLinear.isTransferrable(defaultStreamId); - assertTrue(isTransferrable, "isTransferrable"); - } -} diff --git a/test/integration/concrete/lockup-linear/is-transferrable/isTransferrable.tree b/test/integration/concrete/lockup-linear/is-transferrable/isTransferrable.tree deleted file mode 100644 index dd6a2092d..000000000 --- a/test/integration/concrete/lockup-linear/is-transferrable/isTransferrable.tree +++ /dev/null @@ -1,8 +0,0 @@ -isTransferrable.t.sol -├── given the id references a null stream -│ └── it should revert -└── given the id does not reference a null stream - ├── given the stream is not transferrable - │ └── it should return false - └── given the stream is transferrable - └── it should return true \ No newline at end of file diff --git a/test/integration/concrete/lockup/is-transferable/isTransferable.t.sol b/test/integration/concrete/lockup/is-transferable/isTransferable.t.sol new file mode 100644 index 000000000..53652859c --- /dev/null +++ b/test/integration/concrete/lockup/is-transferable/isTransferable.t.sol @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >=0.8.19 <0.9.0; + +import { Errors } from "src/libraries/Errors.sol"; + +import { Lockup_Integration_Shared_Test } from "../../../shared/lockup/Lockup.t.sol"; +import { Integration_Test } from "../../../Integration.t.sol"; + +abstract contract IsTransferable_Integration_Concrete_Test is Integration_Test, Lockup_Integration_Shared_Test { + uint256 internal defaultStreamId; + + function setUp() public virtual override(Integration_Test, Lockup_Integration_Shared_Test) { } + + function test_RevertGiven_Null() external { + uint256 nullStreamId = 1729; + vm.expectRevert(abi.encodeWithSelector(Errors.SablierV2Lockup_Null.selector, nullStreamId)); + lockup.isTransferable(nullStreamId); + } + + modifier givenNotNull() { + defaultStreamId = createDefaultStream(); + _; + } + + function test_RevertGiven_StreamTransferNotEnabled() external givenNotNull { + uint256 notTransferableStreamId = createDefaultStreamNotTransferable(); + bool isTransferable = lockup.isTransferable(notTransferableStreamId); + assertFalse(isTransferable, "isTransferable"); + } + + modifier givenStreamTransferable() { + _; + } + + function test_IsTransferrable_Stream() external givenNotNull givenStreamTransferable { + bool isTransferable = lockup.isTransferable(defaultStreamId); + assertTrue(isTransferable, "isTransferable"); + } +} diff --git a/test/integration/concrete/lockup-dynamic/is-transferrable/isTransferrable.tree b/test/integration/concrete/lockup/is-transferable/isTransferable.tree similarity index 52% rename from test/integration/concrete/lockup-dynamic/is-transferrable/isTransferrable.tree rename to test/integration/concrete/lockup/is-transferable/isTransferable.tree index dd6a2092d..2fefdc265 100644 --- a/test/integration/concrete/lockup-dynamic/is-transferrable/isTransferrable.tree +++ b/test/integration/concrete/lockup/is-transferable/isTransferable.tree @@ -1,8 +1,8 @@ -isTransferrable.t.sol +isTransferable.t.sol ├── given the id references a null stream │ └── it should revert └── given the id does not reference a null stream - ├── given the stream is not transferrable + ├── given the stream is not transferable │ └── it should return false - └── given the stream is transferrable - └── it should return true \ No newline at end of file + └── given the stream is transferable + └── it should return true diff --git a/test/integration/concrete/lockup/withdraw-max-and-transfer/withdrawMaxAndTransfer.t.sol b/test/integration/concrete/lockup/withdraw-max-and-transfer/withdrawMaxAndTransfer.t.sol index de90be401..a5a53433d 100644 --- a/test/integration/concrete/lockup/withdraw-max-and-transfer/withdrawMaxAndTransfer.t.sol +++ b/test/integration/concrete/lockup/withdraw-max-and-transfer/withdrawMaxAndTransfer.t.sol @@ -7,8 +7,6 @@ import { Errors } from "src/libraries/Errors.sol"; import { WithdrawMaxAndTransfer_Integration_Shared_Test } from "../../../shared/lockup/withdrawMaxAndTransfer.t.sol"; import { Integration_Test } from "../../../Integration.t.sol"; -import "forge-std/console.sol"; - abstract contract WithdrawMaxAndTransfer_Integration_Concrete_Test is Integration_Test, WithdrawMaxAndTransfer_Integration_Shared_Test @@ -29,18 +27,7 @@ abstract contract WithdrawMaxAndTransfer_Integration_Concrete_Test is lockup.withdrawMaxAndTransfer({ streamId: nullStreamId, newRecipient: users.recipient }); } - function test_RevertGiven_StreamTransferNotEnabled() external whenNotDelegateCalled { - uint256 noTransferStreamId = createDefaultStreamWithTransferDisabled(); - vm.expectRevert(abi.encodeWithSelector(Errors.SablierV2NFT_NotTransferrable.selector, noTransferStreamId)); - lockup.withdrawMaxAndTransfer({ streamId: noTransferStreamId, newRecipient: users.recipient }); - } - - function test_RevertWhen_CallerNotCurrentRecipient() - external - givenStreamTransferEnabled - whenNotDelegateCalled - givenNotNull - { + function test_RevertWhen_CallerNotCurrentRecipient() external whenNotDelegateCalled givenNotNull { // Make Eve the caller in this test. changePrank({ msgSender: users.eve }); @@ -51,13 +38,7 @@ abstract contract WithdrawMaxAndTransfer_Integration_Concrete_Test is lockup.withdrawMaxAndTransfer({ streamId: defaultStreamId, newRecipient: users.eve }); } - function test_RevertGiven_NFTBurned() - external - givenStreamTransferEnabled - whenNotDelegateCalled - givenNotNull - whenCallerCurrentRecipient - { + function test_RevertGiven_NFTBurned() external whenNotDelegateCalled givenNotNull whenCallerCurrentRecipient { // Deplete the stream. vm.warp({ timestamp: defaults.END_TIME() }); lockup.withdrawMax({ streamId: defaultStreamId, to: users.recipient }); @@ -74,7 +55,6 @@ abstract contract WithdrawMaxAndTransfer_Integration_Concrete_Test is function test_WithdrawMaxAndTransfer_WithdrawableAmountZero() external - givenStreamTransferEnabled whenNotDelegateCalled givenNotNull whenCallerCurrentRecipient @@ -85,14 +65,29 @@ abstract contract WithdrawMaxAndTransfer_Integration_Concrete_Test is lockup.withdrawMaxAndTransfer({ streamId: defaultStreamId, newRecipient: users.alice }); } + function test_RevertGiven_StreamNotTransferable() + external + whenNotDelegateCalled + givenNotNull + whenCallerCurrentRecipient + givenNFTNotBurned + givenWithdrawableAmountNotZero + { + uint256 notTransferableStreamId = createDefaultStreamNotTransferable(); + vm.expectRevert( + abi.encodeWithSelector(Errors.SablierV2Lockup_NotTransferrable.selector, notTransferableStreamId) + ); + lockup.withdrawMaxAndTransfer({ streamId: notTransferableStreamId, newRecipient: users.recipient }); + } + function test_WithdrawMaxAndTransfer() external - givenStreamTransferEnabled whenNotDelegateCalled givenNotNull whenCallerCurrentRecipient givenNFTNotBurned givenWithdrawableAmountNotZero + givenStreamTransferable { // Simulate the passage of time. vm.warp({ timestamp: defaults.WARP_26_PERCENT() }); diff --git a/test/integration/concrete/lockup/withdraw-max-and-transfer/withdrawMaxAndTransfer.tree b/test/integration/concrete/lockup/withdraw-max-and-transfer/withdrawMaxAndTransfer.tree index a3554297f..caba36c6a 100644 --- a/test/integration/concrete/lockup/withdraw-max-and-transfer/withdrawMaxAndTransfer.tree +++ b/test/integration/concrete/lockup/withdraw-max-and-transfer/withdrawMaxAndTransfer.tree @@ -5,18 +5,18 @@ withdrawMaxAndTransfer.t.sol ├── given the id references a null stream │ └── it should revert └── given the id does not reference a null stream - ├── given the NFT transfer is not enabled + ├── given the stream is not transferable │ └── it should revert - ├── given the NFT transfer is enabled - ├── when the caller is not the current recipient + └── given the stream is transferable + ├── given the NFT has been burned │ └── it should revert - └── when the caller is the current recipient - ├── given the NFT has been burned - │ └── it should revert - └── given the NFT has not been burned - ├── given the withdrawable amount is zero - │ └── it should skip the withdrawal - └── given the withdrawable amount is not zero + └── given the NFT has not been burned + ├── given the withdrawable amount is zero + │ └── it should skip the withdrawal + └── given the withdrawable amount is not zero + ├── when the caller is not the current recipient + │ └── it should revert + └── when the caller is the current recipient ├── it should make the max withdrawal ├── it should update the withdrawn amount ├── it should transfer the NFT diff --git a/test/integration/fuzz/lockup-dynamic/createWithDeltas.t.sol b/test/integration/fuzz/lockup-dynamic/createWithDeltas.t.sol index 7bf03a5d7..aaf2455ab 100644 --- a/test/integration/fuzz/lockup-dynamic/createWithDeltas.t.sol +++ b/test/integration/fuzz/lockup-dynamic/createWithDeltas.t.sol @@ -91,7 +91,7 @@ contract CreateWithDeltas_LockupDynamic_Integration_Fuzz_Test is amounts: vars.createAmounts, asset: dai, cancelable: true, - transferrable: true, + transferable: true, segments: vars.segmentsWithMilestones, range: range, broker: users.broker @@ -101,7 +101,7 @@ contract CreateWithDeltas_LockupDynamic_Integration_Fuzz_Test is LockupDynamic.CreateWithDeltas memory params = defaults.createWithDeltas(); params.segments = segments; params.totalAmount = vars.totalAmount; - params.transferrable = true; + params.transferable = true; lockupDynamic.createWithDeltas(params); // Check if the stream is settled. It is possible for a Lockup Dynamic stream to settle at the time of creation @@ -115,7 +115,7 @@ contract CreateWithDeltas_LockupDynamic_Integration_Fuzz_Test is assertEq(actualStream.asset, dai, "asset"); assertEq(actualStream.endTime, range.end, "endTime"); assertEq(actualStream.isCancelable, vars.isCancelable, "isCancelable"); - assertEq(actualStream.isTransferrable, true, "isTransferrable"); + assertEq(actualStream.isTransferable, true, "isTransferable"); assertEq(actualStream.isDepleted, false, "isDepleted"); assertEq(actualStream.isStream, true, "isStream"); assertEq(actualStream.segments, vars.segmentsWithMilestones, "segments"); diff --git a/test/integration/fuzz/lockup-dynamic/createWithMilestones.t.sol b/test/integration/fuzz/lockup-dynamic/createWithMilestones.t.sol index 0eaef897e..d64dfee64 100644 --- a/test/integration/fuzz/lockup-dynamic/createWithMilestones.t.sol +++ b/test/integration/fuzz/lockup-dynamic/createWithMilestones.t.sol @@ -227,7 +227,7 @@ contract CreateWithMilestones_LockupDynamic_Integration_Fuzz_Test is params.broker.fee = _bound(params.broker.fee, 0, MAX_FEE); protocolFee = _bound(protocolFee, 0, MAX_FEE); params.startTime = boundUint40(params.startTime, 0, defaults.START_TIME()); - params.transferrable = true; + params.transferable = true; // Fuzz the segment milestones. fuzzSegmentMilestones(params.segments, params.startTime); @@ -278,7 +278,7 @@ contract CreateWithMilestones_LockupDynamic_Integration_Fuzz_Test is amounts: vars.createAmounts, asset: dai, cancelable: params.cancelable, - transferrable: params.transferrable, + transferable: params.transferable, segments: params.segments, range: range, broker: params.broker.account @@ -290,7 +290,7 @@ contract CreateWithMilestones_LockupDynamic_Integration_Fuzz_Test is asset: dai, broker: params.broker, cancelable: params.cancelable, - transferrable: params.transferrable, + transferable: params.transferable, recipient: params.recipient, segments: params.segments, sender: params.sender, @@ -310,7 +310,7 @@ contract CreateWithMilestones_LockupDynamic_Integration_Fuzz_Test is assertEq(actualStream.asset, dai, "asset"); assertEq(actualStream.endTime, range.end, "endTime"); assertEq(actualStream.isCancelable, vars.isCancelable, "isCancelable"); - assertEq(actualStream.isTransferrable, true, "isTransferrable"); + assertEq(actualStream.isTransferable, true, "isTransferable"); assertEq(actualStream.isDepleted, false, "isStream"); assertEq(actualStream.isStream, true, "isStream"); assertEq(actualStream.sender, params.sender, "sender"); diff --git a/test/integration/fuzz/lockup-linear/createWithDurations.t.sol b/test/integration/fuzz/lockup-linear/createWithDurations.t.sol index 0b05bb536..c84b7af53 100644 --- a/test/integration/fuzz/lockup-linear/createWithDurations.t.sol +++ b/test/integration/fuzz/lockup-linear/createWithDurations.t.sol @@ -117,7 +117,7 @@ contract CreateWithDurations_LockupLinear_Integration_Fuzz_Test is amounts: defaults.lockupCreateAmounts(), asset: dai, cancelable: true, - transferrable: true, + transferable: true, range: range, broker: users.broker }); diff --git a/test/integration/fuzz/lockup-linear/createWithRange.t.sol b/test/integration/fuzz/lockup-linear/createWithRange.t.sol index fe85e4424..3b9cd914b 100644 --- a/test/integration/fuzz/lockup-linear/createWithRange.t.sol +++ b/test/integration/fuzz/lockup-linear/createWithRange.t.sol @@ -147,7 +147,7 @@ contract CreateWithRange_LockupLinear_Integration_Fuzz_Test is params.range.end = boundUint40(params.range.end, params.range.cliff + 1 seconds, MAX_UNIX_TIMESTAMP); params.broker.fee = _bound(params.broker.fee, 0, MAX_FEE); protocolFee = _bound(protocolFee, 0, MAX_FEE); - params.transferrable = true; + params.transferable = true; // Calculate the fee amounts and the deposit amount. Vars memory vars; @@ -190,7 +190,7 @@ contract CreateWithRange_LockupLinear_Integration_Fuzz_Test is amounts: vars.createAmounts, asset: dai, cancelable: params.cancelable, - transferrable: params.transferrable, + transferable: params.transferable, range: params.range, broker: params.broker.account }); @@ -203,7 +203,7 @@ contract CreateWithRange_LockupLinear_Integration_Fuzz_Test is cancelable: params.cancelable, range: params.range, recipient: params.recipient, - transferrable: params.transferrable, + transferable: params.transferable, sender: params.sender, totalAmount: params.totalAmount }) @@ -217,7 +217,7 @@ contract CreateWithRange_LockupLinear_Integration_Fuzz_Test is assertEq(actualStream.endTime, params.range.end, "endTime"); assertEq(actualStream.isCancelable, params.cancelable, "isCancelable"); assertEq(actualStream.isDepleted, false, "isStream"); - assertEq(actualStream.isTransferrable, true, "isTransferrable"); + assertEq(actualStream.isTransferable, true, "isTransferable"); assertEq(actualStream.isStream, true, "isStream"); assertEq(actualStream.sender, params.sender, "sender"); assertEq(actualStream.startTime, params.range.start, "startTime"); diff --git a/test/integration/fuzz/lockup/withdrawMaxAndTransfer.t.sol b/test/integration/fuzz/lockup/withdrawMaxAndTransfer.t.sol index dcefe5ae8..00ddfca1d 100644 --- a/test/integration/fuzz/lockup/withdrawMaxAndTransfer.t.sol +++ b/test/integration/fuzz/lockup/withdrawMaxAndTransfer.t.sol @@ -25,7 +25,7 @@ abstract contract WithdrawMaxAndTransfer_Integration_Fuzz_Test is givenNotNull whenCallerCurrentRecipient givenNFTNotBurned - givenStreamTransferEnabled + givenStreamTransferable { vm.assume(newRecipient != address(0)); timeJump = _bound(timeJump, 0, defaults.TOTAL_DURATION() * 2); diff --git a/test/integration/shared/lockup-dynamic/LockupDynamic.t.sol b/test/integration/shared/lockup-dynamic/LockupDynamic.t.sol index d6a0f9c36..314c81aac 100644 --- a/test/integration/shared/lockup-dynamic/LockupDynamic.t.sol +++ b/test/integration/shared/lockup-dynamic/LockupDynamic.t.sol @@ -26,7 +26,7 @@ abstract contract LockupDynamic_Integration_Shared_Test is Lockup_Integration_Sh _params.createWithDeltas.totalAmount = defaults.TOTAL_AMOUNT(); _params.createWithDeltas.asset = dai; _params.createWithDeltas.cancelable = true; - _params.createWithDeltas.transferrable = true; + _params.createWithDeltas.transferable = true; _params.createWithDeltas.broker = defaults.broker(); _params.createWithMilestones.sender = users.sender; @@ -34,7 +34,7 @@ abstract contract LockupDynamic_Integration_Shared_Test is Lockup_Integration_Sh _params.createWithMilestones.totalAmount = defaults.TOTAL_AMOUNT(); _params.createWithMilestones.asset = dai; _params.createWithMilestones.cancelable = true; - _params.createWithMilestones.transferrable = true; + _params.createWithMilestones.transferable = true; _params.createWithMilestones.startTime = defaults.START_TIME(); _params.createWithMilestones.broker = defaults.broker(); @@ -95,6 +95,13 @@ abstract contract LockupDynamic_Integration_Shared_Test is Lockup_Integration_Sh streamId = lockupDynamic.createWithMilestones(params); } + /// @dev Creates the default stream with the NFT transfer disabled. + function createDefaultStreamNotTransferable() internal override returns (uint256 streamId) { + LockupDynamic.CreateWithMilestones memory params = _params.createWithMilestones; + params.transferable = false; + streamId = lockupDynamic.createWithMilestones(params); + } + /// @dev Creates the default stream with the provided range. function createDefaultStreamWithRange(LockupDynamic.Range memory range) internal returns (uint256 streamId) { LockupDynamic.CreateWithMilestones memory params = _params.createWithMilestones; @@ -140,11 +147,4 @@ abstract contract LockupDynamic_Integration_Shared_Test is Lockup_Integration_Sh params.totalAmount = totalAmount; streamId = lockupDynamic.createWithMilestones(params); } - - /// @dev Creates the default stream with the NFT transfer disabled. - function createDefaultStreamWithTransferDisabled() internal override returns (uint256 streamId) { - LockupDynamic.CreateWithMilestones memory params = _params.createWithMilestones; - params.transferrable = false; - streamId = lockupDynamic.createWithMilestones(params); - } } diff --git a/test/integration/shared/lockup-linear/LockupLinear.t.sol b/test/integration/shared/lockup-linear/LockupLinear.t.sol index 941bd3af2..2a909fa0d 100644 --- a/test/integration/shared/lockup-linear/LockupLinear.t.sol +++ b/test/integration/shared/lockup-linear/LockupLinear.t.sol @@ -65,6 +65,13 @@ abstract contract LockupLinear_Integration_Shared_Test is Lockup_Integration_Sha streamId = lockupLinear.createWithRange(params); } + /// @dev Creates the default stream with the NFT transfer disabled. + function createDefaultStreamNotTransferable() internal override returns (uint256 streamId) { + LockupLinear.CreateWithRange memory params = _params.createWithRange; + params.transferable = false; + streamId = lockupLinear.createWithRange(params); + } + /// @dev Creates the default stream with the provided end time. function createDefaultStreamWithEndTime(uint40 endTime) internal override returns (uint256 streamId) { LockupLinear.CreateWithRange memory params = _params.createWithRange; @@ -109,11 +116,4 @@ abstract contract LockupLinear_Integration_Shared_Test is Lockup_Integration_Sha params.totalAmount = totalAmount; streamId = lockupLinear.createWithRange(params); } - - /// @dev Creates the default stream with the NFT transfer disabled. - function createDefaultStreamWithTransferDisabled() internal override returns (uint256 streamId) { - LockupLinear.CreateWithRange memory params = _params.createWithRange; - params.transferrable = false; - streamId = lockupLinear.createWithRange(params); - } } diff --git a/test/integration/shared/lockup/Lockup.t.sol b/test/integration/shared/lockup/Lockup.t.sol index 3e85fb73f..7974e50d6 100644 --- a/test/integration/shared/lockup/Lockup.t.sol +++ b/test/integration/shared/lockup/Lockup.t.sol @@ -47,6 +47,9 @@ abstract contract Lockup_Integration_Shared_Test is Base_Test { /// @dev Creates the default stream but make it not cancelable. function createDefaultStreamNotCancelable() internal virtual returns (uint256 streamId); + /// @dev Creates the default stream with the NFT transfer disabled. + function createDefaultStreamNotTransferable() internal virtual returns (uint256 streamId); + /// @dev Creates the default stream with the provided address. function createDefaultStreamWithAsset(IERC20 asset) internal virtual returns (uint256 streamId); @@ -67,7 +70,4 @@ abstract contract Lockup_Integration_Shared_Test is Base_Test { /// @dev Creates the default stream with the provided total amount. function createDefaultStreamWithTotalAmount(uint128 totalAmount) internal virtual returns (uint256 streamId); - - /// @dev Creates the default stream with the NFT transfer disabled. - function createDefaultStreamWithTransferDisabled() internal virtual returns (uint256 streamId); } diff --git a/test/integration/shared/lockup/withdrawMaxAndTransfer.t.sol b/test/integration/shared/lockup/withdrawMaxAndTransfer.t.sol index 83b97d917..5f6fcf64f 100644 --- a/test/integration/shared/lockup/withdrawMaxAndTransfer.t.sol +++ b/test/integration/shared/lockup/withdrawMaxAndTransfer.t.sol @@ -23,7 +23,7 @@ abstract contract WithdrawMaxAndTransfer_Integration_Shared_Test is Lockup_Integ _; } - modifier givenStreamTransferEnabled() { + modifier givenStreamTransferable() { _; } diff --git a/test/invariant/handlers/LockupDynamicCreateHandler.sol b/test/invariant/handlers/LockupDynamicCreateHandler.sol index a33886c54..025cf43fd 100644 --- a/test/invariant/handlers/LockupDynamicCreateHandler.sol +++ b/test/invariant/handlers/LockupDynamicCreateHandler.sol @@ -87,9 +87,6 @@ contract LockupDynamicCreateHandler is BaseHandler { // Create the stream. params.asset = asset; - - // make stream NFT transferrable - params.transferrable = true; uint256 streamId = lockupDynamic.createWithDeltas(params); // Store the stream id. @@ -138,9 +135,6 @@ contract LockupDynamicCreateHandler is BaseHandler { // Create the stream. params.asset = asset; - - // make stream NFT transferrable - params.transferrable = true; uint256 streamId = lockupDynamic.createWithMilestones(params); // Store the stream id. diff --git a/test/invariant/handlers/LockupHandler.sol b/test/invariant/handlers/LockupHandler.sol index cae4045a2..1a93ffc24 100644 --- a/test/invariant/handlers/LockupHandler.sol +++ b/test/invariant/handlers/LockupHandler.sol @@ -288,8 +288,8 @@ abstract contract LockupHandler is BaseHandler { return; } - // skip if NFT transfer is not enabled - if (!lockup.isTransferrable(currentStreamId)) { + // Skip if the stream is not transferable. + if (!lockup.isTransferable(currentStreamId)) { return; } @@ -331,8 +331,8 @@ abstract contract LockupHandler is BaseHandler { return; } - // skip if NFT transfer is not enabled - if (!lockup.isTransferrable(currentStreamId)) { + // Skip if the stream is not transferable. + if (!lockup.isTransferable(currentStreamId)) { return; } diff --git a/test/invariant/handlers/LockupLinearCreateHandler.sol b/test/invariant/handlers/LockupLinearCreateHandler.sol index 5fdb73b47..a6c2c82d8 100644 --- a/test/invariant/handlers/LockupLinearCreateHandler.sol +++ b/test/invariant/handlers/LockupLinearCreateHandler.sol @@ -71,9 +71,6 @@ contract LockupLinearCreateHandler is BaseHandler { // Create the stream. params.asset = asset; - - // make stream NFT transferrable - params.transferrable = true; uint256 streamId = lockupLinear.createWithDurations(params); // Store the stream id. @@ -117,9 +114,6 @@ contract LockupLinearCreateHandler is BaseHandler { // Create the stream. params.asset = asset; - - // make stream NFT transferrable - params.transferrable = true; uint256 streamId = lockupLinear.createWithRange(params); // Store the stream id. diff --git a/test/utils/Assertions.sol b/test/utils/Assertions.sol index 5e221d2a7..0966009f8 100644 --- a/test/utils/Assertions.sol +++ b/test/utils/Assertions.sol @@ -47,7 +47,7 @@ abstract contract Assertions is PRBTest, PRBMathAssertions { assertEq(a.endTime, b.endTime, "endTime"); assertEq(a.isCancelable, b.isCancelable, "isCancelable"); assertEq(a.isDepleted, b.isDepleted, "isDepleted"); - assertEq(a.isTransferrable, b.isTransferrable, "isTransferrable"); + assertEq(a.isTransferable, b.isTransferable, "isTransferable"); assertEq(a.isStream, b.isStream, "isStream"); assertEq(a.sender, b.sender, "sender"); assertEq(a.startTime, b.startTime, "startTime"); @@ -60,7 +60,7 @@ abstract contract Assertions is PRBTest, PRBMathAssertions { assertEq(a.endTime, b.endTime, "endTime"); assertEq(a.isCancelable, b.isCancelable, "isCancelable"); assertEq(a.isDepleted, b.isDepleted, "isDepleted"); - assertEq(a.isTransferrable, b.isTransferrable, "isTransferrable"); + assertEq(a.isTransferable, b.isTransferable, "isTransferable"); assertEq(a.isStream, b.isStream, "isStream"); assertEq(a.segments, b.segments, "segments"); assertEq(a.sender, b.sender, "sender"); diff --git a/test/utils/Defaults.sol b/test/utils/Defaults.sol index 220bca765..3c5d16699 100644 --- a/test/utils/Defaults.sol +++ b/test/utils/Defaults.sol @@ -104,7 +104,7 @@ contract Defaults is Constants { isCancelable: true, isDepleted: false, isStream: true, - isTransferrable: true, + isTransferable: true, segments: segments(), sender: users.sender, startTime: START_TIME, @@ -123,7 +123,7 @@ contract Defaults is Constants { cliffTime: CLIFF_TIME, endTime: END_TIME, isCancelable: true, - isTransferrable: true, + isTransferable: true, isDepleted: false, isStream: true, sender: users.sender, @@ -187,7 +187,7 @@ contract Defaults is Constants { asset: asset, broker: broker(), cancelable: true, - transferrable: true, + transferable: true, recipient: users.recipient, segments: segmentsWithDeltas(), sender: users.sender, @@ -200,7 +200,7 @@ contract Defaults is Constants { asset: asset, broker: broker(), cancelable: true, - transferrable: true, + transferable: true, durations: durations(), recipient: users.recipient, sender: users.sender, @@ -213,7 +213,7 @@ contract Defaults is Constants { asset: asset, broker: broker(), cancelable: true, - transferrable: true, + transferable: true, recipient: users.recipient, segments: segments(), sender: users.sender, @@ -227,7 +227,7 @@ contract Defaults is Constants { asset: asset, broker: broker(), cancelable: true, - transferrable: true, + transferable: true, range: lockupLinearRange(), recipient: users.recipient, sender: users.sender, diff --git a/test/utils/Events.sol b/test/utils/Events.sol index d1934e767..f20981d0f 100644 --- a/test/utils/Events.sol +++ b/test/utils/Events.sol @@ -96,7 +96,7 @@ abstract contract Events { Lockup.CreateAmounts amounts, IERC20 indexed asset, bool cancelable, - bool transferrable, + bool transferable, LockupDynamic.Segment[] segments, LockupDynamic.Range range, address broker @@ -114,7 +114,7 @@ abstract contract Events { Lockup.CreateAmounts amounts, IERC20 indexed asset, bool cancelable, - bool transferrable, + bool transferable, LockupLinear.Range range, address broker ); From 17cbd7da2d86ac1145bf6110399530e4a26672d1 Mon Sep 17 00:00:00 2001 From: Shubham Yadav Date: Tue, 29 Aug 2023 19:46:06 +0100 Subject: [PATCH 06/47] test: add a new branch to burn.tree --- .../concrete/lockup/burn/burn.t.sol | 59 ++++++++++++++++--- .../concrete/lockup/burn/burn.tree | 14 +++-- 2 files changed, 61 insertions(+), 12 deletions(-) diff --git a/test/integration/concrete/lockup/burn/burn.t.sol b/test/integration/concrete/lockup/burn/burn.t.sol index dfd4aa35c..270ee399a 100644 --- a/test/integration/concrete/lockup/burn/burn.t.sol +++ b/test/integration/concrete/lockup/burn/burn.t.sol @@ -9,6 +9,7 @@ import { Integration_Test } from "../../../Integration.t.sol"; abstract contract Burn_Integration_Concrete_Test is Integration_Test, Lockup_Integration_Shared_Test { uint256 internal streamId; + uint256 internal noTransferStreamId; function setUp() public virtual override(Integration_Test, Lockup_Integration_Shared_Test) { streamId = createDefaultStream(); @@ -86,9 +87,9 @@ abstract contract Burn_Integration_Concrete_Test is Integration_Test, Lockup_Int lockup.burn(streamId); } - modifier givenStreamHasBeenDepleted() { + modifier givenStreamHasBeenDepleted(uint256 _streamId) { vm.warp({ timestamp: defaults.END_TIME() }); - lockup.withdrawMax({ streamId: streamId, to: users.recipient }); + lockup.withdrawMax({ streamId: _streamId, to: users.recipient }); _; } @@ -96,7 +97,7 @@ abstract contract Burn_Integration_Concrete_Test is Integration_Test, Lockup_Int external whenNotDelegateCalled givenNotNull - givenStreamHasBeenDepleted + givenStreamHasBeenDepleted(streamId) { changePrank({ msgSender: users.eve }); vm.expectRevert(abi.encodeWithSelector(Errors.SablierV2Lockup_Unauthorized.selector, streamId, users.eve)); @@ -111,7 +112,7 @@ abstract contract Burn_Integration_Concrete_Test is Integration_Test, Lockup_Int external whenNotDelegateCalled givenNotNull - givenStreamHasBeenDepleted + givenStreamHasBeenDepleted(streamId) whenCallerAuthorized { // Burn the NFT so that it no longer exists. @@ -126,11 +127,11 @@ abstract contract Burn_Integration_Concrete_Test is Integration_Test, Lockup_Int _; } - function test_Burn_CallerApprovedOperator() + function test_Burn_CallerApprovedOperator_TransferableNFT() external whenNotDelegateCalled givenNotNull - givenStreamHasBeenDepleted + givenStreamHasBeenDepleted(streamId) whenCallerAuthorized givenNFTExists { @@ -148,11 +149,11 @@ abstract contract Burn_Integration_Concrete_Test is Integration_Test, Lockup_Int lockup.getRecipient(streamId); } - function test_Burn_CallerNFTOwner() + function test_Burn_CallerNFTOwner_TransferableNFT() external whenNotDelegateCalled givenNotNull - givenStreamHasBeenDepleted + givenStreamHasBeenDepleted(streamId) whenCallerAuthorized givenNFTExists { @@ -160,4 +161,46 @@ abstract contract Burn_Integration_Concrete_Test is Integration_Test, Lockup_Int vm.expectRevert("ERC721: invalid token ID"); lockup.getRecipient(streamId); } + + modifier givenNonTransferableNFT() { + noTransferStreamId = createDefaultStreamNotTransferable(); + _; + } + + function test_Burn_CallerApprovedOperator_NonTransferableNFT() + external + givenNonTransferableNFT + whenNotDelegateCalled + givenNotNull + givenStreamHasBeenDepleted(noTransferStreamId) + whenCallerAuthorized + givenNFTExists + { + // Approve the operator to handle the stream. + lockup.approve({ to: users.operator, tokenId: noTransferStreamId }); + + // Make the approved operator the caller in this test. + changePrank({ msgSender: users.operator }); + + // Burn the NFT. + lockup.burn(noTransferStreamId); + + // Assert that the NFT has been burned. + vm.expectRevert("ERC721: invalid token ID"); + lockup.getRecipient(noTransferStreamId); + } + + function test_Burn_CallerNFTOwner_NonTransferableNFT() + external + givenNonTransferableNFT + whenNotDelegateCalled + givenNotNull + givenStreamHasBeenDepleted(noTransferStreamId) + whenCallerAuthorized + givenNFTExists + { + lockup.burn(noTransferStreamId); + vm.expectRevert("ERC721: invalid token ID"); + lockup.getRecipient(noTransferStreamId); + } } diff --git a/test/integration/concrete/lockup/burn/burn.tree b/test/integration/concrete/lockup/burn/burn.tree index cbf412d28..d86da848b 100644 --- a/test/integration/concrete/lockup/burn/burn.tree +++ b/test/integration/concrete/lockup/burn/burn.tree @@ -21,7 +21,13 @@ burn.t.sol ├── given the NFT does not exist │ └── it should revert └── given the NFT exists - ├── when the caller is an approved third party - │ └── it should burn the NFT - └── when the caller is the owner of the NFT - └── it should burn the NFT + ├── given the NFT is transferable + │ ├── when the caller is an approved third party + │ │ └── it should burn the NFT + │ └── when the caller is the owner of the NFT + │ └── it should burn the NFT + └── given the NFT is non-transferable + ├── when the caller is an approved third party + │ └── it should burn the NFT + └── when the caller is the owner of the NFT + └── it should burn the NFT From d0d945b6397d13512f1830071c30304cc4088105 Mon Sep 17 00:00:00 2001 From: Paul Razvan Berg Date: Wed, 30 Aug 2023 21:22:41 +0300 Subject: [PATCH 07/47] test: polish burn tests --- .../concrete/lockup/burn/burn.t.sol | 62 ++++++------------- .../concrete/lockup/burn/burn.tree | 9 +-- 2 files changed, 23 insertions(+), 48 deletions(-) diff --git a/test/integration/concrete/lockup/burn/burn.t.sol b/test/integration/concrete/lockup/burn/burn.t.sol index 270ee399a..0072187f3 100644 --- a/test/integration/concrete/lockup/burn/burn.t.sol +++ b/test/integration/concrete/lockup/burn/burn.t.sol @@ -9,10 +9,11 @@ import { Integration_Test } from "../../../Integration.t.sol"; abstract contract Burn_Integration_Concrete_Test is Integration_Test, Lockup_Integration_Shared_Test { uint256 internal streamId; - uint256 internal noTransferStreamId; + uint256 internal notTransferableStreamId; function setUp() public virtual override(Integration_Test, Lockup_Integration_Shared_Test) { streamId = createDefaultStream(); + notTransferableStreamId = createDefaultStreamNotTransferable(); // Make the Recipient (owner of the NFT) the caller in this test suite. changePrank({ msgSender: users.recipient }); @@ -87,9 +88,9 @@ abstract contract Burn_Integration_Concrete_Test is Integration_Test, Lockup_Int lockup.burn(streamId); } - modifier givenStreamHasBeenDepleted(uint256 _streamId) { + modifier givenStreamHasBeenDepleted(uint256 streamId_) { vm.warp({ timestamp: defaults.END_TIME() }); - lockup.withdrawMax({ streamId: _streamId, to: users.recipient }); + lockup.withdrawMax({ streamId: streamId_, to: users.recipient }); _; } @@ -127,80 +128,57 @@ abstract contract Burn_Integration_Concrete_Test is Integration_Test, Lockup_Int _; } - function test_Burn_CallerApprovedOperator_TransferableNFT() + function test_Burn_NonTransferableNFT() external whenNotDelegateCalled givenNotNull - givenStreamHasBeenDepleted(streamId) + givenStreamHasBeenDepleted(notTransferableStreamId) whenCallerAuthorized givenNFTExists { - // Approve the operator to handle the stream. - lockup.approve({ to: users.operator, tokenId: streamId }); - - // Make the approved operator the caller in this test. - changePrank({ msgSender: users.operator }); - - // Burn the NFT. - lockup.burn(streamId); - - // Assert that the NFT has been burned. + lockup.burn(notTransferableStreamId); vm.expectRevert("ERC721: invalid token ID"); - lockup.getRecipient(streamId); + lockup.getRecipient(notTransferableStreamId); } - function test_Burn_CallerNFTOwner_TransferableNFT() - external - whenNotDelegateCalled - givenNotNull - givenStreamHasBeenDepleted(streamId) - whenCallerAuthorized - givenNFTExists - { - lockup.burn(streamId); - vm.expectRevert("ERC721: invalid token ID"); - lockup.getRecipient(streamId); - } - - modifier givenNonTransferableNFT() { - noTransferStreamId = createDefaultStreamNotTransferable(); + modifier givenTransferableStream() { _; } - function test_Burn_CallerApprovedOperator_NonTransferableNFT() + function test_Burn_CallerApprovedOperator() external - givenNonTransferableNFT whenNotDelegateCalled givenNotNull - givenStreamHasBeenDepleted(noTransferStreamId) + givenStreamHasBeenDepleted(streamId) whenCallerAuthorized givenNFTExists + givenTransferableStream { // Approve the operator to handle the stream. - lockup.approve({ to: users.operator, tokenId: noTransferStreamId }); + lockup.approve({ to: users.operator, tokenId: streamId }); // Make the approved operator the caller in this test. changePrank({ msgSender: users.operator }); // Burn the NFT. - lockup.burn(noTransferStreamId); + lockup.burn(streamId); // Assert that the NFT has been burned. vm.expectRevert("ERC721: invalid token ID"); - lockup.getRecipient(noTransferStreamId); + lockup.getRecipient(streamId); } - function test_Burn_CallerNFTOwner_NonTransferableNFT() + function test_Burn_CallerNFTOwner() external - givenNonTransferableNFT whenNotDelegateCalled givenNotNull - givenStreamHasBeenDepleted(noTransferStreamId) + givenStreamHasBeenDepleted(streamId) whenCallerAuthorized givenNFTExists + givenTransferableStream { - lockup.burn(noTransferStreamId); + lockup.burn(streamId); vm.expectRevert("ERC721: invalid token ID"); - lockup.getRecipient(noTransferStreamId); + lockup.getRecipient(streamId); } } diff --git a/test/integration/concrete/lockup/burn/burn.tree b/test/integration/concrete/lockup/burn/burn.tree index d86da848b..5b24d2e93 100644 --- a/test/integration/concrete/lockup/burn/burn.tree +++ b/test/integration/concrete/lockup/burn/burn.tree @@ -21,12 +21,9 @@ burn.t.sol ├── given the NFT does not exist │ └── it should revert └── given the NFT exists - ├── given the NFT is transferable - │ ├── when the caller is an approved third party - │ │ └── it should burn the NFT - │ └── when the caller is the owner of the NFT - │ └── it should burn the NFT - └── given the NFT is non-transferable + ├── given the NFT is not transferable + │ └── it should burn the NFT + └── given the NFT is transferable ├── when the caller is an approved third party │ └── it should burn the NFT └── when the caller is the owner of the NFT From 67734b2be9de44bac3ba5118037d7703951b1cb8 Mon Sep 17 00:00:00 2001 From: Paul Razvan Berg Date: Wed, 30 Aug 2023 21:41:06 +0300 Subject: [PATCH 08/47] test: update precompiles --- test/utils/Precompiles.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/utils/Precompiles.sol b/test/utils/Precompiles.sol index 3c423b253..f9d977d89 100644 --- a/test/utils/Precompiles.sol +++ b/test/utils/Precompiles.sol @@ -27,9 +27,9 @@ contract Precompiles { bytes public constant BYTECODE_COMPTROLLER = hex"60803461009857601f6104a638819003918201601f19168301916001600160401b0383118484101761009d5780849260209460405283398101031261009857516001600160a01b0381169081900361009857600080546001600160a01b0319168217815560405191907fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a36103f290816100b48239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe608060408181526004918236101561001657600080fd5b600092833560e01c9182634d81e51d1461039d5750816375829def146102e5578163907a267b14610253578163b5b3ca2c146101ab578163cb01e30e146100f957508063dcf844a7146100c3578063e07df5b4146100a55763f851a4401461007d57600080fd5b346100a157816003193601126100a1576001600160a01b0360209254169051908152f35b5080fd5b50346100a157816003193601126100a1576020906001549051908152f35b50346100a15760203660031901126100a157806020926001600160a01b036100e96103d7565b1681526003845220549051908152f35b9050346101a75760203660031901126101a7576101146103d7565b6001600160a01b03918285541633810361017a575050169081835260026020528083209081549160ff8316159260ff84169060ff1916179055519081527f8cd3a7bc46b26a3b0c07a05a47af78abcaa647626f631d92ea64f8867b23bbec60203392a380f35b84516331b339a960e21b81526001600160a01b039091169181019182523360208301529081906040010390fd5b8280fd5b9050346101a757816003193601126101a7576101c56103d7565b90602435916001600160a01b039182865416338103610226575050907f371789a3d97098f3070492613273a065a7e8a19e009fd1ae92a4b4d4c71ed62d9116928385526003602052808520928084549455815193845260208401523392a380f35b85516331b339a960e21b81526001600160a01b039091169181019182523360208301529081906040010390fd5b919050346101a75760203660031901126101a7578135916001600160a01b038454163381036102b85750507fc059ba3e07a1c4d1fa8845bdb2af2dd85e844684e0a59e6073499e4338788465906001549280600155815193845260208401523392a280f35b82516331b339a960e21b81526001600160a01b039091169181019182523360208301529081906040010390fd5b919050346101a75760203660031901126101a7578135916001600160a01b03918284168094036103995784549283169033820361036d575050507fffffffffffffffffffffffff00000000000000000000000000000000000000001681178255337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808380a380f35b516331b339a960e21b81526001600160a01b039091169181019182523360208301529081906040010390fd5b8480fd5b849084346101a75760203660031901126101a75760ff906020936001600160a01b036103c76103d7565b1681526002855220541615158152f35b600435906001600160a01b03821682036103ed57565b600080fd"; bytes public constant BYTECODE_LOCKUP_DYNAMIC = - hex"60c0346200046e57601f62005ccb38819003918201601f19168301916001600160401b038311848410176200032b578084926080946040528339810103126200046e5780516001600160a01b038082169290918390036200046e5760208101518281168091036200046e5760408201519183831683036200046e5760600151936200008962000473565b90601d82527f5361626c696572205632204c6f636b75702044796e616d6963204e46540000006020830152620000be62000473565b601181527029a0a116ab1916a627a1a5aaa816a22ca760791b602082015230608052600080546001600160a01b03199081168417825560018054909116909517909455927fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a38051906001600160401b0382116200032b5760035490600182811c9216801562000463575b60208310146200044d5781601f849311620003d8575b50602090601f83116001146200034d5760009262000341575b50508160011b916000199060031b1c1916176003555b80516001600160401b0381116200032b576004918254600181811c9116801562000320575b60208210146200030b579081601f849311620002b3575b50602090601f831160011462000248576000926200023c575b50508160011b916000199060031b1c19161790555b1660018060a01b0319600a541617600a5560a0526001600955604051615837908162000494823960805181615243015260a05181818161122701526148170152f35b015190503880620001e5565b6000858152602081209350601f198516905b8181106200029a575090846001959493921062000280575b505050811b019055620001fa565b015160001960f88460031b161c1916905538808062000272565b929360206001819287860151815501950193016200025a565b909150836000526020600020601f840160051c8101916020851062000300575b90601f859493920160051c01905b818110620002f05750620001cc565b60008155849350600101620002e1565b9091508190620002d3565b602284634e487b7160e01b6000525260246000fd5b90607f1690620001b5565b634e487b7160e01b600052604160045260246000fd5b0151905038806200017a565b600360009081527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b9350601f198516905b818110620003bf5750908460019594939210620003a5575b505050811b0160035562000190565b015160001960f88460031b161c1916905538808062000396565b929360206001819287860151815501950193016200037e565b60036000529091507fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f840160051c8101916020851062000442575b90601f859493920160051c01905b81811062000432575062000161565b6000815584935060010162000423565b909150819062000415565b634e487b7160e01b600052602260045260246000fd5b91607f16916200014b565b600080fd5b60408051919082016001600160401b038111838210176200032b5760405256fe608080604052600436101561001357600080fd5b60003560e01c90816301ffc9a7146129da5750806306fdde0314612917578063081812fc146128f9578063095ea7b3146127655780631400ecec146126c05780631c1cdd4c1461265a5780631e99d5691461263c57806321714be11461253f57806323b872dd1461251657806339a73c03146124d357806340e58ee514612132578063425d30dd1461211457806342842e0e146120c457806342966c6814611fd45780634857501f14611f5e5780634869e12d14611f225780635fe3b56714611efb5780636352211e14611ecc5780636d0cee7514611e7457806370a0823114611dca57806375829def14611d385780637cad6cd114611c665780637de6b1db14611a3d5780638659c270146115e5578063894e9a0d1461139c5780638bad38dd146113205780638f69b9931461129d5780639067b6771461124a5780639188ec841461120f57806395d89b4114611101578063a22cb46514611030578063a2ffb89714610f37578063a6202bf214610e2e578063a80fc07114610dd9578063ad35efd414610d76578063b637b86514610d16578063b88d4fde14610c8b578063b8a3be6614610c54578063b971302a14610c02578063bc063e1a14610bdf578063bc2be1be14610b8c578063bf061d0a1461091f578063c156a11d14610842578063c87b56dd1461070f578063cc364f4814610674578063d4dbd20b1461061f578063d511609f146105d0578063d975dfed14610583578063e985e9c51461052c578063ea5ead19146104e4578063eac8f5b814610478578063f590c17614610450578063f851a440146104295763fdd46d601461027157600080fd5b346104245760603660031901126104245760043561028d612b07565b604435906001600160801b038216808303610424576102aa615239565b6102b384613351565b61040c576102d784600052600b6020526001600160a01b0360406000205416331490565b15806103fc575b6103d95761030284600052600b6020526001600160a01b0360406000205416331490565b806103b5575b610388576001600160a01b0382161561035e5715610346579161033d6020926000805160206158178339815191529483615454565b604051908152a1005b6024836040519063d2aabcd960e01b82526004820152fd5b60046040517fc61a0e9e000000000000000000000000000000000000000000000000000000008152fd5b6064846001600160a01b038460405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b508360005260056020526001600160a01b0380604060002054169083161415610308565b60405163216caf0d60e01b815260048101859052336024820152604490fd5b0390fd5b506104068461566e565b156102de565b60248460405190634a5541ef60e01b82526004820152fd5b600080fd5b346104245760003660031901126104245760206001600160a01b0360005416604051908152f35b3461042457602036600319011261042457602061046e6004356133a1565b6040519015158152f35b346104245760203660031901126104245760043580600052600b60205260ff60016040600020015460a81c16156104cd57600052600b60205260206001600160a01b0360016040600020015416604051908152f35b6024906040519062b8e7e760e51b82526004820152fd5b3461042457604036600319011261042457600080516020615817833981519152602060043561033d610514612b07565b61051d836152fb565b90610526615239565b83615333565b3461042457604036600319011261042457610545612af1565b61054d612b07565b906001600160a01b03809116600052600860205260406000209116600052602052602060ff604060002054166040519015158152f35b346104245760203660031901126104245760043580600052600b60205260ff60016040600020015460a81c16156104cd576105bf6020916152fb565b6001600160801b0360405191168152f35b346104245760203660031901126104245760043580600052600b60205260ff60016040600020015460a81c16156104cd57600052600b602052602060026040600020015460801c604051908152f35b346104245760203660031901126104245760043580600052600b60205260ff60016040600020015460a81c16156104cd57600052600b60205260206001600160801b0360036040600020015416604051908152f35b34610424576020366003190112610424576004356000602060405161069881612c34565b828152015280600052600b60205260ff60016040600020015460a81c16156104cd57600052600b602052604080600020548151906106d582612c34565b64ffffffffff90818160a01c16835260c81c16602082015261070d825180926020908164ffffffffff91828151168552015116910152565bf35b3461042457602080600319360112610424576004359061074d6107488360005260056020526001600160a01b0360406000205416151590565b612cd3565b60006001600160a01b03600a5416926044604051809581937fe9dc637500000000000000000000000000000000000000000000000000000000835230600484015260248301525afa918215610836576000926107bd575b506107b9604051928284938452830190612acc565b0390f35b9091503d806000833e6107d08183612c81565b81019082818303126104245780519067ffffffffffffffff8211610424570181601f8201121561042457805161080581612ca3565b926108136040519485612c81565b8184528482840101116104245761082f91848085019101612aa9565b90826107a4565b6040513d6000823e3d90fd5b346104245760403660031901126104245760043561085e612b07565b610866615239565b81600052600b60205260ff60016040600020015460a81c1615610908578160005260056020526001600160a01b03604060002054168033036108e9579161033d81602093600080516020615817833981519152956108c3836152fb565b6001600160801b0381166108d8575b50612f66565b6108e3908285615454565b876108d2565b60405163216caf0d60e01b815260048101849052336024820152604490fd5b6024826040519062b8e7e760e51b82526004820152fd5b3461042457602060031981813601126104245760043567ffffffffffffffff9182821161042457610100823603918201126104245761095c615239565b60e48201359060221901811215610424578101600481013590838211610424576024016060820236038113610424576109969136916133e4565b908151906109a382613258565b916109b16040519384612c81565b808352601f196109c082613258565b018660005b828110610b765750505064ffffffffff90814216956001600160801b0395866109ed82613545565b515116828a6109fb84613545565b5101511685806040610a0c86613545565b510151168b01169060405192610a2184612c18565b83528b8301526040820152610a3587613545565b52610a3f86613545565b5060019386855b898c878310610af5578c82856001600160a01b038d6084810135828116908190036104245760248201359485151580960361042457610aed96610ade94610a8f60448601613483565b610a9b86600401613483565b98610aa860648801613497565b93836040519b610ab78d612bfb565b168b528c8b015260408a015216606088015216608086015260a085015260a43691016134ab565b60c083015260e0820152614769565b604051908152f35b889385806040610b298b86610b198a8e9a610b10828d613568565b5151169a613568565b5101511694600019890190613568565b51015116816040610b3a888c613568565b5101511601169160405193610b4e85612c18565b84528301526040820152610b62828b613568565b52610b6d818a613568565b50018790610a46565b610b7e6132fe565b8282880101520187906109c5565b346104245760203660031901126104245760043580600052600b60205260ff60016040600020015460a81c16156104cd57600052600b602052602064ffffffffff60406000205460a01c16604051908152f35b3461042457600036600319011261042457602060405167016345785d8a00008152f35b346104245760203660031901126104245760043580600052600b60205260ff60016040600020015460a81c16156104cd57600052600b60205260206001600160a01b0360406000205416604051908152f35b3461042457602036600319011261042457600435600052600b602052602060ff60016040600020015460a81c166040519015158152f35b3461042457608036600319011261042457610ca4612af1565b610cac612b07565b6064359167ffffffffffffffff8311610424573660238401121561042457826004013591610cd983612ca3565b92610ce76040519485612c81565b8084523660248287010111610424576020816000926024610d149801838801378501015260443591612df1565b005b346104245760203660031901126104245760043580600052600b60205260ff60016040600020015460a81c16156104cd57600052600b6020526107b9610d626004604060002001613270565b604051918291602083526020830190612b97565b346104245760203660031901126104245760043580600052600b60205260ff60016040600020015460a81c16156104cd57610db09061466d565b6040516005821015610dc3576020918152f35b634e487b7160e01b600052602160045260246000fd5b346104245760203660031901126104245760043580600052600b60205260ff60016040600020015460a81c16156104cd57600052600b60205260206001600160801b0360026040600020015416604051908152f35b3461042457602036600319011261042457610e47612af1565b6001600160a01b038060005416338103610f0e57508116908160005260026020526001600160801b0360406000205416908115610edd5781610eaf9184600052600260205260406000206fffffffffffffffffffffffffffffffff1981541690553390615295565b6040519081527fca7a4a65a94ed2f37538814e00e1cd4c41a78261561e3f3794592f11409cf5af60203392a3005b602483604051907f8410168c0000000000000000000000000000000000000000000000000000000082526004820152fd5b6040516331b339a960e21b81526001600160a01b03919091166004820152336024820152604490fd5b346104245760603660031901126104245767ffffffffffffffff60043581811161042457610f69903690600401612b66565b610f71612b07565b9260443590811161042457610f8a903690600401612b66565b9190610f94615239565b828203610ff95760005b828110610fa757005b806000805160206158178339815191526020610fc6600194878a615323565b35610fec610fdd610fd8868b8a615323565b613497565b610fe5615239565b8b83615333565b604051908152a101610f9e565b50604491604051917faec9344000000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b3461042457604036600319011261042457611049612af1565b60243590811515809203610424576001600160a01b0316908133146110bd57336000526008602052604060002082600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a3005b606460405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152fd5b3461042457600036600319011261042457604051600060045490600182811c91818416918215611205575b60209485851084146111ef5785879486865291826000146111cf575050600114611172575b5061115e92500383612c81565b6107b9604051928284938452830190612acc565b84915060046000527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b906000915b8583106111b757505061115e935082010185611151565b805483890185015287945086939092019181016111a0565b60ff19168582015261115e95151560051b85010192508791506111519050565b634e487b7160e01b600052602260045260246000fd5b92607f169261112c565b346104245760003660031901126104245760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346104245760203660031901126104245760043580600052600b60205260ff60016040600020015460a81c16156104cd57600052600b602052602064ffffffffff60406000205460c81c16604051908152f35b346104245760203660031901126104245760043580600052600b60205260ff60016040600020015460a81c16156104cd576112d79061466d565b600581101580610dc35760028214908115611313575b8115611301575b6020826040519015158152f35b9050610dc357600460209114826112f4565b50506003811460006112ed565b34610424576020366003190112610424576004356001600160a01b0390818116809103610424578160005416338103610f0e575060015491816001600160a01b03198416176001556040519216825260208201527fdcb09aef4bf01068924ccce937981cbe59d25ba08380cf941aaaea4e4bd3960d60403392a2005b346104245760203660031901126104245760606101206040516113be81612c50565b60008152600060208201526000604082015260008382015260006080820152600060a0820152600060c0820152600060e08201526113fa6132fe565b6101008201520152600435600052600b60205260ff60016040600020015460a81c16156115cd57600435600052600b60205260406000206114cf60046040519261144384612c50565b80546001600160a01b038116855264ffffffffff8160a01c16602086015264ffffffffff8160c81c16604086015260ff8160f01c161515606086015260f81c1515608085015260ff60018201546001600160a01b03811660a0870152818160a01c16151560c087015260a81c16151560e08501526114c36002820161331d565b61010085015201613270565b6101208201526114e060043561466d565b906005821015610dc357600261012092146115c1575b6107b9604051928392602084526001600160a01b03815116602085015264ffffffffff602082015116604085015264ffffffffff60408201511660608501526060810151151560808501526080810151151560a08501526001600160a01b0360a08201511660c085015260c0810151151560e085015260e081015115156101008501526115ad61010082015183860190604090816001600160801b0391828151168552826020820151166020860152015116910152565b0151610180808401526101a0830190612b97565b600060608201526114f6565b602460405162b8e7e760e51b81526004356004820152fd5b34610424576020806003193601126104245760043567ffffffffffffffff811161042457611617903690600401612b66565b90611620615239565b6000915b80831061162d57005b611638838284615323565b3592611642615239565b61164b84613351565b156116685760248460405190634a5541ef60e01b82526004820152fd5b611674849293946133a1565b611a255761169882600052600b6020526001600160a01b0360406000205416331490565b1580611a05575b6119e6576116ac826134da565b82600052600b928387526116c6600260406000200161331d565b936001600160801b03928386511684821610156119ce578260005281895260ff60406000205460f01c16156119b6579061171582858b61170b819796838c5116613388565b9901511690613388565b93826000528184526040600020966003885498600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8b161781558388161561199c575b0191811691826fffffffffffffffffffffffffffffffff198254161790556117a86001600160a01b03809916926005875289604060002054169487528360019a8b6040600020015416615295565b3382036118b957823b611815575b7f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd26000805160206158178339815191529685925b604080516001600160801b03928316815292909116602083015290a4604051908152a1019190611624565b9350813b15610424576040516372eba20360e01b8152600481018490526001600160a01b03821660248201526001600160801b03858116604483015286166064820152600080516020615817833981519152958b9585927f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd2929190600081608481838b5af16118aa575b5092509650506117b6565b6118b390612c6d565b8e61189f565b813b6118f8575b7f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd26000805160206158178339815191529685926117ea565b9350803b15610424576040516372eba20360e01b8152600481018490526001600160a01b03831660248201526001600160801b03858116604483015286166064820152600080516020615817833981519152958b9585927f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd2929190600081608481838a5af161198d575b5092509650506118c0565b61199690612c6d565b8e611982565b60018101600160a01b60ff60a01b1982541617905561175a565b602483604051906339c6dc7360e21b82526004820152fd5b602483604051906322cad1af60e11b82526004820152fd5b60405163216caf0d60e01b815260048101839052336024820152604490fd5b5081600052600585526001600160a01b036040600020541633141561169f565b6024826040519063fe19f19f60e01b82526004820152fd5b346104245760208060031936011261042457600435611a5a615239565b80600052600b825260ff60016040600020015460a81c16156104cd57611a7f8161466d565b916000926005811015610dc35760048103611aac5760248360405190634a5541ef60e01b82526004820152fd5b60038103611acc576024836040519063fe19f19f60e01b82526004820152fd5b916002849314611c4e57611af681600052600b6020526001600160a01b0360406000205416331490565b15611c2e5780600052600b825260ff60406000205460f01c1615611c165780600052600b8252604060002060ff60f01b198154169055600582526001600160a01b0360406000205416803b611b84575b50807f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f8460008051602061581783398151915295a2604051908152a1005b803b15610424576000805160206158178339815191529360008084936024604051809481937f341a0bd90000000000000000000000000000000000000000000000000000000083528860048401525af1611be1575b509350611b46565b9050611bed9150612c6d565b8060007f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f611bd9565b602490604051906339c6dc7360e21b82526004820152fd5b60405163216caf0d60e01b81526004810191909152336024820152604490fd5b602490604051906322cad1af60e11b82526004820152fd5b34610424576020366003190112610424576004356001600160a01b0390818116809103610424578160005416338103610f0e5750600a5491816001600160a01b0319841617600a556040519216825260208201527fa2548bd4b805e907c1558a47b5858324fe8bb4a2e1ddfca647eecbf65610eebc60403392a26009546000198101908111611d225760407f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c91815190600182526020820152a1005b634e487b7160e01b600052601160045260246000fd5b3461042457602036600319011261042457611d51612af1565b6000546001600160a01b0380821692338403611da3576001600160a01b03199350169182911617600055337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf80600080a3005b6040516331b339a960e21b81526001600160a01b0385166004820152336024820152604490fd5b34610424576020366003190112610424576001600160a01b03611deb612af1565b168015611e0a5760005260066020526020604060002054604051908152f35b608460405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e657200000000000000000000000000000000000000000000006064820152fd5b3461042457602036600319011261042457600435611eab6107488260005260056020526001600160a01b0360406000205416151590565b600052600560205260206001600160a01b0360406000205416604051908152f35b34610424576020366003190112610424576020611eea600435612d1e565b6001600160a01b0360405191168152f35b346104245760003660031901126104245760206001600160a01b0360015416604051908152f35b346104245760203660031901126104245760043580600052600b60205260ff60016040600020015460a81c16156104cd576105bf6020916146ee565b346104245760203660031901126104245760043580600052600b60205260ff60016040600020015460a81c16156104cd576000611f9a8261466d565b6005811015610dc357600203611fb8575b6020906040519015158152f35b50600052600b602052602060ff60406000205460f01c16611fab565b3461042457602036600319011261042457600435611ff0615239565b611ff981613351565b15612093576120078161566e565b15611c2e5761201581612d1e565b50600061202182612d1e565b82825260076020526001600160a01b0360408320916001600160a01b0319928381541690551690818352600660205260408320831981540190558383526005602052604083209081541690557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a4005b602490604051907f817cd6390000000000000000000000000000000000000000000000000000000082526004820152fd5b34610424576120d236612b31565b60405191602083019383851067ffffffffffffffff8611176120fe57610d149460405260008452612df1565b634e487b7160e01b600052604160045260246000fd5b3461042457602036600319011261042457602061046e600435613351565b34610424576020806003193601126104245760043590612150615239565b61215982613351565b156121765760248260405190634a5541ef60e01b82526004820152fd5b61217f826133a1565b611a25576121a382600052600b6020526001600160a01b0360406000205416331490565b15806124b3575b6119e6576121b7826134da565b9180600052600b82526121d0600260406000200161331d565b926001600160801b03908185511682821610156119ce5782600052600b845260ff60406000205460f01c16156119b65780828561221361221d94838a5116613388565b9701511690613388565b9082600052600b84526040600020916003835493600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861617815583831615612499575b0191861691826fffffffffffffffffffffffffffffffff198254161790556122b16001600160a01b03809416926005875283856040600020541695600b895260016040600020015416615295565b3382036123b957823b612318575b7f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd28491600080516020615817833981519152975b604080516001600160801b03928316815292909116602083015290a4604051908152a1005b823b15610424576040516372eba20360e01b8152600481018590526001600160a01b03831660248201526001600160801b038781166044830152821660648201526000805160206158178339815191529685927f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd292909190600081608481838b5af16123aa575b5097509150506122bf565b6123b390612c6d565b8961239f565b813b6123f8575b7f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd28491600080516020615817833981519152976122f3565b813b15610424576040516372eba20360e01b8152600481018590526001600160a01b03841660248201526001600160801b038781166044830152821660648201526000805160206158178339815191529685927f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd292909190600081608481838a5af161248a575b5097509150506123c0565b61249390612c6d565b8961247f565b60018101600160a01b60ff60a01b19825416179055612263565b5081600052600581526001600160a01b03604060002054163314156121aa565b34610424576020366003190112610424576001600160a01b036124f4612af1565b16600052600260205260206001600160801b0360406000205416604051908152f35b3461042457610d1461252736612b31565b9161253a6125358433612e87565b612d80565b612f66565b3461042457600319602036820112610424576004359067ffffffffffffffff90818311610424576101209083360301126104245761257b615239565b6040519161258883612bfb565b61259481600401612b1d565b83526125a2602482016133d2565b6020840152604481013580151581036104245760408401526125c660648201612b1d565b60608401526125d760848201612cbf565b60808401526125e860a48201612b1d565b60a08401526125fa3660c483016134ab565b60c084015261010481013591821161042457013660238201121561042457602091612632610aed9236906024600482013591016133e4565b60e0820152614769565b34610424576000366003190112610424576020600954604051908152f35b346104245760203660031901126104245760043580600052600b60205260ff60016040600020015460a81c16156104cd576126949061466d565b6005811015610dc35780602091159081156126b5575b506040519015158152f35b6001915014826126aa565b346104245760203660031901126104245760043580600052600b60205260ff60016040600020015460a81c16156104cd5760209060009080600052600b8352604060002060ff815460f01c1680612753575b61272a575b50506001600160801b0360405191168152f35b61274c92506001600160801b03600261274692015416916134da565b90613388565b8280612717565b5060ff600182015460a01c1615612712565b346104245760403660031901126104245761277e612af1565b602435906001600160a01b03808061279585612d1e565b1692169180831461288f5780331490811561286a575b5015612800578260005260076020526040600020826001600160a01b03198254161790556127d883612d1e565b167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b608460405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152fd5b9050600052600860205260406000203360005260205260ff60406000205416846127ab565b608460405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152fd5b34610424576020366003190112610424576020611eea600435612d43565b3461042457600036600319011261042457604051600060035490600182811c918184169182156129d0575b60209485851084146111ef5785879486865291826000146111cf575050600114612973575061115e92500383612c81565b84915060036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b906000915b8583106129b857505061115e935082010185611151565b805483890185015287945086939092019181016129a1565b92607f1692612942565b3461042457602036600319011261042457600435907fffffffff00000000000000000000000000000000000000000000000000000000821680920361042457817f80ac58cd0000000000000000000000000000000000000000000000000000000060209314908115612a7f575b8115612a55575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501483612a4e565b7f5b5e139f0000000000000000000000000000000000000000000000000000000081149150612a47565b60005b838110612abc5750506000910152565b8181015183820152602001612aac565b90602091612ae581518092818552858086019101612aa9565b601f01601f1916010190565b600435906001600160a01b038216820361042457565b602435906001600160a01b038216820361042457565b35906001600160a01b038216820361042457565b6060906003190112610424576001600160a01b0390600435828116810361042457916024359081168103610424579060443590565b9181601f840112156104245782359167ffffffffffffffff8311610424576020808501948460051b01011161042457565b90815180825260208080930193019160005b828110612bb7575050505090565b835180516001600160801b031686528083015167ffffffffffffffff168684015260409081015164ffffffffff169086015260609094019392810192600101612ba9565b610100810190811067ffffffffffffffff8211176120fe57604052565b6060810190811067ffffffffffffffff8211176120fe57604052565b6040810190811067ffffffffffffffff8211176120fe57604052565b610140810190811067ffffffffffffffff8211176120fe57604052565b67ffffffffffffffff81116120fe57604052565b90601f8019910116810190811067ffffffffffffffff8211176120fe57604052565b67ffffffffffffffff81116120fe57601f01601f191660200190565b35906001600160801b038216820361042457565b15612cda57565b606460405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152fd5b60005260056020526001600160a01b0360406000205416612d40811515612cd3565b90565b612d666107488260005260056020526001600160a01b0360406000205416151590565b60005260076020526001600160a01b036040600020541690565b15612d8757565b608460405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f766564000000000000000000000000000000000000006064820152fd5b90612e15939291612e056125358433612e87565b612e10838383612f66565b6130bd565b15612e1c57565b60405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b906001600160a01b038080612e9b84612d1e565b16931691838314938415612ece575b508315612eb8575b50505090565b612ec491929350612d43565b1614388080612eb2565b909350600052600860205260406000208260005260205260ff604060002054169238612eaa565b15612efc57565b608460405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152fd5b90612f8e91612f7484612d1e565b916001600160a01b03938493848094169485911614612ef5565b169182156130245781612fab91612fa486612d1e565b1614612ef5565b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60008481526007602052604081206001600160a01b03199081815416905583825260066020526040822060001981540190558482526040822060018154019055858252600560205284604083209182541617905580a4565b608460405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152fd5b3d156130b8573d9061309e82612ca3565b916130ac6040519384612c81565b82523d6000602084013e565b606090565b91926000929190813b1561324e5760209161312d91856040519586809581947f150b7a02000000000000000000000000000000000000000000000000000000009b8c84523360048501526001600160a01b0380951660248501526044840152608060648401526084830190612acc565b0393165af1908290826131e7575b50506131c15761314961308d565b805190816131bc5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000161490565b909192506020813d8211613246575b8161320360209383612c81565b810103126132425751907fffffffff000000000000000000000000000000000000000000000000000000008216820361323f575090388061313b565b80fd5b5080fd5b3d91506131f6565b5050505050600190565b67ffffffffffffffff81116120fe5760051b60200190565b90815461327c81613258565b9260409361328c85519182612c81565b828152809460208092019260005281600020906000935b8585106132b257505050505050565b600184819284516132c281612c18565b64ffffffffff87546001600160801b038116835267ffffffffffffffff8160801c168584015260c01c16868201528152019301940193916132a3565b6040519061330b82612c18565b60006040838281528260208201520152565b9060405161332a81612c18565b6040819360018154916001600160801b0392838116865260801c6020860152015416910152565b80600052600b60205260ff60016040600020015460a81c16156104cd57600052600b60205260ff60016040600020015460a01c1690565b6001600160801b039182169082160391908211611d2257565b80600052600b60205260ff60016040600020015460a81c16156104cd57600052600b60205260406000205460f81c90565b359064ffffffffff8216820361042457565b9291926133f082613258565b6040946133ff86519283612c81565b8195848352602080930191606080960285019481861161042457925b85841061342b5750505050505050565b86848303126104245782519061344082612c18565b61344985612cbf565b8252858501359067ffffffffffffffff8216820361042457828792838b9501526134748688016133d2565b8682015281520193019261341b565b356001600160a01b03811681036104245790565b356001600160801b03811681036104245790565b9190826040910312610424576040516134c381612c34565b60208082946134d181612b1d565b84520135910152565b64ffffffffff80421682600052600b602052604060002091825482828260a01c16101561353b5760c81c16111561352957600401546001101561352057612d409061357c565b612d409061459e565b6001600160801b039150600201541690565b5050505050600090565b8051156135525760200190565b634e487b7160e01b600052603260045260246000fd5b80518210156135525760209160051b010190565b64ffffffffff90814216906000908152600b6020526040908181208251936135a385612c50565b8154956001600160a01b039182881687526020870197828160a01c168952828160c81c168789015260ff8160f01c161515606089015260f81c1515608088015260ff6001938486015490811660a08a0152818160a01c16151560c08a015260a81c16151560e088015261012061362f60046136206002880161331d565b966101008b0197885201613270565b9701918783528087613641889a613545565b5101511693828288965b16106137255750916136d56136da928488816136df98976001600160801b039e8f6136778b8a51613568565b5151169d8a8f9b602061369467ffffffffffffffff928d51613568565b510151169984836136a6848451613568565b5101511696508115613719576136c492935051906000190190613568565b5101511680925b0316920316613799565b613b08565b61396b565b9283136136f85750506136f2839161375d565b16011690565b5160200151929392831692841683101591506137149050575090565b905090565b505050511680926136cb565b8094986001600160801b03908161373d8c8851613568565b51511601169801938282808a613754898951613568565b5101511661364b565b600081126137685790565b602490604051907f2463f3d50000000000000000000000000000000000000000000000000000000082526004820152fd5b90600160ff1b808314908115613881575b5061385757600082121561384e576137d3826000035b600083121561384757826000039061388b565b917f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311613811576000916000199118131561380d575090565b0390565b604491604051917fd49c26b300000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b829061388b565b6137d3826137c0565b60046040517f9fe2b450000000000000000000000000000000000000000000000000000000008152fd5b90508114386137aa565b670de0b6b3a7640000916000198383099280830292838086109503948086039514613947578285101561390b57908291096001821901821680920460028082600302188083028203028083028203028083028203028083028203028083028203028092029003029360018380600003040190848311900302920304170290565b82606492604051927f63a05778000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b505080925015613955570490565b634e487b7160e01b600052601260045260246000fd5b90600160ff1b808314908115613a4f575b50613a25576000821215613a1c576139a5826000035b6000831215613a15578260000390613a59565b917f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83116139df576000916000199118131561380d575090565b604491604051917f120b5b4300000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b8290613a59565b6139a582613992565b60046040517fa6070c25000000000000000000000000000000000000000000000000000000008152fd5b905081143861397c565b90919060001983820983820291828083109203918083039214613af757670de0b6b3a76400009081831015613ac057947faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066994950990828211900360ee1b910360121c170290565b60449086604051917f5173648d00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050670de0b6b3a764000090049150565b80613b225750600090612d405750670de0b6b3a764000090565b90670de0b6b3a7640000808314613b6f575080613b47575050670de0b6b3a764000090565b670de0b6b3a76400008114613b6b57613b66906136da612d4093614449565b613b8f565b5090565b91505090565b8015613955576ec097ce7bc90715b34b9f10000000000590565b6000811215613bc45768033dd1780914b97114198112613bbe57613bb590600003613b8f565b612d4090613b75565b50600090565b680a688906bd8affffff811361441857670de0b6b3a764000080604092831b05907780000000000000000000000000000000000000000000000067ff0000000000000083166142fb575b66ff00000000000083166141f3575b65ff000000000083166140f3575b64ff000000008316613ffb575b63ff0000008316613f0b575b62ff00008316613e23575b61ff008316613d43575b60ff8316613c6c575b02911c60bf031c90565b60808316613d31575b838316613d1f575b60208316613d0d575b60108316613cfb575b60088316613ce9575b60048316613cd7575b60028316613cc5575b6001831615613c62576801000000000000000102831c613c62565b6801000000000000000102831c613caa565b6801000000000000000302831c613ca1565b6801000000000000000602831c613c98565b6801000000000000000b02831c613c8f565b6801000000000000001602831c613c86565b6801000000000000002c02831c613c7d565b6801000000000000005902831c613c75565b6180008316613e11575b6140008316613dff575b6120008316613ded575b6110008316613ddb575b6108008316613dc9575b6104008316613db7575b6102008316613da5575b610100831615613c5957680100000000000000b102831c613c59565b6801000000000000016302831c613d89565b680100000000000002c602831c613d7f565b6801000000000000058c02831c613d75565b68010000000000000b1702831c613d6b565b6801000000000000162e02831c613d61565b68010000000000002c5d02831c613d57565b680100000000000058b902831c613d4d565b628000008316613ef9575b624000008316613ee7575b622000008316613ed5575b621000008316613ec3575b620800008316613eb1575b620400008316613e9f575b620200008316613e8d575b62010000831615613c4f576801000000000000b17202831c613c4f565b680100000000000162e402831c613e70565b6801000000000002c5c802831c613e65565b68010000000000058b9102831c613e5a565b680100000000000b172102831c613e4f565b68010000000000162e4302831c613e44565b680100000000002c5c8602831c613e39565b6801000000000058b90c02831c613e2e565b63800000008316613fe9575b63400000008316613fd7575b63200000008316613fc5575b63100000008316613fb3575b63080000008316613fa1575b63040000008316613f8f575b63020000008316613f7d575b6301000000831615613c445768010000000000b1721802831c613c44565b6801000000000162e43002831c613f5f565b68010000000002c5c86002831c613f53565b680100000000058b90c002831c613f47565b6801000000000b17217f02831c613f3b565b680100000000162e42ff02831c613f2f565b6801000000002c5c85fe02831c613f23565b68010000000058b90bfc02831c613f17565b64800000000083166140e1575b64400000000083166140cf575b64200000000083166140bd575b64100000000083166140ab575b6408000000008316614099575b6404000000008316614087575b6402000000008316614075575b640100000000831615613c3857680100000000b17217f802831c613c38565b68010000000162e42ff102831c614056565b680100000002c5c85fe302831c614049565b6801000000058b90bfce02831c61403c565b68010000000b17217fbb02831c61402f565b6801000000162e42fff002831c614022565b68010000002c5c8601cc02831c614015565b680100000058b90c0b4902831c614008565b6580000000000083166141e1575b6540000000000083166141cf575b6520000000000083166141bd575b6510000000000083166141ab575b650800000000008316614199575b650400000000008316614187575b650200000000008316614175575b65010000000000831615613c2b576801000000b17218355102831c613c2b565b680100000162e430e5a202831c614155565b6801000002c5c863b73f02831c614147565b68010000058b90cf1e6e02831c614139565b680100000b1721bcfc9a02831c61412b565b68010000162e43f4f83102831c61411d565b680100002c5c89d5ec6d02831c61410f565b6801000058b91b5bc9ae02831c614101565b668000000000000083166142e9575b664000000000000083166142d7575b662000000000000083166142c5575b661000000000000083166142b3575b660800000000000083166142a1575b6604000000000000831661428f575b6602000000000000831661427d575b6601000000000000831615613c1d5768010000b17255775c0402831c613c1d565b6801000162e525ee054702831c61425c565b68010002c5cc37da949202831c61424d565b680100058ba01fb9f96d02831c61423e565b6801000b175effdc76ba02831c61422f565b680100162f3904051fa102831c614220565b6801002c605e2e8cec5002831c614211565b68010058c86da1c09ea202831c614202565b67800000000000000083166143f9575b67400000000000000083166143e7575b67200000000000000083166143d5575b67100000000000000083166143c3575b67080000000000000083166143b1575b670400000000000000831661439f575b670200000000000000831661438d575b670100000000000000831615613c0e57680100b1afa5abcbed6102831c613c0e565b68010163da9fb33356d802831c61436b565b680102c9a3e778060ee702831c61435b565b6801059b0d31585743ae02831c61434b565b68010b5586cf9890f62a02831c61433b565b6801172b83c7d517adce02831c61432b565b6801306fe0a31b7152df02831c61431b565b5077b504f333f9de64848000000000000000000000000000000061430b565b602490604051907f0360d0280000000000000000000000000000000000000000000000000000000082526004820152fd5b8060008083131561456d57670de0b6b3a76400009283811261453657506001925b808305906001600160801b03821160071b91821c9167ffffffffffffffff831160061b92831c63ffffffff811160051b90811c61ffff811160041b90811c60ff811160031b90811c91600f831160021b92831c936001978860038711811b96871c11961717171717171781810294811d9082821461452a57506706f05b59d3b20000905b8482136144fe5750505050500290565b808391020590671bc16d674ec8000082121561451d575b831d906144ee565b8091950194831d90614515565b93505093925050020290565b6000199392508015614559576ec097ce7bc90715b34b9f1000000000059161446a565b602482634e487b7160e01b81526012600452fd5b602483604051907f059b101b0000000000000000000000000000000000000000000000000000000082526004820152fd5b6000818152600b6020526145d3604082205464ffffffffff808281809460a01c1693849160c81c160316918142160316613799565b91808252600b602052600460408320018054156146595790829167ffffffffffffffff935261462b6020832054828452600b6020526136da6001600160801b03968760026040882001541696879360801c1690613b08565b92831361464157505061463d9061375d565b1690565b60029350604092508152600b60205220015460801c90565b602483634e487b7160e01b81526032600452fd5b80600052600b602052604060002060ff600182015460a01c16600014614694575050600490565b805460f81c6146e7575460a01c64ffffffffff164210613bbe576146b7816134da565b90600052600b6020526001600160801b0380600260406000200154169116106000146146e257600190565b600290565b5050600390565b80600052600b602052614707600260406000200161331d565b81600052600b602052604060002060ff600182015460a01c1660001461473a57506001600160801b039150602001511690565b5460f81c61474c5750612d40906134da565b612d4091506001600160801b036040818351169201511690613388565b906001600160a01b036001541660206001600160a01b0360a0850151166024604051809481937fdcf844a700000000000000000000000000000000000000000000000000000000835260048301525afa801561083657600090614fa8575b6147ea91506001600160801b0360808501511690602060c08601510151916156d7565b6001600160801b0381511660e08401519064ffffffffff6020860151168115614f7e5782518015614f54577f00000000000000000000000000000000000000000000000000000000000000008111614f23575064ffffffffff604061484e85613545565b51015116811015614ecc5750600091829083815185905b808210614e39575050505064ffffffffff421664ffffffffff8216811015614df95750506001600160801b0382168103614db75750506009549283600052600b6020526040600020916001600160801b0381511660028401906fffffffffffffffffffffffffffffffff198254161790556001600160a01b0360a0830151166001840154750100000000000000000000000000000000000000000060408501511515927fffffffffffffffffffff00ff000000000000000000000000000000000000000087549316171760018601556001600160a01b038451169160e0850151926040614959855195600019870190613568565b510151927fff000000000000000000000000000000000000000000000000000000000000007eff0000000000000000000000000000000000000000000000000000000000007dffffffffff0000000000000000000000000000000000000000000000000078ffffffffff000000000000000000000000000000000000000060208b015160a01b169660c81b169460f01b16911617171717845560005b818110614ce8575050600185016009556001600160a01b0360a08301511660005260026020526001600160801b0380604060002054168160208401511601166001600160a01b0360a0840151166000526040600020906fffffffffffffffffffffffffffffffff198254161790556001600160a01b036060830151168015614ca4578590614aa2614a9c8360005260056020526001600160a01b0360406000205416151590565b15615156565b614ac5614a9c8360005260056020526001600160a01b0360406000205416151590565b8060005260066020526040600020600181540190558160005260056020526040600020816001600160a01b031982541617905560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4614b4e6001600160a01b0360a0840151166001600160801b03808451168160208601511601169030903390614fdc565b6001600160801b0360408201511680614c75575b507f5fdd2815acf0f9021ab8eb10cffdc5974c4521cd6d431e3b0d93f13ffe0059796001600160a01b0383511691866001600160a01b03606086015116946001600160a01b0360a08201511696614c6a614c4b60408401511515926001600160a01b0360c060e087015192549664ffffffffff60405198614be28a612c34565b818160a01c168a5260c81c1660208901520151511693614c3560405198899889523360208a01526040890190604090816001600160801b0391828151168552826020820151166020860152015116910152565b60a08701526101408060c0880152860190612b97565b9260e08501906020908164ffffffffff91828151168552015116910152565b6101208301520390a4565b614c9e906001600160a01b0360a0850151166001600160a01b0360c08601515116903390614fdc565b38614b62565b606460405162461bcd60e51b815260206004820152602060248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152fd5b614cf68160e0860151613568565b5190600486015491680100000000000000008310156120fe57600183018060048901558310156135525760019260048801600052602060002001906001600160801b03815116908254917fffffff00000000000000000000000000000000000000000000000000000000007cffffffffff000000000000000000000000000000000000000000000000604077ffffffffffffffff00000000000000000000000000000000602086015160801b1694015160c01b1693161717179055016149f5565b6040517fd90b7e390000000000000000000000000000000000000000000000000000000081526001600160801b03918216600482015291166024820152604490fd5b6040517f210aec0e00000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b9193509194614e5d906001600160801b03614e548589613568565b51511690615439565b9464ffffffffff806040614e718685613568565b51015116941680851115614e8f575060018493019192919092614865565b8385606492604051927f7b0bada8000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b64ffffffffff6040614edd85613545565b5101516040517fb4c9e52c00000000000000000000000000000000000000000000000000000000815264ffffffffff938416600482015291169091166024820152604490fd5b602490604051907f4757689b0000000000000000000000000000000000000000000000000000000082526004820152fd5b60046040517f3952c64e000000000000000000000000000000000000000000000000000000008152fd5b60046040517f6095d3bc000000000000000000000000000000000000000000000000000000008152fd5b6020823d602011614fd4575b81614fc160209383612c81565b8101031261323f57506147ea90516147c7565b3d9150614fb4565b9290604051927f23b872dd0000000000000000000000000000000000000000000000000000000060208501526001600160a01b03809216602485015216604483015260648201526064815260a081019181831067ffffffffffffffff8411176120fe5761504b9260405261504d565b565b6001600160a01b0316906150ad60405161506681612c34565b6020938482527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564858301526000808587829751910182855af16150a761308d565b916151a1565b805191821591848315615132575b5050509050156150c85750565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b9193818094500103126132425782015190811515820361323f5750803880846150bb565b1561515d57565b606460405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152fd5b9192901561520257508151156151b5575090565b3b156151be5790565b606460405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b8251909150156152155750805190602001fd5b6103f89060405191829162461bcd60e51b8352602060048401526024830190612acc565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361526b57565b60046040517fa1c0d6e5000000000000000000000000000000000000000000000000000000008152fd5b916001600160a01b03604051927fa9059cbb000000000000000000000000000000000000000000000000000000006020850152166024830152604482015260448152608081019181831067ffffffffffffffff8411176120fe5761504b9260405261504d565b612d4090615308816146ee565b90600052600b60205260026040600020015460801c90613388565b91908110156135525760051b0190565b92919061533f84613351565b61040c5761536384600052600b6020526001600160a01b0360406000205416331490565b1580615429575b6103d95761538e84600052600b6020526001600160a01b0360406000205416331490565b80615405575b6153d8576001600160a01b0381161561035e576001600160801b038216156153c05761504b9293615454565b6024846040519063d2aabcd960e01b82526004820152fd5b836001600160a01b0360649260405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b508360005260056020526001600160a01b0380604060002054169082161415615394565b506154338461566e565b1561536a565b9190916001600160801b0380809416911601918211611d2257565b929190926001600160801b038061546a836152fb565b1692818116938085116156315750600095838752602092600b84526154cf61549d6040946002868c20015460801c615439565b868a52600b86526002858b200190836fffffffffffffffffffffffffffffffff1983549260801b16911617815561331d565b906154ea818684015116928286818351169201511690613388565b161115615602575b838752600b83526001600160a01b03916155158683856001858d20015416615295565b8488526005845282818920541680331415806155f8575b615561575b507ffa54f9f9bdcdd28778cbb9f78490df6691cc4e2729588e10f4cc0a26c465686a9495969750519586521693a3565b803b156155f45797807ffa54f9f9bdcdd28778cbb9f78490df6691cc4e2729588e10f4cc0a26c465686a9697989960848451809481937f13375c3b0000000000000000000000000000000000000000000000000000000083528c600484015233602484015289891660448401528d60648401525af16155e5575b8897969550615531565b6155ee90612c6d565b386155db565b8880fd5b50803b151561552c565b838752600b835281872060018101600160a01b60ff60a01b1982541617905560ff60f01b1981541690556154f2565b8360649186604051927fa1fb2bbc000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b60009080825260056020526001600160a01b0380604084205416928333149384156156b3575b505082156156a157505090565b9091506156ae3392612d43565b161490565b60ff9294509060409181526008602052818120338252602052205416913880615694565b9092916156e26132fe565b936001600160801b03928381169182156157ee5767016345785d8a00008082116157b757808511615780575061572c8561571d819386613a59565b16946020890195865284613a59565b169184615743604089019480865282875116615439565b16101561576a5761575c84918261576595511690613388565b91511690613388565b168252565b634e487b7160e01b600052600160045260246000fd5b84604491604051917f4fea5c1a00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b60449250604051917f47152d6700000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050505050905060405161580181612c18565b6000815260006020820152600060408201529056fef8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7"; + hex"60c0346200046e57601f62005ea838819003918201601f19168301916001600160401b038311848410176200032b578084926080946040528339810103126200046e5780516001600160a01b038082169290918390036200046e5760208101518281168091036200046e5760408201519183831683036200046e5760600151936200008962000473565b90601d82527f5361626c696572205632204c6f636b75702044796e616d6963204e46540000006020830152620000be62000473565b601181527029a0a116ab1916a627a1a5aaa816a22ca760791b602082015230608052600080546001600160a01b03199081168417825560018054909116909517909455927fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a38051906001600160401b0382116200032b5760035490600182811c9216801562000463575b60208310146200044d5781601f849311620003d8575b50602090601f83116001146200034d5760009262000341575b50508160011b916000199060031b1c1916176003555b80516001600160401b0381116200032b576004918254600181811c9116801562000320575b60208210146200030b579081601f849311620002b3575b50602090601f831160011462000248576000926200023c575b50508160011b916000199060031b1c19161790555b1660018060a01b0319600a541617600a5560a0526001600955604051615a14908162000494823960805181615420015260a0518181816110f8015261497c0152f35b015190503880620001e5565b6000858152602081209350601f198516905b8181106200029a575090846001959493921062000280575b505050811b019055620001fa565b015160001960f88460031b161c1916905538808062000272565b929360206001819287860151815501950193016200025a565b909150836000526020600020601f840160051c8101916020851062000300575b90601f859493920160051c01905b818110620002f05750620001cc565b60008155849350600101620002e1565b9091508190620002d3565b602284634e487b7160e01b6000525260246000fd5b90607f1690620001b5565b634e487b7160e01b600052604160045260246000fd5b0151905038806200017a565b600360009081527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b9350601f198516905b818110620003bf5750908460019594939210620003a5575b505050811b0160035562000190565b015160001960f88460031b161c1916905538808062000396565b929360206001819287860151815501950193016200037e565b60036000529091507fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f840160051c8101916020851062000442575b90601f859493920160051c01905b81811062000432575062000161565b6000815584935060010162000423565b909150819062000415565b634e487b7160e01b600052602260045260246000fd5b91607f16916200014b565b600080fd5b60408051919082016001600160401b038111838210176200032b5760405256fe608080604052600436101561001357600080fd5b60003560e01c90816301ffc9a714612a9c5750806306fdde03146129d9578063081812fc146129bb578063095ea7b3146128275780631400ecec1461278257806316844456146125075780631c1cdd4c146124a15780631e99d5691461248357806323b872dd1461245a57806339a73c031461241757806340e58ee514612076578063425d30dd1461205857806342842e0e1461200857806342966c6814611ec95780634857501f14611e535780634869e12d14611e175780635fe3b56714611df05780636352211e14611dc15780636d0cee7514611d6957806370a0823114611cbf57806375829def14611c2d5780637cad6cd114611b5b5780637de6b1db146119325780638659c270146114da578063894e9a0d1461126d5780638bad38dd146111f15780638f69b9931461116e5780639067b6771461111b5780639188ec84146110e057806395d89b4114610fd2578063a22cb46514610f01578063a2ffb89714610e08578063a6202bf214610cff578063a80fc07114610caa578063ad35efd414610c47578063b256456914610c29578063b637b86514610bc9578063b88d4fde14610b3e578063b8a3be6614610b07578063b971302a14610ab5578063bc063e1a14610a92578063bc2be1be14610a3f578063c156a11d14610962578063c33cd35e1461084d578063c87b56dd1461071a578063cc364f481461067f578063d4dbd20b1461062a578063d511609f146105db578063d975dfed1461058e578063e985e9c514610537578063ea5ead19146104ef578063eac8f5b814610483578063f590c1761461045b578063f851a440146104345763fdd46d601461027c57600080fd5b3461042f57606036600319011261042f57600435610298612bc9565b604435906001600160801b03821680830361042f576102b5615416565b6102be8461349a565b610417576102e284600052600b6020526001600160a01b0360406000205416331490565b1580610407575b6103e45761030d84600052600b6020526001600160a01b0360406000205416331490565b806103c0575b610393576001600160a01b03821615610369571561035157916103486020926000805160206159f48339815191529483615631565b604051908152a1005b6024836040519063d2aabcd960e01b82526004820152fd5b60046040517fc61a0e9e000000000000000000000000000000000000000000000000000000008152fd5b6064846001600160a01b038460405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b508360005260056020526001600160a01b0380604060002054169083161415610313565b60405163216caf0d60e01b815260048101859052336024820152604490fd5b0390fd5b506104118461584b565b156102e9565b60248460405190634a5541ef60e01b82526004820152fd5b600080fd5b3461042f57600036600319011261042f5760206001600160a01b0360005416604051908152f35b3461042f57602036600319011261042f5760206104796004356134ea565b6040519015158152f35b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d857600052600b60205260206001600160a01b0360016040600020015416604051908152f35b6024906040519062b8e7e760e51b82526004820152fd5b3461042f57604036600319011261042f576000805160206159f4833981519152602060043561034861051f612bc9565b610528836154d8565b90610531615416565b83615510565b3461042f57604036600319011261042f57610550612bb3565b610558612bc9565b906001600160a01b03809116600052600860205260406000209116600052602052602060ff604060002054166040519015158152f35b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d8576105ca6020916154d8565b6001600160801b0360405191168152f35b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d857600052600b602052602060026040600020015460801c604051908152f35b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d857600052600b60205260206001600160801b0360036040600020015416604051908152f35b3461042f57602036600319011261042f57600435600060206040516106a381612d03565b828152015280600052600b60205260ff60016040600020015460a81c16156104d857600052600b602052604080600020548151906106e082612d03565b64ffffffffff90818160a01c16835260c81c166020820152610718825180926020908164ffffffffff91828151168552015116910152565bf35b3461042f5760208060031936011261042f57600435906107586107538360005260056020526001600160a01b0360406000205416151590565b612da2565b60006001600160a01b03600a5416926044604051809581937fe9dc637500000000000000000000000000000000000000000000000000000000835230600484015260248301525afa918215610841576000926107c8575b506107c4604051928284938452830190612b8e565b0390f35b9091503d806000833e6107db8183612d50565b810190828183031261042f5780519067ffffffffffffffff821161042f570181601f8201121561042f57805161081081612d72565b9261081e6040519485612d50565b81845284828401011161042f5761083a91848085019101612b6b565b90826107af565b6040513d6000823e3d90fd5b3461042f5760031960203682011261042f576004359067ffffffffffffffff9081831161042f5761014090833603011261042f57610889615416565b6040519161089683612ce6565b6108a281600401612bdf565b83526108b06024820161351b565b60208401526108c160448201612cbd565b60408401526108d260648201612cbd565b60608401526108e360848201612bdf565b60808401526108f460a48201612d8e565b60a084015261090560c48201612bdf565b60c08401526109173660e48301613601565b60e084015261012481013591821161042f57013660238201121561042f5760209161094f61095a92369060246004820135910161352d565b6101008201526148cd565b604051908152f35b3461042f57604036600319011261042f5760043561097e612bc9565b610986615416565b81600052600b60205260ff60016040600020015460a81c1615610a28578160005260056020526001600160a01b0360406000205416803303610a095791610348816020936000805160206159f4833981519152956109e3836154d8565b6001600160801b0381166109f8575b50613035565b610a03908285615631565b876109f2565b60405163216caf0d60e01b815260048101849052336024820152604490fd5b6024826040519062b8e7e760e51b82526004820152fd5b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d857600052600b602052602064ffffffffff60406000205460a01c16604051908152f35b3461042f57600036600319011261042f57602060405167016345785d8a00008152f35b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d857600052600b60205260206001600160a01b0360406000205416604051908152f35b3461042f57602036600319011261042f57600435600052600b602052602060ff60016040600020015460a81c166040519015158152f35b3461042f57608036600319011261042f57610b57612bb3565b610b5f612bc9565b6064359167ffffffffffffffff831161042f573660238401121561042f57826004013591610b8c83612d72565b92610b9a6040519485612d50565b808452366024828701011161042f576020816000926024610bc79801838801378501015260443591612ec0565b005b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d857600052600b6020526107c4610c156004604060002001613382565b604051918291602083526020830190612c59565b3461042f57602036600319011261042f576020610479600435613463565b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d857610c81906147d1565b6040516005821015610c94576020918152f35b634e487b7160e01b600052602160045260246000fd5b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d857600052600b60205260206001600160801b0360026040600020015416604051908152f35b3461042f57602036600319011261042f57610d18612bb3565b6001600160a01b038060005416338103610ddf57508116908160005260026020526001600160801b0360406000205416908115610dae5781610d809184600052600260205260406000206fffffffffffffffffffffffffffffffff1981541690553390615472565b6040519081527fca7a4a65a94ed2f37538814e00e1cd4c41a78261561e3f3794592f11409cf5af60203392a3005b602483604051907f8410168c0000000000000000000000000000000000000000000000000000000082526004820152fd5b6040516331b339a960e21b81526001600160a01b03919091166004820152336024820152604490fd5b3461042f57606036600319011261042f5767ffffffffffffffff60043581811161042f57610e3a903690600401612c28565b610e42612bc9565b9260443590811161042f57610e5b903690600401612c28565b9190610e65615416565b828203610eca5760005b828110610e7857005b806000805160206159f48339815191526020610e97600194878a615500565b35610ebd610eae610ea9868b8a615500565b6135ed565b610eb6615416565b8b83615510565b604051908152a101610e6f565b50604491604051917faec9344000000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b3461042f57604036600319011261042f57610f1a612bb3565b6024359081151580920361042f576001600160a01b031690813314610f8e57336000526008602052604060002082600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a3005b606460405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152fd5b3461042f57600036600319011261042f57604051600060045490600182811c918184169182156110d6575b60209485851084146110c05785879486865291826000146110a0575050600114611043575b5061102f92500383612d50565b6107c4604051928284938452830190612b8e565b84915060046000527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b906000915b85831061108857505061102f935082010185611022565b80548389018501528794508693909201918101611071565b60ff19168582015261102f95151560051b85010192508791506110229050565b634e487b7160e01b600052602260045260246000fd5b92607f1692610ffd565b3461042f57600036600319011261042f5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d857600052600b602052602064ffffffffff60406000205460c81c16604051908152f35b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d8576111a8906147d1565b600581101580610c9457600282149081156111e4575b81156111d2575b6020826040519015158152f35b9050610c9457600460209114826111c5565b50506003811460006111be565b3461042f57602036600319011261042f576004356001600160a01b039081811680910361042f578160005416338103610ddf575060015491816001600160a01b03198416176001556040519216825260208201527fdcb09aef4bf01068924ccce937981cbe59d25ba08380cf941aaaea4e4bd3960d60403392a2005b3461042f57602036600319011261042f57606061014060405161128f81612d1f565b60008152600060208201526000604082015260008382015260006080820152600060a0820152600060c0820152600060e082015260006101008201526112d3613410565b6101208201520152600435600052600b60205260ff60016040600020015460a81c16156114c257600435600052600b60205260406000206113b660046040519261131c84612d1f565b80546001600160a01b038116855264ffffffffff8160a01c16602086015264ffffffffff8160c81c16604086015260ff8160f01c161515606086015260f81c1515608085015260ff60018201546001600160a01b03811660a0870152818160a01c16151560c0870152818160a81c16151560e087015260b01c1615156101008501526113aa6002820161342f565b61012085015201613382565b6101408201526113c76004356147d1565b906005821015610c9457600261014092146114b6575b6107c4604051928392602084526001600160a01b03815116602085015264ffffffffff602082015116604085015264ffffffffff60408201511660608501526060810151151560808501526080810151151560a08501526001600160a01b0360a08201511660c085015260c0810151151560e085015260e0810151151561010085015261010081015115156101208501526114a261012082015183860190604090816001600160801b0391828151168552826020820151166020860152015116910152565b01516101a0808401526101c0830190612c59565b600060608201526113dd565b602460405162b8e7e760e51b81526004356004820152fd5b3461042f5760208060031936011261042f5760043567ffffffffffffffff811161042f5761150c903690600401612c28565b90611515615416565b6000915b80831061152257005b61152d838284615500565b3592611537615416565b6115408461349a565b1561155d5760248460405190634a5541ef60e01b82526004820152fd5b611569849293946134ea565b61191a5761158d82600052600b6020526001600160a01b0360406000205416331490565b15806118fa575b6118db576115a182613630565b82600052600b928387526115bb600260406000200161342f565b936001600160801b03928386511684821610156118c3578260005281895260ff60406000205460f01c16156118ab579061160a82858b611600819796838c51166134d1565b99015116906134d1565b93826000528184526040600020966003885498600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8b1617815583881615611891575b0191811691826fffffffffffffffffffffffffffffffff1982541617905561169d6001600160a01b03809916926005875289604060002054169487528360019a8b6040600020015416615472565b3382036117ae57823b61170a575b7f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd26000805160206159f48339815191529685925b604080516001600160801b03928316815292909116602083015290a4604051908152a1019190611519565b9350813b1561042f576040516372eba20360e01b8152600481018490526001600160a01b03821660248201526001600160801b038581166044830152861660648201526000805160206159f4833981519152958b9585927f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd2929190600081608481838b5af161179f575b5092509650506116ab565b6117a890612d3c565b8e611794565b813b6117ed575b7f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd26000805160206159f48339815191529685926116df565b9350803b1561042f576040516372eba20360e01b8152600481018490526001600160a01b03831660248201526001600160801b038581166044830152861660648201526000805160206159f4833981519152958b9585927f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd2929190600081608481838a5af1611882575b5092509650506117b5565b61188b90612d3c565b8e611877565b60018101600160a01b60ff60a01b1982541617905561164f565b602483604051906339c6dc7360e21b82526004820152fd5b602483604051906322cad1af60e11b82526004820152fd5b60405163216caf0d60e01b815260048101839052336024820152604490fd5b5081600052600585526001600160a01b0360406000205416331415611594565b6024826040519063fe19f19f60e01b82526004820152fd5b3461042f5760208060031936011261042f5760043561194f615416565b80600052600b825260ff60016040600020015460a81c16156104d857611974816147d1565b916000926005811015610c9457600481036119a15760248360405190634a5541ef60e01b82526004820152fd5b600381036119c1576024836040519063fe19f19f60e01b82526004820152fd5b916002849314611b43576119eb81600052600b6020526001600160a01b0360406000205416331490565b15611b235780600052600b825260ff60406000205460f01c1615611b0b5780600052600b8252604060002060ff60f01b198154169055600582526001600160a01b0360406000205416803b611a79575b50807f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f846000805160206159f483398151915295a2604051908152a1005b803b1561042f576000805160206159f48339815191529360008084936024604051809481937f341a0bd90000000000000000000000000000000000000000000000000000000083528860048401525af1611ad6575b509350611a3b565b9050611ae29150612d3c565b8060007f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f611ace565b602490604051906339c6dc7360e21b82526004820152fd5b60405163216caf0d60e01b81526004810191909152336024820152604490fd5b602490604051906322cad1af60e11b82526004820152fd5b3461042f57602036600319011261042f576004356001600160a01b039081811680910361042f578160005416338103610ddf5750600a5491816001600160a01b0319841617600a556040519216825260208201527fa2548bd4b805e907c1558a47b5858324fe8bb4a2e1ddfca647eecbf65610eebc60403392a26009546000198101908111611c175760407f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c91815190600182526020820152a1005b634e487b7160e01b600052601160045260246000fd5b3461042f57602036600319011261042f57611c46612bb3565b6000546001600160a01b0380821692338403611c98576001600160a01b03199350169182911617600055337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf80600080a3005b6040516331b339a960e21b81526001600160a01b0385166004820152336024820152604490fd5b3461042f57602036600319011261042f576001600160a01b03611ce0612bb3565b168015611cff5760005260066020526020604060002054604051908152f35b608460405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e657200000000000000000000000000000000000000000000006064820152fd5b3461042f57602036600319011261042f57600435611da06107538260005260056020526001600160a01b0360406000205416151590565b600052600560205260206001600160a01b0360406000205416604051908152f35b3461042f57602036600319011261042f576020611ddf600435612ded565b6001600160a01b0360405191168152f35b3461042f57600036600319011261042f5760206001600160a01b0360015416604051908152f35b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d8576105ca602091614852565b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d8576000611e8f826147d1565b6005811015610c9457600203611ead575b6020906040519015158152f35b50600052600b602052602060ff60406000205460f01c16611ea0565b3461042f57602036600319011261042f57600435611ee5615416565b611eee8161349a565b15611fd757611efc8161584b565b15611b2357611f0a81612ded565b611f1382613463565b159081611fce575b81611fbb575b50611fa3576000611f3182612ded565b82825260076020526001600160a01b0360408320916001600160a01b0319928381541690551690818352600660205260408320831981540190558383526005602052604083209081541690557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a4005b602490604051906378630aa960e01b82526004820152fd5b6001600160a01b03915016151582611f21565b60009150611f1b565b602490604051907f817cd6390000000000000000000000000000000000000000000000000000000082526004820152fd5b3461042f5761201636612bf3565b60405191602083019383851067ffffffffffffffff86111761204257610bc79460405260008452612ec0565b634e487b7160e01b600052604160045260246000fd5b3461042f57602036600319011261042f57602061047960043561349a565b3461042f5760208060031936011261042f5760043590612094615416565b61209d8261349a565b156120ba5760248260405190634a5541ef60e01b82526004820152fd5b6120c3826134ea565b61191a576120e782600052600b6020526001600160a01b0360406000205416331490565b15806123f7575b6118db576120fb82613630565b9180600052600b8252612114600260406000200161342f565b926001600160801b03908185511682821610156118c35782600052600b845260ff60406000205460f01c16156118ab5780828561215761216194838a51166134d1565b97015116906134d1565b9082600052600b84526040600020916003835493600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8616178155838316156123dd575b0191861691826fffffffffffffffffffffffffffffffff198254161790556121f56001600160a01b03809416926005875283856040600020541695600b895260016040600020015416615472565b3382036122fd57823b61225c575b7f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd284916000805160206159f4833981519152975b604080516001600160801b03928316815292909116602083015290a4604051908152a1005b823b1561042f576040516372eba20360e01b8152600481018590526001600160a01b03831660248201526001600160801b038781166044830152821660648201526000805160206159f48339815191529685927f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd292909190600081608481838b5af16122ee575b509750915050612203565b6122f790612d3c565b896122e3565b813b61233c575b7f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd284916000805160206159f483398151915297612237565b813b1561042f576040516372eba20360e01b8152600481018590526001600160a01b03841660248201526001600160801b038781166044830152821660648201526000805160206159f48339815191529685927f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd292909190600081608481838a5af16123ce575b509750915050612304565b6123d790612d3c565b896123c3565b60018101600160a01b60ff60a01b198254161790556121a7565b5081600052600581526001600160a01b03604060002054163314156120ee565b3461042f57602036600319011261042f576001600160a01b03612438612bb3565b16600052600260205260206001600160801b0360406000205416604051908152f35b3461042f57610bc761246b36612bf3565b9161247e6124798433612f56565b612e4f565b613035565b3461042f57600036600319011261042f576020600954604051908152f35b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d8576124db906147d1565b6005811015610c945780602091159081156124fc575b506040519015158152f35b6001915014826124f1565b3461042f576020600319818136011261042f576004359067ffffffffffffffff9081831161042f576101208336039182011261042f57612545615416565b610104830135906022190181121561042f57820160048101359082821161042f57602401606082023603811361042f5761258091369161352d565b9182519061258d8261336a565b9161259b6040519384612d50565b808352601f196125aa8261336a565b018660005b82811061276c5750505064ffffffffff90814216946001600160801b0396876125d78261369b565b515116828a6125e58461369b565b51015116858060406125f68661369b565b510151168a0116906040519261260b84612cca565b83528b830152604082015261261f8761369b565b526126298661369b565b5060019386855b8a8c8783106126eb57908b846001600160a01b038c60a48101358281169081900361042f5761095a956126ab956126db9461266d602486016135cc565b612679604487016135cc565b612685606488016135d9565b91612692886004016135d9565b94846126a060848b016135ed565b966040519d8e612ce6565b168c528d8c0152151560408b0152151560608a01521660808801521660a086015260c085015260c4369101613601565b60e08301526101008201526148cd565b88938580604061271f8b8661270f8a8e9a612706828d6136be565b5151169a6136be565b51015116946000198901906136be565b51015116816040612730888c6136be565b510151160116916040519361274485612cca565b84528301526040820152612758828b6136be565b52612763818a6136be565b50018790612630565b612774613410565b8282880101520187906125af565b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d85760209060009080600052600b8352604060002060ff815460f01c1680612815575b6127ec575b50506001600160801b0360405191168152f35b61280e92506001600160801b0360026128089201541691613630565b906134d1565b82806127d9565b5060ff600182015460a01c16156127d4565b3461042f57604036600319011261042f57612840612bb3565b602435906001600160a01b03808061285785612ded565b169216918083146129515780331490811561292c575b50156128c2578260005260076020526040600020826001600160a01b031982541617905561289a83612ded565b167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b608460405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152fd5b9050600052600860205260406000203360005260205260ff604060002054168461286d565b608460405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152fd5b3461042f57602036600319011261042f576020611ddf600435612e12565b3461042f57600036600319011261042f57604051600060035490600182811c91818416918215612a92575b60209485851084146110c05785879486865291826000146110a0575050600114612a35575061102f92500383612d50565b84915060036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b906000915b858310612a7a57505061102f935082010185611022565b80548389018501528794508693909201918101612a63565b92607f1692612a04565b3461042f57602036600319011261042f57600435907fffffffff00000000000000000000000000000000000000000000000000000000821680920361042f57817f80ac58cd0000000000000000000000000000000000000000000000000000000060209314908115612b41575b8115612b17575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501483612b10565b7f5b5e139f0000000000000000000000000000000000000000000000000000000081149150612b09565b60005b838110612b7e5750506000910152565b8181015183820152602001612b6e565b90602091612ba781518092818552858086019101612b6b565b601f01601f1916010190565b600435906001600160a01b038216820361042f57565b602435906001600160a01b038216820361042f57565b35906001600160a01b038216820361042f57565b606090600319011261042f576001600160a01b0390600435828116810361042f5791602435908116810361042f579060443590565b9181601f8401121561042f5782359167ffffffffffffffff831161042f576020808501948460051b01011161042f57565b90815180825260208080930193019160005b828110612c79575050505090565b835180516001600160801b031686528083015167ffffffffffffffff168684015260409081015164ffffffffff169086015260609094019392810192600101612c6b565b3590811515820361042f57565b6060810190811067ffffffffffffffff82111761204257604052565b610120810190811067ffffffffffffffff82111761204257604052565b6040810190811067ffffffffffffffff82111761204257604052565b610160810190811067ffffffffffffffff82111761204257604052565b67ffffffffffffffff811161204257604052565b90601f8019910116810190811067ffffffffffffffff82111761204257604052565b67ffffffffffffffff811161204257601f01601f191660200190565b35906001600160801b038216820361042f57565b15612da957565b606460405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152fd5b60005260056020526001600160a01b0360406000205416612e0f811515612da2565b90565b612e356107538260005260056020526001600160a01b0360406000205416151590565b60005260076020526001600160a01b036040600020541690565b15612e5657565b608460405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f766564000000000000000000000000000000000000006064820152fd5b90612ee4939291612ed46124798433612f56565b612edf838383613035565b6131cf565b15612eeb57565b60405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b906001600160a01b038080612f6a84612ded565b16931691838314938415612f9d575b508315612f87575b50505090565b612f9391929350612e12565b1614388080612f81565b909350600052600860205260406000208260005260205260ff604060002054169238612f79565b15612fcb57565b608460405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152fd5b9061305d9161304384612ded565b916001600160a01b03938493848094169485911614612fc4565b169182156131365761306e84613463565b158061312e575b80613125575b61310d57816130949161308d86612ded565b1614612fc4565b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60008481526007602052604081206001600160a01b03199081815416905583825260066020526040822060001981540190558482526040822060018154019055858252600560205284604083209182541617905580a4565b602484604051906378630aa960e01b82526004820152fd5b5081151561307b565b506001613075565b608460405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152fd5b3d156131ca573d906131b082612d72565b916131be6040519384612d50565b82523d6000602084013e565b606090565b91926000929190813b156133605760209161323f91856040519586809581947f150b7a02000000000000000000000000000000000000000000000000000000009b8c84523360048501526001600160a01b0380951660248501526044840152608060648401526084830190612b8e565b0393165af1908290826132f9575b50506132d35761325b61319f565b805190816132ce5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000161490565b909192506020813d8211613358575b8161331560209383612d50565b810103126133545751907fffffffff0000000000000000000000000000000000000000000000000000000082168203613351575090388061324d565b80fd5b5080fd5b3d9150613308565b5050505050600190565b67ffffffffffffffff81116120425760051b60200190565b90815461338e8161336a565b9260409361339e85519182612d50565b828152809460208092019260005281600020906000935b8585106133c457505050505050565b600184819284516133d481612cca565b64ffffffffff87546001600160801b038116835267ffffffffffffffff8160801c168584015260c01c16868201528152019301940193916133b5565b6040519061341d82612cca565b60006040838281528260208201520152565b9060405161343c81612cca565b6040819360018154916001600160801b0392838116865260801c6020860152015416910152565b80600052600b60205260ff60016040600020015460a81c16156104d857600052600b60205260ff60016040600020015460b01c1690565b80600052600b60205260ff60016040600020015460a81c16156104d857600052600b60205260ff60016040600020015460a01c1690565b6001600160801b039182169082160391908211611c1757565b80600052600b60205260ff60016040600020015460a81c16156104d857600052600b60205260406000205460f81c90565b359064ffffffffff8216820361042f57565b9291926135398261336a565b60409461354886519283612d50565b8195848352602080930191606080960285019481861161042f57925b8584106135745750505050505050565b868483031261042f5782519061358982612cca565b61359285612d8e565b8252858501359067ffffffffffffffff8216820361042f57828792838b9501526135bd86880161351b565b86820152815201930192613564565b35801515810361042f5790565b356001600160a01b038116810361042f5790565b356001600160801b038116810361042f5790565b919082604091031261042f5760405161361981612d03565b602080829461362781612bdf565b84520135910152565b64ffffffffff80421682600052600b602052604060002091825482828260a01c1610156136915760c81c16111561367f57600401546001101561367657612e0f906136d2565b612e0f90614702565b6001600160801b039150600201541690565b5050505050600090565b8051156136a85760200190565b634e487b7160e01b600052603260045260246000fd5b80518210156136a85760209160051b010190565b64ffffffffff90814216906000908152600b6020526040908181208251936136f985612d1f565b8154956001600160a01b039182881687526020870197828160a01c168952828160c81c168789015260ff8160f01c161515606089015260f81c1515608088015260ff6001938486015490811660a08a0152818160a01c16151560c08a0152818160a81c16151560e08a015260b01c16151561010088015261014061379360046137846002880161342f565b966101208b0197885201613382565b97019187835280876137a5889a61369b565b5101511693828288965b161061388957509161383961383e9284888161384398976001600160801b039e8f6137db8b8a516136be565b5151169d8a8f9b60206137f867ffffffffffffffff928d516136be565b5101511699848361380a8484516136be565b510151169650811561387d57613828929350519060001901906136be565b5101511680925b03169203166138fd565b613c6c565b613acf565b92831361385c57505061385683916138c1565b16011690565b5160200151929392831692841683101591506138789050575090565b905090565b5050505116809261382f565b8094986001600160801b0390816138a18c88516136be565b51511601169801938282808a6138b88989516136be565b510151166137af565b600081126138cc5790565b602490604051907f2463f3d50000000000000000000000000000000000000000000000000000000082526004820152fd5b90600160ff1b8083149081156139e5575b506139bb5760008212156139b257613937826000035b60008312156139ab5782600003906139ef565b917f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83116139755760009160001991181315613971575090565b0390565b604491604051917fd49c26b300000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b82906139ef565b61393782613924565b60046040517f9fe2b450000000000000000000000000000000000000000000000000000000008152fd5b905081143861390e565b670de0b6b3a7640000916000198383099280830292838086109503948086039514613aab5782851015613a6f57908291096001821901821680920460028082600302188083028203028083028203028083028203028083028203028083028203028092029003029360018380600003040190848311900302920304170290565b82606492604051927f63a05778000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b505080925015613ab9570490565b634e487b7160e01b600052601260045260246000fd5b90600160ff1b808314908115613bb3575b50613b89576000821215613b8057613b09826000035b6000831215613b79578260000390613bbd565b917f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311613b435760009160001991181315613971575090565b604491604051917f120b5b4300000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b8290613bbd565b613b0982613af6565b60046040517fa6070c25000000000000000000000000000000000000000000000000000000008152fd5b9050811438613ae0565b90919060001983820983820291828083109203918083039214613c5b57670de0b6b3a76400009081831015613c2457947faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066994950990828211900360ee1b910360121c170290565b60449086604051917f5173648d00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050670de0b6b3a764000090049150565b80613c865750600090612e0f5750670de0b6b3a764000090565b90670de0b6b3a7640000808314613cd3575080613cab575050670de0b6b3a764000090565b670de0b6b3a76400008114613ccf57613cca9061383e612e0f936145ad565b613cf3565b5090565b91505090565b8015613ab9576ec097ce7bc90715b34b9f10000000000590565b6000811215613d285768033dd1780914b97114198112613d2257613d1990600003613cf3565b612e0f90613cd9565b50600090565b680a688906bd8affffff811361457c57670de0b6b3a764000080604092831b05907780000000000000000000000000000000000000000000000067ff00000000000000831661445f575b66ff0000000000008316614357575b65ff00000000008316614257575b64ff00000000831661415f575b63ff000000831661406f575b62ff00008316613f87575b61ff008316613ea7575b60ff8316613dd0575b02911c60bf031c90565b60808316613e95575b838316613e83575b60208316613e71575b60108316613e5f575b60088316613e4d575b60048316613e3b575b60028316613e29575b6001831615613dc6576801000000000000000102831c613dc6565b6801000000000000000102831c613e0e565b6801000000000000000302831c613e05565b6801000000000000000602831c613dfc565b6801000000000000000b02831c613df3565b6801000000000000001602831c613dea565b6801000000000000002c02831c613de1565b6801000000000000005902831c613dd9565b6180008316613f75575b6140008316613f63575b6120008316613f51575b6110008316613f3f575b6108008316613f2d575b6104008316613f1b575b6102008316613f09575b610100831615613dbd57680100000000000000b102831c613dbd565b6801000000000000016302831c613eed565b680100000000000002c602831c613ee3565b6801000000000000058c02831c613ed9565b68010000000000000b1702831c613ecf565b6801000000000000162e02831c613ec5565b68010000000000002c5d02831c613ebb565b680100000000000058b902831c613eb1565b62800000831661405d575b62400000831661404b575b622000008316614039575b621000008316614027575b620800008316614015575b620400008316614003575b620200008316613ff1575b62010000831615613db3576801000000000000b17202831c613db3565b680100000000000162e402831c613fd4565b6801000000000002c5c802831c613fc9565b68010000000000058b9102831c613fbe565b680100000000000b172102831c613fb3565b68010000000000162e4302831c613fa8565b680100000000002c5c8602831c613f9d565b6801000000000058b90c02831c613f92565b6380000000831661414d575b6340000000831661413b575b63200000008316614129575b63100000008316614117575b63080000008316614105575b630400000083166140f3575b630200000083166140e1575b6301000000831615613da85768010000000000b1721802831c613da8565b6801000000000162e43002831c6140c3565b68010000000002c5c86002831c6140b7565b680100000000058b90c002831c6140ab565b6801000000000b17217f02831c61409f565b680100000000162e42ff02831c614093565b6801000000002c5c85fe02831c614087565b68010000000058b90bfc02831c61407b565b6480000000008316614245575b6440000000008316614233575b6420000000008316614221575b641000000000831661420f575b64080000000083166141fd575b64040000000083166141eb575b64020000000083166141d9575b640100000000831615613d9c57680100000000b17217f802831c613d9c565b68010000000162e42ff102831c6141ba565b680100000002c5c85fe302831c6141ad565b6801000000058b90bfce02831c6141a0565b68010000000b17217fbb02831c614193565b6801000000162e42fff002831c614186565b68010000002c5c8601cc02831c614179565b680100000058b90c0b4902831c61416c565b658000000000008316614345575b654000000000008316614333575b652000000000008316614321575b65100000000000831661430f575b6508000000000083166142fd575b6504000000000083166142eb575b6502000000000083166142d9575b65010000000000831615613d8f576801000000b17218355102831c613d8f565b680100000162e430e5a202831c6142b9565b6801000002c5c863b73f02831c6142ab565b68010000058b90cf1e6e02831c61429d565b680100000b1721bcfc9a02831c61428f565b68010000162e43f4f83102831c614281565b680100002c5c89d5ec6d02831c614273565b6801000058b91b5bc9ae02831c614265565b6680000000000000831661444d575b6640000000000000831661443b575b66200000000000008316614429575b66100000000000008316614417575b66080000000000008316614405575b660400000000000083166143f3575b660200000000000083166143e1575b6601000000000000831615613d815768010000b17255775c0402831c613d81565b6801000162e525ee054702831c6143c0565b68010002c5cc37da949202831c6143b1565b680100058ba01fb9f96d02831c6143a2565b6801000b175effdc76ba02831c614393565b680100162f3904051fa102831c614384565b6801002c605e2e8cec5002831c614375565b68010058c86da1c09ea202831c614366565b678000000000000000831661455d575b674000000000000000831661454b575b6720000000000000008316614539575b6710000000000000008316614527575b6708000000000000008316614515575b6704000000000000008316614503575b67020000000000000083166144f1575b670100000000000000831615613d7257680100b1afa5abcbed6102831c613d72565b68010163da9fb33356d802831c6144cf565b680102c9a3e778060ee702831c6144bf565b6801059b0d31585743ae02831c6144af565b68010b5586cf9890f62a02831c61449f565b6801172b83c7d517adce02831c61448f565b6801306fe0a31b7152df02831c61447f565b5077b504f333f9de64848000000000000000000000000000000061446f565b602490604051907f0360d0280000000000000000000000000000000000000000000000000000000082526004820152fd5b806000808313156146d157670de0b6b3a76400009283811261469a57506001925b808305906001600160801b03821160071b91821c9167ffffffffffffffff831160061b92831c63ffffffff811160051b90811c61ffff811160041b90811c60ff811160031b90811c91600f831160021b92831c936001978860038711811b96871c11961717171717171781810294811d9082821461468e57506706f05b59d3b20000905b8482136146625750505050500290565b808391020590671bc16d674ec80000821215614681575b831d90614652565b8091950194831d90614679565b93505093925050020290565b60001993925080156146bd576ec097ce7bc90715b34b9f100000000005916145ce565b602482634e487b7160e01b81526012600452fd5b602483604051907f059b101b0000000000000000000000000000000000000000000000000000000082526004820152fd5b6000818152600b602052614737604082205464ffffffffff808281809460a01c1693849160c81c1603169181421603166138fd565b91808252600b602052600460408320018054156147bd5790829167ffffffffffffffff935261478f6020832054828452600b60205261383e6001600160801b03968760026040882001541696879360801c1690613c6c565b9283136147a55750506147a1906138c1565b1690565b60029350604092508152600b60205220015460801c90565b602483634e487b7160e01b81526032600452fd5b80600052600b602052604060002060ff600182015460a01c166000146147f8575050600490565b805460f81c61484b575460a01c64ffffffffff164210613d225761481b81613630565b90600052600b6020526001600160801b03806002604060002001541691161060001461484657600190565b600290565b5050600390565b80600052600b60205261486b600260406000200161342f565b81600052600b602052604060002060ff600182015460a01c1660001461489e57506001600160801b039150602001511690565b5460f81c6148b05750612e0f90613630565b612e0f91506001600160801b0360408183511692015116906134d1565b906001600160a01b036001541660206001600160a01b0360c0850151166024604051809481937fdcf844a700000000000000000000000000000000000000000000000000000000835260048301525afa801561084157600090615185575b61494e91506001600160801b0360a08501511690602060e08601510151916158b4565b6001600160801b038151166101008401519064ffffffffff602086015116811561515b5782518015615131577f00000000000000000000000000000000000000000000000000000000000000008111615100575064ffffffffff60406149b38561369b565b510151168110156150a95750600091829083815185905b808210615016575050505064ffffffffff421664ffffffffff8216811015614fd65750506001600160801b0382168103614f945750506009549283600052600b6020526040600020916001600160801b0381511660028401906fffffffffffffffffffffffffffffffff198254161790556001600160a01b0360c083015116600184015490750100000000000000000000000000000000000000000060408501511515928654927fffffffffffffffffff0000ff000000000000000000000000000000000000000076ff000000000000000000000000000000000000000000006060890151151560b01b16921617171760018601556001600160a01b0384511691610100850151926040614ae58551956000198701906136be565b510151927fff000000000000000000000000000000000000000000000000000000000000007eff0000000000000000000000000000000000000000000000000000000000007dffffffffff0000000000000000000000000000000000000000000000000078ffffffffff000000000000000000000000000000000000000060208b015160a01b169660c81b169460f01b16911617171717845560005b818110614ec4575050600185016009556001600160a01b0360c08301511660005260026020526001600160801b0380604060002054168160208401511601166001600160a01b0360c0840151166000526040600020906fffffffffffffffffffffffffffffffff198254161790556001600160a01b036080830151168015614e8057614c2c614c268760005260056020526001600160a01b0360406000205416151590565b15615333565b614c3586613463565b1580614e78575b80614e70575b614e58578590614c6b614c268360005260056020526001600160a01b0360406000205416151590565b8060005260066020526040600020600181540190558160005260056020526040600020816001600160a01b031982541617905560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4614cf46001600160a01b0360c0840151166001600160801b038084511681602086015116011690309033906151b9565b6001600160801b0360408201511680614e29575b507fef3d668acee46576ad5d407c42ab4d0cde13f3cd70b28f09a0fb9e3bf5bf09cb6001600160a01b0383511691866001600160a01b03608086015116946001600160a01b0360c08201511696614e1e614dfe6040840151151592606085015115156001600160a01b0360e061010088015193549764ffffffffff60405199614d908b612d03565b818160a01c168b5260c81c1660208a01520151511694614de3604051998a998a523360208b015260408a0190604090816001600160801b0391828151168552826020820151166020860152015116910152565b60a088015260c08701526101608060e0880152860190612c59565b926101008501906020908164ffffffffff91828151168552015116910152565b6101408301520390a4565b614e52906001600160a01b0360c0850151166001600160a01b0360e086015151169033906151b9565b38614d08565b602486604051906378630aa960e01b82526004820152fd5b506000614c42565b506001614c3c565b606460405162461bcd60e51b815260206004820152602060248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152fd5b614ed3816101008601516136be565b51906004860154916801000000000000000083101561204257600183018060048901558310156136a85760019260048801600052602060002001906001600160801b03815116908254917fffffff00000000000000000000000000000000000000000000000000000000007cffffffffff000000000000000000000000000000000000000000000000604077ffffffffffffffff00000000000000000000000000000000602086015160801b1694015160c01b169316171717905501614b81565b6040517fd90b7e390000000000000000000000000000000000000000000000000000000081526001600160801b03918216600482015291166024820152604490fd5b6040517f210aec0e00000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b919350919461503a906001600160801b0361503185896136be565b51511690615616565b9464ffffffffff80604061504e86856136be565b5101511694168085111561506c5750600184930191929190926149ca565b8385606492604051927f7b0bada8000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b64ffffffffff60406150ba8561369b565b5101516040517fb4c9e52c00000000000000000000000000000000000000000000000000000000815264ffffffffff938416600482015291169091166024820152604490fd5b602490604051907f4757689b0000000000000000000000000000000000000000000000000000000082526004820152fd5b60046040517f3952c64e000000000000000000000000000000000000000000000000000000008152fd5b60046040517f6095d3bc000000000000000000000000000000000000000000000000000000008152fd5b6020823d6020116151b1575b8161519e60209383612d50565b81010312613351575061494e905161492b565b3d9150615191565b9290604051927f23b872dd0000000000000000000000000000000000000000000000000000000060208501526001600160a01b03809216602485015216604483015260648201526064815260a081019181831067ffffffffffffffff841117612042576152289260405261522a565b565b6001600160a01b03169061528a60405161524381612d03565b6020938482527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564858301526000808587829751910182855af161528461319f565b9161537e565b80519182159184831561530f575b5050509050156152a55750565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b91938180945001031261335457820151908115158203613351575080388084615298565b1561533a57565b606460405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152fd5b919290156153df5750815115615392575090565b3b1561539b5790565b606460405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b8251909150156153f25750805190602001fd5b6104039060405191829162461bcd60e51b8352602060048401526024830190612b8e565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361544857565b60046040517fa1c0d6e5000000000000000000000000000000000000000000000000000000008152fd5b916001600160a01b03604051927fa9059cbb000000000000000000000000000000000000000000000000000000006020850152166024830152604482015260448152608081019181831067ffffffffffffffff841117612042576152289260405261522a565b612e0f906154e581614852565b90600052600b60205260026040600020015460801c906134d1565b91908110156136a85760051b0190565b92919061551c8461349a565b6104175761554084600052600b6020526001600160a01b0360406000205416331490565b1580615606575b6103e45761556b84600052600b6020526001600160a01b0360406000205416331490565b806155e2575b6155b5576001600160a01b03811615610369576001600160801b0382161561559d576152289293615631565b6024846040519063d2aabcd960e01b82526004820152fd5b836001600160a01b0360649260405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b508360005260056020526001600160a01b0380604060002054169082161415615571565b506156108461584b565b15615547565b9190916001600160801b0380809416911601918211611c1757565b929190926001600160801b0380615647836154d8565b16928181169380851161580e5750600095838752602092600b84526156ac61567a6040946002868c20015460801c615616565b868a52600b86526002858b200190836fffffffffffffffffffffffffffffffff1983549260801b16911617815561342f565b906156c78186840151169282868183511692015116906134d1565b1611156157df575b838752600b83526001600160a01b03916156f28683856001858d20015416615472565b8488526005845282818920541680331415806157d5575b61573e575b507ffa54f9f9bdcdd28778cbb9f78490df6691cc4e2729588e10f4cc0a26c465686a9495969750519586521693a3565b803b156157d15797807ffa54f9f9bdcdd28778cbb9f78490df6691cc4e2729588e10f4cc0a26c465686a9697989960848451809481937f13375c3b0000000000000000000000000000000000000000000000000000000083528c600484015233602484015289891660448401528d60648401525af16157c2575b889796955061570e565b6157cb90612d3c565b386157b8565b8880fd5b50803b1515615709565b838752600b835281872060018101600160a01b60ff60a01b1982541617905560ff60f01b1981541690556156cf565b8360649186604051927fa1fb2bbc000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b60009080825260056020526001600160a01b038060408420541692833314938415615890575b5050821561587e57505090565b90915061588b3392612e12565b161490565b60ff9294509060409181526008602052818120338252602052205416913880615871565b9092916158bf613410565b936001600160801b03928381169182156159cb5767016345785d8a00008082116159945780851161595d5750615909856158fa819386613bbd565b16946020890195865284613bbd565b169184615920604089019480865282875116615616565b16101561594757615939849182615942955116906134d1565b915116906134d1565b168252565b634e487b7160e01b600052600160045260246000fd5b84604491604051917f4fea5c1a00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b60449250604051917f47152d6700000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b505050505090506040516159de81612cca565b6000815260006020820152600060408201529056fef8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7"; bytes public constant BYTECODE_LOCKUP_LINEAR = - hex"60a034620003e757601f196001600160401b03601f620048b23881900382810185168601919084831187841017620003ec57808792606094604052833981010312620003e75783516001600160a01b03928382169291839003620003e7576020918287015196858816809803620003e75760400151948516809503620003e7576200008962000402565b90601c82527f5361626c696572205632204c6f636b7570204c696e656172204e46540000000084830152620000bd62000402565b601181527029a0a116ab1916a627a1a5aaa816a624a760791b8582015230608052600080546001600160a01b031990811688178255600180548216909b178b5596817fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a38351858111620003d35760039485548c81811c91168015620003c8575b89821014620003b45790818684931162000361575b508890868311600114620002f8578492620002ec575b505060001982871b1c1916908b1b1784555b8151948511620002d8576004958654998b8b811c9b168015620002cd575b828c1014620002ba57848b1162000271575b869798999a50819487116001146200020a57505093620001fe575b505082871b92600019911b1c19161790555b600a541617600a5560095560405161448f908162000423823960805181613f9e0152f35b015191503880620001c8565b8883528183208c9890969594939116915b8282106200025757505085116200023c575b50505050811b019055620001da565b01519060f884600019921b161c19169055388080806200022d565b8484015187558c989096019593840193908101906200021b565b87835281832085880160051c81019b838910620002af575b860160051c019a8c905b8c8110620002a3575050620001ad565b848155018c9062000293565b909b508b9062000289565b634e487b7160e01b835260228852602483fd5b9a607f169a6200019b565b634e487b7160e01b81526041600452602490fd5b0151905038806200016b565b908c8e9416918886528a862092865b8c82821062000341575050841162000328575b505050811b0184556200017d565b015160001983891b60f8161c191690553880806200031a565b91929395968291958786015181550195019301908f959493929162000307565b9091508684528884208680850160051c8201928b8610620003aa575b918f91869594930160051c01915b8281106200039b57505062000155565b8681558594508f91016200038b565b925081926200037d565b634e487b7160e01b84526022600452602484fd5b90607f169062000140565b634e487b7160e01b82526041600452602482fd5b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620003ec5760405256fe608080604052600436101561001357600080fd5b600090813560e01c90816301ffc9a71461296e5750806306fdde03146128ac578063081812fc1461288d578063095ea7b3146126fe5780631400ecec1461265e5780631b4103a9146125435780631c1cdd4c146124de5780631e99d569146124c057806323b872dd1461249657806339a73c031461245557806340e58ee51461207b578063425d30dd1461205c57806342842e0e1461200c57806342966c6814611f1a5780634857501f14611e905780634869e12d14611e555780634bc78b7314611d405780635fe3b56714611d195780636352211e14611ce95780636d0cee7514611c9357806370a0823114611bea57806375829def14611b57578063780a82c814611b075780637cad6cd114611a365780637de6b1db1461184b5780638659c27014611413578063894e9a0d146111e25780638bad38dd146111655780638f69b993146110c95780639067b6771461107657806395d89b4114610f69578063a22cb46514610e98578063a2ffb89714610c43578063a6202bf214610b3d578063a80fc07114610aeb578063ad35efd414610a89578063b88d4fde146109f8578063b8a3be66146109c3578063b971302a14610974578063bc063e1a14610951578063bc2be1be14610901578063c156a11d14610834578063c87b56dd146106f6578063cc364f481461064a578063d4dbd20b146105f8578063d511609f146105ac578063d975dfed14610560578063e985e9c51461050b578063ea5ead19146104e5578063eac8f5b81461047c578063f590c17614610453578063f851a4401461042d5763fdd46d601461026857600080fd5b3461042a57606036600319011261042a57600435610284612a9d565b61028c612bdc565b90610295613f94565b61029e836131c3565b610412576102c283600052600b6020526001600160a01b0360406000205416331490565b1580610402575b6103df576102ed83600052600b6020526001600160a01b0360406000205416331490565b806103bd575b610390576001600160a01b03811615610366576001600160801b0382161561034e57916103446020927ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce794836140bf565b604051908152a180f35b6024836040519063d2aabcd960e01b82526004820152fd5b60046040517fc61a0e9e000000000000000000000000000000000000000000000000000000008152fd5b826001600160a01b0360649260405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b5082845260056020526001600160a01b038060408620541690821614156102f3565b60405163216caf0d60e01b815260048101849052336024820152604490fd5b0390fd5b5061040c836142e7565b156102c9565b60248360405190634a5541ef60e01b82526004820152fd5b80fd5b503461042a578060031936011261042a576001600160a01b036020915416604051908152f35b503461042a57602036600319011261042a576020610472600435613229565b6040519015158152f35b503461042a57602036600319011261042a57600435808252600b60205260ff600160408420015460d01c16156104ce5760016040836001600160a01b039360209552600b855220015416604051908152f35b6024906040519062b8e7e760e51b82526004820152fd5b503461042a57604036600319011261042a57600435610502612a9d565b61028c82614056565b503461042a57604036600319011261042a57610525612a87565b604061052f612a9d565b926001600160a01b0380931681526008602052209116600052602052602060ff604060002054166040519015158152f35b503461042a57602036600319011261042a5760ff6001604060043593848152600b60205220015460d01c16156104ce5761059b602091614056565b6001600160801b0360405191168152f35b503461042a57602036600319011261042a57600435808252600b60205260ff600160408420015460d01c16156104ce5760408260029260209452600b845220015460801c604051908152f35b503461042a57602036600319011261042a57600435808252600b60205260ff600160408420015460d01c16156104ce5760036040836001600160801b039360209552600b855220015416604051908152f35b503461042a57602036600319011261042a57600435610667613170565b50808252600b60205260ff600160408420015460d01c16156104ce578160409160609352600b60205220805490600164ffffffffff91015481604051936106ad85612b49565b818160a01c16855260c81c16602084015260a01c1660408201526106f460405180926040908164ffffffffff91828151168552826020820151166020860152015116910152565bf35b503461042a576020806003193601126108205760043561073461072f8260005260056020526001600160a01b0360406000205416151590565b612bf2565b826001600160a01b03600a5416916044604051809481937fe9dc637500000000000000000000000000000000000000000000000000000000835230600484015260248301525afa9283156108285780936107a3575b505061079f604051928284938452830190612a62565b0390f35b909192503d8082843e6107b68184612b9e565b82019183818403126108205780519067ffffffffffffffff8211610824570182601f82011215610820578051916107ec83612bc0565b936107fa6040519586612b9e565b83855285848401011161042a57509061081891848085019101612a3f565b903880610789565b5080fd5b8280fd5b604051903d90823e3d90fd5b503461042a57604036600319011261042a57600435610851612a9d565b610859613f94565b818352600b60205260ff600160408520015460d01c16156108ea5781835260056020526001600160a01b036040842054168033036103df5791610344816020937ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7956108c483614056565b6001600160801b0381166108d9575b50612e85565b6108e49082856140bf565b386108d3565b6024826040519062b8e7e760e51b82526004820152fd5b503461042a57602036600319011261042a57600435808252600b60205260ff600160408420015460d01c16156104ce5760408264ffffffffff9260209452600b8452205460a01c16604051908152f35b503461042a578060031936011261042a57602060405167016345785d8a00008152f35b503461042a57602036600319011261042a57600435808252600b60205260ff600160408420015460d01c16156104ce576040826001600160a01b039260209452600b8452205416604051908152f35b503461042a57602036600319011261042a5760ff600160406020936004358152600b855220015460d01c166040519015158152f35b503461042a57608036600319011261042a57610a12612a87565b610a1a612a9d565b906064359067ffffffffffffffff8211610a855736602383011215610a855781600401359284610a4985612bc0565b93610a576040519586612b9e565b85855236602487830101116108205785610a8296602460209301838801378501015260443591612d10565b80f35b8380fd5b503461042a57602036600319011261042a57600435808252600b60205260ff600160408420015460d01c16156104ce57610ac29061349f565b604051906005811015610ad757602092508152f35b602483634e487b7160e01b81526021600452fd5b503461042a57602036600319011261042a57600435808252600b60205260ff600160408420015460d01c16156104ce5760026040836001600160801b039360209552600b855220015416604051908152f35b503461042a57602036600319011261042a57610b57612a87565b6001600160a01b0380835416338103610c1a575081169081835260026020526001600160801b03604084205416908115610be95781610bba918486526002602052604086206fffffffffffffffffffffffffffffffff1981541690553390613ff0565b6040519081527fca7a4a65a94ed2f37538814e00e1cd4c41a78261561e3f3794592f11409cf5af60203392a380f35b602483604051907f8410168c0000000000000000000000000000000000000000000000000000000082526004820152fd5b6040516331b339a960e21b81526001600160a01b03919091166004820152336024820152604490fd5b503461042a57606036600319011261042a5767ffffffffffffffff60043581811161082457610c76903690600401612ae8565b91610c7f612a9d565b90604435908111610e9457610c98903690600401612ae8565b9093610ca2613f94565b818103610e5e57855b818110610cb6578680f35b610cc181838761407e565b35610ccd82858961407e565b356001600160801b0381168103610e5957610ce6613f94565b610cef826131c3565b610e4157610d1382600052600b6020526001600160a01b0360406000205416331490565b1580610e31575b610e1257610d3e82600052600b6020526001600160a01b0360406000205416331490565b80610dea575b610dbd576001600160a01b03861615610366576001600160801b03811615610da557602082610d987ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce79389600197966140bf565b604051908152a101610cab565b6024826040519063d2aabcd960e01b82526004820152fd5b6064826001600160a01b038860405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b5081895260056020526001600160a01b0360408a2054166001600160a01b0387161415610d44565b60405163216caf0d60e01b815260048101839052336024820152604490fd5b50610e3b826142e7565b15610d1a565b60248260405190634a5541ef60e01b82526004820152fd5b600080fd5b604491604051917faec9344000000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b8480fd5b503461042a57604036600319011261042a57610eb2612a87565b60243590811515809203610e59576001600160a01b031690813314610f255733835260086020526040832082600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a380f35b606460405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152fd5b503461042a578060031936011261042a57604051908060045491600183811c9281851694851561106c575b602095868610811461105857858852879493929187908215611036575050600114610fdc575b5050610fc892500383612b9e565b61079f604051928284938452830190612a62565b90859250600482527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5b85831061101e575050610fc893508201013880610fba565b80548389018501528794508693909201918101611006565b9250935050610fc894915060ff191682840152151560051b8201013880610fba565b602483634e487b7160e01b81526022600452fd5b93607f1693610f94565b503461042a57602036600319011261042a57600435808252600b60205260ff600160408420015460d01c16156104ce57600160408364ffffffffff9360209552600b855220015460a01c16604051908152f35b503461042a57602036600319011261042a57600435808252600b60205260ff600160408420015460d01c16156104ce576111029061349f565b90600582101590816111435760028314918215611157575b821561112e575b6020836040519015158152f35b90915061114357506004602091143880611121565b80634e487b7160e01b602492526021600452fd5b50600383149150600061111a565b503461042a57602036600319011261042a576004356001600160a01b03908181168091036108245781835416338103610c1a575060015491816001600160a01b03198416176001556040519216825260208201527fdcb09aef4bf01068924ccce937981cbe59d25ba08380cf941aaaea4e4bd3960d60403392a280f35b503461042a57602036600319011261042a5760405161120081612b65565b8181528160208201528160408201528160608201528160808201528160a08201528160c08201528160e08201528161010082015261012061123f613170565b9101526004358152600b60205260ff600160408320015460d01c16156113fb576004358152600b6020526040812061130a60026040519261127f84612b65565b80546001600160a01b038116855264ffffffffff8160a01c16602086015264ffffffffff8160c81c16604086015260ff8160f01c161515606086015260f81c1515608085015260ff60018201546001600160a01b03811660a087015264ffffffffff8160a01c1660c0870152818160c81c16151560e087015260d01c1615156101008501520161318f565b61012082015261131b60043561349f565b6005811015610ad75791600261018093146113f0575b506106f4610120604051926001600160a01b03815116845264ffffffffff602082015116602085015264ffffffffff60408201511660408501526060810151151560608501526080810151151560808501526001600160a01b0360a08201511660a085015264ffffffffff60c08201511660c085015260e0810151151560e085015261010081015115156101008501520151610120830190604090816001600160801b0391828151168552826020820151166020860152015116910152565b606082015238611331565b602460405162b8e7e760e51b81526004356004820152fd5b503461042a576020908160031936011261042a5760043567ffffffffffffffff81116108205761144883913690600401612ae8565b90611451613f94565b83915b80831061145f578480f35b61146e8382849795969761407e565b3593611478613f94565b611481856131c3565b1561149e5760248560405190634a5541ef60e01b82526004820152fd5b909192936114ab81613229565b611833576114cf81600052600b6020526001600160a01b0360406000205416331490565b1580611815575b6117f5576114e38161325a565b818652600b908188526114fb6002604089200161318f565b6001600160801b03918282511683821610156117dd57848952838a5260ff60408a205460f01c16156117c55792828261154d86838e6115438f9a829a60409e9d9a51166131fa565b94015116906131fa565b848752838652888720916115dc835494600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff871617855560038185169586156117ab575b0190831699818b6fffffffffffffffffffffffffffffffff19819454161790556001600160a01b0380971696879160058c52818f82205416998c5260019e8f9120015416613ff0565b3384036116d757843b611650575b50507f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd260407ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce79786935b825191825288820152a4604051908152a1019190939293611454565b90919293809596503b156116d3576040516372eba20360e01b8152600481018790526001600160a01b03851660248201526001600160801b039182166044820152911660648201528b94939291908b90818160848183895af1156115ea576116be9192939597949650612b35565b6116cf57918a939194928a8d6115ea565b8980fd5b8b80fd5b833b61172c575b50507f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd260407ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7978693611634565b90919280949596503b156116d3576040516372eba20360e01b8152600481018790526001600160a01b03861660248201526001600160801b039182166044820152911660648201528b94939291908b90818160848183885af1156116de5761179a9192939597949650612b35565b6116cf57918a939194928a8d6116de565b60018101600160c81b60ff60c81b19825416179055611593565b602485604051906339c6dc7360e21b82526004820152fd5b602485604051906322cad1af60e11b82526004820152fd5b60405163216caf0d60e01b81526004810191909152336024820152604490fd5b50808552600586526001600160a01b036040862054163314156114d6565b6024906040519063fe19f19f60e01b82526004820152fd5b503461042a57602080600319360112610820576004359061186a613f94565b818352600b815260ff600160408520015460d01c16156108ea5761188d8261349f565b6005811015611a2257600481036118b65760248360405190634a5541ef60e01b82526004820152fd5b600381036118d6576024836040519063fe19f19f60e01b82526004820152fd5b600214611a0a576118fd82600052600b6020526001600160a01b0360406000205416331490565b15610e1257818352600b815260ff604084205460f01c16156119f257818352600b81526040832060ff60f01b19815416905560058152826001600160a01b03604082205416803b61199b575b50506040517ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce792807f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f8680a28152a180f35b803b15610820578180916024604051809481937f341a0bd90000000000000000000000000000000000000000000000000000000083528960048401525af115611949576119e790612b35565b610824578238611949565b602482604051906339c6dc7360e21b82526004820152fd5b602482604051906322cad1af60e11b82526004820152fd5b602484634e487b7160e01b81526021600452fd5b503461042a57602036600319011261042a576004356001600160a01b03908181168091036108245781835416338103610c1a5750600a5491816001600160a01b0319841617600a556040519216825260208201527fa2548bd4b805e907c1558a47b5858324fe8bb4a2e1ddfca647eecbf65610eebc60403392a26009546000198101908111611af35760407f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c91815190600182526020820152a180f35b602482634e487b7160e01b81526011600452fd5b503461042a57602036600319011261042a57600435808252600b60205260ff600160408420015460d01c16156104ce5760408264ffffffffff9260209452600b8452205460c81c16604051908152f35b503461042a57602036600319011261042a57611b71612a87565b9080546001600160a01b0380821693338503611bc3576001600160a01b03199394501691829116178255337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808380a380f35b6040516331b339a960e21b81526001600160a01b0386166004820152336024820152604490fd5b503461042a57602036600319011261042a576001600160a01b03611c0c612a87565b168015611c29578160409160209352600683522054604051908152f35b608460405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e657200000000000000000000000000000000000000000000006064820152fd5b503461042a57602036600319011261042a576001600160a01b036040602092600435611cd861072f8260005260056020526001600160a01b0360406000205416151590565b815260058452205416604051908152f35b503461042a57602036600319011261042a576020611d08600435612c3d565b6001600160a01b0360405191168152f35b503461042a578060031936011261042a5760206001600160a01b0360015416604051908152f35b503461042a5761014036600319011261042a57611d5b613f94565b60405190611d6882612b19565b611d70612a87565b8252611d7a612a9d565b6020830152611d87612bdc565b60408301526001600160a01b03906064358281168103610e595760608401526084358015158103610e5957608084015260603660a319011261042a5750604051611dd081612b49565b64ffffffffff60a4358181168103610e5957825260c4358181168103610e5957602083015260e4359081168103610e5957604082015260a0830152604061010319360112610e595760405191611e2583612b82565b610104359182168203610e595782611e4d9260209452610124358482015260c08201526135a1565b604051908152f35b503461042a57602036600319011261042a5760ff6001604060043593848152600b60205220015460d01c16156104ce5761059b602091613526565b503461042a57602036600319011261042a5760043590818152600b60205260ff600160408320015460d01c16156108ea5780611ecb8361349f565b926005841015611f0657600260209403611eec575b50506040519015158152f35b8152600b8352604090205460f01c60ff1690503880611ee0565b602482634e487b7160e01b81526021600452fd5b503461042a57602036600319011261042a57600435611f37613f94565b611f40816131c3565b15611fdb57611f4e816142e7565b156117f557611f5c81612c3d565b5081611f6782612c3d565b82825260076020526001600160a01b0360408320916001600160a01b031992838154169055169081835260066020526040832060001981540190558383526005602052604083209081541690557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a480f35b602490604051907f817cd6390000000000000000000000000000000000000000000000000000000082526004820152fd5b503461042a5761201b36612ab3565b60405191602083019383851067ffffffffffffffff86111761204657610a8294604052858452612d10565b634e487b7160e01b600052604160045260246000fd5b503461042a57602036600319011261042a5760206104726004356131c3565b503461042a57602080600319360112610820576004359061209a613f94565b6120a3826131c3565b156120c05760248260405190634a5541ef60e01b82526004820152fd5b6120c982613229565b61243d576120ed82600052600b6020526001600160a01b0360406000205416331490565b158061241f575b610e12576121018261325a565b91808452600b82526121186002604086200161318f565b6001600160801b039384825116858216101561240757828652600b845260ff604087205460f01c16156123ef578161215c82878761154360409683839951166131fa565b848852600b8452828820916121eb835498600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8b161785558a60038286169687156123d5575b019184169a828c6fffffffffffffffffffffffffffffffff198195541617905560016001600160a01b0380921698899360058c52600b8483832054169c5220015416613ff0565b3384036122c857908891853b61225b575b5050507f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd260407ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce79786935b825191825288820152a4604051908152a180f35b853b15610824576040516372eba20360e01b8152600481018890526001600160a01b03861660248201526001600160801b03918216604482015291166064820152818160848183895af16122b0575b806121fc565b6122b990612b35565b6122c45786386122aa565b8680fd5b83989792983b612322575b50507f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd2604085927ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce79899612247565b833b156123d1576040516372eba20360e01b8152600481018790526001600160a01b03861660248201526001600160801b03918216604482015291166064820152868160848183875af1612377575b806122d3565b604085927ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7986123c77f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd294612b35565b9850925050612371565b8780fd5b60018101600160c81b60ff60c81b198254161790556121a4565b602483604051906339c6dc7360e21b82526004820152fd5b602483604051906322cad1af60e11b82526004820152fd5b50818352600581526001600160a01b036040842054163314156120f4565b6024826040519063fe19f19f60e01b82526004820152fd5b503461042a57602036600319011261042a576001600160801b0360406020926001600160a01b03612484612a87565b16815260028452205416604051908152f35b503461042a57610a826124a836612ab3565b916124bb6124b68433612da6565b612c9f565b612e85565b503461042a578060031936011261042a576020600954604051908152f35b503461042a57602036600319011261042a57600435808252600b60205260ff600160408420015460d01c16156104ce576125179061349f565b9060058210156111435760208215838115612538575b506040519015158152f35b60019150148261252d565b503461042a5761012036600319011261042a5761255e613f94565b612566613170565b9064ffffffffff80421680845260a4358281168103610a855781018216602085015260c435908183168203610a855701166040830152606435916001600160a01b039081841680940361082457608435801515809103610a855760243594838616809603610e94576004359584871680970361265a57604435906001600160801b0382168092036122c457604051976125fe89612b19565b8852602088015260408701526060860152608085015260a0840152604060e319360112610820576040519161263283612b82565b60e435918216820361042a576020611e4d8585858152610104358482015260c08201526135a1565b8580fd5b503461042a57602036600319011261042a5760043590818152600b60205260ff600160408320015460d01c16156108ea57602091604082828152600b85522060ff815460f01c16806126ec575b6126c3575b50506001600160801b0360405191168152f35b6126e592506001600160801b0360026126df920154169161325a565b906131fa565b38806126b0565b5060ff600182015460c81c16156126ab565b503461042a57604036600319011261042a57612718612a87565b602435906001600160a01b03808061272f85612c3d565b1692169180831461282357803314908115612802575b501561279857828452600760205260408420826001600160a01b031982541617905561277083612c3d565b167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258480a480f35b608460405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152fd5b9050845260086020526040842033855260205260ff60408520541638612745565b608460405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152fd5b503461042a57602036600319011261042a576020611d08600435612c62565b503461042a578060031936011261042a57604051908060035491600183811c92818516948515612964575b60209586861081146110585785885287949392918790821561103657505060011461290a575050610fc892500383612b9e565b90859250600382527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b85831061294c575050610fc893508201013880610fba565b80548389018501528794508693909201918101612934565b93607f16936128d7565b905034610820576020366003190112610820576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361082457602092507f80ac58cd000000000000000000000000000000000000000000000000000000008114908115612a15575b81156129eb575b5015158152f35b7f01ffc9a700000000000000000000000000000000000000000000000000000000915014386129e4565b7f5b5e139f00000000000000000000000000000000000000000000000000000000811491506129dd565b60005b838110612a525750506000910152565b8181015183820152602001612a42565b90602091612a7b81518092818552858086019101612a3f565b601f01601f1916010190565b600435906001600160a01b0382168203610e5957565b602435906001600160a01b0382168203610e5957565b6060906003190112610e59576001600160a01b03906004358281168103610e5957916024359081168103610e59579060443590565b9181601f84011215610e595782359167ffffffffffffffff8311610e59576020808501948460051b010111610e5957565b60e0810190811067ffffffffffffffff82111761204657604052565b67ffffffffffffffff811161204657604052565b6060810190811067ffffffffffffffff82111761204657604052565b610140810190811067ffffffffffffffff82111761204657604052565b6040810190811067ffffffffffffffff82111761204657604052565b90601f8019910116810190811067ffffffffffffffff82111761204657604052565b67ffffffffffffffff811161204657601f01601f191660200190565b604435906001600160801b0382168203610e5957565b15612bf957565b606460405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152fd5b60005260056020526001600160a01b0360406000205416612c5f811515612bf2565b90565b612c8561072f8260005260056020526001600160a01b0360406000205416151590565b60005260076020526001600160a01b036040600020541690565b15612ca657565b608460405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f766564000000000000000000000000000000000000006064820152fd5b90612d34939291612d246124b68433612da6565b612d2f838383612e85565b612fdc565b15612d3b57565b60405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b906001600160a01b038080612dba84612c3d565b16931691838314938415612ded575b508315612dd7575b50505090565b612de391929350612c62565b1614388080612dd1565b909350600052600860205260406000208260005260205260ff604060002054169238612dc9565b15612e1b57565b608460405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152fd5b90612ead91612e9384612c3d565b916001600160a01b03938493848094169485911614612e14565b16918215612f435781612eca91612ec386612c3d565b1614612e14565b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60008481526007602052604081206001600160a01b03199081815416905583825260066020526040822060001981540190558482526040822060018154019055858252600560205284604083209182541617905580a4565b608460405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152fd5b3d15612fd7573d90612fbd82612bc0565b91612fcb6040519384612b9e565b82523d6000602084013e565b606090565b91926000929190813b156131665760209161304c91856040519586809581947f150b7a02000000000000000000000000000000000000000000000000000000009b8c84523360048501526001600160a01b0380951660248501526044840152608060648401526084830190612a62565b0393165af190829082613106575b50506130e057613068612fac565b805190816130db5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000161490565b909192506020813d821161315e575b8161312260209383612b9e565b810103126108205751907fffffffff000000000000000000000000000000000000000000000000000000008216820361042a575090388061305a565b3d9150613115565b5050505050600190565b6040519061317d82612b49565b60006040838281528260208201520152565b9060405161319c81612b49565b6040819360018154916001600160801b0392838116865260801c6020860152015416910152565b80600052600b60205260ff60016040600020015460d01c16156104ce57600052600b60205260ff60016040600020015460c81c1690565b6001600160801b03918216908216039190821161321357565b634e487b7160e01b600052601160045260246000fd5b80600052600b60205260ff60016040600020015460d01c16156104ce57600052600b60205260406000205460f81c90565b600090808252600b6020526040822091825464ffffffffff42818360c81c16116133085780600186015460a01c1691824210156132f2576132a79394955060a01c16809103904203613310565b90828152600b6020526001600160801b03926132cd8460026040852001541680946133f0565b9283116132da5750501690565b60029350604092508152600b60205220015460801c90565b505050505060026001600160801b039101541690565b505091505090565b670de0b6b3a76400009160001983830992808302928380861095039480860395146133cc578285101561339057908291096001821901821680920460028082600302188083028203028083028203028083028203028083028203028083028203028092029003029360018380600003040190848311900302920304170290565b82606492604051927f63a05778000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b5050809250156133da570490565b634e487b7160e01b600052601260045260246000fd5b9091906000198382098382029182808310920391808303921461348e57670de0b6b3a7640000908183101561345757947faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066994950990828211900360ee1b910360121c170290565b60449086604051917f5173648d00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050670de0b6b3a764000090049150565b80600052600b602052604060002060ff600182015460c81c166000146134c6575050600490565b805460f81c61351f575460a01c64ffffffffff164210613519576134e98161325a565b90600052600b6020526001600160801b03806002604060002001541691161060001461351457600190565b600290565b50600090565b5050600390565b80600052600b60205261353f600260406000200161318f565b81600052600b602052604060002060ff600182015460c81c1660001461357257506001600160801b039150602001511690565b5460f81c6135845750612c5f9061325a565b612c5f91506001600160801b0360408183511692015116906131fa565b906001600160a01b036001541660206001600160a01b036060850151166024604051809481937fdcf844a700000000000000000000000000000000000000000000000000000000835260048301525afa8015613d2b57600090613cf7575b61362291506001600160801b0360408501511690602060c0860151015191614350565b916001600160801b0383511660a08201519015613ccd5764ffffffffff815116602082019064ffffffffff82511690818111613c8d57505064ffffffffff604091511691019064ffffffffff8251169081811015613c4d57505064ffffffffff8042169151169081811015613c0d575050600954926001600160801b03815116604051906136af82612b49565b815260006020820152600060408201526001600160a01b036060840151169060a08401519164ffffffffff6020840151169064ffffffffff60408501511691608087015115159064ffffffffff6001600160a01b038951169651166040519661371788612b65565b87526020870152604086015260608501526000608085015260a084015260c0830152600060e0830152600161010083015261012082015284600052600b60205260406000206001600160a01b038251166001600160a01b03198254161781556137a864ffffffffff602084015116829064ffffffffff60a01b1964ffffffffff60a01b83549260a01b169116179055565b604082015181547eff0000000000000000000000000000000000000000000000000000000000006060850151151560f01b169078ffffffffffffffffffffffffffffffffffffffffffffffffff7dffffffffff000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000006080880151151560f81b169460c81b1691161717178155600181016001600160a01b0360a0840151166001600160a01b031982541617815561389f64ffffffffff60c085015116829064ffffffffff60a01b1964ffffffffff60a01b83549260a01b169116179055565b60e083015181546101008501517fffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffff90911691151560c81b79ff00000000000000000000000000000000000000000000000000169190911790151560d01b7aff000000000000000000000000000000000000000000000000000016179055610120909101518051602082015160801b6fffffffffffffffffffffffffffffffff199081166001600160801b03928316176002850155926040906003019201511682825416179055600185016009556001600160a01b0360608401511660005260026020526001600160801b0380604060002054168160208501511601166001600160a01b036060850151166000526040600020918254161790556001600160a01b036020830151168015613bc95784906139f76139f18360005260056020526001600160a01b0360406000205416151590565b15613eb1565b613a1a6139f18360005260056020526001600160a01b0360406000205416151590565b8060005260066020526040600020600181540190558160005260056020526040600020816001600160a01b031982541617905560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4613aa36001600160a01b036060840151166001600160801b03808451168160208601511601169030903390613d37565b6001600160801b0360408201511680613b9a575b506001600160a01b038251167f6a14b1f86e996f59f3a5a72afa0f99cc59199944c80ad4f7260c9b3e3a07b1106101406001600160a01b03602086015116936001600160a01b0360608701511695613b9160808201511515916001600160a01b0360c060a0830151920151511692613b61604051958d87523360208801526040870190604090816001600160801b0391828151168552826020820151166020860152015116910152565b60a0850152805164ffffffffff90811660c08601526020820151811660e086015260409091015116610100840152565b610120820152a4565b613bc3906001600160a01b036060850151166001600160a01b0360c08601515116903390613d37565b38613ab7565b606460405162461bcd60e51b815260206004820152602060248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152fd5b6040517f210aec0e00000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b6040517f9fee269100000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b6040517f4c23297000000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b60046040517f6095d3bc000000000000000000000000000000000000000000000000000000008152fd5b6020823d602011613d23575b81613d1060209383612b9e565b8101031261042a575061362290516135ff565b3d9150613d03565b6040513d6000823e3d90fd5b9290604051927f23b872dd0000000000000000000000000000000000000000000000000000000060208501526001600160a01b03809216602485015216604483015260648201526064815260a081019181831067ffffffffffffffff84111761204657613da692604052613da8565b565b6001600160a01b031690613e08604051613dc181612b82565b6020938482527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564858301526000808587829751910182855af1613e02612fac565b91613efc565b805191821591848315613e8d575b505050905015613e235750565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b9193818094500103126108205782015190811515820361042a575080388084613e16565b15613eb857565b606460405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152fd5b91929015613f5d5750815115613f10575090565b3b15613f195790565b606460405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b825190915015613f705750805190602001fd5b6103fe9060405191829162461bcd60e51b8352602060048401526024830190612a62565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003613fc657565b60046040517fa1c0d6e5000000000000000000000000000000000000000000000000000000008152fd5b916001600160a01b03604051927fa9059cbb000000000000000000000000000000000000000000000000000000006020850152166024830152604482015260448152608081019181831067ffffffffffffffff84111761204657613da692604052613da8565b612c5f9061406381613526565b90600052600b60205260026040600020015460801c906131fa565b919081101561408e5760051b0190565b634e487b7160e01b600052603260045260246000fd5b9190916001600160801b038080941691160191821161321357565b929190926001600160801b03806140d583614056565b1692818116938085116142aa5750600095838752602092600b84526141486141086040946002868c20015460801c6140a4565b868a52600b86526141436002868c20019182906001600160801b036fffffffffffffffffffffffffffffffff1983549260801b169116179055565b61318f565b906141638186840151169282868183511692015116906131fa565b16111561427b575b838752600b83526001600160a01b039161418e8683856001858d20015416613ff0565b848852600584528281892054168033141580614271575b6141da575b507ffa54f9f9bdcdd28778cbb9f78490df6691cc4e2729588e10f4cc0a26c465686a9495969750519586521693a3565b803b1561426d5797807ffa54f9f9bdcdd28778cbb9f78490df6691cc4e2729588e10f4cc0a26c465686a9697989960848451809481937f13375c3b0000000000000000000000000000000000000000000000000000000083528c600484015233602484015289891660448401528d60648401525af161425e575b88979695506141aa565b61426790612b35565b38614254565b8880fd5b50803b15156141a5565b838752600b835281872060018101600160c81b60ff60c81b1982541617905560ff60f01b19815416905561416b565b8360649186604051927fa1fb2bbc000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b60009080825260056020526001600160a01b03806040842054169283331493841561432c575b5050821561431a57505090565b9091506143273392612c62565b161490565b60ff929450906040918152600860205281812033825260205220541691388061430d565b90929161435b613170565b936001600160801b03928381169182156144675767016345785d8a0000808211614430578085116143f957506143a5856143968193866133f0565b169460208901958652846133f0565b1691846143bc6040890194808652828751166140a4565b1610156143e3576143d58491826143de955116906131fa565b915116906131fa565b168252565b634e487b7160e01b600052600160045260246000fd5b84604491604051917f4fea5c1a00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b60449250604051917f47152d6700000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050505050905060405161447a81612b49565b6000815260006020820152600060408201529056"; + hex"60a034620003e757601f196001600160401b03601f62004a753881900382810185168601919084831187841017620003ec57808792606094604052833981010312620003e75783516001600160a01b03928382169291839003620003e7576020918287015196858816809803620003e75760400151948516809503620003e7576200008962000402565b90601c82527f5361626c696572205632204c6f636b7570204c696e656172204e46540000000084830152620000bd62000402565b601181527029a0a116ab1916a627a1a5aaa816a624a760791b8582015230608052600080546001600160a01b031990811688178255600180548216909b178b5596817fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a38351858111620003d35760039485548c81811c91168015620003c8575b89821014620003b45790818684931162000361575b508890868311600114620002f8578492620002ec575b505060001982871b1c1916908b1b1784555b8151948511620002d8576004958654998b8b811c9b168015620002cd575b828c1014620002ba57848b1162000271575b869798999a50819487116001146200020a57505093620001fe575b505082871b92600019911b1c19161790555b600a541617600a556009556040516146529081620004238239608051816141610152f35b015191503880620001c8565b8883528183208c9890969594939116915b8282106200025757505085116200023c575b50505050811b019055620001da565b01519060f884600019921b161c19169055388080806200022d565b8484015187558c989096019593840193908101906200021b565b87835281832085880160051c81019b838910620002af575b860160051c019a8c905b8c8110620002a3575050620001ad565b848155018c9062000293565b909b508b9062000289565b634e487b7160e01b835260228852602483fd5b9a607f169a6200019b565b634e487b7160e01b81526041600452602490fd5b0151905038806200016b565b908c8e9416918886528a862092865b8c82821062000341575050841162000328575b505050811b0184556200017d565b015160001983891b60f8161c191690553880806200031a565b91929395968291958786015181550195019301908f959493929162000307565b9091508684528884208680850160051c8201928b8610620003aa575b918f91869594930160051c01915b8281106200039b57505062000155565b8681558594508f91016200038b565b925081926200037d565b634e487b7160e01b84526022600452602484fd5b90607f169062000140565b634e487b7160e01b82526041600452602482fd5b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620003ec5760405256fe608080604052600436101561001357600080fd5b600090813560e01c90816301ffc9a714612a2c5750806306fdde031461296a578063081812fc1461294b578063095ea7b3146127bc5780631400ecec1461271c5780631c1cdd4c146126b75780631e99d5691461269957806323b872dd1461266f57806339a73c031461262e57806340e58ee514612254578063425d30dd1461223557806342842e0e146121e557806342966c68146120a55780634857501f1461201b5780634869e12d14611fe05780635fe3b56714611fb95780636352211e14611f895780636d0cee7514611f3357806370a0823114611e8a57806375829def14611df7578063780a82c814611da75780637cad6cd114611cd65780637de6b1db14611aeb5780638659c270146116b3578063894e9a0d1461145f5780638bad38dd146113e25780638f69b993146113465780639067b677146112f357806395d89b41146111e657806396ce1431146110c7578063a22cb46514610ff6578063a2ffb89714610da6578063a6202bf214610ca0578063a80fc07114610c4e578063ab167ccc14610b15578063ad35efd414610ab3578063b256456914610a94578063b88d4fde14610a03578063b8a3be66146109ce578063b971302a1461097f578063bc063e1a1461095c578063bc2be1be1461090c578063c156a11d1461083f578063c87b56dd14610701578063cc364f4814610655578063d4dbd20b14610603578063d511609f146105b7578063d975dfed1461056b578063e985e9c514610516578063ea5ead19146104f0578063eac8f5b814610487578063f590c1761461045e578063f851a440146104385763fdd46d601461027357600080fd5b346104355760603660031901126104355760043561028f612b5b565b610297612c9b565b906102a0614157565b6102a9836132fc565b61041d576102cd83600052600b6020526001600160a01b0360406000205416331490565b158061040d575b6103ea576102f883600052600b6020526001600160a01b0360406000205416331490565b806103c8575b61039b576001600160a01b03811615610371576001600160801b03821615610359579161034f6020927ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce79483614282565b604051908152a180f35b6024836040519063d2aabcd960e01b82526004820152fd5b60046040517fc61a0e9e000000000000000000000000000000000000000000000000000000008152fd5b826001600160a01b0360649260405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b5082845260056020526001600160a01b038060408620541690821614156102fe565b60405163216caf0d60e01b815260048101849052336024820152604490fd5b0390fd5b50610417836144aa565b156102d4565b60248360405190634a5541ef60e01b82526004820152fd5b80fd5b50346104355780600319360112610435576001600160a01b036020915416604051908152f35b503461043557602036600319011261043557602061047d600435613362565b6040519015158152f35b503461043557602036600319011261043557600435808252600b60205260ff600160408420015460d01c16156104d95760016040836001600160a01b039360209552600b855220015416604051908152f35b6024906040519062b8e7e760e51b82526004820152fd5b50346104355760403660031901126104355760043561050d612b5b565b61029782614219565b503461043557604036600319011261043557610530612b45565b604061053a612b5b565b926001600160a01b0380931681526008602052209116600052602052602060ff604060002054166040519015158152f35b50346104355760203660031901126104355760ff6001604060043593848152600b60205220015460d01c16156104d9576105a6602091614219565b6001600160801b0360405191168152f35b503461043557602036600319011261043557600435808252600b60205260ff600160408420015460d01c16156104d95760408260029260209452600b845220015460801c604051908152f35b503461043557602036600319011261043557600435808252600b60205260ff600160408420015460d01c16156104d95760036040836001600160801b039360209552600b855220015416604051908152f35b503461043557602036600319011261043557600435610672613272565b50808252600b60205260ff600160408420015460d01c16156104d9578160409160609352600b60205220805490600164ffffffffff91015481604051936106b885612c25565b818160a01c16855260c81c16602084015260a01c1660408201526106ff60405180926040908164ffffffffff91828151168552826020820151166020860152015116910152565bf35b50346104355760208060031936011261082b5760043561073f61073a8260005260056020526001600160a01b0360406000205416151590565b612cb1565b826001600160a01b03600a5416916044604051809481937fe9dc637500000000000000000000000000000000000000000000000000000000835230600484015260248301525afa9283156108335780936107ae575b50506107aa604051928284938452830190612b20565b0390f35b909192503d8082843e6107c18184612c5d565b820191838184031261082b5780519067ffffffffffffffff821161082f570182601f8201121561082b578051916107f783612c7f565b936108056040519586612c5d565b83855285848401011161043557509061082391848085019101612afd565b903880610794565b5080fd5b8280fd5b604051903d90823e3d90fd5b50346104355760403660031901126104355760043561085c612b5b565b610864614157565b818352600b60205260ff600160408520015460d01c16156108f55781835260056020526001600160a01b036040842054168033036103ea579161034f816020937ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7956108cf83614219565b6001600160801b0381166108e4575b50612f44565b6108ef908285614282565b386108de565b6024826040519062b8e7e760e51b82526004820152fd5b503461043557602036600319011261043557600435808252600b60205260ff600160408420015460d01c16156104d95760408264ffffffffff9260209452600b8452205460a01c16604051908152f35b5034610435578060031936011261043557602060405167016345785d8a00008152f35b503461043557602036600319011261043557600435808252600b60205260ff600160408420015460d01c16156104d9576040826001600160a01b039260209452600b8452205416604051908152f35b50346104355760203660031901126104355760ff600160406020936004358152600b855220015460d01c166040519015158152f35b503461043557608036600319011261043557610a1d612b45565b610a25612b5b565b906064359067ffffffffffffffff8211610a905736602383011215610a905781600401359284610a5485612c7f565b93610a626040519586612c5d565b858552366024878301011161082b5785610a8d96602460209301838801378501015260443591612dcf565b80f35b8380fd5b503461043557602036600319011261043557602061047d6004356132c5565b503461043557602036600319011261043557600435808252600b60205260ff600160408420015460d01c16156104d957610aec906135d8565b604051906005811015610b0157602092508152f35b602483634e487b7160e01b81526021600452fd5b50346104355761014036600319011261043557610b30614157565b610b38613272565b9064ffffffffff80421680845260c4358281168103610c495781018216602085015260e435908183168203610c495701166040830152606435916001600160a01b03918284168094036104355750608435801515809103610c495760a43590811515809203610c495760243594848616809603610c495760043595858716809703610c4957604435906001600160801b038216809203610c495760405197610bdf89612c08565b8852602088015260408701526060860152608085015260a084015260c0830152604061010319360112610c495760405191610c1983612c41565b610104359182168203610c495782610c419260209452610124358482015260e08201526136da565b604051908152f35b600080fd5b503461043557602036600319011261043557600435808252600b60205260ff600160408420015460d01c16156104d95760026040836001600160801b039360209552600b855220015416604051908152f35b503461043557602036600319011261043557610cba612b45565b6001600160a01b0380835416338103610d7d575081169081835260026020526001600160801b03604084205416908115610d4c5781610d1d918486526002602052604086206fffffffffffffffffffffffffffffffff19815416905533906141b3565b6040519081527fca7a4a65a94ed2f37538814e00e1cd4c41a78261561e3f3794592f11409cf5af60203392a380f35b602483604051907f8410168c0000000000000000000000000000000000000000000000000000000082526004820152fd5b6040516331b339a960e21b81526001600160a01b03919091166004820152336024820152604490fd5b50346104355760603660031901126104355767ffffffffffffffff60043581811161082f57610dd9903690600401612ba6565b91610de2612b5b565b90604435908111610ff257610dfb903690600401612ba6565b9093610e05614157565b818103610fbc57855b818110610e19578680f35b610e24818387614241565b35610e30828589614241565b356001600160801b0381168103610c4957610e49614157565b610e52826132fc565b610fa457610e7682600052600b6020526001600160a01b0360406000205416331490565b1580610f94575b610f7557610ea182600052600b6020526001600160a01b0360406000205416331490565b80610f4d575b610f20576001600160a01b03861615610371576001600160801b03811615610f0857602082610efb7ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7938960019796614282565b604051908152a101610e0e565b6024826040519063d2aabcd960e01b82526004820152fd5b6064826001600160a01b038860405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b5081895260056020526001600160a01b0360408a2054166001600160a01b0387161415610ea7565b60405163216caf0d60e01b815260048101839052336024820152604490fd5b50610f9e826144aa565b15610e7d565b60248260405190634a5541ef60e01b82526004820152fd5b604491604051917faec9344000000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b8480fd5b503461043557604036600319011261043557611010612b45565b60243590811515809203610c49576001600160a01b0316908133146110835733835260086020526040832082600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a380f35b606460405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152fd5b503461043557610160366003190112610435576110e2614157565b604051906110ef82612c08565b6110f7612b45565b8252611101612b5b565b602083015261110e612c9b565b60408301526001600160a01b03906064358281168103610c495760608401526084358015158103610c4957608084015260a4358015158103610c495760a084015260603660c3190112610435575060405161116881612c25565b64ffffffffff60c4358181168103610c4957825260e4358181168103610c49576020830152610104359081168103610c4957604082015260c0830152604061012319360112610c4957604051916111be83612c41565b610124359182168203610c495782610c419260209452610144358482015260e08201526136da565b5034610435578060031936011261043557604051908060045491600183811c928185169485156112e9575b60209586861081146112d5578588528794939291879082156112b3575050600114611259575b505061124592500383612c5d565b6107aa604051928284938452830190612b20565b90859250600482527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5b85831061129b57505061124593508201013880611237565b80548389018501528794508693909201918101611283565b925093505061124594915060ff191682840152151560051b8201013880611237565b602483634e487b7160e01b81526022600452fd5b93607f1693611211565b503461043557602036600319011261043557600435808252600b60205260ff600160408420015460d01c16156104d957600160408364ffffffffff9360209552600b855220015460a01c16604051908152f35b503461043557602036600319011261043557600435808252600b60205260ff600160408420015460d01c16156104d95761137f906135d8565b90600582101590816113c057600283149182156113d4575b82156113ab575b6020836040519015158152f35b9091506113c05750600460209114388061139e565b80634e487b7160e01b602492526021600452fd5b506003831491506000611397565b5034610435576020366003190112610435576004356001600160a01b039081811680910361082f5781835416338103610d7d575060015491816001600160a01b03198416176001556040519216825260208201527fdcb09aef4bf01068924ccce937981cbe59d25ba08380cf941aaaea4e4bd3960d60403392a280f35b50346104355760203660031901126104355760405161147d81612beb565b8181528160208201528160408201528160608201528160808201528160a08201528160c08201528160e082015281610100820152816101208201526101406114c3613272565b9101526004358152600b60205260ff600160408320015460d01c161561169b576004358152600b6020526040812061159c60026040519261150384612beb565b80546001600160a01b038116855264ffffffffff8160a01c16602086015264ffffffffff8160c81c16604086015260ff8160f01c161515606086015260f81c1515608085015260ff60018201546001600160a01b03811660a087015264ffffffffff8160a01c1660c0870152818160c81c16151560e0870152818160d01c16151561010087015260d81c16151561012085015201613291565b6101408201526115ad6004356135d8565b6005811015610b01579160026101a09314611690575b506106ff610140604051926001600160a01b03815116845264ffffffffff602082015116602085015264ffffffffff60408201511660408501526060810151151560608501526080810151151560808501526001600160a01b0360a08201511660a085015264ffffffffff60c08201511660c085015260e0810151151560e0850152610100810151151561010085015261012081015115156101208501520151610140830190604090816001600160801b0391828151168552826020820151166020860152015116910152565b6060820152386115c3565b602460405162b8e7e760e51b81526004356004820152fd5b503461043557602090816003193601126104355760043567ffffffffffffffff811161082b576116e883913690600401612ba6565b906116f1614157565b83915b8083106116ff578480f35b61170e83828497959697614241565b3593611718614157565b611721856132fc565b1561173e5760248560405190634a5541ef60e01b82526004820152fd5b9091929361174b81613362565b611ad35761176f81600052600b6020526001600160a01b0360406000205416331490565b1580611ab5575b611a955761178381613393565b818652600b9081885261179b60026040892001613291565b6001600160801b0391828251168382161015611a7d57848952838a5260ff60408a205460f01c1615611a65579282826117ed86838e6117e38f9a829a60409e9d9a5116613333565b9401511690613333565b8487528386528887209161187c835494600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff87161785556003818516958615611a4b575b0190831699818b6fffffffffffffffffffffffffffffffff19819454161790556001600160a01b0380971696879160058c52818f82205416998c5260019e8f91200154166141b3565b33840361197757843b6118f0575b50507f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd260407ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce79786935b825191825288820152a4604051908152a10191909392936116f4565b90919293809596503b15611973576040516372eba20360e01b8152600481018790526001600160a01b03851660248201526001600160801b039182166044820152911660648201528b94939291908b90818160848183895af11561188a5761195e9192939597949650612bd7565b61196f57918a939194928a8d61188a565b8980fd5b8b80fd5b833b6119cc575b50507f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd260407ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce79786936118d4565b90919280949596503b15611973576040516372eba20360e01b8152600481018790526001600160a01b03861660248201526001600160801b039182166044820152911660648201528b94939291908b90818160848183885af11561197e57611a3a9192939597949650612bd7565b61196f57918a939194928a8d61197e565b60018101600160c81b60ff60c81b19825416179055611833565b602485604051906339c6dc7360e21b82526004820152fd5b602485604051906322cad1af60e11b82526004820152fd5b60405163216caf0d60e01b81526004810191909152336024820152604490fd5b50808552600586526001600160a01b03604086205416331415611776565b6024906040519063fe19f19f60e01b82526004820152fd5b50346104355760208060031936011261082b5760043590611b0a614157565b818352600b815260ff600160408520015460d01c16156108f557611b2d826135d8565b6005811015611cc25760048103611b565760248360405190634a5541ef60e01b82526004820152fd5b60038103611b76576024836040519063fe19f19f60e01b82526004820152fd5b600214611caa57611b9d82600052600b6020526001600160a01b0360406000205416331490565b15610f7557818352600b815260ff604084205460f01c1615611c9257818352600b81526040832060ff60f01b19815416905560058152826001600160a01b03604082205416803b611c3b575b50506040517ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce792807f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f8680a28152a180f35b803b1561082b578180916024604051809481937f341a0bd90000000000000000000000000000000000000000000000000000000083528960048401525af115611be957611c8790612bd7565b61082f578238611be9565b602482604051906339c6dc7360e21b82526004820152fd5b602482604051906322cad1af60e11b82526004820152fd5b602484634e487b7160e01b81526021600452fd5b5034610435576020366003190112610435576004356001600160a01b039081811680910361082f5781835416338103610d7d5750600a5491816001600160a01b0319841617600a556040519216825260208201527fa2548bd4b805e907c1558a47b5858324fe8bb4a2e1ddfca647eecbf65610eebc60403392a26009546000198101908111611d935760407f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c91815190600182526020820152a180f35b602482634e487b7160e01b81526011600452fd5b503461043557602036600319011261043557600435808252600b60205260ff600160408420015460d01c16156104d95760408264ffffffffff9260209452600b8452205460c81c16604051908152f35b503461043557602036600319011261043557611e11612b45565b9080546001600160a01b0380821693338503611e63576001600160a01b03199394501691829116178255337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808380a380f35b6040516331b339a960e21b81526001600160a01b0386166004820152336024820152604490fd5b5034610435576020366003190112610435576001600160a01b03611eac612b45565b168015611ec9578160409160209352600683522054604051908152f35b608460405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e657200000000000000000000000000000000000000000000006064820152fd5b5034610435576020366003190112610435576001600160a01b036040602092600435611f7861073a8260005260056020526001600160a01b0360406000205416151590565b815260058452205416604051908152f35b5034610435576020366003190112610435576020611fa8600435612cfc565b6001600160a01b0360405191168152f35b503461043557806003193601126104355760206001600160a01b0360015416604051908152f35b50346104355760203660031901126104355760ff6001604060043593848152600b60205220015460d01c16156104d9576105a660209161365f565b50346104355760203660031901126104355760043590818152600b60205260ff600160408320015460d01c16156108f55780612056836135d8565b92600584101561209157600260209403612077575b50506040519015158152f35b8152600b8352604090205460f01c60ff169050388061206b565b602482634e487b7160e01b81526021600452fd5b5034610435576020366003190112610435576004356120c2614157565b6120cb816132fc565b156121b4576120d9816144aa565b15611a95576120e781612cfc565b6120f0826132c5565b1590816121ac575b81612199575b50612181578161210d82612cfc565b82825260076020526001600160a01b0360408320916001600160a01b031992838154169055169081835260066020526040832060001981540190558383526005602052604083209081541690557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a480f35b602490604051906378630aa960e01b82526004820152fd5b6001600160a01b039150161515386120fe565b8391506120f8565b602490604051907f817cd6390000000000000000000000000000000000000000000000000000000082526004820152fd5b5034610435576121f436612b71565b60405191602083019383851067ffffffffffffffff86111761221f57610a8d94604052858452612dcf565b634e487b7160e01b600052604160045260246000fd5b503461043557602036600319011261043557602061047d6004356132fc565b50346104355760208060031936011261082b5760043590612273614157565b61227c826132fc565b156122995760248260405190634a5541ef60e01b82526004820152fd5b6122a282613362565b612616576122c682600052600b6020526001600160a01b0360406000205416331490565b15806125f8575b610f75576122da82613393565b91808452600b82526122f160026040862001613291565b6001600160801b03938482511685821610156125e057828652600b845260ff604087205460f01c16156125c857816123358287876117e36040968383995116613333565b848852600b8452828820916123c4835498600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8b161785558a60038286169687156125ae575b019184169a828c6fffffffffffffffffffffffffffffffff198195541617905560016001600160a01b0380921698899360058c52600b8483832054169c52200154166141b3565b3384036124a157908891853b612434575b5050507f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd260407ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce79786935b825191825288820152a4604051908152a180f35b853b1561082f576040516372eba20360e01b8152600481018890526001600160a01b03861660248201526001600160801b03918216604482015291166064820152818160848183895af1612489575b806123d5565b61249290612bd7565b61249d578638612483565b8680fd5b83989792983b6124fb575b50507f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd2604085927ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce79899612420565b833b156125aa576040516372eba20360e01b8152600481018790526001600160a01b03861660248201526001600160801b03918216604482015291166064820152868160848183875af1612550575b806124ac565b604085927ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7986125a07f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd294612bd7565b985092505061254a565b8780fd5b60018101600160c81b60ff60c81b1982541617905561237d565b602483604051906339c6dc7360e21b82526004820152fd5b602483604051906322cad1af60e11b82526004820152fd5b50818352600581526001600160a01b036040842054163314156122cd565b6024826040519063fe19f19f60e01b82526004820152fd5b5034610435576020366003190112610435576001600160801b0360406020926001600160a01b0361265d612b45565b16815260028452205416604051908152f35b503461043557610a8d61268136612b71565b9161269461268f8433612e65565b612d5e565b612f44565b50346104355780600319360112610435576020600954604051908152f35b503461043557602036600319011261043557600435808252600b60205260ff600160408420015460d01c16156104d9576126f0906135d8565b9060058210156113c05760208215838115612711575b506040519015158152f35b600191501482612706565b50346104355760203660031901126104355760043590818152600b60205260ff600160408320015460d01c16156108f557602091604082828152600b85522060ff815460f01c16806127aa575b612781575b50506001600160801b0360405191168152f35b6127a392506001600160801b03600261279d9201541691613393565b90613333565b388061276e565b5060ff600182015460c81c1615612769565b5034610435576040366003190112610435576127d6612b45565b602435906001600160a01b0380806127ed85612cfc565b169216918083146128e1578033149081156128c0575b501561285657828452600760205260408420826001600160a01b031982541617905561282e83612cfc565b167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258480a480f35b608460405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152fd5b9050845260086020526040842033855260205260ff60408520541638612803565b608460405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152fd5b5034610435576020366003190112610435576020611fa8600435612d21565b5034610435578060031936011261043557604051908060035491600183811c92818516948515612a22575b60209586861081146112d5578588528794939291879082156112b35750506001146129c857505061124592500383612c5d565b90859250600382527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b858310612a0a57505061124593508201013880611237565b805483890185015287945086939092019181016129f2565b93607f1693612995565b90503461082b57602036600319011261082b576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361082f57602092507f80ac58cd000000000000000000000000000000000000000000000000000000008114908115612ad3575b8115612aa9575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501438612aa2565b7f5b5e139f0000000000000000000000000000000000000000000000000000000081149150612a9b565b60005b838110612b105750506000910152565b8181015183820152602001612b00565b90602091612b3981518092818552858086019101612afd565b601f01601f1916010190565b600435906001600160a01b0382168203610c4957565b602435906001600160a01b0382168203610c4957565b6060906003190112610c49576001600160a01b03906004358281168103610c4957916024359081168103610c49579060443590565b9181601f84011215610c495782359167ffffffffffffffff8311610c49576020808501948460051b010111610c4957565b67ffffffffffffffff811161221f57604052565b610160810190811067ffffffffffffffff82111761221f57604052565b610100810190811067ffffffffffffffff82111761221f57604052565b6060810190811067ffffffffffffffff82111761221f57604052565b6040810190811067ffffffffffffffff82111761221f57604052565b90601f8019910116810190811067ffffffffffffffff82111761221f57604052565b67ffffffffffffffff811161221f57601f01601f191660200190565b604435906001600160801b0382168203610c4957565b15612cb857565b606460405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152fd5b60005260056020526001600160a01b0360406000205416612d1e811515612cb1565b90565b612d4461073a8260005260056020526001600160a01b0360406000205416151590565b60005260076020526001600160a01b036040600020541690565b15612d6557565b608460405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f766564000000000000000000000000000000000000006064820152fd5b90612df3939291612de361268f8433612e65565b612dee838383612f44565b6130de565b15612dfa57565b60405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b906001600160a01b038080612e7984612cfc565b16931691838314938415612eac575b508315612e96575b50505090565b612ea291929350612d21565b1614388080612e90565b909350600052600860205260406000208260005260205260ff604060002054169238612e88565b15612eda57565b608460405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152fd5b90612f6c91612f5284612cfc565b916001600160a01b03938493848094169485911614612ed3565b1691821561304557612f7d846132c5565b158061303d575b80613034575b61301c5781612fa391612f9c86612cfc565b1614612ed3565b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60008481526007602052604081206001600160a01b03199081815416905583825260066020526040822060001981540190558482526040822060018154019055858252600560205284604083209182541617905580a4565b602484604051906378630aa960e01b82526004820152fd5b50811515612f8a565b506001612f84565b608460405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152fd5b3d156130d9573d906130bf82612c7f565b916130cd6040519384612c5d565b82523d6000602084013e565b606090565b91926000929190813b156132685760209161314e91856040519586809581947f150b7a02000000000000000000000000000000000000000000000000000000009b8c84523360048501526001600160a01b0380951660248501526044840152608060648401526084830190612b20565b0393165af190829082613208575b50506131e25761316a6130ae565b805190816131dd5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000161490565b909192506020813d8211613260575b8161322460209383612c5d565b8101031261082b5751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610435575090388061315c565b3d9150613217565b5050505050600190565b6040519061327f82612c25565b60006040838281528260208201520152565b9060405161329e81612c25565b6040819360018154916001600160801b0392838116865260801c6020860152015416910152565b80600052600b60205260ff60016040600020015460d01c16156104d957600052600b60205260ff60016040600020015460d81c1690565b80600052600b60205260ff60016040600020015460d01c16156104d957600052600b60205260ff60016040600020015460c81c1690565b6001600160801b03918216908216039190821161334c57565b634e487b7160e01b600052601160045260246000fd5b80600052600b60205260ff60016040600020015460d01c16156104d957600052600b60205260406000205460f81c90565b600090808252600b6020526040822091825464ffffffffff42818360c81c16116134415780600186015460a01c16918242101561342b576133e09394955060a01c16809103904203613449565b90828152600b6020526001600160801b0392613406846002604085200154168094613529565b9283116134135750501690565b60029350604092508152600b60205220015460801c90565b505050505060026001600160801b039101541690565b505091505090565b670de0b6b3a764000091600019838309928083029283808610950394808603951461350557828510156134c957908291096001821901821680920460028082600302188083028203028083028203028083028203028083028203028083028203028092029003029360018380600003040190848311900302920304170290565b82606492604051927f63a05778000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b505080925015613513570490565b634e487b7160e01b600052601260045260246000fd5b909190600019838209838202918280831092039180830392146135c757670de0b6b3a7640000908183101561359057947faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066994950990828211900360ee1b910360121c170290565b60449086604051917f5173648d00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050670de0b6b3a764000090049150565b80600052600b602052604060002060ff600182015460c81c166000146135ff575050600490565b805460f81c613658575460a01c64ffffffffff1642106136525761362281613393565b90600052600b6020526001600160801b03806002604060002001541691161060001461364d57600190565b600290565b50600090565b5050600390565b80600052600b6020526136786002604060002001613291565b81600052600b602052604060002060ff600182015460c81c166000146136ab57506001600160801b039150602001511690565b5460f81c6136bd5750612d1e90613393565b612d1e91506001600160801b036040818351169201511690613333565b906001600160a01b036001541660206001600160a01b036060850151166024604051809481937fdcf844a700000000000000000000000000000000000000000000000000000000835260048301525afa8015613eee57600090613eba575b61375b91506001600160801b0360408501511690602060e0860151015191614513565b916001600160801b0383511660c08201519015613e905764ffffffffff815116602082019064ffffffffff82511690818111613e5057505064ffffffffff604091511691019064ffffffffff8251169081811015613e1057505064ffffffffff8042169151169081811015613dd0575050600954926001600160801b03815116604051906137e882612c25565b815260006020820152600060408201526001600160a01b036060840151169060c08401519164ffffffffff6020840151169064ffffffffff604085015116906080870151151560a088015115159364ffffffffff6001600160a01b038a51169751166040519761385789612beb565b88526020880152604087015260608601526000608086015260a085015260c0840152600060e0840152600161010084015261012083015261014082015284600052600b60205260406000206001600160a01b038251166001600160a01b03198254161781556138ee64ffffffffff602084015116829064ffffffffff60a01b1964ffffffffff60a01b83549260a01b169116179055565b604082015181547eff0000000000000000000000000000000000000000000000000000000000006060850151151560f01b169078ffffffffffffffffffffffffffffffffffffffffffffffffff7dffffffffff000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000006080880151151560f81b169460c81b1691161717178155600181016001600160a01b0360a0840151166001600160a01b03198254161781556139e564ffffffffff60c085015116829064ffffffffff60a01b1964ffffffffff60a01b83549260a01b169116179055565b60e083015181546101008501516101208601517fffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff90921692151560c81b79ff00000000000000000000000000000000000000000000000000169290921791151560d01b7aff0000000000000000000000000000000000000000000000000000169190911790151560d81b7bff00000000000000000000000000000000000000000000000000000016179055610140909101518051602082015160801b6fffffffffffffffffffffffffffffffff199081166001600160801b03928316176002850155926040906003019201511682825416179055600185016009556001600160a01b0360608401511660005260026020526001600160801b0380604060002054168160208501511601166001600160a01b036060850151166000526040600020918254161790556001600160a01b036020830151168015613d8c57613b69613b638660005260056020526001600160a01b0360406000205416151590565b15614074565b613b72856132c5565b1580613d84575b80613d7c575b613d64578490613ba8613b638360005260056020526001600160a01b0360406000205416151590565b8060005260066020526040600020600181540190558160005260056020526040600020816001600160a01b031982541617905560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4613c316001600160a01b036060840151166001600160801b03808451168160208601511601169030903390613efa565b6001600160801b0360408201511680613d35575b506001600160a01b038251167f075861cbceafeb777e8f15f357121b08f6f3adba387d599bb7b5278ca6192df5610160866001600160a01b0360208701511694613d2c6001600160a01b03606089015116976080810151151560a0820151151590613cf66001600160a01b0360e060c08601519501515116956040519788523360208901526040880190604090816001600160801b0391828151168552826020820151166020860152015116910152565b60a086015260c0850152805164ffffffffff90811660e08601526020820151811661010086015260409091015116610120840152565b610140820152a4565b613d5e906001600160a01b036060850151166001600160a01b0360e08601515116903390613efa565b38613c45565b602485604051906378630aa960e01b82526004820152fd5b506000613b7f565b506001613b79565b606460405162461bcd60e51b815260206004820152602060248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152fd5b6040517f210aec0e00000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b6040517f9fee269100000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b6040517f4c23297000000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b60046040517f6095d3bc000000000000000000000000000000000000000000000000000000008152fd5b6020823d602011613ee6575b81613ed360209383612c5d565b81010312610435575061375b9051613738565b3d9150613ec6565b6040513d6000823e3d90fd5b9290604051927f23b872dd0000000000000000000000000000000000000000000000000000000060208501526001600160a01b03809216602485015216604483015260648201526064815260a081019181831067ffffffffffffffff84111761221f57613f6992604052613f6b565b565b6001600160a01b031690613fcb604051613f8481612c41565b6020938482527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564858301526000808587829751910182855af1613fc56130ae565b916140bf565b805191821591848315614050575b505050905015613fe65750565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b91938180945001031261082b57820151908115158203610435575080388084613fd9565b1561407b57565b606460405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152fd5b9192901561412057508151156140d3575090565b3b156140dc5790565b606460405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b8251909150156141335750805190602001fd5b6104099060405191829162461bcd60e51b8352602060048401526024830190612b20565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361418957565b60046040517fa1c0d6e5000000000000000000000000000000000000000000000000000000008152fd5b916001600160a01b03604051927fa9059cbb000000000000000000000000000000000000000000000000000000006020850152166024830152604482015260448152608081019181831067ffffffffffffffff84111761221f57613f6992604052613f6b565b612d1e906142268161365f565b90600052600b60205260026040600020015460801c90613333565b91908110156142515760051b0190565b634e487b7160e01b600052603260045260246000fd5b9190916001600160801b038080941691160191821161334c57565b929190926001600160801b038061429883614219565b16928181169380851161446d5750600095838752602092600b845261430b6142cb6040946002868c20015460801c614267565b868a52600b86526143066002868c20019182906001600160801b036fffffffffffffffffffffffffffffffff1983549260801b169116179055565b613291565b90614326818684015116928286818351169201511690613333565b16111561443e575b838752600b83526001600160a01b03916143518683856001858d200154166141b3565b848852600584528281892054168033141580614434575b61439d575b507ffa54f9f9bdcdd28778cbb9f78490df6691cc4e2729588e10f4cc0a26c465686a9495969750519586521693a3565b803b156144305797807ffa54f9f9bdcdd28778cbb9f78490df6691cc4e2729588e10f4cc0a26c465686a9697989960848451809481937f13375c3b0000000000000000000000000000000000000000000000000000000083528c600484015233602484015289891660448401528d60648401525af1614421575b889796955061436d565b61442a90612bd7565b38614417565b8880fd5b50803b1515614368565b838752600b835281872060018101600160c81b60ff60c81b1982541617905560ff60f01b19815416905561432e565b8360649186604051927fa1fb2bbc000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b60009080825260056020526001600160a01b0380604084205416928333149384156144ef575b505082156144dd57505090565b9091506144ea3392612d21565b161490565b60ff92945090604091815260086020528181203382526020522054169138806144d0565b90929161451e613272565b936001600160801b039283811691821561462a5767016345785d8a00008082116145f3578085116145bc575061456885614559819386613529565b16946020890195865284613529565b16918461457f604089019480865282875116614267565b1610156145a6576145988491826145a195511690613333565b91511690613333565b168252565b634e487b7160e01b600052600160045260246000fd5b84604491604051917f4fea5c1a00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b60449250604051917f47152d6700000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050505050905060405161463d81612c25565b6000815260006020820152600060408201529056"; bytes public constant BYTECODE_NFT_DESCRIPTOR = hex"6080806040523461001757615da890816200001d8239f35b600080fdfe6080604052600436101561001257600080fd5b60003560e01c63e9dc63751461002757600080fd5b346142f35760403660031901126142f3576001600160a01b0360043516600435036142f357610056608061486b565b60006080819052606060a081905260c0819052610100819052610120819052610140819052610160829052610180919091526101a0526004356001600160a01b031660e08190526100a690614c55565b6101005260e0516040517feac8f5b80000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa908115614300576000916147da575b506001600160a01b03610116911680608052615665565b60a05260e0516040517fad35efd40000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa80156143005760009061479d575b6101779150615885565b6101205260e0516040517f4869e12d0000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa80156143005760249160009161477e575b506fffffffffffffffffffffffffffffffff81166101605260e0516040517fa80fc071000000000000000000000000000000000000000000000000000000008152833560048201529260209184919082906001600160a01b03165afa9182156143005760009261474d575b506fffffffffffffffffffffffffffffffff821615614737576fffffffffffffffffffffffffffffffff9182169082166127100282160416610180526102846004356153c3565b610120608001526040514660208201526bffffffffffffffffffffffff1960043560601b16604082015260243560548201526054815280608081011067ffffffffffffffff60808301111761430c57608081016040526020815191012061041b602963ffffffff61032b6103048261016861ffff8860101c160616614b05565b91601e604660ff6103218460146050848d60081c16060116614b05565b9816060116614b05565b6040519485927f68736c2800000000000000000000000000000000000000000000000000000000602085015261036b815180926020602488019101614823565b83017f2c0000000000000000000000000000000000000000000000000000000000000060248201526103a7825180936020602585019101614823565b7f252c000000000000000000000000000000000000000000000000000000000000602583830101526103e58351809460206027868601019101614823565b01017f252900000000000000000000000000000000000000000000000000000000000060278201520360098101845201826148dc565b61042f6001600160a01b0360805116614c55565b60a05160e0516040517fbc2be1be0000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa801561430057602491600091614718575b5060206001600160a01b0360606080015116604051938480927f9067b677000000000000000000000000000000000000000000000000000000008252823560048301525afa8015614300576104f1926000916146e9575b5064ffffffffff80911691166151d1565b61010051610180516105786021610515606461050e818606615740565b9404614b05565b604051938161052e869351809260208087019101614823565b82016105438251809360208085019101614823565b017f250000000000000000000000000000000000000000000000000000000000000060208201520360018101845201826148dc565b610100608001519060a060800151936105bf6fffffffffffffffffffffffffffffffff60e0608001511660ff6105b86001600160a01b03608051166155d8565b1690614e85565b956101206080015197604051996105d58b61486b565b8a5260208a015260408901526060880152608087015260a086015260c085015260e0840152610100830152610120820152604051806101c081011067ffffffffffffffff6101c08301111761430c576101c081016040526060815260006020820152606060408201526000606082015260006080820152606060a0820152600060c0820152600060e08201526060610100820152600061012082015260006101408201526060610160820152600061018082015260006101a082015260808201516106a660a0840151845190615a76565b906109b361015c604051926106ba846148c0565b600884527f50726f677265737300000000000000000000000000000000000000000000000060208501526107236040516106f381614888565b60009052855160208701207fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4701490565b156146e1576090945b61073586614b05565b916040519586938493661e339034b21e9160c91b60208601526109818351958692610767846027840160208901614823565b6d11103334b6361e9111b33333111f60911b602785840101526c1e3932b1ba103bb4b23a341e9160991b603585840101526107ae8551809660206042888701019101614823565b7f22206865696768743d22313030222066696c6c2d6f7061636974793d222e3033828501860160428101919091527f222072783d223135222072793d22313522207374726f6b653d2223666666222060628201527f7374726f6b652d6f7061636974793d222e3122207374726f6b652d77696474686082820152651e911a11179f60d11b60a28201527f3c7465787420783d2232302220793d2233342220666f6e742d66616d696c793d60a88201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f7370616365222060c8820152703337b73a16b9b4bd329e911919383c111f60791b60e88201528651966108b491889160f990910190602001614823565b661e17ba32bc3a1f60c91b8285018601870160f98101919091527f3c7465787420783d2232302220793d2237322220666f6e742d66616d696c793d6101008201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f73706163652220610120820152703337b73a16b9b4bd329e91191b383c111f60791b61014082015287519761094f91899161015190910190602001614823565b661e17ba32bc3a1f60c91b6101518888888887010101010152602061015888888885519c8d9701010101019101614823565b631e17b39f60e11b90860190910190910190910190910161015881019190915281900361013c810190915201826148dc565b60a083015260c0820152602860e0830151604051906109d182614888565b60008252610c7761015c604051926109e8846148c0565b600684527f53746174757300000000000000000000000000000000000000000000000000006020850152610a1b84615cb6565b610a2482615d33565b808211156146d95750945b610a3a878701614b05565b91604051958693661e339034b21e9160c91b60208601528151610a64816027880160208601614823565b85016d11103334b6361e9111b33333111f60911b60278201526c1e3932b1ba103bb4b23a341e9160991b6035820152610aa7825180936020604285019101614823565b017f22206865696768743d22313030222066696c6c2d6f7061636974793d222e303360428201527f222072783d223135222072793d22313522207374726f6b653d2223666666222060628201527f7374726f6b652d6f7061636974793d222e3122207374726f6b652d77696474686082820152651e911a11179f60d11b60a28201527f3c7465787420783d2232302220793d2233342220666f6e742d66616d696c793d60a88201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f7370616365222060c8820152703337b73a16b9b4bd329e911919383c111f60791b60e8820152610ba382518093602060f985019101614823565b01661e17ba32bc3a1f60c91b60f98201527f3c7465787420783d2232302220793d2237322220666f6e742d66616d696c793d6101008201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f73706163652220610120820152703337b73a16b9b4bd329e91191b383c111f60791b610140820152610c3282518093602061015185019101614823565b01661e17ba32bc3a1f60c91b610151820152610c5982518093602061015885019101614823565b01631e17b39f60e11b6101588201520361013c8101845201826148dc565b61010084015201610120820152602861010083015160405190610c9982614888565b60008252610ce361015c60405192610cb0846148c0565b600884527f53747265616d65640000000000000000000000000000000000000000000000006020850152610a1b84615cb6565b6101608401520161018082015261102660608301516030604051610d0681614888565b60008152610fad61015c60405194610d1d866148c0565b600886527f4475726174696f6e0000000000000000000000000000000000000000000000006020870152610d5086615cb6565b610d5982615d33565b808211156146d15750935b610d7060288601614b05565b91604051978893661e339034b21e9160c91b60208601528151610d9a816027880160208601614823565b85016d11103334b6361e9111b33333111f60911b60278201526c1e3932b1ba103bb4b23a341e9160991b6035820152610ddd825180936020604285019101614823565b017f22206865696768743d22313030222066696c6c2d6f7061636974793d222e303360428201527f222072783d223135222072793d22313522207374726f6b653d2223666666222060628201527f7374726f6b652d6f7061636974793d222e3122207374726f6b652d77696474686082820152651e911a11179f60d11b60a28201527f3c7465787420783d2232302220793d2233342220666f6e742d66616d696c793d60a88201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f7370616365222060c8820152703337b73a16b9b4bd329e911919383c111f60791b60e8820152610ed982518093602060f985019101614823565b01661e17ba32bc3a1f60c91b60f98201527f3c7465787420783d2232302220793d2237322220666f6e742d66616d696c793d6101008201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f73706163652220610120820152703337b73a16b9b4bd329e91191b383c111f60791b610140820152610f6882518093602061015185019101614823565b01661e17ba32bc3a1f60c91b610151820152610f8f82518093602061015885019101614823565b01631e17b39f60e11b6101588201520361013c8101865201846148dc565b8260408601526028810160608601526101808501519060c0860151809161012088015192839185010101605881016020890152605719906103e8030160011c8060e0890152016010810161014088015201602081016101a08701520101608084015260a083015161010084015161016085015191614e1c565b8152604051908161010081011067ffffffffffffffff6101008401111761430c57610100820160405260c782527f3c726563742077696474683d223130302522206865696768743d22313030252260208301527f2066696c7465723d2275726c28234e6f69736529222f3e3c7265637420783d2260408301527f37302220793d223730222077696474683d2238363022206865696768743d223860608301527f3630222066696c6c3d2223666666222066696c6c2d6f7061636974793d222e3060808301527f33222072783d223435222072793d22343522207374726f6b653d22236666662260a08301527f207374726f6b652d6f7061636974793d222e3122207374726f6b652d7769647460c08301527f683d2234222f3e0000000000000000000000000000000000000000000000000060e083015282519160e084015191805194604051611175816148a4565b603381527f3c636972636c652069643d22476c6f772220723d22353030222066696c6c3d2260208201527f75726c282352616469616c476c6f7729222f3e000000000000000000000000006040820152604051966111d28861486b565b61011c88527f3c66696c7465722069643d224e6f697365223e3c6665466c6f6f6420783d223060208901527f2220793d2230222077696474683d223130302522206865696768743d2231303060408901527f252220666c6f6f642d636f6c6f723d2268736c283233302c3231252c3131252960608901527f2220666c6f6f642d6f7061636974793d22312220726573756c743d22666c6f6f60808901527f6446696c6c222f3e3c666554757262756c656e6365206261736546726571756560a08901527f6e63793d222e3422206e756d4f6374617665733d22332220726573756c743d2260c08901527f4e6f6973652220747970653d226672616374616c4e6f697365222f3e3c66654260e08901527f6c656e6420696e3d224e6f6973652220696e323d22666c6f6f6446696c6c22206101008901527f6d6f64653d22736f66742d6c69676874222f3e3c2f66696c7465723e0000000061012089015260405197886103a081011067ffffffffffffffff6103a08b01111761430c576103a0890160405261037b89527f3c706174682069643d224c6f676f222066696c6c3d2223666666222066696c6c60208a01527f2d6f7061636974793d222e312220643d226d3133332e3535392c3132342e303360408a01527f34632d2e3031332c322e3431322d312e3035392c342e3834382d322e3932332c60608a01527f362e3430322d322e3535382c312e3831392d352e3136382c332e3433392d372e60808a01527f3838382c342e3939362d31342e34342c382e3236322d33312e3034372c31322e60a08a01527f3536352d34372e3637342c31322e3536392d382e3835382e3033362d31372e3860c08a01527f33382d312e3237322d32362e3332382d332e3636332d392e3830362d322e373660e08a01527f362d31392e3038372d372e3131332d32372e3536322d31322e3737382d31332e6101008a01527f3834322d382e3032352c392e3436382d32382e3630362c31362e3135332d33356101208a01527f2e323635683063322e3033352d312e3833382c342e3235322d332e3534362c366101408a01527f2e3436332d352e323234683063362e3432392d352e3635352c31362e3231382d6101608a01527f322e3833352c32302e3335382c342e31372c342e3134332c352e3035372c382e6101808a01527f3831362c392e3634392c31332e39322c31332e373334682e30333763352e37336101a08a01527f362c362e3436312c31352e3335372d322e3235332c392e33382d382e34382c306101c08a01527f2c302d332e3531352d332e3531352d332e3531352d332e3531352d31312e34396101e08a01527f2d31312e3437382d35322e3635362d35322e3636342d36342e3833372d36342e6102008a01527f3833376c2e3034392d2e303337632d312e3732352d312e3630362d322e3731396102208a01527f2d332e3834372d322e3735312d362e3230346830632d2e3034362d322e3337356102408a01527f2c312e3036322d342e3538322c322e3732362d362e32323968306c2e3138352d6102608a01527f2e3134386830632e3039392d2e3036322c2e3232322d2e3134382c2e33372d2e6102808a01527f323539683063322e30362d312e3336322c332e3935312d322e3632312c362e306102a08a01527f34342d332e3834324335372e3736332d332e3437332c39372e37362d322e33346102c08a01527f312c3132382e3633372c31382e3333326331362e3637312c392e3934362d32366102e08a01527f2e3334342c35342e3831332d33382e3635312c34302e3139392d362e3239392d6103008a01527f362e3039362d31382e3036332d31372e3734332d31392e3636382d31382e38316103208a01527f312d362e3031362d342e3034372d31332e3036312c342e3737362d372e3735326103408a01527f2c392e3735316c36382e3235342c36382e33373163312e3732342c312e3630316103608a01527f2c322e3731342c332e38342c322e3733382c362e3139325a222f3e00000000006103808a0152604051978860a081011067ffffffffffffffff60a08b01111761430c57611cb0611d119160a08b0160405260758b527f3c706174682069643d22466c6f6174696e6754657874222066696c6c3d226e6f60208c01527f6e652220643d224d31323520343568373530733830203020383020383076373560408c01527f307330203830202d3830203830682d373530732d38302030202d3830202d383060608c01527f762d3735307330202d3830203830202d3830222f3e000000000000000000000060808c0152611867615a3d565b906040517f3c72616469616c4772616469656e742069643d2252616469616c476c6f77223e6020820152611d0c60d87f3c73746f70206f66667365743d223025222073746f702d636f6c6f723d22000093846040850152805161199960b88660208501936118d981605e840187614823565b8101997f222073746f702d6f7061636974793d222e36222f3e0000000000000000000000605e8c01527f3c73746f70206f66667365743d2231303025222073746f702d636f6c6f723d229a8b607382015261193e825180936020609385019101614823565b017f222073746f702d6f7061636974793d2230222f3e00000000000000000000000060938201527f3c2f72616469616c4772616469656e743e00000000000000000000000000000060a78201520360988101885201866148dc565b6119a1615a3d565b90604051967f3c6c696e6561724772616469656e742069643d2253616e64546f70222078313d60208901527f223025222079313d223025223e000000000000000000000000000000000000006040890152604d8801528251611a0781606b8a0184614823565b8701917f222f3e00000000000000000000000000000000000000000000000000000000009283606b82015289606e820152611a4c825180936020608e85019101614823565b019082608e830152611a9060a2897f3c2f6c696e6561724772616469656e743e0000000000000000000000000000009485609182015203608281018b5201896148dc565b611bd6610108611a9e615a3d565b6040519b8c917f3c6c696e6561724772616469656e742069643d2253616e64426f74746f6d222060208401527f78313d2231303025222079313d2231303025223e00000000000000000000000060408401527f3c73746f70206f66667365743d22313025222073746f702d636f6c6f723d22006054840152611b2a815180926020607387019101614823565b8201908760738301526076820152875190611b49826096830188614823565b018660968201527f3c616e696d617465206174747269627574654e616d653d22783122206475723d60998201527f2236732220726570656174436f756e743d22696e646566696e6974652220766160b98201527f6c7565733d223330253b3630253b313230253b3630253b3330253b222f3e000060d98201528560f78201520360e881018c52018a6148dc565b611bde615a3d565b906040519a8b957f3c6c696e6561724772616469656e742069643d22486f7572676c61737353747260208801527f6f6b6522206772616469656e745472616e73666f726d3d22726f74617465283960408801527f302922206772616469656e74556e6974733d227573657253706163654f6e557360608801527f65223e000000000000000000000000000000000000000000000000000000000060808801527f3c73746f70206f66667365743d22353025222073746f702d636f6c6f723d2200608388015251809260a2880190614823565b84018360a28201527f3c73746f70206f66667365743d22383025222073746f702d636f6c6f723d220060a5820152611cf282518093602060c485019101614823565b019160c483015260c78201520360b88101875201856148dc565b614e1c565b92611d31611d1d615813565b896020815191012090602081519101201490565b9788156146a8575b506040518060c081011067ffffffffffffffff60c08301111761430c5760c08101604052609081527f3c7061746820643d224d2035302c3336302061203330302c333030203020312c60208201527f31203630302c302061203330302c333030203020312c31202d3630302c30222060408201527f66696c6c3d2223666666222066696c6c2d6f7061636974793d222e303222207360608201527f74726f6b653d2275726c2823486f7572676c6173735374726f6b65292220737460808201527f726f6b652d77696474683d2234222f3e0000000000000000000000000000000060a082015260405193846102c081011067ffffffffffffffff6102c08701111761430c576102c0850160405261029885527f3c7061746820643d226d3536362c3136312e323031762d35332e39323463302d60208601527f31392e3338322d32322e3531332d33372e3536332d36332e3339382d35312e3160408601527f39382d34302e3735362d31332e3539322d39342e3934362d32312e3037392d3160608601527f35322e3538372d32312e303739732d3131312e3833382c372e3438372d31353260808601527f2e3630322c32312e303739632d34302e3839332c31332e3633362d36332e343160a08601527f332c33312e3831362d36332e3431332c35312e3139387635332e39323463302c60c08601527f31372e3138312c31372e3730342c33332e3432372c35302e3232332c34362e3360e08601527f3934763238342e383039632d33322e3531392c31322e39362d35302e3232332c6101008601527f32392e3230362d35302e3232332c34362e3339347635332e39323463302c31396101208601527f2e3338322c32322e35322c33372e3536332c36332e3431332c35312e3139382c6101408601527f34302e3736332c31332e3539322c39342e3935342c32312e3037392c3135322e6101608601527f3630322c32312e303739733131312e3833312d372e3438372c3135322e3538376101808601527f2d32312e3037396334302e3838362d31332e3633362c36332e3339382d33312e6101a08601527f3831362c36332e3339382d35312e313938762d35332e39323463302d31372e316101c08601527f39362d31372e3730342d33332e3433352d35302e3232332d34362e34303156326101e08601527f30372e3630336333322e3531392d31322e3936372c35302e3232332d32392e326102008601527f30362c35302e3232332d34362e3430315a6d2d3334372e3436322c35372e37396102208601527f336c3133302e3935392c3133312e3032372d3133302e3935392c3133312e30316102408601527f33563231382e3939345a6d3236322e3932342e303232763236322e3031386c2d6102608601527f3133302e3933372d3133312e3030362c3133302e3933372d3133312e3031335a6102808601527f222066696c6c3d2223313631383232223e3c2f706174683e00000000000000006102a0860152896000146144835760405161218b81614888565b60008152995b1561432257604051806101e081011067ffffffffffffffff6101e08301111761430c576101e081016040526101b181527f3c7061746820643d226d3438312e34362c3438312e35347638312e3031632d3260208201527f2e33352e37372d342e38322c312e35312d372e33392c322e32332d33302e332c60408201527f382e35342d37342e36352c31332e39322d3132342e30362c31332e39322d353360608201527f2e362c302d3130312e32342d362e33332d3133312e34372d31362e3136762d3860808201527f316c34362e332d34362e3331683137302e33336c34362e32392c34362e33315a60a08201527f222066696c6c3d2275726c282353616e64426f74746f6d29222f3e3c7061746860c08201527f20643d226d3433352e31372c3433352e323363302c312e31372d2e34362c322e60e08201527f33322d312e33332c332e34342d372e31312c392e30382d34312e39332c31352e6101008201527f39382d38332e38312c31352e3938732d37362e372d362e392d38332e38322d316101208201527f352e3938632d2e38372d312e31322d312e33332d322e32372d312e33332d332e6101408201527f3434762d2e30346c382e33342d382e33352e30312d2e30316331332e37322d366101608201527f2e35312c34322e39352d31312e30322c37362e382d31312e30327336322e39376101808201527f2c342e34392c37362e37322c31316c382e34322c382e34325a222066696c6c3d6101a08201527f2275726c282353616e64546f7029222f3e0000000000000000000000000000006101c0820152995b60405196876107e081011067ffffffffffffffff6107e08a01111761430c57613b9c9c612e586036602d9960819f97631e17b39f60e11b8d7f3c2f646566733e000000000000000000000000000000000000000000000000009a612f279f6107e0016040526107a782527f3c672066696c6c3d226e6f6e6522207374726f6b653d2275726c2823486f757260208301527f676c6173735374726f6b652922207374726f6b652d6c696e656361703d22726f60408301527f756e6422207374726f6b652d6d697465726c696d69743d22313022207374726f60608301527f6b652d77696474683d2234223e3c7061746820643d226d3536352e3634312c3160808301527f30372e323863302c392e3533372d352e35362c31382e3632392d31352e36373660a08301527f2c32362e393733682d2e303233632d392e3230342c372e3539362d32322e313960c08301527f342c31342e3536322d33382e3139372c32302e3539322d33392e3530342c313460e08301527f2e3933362d39372e3332352c32342e3335352d3136312e3733332c32342e33356101008301527f352d39302e34382c302d3136372e3934382d31382e3538322d3139392e3935336101208301527f2d34342e393438682d2e303233632d31302e3131352d382e3334342d31352e366101408301527f37362d31372e3433372d31352e3637362d32362e3937332c302d33392e3733356101608301527f2c39362e3535342d37312e3932312c3231352e3635322d37312e3932317332316101808301527f352e3632392c33322e3138352c3231352e3632392c37312e3932315a222f3e3c6101a08301527f7061746820643d226d3133342e33362c3136312e32303363302c33392e3733356101c08301527f2c39362e3535342c37312e3932312c3231352e3635322c37312e3932317332316101e08301527f352e3632392d33322e3138362c3231352e3632392d37312e393231222f3e3c6c6102008301527f696e652078313d223133342e3336222079313d223136312e323033222078323d6102208301527f223133342e3336222079323d223130372e3238222f3e3c6c696e652078313d226102408301527f3536352e3634222079313d223136312e323033222078323d223536352e3634226102608301527f2079323d223130372e3238222f3e3c6c696e652078313d223138342e353834226102808301527f2079313d223230362e383233222078323d223138342e353835222079323d22356102a08301527f33372e353739222f3e3c6c696e652078313d223231382e313831222079313d226102c08301527f3231382e313138222078323d223231382e313831222079323d223536322e35336102e08301527f37222f3e3c6c696e652078313d223438312e383138222079313d223231382e316103008301527f3432222078323d223438312e383139222079323d223536322e343238222f3e3c6103208301527f6c696e652078313d223531352e343135222079313d223230372e3335322220786103408301527f323d223531352e343136222079323d223533372e353739222f3e3c70617468206103608301527f643d226d3138342e35382c3533372e353863302c352e34352c342e32372c31306103808301527f2e36352c31322e30332c31352e3432682e303263352e35312c332e33392c31326103a08301527f2e37392c362e35352c32312e35352c392e34322c33302e32312c392e392c37386103c08301527f2e30322c31362e32382c3133312e38332c31362e32382c34392e34312c302c396103e08301527f332e37362d352e33382c3132342e30362d31332e39322c322e372d2e37362c356104008301527f2e32392d312e35342c372e37352d322e33352c382e37372d322e38372c31362e6104208301527f30352d362e30342c32312e35362d392e3433683063372e37362d342e37372c316104408301527f322e30342d392e39372c31322e30342d31352e3432222f3e3c7061746820643d6104608301527f226d3138342e3538322c3439322e363536632d33312e3335342c31322e3438356104808301527f2d35302e3232332c32382e35382d35302e3232332c34362e3134322c302c392e6104a08301527f3533362c352e3536342c31382e3632372c31352e3637372c32362e393639682e6104c08301527f30323263382e3530332c372e3030352c32302e3231332c31332e3436332c33346104e08301527f2e3532342c31392e3135392c392e3939392c332e3939312c32312e3236392c376105008301527f2e3630392c33332e3539372c31302e3738382c33362e34352c392e3430372c386105208301527f322e3138312c31352e3030322c3133312e3833352c31352e3030327339352e336105408301527f36332d352e3539352c3133312e3830372d31352e3030326331302e3834372d326105608301527f2e37392c32302e3836372d352e3932362c32392e3932342d392e3334392c312e6105808301527f3234342d2e3436372c322e3437332d2e3934322c332e3637332d312e3432342c6105a08301527f31342e3332362d352e3639362c32362e3033352d31322e3136312c33342e35326105c08301527f342d31392e313733682e3032326331302e3131342d382e3334322c31352e36376105e08301527f372d31372e3433332c31352e3637372d32362e3936392c302d31372e3536322d6106008301527f31382e3836392d33332e3636352d35302e3232332d34362e3135222f3e3c70616106208301527f746820643d226d3133342e33362c3539322e373263302c33392e3733352c39366106408301527f2e3535342c37312e3932312c3231352e3635322c37312e393231733231352e366106608301527f32392d33322e3138362c3231352e3632392d37312e393231222f3e3c6c696e656106808301527f2078313d223133342e3336222079313d223539322e3732222078323d223133346106a08301527f2e3336222079323d223533382e373937222f3e3c6c696e652078313d223536356106c08301527f2e3634222079313d223539322e3732222078323d223536352e3634222079323d6106e08301527f223533382e373937222f3e3c706f6c796c696e6520706f696e74733d223438316107008301527f2e383232203438312e393031203438312e373938203438312e383737203438316107208301527f2e373735203438312e383534203335302e303135203335302e303236203231386107408301527f2e313835203231382e313239222f3e3c706f6c796c696e6520706f696e74733d6107608301527f223231382e313835203438312e393031203231382e323331203438312e3835346107808301527f203335302e303135203335302e303236203438312e383232203231382e3135326107a08301527f222f3e3c2f673e000000000000000000000000000000000000000000000000006107c0830152604051998a957f3c672069643d22486f7572676c617373223e000000000000000000000000000060208801528551612df48160329860208a8c019101614823565b8701612e098251809360208a85019101614823565b01612e1d8251809360208985019101614823565b01612e318251809360208885019101614823565b01612e458251809360208785019101614823565b01918201520360168101865201846148dc565b6040519e8f9788977f3c646566733e000000000000000000000000000000000000000000000000000060208a0152612e9b8151809260206026809d019101614823565b8901612eb08251809360208c85019101614823565b01612ec48251809360208b85019101614823565b01612ed88251809360208a85019101614823565b01612eec8251809360208985019101614823565b01612f008251809360208885019101614823565b01612f148251809360208785019101614823565b019182015203600d8101895201876148dc565b6137ba604c60c0830151610120840151936135166131496040602084015193015196612f538186615981565b9461314461012b604051612f66816148c0565b600581527f2d3130302500000000000000000000000000000000000000000000000000000060208201526040519889917f3c74657874506174682073746172744f66667365743d220000000000000000006020840152612fd0815180926020603787019101614823565b7f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666683820160378101919091527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e00000000000000000061010982015282519261311491849161012090910190602001614823565b6a1e17ba32bc3a2830ba341f60a91b90830190910161012081019190915281900361010b810190915201876148dc565b615981565b9561332861012b60405161315c816148c0565b600281527f30250000000000000000000000000000000000000000000000000000000000006020820152604051998a917f3c74657874506174682073746172744f66667365743d2200000000000000000060208401526131c6815180926020603787019101614823565b82017f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666660378201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e00000000000000000061010982015261330382518093602061012085019101614823565b016a1e17ba32bc3a2830ba341f60a91b6101208201520361010b81018a5201886148dc565b61333281846159e9565b9261351161012b604051613345816148c0565b600481527f2d3530250000000000000000000000000000000000000000000000000000000060208201526040519687917f3c74657874506174682073746172744f66667365743d2200000000000000000060208401526133af815180926020603787019101614823565b82017f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666660378201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e0000000000000000006101098201526134ec82518093602061012085019101614823565b016a1e17ba32bc3a2830ba341f60a91b6101208201520361010b8101875201856148dc565b6159e9565b906136f561012b604051613529816148c0565b600381527f353025000000000000000000000000000000000000000000000000000000000060208201526040519485917f3c74657874506174682073746172744f66667365743d220000000000000000006020840152613593815180926020603787019101614823565b82017f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666660378201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e0000000000000000006101098201526136d082518093602061012085019101614823565b016a1e17ba32bc3a2830ba341f60a91b6101208201520361010b8101855201836148dc565b6040519586937f3c7465787420746578742d72656e646572696e673d226f7074696d697a65537060208601527f656564223e000000000000000000000000000000000000000000000000000000604086015261375b815180926020604589019101614823565b8401613771825180936020604585019101614823565b01613786825180936020604585019101614823565b0161379b825180936020604585019101614823565b01661e17ba32bc3a1f60c91b604582015203602c8101845201826148dc565b613a9b61019c60e084015193610140810151906137fc6137f66137f06137ea60806101a086015195015199614b05565b94614b05565b92614b05565b96614b05565b906040519687937f3c75736520687265663d2223476c6f77222066696c6c2d6f7061636974793d2260208601527f2e39222f3e00000000000000000000000000000000000000000000000000000060408601527f3c75736520687265663d2223476c6f772220783d22313030302220793d22313060458601527f3030222066696c6c2d6f7061636974793d222e39222f3e00000000000000000060658601527f3c75736520687265663d22234c6f676f2220783d223137302220793d22313730607c8601527f22207472616e73666f726d3d227363616c65282e3629222f3e3c757365206872609c8601527f65663d2223486f7572676c6173732220783d223135302220793d22393022207460bc8601527f72616e73666f726d3d22726f746174652831302922207472616e73666f726d2d60dc8601527f6f726967696e3d2235303020353030222f3e000000000000000000000000000060fc8601527f3c75736520687265663d222350726f67726573732220783d220000000000000061010e860152805161399681610127936020858a019101614823565b8501927f2220793d22373930222f3e0000000000000000000000000000000000000000008481809694819501527f3c75736520687265663d22235374617475732220783d22000000000000000000610132820152825190613a01826101499560208785019101614823565b01918201527f3c75736520687265663d222353747265616d65642220783d2200000000000000610154820152825190613a448261016d9560208785019101614823565b01918201527f3c75736520687265663d22234475726174696f6e2220783d2200000000000000610178820152825190613a87826101919560208785019101614823565b01918201520361017c8101855201836148dc565b6040519586937f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323060208601527f30302f737667222077696474683d223130303022206865696768743d2231303060408601527f30222076696577426f783d2230203020313030302031303030223e00000000006060860152613b27815180926020607b89019101614823565b8401613b3d825180936020607b85019101614823565b01613b52825180936020607b85019101614823565b01613b67825180936020607b85019101614823565b017f3c2f7376673e0000000000000000000000000000000000000000000000000000607b8201520360618101845201826148dc565b6101405260a05160e0516040517fb971302a0000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa908115614300576000916142b5575b6142b161424a61414f614240609487613d376089613c158a614c55565b9260a0608001516040519485927f5b7b2274726169745f74797065223a224173736574222c2276616c7565223a226020850152613c5c815180926020604088019101614823565b8301907f227d2c7b2274726169745f74797065223a2253656e646572222c2276616c756560408301527f223a22000000000000000000000000000000000000000000000000000000000091826060820152613cc1825180936020606385019101614823565b01907f227d2c7b2274726169745f74797065223a22537461747573222c2276616c756560638301526083820152613d02825180936020608685019101614823565b017f227d5d000000000000000000000000000000000000000000000000000000000060868201520360698101845201826148dc565b6101a05160a05161403961017e613d4f602435614b05565b936080800151613d696001600160a01b0360805116614c55565b90604051968793613f2660208601987f54686973204e465420726570726573656e74732061207061796d656e742073748a527f7265616d20696e2061205361626c696572205632200000000000000000000000604088015282516020840190613dd68160558b0184614823565b8801947f20636f6e74726163742e20546865206f776e6572206f662074686973204e465460558701527f2063616e207769746864726177207468652073747265616d656420617373657460758701527f732c207768696368206172652064656e6f6d696e6174656420696e2000000000609587015282516020840196613e608260b183018a614823565b017f2e5c6e5c6e2d2053747265616d2049443a20000000000000000000000000000060b1820152613e9b82518093602060c385019101614823565b01613ed47f5c6e2d2000000000000000000000000000000000000000000000000000000000958660c384015251809360c7840190614823565b01947f20416464726573733a2000000000000000000000000000000000000000000000958660c7820152613f1282518093602060d185019101614823565b019260d184015251809360d5840190614823565b019060d5820152613f4182518093602060df85019101614823565b017f5c6e5c6e0000000000000000000000000000000000000000000000000000000060df8201527fe29aa0efb88f205741524e494e473a205472616e7366657272696e672074686560e38201527f204e4654206d616b657320746865206e6577206f776e657220746865207265636101038201527f697069656e74206f66207468652073747265616d2e205468652066756e6473206101238201527f617265206e6f74206175746f6d61746963616c6c792077697468647261776e206101438201527f666f72207468652070726576696f757320726563697069656e742e00000000006101638201520361015e8101855201836148dc565b6101a051906141aa61404c602435614b05565b916140cb602d604051809560208201976a029b0b13634b2b9102b19160ad1b8952614081815180926020602b87019101614823565b82017f2023000000000000000000000000000000000000000000000000000000000000602b8201526140bc8251809360208785019101614823565b0103600d8101865201846148dc565b610140516140d890614991565b94604051998a977f7b2261747472696275746573223a00000000000000000000000000000000000060208a0152614119815180926020602e8d019101614823565b8801917f2c226465736372697074696f6e223a2200000000000000000000000000000000602e840152518093603e840190614823565b01917f222c2265787465726e616c5f75726c223a2268747470733a2f2f7361626c6965603e8401527f722e636f6d222c226e616d65223a220000000000000000000000000000000000605e840152518093606d840190614823565b017f222c22696d616765223a22646174613a696d6167652f7376672b786d6c3b6261606d8201527f736536342c000000000000000000000000000000000000000000000000000000608d82015261420b825180936020609285019101614823565b017f227d00000000000000000000000000000000000000000000000000000000000060928201520360748101845201826148dc565b60c0819052614991565b61429d603d60405180937f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000602083015261428d8151809260208686019101614823565b810103601d8101845201826148dc565b604051918291602083526020830190614846565b0390f35b90506020813d6020116142f8575b816142d0602093836148dc565b810103126142f35751906001600160a01b03821682036142f3579061414f613bf8565b600080fd5b3d91506142c3565b6040513d6000823e3d90fd5b634e487b7160e01b600052604160045260246000fd5b6040518061012081011067ffffffffffffffff6101208301111761430c57610120810160405260f881527f3c7061746820643d226d3438312e34362c3530342e3130317635382e3434396360208201527f2d322e33352e37372d342e38322c312e35312d372e33392c322e32332d33302e60408201527f332c382e35342d37342e36352c31332e39322d3132342e30362c31332e39322d60608201527f35332e362c302d3130312e32342d362e33332d3133312e34372d31362e31367660808201527f2d35382e343339683236322e39325a222066696c6c3d2275726c282353616e6460a08201527f426f74746f6d29222f3e3c656c6c697073652063783d22333530222063793d2260c08201527f3530342e313031222072783d223133312e343632222072793d2232382e31303860e08201527f222066696c6c3d2275726c282353616e64546f7029222f3e0000000000000000610100820152996123de565b604051806101c081011067ffffffffffffffff6101c08301111761430c576101c0810160405261019981527f3c706f6c79676f6e20706f696e74733d22333530203335302e3032362034313560208201527f2e3033203238342e39373820323835203238342e39373820333530203335302e60408201527f303236222066696c6c3d2275726c282353616e64426f74746f6d29222f3e3c7060608201527f61746820643d226d3431362e3334312c3238312e39373563302c2e3931342d2e60808201527f3335342c312e3830392d312e3033352c322e36382d352e3534322c372e30373660a08201527f2d33322e3636312c31322e34352d36352e32382c31322e34352d33322e36323460c08201527f2c302d35392e3733382d352e3337342d36352e32382d31322e34352d2e36383160e08201527f2d2e3837322d312e3033352d312e3736372d312e3033352d322e36382c302d2e6101008201527f3931342e3335342d312e3830382c312e3033352d322e3637362c352e3534322d6101208201527f372e3037362c33322e3635362d31322e34352c36352e32382d31322e34352c336101408201527f322e3631392c302c35392e3733382c352e3337342c36352e32382c31322e34356101608201527f2e3638312e3836372c312e3033352c312e3736322c312e3033352c322e3637366101808201527f5a222066696c6c3d2275726c282353616e64546f7029222f3e000000000000006101a082015299612191565b6146ca9198506146b661584c565b906020815191012090602081519101201490565b9638611d39565b905093610d64565b905094610a2f565b60d09461072c565b61470b915060203d602011614711575b61470381836148dc565b810190614926565b386104e0565b503d6146f9565b614731915060203d6020116147115761470381836148dc565b38610489565b634e487b7160e01b600052601260045260246000fd5b61477091925060203d602011614777575b61476881836148dc565b8101906148fe565b903861023d565b503d61475e565b614797915060203d6020116147775761476881836148dc565b386101d2565b506020813d6020116147d2575b816147b7602093836148dc565b810103126142f3575160058110156142f3576101779061016d565b3d91506147aa565b90506020813d60201161481b575b816147f5602093836148dc565b810103126142f357516001600160a01b03811681036142f3576001600160a01b036100ff565b3d91506147e8565b60005b8381106148365750506000910152565b8181015183820152602001614826565b9060209161485f81518092818552858086019101614823565b601f01601f1916010190565b610140810190811067ffffffffffffffff82111761430c57604052565b6020810190811067ffffffffffffffff82111761430c57604052565b6060810190811067ffffffffffffffff82111761430c57604052565b6040810190811067ffffffffffffffff82111761430c57604052565b90601f8019910116810190811067ffffffffffffffff82111761430c57604052565b908160209103126142f357516fffffffffffffffffffffffffffffffff811681036142f35790565b908160209103126142f3575164ffffffffff811681036142f35790565b67ffffffffffffffff811161430c57601f01601f191660200190565b9061496982614943565b61497660405191826148dc565b8281528092614987601f1991614943565b0190602036910137565b805115614af1576040516149a4816148a4565b604081527f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208201527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f60408201528151600292838201809211614adb5760038092047f3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81168103614adb57614a3e908594951b61495f565b936020850193829183518401925b838110614a8a5750505050510680600114614a7757600214614a6c575090565b603d90600019015390565b50603d9081600019820153600119015390565b85600491979293949701918251600190603f9082828260121c16880101518453828282600c1c16880101518385015382828260061c1688010151888501531685010151878201530195929190614a4c565b634e487b7160e01b600052601160045260246000fd5b50604051614afe81614888565b6000815290565b806000917a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000080821015614c47575b506d04ee2d6d415b85acef810000000080831015614c38575b50662386f26fc1000080831015614c29575b506305f5e10080831015614c1a575b5061271080831015614c0b575b506064821015614bfb575b600a80921015614bf1575b600190816021614b9c82870161495f565b95860101905b614bae575b5050505090565b600019019083907f30313233343536373839616263646566000000000000000000000000000000008282061a835304918215614bec57919082614ba2565b614ba7565b9160010191614b8b565b9190606460029104910191614b80565b60049193920491019138614b75565b60089193920491019138614b68565b60109193920491019138614b59565b60209193920491019138614b47565b604093508104915038614b2e565b6001600160a01b031660405190614c6b826148a4565b602a8252602082016040368237825115614d8357603090538151600190811015614d8357607860218401536029905b808211614d08575050614caa5790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602060248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b9091600f81166010811015614d6e577f3031323334353637383961626364656600000000000000000000000000000000901a614d448486614d99565b5360041c918015614d59576000190190614c9a565b60246000634e487b7160e01b81526011600452fd5b60246000634e487b7160e01b81526032600452fd5b634e487b7160e01b600052603260045260246000fd5b908151811015614d83570160200190565b60405190614db7826148c0565b600482527f2667743b000000000000000000000000000000000000000000000000000000006020830152565b60405190614df0826148c0565b600482527f266c743b000000000000000000000000000000000000000000000000000000006020830152565b90614e839294936040519586928451614e3d81602097888089019101614823565b8401614e5182518093888085019101614823565b01614e6482518093878085019101614823565b01614e7782518093868085019101614823565b010380855201836148dc565b565b80156151965760009180615171575090505b6001908082811015614f0457505050614eae614de3565b614f01602260405183614ecb829551809260208086019101614823565b81017f203100000000000000000000000000000000000000000000000000000000000060208201520360028101845201826148dc565b90565b66038d7ea4c6800011156151145760409081519060a0820182811067ffffffffffffffff82111761430c57808452614f3b81614888565b600081528252825190614f4d826148c0565b8482526020917f4b0000000000000000000000000000000000000000000000000000000000000083820152828401528351614f87816148c0565b8581527f4d0000000000000000000000000000000000000000000000000000000000000083820152848401528351614fbe816148c0565b8581527f42000000000000000000000000000000000000000000000000000000000000008382015260608401528351614ff6816148c0565b8581527f54000000000000000000000000000000000000000000000000000000000000008382015260808401526000918583965b6150e8575b5084519461503c866148c0565b6007908187527f2623383830353b0000000000000000000000000000000000000000000000000083880152519560005b8281106150d557505050506150b66150bc917f20000000000000000000000000000000000000000000000000000000000000006027870152600886526150b1866148c0565b614b05565b91615740565b916005851015614d8357614f019460051b015192614e1c565b818101840151888201850152830161506c565b9591926103e89081851061510b57508680916064600a870406950493019661502a565b9392965061502f565b505061511e614daa565b614f0160286040518361513b829551809260208086019101614823565b81017f203939392e39395400000000000000000000000000000000000000000000000060208201520360088101845201826148dc565b600a0a918215615182575004614e97565b80634e487b7160e01b602492526012600452fd5b50506040516151a4816148c0565b600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b620151809103048061523957506151e6614de3565b614f01602660405183615203829551809260208086019101614823565b81017f203120446179000000000000000000000000000000000000000000000000000060208201520360068101845201826148dc565b61270f811161530857600181036152c557614f01602061528d60405161525e816148c0565b600481527f20446179000000000000000000000000000000000000000000000000000000008382015293614b05565b60405193816152a58693518092868087019101614823565b82016152b982518093868085019101614823565b010380845201826148dc565b614f01602061528d6040516152d9816148c0565b600581527f20446179730000000000000000000000000000000000000000000000000000008382015293614b05565b50615311614daa565b614f01602a6040518361532e829551809260208086019101614823565b81017f2039393939204461797300000000000000000000000000000000000000000000602082015203600a8101845201826148dc565b6020818303126142f35780519067ffffffffffffffff82116142f3570181601f820112156142f357805161539781614943565b926153a560405194856148dc565b818452602082840101116142f357614f019160208085019101614823565b6001600160a01b031660409081516395d89b4160e01b8152600081600481855afa90811561559d5760009161557c575b506154588351615402816148c0565b601181527f5341422d56322d4c4f434b55502d4c494e0000000000000000000000000000006020918201528251908301207fc66b376a19264d832c1bc254000c18944ca5aa57ed50f4ea637c4da424d4c3bb1490565b1561549657505051615469816148c0565b600d81527f4c6f636b7570204c696e65617200000000000000000000000000000000000000602082015290565b6154fa83516154a4816148c0565b601181527f5341422d56322d4c4f434b55502d44594e0000000000000000000000000000006020918201528251908301207f6ab655856fa5352de8c05542b1937ac63c59342da992602767c02734cc5391651490565b156155385750505161550b816148c0565b600e81527f4c6f636b75702044796e616d6963000000000000000000000000000000000000602082015290565b6155789083519384937f814a8a2e000000000000000000000000000000000000000000000000000000008552600485015260248401526044830190614846565b0390fd5b615597913d8091833e61558f81836148dc565b810190615364565b386153f3565b83513d6000823e3d90fd5b3d156155d3573d906155b982614943565b916155c760405193846148dc565b82523d6000602084013e565b606090565b60405160208101907f313ce56700000000000000000000000000000000000000000000000000000000825260048152615610816148c0565b6000928392839251915afa6156236155a8565b908061565a575b156156565760208180518101031261565257602001519060ff8216820361564f575090565b80fd5b5080fd5b5090565b50602081511461562a565b6000809160405160208101906395d89b4160e01b825260048152615688816148c0565b51915afa6156946155a8565b90158015615734575b6156fa57806020806156b493518301019101615364565b601e815111600014614f0157506040516156cd816148c0565b600b81527f4c6f6e672053796d626f6c000000000000000000000000000000000000000000602082015290565b50604051615707816148c0565b600581527f4552433230000000000000000000000000000000000000000000000000000000602082015290565b5060408151111561569d565b806157525750604051614afe81614888565b600a8110156157b75761576490614b05565b614f01602260405180937f2e3000000000000000000000000000000000000000000000000000000000000060208301526157a78151809260208686019101614823565b81010360028101845201826148dc565b6157c090614b05565b614f01602160405180937f2e0000000000000000000000000000000000000000000000000000000000000060208301526158038151809260208686019101614823565b81010360018101845201826148dc565b60405190615820826148c0565b600782527f536574746c6564000000000000000000000000000000000000000000000000006020830152565b60405190615859826148c0565b600882527f4465706c657465640000000000000000000000000000000000000000000000006020830152565b600581101561596b576004810361589f5750614f0161584c565b600381036158e157506040516158b4816148c0565b600881527f43616e63656c6564000000000000000000000000000000000000000000000000602082015290565b6001810361592357506040516158f6816148c0565b600981527f53747265616d696e670000000000000000000000000000000000000000000000602082015290565b60020361593257614f01615813565b60405161593e816148c0565b600781527f50656e64696e6700000000000000000000000000000000000000000000000000602082015290565b634e487b7160e01b600052602160045260246000fd5b6030614e839193929360405194816159a3879351809260208087019101614823565b820164010714051160dd1b60208201526a029b0b13634b2b9102b19160ad1b60258201526159da8251809360208785019101614823565b010360108101855201836148dc565b6025614e83919392936040519481615a0b879351809260208087019101614823565b820164010714051160dd1b6020820152615a2e8251809360208785019101614823565b010360058101855201836148dc565b60405190615a4a826148c0565b601082527f68736c283233302c3231252c31312529000000000000000000000000000000006020830152565b8015615ca857615a84615a3d565b90612710908103908111614adb57614f0191615aa261013692614b05565b6040519485927f3c672066696c6c3d226e6f6e65223e000000000000000000000000000000000060208501527f3c636972636c652063783d22313636222063793d2235302220723d2232322220602f8501527f7374726f6b653d22000000000000000000000000000000000000000000000000604f850152615b2e815180926020605788019101614823565b83017f22207374726f6b652d77696474683d223130222f3e000000000000000000000060578201527f3c636972636c652063783d22313636222063793d2235302220706174684c656e606c8201527f6774683d2231303030302220723d22323222207374726f6b653d220000000000608c820152615bb682518093602060a785019101614823565b017f22207374726f6b652d6461736861727261793d22313030303022207374726f6b60a78201527f652d646173686f66667365743d2200000000000000000000000000000000000060c7820152615c1782518093602060d585019101614823565b017f22207374726f6b652d6c696e656361703d22726f756e6422207374726f6b652d60d58201527f77696474683d223522207472616e73666f726d3d22726f74617465282d39302960f58201527f22207472616e73666f726d2d6f726967696e3d22313636203530222f3e000000610115820152631e17b39f60e11b610132820152036101168101845201826148dc565b5050604051614afe81614888565b60009080518015615d2b579060009182915b818310615cda57505050600d02900390565b909193603b60f81b7fff00000000000000000000000000000000000000000000000000000000000000615d0d8785614d99565b511614615d23575b600d01936001019190615cc8565b849350615d15565b505050600090565b60009080518015615d2b579060009182915b818310615d575750505060041b900390565b909193603b60f81b7fff00000000000000000000000000000000000000000000000000000000000000615d8a8785614d99565b511614615da0575b601001936001019190615d45565b849350615d9256"; From be1506ae6c65b2aae483262d0c9e13aa95c70650 Mon Sep 17 00:00:00 2001 From: andreivladbrg Date: Thu, 7 Sep 2023 20:00:34 +0300 Subject: [PATCH 09/47] feat: implement _afterTokenTransfer to emit an event --- src/abstracts/SablierV2Lockup.sol | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/abstracts/SablierV2Lockup.sol b/src/abstracts/SablierV2Lockup.sol index 5e7c8909d..d0bb669fd 100644 --- a/src/abstracts/SablierV2Lockup.sol +++ b/src/abstracts/SablierV2Lockup.sol @@ -324,6 +324,20 @@ abstract contract SablierV2Lockup is INTERNAL CONSTANT FUNCTIONS //////////////////////////////////////////////////////////////////////////*/ + /// @notice Overrides the internal ERC-721 transfer function to update the NFT SVG on external platforms by emitting + /// an event upon transfer. + /// @dev This event is also emitted when the NFT is minted or burned. + function _afterTokenTransfer( + address, + address, + uint256 streamId, + uint256 + ) + internal + override + updateMetadata(streamId) + { } + /// @notice Overrides the internal ERC-721 transfer function to check that the stream is transferable. /// @dev There are two cases when the transferable flag is ignored: /// - If `from` is 0, then the transfer is a mint and is allowed. From d75e71ee07a5be91f5163c5434dbd9e01bdf221e Mon Sep 17 00:00:00 2001 From: andreivladbrg Date: Fri, 8 Sep 2023 17:36:00 +0300 Subject: [PATCH 10/47] test: expect MetadataUpdate event to be emitted --- test/fork/LockupDynamic.t.sol | 7 +++++-- test/fork/LockupLinear.t.sol | 8 ++++++-- .../create-with-deltas/createWithDeltas.t.sol | 4 +++- .../create-with-deltas/createWithDeltas.tree | 1 + .../create-with-milestones/createWithMilestones.t.sol | 4 +++- .../create-with-milestones/createWithMilestones.tree | 2 ++ .../create-with-durations/createWithDurations.t.sol | 4 +++- .../create-with-range/createWithRange.t.sol | 4 +++- .../create-with-range/createWithRange.tree | 2 ++ test/integration/concrete/lockup/burn/burn.t.sol | 10 ++++++++++ test/integration/concrete/lockup/burn/burn.tree | 9 ++++++--- .../withdrawMaxAndTransfer.t.sol | 2 ++ .../withdrawMaxAndTransfer.tree | 3 ++- 13 files changed, 48 insertions(+), 12 deletions(-) diff --git a/test/fork/LockupDynamic.t.sol b/test/fork/LockupDynamic.t.sol index 425f66101..1e35c87e4 100644 --- a/test/fork/LockupDynamic.t.sol +++ b/test/fork/LockupDynamic.t.sol @@ -154,11 +154,14 @@ abstract contract LockupDynamic_Fork_Test is Fork_Test { vars.initialLockupDynamicBalance = vars.balances[0]; vars.initialBrokerBalance = vars.balances[1]; - // Expect the relevant event to be emitted. vars.streamId = lockupDynamic.nextStreamId(); - vm.expectEmit({ emitter: address(lockupDynamic) }); vars.range = LockupDynamic.Range({ start: params.startTime, end: params.segments[params.segments.length - 1].milestone }); + + // Expect the relevant events to be emitted. + vm.expectEmit({ emitter: address(lockupDynamic) }); + emit MetadataUpdate({ _tokenId: vars.streamId }); + vm.expectEmit({ emitter: address(lockupDynamic) }); emit CreateLockupDynamicStream({ streamId: vars.streamId, funder: holder, diff --git a/test/fork/LockupLinear.t.sol b/test/fork/LockupLinear.t.sol index 3161994ed..63c85c972 100644 --- a/test/fork/LockupLinear.t.sol +++ b/test/fork/LockupLinear.t.sol @@ -92,7 +92,8 @@ abstract contract LockupLinear_Fork_Test is Fork_Test { /// - It should bump the next stream id. /// - It should record the protocol fee. /// - It should mint the NFT. - /// - It should emit a {CreateLockupDynamicStream} event. + /// - It should emit a {MetadataUpdate} event + /// - It should emit a {CreateLockupLinearStream} event. /// - It may make a withdrawal. /// - It may update the withdrawn amounts. /// - It may emit a {WithdrawFromLockupStream} event. @@ -158,8 +159,11 @@ abstract contract LockupLinear_Fork_Test is Fork_Test { vars.createAmounts.brokerFee = ud(params.totalAmount).mul(params.broker.fee).intoUint128(); vars.createAmounts.deposit = params.totalAmount - vars.createAmounts.protocolFee - vars.createAmounts.brokerFee; - // Expect the relevant event to be emitted. vars.streamId = lockupLinear.nextStreamId(); + + // Expect the relevant events to be emitted. + vm.expectEmit({ emitter: address(lockupLinear) }); + emit MetadataUpdate({ _tokenId: vars.streamId }); vm.expectEmit({ emitter: address(lockupLinear) }); emit CreateLockupLinearStream({ streamId: vars.streamId, diff --git a/test/integration/concrete/lockup-dynamic/create-with-deltas/createWithDeltas.t.sol b/test/integration/concrete/lockup-dynamic/create-with-deltas/createWithDeltas.t.sol index 4ad1b9bee..cd79d99a4 100644 --- a/test/integration/concrete/lockup-dynamic/create-with-deltas/createWithDeltas.t.sol +++ b/test/integration/concrete/lockup-dynamic/create-with-deltas/createWithDeltas.t.sol @@ -145,7 +145,9 @@ contract CreateWithDeltas_LockupDynamic_Integration_Concrete_Test is // Expect the broker fee to be paid to the broker. expectCallToTransferFrom({ from: funder, to: users.broker, amount: defaults.BROKER_FEE_AMOUNT() }); - // Expect the relevant event to be emitted. + // Expect the relevant events to be emitted. + vm.expectEmit({ emitter: address(lockupDynamic) }); + emit MetadataUpdate({ _tokenId: streamId }); vm.expectEmit({ emitter: address(lockupDynamic) }); emit CreateLockupDynamicStream({ streamId: streamId, diff --git a/test/integration/concrete/lockup-dynamic/create-with-deltas/createWithDeltas.tree b/test/integration/concrete/lockup-dynamic/create-with-deltas/createWithDeltas.tree index 3648c8bf9..3824747f3 100644 --- a/test/integration/concrete/lockup-dynamic/create-with-deltas/createWithDeltas.tree +++ b/test/integration/concrete/lockup-dynamic/create-with-deltas/createWithDeltas.tree @@ -18,5 +18,6 @@ createWithDeltas.t.sol ├── it should bump the next stream id ├── it should record the protocol fee ├── it should mint the NFT + ├── it should emit a {MetadataUpdate} event ├── it should perform the ERC-20 transfers └── it should emit a {CreateLockupDynamicStream} event diff --git a/test/integration/concrete/lockup-dynamic/create-with-milestones/createWithMilestones.t.sol b/test/integration/concrete/lockup-dynamic/create-with-milestones/createWithMilestones.t.sol index 82e5d54c9..f065c4738 100644 --- a/test/integration/concrete/lockup-dynamic/create-with-milestones/createWithMilestones.t.sol +++ b/test/integration/concrete/lockup-dynamic/create-with-milestones/createWithMilestones.t.sol @@ -359,7 +359,9 @@ contract CreateWithMilestones_LockupDynamic_Integration_Concrete_Test is amount: defaults.BROKER_FEE_AMOUNT() }); - // Expect the relevant event to be emitted. + // Expect the relevant events to be emitted. + vm.expectEmit({ emitter: address(lockupDynamic) }); + emit MetadataUpdate({ _tokenId: streamId }); vm.expectEmit({ emitter: address(lockupDynamic) }); emit CreateLockupDynamicStream({ streamId: streamId, diff --git a/test/integration/concrete/lockup-dynamic/create-with-milestones/createWithMilestones.tree b/test/integration/concrete/lockup-dynamic/create-with-milestones/createWithMilestones.tree index 3f40483aa..c90aecfc5 100644 --- a/test/integration/concrete/lockup-dynamic/create-with-milestones/createWithMilestones.tree +++ b/test/integration/concrete/lockup-dynamic/create-with-milestones/createWithMilestones.tree @@ -45,6 +45,7 @@ createWithMilestones.t.sol │ ├── it should bump the next stream id │ ├── it should record the protocol fee │ ├── it should mint the NFT + │ ├── it should emit a {MetadataUpdate} event │ ├── it should perform the ERC-20 transfers │ └── it should emit a {CreateLockupDynamicStream} event └── when the asset does not miss the ERC-20 return value @@ -52,5 +53,6 @@ createWithMilestones.t.sol ├── it should bump the next stream id ├── it should record the protocol fee ├── it should mint the NFT + ├── it should emit a {MetadataUpdate} event ├── it should perform the ERC-20 transfers └── it should emit a {CreateLockupDynamicStream} event diff --git a/test/integration/concrete/lockup-linear/create-with-durations/createWithDurations.t.sol b/test/integration/concrete/lockup-linear/create-with-durations/createWithDurations.t.sol index dc5543c3c..02f9c53ab 100644 --- a/test/integration/concrete/lockup-linear/create-with-durations/createWithDurations.t.sol +++ b/test/integration/concrete/lockup-linear/create-with-durations/createWithDurations.t.sol @@ -110,7 +110,9 @@ contract CreateWithDurations_LockupLinear_Integration_Concrete_Test is // Expect the broker fee to be paid to the broker. expectCallToTransferFrom({ from: funder, to: users.broker, amount: defaults.BROKER_FEE_AMOUNT() }); - // Expect the relevant event to be emitted. + // Expect the relevant events to be emitted. + vm.expectEmit({ emitter: address(lockupLinear) }); + emit MetadataUpdate({ _tokenId: streamId }); vm.expectEmit({ emitter: address(lockupLinear) }); emit CreateLockupLinearStream({ streamId: streamId, diff --git a/test/integration/concrete/lockup-linear/create-with-range/createWithRange.t.sol b/test/integration/concrete/lockup-linear/create-with-range/createWithRange.t.sol index a96f874c2..65a988b08 100644 --- a/test/integration/concrete/lockup-linear/create-with-range/createWithRange.t.sol +++ b/test/integration/concrete/lockup-linear/create-with-range/createWithRange.t.sol @@ -197,7 +197,9 @@ contract CreateWithRange_LockupLinear_Integration_Concrete_Test is amount: defaults.BROKER_FEE_AMOUNT() }); - // Expect the relevant event to be emitted. + // Expect the relevant events to be emitted. + vm.expectEmit({ emitter: address(lockupLinear) }); + emit MetadataUpdate({ _tokenId: streamId }); vm.expectEmit({ emitter: address(lockupLinear) }); emit CreateLockupLinearStream({ streamId: streamId, diff --git a/test/integration/concrete/lockup-linear/create-with-range/createWithRange.tree b/test/integration/concrete/lockup-linear/create-with-range/createWithRange.tree index 16b1ba5da..6d810042a 100644 --- a/test/integration/concrete/lockup-linear/create-with-range/createWithRange.tree +++ b/test/integration/concrete/lockup-linear/create-with-range/createWithRange.tree @@ -31,6 +31,7 @@ createWithRange.t.sol │ ├── it should bump the next stream id │ ├── it should record the protocol fee │ ├── it should mint the NFT + │ ├── it should emit a {MetadataUpdate} event │ ├── it should perform the ERC-20 transfers │ └── it should emit a {CreateLockupLinearStream} event └── when the asset does not miss the ERC-20 return value @@ -38,6 +39,7 @@ createWithRange.t.sol ├── it should bump the next stream id ├── it should record the protocol fee ├── it should mint the NFT + ├── it should emit a {MetadataUpdate} event ├── it should perform the ERC-20 transfers └── it should emit a {CreateLockupLinearStream} event diff --git a/test/integration/concrete/lockup/burn/burn.t.sol b/test/integration/concrete/lockup/burn/burn.t.sol index 0072187f3..219f6ae86 100644 --- a/test/integration/concrete/lockup/burn/burn.t.sol +++ b/test/integration/concrete/lockup/burn/burn.t.sol @@ -136,6 +136,9 @@ abstract contract Burn_Integration_Concrete_Test is Integration_Test, Lockup_Int whenCallerAuthorized givenNFTExists { + // Expect the relevant event to be emitted. + vm.expectEmit({ emitter: address(lockup) }); + emit MetadataUpdate({ _tokenId: notTransferableStreamId }); lockup.burn(notTransferableStreamId); vm.expectRevert("ERC721: invalid token ID"); lockup.getRecipient(notTransferableStreamId); @@ -160,6 +163,10 @@ abstract contract Burn_Integration_Concrete_Test is Integration_Test, Lockup_Int // Make the approved operator the caller in this test. changePrank({ msgSender: users.operator }); + // Expect the relevant event to be emitted. + vm.expectEmit({ emitter: address(lockup) }); + emit MetadataUpdate({ _tokenId: streamId }); + // Burn the NFT. lockup.burn(streamId); @@ -177,6 +184,9 @@ abstract contract Burn_Integration_Concrete_Test is Integration_Test, Lockup_Int givenNFTExists givenTransferableStream { + // Expect the relevant event to be emitted. + vm.expectEmit({ emitter: address(lockup) }); + emit MetadataUpdate({ _tokenId: streamId }); lockup.burn(streamId); vm.expectRevert("ERC721: invalid token ID"); lockup.getRecipient(streamId); diff --git a/test/integration/concrete/lockup/burn/burn.tree b/test/integration/concrete/lockup/burn/burn.tree index 5b24d2e93..90efa59eb 100644 --- a/test/integration/concrete/lockup/burn/burn.tree +++ b/test/integration/concrete/lockup/burn/burn.tree @@ -22,9 +22,12 @@ burn.t.sol │ └── it should revert └── given the NFT exists ├── given the NFT is not transferable - │ └── it should burn the NFT + │ ├── it should burn the NFT + │ └── it should emit a {MetadataUpdate} event └── given the NFT is transferable ├── when the caller is an approved third party - │ └── it should burn the NFT + │ ├── it should burn the NFT + │ └── it should emit a {MetadataUpdate} event └── when the caller is the owner of the NFT - └── it should burn the NFT + ├── it should burn the NFT + └── it should emit a {MetadataUpdate} event diff --git a/test/integration/concrete/lockup/withdraw-max-and-transfer/withdrawMaxAndTransfer.t.sol b/test/integration/concrete/lockup/withdraw-max-and-transfer/withdrawMaxAndTransfer.t.sol index a5a53433d..9709e5827 100644 --- a/test/integration/concrete/lockup/withdraw-max-and-transfer/withdrawMaxAndTransfer.t.sol +++ b/test/integration/concrete/lockup/withdraw-max-and-transfer/withdrawMaxAndTransfer.t.sol @@ -103,6 +103,8 @@ abstract contract WithdrawMaxAndTransfer_Integration_Concrete_Test is emit WithdrawFromLockupStream({ streamId: defaultStreamId, to: users.recipient, amount: withdrawAmount }); vm.expectEmit({ emitter: address(lockup) }); emit Transfer({ from: users.recipient, to: users.alice, tokenId: defaultStreamId }); + vm.expectEmit({ emitter: address(lockup) }); + emit MetadataUpdate({ _tokenId: defaultStreamId }); // Make the max withdrawal and transfer the NFT. lockup.withdrawMaxAndTransfer({ streamId: defaultStreamId, newRecipient: users.alice }); diff --git a/test/integration/concrete/lockup/withdraw-max-and-transfer/withdrawMaxAndTransfer.tree b/test/integration/concrete/lockup/withdraw-max-and-transfer/withdrawMaxAndTransfer.tree index caba36c6a..f53682e9e 100644 --- a/test/integration/concrete/lockup/withdraw-max-and-transfer/withdrawMaxAndTransfer.tree +++ b/test/integration/concrete/lockup/withdraw-max-and-transfer/withdrawMaxAndTransfer.tree @@ -21,4 +21,5 @@ withdrawMaxAndTransfer.t.sol ├── it should update the withdrawn amount ├── it should transfer the NFT ├── it should emit a {WithdrawFromLockupStream} event - └── it should emit a {Transfer} event + ├── it should emit a {Transfer} event + └── it should emit a {MetadataUpdate} event From 0b3400d7107030ec87bfd97e28a270c358e46d6e Mon Sep 17 00:00:00 2001 From: andreivladbrg Date: Fri, 8 Sep 2023 17:47:49 +0300 Subject: [PATCH 11/47] test: update Precompiles bytecode --- test/utils/Precompiles.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/utils/Precompiles.sol b/test/utils/Precompiles.sol index f9d977d89..a1e066d5d 100644 --- a/test/utils/Precompiles.sol +++ b/test/utils/Precompiles.sol @@ -27,9 +27,9 @@ contract Precompiles { bytes public constant BYTECODE_COMPTROLLER = hex"60803461009857601f6104a638819003918201601f19168301916001600160401b0383118484101761009d5780849260209460405283398101031261009857516001600160a01b0381169081900361009857600080546001600160a01b0319168217815560405191907fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a36103f290816100b48239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe608060408181526004918236101561001657600080fd5b600092833560e01c9182634d81e51d1461039d5750816375829def146102e5578163907a267b14610253578163b5b3ca2c146101ab578163cb01e30e146100f957508063dcf844a7146100c3578063e07df5b4146100a55763f851a4401461007d57600080fd5b346100a157816003193601126100a1576001600160a01b0360209254169051908152f35b5080fd5b50346100a157816003193601126100a1576020906001549051908152f35b50346100a15760203660031901126100a157806020926001600160a01b036100e96103d7565b1681526003845220549051908152f35b9050346101a75760203660031901126101a7576101146103d7565b6001600160a01b03918285541633810361017a575050169081835260026020528083209081549160ff8316159260ff84169060ff1916179055519081527f8cd3a7bc46b26a3b0c07a05a47af78abcaa647626f631d92ea64f8867b23bbec60203392a380f35b84516331b339a960e21b81526001600160a01b039091169181019182523360208301529081906040010390fd5b8280fd5b9050346101a757816003193601126101a7576101c56103d7565b90602435916001600160a01b039182865416338103610226575050907f371789a3d97098f3070492613273a065a7e8a19e009fd1ae92a4b4d4c71ed62d9116928385526003602052808520928084549455815193845260208401523392a380f35b85516331b339a960e21b81526001600160a01b039091169181019182523360208301529081906040010390fd5b919050346101a75760203660031901126101a7578135916001600160a01b038454163381036102b85750507fc059ba3e07a1c4d1fa8845bdb2af2dd85e844684e0a59e6073499e4338788465906001549280600155815193845260208401523392a280f35b82516331b339a960e21b81526001600160a01b039091169181019182523360208301529081906040010390fd5b919050346101a75760203660031901126101a7578135916001600160a01b03918284168094036103995784549283169033820361036d575050507fffffffffffffffffffffffff00000000000000000000000000000000000000001681178255337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808380a380f35b516331b339a960e21b81526001600160a01b039091169181019182523360208301529081906040010390fd5b8480fd5b849084346101a75760203660031901126101a75760ff906020936001600160a01b036103c76103d7565b1681526002855220541615158152f35b600435906001600160a01b03821682036103ed57565b600080fd"; bytes public constant BYTECODE_LOCKUP_DYNAMIC = - hex"60c0346200046e57601f62005ea838819003918201601f19168301916001600160401b038311848410176200032b578084926080946040528339810103126200046e5780516001600160a01b038082169290918390036200046e5760208101518281168091036200046e5760408201519183831683036200046e5760600151936200008962000473565b90601d82527f5361626c696572205632204c6f636b75702044796e616d6963204e46540000006020830152620000be62000473565b601181527029a0a116ab1916a627a1a5aaa816a22ca760791b602082015230608052600080546001600160a01b03199081168417825560018054909116909517909455927fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a38051906001600160401b0382116200032b5760035490600182811c9216801562000463575b60208310146200044d5781601f849311620003d8575b50602090601f83116001146200034d5760009262000341575b50508160011b916000199060031b1c1916176003555b80516001600160401b0381116200032b576004918254600181811c9116801562000320575b60208210146200030b579081601f849311620002b3575b50602090601f831160011462000248576000926200023c575b50508160011b916000199060031b1c19161790555b1660018060a01b0319600a541617600a5560a0526001600955604051615a14908162000494823960805181615420015260a0518181816110f8015261497c0152f35b015190503880620001e5565b6000858152602081209350601f198516905b8181106200029a575090846001959493921062000280575b505050811b019055620001fa565b015160001960f88460031b161c1916905538808062000272565b929360206001819287860151815501950193016200025a565b909150836000526020600020601f840160051c8101916020851062000300575b90601f859493920160051c01905b818110620002f05750620001cc565b60008155849350600101620002e1565b9091508190620002d3565b602284634e487b7160e01b6000525260246000fd5b90607f1690620001b5565b634e487b7160e01b600052604160045260246000fd5b0151905038806200017a565b600360009081527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b9350601f198516905b818110620003bf5750908460019594939210620003a5575b505050811b0160035562000190565b015160001960f88460031b161c1916905538808062000396565b929360206001819287860151815501950193016200037e565b60036000529091507fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f840160051c8101916020851062000442575b90601f859493920160051c01905b81811062000432575062000161565b6000815584935060010162000423565b909150819062000415565b634e487b7160e01b600052602260045260246000fd5b91607f16916200014b565b600080fd5b60408051919082016001600160401b038111838210176200032b5760405256fe608080604052600436101561001357600080fd5b60003560e01c90816301ffc9a714612a9c5750806306fdde03146129d9578063081812fc146129bb578063095ea7b3146128275780631400ecec1461278257806316844456146125075780631c1cdd4c146124a15780631e99d5691461248357806323b872dd1461245a57806339a73c031461241757806340e58ee514612076578063425d30dd1461205857806342842e0e1461200857806342966c6814611ec95780634857501f14611e535780634869e12d14611e175780635fe3b56714611df05780636352211e14611dc15780636d0cee7514611d6957806370a0823114611cbf57806375829def14611c2d5780637cad6cd114611b5b5780637de6b1db146119325780638659c270146114da578063894e9a0d1461126d5780638bad38dd146111f15780638f69b9931461116e5780639067b6771461111b5780639188ec84146110e057806395d89b4114610fd2578063a22cb46514610f01578063a2ffb89714610e08578063a6202bf214610cff578063a80fc07114610caa578063ad35efd414610c47578063b256456914610c29578063b637b86514610bc9578063b88d4fde14610b3e578063b8a3be6614610b07578063b971302a14610ab5578063bc063e1a14610a92578063bc2be1be14610a3f578063c156a11d14610962578063c33cd35e1461084d578063c87b56dd1461071a578063cc364f481461067f578063d4dbd20b1461062a578063d511609f146105db578063d975dfed1461058e578063e985e9c514610537578063ea5ead19146104ef578063eac8f5b814610483578063f590c1761461045b578063f851a440146104345763fdd46d601461027c57600080fd5b3461042f57606036600319011261042f57600435610298612bc9565b604435906001600160801b03821680830361042f576102b5615416565b6102be8461349a565b610417576102e284600052600b6020526001600160a01b0360406000205416331490565b1580610407575b6103e45761030d84600052600b6020526001600160a01b0360406000205416331490565b806103c0575b610393576001600160a01b03821615610369571561035157916103486020926000805160206159f48339815191529483615631565b604051908152a1005b6024836040519063d2aabcd960e01b82526004820152fd5b60046040517fc61a0e9e000000000000000000000000000000000000000000000000000000008152fd5b6064846001600160a01b038460405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b508360005260056020526001600160a01b0380604060002054169083161415610313565b60405163216caf0d60e01b815260048101859052336024820152604490fd5b0390fd5b506104118461584b565b156102e9565b60248460405190634a5541ef60e01b82526004820152fd5b600080fd5b3461042f57600036600319011261042f5760206001600160a01b0360005416604051908152f35b3461042f57602036600319011261042f5760206104796004356134ea565b6040519015158152f35b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d857600052600b60205260206001600160a01b0360016040600020015416604051908152f35b6024906040519062b8e7e760e51b82526004820152fd5b3461042f57604036600319011261042f576000805160206159f4833981519152602060043561034861051f612bc9565b610528836154d8565b90610531615416565b83615510565b3461042f57604036600319011261042f57610550612bb3565b610558612bc9565b906001600160a01b03809116600052600860205260406000209116600052602052602060ff604060002054166040519015158152f35b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d8576105ca6020916154d8565b6001600160801b0360405191168152f35b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d857600052600b602052602060026040600020015460801c604051908152f35b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d857600052600b60205260206001600160801b0360036040600020015416604051908152f35b3461042f57602036600319011261042f57600435600060206040516106a381612d03565b828152015280600052600b60205260ff60016040600020015460a81c16156104d857600052600b602052604080600020548151906106e082612d03565b64ffffffffff90818160a01c16835260c81c166020820152610718825180926020908164ffffffffff91828151168552015116910152565bf35b3461042f5760208060031936011261042f57600435906107586107538360005260056020526001600160a01b0360406000205416151590565b612da2565b60006001600160a01b03600a5416926044604051809581937fe9dc637500000000000000000000000000000000000000000000000000000000835230600484015260248301525afa918215610841576000926107c8575b506107c4604051928284938452830190612b8e565b0390f35b9091503d806000833e6107db8183612d50565b810190828183031261042f5780519067ffffffffffffffff821161042f570181601f8201121561042f57805161081081612d72565b9261081e6040519485612d50565b81845284828401011161042f5761083a91848085019101612b6b565b90826107af565b6040513d6000823e3d90fd5b3461042f5760031960203682011261042f576004359067ffffffffffffffff9081831161042f5761014090833603011261042f57610889615416565b6040519161089683612ce6565b6108a281600401612bdf565b83526108b06024820161351b565b60208401526108c160448201612cbd565b60408401526108d260648201612cbd565b60608401526108e360848201612bdf565b60808401526108f460a48201612d8e565b60a084015261090560c48201612bdf565b60c08401526109173660e48301613601565b60e084015261012481013591821161042f57013660238201121561042f5760209161094f61095a92369060246004820135910161352d565b6101008201526148cd565b604051908152f35b3461042f57604036600319011261042f5760043561097e612bc9565b610986615416565b81600052600b60205260ff60016040600020015460a81c1615610a28578160005260056020526001600160a01b0360406000205416803303610a095791610348816020936000805160206159f4833981519152956109e3836154d8565b6001600160801b0381166109f8575b50613035565b610a03908285615631565b876109f2565b60405163216caf0d60e01b815260048101849052336024820152604490fd5b6024826040519062b8e7e760e51b82526004820152fd5b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d857600052600b602052602064ffffffffff60406000205460a01c16604051908152f35b3461042f57600036600319011261042f57602060405167016345785d8a00008152f35b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d857600052600b60205260206001600160a01b0360406000205416604051908152f35b3461042f57602036600319011261042f57600435600052600b602052602060ff60016040600020015460a81c166040519015158152f35b3461042f57608036600319011261042f57610b57612bb3565b610b5f612bc9565b6064359167ffffffffffffffff831161042f573660238401121561042f57826004013591610b8c83612d72565b92610b9a6040519485612d50565b808452366024828701011161042f576020816000926024610bc79801838801378501015260443591612ec0565b005b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d857600052600b6020526107c4610c156004604060002001613382565b604051918291602083526020830190612c59565b3461042f57602036600319011261042f576020610479600435613463565b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d857610c81906147d1565b6040516005821015610c94576020918152f35b634e487b7160e01b600052602160045260246000fd5b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d857600052600b60205260206001600160801b0360026040600020015416604051908152f35b3461042f57602036600319011261042f57610d18612bb3565b6001600160a01b038060005416338103610ddf57508116908160005260026020526001600160801b0360406000205416908115610dae5781610d809184600052600260205260406000206fffffffffffffffffffffffffffffffff1981541690553390615472565b6040519081527fca7a4a65a94ed2f37538814e00e1cd4c41a78261561e3f3794592f11409cf5af60203392a3005b602483604051907f8410168c0000000000000000000000000000000000000000000000000000000082526004820152fd5b6040516331b339a960e21b81526001600160a01b03919091166004820152336024820152604490fd5b3461042f57606036600319011261042f5767ffffffffffffffff60043581811161042f57610e3a903690600401612c28565b610e42612bc9565b9260443590811161042f57610e5b903690600401612c28565b9190610e65615416565b828203610eca5760005b828110610e7857005b806000805160206159f48339815191526020610e97600194878a615500565b35610ebd610eae610ea9868b8a615500565b6135ed565b610eb6615416565b8b83615510565b604051908152a101610e6f565b50604491604051917faec9344000000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b3461042f57604036600319011261042f57610f1a612bb3565b6024359081151580920361042f576001600160a01b031690813314610f8e57336000526008602052604060002082600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a3005b606460405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152fd5b3461042f57600036600319011261042f57604051600060045490600182811c918184169182156110d6575b60209485851084146110c05785879486865291826000146110a0575050600114611043575b5061102f92500383612d50565b6107c4604051928284938452830190612b8e565b84915060046000527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b906000915b85831061108857505061102f935082010185611022565b80548389018501528794508693909201918101611071565b60ff19168582015261102f95151560051b85010192508791506110229050565b634e487b7160e01b600052602260045260246000fd5b92607f1692610ffd565b3461042f57600036600319011261042f5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d857600052600b602052602064ffffffffff60406000205460c81c16604051908152f35b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d8576111a8906147d1565b600581101580610c9457600282149081156111e4575b81156111d2575b6020826040519015158152f35b9050610c9457600460209114826111c5565b50506003811460006111be565b3461042f57602036600319011261042f576004356001600160a01b039081811680910361042f578160005416338103610ddf575060015491816001600160a01b03198416176001556040519216825260208201527fdcb09aef4bf01068924ccce937981cbe59d25ba08380cf941aaaea4e4bd3960d60403392a2005b3461042f57602036600319011261042f57606061014060405161128f81612d1f565b60008152600060208201526000604082015260008382015260006080820152600060a0820152600060c0820152600060e082015260006101008201526112d3613410565b6101208201520152600435600052600b60205260ff60016040600020015460a81c16156114c257600435600052600b60205260406000206113b660046040519261131c84612d1f565b80546001600160a01b038116855264ffffffffff8160a01c16602086015264ffffffffff8160c81c16604086015260ff8160f01c161515606086015260f81c1515608085015260ff60018201546001600160a01b03811660a0870152818160a01c16151560c0870152818160a81c16151560e087015260b01c1615156101008501526113aa6002820161342f565b61012085015201613382565b6101408201526113c76004356147d1565b906005821015610c9457600261014092146114b6575b6107c4604051928392602084526001600160a01b03815116602085015264ffffffffff602082015116604085015264ffffffffff60408201511660608501526060810151151560808501526080810151151560a08501526001600160a01b0360a08201511660c085015260c0810151151560e085015260e0810151151561010085015261010081015115156101208501526114a261012082015183860190604090816001600160801b0391828151168552826020820151166020860152015116910152565b01516101a0808401526101c0830190612c59565b600060608201526113dd565b602460405162b8e7e760e51b81526004356004820152fd5b3461042f5760208060031936011261042f5760043567ffffffffffffffff811161042f5761150c903690600401612c28565b90611515615416565b6000915b80831061152257005b61152d838284615500565b3592611537615416565b6115408461349a565b1561155d5760248460405190634a5541ef60e01b82526004820152fd5b611569849293946134ea565b61191a5761158d82600052600b6020526001600160a01b0360406000205416331490565b15806118fa575b6118db576115a182613630565b82600052600b928387526115bb600260406000200161342f565b936001600160801b03928386511684821610156118c3578260005281895260ff60406000205460f01c16156118ab579061160a82858b611600819796838c51166134d1565b99015116906134d1565b93826000528184526040600020966003885498600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8b1617815583881615611891575b0191811691826fffffffffffffffffffffffffffffffff1982541617905561169d6001600160a01b03809916926005875289604060002054169487528360019a8b6040600020015416615472565b3382036117ae57823b61170a575b7f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd26000805160206159f48339815191529685925b604080516001600160801b03928316815292909116602083015290a4604051908152a1019190611519565b9350813b1561042f576040516372eba20360e01b8152600481018490526001600160a01b03821660248201526001600160801b038581166044830152861660648201526000805160206159f4833981519152958b9585927f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd2929190600081608481838b5af161179f575b5092509650506116ab565b6117a890612d3c565b8e611794565b813b6117ed575b7f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd26000805160206159f48339815191529685926116df565b9350803b1561042f576040516372eba20360e01b8152600481018490526001600160a01b03831660248201526001600160801b038581166044830152861660648201526000805160206159f4833981519152958b9585927f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd2929190600081608481838a5af1611882575b5092509650506117b5565b61188b90612d3c565b8e611877565b60018101600160a01b60ff60a01b1982541617905561164f565b602483604051906339c6dc7360e21b82526004820152fd5b602483604051906322cad1af60e11b82526004820152fd5b60405163216caf0d60e01b815260048101839052336024820152604490fd5b5081600052600585526001600160a01b0360406000205416331415611594565b6024826040519063fe19f19f60e01b82526004820152fd5b3461042f5760208060031936011261042f5760043561194f615416565b80600052600b825260ff60016040600020015460a81c16156104d857611974816147d1565b916000926005811015610c9457600481036119a15760248360405190634a5541ef60e01b82526004820152fd5b600381036119c1576024836040519063fe19f19f60e01b82526004820152fd5b916002849314611b43576119eb81600052600b6020526001600160a01b0360406000205416331490565b15611b235780600052600b825260ff60406000205460f01c1615611b0b5780600052600b8252604060002060ff60f01b198154169055600582526001600160a01b0360406000205416803b611a79575b50807f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f846000805160206159f483398151915295a2604051908152a1005b803b1561042f576000805160206159f48339815191529360008084936024604051809481937f341a0bd90000000000000000000000000000000000000000000000000000000083528860048401525af1611ad6575b509350611a3b565b9050611ae29150612d3c565b8060007f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f611ace565b602490604051906339c6dc7360e21b82526004820152fd5b60405163216caf0d60e01b81526004810191909152336024820152604490fd5b602490604051906322cad1af60e11b82526004820152fd5b3461042f57602036600319011261042f576004356001600160a01b039081811680910361042f578160005416338103610ddf5750600a5491816001600160a01b0319841617600a556040519216825260208201527fa2548bd4b805e907c1558a47b5858324fe8bb4a2e1ddfca647eecbf65610eebc60403392a26009546000198101908111611c175760407f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c91815190600182526020820152a1005b634e487b7160e01b600052601160045260246000fd5b3461042f57602036600319011261042f57611c46612bb3565b6000546001600160a01b0380821692338403611c98576001600160a01b03199350169182911617600055337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf80600080a3005b6040516331b339a960e21b81526001600160a01b0385166004820152336024820152604490fd5b3461042f57602036600319011261042f576001600160a01b03611ce0612bb3565b168015611cff5760005260066020526020604060002054604051908152f35b608460405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e657200000000000000000000000000000000000000000000006064820152fd5b3461042f57602036600319011261042f57600435611da06107538260005260056020526001600160a01b0360406000205416151590565b600052600560205260206001600160a01b0360406000205416604051908152f35b3461042f57602036600319011261042f576020611ddf600435612ded565b6001600160a01b0360405191168152f35b3461042f57600036600319011261042f5760206001600160a01b0360015416604051908152f35b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d8576105ca602091614852565b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d8576000611e8f826147d1565b6005811015610c9457600203611ead575b6020906040519015158152f35b50600052600b602052602060ff60406000205460f01c16611ea0565b3461042f57602036600319011261042f57600435611ee5615416565b611eee8161349a565b15611fd757611efc8161584b565b15611b2357611f0a81612ded565b611f1382613463565b159081611fce575b81611fbb575b50611fa3576000611f3182612ded565b82825260076020526001600160a01b0360408320916001600160a01b0319928381541690551690818352600660205260408320831981540190558383526005602052604083209081541690557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a4005b602490604051906378630aa960e01b82526004820152fd5b6001600160a01b03915016151582611f21565b60009150611f1b565b602490604051907f817cd6390000000000000000000000000000000000000000000000000000000082526004820152fd5b3461042f5761201636612bf3565b60405191602083019383851067ffffffffffffffff86111761204257610bc79460405260008452612ec0565b634e487b7160e01b600052604160045260246000fd5b3461042f57602036600319011261042f57602061047960043561349a565b3461042f5760208060031936011261042f5760043590612094615416565b61209d8261349a565b156120ba5760248260405190634a5541ef60e01b82526004820152fd5b6120c3826134ea565b61191a576120e782600052600b6020526001600160a01b0360406000205416331490565b15806123f7575b6118db576120fb82613630565b9180600052600b8252612114600260406000200161342f565b926001600160801b03908185511682821610156118c35782600052600b845260ff60406000205460f01c16156118ab5780828561215761216194838a51166134d1565b97015116906134d1565b9082600052600b84526040600020916003835493600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8616178155838316156123dd575b0191861691826fffffffffffffffffffffffffffffffff198254161790556121f56001600160a01b03809416926005875283856040600020541695600b895260016040600020015416615472565b3382036122fd57823b61225c575b7f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd284916000805160206159f4833981519152975b604080516001600160801b03928316815292909116602083015290a4604051908152a1005b823b1561042f576040516372eba20360e01b8152600481018590526001600160a01b03831660248201526001600160801b038781166044830152821660648201526000805160206159f48339815191529685927f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd292909190600081608481838b5af16122ee575b509750915050612203565b6122f790612d3c565b896122e3565b813b61233c575b7f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd284916000805160206159f483398151915297612237565b813b1561042f576040516372eba20360e01b8152600481018590526001600160a01b03841660248201526001600160801b038781166044830152821660648201526000805160206159f48339815191529685927f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd292909190600081608481838a5af16123ce575b509750915050612304565b6123d790612d3c565b896123c3565b60018101600160a01b60ff60a01b198254161790556121a7565b5081600052600581526001600160a01b03604060002054163314156120ee565b3461042f57602036600319011261042f576001600160a01b03612438612bb3565b16600052600260205260206001600160801b0360406000205416604051908152f35b3461042f57610bc761246b36612bf3565b9161247e6124798433612f56565b612e4f565b613035565b3461042f57600036600319011261042f576020600954604051908152f35b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d8576124db906147d1565b6005811015610c945780602091159081156124fc575b506040519015158152f35b6001915014826124f1565b3461042f576020600319818136011261042f576004359067ffffffffffffffff9081831161042f576101208336039182011261042f57612545615416565b610104830135906022190181121561042f57820160048101359082821161042f57602401606082023603811361042f5761258091369161352d565b9182519061258d8261336a565b9161259b6040519384612d50565b808352601f196125aa8261336a565b018660005b82811061276c5750505064ffffffffff90814216946001600160801b0396876125d78261369b565b515116828a6125e58461369b565b51015116858060406125f68661369b565b510151168a0116906040519261260b84612cca565b83528b830152604082015261261f8761369b565b526126298661369b565b5060019386855b8a8c8783106126eb57908b846001600160a01b038c60a48101358281169081900361042f5761095a956126ab956126db9461266d602486016135cc565b612679604487016135cc565b612685606488016135d9565b91612692886004016135d9565b94846126a060848b016135ed565b966040519d8e612ce6565b168c528d8c0152151560408b0152151560608a01521660808801521660a086015260c085015260c4369101613601565b60e08301526101008201526148cd565b88938580604061271f8b8661270f8a8e9a612706828d6136be565b5151169a6136be565b51015116946000198901906136be565b51015116816040612730888c6136be565b510151160116916040519361274485612cca565b84528301526040820152612758828b6136be565b52612763818a6136be565b50018790612630565b612774613410565b8282880101520187906125af565b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d85760209060009080600052600b8352604060002060ff815460f01c1680612815575b6127ec575b50506001600160801b0360405191168152f35b61280e92506001600160801b0360026128089201541691613630565b906134d1565b82806127d9565b5060ff600182015460a01c16156127d4565b3461042f57604036600319011261042f57612840612bb3565b602435906001600160a01b03808061285785612ded565b169216918083146129515780331490811561292c575b50156128c2578260005260076020526040600020826001600160a01b031982541617905561289a83612ded565b167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b608460405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152fd5b9050600052600860205260406000203360005260205260ff604060002054168461286d565b608460405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152fd5b3461042f57602036600319011261042f576020611ddf600435612e12565b3461042f57600036600319011261042f57604051600060035490600182811c91818416918215612a92575b60209485851084146110c05785879486865291826000146110a0575050600114612a35575061102f92500383612d50565b84915060036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b906000915b858310612a7a57505061102f935082010185611022565b80548389018501528794508693909201918101612a63565b92607f1692612a04565b3461042f57602036600319011261042f57600435907fffffffff00000000000000000000000000000000000000000000000000000000821680920361042f57817f80ac58cd0000000000000000000000000000000000000000000000000000000060209314908115612b41575b8115612b17575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501483612b10565b7f5b5e139f0000000000000000000000000000000000000000000000000000000081149150612b09565b60005b838110612b7e5750506000910152565b8181015183820152602001612b6e565b90602091612ba781518092818552858086019101612b6b565b601f01601f1916010190565b600435906001600160a01b038216820361042f57565b602435906001600160a01b038216820361042f57565b35906001600160a01b038216820361042f57565b606090600319011261042f576001600160a01b0390600435828116810361042f5791602435908116810361042f579060443590565b9181601f8401121561042f5782359167ffffffffffffffff831161042f576020808501948460051b01011161042f57565b90815180825260208080930193019160005b828110612c79575050505090565b835180516001600160801b031686528083015167ffffffffffffffff168684015260409081015164ffffffffff169086015260609094019392810192600101612c6b565b3590811515820361042f57565b6060810190811067ffffffffffffffff82111761204257604052565b610120810190811067ffffffffffffffff82111761204257604052565b6040810190811067ffffffffffffffff82111761204257604052565b610160810190811067ffffffffffffffff82111761204257604052565b67ffffffffffffffff811161204257604052565b90601f8019910116810190811067ffffffffffffffff82111761204257604052565b67ffffffffffffffff811161204257601f01601f191660200190565b35906001600160801b038216820361042f57565b15612da957565b606460405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152fd5b60005260056020526001600160a01b0360406000205416612e0f811515612da2565b90565b612e356107538260005260056020526001600160a01b0360406000205416151590565b60005260076020526001600160a01b036040600020541690565b15612e5657565b608460405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f766564000000000000000000000000000000000000006064820152fd5b90612ee4939291612ed46124798433612f56565b612edf838383613035565b6131cf565b15612eeb57565b60405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b906001600160a01b038080612f6a84612ded565b16931691838314938415612f9d575b508315612f87575b50505090565b612f9391929350612e12565b1614388080612f81565b909350600052600860205260406000208260005260205260ff604060002054169238612f79565b15612fcb57565b608460405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152fd5b9061305d9161304384612ded565b916001600160a01b03938493848094169485911614612fc4565b169182156131365761306e84613463565b158061312e575b80613125575b61310d57816130949161308d86612ded565b1614612fc4565b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60008481526007602052604081206001600160a01b03199081815416905583825260066020526040822060001981540190558482526040822060018154019055858252600560205284604083209182541617905580a4565b602484604051906378630aa960e01b82526004820152fd5b5081151561307b565b506001613075565b608460405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152fd5b3d156131ca573d906131b082612d72565b916131be6040519384612d50565b82523d6000602084013e565b606090565b91926000929190813b156133605760209161323f91856040519586809581947f150b7a02000000000000000000000000000000000000000000000000000000009b8c84523360048501526001600160a01b0380951660248501526044840152608060648401526084830190612b8e565b0393165af1908290826132f9575b50506132d35761325b61319f565b805190816132ce5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000161490565b909192506020813d8211613358575b8161331560209383612d50565b810103126133545751907fffffffff0000000000000000000000000000000000000000000000000000000082168203613351575090388061324d565b80fd5b5080fd5b3d9150613308565b5050505050600190565b67ffffffffffffffff81116120425760051b60200190565b90815461338e8161336a565b9260409361339e85519182612d50565b828152809460208092019260005281600020906000935b8585106133c457505050505050565b600184819284516133d481612cca565b64ffffffffff87546001600160801b038116835267ffffffffffffffff8160801c168584015260c01c16868201528152019301940193916133b5565b6040519061341d82612cca565b60006040838281528260208201520152565b9060405161343c81612cca565b6040819360018154916001600160801b0392838116865260801c6020860152015416910152565b80600052600b60205260ff60016040600020015460a81c16156104d857600052600b60205260ff60016040600020015460b01c1690565b80600052600b60205260ff60016040600020015460a81c16156104d857600052600b60205260ff60016040600020015460a01c1690565b6001600160801b039182169082160391908211611c1757565b80600052600b60205260ff60016040600020015460a81c16156104d857600052600b60205260406000205460f81c90565b359064ffffffffff8216820361042f57565b9291926135398261336a565b60409461354886519283612d50565b8195848352602080930191606080960285019481861161042f57925b8584106135745750505050505050565b868483031261042f5782519061358982612cca565b61359285612d8e565b8252858501359067ffffffffffffffff8216820361042f57828792838b9501526135bd86880161351b565b86820152815201930192613564565b35801515810361042f5790565b356001600160a01b038116810361042f5790565b356001600160801b038116810361042f5790565b919082604091031261042f5760405161361981612d03565b602080829461362781612bdf565b84520135910152565b64ffffffffff80421682600052600b602052604060002091825482828260a01c1610156136915760c81c16111561367f57600401546001101561367657612e0f906136d2565b612e0f90614702565b6001600160801b039150600201541690565b5050505050600090565b8051156136a85760200190565b634e487b7160e01b600052603260045260246000fd5b80518210156136a85760209160051b010190565b64ffffffffff90814216906000908152600b6020526040908181208251936136f985612d1f565b8154956001600160a01b039182881687526020870197828160a01c168952828160c81c168789015260ff8160f01c161515606089015260f81c1515608088015260ff6001938486015490811660a08a0152818160a01c16151560c08a0152818160a81c16151560e08a015260b01c16151561010088015261014061379360046137846002880161342f565b966101208b0197885201613382565b97019187835280876137a5889a61369b565b5101511693828288965b161061388957509161383961383e9284888161384398976001600160801b039e8f6137db8b8a516136be565b5151169d8a8f9b60206137f867ffffffffffffffff928d516136be565b5101511699848361380a8484516136be565b510151169650811561387d57613828929350519060001901906136be565b5101511680925b03169203166138fd565b613c6c565b613acf565b92831361385c57505061385683916138c1565b16011690565b5160200151929392831692841683101591506138789050575090565b905090565b5050505116809261382f565b8094986001600160801b0390816138a18c88516136be565b51511601169801938282808a6138b88989516136be565b510151166137af565b600081126138cc5790565b602490604051907f2463f3d50000000000000000000000000000000000000000000000000000000082526004820152fd5b90600160ff1b8083149081156139e5575b506139bb5760008212156139b257613937826000035b60008312156139ab5782600003906139ef565b917f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83116139755760009160001991181315613971575090565b0390565b604491604051917fd49c26b300000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b82906139ef565b61393782613924565b60046040517f9fe2b450000000000000000000000000000000000000000000000000000000008152fd5b905081143861390e565b670de0b6b3a7640000916000198383099280830292838086109503948086039514613aab5782851015613a6f57908291096001821901821680920460028082600302188083028203028083028203028083028203028083028203028083028203028092029003029360018380600003040190848311900302920304170290565b82606492604051927f63a05778000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b505080925015613ab9570490565b634e487b7160e01b600052601260045260246000fd5b90600160ff1b808314908115613bb3575b50613b89576000821215613b8057613b09826000035b6000831215613b79578260000390613bbd565b917f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311613b435760009160001991181315613971575090565b604491604051917f120b5b4300000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b8290613bbd565b613b0982613af6565b60046040517fa6070c25000000000000000000000000000000000000000000000000000000008152fd5b9050811438613ae0565b90919060001983820983820291828083109203918083039214613c5b57670de0b6b3a76400009081831015613c2457947faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066994950990828211900360ee1b910360121c170290565b60449086604051917f5173648d00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050670de0b6b3a764000090049150565b80613c865750600090612e0f5750670de0b6b3a764000090565b90670de0b6b3a7640000808314613cd3575080613cab575050670de0b6b3a764000090565b670de0b6b3a76400008114613ccf57613cca9061383e612e0f936145ad565b613cf3565b5090565b91505090565b8015613ab9576ec097ce7bc90715b34b9f10000000000590565b6000811215613d285768033dd1780914b97114198112613d2257613d1990600003613cf3565b612e0f90613cd9565b50600090565b680a688906bd8affffff811361457c57670de0b6b3a764000080604092831b05907780000000000000000000000000000000000000000000000067ff00000000000000831661445f575b66ff0000000000008316614357575b65ff00000000008316614257575b64ff00000000831661415f575b63ff000000831661406f575b62ff00008316613f87575b61ff008316613ea7575b60ff8316613dd0575b02911c60bf031c90565b60808316613e95575b838316613e83575b60208316613e71575b60108316613e5f575b60088316613e4d575b60048316613e3b575b60028316613e29575b6001831615613dc6576801000000000000000102831c613dc6565b6801000000000000000102831c613e0e565b6801000000000000000302831c613e05565b6801000000000000000602831c613dfc565b6801000000000000000b02831c613df3565b6801000000000000001602831c613dea565b6801000000000000002c02831c613de1565b6801000000000000005902831c613dd9565b6180008316613f75575b6140008316613f63575b6120008316613f51575b6110008316613f3f575b6108008316613f2d575b6104008316613f1b575b6102008316613f09575b610100831615613dbd57680100000000000000b102831c613dbd565b6801000000000000016302831c613eed565b680100000000000002c602831c613ee3565b6801000000000000058c02831c613ed9565b68010000000000000b1702831c613ecf565b6801000000000000162e02831c613ec5565b68010000000000002c5d02831c613ebb565b680100000000000058b902831c613eb1565b62800000831661405d575b62400000831661404b575b622000008316614039575b621000008316614027575b620800008316614015575b620400008316614003575b620200008316613ff1575b62010000831615613db3576801000000000000b17202831c613db3565b680100000000000162e402831c613fd4565b6801000000000002c5c802831c613fc9565b68010000000000058b9102831c613fbe565b680100000000000b172102831c613fb3565b68010000000000162e4302831c613fa8565b680100000000002c5c8602831c613f9d565b6801000000000058b90c02831c613f92565b6380000000831661414d575b6340000000831661413b575b63200000008316614129575b63100000008316614117575b63080000008316614105575b630400000083166140f3575b630200000083166140e1575b6301000000831615613da85768010000000000b1721802831c613da8565b6801000000000162e43002831c6140c3565b68010000000002c5c86002831c6140b7565b680100000000058b90c002831c6140ab565b6801000000000b17217f02831c61409f565b680100000000162e42ff02831c614093565b6801000000002c5c85fe02831c614087565b68010000000058b90bfc02831c61407b565b6480000000008316614245575b6440000000008316614233575b6420000000008316614221575b641000000000831661420f575b64080000000083166141fd575b64040000000083166141eb575b64020000000083166141d9575b640100000000831615613d9c57680100000000b17217f802831c613d9c565b68010000000162e42ff102831c6141ba565b680100000002c5c85fe302831c6141ad565b6801000000058b90bfce02831c6141a0565b68010000000b17217fbb02831c614193565b6801000000162e42fff002831c614186565b68010000002c5c8601cc02831c614179565b680100000058b90c0b4902831c61416c565b658000000000008316614345575b654000000000008316614333575b652000000000008316614321575b65100000000000831661430f575b6508000000000083166142fd575b6504000000000083166142eb575b6502000000000083166142d9575b65010000000000831615613d8f576801000000b17218355102831c613d8f565b680100000162e430e5a202831c6142b9565b6801000002c5c863b73f02831c6142ab565b68010000058b90cf1e6e02831c61429d565b680100000b1721bcfc9a02831c61428f565b68010000162e43f4f83102831c614281565b680100002c5c89d5ec6d02831c614273565b6801000058b91b5bc9ae02831c614265565b6680000000000000831661444d575b6640000000000000831661443b575b66200000000000008316614429575b66100000000000008316614417575b66080000000000008316614405575b660400000000000083166143f3575b660200000000000083166143e1575b6601000000000000831615613d815768010000b17255775c0402831c613d81565b6801000162e525ee054702831c6143c0565b68010002c5cc37da949202831c6143b1565b680100058ba01fb9f96d02831c6143a2565b6801000b175effdc76ba02831c614393565b680100162f3904051fa102831c614384565b6801002c605e2e8cec5002831c614375565b68010058c86da1c09ea202831c614366565b678000000000000000831661455d575b674000000000000000831661454b575b6720000000000000008316614539575b6710000000000000008316614527575b6708000000000000008316614515575b6704000000000000008316614503575b67020000000000000083166144f1575b670100000000000000831615613d7257680100b1afa5abcbed6102831c613d72565b68010163da9fb33356d802831c6144cf565b680102c9a3e778060ee702831c6144bf565b6801059b0d31585743ae02831c6144af565b68010b5586cf9890f62a02831c61449f565b6801172b83c7d517adce02831c61448f565b6801306fe0a31b7152df02831c61447f565b5077b504f333f9de64848000000000000000000000000000000061446f565b602490604051907f0360d0280000000000000000000000000000000000000000000000000000000082526004820152fd5b806000808313156146d157670de0b6b3a76400009283811261469a57506001925b808305906001600160801b03821160071b91821c9167ffffffffffffffff831160061b92831c63ffffffff811160051b90811c61ffff811160041b90811c60ff811160031b90811c91600f831160021b92831c936001978860038711811b96871c11961717171717171781810294811d9082821461468e57506706f05b59d3b20000905b8482136146625750505050500290565b808391020590671bc16d674ec80000821215614681575b831d90614652565b8091950194831d90614679565b93505093925050020290565b60001993925080156146bd576ec097ce7bc90715b34b9f100000000005916145ce565b602482634e487b7160e01b81526012600452fd5b602483604051907f059b101b0000000000000000000000000000000000000000000000000000000082526004820152fd5b6000818152600b602052614737604082205464ffffffffff808281809460a01c1693849160c81c1603169181421603166138fd565b91808252600b602052600460408320018054156147bd5790829167ffffffffffffffff935261478f6020832054828452600b60205261383e6001600160801b03968760026040882001541696879360801c1690613c6c565b9283136147a55750506147a1906138c1565b1690565b60029350604092508152600b60205220015460801c90565b602483634e487b7160e01b81526032600452fd5b80600052600b602052604060002060ff600182015460a01c166000146147f8575050600490565b805460f81c61484b575460a01c64ffffffffff164210613d225761481b81613630565b90600052600b6020526001600160801b03806002604060002001541691161060001461484657600190565b600290565b5050600390565b80600052600b60205261486b600260406000200161342f565b81600052600b602052604060002060ff600182015460a01c1660001461489e57506001600160801b039150602001511690565b5460f81c6148b05750612e0f90613630565b612e0f91506001600160801b0360408183511692015116906134d1565b906001600160a01b036001541660206001600160a01b0360c0850151166024604051809481937fdcf844a700000000000000000000000000000000000000000000000000000000835260048301525afa801561084157600090615185575b61494e91506001600160801b0360a08501511690602060e08601510151916158b4565b6001600160801b038151166101008401519064ffffffffff602086015116811561515b5782518015615131577f00000000000000000000000000000000000000000000000000000000000000008111615100575064ffffffffff60406149b38561369b565b510151168110156150a95750600091829083815185905b808210615016575050505064ffffffffff421664ffffffffff8216811015614fd65750506001600160801b0382168103614f945750506009549283600052600b6020526040600020916001600160801b0381511660028401906fffffffffffffffffffffffffffffffff198254161790556001600160a01b0360c083015116600184015490750100000000000000000000000000000000000000000060408501511515928654927fffffffffffffffffff0000ff000000000000000000000000000000000000000076ff000000000000000000000000000000000000000000006060890151151560b01b16921617171760018601556001600160a01b0384511691610100850151926040614ae58551956000198701906136be565b510151927fff000000000000000000000000000000000000000000000000000000000000007eff0000000000000000000000000000000000000000000000000000000000007dffffffffff0000000000000000000000000000000000000000000000000078ffffffffff000000000000000000000000000000000000000060208b015160a01b169660c81b169460f01b16911617171717845560005b818110614ec4575050600185016009556001600160a01b0360c08301511660005260026020526001600160801b0380604060002054168160208401511601166001600160a01b0360c0840151166000526040600020906fffffffffffffffffffffffffffffffff198254161790556001600160a01b036080830151168015614e8057614c2c614c268760005260056020526001600160a01b0360406000205416151590565b15615333565b614c3586613463565b1580614e78575b80614e70575b614e58578590614c6b614c268360005260056020526001600160a01b0360406000205416151590565b8060005260066020526040600020600181540190558160005260056020526040600020816001600160a01b031982541617905560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4614cf46001600160a01b0360c0840151166001600160801b038084511681602086015116011690309033906151b9565b6001600160801b0360408201511680614e29575b507fef3d668acee46576ad5d407c42ab4d0cde13f3cd70b28f09a0fb9e3bf5bf09cb6001600160a01b0383511691866001600160a01b03608086015116946001600160a01b0360c08201511696614e1e614dfe6040840151151592606085015115156001600160a01b0360e061010088015193549764ffffffffff60405199614d908b612d03565b818160a01c168b5260c81c1660208a01520151511694614de3604051998a998a523360208b015260408a0190604090816001600160801b0391828151168552826020820151166020860152015116910152565b60a088015260c08701526101608060e0880152860190612c59565b926101008501906020908164ffffffffff91828151168552015116910152565b6101408301520390a4565b614e52906001600160a01b0360c0850151166001600160a01b0360e086015151169033906151b9565b38614d08565b602486604051906378630aa960e01b82526004820152fd5b506000614c42565b506001614c3c565b606460405162461bcd60e51b815260206004820152602060248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152fd5b614ed3816101008601516136be565b51906004860154916801000000000000000083101561204257600183018060048901558310156136a85760019260048801600052602060002001906001600160801b03815116908254917fffffff00000000000000000000000000000000000000000000000000000000007cffffffffff000000000000000000000000000000000000000000000000604077ffffffffffffffff00000000000000000000000000000000602086015160801b1694015160c01b169316171717905501614b81565b6040517fd90b7e390000000000000000000000000000000000000000000000000000000081526001600160801b03918216600482015291166024820152604490fd5b6040517f210aec0e00000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b919350919461503a906001600160801b0361503185896136be565b51511690615616565b9464ffffffffff80604061504e86856136be565b5101511694168085111561506c5750600184930191929190926149ca565b8385606492604051927f7b0bada8000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b64ffffffffff60406150ba8561369b565b5101516040517fb4c9e52c00000000000000000000000000000000000000000000000000000000815264ffffffffff938416600482015291169091166024820152604490fd5b602490604051907f4757689b0000000000000000000000000000000000000000000000000000000082526004820152fd5b60046040517f3952c64e000000000000000000000000000000000000000000000000000000008152fd5b60046040517f6095d3bc000000000000000000000000000000000000000000000000000000008152fd5b6020823d6020116151b1575b8161519e60209383612d50565b81010312613351575061494e905161492b565b3d9150615191565b9290604051927f23b872dd0000000000000000000000000000000000000000000000000000000060208501526001600160a01b03809216602485015216604483015260648201526064815260a081019181831067ffffffffffffffff841117612042576152289260405261522a565b565b6001600160a01b03169061528a60405161524381612d03565b6020938482527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564858301526000808587829751910182855af161528461319f565b9161537e565b80519182159184831561530f575b5050509050156152a55750565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b91938180945001031261335457820151908115158203613351575080388084615298565b1561533a57565b606460405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152fd5b919290156153df5750815115615392575090565b3b1561539b5790565b606460405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b8251909150156153f25750805190602001fd5b6104039060405191829162461bcd60e51b8352602060048401526024830190612b8e565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361544857565b60046040517fa1c0d6e5000000000000000000000000000000000000000000000000000000008152fd5b916001600160a01b03604051927fa9059cbb000000000000000000000000000000000000000000000000000000006020850152166024830152604482015260448152608081019181831067ffffffffffffffff841117612042576152289260405261522a565b612e0f906154e581614852565b90600052600b60205260026040600020015460801c906134d1565b91908110156136a85760051b0190565b92919061551c8461349a565b6104175761554084600052600b6020526001600160a01b0360406000205416331490565b1580615606575b6103e45761556b84600052600b6020526001600160a01b0360406000205416331490565b806155e2575b6155b5576001600160a01b03811615610369576001600160801b0382161561559d576152289293615631565b6024846040519063d2aabcd960e01b82526004820152fd5b836001600160a01b0360649260405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b508360005260056020526001600160a01b0380604060002054169082161415615571565b506156108461584b565b15615547565b9190916001600160801b0380809416911601918211611c1757565b929190926001600160801b0380615647836154d8565b16928181169380851161580e5750600095838752602092600b84526156ac61567a6040946002868c20015460801c615616565b868a52600b86526002858b200190836fffffffffffffffffffffffffffffffff1983549260801b16911617815561342f565b906156c78186840151169282868183511692015116906134d1565b1611156157df575b838752600b83526001600160a01b03916156f28683856001858d20015416615472565b8488526005845282818920541680331415806157d5575b61573e575b507ffa54f9f9bdcdd28778cbb9f78490df6691cc4e2729588e10f4cc0a26c465686a9495969750519586521693a3565b803b156157d15797807ffa54f9f9bdcdd28778cbb9f78490df6691cc4e2729588e10f4cc0a26c465686a9697989960848451809481937f13375c3b0000000000000000000000000000000000000000000000000000000083528c600484015233602484015289891660448401528d60648401525af16157c2575b889796955061570e565b6157cb90612d3c565b386157b8565b8880fd5b50803b1515615709565b838752600b835281872060018101600160a01b60ff60a01b1982541617905560ff60f01b1981541690556156cf565b8360649186604051927fa1fb2bbc000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b60009080825260056020526001600160a01b038060408420541692833314938415615890575b5050821561587e57505090565b90915061588b3392612e12565b161490565b60ff9294509060409181526008602052818120338252602052205416913880615871565b9092916158bf613410565b936001600160801b03928381169182156159cb5767016345785d8a00008082116159945780851161595d5750615909856158fa819386613bbd565b16946020890195865284613bbd565b169184615920604089019480865282875116615616565b16101561594757615939849182615942955116906134d1565b915116906134d1565b168252565b634e487b7160e01b600052600160045260246000fd5b84604491604051917f4fea5c1a00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b60449250604051917f47152d6700000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b505050505090506040516159de81612cca565b6000815260006020820152600060408201529056fef8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7"; + hex"60c0346200046e57601f62005ef938819003918201601f19168301916001600160401b038311848410176200032b578084926080946040528339810103126200046e5780516001600160a01b038082169290918390036200046e5760208101518281168091036200046e5760408201519183831683036200046e5760600151936200008962000473565b90601d82527f5361626c696572205632204c6f636b75702044796e616d6963204e46540000006020830152620000be62000473565b601181527029a0a116ab1916a627a1a5aaa816a22ca760791b602082015230608052600080546001600160a01b03199081168417825560018054909116909517909455927fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a38051906001600160401b0382116200032b5760035490600182811c9216801562000463575b60208310146200044d5781601f849311620003d8575b50602090601f83116001146200034d5760009262000341575b50508160011b916000199060031b1c1916176003555b80516001600160401b0381116200032b576004918254600181811c9116801562000320575b60208210146200030b579081601f849311620002b3575b50602090601f831160011462000248576000926200023c575b50508160011b916000199060031b1c19161790555b1660018060a01b0319600a541617600a5560a0526001600955604051615a65908162000494823960805181615471015260a0518181816110f801526149b60152f35b015190503880620001e5565b6000858152602081209350601f198516905b8181106200029a575090846001959493921062000280575b505050811b019055620001fa565b015160001960f88460031b161c1916905538808062000272565b929360206001819287860151815501950193016200025a565b909150836000526020600020601f840160051c8101916020851062000300575b90601f859493920160051c01905b818110620002f05750620001cc565b60008155849350600101620002e1565b9091508190620002d3565b602284634e487b7160e01b6000525260246000fd5b90607f1690620001b5565b634e487b7160e01b600052604160045260246000fd5b0151905038806200017a565b600360009081527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b9350601f198516905b818110620003bf5750908460019594939210620003a5575b505050811b0160035562000190565b015160001960f88460031b161c1916905538808062000396565b929360206001819287860151815501950193016200037e565b60036000529091507fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f840160051c8101916020851062000442575b90601f859493920160051c01905b81811062000432575062000161565b6000815584935060010162000423565b909150819062000415565b634e487b7160e01b600052602260045260246000fd5b91607f16916200014b565b600080fd5b60408051919082016001600160401b038111838210176200032b5760405256fe608080604052600436101561001357600080fd5b60003560e01c90816301ffc9a714612abb5750806306fdde03146129f8578063081812fc146129da578063095ea7b3146128465780631400ecec146127a157806316844456146125265780631c1cdd4c146124c05780631e99d569146124a257806323b872dd1461247957806339a73c031461243657806340e58ee514612095578063425d30dd1461207757806342842e0e1461202757806342966c6814611ec95780634857501f14611e535780634869e12d14611e175780635fe3b56714611df05780636352211e14611dc15780636d0cee7514611d6957806370a0823114611cbf57806375829def14611c2d5780637cad6cd114611b5b5780637de6b1db146119325780638659c270146114da578063894e9a0d1461126d5780638bad38dd146111f15780638f69b9931461116e5780639067b6771461111b5780639188ec84146110e057806395d89b4114610fd2578063a22cb46514610f01578063a2ffb89714610e08578063a6202bf214610cff578063a80fc07114610caa578063ad35efd414610c47578063b256456914610c29578063b637b86514610bc9578063b88d4fde14610b3e578063b8a3be6614610b07578063b971302a14610ab5578063bc063e1a14610a92578063bc2be1be14610a3f578063c156a11d14610962578063c33cd35e1461084d578063c87b56dd1461071a578063cc364f481461067f578063d4dbd20b1461062a578063d511609f146105db578063d975dfed1461058e578063e985e9c514610537578063ea5ead19146104ef578063eac8f5b814610483578063f590c1761461045b578063f851a440146104345763fdd46d601461027c57600080fd5b3461042f57606036600319011261042f57600435610298612be8565b604435906001600160801b03821680830361042f576102b5615467565b6102be846134d4565b610417576102e284600052600b6020526001600160a01b0360406000205416331490565b1580610407575b6103e45761030d84600052600b6020526001600160a01b0360406000205416331490565b806103c0575b610393576001600160a01b0382161561036957156103515791610348602092600080516020615a458339815191529483615682565b604051908152a1005b6024836040519063d2aabcd960e01b82526004820152fd5b60046040517fc61a0e9e000000000000000000000000000000000000000000000000000000008152fd5b6064846001600160a01b038460405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b508360005260056020526001600160a01b0380604060002054169083161415610313565b60405163216caf0d60e01b815260048101859052336024820152604490fd5b0390fd5b506104118461589c565b156102e9565b60248460405190634a5541ef60e01b82526004820152fd5b600080fd5b3461042f57600036600319011261042f5760206001600160a01b0360005416604051908152f35b3461042f57602036600319011261042f576020610479600435613524565b6040519015158152f35b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d857600052600b60205260206001600160a01b0360016040600020015416604051908152f35b6024906040519062b8e7e760e51b82526004820152fd5b3461042f57604036600319011261042f57600080516020615a45833981519152602060043561034861051f612be8565b61052883615529565b90610531615467565b83615561565b3461042f57604036600319011261042f57610550612bd2565b610558612be8565b906001600160a01b03809116600052600860205260406000209116600052602052602060ff604060002054166040519015158152f35b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d8576105ca602091615529565b6001600160801b0360405191168152f35b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d857600052600b602052602060026040600020015460801c604051908152f35b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d857600052600b60205260206001600160801b0360036040600020015416604051908152f35b3461042f57602036600319011261042f57600435600060206040516106a381612d22565b828152015280600052600b60205260ff60016040600020015460a81c16156104d857600052600b602052604080600020548151906106e082612d22565b64ffffffffff90818160a01c16835260c81c166020820152610718825180926020908164ffffffffff91828151168552015116910152565bf35b3461042f5760208060031936011261042f57600435906107586107538360005260056020526001600160a01b0360406000205416151590565b612dc1565b60006001600160a01b03600a5416926044604051809581937fe9dc637500000000000000000000000000000000000000000000000000000000835230600484015260248301525afa918215610841576000926107c8575b506107c4604051928284938452830190612bad565b0390f35b9091503d806000833e6107db8183612d6f565b810190828183031261042f5780519067ffffffffffffffff821161042f570181601f8201121561042f57805161081081612d91565b9261081e6040519485612d6f565b81845284828401011161042f5761083a91848085019101612b8a565b90826107af565b6040513d6000823e3d90fd5b3461042f5760031960203682011261042f576004359067ffffffffffffffff9081831161042f5761014090833603011261042f57610889615467565b6040519161089683612d05565b6108a281600401612bfe565b83526108b060248201613555565b60208401526108c160448201612cdc565b60408401526108d260648201612cdc565b60608401526108e360848201612bfe565b60808401526108f460a48201612dad565b60a084015261090560c48201612bfe565b60c08401526109173660e4830161363b565b60e084015261012481013591821161042f57013660238201121561042f5760209161094f61095a923690602460048201359101613567565b610100820152614907565b604051908152f35b3461042f57604036600319011261042f5760043561097e612be8565b610986615467565b81600052600b60205260ff60016040600020015460a81c1615610a28578160005260056020526001600160a01b0360406000205416803303610a09579161034881602093600080516020615a45833981519152956109e383615529565b6001600160801b0381166109f8575b50613054565b610a03908285615682565b876109f2565b60405163216caf0d60e01b815260048101849052336024820152604490fd5b6024826040519062b8e7e760e51b82526004820152fd5b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d857600052600b602052602064ffffffffff60406000205460a01c16604051908152f35b3461042f57600036600319011261042f57602060405167016345785d8a00008152f35b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d857600052600b60205260206001600160a01b0360406000205416604051908152f35b3461042f57602036600319011261042f57600435600052600b602052602060ff60016040600020015460a81c166040519015158152f35b3461042f57608036600319011261042f57610b57612bd2565b610b5f612be8565b6064359167ffffffffffffffff831161042f573660238401121561042f57826004013591610b8c83612d91565b92610b9a6040519485612d6f565b808452366024828701011161042f576020816000926024610bc79801838801378501015260443591612edf565b005b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d857600052600b6020526107c4610c1560046040600020016133bc565b604051918291602083526020830190612c78565b3461042f57602036600319011261042f57602061047960043561349d565b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d857610c819061480b565b6040516005821015610c94576020918152f35b634e487b7160e01b600052602160045260246000fd5b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d857600052600b60205260206001600160801b0360026040600020015416604051908152f35b3461042f57602036600319011261042f57610d18612bd2565b6001600160a01b038060005416338103610ddf57508116908160005260026020526001600160801b0360406000205416908115610dae5781610d809184600052600260205260406000206fffffffffffffffffffffffffffffffff19815416905533906154c3565b6040519081527fca7a4a65a94ed2f37538814e00e1cd4c41a78261561e3f3794592f11409cf5af60203392a3005b602483604051907f8410168c0000000000000000000000000000000000000000000000000000000082526004820152fd5b6040516331b339a960e21b81526001600160a01b03919091166004820152336024820152604490fd5b3461042f57606036600319011261042f5767ffffffffffffffff60043581811161042f57610e3a903690600401612c47565b610e42612be8565b9260443590811161042f57610e5b903690600401612c47565b9190610e65615467565b828203610eca5760005b828110610e7857005b80600080516020615a458339815191526020610e97600194878a615551565b35610ebd610eae610ea9868b8a615551565b613627565b610eb6615467565b8b83615561565b604051908152a101610e6f565b50604491604051917faec9344000000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b3461042f57604036600319011261042f57610f1a612bd2565b6024359081151580920361042f576001600160a01b031690813314610f8e57336000526008602052604060002082600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a3005b606460405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152fd5b3461042f57600036600319011261042f57604051600060045490600182811c918184169182156110d6575b60209485851084146110c05785879486865291826000146110a0575050600114611043575b5061102f92500383612d6f565b6107c4604051928284938452830190612bad565b84915060046000527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b906000915b85831061108857505061102f935082010185611022565b80548389018501528794508693909201918101611071565b60ff19168582015261102f95151560051b85010192508791506110229050565b634e487b7160e01b600052602260045260246000fd5b92607f1692610ffd565b3461042f57600036600319011261042f5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d857600052600b602052602064ffffffffff60406000205460c81c16604051908152f35b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d8576111a89061480b565b600581101580610c9457600282149081156111e4575b81156111d2575b6020826040519015158152f35b9050610c9457600460209114826111c5565b50506003811460006111be565b3461042f57602036600319011261042f576004356001600160a01b039081811680910361042f578160005416338103610ddf575060015491816001600160a01b03198416176001556040519216825260208201527fdcb09aef4bf01068924ccce937981cbe59d25ba08380cf941aaaea4e4bd3960d60403392a2005b3461042f57602036600319011261042f57606061014060405161128f81612d3e565b60008152600060208201526000604082015260008382015260006080820152600060a0820152600060c0820152600060e082015260006101008201526112d361344a565b6101208201520152600435600052600b60205260ff60016040600020015460a81c16156114c257600435600052600b60205260406000206113b660046040519261131c84612d3e565b80546001600160a01b038116855264ffffffffff8160a01c16602086015264ffffffffff8160c81c16604086015260ff8160f01c161515606086015260f81c1515608085015260ff60018201546001600160a01b03811660a0870152818160a01c16151560c0870152818160a81c16151560e087015260b01c1615156101008501526113aa60028201613469565b610120850152016133bc565b6101408201526113c760043561480b565b906005821015610c9457600261014092146114b6575b6107c4604051928392602084526001600160a01b03815116602085015264ffffffffff602082015116604085015264ffffffffff60408201511660608501526060810151151560808501526080810151151560a08501526001600160a01b0360a08201511660c085015260c0810151151560e085015260e0810151151561010085015261010081015115156101208501526114a261012082015183860190604090816001600160801b0391828151168552826020820151166020860152015116910152565b01516101a0808401526101c0830190612c78565b600060608201526113dd565b602460405162b8e7e760e51b81526004356004820152fd5b3461042f5760208060031936011261042f5760043567ffffffffffffffff811161042f5761150c903690600401612c47565b90611515615467565b6000915b80831061152257005b61152d838284615551565b3592611537615467565b611540846134d4565b1561155d5760248460405190634a5541ef60e01b82526004820152fd5b61156984929394613524565b61191a5761158d82600052600b6020526001600160a01b0360406000205416331490565b15806118fa575b6118db576115a18261366a565b82600052600b928387526115bb6002604060002001613469565b936001600160801b03928386511684821610156118c3578260005281895260ff60406000205460f01c16156118ab579061160a82858b611600819796838c511661350b565b990151169061350b565b93826000528184526040600020966003885498600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8b1617815583881615611891575b0191811691826fffffffffffffffffffffffffffffffff1982541617905561169d6001600160a01b03809916926005875289604060002054169487528360019a8b60406000200154166154c3565b3382036117ae57823b61170a575b7f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd2600080516020615a458339815191529685925b604080516001600160801b03928316815292909116602083015290a4604051908152a1019190611519565b9350813b1561042f576040516372eba20360e01b8152600481018490526001600160a01b03821660248201526001600160801b03858116604483015286166064820152600080516020615a45833981519152958b9585927f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd2929190600081608481838b5af161179f575b5092509650506116ab565b6117a890612d5b565b8e611794565b813b6117ed575b7f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd2600080516020615a458339815191529685926116df565b9350803b1561042f576040516372eba20360e01b8152600481018490526001600160a01b03831660248201526001600160801b03858116604483015286166064820152600080516020615a45833981519152958b9585927f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd2929190600081608481838a5af1611882575b5092509650506117b5565b61188b90612d5b565b8e611877565b60018101600160a01b60ff60a01b1982541617905561164f565b602483604051906339c6dc7360e21b82526004820152fd5b602483604051906322cad1af60e11b82526004820152fd5b60405163216caf0d60e01b815260048101839052336024820152604490fd5b5081600052600585526001600160a01b0360406000205416331415611594565b6024826040519063fe19f19f60e01b82526004820152fd5b3461042f5760208060031936011261042f5760043561194f615467565b80600052600b825260ff60016040600020015460a81c16156104d8576119748161480b565b916000926005811015610c9457600481036119a15760248360405190634a5541ef60e01b82526004820152fd5b600381036119c1576024836040519063fe19f19f60e01b82526004820152fd5b916002849314611b43576119eb81600052600b6020526001600160a01b0360406000205416331490565b15611b235780600052600b825260ff60406000205460f01c1615611b0b5780600052600b8252604060002060ff60f01b198154169055600582526001600160a01b0360406000205416803b611a79575b50807f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f84600080516020615a4583398151915295a2604051908152a1005b803b1561042f57600080516020615a458339815191529360008084936024604051809481937f341a0bd90000000000000000000000000000000000000000000000000000000083528860048401525af1611ad6575b509350611a3b565b9050611ae29150612d5b565b8060007f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f611ace565b602490604051906339c6dc7360e21b82526004820152fd5b60405163216caf0d60e01b81526004810191909152336024820152604490fd5b602490604051906322cad1af60e11b82526004820152fd5b3461042f57602036600319011261042f576004356001600160a01b039081811680910361042f578160005416338103610ddf5750600a5491816001600160a01b0319841617600a556040519216825260208201527fa2548bd4b805e907c1558a47b5858324fe8bb4a2e1ddfca647eecbf65610eebc60403392a26009546000198101908111611c175760407f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c91815190600182526020820152a1005b634e487b7160e01b600052601160045260246000fd5b3461042f57602036600319011261042f57611c46612bd2565b6000546001600160a01b0380821692338403611c98576001600160a01b03199350169182911617600055337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf80600080a3005b6040516331b339a960e21b81526001600160a01b0385166004820152336024820152604490fd5b3461042f57602036600319011261042f576001600160a01b03611ce0612bd2565b168015611cff5760005260066020526020604060002054604051908152f35b608460405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e657200000000000000000000000000000000000000000000006064820152fd5b3461042f57602036600319011261042f57600435611da06107538260005260056020526001600160a01b0360406000205416151590565b600052600560205260206001600160a01b0360406000205416604051908152f35b3461042f57602036600319011261042f576020611ddf600435612e0c565b6001600160a01b0360405191168152f35b3461042f57600036600319011261042f5760206001600160a01b0360015416604051908152f35b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d8576105ca60209161488c565b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d8576000611e8f8261480b565b6005811015610c9457600203611ead575b6020906040519015158152f35b50600052600b602052602060ff60406000205460f01c16611ea0565b3461042f57602036600319011261042f57600435611ee5615467565b611eee816134d4565b15611ff657611efc8161589c565b15611b2357611f0a81612e0c565b611f138261349d565b159081611fed575b81611fda575b50611fc257602081611f41600080516020615a4583398151915293612e0c565b9080600052600783526001600160a01b036040600020926001600160a01b031993848154169055169182600052600684526040600020600019815401905581600052600584526040600020908154169055806000604051937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a48152a1005b602490604051906378630aa960e01b82526004820152fd5b6001600160a01b03915016151582611f21565b60009150611f1b565b602490604051907f817cd6390000000000000000000000000000000000000000000000000000000082526004820152fd5b3461042f5761203536612c12565b60405191602083019383851067ffffffffffffffff86111761206157610bc79460405260008452612edf565b634e487b7160e01b600052604160045260246000fd5b3461042f57602036600319011261042f5760206104796004356134d4565b3461042f5760208060031936011261042f57600435906120b3615467565b6120bc826134d4565b156120d95760248260405190634a5541ef60e01b82526004820152fd5b6120e282613524565b61191a5761210682600052600b6020526001600160a01b0360406000205416331490565b1580612416575b6118db5761211a8261366a565b9180600052600b82526121336002604060002001613469565b926001600160801b03908185511682821610156118c35782600052600b845260ff60406000205460f01c16156118ab5780828561217661218094838a511661350b565b970151169061350b565b9082600052600b84526040600020916003835493600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8616178155838316156123fc575b0191861691826fffffffffffffffffffffffffffffffff198254161790556122146001600160a01b03809416926005875283856040600020541695600b8952600160406000200154166154c3565b33820361231c57823b61227b575b7f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd28491600080516020615a45833981519152975b604080516001600160801b03928316815292909116602083015290a4604051908152a1005b823b1561042f576040516372eba20360e01b8152600481018590526001600160a01b03831660248201526001600160801b03878116604483015282166064820152600080516020615a458339815191529685927f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd292909190600081608481838b5af161230d575b509750915050612222565b61231690612d5b565b89612302565b813b61235b575b7f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd28491600080516020615a4583398151915297612256565b813b1561042f576040516372eba20360e01b8152600481018590526001600160a01b03841660248201526001600160801b03878116604483015282166064820152600080516020615a458339815191529685927f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd292909190600081608481838a5af16123ed575b509750915050612323565b6123f690612d5b565b896123e2565b60018101600160a01b60ff60a01b198254161790556121c6565b5081600052600581526001600160a01b036040600020541633141561210d565b3461042f57602036600319011261042f576001600160a01b03612457612bd2565b16600052600260205260206001600160801b0360406000205416604051908152f35b3461042f57610bc761248a36612c12565b9161249d6124988433612f75565b612e6e565b613054565b3461042f57600036600319011261042f576020600954604051908152f35b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d8576124fa9061480b565b6005811015610c9457806020911590811561251b575b506040519015158152f35b600191501482612510565b3461042f576020600319818136011261042f576004359067ffffffffffffffff9081831161042f576101208336039182011261042f57612564615467565b610104830135906022190181121561042f57820160048101359082821161042f57602401606082023603811361042f5761259f913691613567565b918251906125ac826133a4565b916125ba6040519384612d6f565b808352601f196125c9826133a4565b018660005b82811061278b5750505064ffffffffff90814216946001600160801b0396876125f6826136d5565b515116828a612604846136d5565b5101511685806040612615866136d5565b510151168a0116906040519261262a84612ce9565b83528b830152604082015261263e876136d5565b52612648866136d5565b5060019386855b8a8c87831061270a57908b846001600160a01b038c60a48101358281169081900361042f5761095a956126ca956126fa9461268c60248601613606565b61269860448701613606565b6126a460648801613613565b916126b188600401613613565b94846126bf60848b01613627565b966040519d8e612d05565b168c528d8c0152151560408b0152151560608a01521660808801521660a086015260c085015260c436910161363b565b60e0830152610100820152614907565b88938580604061273e8b8661272e8a8e9a612725828d6136f8565b5151169a6136f8565b51015116946000198901906136f8565b5101511681604061274f888c6136f8565b510151160116916040519361276385612ce9565b84528301526040820152612777828b6136f8565b52612782818a6136f8565b5001879061264f565b61279361344a565b8282880101520187906125ce565b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d85760209060009080600052600b8352604060002060ff815460f01c1680612834575b61280b575b50506001600160801b0360405191168152f35b61282d92506001600160801b036002612827920154169161366a565b9061350b565b82806127f8565b5060ff600182015460a01c16156127f3565b3461042f57604036600319011261042f5761285f612bd2565b602435906001600160a01b03808061287685612e0c565b169216918083146129705780331490811561294b575b50156128e1578260005260076020526040600020826001600160a01b03198254161790556128b983612e0c565b167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b608460405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152fd5b9050600052600860205260406000203360005260205260ff604060002054168461288c565b608460405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152fd5b3461042f57602036600319011261042f576020611ddf600435612e31565b3461042f57600036600319011261042f57604051600060035490600182811c91818416918215612ab1575b60209485851084146110c05785879486865291826000146110a0575050600114612a54575061102f92500383612d6f565b84915060036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b906000915b858310612a9957505061102f935082010185611022565b80548389018501528794508693909201918101612a82565b92607f1692612a23565b3461042f57602036600319011261042f57600435907fffffffff00000000000000000000000000000000000000000000000000000000821680920361042f57817f80ac58cd0000000000000000000000000000000000000000000000000000000060209314908115612b60575b8115612b36575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501483612b2f565b7f5b5e139f0000000000000000000000000000000000000000000000000000000081149150612b28565b60005b838110612b9d5750506000910152565b8181015183820152602001612b8d565b90602091612bc681518092818552858086019101612b8a565b601f01601f1916010190565b600435906001600160a01b038216820361042f57565b602435906001600160a01b038216820361042f57565b35906001600160a01b038216820361042f57565b606090600319011261042f576001600160a01b0390600435828116810361042f5791602435908116810361042f579060443590565b9181601f8401121561042f5782359167ffffffffffffffff831161042f576020808501948460051b01011161042f57565b90815180825260208080930193019160005b828110612c98575050505090565b835180516001600160801b031686528083015167ffffffffffffffff168684015260409081015164ffffffffff169086015260609094019392810192600101612c8a565b3590811515820361042f57565b6060810190811067ffffffffffffffff82111761206157604052565b610120810190811067ffffffffffffffff82111761206157604052565b6040810190811067ffffffffffffffff82111761206157604052565b610160810190811067ffffffffffffffff82111761206157604052565b67ffffffffffffffff811161206157604052565b90601f8019910116810190811067ffffffffffffffff82111761206157604052565b67ffffffffffffffff811161206157601f01601f191660200190565b35906001600160801b038216820361042f57565b15612dc857565b606460405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152fd5b60005260056020526001600160a01b0360406000205416612e2e811515612dc1565b90565b612e546107538260005260056020526001600160a01b0360406000205416151590565b60005260076020526001600160a01b036040600020541690565b15612e7557565b608460405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f766564000000000000000000000000000000000000006064820152fd5b90612f03939291612ef36124988433612f75565b612efe838383613054565b613209565b15612f0a57565b60405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b906001600160a01b038080612f8984612e0c565b16931691838314938415612fbc575b508315612fa6575b50505090565b612fb291929350612e31565b1614388080612fa0565b909350600052600860205260406000208260005260205260ff604060002054169238612f98565b15612fea57565b608460405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152fd5b9061307d929161306383612e0c565b916001600160a01b03948593848094169687911614612fe3565b169081156131705761308e8361349d565b1580613168575b8061315f575b61314757918084926130c9600080516020615a45833981519152966020966130c285612e0c565b1614612fe3565b60009382855260078652604085206001600160a01b031990818154169055818652600687526040862060001981540190558286526040862060018154019055838652600587528260408720918254161790557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6040519580a48152a1565b602483604051906378630aa960e01b82526004820152fd5b5083151561309b565b506001613095565b608460405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152fd5b3d15613204573d906131ea82612d91565b916131f86040519384612d6f565b82523d6000602084013e565b606090565b91926000929190813b1561339a5760209161327991856040519586809581947f150b7a02000000000000000000000000000000000000000000000000000000009b8c84523360048501526001600160a01b0380951660248501526044840152608060648401526084830190612bad565b0393165af190829082613333575b505061330d576132956131d9565b805190816133085760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000161490565b909192506020813d8211613392575b8161334f60209383612d6f565b8101031261338e5751907fffffffff000000000000000000000000000000000000000000000000000000008216820361338b5750903880613287565b80fd5b5080fd5b3d9150613342565b5050505050600190565b67ffffffffffffffff81116120615760051b60200190565b9081546133c8816133a4565b926040936133d885519182612d6f565b828152809460208092019260005281600020906000935b8585106133fe57505050505050565b6001848192845161340e81612ce9565b64ffffffffff87546001600160801b038116835267ffffffffffffffff8160801c168584015260c01c16868201528152019301940193916133ef565b6040519061345782612ce9565b60006040838281528260208201520152565b9060405161347681612ce9565b6040819360018154916001600160801b0392838116865260801c6020860152015416910152565b80600052600b60205260ff60016040600020015460a81c16156104d857600052600b60205260ff60016040600020015460b01c1690565b80600052600b60205260ff60016040600020015460a81c16156104d857600052600b60205260ff60016040600020015460a01c1690565b6001600160801b039182169082160391908211611c1757565b80600052600b60205260ff60016040600020015460a81c16156104d857600052600b60205260406000205460f81c90565b359064ffffffffff8216820361042f57565b929192613573826133a4565b60409461358286519283612d6f565b8195848352602080930191606080960285019481861161042f57925b8584106135ae5750505050505050565b868483031261042f578251906135c382612ce9565b6135cc85612dad565b8252858501359067ffffffffffffffff8216820361042f57828792838b9501526135f7868801613555565b8682015281520193019261359e565b35801515810361042f5790565b356001600160a01b038116810361042f5790565b356001600160801b038116810361042f5790565b919082604091031261042f5760405161365381612d22565b602080829461366181612bfe565b84520135910152565b64ffffffffff80421682600052600b602052604060002091825482828260a01c1610156136cb5760c81c1611156136b95760040154600110156136b057612e2e9061370c565b612e2e9061473c565b6001600160801b039150600201541690565b5050505050600090565b8051156136e25760200190565b634e487b7160e01b600052603260045260246000fd5b80518210156136e25760209160051b010190565b64ffffffffff90814216906000908152600b60205260409081812082519361373385612d3e565b8154956001600160a01b039182881687526020870197828160a01c168952828160c81c168789015260ff8160f01c161515606089015260f81c1515608088015260ff6001938486015490811660a08a0152818160a01c16151560c08a0152818160a81c16151560e08a015260b01c1615156101008801526101406137cd60046137be60028801613469565b966101208b01978852016133bc565b97019187835280876137df889a6136d5565b5101511693828288965b16106138c35750916138736138789284888161387d98976001600160801b039e8f6138158b8a516136f8565b5151169d8a8f9b602061383267ffffffffffffffff928d516136f8565b510151169984836138448484516136f8565b51015116965081156138b757613862929350519060001901906136f8565b5101511680925b0316920316613937565b613ca6565b613b09565b92831361389657505061389083916138fb565b16011690565b5160200151929392831692841683101591506138b29050575090565b905090565b50505051168092613869565b8094986001600160801b0390816138db8c88516136f8565b51511601169801938282808a6138f28989516136f8565b510151166137e9565b600081126139065790565b602490604051907f2463f3d50000000000000000000000000000000000000000000000000000000082526004820152fd5b90600160ff1b808314908115613a1f575b506139f55760008212156139ec57613971826000035b60008312156139e5578260000390613a29565b917f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83116139af57600091600019911813156139ab575090565b0390565b604491604051917fd49c26b300000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b8290613a29565b6139718261395e565b60046040517f9fe2b450000000000000000000000000000000000000000000000000000000008152fd5b9050811438613948565b670de0b6b3a7640000916000198383099280830292838086109503948086039514613ae55782851015613aa957908291096001821901821680920460028082600302188083028203028083028203028083028203028083028203028083028203028092029003029360018380600003040190848311900302920304170290565b82606492604051927f63a05778000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b505080925015613af3570490565b634e487b7160e01b600052601260045260246000fd5b90600160ff1b808314908115613bed575b50613bc3576000821215613bba57613b43826000035b6000831215613bb3578260000390613bf7565b917f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311613b7d57600091600019911813156139ab575090565b604491604051917f120b5b4300000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b8290613bf7565b613b4382613b30565b60046040517fa6070c25000000000000000000000000000000000000000000000000000000008152fd5b9050811438613b1a565b90919060001983820983820291828083109203918083039214613c9557670de0b6b3a76400009081831015613c5e57947faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066994950990828211900360ee1b910360121c170290565b60449086604051917f5173648d00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050670de0b6b3a764000090049150565b80613cc05750600090612e2e5750670de0b6b3a764000090565b90670de0b6b3a7640000808314613d0d575080613ce5575050670de0b6b3a764000090565b670de0b6b3a76400008114613d0957613d0490613878612e2e936145e7565b613d2d565b5090565b91505090565b8015613af3576ec097ce7bc90715b34b9f10000000000590565b6000811215613d625768033dd1780914b97114198112613d5c57613d5390600003613d2d565b612e2e90613d13565b50600090565b680a688906bd8affffff81136145b657670de0b6b3a764000080604092831b05907780000000000000000000000000000000000000000000000067ff000000000000008316614499575b66ff0000000000008316614391575b65ff00000000008316614291575b64ff000000008316614199575b63ff00000083166140a9575b62ff00008316613fc1575b61ff008316613ee1575b60ff8316613e0a575b02911c60bf031c90565b60808316613ecf575b838316613ebd575b60208316613eab575b60108316613e99575b60088316613e87575b60048316613e75575b60028316613e63575b6001831615613e00576801000000000000000102831c613e00565b6801000000000000000102831c613e48565b6801000000000000000302831c613e3f565b6801000000000000000602831c613e36565b6801000000000000000b02831c613e2d565b6801000000000000001602831c613e24565b6801000000000000002c02831c613e1b565b6801000000000000005902831c613e13565b6180008316613faf575b6140008316613f9d575b6120008316613f8b575b6110008316613f79575b6108008316613f67575b6104008316613f55575b6102008316613f43575b610100831615613df757680100000000000000b102831c613df7565b6801000000000000016302831c613f27565b680100000000000002c602831c613f1d565b6801000000000000058c02831c613f13565b68010000000000000b1702831c613f09565b6801000000000000162e02831c613eff565b68010000000000002c5d02831c613ef5565b680100000000000058b902831c613eeb565b628000008316614097575b624000008316614085575b622000008316614073575b621000008316614061575b62080000831661404f575b62040000831661403d575b62020000831661402b575b62010000831615613ded576801000000000000b17202831c613ded565b680100000000000162e402831c61400e565b6801000000000002c5c802831c614003565b68010000000000058b9102831c613ff8565b680100000000000b172102831c613fed565b68010000000000162e4302831c613fe2565b680100000000002c5c8602831c613fd7565b6801000000000058b90c02831c613fcc565b63800000008316614187575b63400000008316614175575b63200000008316614163575b63100000008316614151575b6308000000831661413f575b6304000000831661412d575b6302000000831661411b575b6301000000831615613de25768010000000000b1721802831c613de2565b6801000000000162e43002831c6140fd565b68010000000002c5c86002831c6140f1565b680100000000058b90c002831c6140e5565b6801000000000b17217f02831c6140d9565b680100000000162e42ff02831c6140cd565b6801000000002c5c85fe02831c6140c1565b68010000000058b90bfc02831c6140b5565b648000000000831661427f575b644000000000831661426d575b642000000000831661425b575b6410000000008316614249575b6408000000008316614237575b6404000000008316614225575b6402000000008316614213575b640100000000831615613dd657680100000000b17217f802831c613dd6565b68010000000162e42ff102831c6141f4565b680100000002c5c85fe302831c6141e7565b6801000000058b90bfce02831c6141da565b68010000000b17217fbb02831c6141cd565b6801000000162e42fff002831c6141c0565b68010000002c5c8601cc02831c6141b3565b680100000058b90c0b4902831c6141a6565b65800000000000831661437f575b65400000000000831661436d575b65200000000000831661435b575b651000000000008316614349575b650800000000008316614337575b650400000000008316614325575b650200000000008316614313575b65010000000000831615613dc9576801000000b17218355102831c613dc9565b680100000162e430e5a202831c6142f3565b6801000002c5c863b73f02831c6142e5565b68010000058b90cf1e6e02831c6142d7565b680100000b1721bcfc9a02831c6142c9565b68010000162e43f4f83102831c6142bb565b680100002c5c89d5ec6d02831c6142ad565b6801000058b91b5bc9ae02831c61429f565b66800000000000008316614487575b66400000000000008316614475575b66200000000000008316614463575b66100000000000008316614451575b6608000000000000831661443f575b6604000000000000831661442d575b6602000000000000831661441b575b6601000000000000831615613dbb5768010000b17255775c0402831c613dbb565b6801000162e525ee054702831c6143fa565b68010002c5cc37da949202831c6143eb565b680100058ba01fb9f96d02831c6143dc565b6801000b175effdc76ba02831c6143cd565b680100162f3904051fa102831c6143be565b6801002c605e2e8cec5002831c6143af565b68010058c86da1c09ea202831c6143a0565b6780000000000000008316614597575b6740000000000000008316614585575b6720000000000000008316614573575b6710000000000000008316614561575b670800000000000000831661454f575b670400000000000000831661453d575b670200000000000000831661452b575b670100000000000000831615613dac57680100b1afa5abcbed6102831c613dac565b68010163da9fb33356d802831c614509565b680102c9a3e778060ee702831c6144f9565b6801059b0d31585743ae02831c6144e9565b68010b5586cf9890f62a02831c6144d9565b6801172b83c7d517adce02831c6144c9565b6801306fe0a31b7152df02831c6144b9565b5077b504f333f9de6484800000000000000000000000000000006144a9565b602490604051907f0360d0280000000000000000000000000000000000000000000000000000000082526004820152fd5b8060008083131561470b57670de0b6b3a7640000928381126146d457506001925b808305906001600160801b03821160071b91821c9167ffffffffffffffff831160061b92831c63ffffffff811160051b90811c61ffff811160041b90811c60ff811160031b90811c91600f831160021b92831c936001978860038711811b96871c11961717171717171781810294811d908282146146c857506706f05b59d3b20000905b84821361469c5750505050500290565b808391020590671bc16d674ec800008212156146bb575b831d9061468c565b8091950194831d906146b3565b93505093925050020290565b60001993925080156146f7576ec097ce7bc90715b34b9f10000000000591614608565b602482634e487b7160e01b81526012600452fd5b602483604051907f059b101b0000000000000000000000000000000000000000000000000000000082526004820152fd5b6000818152600b602052614771604082205464ffffffffff808281809460a01c1693849160c81c160316918142160316613937565b91808252600b602052600460408320018054156147f75790829167ffffffffffffffff93526147c96020832054828452600b6020526138786001600160801b03968760026040882001541696879360801c1690613ca6565b9283136147df5750506147db906138fb565b1690565b60029350604092508152600b60205220015460801c90565b602483634e487b7160e01b81526032600452fd5b80600052600b602052604060002060ff600182015460a01c16600014614832575050600490565b805460f81c614885575460a01c64ffffffffff164210613d5c576148558161366a565b90600052600b6020526001600160801b03806002604060002001541691161060001461488057600190565b600290565b5050600390565b80600052600b6020526148a56002604060002001613469565b81600052600b602052604060002060ff600182015460a01c166000146148d857506001600160801b039150602001511690565b5460f81c6148ea5750612e2e9061366a565b612e2e91506001600160801b03604081835116920151169061350b565b906001600160a01b036001541660206001600160a01b0360c0850151166024604051809481937fdcf844a700000000000000000000000000000000000000000000000000000000835260048301525afa8015610841576000906151d6575b61498891506001600160801b0360a08501511690602060e0860151015191615905565b6001600160801b038151166101008401519064ffffffffff60208601511681156151ac5782518015615182577f00000000000000000000000000000000000000000000000000000000000000008111615151575064ffffffffff60406149ed856136d5565b510151168110156150fa5750600091829083815185905b808210615067575050505064ffffffffff421664ffffffffff82168110156150275750506001600160801b0382168103614fe55750506009549283600052600b6020526040600020916001600160801b0381511660028401906fffffffffffffffffffffffffffffffff198254161790556001600160a01b0360c083015116600184015490750100000000000000000000000000000000000000000060408501511515928654927fffffffffffffffffff0000ff000000000000000000000000000000000000000076ff000000000000000000000000000000000000000000006060890151151560b01b16921617171760018601556001600160a01b0384511691610100850151926040614b1f8551956000198701906136f8565b510151927fff000000000000000000000000000000000000000000000000000000000000007eff0000000000000000000000000000000000000000000000000000000000007dffffffffff0000000000000000000000000000000000000000000000000078ffffffffff000000000000000000000000000000000000000060208b015160a01b169660c81b169460f01b16911617171717845560005b818110614f15575050600185016009556001600160a01b0360c08301511660005260026020526001600160801b0380604060002054168160208401511601166001600160a01b0360c0840151166000526040600020906fffffffffffffffffffffffffffffffff198254161790556001600160a01b036080830151168015614ed157614c66614c608760005260056020526001600160a01b0360406000205416151590565b15615384565b614c6f8661349d565b1580614ec9575b80614ec1575b614ea9576020600080516020615a4583398151915291614cb5614c608960005260056020526001600160a01b0360406000205416151590565b806000526006825260406000206001815401905587600052600582526040600020816001600160a01b0319825416179055876040519160007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4878152a1614d456001600160a01b0360c0840151166001600160801b0380845116816020860151160116903090339061520a565b6001600160801b0360408201511680614e7a575b507fef3d668acee46576ad5d407c42ab4d0cde13f3cd70b28f09a0fb9e3bf5bf09cb6001600160a01b0383511691866001600160a01b03608086015116946001600160a01b0360c08201511696614e6f614e4f6040840151151592606085015115156001600160a01b0360e061010088015193549764ffffffffff60405199614de18b612d22565b818160a01c168b5260c81c1660208a01520151511694614e34604051998a998a523360208b015260408a0190604090816001600160801b0391828151168552826020820151166020860152015116910152565b60a088015260c08701526101608060e0880152860190612c78565b926101008501906020908164ffffffffff91828151168552015116910152565b6101408301520390a4565b614ea3906001600160a01b0360c0850151166001600160a01b0360e0860151511690339061520a565b38614d59565b602486604051906378630aa960e01b82526004820152fd5b506000614c7c565b506001614c76565b606460405162461bcd60e51b815260206004820152602060248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152fd5b614f24816101008601516136f8565b51906004860154916801000000000000000083101561206157600183018060048901558310156136e25760019260048801600052602060002001906001600160801b03815116908254917fffffff00000000000000000000000000000000000000000000000000000000007cffffffffff000000000000000000000000000000000000000000000000604077ffffffffffffffff00000000000000000000000000000000602086015160801b1694015160c01b169316171717905501614bbb565b6040517fd90b7e390000000000000000000000000000000000000000000000000000000081526001600160801b03918216600482015291166024820152604490fd5b6040517f210aec0e00000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b919350919461508b906001600160801b0361508285896136f8565b51511690615667565b9464ffffffffff80604061509f86856136f8565b510151169416808511156150bd575060018493019192919092614a04565b8385606492604051927f7b0bada8000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b64ffffffffff604061510b856136d5565b5101516040517fb4c9e52c00000000000000000000000000000000000000000000000000000000815264ffffffffff938416600482015291169091166024820152604490fd5b602490604051907f4757689b0000000000000000000000000000000000000000000000000000000082526004820152fd5b60046040517f3952c64e000000000000000000000000000000000000000000000000000000008152fd5b60046040517f6095d3bc000000000000000000000000000000000000000000000000000000008152fd5b6020823d602011615202575b816151ef60209383612d6f565b8101031261338b57506149889051614965565b3d91506151e2565b9290604051927f23b872dd0000000000000000000000000000000000000000000000000000000060208501526001600160a01b03809216602485015216604483015260648201526064815260a081019181831067ffffffffffffffff841117612061576152799260405261527b565b565b6001600160a01b0316906152db60405161529481612d22565b6020938482527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564858301526000808587829751910182855af16152d56131d9565b916153cf565b805191821591848315615360575b5050509050156152f65750565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b91938180945001031261338e5782015190811515820361338b5750803880846152e9565b1561538b57565b606460405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152fd5b9192901561543057508151156153e3575090565b3b156153ec5790565b606460405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b8251909150156154435750805190602001fd5b6104039060405191829162461bcd60e51b8352602060048401526024830190612bad565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361549957565b60046040517fa1c0d6e5000000000000000000000000000000000000000000000000000000008152fd5b916001600160a01b03604051927fa9059cbb000000000000000000000000000000000000000000000000000000006020850152166024830152604482015260448152608081019181831067ffffffffffffffff841117612061576152799260405261527b565b612e2e906155368161488c565b90600052600b60205260026040600020015460801c9061350b565b91908110156136e25760051b0190565b92919061556d846134d4565b6104175761559184600052600b6020526001600160a01b0360406000205416331490565b1580615657575b6103e4576155bc84600052600b6020526001600160a01b0360406000205416331490565b80615633575b615606576001600160a01b03811615610369576001600160801b038216156155ee576152799293615682565b6024846040519063d2aabcd960e01b82526004820152fd5b836001600160a01b0360649260405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b508360005260056020526001600160a01b03806040600020541690821614156155c2565b506156618461589c565b15615598565b9190916001600160801b0380809416911601918211611c1757565b929190926001600160801b038061569883615529565b16928181169380851161585f5750600095838752602092600b84526156fd6156cb6040946002868c20015460801c615667565b868a52600b86526002858b200190836fffffffffffffffffffffffffffffffff1983549260801b169116178155613469565b9061571881868401511692828681835116920151169061350b565b161115615830575b838752600b83526001600160a01b03916157438683856001858d200154166154c3565b848852600584528281892054168033141580615826575b61578f575b507ffa54f9f9bdcdd28778cbb9f78490df6691cc4e2729588e10f4cc0a26c465686a9495969750519586521693a3565b803b156158225797807ffa54f9f9bdcdd28778cbb9f78490df6691cc4e2729588e10f4cc0a26c465686a9697989960848451809481937f13375c3b0000000000000000000000000000000000000000000000000000000083528c600484015233602484015289891660448401528d60648401525af1615813575b889796955061575f565b61581c90612d5b565b38615809565b8880fd5b50803b151561575a565b838752600b835281872060018101600160a01b60ff60a01b1982541617905560ff60f01b198154169055615720565b8360649186604051927fa1fb2bbc000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b60009080825260056020526001600160a01b0380604084205416928333149384156158e1575b505082156158cf57505090565b9091506158dc3392612e31565b161490565b60ff92945090604091815260086020528181203382526020522054169138806158c2565b90929161591061344a565b936001600160801b0392838116918215615a1c5767016345785d8a00008082116159e5578085116159ae575061595a8561594b819386613bf7565b16946020890195865284613bf7565b169184615971604089019480865282875116615667565b1610156159985761598a8491826159939551169061350b565b9151169061350b565b168252565b634e487b7160e01b600052600160045260246000fd5b84604491604051917f4fea5c1a00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b60449250604051917f47152d6700000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b50505050509050604051615a2f81612ce9565b6000815260006020820152600060408201529056fef8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7"; bytes public constant BYTECODE_LOCKUP_LINEAR = - hex"60a034620003e757601f196001600160401b03601f62004a753881900382810185168601919084831187841017620003ec57808792606094604052833981010312620003e75783516001600160a01b03928382169291839003620003e7576020918287015196858816809803620003e75760400151948516809503620003e7576200008962000402565b90601c82527f5361626c696572205632204c6f636b7570204c696e656172204e46540000000084830152620000bd62000402565b601181527029a0a116ab1916a627a1a5aaa816a624a760791b8582015230608052600080546001600160a01b031990811688178255600180548216909b178b5596817fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a38351858111620003d35760039485548c81811c91168015620003c8575b89821014620003b45790818684931162000361575b508890868311600114620002f8578492620002ec575b505060001982871b1c1916908b1b1784555b8151948511620002d8576004958654998b8b811c9b168015620002cd575b828c1014620002ba57848b1162000271575b869798999a50819487116001146200020a57505093620001fe575b505082871b92600019911b1c19161790555b600a541617600a556009556040516146529081620004238239608051816141610152f35b015191503880620001c8565b8883528183208c9890969594939116915b8282106200025757505085116200023c575b50505050811b019055620001da565b01519060f884600019921b161c19169055388080806200022d565b8484015187558c989096019593840193908101906200021b565b87835281832085880160051c81019b838910620002af575b860160051c019a8c905b8c8110620002a3575050620001ad565b848155018c9062000293565b909b508b9062000289565b634e487b7160e01b835260228852602483fd5b9a607f169a6200019b565b634e487b7160e01b81526041600452602490fd5b0151905038806200016b565b908c8e9416918886528a862092865b8c82821062000341575050841162000328575b505050811b0184556200017d565b015160001983891b60f8161c191690553880806200031a565b91929395968291958786015181550195019301908f959493929162000307565b9091508684528884208680850160051c8201928b8610620003aa575b918f91869594930160051c01915b8281106200039b57505062000155565b8681558594508f91016200038b565b925081926200037d565b634e487b7160e01b84526022600452602484fd5b90607f169062000140565b634e487b7160e01b82526041600452602482fd5b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620003ec5760405256fe608080604052600436101561001357600080fd5b600090813560e01c90816301ffc9a714612a2c5750806306fdde031461296a578063081812fc1461294b578063095ea7b3146127bc5780631400ecec1461271c5780631c1cdd4c146126b75780631e99d5691461269957806323b872dd1461266f57806339a73c031461262e57806340e58ee514612254578063425d30dd1461223557806342842e0e146121e557806342966c68146120a55780634857501f1461201b5780634869e12d14611fe05780635fe3b56714611fb95780636352211e14611f895780636d0cee7514611f3357806370a0823114611e8a57806375829def14611df7578063780a82c814611da75780637cad6cd114611cd65780637de6b1db14611aeb5780638659c270146116b3578063894e9a0d1461145f5780638bad38dd146113e25780638f69b993146113465780639067b677146112f357806395d89b41146111e657806396ce1431146110c7578063a22cb46514610ff6578063a2ffb89714610da6578063a6202bf214610ca0578063a80fc07114610c4e578063ab167ccc14610b15578063ad35efd414610ab3578063b256456914610a94578063b88d4fde14610a03578063b8a3be66146109ce578063b971302a1461097f578063bc063e1a1461095c578063bc2be1be1461090c578063c156a11d1461083f578063c87b56dd14610701578063cc364f4814610655578063d4dbd20b14610603578063d511609f146105b7578063d975dfed1461056b578063e985e9c514610516578063ea5ead19146104f0578063eac8f5b814610487578063f590c1761461045e578063f851a440146104385763fdd46d601461027357600080fd5b346104355760603660031901126104355760043561028f612b5b565b610297612c9b565b906102a0614157565b6102a9836132fc565b61041d576102cd83600052600b6020526001600160a01b0360406000205416331490565b158061040d575b6103ea576102f883600052600b6020526001600160a01b0360406000205416331490565b806103c8575b61039b576001600160a01b03811615610371576001600160801b03821615610359579161034f6020927ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce79483614282565b604051908152a180f35b6024836040519063d2aabcd960e01b82526004820152fd5b60046040517fc61a0e9e000000000000000000000000000000000000000000000000000000008152fd5b826001600160a01b0360649260405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b5082845260056020526001600160a01b038060408620541690821614156102fe565b60405163216caf0d60e01b815260048101849052336024820152604490fd5b0390fd5b50610417836144aa565b156102d4565b60248360405190634a5541ef60e01b82526004820152fd5b80fd5b50346104355780600319360112610435576001600160a01b036020915416604051908152f35b503461043557602036600319011261043557602061047d600435613362565b6040519015158152f35b503461043557602036600319011261043557600435808252600b60205260ff600160408420015460d01c16156104d95760016040836001600160a01b039360209552600b855220015416604051908152f35b6024906040519062b8e7e760e51b82526004820152fd5b50346104355760403660031901126104355760043561050d612b5b565b61029782614219565b503461043557604036600319011261043557610530612b45565b604061053a612b5b565b926001600160a01b0380931681526008602052209116600052602052602060ff604060002054166040519015158152f35b50346104355760203660031901126104355760ff6001604060043593848152600b60205220015460d01c16156104d9576105a6602091614219565b6001600160801b0360405191168152f35b503461043557602036600319011261043557600435808252600b60205260ff600160408420015460d01c16156104d95760408260029260209452600b845220015460801c604051908152f35b503461043557602036600319011261043557600435808252600b60205260ff600160408420015460d01c16156104d95760036040836001600160801b039360209552600b855220015416604051908152f35b503461043557602036600319011261043557600435610672613272565b50808252600b60205260ff600160408420015460d01c16156104d9578160409160609352600b60205220805490600164ffffffffff91015481604051936106b885612c25565b818160a01c16855260c81c16602084015260a01c1660408201526106ff60405180926040908164ffffffffff91828151168552826020820151166020860152015116910152565bf35b50346104355760208060031936011261082b5760043561073f61073a8260005260056020526001600160a01b0360406000205416151590565b612cb1565b826001600160a01b03600a5416916044604051809481937fe9dc637500000000000000000000000000000000000000000000000000000000835230600484015260248301525afa9283156108335780936107ae575b50506107aa604051928284938452830190612b20565b0390f35b909192503d8082843e6107c18184612c5d565b820191838184031261082b5780519067ffffffffffffffff821161082f570182601f8201121561082b578051916107f783612c7f565b936108056040519586612c5d565b83855285848401011161043557509061082391848085019101612afd565b903880610794565b5080fd5b8280fd5b604051903d90823e3d90fd5b50346104355760403660031901126104355760043561085c612b5b565b610864614157565b818352600b60205260ff600160408520015460d01c16156108f55781835260056020526001600160a01b036040842054168033036103ea579161034f816020937ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7956108cf83614219565b6001600160801b0381166108e4575b50612f44565b6108ef908285614282565b386108de565b6024826040519062b8e7e760e51b82526004820152fd5b503461043557602036600319011261043557600435808252600b60205260ff600160408420015460d01c16156104d95760408264ffffffffff9260209452600b8452205460a01c16604051908152f35b5034610435578060031936011261043557602060405167016345785d8a00008152f35b503461043557602036600319011261043557600435808252600b60205260ff600160408420015460d01c16156104d9576040826001600160a01b039260209452600b8452205416604051908152f35b50346104355760203660031901126104355760ff600160406020936004358152600b855220015460d01c166040519015158152f35b503461043557608036600319011261043557610a1d612b45565b610a25612b5b565b906064359067ffffffffffffffff8211610a905736602383011215610a905781600401359284610a5485612c7f565b93610a626040519586612c5d565b858552366024878301011161082b5785610a8d96602460209301838801378501015260443591612dcf565b80f35b8380fd5b503461043557602036600319011261043557602061047d6004356132c5565b503461043557602036600319011261043557600435808252600b60205260ff600160408420015460d01c16156104d957610aec906135d8565b604051906005811015610b0157602092508152f35b602483634e487b7160e01b81526021600452fd5b50346104355761014036600319011261043557610b30614157565b610b38613272565b9064ffffffffff80421680845260c4358281168103610c495781018216602085015260e435908183168203610c495701166040830152606435916001600160a01b03918284168094036104355750608435801515809103610c495760a43590811515809203610c495760243594848616809603610c495760043595858716809703610c4957604435906001600160801b038216809203610c495760405197610bdf89612c08565b8852602088015260408701526060860152608085015260a084015260c0830152604061010319360112610c495760405191610c1983612c41565b610104359182168203610c495782610c419260209452610124358482015260e08201526136da565b604051908152f35b600080fd5b503461043557602036600319011261043557600435808252600b60205260ff600160408420015460d01c16156104d95760026040836001600160801b039360209552600b855220015416604051908152f35b503461043557602036600319011261043557610cba612b45565b6001600160a01b0380835416338103610d7d575081169081835260026020526001600160801b03604084205416908115610d4c5781610d1d918486526002602052604086206fffffffffffffffffffffffffffffffff19815416905533906141b3565b6040519081527fca7a4a65a94ed2f37538814e00e1cd4c41a78261561e3f3794592f11409cf5af60203392a380f35b602483604051907f8410168c0000000000000000000000000000000000000000000000000000000082526004820152fd5b6040516331b339a960e21b81526001600160a01b03919091166004820152336024820152604490fd5b50346104355760603660031901126104355767ffffffffffffffff60043581811161082f57610dd9903690600401612ba6565b91610de2612b5b565b90604435908111610ff257610dfb903690600401612ba6565b9093610e05614157565b818103610fbc57855b818110610e19578680f35b610e24818387614241565b35610e30828589614241565b356001600160801b0381168103610c4957610e49614157565b610e52826132fc565b610fa457610e7682600052600b6020526001600160a01b0360406000205416331490565b1580610f94575b610f7557610ea182600052600b6020526001600160a01b0360406000205416331490565b80610f4d575b610f20576001600160a01b03861615610371576001600160801b03811615610f0857602082610efb7ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7938960019796614282565b604051908152a101610e0e565b6024826040519063d2aabcd960e01b82526004820152fd5b6064826001600160a01b038860405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b5081895260056020526001600160a01b0360408a2054166001600160a01b0387161415610ea7565b60405163216caf0d60e01b815260048101839052336024820152604490fd5b50610f9e826144aa565b15610e7d565b60248260405190634a5541ef60e01b82526004820152fd5b604491604051917faec9344000000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b8480fd5b503461043557604036600319011261043557611010612b45565b60243590811515809203610c49576001600160a01b0316908133146110835733835260086020526040832082600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a380f35b606460405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152fd5b503461043557610160366003190112610435576110e2614157565b604051906110ef82612c08565b6110f7612b45565b8252611101612b5b565b602083015261110e612c9b565b60408301526001600160a01b03906064358281168103610c495760608401526084358015158103610c4957608084015260a4358015158103610c495760a084015260603660c3190112610435575060405161116881612c25565b64ffffffffff60c4358181168103610c4957825260e4358181168103610c49576020830152610104359081168103610c4957604082015260c0830152604061012319360112610c4957604051916111be83612c41565b610124359182168203610c495782610c419260209452610144358482015260e08201526136da565b5034610435578060031936011261043557604051908060045491600183811c928185169485156112e9575b60209586861081146112d5578588528794939291879082156112b3575050600114611259575b505061124592500383612c5d565b6107aa604051928284938452830190612b20565b90859250600482527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5b85831061129b57505061124593508201013880611237565b80548389018501528794508693909201918101611283565b925093505061124594915060ff191682840152151560051b8201013880611237565b602483634e487b7160e01b81526022600452fd5b93607f1693611211565b503461043557602036600319011261043557600435808252600b60205260ff600160408420015460d01c16156104d957600160408364ffffffffff9360209552600b855220015460a01c16604051908152f35b503461043557602036600319011261043557600435808252600b60205260ff600160408420015460d01c16156104d95761137f906135d8565b90600582101590816113c057600283149182156113d4575b82156113ab575b6020836040519015158152f35b9091506113c05750600460209114388061139e565b80634e487b7160e01b602492526021600452fd5b506003831491506000611397565b5034610435576020366003190112610435576004356001600160a01b039081811680910361082f5781835416338103610d7d575060015491816001600160a01b03198416176001556040519216825260208201527fdcb09aef4bf01068924ccce937981cbe59d25ba08380cf941aaaea4e4bd3960d60403392a280f35b50346104355760203660031901126104355760405161147d81612beb565b8181528160208201528160408201528160608201528160808201528160a08201528160c08201528160e082015281610100820152816101208201526101406114c3613272565b9101526004358152600b60205260ff600160408320015460d01c161561169b576004358152600b6020526040812061159c60026040519261150384612beb565b80546001600160a01b038116855264ffffffffff8160a01c16602086015264ffffffffff8160c81c16604086015260ff8160f01c161515606086015260f81c1515608085015260ff60018201546001600160a01b03811660a087015264ffffffffff8160a01c1660c0870152818160c81c16151560e0870152818160d01c16151561010087015260d81c16151561012085015201613291565b6101408201526115ad6004356135d8565b6005811015610b01579160026101a09314611690575b506106ff610140604051926001600160a01b03815116845264ffffffffff602082015116602085015264ffffffffff60408201511660408501526060810151151560608501526080810151151560808501526001600160a01b0360a08201511660a085015264ffffffffff60c08201511660c085015260e0810151151560e0850152610100810151151561010085015261012081015115156101208501520151610140830190604090816001600160801b0391828151168552826020820151166020860152015116910152565b6060820152386115c3565b602460405162b8e7e760e51b81526004356004820152fd5b503461043557602090816003193601126104355760043567ffffffffffffffff811161082b576116e883913690600401612ba6565b906116f1614157565b83915b8083106116ff578480f35b61170e83828497959697614241565b3593611718614157565b611721856132fc565b1561173e5760248560405190634a5541ef60e01b82526004820152fd5b9091929361174b81613362565b611ad35761176f81600052600b6020526001600160a01b0360406000205416331490565b1580611ab5575b611a955761178381613393565b818652600b9081885261179b60026040892001613291565b6001600160801b0391828251168382161015611a7d57848952838a5260ff60408a205460f01c1615611a65579282826117ed86838e6117e38f9a829a60409e9d9a5116613333565b9401511690613333565b8487528386528887209161187c835494600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff87161785556003818516958615611a4b575b0190831699818b6fffffffffffffffffffffffffffffffff19819454161790556001600160a01b0380971696879160058c52818f82205416998c5260019e8f91200154166141b3565b33840361197757843b6118f0575b50507f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd260407ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce79786935b825191825288820152a4604051908152a10191909392936116f4565b90919293809596503b15611973576040516372eba20360e01b8152600481018790526001600160a01b03851660248201526001600160801b039182166044820152911660648201528b94939291908b90818160848183895af11561188a5761195e9192939597949650612bd7565b61196f57918a939194928a8d61188a565b8980fd5b8b80fd5b833b6119cc575b50507f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd260407ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce79786936118d4565b90919280949596503b15611973576040516372eba20360e01b8152600481018790526001600160a01b03861660248201526001600160801b039182166044820152911660648201528b94939291908b90818160848183885af11561197e57611a3a9192939597949650612bd7565b61196f57918a939194928a8d61197e565b60018101600160c81b60ff60c81b19825416179055611833565b602485604051906339c6dc7360e21b82526004820152fd5b602485604051906322cad1af60e11b82526004820152fd5b60405163216caf0d60e01b81526004810191909152336024820152604490fd5b50808552600586526001600160a01b03604086205416331415611776565b6024906040519063fe19f19f60e01b82526004820152fd5b50346104355760208060031936011261082b5760043590611b0a614157565b818352600b815260ff600160408520015460d01c16156108f557611b2d826135d8565b6005811015611cc25760048103611b565760248360405190634a5541ef60e01b82526004820152fd5b60038103611b76576024836040519063fe19f19f60e01b82526004820152fd5b600214611caa57611b9d82600052600b6020526001600160a01b0360406000205416331490565b15610f7557818352600b815260ff604084205460f01c1615611c9257818352600b81526040832060ff60f01b19815416905560058152826001600160a01b03604082205416803b611c3b575b50506040517ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce792807f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f8680a28152a180f35b803b1561082b578180916024604051809481937f341a0bd90000000000000000000000000000000000000000000000000000000083528960048401525af115611be957611c8790612bd7565b61082f578238611be9565b602482604051906339c6dc7360e21b82526004820152fd5b602482604051906322cad1af60e11b82526004820152fd5b602484634e487b7160e01b81526021600452fd5b5034610435576020366003190112610435576004356001600160a01b039081811680910361082f5781835416338103610d7d5750600a5491816001600160a01b0319841617600a556040519216825260208201527fa2548bd4b805e907c1558a47b5858324fe8bb4a2e1ddfca647eecbf65610eebc60403392a26009546000198101908111611d935760407f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c91815190600182526020820152a180f35b602482634e487b7160e01b81526011600452fd5b503461043557602036600319011261043557600435808252600b60205260ff600160408420015460d01c16156104d95760408264ffffffffff9260209452600b8452205460c81c16604051908152f35b503461043557602036600319011261043557611e11612b45565b9080546001600160a01b0380821693338503611e63576001600160a01b03199394501691829116178255337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808380a380f35b6040516331b339a960e21b81526001600160a01b0386166004820152336024820152604490fd5b5034610435576020366003190112610435576001600160a01b03611eac612b45565b168015611ec9578160409160209352600683522054604051908152f35b608460405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e657200000000000000000000000000000000000000000000006064820152fd5b5034610435576020366003190112610435576001600160a01b036040602092600435611f7861073a8260005260056020526001600160a01b0360406000205416151590565b815260058452205416604051908152f35b5034610435576020366003190112610435576020611fa8600435612cfc565b6001600160a01b0360405191168152f35b503461043557806003193601126104355760206001600160a01b0360015416604051908152f35b50346104355760203660031901126104355760ff6001604060043593848152600b60205220015460d01c16156104d9576105a660209161365f565b50346104355760203660031901126104355760043590818152600b60205260ff600160408320015460d01c16156108f55780612056836135d8565b92600584101561209157600260209403612077575b50506040519015158152f35b8152600b8352604090205460f01c60ff169050388061206b565b602482634e487b7160e01b81526021600452fd5b5034610435576020366003190112610435576004356120c2614157565b6120cb816132fc565b156121b4576120d9816144aa565b15611a95576120e781612cfc565b6120f0826132c5565b1590816121ac575b81612199575b50612181578161210d82612cfc565b82825260076020526001600160a01b0360408320916001600160a01b031992838154169055169081835260066020526040832060001981540190558383526005602052604083209081541690557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a480f35b602490604051906378630aa960e01b82526004820152fd5b6001600160a01b039150161515386120fe565b8391506120f8565b602490604051907f817cd6390000000000000000000000000000000000000000000000000000000082526004820152fd5b5034610435576121f436612b71565b60405191602083019383851067ffffffffffffffff86111761221f57610a8d94604052858452612dcf565b634e487b7160e01b600052604160045260246000fd5b503461043557602036600319011261043557602061047d6004356132fc565b50346104355760208060031936011261082b5760043590612273614157565b61227c826132fc565b156122995760248260405190634a5541ef60e01b82526004820152fd5b6122a282613362565b612616576122c682600052600b6020526001600160a01b0360406000205416331490565b15806125f8575b610f75576122da82613393565b91808452600b82526122f160026040862001613291565b6001600160801b03938482511685821610156125e057828652600b845260ff604087205460f01c16156125c857816123358287876117e36040968383995116613333565b848852600b8452828820916123c4835498600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8b161785558a60038286169687156125ae575b019184169a828c6fffffffffffffffffffffffffffffffff198195541617905560016001600160a01b0380921698899360058c52600b8483832054169c52200154166141b3565b3384036124a157908891853b612434575b5050507f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd260407ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce79786935b825191825288820152a4604051908152a180f35b853b1561082f576040516372eba20360e01b8152600481018890526001600160a01b03861660248201526001600160801b03918216604482015291166064820152818160848183895af1612489575b806123d5565b61249290612bd7565b61249d578638612483565b8680fd5b83989792983b6124fb575b50507f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd2604085927ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce79899612420565b833b156125aa576040516372eba20360e01b8152600481018790526001600160a01b03861660248201526001600160801b03918216604482015291166064820152868160848183875af1612550575b806124ac565b604085927ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7986125a07f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd294612bd7565b985092505061254a565b8780fd5b60018101600160c81b60ff60c81b1982541617905561237d565b602483604051906339c6dc7360e21b82526004820152fd5b602483604051906322cad1af60e11b82526004820152fd5b50818352600581526001600160a01b036040842054163314156122cd565b6024826040519063fe19f19f60e01b82526004820152fd5b5034610435576020366003190112610435576001600160801b0360406020926001600160a01b0361265d612b45565b16815260028452205416604051908152f35b503461043557610a8d61268136612b71565b9161269461268f8433612e65565b612d5e565b612f44565b50346104355780600319360112610435576020600954604051908152f35b503461043557602036600319011261043557600435808252600b60205260ff600160408420015460d01c16156104d9576126f0906135d8565b9060058210156113c05760208215838115612711575b506040519015158152f35b600191501482612706565b50346104355760203660031901126104355760043590818152600b60205260ff600160408320015460d01c16156108f557602091604082828152600b85522060ff815460f01c16806127aa575b612781575b50506001600160801b0360405191168152f35b6127a392506001600160801b03600261279d9201541691613393565b90613333565b388061276e565b5060ff600182015460c81c1615612769565b5034610435576040366003190112610435576127d6612b45565b602435906001600160a01b0380806127ed85612cfc565b169216918083146128e1578033149081156128c0575b501561285657828452600760205260408420826001600160a01b031982541617905561282e83612cfc565b167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258480a480f35b608460405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152fd5b9050845260086020526040842033855260205260ff60408520541638612803565b608460405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152fd5b5034610435576020366003190112610435576020611fa8600435612d21565b5034610435578060031936011261043557604051908060035491600183811c92818516948515612a22575b60209586861081146112d5578588528794939291879082156112b35750506001146129c857505061124592500383612c5d565b90859250600382527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b858310612a0a57505061124593508201013880611237565b805483890185015287945086939092019181016129f2565b93607f1693612995565b90503461082b57602036600319011261082b576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361082f57602092507f80ac58cd000000000000000000000000000000000000000000000000000000008114908115612ad3575b8115612aa9575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501438612aa2565b7f5b5e139f0000000000000000000000000000000000000000000000000000000081149150612a9b565b60005b838110612b105750506000910152565b8181015183820152602001612b00565b90602091612b3981518092818552858086019101612afd565b601f01601f1916010190565b600435906001600160a01b0382168203610c4957565b602435906001600160a01b0382168203610c4957565b6060906003190112610c49576001600160a01b03906004358281168103610c4957916024359081168103610c49579060443590565b9181601f84011215610c495782359167ffffffffffffffff8311610c49576020808501948460051b010111610c4957565b67ffffffffffffffff811161221f57604052565b610160810190811067ffffffffffffffff82111761221f57604052565b610100810190811067ffffffffffffffff82111761221f57604052565b6060810190811067ffffffffffffffff82111761221f57604052565b6040810190811067ffffffffffffffff82111761221f57604052565b90601f8019910116810190811067ffffffffffffffff82111761221f57604052565b67ffffffffffffffff811161221f57601f01601f191660200190565b604435906001600160801b0382168203610c4957565b15612cb857565b606460405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152fd5b60005260056020526001600160a01b0360406000205416612d1e811515612cb1565b90565b612d4461073a8260005260056020526001600160a01b0360406000205416151590565b60005260076020526001600160a01b036040600020541690565b15612d6557565b608460405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f766564000000000000000000000000000000000000006064820152fd5b90612df3939291612de361268f8433612e65565b612dee838383612f44565b6130de565b15612dfa57565b60405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b906001600160a01b038080612e7984612cfc565b16931691838314938415612eac575b508315612e96575b50505090565b612ea291929350612d21565b1614388080612e90565b909350600052600860205260406000208260005260205260ff604060002054169238612e88565b15612eda57565b608460405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152fd5b90612f6c91612f5284612cfc565b916001600160a01b03938493848094169485911614612ed3565b1691821561304557612f7d846132c5565b158061303d575b80613034575b61301c5781612fa391612f9c86612cfc565b1614612ed3565b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60008481526007602052604081206001600160a01b03199081815416905583825260066020526040822060001981540190558482526040822060018154019055858252600560205284604083209182541617905580a4565b602484604051906378630aa960e01b82526004820152fd5b50811515612f8a565b506001612f84565b608460405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152fd5b3d156130d9573d906130bf82612c7f565b916130cd6040519384612c5d565b82523d6000602084013e565b606090565b91926000929190813b156132685760209161314e91856040519586809581947f150b7a02000000000000000000000000000000000000000000000000000000009b8c84523360048501526001600160a01b0380951660248501526044840152608060648401526084830190612b20565b0393165af190829082613208575b50506131e25761316a6130ae565b805190816131dd5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000161490565b909192506020813d8211613260575b8161322460209383612c5d565b8101031261082b5751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610435575090388061315c565b3d9150613217565b5050505050600190565b6040519061327f82612c25565b60006040838281528260208201520152565b9060405161329e81612c25565b6040819360018154916001600160801b0392838116865260801c6020860152015416910152565b80600052600b60205260ff60016040600020015460d01c16156104d957600052600b60205260ff60016040600020015460d81c1690565b80600052600b60205260ff60016040600020015460d01c16156104d957600052600b60205260ff60016040600020015460c81c1690565b6001600160801b03918216908216039190821161334c57565b634e487b7160e01b600052601160045260246000fd5b80600052600b60205260ff60016040600020015460d01c16156104d957600052600b60205260406000205460f81c90565b600090808252600b6020526040822091825464ffffffffff42818360c81c16116134415780600186015460a01c16918242101561342b576133e09394955060a01c16809103904203613449565b90828152600b6020526001600160801b0392613406846002604085200154168094613529565b9283116134135750501690565b60029350604092508152600b60205220015460801c90565b505050505060026001600160801b039101541690565b505091505090565b670de0b6b3a764000091600019838309928083029283808610950394808603951461350557828510156134c957908291096001821901821680920460028082600302188083028203028083028203028083028203028083028203028083028203028092029003029360018380600003040190848311900302920304170290565b82606492604051927f63a05778000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b505080925015613513570490565b634e487b7160e01b600052601260045260246000fd5b909190600019838209838202918280831092039180830392146135c757670de0b6b3a7640000908183101561359057947faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066994950990828211900360ee1b910360121c170290565b60449086604051917f5173648d00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050670de0b6b3a764000090049150565b80600052600b602052604060002060ff600182015460c81c166000146135ff575050600490565b805460f81c613658575460a01c64ffffffffff1642106136525761362281613393565b90600052600b6020526001600160801b03806002604060002001541691161060001461364d57600190565b600290565b50600090565b5050600390565b80600052600b6020526136786002604060002001613291565b81600052600b602052604060002060ff600182015460c81c166000146136ab57506001600160801b039150602001511690565b5460f81c6136bd5750612d1e90613393565b612d1e91506001600160801b036040818351169201511690613333565b906001600160a01b036001541660206001600160a01b036060850151166024604051809481937fdcf844a700000000000000000000000000000000000000000000000000000000835260048301525afa8015613eee57600090613eba575b61375b91506001600160801b0360408501511690602060e0860151015191614513565b916001600160801b0383511660c08201519015613e905764ffffffffff815116602082019064ffffffffff82511690818111613e5057505064ffffffffff604091511691019064ffffffffff8251169081811015613e1057505064ffffffffff8042169151169081811015613dd0575050600954926001600160801b03815116604051906137e882612c25565b815260006020820152600060408201526001600160a01b036060840151169060c08401519164ffffffffff6020840151169064ffffffffff604085015116906080870151151560a088015115159364ffffffffff6001600160a01b038a51169751166040519761385789612beb565b88526020880152604087015260608601526000608086015260a085015260c0840152600060e0840152600161010084015261012083015261014082015284600052600b60205260406000206001600160a01b038251166001600160a01b03198254161781556138ee64ffffffffff602084015116829064ffffffffff60a01b1964ffffffffff60a01b83549260a01b169116179055565b604082015181547eff0000000000000000000000000000000000000000000000000000000000006060850151151560f01b169078ffffffffffffffffffffffffffffffffffffffffffffffffff7dffffffffff000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000006080880151151560f81b169460c81b1691161717178155600181016001600160a01b0360a0840151166001600160a01b03198254161781556139e564ffffffffff60c085015116829064ffffffffff60a01b1964ffffffffff60a01b83549260a01b169116179055565b60e083015181546101008501516101208601517fffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff90921692151560c81b79ff00000000000000000000000000000000000000000000000000169290921791151560d01b7aff0000000000000000000000000000000000000000000000000000169190911790151560d81b7bff00000000000000000000000000000000000000000000000000000016179055610140909101518051602082015160801b6fffffffffffffffffffffffffffffffff199081166001600160801b03928316176002850155926040906003019201511682825416179055600185016009556001600160a01b0360608401511660005260026020526001600160801b0380604060002054168160208501511601166001600160a01b036060850151166000526040600020918254161790556001600160a01b036020830151168015613d8c57613b69613b638660005260056020526001600160a01b0360406000205416151590565b15614074565b613b72856132c5565b1580613d84575b80613d7c575b613d64578490613ba8613b638360005260056020526001600160a01b0360406000205416151590565b8060005260066020526040600020600181540190558160005260056020526040600020816001600160a01b031982541617905560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4613c316001600160a01b036060840151166001600160801b03808451168160208601511601169030903390613efa565b6001600160801b0360408201511680613d35575b506001600160a01b038251167f075861cbceafeb777e8f15f357121b08f6f3adba387d599bb7b5278ca6192df5610160866001600160a01b0360208701511694613d2c6001600160a01b03606089015116976080810151151560a0820151151590613cf66001600160a01b0360e060c08601519501515116956040519788523360208901526040880190604090816001600160801b0391828151168552826020820151166020860152015116910152565b60a086015260c0850152805164ffffffffff90811660e08601526020820151811661010086015260409091015116610120840152565b610140820152a4565b613d5e906001600160a01b036060850151166001600160a01b0360e08601515116903390613efa565b38613c45565b602485604051906378630aa960e01b82526004820152fd5b506000613b7f565b506001613b79565b606460405162461bcd60e51b815260206004820152602060248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152fd5b6040517f210aec0e00000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b6040517f9fee269100000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b6040517f4c23297000000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b60046040517f6095d3bc000000000000000000000000000000000000000000000000000000008152fd5b6020823d602011613ee6575b81613ed360209383612c5d565b81010312610435575061375b9051613738565b3d9150613ec6565b6040513d6000823e3d90fd5b9290604051927f23b872dd0000000000000000000000000000000000000000000000000000000060208501526001600160a01b03809216602485015216604483015260648201526064815260a081019181831067ffffffffffffffff84111761221f57613f6992604052613f6b565b565b6001600160a01b031690613fcb604051613f8481612c41565b6020938482527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564858301526000808587829751910182855af1613fc56130ae565b916140bf565b805191821591848315614050575b505050905015613fe65750565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b91938180945001031261082b57820151908115158203610435575080388084613fd9565b1561407b57565b606460405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152fd5b9192901561412057508151156140d3575090565b3b156140dc5790565b606460405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b8251909150156141335750805190602001fd5b6104099060405191829162461bcd60e51b8352602060048401526024830190612b20565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361418957565b60046040517fa1c0d6e5000000000000000000000000000000000000000000000000000000008152fd5b916001600160a01b03604051927fa9059cbb000000000000000000000000000000000000000000000000000000006020850152166024830152604482015260448152608081019181831067ffffffffffffffff84111761221f57613f6992604052613f6b565b612d1e906142268161365f565b90600052600b60205260026040600020015460801c90613333565b91908110156142515760051b0190565b634e487b7160e01b600052603260045260246000fd5b9190916001600160801b038080941691160191821161334c57565b929190926001600160801b038061429883614219565b16928181169380851161446d5750600095838752602092600b845261430b6142cb6040946002868c20015460801c614267565b868a52600b86526143066002868c20019182906001600160801b036fffffffffffffffffffffffffffffffff1983549260801b169116179055565b613291565b90614326818684015116928286818351169201511690613333565b16111561443e575b838752600b83526001600160a01b03916143518683856001858d200154166141b3565b848852600584528281892054168033141580614434575b61439d575b507ffa54f9f9bdcdd28778cbb9f78490df6691cc4e2729588e10f4cc0a26c465686a9495969750519586521693a3565b803b156144305797807ffa54f9f9bdcdd28778cbb9f78490df6691cc4e2729588e10f4cc0a26c465686a9697989960848451809481937f13375c3b0000000000000000000000000000000000000000000000000000000083528c600484015233602484015289891660448401528d60648401525af1614421575b889796955061436d565b61442a90612bd7565b38614417565b8880fd5b50803b1515614368565b838752600b835281872060018101600160c81b60ff60c81b1982541617905560ff60f01b19815416905561432e565b8360649186604051927fa1fb2bbc000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b60009080825260056020526001600160a01b0380604084205416928333149384156144ef575b505082156144dd57505090565b9091506144ea3392612d21565b161490565b60ff92945090604091815260086020528181203382526020522054169138806144d0565b90929161451e613272565b936001600160801b039283811691821561462a5767016345785d8a00008082116145f3578085116145bc575061456885614559819386613529565b16946020890195865284613529565b16918461457f604089019480865282875116614267565b1610156145a6576145988491826145a195511690613333565b91511690613333565b168252565b634e487b7160e01b600052600160045260246000fd5b84604491604051917f4fea5c1a00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b60449250604051917f47152d6700000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050505050905060405161463d81612c25565b6000815260006020820152600060408201529056"; + hex"60a034620003e757601f196001600160401b03601f62004a3e3881900382810185168601919084831187841017620003ec57808792606094604052833981010312620003e75783516001600160a01b03928382169291839003620003e7576020918287015196858816809803620003e75760400151948516809503620003e7576200008962000402565b90601c82527f5361626c696572205632204c6f636b7570204c696e656172204e46540000000084830152620000bd62000402565b601181527029a0a116ab1916a627a1a5aaa816a624a760791b8582015230608052600080546001600160a01b031990811688178255600180548216909b178b5596817fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a38351858111620003d35760039485548c81811c91168015620003c8575b89821014620003b45790818684931162000361575b508890868311600114620002f8578492620002ec575b505060001982871b1c1916908b1b1784555b8151948511620002d8576004958654998b8b811c9b168015620002cd575b828c1014620002ba57848b1162000271575b869798999a50819487116001146200020a57505093620001fe575b505082871b92600019911b1c19161790555b600a541617600a5560095560405161461b9081620004238239608051816141090152f35b015191503880620001c8565b8883528183208c9890969594939116915b8282106200025757505085116200023c575b50505050811b019055620001da565b01519060f884600019921b161c19169055388080806200022d565b8484015187558c989096019593840193908101906200021b565b87835281832085880160051c81019b838910620002af575b860160051c019a8c905b8c8110620002a3575050620001ad565b848155018c9062000293565b909b508b9062000289565b634e487b7160e01b835260228852602483fd5b9a607f169a6200019b565b634e487b7160e01b81526041600452602490fd5b0151905038806200016b565b908c8e9416918886528a862092865b8c82821062000341575050841162000328575b505050811b0184556200017d565b015160001983891b60f8161c191690553880806200031a565b91929395968291958786015181550195019301908f959493929162000307565b9091508684528884208680850160051c8201928b8610620003aa575b918f91869594930160051c01915b8281106200039b57505062000155565b8681558594508f91016200038b565b925081926200037d565b634e487b7160e01b84526022600452602484fd5b90607f169062000140565b634e487b7160e01b82526041600452602482fd5b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620003ec5760405256fe608080604052600436101561001357600080fd5b600090813560e01c90816301ffc9a7146129a25750806306fdde03146128e0578063081812fc146128c1578063095ea7b3146127325780631400ecec146126925780631c1cdd4c1461262d5780631e99d5691461260f57806323b872dd146125e557806339a73c03146125a457806340e58ee514612200578063425d30dd146121e157806342842e0e1461219157806342966c68146120395780634857501f14611faf5780634869e12d14611f745780635fe3b56714611f4d5780636352211e14611f1d5780636d0cee7514611ec757806370a0823114611e1e57806375829def14611d8b578063780a82c814611d3b5780637cad6cd114611c6a5780637de6b1db14611a915780638659c2701461167d578063894e9a0d146114295780638bad38dd146113ac5780638f69b993146113105780639067b677146112bd57806395d89b41146111b057806396ce143114611091578063a22cb46514610fc0578063a2ffb89714610d82578063a6202bf214610c7c578063a80fc07114610c2a578063ab167ccc14610af1578063ad35efd414610a8f578063b256456914610a70578063b88d4fde146109df578063b8a3be66146109aa578063b971302a1461095b578063bc063e1a14610938578063bc2be1be146108e8578063c156a11d1461082d578063c87b56dd146106ef578063cc364f4814610643578063d4dbd20b146105f1578063d511609f146105a5578063d975dfed14610559578063e985e9c514610504578063ea5ead19146104de578063eac8f5b814610475578063f590c1761461044c578063f851a440146104265763fdd46d601461027357600080fd5b346104235760603660031901126104235760043561028f612ad1565b610297612c11565b906102a06140ff565b6102a98361328d565b61040b576102cd83600052600b6020526001600160a01b0360406000205416331490565b15806103fb575b6103d8576102f883600052600b6020526001600160a01b0360406000205416331490565b806103b6575b610389576001600160a01b0381161561035f576001600160801b03821615610347579161033d6020926000805160206145fb833981519152948361422a565b604051908152a180f35b6024836040519063d2aabcd960e01b82526004820152fd5b60046040517fc61a0e9e000000000000000000000000000000000000000000000000000000008152fd5b826001600160a01b0360649260405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b5082845260056020526001600160a01b038060408620541690821614156102fe565b60405163216caf0d60e01b815260048101849052336024820152604490fd5b0390fd5b5061040583614452565b156102d4565b60248360405190634a5541ef60e01b82526004820152fd5b80fd5b50346104235780600319360112610423576001600160a01b036020915416604051908152f35b503461042357602036600319011261042357602061046b6004356132f3565b6040519015158152f35b503461042357602036600319011261042357600435808252600b60205260ff600160408420015460d01c16156104c75760016040836001600160a01b039360209552600b855220015416604051908152f35b6024906040519062b8e7e760e51b82526004820152fd5b5034610423576040366003190112610423576004356104fb612ad1565b610297826141c1565b50346104235760403660031901126104235761051e612abb565b6040610528612ad1565b926001600160a01b0380931681526008602052209116600052602052602060ff604060002054166040519015158152f35b50346104235760203660031901126104235760ff6001604060043593848152600b60205220015460d01c16156104c7576105946020916141c1565b6001600160801b0360405191168152f35b503461042357602036600319011261042357600435808252600b60205260ff600160408420015460d01c16156104c75760408260029260209452600b845220015460801c604051908152f35b503461042357602036600319011261042357600435808252600b60205260ff600160408420015460d01c16156104c75760036040836001600160801b039360209552600b855220015416604051908152f35b503461042357602036600319011261042357600435610660613203565b50808252600b60205260ff600160408420015460d01c16156104c7578160409160609352600b60205220805490600164ffffffffff91015481604051936106a685612b9b565b818160a01c16855260c81c16602084015260a01c1660408201526106ed60405180926040908164ffffffffff91828151168552826020820151166020860152015116910152565bf35b5034610423576020806003193601126108195760043561072d6107288260005260056020526001600160a01b0360406000205416151590565b612c27565b826001600160a01b03600a5416916044604051809481937fe9dc637500000000000000000000000000000000000000000000000000000000835230600484015260248301525afa92831561082157809361079c575b5050610798604051928284938452830190612a96565b0390f35b909192503d8082843e6107af8184612bd3565b82019183818403126108195780519067ffffffffffffffff821161081d570182601f82011215610819578051916107e583612bf5565b936107f36040519586612bd3565b83855285848401011161042357509061081191848085019101612a73565b903880610782565b5080fd5b8280fd5b604051903d90823e3d90fd5b50346104235760403660031901126104235760043561084a612ad1565b6108526140ff565b818352600b60205260ff600160408520015460d01c16156108d15781835260056020526001600160a01b036040842054168033036103d8579161033d816020936000805160206145fb833981519152956108ab836141c1565b6001600160801b0381166108c0575b50612eba565b6108cb90828561422a565b386108ba565b6024826040519062b8e7e760e51b82526004820152fd5b503461042357602036600319011261042357600435808252600b60205260ff600160408420015460d01c16156104c75760408264ffffffffff9260209452600b8452205460a01c16604051908152f35b5034610423578060031936011261042357602060405167016345785d8a00008152f35b503461042357602036600319011261042357600435808252600b60205260ff600160408420015460d01c16156104c7576040826001600160a01b039260209452600b8452205416604051908152f35b50346104235760203660031901126104235760ff600160406020936004358152600b855220015460d01c166040519015158152f35b5034610423576080366003190112610423576109f9612abb565b610a01612ad1565b906064359067ffffffffffffffff8211610a6c5736602383011215610a6c5781600401359284610a3085612bf5565b93610a3e6040519586612bd3565b85855236602487830101116108195785610a6996602460209301838801378501015260443591612d45565b80f35b8380fd5b503461042357602036600319011261042357602061046b600435613256565b503461042357602036600319011261042357600435808252600b60205260ff600160408420015460d01c16156104c757610ac890613569565b604051906005811015610add57602092508152f35b602483634e487b7160e01b81526021600452fd5b50346104235761014036600319011261042357610b0c6140ff565b610b14613203565b9064ffffffffff80421680845260c4358281168103610c255781018216602085015260e435908183168203610c255701166040830152606435916001600160a01b03918284168094036104235750608435801515809103610c255760a43590811515809203610c255760243594848616809603610c255760043595858716809703610c2557604435906001600160801b038216809203610c255760405197610bbb89612b7e565b8852602088015260408701526060860152608085015260a084015260c0830152604061010319360112610c255760405191610bf583612bb7565b610104359182168203610c255782610c1d9260209452610124358482015260e082015261366b565b604051908152f35b600080fd5b503461042357602036600319011261042357600435808252600b60205260ff600160408420015460d01c16156104c75760026040836001600160801b039360209552600b855220015416604051908152f35b503461042357602036600319011261042357610c96612abb565b6001600160a01b0380835416338103610d59575081169081835260026020526001600160801b03604084205416908115610d285781610cf9918486526002602052604086206fffffffffffffffffffffffffffffffff198154169055339061415b565b6040519081527fca7a4a65a94ed2f37538814e00e1cd4c41a78261561e3f3794592f11409cf5af60203392a380f35b602483604051907f8410168c0000000000000000000000000000000000000000000000000000000082526004820152fd5b6040516331b339a960e21b81526001600160a01b03919091166004820152336024820152604490fd5b50346104235760603660031901126104235767ffffffffffffffff60043581811161081d57610db5903690600401612b1c565b91610dbe612ad1565b90604435908111610fbc57610dd7903690600401612b1c565b9093610de16140ff565b818103610f8657855b818110610df5578680f35b610e008183876141e9565b35610e0c8285896141e9565b356001600160801b0381168103610c2557610e256140ff565b610e2e8261328d565b610f6e57610e5282600052600b6020526001600160a01b0360406000205416331490565b1580610f5e575b610f3f57610e7d82600052600b6020526001600160a01b0360406000205416331490565b80610f17575b610eea576001600160a01b0386161561035f576001600160801b03811615610ed257602082610ec56000805160206145fb83398151915293896001979661422a565b604051908152a101610dea565b6024826040519063d2aabcd960e01b82526004820152fd5b6064826001600160a01b038860405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b5081895260056020526001600160a01b0360408a2054166001600160a01b0387161415610e83565b60405163216caf0d60e01b815260048101839052336024820152604490fd5b50610f6882614452565b15610e59565b60248260405190634a5541ef60e01b82526004820152fd5b604491604051917faec9344000000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b8480fd5b503461042357604036600319011261042357610fda612abb565b60243590811515809203610c25576001600160a01b03169081331461104d5733835260086020526040832082600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a380f35b606460405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152fd5b503461042357610160366003190112610423576110ac6140ff565b604051906110b982612b7e565b6110c1612abb565b82526110cb612ad1565b60208301526110d8612c11565b60408301526001600160a01b03906064358281168103610c255760608401526084358015158103610c2557608084015260a4358015158103610c255760a084015260603660c3190112610423575060405161113281612b9b565b64ffffffffff60c4358181168103610c2557825260e4358181168103610c25576020830152610104359081168103610c2557604082015260c0830152604061012319360112610c25576040519161118883612bb7565b610124359182168203610c255782610c1d9260209452610144358482015260e082015261366b565b5034610423578060031936011261042357604051908060045491600183811c928185169485156112b3575b602095868610811461129f5785885287949392918790821561127d575050600114611223575b505061120f92500383612bd3565b610798604051928284938452830190612a96565b90859250600482527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5b85831061126557505061120f93508201013880611201565b8054838901850152879450869390920191810161124d565b925093505061120f94915060ff191682840152151560051b8201013880611201565b602483634e487b7160e01b81526022600452fd5b93607f16936111db565b503461042357602036600319011261042357600435808252600b60205260ff600160408420015460d01c16156104c757600160408364ffffffffff9360209552600b855220015460a01c16604051908152f35b503461042357602036600319011261042357600435808252600b60205260ff600160408420015460d01c16156104c75761134990613569565b906005821015908161138a576002831491821561139e575b8215611375575b6020836040519015158152f35b90915061138a57506004602091143880611368565b80634e487b7160e01b602492526021600452fd5b506003831491506000611361565b5034610423576020366003190112610423576004356001600160a01b039081811680910361081d5781835416338103610d59575060015491816001600160a01b03198416176001556040519216825260208201527fdcb09aef4bf01068924ccce937981cbe59d25ba08380cf941aaaea4e4bd3960d60403392a280f35b50346104235760203660031901126104235760405161144781612b61565b8181528160208201528160408201528160608201528160808201528160a08201528160c08201528160e0820152816101008201528161012082015261014061148d613203565b9101526004358152600b60205260ff600160408320015460d01c1615611665576004358152600b602052604081206115666002604051926114cd84612b61565b80546001600160a01b038116855264ffffffffff8160a01c16602086015264ffffffffff8160c81c16604086015260ff8160f01c161515606086015260f81c1515608085015260ff60018201546001600160a01b03811660a087015264ffffffffff8160a01c1660c0870152818160c81c16151560e0870152818160d01c16151561010087015260d81c16151561012085015201613222565b610140820152611577600435613569565b6005811015610add579160026101a0931461165a575b506106ed610140604051926001600160a01b03815116845264ffffffffff602082015116602085015264ffffffffff60408201511660408501526060810151151560608501526080810151151560808501526001600160a01b0360a08201511660a085015264ffffffffff60c08201511660c085015260e0810151151560e0850152610100810151151561010085015261012081015115156101208501520151610140830190604090816001600160801b0391828151168552826020820151166020860152015116910152565b60608201523861158d565b602460405162b8e7e760e51b81526004356004820152fd5b503461042357602090816003193601126104235760043567ffffffffffffffff8111610819576116b283913690600401612b1c565b906116bb6140ff565b83915b8083106116c9578480f35b6116d8838284979596976141e9565b35936116e26140ff565b6116eb8561328d565b156117085760248560405190634a5541ef60e01b82526004820152fd5b90919293611715816132f3565b611a795761173981600052600b6020526001600160a01b0360406000205416331490565b1580611a5b575b611a3b5761174d81613324565b818652600b9081885261176560026040892001613222565b6001600160801b0391828251168382161015611a2357848952838a5260ff60408a205460f01c1615611a0b579282826117b786838e6117ad8f9a829a60409e9d9a51166132c4565b94015116906132c4565b84875283865288872091611846835494600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff871617855560038185169586156119f1575b0190831699818b6fffffffffffffffffffffffffffffffff19819454161790556001600160a01b0380971696879160058c52818f82205416998c5260019e8f912001541661415b565b33840361192f57843b6118a8575b50507f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd260406000805160206145fb8339815191529786935b825191825288820152a4604051908152a10191909392936116be565b90919293809596503b1561192b576040516372eba20360e01b8152600481018790526001600160a01b03851660248201526001600160801b039182166044820152911660648201528b94939291908b90818160848183895af115611854576119169192939597949650612b4d565b61192757918a939194928a8d611854565b8980fd5b8b80fd5b833b611972575b50507f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd260406000805160206145fb83398151915297869361188c565b90919280949596503b1561192b576040516372eba20360e01b8152600481018790526001600160a01b03861660248201526001600160801b039182166044820152911660648201528b94939291908b90818160848183885af115611936576119e09192939597949650612b4d565b61192757918a939194928a8d611936565b60018101600160c81b60ff60c81b198254161790556117fd565b602485604051906339c6dc7360e21b82526004820152fd5b602485604051906322cad1af60e11b82526004820152fd5b60405163216caf0d60e01b81526004810191909152336024820152604490fd5b50808552600586526001600160a01b03604086205416331415611740565b6024906040519063fe19f19f60e01b82526004820152fd5b5034610423576020806003193601126108195760043590611ab06140ff565b818352600b815260ff600160408520015460d01c16156108d157611ad382613569565b6005811015611c565760048103611afc5760248360405190634a5541ef60e01b82526004820152fd5b60038103611b1c576024836040519063fe19f19f60e01b82526004820152fd5b600214611c3e57611b4382600052600b6020526001600160a01b0360406000205416331490565b15610f3f57818352600b815260ff604084205460f01c1615611c2657818352600b81526040832060ff60f01b19815416905560058152826001600160a01b03604082205416803b611bcf575b50506040516000805160206145fb83398151915292807f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f8680a28152a180f35b803b15610819578180916024604051809481937f341a0bd90000000000000000000000000000000000000000000000000000000083528960048401525af115611b8f57611c1b90612b4d565b61081d578238611b8f565b602482604051906339c6dc7360e21b82526004820152fd5b602482604051906322cad1af60e11b82526004820152fd5b602484634e487b7160e01b81526021600452fd5b5034610423576020366003190112610423576004356001600160a01b039081811680910361081d5781835416338103610d595750600a5491816001600160a01b0319841617600a556040519216825260208201527fa2548bd4b805e907c1558a47b5858324fe8bb4a2e1ddfca647eecbf65610eebc60403392a26009546000198101908111611d275760407f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c91815190600182526020820152a180f35b602482634e487b7160e01b81526011600452fd5b503461042357602036600319011261042357600435808252600b60205260ff600160408420015460d01c16156104c75760408264ffffffffff9260209452600b8452205460c81c16604051908152f35b503461042357602036600319011261042357611da5612abb565b9080546001600160a01b0380821693338503611df7576001600160a01b03199394501691829116178255337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808380a380f35b6040516331b339a960e21b81526001600160a01b0386166004820152336024820152604490fd5b5034610423576020366003190112610423576001600160a01b03611e40612abb565b168015611e5d578160409160209352600683522054604051908152f35b608460405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e657200000000000000000000000000000000000000000000006064820152fd5b5034610423576020366003190112610423576001600160a01b036040602092600435611f0c6107288260005260056020526001600160a01b0360406000205416151590565b815260058452205416604051908152f35b5034610423576020366003190112610423576020611f3c600435612c72565b6001600160a01b0360405191168152f35b503461042357806003193601126104235760206001600160a01b0360015416604051908152f35b50346104235760203660031901126104235760ff6001604060043593848152600b60205220015460d01c16156104c7576105946020916135f0565b50346104235760203660031901126104235760043590818152600b60205260ff600160408320015460d01c16156108d15780611fea83613569565b9260058410156120255760026020940361200b575b50506040519015158152f35b8152600b8352604090205460f01c60ff1690503880611fff565b602482634e487b7160e01b81526021600452fd5b5034610423576020366003190112610423576004356120566140ff565b61205f8161328d565b156121605761206d81614452565b15611a3b5761207b81612c72565b61208482613256565b159081612158575b81612145575b5061212d576020816120b26000805160206145fb83398151915293612c72565b90808552600783526001600160a01b0360408620926001600160a01b03199384815416905516918286526006845260408620600019815401905581865260058452604086209081541690558085604051937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a48152a180f35b602490604051906378630aa960e01b82526004820152fd5b6001600160a01b03915016151538612092565b83915061208c565b602490604051907f817cd6390000000000000000000000000000000000000000000000000000000082526004820152fd5b5034610423576121a036612ae7565b60405191602083019383851067ffffffffffffffff8611176121cb57610a6994604052858452612d45565b634e487b7160e01b600052604160045260246000fd5b503461042357602036600319011261042357602061046b60043561328d565b503461042357602080600319360112610819576004359061221f6140ff565b6122288261328d565b156122455760248260405190634a5541ef60e01b82526004820152fd5b61224e826132f3565b61258c5761227282600052600b6020526001600160a01b0360406000205416331490565b158061256e575b610f3f5761228682613324565b91808452600b825261229d60026040862001613222565b6001600160801b039384825116858216101561255657828652600b845260ff604087205460f01c161561253e57816122e18287876117ad60409683839951166132c4565b848852600b845282882091612370835498600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8b161785558a6003828616968715612524575b019184169a828c6fffffffffffffffffffffffffffffffff198195541617905560016001600160a01b0380921698899360058c52600b8483832054169c522001541661415b565b33840361243b57908891853b6123ce575b5050507f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd260406000805160206145fb8339815191529786935b825191825288820152a4604051908152a180f35b853b1561081d576040516372eba20360e01b8152600481018890526001600160a01b03861660248201526001600160801b03918216604482015291166064820152818160848183895af1612423575b80612381565b61242c90612b4d565b61243757863861241d565b8680fd5b83989792983b612483575b50507f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd2604085926000805160206145fb83398151915298996123ba565b833b15612520576040516372eba20360e01b8152600481018790526001600160a01b03861660248201526001600160801b03918216604482015291166064820152868160848183875af16124d8575b80612446565b604085926000805160206145fb833981519152986125167f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd294612b4d565b98509250506124d2565b8780fd5b60018101600160c81b60ff60c81b19825416179055612329565b602483604051906339c6dc7360e21b82526004820152fd5b602483604051906322cad1af60e11b82526004820152fd5b50818352600581526001600160a01b03604084205416331415612279565b6024826040519063fe19f19f60e01b82526004820152fd5b5034610423576020366003190112610423576001600160801b0360406020926001600160a01b036125d3612abb565b16815260028452205416604051908152f35b503461042357610a696125f736612ae7565b9161260a6126058433612ddb565b612cd4565b612eba565b50346104235780600319360112610423576020600954604051908152f35b503461042357602036600319011261042357600435808252600b60205260ff600160408420015460d01c16156104c75761266690613569565b90600582101561138a5760208215838115612687575b506040519015158152f35b60019150148261267c565b50346104235760203660031901126104235760043590818152600b60205260ff600160408320015460d01c16156108d157602091604082828152600b85522060ff815460f01c1680612720575b6126f7575b50506001600160801b0360405191168152f35b61271992506001600160801b0360026127139201541691613324565b906132c4565b38806126e4565b5060ff600182015460c81c16156126df565b50346104235760403660031901126104235761274c612abb565b602435906001600160a01b03808061276385612c72565b1692169180831461285757803314908115612836575b50156127cc57828452600760205260408420826001600160a01b03198254161790556127a483612c72565b167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258480a480f35b608460405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152fd5b9050845260086020526040842033855260205260ff60408520541638612779565b608460405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152fd5b5034610423576020366003190112610423576020611f3c600435612c97565b5034610423578060031936011261042357604051908060035491600183811c92818516948515612998575b602095868610811461129f5785885287949392918790821561127d57505060011461293e57505061120f92500383612bd3565b90859250600382527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b85831061298057505061120f93508201013880611201565b80548389018501528794508693909201918101612968565b93607f169361290b565b905034610819576020366003190112610819576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361081d57602092507f80ac58cd000000000000000000000000000000000000000000000000000000008114908115612a49575b8115612a1f575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501438612a18565b7f5b5e139f0000000000000000000000000000000000000000000000000000000081149150612a11565b60005b838110612a865750506000910152565b8181015183820152602001612a76565b90602091612aaf81518092818552858086019101612a73565b601f01601f1916010190565b600435906001600160a01b0382168203610c2557565b602435906001600160a01b0382168203610c2557565b6060906003190112610c25576001600160a01b03906004358281168103610c2557916024359081168103610c25579060443590565b9181601f84011215610c255782359167ffffffffffffffff8311610c25576020808501948460051b010111610c2557565b67ffffffffffffffff81116121cb57604052565b610160810190811067ffffffffffffffff8211176121cb57604052565b610100810190811067ffffffffffffffff8211176121cb57604052565b6060810190811067ffffffffffffffff8211176121cb57604052565b6040810190811067ffffffffffffffff8211176121cb57604052565b90601f8019910116810190811067ffffffffffffffff8211176121cb57604052565b67ffffffffffffffff81116121cb57601f01601f191660200190565b604435906001600160801b0382168203610c2557565b15612c2e57565b606460405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152fd5b60005260056020526001600160a01b0360406000205416612c94811515612c27565b90565b612cba6107288260005260056020526001600160a01b0360406000205416151590565b60005260076020526001600160a01b036040600020541690565b15612cdb57565b608460405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f766564000000000000000000000000000000000000006064820152fd5b90612d69939291612d596126058433612ddb565b612d64838383612eba565b61306f565b15612d7057565b60405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b906001600160a01b038080612def84612c72565b16931691838314938415612e22575b508315612e0c575b50505090565b612e1891929350612c97565b1614388080612e06565b909350600052600860205260406000208260005260205260ff604060002054169238612dfe565b15612e5057565b608460405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152fd5b90612ee39291612ec983612c72565b916001600160a01b03948593848094169687911614612e49565b16908115612fd657612ef483613256565b1580612fce575b80612fc5575b612fad5791808492612f2f6000805160206145fb83398151915296602096612f2885612c72565b1614612e49565b60009382855260078652604085206001600160a01b031990818154169055818652600687526040862060001981540190558286526040862060018154019055838652600587528260408720918254161790557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6040519580a48152a1565b602483604051906378630aa960e01b82526004820152fd5b50831515612f01565b506001612efb565b608460405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152fd5b3d1561306a573d9061305082612bf5565b9161305e6040519384612bd3565b82523d6000602084013e565b606090565b91926000929190813b156131f9576020916130df91856040519586809581947f150b7a02000000000000000000000000000000000000000000000000000000009b8c84523360048501526001600160a01b0380951660248501526044840152608060648401526084830190612a96565b0393165af190829082613199575b5050613173576130fb61303f565b8051908161316e5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000161490565b909192506020813d82116131f1575b816131b560209383612bd3565b810103126108195751907fffffffff000000000000000000000000000000000000000000000000000000008216820361042357509038806130ed565b3d91506131a8565b5050505050600190565b6040519061321082612b9b565b60006040838281528260208201520152565b9060405161322f81612b9b565b6040819360018154916001600160801b0392838116865260801c6020860152015416910152565b80600052600b60205260ff60016040600020015460d01c16156104c757600052600b60205260ff60016040600020015460d81c1690565b80600052600b60205260ff60016040600020015460d01c16156104c757600052600b60205260ff60016040600020015460c81c1690565b6001600160801b0391821690821603919082116132dd57565b634e487b7160e01b600052601160045260246000fd5b80600052600b60205260ff60016040600020015460d01c16156104c757600052600b60205260406000205460f81c90565b600090808252600b6020526040822091825464ffffffffff42818360c81c16116133d25780600186015460a01c1691824210156133bc576133719394955060a01c168091039042036133da565b90828152600b6020526001600160801b03926133978460026040852001541680946134ba565b9283116133a45750501690565b60029350604092508152600b60205220015460801c90565b505050505060026001600160801b039101541690565b505091505090565b670de0b6b3a7640000916000198383099280830292838086109503948086039514613496578285101561345a57908291096001821901821680920460028082600302188083028203028083028203028083028203028083028203028083028203028092029003029360018380600003040190848311900302920304170290565b82606492604051927f63a05778000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b5050809250156134a4570490565b634e487b7160e01b600052601260045260246000fd5b9091906000198382098382029182808310920391808303921461355857670de0b6b3a7640000908183101561352157947faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066994950990828211900360ee1b910360121c170290565b60449086604051917f5173648d00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050670de0b6b3a764000090049150565b80600052600b602052604060002060ff600182015460c81c16600014613590575050600490565b805460f81c6135e9575460a01c64ffffffffff1642106135e3576135b381613324565b90600052600b6020526001600160801b0380600260406000200154169116106000146135de57600190565b600290565b50600090565b5050600390565b80600052600b6020526136096002604060002001613222565b81600052600b602052604060002060ff600182015460c81c1660001461363c57506001600160801b039150602001511690565b5460f81c61364e5750612c9490613324565b612c9491506001600160801b0360408183511692015116906132c4565b906001600160a01b036001541660206001600160a01b036060850151166024604051809481937fdcf844a700000000000000000000000000000000000000000000000000000000835260048301525afa8015613e9657600090613e62575b6136ec91506001600160801b0360408501511690602060e08601510151916144bb565b916001600160801b0383511660c08201519015613e385764ffffffffff815116602082019064ffffffffff82511690818111613df857505064ffffffffff604091511691019064ffffffffff8251169081811015613db857505064ffffffffff8042169151169081811015613d78575050600954926001600160801b038151166040519061377982612b9b565b815260006020820152600060408201526001600160a01b036060840151169060c08401519164ffffffffff6020840151169064ffffffffff604085015116906080870151151560a088015115159364ffffffffff6001600160a01b038a5116975116604051976137e889612b61565b88526020880152604087015260608601526000608086015260a085015260c0840152600060e0840152600161010084015261012083015261014082015284600052600b60205260406000206001600160a01b038251166001600160a01b031982541617815561387f64ffffffffff602084015116829064ffffffffff60a01b1964ffffffffff60a01b83549260a01b169116179055565b604082015181547eff0000000000000000000000000000000000000000000000000000000000006060850151151560f01b169078ffffffffffffffffffffffffffffffffffffffffffffffffff7dffffffffff000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000006080880151151560f81b169460c81b1691161717178155600181016001600160a01b0360a0840151166001600160a01b031982541617815561397664ffffffffff60c085015116829064ffffffffff60a01b1964ffffffffff60a01b83549260a01b169116179055565b60e083015181546101008501516101208601517fffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff90921692151560c81b79ff00000000000000000000000000000000000000000000000000169290921791151560d01b7aff0000000000000000000000000000000000000000000000000000169190911790151560d81b7bff00000000000000000000000000000000000000000000000000000016179055610140909101518051602082015160801b6fffffffffffffffffffffffffffffffff199081166001600160801b03928316176002850155926040906003019201511682825416179055600185016009556001600160a01b0360608401511660005260026020526001600160801b0380604060002054168160208501511601166001600160a01b036060850151166000526040600020918254161790556001600160a01b036020830151168015613d3457613afa613af48660005260056020526001600160a01b0360406000205416151590565b1561401c565b613b0385613256565b1580613d2c575b80613d24575b613d0c5760206000805160206145fb83398151915291613b49613af48860005260056020526001600160a01b0360406000205416151590565b806000526006825260406000206001815401905586600052600582526040600020816001600160a01b0319825416179055866040519160007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4868152a1613bd96001600160a01b036060840151166001600160801b03808451168160208601511601169030903390613ea2565b6001600160801b0360408201511680613cdd575b506001600160a01b038251167f075861cbceafeb777e8f15f357121b08f6f3adba387d599bb7b5278ca6192df5610160866001600160a01b0360208701511694613cd46001600160a01b03606089015116976080810151151560a0820151151590613c9e6001600160a01b0360e060c08601519501515116956040519788523360208901526040880190604090816001600160801b0391828151168552826020820151166020860152015116910152565b60a086015260c0850152805164ffffffffff90811660e08601526020820151811661010086015260409091015116610120840152565b610140820152a4565b613d06906001600160a01b036060850151166001600160a01b0360e08601515116903390613ea2565b38613bed565b602485604051906378630aa960e01b82526004820152fd5b506000613b10565b506001613b0a565b606460405162461bcd60e51b815260206004820152602060248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152fd5b6040517f210aec0e00000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b6040517f9fee269100000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b6040517f4c23297000000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b60046040517f6095d3bc000000000000000000000000000000000000000000000000000000008152fd5b6020823d602011613e8e575b81613e7b60209383612bd3565b8101031261042357506136ec90516136c9565b3d9150613e6e565b6040513d6000823e3d90fd5b9290604051927f23b872dd0000000000000000000000000000000000000000000000000000000060208501526001600160a01b03809216602485015216604483015260648201526064815260a081019181831067ffffffffffffffff8411176121cb57613f1192604052613f13565b565b6001600160a01b031690613f73604051613f2c81612bb7565b6020938482527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564858301526000808587829751910182855af1613f6d61303f565b91614067565b805191821591848315613ff8575b505050905015613f8e5750565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b91938180945001031261081957820151908115158203610423575080388084613f81565b1561402357565b606460405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152fd5b919290156140c8575081511561407b575090565b3b156140845790565b606460405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b8251909150156140db5750805190602001fd5b6103f79060405191829162461bcd60e51b8352602060048401526024830190612a96565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361413157565b60046040517fa1c0d6e5000000000000000000000000000000000000000000000000000000008152fd5b916001600160a01b03604051927fa9059cbb000000000000000000000000000000000000000000000000000000006020850152166024830152604482015260448152608081019181831067ffffffffffffffff8411176121cb57613f1192604052613f13565b612c94906141ce816135f0565b90600052600b60205260026040600020015460801c906132c4565b91908110156141f95760051b0190565b634e487b7160e01b600052603260045260246000fd5b9190916001600160801b03808094169116019182116132dd57565b929190926001600160801b0380614240836141c1565b1692818116938085116144155750600095838752602092600b84526142b36142736040946002868c20015460801c61420f565b868a52600b86526142ae6002868c20019182906001600160801b036fffffffffffffffffffffffffffffffff1983549260801b169116179055565b613222565b906142ce8186840151169282868183511692015116906132c4565b1611156143e6575b838752600b83526001600160a01b03916142f98683856001858d2001541661415b565b8488526005845282818920541680331415806143dc575b614345575b507ffa54f9f9bdcdd28778cbb9f78490df6691cc4e2729588e10f4cc0a26c465686a9495969750519586521693a3565b803b156143d85797807ffa54f9f9bdcdd28778cbb9f78490df6691cc4e2729588e10f4cc0a26c465686a9697989960848451809481937f13375c3b0000000000000000000000000000000000000000000000000000000083528c600484015233602484015289891660448401528d60648401525af16143c9575b8897969550614315565b6143d290612b4d565b386143bf565b8880fd5b50803b1515614310565b838752600b835281872060018101600160c81b60ff60c81b1982541617905560ff60f01b1981541690556142d6565b8360649186604051927fa1fb2bbc000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b60009080825260056020526001600160a01b038060408420541692833314938415614497575b5050821561448557505090565b9091506144923392612c97565b161490565b60ff9294509060409181526008602052818120338252602052205416913880614478565b9092916144c6613203565b936001600160801b03928381169182156145d25767016345785d8a000080821161459b578085116145645750614510856145018193866134ba565b169460208901958652846134ba565b16918461452760408901948086528287511661420f565b16101561454e57614540849182614549955116906132c4565b915116906132c4565b168252565b634e487b7160e01b600052600160045260246000fd5b84604491604051917f4fea5c1a00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b60449250604051917f47152d6700000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b505050505090506040516145e581612b9b565b6000815260006020820152600060408201529056fef8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7"; bytes public constant BYTECODE_NFT_DESCRIPTOR = hex"6080806040523461001757615da890816200001d8239f35b600080fdfe6080604052600436101561001257600080fd5b60003560e01c63e9dc63751461002757600080fd5b346142f35760403660031901126142f3576001600160a01b0360043516600435036142f357610056608061486b565b60006080819052606060a081905260c0819052610100819052610120819052610140819052610160829052610180919091526101a0526004356001600160a01b031660e08190526100a690614c55565b6101005260e0516040517feac8f5b80000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa908115614300576000916147da575b506001600160a01b03610116911680608052615665565b60a05260e0516040517fad35efd40000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa80156143005760009061479d575b6101779150615885565b6101205260e0516040517f4869e12d0000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa80156143005760249160009161477e575b506fffffffffffffffffffffffffffffffff81166101605260e0516040517fa80fc071000000000000000000000000000000000000000000000000000000008152833560048201529260209184919082906001600160a01b03165afa9182156143005760009261474d575b506fffffffffffffffffffffffffffffffff821615614737576fffffffffffffffffffffffffffffffff9182169082166127100282160416610180526102846004356153c3565b610120608001526040514660208201526bffffffffffffffffffffffff1960043560601b16604082015260243560548201526054815280608081011067ffffffffffffffff60808301111761430c57608081016040526020815191012061041b602963ffffffff61032b6103048261016861ffff8860101c160616614b05565b91601e604660ff6103218460146050848d60081c16060116614b05565b9816060116614b05565b6040519485927f68736c2800000000000000000000000000000000000000000000000000000000602085015261036b815180926020602488019101614823565b83017f2c0000000000000000000000000000000000000000000000000000000000000060248201526103a7825180936020602585019101614823565b7f252c000000000000000000000000000000000000000000000000000000000000602583830101526103e58351809460206027868601019101614823565b01017f252900000000000000000000000000000000000000000000000000000000000060278201520360098101845201826148dc565b61042f6001600160a01b0360805116614c55565b60a05160e0516040517fbc2be1be0000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa801561430057602491600091614718575b5060206001600160a01b0360606080015116604051938480927f9067b677000000000000000000000000000000000000000000000000000000008252823560048301525afa8015614300576104f1926000916146e9575b5064ffffffffff80911691166151d1565b61010051610180516105786021610515606461050e818606615740565b9404614b05565b604051938161052e869351809260208087019101614823565b82016105438251809360208085019101614823565b017f250000000000000000000000000000000000000000000000000000000000000060208201520360018101845201826148dc565b610100608001519060a060800151936105bf6fffffffffffffffffffffffffffffffff60e0608001511660ff6105b86001600160a01b03608051166155d8565b1690614e85565b956101206080015197604051996105d58b61486b565b8a5260208a015260408901526060880152608087015260a086015260c085015260e0840152610100830152610120820152604051806101c081011067ffffffffffffffff6101c08301111761430c576101c081016040526060815260006020820152606060408201526000606082015260006080820152606060a0820152600060c0820152600060e08201526060610100820152600061012082015260006101408201526060610160820152600061018082015260006101a082015260808201516106a660a0840151845190615a76565b906109b361015c604051926106ba846148c0565b600884527f50726f677265737300000000000000000000000000000000000000000000000060208501526107236040516106f381614888565b60009052855160208701207fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4701490565b156146e1576090945b61073586614b05565b916040519586938493661e339034b21e9160c91b60208601526109818351958692610767846027840160208901614823565b6d11103334b6361e9111b33333111f60911b602785840101526c1e3932b1ba103bb4b23a341e9160991b603585840101526107ae8551809660206042888701019101614823565b7f22206865696768743d22313030222066696c6c2d6f7061636974793d222e3033828501860160428101919091527f222072783d223135222072793d22313522207374726f6b653d2223666666222060628201527f7374726f6b652d6f7061636974793d222e3122207374726f6b652d77696474686082820152651e911a11179f60d11b60a28201527f3c7465787420783d2232302220793d2233342220666f6e742d66616d696c793d60a88201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f7370616365222060c8820152703337b73a16b9b4bd329e911919383c111f60791b60e88201528651966108b491889160f990910190602001614823565b661e17ba32bc3a1f60c91b8285018601870160f98101919091527f3c7465787420783d2232302220793d2237322220666f6e742d66616d696c793d6101008201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f73706163652220610120820152703337b73a16b9b4bd329e91191b383c111f60791b61014082015287519761094f91899161015190910190602001614823565b661e17ba32bc3a1f60c91b6101518888888887010101010152602061015888888885519c8d9701010101019101614823565b631e17b39f60e11b90860190910190910190910190910161015881019190915281900361013c810190915201826148dc565b60a083015260c0820152602860e0830151604051906109d182614888565b60008252610c7761015c604051926109e8846148c0565b600684527f53746174757300000000000000000000000000000000000000000000000000006020850152610a1b84615cb6565b610a2482615d33565b808211156146d95750945b610a3a878701614b05565b91604051958693661e339034b21e9160c91b60208601528151610a64816027880160208601614823565b85016d11103334b6361e9111b33333111f60911b60278201526c1e3932b1ba103bb4b23a341e9160991b6035820152610aa7825180936020604285019101614823565b017f22206865696768743d22313030222066696c6c2d6f7061636974793d222e303360428201527f222072783d223135222072793d22313522207374726f6b653d2223666666222060628201527f7374726f6b652d6f7061636974793d222e3122207374726f6b652d77696474686082820152651e911a11179f60d11b60a28201527f3c7465787420783d2232302220793d2233342220666f6e742d66616d696c793d60a88201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f7370616365222060c8820152703337b73a16b9b4bd329e911919383c111f60791b60e8820152610ba382518093602060f985019101614823565b01661e17ba32bc3a1f60c91b60f98201527f3c7465787420783d2232302220793d2237322220666f6e742d66616d696c793d6101008201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f73706163652220610120820152703337b73a16b9b4bd329e91191b383c111f60791b610140820152610c3282518093602061015185019101614823565b01661e17ba32bc3a1f60c91b610151820152610c5982518093602061015885019101614823565b01631e17b39f60e11b6101588201520361013c8101845201826148dc565b61010084015201610120820152602861010083015160405190610c9982614888565b60008252610ce361015c60405192610cb0846148c0565b600884527f53747265616d65640000000000000000000000000000000000000000000000006020850152610a1b84615cb6565b6101608401520161018082015261102660608301516030604051610d0681614888565b60008152610fad61015c60405194610d1d866148c0565b600886527f4475726174696f6e0000000000000000000000000000000000000000000000006020870152610d5086615cb6565b610d5982615d33565b808211156146d15750935b610d7060288601614b05565b91604051978893661e339034b21e9160c91b60208601528151610d9a816027880160208601614823565b85016d11103334b6361e9111b33333111f60911b60278201526c1e3932b1ba103bb4b23a341e9160991b6035820152610ddd825180936020604285019101614823565b017f22206865696768743d22313030222066696c6c2d6f7061636974793d222e303360428201527f222072783d223135222072793d22313522207374726f6b653d2223666666222060628201527f7374726f6b652d6f7061636974793d222e3122207374726f6b652d77696474686082820152651e911a11179f60d11b60a28201527f3c7465787420783d2232302220793d2233342220666f6e742d66616d696c793d60a88201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f7370616365222060c8820152703337b73a16b9b4bd329e911919383c111f60791b60e8820152610ed982518093602060f985019101614823565b01661e17ba32bc3a1f60c91b60f98201527f3c7465787420783d2232302220793d2237322220666f6e742d66616d696c793d6101008201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f73706163652220610120820152703337b73a16b9b4bd329e91191b383c111f60791b610140820152610f6882518093602061015185019101614823565b01661e17ba32bc3a1f60c91b610151820152610f8f82518093602061015885019101614823565b01631e17b39f60e11b6101588201520361013c8101865201846148dc565b8260408601526028810160608601526101808501519060c0860151809161012088015192839185010101605881016020890152605719906103e8030160011c8060e0890152016010810161014088015201602081016101a08701520101608084015260a083015161010084015161016085015191614e1c565b8152604051908161010081011067ffffffffffffffff6101008401111761430c57610100820160405260c782527f3c726563742077696474683d223130302522206865696768743d22313030252260208301527f2066696c7465723d2275726c28234e6f69736529222f3e3c7265637420783d2260408301527f37302220793d223730222077696474683d2238363022206865696768743d223860608301527f3630222066696c6c3d2223666666222066696c6c2d6f7061636974793d222e3060808301527f33222072783d223435222072793d22343522207374726f6b653d22236666662260a08301527f207374726f6b652d6f7061636974793d222e3122207374726f6b652d7769647460c08301527f683d2234222f3e0000000000000000000000000000000000000000000000000060e083015282519160e084015191805194604051611175816148a4565b603381527f3c636972636c652069643d22476c6f772220723d22353030222066696c6c3d2260208201527f75726c282352616469616c476c6f7729222f3e000000000000000000000000006040820152604051966111d28861486b565b61011c88527f3c66696c7465722069643d224e6f697365223e3c6665466c6f6f6420783d223060208901527f2220793d2230222077696474683d223130302522206865696768743d2231303060408901527f252220666c6f6f642d636f6c6f723d2268736c283233302c3231252c3131252960608901527f2220666c6f6f642d6f7061636974793d22312220726573756c743d22666c6f6f60808901527f6446696c6c222f3e3c666554757262756c656e6365206261736546726571756560a08901527f6e63793d222e3422206e756d4f6374617665733d22332220726573756c743d2260c08901527f4e6f6973652220747970653d226672616374616c4e6f697365222f3e3c66654260e08901527f6c656e6420696e3d224e6f6973652220696e323d22666c6f6f6446696c6c22206101008901527f6d6f64653d22736f66742d6c69676874222f3e3c2f66696c7465723e0000000061012089015260405197886103a081011067ffffffffffffffff6103a08b01111761430c576103a0890160405261037b89527f3c706174682069643d224c6f676f222066696c6c3d2223666666222066696c6c60208a01527f2d6f7061636974793d222e312220643d226d3133332e3535392c3132342e303360408a01527f34632d2e3031332c322e3431322d312e3035392c342e3834382d322e3932332c60608a01527f362e3430322d322e3535382c312e3831392d352e3136382c332e3433392d372e60808a01527f3838382c342e3939362d31342e34342c382e3236322d33312e3034372c31322e60a08a01527f3536352d34372e3637342c31322e3536392d382e3835382e3033362d31372e3860c08a01527f33382d312e3237322d32362e3332382d332e3636332d392e3830362d322e373660e08a01527f362d31392e3038372d372e3131332d32372e3536322d31322e3737382d31332e6101008a01527f3834322d382e3032352c392e3436382d32382e3630362c31362e3135332d33356101208a01527f2e323635683063322e3033352d312e3833382c342e3235322d332e3534362c366101408a01527f2e3436332d352e323234683063362e3432392d352e3635352c31362e3231382d6101608a01527f322e3833352c32302e3335382c342e31372c342e3134332c352e3035372c382e6101808a01527f3831362c392e3634392c31332e39322c31332e373334682e30333763352e37336101a08a01527f362c362e3436312c31352e3335372d322e3235332c392e33382d382e34382c306101c08a01527f2c302d332e3531352d332e3531352d332e3531352d332e3531352d31312e34396101e08a01527f2d31312e3437382d35322e3635362d35322e3636342d36342e3833372d36342e6102008a01527f3833376c2e3034392d2e303337632d312e3732352d312e3630362d322e3731396102208a01527f2d332e3834372d322e3735312d362e3230346830632d2e3034362d322e3337356102408a01527f2c312e3036322d342e3538322c322e3732362d362e32323968306c2e3138352d6102608a01527f2e3134386830632e3039392d2e3036322c2e3232322d2e3134382c2e33372d2e6102808a01527f323539683063322e30362d312e3336322c332e3935312d322e3632312c362e306102a08a01527f34342d332e3834324335372e3736332d332e3437332c39372e37362d322e33346102c08a01527f312c3132382e3633372c31382e3333326331362e3637312c392e3934362d32366102e08a01527f2e3334342c35342e3831332d33382e3635312c34302e3139392d362e3239392d6103008a01527f362e3039362d31382e3036332d31372e3734332d31392e3636382d31382e38316103208a01527f312d362e3031362d342e3034372d31332e3036312c342e3737362d372e3735326103408a01527f2c392e3735316c36382e3235342c36382e33373163312e3732342c312e3630316103608a01527f2c322e3731342c332e38342c322e3733382c362e3139325a222f3e00000000006103808a0152604051978860a081011067ffffffffffffffff60a08b01111761430c57611cb0611d119160a08b0160405260758b527f3c706174682069643d22466c6f6174696e6754657874222066696c6c3d226e6f60208c01527f6e652220643d224d31323520343568373530733830203020383020383076373560408c01527f307330203830202d3830203830682d373530732d38302030202d3830202d383060608c01527f762d3735307330202d3830203830202d3830222f3e000000000000000000000060808c0152611867615a3d565b906040517f3c72616469616c4772616469656e742069643d2252616469616c476c6f77223e6020820152611d0c60d87f3c73746f70206f66667365743d223025222073746f702d636f6c6f723d22000093846040850152805161199960b88660208501936118d981605e840187614823565b8101997f222073746f702d6f7061636974793d222e36222f3e0000000000000000000000605e8c01527f3c73746f70206f66667365743d2231303025222073746f702d636f6c6f723d229a8b607382015261193e825180936020609385019101614823565b017f222073746f702d6f7061636974793d2230222f3e00000000000000000000000060938201527f3c2f72616469616c4772616469656e743e00000000000000000000000000000060a78201520360988101885201866148dc565b6119a1615a3d565b90604051967f3c6c696e6561724772616469656e742069643d2253616e64546f70222078313d60208901527f223025222079313d223025223e000000000000000000000000000000000000006040890152604d8801528251611a0781606b8a0184614823565b8701917f222f3e00000000000000000000000000000000000000000000000000000000009283606b82015289606e820152611a4c825180936020608e85019101614823565b019082608e830152611a9060a2897f3c2f6c696e6561724772616469656e743e0000000000000000000000000000009485609182015203608281018b5201896148dc565b611bd6610108611a9e615a3d565b6040519b8c917f3c6c696e6561724772616469656e742069643d2253616e64426f74746f6d222060208401527f78313d2231303025222079313d2231303025223e00000000000000000000000060408401527f3c73746f70206f66667365743d22313025222073746f702d636f6c6f723d22006054840152611b2a815180926020607387019101614823565b8201908760738301526076820152875190611b49826096830188614823565b018660968201527f3c616e696d617465206174747269627574654e616d653d22783122206475723d60998201527f2236732220726570656174436f756e743d22696e646566696e6974652220766160b98201527f6c7565733d223330253b3630253b313230253b3630253b3330253b222f3e000060d98201528560f78201520360e881018c52018a6148dc565b611bde615a3d565b906040519a8b957f3c6c696e6561724772616469656e742069643d22486f7572676c61737353747260208801527f6f6b6522206772616469656e745472616e73666f726d3d22726f74617465283960408801527f302922206772616469656e74556e6974733d227573657253706163654f6e557360608801527f65223e000000000000000000000000000000000000000000000000000000000060808801527f3c73746f70206f66667365743d22353025222073746f702d636f6c6f723d2200608388015251809260a2880190614823565b84018360a28201527f3c73746f70206f66667365743d22383025222073746f702d636f6c6f723d220060a5820152611cf282518093602060c485019101614823565b019160c483015260c78201520360b88101875201856148dc565b614e1c565b92611d31611d1d615813565b896020815191012090602081519101201490565b9788156146a8575b506040518060c081011067ffffffffffffffff60c08301111761430c5760c08101604052609081527f3c7061746820643d224d2035302c3336302061203330302c333030203020312c60208201527f31203630302c302061203330302c333030203020312c31202d3630302c30222060408201527f66696c6c3d2223666666222066696c6c2d6f7061636974793d222e303222207360608201527f74726f6b653d2275726c2823486f7572676c6173735374726f6b65292220737460808201527f726f6b652d77696474683d2234222f3e0000000000000000000000000000000060a082015260405193846102c081011067ffffffffffffffff6102c08701111761430c576102c0850160405261029885527f3c7061746820643d226d3536362c3136312e323031762d35332e39323463302d60208601527f31392e3338322d32322e3531332d33372e3536332d36332e3339382d35312e3160408601527f39382d34302e3735362d31332e3539322d39342e3934362d32312e3037392d3160608601527f35322e3538372d32312e303739732d3131312e3833382c372e3438372d31353260808601527f2e3630322c32312e303739632d34302e3839332c31332e3633362d36332e343160a08601527f332c33312e3831362d36332e3431332c35312e3139387635332e39323463302c60c08601527f31372e3138312c31372e3730342c33332e3432372c35302e3232332c34362e3360e08601527f3934763238342e383039632d33322e3531392c31322e39362d35302e3232332c6101008601527f32392e3230362d35302e3232332c34362e3339347635332e39323463302c31396101208601527f2e3338322c32322e35322c33372e3536332c36332e3431332c35312e3139382c6101408601527f34302e3736332c31332e3539322c39342e3935342c32312e3037392c3135322e6101608601527f3630322c32312e303739733131312e3833312d372e3438372c3135322e3538376101808601527f2d32312e3037396334302e3838362d31332e3633362c36332e3339382d33312e6101a08601527f3831362c36332e3339382d35312e313938762d35332e39323463302d31372e316101c08601527f39362d31372e3730342d33332e3433352d35302e3232332d34362e34303156326101e08601527f30372e3630336333322e3531392d31322e3936372c35302e3232332d32392e326102008601527f30362c35302e3232332d34362e3430315a6d2d3334372e3436322c35372e37396102208601527f336c3133302e3935392c3133312e3032372d3133302e3935392c3133312e30316102408601527f33563231382e3939345a6d3236322e3932342e303232763236322e3031386c2d6102608601527f3133302e3933372d3133312e3030362c3133302e3933372d3133312e3031335a6102808601527f222066696c6c3d2223313631383232223e3c2f706174683e00000000000000006102a0860152896000146144835760405161218b81614888565b60008152995b1561432257604051806101e081011067ffffffffffffffff6101e08301111761430c576101e081016040526101b181527f3c7061746820643d226d3438312e34362c3438312e35347638312e3031632d3260208201527f2e33352e37372d342e38322c312e35312d372e33392c322e32332d33302e332c60408201527f382e35342d37342e36352c31332e39322d3132342e30362c31332e39322d353360608201527f2e362c302d3130312e32342d362e33332d3133312e34372d31362e3136762d3860808201527f316c34362e332d34362e3331683137302e33336c34362e32392c34362e33315a60a08201527f222066696c6c3d2275726c282353616e64426f74746f6d29222f3e3c7061746860c08201527f20643d226d3433352e31372c3433352e323363302c312e31372d2e34362c322e60e08201527f33322d312e33332c332e34342d372e31312c392e30382d34312e39332c31352e6101008201527f39382d38332e38312c31352e3938732d37362e372d362e392d38332e38322d316101208201527f352e3938632d2e38372d312e31322d312e33332d322e32372d312e33332d332e6101408201527f3434762d2e30346c382e33342d382e33352e30312d2e30316331332e37322d366101608201527f2e35312c34322e39352d31312e30322c37362e382d31312e30327336322e39376101808201527f2c342e34392c37362e37322c31316c382e34322c382e34325a222066696c6c3d6101a08201527f2275726c282353616e64546f7029222f3e0000000000000000000000000000006101c0820152995b60405196876107e081011067ffffffffffffffff6107e08a01111761430c57613b9c9c612e586036602d9960819f97631e17b39f60e11b8d7f3c2f646566733e000000000000000000000000000000000000000000000000009a612f279f6107e0016040526107a782527f3c672066696c6c3d226e6f6e6522207374726f6b653d2275726c2823486f757260208301527f676c6173735374726f6b652922207374726f6b652d6c696e656361703d22726f60408301527f756e6422207374726f6b652d6d697465726c696d69743d22313022207374726f60608301527f6b652d77696474683d2234223e3c7061746820643d226d3536352e3634312c3160808301527f30372e323863302c392e3533372d352e35362c31382e3632392d31352e36373660a08301527f2c32362e393733682d2e303233632d392e3230342c372e3539362d32322e313960c08301527f342c31342e3536322d33382e3139372c32302e3539322d33392e3530342c313460e08301527f2e3933362d39372e3332352c32342e3335352d3136312e3733332c32342e33356101008301527f352d39302e34382c302d3136372e3934382d31382e3538322d3139392e3935336101208301527f2d34342e393438682d2e303233632d31302e3131352d382e3334342d31352e366101408301527f37362d31372e3433372d31352e3637362d32362e3937332c302d33392e3733356101608301527f2c39362e3535342d37312e3932312c3231352e3635322d37312e3932317332316101808301527f352e3632392c33322e3138352c3231352e3632392c37312e3932315a222f3e3c6101a08301527f7061746820643d226d3133342e33362c3136312e32303363302c33392e3733356101c08301527f2c39362e3535342c37312e3932312c3231352e3635322c37312e3932317332316101e08301527f352e3632392d33322e3138362c3231352e3632392d37312e393231222f3e3c6c6102008301527f696e652078313d223133342e3336222079313d223136312e323033222078323d6102208301527f223133342e3336222079323d223130372e3238222f3e3c6c696e652078313d226102408301527f3536352e3634222079313d223136312e323033222078323d223536352e3634226102608301527f2079323d223130372e3238222f3e3c6c696e652078313d223138342e353834226102808301527f2079313d223230362e383233222078323d223138342e353835222079323d22356102a08301527f33372e353739222f3e3c6c696e652078313d223231382e313831222079313d226102c08301527f3231382e313138222078323d223231382e313831222079323d223536322e35336102e08301527f37222f3e3c6c696e652078313d223438312e383138222079313d223231382e316103008301527f3432222078323d223438312e383139222079323d223536322e343238222f3e3c6103208301527f6c696e652078313d223531352e343135222079313d223230372e3335322220786103408301527f323d223531352e343136222079323d223533372e353739222f3e3c70617468206103608301527f643d226d3138342e35382c3533372e353863302c352e34352c342e32372c31306103808301527f2e36352c31322e30332c31352e3432682e303263352e35312c332e33392c31326103a08301527f2e37392c362e35352c32312e35352c392e34322c33302e32312c392e392c37386103c08301527f2e30322c31362e32382c3133312e38332c31362e32382c34392e34312c302c396103e08301527f332e37362d352e33382c3132342e30362d31332e39322c322e372d2e37362c356104008301527f2e32392d312e35342c372e37352d322e33352c382e37372d322e38372c31362e6104208301527f30352d362e30342c32312e35362d392e3433683063372e37362d342e37372c316104408301527f322e30342d392e39372c31322e30342d31352e3432222f3e3c7061746820643d6104608301527f226d3138342e3538322c3439322e363536632d33312e3335342c31322e3438356104808301527f2d35302e3232332c32382e35382d35302e3232332c34362e3134322c302c392e6104a08301527f3533362c352e3536342c31382e3632372c31352e3637372c32362e393639682e6104c08301527f30323263382e3530332c372e3030352c32302e3231332c31332e3436332c33346104e08301527f2e3532342c31392e3135392c392e3939392c332e3939312c32312e3236392c376105008301527f2e3630392c33332e3539372c31302e3738382c33362e34352c392e3430372c386105208301527f322e3138312c31352e3030322c3133312e3833352c31352e3030327339352e336105408301527f36332d352e3539352c3133312e3830372d31352e3030326331302e3834372d326105608301527f2e37392c32302e3836372d352e3932362c32392e3932342d392e3334392c312e6105808301527f3234342d2e3436372c322e3437332d2e3934322c332e3637332d312e3432342c6105a08301527f31342e3332362d352e3639362c32362e3033352d31322e3136312c33342e35326105c08301527f342d31392e313733682e3032326331302e3131342d382e3334322c31352e36376105e08301527f372d31372e3433332c31352e3637372d32362e3936392c302d31372e3536322d6106008301527f31382e3836392d33332e3636352d35302e3232332d34362e3135222f3e3c70616106208301527f746820643d226d3133342e33362c3539322e373263302c33392e3733352c39366106408301527f2e3535342c37312e3932312c3231352e3635322c37312e393231733231352e366106608301527f32392d33322e3138362c3231352e3632392d37312e393231222f3e3c6c696e656106808301527f2078313d223133342e3336222079313d223539322e3732222078323d223133346106a08301527f2e3336222079323d223533382e373937222f3e3c6c696e652078313d223536356106c08301527f2e3634222079313d223539322e3732222078323d223536352e3634222079323d6106e08301527f223533382e373937222f3e3c706f6c796c696e6520706f696e74733d223438316107008301527f2e383232203438312e393031203438312e373938203438312e383737203438316107208301527f2e373735203438312e383534203335302e303135203335302e303236203231386107408301527f2e313835203231382e313239222f3e3c706f6c796c696e6520706f696e74733d6107608301527f223231382e313835203438312e393031203231382e323331203438312e3835346107808301527f203335302e303135203335302e303236203438312e383232203231382e3135326107a08301527f222f3e3c2f673e000000000000000000000000000000000000000000000000006107c0830152604051998a957f3c672069643d22486f7572676c617373223e000000000000000000000000000060208801528551612df48160329860208a8c019101614823565b8701612e098251809360208a85019101614823565b01612e1d8251809360208985019101614823565b01612e318251809360208885019101614823565b01612e458251809360208785019101614823565b01918201520360168101865201846148dc565b6040519e8f9788977f3c646566733e000000000000000000000000000000000000000000000000000060208a0152612e9b8151809260206026809d019101614823565b8901612eb08251809360208c85019101614823565b01612ec48251809360208b85019101614823565b01612ed88251809360208a85019101614823565b01612eec8251809360208985019101614823565b01612f008251809360208885019101614823565b01612f148251809360208785019101614823565b019182015203600d8101895201876148dc565b6137ba604c60c0830151610120840151936135166131496040602084015193015196612f538186615981565b9461314461012b604051612f66816148c0565b600581527f2d3130302500000000000000000000000000000000000000000000000000000060208201526040519889917f3c74657874506174682073746172744f66667365743d220000000000000000006020840152612fd0815180926020603787019101614823565b7f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666683820160378101919091527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e00000000000000000061010982015282519261311491849161012090910190602001614823565b6a1e17ba32bc3a2830ba341f60a91b90830190910161012081019190915281900361010b810190915201876148dc565b615981565b9561332861012b60405161315c816148c0565b600281527f30250000000000000000000000000000000000000000000000000000000000006020820152604051998a917f3c74657874506174682073746172744f66667365743d2200000000000000000060208401526131c6815180926020603787019101614823565b82017f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666660378201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e00000000000000000061010982015261330382518093602061012085019101614823565b016a1e17ba32bc3a2830ba341f60a91b6101208201520361010b81018a5201886148dc565b61333281846159e9565b9261351161012b604051613345816148c0565b600481527f2d3530250000000000000000000000000000000000000000000000000000000060208201526040519687917f3c74657874506174682073746172744f66667365743d2200000000000000000060208401526133af815180926020603787019101614823565b82017f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666660378201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e0000000000000000006101098201526134ec82518093602061012085019101614823565b016a1e17ba32bc3a2830ba341f60a91b6101208201520361010b8101875201856148dc565b6159e9565b906136f561012b604051613529816148c0565b600381527f353025000000000000000000000000000000000000000000000000000000000060208201526040519485917f3c74657874506174682073746172744f66667365743d220000000000000000006020840152613593815180926020603787019101614823565b82017f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666660378201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e0000000000000000006101098201526136d082518093602061012085019101614823565b016a1e17ba32bc3a2830ba341f60a91b6101208201520361010b8101855201836148dc565b6040519586937f3c7465787420746578742d72656e646572696e673d226f7074696d697a65537060208601527f656564223e000000000000000000000000000000000000000000000000000000604086015261375b815180926020604589019101614823565b8401613771825180936020604585019101614823565b01613786825180936020604585019101614823565b0161379b825180936020604585019101614823565b01661e17ba32bc3a1f60c91b604582015203602c8101845201826148dc565b613a9b61019c60e084015193610140810151906137fc6137f66137f06137ea60806101a086015195015199614b05565b94614b05565b92614b05565b96614b05565b906040519687937f3c75736520687265663d2223476c6f77222066696c6c2d6f7061636974793d2260208601527f2e39222f3e00000000000000000000000000000000000000000000000000000060408601527f3c75736520687265663d2223476c6f772220783d22313030302220793d22313060458601527f3030222066696c6c2d6f7061636974793d222e39222f3e00000000000000000060658601527f3c75736520687265663d22234c6f676f2220783d223137302220793d22313730607c8601527f22207472616e73666f726d3d227363616c65282e3629222f3e3c757365206872609c8601527f65663d2223486f7572676c6173732220783d223135302220793d22393022207460bc8601527f72616e73666f726d3d22726f746174652831302922207472616e73666f726d2d60dc8601527f6f726967696e3d2235303020353030222f3e000000000000000000000000000060fc8601527f3c75736520687265663d222350726f67726573732220783d220000000000000061010e860152805161399681610127936020858a019101614823565b8501927f2220793d22373930222f3e0000000000000000000000000000000000000000008481809694819501527f3c75736520687265663d22235374617475732220783d22000000000000000000610132820152825190613a01826101499560208785019101614823565b01918201527f3c75736520687265663d222353747265616d65642220783d2200000000000000610154820152825190613a448261016d9560208785019101614823565b01918201527f3c75736520687265663d22234475726174696f6e2220783d2200000000000000610178820152825190613a87826101919560208785019101614823565b01918201520361017c8101855201836148dc565b6040519586937f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323060208601527f30302f737667222077696474683d223130303022206865696768743d2231303060408601527f30222076696577426f783d2230203020313030302031303030223e00000000006060860152613b27815180926020607b89019101614823565b8401613b3d825180936020607b85019101614823565b01613b52825180936020607b85019101614823565b01613b67825180936020607b85019101614823565b017f3c2f7376673e0000000000000000000000000000000000000000000000000000607b8201520360618101845201826148dc565b6101405260a05160e0516040517fb971302a0000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa908115614300576000916142b5575b6142b161424a61414f614240609487613d376089613c158a614c55565b9260a0608001516040519485927f5b7b2274726169745f74797065223a224173736574222c2276616c7565223a226020850152613c5c815180926020604088019101614823565b8301907f227d2c7b2274726169745f74797065223a2253656e646572222c2276616c756560408301527f223a22000000000000000000000000000000000000000000000000000000000091826060820152613cc1825180936020606385019101614823565b01907f227d2c7b2274726169745f74797065223a22537461747573222c2276616c756560638301526083820152613d02825180936020608685019101614823565b017f227d5d000000000000000000000000000000000000000000000000000000000060868201520360698101845201826148dc565b6101a05160a05161403961017e613d4f602435614b05565b936080800151613d696001600160a01b0360805116614c55565b90604051968793613f2660208601987f54686973204e465420726570726573656e74732061207061796d656e742073748a527f7265616d20696e2061205361626c696572205632200000000000000000000000604088015282516020840190613dd68160558b0184614823565b8801947f20636f6e74726163742e20546865206f776e6572206f662074686973204e465460558701527f2063616e207769746864726177207468652073747265616d656420617373657460758701527f732c207768696368206172652064656e6f6d696e6174656420696e2000000000609587015282516020840196613e608260b183018a614823565b017f2e5c6e5c6e2d2053747265616d2049443a20000000000000000000000000000060b1820152613e9b82518093602060c385019101614823565b01613ed47f5c6e2d2000000000000000000000000000000000000000000000000000000000958660c384015251809360c7840190614823565b01947f20416464726573733a2000000000000000000000000000000000000000000000958660c7820152613f1282518093602060d185019101614823565b019260d184015251809360d5840190614823565b019060d5820152613f4182518093602060df85019101614823565b017f5c6e5c6e0000000000000000000000000000000000000000000000000000000060df8201527fe29aa0efb88f205741524e494e473a205472616e7366657272696e672074686560e38201527f204e4654206d616b657320746865206e6577206f776e657220746865207265636101038201527f697069656e74206f66207468652073747265616d2e205468652066756e6473206101238201527f617265206e6f74206175746f6d61746963616c6c792077697468647261776e206101438201527f666f72207468652070726576696f757320726563697069656e742e00000000006101638201520361015e8101855201836148dc565b6101a051906141aa61404c602435614b05565b916140cb602d604051809560208201976a029b0b13634b2b9102b19160ad1b8952614081815180926020602b87019101614823565b82017f2023000000000000000000000000000000000000000000000000000000000000602b8201526140bc8251809360208785019101614823565b0103600d8101865201846148dc565b610140516140d890614991565b94604051998a977f7b2261747472696275746573223a00000000000000000000000000000000000060208a0152614119815180926020602e8d019101614823565b8801917f2c226465736372697074696f6e223a2200000000000000000000000000000000602e840152518093603e840190614823565b01917f222c2265787465726e616c5f75726c223a2268747470733a2f2f7361626c6965603e8401527f722e636f6d222c226e616d65223a220000000000000000000000000000000000605e840152518093606d840190614823565b017f222c22696d616765223a22646174613a696d6167652f7376672b786d6c3b6261606d8201527f736536342c000000000000000000000000000000000000000000000000000000608d82015261420b825180936020609285019101614823565b017f227d00000000000000000000000000000000000000000000000000000000000060928201520360748101845201826148dc565b60c0819052614991565b61429d603d60405180937f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000602083015261428d8151809260208686019101614823565b810103601d8101845201826148dc565b604051918291602083526020830190614846565b0390f35b90506020813d6020116142f8575b816142d0602093836148dc565b810103126142f35751906001600160a01b03821682036142f3579061414f613bf8565b600080fd5b3d91506142c3565b6040513d6000823e3d90fd5b634e487b7160e01b600052604160045260246000fd5b6040518061012081011067ffffffffffffffff6101208301111761430c57610120810160405260f881527f3c7061746820643d226d3438312e34362c3530342e3130317635382e3434396360208201527f2d322e33352e37372d342e38322c312e35312d372e33392c322e32332d33302e60408201527f332c382e35342d37342e36352c31332e39322d3132342e30362c31332e39322d60608201527f35332e362c302d3130312e32342d362e33332d3133312e34372d31362e31367660808201527f2d35382e343339683236322e39325a222066696c6c3d2275726c282353616e6460a08201527f426f74746f6d29222f3e3c656c6c697073652063783d22333530222063793d2260c08201527f3530342e313031222072783d223133312e343632222072793d2232382e31303860e08201527f222066696c6c3d2275726c282353616e64546f7029222f3e0000000000000000610100820152996123de565b604051806101c081011067ffffffffffffffff6101c08301111761430c576101c0810160405261019981527f3c706f6c79676f6e20706f696e74733d22333530203335302e3032362034313560208201527f2e3033203238342e39373820323835203238342e39373820333530203335302e60408201527f303236222066696c6c3d2275726c282353616e64426f74746f6d29222f3e3c7060608201527f61746820643d226d3431362e3334312c3238312e39373563302c2e3931342d2e60808201527f3335342c312e3830392d312e3033352c322e36382d352e3534322c372e30373660a08201527f2d33322e3636312c31322e34352d36352e32382c31322e34352d33322e36323460c08201527f2c302d35392e3733382d352e3337342d36352e32382d31322e34352d2e36383160e08201527f2d2e3837322d312e3033352d312e3736372d312e3033352d322e36382c302d2e6101008201527f3931342e3335342d312e3830382c312e3033352d322e3637362c352e3534322d6101208201527f372e3037362c33322e3635362d31322e34352c36352e32382d31322e34352c336101408201527f322e3631392c302c35392e3733382c352e3337342c36352e32382c31322e34356101608201527f2e3638312e3836372c312e3033352c312e3736322c312e3033352c322e3637366101808201527f5a222066696c6c3d2275726c282353616e64546f7029222f3e000000000000006101a082015299612191565b6146ca9198506146b661584c565b906020815191012090602081519101201490565b9638611d39565b905093610d64565b905094610a2f565b60d09461072c565b61470b915060203d602011614711575b61470381836148dc565b810190614926565b386104e0565b503d6146f9565b614731915060203d6020116147115761470381836148dc565b38610489565b634e487b7160e01b600052601260045260246000fd5b61477091925060203d602011614777575b61476881836148dc565b8101906148fe565b903861023d565b503d61475e565b614797915060203d6020116147775761476881836148dc565b386101d2565b506020813d6020116147d2575b816147b7602093836148dc565b810103126142f3575160058110156142f3576101779061016d565b3d91506147aa565b90506020813d60201161481b575b816147f5602093836148dc565b810103126142f357516001600160a01b03811681036142f3576001600160a01b036100ff565b3d91506147e8565b60005b8381106148365750506000910152565b8181015183820152602001614826565b9060209161485f81518092818552858086019101614823565b601f01601f1916010190565b610140810190811067ffffffffffffffff82111761430c57604052565b6020810190811067ffffffffffffffff82111761430c57604052565b6060810190811067ffffffffffffffff82111761430c57604052565b6040810190811067ffffffffffffffff82111761430c57604052565b90601f8019910116810190811067ffffffffffffffff82111761430c57604052565b908160209103126142f357516fffffffffffffffffffffffffffffffff811681036142f35790565b908160209103126142f3575164ffffffffff811681036142f35790565b67ffffffffffffffff811161430c57601f01601f191660200190565b9061496982614943565b61497660405191826148dc565b8281528092614987601f1991614943565b0190602036910137565b805115614af1576040516149a4816148a4565b604081527f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208201527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f60408201528151600292838201809211614adb5760038092047f3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81168103614adb57614a3e908594951b61495f565b936020850193829183518401925b838110614a8a5750505050510680600114614a7757600214614a6c575090565b603d90600019015390565b50603d9081600019820153600119015390565b85600491979293949701918251600190603f9082828260121c16880101518453828282600c1c16880101518385015382828260061c1688010151888501531685010151878201530195929190614a4c565b634e487b7160e01b600052601160045260246000fd5b50604051614afe81614888565b6000815290565b806000917a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000080821015614c47575b506d04ee2d6d415b85acef810000000080831015614c38575b50662386f26fc1000080831015614c29575b506305f5e10080831015614c1a575b5061271080831015614c0b575b506064821015614bfb575b600a80921015614bf1575b600190816021614b9c82870161495f565b95860101905b614bae575b5050505090565b600019019083907f30313233343536373839616263646566000000000000000000000000000000008282061a835304918215614bec57919082614ba2565b614ba7565b9160010191614b8b565b9190606460029104910191614b80565b60049193920491019138614b75565b60089193920491019138614b68565b60109193920491019138614b59565b60209193920491019138614b47565b604093508104915038614b2e565b6001600160a01b031660405190614c6b826148a4565b602a8252602082016040368237825115614d8357603090538151600190811015614d8357607860218401536029905b808211614d08575050614caa5790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602060248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b9091600f81166010811015614d6e577f3031323334353637383961626364656600000000000000000000000000000000901a614d448486614d99565b5360041c918015614d59576000190190614c9a565b60246000634e487b7160e01b81526011600452fd5b60246000634e487b7160e01b81526032600452fd5b634e487b7160e01b600052603260045260246000fd5b908151811015614d83570160200190565b60405190614db7826148c0565b600482527f2667743b000000000000000000000000000000000000000000000000000000006020830152565b60405190614df0826148c0565b600482527f266c743b000000000000000000000000000000000000000000000000000000006020830152565b90614e839294936040519586928451614e3d81602097888089019101614823565b8401614e5182518093888085019101614823565b01614e6482518093878085019101614823565b01614e7782518093868085019101614823565b010380855201836148dc565b565b80156151965760009180615171575090505b6001908082811015614f0457505050614eae614de3565b614f01602260405183614ecb829551809260208086019101614823565b81017f203100000000000000000000000000000000000000000000000000000000000060208201520360028101845201826148dc565b90565b66038d7ea4c6800011156151145760409081519060a0820182811067ffffffffffffffff82111761430c57808452614f3b81614888565b600081528252825190614f4d826148c0565b8482526020917f4b0000000000000000000000000000000000000000000000000000000000000083820152828401528351614f87816148c0565b8581527f4d0000000000000000000000000000000000000000000000000000000000000083820152848401528351614fbe816148c0565b8581527f42000000000000000000000000000000000000000000000000000000000000008382015260608401528351614ff6816148c0565b8581527f54000000000000000000000000000000000000000000000000000000000000008382015260808401526000918583965b6150e8575b5084519461503c866148c0565b6007908187527f2623383830353b0000000000000000000000000000000000000000000000000083880152519560005b8281106150d557505050506150b66150bc917f20000000000000000000000000000000000000000000000000000000000000006027870152600886526150b1866148c0565b614b05565b91615740565b916005851015614d8357614f019460051b015192614e1c565b818101840151888201850152830161506c565b9591926103e89081851061510b57508680916064600a870406950493019661502a565b9392965061502f565b505061511e614daa565b614f0160286040518361513b829551809260208086019101614823565b81017f203939392e39395400000000000000000000000000000000000000000000000060208201520360088101845201826148dc565b600a0a918215615182575004614e97565b80634e487b7160e01b602492526012600452fd5b50506040516151a4816148c0565b600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b620151809103048061523957506151e6614de3565b614f01602660405183615203829551809260208086019101614823565b81017f203120446179000000000000000000000000000000000000000000000000000060208201520360068101845201826148dc565b61270f811161530857600181036152c557614f01602061528d60405161525e816148c0565b600481527f20446179000000000000000000000000000000000000000000000000000000008382015293614b05565b60405193816152a58693518092868087019101614823565b82016152b982518093868085019101614823565b010380845201826148dc565b614f01602061528d6040516152d9816148c0565b600581527f20446179730000000000000000000000000000000000000000000000000000008382015293614b05565b50615311614daa565b614f01602a6040518361532e829551809260208086019101614823565b81017f2039393939204461797300000000000000000000000000000000000000000000602082015203600a8101845201826148dc565b6020818303126142f35780519067ffffffffffffffff82116142f3570181601f820112156142f357805161539781614943565b926153a560405194856148dc565b818452602082840101116142f357614f019160208085019101614823565b6001600160a01b031660409081516395d89b4160e01b8152600081600481855afa90811561559d5760009161557c575b506154588351615402816148c0565b601181527f5341422d56322d4c4f434b55502d4c494e0000000000000000000000000000006020918201528251908301207fc66b376a19264d832c1bc254000c18944ca5aa57ed50f4ea637c4da424d4c3bb1490565b1561549657505051615469816148c0565b600d81527f4c6f636b7570204c696e65617200000000000000000000000000000000000000602082015290565b6154fa83516154a4816148c0565b601181527f5341422d56322d4c4f434b55502d44594e0000000000000000000000000000006020918201528251908301207f6ab655856fa5352de8c05542b1937ac63c59342da992602767c02734cc5391651490565b156155385750505161550b816148c0565b600e81527f4c6f636b75702044796e616d6963000000000000000000000000000000000000602082015290565b6155789083519384937f814a8a2e000000000000000000000000000000000000000000000000000000008552600485015260248401526044830190614846565b0390fd5b615597913d8091833e61558f81836148dc565b810190615364565b386153f3565b83513d6000823e3d90fd5b3d156155d3573d906155b982614943565b916155c760405193846148dc565b82523d6000602084013e565b606090565b60405160208101907f313ce56700000000000000000000000000000000000000000000000000000000825260048152615610816148c0565b6000928392839251915afa6156236155a8565b908061565a575b156156565760208180518101031261565257602001519060ff8216820361564f575090565b80fd5b5080fd5b5090565b50602081511461562a565b6000809160405160208101906395d89b4160e01b825260048152615688816148c0565b51915afa6156946155a8565b90158015615734575b6156fa57806020806156b493518301019101615364565b601e815111600014614f0157506040516156cd816148c0565b600b81527f4c6f6e672053796d626f6c000000000000000000000000000000000000000000602082015290565b50604051615707816148c0565b600581527f4552433230000000000000000000000000000000000000000000000000000000602082015290565b5060408151111561569d565b806157525750604051614afe81614888565b600a8110156157b75761576490614b05565b614f01602260405180937f2e3000000000000000000000000000000000000000000000000000000000000060208301526157a78151809260208686019101614823565b81010360028101845201826148dc565b6157c090614b05565b614f01602160405180937f2e0000000000000000000000000000000000000000000000000000000000000060208301526158038151809260208686019101614823565b81010360018101845201826148dc565b60405190615820826148c0565b600782527f536574746c6564000000000000000000000000000000000000000000000000006020830152565b60405190615859826148c0565b600882527f4465706c657465640000000000000000000000000000000000000000000000006020830152565b600581101561596b576004810361589f5750614f0161584c565b600381036158e157506040516158b4816148c0565b600881527f43616e63656c6564000000000000000000000000000000000000000000000000602082015290565b6001810361592357506040516158f6816148c0565b600981527f53747265616d696e670000000000000000000000000000000000000000000000602082015290565b60020361593257614f01615813565b60405161593e816148c0565b600781527f50656e64696e6700000000000000000000000000000000000000000000000000602082015290565b634e487b7160e01b600052602160045260246000fd5b6030614e839193929360405194816159a3879351809260208087019101614823565b820164010714051160dd1b60208201526a029b0b13634b2b9102b19160ad1b60258201526159da8251809360208785019101614823565b010360108101855201836148dc565b6025614e83919392936040519481615a0b879351809260208087019101614823565b820164010714051160dd1b6020820152615a2e8251809360208785019101614823565b010360058101855201836148dc565b60405190615a4a826148c0565b601082527f68736c283233302c3231252c31312529000000000000000000000000000000006020830152565b8015615ca857615a84615a3d565b90612710908103908111614adb57614f0191615aa261013692614b05565b6040519485927f3c672066696c6c3d226e6f6e65223e000000000000000000000000000000000060208501527f3c636972636c652063783d22313636222063793d2235302220723d2232322220602f8501527f7374726f6b653d22000000000000000000000000000000000000000000000000604f850152615b2e815180926020605788019101614823565b83017f22207374726f6b652d77696474683d223130222f3e000000000000000000000060578201527f3c636972636c652063783d22313636222063793d2235302220706174684c656e606c8201527f6774683d2231303030302220723d22323222207374726f6b653d220000000000608c820152615bb682518093602060a785019101614823565b017f22207374726f6b652d6461736861727261793d22313030303022207374726f6b60a78201527f652d646173686f66667365743d2200000000000000000000000000000000000060c7820152615c1782518093602060d585019101614823565b017f22207374726f6b652d6c696e656361703d22726f756e6422207374726f6b652d60d58201527f77696474683d223522207472616e73666f726d3d22726f74617465282d39302960f58201527f22207472616e73666f726d2d6f726967696e3d22313636203530222f3e000000610115820152631e17b39f60e11b610132820152036101168101845201826148dc565b5050604051614afe81614888565b60009080518015615d2b579060009182915b818310615cda57505050600d02900390565b909193603b60f81b7fff00000000000000000000000000000000000000000000000000000000000000615d0d8785614d99565b511614615d23575b600d01936001019190615cc8565b849350615d15565b505050600090565b60009080518015615d2b579060009182915b818310615d575750505060041b900390565b909193603b60f81b7fff00000000000000000000000000000000000000000000000000000000000000615d8a8785614d99565b511614615da0575b601001936001019190615d45565b849350615d9256"; From a8198aed11006ca49f997d86be3b5e00e50c314e Mon Sep 17 00:00:00 2001 From: andreivladbrg Date: Mon, 11 Sep 2023 12:21:24 +0300 Subject: [PATCH 12/47] test: transferFrom function --- .../lockup-dynamic/LockupDynamic.t.sol | 15 +++++++ .../concrete/lockup-linear/LockupLinear.t.sol | 15 +++++++ .../lockup/transfer-from/transferFrom.t.sol | 44 +++++++++++++++++++ .../lockup/transfer-from/transferFrom.tree | 7 +++ 4 files changed, 81 insertions(+) create mode 100644 test/integration/concrete/lockup/transfer-from/transferFrom.t.sol create mode 100644 test/integration/concrete/lockup/transfer-from/transferFrom.tree diff --git a/test/integration/concrete/lockup-dynamic/LockupDynamic.t.sol b/test/integration/concrete/lockup-dynamic/LockupDynamic.t.sol index bc5fe2328..87116c1b6 100644 --- a/test/integration/concrete/lockup-dynamic/LockupDynamic.t.sol +++ b/test/integration/concrete/lockup-dynamic/LockupDynamic.t.sol @@ -29,6 +29,7 @@ import { RefundableAmountOf_Integration_Concrete_Test } from "../lockup/refundab import { Renounce_Integration_Concrete_Test } from "../lockup/renounce/renounce.t.sol"; import { SetComptroller_Integration_Concrete_Test } from "../lockup/set-comptroller/setComptroller.t.sol"; import { SetNFTDescriptor_Integration_Concrete_Test } from "../lockup/set-nft-descriptor/setNFTDescriptor.t.sol"; +import { TransferFrom_Integration_Concrete_Test } from "../lockup/transfer-from/transferFrom.t.sol"; import { StatusOf_Integration_Concrete_Test } from "../lockup/status-of/statusOf.t.sol"; import { Withdraw_Integration_Concrete_Test } from "../lockup/withdraw/withdraw.t.sol"; import { WasCanceled_Integration_Concrete_Test } from "../lockup/was-canceled/wasCanceled.t.sol"; @@ -391,6 +392,20 @@ contract StatusOf_LockupDynamic_Integration_Concrete_Test is } } +contract TransferFrom_LockupDynamic_Integration_Concrete_Test is + LockupDynamic_Integration_Concrete_Test, + TransferFrom_Integration_Concrete_Test +{ + function setUp() + public + virtual + override(LockupDynamic_Integration_Concrete_Test, TransferFrom_Integration_Concrete_Test) + { + LockupDynamic_Integration_Concrete_Test.setUp(); + TransferFrom_Integration_Concrete_Test.setUp(); + } +} + contract WasCanceled_LockupDynamic_Integration_Concrete_Test is LockupDynamic_Integration_Concrete_Test, WasCanceled_Integration_Concrete_Test diff --git a/test/integration/concrete/lockup-linear/LockupLinear.t.sol b/test/integration/concrete/lockup-linear/LockupLinear.t.sol index edc46b988..e347f38a7 100644 --- a/test/integration/concrete/lockup-linear/LockupLinear.t.sol +++ b/test/integration/concrete/lockup-linear/LockupLinear.t.sol @@ -31,6 +31,7 @@ import { Renounce_Integration_Concrete_Test } from "../lockup/renounce/renounce. import { SetComptroller_Integration_Concrete_Test } from "../lockup/set-comptroller/setComptroller.t.sol"; import { SetNFTDescriptor_Integration_Concrete_Test } from "../lockup/set-nft-descriptor/setNFTDescriptor.t.sol"; import { StatusOf_Integration_Concrete_Test } from "../lockup/status-of/statusOf.t.sol"; +import { TransferFrom_Integration_Concrete_Test } from "../lockup/transfer-from/transferFrom.t.sol"; import { WasCanceled_Integration_Concrete_Test } from "../lockup/was-canceled/wasCanceled.t.sol"; import { Withdraw_Integration_Concrete_Test } from "../lockup/withdraw/withdraw.t.sol"; import { WithdrawMax_Integration_Concrete_Test } from "../lockup/withdraw-max/withdrawMax.t.sol"; @@ -392,6 +393,20 @@ contract StatusOf_LockupLinear_Integration_Concrete_Test is } } +contract TransferFrom_LockupLinear_Integration_Concrete_Test is + LockupLinear_Integration_Concrete_Test, + TransferFrom_Integration_Concrete_Test +{ + function setUp() + public + virtual + override(LockupLinear_Integration_Concrete_Test, TransferFrom_Integration_Concrete_Test) + { + LockupLinear_Integration_Concrete_Test.setUp(); + TransferFrom_Integration_Concrete_Test.setUp(); + } +} + contract WasCanceled_LockupLinear_Integration_Concrete_Test is LockupLinear_Integration_Concrete_Test, WasCanceled_Integration_Concrete_Test diff --git a/test/integration/concrete/lockup/transfer-from/transferFrom.t.sol b/test/integration/concrete/lockup/transfer-from/transferFrom.t.sol new file mode 100644 index 000000000..d21057058 --- /dev/null +++ b/test/integration/concrete/lockup/transfer-from/transferFrom.t.sol @@ -0,0 +1,44 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >=0.8.19 <0.9.0; + +import { Errors } from "src/libraries/Errors.sol"; + +import { Lockup_Integration_Shared_Test } from "../../../shared/lockup/Lockup.t.sol"; +import { Integration_Test } from "../../../Integration.t.sol"; + +abstract contract TransferFrom_Integration_Concrete_Test is Integration_Test, Lockup_Integration_Shared_Test { + function setUp() public virtual override(Integration_Test, Lockup_Integration_Shared_Test) { + changePrank({ msgSender: users.recipient }); + } + + function test_RevertGiven_StreamNotTransferable() external { + uint256 notTransferableStreamId = createDefaultStreamNotTransferable(); + vm.expectRevert( + abi.encodeWithSelector(Errors.SablierV2Lockup_NotTransferrable.selector, notTransferableStreamId) + ); + lockup.transferFrom({ from: users.recipient, to: users.alice, tokenId: notTransferableStreamId }); + } + + modifier givenStreamTransferable() { + _; + } + + function test_TransfeFrom() external givenStreamTransferable { + // Create a stream. + uint256 streamId = createDefaultStream(); + + // Expect the relevant events to be emitted. + vm.expectEmit({ emitter: address(lockup) }); + emit Transfer({ from: users.recipient, to: users.alice, tokenId: streamId }); + vm.expectEmit({ emitter: address(lockup) }); + emit MetadataUpdate({ _tokenId: streamId }); + + // Transfer the NFT. + lockup.transferFrom({ from: users.recipient, to: users.alice, tokenId: streamId }); + + // Assert that Alice is the new stream recipient (and NFT owner). + address actualRecipient = lockup.getRecipient(streamId); + address expectedRecipient = users.alice; + assertEq(actualRecipient, expectedRecipient, "recipient"); + } +} diff --git a/test/integration/concrete/lockup/transfer-from/transferFrom.tree b/test/integration/concrete/lockup/transfer-from/transferFrom.tree new file mode 100644 index 000000000..bc08e8ce5 --- /dev/null +++ b/test/integration/concrete/lockup/transfer-from/transferFrom.tree @@ -0,0 +1,7 @@ +transferFrom.t.sol +├── given the stream is not transferable +│ └── it should revert +└── given the stream is transferable + ├── it should transfer the NFT + ├── it should emit a {Transfer} event + └── it should emit a {MetadataUpdate} event \ No newline at end of file From 7bc2d447e811facafc41751bff0b1b94f2bc59f9 Mon Sep 17 00:00:00 2001 From: andreivladbrg Date: Mon, 11 Sep 2023 13:04:32 +0300 Subject: [PATCH 13/47] chore: add commented parameters in ERC721 hooks --- src/abstracts/SablierV2Lockup.sol | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/abstracts/SablierV2Lockup.sol b/src/abstracts/SablierV2Lockup.sol index d0bb669fd..310059226 100644 --- a/src/abstracts/SablierV2Lockup.sol +++ b/src/abstracts/SablierV2Lockup.sol @@ -328,10 +328,10 @@ abstract contract SablierV2Lockup is /// an event upon transfer. /// @dev This event is also emitted when the NFT is minted or burned. function _afterTokenTransfer( - address, - address, + address, /* from */ + address, /* to */ uint256 streamId, - uint256 + uint256 /* batchSize */ ) internal override @@ -342,7 +342,16 @@ abstract contract SablierV2Lockup is /// @dev There are two cases when the transferable flag is ignored: /// - If `from` is 0, then the transfer is a mint and is allowed. /// - If `to` is 0, then the transfer is a burn and is also allowed. - function _beforeTokenTransfer(address from, address to, uint256 streamId, uint256) internal view override { + function _beforeTokenTransfer( + address from, + address to, + uint256 streamId, + uint256 /* batchSize */ + ) + internal + view + override + { if (!isTransferable(streamId) && to != address(0) && from != address(0)) { revert Errors.SablierV2Lockup_NotTransferrable(streamId); } From 81a17f7ffb7bd3a48ab6e4a6aeb86b13374e1707 Mon Sep 17 00:00:00 2001 From: Paul Razvan Berg Date: Tue, 12 Sep 2023 12:35:42 +0300 Subject: [PATCH 14/47] docs: improve writing in NatSpec test: fix typos --- src/abstracts/SablierV2Lockup.sol | 4 ++-- test/integration/concrete/lockup-dynamic/LockupDynamic.t.sol | 2 +- .../concrete/lockup/transfer-from/transferFrom.t.sol | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/abstracts/SablierV2Lockup.sol b/src/abstracts/SablierV2Lockup.sol index 310059226..6c502dedb 100644 --- a/src/abstracts/SablierV2Lockup.sol +++ b/src/abstracts/SablierV2Lockup.sol @@ -324,8 +324,8 @@ abstract contract SablierV2Lockup is INTERNAL CONSTANT FUNCTIONS //////////////////////////////////////////////////////////////////////////*/ - /// @notice Overrides the internal ERC-721 transfer function to update the NFT SVG on external platforms by emitting - /// an event upon transfer. + /// @notice Overrides the internal ERC-721 transfer function to emit an ERC-4906 event upon transfer. The goal is to + /// refresh the NFT metadata on external platforms. /// @dev This event is also emitted when the NFT is minted or burned. function _afterTokenTransfer( address, /* from */ diff --git a/test/integration/concrete/lockup-dynamic/LockupDynamic.t.sol b/test/integration/concrete/lockup-dynamic/LockupDynamic.t.sol index 87116c1b6..c5ff9c6e7 100644 --- a/test/integration/concrete/lockup-dynamic/LockupDynamic.t.sol +++ b/test/integration/concrete/lockup-dynamic/LockupDynamic.t.sol @@ -29,8 +29,8 @@ import { RefundableAmountOf_Integration_Concrete_Test } from "../lockup/refundab import { Renounce_Integration_Concrete_Test } from "../lockup/renounce/renounce.t.sol"; import { SetComptroller_Integration_Concrete_Test } from "../lockup/set-comptroller/setComptroller.t.sol"; import { SetNFTDescriptor_Integration_Concrete_Test } from "../lockup/set-nft-descriptor/setNFTDescriptor.t.sol"; -import { TransferFrom_Integration_Concrete_Test } from "../lockup/transfer-from/transferFrom.t.sol"; import { StatusOf_Integration_Concrete_Test } from "../lockup/status-of/statusOf.t.sol"; +import { TransferFrom_Integration_Concrete_Test } from "../lockup/transfer-from/transferFrom.t.sol"; import { Withdraw_Integration_Concrete_Test } from "../lockup/withdraw/withdraw.t.sol"; import { WasCanceled_Integration_Concrete_Test } from "../lockup/was-canceled/wasCanceled.t.sol"; import { WithdrawMax_Integration_Concrete_Test } from "../lockup/withdraw-max/withdrawMax.t.sol"; diff --git a/test/integration/concrete/lockup/transfer-from/transferFrom.t.sol b/test/integration/concrete/lockup/transfer-from/transferFrom.t.sol index d21057058..21538c4a1 100644 --- a/test/integration/concrete/lockup/transfer-from/transferFrom.t.sol +++ b/test/integration/concrete/lockup/transfer-from/transferFrom.t.sol @@ -23,7 +23,7 @@ abstract contract TransferFrom_Integration_Concrete_Test is Integration_Test, Lo _; } - function test_TransfeFrom() external givenStreamTransferable { + function test_TransferFrom() external givenStreamTransferable { // Create a stream. uint256 streamId = createDefaultStream(); From b0d8e67e776611fcfb1bd88bbd2fe462c23b5deb Mon Sep 17 00:00:00 2001 From: Andrei Vlad Birgaoanu <99738872+andreivladbrg@users.noreply.github.com> Date: Sun, 17 Sep 2023 13:27:01 +0300 Subject: [PATCH 15/47] build: upgrade solidity version to 0.8.21 (#688) * build: upgrade solidity version to 0.8.21 * build: bump the pragma back to >=0.8.19 * build: show unproved and unsupported SMTChecker * refactor: update gas snapshot --------- Co-authored-by: Paul Razvan Berg --- .gas-snapshot | 669 +++++++++++------- foundry.toml | 4 +- script/Base.s.sol | 2 +- script/DeployComptroller.s.sol | 2 +- script/DeployCore.s.sol | 2 +- script/DeployCore2.s.sol | 2 +- script/DeployDeterministicComptroller.s.sol | 2 +- script/DeployDeterministicCore.s.sol | 2 +- script/DeployDeterministicCore2.s.sol | 2 +- script/DeployDeterministicLockupDynamic.s.sol | 2 +- script/DeployDeterministicLockupLinear.s.sol | 2 +- script/DeployLockupDynamic.s.sol | 2 +- script/DeployLockupLinear.s.sol | 2 +- script/GenerateSVG.s.sol | 2 +- script/Init.s.sol | 2 +- test/utils/Precompiles.sol | 6 +- test/utils/Precompiles.t.sol | 2 +- 17 files changed, 416 insertions(+), 291 deletions(-) diff --git a/.gas-snapshot b/.gas-snapshot index 40cb347b3..31ba7f609 100644 --- a/.gas-snapshot +++ b/.gas-snapshot @@ -1,173 +1,266 @@ -Burn_LockupDynamic_Integration_Concrete_Test:test_Burn_CallerApprovedOperator() (gas: 82944) -Burn_LockupDynamic_Integration_Concrete_Test:test_Burn_CallerNFTOwner() (gas: 70040) -Burn_LockupLinear_Integration_Concrete_Test:test_Burn_CallerApprovedOperator() (gas: 83160) -Burn_LockupLinear_Integration_Concrete_Test:test_Burn_CallerNFTOwner() (gas: 70299) -CancelMultiple_LockupDynamic_Integration_Concrete_Test:test_CancelMultiple() (gas: 825327) -CancelMultiple_LockupDynamic_Integration_Concrete_Test:test_CancelMultiple_ArrayCountZero() (gas: 6249) -CancelMultiple_LockupDynamic_Integration_Fuzz_Test:testFuzz_CancelMultiple(uint256,uint40) (runs: 50, μ: 1189888, ~: 1194666) -CancelMultiple_LockupLinear_Integration_Concrete_Test:test_CancelMultiple() (gas: 558971) +Burn_LockupDynamic_Integration_Concrete_Test:test_Burn_CallerApprovedOperator() (gas: 87474) +Burn_LockupDynamic_Integration_Concrete_Test:test_Burn_CallerNFTOwner() (gas: 78058) +Burn_LockupDynamic_Integration_Concrete_Test:test_Burn_NonTransferableNFT() (gas: 78067) +Burn_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_NFTDoesNotExist() (gas: 79272) +Burn_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11325) +Burn_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StatusCanceled() (gas: 86942) +Burn_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StatusPending() (gas: 14284) +Burn_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StatusSettled() (gas: 19520) +Burn_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StatusStreaming() (gas: 19556) +Burn_LockupLinear_Integration_Concrete_Test:test_Burn_CallerApprovedOperator() (gas: 87711) +Burn_LockupLinear_Integration_Concrete_Test:test_Burn_CallerNFTOwner() (gas: 78284) +Burn_LockupLinear_Integration_Concrete_Test:test_Burn_NonTransferableNFT() (gas: 78293) +Burn_LockupLinear_Integration_Concrete_Test:test_RevertGiven_NFTDoesNotExist() (gas: 79480) +Burn_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11311) +Burn_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StatusCanceled() (gas: 77650) +Burn_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StatusPending() (gas: 14270) +Burn_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StatusSettled() (gas: 19506) +Burn_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StatusStreaming() (gas: 19542) +CancelMultiple_LockupDynamic_Integration_Concrete_Test:test_CancelMultiple() (gas: 831368) +CancelMultiple_LockupDynamic_Integration_Concrete_Test:test_CancelMultiple_ArrayCountZero() (gas: 6293) +CancelMultiple_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_AllStreamsCold() (gas: 32410) +CancelMultiple_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_AllStreamsNotCancelable() (gas: 866449) +CancelMultiple_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_OnlyNull() (gas: 12340) +CancelMultiple_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_SomeNull() (gas: 78328) +CancelMultiple_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_SomeStreamsCold() (gas: 340997) +CancelMultiple_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_SomeStreamsNotCancelable() (gas: 950201) +CancelMultiple_LockupDynamic_Integration_Fuzz_Test:testFuzz_CancelMultiple(uint256,uint40) (runs: 50, μ: 1201756, ~: 1206371) +CancelMultiple_LockupLinear_Integration_Concrete_Test:test_CancelMultiple() (gas: 563445) CancelMultiple_LockupLinear_Integration_Concrete_Test:test_CancelMultiple_ArrayCountZero() (gas: 6313) -CancelMultiple_LockupLinear_Integration_Fuzz_Test:testFuzz_CancelMultiple(uint256,uint40) (runs: 50, μ: 792602, ~: 793724) -Cancel_LockupDynamic_Integration_Concrete_Test:test_Cancel_CallerRecipient() (gas: 388606) -Cancel_LockupDynamic_Integration_Concrete_Test:test_Cancel_CallerRecipient_SenderDoesNotImplementHook() (gas: 374225) -Cancel_LockupDynamic_Integration_Concrete_Test:test_Cancel_CallerRecipient_SenderNotContract() (gas: 100002) -Cancel_LockupDynamic_Integration_Concrete_Test:test_Cancel_CallerRecipient_SenderReentrancy() (gas: 376293) -Cancel_LockupDynamic_Integration_Concrete_Test:test_Cancel_CallerRecipient_SenderReverts() (gas: 374725) -Cancel_LockupDynamic_Integration_Concrete_Test:test_Cancel_CallerSender() (gas: 383652) -Cancel_LockupDynamic_Integration_Concrete_Test:test_Cancel_CallerSender_RecipientDoesNotImplementHook() (gas: 369169) -Cancel_LockupDynamic_Integration_Concrete_Test:test_Cancel_CallerSender_RecipientNotContract() (gas: 97284) -Cancel_LockupDynamic_Integration_Concrete_Test:test_Cancel_CallerSender_RecipientReentrancy() (gas: 371361) -Cancel_LockupDynamic_Integration_Concrete_Test:test_Cancel_CallerSender_RecipientReverts() (gas: 369748) -Cancel_LockupDynamic_Integration_Concrete_Test:test_Cancel_StatusPending() (gas: 76354) -Cancel_LockupDynamic_Integration_Fuzz_Test:testFuzz_Cancel_CallerRecipient(uint256,uint128) (runs: 50, μ: 431864, ~: 433061) -Cancel_LockupDynamic_Integration_Fuzz_Test:testFuzz_Cancel_CallerSender(uint256,uint128) (runs: 50, μ: 451169, ~: 452317) -Cancel_LockupDynamic_Integration_Fuzz_Test:testFuzz_Cancel_StatusPending(uint256) (runs: 50, μ: 76922, ~: 77115) -Cancel_LockupLinear_Integration_Concrete_Test:test_Cancel_CallerRecipient() (gas: 272486) -Cancel_LockupLinear_Integration_Concrete_Test:test_Cancel_CallerRecipient_SenderDoesNotImplementHook() (gas: 258004) -Cancel_LockupLinear_Integration_Concrete_Test:test_Cancel_CallerRecipient_SenderNotContract() (gas: 80382) -Cancel_LockupLinear_Integration_Concrete_Test:test_Cancel_CallerRecipient_SenderReentrancy() (gas: 260080) -Cancel_LockupLinear_Integration_Concrete_Test:test_Cancel_CallerRecipient_SenderReverts() (gas: 258504) -Cancel_LockupLinear_Integration_Concrete_Test:test_Cancel_CallerSender() (gas: 267507) -Cancel_LockupLinear_Integration_Concrete_Test:test_Cancel_CallerSender_RecipientDoesNotImplementHook() (gas: 252935) -Cancel_LockupLinear_Integration_Concrete_Test:test_Cancel_CallerSender_RecipientNotContract() (gas: 77660) -Cancel_LockupLinear_Integration_Concrete_Test:test_Cancel_CallerSender_RecipientReentrancy() (gas: 255135) -Cancel_LockupLinear_Integration_Concrete_Test:test_Cancel_CallerSender_RecipientReverts() (gas: 253514) -Cancel_LockupLinear_Integration_Concrete_Test:test_Cancel_StatusPending() (gas: 76412) -Cancel_LockupLinear_Integration_Fuzz_Test:testFuzz_Cancel_CallerRecipient(uint256,uint128) (runs: 50, μ: 288908, ~: 288864) -Cancel_LockupLinear_Integration_Fuzz_Test:testFuzz_Cancel_CallerSender(uint256,uint128) (runs: 50, μ: 308395, ~: 308310) -Cancel_LockupLinear_Integration_Fuzz_Test:testFuzz_Cancel_StatusPending(uint256) (runs: 50, μ: 76952, ~: 77027) -ClaimProtocolRevenues_LockupDynamic_Integration_Concrete_Test:test_ClaimProtocolRevenues() (gas: 317052) -ClaimProtocolRevenues_LockupLinear_Integration_Concrete_Test:test_ClaimProtocolRevenues() (gas: 244406) -Constructor_LockupDynamic_Integration_Concrete_Test:test_Constructor() (gas: 5301627) -Constructor_LockupLinear_Integration_Concrete_Test:test_Constructor() (gas: 4113621) -CreateWithDeltas_LockupDynamic_Integration_Concrete_Test:test_CreateWithDeltas() (gas: 376989) -CreateWithDeltas_LockupDynamic_Integration_Fuzz_Test:testFuzz_CreateWithDeltas((uint128,uint64,uint40)[]) (runs: 50, μ: 4097904, ~: 3555562) -CreateWithDurations_LockupLinear_Integration_Concrete_Test:test_CreateWithDurations() (gas: 282804) -CreateWithDurations_LockupLinear_Integration_Fuzz_Test:testFuzz_CreateWithDurations((uint40,uint40)) (runs: 50, μ: 283400, ~: 283496) -CreateWithMilestones_LockupDynamic_Integration_Concrete_Test:test_CreateWithMilestones() (gas: 365507) -CreateWithMilestones_LockupDynamic_Integration_Concrete_Test:test_CreateWithMilestones_AssetMissingReturnValue() (gas: 372340) -CreateWithMilestones_LockupDynamic_Integration_Fuzz_Test:testFuzz_CreateWithMilestones(address,(address,uint40,bool,address,uint128,address,(address,uint256),(uint128,uint64,uint40)[]),uint256) (runs: 50, μ: 3980454, ~: 3933203) -CreateWithRange_LockupLinear_Integration_Concrete_Test:test_CreateWithRange() (gas: 278259) -CreateWithRange_LockupLinear_Integration_Concrete_Test:test_CreateWithRange_AssetMissingReturnValue() (gas: 285026) -CreateWithRange_LockupLinear_Integration_Fuzz_Test:testFuzz_CreateWithRange(address,(address,address,uint128,address,bool,(uint40,uint40,uint40),(address,uint256)),uint256) (runs: 50, μ: 370254, ~: 369049) +CancelMultiple_LockupLinear_Integration_Concrete_Test:test_RevertGiven_AllStreamsCold() (gas: 32558) +CancelMultiple_LockupLinear_Integration_Concrete_Test:test_RevertGiven_AllStreamsNotCancelable() (gas: 579829) +CancelMultiple_LockupLinear_Integration_Concrete_Test:test_RevertGiven_OnlyNull() (gas: 12366) +CancelMultiple_LockupLinear_Integration_Concrete_Test:test_RevertGiven_SomeNull() (gas: 78359) +CancelMultiple_LockupLinear_Integration_Concrete_Test:test_RevertGiven_SomeStreamsCold() (gas: 245143) +CancelMultiple_LockupLinear_Integration_Concrete_Test:test_RevertGiven_SomeStreamsNotCancelable() (gas: 661591) +CancelMultiple_LockupLinear_Integration_Fuzz_Test:testFuzz_CancelMultiple(uint256,uint40) (runs: 50, μ: 801956, ~: 802941) +Cancel_LockupDynamic_Integration_Concrete_Test:test_Cancel_CallerRecipient() (gas: 391618) +Cancel_LockupDynamic_Integration_Concrete_Test:test_Cancel_CallerRecipient_SenderDoesNotImplementHook() (gas: 377197) +Cancel_LockupDynamic_Integration_Concrete_Test:test_Cancel_CallerRecipient_SenderNotContract() (gas: 100017) +Cancel_LockupDynamic_Integration_Concrete_Test:test_Cancel_CallerRecipient_SenderReentrancy() (gas: 379308) +Cancel_LockupDynamic_Integration_Concrete_Test:test_Cancel_CallerRecipient_SenderReverts() (gas: 377695) +Cancel_LockupDynamic_Integration_Concrete_Test:test_Cancel_CallerSender() (gas: 386708) +Cancel_LockupDynamic_Integration_Concrete_Test:test_Cancel_CallerSender_RecipientDoesNotImplementHook() (gas: 372228) +Cancel_LockupDynamic_Integration_Concrete_Test:test_Cancel_CallerSender_RecipientNotContract() (gas: 97299) +Cancel_LockupDynamic_Integration_Concrete_Test:test_Cancel_CallerSender_RecipientReentrancy() (gas: 374398) +Cancel_LockupDynamic_Integration_Concrete_Test:test_Cancel_CallerSender_RecipientReverts() (gas: 372763) +Cancel_LockupDynamic_Integration_Concrete_Test:test_Cancel_StatusPending() (gas: 76399) +Cancel_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11299) +Cancel_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StatusCanceled() (gas: 87330) +Cancel_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StatusDepleted() (gas: 65550) +Cancel_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StatusSettled() (gas: 29268) +Cancel_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StreamNotCancelable() (gas: 261722) +Cancel_LockupDynamic_Integration_Fuzz_Test:testFuzz_Cancel_CallerRecipient(uint256,uint128) (runs: 50, μ: 434849, ~: 435842) +Cancel_LockupDynamic_Integration_Fuzz_Test:testFuzz_Cancel_CallerSender(uint256,uint128) (runs: 50, μ: 453227, ~: 455450) +Cancel_LockupDynamic_Integration_Fuzz_Test:testFuzz_Cancel_StatusPending(uint256) (runs: 50, μ: 76963, ~: 77115) +Cancel_LockupLinear_Integration_Concrete_Test:test_Cancel_CallerRecipient() (gas: 274846) +Cancel_LockupLinear_Integration_Concrete_Test:test_Cancel_CallerRecipient_SenderDoesNotImplementHook() (gas: 260354) +Cancel_LockupLinear_Integration_Concrete_Test:test_Cancel_CallerRecipient_SenderNotContract() (gas: 80371) +Cancel_LockupLinear_Integration_Concrete_Test:test_Cancel_CallerRecipient_SenderReentrancy() (gas: 262451) +Cancel_LockupLinear_Integration_Concrete_Test:test_Cancel_CallerRecipient_SenderReverts() (gas: 260852) +Cancel_LockupLinear_Integration_Concrete_Test:test_Cancel_CallerSender() (gas: 269878) +Cancel_LockupLinear_Integration_Concrete_Test:test_Cancel_CallerSender_RecipientDoesNotImplementHook() (gas: 255372) +Cancel_LockupLinear_Integration_Concrete_Test:test_Cancel_CallerSender_RecipientNotContract() (gas: 77649) +Cancel_LockupLinear_Integration_Concrete_Test:test_Cancel_CallerSender_RecipientReentrancy() (gas: 257528) +Cancel_LockupLinear_Integration_Concrete_Test:test_Cancel_CallerSender_RecipientReverts() (gas: 255907) +Cancel_LockupLinear_Integration_Concrete_Test:test_Cancel_StatusPending() (gas: 76446) +Cancel_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11285) +Cancel_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StatusCanceled() (gas: 78038) +Cancel_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StatusDepleted() (gas: 65769) +Cancel_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StatusSettled() (gas: 29373) +Cancel_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StreamNotCancelable() (gas: 185888) +Cancel_LockupLinear_Integration_Fuzz_Test:testFuzz_Cancel_CallerRecipient(uint256,uint128) (runs: 50, μ: 291315, ~: 291257) +Cancel_LockupLinear_Integration_Fuzz_Test:testFuzz_Cancel_CallerSender(uint256,uint128) (runs: 50, μ: 310015, ~: 310670) +Cancel_LockupLinear_Integration_Fuzz_Test:testFuzz_Cancel_StatusPending(uint256) (runs: 50, μ: 76941, ~: 77016) +ClaimProtocolRevenues_LockupDynamic_Integration_Concrete_Test:test_ClaimProtocolRevenues() (gas: 319860) +ClaimProtocolRevenues_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_ProtocolRevenuesZero() (gas: 18973) +ClaimProtocolRevenues_LockupLinear_Integration_Concrete_Test:test_ClaimProtocolRevenues() (gas: 246630) +ClaimProtocolRevenues_LockupLinear_Integration_Concrete_Test:test_RevertGiven_ProtocolRevenuesZero() (gas: 18981) +Constructor_LockupDynamic_Integration_Concrete_Test:test_Constructor() (gas: 5410963) +Constructor_LockupLinear_Integration_Concrete_Test:test_Constructor() (gas: 4216694) +CreateWithDeltas_LockupDynamic_Integration_Concrete_Test:test_CreateWithDeltas() (gas: 380732) +CreateWithDeltas_LockupDynamic_Integration_Fuzz_Test:testFuzz_CreateWithDeltas((uint128,uint64,uint40)[]) (runs: 50, μ: 4100052, ~: 3555804) +CreateWithDurations_LockupLinear_Integration_Concrete_Test:test_CreateWithDurations() (gas: 287745) +CreateWithDurations_LockupLinear_Integration_Fuzz_Test:testFuzz_CreateWithDurations((uint40,uint40)) (runs: 50, μ: 286647, ~: 286702) +CreateWithMilestones_LockupDynamic_Integration_Concrete_Test:test_CreateWithMilestones() (gas: 370947) +CreateWithMilestones_LockupDynamic_Integration_Concrete_Test:test_CreateWithMilestones_AssetMissingReturnValue() (gas: 377735) +CreateWithMilestones_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_EndTimeNotInTheFuture() (gas: 47540) +CreateWithMilestones_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_ProtocolFeeTooHigh() (gas: 58079) +CreateWithMilestones_LockupDynamic_Integration_Fuzz_Test:testFuzz_CreateWithMilestones(address,(address,uint40,bool,bool,address,uint128,address,(address,uint256),(uint128,uint64,uint40)[]),uint256) (runs: 50, μ: 4646762, ~: 4503477) +CreateWithRange_LockupLinear_Integration_Concrete_Test:test_CreateWithRange() (gas: 283011) +CreateWithRange_LockupLinear_Integration_Concrete_Test:test_CreateWithRange_AssetMissingReturnValue() (gas: 289778) +CreateWithRange_LockupLinear_Integration_Concrete_Test:test_RevertGiven_EndTimeNotInTheFuture() (gas: 41154) +CreateWithRange_LockupLinear_Integration_Concrete_Test:test_RevertGiven_ProtocolFeeTooHigh() (gas: 51749) +CreateWithRange_LockupLinear_Integration_Fuzz_Test:testFuzz_CreateWithRange(address,(address,address,uint128,address,bool,bool,(uint40,uint40,uint40),(address,uint256)),uint256) (runs: 50, μ: 370169, ~: 370511) FlashFee_Integration_Concrete_Test:test_FlashFee() (gas: 50968) -FlashFee_Integration_Fuzz_Test:testFuzz_FlashFee(uint256,uint256) (runs: 50, μ: 51825, ~: 52081) -FlashFee_Unit_Concrete_Test:test_FlashFee() (gas: 38333) -FlashFee_Unit_Concrete_Test:test_FlashFee_Zero() (gas: 7703) +FlashFee_Integration_Concrete_Test:test_RevertGiven_AssetNotFlashLoanable() (gas: 18626) +FlashFee_Integration_Fuzz_Test:testFuzz_FlashFee(uint256,uint256) (runs: 50, μ: 51839, ~: 52081) FlashLoanFunction_Integration_Concrete_Test:test_FlashLoan() (gas: 402140) -FlashLoanFunction_Integration_Fuzz_Test:testFuzz_FlashLoanFunction(uint256,uint128,bytes) (runs: 50, μ: 403379, ~: 407116) +FlashLoanFunction_Integration_Concrete_Test:test_RevertGiven_AssetNotFlashLoanable() (gas: 21603) +FlashLoanFunction_Integration_Fuzz_Test:testFuzz_FlashLoanFunction(uint256,uint128,bytes) (runs: 50, μ: 403410, ~: 407188) GenerateAccentColor_Integration_Concrete_Test:test_GenerateAccentColor() (gas: 12968) -GetAsset_LockupDynamic_Integration_Concrete_Test:test_GetAsset() (gas: 304908) -GetAsset_LockupLinear_Integration_Concrete_Test:test_GetAsset() (gas: 232195) -GetCliffTime_LockupLinear_Integration_Concrete_Test:test_GetCliffTime() (gas: 232745) -GetDepositedAmount_LockupDynamic_Integration_Concrete_Test:test_GetDepositedAmount() (gas: 307727) -GetDepositedAmount_LockupLinear_Integration_Concrete_Test:test_GetDepositedAmount() (gas: 235010) -GetEndTime_LockupDynamic_Integration_Concrete_Test:test_GetEndTime() (gas: 307525) -GetEndTime_LockupLinear_Integration_Concrete_Test:test_GetEndTime() (gas: 234884) -GetRange_LockupDynamic_Integration_Concrete_Test:test_GetRange() (gas: 306932) -GetRange_LockupLinear_Integration_Concrete_Test:test_GetRange() (gas: 235033) -GetRecipient_LockupDynamic_Integration_Concrete_Test:test_GetRecipient() (gas: 12630) -GetRecipient_LockupLinear_Integration_Concrete_Test:test_GetRecipient() (gas: 12654) -GetRefundedAmount_LockupDynamic_Integration_Concrete_Test:test_GetRefundedAmount_StatusDepleted() (gas: 360020) -GetRefundedAmount_LockupDynamic_Integration_Concrete_Test:test_GetRefundedAmount_StatusPending() (gas: 329847) -GetRefundedAmount_LockupDynamic_Integration_Concrete_Test:test_GetRefundedAmount_StatusSettled() (gas: 335055) -GetRefundedAmount_LockupDynamic_Integration_Concrete_Test:test_GetRefundedAmount_StatusStreaming() (gas: 335069) -GetRefundedAmount_LockupDynamic_Integration_Concrete_Test:test_GetRefundedAmount_StreamHasBeenCanceled_StatusCanceled() (gas: 374400) -GetRefundedAmount_LockupDynamic_Integration_Concrete_Test:test_GetRefundedAmount_StreamHasBeenCanceled_StatusDepleted() (gas: 396242) -GetRefundedAmount_LockupLinear_Integration_Concrete_Test:test_GetRefundedAmount_StatusDepleted() (gas: 285519) -GetRefundedAmount_LockupLinear_Integration_Concrete_Test:test_GetRefundedAmount_StatusPending() (gas: 255146) -GetRefundedAmount_LockupLinear_Integration_Concrete_Test:test_GetRefundedAmount_StatusSettled() (gas: 260354) -GetRefundedAmount_LockupLinear_Integration_Concrete_Test:test_GetRefundedAmount_StatusStreaming() (gas: 260368) -GetRefundedAmount_LockupLinear_Integration_Concrete_Test:test_GetRefundedAmount_StreamHasBeenCanceled_StatusCanceled() (gas: 296443) -GetRefundedAmount_LockupLinear_Integration_Concrete_Test:test_GetRefundedAmount_StreamHasBeenCanceled_StatusDepleted() (gas: 318241) -GetSegments_LockupDynamic_Integration_Concrete_Test:test_GetSegments() (gas: 312411) -GetSender_LockupDynamic_Integration_Concrete_Test:test_GetSender() (gas: 304626) -GetSender_LockupLinear_Integration_Concrete_Test:test_GetSender() (gas: 231929) -GetStartTime_LockupDynamic_Integration_Concrete_Test:test_GetStartTime() (gas: 307832) -GetStartTime_LockupLinear_Integration_Concrete_Test:test_GetStartTime() (gas: 235141) -GetStream_LockupDynamic_Integration_Concrete_Test:test_GetStream() (gas: 275361) -GetStream_LockupDynamic_Integration_Concrete_Test:test_GetStream_StatusSettled() (gas: 51468) -GetStream_LockupLinear_Integration_Concrete_Test:test_GetStream() (gas: 34457) -GetStream_LockupLinear_Integration_Concrete_Test:test_GetStream_StatusSettled() (gas: 38946) -GetWithdrawnAmount_LockupDynamic_Integration_Concrete_Test:test_GetWithdrawnAmount() (gas: 381641) -GetWithdrawnAmount_LockupDynamic_Integration_Concrete_Test:test_GetWithdrawnAmount_NoPreviousWithdrawals() (gas: 333074) -GetWithdrawnAmount_LockupDynamic_Integration_Fuzz_Test:testFuzz_GetWithdrawnAmount(uint256,uint128) (runs: 50, μ: 384690, ~: 385328) -GetWithdrawnAmount_LockupDynamic_Integration_Fuzz_Test:testFuzz_GetWithdrawnAmount_NoPreviousWithdrawals(uint256) (runs: 50, μ: 334801, ~: 334953) -GetWithdrawnAmount_LockupLinear_Integration_Concrete_Test:test_GetWithdrawnAmount() (gas: 279721) -GetWithdrawnAmount_LockupLinear_Integration_Concrete_Test:test_GetWithdrawnAmount_NoPreviousWithdrawals() (gas: 260373) -GetWithdrawnAmount_LockupLinear_Integration_Fuzz_Test:testFuzz_GetWithdrawnAmount(uint256,uint128) (runs: 50, μ: 282907, ~: 282863) -GetWithdrawnAmount_LockupLinear_Integration_Fuzz_Test:testFuzz_GetWithdrawnAmount_NoPreviousWithdrawals(uint256) (runs: 50, μ: 262086, ~: 262252) -IsCancelable_LockupDynamic_Integration_Concrete_Test:test_IsCancelable() (gas: 510191) -IsCancelable_LockupDynamic_Integration_Concrete_Test:test_IsCancelable_Cold() (gas: 333252) -IsCancelable_LockupDynamic_Integration_Concrete_Test:test_IsCancelable_StreamCancelable() (gas: 324518) -IsCancelable_LockupLinear_Integration_Concrete_Test:test_IsCancelable() (gas: 368272) -IsCancelable_LockupLinear_Integration_Concrete_Test:test_IsCancelable_Cold() (gas: 260725) -IsCancelable_LockupLinear_Integration_Concrete_Test:test_IsCancelable_StreamCancelable() (gas: 251874) -IsCold_LockupDynamic_Integration_Concrete_Test:test_IsCold_StatusCanceled() (gas: 373153) -IsCold_LockupDynamic_Integration_Concrete_Test:test_IsCold_StatusDepleted() (gas: 359721) -IsCold_LockupDynamic_Integration_Concrete_Test:test_IsCold_StatusPending() (gas: 327808) -IsCold_LockupDynamic_Integration_Concrete_Test:test_IsCold_StatusSettled() (gas: 333578) -IsCold_LockupDynamic_Integration_Concrete_Test:test_IsCold_StatusStreaming() (gas: 349896) -IsCold_LockupLinear_Integration_Concrete_Test:test_IsCold_StatusCanceled() (gas: 295291) -IsCold_LockupLinear_Integration_Concrete_Test:test_IsCold_StatusDepleted() (gas: 285322) -IsCold_LockupLinear_Integration_Concrete_Test:test_IsCold_StatusPending() (gas: 255209) -IsCold_LockupLinear_Integration_Concrete_Test:test_IsCold_StatusSettled() (gas: 261091) -IsCold_LockupLinear_Integration_Concrete_Test:test_IsCold_StatusStreaming() (gas: 261670) -IsDepleted_LockupDynamic_Integration_Concrete_Test:test_IsDepleted() (gas: 359126) -IsDepleted_LockupDynamic_Integration_Concrete_Test:test_IsDepleted_StreamNotDepleted() (gas: 323942) -IsDepleted_LockupLinear_Integration_Concrete_Test:test_IsDepleted() (gas: 284667) -IsDepleted_LockupLinear_Integration_Concrete_Test:test_IsDepleted_StreamNotDepleted() (gas: 251283) -IsStream_LockupDynamic_Integration_Concrete_Test:test_IsStream() (gas: 324260) -IsStream_LockupDynamic_Integration_Concrete_Test:test_IsStream_Null() (gas: 8505) -IsStream_LockupLinear_Integration_Concrete_Test:test_IsStream() (gas: 251601) -IsStream_LockupLinear_Integration_Concrete_Test:test_IsStream_Null() (gas: 8548) -IsWarm_LockupDynamic_Integration_Concrete_Test:test_IsWarm_StatusCanceled() (gas: 372669) -IsWarm_LockupDynamic_Integration_Concrete_Test:test_IsWarm_StatusDepleted() (gas: 359213) -IsWarm_LockupDynamic_Integration_Concrete_Test:test_IsWarm_StatusPending() (gas: 327267) -IsWarm_LockupDynamic_Integration_Concrete_Test:test_IsWarm_StatusSettled() (gas: 333145) -IsWarm_LockupDynamic_Integration_Concrete_Test:test_IsWarm_StatusStreaming() (gas: 349315) -IsWarm_LockupLinear_Integration_Concrete_Test:test_IsWarm_StatusCanceled() (gas: 294776) -IsWarm_LockupLinear_Integration_Concrete_Test:test_IsWarm_StatusDepleted() (gas: 284776) -IsWarm_LockupLinear_Integration_Concrete_Test:test_IsWarm_StatusPending() (gas: 254630) -IsWarm_LockupLinear_Integration_Concrete_Test:test_IsWarm_StatusSettled() (gas: 260630) -IsWarm_LockupLinear_Integration_Concrete_Test:test_IsWarm_StatusStreaming() (gas: 261051) +GetAsset_LockupDynamic_Integration_Concrete_Test:test_GetAsset() (gas: 307738) +GetAsset_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 12049) +GetAsset_LockupLinear_Integration_Concrete_Test:test_GetAsset() (gas: 234488) +GetAsset_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 12035) +GetCliffTime_LockupLinear_Integration_Concrete_Test:test_GetCliffTime() (gas: 234972) +GetCliffTime_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11392) +GetDepositedAmount_LockupDynamic_Integration_Concrete_Test:test_GetDepositedAmount() (gas: 310535) +GetDepositedAmount_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11682) +GetDepositedAmount_LockupLinear_Integration_Concrete_Test:test_GetDepositedAmount() (gas: 237259) +GetDepositedAmount_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11678) +GetEndTime_LockupDynamic_Integration_Concrete_Test:test_GetEndTime() (gas: 310333) +GetEndTime_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11538) +GetEndTime_LockupLinear_Integration_Concrete_Test:test_GetEndTime() (gas: 237111) +GetEndTime_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11546) +GetRange_LockupDynamic_Integration_Concrete_Test:test_GetRange() (gas: 309759) +GetRange_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 13125) +GetRange_LockupLinear_Integration_Concrete_Test:test_GetRange() (gas: 237329) +GetRange_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 13308) +GetRecipient_LockupDynamic_Integration_Concrete_Test:test_GetRecipient() (gas: 12585) +GetRecipient_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_NFTBurned() (gas: 72366) +GetRecipient_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 10989) +GetRecipient_LockupLinear_Integration_Concrete_Test:test_GetRecipient() (gas: 12565) +GetRecipient_LockupLinear_Integration_Concrete_Test:test_RevertGiven_NFTBurned() (gas: 72592) +GetRecipient_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 10993) +GetRefundedAmount_LockupDynamic_Integration_Concrete_Test:test_GetRefundedAmount_StatusDepleted() (gas: 362872) +GetRefundedAmount_LockupDynamic_Integration_Concrete_Test:test_GetRefundedAmount_StatusPending() (gas: 332677) +GetRefundedAmount_LockupDynamic_Integration_Concrete_Test:test_GetRefundedAmount_StatusSettled() (gas: 337885) +GetRefundedAmount_LockupDynamic_Integration_Concrete_Test:test_GetRefundedAmount_StatusStreaming() (gas: 337899) +GetRefundedAmount_LockupDynamic_Integration_Concrete_Test:test_GetRefundedAmount_StreamHasBeenCanceled_StatusCanceled() (gas: 377267) +GetRefundedAmount_LockupDynamic_Integration_Concrete_Test:test_GetRefundedAmount_StreamHasBeenCanceled_StatusDepleted() (gas: 399131) +GetRefundedAmount_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 12045) +GetRefundedAmount_LockupLinear_Integration_Concrete_Test:test_GetRefundedAmount_StatusDepleted() (gas: 287867) +GetRefundedAmount_LockupLinear_Integration_Concrete_Test:test_GetRefundedAmount_StatusPending() (gas: 257439) +GetRefundedAmount_LockupLinear_Integration_Concrete_Test:test_GetRefundedAmount_StatusSettled() (gas: 262647) +GetRefundedAmount_LockupLinear_Integration_Concrete_Test:test_GetRefundedAmount_StatusStreaming() (gas: 262661) +GetRefundedAmount_LockupLinear_Integration_Concrete_Test:test_GetRefundedAmount_StreamHasBeenCanceled_StatusCanceled() (gas: 298747) +GetRefundedAmount_LockupLinear_Integration_Concrete_Test:test_GetRefundedAmount_StreamHasBeenCanceled_StatusDepleted() (gas: 320600) +GetRefundedAmount_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 12031) +GetSegments_LockupDynamic_Integration_Concrete_Test:test_GetSegments() (gas: 315237) +GetSegments_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 13758) +GetSender_LockupDynamic_Integration_Concrete_Test:test_GetSender() (gas: 307456) +GetSender_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11814) +GetSender_LockupLinear_Integration_Concrete_Test:test_GetSender() (gas: 234222) +GetSender_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11816) +GetStartTime_LockupDynamic_Integration_Concrete_Test:test_GetStartTime() (gas: 310662) +GetStartTime_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11823) +GetStartTime_LockupLinear_Integration_Concrete_Test:test_GetStartTime() (gas: 237434) +GetStartTime_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11831) +GetStream_LockupDynamic_Integration_Concrete_Test:test_GetStream() (gas: 278699) +GetStream_LockupDynamic_Integration_Concrete_Test:test_GetStream_StatusSettled() (gas: 52024) +GetStream_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 15544) +GetStream_LockupLinear_Integration_Concrete_Test:test_GetStream() (gas: 34920) +GetStream_LockupLinear_Integration_Concrete_Test:test_GetStream_StatusSettled() (gas: 39431) +GetStream_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 14299) +GetWithdrawnAmount_LockupDynamic_Integration_Concrete_Test:test_GetWithdrawnAmount() (gas: 384565) +GetWithdrawnAmount_LockupDynamic_Integration_Concrete_Test:test_GetWithdrawnAmount_NoPreviousWithdrawals() (gas: 335859) +GetWithdrawnAmount_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 12012) +GetWithdrawnAmount_LockupDynamic_Integration_Fuzz_Test:testFuzz_GetWithdrawnAmount(uint256,uint128) (runs: 50, μ: 387601, ~: 388165) +GetWithdrawnAmount_LockupDynamic_Integration_Fuzz_Test:testFuzz_GetWithdrawnAmount_NoPreviousWithdrawals(uint256) (runs: 50, μ: 337603, ~: 337783) +GetWithdrawnAmount_LockupLinear_Integration_Concrete_Test:test_GetWithdrawnAmount() (gas: 282047) +GetWithdrawnAmount_LockupLinear_Integration_Concrete_Test:test_GetWithdrawnAmount_NoPreviousWithdrawals() (gas: 262621) +GetWithdrawnAmount_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11998) +GetWithdrawnAmount_LockupLinear_Integration_Fuzz_Test:testFuzz_GetWithdrawnAmount(uint256,uint128) (runs: 50, μ: 285233, ~: 285189) +GetWithdrawnAmount_LockupLinear_Integration_Fuzz_Test:testFuzz_GetWithdrawnAmount_NoPreviousWithdrawals(uint256) (runs: 50, μ: 264296, ~: 264259) +IsCancelable_LockupDynamic_Integration_Concrete_Test:test_IsCancelable() (gas: 515823) +IsCancelable_LockupDynamic_Integration_Concrete_Test:test_IsCancelable_Cold() (gas: 336082) +IsCancelable_LockupDynamic_Integration_Concrete_Test:test_IsCancelable_StreamCancelable() (gas: 327326) +IsCancelable_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11239) +IsCancelable_LockupLinear_Integration_Concrete_Test:test_IsCancelable() (gas: 372821) +IsCancelable_LockupLinear_Integration_Concrete_Test:test_IsCancelable_Cold() (gas: 262996) +IsCancelable_LockupLinear_Integration_Concrete_Test:test_IsCancelable_StreamCancelable() (gas: 254123) +IsCancelable_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11263) +IsCold_LockupDynamic_Integration_Concrete_Test:test_IsCold_StatusCanceled() (gas: 375998) +IsCold_LockupDynamic_Integration_Concrete_Test:test_IsCold_StatusDepleted() (gas: 362551) +IsCold_LockupDynamic_Integration_Concrete_Test:test_IsCold_StatusPending() (gas: 330616) +IsCold_LockupDynamic_Integration_Concrete_Test:test_IsCold_StatusSettled() (gas: 336386) +IsCold_LockupDynamic_Integration_Concrete_Test:test_IsCold_StatusStreaming() (gas: 352696) +IsCold_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11558) +IsCold_LockupLinear_Integration_Concrete_Test:test_IsCold_StatusCanceled() (gas: 297529) +IsCold_LockupLinear_Integration_Concrete_Test:test_IsCold_StatusDepleted() (gas: 287604) +IsCold_LockupLinear_Integration_Concrete_Test:test_IsCold_StatusPending() (gas: 257436) +IsCold_LockupLinear_Integration_Concrete_Test:test_IsCold_StatusSettled() (gas: 263318) +IsCold_LockupLinear_Integration_Concrete_Test:test_IsCold_StatusStreaming() (gas: 263853) +IsCold_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11601) +IsDepleted_LockupDynamic_Integration_Concrete_Test:test_IsDepleted() (gas: 361956) +IsDepleted_LockupDynamic_Integration_Concrete_Test:test_IsDepleted_StreamNotDepleted() (gas: 326750) +IsDepleted_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11191) +IsDepleted_LockupLinear_Integration_Concrete_Test:test_IsDepleted() (gas: 286971) +IsDepleted_LockupLinear_Integration_Concrete_Test:test_IsDepleted_StreamNotDepleted() (gas: 253532) +IsDepleted_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11212) +IsStream_LockupDynamic_Integration_Concrete_Test:test_IsStream() (gas: 327090) +IsStream_LockupDynamic_Integration_Concrete_Test:test_IsStream_Null() (gas: 8527) +IsStream_LockupLinear_Integration_Concrete_Test:test_IsStream() (gas: 253894) +IsStream_LockupLinear_Integration_Concrete_Test:test_IsStream_Null() (gas: 8570) +IsTransferable_LockupDynamic_Integration_Concrete_Test:test_IsTransferrable_Stream() (gas: 327274) +IsTransferable_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11674) +IsTransferable_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StreamTransferNotEnabled() (gas: 515789) +IsTransferable_LockupLinear_Integration_Concrete_Test:test_IsTransferrable_Stream() (gas: 254100) +IsTransferable_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11739) +IsTransferable_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StreamTransferNotEnabled() (gas: 372843) +IsWarm_LockupDynamic_Integration_Concrete_Test:test_IsWarm_StatusCanceled() (gas: 375536) +IsWarm_LockupDynamic_Integration_Concrete_Test:test_IsWarm_StatusDepleted() (gas: 362065) +IsWarm_LockupDynamic_Integration_Concrete_Test:test_IsWarm_StatusPending() (gas: 330053) +IsWarm_LockupDynamic_Integration_Concrete_Test:test_IsWarm_StatusSettled() (gas: 335997) +IsWarm_LockupDynamic_Integration_Concrete_Test:test_IsWarm_StatusStreaming() (gas: 352181) +IsWarm_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11118) +IsWarm_LockupLinear_Integration_Concrete_Test:test_IsWarm_StatusCanceled() (gas: 297036) +IsWarm_LockupLinear_Integration_Concrete_Test:test_IsWarm_StatusDepleted() (gas: 287080) +IsWarm_LockupLinear_Integration_Concrete_Test:test_IsWarm_StatusPending() (gas: 256835) +IsWarm_LockupLinear_Integration_Concrete_Test:test_IsWarm_StatusSettled() (gas: 262901) +IsWarm_LockupLinear_Integration_Concrete_Test:test_IsWarm_StatusStreaming() (gas: 263300) +IsWarm_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11139) MapSymbol_Integration_Concrete_Test:test_MapSymbol_LockupDynamic() (gas: 16959) -MapSymbol_Integration_Concrete_Test:test_MapSymbol_LockupLinear() (gas: 16777) +MapSymbol_Integration_Concrete_Test:test_MapSymbol_LockupLinear() (gas: 16733) +MapSymbol_Integration_Concrete_Test:test_RevertGiven_UnknownNFT() (gas: 1037150) MaxFlashLoan_Integration_Concrete_Test:test_MaxFlashLoan() (gas: 178987) MaxFlashLoan_Integration_Concrete_Test:test_MaxFlashLoan_AssetNotFlashLoanable() (gas: 15248) -MaxFlashLoan_Integration_Fuzz_Test:testFuzz_MaxFlashLoan(uint256) (runs: 50, μ: 178980, ~: 178996) +MaxFlashLoan_Integration_Fuzz_Test:testFuzz_MaxFlashLoan(uint256) (runs: 50, μ: 178984, ~: 179004) ProtocolFees_Integration_Concrete_Test:test_ProtocolFees() (gas: 41254) ProtocolFees_Integration_Concrete_Test:test_ProtocolFees_ProtocolFeeNotSet() (gas: 9943) -ProtocolRevenues_LockupDynamic_Integration_Concrete_Test:test_ProtocolRevenues() (gas: 317399) +ProtocolRevenues_LockupDynamic_Integration_Concrete_Test:test_ProtocolRevenues() (gas: 320207) ProtocolRevenues_LockupDynamic_Integration_Concrete_Test:test_ProtocolRevenues_ProtocolRevenuesZero() (gas: 10125) -ProtocolRevenues_LockupLinear_Integration_Concrete_Test:test_ProtocolRevenues() (gas: 244717) -ProtocolRevenues_LockupLinear_Integration_Concrete_Test:test_ProtocolRevenues_ProtocolRevenuesZero() (gas: 10133) -RefundableAmountOf_LockupDynamic_Integration_Concrete_Test:test_RefundableAmountOf_StatusDepleted() (gas: 359163) -RefundableAmountOf_LockupDynamic_Integration_Concrete_Test:test_RefundableAmountOf_StatusPending() (gas: 333012) -RefundableAmountOf_LockupDynamic_Integration_Concrete_Test:test_RefundableAmountOf_StatusSettled() (gas: 333005) -RefundableAmountOf_LockupDynamic_Integration_Concrete_Test:test_RefundableAmountOf_StatusStreaming() (gas: 339838) -RefundableAmountOf_LockupDynamic_Integration_Concrete_Test:test_RefundableAmountOf_StreamHasBeenCanceled_StatusCanceled() (gas: 372545) -RefundableAmountOf_LockupDynamic_Integration_Concrete_Test:test_RefundableAmountOf_StreamHasBeenCanceled_StatusDepleted() (gas: 395772) -RefundableAmountOf_LockupDynamic_Integration_Concrete_Test:test_RefundableAmountOf_StreamNotCancelable() (gas: 517772) -RefundableAmountOf_LockupDynamic_Integration_Fuzz_Test:testFuzz_RefundableAmountOf(uint256) (runs: 50, μ: 46751, ~: 30742) -RefundableAmountOf_LockupLinear_Integration_Concrete_Test:test_RefundableAmountOf_StatusDepleted() (gas: 284678) -RefundableAmountOf_LockupLinear_Integration_Concrete_Test:test_RefundableAmountOf_StatusPending() (gas: 260318) -RefundableAmountOf_LockupLinear_Integration_Concrete_Test:test_RefundableAmountOf_StatusSettled() (gas: 260441) -RefundableAmountOf_LockupLinear_Integration_Concrete_Test:test_RefundableAmountOf_StatusStreaming() (gas: 261928) -RefundableAmountOf_LockupLinear_Integration_Concrete_Test:test_RefundableAmountOf_StreamHasBeenCanceled_StatusCanceled() (gas: 294604) -RefundableAmountOf_LockupLinear_Integration_Concrete_Test:test_RefundableAmountOf_StreamHasBeenCanceled_StatusDepleted() (gas: 317787) -RefundableAmountOf_LockupLinear_Integration_Concrete_Test:test_RefundableAmountOf_StreamNotCancelable() (gas: 375836) -RefundableAmountOf_LockupLinear_Integration_Fuzz_Test:testFuzz_RefundableAmountOf(uint256) (runs: 50, μ: 30756, ~: 30880) -Renounce_LockupDynamic_Integration_Concrete_Test:test_Renounce() (gas: 685980) -Renounce_LockupDynamic_Integration_Concrete_Test:test_Renounce_RecipientDoesNotImplementHook() (gas: 678983) -Renounce_LockupDynamic_Integration_Concrete_Test:test_Renounce_RecipientNotContract() (gas: 289776) -Renounce_LockupDynamic_Integration_Concrete_Test:test_Renounce_RecipientReentrancy() (gas: 684192) -Renounce_LockupDynamic_Integration_Concrete_Test:test_Renounce_RecipientReverts() (gas: 679634) -Renounce_LockupLinear_Integration_Concrete_Test:test_Renounce() (gas: 474755) -Renounce_LockupLinear_Integration_Concrete_Test:test_Renounce_RecipientDoesNotImplementHook() (gas: 467756) -Renounce_LockupLinear_Integration_Concrete_Test:test_Renounce_RecipientNotContract() (gas: 217209) -Renounce_LockupLinear_Integration_Concrete_Test:test_Renounce_RecipientReentrancy() (gas: 473025) -Renounce_LockupLinear_Integration_Concrete_Test:test_Renounce_RecipientReverts() (gas: 468407) +ProtocolRevenues_LockupLinear_Integration_Concrete_Test:test_ProtocolRevenues() (gas: 246966) +ProtocolRevenues_LockupLinear_Integration_Concrete_Test:test_ProtocolRevenues_ProtocolRevenuesZero() (gas: 10111) +RefundableAmountOf_LockupDynamic_Integration_Concrete_Test:test_RefundableAmountOf_StatusDepleted() (gas: 361993) +RefundableAmountOf_LockupDynamic_Integration_Concrete_Test:test_RefundableAmountOf_StatusPending() (gas: 335820) +RefundableAmountOf_LockupDynamic_Integration_Concrete_Test:test_RefundableAmountOf_StatusSettled() (gas: 335813) +RefundableAmountOf_LockupDynamic_Integration_Concrete_Test:test_RefundableAmountOf_StatusStreaming() (gas: 342682) +RefundableAmountOf_LockupDynamic_Integration_Concrete_Test:test_RefundableAmountOf_StreamHasBeenCanceled_StatusCanceled() (gas: 375412) +RefundableAmountOf_LockupDynamic_Integration_Concrete_Test:test_RefundableAmountOf_StreamHasBeenCanceled_StatusDepleted() (gas: 398639) +RefundableAmountOf_LockupDynamic_Integration_Concrete_Test:test_RefundableAmountOf_StreamNotCancelable() (gas: 523449) +RefundableAmountOf_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11099) +RefundableAmountOf_LockupDynamic_Integration_Fuzz_Test:testFuzz_RefundableAmountOf(uint256) (runs: 50, μ: 48250, ~: 63808) +RefundableAmountOf_LockupLinear_Integration_Concrete_Test:test_RefundableAmountOf_StatusDepleted() (gas: 287004) +RefundableAmountOf_LockupLinear_Integration_Concrete_Test:test_RefundableAmountOf_StatusPending() (gas: 262589) +RefundableAmountOf_LockupLinear_Integration_Concrete_Test:test_RefundableAmountOf_StatusSettled() (gas: 262712) +RefundableAmountOf_LockupLinear_Integration_Concrete_Test:test_RefundableAmountOf_StatusStreaming() (gas: 264199) +RefundableAmountOf_LockupLinear_Integration_Concrete_Test:test_RefundableAmountOf_StreamHasBeenCanceled_StatusCanceled() (gas: 296908) +RefundableAmountOf_LockupLinear_Integration_Concrete_Test:test_RefundableAmountOf_StreamHasBeenCanceled_StatusDepleted() (gas: 320124) +RefundableAmountOf_LockupLinear_Integration_Concrete_Test:test_RefundableAmountOf_StreamNotCancelable() (gas: 380452) +RefundableAmountOf_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11110) +RefundableAmountOf_LockupLinear_Integration_Fuzz_Test:testFuzz_RefundableAmountOf(uint256) (runs: 50, μ: 30700, ~: 30858) +Renounce_LockupDynamic_Integration_Concrete_Test:test_Renounce() (gas: 694529) +Renounce_LockupDynamic_Integration_Concrete_Test:test_Renounce_RecipientDoesNotImplementHook() (gas: 687576) +Renounce_LockupDynamic_Integration_Concrete_Test:test_Renounce_RecipientNotContract() (gas: 292583) +Renounce_LockupDynamic_Integration_Concrete_Test:test_Renounce_RecipientReentrancy() (gas: 692741) +Renounce_LockupDynamic_Integration_Concrete_Test:test_Renounce_RecipientReverts() (gas: 688183) +Renounce_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11564) +Renounce_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StatusCanceled() (gas: 87127) +Renounce_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StatusDepleted() (gas: 68421) +Renounce_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StatusSettled() (gas: 24707) +Renounce_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StreamNotCancelable() (gas: 649813) +Renounce_LockupLinear_Integration_Concrete_Test:test_Renounce() (gas: 481658) +Renounce_LockupLinear_Integration_Concrete_Test:test_Renounce_RecipientDoesNotImplementHook() (gas: 474703) +Renounce_LockupLinear_Integration_Concrete_Test:test_Renounce_RecipientNotContract() (gas: 219414) +Renounce_LockupLinear_Integration_Concrete_Test:test_Renounce_RecipientReentrancy() (gas: 479840) +Renounce_LockupLinear_Integration_Concrete_Test:test_Renounce_RecipientReverts() (gas: 475310) +Renounce_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11575) +Renounce_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StatusCanceled() (gas: 77847) +Renounce_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StatusDepleted() (gas: 68656) +Renounce_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StatusSettled() (gas: 24822) +Renounce_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StreamNotCancelable() (gas: 436988) SafeAssetDecimals_Integration_Concrete_Test:test_SafeAssetDecimals() (gas: 12117) SafeAssetDecimals_Integration_Concrete_Test:test_SafeAssetDecimals_DecimalsNotImplemented() (gas: 10852) SafeAssetDecimals_Integration_Concrete_Test:test_SafeAssetDecimals_EOA() (gas: 11625) @@ -178,125 +271,155 @@ SafeAssetSymbol_Integration_Concrete_Test:test_SafeAssetSymbol_LongSymbol() (gas SafeAssetSymbol_Integration_Concrete_Test:test_SafeAssetSymbol_SymbolNotImplemented() (gas: 12399) SetComptroller_LockupDynamic_Integration_Concrete_Test:test_SetComptroller_NewComptroller() (gas: 309153) SetComptroller_LockupDynamic_Integration_Concrete_Test:test_SetComptroller_SameComptroller() (gas: 23283) -SetComptroller_LockupLinear_Integration_Concrete_Test:test_SetComptroller_NewComptroller() (gas: 309238) -SetComptroller_LockupLinear_Integration_Concrete_Test:test_SetComptroller_SameComptroller() (gas: 23368) -SetFlashFee_Integration_Concrete_Test:test_SetFlashFee() (gas: 44409) -SetFlashFee_Integration_Concrete_Test:test_SetFlashFee_SameFee() (gas: 21981) -SetFlashFee_Integration_Fuzz_Test:testFuzz_SetFlashFee(uint256) (runs: 50, μ: 37754, ~: 39448) -SetNFTDescriptor_LockupDynamic_Integration_Concrete_Test:test_SetNFTDescriptor_NewNFTDescriptor() (gas: 6558206) -SetNFTDescriptor_LockupDynamic_Integration_Concrete_Test:test_SetNFTDescriptor_SameNFTDescriptor() (gas: 2259730) -SetNFTDescriptor_LockupLinear_Integration_Concrete_Test:test_SetNFTDescriptor_NewNFTDescriptor() (gas: 6557611) -SetNFTDescriptor_LockupLinear_Integration_Concrete_Test:test_SetNFTDescriptor_SameNFTDescriptor() (gas: 2259015) +SetComptroller_LockupLinear_Integration_Concrete_Test:test_SetComptroller_NewComptroller() (gas: 309150) +SetComptroller_LockupLinear_Integration_Concrete_Test:test_SetComptroller_SameComptroller() (gas: 23280) +SetFlashFee_Integration_Fuzz_Test:testFuzz_SetFlashFee(uint256) (runs: 50, μ: 37809, ~: 40020) +SetNFTDescriptor_LockupDynamic_Integration_Concrete_Test:test_SetNFTDescriptor_NewNFTDescriptor() (gas: 6542473) +SetNFTDescriptor_LockupDynamic_Integration_Concrete_Test:test_SetNFTDescriptor_SameNFTDescriptor() (gas: 2251619) +SetNFTDescriptor_LockupLinear_Integration_Concrete_Test:test_SetNFTDescriptor_NewNFTDescriptor() (gas: 6541265) +SetNFTDescriptor_LockupLinear_Integration_Concrete_Test:test_SetNFTDescriptor_SameNFTDescriptor() (gas: 2250276) SetProtocolFee_Integration_Concrete_Test:test_SetProtocolFee() (gas: 47804) SetProtocolFee_Integration_Concrete_Test:test_SetProtocolFee_SameFee() (gas: 22636) -SetProtocolFee_Integration_Fuzz_Test:testFuzz_SetProtocolFee(uint256) (runs: 50, μ: 43131, ~: 43074) -StatusOf_LockupDynamic_Integration_Concrete_Test:test_StatusOf() (gas: 349974) -StatusOf_LockupDynamic_Integration_Concrete_Test:test_StatusOf_AssetsFullyWithdrawn() (gas: 359860) -StatusOf_LockupDynamic_Integration_Concrete_Test:test_StatusOf_RefundableAmountNotZero() (gas: 333790) -StatusOf_LockupDynamic_Integration_Concrete_Test:test_StatusOf_StartTimeInTheFuture() (gas: 327889) -StatusOf_LockupDynamic_Integration_Concrete_Test:test_StatusOf_StreamCanceled() (gas: 373305) -StatusOf_LockupLinear_Integration_Concrete_Test:test_StatusOf() (gas: 261080) -StatusOf_LockupLinear_Integration_Concrete_Test:test_StatusOf_AssetsFullyWithdrawn() (gas: 285393) -StatusOf_LockupLinear_Integration_Concrete_Test:test_StatusOf_RefundableAmountNotZero() (gas: 261245) -StatusOf_LockupLinear_Integration_Concrete_Test:test_StatusOf_StartTimeInTheFuture() (gas: 255222) -StatusOf_LockupLinear_Integration_Concrete_Test:test_StatusOf_StreamCanceled() (gas: 295382) -StreamedAmountOf_LockupDynamic_Integration_Concrete_Test:test_StreamedAmountOf_CurrentMilestone1st() (gas: 45895) -StreamedAmountOf_LockupDynamic_Integration_Concrete_Test:test_StreamedAmountOf_CurrentMilestoneNot1st() (gas: 50716) -StreamedAmountOf_LockupDynamic_Integration_Concrete_Test:test_StreamedAmountOf_OneSegment() (gas: 254129) +SetProtocolFee_Integration_Fuzz_Test:testFuzz_SetProtocolFee(uint256) (runs: 50, μ: 43089, ~: 43074) +StatusOf_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11684) +StatusOf_LockupDynamic_Integration_Concrete_Test:test_StatusOf() (gas: 352818) +StatusOf_LockupDynamic_Integration_Concrete_Test:test_StatusOf_AssetsFullyWithdrawn() (gas: 362690) +StatusOf_LockupDynamic_Integration_Concrete_Test:test_StatusOf_RefundableAmountNotZero() (gas: 336598) +StatusOf_LockupDynamic_Integration_Concrete_Test:test_StatusOf_StartTimeInTheFuture() (gas: 330697) +StatusOf_LockupDynamic_Integration_Concrete_Test:test_StatusOf_StreamCanceled() (gas: 376172) +StatusOf_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11714) +StatusOf_LockupLinear_Integration_Concrete_Test:test_StatusOf() (gas: 263351) +StatusOf_LockupLinear_Integration_Concrete_Test:test_StatusOf_AssetsFullyWithdrawn() (gas: 287719) +StatusOf_LockupLinear_Integration_Concrete_Test:test_StatusOf_RefundableAmountNotZero() (gas: 263516) +StatusOf_LockupLinear_Integration_Concrete_Test:test_StatusOf_StartTimeInTheFuture() (gas: 257493) +StatusOf_LockupLinear_Integration_Concrete_Test:test_StatusOf_StreamCanceled() (gas: 297686) +StreamedAmountOf_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11319) +StreamedAmountOf_LockupDynamic_Integration_Concrete_Test:test_StreamedAmountOf_CurrentMilestone1st() (gas: 45931) +StreamedAmountOf_LockupDynamic_Integration_Concrete_Test:test_StreamedAmountOf_CurrentMilestoneNot1st() (gas: 50774) +StreamedAmountOf_LockupDynamic_Integration_Concrete_Test:test_StreamedAmountOf_OneSegment() (gas: 257003) StreamedAmountOf_LockupDynamic_Integration_Concrete_Test:test_StreamedAmountOf_StartTimeInTheFuture() (gas: 20230) StreamedAmountOf_LockupDynamic_Integration_Concrete_Test:test_StreamedAmountOf_StartTimeInThePresent() (gas: 25593) -StreamedAmountOf_LockupDynamic_Integration_Concrete_Test:test_StreamedAmountOf_StatusDepleted() (gas: 68727) +StreamedAmountOf_LockupDynamic_Integration_Concrete_Test:test_StreamedAmountOf_StatusDepleted() (gas: 68749) StreamedAmountOf_LockupDynamic_Integration_Concrete_Test:test_StreamedAmountOf_StatusPending() (gas: 20360) StreamedAmountOf_LockupDynamic_Integration_Concrete_Test:test_StreamedAmountOf_StatusSettled() (gas: 26624) -StreamedAmountOf_LockupDynamic_Integration_Concrete_Test:test_StreamedAmountOf_StreamHasBeenCanceled_StatusCanceled() (gas: 87497) -StreamedAmountOf_LockupDynamic_Integration_Concrete_Test:test_StreamedAmountOf_StreamHasBeenCanceled_StatusDepleted() (gas: 116148) -StreamedAmountOf_LockupDynamic_Integration_Fuzz_Test:testFuzz_StreamedAmountOf_Calculation((uint128,uint64,uint40)[],uint40) (runs: 50, μ: 3521477, ~: 3128962) -StreamedAmountOf_LockupDynamic_Integration_Fuzz_Test:testFuzz_StreamedAmountOf_Monotonicity((uint128,uint64,uint40)[],uint40,uint40) (runs: 50, μ: 3965669, ~: 4101937) -StreamedAmountOf_LockupDynamic_Integration_Fuzz_Test:testFuzz_StreamedAmountOf_OneSegment((uint128,uint64,uint40),uint40) (runs: 50, μ: 274310, ~: 268277) -StreamedAmountOf_LockupLinear_Integration_Concrete_Test:test_StreamedAmountOf_CliffTimeInTheFuture() (gas: 26302) -StreamedAmountOf_LockupLinear_Integration_Concrete_Test:test_StreamedAmountOf_CliffTimeInThePast() (gas: 17313) -StreamedAmountOf_LockupLinear_Integration_Concrete_Test:test_StreamedAmountOf_CliffTimeInThePresent() (gas: 27143) -StreamedAmountOf_LockupLinear_Integration_Concrete_Test:test_StreamedAmountOf_StatusDepleted() (gas: 68936) -StreamedAmountOf_LockupLinear_Integration_Concrete_Test:test_StreamedAmountOf_StatusPending() (gas: 20327) -StreamedAmountOf_LockupLinear_Integration_Concrete_Test:test_StreamedAmountOf_StatusSettled() (gas: 26710) -StreamedAmountOf_LockupLinear_Integration_Concrete_Test:test_StreamedAmountOf_StreamHasBeenCanceled_StatusCanceled() (gas: 78272) -StreamedAmountOf_LockupLinear_Integration_Concrete_Test:test_StreamedAmountOf_StreamHasBeenCanceled_StatusDepleted() (gas: 106846) -StreamedAmountOf_LockupLinear_Integration_Fuzz_Test:testFuzz_StreamedAmountOf_Calculation(uint40,uint128) (runs: 50, μ: 232343, ~: 233061) -StreamedAmountOf_LockupLinear_Integration_Fuzz_Test:testFuzz_StreamedAmountOf_CliffTimeInTheFuture(uint40) (runs: 50, μ: 27377, ~: 27626) -StreamedAmountOf_LockupLinear_Integration_Fuzz_Test:testFuzz_StreamedAmountOf_Monotonicity(uint40,uint40,uint128) (runs: 50, μ: 237382, ~: 239360) +StreamedAmountOf_LockupDynamic_Integration_Concrete_Test:test_StreamedAmountOf_StreamHasBeenCanceled_StatusCanceled() (gas: 87534) +StreamedAmountOf_LockupDynamic_Integration_Concrete_Test:test_StreamedAmountOf_StreamHasBeenCanceled_StatusDepleted() (gas: 116207) +StreamedAmountOf_LockupDynamic_Integration_Fuzz_Test:testFuzz_StreamedAmountOf_Calculation((uint128,uint64,uint40)[],uint40) (runs: 50, μ: 3520440, ~: 3134690) +StreamedAmountOf_LockupDynamic_Integration_Fuzz_Test:testFuzz_StreamedAmountOf_Monotonicity((uint128,uint64,uint40)[],uint40,uint40) (runs: 50, μ: 3969098, ~: 4086928) +StreamedAmountOf_LockupDynamic_Integration_Fuzz_Test:testFuzz_StreamedAmountOf_OneSegment((uint128,uint64,uint40),uint40) (runs: 50, μ: 276308, ~: 270719) +StreamedAmountOf_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11349) +StreamedAmountOf_LockupLinear_Integration_Concrete_Test:test_StreamedAmountOf_CliffTimeInTheFuture() (gas: 26236) +StreamedAmountOf_LockupLinear_Integration_Concrete_Test:test_StreamedAmountOf_CliffTimeInThePast() (gas: 17291) +StreamedAmountOf_LockupLinear_Integration_Concrete_Test:test_StreamedAmountOf_CliffTimeInThePresent() (gas: 27121) +StreamedAmountOf_LockupLinear_Integration_Concrete_Test:test_StreamedAmountOf_StatusDepleted() (gas: 68969) +StreamedAmountOf_LockupLinear_Integration_Concrete_Test:test_StreamedAmountOf_StatusPending() (gas: 20305) +StreamedAmountOf_LockupLinear_Integration_Concrete_Test:test_StreamedAmountOf_StatusSettled() (gas: 26688) +StreamedAmountOf_LockupLinear_Integration_Concrete_Test:test_StreamedAmountOf_StreamHasBeenCanceled_StatusCanceled() (gas: 78261) +StreamedAmountOf_LockupLinear_Integration_Concrete_Test:test_StreamedAmountOf_StreamHasBeenCanceled_StatusDepleted() (gas: 106890) +StreamedAmountOf_LockupLinear_Integration_Fuzz_Test:testFuzz_StreamedAmountOf_Calculation(uint40,uint128) (runs: 50, μ: 234531, ~: 235187) +StreamedAmountOf_LockupLinear_Integration_Fuzz_Test:testFuzz_StreamedAmountOf_CliffTimeInTheFuture(uint40) (runs: 50, μ: 27397, ~: 27604) +StreamedAmountOf_LockupLinear_Integration_Fuzz_Test:testFuzz_StreamedAmountOf_Monotonicity(uint40,uint40,uint128) (runs: 50, μ: 239328, ~: 241463) ToggleFlashAsset_Integration_Concrete_Test:test_ToggleFlashAsset() (gas: 31848) ToggleFlashAsset_Integration_Concrete_Test:test_ToggleFlashAsset_FlagNotEnabled() (gas: 41868) -TokenURI_LockupDynamic_Integration_Concrete_Test:test_TokenURI_Decoded() (gas: 3422904) -TokenURI_LockupDynamic_Integration_Concrete_Test:test_TokenURI_Full() (gas: 2743187) -TokenURI_LockupLinear_Integration_Concrete_Test:test_TokenURI_Decoded() (gas: 3341348) -TokenURI_LockupLinear_Integration_Concrete_Test:test_TokenURI_Full() (gas: 2661789) -WasCanceled_LockupDynamic_Integration_Concrete_Test:test_WasCanceled() (gas: 361404) -WasCanceled_LockupDynamic_Integration_Concrete_Test:test_WasCanceled_StreamNotCanceled() (gas: 324810) -WasCanceled_LockupLinear_Integration_Concrete_Test:test_WasCanceled() (gas: 286684) -WasCanceled_LockupLinear_Integration_Concrete_Test:test_WasCanceled_StreamNotCanceled() (gas: 252129) -WithdrawMaxAndTransfer_LockupDynamic_Integration_Concrete_Test:test_WithdrawMaxAndTransfer() (gas: 153323) -WithdrawMaxAndTransfer_LockupDynamic_Integration_Concrete_Test:test_WithdrawMaxAndTransfer_WithdrawableAmountZero() (gas: 99935) -WithdrawMaxAndTransfer_LockupDynamic_Integration_Fuzz_Test:testFuzz_WithdrawMaxAndTransfer(uint256,address) (runs: 50, μ: 131864, ~: 151107) -WithdrawMaxAndTransfer_LockupLinear_Integration_Concrete_Test:test_WithdrawMaxAndTransfer() (gas: 106420) -WithdrawMaxAndTransfer_LockupLinear_Integration_Concrete_Test:test_WithdrawMaxAndTransfer_WithdrawableAmountZero() (gas: 100091) -WithdrawMaxAndTransfer_LockupLinear_Integration_Fuzz_Test:testFuzz_WithdrawMaxAndTransfer(uint256,address) (runs: 50, μ: 96364, ~: 106586) -WithdrawMax_LockupDynamic_Integration_Concrete_Test:test_WithdrawMax() (gas: 134454) -WithdrawMax_LockupDynamic_Integration_Concrete_Test:test_WithdrawMax_EndTimeNotInTheFuture() (gas: 79700) -WithdrawMax_LockupDynamic_Integration_Fuzz_Test:testFuzz_WithdrawMax(uint256) (runs: 50, μ: 116746, ~: 119825) -WithdrawMax_LockupDynamic_Integration_Fuzz_Test:testFuzz_WithdrawMax_EndTimeNotInTheFuture(uint256) (runs: 50, μ: 82256, ~: 82383) -WithdrawMax_LockupLinear_Integration_Concrete_Test:test_WithdrawMax() (gas: 73906) -WithdrawMax_LockupLinear_Integration_Concrete_Test:test_WithdrawMax_EndTimeNotInTheFuture() (gas: 80006) -WithdrawMax_LockupLinear_Integration_Fuzz_Test:testFuzz_WithdrawMax(uint256) (runs: 50, μ: 72863, ~: 73017) -WithdrawMax_LockupLinear_Integration_Fuzz_Test:testFuzz_WithdrawMax_EndTimeNotInTheFuture(uint256) (runs: 50, μ: 82507, ~: 82689) -WithdrawMultiple_LockupDynamic_Integration_Concrete_Test:test_WithdrawMultiple() (gas: 1805869) -WithdrawMultiple_LockupDynamic_Integration_Concrete_Test:test_WithdrawMultiple_ArrayCountsZero() (gas: 9087) -WithdrawMultiple_LockupDynamic_Integration_Fuzz_Test:testFuzz_WithdrawMultiple(uint256,address,uint128) (runs: 50, μ: 2707361, ~: 2707710) -WithdrawMultiple_LockupLinear_Integration_Concrete_Test:test_WithdrawMultiple() (gas: 1242199) +TokenURI_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_NFTDoesNotExist() (gas: 13542) +TokenURI_LockupDynamic_Integration_Concrete_Test:test_TokenURI_Decoded() (gas: 5031712) +TokenURI_LockupDynamic_Integration_Concrete_Test:test_TokenURI_Full() (gas: 2738320) +TokenURI_LockupLinear_Integration_Concrete_Test:test_RevertGiven_NFTDoesNotExist() (gas: 13525) +TokenURI_LockupLinear_Integration_Concrete_Test:test_TokenURI_Decoded() (gas: 4949035) +TokenURI_LockupLinear_Integration_Concrete_Test:test_TokenURI_Full() (gas: 2656181) +TransferFrom_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StreamNotTransferable() (gas: 314189) +TransferFrom_LockupDynamic_Integration_Concrete_Test:test_TransferFrom() (gas: 326528) +TransferFrom_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StreamNotTransferable() (gas: 240381) +TransferFrom_LockupLinear_Integration_Concrete_Test:test_TransferFrom() (gas: 253258) +WasCanceled_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 12048) +WasCanceled_LockupDynamic_Integration_Concrete_Test:test_WasCanceled() (gas: 364234) +WasCanceled_LockupDynamic_Integration_Concrete_Test:test_WasCanceled_StreamNotCanceled() (gas: 327640) +WasCanceled_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 12069) +WasCanceled_LockupLinear_Integration_Concrete_Test:test_WasCanceled() (gas: 288988) +WasCanceled_LockupLinear_Integration_Concrete_Test:test_WasCanceled_StreamNotCanceled() (gas: 254422) +WithdrawMaxAndTransfer_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_NFTBurned() (gas: 75279) +WithdrawMaxAndTransfer_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 14162) +WithdrawMaxAndTransfer_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StreamNotTransferable() (gas: 265080) +WithdrawMaxAndTransfer_LockupDynamic_Integration_Concrete_Test:test_WithdrawMaxAndTransfer() (gas: 156711) +WithdrawMaxAndTransfer_LockupDynamic_Integration_Concrete_Test:test_WithdrawMaxAndTransfer_WithdrawableAmountZero() (gas: 101492) +WithdrawMaxAndTransfer_LockupDynamic_Integration_Fuzz_Test:testFuzz_WithdrawMaxAndTransfer(uint256,address) (runs: 50, μ: 131073, ~: 112693) +WithdrawMaxAndTransfer_LockupLinear_Integration_Concrete_Test:test_RevertGiven_NFTBurned() (gas: 75509) +WithdrawMaxAndTransfer_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 14170) +WithdrawMaxAndTransfer_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StreamNotTransferable() (gas: 189310) +WithdrawMaxAndTransfer_LockupLinear_Integration_Concrete_Test:test_WithdrawMaxAndTransfer() (gas: 109710) +WithdrawMaxAndTransfer_LockupLinear_Integration_Concrete_Test:test_WithdrawMaxAndTransfer_WithdrawableAmountZero() (gas: 101736) +WithdrawMaxAndTransfer_LockupLinear_Integration_Fuzz_Test:testFuzz_WithdrawMaxAndTransfer(uint256,address) (runs: 50, μ: 99903, ~: 108188) +WithdrawMax_LockupDynamic_Integration_Concrete_Test:test_WithdrawMax() (gas: 134665) +WithdrawMax_LockupDynamic_Integration_Concrete_Test:test_WithdrawMax_EndTimeNotInTheFuture() (gas: 79744) +WithdrawMax_LockupDynamic_Integration_Fuzz_Test:testFuzz_WithdrawMax(uint256) (runs: 50, μ: 116864, ~: 119983) +WithdrawMax_LockupDynamic_Integration_Fuzz_Test:testFuzz_WithdrawMax_EndTimeNotInTheFuture(uint256) (runs: 50, μ: 82259, ~: 82427) +WithdrawMax_LockupLinear_Integration_Concrete_Test:test_WithdrawMax() (gas: 74005) +WithdrawMax_LockupLinear_Integration_Concrete_Test:test_WithdrawMax_EndTimeNotInTheFuture() (gas: 80017) +WithdrawMax_LockupLinear_Integration_Fuzz_Test:testFuzz_WithdrawMax(uint256) (runs: 50, μ: 72948, ~: 73116) +WithdrawMax_LockupLinear_Integration_Fuzz_Test:testFuzz_WithdrawMax_EndTimeNotInTheFuture(uint256) (runs: 50, μ: 82490, ~: 82584) +WithdrawMultiple_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_AllStatusesDepleted() (gas: 73926) +WithdrawMultiple_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_OnlyNull() (gas: 21069) +WithdrawMultiple_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_SomeNull() (gas: 124805) +WithdrawMultiple_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_SomeStatusesDepleted() (gas: 83399) +WithdrawMultiple_LockupDynamic_Integration_Concrete_Test:test_WithdrawMultiple() (gas: 1823420) +WithdrawMultiple_LockupDynamic_Integration_Concrete_Test:test_WithdrawMultiple_ArrayCountsZero() (gas: 9109) +WithdrawMultiple_LockupDynamic_Integration_Fuzz_Test:testFuzz_WithdrawMultiple(uint256,address,uint128) (runs: 50, μ: 2741367, ~: 2742123) +WithdrawMultiple_LockupLinear_Integration_Concrete_Test:test_RevertGiven_AllStatusesDepleted() (gas: 74068) +WithdrawMultiple_LockupLinear_Integration_Concrete_Test:test_RevertGiven_OnlyNull() (gas: 20978) +WithdrawMultiple_LockupLinear_Integration_Concrete_Test:test_RevertGiven_SomeNull() (gas: 105128) +WithdrawMultiple_LockupLinear_Integration_Concrete_Test:test_RevertGiven_SomeStatusesDepleted() (gas: 83541) +WithdrawMultiple_LockupLinear_Integration_Concrete_Test:test_WithdrawMultiple() (gas: 1256080) WithdrawMultiple_LockupLinear_Integration_Concrete_Test:test_WithdrawMultiple_ArrayCountsZero() (gas: 9126) -WithdrawMultiple_LockupLinear_Integration_Fuzz_Test:testFuzz_WithdrawMultiple(uint256,address,uint128) (runs: 50, μ: 1742432, ~: 1742287) -Withdraw_LockupDynamic_Integration_Concrete_Test:test_Withdraw() (gas: 381705) -Withdraw_LockupDynamic_Integration_Concrete_Test:test_Withdraw_CallerApprovedOperator() (gas: 112523) -Withdraw_LockupDynamic_Integration_Concrete_Test:test_Withdraw_CallerRecipient() (gas: 81082) -Withdraw_LockupDynamic_Integration_Concrete_Test:test_Withdraw_EndTimeNotInTheFuture() (gas: 72554) -Withdraw_LockupDynamic_Integration_Concrete_Test:test_Withdraw_RecipientDoesNotImplementHook() (gas: 359872) -Withdraw_LockupDynamic_Integration_Concrete_Test:test_Withdraw_RecipientNotContract() (gas: 122112) -Withdraw_LockupDynamic_Integration_Concrete_Test:test_Withdraw_RecipientReentrancy() (gas: 387067) -Withdraw_LockupDynamic_Integration_Concrete_Test:test_Withdraw_RecipientReverts() (gas: 360427) -Withdraw_LockupDynamic_Integration_Concrete_Test:test_Withdraw_StreamHasBeenCanceled() (gas: 379300) -Withdraw_LockupDynamic_Integration_Fuzz_Test:testFuzz_Withdraw(uint256,address,uint128) (runs: 50, μ: 125749, ~: 98023) -Withdraw_LockupDynamic_Integration_Fuzz_Test:testFuzz_Withdraw_CallerApprovedOperator(address) (runs: 50, μ: 145230, ~: 145230) -Withdraw_LockupDynamic_Integration_Fuzz_Test:testFuzz_Withdraw_SegmentFuzing(((uint128,uint64,uint40)[],uint256,address)) (runs: 50, μ: 3950416, ~: 3852837) -Withdraw_LockupDynamic_Integration_Fuzz_Test:testFuzz_Withdraw_StreamHasBeenCanceled(uint256,address,uint128) (runs: 50, μ: 158615, ~: 158813) -Withdraw_LockupLinear_Integration_Concrete_Test:test_Withdraw() (gas: 265613) -Withdraw_LockupLinear_Integration_Concrete_Test:test_Withdraw_CallerApprovedOperator() (gas: 92923) -Withdraw_LockupLinear_Integration_Concrete_Test:test_Withdraw_CallerRecipient() (gas: 61471) -Withdraw_LockupLinear_Integration_Concrete_Test:test_Withdraw_EndTimeNotInTheFuture() (gas: 72822) -Withdraw_LockupLinear_Integration_Concrete_Test:test_Withdraw_RecipientDoesNotImplementHook() (gas: 257393) -Withdraw_LockupLinear_Integration_Concrete_Test:test_Withdraw_RecipientNotContract() (gas: 75290) -Withdraw_LockupLinear_Integration_Concrete_Test:test_Withdraw_RecipientReentrancy() (gas: 270988) -Withdraw_LockupLinear_Integration_Concrete_Test:test_Withdraw_RecipientReverts() (gas: 257948) -Withdraw_LockupLinear_Integration_Concrete_Test:test_Withdraw_StreamHasBeenCanceled() (gas: 290354) -Withdraw_LockupLinear_Integration_Fuzz_Test:testFuzz_Withdraw(uint256,address,uint128) (runs: 50, μ: 98763, ~: 98632) -Withdraw_LockupLinear_Integration_Fuzz_Test:testFuzz_Withdraw_CallerApprovedOperator(address) (runs: 50, μ: 112042, ~: 112042) -Withdraw_LockupLinear_Integration_Fuzz_Test:testFuzz_Withdraw_StreamHasBeenCanceled(uint256,address,uint128) (runs: 50, μ: 139114, ~: 139033) -WithdrawableAmountOf_LockupDynamic_Integration_Concrete_Test:test_WithdrawableAmountOf() (gas: 375341) -WithdrawableAmountOf_LockupDynamic_Integration_Concrete_Test:test_WithdrawableAmountOf_NoPreviousWithdrawals() (gas: 344798) -WithdrawableAmountOf_LockupDynamic_Integration_Concrete_Test:test_WithdrawableAmountOf_StartTimeInThePresent() (gas: 334407) -WithdrawableAmountOf_LockupDynamic_Integration_Concrete_Test:test_WithdrawableAmountOf_StatusDepleted() (gas: 360935) -WithdrawableAmountOf_LockupDynamic_Integration_Concrete_Test:test_WithdrawableAmountOf_StatusPending() (gas: 331156) -WithdrawableAmountOf_LockupDynamic_Integration_Concrete_Test:test_WithdrawableAmountOf_StatusSettled() (gas: 337357) -WithdrawableAmountOf_LockupDynamic_Integration_Concrete_Test:test_WithdrawableAmountOf_StreamHasBeenCanceled_StatusCanceled() (gas: 375385) -WithdrawableAmountOf_LockupDynamic_Integration_Concrete_Test:test_WithdrawableAmountOf_StreamHasBeenCanceled_StatusDepleted() (gas: 397521) -WithdrawableAmountOf_LockupDynamic_Integration_Fuzz_Test:testFuzz_WithdrawableAmountOf(uint40,uint128) (runs: 50, μ: 332813, ~: 349508) -WithdrawableAmountOf_LockupDynamic_Integration_Fuzz_Test:testFuzz_WithdrawableAmountOf_NoPreviousWithdrawals(uint40) (runs: 50, μ: 294637, ~: 286681) -WithdrawableAmountOf_LockupLinear_Integration_Concrete_Test:test_WithdrawableAmountOf_CliffTimeInTheFuture() (gas: 251328) -WithdrawableAmountOf_LockupLinear_Integration_Concrete_Test:test_WithdrawableAmountOf_NoPreviousWithdrawals() (gas: 261221) -WithdrawableAmountOf_LockupLinear_Integration_Concrete_Test:test_WithdrawableAmountOf_StatusDepleted() (gas: 286431) -WithdrawableAmountOf_LockupLinear_Integration_Concrete_Test:test_WithdrawableAmountOf_StatusPending() (gas: 256422) -WithdrawableAmountOf_LockupLinear_Integration_Concrete_Test:test_WithdrawableAmountOf_StatusSettled() (gas: 262753) -WithdrawableAmountOf_LockupLinear_Integration_Concrete_Test:test_WithdrawableAmountOf_StreamHasBeenCanceled_StatusCanceled() (gas: 297470) -WithdrawableAmountOf_LockupLinear_Integration_Concrete_Test:test_WithdrawableAmountOf_StreamHasBeenCanceled_StatusDepleted() (gas: 319562) -WithdrawableAmountOf_LockupLinear_Integration_Concrete_Test:test_WithdrawableAmountOf_WithWithdrawals() (gas: 284809) -WithdrawableAmountOf_LockupLinear_Integration_Fuzz_Test:testFuzz_WithdrawableAmountOf(uint40,uint128,uint128) (runs: 50, μ: 458973, ~: 459024) -WithdrawableAmountOf_LockupLinear_Integration_Fuzz_Test:testFuzz_WithdrawableAmountOf_CliffTimeInTheFuture(uint40) (runs: 50, μ: 261387, ~: 261691) -WithdrawableAmountOf_LockupLinear_Integration_Fuzz_Test:testFuzz_WithdrawableAmountOf_NoPreviousWithdrawals(uint40,uint128) (runs: 50, μ: 435199, ~: 436054) +WithdrawMultiple_LockupLinear_Integration_Fuzz_Test:testFuzz_WithdrawMultiple(uint256,address,uint128) (runs: 50, μ: 1770198, ~: 1770012) +Withdraw_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 19909) +Withdraw_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StreamDepleted() (gas: 67687) +Withdraw_LockupDynamic_Integration_Concrete_Test:test_Withdraw() (gas: 384728) +Withdraw_LockupDynamic_Integration_Concrete_Test:test_Withdraw_CallerApprovedOperator() (gas: 112603) +Withdraw_LockupDynamic_Integration_Concrete_Test:test_Withdraw_CallerRecipient() (gas: 81162) +Withdraw_LockupDynamic_Integration_Concrete_Test:test_Withdraw_EndTimeNotInTheFuture() (gas: 72576) +Withdraw_LockupDynamic_Integration_Concrete_Test:test_Withdraw_RecipientDoesNotImplementHook() (gas: 362862) +Withdraw_LockupDynamic_Integration_Concrete_Test:test_Withdraw_RecipientNotContract() (gas: 122264) +Withdraw_LockupDynamic_Integration_Concrete_Test:test_Withdraw_RecipientReentrancy() (gas: 390093) +Withdraw_LockupDynamic_Integration_Concrete_Test:test_Withdraw_RecipientReverts() (gas: 363417) +Withdraw_LockupDynamic_Integration_Concrete_Test:test_Withdraw_StreamHasBeenCanceled() (gas: 382275) +Withdraw_LockupDynamic_Integration_Fuzz_Test:testFuzz_Withdraw(uint256,address,uint128) (runs: 50, μ: 123360, ~: 98089) +Withdraw_LockupDynamic_Integration_Fuzz_Test:testFuzz_Withdraw_CallerApprovedOperator(address) (runs: 50, μ: 145346, ~: 145346) +Withdraw_LockupDynamic_Integration_Fuzz_Test:testFuzz_Withdraw_SegmentFuzing(((uint128,uint64,uint40)[],uint256,address)) (runs: 50, μ: 3957016, ~: 3848156) +Withdraw_LockupDynamic_Integration_Fuzz_Test:testFuzz_Withdraw_StreamHasBeenCanceled(uint256,address,uint128) (runs: 50, μ: 158686, ~: 158963) +Withdraw_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 19917) +Withdraw_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StreamDepleted() (gas: 67928) +Withdraw_LockupLinear_Integration_Concrete_Test:test_Withdraw() (gas: 268028) +Withdraw_LockupLinear_Integration_Concrete_Test:test_Withdraw_CallerApprovedOperator() (gas: 93000) +Withdraw_LockupLinear_Integration_Concrete_Test:test_Withdraw_CallerRecipient() (gas: 61548) +Withdraw_LockupLinear_Integration_Concrete_Test:test_Withdraw_EndTimeNotInTheFuture() (gas: 72811) +Withdraw_LockupLinear_Integration_Concrete_Test:test_Withdraw_RecipientDoesNotImplementHook() (gas: 259830) +Withdraw_LockupLinear_Integration_Concrete_Test:test_Withdraw_RecipientNotContract() (gas: 75345) +Withdraw_LockupLinear_Integration_Concrete_Test:test_Withdraw_RecipientReentrancy() (gas: 273458) +Withdraw_LockupLinear_Integration_Concrete_Test:test_Withdraw_RecipientReverts() (gas: 260385) +Withdraw_LockupLinear_Integration_Concrete_Test:test_Withdraw_StreamHasBeenCanceled() (gas: 292783) +Withdraw_LockupLinear_Integration_Fuzz_Test:testFuzz_Withdraw(uint256,address,uint128) (runs: 50, μ: 98684, ~: 98686) +Withdraw_LockupLinear_Integration_Fuzz_Test:testFuzz_Withdraw_CallerApprovedOperator(address) (runs: 50, μ: 112119, ~: 112119) +Withdraw_LockupLinear_Integration_Fuzz_Test:testFuzz_Withdraw_StreamHasBeenCanceled(uint256,address,uint128) (runs: 50, μ: 139252, ~: 139121) +WithdrawableAmountOf_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 12045) +WithdrawableAmountOf_LockupDynamic_Integration_Concrete_Test:test_WithdrawableAmountOf() (gas: 378217) +WithdrawableAmountOf_LockupDynamic_Integration_Concrete_Test:test_WithdrawableAmountOf_NoPreviousWithdrawals() (gas: 347660) +WithdrawableAmountOf_LockupDynamic_Integration_Concrete_Test:test_WithdrawableAmountOf_StartTimeInThePresent() (gas: 337237) +WithdrawableAmountOf_LockupDynamic_Integration_Concrete_Test:test_WithdrawableAmountOf_StatusDepleted() (gas: 363787) +WithdrawableAmountOf_LockupDynamic_Integration_Concrete_Test:test_WithdrawableAmountOf_StatusPending() (gas: 333986) +WithdrawableAmountOf_LockupDynamic_Integration_Concrete_Test:test_WithdrawableAmountOf_StatusSettled() (gas: 340209) +WithdrawableAmountOf_LockupDynamic_Integration_Concrete_Test:test_WithdrawableAmountOf_StreamHasBeenCanceled_StatusCanceled() (gas: 378252) +WithdrawableAmountOf_LockupDynamic_Integration_Concrete_Test:test_WithdrawableAmountOf_StreamHasBeenCanceled_StatusDepleted() (gas: 400432) +WithdrawableAmountOf_LockupDynamic_Integration_Fuzz_Test:testFuzz_WithdrawableAmountOf(uint40,uint128) (runs: 50, μ: 332238, ~: 313851) +WithdrawableAmountOf_LockupDynamic_Integration_Fuzz_Test:testFuzz_WithdrawableAmountOf_NoPreviousWithdrawals(uint40) (runs: 50, μ: 298230, ~: 289755) +WithdrawableAmountOf_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 12076) +WithdrawableAmountOf_LockupLinear_Integration_Concrete_Test:test_WithdrawableAmountOf_CliffTimeInTheFuture() (gas: 253643) +WithdrawableAmountOf_LockupLinear_Integration_Concrete_Test:test_WithdrawableAmountOf_NoPreviousWithdrawals() (gas: 263514) +WithdrawableAmountOf_LockupLinear_Integration_Concrete_Test:test_WithdrawableAmountOf_StatusDepleted() (gas: 288779) +WithdrawableAmountOf_LockupLinear_Integration_Concrete_Test:test_WithdrawableAmountOf_StatusPending() (gas: 258715) +WithdrawableAmountOf_LockupLinear_Integration_Concrete_Test:test_WithdrawableAmountOf_StatusSettled() (gas: 265068) +WithdrawableAmountOf_LockupLinear_Integration_Concrete_Test:test_WithdrawableAmountOf_StreamHasBeenCanceled_StatusCanceled() (gas: 299774) +WithdrawableAmountOf_LockupLinear_Integration_Concrete_Test:test_WithdrawableAmountOf_StreamHasBeenCanceled_StatusDepleted() (gas: 321876) +WithdrawableAmountOf_LockupLinear_Integration_Concrete_Test:test_WithdrawableAmountOf_WithWithdrawals() (gas: 287157) +WithdrawableAmountOf_LockupLinear_Integration_Fuzz_Test:testFuzz_WithdrawableAmountOf(uint40,uint128,uint128) (runs: 50, μ: 464146, ~: 464993) +WithdrawableAmountOf_LockupLinear_Integration_Fuzz_Test:testFuzz_WithdrawableAmountOf_CliffTimeInTheFuture(uint40) (runs: 50, μ: 263735, ~: 263984) +WithdrawableAmountOf_LockupLinear_Integration_Fuzz_Test:testFuzz_WithdrawableAmountOf_NoPreviousWithdrawals(uint40,uint128) (runs: 50, μ: 440223, ~: 441015) \ No newline at end of file diff --git a/foundry.toml b/foundry.toml index d788a459c..0f575053b 100644 --- a/foundry.toml +++ b/foundry.toml @@ -16,7 +16,7 @@ out = "out" script = "script" sender = "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38" - solc = "0.8.19" + solc = "0.8.21" src = "src" test = "test" @@ -53,7 +53,9 @@ [profile.smt.model_checker] engine = "chc" # constrained Horn clauses invariants = ["contract", "reentrancy"] + show_proved_safe = true show_unproved = true + show_unsupported = true timeout = 100_000 # in milliseconds, per solving query targets = [ "assert", diff --git a/script/Base.s.sol b/script/Base.s.sol index 53c814f2a..32b96a58e 100644 --- a/script/Base.s.sol +++ b/script/Base.s.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: GPL-3.0-or-later -pragma solidity >=0.8.19 <=0.9.0; +pragma solidity >=0.8.19 <0.9.0; import { Script } from "forge-std/Script.sol"; diff --git a/script/DeployComptroller.s.sol b/script/DeployComptroller.s.sol index ee8fd0843..cfeb4769c 100644 --- a/script/DeployComptroller.s.sol +++ b/script/DeployComptroller.s.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: GPL-3.0-or-later -pragma solidity >=0.8.19 <=0.9.0; +pragma solidity >=0.8.19 <0.9.0; import { SablierV2Comptroller } from "../src/SablierV2Comptroller.sol"; diff --git a/script/DeployCore.s.sol b/script/DeployCore.s.sol index a53aa44d5..cb70fa7a1 100644 --- a/script/DeployCore.s.sol +++ b/script/DeployCore.s.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: GPL-3.0-or-later -pragma solidity >=0.8.19 <=0.9.0; +pragma solidity >=0.8.19 <0.9.0; import { SablierV2Comptroller } from "../src/SablierV2Comptroller.sol"; import { SablierV2LockupDynamic } from "../src/SablierV2LockupDynamic.sol"; diff --git a/script/DeployCore2.s.sol b/script/DeployCore2.s.sol index f448eb466..0752639c1 100644 --- a/script/DeployCore2.s.sol +++ b/script/DeployCore2.s.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: GPL-3.0-or-later -pragma solidity >=0.8.19 <=0.9.0; +pragma solidity >=0.8.19 <0.9.0; import { ISablierV2NFTDescriptor } from "../src/interfaces/ISablierV2NFTDescriptor.sol"; import { SablierV2Comptroller } from "../src/SablierV2Comptroller.sol"; diff --git a/script/DeployDeterministicComptroller.s.sol b/script/DeployDeterministicComptroller.s.sol index 35e07cff2..e609d960c 100644 --- a/script/DeployDeterministicComptroller.s.sol +++ b/script/DeployDeterministicComptroller.s.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: GPL-3.0-or-later -pragma solidity >=0.8.19 <=0.9.0; +pragma solidity >=0.8.19 <0.9.0; import { SablierV2Comptroller } from "../src/SablierV2Comptroller.sol"; diff --git a/script/DeployDeterministicCore.s.sol b/script/DeployDeterministicCore.s.sol index ebedcded8..aac8a7ab9 100644 --- a/script/DeployDeterministicCore.s.sol +++ b/script/DeployDeterministicCore.s.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: GPL-3.0-or-later -pragma solidity >=0.8.19 <=0.9.0; +pragma solidity >=0.8.19 <0.9.0; import { SablierV2Comptroller } from "../src/SablierV2Comptroller.sol"; import { SablierV2LockupDynamic } from "../src/SablierV2LockupDynamic.sol"; diff --git a/script/DeployDeterministicCore2.s.sol b/script/DeployDeterministicCore2.s.sol index a7a0183cf..c6b76b4f7 100644 --- a/script/DeployDeterministicCore2.s.sol +++ b/script/DeployDeterministicCore2.s.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: GPL-3.0-or-later -pragma solidity >=0.8.19 <=0.9.0; +pragma solidity >=0.8.19 <0.9.0; import { ISablierV2NFTDescriptor } from "../src/interfaces/ISablierV2NFTDescriptor.sol"; import { SablierV2Comptroller } from "../src/SablierV2Comptroller.sol"; diff --git a/script/DeployDeterministicLockupDynamic.s.sol b/script/DeployDeterministicLockupDynamic.s.sol index 4ddf6e20f..8c25b4a83 100644 --- a/script/DeployDeterministicLockupDynamic.s.sol +++ b/script/DeployDeterministicLockupDynamic.s.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: GPL-3.0-or-later -pragma solidity >=0.8.19 <=0.9.0; +pragma solidity >=0.8.19 <0.9.0; import { ISablierV2Comptroller } from "../src/interfaces/ISablierV2Comptroller.sol"; import { ISablierV2NFTDescriptor } from "../src/interfaces/ISablierV2NFTDescriptor.sol"; diff --git a/script/DeployDeterministicLockupLinear.s.sol b/script/DeployDeterministicLockupLinear.s.sol index 86b710364..3526a45fb 100644 --- a/script/DeployDeterministicLockupLinear.s.sol +++ b/script/DeployDeterministicLockupLinear.s.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: GPL-3.0-or-later -pragma solidity >=0.8.19 <=0.9.0; +pragma solidity >=0.8.19 <0.9.0; import { ISablierV2Comptroller } from "../src/interfaces/ISablierV2Comptroller.sol"; import { ISablierV2NFTDescriptor } from "../src/interfaces/ISablierV2NFTDescriptor.sol"; diff --git a/script/DeployLockupDynamic.s.sol b/script/DeployLockupDynamic.s.sol index 3b1256acb..b27f75396 100644 --- a/script/DeployLockupDynamic.s.sol +++ b/script/DeployLockupDynamic.s.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: GPL-3.0-or-later -pragma solidity >=0.8.19 <=0.9.0; +pragma solidity >=0.8.19 <0.9.0; import { ISablierV2Comptroller } from "../src/interfaces/ISablierV2Comptroller.sol"; import { ISablierV2NFTDescriptor } from "../src/interfaces/ISablierV2NFTDescriptor.sol"; diff --git a/script/DeployLockupLinear.s.sol b/script/DeployLockupLinear.s.sol index 813e36877..b3af99d1b 100644 --- a/script/DeployLockupLinear.s.sol +++ b/script/DeployLockupLinear.s.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: GPL-3.0-or-later -pragma solidity >=0.8.19 <=0.9.0; +pragma solidity >=0.8.19 <0.9.0; import { ISablierV2Comptroller } from "../src/interfaces/ISablierV2Comptroller.sol"; import { ISablierV2NFTDescriptor } from "../src/interfaces/ISablierV2NFTDescriptor.sol"; diff --git a/script/GenerateSVG.s.sol b/script/GenerateSVG.s.sol index ed568de6b..3255632b4 100644 --- a/script/GenerateSVG.s.sol +++ b/script/GenerateSVG.s.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: GPL-3.0-or-later -pragma solidity >=0.8.19 <=0.9.0; +pragma solidity >=0.8.19 <0.9.0; import { Strings } from "@openzeppelin/contracts/utils/Strings.sol"; diff --git a/script/Init.s.sol b/script/Init.s.sol index 1e4f293b1..d5a970f28 100644 --- a/script/Init.s.sol +++ b/script/Init.s.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: GPL-3.0-or-later -pragma solidity >=0.8.19 <=0.9.0; +pragma solidity >=0.8.19 <0.9.0; import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; diff --git a/test/utils/Precompiles.sol b/test/utils/Precompiles.sol index a1e066d5d..c3f5c4952 100644 --- a/test/utils/Precompiles.sol +++ b/test/utils/Precompiles.sol @@ -27,11 +27,11 @@ contract Precompiles { bytes public constant BYTECODE_COMPTROLLER = hex"60803461009857601f6104a638819003918201601f19168301916001600160401b0383118484101761009d5780849260209460405283398101031261009857516001600160a01b0381169081900361009857600080546001600160a01b0319168217815560405191907fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a36103f290816100b48239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe608060408181526004918236101561001657600080fd5b600092833560e01c9182634d81e51d1461039d5750816375829def146102e5578163907a267b14610253578163b5b3ca2c146101ab578163cb01e30e146100f957508063dcf844a7146100c3578063e07df5b4146100a55763f851a4401461007d57600080fd5b346100a157816003193601126100a1576001600160a01b0360209254169051908152f35b5080fd5b50346100a157816003193601126100a1576020906001549051908152f35b50346100a15760203660031901126100a157806020926001600160a01b036100e96103d7565b1681526003845220549051908152f35b9050346101a75760203660031901126101a7576101146103d7565b6001600160a01b03918285541633810361017a575050169081835260026020528083209081549160ff8316159260ff84169060ff1916179055519081527f8cd3a7bc46b26a3b0c07a05a47af78abcaa647626f631d92ea64f8867b23bbec60203392a380f35b84516331b339a960e21b81526001600160a01b039091169181019182523360208301529081906040010390fd5b8280fd5b9050346101a757816003193601126101a7576101c56103d7565b90602435916001600160a01b039182865416338103610226575050907f371789a3d97098f3070492613273a065a7e8a19e009fd1ae92a4b4d4c71ed62d9116928385526003602052808520928084549455815193845260208401523392a380f35b85516331b339a960e21b81526001600160a01b039091169181019182523360208301529081906040010390fd5b919050346101a75760203660031901126101a7578135916001600160a01b038454163381036102b85750507fc059ba3e07a1c4d1fa8845bdb2af2dd85e844684e0a59e6073499e4338788465906001549280600155815193845260208401523392a280f35b82516331b339a960e21b81526001600160a01b039091169181019182523360208301529081906040010390fd5b919050346101a75760203660031901126101a7578135916001600160a01b03918284168094036103995784549283169033820361036d575050507fffffffffffffffffffffffff00000000000000000000000000000000000000001681178255337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808380a380f35b516331b339a960e21b81526001600160a01b039091169181019182523360208301529081906040010390fd5b8480fd5b849084346101a75760203660031901126101a75760ff906020936001600160a01b036103c76103d7565b1681526002855220541615158152f35b600435906001600160a01b03821682036103ed57565b600080fd"; bytes public constant BYTECODE_LOCKUP_DYNAMIC = - hex"60c0346200046e57601f62005ef938819003918201601f19168301916001600160401b038311848410176200032b578084926080946040528339810103126200046e5780516001600160a01b038082169290918390036200046e5760208101518281168091036200046e5760408201519183831683036200046e5760600151936200008962000473565b90601d82527f5361626c696572205632204c6f636b75702044796e616d6963204e46540000006020830152620000be62000473565b601181527029a0a116ab1916a627a1a5aaa816a22ca760791b602082015230608052600080546001600160a01b03199081168417825560018054909116909517909455927fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a38051906001600160401b0382116200032b5760035490600182811c9216801562000463575b60208310146200044d5781601f849311620003d8575b50602090601f83116001146200034d5760009262000341575b50508160011b916000199060031b1c1916176003555b80516001600160401b0381116200032b576004918254600181811c9116801562000320575b60208210146200030b579081601f849311620002b3575b50602090601f831160011462000248576000926200023c575b50508160011b916000199060031b1c19161790555b1660018060a01b0319600a541617600a5560a0526001600955604051615a65908162000494823960805181615471015260a0518181816110f801526149b60152f35b015190503880620001e5565b6000858152602081209350601f198516905b8181106200029a575090846001959493921062000280575b505050811b019055620001fa565b015160001960f88460031b161c1916905538808062000272565b929360206001819287860151815501950193016200025a565b909150836000526020600020601f840160051c8101916020851062000300575b90601f859493920160051c01905b818110620002f05750620001cc565b60008155849350600101620002e1565b9091508190620002d3565b602284634e487b7160e01b6000525260246000fd5b90607f1690620001b5565b634e487b7160e01b600052604160045260246000fd5b0151905038806200017a565b600360009081527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b9350601f198516905b818110620003bf5750908460019594939210620003a5575b505050811b0160035562000190565b015160001960f88460031b161c1916905538808062000396565b929360206001819287860151815501950193016200037e565b60036000529091507fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f840160051c8101916020851062000442575b90601f859493920160051c01905b81811062000432575062000161565b6000815584935060010162000423565b909150819062000415565b634e487b7160e01b600052602260045260246000fd5b91607f16916200014b565b600080fd5b60408051919082016001600160401b038111838210176200032b5760405256fe608080604052600436101561001357600080fd5b60003560e01c90816301ffc9a714612abb5750806306fdde03146129f8578063081812fc146129da578063095ea7b3146128465780631400ecec146127a157806316844456146125265780631c1cdd4c146124c05780631e99d569146124a257806323b872dd1461247957806339a73c031461243657806340e58ee514612095578063425d30dd1461207757806342842e0e1461202757806342966c6814611ec95780634857501f14611e535780634869e12d14611e175780635fe3b56714611df05780636352211e14611dc15780636d0cee7514611d6957806370a0823114611cbf57806375829def14611c2d5780637cad6cd114611b5b5780637de6b1db146119325780638659c270146114da578063894e9a0d1461126d5780638bad38dd146111f15780638f69b9931461116e5780639067b6771461111b5780639188ec84146110e057806395d89b4114610fd2578063a22cb46514610f01578063a2ffb89714610e08578063a6202bf214610cff578063a80fc07114610caa578063ad35efd414610c47578063b256456914610c29578063b637b86514610bc9578063b88d4fde14610b3e578063b8a3be6614610b07578063b971302a14610ab5578063bc063e1a14610a92578063bc2be1be14610a3f578063c156a11d14610962578063c33cd35e1461084d578063c87b56dd1461071a578063cc364f481461067f578063d4dbd20b1461062a578063d511609f146105db578063d975dfed1461058e578063e985e9c514610537578063ea5ead19146104ef578063eac8f5b814610483578063f590c1761461045b578063f851a440146104345763fdd46d601461027c57600080fd5b3461042f57606036600319011261042f57600435610298612be8565b604435906001600160801b03821680830361042f576102b5615467565b6102be846134d4565b610417576102e284600052600b6020526001600160a01b0360406000205416331490565b1580610407575b6103e45761030d84600052600b6020526001600160a01b0360406000205416331490565b806103c0575b610393576001600160a01b0382161561036957156103515791610348602092600080516020615a458339815191529483615682565b604051908152a1005b6024836040519063d2aabcd960e01b82526004820152fd5b60046040517fc61a0e9e000000000000000000000000000000000000000000000000000000008152fd5b6064846001600160a01b038460405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b508360005260056020526001600160a01b0380604060002054169083161415610313565b60405163216caf0d60e01b815260048101859052336024820152604490fd5b0390fd5b506104118461589c565b156102e9565b60248460405190634a5541ef60e01b82526004820152fd5b600080fd5b3461042f57600036600319011261042f5760206001600160a01b0360005416604051908152f35b3461042f57602036600319011261042f576020610479600435613524565b6040519015158152f35b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d857600052600b60205260206001600160a01b0360016040600020015416604051908152f35b6024906040519062b8e7e760e51b82526004820152fd5b3461042f57604036600319011261042f57600080516020615a45833981519152602060043561034861051f612be8565b61052883615529565b90610531615467565b83615561565b3461042f57604036600319011261042f57610550612bd2565b610558612be8565b906001600160a01b03809116600052600860205260406000209116600052602052602060ff604060002054166040519015158152f35b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d8576105ca602091615529565b6001600160801b0360405191168152f35b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d857600052600b602052602060026040600020015460801c604051908152f35b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d857600052600b60205260206001600160801b0360036040600020015416604051908152f35b3461042f57602036600319011261042f57600435600060206040516106a381612d22565b828152015280600052600b60205260ff60016040600020015460a81c16156104d857600052600b602052604080600020548151906106e082612d22565b64ffffffffff90818160a01c16835260c81c166020820152610718825180926020908164ffffffffff91828151168552015116910152565bf35b3461042f5760208060031936011261042f57600435906107586107538360005260056020526001600160a01b0360406000205416151590565b612dc1565b60006001600160a01b03600a5416926044604051809581937fe9dc637500000000000000000000000000000000000000000000000000000000835230600484015260248301525afa918215610841576000926107c8575b506107c4604051928284938452830190612bad565b0390f35b9091503d806000833e6107db8183612d6f565b810190828183031261042f5780519067ffffffffffffffff821161042f570181601f8201121561042f57805161081081612d91565b9261081e6040519485612d6f565b81845284828401011161042f5761083a91848085019101612b8a565b90826107af565b6040513d6000823e3d90fd5b3461042f5760031960203682011261042f576004359067ffffffffffffffff9081831161042f5761014090833603011261042f57610889615467565b6040519161089683612d05565b6108a281600401612bfe565b83526108b060248201613555565b60208401526108c160448201612cdc565b60408401526108d260648201612cdc565b60608401526108e360848201612bfe565b60808401526108f460a48201612dad565b60a084015261090560c48201612bfe565b60c08401526109173660e4830161363b565b60e084015261012481013591821161042f57013660238201121561042f5760209161094f61095a923690602460048201359101613567565b610100820152614907565b604051908152f35b3461042f57604036600319011261042f5760043561097e612be8565b610986615467565b81600052600b60205260ff60016040600020015460a81c1615610a28578160005260056020526001600160a01b0360406000205416803303610a09579161034881602093600080516020615a45833981519152956109e383615529565b6001600160801b0381166109f8575b50613054565b610a03908285615682565b876109f2565b60405163216caf0d60e01b815260048101849052336024820152604490fd5b6024826040519062b8e7e760e51b82526004820152fd5b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d857600052600b602052602064ffffffffff60406000205460a01c16604051908152f35b3461042f57600036600319011261042f57602060405167016345785d8a00008152f35b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d857600052600b60205260206001600160a01b0360406000205416604051908152f35b3461042f57602036600319011261042f57600435600052600b602052602060ff60016040600020015460a81c166040519015158152f35b3461042f57608036600319011261042f57610b57612bd2565b610b5f612be8565b6064359167ffffffffffffffff831161042f573660238401121561042f57826004013591610b8c83612d91565b92610b9a6040519485612d6f565b808452366024828701011161042f576020816000926024610bc79801838801378501015260443591612edf565b005b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d857600052600b6020526107c4610c1560046040600020016133bc565b604051918291602083526020830190612c78565b3461042f57602036600319011261042f57602061047960043561349d565b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d857610c819061480b565b6040516005821015610c94576020918152f35b634e487b7160e01b600052602160045260246000fd5b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d857600052600b60205260206001600160801b0360026040600020015416604051908152f35b3461042f57602036600319011261042f57610d18612bd2565b6001600160a01b038060005416338103610ddf57508116908160005260026020526001600160801b0360406000205416908115610dae5781610d809184600052600260205260406000206fffffffffffffffffffffffffffffffff19815416905533906154c3565b6040519081527fca7a4a65a94ed2f37538814e00e1cd4c41a78261561e3f3794592f11409cf5af60203392a3005b602483604051907f8410168c0000000000000000000000000000000000000000000000000000000082526004820152fd5b6040516331b339a960e21b81526001600160a01b03919091166004820152336024820152604490fd5b3461042f57606036600319011261042f5767ffffffffffffffff60043581811161042f57610e3a903690600401612c47565b610e42612be8565b9260443590811161042f57610e5b903690600401612c47565b9190610e65615467565b828203610eca5760005b828110610e7857005b80600080516020615a458339815191526020610e97600194878a615551565b35610ebd610eae610ea9868b8a615551565b613627565b610eb6615467565b8b83615561565b604051908152a101610e6f565b50604491604051917faec9344000000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b3461042f57604036600319011261042f57610f1a612bd2565b6024359081151580920361042f576001600160a01b031690813314610f8e57336000526008602052604060002082600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a3005b606460405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152fd5b3461042f57600036600319011261042f57604051600060045490600182811c918184169182156110d6575b60209485851084146110c05785879486865291826000146110a0575050600114611043575b5061102f92500383612d6f565b6107c4604051928284938452830190612bad565b84915060046000527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b906000915b85831061108857505061102f935082010185611022565b80548389018501528794508693909201918101611071565b60ff19168582015261102f95151560051b85010192508791506110229050565b634e487b7160e01b600052602260045260246000fd5b92607f1692610ffd565b3461042f57600036600319011261042f5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d857600052600b602052602064ffffffffff60406000205460c81c16604051908152f35b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d8576111a89061480b565b600581101580610c9457600282149081156111e4575b81156111d2575b6020826040519015158152f35b9050610c9457600460209114826111c5565b50506003811460006111be565b3461042f57602036600319011261042f576004356001600160a01b039081811680910361042f578160005416338103610ddf575060015491816001600160a01b03198416176001556040519216825260208201527fdcb09aef4bf01068924ccce937981cbe59d25ba08380cf941aaaea4e4bd3960d60403392a2005b3461042f57602036600319011261042f57606061014060405161128f81612d3e565b60008152600060208201526000604082015260008382015260006080820152600060a0820152600060c0820152600060e082015260006101008201526112d361344a565b6101208201520152600435600052600b60205260ff60016040600020015460a81c16156114c257600435600052600b60205260406000206113b660046040519261131c84612d3e565b80546001600160a01b038116855264ffffffffff8160a01c16602086015264ffffffffff8160c81c16604086015260ff8160f01c161515606086015260f81c1515608085015260ff60018201546001600160a01b03811660a0870152818160a01c16151560c0870152818160a81c16151560e087015260b01c1615156101008501526113aa60028201613469565b610120850152016133bc565b6101408201526113c760043561480b565b906005821015610c9457600261014092146114b6575b6107c4604051928392602084526001600160a01b03815116602085015264ffffffffff602082015116604085015264ffffffffff60408201511660608501526060810151151560808501526080810151151560a08501526001600160a01b0360a08201511660c085015260c0810151151560e085015260e0810151151561010085015261010081015115156101208501526114a261012082015183860190604090816001600160801b0391828151168552826020820151166020860152015116910152565b01516101a0808401526101c0830190612c78565b600060608201526113dd565b602460405162b8e7e760e51b81526004356004820152fd5b3461042f5760208060031936011261042f5760043567ffffffffffffffff811161042f5761150c903690600401612c47565b90611515615467565b6000915b80831061152257005b61152d838284615551565b3592611537615467565b611540846134d4565b1561155d5760248460405190634a5541ef60e01b82526004820152fd5b61156984929394613524565b61191a5761158d82600052600b6020526001600160a01b0360406000205416331490565b15806118fa575b6118db576115a18261366a565b82600052600b928387526115bb6002604060002001613469565b936001600160801b03928386511684821610156118c3578260005281895260ff60406000205460f01c16156118ab579061160a82858b611600819796838c511661350b565b990151169061350b565b93826000528184526040600020966003885498600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8b1617815583881615611891575b0191811691826fffffffffffffffffffffffffffffffff1982541617905561169d6001600160a01b03809916926005875289604060002054169487528360019a8b60406000200154166154c3565b3382036117ae57823b61170a575b7f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd2600080516020615a458339815191529685925b604080516001600160801b03928316815292909116602083015290a4604051908152a1019190611519565b9350813b1561042f576040516372eba20360e01b8152600481018490526001600160a01b03821660248201526001600160801b03858116604483015286166064820152600080516020615a45833981519152958b9585927f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd2929190600081608481838b5af161179f575b5092509650506116ab565b6117a890612d5b565b8e611794565b813b6117ed575b7f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd2600080516020615a458339815191529685926116df565b9350803b1561042f576040516372eba20360e01b8152600481018490526001600160a01b03831660248201526001600160801b03858116604483015286166064820152600080516020615a45833981519152958b9585927f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd2929190600081608481838a5af1611882575b5092509650506117b5565b61188b90612d5b565b8e611877565b60018101600160a01b60ff60a01b1982541617905561164f565b602483604051906339c6dc7360e21b82526004820152fd5b602483604051906322cad1af60e11b82526004820152fd5b60405163216caf0d60e01b815260048101839052336024820152604490fd5b5081600052600585526001600160a01b0360406000205416331415611594565b6024826040519063fe19f19f60e01b82526004820152fd5b3461042f5760208060031936011261042f5760043561194f615467565b80600052600b825260ff60016040600020015460a81c16156104d8576119748161480b565b916000926005811015610c9457600481036119a15760248360405190634a5541ef60e01b82526004820152fd5b600381036119c1576024836040519063fe19f19f60e01b82526004820152fd5b916002849314611b43576119eb81600052600b6020526001600160a01b0360406000205416331490565b15611b235780600052600b825260ff60406000205460f01c1615611b0b5780600052600b8252604060002060ff60f01b198154169055600582526001600160a01b0360406000205416803b611a79575b50807f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f84600080516020615a4583398151915295a2604051908152a1005b803b1561042f57600080516020615a458339815191529360008084936024604051809481937f341a0bd90000000000000000000000000000000000000000000000000000000083528860048401525af1611ad6575b509350611a3b565b9050611ae29150612d5b565b8060007f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f611ace565b602490604051906339c6dc7360e21b82526004820152fd5b60405163216caf0d60e01b81526004810191909152336024820152604490fd5b602490604051906322cad1af60e11b82526004820152fd5b3461042f57602036600319011261042f576004356001600160a01b039081811680910361042f578160005416338103610ddf5750600a5491816001600160a01b0319841617600a556040519216825260208201527fa2548bd4b805e907c1558a47b5858324fe8bb4a2e1ddfca647eecbf65610eebc60403392a26009546000198101908111611c175760407f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c91815190600182526020820152a1005b634e487b7160e01b600052601160045260246000fd5b3461042f57602036600319011261042f57611c46612bd2565b6000546001600160a01b0380821692338403611c98576001600160a01b03199350169182911617600055337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf80600080a3005b6040516331b339a960e21b81526001600160a01b0385166004820152336024820152604490fd5b3461042f57602036600319011261042f576001600160a01b03611ce0612bd2565b168015611cff5760005260066020526020604060002054604051908152f35b608460405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e657200000000000000000000000000000000000000000000006064820152fd5b3461042f57602036600319011261042f57600435611da06107538260005260056020526001600160a01b0360406000205416151590565b600052600560205260206001600160a01b0360406000205416604051908152f35b3461042f57602036600319011261042f576020611ddf600435612e0c565b6001600160a01b0360405191168152f35b3461042f57600036600319011261042f5760206001600160a01b0360015416604051908152f35b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d8576105ca60209161488c565b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d8576000611e8f8261480b565b6005811015610c9457600203611ead575b6020906040519015158152f35b50600052600b602052602060ff60406000205460f01c16611ea0565b3461042f57602036600319011261042f57600435611ee5615467565b611eee816134d4565b15611ff657611efc8161589c565b15611b2357611f0a81612e0c565b611f138261349d565b159081611fed575b81611fda575b50611fc257602081611f41600080516020615a4583398151915293612e0c565b9080600052600783526001600160a01b036040600020926001600160a01b031993848154169055169182600052600684526040600020600019815401905581600052600584526040600020908154169055806000604051937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a48152a1005b602490604051906378630aa960e01b82526004820152fd5b6001600160a01b03915016151582611f21565b60009150611f1b565b602490604051907f817cd6390000000000000000000000000000000000000000000000000000000082526004820152fd5b3461042f5761203536612c12565b60405191602083019383851067ffffffffffffffff86111761206157610bc79460405260008452612edf565b634e487b7160e01b600052604160045260246000fd5b3461042f57602036600319011261042f5760206104796004356134d4565b3461042f5760208060031936011261042f57600435906120b3615467565b6120bc826134d4565b156120d95760248260405190634a5541ef60e01b82526004820152fd5b6120e282613524565b61191a5761210682600052600b6020526001600160a01b0360406000205416331490565b1580612416575b6118db5761211a8261366a565b9180600052600b82526121336002604060002001613469565b926001600160801b03908185511682821610156118c35782600052600b845260ff60406000205460f01c16156118ab5780828561217661218094838a511661350b565b970151169061350b565b9082600052600b84526040600020916003835493600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8616178155838316156123fc575b0191861691826fffffffffffffffffffffffffffffffff198254161790556122146001600160a01b03809416926005875283856040600020541695600b8952600160406000200154166154c3565b33820361231c57823b61227b575b7f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd28491600080516020615a45833981519152975b604080516001600160801b03928316815292909116602083015290a4604051908152a1005b823b1561042f576040516372eba20360e01b8152600481018590526001600160a01b03831660248201526001600160801b03878116604483015282166064820152600080516020615a458339815191529685927f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd292909190600081608481838b5af161230d575b509750915050612222565b61231690612d5b565b89612302565b813b61235b575b7f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd28491600080516020615a4583398151915297612256565b813b1561042f576040516372eba20360e01b8152600481018590526001600160a01b03841660248201526001600160801b03878116604483015282166064820152600080516020615a458339815191529685927f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd292909190600081608481838a5af16123ed575b509750915050612323565b6123f690612d5b565b896123e2565b60018101600160a01b60ff60a01b198254161790556121c6565b5081600052600581526001600160a01b036040600020541633141561210d565b3461042f57602036600319011261042f576001600160a01b03612457612bd2565b16600052600260205260206001600160801b0360406000205416604051908152f35b3461042f57610bc761248a36612c12565b9161249d6124988433612f75565b612e6e565b613054565b3461042f57600036600319011261042f576020600954604051908152f35b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d8576124fa9061480b565b6005811015610c9457806020911590811561251b575b506040519015158152f35b600191501482612510565b3461042f576020600319818136011261042f576004359067ffffffffffffffff9081831161042f576101208336039182011261042f57612564615467565b610104830135906022190181121561042f57820160048101359082821161042f57602401606082023603811361042f5761259f913691613567565b918251906125ac826133a4565b916125ba6040519384612d6f565b808352601f196125c9826133a4565b018660005b82811061278b5750505064ffffffffff90814216946001600160801b0396876125f6826136d5565b515116828a612604846136d5565b5101511685806040612615866136d5565b510151168a0116906040519261262a84612ce9565b83528b830152604082015261263e876136d5565b52612648866136d5565b5060019386855b8a8c87831061270a57908b846001600160a01b038c60a48101358281169081900361042f5761095a956126ca956126fa9461268c60248601613606565b61269860448701613606565b6126a460648801613613565b916126b188600401613613565b94846126bf60848b01613627565b966040519d8e612d05565b168c528d8c0152151560408b0152151560608a01521660808801521660a086015260c085015260c436910161363b565b60e0830152610100820152614907565b88938580604061273e8b8661272e8a8e9a612725828d6136f8565b5151169a6136f8565b51015116946000198901906136f8565b5101511681604061274f888c6136f8565b510151160116916040519361276385612ce9565b84528301526040820152612777828b6136f8565b52612782818a6136f8565b5001879061264f565b61279361344a565b8282880101520187906125ce565b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d85760209060009080600052600b8352604060002060ff815460f01c1680612834575b61280b575b50506001600160801b0360405191168152f35b61282d92506001600160801b036002612827920154169161366a565b9061350b565b82806127f8565b5060ff600182015460a01c16156127f3565b3461042f57604036600319011261042f5761285f612bd2565b602435906001600160a01b03808061287685612e0c565b169216918083146129705780331490811561294b575b50156128e1578260005260076020526040600020826001600160a01b03198254161790556128b983612e0c565b167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b608460405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152fd5b9050600052600860205260406000203360005260205260ff604060002054168461288c565b608460405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152fd5b3461042f57602036600319011261042f576020611ddf600435612e31565b3461042f57600036600319011261042f57604051600060035490600182811c91818416918215612ab1575b60209485851084146110c05785879486865291826000146110a0575050600114612a54575061102f92500383612d6f565b84915060036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b906000915b858310612a9957505061102f935082010185611022565b80548389018501528794508693909201918101612a82565b92607f1692612a23565b3461042f57602036600319011261042f57600435907fffffffff00000000000000000000000000000000000000000000000000000000821680920361042f57817f80ac58cd0000000000000000000000000000000000000000000000000000000060209314908115612b60575b8115612b36575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501483612b2f565b7f5b5e139f0000000000000000000000000000000000000000000000000000000081149150612b28565b60005b838110612b9d5750506000910152565b8181015183820152602001612b8d565b90602091612bc681518092818552858086019101612b8a565b601f01601f1916010190565b600435906001600160a01b038216820361042f57565b602435906001600160a01b038216820361042f57565b35906001600160a01b038216820361042f57565b606090600319011261042f576001600160a01b0390600435828116810361042f5791602435908116810361042f579060443590565b9181601f8401121561042f5782359167ffffffffffffffff831161042f576020808501948460051b01011161042f57565b90815180825260208080930193019160005b828110612c98575050505090565b835180516001600160801b031686528083015167ffffffffffffffff168684015260409081015164ffffffffff169086015260609094019392810192600101612c8a565b3590811515820361042f57565b6060810190811067ffffffffffffffff82111761206157604052565b610120810190811067ffffffffffffffff82111761206157604052565b6040810190811067ffffffffffffffff82111761206157604052565b610160810190811067ffffffffffffffff82111761206157604052565b67ffffffffffffffff811161206157604052565b90601f8019910116810190811067ffffffffffffffff82111761206157604052565b67ffffffffffffffff811161206157601f01601f191660200190565b35906001600160801b038216820361042f57565b15612dc857565b606460405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152fd5b60005260056020526001600160a01b0360406000205416612e2e811515612dc1565b90565b612e546107538260005260056020526001600160a01b0360406000205416151590565b60005260076020526001600160a01b036040600020541690565b15612e7557565b608460405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f766564000000000000000000000000000000000000006064820152fd5b90612f03939291612ef36124988433612f75565b612efe838383613054565b613209565b15612f0a57565b60405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b906001600160a01b038080612f8984612e0c565b16931691838314938415612fbc575b508315612fa6575b50505090565b612fb291929350612e31565b1614388080612fa0565b909350600052600860205260406000208260005260205260ff604060002054169238612f98565b15612fea57565b608460405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152fd5b9061307d929161306383612e0c565b916001600160a01b03948593848094169687911614612fe3565b169081156131705761308e8361349d565b1580613168575b8061315f575b61314757918084926130c9600080516020615a45833981519152966020966130c285612e0c565b1614612fe3565b60009382855260078652604085206001600160a01b031990818154169055818652600687526040862060001981540190558286526040862060018154019055838652600587528260408720918254161790557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6040519580a48152a1565b602483604051906378630aa960e01b82526004820152fd5b5083151561309b565b506001613095565b608460405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152fd5b3d15613204573d906131ea82612d91565b916131f86040519384612d6f565b82523d6000602084013e565b606090565b91926000929190813b1561339a5760209161327991856040519586809581947f150b7a02000000000000000000000000000000000000000000000000000000009b8c84523360048501526001600160a01b0380951660248501526044840152608060648401526084830190612bad565b0393165af190829082613333575b505061330d576132956131d9565b805190816133085760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000161490565b909192506020813d8211613392575b8161334f60209383612d6f565b8101031261338e5751907fffffffff000000000000000000000000000000000000000000000000000000008216820361338b5750903880613287565b80fd5b5080fd5b3d9150613342565b5050505050600190565b67ffffffffffffffff81116120615760051b60200190565b9081546133c8816133a4565b926040936133d885519182612d6f565b828152809460208092019260005281600020906000935b8585106133fe57505050505050565b6001848192845161340e81612ce9565b64ffffffffff87546001600160801b038116835267ffffffffffffffff8160801c168584015260c01c16868201528152019301940193916133ef565b6040519061345782612ce9565b60006040838281528260208201520152565b9060405161347681612ce9565b6040819360018154916001600160801b0392838116865260801c6020860152015416910152565b80600052600b60205260ff60016040600020015460a81c16156104d857600052600b60205260ff60016040600020015460b01c1690565b80600052600b60205260ff60016040600020015460a81c16156104d857600052600b60205260ff60016040600020015460a01c1690565b6001600160801b039182169082160391908211611c1757565b80600052600b60205260ff60016040600020015460a81c16156104d857600052600b60205260406000205460f81c90565b359064ffffffffff8216820361042f57565b929192613573826133a4565b60409461358286519283612d6f565b8195848352602080930191606080960285019481861161042f57925b8584106135ae5750505050505050565b868483031261042f578251906135c382612ce9565b6135cc85612dad565b8252858501359067ffffffffffffffff8216820361042f57828792838b9501526135f7868801613555565b8682015281520193019261359e565b35801515810361042f5790565b356001600160a01b038116810361042f5790565b356001600160801b038116810361042f5790565b919082604091031261042f5760405161365381612d22565b602080829461366181612bfe565b84520135910152565b64ffffffffff80421682600052600b602052604060002091825482828260a01c1610156136cb5760c81c1611156136b95760040154600110156136b057612e2e9061370c565b612e2e9061473c565b6001600160801b039150600201541690565b5050505050600090565b8051156136e25760200190565b634e487b7160e01b600052603260045260246000fd5b80518210156136e25760209160051b010190565b64ffffffffff90814216906000908152600b60205260409081812082519361373385612d3e565b8154956001600160a01b039182881687526020870197828160a01c168952828160c81c168789015260ff8160f01c161515606089015260f81c1515608088015260ff6001938486015490811660a08a0152818160a01c16151560c08a0152818160a81c16151560e08a015260b01c1615156101008801526101406137cd60046137be60028801613469565b966101208b01978852016133bc565b97019187835280876137df889a6136d5565b5101511693828288965b16106138c35750916138736138789284888161387d98976001600160801b039e8f6138158b8a516136f8565b5151169d8a8f9b602061383267ffffffffffffffff928d516136f8565b510151169984836138448484516136f8565b51015116965081156138b757613862929350519060001901906136f8565b5101511680925b0316920316613937565b613ca6565b613b09565b92831361389657505061389083916138fb565b16011690565b5160200151929392831692841683101591506138b29050575090565b905090565b50505051168092613869565b8094986001600160801b0390816138db8c88516136f8565b51511601169801938282808a6138f28989516136f8565b510151166137e9565b600081126139065790565b602490604051907f2463f3d50000000000000000000000000000000000000000000000000000000082526004820152fd5b90600160ff1b808314908115613a1f575b506139f55760008212156139ec57613971826000035b60008312156139e5578260000390613a29565b917f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83116139af57600091600019911813156139ab575090565b0390565b604491604051917fd49c26b300000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b8290613a29565b6139718261395e565b60046040517f9fe2b450000000000000000000000000000000000000000000000000000000008152fd5b9050811438613948565b670de0b6b3a7640000916000198383099280830292838086109503948086039514613ae55782851015613aa957908291096001821901821680920460028082600302188083028203028083028203028083028203028083028203028083028203028092029003029360018380600003040190848311900302920304170290565b82606492604051927f63a05778000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b505080925015613af3570490565b634e487b7160e01b600052601260045260246000fd5b90600160ff1b808314908115613bed575b50613bc3576000821215613bba57613b43826000035b6000831215613bb3578260000390613bf7565b917f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311613b7d57600091600019911813156139ab575090565b604491604051917f120b5b4300000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b8290613bf7565b613b4382613b30565b60046040517fa6070c25000000000000000000000000000000000000000000000000000000008152fd5b9050811438613b1a565b90919060001983820983820291828083109203918083039214613c9557670de0b6b3a76400009081831015613c5e57947faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066994950990828211900360ee1b910360121c170290565b60449086604051917f5173648d00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050670de0b6b3a764000090049150565b80613cc05750600090612e2e5750670de0b6b3a764000090565b90670de0b6b3a7640000808314613d0d575080613ce5575050670de0b6b3a764000090565b670de0b6b3a76400008114613d0957613d0490613878612e2e936145e7565b613d2d565b5090565b91505090565b8015613af3576ec097ce7bc90715b34b9f10000000000590565b6000811215613d625768033dd1780914b97114198112613d5c57613d5390600003613d2d565b612e2e90613d13565b50600090565b680a688906bd8affffff81136145b657670de0b6b3a764000080604092831b05907780000000000000000000000000000000000000000000000067ff000000000000008316614499575b66ff0000000000008316614391575b65ff00000000008316614291575b64ff000000008316614199575b63ff00000083166140a9575b62ff00008316613fc1575b61ff008316613ee1575b60ff8316613e0a575b02911c60bf031c90565b60808316613ecf575b838316613ebd575b60208316613eab575b60108316613e99575b60088316613e87575b60048316613e75575b60028316613e63575b6001831615613e00576801000000000000000102831c613e00565b6801000000000000000102831c613e48565b6801000000000000000302831c613e3f565b6801000000000000000602831c613e36565b6801000000000000000b02831c613e2d565b6801000000000000001602831c613e24565b6801000000000000002c02831c613e1b565b6801000000000000005902831c613e13565b6180008316613faf575b6140008316613f9d575b6120008316613f8b575b6110008316613f79575b6108008316613f67575b6104008316613f55575b6102008316613f43575b610100831615613df757680100000000000000b102831c613df7565b6801000000000000016302831c613f27565b680100000000000002c602831c613f1d565b6801000000000000058c02831c613f13565b68010000000000000b1702831c613f09565b6801000000000000162e02831c613eff565b68010000000000002c5d02831c613ef5565b680100000000000058b902831c613eeb565b628000008316614097575b624000008316614085575b622000008316614073575b621000008316614061575b62080000831661404f575b62040000831661403d575b62020000831661402b575b62010000831615613ded576801000000000000b17202831c613ded565b680100000000000162e402831c61400e565b6801000000000002c5c802831c614003565b68010000000000058b9102831c613ff8565b680100000000000b172102831c613fed565b68010000000000162e4302831c613fe2565b680100000000002c5c8602831c613fd7565b6801000000000058b90c02831c613fcc565b63800000008316614187575b63400000008316614175575b63200000008316614163575b63100000008316614151575b6308000000831661413f575b6304000000831661412d575b6302000000831661411b575b6301000000831615613de25768010000000000b1721802831c613de2565b6801000000000162e43002831c6140fd565b68010000000002c5c86002831c6140f1565b680100000000058b90c002831c6140e5565b6801000000000b17217f02831c6140d9565b680100000000162e42ff02831c6140cd565b6801000000002c5c85fe02831c6140c1565b68010000000058b90bfc02831c6140b5565b648000000000831661427f575b644000000000831661426d575b642000000000831661425b575b6410000000008316614249575b6408000000008316614237575b6404000000008316614225575b6402000000008316614213575b640100000000831615613dd657680100000000b17217f802831c613dd6565b68010000000162e42ff102831c6141f4565b680100000002c5c85fe302831c6141e7565b6801000000058b90bfce02831c6141da565b68010000000b17217fbb02831c6141cd565b6801000000162e42fff002831c6141c0565b68010000002c5c8601cc02831c6141b3565b680100000058b90c0b4902831c6141a6565b65800000000000831661437f575b65400000000000831661436d575b65200000000000831661435b575b651000000000008316614349575b650800000000008316614337575b650400000000008316614325575b650200000000008316614313575b65010000000000831615613dc9576801000000b17218355102831c613dc9565b680100000162e430e5a202831c6142f3565b6801000002c5c863b73f02831c6142e5565b68010000058b90cf1e6e02831c6142d7565b680100000b1721bcfc9a02831c6142c9565b68010000162e43f4f83102831c6142bb565b680100002c5c89d5ec6d02831c6142ad565b6801000058b91b5bc9ae02831c61429f565b66800000000000008316614487575b66400000000000008316614475575b66200000000000008316614463575b66100000000000008316614451575b6608000000000000831661443f575b6604000000000000831661442d575b6602000000000000831661441b575b6601000000000000831615613dbb5768010000b17255775c0402831c613dbb565b6801000162e525ee054702831c6143fa565b68010002c5cc37da949202831c6143eb565b680100058ba01fb9f96d02831c6143dc565b6801000b175effdc76ba02831c6143cd565b680100162f3904051fa102831c6143be565b6801002c605e2e8cec5002831c6143af565b68010058c86da1c09ea202831c6143a0565b6780000000000000008316614597575b6740000000000000008316614585575b6720000000000000008316614573575b6710000000000000008316614561575b670800000000000000831661454f575b670400000000000000831661453d575b670200000000000000831661452b575b670100000000000000831615613dac57680100b1afa5abcbed6102831c613dac565b68010163da9fb33356d802831c614509565b680102c9a3e778060ee702831c6144f9565b6801059b0d31585743ae02831c6144e9565b68010b5586cf9890f62a02831c6144d9565b6801172b83c7d517adce02831c6144c9565b6801306fe0a31b7152df02831c6144b9565b5077b504f333f9de6484800000000000000000000000000000006144a9565b602490604051907f0360d0280000000000000000000000000000000000000000000000000000000082526004820152fd5b8060008083131561470b57670de0b6b3a7640000928381126146d457506001925b808305906001600160801b03821160071b91821c9167ffffffffffffffff831160061b92831c63ffffffff811160051b90811c61ffff811160041b90811c60ff811160031b90811c91600f831160021b92831c936001978860038711811b96871c11961717171717171781810294811d908282146146c857506706f05b59d3b20000905b84821361469c5750505050500290565b808391020590671bc16d674ec800008212156146bb575b831d9061468c565b8091950194831d906146b3565b93505093925050020290565b60001993925080156146f7576ec097ce7bc90715b34b9f10000000000591614608565b602482634e487b7160e01b81526012600452fd5b602483604051907f059b101b0000000000000000000000000000000000000000000000000000000082526004820152fd5b6000818152600b602052614771604082205464ffffffffff808281809460a01c1693849160c81c160316918142160316613937565b91808252600b602052600460408320018054156147f75790829167ffffffffffffffff93526147c96020832054828452600b6020526138786001600160801b03968760026040882001541696879360801c1690613ca6565b9283136147df5750506147db906138fb565b1690565b60029350604092508152600b60205220015460801c90565b602483634e487b7160e01b81526032600452fd5b80600052600b602052604060002060ff600182015460a01c16600014614832575050600490565b805460f81c614885575460a01c64ffffffffff164210613d5c576148558161366a565b90600052600b6020526001600160801b03806002604060002001541691161060001461488057600190565b600290565b5050600390565b80600052600b6020526148a56002604060002001613469565b81600052600b602052604060002060ff600182015460a01c166000146148d857506001600160801b039150602001511690565b5460f81c6148ea5750612e2e9061366a565b612e2e91506001600160801b03604081835116920151169061350b565b906001600160a01b036001541660206001600160a01b0360c0850151166024604051809481937fdcf844a700000000000000000000000000000000000000000000000000000000835260048301525afa8015610841576000906151d6575b61498891506001600160801b0360a08501511690602060e0860151015191615905565b6001600160801b038151166101008401519064ffffffffff60208601511681156151ac5782518015615182577f00000000000000000000000000000000000000000000000000000000000000008111615151575064ffffffffff60406149ed856136d5565b510151168110156150fa5750600091829083815185905b808210615067575050505064ffffffffff421664ffffffffff82168110156150275750506001600160801b0382168103614fe55750506009549283600052600b6020526040600020916001600160801b0381511660028401906fffffffffffffffffffffffffffffffff198254161790556001600160a01b0360c083015116600184015490750100000000000000000000000000000000000000000060408501511515928654927fffffffffffffffffff0000ff000000000000000000000000000000000000000076ff000000000000000000000000000000000000000000006060890151151560b01b16921617171760018601556001600160a01b0384511691610100850151926040614b1f8551956000198701906136f8565b510151927fff000000000000000000000000000000000000000000000000000000000000007eff0000000000000000000000000000000000000000000000000000000000007dffffffffff0000000000000000000000000000000000000000000000000078ffffffffff000000000000000000000000000000000000000060208b015160a01b169660c81b169460f01b16911617171717845560005b818110614f15575050600185016009556001600160a01b0360c08301511660005260026020526001600160801b0380604060002054168160208401511601166001600160a01b0360c0840151166000526040600020906fffffffffffffffffffffffffffffffff198254161790556001600160a01b036080830151168015614ed157614c66614c608760005260056020526001600160a01b0360406000205416151590565b15615384565b614c6f8661349d565b1580614ec9575b80614ec1575b614ea9576020600080516020615a4583398151915291614cb5614c608960005260056020526001600160a01b0360406000205416151590565b806000526006825260406000206001815401905587600052600582526040600020816001600160a01b0319825416179055876040519160007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4878152a1614d456001600160a01b0360c0840151166001600160801b0380845116816020860151160116903090339061520a565b6001600160801b0360408201511680614e7a575b507fef3d668acee46576ad5d407c42ab4d0cde13f3cd70b28f09a0fb9e3bf5bf09cb6001600160a01b0383511691866001600160a01b03608086015116946001600160a01b0360c08201511696614e6f614e4f6040840151151592606085015115156001600160a01b0360e061010088015193549764ffffffffff60405199614de18b612d22565b818160a01c168b5260c81c1660208a01520151511694614e34604051998a998a523360208b015260408a0190604090816001600160801b0391828151168552826020820151166020860152015116910152565b60a088015260c08701526101608060e0880152860190612c78565b926101008501906020908164ffffffffff91828151168552015116910152565b6101408301520390a4565b614ea3906001600160a01b0360c0850151166001600160a01b0360e0860151511690339061520a565b38614d59565b602486604051906378630aa960e01b82526004820152fd5b506000614c7c565b506001614c76565b606460405162461bcd60e51b815260206004820152602060248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152fd5b614f24816101008601516136f8565b51906004860154916801000000000000000083101561206157600183018060048901558310156136e25760019260048801600052602060002001906001600160801b03815116908254917fffffff00000000000000000000000000000000000000000000000000000000007cffffffffff000000000000000000000000000000000000000000000000604077ffffffffffffffff00000000000000000000000000000000602086015160801b1694015160c01b169316171717905501614bbb565b6040517fd90b7e390000000000000000000000000000000000000000000000000000000081526001600160801b03918216600482015291166024820152604490fd5b6040517f210aec0e00000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b919350919461508b906001600160801b0361508285896136f8565b51511690615667565b9464ffffffffff80604061509f86856136f8565b510151169416808511156150bd575060018493019192919092614a04565b8385606492604051927f7b0bada8000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b64ffffffffff604061510b856136d5565b5101516040517fb4c9e52c00000000000000000000000000000000000000000000000000000000815264ffffffffff938416600482015291169091166024820152604490fd5b602490604051907f4757689b0000000000000000000000000000000000000000000000000000000082526004820152fd5b60046040517f3952c64e000000000000000000000000000000000000000000000000000000008152fd5b60046040517f6095d3bc000000000000000000000000000000000000000000000000000000008152fd5b6020823d602011615202575b816151ef60209383612d6f565b8101031261338b57506149889051614965565b3d91506151e2565b9290604051927f23b872dd0000000000000000000000000000000000000000000000000000000060208501526001600160a01b03809216602485015216604483015260648201526064815260a081019181831067ffffffffffffffff841117612061576152799260405261527b565b565b6001600160a01b0316906152db60405161529481612d22565b6020938482527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564858301526000808587829751910182855af16152d56131d9565b916153cf565b805191821591848315615360575b5050509050156152f65750565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b91938180945001031261338e5782015190811515820361338b5750803880846152e9565b1561538b57565b606460405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152fd5b9192901561543057508151156153e3575090565b3b156153ec5790565b606460405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b8251909150156154435750805190602001fd5b6104039060405191829162461bcd60e51b8352602060048401526024830190612bad565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361549957565b60046040517fa1c0d6e5000000000000000000000000000000000000000000000000000000008152fd5b916001600160a01b03604051927fa9059cbb000000000000000000000000000000000000000000000000000000006020850152166024830152604482015260448152608081019181831067ffffffffffffffff841117612061576152799260405261527b565b612e2e906155368161488c565b90600052600b60205260026040600020015460801c9061350b565b91908110156136e25760051b0190565b92919061556d846134d4565b6104175761559184600052600b6020526001600160a01b0360406000205416331490565b1580615657575b6103e4576155bc84600052600b6020526001600160a01b0360406000205416331490565b80615633575b615606576001600160a01b03811615610369576001600160801b038216156155ee576152799293615682565b6024846040519063d2aabcd960e01b82526004820152fd5b836001600160a01b0360649260405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b508360005260056020526001600160a01b03806040600020541690821614156155c2565b506156618461589c565b15615598565b9190916001600160801b0380809416911601918211611c1757565b929190926001600160801b038061569883615529565b16928181169380851161585f5750600095838752602092600b84526156fd6156cb6040946002868c20015460801c615667565b868a52600b86526002858b200190836fffffffffffffffffffffffffffffffff1983549260801b169116178155613469565b9061571881868401511692828681835116920151169061350b565b161115615830575b838752600b83526001600160a01b03916157438683856001858d200154166154c3565b848852600584528281892054168033141580615826575b61578f575b507ffa54f9f9bdcdd28778cbb9f78490df6691cc4e2729588e10f4cc0a26c465686a9495969750519586521693a3565b803b156158225797807ffa54f9f9bdcdd28778cbb9f78490df6691cc4e2729588e10f4cc0a26c465686a9697989960848451809481937f13375c3b0000000000000000000000000000000000000000000000000000000083528c600484015233602484015289891660448401528d60648401525af1615813575b889796955061575f565b61581c90612d5b565b38615809565b8880fd5b50803b151561575a565b838752600b835281872060018101600160a01b60ff60a01b1982541617905560ff60f01b198154169055615720565b8360649186604051927fa1fb2bbc000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b60009080825260056020526001600160a01b0380604084205416928333149384156158e1575b505082156158cf57505090565b9091506158dc3392612e31565b161490565b60ff92945090604091815260086020528181203382526020522054169138806158c2565b90929161591061344a565b936001600160801b0392838116918215615a1c5767016345785d8a00008082116159e5578085116159ae575061595a8561594b819386613bf7565b16946020890195865284613bf7565b169184615971604089019480865282875116615667565b1610156159985761598a8491826159939551169061350b565b9151169061350b565b168252565b634e487b7160e01b600052600160045260246000fd5b84604491604051917f4fea5c1a00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b60449250604051917f47152d6700000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b50505050509050604051615a2f81612ce9565b6000815260006020820152600060408201529056fef8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7"; + hex"60c0346200046e57601f62005efc38819003918201601f19168301916001600160401b038311848410176200032b578084926080946040528339810103126200046e5780516001600160a01b038082169290918390036200046e5760208101518281168091036200046e5760408201519183831683036200046e5760600151936200008962000473565b90601d82527f5361626c696572205632204c6f636b75702044796e616d6963204e46540000006020830152620000be62000473565b601181527029a0a116ab1916a627a1a5aaa816a22ca760791b602082015230608052600080546001600160a01b03199081168417825560018054909116909517909455927fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a38051906001600160401b0382116200032b5760035490600182811c9216801562000463575b60208310146200044d5781601f849311620003d8575b50602090601f83116001146200034d5760009262000341575b50508160011b916000199060031b1c1916176003555b80516001600160401b0381116200032b576004918254600181811c9116801562000320575b60208210146200030b579081601f849311620002b3575b50602090601f831160011462000248576000926200023c575b50508160011b916000199060031b1c19161790555b1660018060a01b0319600a541617600a5560a0526001600955604051615a68908162000494823960805181615474015260a0518181816110f701526149b70152f35b015190503880620001e5565b6000858152602081209350601f198516905b8181106200029a575090846001959493921062000280575b505050811b019055620001fa565b015160001960f88460031b161c1916905538808062000272565b929360206001819287860151815501950193016200025a565b909150836000526020600020601f840160051c8101916020851062000300575b90601f859493920160051c01905b818110620002f05750620001cc565b60008155849350600101620002e1565b9091508190620002d3565b602284634e487b7160e01b6000525260246000fd5b90607f1690620001b5565b634e487b7160e01b600052604160045260246000fd5b0151905038806200017a565b600360009081527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b9350601f198516905b818110620003bf5750908460019594939210620003a5575b505050811b0160035562000190565b015160001960f88460031b161c1916905538808062000396565b929360206001819287860151815501950193016200037e565b60036000529091507fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f840160051c8101916020851062000442575b90601f859493920160051c01905b81811062000432575062000161565b6000815584935060010162000423565b909150819062000415565b634e487b7160e01b600052602260045260246000fd5b91607f16916200014b565b600080fd5b60408051919082016001600160401b038111838210176200032b5760405256fe608080604052600436101561001357600080fd5b60003560e01c90816301ffc9a714612aba5750806306fdde03146129f7578063081812fc146129d9578063095ea7b3146128455780631400ecec146127a057806316844456146125255780631c1cdd4c146124bf5780631e99d569146124a157806323b872dd1461247857806339a73c031461243557806340e58ee514612094578063425d30dd1461207657806342842e0e1461202657806342966c6814611ec85780634857501f14611e525780634869e12d14611e165780635fe3b56714611def5780636352211e14611dc05780636d0cee7514611d6857806370a0823114611cbe57806375829def14611c2c5780637cad6cd114611b5a5780637de6b1db146119315780638659c270146114d9578063894e9a0d1461126c5780638bad38dd146111f05780638f69b9931461116d5780639067b6771461111a5780639188ec84146110df57806395d89b4114610fd1578063a22cb46514610f00578063a2ffb89714610e07578063a6202bf214610cfe578063a80fc07114610ca9578063ad35efd414610c46578063b256456914610c28578063b637b86514610bc8578063b88d4fde14610b3d578063b8a3be6614610b06578063b971302a14610ab4578063bc063e1a14610a91578063bc2be1be14610a3e578063c156a11d14610961578063c33cd35e1461084c578063c87b56dd14610719578063cc364f481461067f578063d4dbd20b1461062a578063d511609f146105db578063d975dfed1461058e578063e985e9c514610537578063ea5ead19146104ef578063eac8f5b814610483578063f590c1761461045b578063f851a440146104345763fdd46d601461027c57600080fd5b3461042f57606036600319011261042f57600435610298612be7565b604435906001600160801b03821680830361042f576102b561546a565b6102be846134d5565b610417576102e284600052600b6020526001600160a01b0360406000205416331490565b1580610407575b6103e45761030d84600052600b6020526001600160a01b0360406000205416331490565b806103c0575b610393576001600160a01b0382161561036957156103515791610348602092600080516020615a488339815191529483615685565b604051908152a1005b6024836040519063d2aabcd960e01b82526004820152fd5b60046040517fc61a0e9e000000000000000000000000000000000000000000000000000000008152fd5b6064846001600160a01b038460405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b508360005260056020526001600160a01b0380604060002054169083161415610313565b60405163216caf0d60e01b815260048101859052336024820152604490fd5b0390fd5b506104118461589f565b156102e9565b60248460405190634a5541ef60e01b82526004820152fd5b600080fd5b3461042f57600036600319011261042f5760206001600160a01b0360005416604051908152f35b3461042f57602036600319011261042f576020610479600435613525565b6040519015158152f35b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d857600052600b60205260206001600160a01b0360016040600020015416604051908152f35b6024906040519062b8e7e760e51b82526004820152fd5b3461042f57604036600319011261042f57600080516020615a48833981519152602060043561034861051f612be7565b6105288361552c565b9061053161546a565b83615564565b3461042f57604036600319011261042f57610550612bd1565b610558612be7565b906001600160a01b03809116600052600860205260406000209116600052602052602060ff604060002054166040519015158152f35b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d8576105ca60209161552c565b6001600160801b0360405191168152f35b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d857600052600b602052602060026040600020015460801c604051908152f35b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d857600052600b60205260206001600160801b0360036040600020015416604051908152f35b3461042f57602036600319011261042f57600435600060206040516106a381612d21565b828152015280600052600b60205260ff60016040600020015460a81c16156104d857600052600b6020526040806000205464ffffffffff8251916106e683612d21565b818160a01c16835260c81c166020820152610717825180926020908164ffffffffff91828151168552015116910152565bf35b3461042f5760208060031936011261042f57600435906107576107528360005260056020526001600160a01b0360406000205416151590565b612dc0565b60006001600160a01b03600a5416926044604051809581937fe9dc637500000000000000000000000000000000000000000000000000000000835230600484015260248301525afa918215610840576000926107c7575b506107c3604051928284938452830190612bac565b0390f35b9091503d806000833e6107da8183612d6e565b810190828183031261042f5780519067ffffffffffffffff821161042f570181601f8201121561042f57805161080f81612d90565b9261081d6040519485612d6e565b81845284828401011161042f5761083991848085019101612b89565b90826107ae565b6040513d6000823e3d90fd5b3461042f5760031960203682011261042f576004359067ffffffffffffffff9081831161042f5761014090833603011261042f5761088861546a565b6040519161089583612d04565b6108a181600401612bfd565b83526108af60248201613556565b60208401526108c060448201612cdb565b60408401526108d160648201612cdb565b60608401526108e260848201612bfd565b60808401526108f360a48201612dac565b60a084015261090460c48201612bfd565b60c08401526109163660e4830161363c565b60e084015261012481013591821161042f57013660238201121561042f5760209161094e610959923690602460048201359101613568565b610100820152614908565b604051908152f35b3461042f57604036600319011261042f5760043561097d612be7565b61098561546a565b81600052600b60205260ff60016040600020015460a81c1615610a27578160005260056020526001600160a01b0360406000205416803303610a08579161034881602093600080516020615a48833981519152956109e28361552c565b6001600160801b0381166109f7575b50613053565b610a02908285615685565b876109f1565b60405163216caf0d60e01b815260048101849052336024820152604490fd5b6024826040519062b8e7e760e51b82526004820152fd5b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d857600052600b602052602064ffffffffff60406000205460a01c16604051908152f35b3461042f57600036600319011261042f57602060405167016345785d8a00008152f35b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d857600052600b60205260206001600160a01b0360406000205416604051908152f35b3461042f57602036600319011261042f57600435600052600b602052602060ff60016040600020015460a81c166040519015158152f35b3461042f57608036600319011261042f57610b56612bd1565b610b5e612be7565b6064359167ffffffffffffffff831161042f573660238401121561042f57826004013591610b8b83612d90565b92610b996040519485612d6e565b808452366024828701011161042f576020816000926024610bc69801838801378501015260443591612ede565b005b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d857600052600b6020526107c3610c1460046040600020016133bd565b604051918291602083526020830190612c77565b3461042f57602036600319011261042f57602061047960043561349e565b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d857610c809061480c565b6040516005821015610c93576020918152f35b634e487b7160e01b600052602160045260246000fd5b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d857600052600b60205260206001600160801b0360026040600020015416604051908152f35b3461042f57602036600319011261042f57610d17612bd1565b6001600160a01b038060005416338103610dde57508116908160005260026020526001600160801b0360406000205416908115610dad5781610d7f9184600052600260205260406000206fffffffffffffffffffffffffffffffff19815416905533906154c6565b6040519081527fca7a4a65a94ed2f37538814e00e1cd4c41a78261561e3f3794592f11409cf5af60203392a3005b602483604051907f8410168c0000000000000000000000000000000000000000000000000000000082526004820152fd5b6040516331b339a960e21b81526001600160a01b03919091166004820152336024820152604490fd5b3461042f57606036600319011261042f5767ffffffffffffffff60043581811161042f57610e39903690600401612c46565b610e41612be7565b9260443590811161042f57610e5a903690600401612c46565b9190610e6461546a565b828203610ec95760005b828110610e7757005b80600080516020615a488339815191526020610e96600194878a615554565b35610ebc610ead610ea8868b8a615554565b613628565b610eb561546a565b8b83615564565b604051908152a101610e6e565b50604491604051917faec9344000000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b3461042f57604036600319011261042f57610f19612bd1565b6024359081151580920361042f576001600160a01b031690813314610f8d57336000526008602052604060002082600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a3005b606460405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152fd5b3461042f57600036600319011261042f57604051600060045490600182811c918184169182156110d5575b60209485851084146110bf57858794868652918260001461109f575050600114611042575b5061102e92500383612d6e565b6107c3604051928284938452830190612bac565b84915060046000527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b906000915b85831061108757505061102e935082010185611021565b80548389018501528794508693909201918101611070565b60ff19168582015261102e95151560051b85010192508791506110219050565b634e487b7160e01b600052602260045260246000fd5b92607f1692610ffc565b3461042f57600036600319011261042f5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d857600052600b602052602064ffffffffff60406000205460c81c16604051908152f35b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d8576111a79061480c565b600581101580610c9357600282149081156111e3575b81156111d1575b6020826040519015158152f35b9050610c9357600460209114826111c4565b50506003811460006111bd565b3461042f57602036600319011261042f576004356001600160a01b039081811680910361042f578160005416338103610dde575060015491816001600160a01b03198416176001556040519216825260208201527fdcb09aef4bf01068924ccce937981cbe59d25ba08380cf941aaaea4e4bd3960d60403392a2005b3461042f57602036600319011261042f57606061014060405161128e81612d3d565b60008152600060208201526000604082015260008382015260006080820152600060a0820152600060c0820152600060e082015260006101008201526112d261344b565b6101208201520152600435600052600b60205260ff60016040600020015460a81c16156114c157600435600052600b60205260406000206113b560046040519261131b84612d3d565b80546001600160a01b038116855264ffffffffff8160a01c16602086015264ffffffffff8160c81c16604086015260ff8160f01c161515606086015260f81c1515608085015260ff60018201546001600160a01b03811660a0870152818160a01c16151560c0870152818160a81c16151560e087015260b01c1615156101008501526113a96002820161346a565b610120850152016133bd565b6101408201526113c660043561480c565b906005821015610c9357600261014092146114b5575b6107c3604051928392602084526001600160a01b03815116602085015264ffffffffff602082015116604085015264ffffffffff60408201511660608501526060810151151560808501526080810151151560a08501526001600160a01b0360a08201511660c085015260c0810151151560e085015260e0810151151561010085015261010081015115156101208501526114a161012082015183860190604090816001600160801b0391828151168552826020820151166020860152015116910152565b01516101a0808401526101c0830190612c77565b600060608201526113dc565b602460405162b8e7e760e51b81526004356004820152fd5b3461042f5760208060031936011261042f5760043567ffffffffffffffff811161042f5761150b903690600401612c46565b9061151461546a565b6000915b80831061152157005b61152c838284615554565b359261153661546a565b61153f846134d5565b1561155c5760248460405190634a5541ef60e01b82526004820152fd5b61156884929394613525565b6119195761158c82600052600b6020526001600160a01b0360406000205416331490565b15806118f9575b6118da576115a08261366b565b82600052600b928387526115ba600260406000200161346a565b936001600160801b03928386511684821610156118c2578260005281895260ff60406000205460f01c16156118aa579061160982858b6115ff819796838c511661350c565b990151169061350c565b93826000528184526040600020966003885498600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8b1617815583881615611890575b0191811691826fffffffffffffffffffffffffffffffff1982541617905561169c6001600160a01b03809916926005875289604060002054169487528360019a8b60406000200154166154c6565b3382036117ad57823b611709575b7f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd2600080516020615a488339815191529685925b604080516001600160801b03928316815292909116602083015290a4604051908152a1019190611518565b9350813b1561042f576040516372eba20360e01b8152600481018490526001600160a01b03821660248201526001600160801b03858116604483015286166064820152600080516020615a48833981519152958b9585927f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd2929190600081608481838b5af161179e575b5092509650506116aa565b6117a790612d5a565b8e611793565b813b6117ec575b7f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd2600080516020615a488339815191529685926116de565b9350803b1561042f576040516372eba20360e01b8152600481018490526001600160a01b03831660248201526001600160801b03858116604483015286166064820152600080516020615a48833981519152958b9585927f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd2929190600081608481838a5af1611881575b5092509650506117b4565b61188a90612d5a565b8e611876565b60018101600160a01b60ff60a01b1982541617905561164e565b602483604051906339c6dc7360e21b82526004820152fd5b602483604051906322cad1af60e11b82526004820152fd5b60405163216caf0d60e01b815260048101839052336024820152604490fd5b5081600052600585526001600160a01b0360406000205416331415611593565b6024826040519063fe19f19f60e01b82526004820152fd5b3461042f5760208060031936011261042f5760043561194e61546a565b80600052600b825260ff60016040600020015460a81c16156104d8576119738161480c565b916000926005811015610c9357600481036119a05760248360405190634a5541ef60e01b82526004820152fd5b600381036119c0576024836040519063fe19f19f60e01b82526004820152fd5b916002849314611b42576119ea81600052600b6020526001600160a01b0360406000205416331490565b15611b225780600052600b825260ff60406000205460f01c1615611b0a5780600052600b8252604060002060ff60f01b198154169055600582526001600160a01b0360406000205416803b611a78575b50807f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f84600080516020615a4883398151915295a2604051908152a1005b803b1561042f57600080516020615a488339815191529360008084936024604051809481937f341a0bd90000000000000000000000000000000000000000000000000000000083528860048401525af1611ad5575b509350611a3a565b9050611ae19150612d5a565b8060007f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f611acd565b602490604051906339c6dc7360e21b82526004820152fd5b60405163216caf0d60e01b81526004810191909152336024820152604490fd5b602490604051906322cad1af60e11b82526004820152fd5b3461042f57602036600319011261042f576004356001600160a01b039081811680910361042f578160005416338103610dde5750600a5491816001600160a01b0319841617600a556040519216825260208201527fa2548bd4b805e907c1558a47b5858324fe8bb4a2e1ddfca647eecbf65610eebc60403392a26009546000198101908111611c165760407f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c91815190600182526020820152a1005b634e487b7160e01b600052601160045260246000fd5b3461042f57602036600319011261042f57611c45612bd1565b6000546001600160a01b0380821692338403611c97576001600160a01b03199350169182911617600055337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf80600080a3005b6040516331b339a960e21b81526001600160a01b0385166004820152336024820152604490fd5b3461042f57602036600319011261042f576001600160a01b03611cdf612bd1565b168015611cfe5760005260066020526020604060002054604051908152f35b608460405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e657200000000000000000000000000000000000000000000006064820152fd5b3461042f57602036600319011261042f57600435611d9f6107528260005260056020526001600160a01b0360406000205416151590565b600052600560205260206001600160a01b0360406000205416604051908152f35b3461042f57602036600319011261042f576020611dde600435612e0b565b6001600160a01b0360405191168152f35b3461042f57600036600319011261042f5760206001600160a01b0360015416604051908152f35b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d8576105ca60209161488d565b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d8576000611e8e8261480c565b6005811015610c9357600203611eac575b6020906040519015158152f35b50600052600b602052602060ff60406000205460f01c16611e9f565b3461042f57602036600319011261042f57600435611ee461546a565b611eed816134d5565b15611ff557611efb8161589f565b15611b2257611f0981612e0b565b611f128261349e565b159081611fec575b81611fd9575b50611fc157602081611f40600080516020615a4883398151915293612e0b565b9080600052600783526001600160a01b036040600020926001600160a01b031993848154169055169182600052600684526040600020600019815401905581600052600584526040600020908154169055806000604051937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a48152a1005b602490604051906378630aa960e01b82526004820152fd5b6001600160a01b03915016151582611f20565b60009150611f1a565b602490604051907f817cd6390000000000000000000000000000000000000000000000000000000082526004820152fd5b3461042f5761203436612c11565b60405191602083019383851067ffffffffffffffff86111761206057610bc69460405260008452612ede565b634e487b7160e01b600052604160045260246000fd5b3461042f57602036600319011261042f5760206104796004356134d5565b3461042f5760208060031936011261042f57600435906120b261546a565b6120bb826134d5565b156120d85760248260405190634a5541ef60e01b82526004820152fd5b6120e182613525565b6119195761210582600052600b6020526001600160a01b0360406000205416331490565b1580612415575b6118da576121198261366b565b9180600052600b8252612132600260406000200161346a565b926001600160801b03908185511682821610156118c25782600052600b845260ff60406000205460f01c16156118aa5780828561217561217f94838a511661350c565b970151169061350c565b9082600052600b84526040600020916003835493600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8616178155838316156123fb575b0191861691826fffffffffffffffffffffffffffffffff198254161790556122136001600160a01b03809416926005875283856040600020541695600b8952600160406000200154166154c6565b33820361231b57823b61227a575b7f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd28491600080516020615a48833981519152975b604080516001600160801b03928316815292909116602083015290a4604051908152a1005b823b1561042f576040516372eba20360e01b8152600481018590526001600160a01b03831660248201526001600160801b03878116604483015282166064820152600080516020615a488339815191529685927f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd292909190600081608481838b5af161230c575b509750915050612221565b61231590612d5a565b89612301565b813b61235a575b7f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd28491600080516020615a4883398151915297612255565b813b1561042f576040516372eba20360e01b8152600481018590526001600160a01b03841660248201526001600160801b03878116604483015282166064820152600080516020615a488339815191529685927f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd292909190600081608481838a5af16123ec575b509750915050612322565b6123f590612d5a565b896123e1565b60018101600160a01b60ff60a01b198254161790556121c5565b5081600052600581526001600160a01b036040600020541633141561210c565b3461042f57602036600319011261042f576001600160a01b03612456612bd1565b16600052600260205260206001600160801b0360406000205416604051908152f35b3461042f57610bc661248936612c11565b9161249c6124978433612f74565b612e6d565b613053565b3461042f57600036600319011261042f576020600954604051908152f35b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d8576124f99061480c565b6005811015610c9357806020911590811561251a575b506040519015158152f35b60019150148261250f565b3461042f576020600319818136011261042f576004359067ffffffffffffffff9081831161042f576101208336039182011261042f5761256361546a565b610104830135906022190181121561042f57820160048101359082821161042f57602401606082023603811361042f5761259e913691613568565b918251906125ab826133a5565b916125b96040519384612d6e565b808352601f196125c8826133a5565b018660005b82811061278a5750505064ffffffffff90814216946001600160801b0396876125f5826136d6565b515116828a612603846136d6565b5101511685806040612614866136d6565b510151168a0116906040519261262984612ce8565b83528b830152604082015261263d876136d6565b52612647866136d6565b5060019386855b8a8c87831061270957908b846001600160a01b038c60a48101358281169081900361042f57610959956126c9956126f99461268b60248601613607565b61269760448701613607565b6126a360648801613614565b916126b088600401613614565b94846126be60848b01613628565b966040519d8e612d04565b168c528d8c0152151560408b0152151560608a01521660808801521660a086015260c085015260c436910161363c565b60e0830152610100820152614908565b88938580604061273d8b8661272d8a8e9a612724828d6136f9565b5151169a6136f9565b51015116946000198901906136f9565b5101511681604061274e888c6136f9565b510151160116916040519361276285612ce8565b84528301526040820152612776828b6136f9565b52612781818a6136f9565b5001879061264e565b61279261344b565b8282880101520187906125cd565b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d85760209060009080600052600b8352604060002060ff815460f01c1680612833575b61280a575b50506001600160801b0360405191168152f35b61282c92506001600160801b036002612826920154169161366b565b9061350c565b82806127f7565b5060ff600182015460a01c16156127f2565b3461042f57604036600319011261042f5761285e612bd1565b602435906001600160a01b03808061287585612e0b565b1692169180831461296f5780331490811561294a575b50156128e0578260005260076020526040600020826001600160a01b03198254161790556128b883612e0b565b167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b608460405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152fd5b9050600052600860205260406000203360005260205260ff604060002054168461288b565b608460405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152fd5b3461042f57602036600319011261042f576020611dde600435612e30565b3461042f57600036600319011261042f57604051600060035490600182811c91818416918215612ab0575b60209485851084146110bf57858794868652918260001461109f575050600114612a53575061102e92500383612d6e565b84915060036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b906000915b858310612a9857505061102e935082010185611021565b80548389018501528794508693909201918101612a81565b92607f1692612a22565b3461042f57602036600319011261042f57600435907fffffffff00000000000000000000000000000000000000000000000000000000821680920361042f57817f80ac58cd0000000000000000000000000000000000000000000000000000000060209314908115612b5f575b8115612b35575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501483612b2e565b7f5b5e139f0000000000000000000000000000000000000000000000000000000081149150612b27565b60005b838110612b9c5750506000910152565b8181015183820152602001612b8c565b90602091612bc581518092818552858086019101612b89565b601f01601f1916010190565b600435906001600160a01b038216820361042f57565b602435906001600160a01b038216820361042f57565b35906001600160a01b038216820361042f57565b606090600319011261042f576001600160a01b0390600435828116810361042f5791602435908116810361042f579060443590565b9181601f8401121561042f5782359167ffffffffffffffff831161042f576020808501948460051b01011161042f57565b90815180825260208080930193019160005b828110612c97575050505090565b835180516001600160801b031686528083015167ffffffffffffffff168684015260409081015164ffffffffff169086015260609094019392810192600101612c89565b3590811515820361042f57565b6060810190811067ffffffffffffffff82111761206057604052565b610120810190811067ffffffffffffffff82111761206057604052565b6040810190811067ffffffffffffffff82111761206057604052565b610160810190811067ffffffffffffffff82111761206057604052565b67ffffffffffffffff811161206057604052565b90601f8019910116810190811067ffffffffffffffff82111761206057604052565b67ffffffffffffffff811161206057601f01601f191660200190565b35906001600160801b038216820361042f57565b15612dc757565b606460405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152fd5b60005260056020526001600160a01b0360406000205416612e2d811515612dc0565b90565b612e536107528260005260056020526001600160a01b0360406000205416151590565b60005260076020526001600160a01b036040600020541690565b15612e7457565b608460405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f766564000000000000000000000000000000000000006064820152fd5b90612f02939291612ef26124978433612f74565b612efd838383613053565b61320c565b15612f0957565b60405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b906001600160a01b038080612f8884612e0b565b16931691838314938415612fbb575b508315612fa5575b50505090565b612fb191929350612e30565b1614388080612f9f565b909350600052600860205260406000208260005260205260ff604060002054169238612f97565b15612fe957565b608460405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152fd5b9061307c929161306283612e0b565b916001600160a01b03948593848094169687911614612fe2565b16908115806131735761308e8461349e565b15908161316a575b5080613161575b61314957918084926130cb600080516020615a48833981519152966020966130c485612e0b565b1614612fe2565b60009382855260078652604085206001600160a01b031990818154169055818652600687526040862060001981540190558286526040862060018154019055838652600587528260408720918254161790557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6040519580a48152a1565b602483604051906378630aa960e01b82526004820152fd5b5083151561309d565b90501538613096565b608460405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152fd5b3d15613207573d906131ed82612d90565b916131fb6040519384612d6e565b82523d6000602084013e565b606090565b9290803b1561339c57613276916020916001600160a01b0394604051809581948293897f150b7a02000000000000000000000000000000000000000000000000000000009b8c86523360048701521660248501526044840152608060648401526084830190612bac565b03916000968791165af190829082613335575b505061330f576132976131dc565b8051908161330a5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000161490565b909192506020813d8211613394575b8161335160209383612d6e565b810103126133905751907fffffffff000000000000000000000000000000000000000000000000000000008216820361338d5750903880613289565b80fd5b5080fd5b3d9150613344565b50505050600190565b67ffffffffffffffff81116120605760051b60200190565b9081546133c9816133a5565b926040936133d985519182612d6e565b828152809460208092019260005281600020906000935b8585106133ff57505050505050565b6001848192845161340f81612ce8565b64ffffffffff87546001600160801b038116835267ffffffffffffffff8160801c168584015260c01c16868201528152019301940193916133f0565b6040519061345882612ce8565b60006040838281528260208201520152565b9060405161347781612ce8565b6040819360018154916001600160801b0392838116865260801c6020860152015416910152565b80600052600b60205260ff60016040600020015460a81c16156104d857600052600b60205260ff60016040600020015460b01c1690565b80600052600b60205260ff60016040600020015460a81c16156104d857600052600b60205260ff60016040600020015460a01c1690565b6001600160801b039182169082160391908211611c1657565b80600052600b60205260ff60016040600020015460a81c16156104d857600052600b60205260406000205460f81c90565b359064ffffffffff8216820361042f57565b929192613574826133a5565b60409461358386519283612d6e565b8195848352602080930191606080960285019481861161042f57925b8584106135af5750505050505050565b868483031261042f578251906135c482612ce8565b6135cd85612dac565b8252858501359067ffffffffffffffff8216820361042f57828792838b9501526135f8868801613556565b8682015281520193019261359f565b35801515810361042f5790565b356001600160a01b038116810361042f5790565b356001600160801b038116810361042f5790565b919082604091031261042f5760405161365481612d21565b602080829461366281612bfd565b84520135910152565b64ffffffffff80421682600052600b602052604060002091825482828260a01c1610156136cc5760c81c1611156136ba5760040154600110156136b157612e2d9061370d565b612e2d9061473d565b6001600160801b039150600201541690565b5050505050600090565b8051156136e35760200190565b634e487b7160e01b600052603260045260246000fd5b80518210156136e35760209160051b010190565b64ffffffffff90814216906000908152600b60205260409081812082519361373485612d3d565b8154956001600160a01b039182881687526020870197828160a01c168952828160c81c168789015260ff8160f01c161515606089015260f81c1515608088015260ff6001938486015490811660a08a0152818160a01c16151560c08a0152818160a81c16151560e08a015260b01c1615156101008801526101406137ce60046137bf6002880161346a565b966101208b01978852016133bd565b97019187835280876137e0889a6136d6565b5101511693828288965b16106138c45750916138746138799284888161387e98976001600160801b039e8f6138168b8a516136f9565b5151169d8a8f9b602061383367ffffffffffffffff928d516136f9565b510151169984836138458484516136f9565b51015116965081156138b857613863929350519060001901906136f9565b5101511680925b0316920316613938565b613ca7565b613b0a565b92831361389757505061389183916138fc565b16011690565b5160200151929392831692841683101591506138b39050575090565b905090565b5050505116809261386a565b8094986001600160801b0390816138dc8c88516136f9565b51511601169801938282808a6138f38989516136f9565b510151166137ea565b600081126139075790565b602490604051907f2463f3d50000000000000000000000000000000000000000000000000000000082526004820152fd5b90600160ff1b808314908115613a20575b506139f65760008212156139ed57613972826000035b60008312156139e6578260000390613a2a565b917f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83116139b057600091600019911813156139ac575090565b0390565b604491604051917fd49c26b300000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b8290613a2a565b6139728261395f565b60046040517f9fe2b450000000000000000000000000000000000000000000000000000000008152fd5b9050811438613949565b670de0b6b3a7640000916000198383099280830292838086109503948086039514613ae65782851015613aaa57908291096001821901821680920460028082600302188083028203028083028203028083028203028083028203028083028203028092029003029360018380600003040190848311900302920304170290565b82606492604051927f63a05778000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b505080925015613af4570490565b634e487b7160e01b600052601260045260246000fd5b90600160ff1b808314908115613bee575b50613bc4576000821215613bbb57613b44826000035b6000831215613bb4578260000390613bf8565b917f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311613b7e57600091600019911813156139ac575090565b604491604051917f120b5b4300000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b8290613bf8565b613b4482613b31565b60046040517fa6070c25000000000000000000000000000000000000000000000000000000008152fd5b9050811438613b1b565b90919060001983820983820291828083109203918083039214613c9657670de0b6b3a76400009081831015613c5f57947faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066994950990828211900360ee1b910360121c170290565b60449086604051917f5173648d00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050670de0b6b3a764000090049150565b80613cc15750600090612e2d5750670de0b6b3a764000090565b90670de0b6b3a7640000808314613d0e575080613ce6575050670de0b6b3a764000090565b670de0b6b3a76400008114613d0a57613d0590613879612e2d936145e8565b613d2e565b5090565b91505090565b8015613af4576ec097ce7bc90715b34b9f10000000000590565b6000811215613d635768033dd1780914b97114198112613d5d57613d5490600003613d2e565b612e2d90613d14565b50600090565b680a688906bd8affffff81136145b757670de0b6b3a764000080604092831b05907780000000000000000000000000000000000000000000000067ff00000000000000831661449a575b66ff0000000000008316614392575b65ff00000000008316614292575b64ff00000000831661419a575b63ff00000083166140aa575b62ff00008316613fc2575b61ff008316613ee2575b60ff8316613e0b575b02911c60bf031c90565b60808316613ed0575b838316613ebe575b60208316613eac575b60108316613e9a575b60088316613e88575b60048316613e76575b60028316613e64575b6001831615613e01576801000000000000000102831c613e01565b6801000000000000000102831c613e49565b6801000000000000000302831c613e40565b6801000000000000000602831c613e37565b6801000000000000000b02831c613e2e565b6801000000000000001602831c613e25565b6801000000000000002c02831c613e1c565b6801000000000000005902831c613e14565b6180008316613fb0575b6140008316613f9e575b6120008316613f8c575b6110008316613f7a575b6108008316613f68575b6104008316613f56575b6102008316613f44575b610100831615613df857680100000000000000b102831c613df8565b6801000000000000016302831c613f28565b680100000000000002c602831c613f1e565b6801000000000000058c02831c613f14565b68010000000000000b1702831c613f0a565b6801000000000000162e02831c613f00565b68010000000000002c5d02831c613ef6565b680100000000000058b902831c613eec565b628000008316614098575b624000008316614086575b622000008316614074575b621000008316614062575b620800008316614050575b62040000831661403e575b62020000831661402c575b62010000831615613dee576801000000000000b17202831c613dee565b680100000000000162e402831c61400f565b6801000000000002c5c802831c614004565b68010000000000058b9102831c613ff9565b680100000000000b172102831c613fee565b68010000000000162e4302831c613fe3565b680100000000002c5c8602831c613fd8565b6801000000000058b90c02831c613fcd565b63800000008316614188575b63400000008316614176575b63200000008316614164575b63100000008316614152575b63080000008316614140575b6304000000831661412e575b6302000000831661411c575b6301000000831615613de35768010000000000b1721802831c613de3565b6801000000000162e43002831c6140fe565b68010000000002c5c86002831c6140f2565b680100000000058b90c002831c6140e6565b6801000000000b17217f02831c6140da565b680100000000162e42ff02831c6140ce565b6801000000002c5c85fe02831c6140c2565b68010000000058b90bfc02831c6140b6565b6480000000008316614280575b644000000000831661426e575b642000000000831661425c575b641000000000831661424a575b6408000000008316614238575b6404000000008316614226575b6402000000008316614214575b640100000000831615613dd757680100000000b17217f802831c613dd7565b68010000000162e42ff102831c6141f5565b680100000002c5c85fe302831c6141e8565b6801000000058b90bfce02831c6141db565b68010000000b17217fbb02831c6141ce565b6801000000162e42fff002831c6141c1565b68010000002c5c8601cc02831c6141b4565b680100000058b90c0b4902831c6141a7565b658000000000008316614380575b65400000000000831661436e575b65200000000000831661435c575b65100000000000831661434a575b650800000000008316614338575b650400000000008316614326575b650200000000008316614314575b65010000000000831615613dca576801000000b17218355102831c613dca565b680100000162e430e5a202831c6142f4565b6801000002c5c863b73f02831c6142e6565b68010000058b90cf1e6e02831c6142d8565b680100000b1721bcfc9a02831c6142ca565b68010000162e43f4f83102831c6142bc565b680100002c5c89d5ec6d02831c6142ae565b6801000058b91b5bc9ae02831c6142a0565b66800000000000008316614488575b66400000000000008316614476575b66200000000000008316614464575b66100000000000008316614452575b66080000000000008316614440575b6604000000000000831661442e575b6602000000000000831661441c575b6601000000000000831615613dbc5768010000b17255775c0402831c613dbc565b6801000162e525ee054702831c6143fb565b68010002c5cc37da949202831c6143ec565b680100058ba01fb9f96d02831c6143dd565b6801000b175effdc76ba02831c6143ce565b680100162f3904051fa102831c6143bf565b6801002c605e2e8cec5002831c6143b0565b68010058c86da1c09ea202831c6143a1565b6780000000000000008316614598575b6740000000000000008316614586575b6720000000000000008316614574575b6710000000000000008316614562575b6708000000000000008316614550575b670400000000000000831661453e575b670200000000000000831661452c575b670100000000000000831615613dad57680100b1afa5abcbed6102831c613dad565b68010163da9fb33356d802831c61450a565b680102c9a3e778060ee702831c6144fa565b6801059b0d31585743ae02831c6144ea565b68010b5586cf9890f62a02831c6144da565b6801172b83c7d517adce02831c6144ca565b6801306fe0a31b7152df02831c6144ba565b5077b504f333f9de6484800000000000000000000000000000006144aa565b602490604051907f0360d0280000000000000000000000000000000000000000000000000000000082526004820152fd5b8060008083131561470c57670de0b6b3a7640000928381126146d557506001925b808305906001600160801b03821160071b91821c9167ffffffffffffffff831160061b92831c63ffffffff811160051b90811c61ffff811160041b90811c60ff811160031b90811c91600f831160021b92831c936001978860038711811b96871c11961717171717171781810294811d908282146146c957506706f05b59d3b20000905b84821361469d5750505050500290565b808391020590671bc16d674ec800008212156146bc575b831d9061468d565b8091950194831d906146b4565b93505093925050020290565b60001993925080156146f8576ec097ce7bc90715b34b9f10000000000591614609565b602482634e487b7160e01b81526012600452fd5b602483604051907f059b101b0000000000000000000000000000000000000000000000000000000082526004820152fd5b64ffffffffff614772600091838352600b60205280806040852054818160a01c1693849160c81c160316918142160316613938565b91808252600b602052600460408320018054156147f85790829167ffffffffffffffff93526147ca6020832054828452600b6020526138796001600160801b03968760026040882001541696879360801c1690613ca7565b9283136147e05750506147dc906138fc565b1690565b60029350604092508152600b60205220015460801c90565b602483634e487b7160e01b81526032600452fd5b80600052600b602052604060002060ff600182015460a01c16600014614833575050600490565b805460f81c614886575460a01c64ffffffffff164210613d5d576148568161366b565b90600052600b6020526001600160801b03806002604060002001541691161060001461488157600190565b600290565b5050600390565b80600052600b6020526148a6600260406000200161346a565b81600052600b602052604060002060ff600182015460a01c166000146148d957506001600160801b039150602001511690565b5460f81c6148eb5750612e2d9061366b565b612e2d91506001600160801b03604081835116920151169061350c565b906001600160a01b036001541660206001600160a01b0360c0850151166024604051809481937fdcf844a700000000000000000000000000000000000000000000000000000000835260048301525afa8015610840576000906151d9575b61498991506001600160801b0360a08501511690602060e0860151015191615908565b6001600160801b038151166101008401519064ffffffffff60208601511681156151af5782518015615185577f00000000000000000000000000000000000000000000000000000000000000008111615154575064ffffffffff60406149ee856136d6565b510151168110156150fd5750600091829083815185905b80821061506a575050505064ffffffffff421664ffffffffff821681101561502a5750506001600160801b0382168103614fe85750506009549283600052600b6020526040600020916001600160801b0381511660028401906fffffffffffffffffffffffffffffffff198254161790556001600160a01b0360c083015116600184015490750100000000000000000000000000000000000000000060408501511515928654927fffffffffffffffffff0000ff000000000000000000000000000000000000000076ff000000000000000000000000000000000000000000006060890151151560b01b16921617171760018601556001600160a01b0384511691610100850151926040614b208551956000198701906136f9565b510151927fff000000000000000000000000000000000000000000000000000000000000007eff0000000000000000000000000000000000000000000000000000000000007dffffffffff0000000000000000000000000000000000000000000000000078ffffffffff000000000000000000000000000000000000000060208b015160a01b169660c81b169460f01b16911617171717845560005b818110614f18575050600185016009556001600160a01b0360c08301511660005260026020526001600160801b0380604060002054168160208401511601166001600160a01b0360c0840151166000526040600020906fffffffffffffffffffffffffffffffff198254161790556001600160a01b036080830151168015614ed457614c67614c618760005260056020526001600160a01b0360406000205416151590565b15615387565b614c708661349e565b1580614ecb575b80614ec3575b614eab576020600080516020615a4883398151915291614cb6614c618960005260056020526001600160a01b0360406000205416151590565b806000526006825260406000206001815401905587600052600582526040600020816001600160a01b0319825416179055876040519160007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4878152a1614d466001600160a01b0360c0840151166001600160801b0380845116816020860151160116903090339061520d565b6001600160801b0360408201511680614e7c575b507fef3d668acee46576ad5d407c42ab4d0cde13f3cd70b28f09a0fb9e3bf5bf09cb614e396001600160a01b03845116926001600160a01b03608086015116946001600160a01b0360c08201511696614e71614e5160408401511515928c606086015115156001600160a01b0360e061010089015194549864ffffffffff6040519a614de58c612d21565b818160a01c168c5260c81c1660208b01520151511695604051998a99610160948b523360208c015260408b0190604090816001600160801b0391828151168552826020820151166020860152015116910152565b60a089015260c08801528060e0880152860190612c77565b926101008501906020908164ffffffffff91828151168552015116910152565b6101408301520390a4565b614ea5906001600160a01b0360c0850151166001600160a01b0360e0860151511690339061520d565b38614d5a565b602486604051906378630aa960e01b82526004820152fd5b506000614c7d565b50801515614c77565b606460405162461bcd60e51b815260206004820152602060248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152fd5b614f27816101008601516136f9565b51906004860154916801000000000000000083101561206057600183018060048901558310156136e35760019260048801600052602060002001906001600160801b03815116908254917fffffff00000000000000000000000000000000000000000000000000000000007cffffffffff000000000000000000000000000000000000000000000000604077ffffffffffffffff00000000000000000000000000000000602086015160801b1694015160c01b169316171717905501614bbc565b6040517fd90b7e390000000000000000000000000000000000000000000000000000000081526001600160801b03918216600482015291166024820152604490fd5b6040517f210aec0e00000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b919350919461508e906001600160801b0361508585896136f9565b5151169061566a565b9464ffffffffff8060406150a286856136f9565b510151169416808511156150c0575060018493019192919092614a05565b8385606492604051927f7b0bada8000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b64ffffffffff604061510e856136d6565b5101516040517fb4c9e52c00000000000000000000000000000000000000000000000000000000815264ffffffffff938416600482015291169091166024820152604490fd5b602490604051907f4757689b0000000000000000000000000000000000000000000000000000000082526004820152fd5b60046040517f3952c64e000000000000000000000000000000000000000000000000000000008152fd5b60046040517f6095d3bc000000000000000000000000000000000000000000000000000000008152fd5b6020823d602011615205575b816151f260209383612d6e565b8101031261338d57506149899051614966565b3d91506151e5565b9290604051927f23b872dd0000000000000000000000000000000000000000000000000000000060208501526001600160a01b03809216602485015216604483015260648201526064815260a081019181831067ffffffffffffffff8411176120605761527c9260405261527e565b565b6001600160a01b0316906152de60405161529781612d21565b6020938482527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564858301526000808587829751910182855af16152d86131dc565b916153d2565b805191821591848315615363575b5050509050156152f95750565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b9193818094500103126133905782015190811515820361338d5750803880846152ec565b1561538e57565b606460405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152fd5b9192901561543357508151156153e6575090565b3b156153ef5790565b606460405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b8251909150156154465750805190602001fd5b6104039060405191829162461bcd60e51b8352602060048401526024830190612bac565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361549c57565b60046040517fa1c0d6e5000000000000000000000000000000000000000000000000000000008152fd5b916001600160a01b03604051927fa9059cbb000000000000000000000000000000000000000000000000000000006020850152166024830152604482015260448152608081019181831067ffffffffffffffff8411176120605761527c9260405261527e565b612e2d906155398161488d565b90600052600b60205260026040600020015460801c9061350c565b91908110156136e35760051b0190565b929190615570846134d5565b6104175761559484600052600b6020526001600160a01b0360406000205416331490565b158061565a575b6103e4576155bf84600052600b6020526001600160a01b0360406000205416331490565b80615636575b615609576001600160a01b03811615610369576001600160801b038216156155f15761527c9293615685565b6024846040519063d2aabcd960e01b82526004820152fd5b836001600160a01b0360649260405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b508360005260056020526001600160a01b03806040600020541690821614156155c5565b506156648461589f565b1561559b565b9190916001600160801b0380809416911601918211611c1657565b929190926001600160801b038061569b8361552c565b1692818116938085116158625750600095838752602092600b84526157006156ce6040946002868c20015460801c61566a565b868a52600b86526002858b200190836fffffffffffffffffffffffffffffffff1983549260801b16911617815561346a565b9061571b81868401511692828681835116920151169061350c565b161115615833575b838752600b83526001600160a01b03916157468683856001858d200154166154c6565b848852600584528281892054168033141580615829575b615792575b507ffa54f9f9bdcdd28778cbb9f78490df6691cc4e2729588e10f4cc0a26c465686a9495969750519586521693a3565b803b156158255797807ffa54f9f9bdcdd28778cbb9f78490df6691cc4e2729588e10f4cc0a26c465686a9697989960848451809481937f13375c3b0000000000000000000000000000000000000000000000000000000083528c600484015233602484015289891660448401528d60648401525af1615816575b8897969550615762565b61581f90612d5a565b3861580c565b8880fd5b50803b151561575d565b838752600b835281872060018101600160a01b60ff60a01b1982541617905560ff60f01b198154169055615723565b8360649186604051927fa1fb2bbc000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b60009080825260056020526001600160a01b0380604084205416928333149384156158e4575b505082156158d257505090565b9091506158df3392612e30565b161490565b60ff92945090604091815260086020528181203382526020522054169138806158c5565b90929161591361344b565b936001600160801b0392838116918215615a1f5767016345785d8a00008082116159e8578085116159b1575061595d8561594e819386613bf8565b16946020890195865284613bf8565b16918461597460408901948086528287511661566a565b16101561599b5761598d8491826159969551169061350c565b9151169061350c565b168252565b634e487b7160e01b600052600160045260246000fd5b84604491604051917f4fea5c1a00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b60449250604051917f47152d6700000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b50505050509050604051615a3281612ce8565b6000815260006020820152600060408201529056fef8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7"; bytes public constant BYTECODE_LOCKUP_LINEAR = - hex"60a034620003e757601f196001600160401b03601f62004a3e3881900382810185168601919084831187841017620003ec57808792606094604052833981010312620003e75783516001600160a01b03928382169291839003620003e7576020918287015196858816809803620003e75760400151948516809503620003e7576200008962000402565b90601c82527f5361626c696572205632204c6f636b7570204c696e656172204e46540000000084830152620000bd62000402565b601181527029a0a116ab1916a627a1a5aaa816a624a760791b8582015230608052600080546001600160a01b031990811688178255600180548216909b178b5596817fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a38351858111620003d35760039485548c81811c91168015620003c8575b89821014620003b45790818684931162000361575b508890868311600114620002f8578492620002ec575b505060001982871b1c1916908b1b1784555b8151948511620002d8576004958654998b8b811c9b168015620002cd575b828c1014620002ba57848b1162000271575b869798999a50819487116001146200020a57505093620001fe575b505082871b92600019911b1c19161790555b600a541617600a5560095560405161461b9081620004238239608051816141090152f35b015191503880620001c8565b8883528183208c9890969594939116915b8282106200025757505085116200023c575b50505050811b019055620001da565b01519060f884600019921b161c19169055388080806200022d565b8484015187558c989096019593840193908101906200021b565b87835281832085880160051c81019b838910620002af575b860160051c019a8c905b8c8110620002a3575050620001ad565b848155018c9062000293565b909b508b9062000289565b634e487b7160e01b835260228852602483fd5b9a607f169a6200019b565b634e487b7160e01b81526041600452602490fd5b0151905038806200016b565b908c8e9416918886528a862092865b8c82821062000341575050841162000328575b505050811b0184556200017d565b015160001983891b60f8161c191690553880806200031a565b91929395968291958786015181550195019301908f959493929162000307565b9091508684528884208680850160051c8201928b8610620003aa575b918f91869594930160051c01915b8281106200039b57505062000155565b8681558594508f91016200038b565b925081926200037d565b634e487b7160e01b84526022600452602484fd5b90607f169062000140565b634e487b7160e01b82526041600452602482fd5b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620003ec5760405256fe608080604052600436101561001357600080fd5b600090813560e01c90816301ffc9a7146129a25750806306fdde03146128e0578063081812fc146128c1578063095ea7b3146127325780631400ecec146126925780631c1cdd4c1461262d5780631e99d5691461260f57806323b872dd146125e557806339a73c03146125a457806340e58ee514612200578063425d30dd146121e157806342842e0e1461219157806342966c68146120395780634857501f14611faf5780634869e12d14611f745780635fe3b56714611f4d5780636352211e14611f1d5780636d0cee7514611ec757806370a0823114611e1e57806375829def14611d8b578063780a82c814611d3b5780637cad6cd114611c6a5780637de6b1db14611a915780638659c2701461167d578063894e9a0d146114295780638bad38dd146113ac5780638f69b993146113105780639067b677146112bd57806395d89b41146111b057806396ce143114611091578063a22cb46514610fc0578063a2ffb89714610d82578063a6202bf214610c7c578063a80fc07114610c2a578063ab167ccc14610af1578063ad35efd414610a8f578063b256456914610a70578063b88d4fde146109df578063b8a3be66146109aa578063b971302a1461095b578063bc063e1a14610938578063bc2be1be146108e8578063c156a11d1461082d578063c87b56dd146106ef578063cc364f4814610643578063d4dbd20b146105f1578063d511609f146105a5578063d975dfed14610559578063e985e9c514610504578063ea5ead19146104de578063eac8f5b814610475578063f590c1761461044c578063f851a440146104265763fdd46d601461027357600080fd5b346104235760603660031901126104235760043561028f612ad1565b610297612c11565b906102a06140ff565b6102a98361328d565b61040b576102cd83600052600b6020526001600160a01b0360406000205416331490565b15806103fb575b6103d8576102f883600052600b6020526001600160a01b0360406000205416331490565b806103b6575b610389576001600160a01b0381161561035f576001600160801b03821615610347579161033d6020926000805160206145fb833981519152948361422a565b604051908152a180f35b6024836040519063d2aabcd960e01b82526004820152fd5b60046040517fc61a0e9e000000000000000000000000000000000000000000000000000000008152fd5b826001600160a01b0360649260405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b5082845260056020526001600160a01b038060408620541690821614156102fe565b60405163216caf0d60e01b815260048101849052336024820152604490fd5b0390fd5b5061040583614452565b156102d4565b60248360405190634a5541ef60e01b82526004820152fd5b80fd5b50346104235780600319360112610423576001600160a01b036020915416604051908152f35b503461042357602036600319011261042357602061046b6004356132f3565b6040519015158152f35b503461042357602036600319011261042357600435808252600b60205260ff600160408420015460d01c16156104c75760016040836001600160a01b039360209552600b855220015416604051908152f35b6024906040519062b8e7e760e51b82526004820152fd5b5034610423576040366003190112610423576004356104fb612ad1565b610297826141c1565b50346104235760403660031901126104235761051e612abb565b6040610528612ad1565b926001600160a01b0380931681526008602052209116600052602052602060ff604060002054166040519015158152f35b50346104235760203660031901126104235760ff6001604060043593848152600b60205220015460d01c16156104c7576105946020916141c1565b6001600160801b0360405191168152f35b503461042357602036600319011261042357600435808252600b60205260ff600160408420015460d01c16156104c75760408260029260209452600b845220015460801c604051908152f35b503461042357602036600319011261042357600435808252600b60205260ff600160408420015460d01c16156104c75760036040836001600160801b039360209552600b855220015416604051908152f35b503461042357602036600319011261042357600435610660613203565b50808252600b60205260ff600160408420015460d01c16156104c7578160409160609352600b60205220805490600164ffffffffff91015481604051936106a685612b9b565b818160a01c16855260c81c16602084015260a01c1660408201526106ed60405180926040908164ffffffffff91828151168552826020820151166020860152015116910152565bf35b5034610423576020806003193601126108195760043561072d6107288260005260056020526001600160a01b0360406000205416151590565b612c27565b826001600160a01b03600a5416916044604051809481937fe9dc637500000000000000000000000000000000000000000000000000000000835230600484015260248301525afa92831561082157809361079c575b5050610798604051928284938452830190612a96565b0390f35b909192503d8082843e6107af8184612bd3565b82019183818403126108195780519067ffffffffffffffff821161081d570182601f82011215610819578051916107e583612bf5565b936107f36040519586612bd3565b83855285848401011161042357509061081191848085019101612a73565b903880610782565b5080fd5b8280fd5b604051903d90823e3d90fd5b50346104235760403660031901126104235760043561084a612ad1565b6108526140ff565b818352600b60205260ff600160408520015460d01c16156108d15781835260056020526001600160a01b036040842054168033036103d8579161033d816020936000805160206145fb833981519152956108ab836141c1565b6001600160801b0381166108c0575b50612eba565b6108cb90828561422a565b386108ba565b6024826040519062b8e7e760e51b82526004820152fd5b503461042357602036600319011261042357600435808252600b60205260ff600160408420015460d01c16156104c75760408264ffffffffff9260209452600b8452205460a01c16604051908152f35b5034610423578060031936011261042357602060405167016345785d8a00008152f35b503461042357602036600319011261042357600435808252600b60205260ff600160408420015460d01c16156104c7576040826001600160a01b039260209452600b8452205416604051908152f35b50346104235760203660031901126104235760ff600160406020936004358152600b855220015460d01c166040519015158152f35b5034610423576080366003190112610423576109f9612abb565b610a01612ad1565b906064359067ffffffffffffffff8211610a6c5736602383011215610a6c5781600401359284610a3085612bf5565b93610a3e6040519586612bd3565b85855236602487830101116108195785610a6996602460209301838801378501015260443591612d45565b80f35b8380fd5b503461042357602036600319011261042357602061046b600435613256565b503461042357602036600319011261042357600435808252600b60205260ff600160408420015460d01c16156104c757610ac890613569565b604051906005811015610add57602092508152f35b602483634e487b7160e01b81526021600452fd5b50346104235761014036600319011261042357610b0c6140ff565b610b14613203565b9064ffffffffff80421680845260c4358281168103610c255781018216602085015260e435908183168203610c255701166040830152606435916001600160a01b03918284168094036104235750608435801515809103610c255760a43590811515809203610c255760243594848616809603610c255760043595858716809703610c2557604435906001600160801b038216809203610c255760405197610bbb89612b7e565b8852602088015260408701526060860152608085015260a084015260c0830152604061010319360112610c255760405191610bf583612bb7565b610104359182168203610c255782610c1d9260209452610124358482015260e082015261366b565b604051908152f35b600080fd5b503461042357602036600319011261042357600435808252600b60205260ff600160408420015460d01c16156104c75760026040836001600160801b039360209552600b855220015416604051908152f35b503461042357602036600319011261042357610c96612abb565b6001600160a01b0380835416338103610d59575081169081835260026020526001600160801b03604084205416908115610d285781610cf9918486526002602052604086206fffffffffffffffffffffffffffffffff198154169055339061415b565b6040519081527fca7a4a65a94ed2f37538814e00e1cd4c41a78261561e3f3794592f11409cf5af60203392a380f35b602483604051907f8410168c0000000000000000000000000000000000000000000000000000000082526004820152fd5b6040516331b339a960e21b81526001600160a01b03919091166004820152336024820152604490fd5b50346104235760603660031901126104235767ffffffffffffffff60043581811161081d57610db5903690600401612b1c565b91610dbe612ad1565b90604435908111610fbc57610dd7903690600401612b1c565b9093610de16140ff565b818103610f8657855b818110610df5578680f35b610e008183876141e9565b35610e0c8285896141e9565b356001600160801b0381168103610c2557610e256140ff565b610e2e8261328d565b610f6e57610e5282600052600b6020526001600160a01b0360406000205416331490565b1580610f5e575b610f3f57610e7d82600052600b6020526001600160a01b0360406000205416331490565b80610f17575b610eea576001600160a01b0386161561035f576001600160801b03811615610ed257602082610ec56000805160206145fb83398151915293896001979661422a565b604051908152a101610dea565b6024826040519063d2aabcd960e01b82526004820152fd5b6064826001600160a01b038860405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b5081895260056020526001600160a01b0360408a2054166001600160a01b0387161415610e83565b60405163216caf0d60e01b815260048101839052336024820152604490fd5b50610f6882614452565b15610e59565b60248260405190634a5541ef60e01b82526004820152fd5b604491604051917faec9344000000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b8480fd5b503461042357604036600319011261042357610fda612abb565b60243590811515809203610c25576001600160a01b03169081331461104d5733835260086020526040832082600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a380f35b606460405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152fd5b503461042357610160366003190112610423576110ac6140ff565b604051906110b982612b7e565b6110c1612abb565b82526110cb612ad1565b60208301526110d8612c11565b60408301526001600160a01b03906064358281168103610c255760608401526084358015158103610c2557608084015260a4358015158103610c255760a084015260603660c3190112610423575060405161113281612b9b565b64ffffffffff60c4358181168103610c2557825260e4358181168103610c25576020830152610104359081168103610c2557604082015260c0830152604061012319360112610c25576040519161118883612bb7565b610124359182168203610c255782610c1d9260209452610144358482015260e082015261366b565b5034610423578060031936011261042357604051908060045491600183811c928185169485156112b3575b602095868610811461129f5785885287949392918790821561127d575050600114611223575b505061120f92500383612bd3565b610798604051928284938452830190612a96565b90859250600482527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5b85831061126557505061120f93508201013880611201565b8054838901850152879450869390920191810161124d565b925093505061120f94915060ff191682840152151560051b8201013880611201565b602483634e487b7160e01b81526022600452fd5b93607f16936111db565b503461042357602036600319011261042357600435808252600b60205260ff600160408420015460d01c16156104c757600160408364ffffffffff9360209552600b855220015460a01c16604051908152f35b503461042357602036600319011261042357600435808252600b60205260ff600160408420015460d01c16156104c75761134990613569565b906005821015908161138a576002831491821561139e575b8215611375575b6020836040519015158152f35b90915061138a57506004602091143880611368565b80634e487b7160e01b602492526021600452fd5b506003831491506000611361565b5034610423576020366003190112610423576004356001600160a01b039081811680910361081d5781835416338103610d59575060015491816001600160a01b03198416176001556040519216825260208201527fdcb09aef4bf01068924ccce937981cbe59d25ba08380cf941aaaea4e4bd3960d60403392a280f35b50346104235760203660031901126104235760405161144781612b61565b8181528160208201528160408201528160608201528160808201528160a08201528160c08201528160e0820152816101008201528161012082015261014061148d613203565b9101526004358152600b60205260ff600160408320015460d01c1615611665576004358152600b602052604081206115666002604051926114cd84612b61565b80546001600160a01b038116855264ffffffffff8160a01c16602086015264ffffffffff8160c81c16604086015260ff8160f01c161515606086015260f81c1515608085015260ff60018201546001600160a01b03811660a087015264ffffffffff8160a01c1660c0870152818160c81c16151560e0870152818160d01c16151561010087015260d81c16151561012085015201613222565b610140820152611577600435613569565b6005811015610add579160026101a0931461165a575b506106ed610140604051926001600160a01b03815116845264ffffffffff602082015116602085015264ffffffffff60408201511660408501526060810151151560608501526080810151151560808501526001600160a01b0360a08201511660a085015264ffffffffff60c08201511660c085015260e0810151151560e0850152610100810151151561010085015261012081015115156101208501520151610140830190604090816001600160801b0391828151168552826020820151166020860152015116910152565b60608201523861158d565b602460405162b8e7e760e51b81526004356004820152fd5b503461042357602090816003193601126104235760043567ffffffffffffffff8111610819576116b283913690600401612b1c565b906116bb6140ff565b83915b8083106116c9578480f35b6116d8838284979596976141e9565b35936116e26140ff565b6116eb8561328d565b156117085760248560405190634a5541ef60e01b82526004820152fd5b90919293611715816132f3565b611a795761173981600052600b6020526001600160a01b0360406000205416331490565b1580611a5b575b611a3b5761174d81613324565b818652600b9081885261176560026040892001613222565b6001600160801b0391828251168382161015611a2357848952838a5260ff60408a205460f01c1615611a0b579282826117b786838e6117ad8f9a829a60409e9d9a51166132c4565b94015116906132c4565b84875283865288872091611846835494600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff871617855560038185169586156119f1575b0190831699818b6fffffffffffffffffffffffffffffffff19819454161790556001600160a01b0380971696879160058c52818f82205416998c5260019e8f912001541661415b565b33840361192f57843b6118a8575b50507f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd260406000805160206145fb8339815191529786935b825191825288820152a4604051908152a10191909392936116be565b90919293809596503b1561192b576040516372eba20360e01b8152600481018790526001600160a01b03851660248201526001600160801b039182166044820152911660648201528b94939291908b90818160848183895af115611854576119169192939597949650612b4d565b61192757918a939194928a8d611854565b8980fd5b8b80fd5b833b611972575b50507f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd260406000805160206145fb83398151915297869361188c565b90919280949596503b1561192b576040516372eba20360e01b8152600481018790526001600160a01b03861660248201526001600160801b039182166044820152911660648201528b94939291908b90818160848183885af115611936576119e09192939597949650612b4d565b61192757918a939194928a8d611936565b60018101600160c81b60ff60c81b198254161790556117fd565b602485604051906339c6dc7360e21b82526004820152fd5b602485604051906322cad1af60e11b82526004820152fd5b60405163216caf0d60e01b81526004810191909152336024820152604490fd5b50808552600586526001600160a01b03604086205416331415611740565b6024906040519063fe19f19f60e01b82526004820152fd5b5034610423576020806003193601126108195760043590611ab06140ff565b818352600b815260ff600160408520015460d01c16156108d157611ad382613569565b6005811015611c565760048103611afc5760248360405190634a5541ef60e01b82526004820152fd5b60038103611b1c576024836040519063fe19f19f60e01b82526004820152fd5b600214611c3e57611b4382600052600b6020526001600160a01b0360406000205416331490565b15610f3f57818352600b815260ff604084205460f01c1615611c2657818352600b81526040832060ff60f01b19815416905560058152826001600160a01b03604082205416803b611bcf575b50506040516000805160206145fb83398151915292807f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f8680a28152a180f35b803b15610819578180916024604051809481937f341a0bd90000000000000000000000000000000000000000000000000000000083528960048401525af115611b8f57611c1b90612b4d565b61081d578238611b8f565b602482604051906339c6dc7360e21b82526004820152fd5b602482604051906322cad1af60e11b82526004820152fd5b602484634e487b7160e01b81526021600452fd5b5034610423576020366003190112610423576004356001600160a01b039081811680910361081d5781835416338103610d595750600a5491816001600160a01b0319841617600a556040519216825260208201527fa2548bd4b805e907c1558a47b5858324fe8bb4a2e1ddfca647eecbf65610eebc60403392a26009546000198101908111611d275760407f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c91815190600182526020820152a180f35b602482634e487b7160e01b81526011600452fd5b503461042357602036600319011261042357600435808252600b60205260ff600160408420015460d01c16156104c75760408264ffffffffff9260209452600b8452205460c81c16604051908152f35b503461042357602036600319011261042357611da5612abb565b9080546001600160a01b0380821693338503611df7576001600160a01b03199394501691829116178255337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808380a380f35b6040516331b339a960e21b81526001600160a01b0386166004820152336024820152604490fd5b5034610423576020366003190112610423576001600160a01b03611e40612abb565b168015611e5d578160409160209352600683522054604051908152f35b608460405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e657200000000000000000000000000000000000000000000006064820152fd5b5034610423576020366003190112610423576001600160a01b036040602092600435611f0c6107288260005260056020526001600160a01b0360406000205416151590565b815260058452205416604051908152f35b5034610423576020366003190112610423576020611f3c600435612c72565b6001600160a01b0360405191168152f35b503461042357806003193601126104235760206001600160a01b0360015416604051908152f35b50346104235760203660031901126104235760ff6001604060043593848152600b60205220015460d01c16156104c7576105946020916135f0565b50346104235760203660031901126104235760043590818152600b60205260ff600160408320015460d01c16156108d15780611fea83613569565b9260058410156120255760026020940361200b575b50506040519015158152f35b8152600b8352604090205460f01c60ff1690503880611fff565b602482634e487b7160e01b81526021600452fd5b5034610423576020366003190112610423576004356120566140ff565b61205f8161328d565b156121605761206d81614452565b15611a3b5761207b81612c72565b61208482613256565b159081612158575b81612145575b5061212d576020816120b26000805160206145fb83398151915293612c72565b90808552600783526001600160a01b0360408620926001600160a01b03199384815416905516918286526006845260408620600019815401905581865260058452604086209081541690558085604051937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a48152a180f35b602490604051906378630aa960e01b82526004820152fd5b6001600160a01b03915016151538612092565b83915061208c565b602490604051907f817cd6390000000000000000000000000000000000000000000000000000000082526004820152fd5b5034610423576121a036612ae7565b60405191602083019383851067ffffffffffffffff8611176121cb57610a6994604052858452612d45565b634e487b7160e01b600052604160045260246000fd5b503461042357602036600319011261042357602061046b60043561328d565b503461042357602080600319360112610819576004359061221f6140ff565b6122288261328d565b156122455760248260405190634a5541ef60e01b82526004820152fd5b61224e826132f3565b61258c5761227282600052600b6020526001600160a01b0360406000205416331490565b158061256e575b610f3f5761228682613324565b91808452600b825261229d60026040862001613222565b6001600160801b039384825116858216101561255657828652600b845260ff604087205460f01c161561253e57816122e18287876117ad60409683839951166132c4565b848852600b845282882091612370835498600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8b161785558a6003828616968715612524575b019184169a828c6fffffffffffffffffffffffffffffffff198195541617905560016001600160a01b0380921698899360058c52600b8483832054169c522001541661415b565b33840361243b57908891853b6123ce575b5050507f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd260406000805160206145fb8339815191529786935b825191825288820152a4604051908152a180f35b853b1561081d576040516372eba20360e01b8152600481018890526001600160a01b03861660248201526001600160801b03918216604482015291166064820152818160848183895af1612423575b80612381565b61242c90612b4d565b61243757863861241d565b8680fd5b83989792983b612483575b50507f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd2604085926000805160206145fb83398151915298996123ba565b833b15612520576040516372eba20360e01b8152600481018790526001600160a01b03861660248201526001600160801b03918216604482015291166064820152868160848183875af16124d8575b80612446565b604085926000805160206145fb833981519152986125167f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd294612b4d565b98509250506124d2565b8780fd5b60018101600160c81b60ff60c81b19825416179055612329565b602483604051906339c6dc7360e21b82526004820152fd5b602483604051906322cad1af60e11b82526004820152fd5b50818352600581526001600160a01b03604084205416331415612279565b6024826040519063fe19f19f60e01b82526004820152fd5b5034610423576020366003190112610423576001600160801b0360406020926001600160a01b036125d3612abb565b16815260028452205416604051908152f35b503461042357610a696125f736612ae7565b9161260a6126058433612ddb565b612cd4565b612eba565b50346104235780600319360112610423576020600954604051908152f35b503461042357602036600319011261042357600435808252600b60205260ff600160408420015460d01c16156104c75761266690613569565b90600582101561138a5760208215838115612687575b506040519015158152f35b60019150148261267c565b50346104235760203660031901126104235760043590818152600b60205260ff600160408320015460d01c16156108d157602091604082828152600b85522060ff815460f01c1680612720575b6126f7575b50506001600160801b0360405191168152f35b61271992506001600160801b0360026127139201541691613324565b906132c4565b38806126e4565b5060ff600182015460c81c16156126df565b50346104235760403660031901126104235761274c612abb565b602435906001600160a01b03808061276385612c72565b1692169180831461285757803314908115612836575b50156127cc57828452600760205260408420826001600160a01b03198254161790556127a483612c72565b167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258480a480f35b608460405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152fd5b9050845260086020526040842033855260205260ff60408520541638612779565b608460405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152fd5b5034610423576020366003190112610423576020611f3c600435612c97565b5034610423578060031936011261042357604051908060035491600183811c92818516948515612998575b602095868610811461129f5785885287949392918790821561127d57505060011461293e57505061120f92500383612bd3565b90859250600382527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b85831061298057505061120f93508201013880611201565b80548389018501528794508693909201918101612968565b93607f169361290b565b905034610819576020366003190112610819576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361081d57602092507f80ac58cd000000000000000000000000000000000000000000000000000000008114908115612a49575b8115612a1f575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501438612a18565b7f5b5e139f0000000000000000000000000000000000000000000000000000000081149150612a11565b60005b838110612a865750506000910152565b8181015183820152602001612a76565b90602091612aaf81518092818552858086019101612a73565b601f01601f1916010190565b600435906001600160a01b0382168203610c2557565b602435906001600160a01b0382168203610c2557565b6060906003190112610c25576001600160a01b03906004358281168103610c2557916024359081168103610c25579060443590565b9181601f84011215610c255782359167ffffffffffffffff8311610c25576020808501948460051b010111610c2557565b67ffffffffffffffff81116121cb57604052565b610160810190811067ffffffffffffffff8211176121cb57604052565b610100810190811067ffffffffffffffff8211176121cb57604052565b6060810190811067ffffffffffffffff8211176121cb57604052565b6040810190811067ffffffffffffffff8211176121cb57604052565b90601f8019910116810190811067ffffffffffffffff8211176121cb57604052565b67ffffffffffffffff81116121cb57601f01601f191660200190565b604435906001600160801b0382168203610c2557565b15612c2e57565b606460405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152fd5b60005260056020526001600160a01b0360406000205416612c94811515612c27565b90565b612cba6107288260005260056020526001600160a01b0360406000205416151590565b60005260076020526001600160a01b036040600020541690565b15612cdb57565b608460405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f766564000000000000000000000000000000000000006064820152fd5b90612d69939291612d596126058433612ddb565b612d64838383612eba565b61306f565b15612d7057565b60405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b906001600160a01b038080612def84612c72565b16931691838314938415612e22575b508315612e0c575b50505090565b612e1891929350612c97565b1614388080612e06565b909350600052600860205260406000208260005260205260ff604060002054169238612dfe565b15612e5057565b608460405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152fd5b90612ee39291612ec983612c72565b916001600160a01b03948593848094169687911614612e49565b16908115612fd657612ef483613256565b1580612fce575b80612fc5575b612fad5791808492612f2f6000805160206145fb83398151915296602096612f2885612c72565b1614612e49565b60009382855260078652604085206001600160a01b031990818154169055818652600687526040862060001981540190558286526040862060018154019055838652600587528260408720918254161790557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6040519580a48152a1565b602483604051906378630aa960e01b82526004820152fd5b50831515612f01565b506001612efb565b608460405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152fd5b3d1561306a573d9061305082612bf5565b9161305e6040519384612bd3565b82523d6000602084013e565b606090565b91926000929190813b156131f9576020916130df91856040519586809581947f150b7a02000000000000000000000000000000000000000000000000000000009b8c84523360048501526001600160a01b0380951660248501526044840152608060648401526084830190612a96565b0393165af190829082613199575b5050613173576130fb61303f565b8051908161316e5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000161490565b909192506020813d82116131f1575b816131b560209383612bd3565b810103126108195751907fffffffff000000000000000000000000000000000000000000000000000000008216820361042357509038806130ed565b3d91506131a8565b5050505050600190565b6040519061321082612b9b565b60006040838281528260208201520152565b9060405161322f81612b9b565b6040819360018154916001600160801b0392838116865260801c6020860152015416910152565b80600052600b60205260ff60016040600020015460d01c16156104c757600052600b60205260ff60016040600020015460d81c1690565b80600052600b60205260ff60016040600020015460d01c16156104c757600052600b60205260ff60016040600020015460c81c1690565b6001600160801b0391821690821603919082116132dd57565b634e487b7160e01b600052601160045260246000fd5b80600052600b60205260ff60016040600020015460d01c16156104c757600052600b60205260406000205460f81c90565b600090808252600b6020526040822091825464ffffffffff42818360c81c16116133d25780600186015460a01c1691824210156133bc576133719394955060a01c168091039042036133da565b90828152600b6020526001600160801b03926133978460026040852001541680946134ba565b9283116133a45750501690565b60029350604092508152600b60205220015460801c90565b505050505060026001600160801b039101541690565b505091505090565b670de0b6b3a7640000916000198383099280830292838086109503948086039514613496578285101561345a57908291096001821901821680920460028082600302188083028203028083028203028083028203028083028203028083028203028092029003029360018380600003040190848311900302920304170290565b82606492604051927f63a05778000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b5050809250156134a4570490565b634e487b7160e01b600052601260045260246000fd5b9091906000198382098382029182808310920391808303921461355857670de0b6b3a7640000908183101561352157947faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066994950990828211900360ee1b910360121c170290565b60449086604051917f5173648d00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050670de0b6b3a764000090049150565b80600052600b602052604060002060ff600182015460c81c16600014613590575050600490565b805460f81c6135e9575460a01c64ffffffffff1642106135e3576135b381613324565b90600052600b6020526001600160801b0380600260406000200154169116106000146135de57600190565b600290565b50600090565b5050600390565b80600052600b6020526136096002604060002001613222565b81600052600b602052604060002060ff600182015460c81c1660001461363c57506001600160801b039150602001511690565b5460f81c61364e5750612c9490613324565b612c9491506001600160801b0360408183511692015116906132c4565b906001600160a01b036001541660206001600160a01b036060850151166024604051809481937fdcf844a700000000000000000000000000000000000000000000000000000000835260048301525afa8015613e9657600090613e62575b6136ec91506001600160801b0360408501511690602060e08601510151916144bb565b916001600160801b0383511660c08201519015613e385764ffffffffff815116602082019064ffffffffff82511690818111613df857505064ffffffffff604091511691019064ffffffffff8251169081811015613db857505064ffffffffff8042169151169081811015613d78575050600954926001600160801b038151166040519061377982612b9b565b815260006020820152600060408201526001600160a01b036060840151169060c08401519164ffffffffff6020840151169064ffffffffff604085015116906080870151151560a088015115159364ffffffffff6001600160a01b038a5116975116604051976137e889612b61565b88526020880152604087015260608601526000608086015260a085015260c0840152600060e0840152600161010084015261012083015261014082015284600052600b60205260406000206001600160a01b038251166001600160a01b031982541617815561387f64ffffffffff602084015116829064ffffffffff60a01b1964ffffffffff60a01b83549260a01b169116179055565b604082015181547eff0000000000000000000000000000000000000000000000000000000000006060850151151560f01b169078ffffffffffffffffffffffffffffffffffffffffffffffffff7dffffffffff000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000006080880151151560f81b169460c81b1691161717178155600181016001600160a01b0360a0840151166001600160a01b031982541617815561397664ffffffffff60c085015116829064ffffffffff60a01b1964ffffffffff60a01b83549260a01b169116179055565b60e083015181546101008501516101208601517fffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff90921692151560c81b79ff00000000000000000000000000000000000000000000000000169290921791151560d01b7aff0000000000000000000000000000000000000000000000000000169190911790151560d81b7bff00000000000000000000000000000000000000000000000000000016179055610140909101518051602082015160801b6fffffffffffffffffffffffffffffffff199081166001600160801b03928316176002850155926040906003019201511682825416179055600185016009556001600160a01b0360608401511660005260026020526001600160801b0380604060002054168160208501511601166001600160a01b036060850151166000526040600020918254161790556001600160a01b036020830151168015613d3457613afa613af48660005260056020526001600160a01b0360406000205416151590565b1561401c565b613b0385613256565b1580613d2c575b80613d24575b613d0c5760206000805160206145fb83398151915291613b49613af48860005260056020526001600160a01b0360406000205416151590565b806000526006825260406000206001815401905586600052600582526040600020816001600160a01b0319825416179055866040519160007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4868152a1613bd96001600160a01b036060840151166001600160801b03808451168160208601511601169030903390613ea2565b6001600160801b0360408201511680613cdd575b506001600160a01b038251167f075861cbceafeb777e8f15f357121b08f6f3adba387d599bb7b5278ca6192df5610160866001600160a01b0360208701511694613cd46001600160a01b03606089015116976080810151151560a0820151151590613c9e6001600160a01b0360e060c08601519501515116956040519788523360208901526040880190604090816001600160801b0391828151168552826020820151166020860152015116910152565b60a086015260c0850152805164ffffffffff90811660e08601526020820151811661010086015260409091015116610120840152565b610140820152a4565b613d06906001600160a01b036060850151166001600160a01b0360e08601515116903390613ea2565b38613bed565b602485604051906378630aa960e01b82526004820152fd5b506000613b10565b506001613b0a565b606460405162461bcd60e51b815260206004820152602060248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152fd5b6040517f210aec0e00000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b6040517f9fee269100000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b6040517f4c23297000000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b60046040517f6095d3bc000000000000000000000000000000000000000000000000000000008152fd5b6020823d602011613e8e575b81613e7b60209383612bd3565b8101031261042357506136ec90516136c9565b3d9150613e6e565b6040513d6000823e3d90fd5b9290604051927f23b872dd0000000000000000000000000000000000000000000000000000000060208501526001600160a01b03809216602485015216604483015260648201526064815260a081019181831067ffffffffffffffff8411176121cb57613f1192604052613f13565b565b6001600160a01b031690613f73604051613f2c81612bb7565b6020938482527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564858301526000808587829751910182855af1613f6d61303f565b91614067565b805191821591848315613ff8575b505050905015613f8e5750565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b91938180945001031261081957820151908115158203610423575080388084613f81565b1561402357565b606460405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152fd5b919290156140c8575081511561407b575090565b3b156140845790565b606460405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b8251909150156140db5750805190602001fd5b6103f79060405191829162461bcd60e51b8352602060048401526024830190612a96565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361413157565b60046040517fa1c0d6e5000000000000000000000000000000000000000000000000000000008152fd5b916001600160a01b03604051927fa9059cbb000000000000000000000000000000000000000000000000000000006020850152166024830152604482015260448152608081019181831067ffffffffffffffff8411176121cb57613f1192604052613f13565b612c94906141ce816135f0565b90600052600b60205260026040600020015460801c906132c4565b91908110156141f95760051b0190565b634e487b7160e01b600052603260045260246000fd5b9190916001600160801b03808094169116019182116132dd57565b929190926001600160801b0380614240836141c1565b1692818116938085116144155750600095838752602092600b84526142b36142736040946002868c20015460801c61420f565b868a52600b86526142ae6002868c20019182906001600160801b036fffffffffffffffffffffffffffffffff1983549260801b169116179055565b613222565b906142ce8186840151169282868183511692015116906132c4565b1611156143e6575b838752600b83526001600160a01b03916142f98683856001858d2001541661415b565b8488526005845282818920541680331415806143dc575b614345575b507ffa54f9f9bdcdd28778cbb9f78490df6691cc4e2729588e10f4cc0a26c465686a9495969750519586521693a3565b803b156143d85797807ffa54f9f9bdcdd28778cbb9f78490df6691cc4e2729588e10f4cc0a26c465686a9697989960848451809481937f13375c3b0000000000000000000000000000000000000000000000000000000083528c600484015233602484015289891660448401528d60648401525af16143c9575b8897969550614315565b6143d290612b4d565b386143bf565b8880fd5b50803b1515614310565b838752600b835281872060018101600160c81b60ff60c81b1982541617905560ff60f01b1981541690556142d6565b8360649186604051927fa1fb2bbc000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b60009080825260056020526001600160a01b038060408420541692833314938415614497575b5050821561448557505090565b9091506144923392612c97565b161490565b60ff9294509060409181526008602052818120338252602052205416913880614478565b9092916144c6613203565b936001600160801b03928381169182156145d25767016345785d8a000080821161459b578085116145645750614510856145018193866134ba565b169460208901958652846134ba565b16918461452760408901948086528287511661420f565b16101561454e57614540849182614549955116906132c4565b915116906132c4565b168252565b634e487b7160e01b600052600160045260246000fd5b84604491604051917f4fea5c1a00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b60449250604051917f47152d6700000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b505050505090506040516145e581612b9b565b6000815260006020820152600060408201529056fef8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7"; + hex"60a034620003e757601f196001600160401b03601f62004a433881900382810185168601919084831187841017620003ec57808792606094604052833981010312620003e75783516001600160a01b03928382169291839003620003e7576020918287015196858816809803620003e75760400151948516809503620003e7576200008962000402565b90601c82527f5361626c696572205632204c6f636b7570204c696e656172204e46540000000084830152620000bd62000402565b601181527029a0a116ab1916a627a1a5aaa816a624a760791b8582015230608052600080546001600160a01b031990811688178255600180548216909b178b5596817fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a38351858111620003d35760039485548c81811c91168015620003c8575b89821014620003b45790818684931162000361575b508890868311600114620002f8578492620002ec575b505060001982871b1c1916908b1b1784555b8151948511620002d8576004958654998b8b811c9b168015620002cd575b828c1014620002ba57848b1162000271575b869798999a50819487116001146200020a57505093620001fe575b505082871b92600019911b1c19161790555b600a541617600a5560095560405161462090816200042382396080518161410e0152f35b015191503880620001c8565b8883528183208c9890969594939116915b8282106200025757505085116200023c575b50505050811b019055620001da565b01519060f884600019921b161c19169055388080806200022d565b8484015187558c989096019593840193908101906200021b565b87835281832085880160051c81019b838910620002af575b860160051c019a8c905b8c8110620002a3575050620001ad565b848155018c9062000293565b909b508b9062000289565b634e487b7160e01b835260228852602483fd5b9a607f169a6200019b565b634e487b7160e01b81526041600452602490fd5b0151905038806200016b565b908c8e9416918886528a862092865b8c82821062000341575050841162000328575b505050811b0184556200017d565b015160001983891b60f8161c191690553880806200031a565b91929395968291958786015181550195019301908f959493929162000307565b9091508684528884208680850160051c8201928b8610620003aa575b918f91869594930160051c01915b8281106200039b57505062000155565b8681558594508f91016200038b565b925081926200037d565b634e487b7160e01b84526022600452602484fd5b90607f169062000140565b634e487b7160e01b82526041600452602482fd5b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620003ec5760405256fe608080604052600436101561001357600080fd5b600090813560e01c90816301ffc9a7146129a45750806306fdde03146128e2578063081812fc146128c3578063095ea7b3146127345780631400ecec146126945780631c1cdd4c1461262f5780631e99d5691461261157806323b872dd146125e757806339a73c03146125a657806340e58ee514612202578063425d30dd146121e357806342842e0e1461219357806342966c681461203b5780634857501f14611fb15780634869e12d14611f765780635fe3b56714611f4f5780636352211e14611f1f5780636d0cee7514611ec957806370a0823114611e2057806375829def14611d8d578063780a82c814611d3d5780637cad6cd114611c6c5780637de6b1db14611a935780638659c2701461167f578063894e9a0d1461142b5780638bad38dd146113ae5780638f69b993146113125780639067b677146112bf57806395d89b41146111b257806396ce143114611093578063a22cb46514610fc2578063a2ffb89714610d84578063a6202bf214610c7e578063a80fc07114610c2c578063ab167ccc14610af3578063ad35efd414610a91578063b256456914610a72578063b88d4fde146109e1578063b8a3be66146109ac578063b971302a1461095d578063bc063e1a1461093a578063bc2be1be146108ea578063c156a11d1461082f578063c87b56dd146106f1578063cc364f4814610643578063d4dbd20b146105f1578063d511609f146105a5578063d975dfed14610559578063e985e9c514610504578063ea5ead19146104de578063eac8f5b814610475578063f590c1761461044c578063f851a440146104265763fdd46d601461027357600080fd5b346104235760603660031901126104235760043561028f612ad3565b610297612c13565b906102a0614104565b6102a983613291565b61040b576102cd83600052600b6020526001600160a01b0360406000205416331490565b15806103fb575b6103d8576102f883600052600b6020526001600160a01b0360406000205416331490565b806103b6575b610389576001600160a01b0381161561035f576001600160801b03821615610347579161033d602092600080516020614600833981519152948361422f565b604051908152a180f35b6024836040519063d2aabcd960e01b82526004820152fd5b60046040517fc61a0e9e000000000000000000000000000000000000000000000000000000008152fd5b826001600160a01b0360649260405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b5082845260056020526001600160a01b038060408620541690821614156102fe565b60405163216caf0d60e01b815260048101849052336024820152604490fd5b0390fd5b5061040583614457565b156102d4565b60248360405190634a5541ef60e01b82526004820152fd5b80fd5b50346104235780600319360112610423576001600160a01b036020915416604051908152f35b503461042357602036600319011261042357602061046b6004356132f7565b6040519015158152f35b503461042357602036600319011261042357600435808252600b60205260ff600160408420015460d01c16156104c75760016040836001600160a01b039360209552600b855220015416604051908152f35b6024906040519062b8e7e760e51b82526004820152fd5b5034610423576040366003190112610423576004356104fb612ad3565b610297826141c6565b50346104235760403660031901126104235761051e612abd565b6040610528612ad3565b926001600160a01b0380931681526008602052209116600052602052602060ff604060002054166040519015158152f35b50346104235760203660031901126104235760ff6001604060043593848152600b60205220015460d01c16156104c7576105946020916141c6565b6001600160801b0360405191168152f35b503461042357602036600319011261042357600435808252600b60205260ff600160408420015460d01c16156104c75760408260029260209452600b845220015460801c604051908152f35b503461042357602036600319011261042357600435808252600b60205260ff600160408420015460d01c16156104c75760036040836001600160801b039360209552600b855220015416604051908152f35b503461042357602036600319011261042357600435610660613207565b50808252600b60205260ff600160408420015460d01c16156104c7578160409160609352600b60205220600181549164ffffffffff918291015460a01c1690604051926106ac84612b9d565b818160a01c16845260c81c16602083015260408201526106ef60405180926040908164ffffffffff91828151168552826020820151166020860152015116910152565bf35b50346104235760208060031936011261081b5760043561072f61072a8260005260056020526001600160a01b0360406000205416151590565b612c29565b826001600160a01b03600a5416916044604051809481937fe9dc637500000000000000000000000000000000000000000000000000000000835230600484015260248301525afa92831561082357809361079e575b505061079a604051928284938452830190612a98565b0390f35b909192503d8082843e6107b18184612bd5565b820191838184031261081b5780519067ffffffffffffffff821161081f570182601f8201121561081b578051916107e783612bf7565b936107f56040519586612bd5565b83855285848401011161042357509061081391848085019101612a75565b903880610784565b5080fd5b8280fd5b604051903d90823e3d90fd5b50346104235760403660031901126104235760043561084c612ad3565b610854614104565b818352600b60205260ff600160408520015460d01c16156108d35781835260056020526001600160a01b036040842054168033036103d8579161033d81602093600080516020614600833981519152956108ad836141c6565b6001600160801b0381166108c2575b50612ebc565b6108cd90828561422f565b386108bc565b6024826040519062b8e7e760e51b82526004820152fd5b503461042357602036600319011261042357600435808252600b60205260ff600160408420015460d01c16156104c75760408264ffffffffff9260209452600b8452205460a01c16604051908152f35b5034610423578060031936011261042357602060405167016345785d8a00008152f35b503461042357602036600319011261042357600435808252600b60205260ff600160408420015460d01c16156104c7576040826001600160a01b039260209452600b8452205416604051908152f35b50346104235760203660031901126104235760ff600160406020936004358152600b855220015460d01c166040519015158152f35b5034610423576080366003190112610423576109fb612abd565b610a03612ad3565b906064359067ffffffffffffffff8211610a6e5736602383011215610a6e5781600401359284610a3285612bf7565b93610a406040519586612bd5565b858552366024878301011161081b5785610a6b96602460209301838801378501015260443591612d47565b80f35b8380fd5b503461042357602036600319011261042357602061046b60043561325a565b503461042357602036600319011261042357600435808252600b60205260ff600160408420015460d01c16156104c757610aca9061356d565b604051906005811015610adf57602092508152f35b602483634e487b7160e01b81526021600452fd5b50346104235761014036600319011261042357610b0e614104565b610b16613207565b9064ffffffffff80421680845260c4358281168103610c275781018216602085015260e435908183168203610c275701166040830152606435916001600160a01b03918284168094036104235750608435801515809103610c275760a43590811515809203610c275760243594848616809603610c275760043595858716809703610c2757604435906001600160801b038216809203610c275760405197610bbd89612b80565b8852602088015260408701526060860152608085015260a084015260c0830152604061010319360112610c275760405191610bf783612bb9565b610104359182168203610c275782610c1f9260209452610124358482015260e082015261366f565b604051908152f35b600080fd5b503461042357602036600319011261042357600435808252600b60205260ff600160408420015460d01c16156104c75760026040836001600160801b039360209552600b855220015416604051908152f35b503461042357602036600319011261042357610c98612abd565b6001600160a01b0380835416338103610d5b575081169081835260026020526001600160801b03604084205416908115610d2a5781610cfb918486526002602052604086206fffffffffffffffffffffffffffffffff1981541690553390614160565b6040519081527fca7a4a65a94ed2f37538814e00e1cd4c41a78261561e3f3794592f11409cf5af60203392a380f35b602483604051907f8410168c0000000000000000000000000000000000000000000000000000000082526004820152fd5b6040516331b339a960e21b81526001600160a01b03919091166004820152336024820152604490fd5b50346104235760603660031901126104235767ffffffffffffffff60043581811161081f57610db7903690600401612b1e565b91610dc0612ad3565b90604435908111610fbe57610dd9903690600401612b1e565b9093610de3614104565b818103610f8857855b818110610df7578680f35b610e028183876141ee565b35610e0e8285896141ee565b356001600160801b0381168103610c2757610e27614104565b610e3082613291565b610f7057610e5482600052600b6020526001600160a01b0360406000205416331490565b1580610f60575b610f4157610e7f82600052600b6020526001600160a01b0360406000205416331490565b80610f19575b610eec576001600160a01b0386161561035f576001600160801b03811615610ed457602082610ec760008051602061460083398151915293896001979661422f565b604051908152a101610dec565b6024826040519063d2aabcd960e01b82526004820152fd5b6064826001600160a01b038860405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b5081895260056020526001600160a01b0360408a2054166001600160a01b0387161415610e85565b60405163216caf0d60e01b815260048101839052336024820152604490fd5b50610f6a82614457565b15610e5b565b60248260405190634a5541ef60e01b82526004820152fd5b604491604051917faec9344000000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b8480fd5b503461042357604036600319011261042357610fdc612abd565b60243590811515809203610c27576001600160a01b03169081331461104f5733835260086020526040832082600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a380f35b606460405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152fd5b503461042357610160366003190112610423576110ae614104565b604051906110bb82612b80565b6110c3612abd565b82526110cd612ad3565b60208301526110da612c13565b60408301526001600160a01b03906064358281168103610c275760608401526084358015158103610c2757608084015260a4358015158103610c275760a084015260603660c3190112610423575060405161113481612b9d565b64ffffffffff60c4358181168103610c2757825260e4358181168103610c27576020830152610104359081168103610c2757604082015260c0830152604061012319360112610c27576040519161118a83612bb9565b610124359182168203610c275782610c1f9260209452610144358482015260e082015261366f565b5034610423578060031936011261042357604051908060045491600183811c928185169485156112b5575b60209586861081146112a15785885287949392918790821561127f575050600114611225575b505061121192500383612bd5565b61079a604051928284938452830190612a98565b90859250600482527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5b85831061126757505061121193508201013880611203565b8054838901850152879450869390920191810161124f565b925093505061121194915060ff191682840152151560051b8201013880611203565b602483634e487b7160e01b81526022600452fd5b93607f16936111dd565b503461042357602036600319011261042357600435808252600b60205260ff600160408420015460d01c16156104c757600160408364ffffffffff9360209552600b855220015460a01c16604051908152f35b503461042357602036600319011261042357600435808252600b60205260ff600160408420015460d01c16156104c75761134b9061356d565b906005821015908161138c57600283149182156113a0575b8215611377575b6020836040519015158152f35b90915061138c5750600460209114388061136a565b80634e487b7160e01b602492526021600452fd5b506003831491506000611363565b5034610423576020366003190112610423576004356001600160a01b039081811680910361081f5781835416338103610d5b575060015491816001600160a01b03198416176001556040519216825260208201527fdcb09aef4bf01068924ccce937981cbe59d25ba08380cf941aaaea4e4bd3960d60403392a280f35b50346104235760203660031901126104235760405161144981612b63565b8181528160208201528160408201528160608201528160808201528160a08201528160c08201528160e0820152816101008201528161012082015261014061148f613207565b9101526004358152600b60205260ff600160408320015460d01c1615611667576004358152600b602052604081206115686002604051926114cf84612b63565b80546001600160a01b038116855264ffffffffff8160a01c16602086015264ffffffffff8160c81c16604086015260ff8160f01c161515606086015260f81c1515608085015260ff60018201546001600160a01b03811660a087015264ffffffffff8160a01c1660c0870152818160c81c16151560e0870152818160d01c16151561010087015260d81c16151561012085015201613226565b61014082015261157960043561356d565b6005811015610adf579160026101a0931461165c575b506106ef610140604051926001600160a01b03815116845264ffffffffff602082015116602085015264ffffffffff60408201511660408501526060810151151560608501526080810151151560808501526001600160a01b0360a08201511660a085015264ffffffffff60c08201511660c085015260e0810151151560e0850152610100810151151561010085015261012081015115156101208501520151610140830190604090816001600160801b0391828151168552826020820151166020860152015116910152565b60608201523861158f565b602460405162b8e7e760e51b81526004356004820152fd5b503461042357602090816003193601126104235760043567ffffffffffffffff811161081b576116b483913690600401612b1e565b906116bd614104565b83915b8083106116cb578480f35b6116da838284979596976141ee565b35936116e4614104565b6116ed85613291565b1561170a5760248560405190634a5541ef60e01b82526004820152fd5b90919293611717816132f7565b611a7b5761173b81600052600b6020526001600160a01b0360406000205416331490565b1580611a5d575b611a3d5761174f81613328565b818652600b9081885261176760026040892001613226565b6001600160801b0391828251168382161015611a2557848952838a5260ff60408a205460f01c1615611a0d579282826117b986838e6117af8f9a829a60409e9d9a51166132c8565b94015116906132c8565b84875283865288872091611848835494600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff871617855560038185169586156119f3575b0190831699818b6fffffffffffffffffffffffffffffffff19819454161790556001600160a01b0380971696879160058c52818f82205416998c5260019e8f9120015416614160565b33840361193157843b6118aa575b50507f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd260406000805160206146008339815191529786935b825191825288820152a4604051908152a10191909392936116c0565b90919293809596503b1561192d576040516372eba20360e01b8152600481018790526001600160a01b03851660248201526001600160801b039182166044820152911660648201528b94939291908b90818160848183895af115611856576119189192939597949650612b4f565b61192957918a939194928a8d611856565b8980fd5b8b80fd5b833b611974575b50507f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd2604060008051602061460083398151915297869361188e565b90919280949596503b1561192d576040516372eba20360e01b8152600481018790526001600160a01b03861660248201526001600160801b039182166044820152911660648201528b94939291908b90818160848183885af115611938576119e29192939597949650612b4f565b61192957918a939194928a8d611938565b60018101600160c81b60ff60c81b198254161790556117ff565b602485604051906339c6dc7360e21b82526004820152fd5b602485604051906322cad1af60e11b82526004820152fd5b60405163216caf0d60e01b81526004810191909152336024820152604490fd5b50808552600586526001600160a01b03604086205416331415611742565b6024906040519063fe19f19f60e01b82526004820152fd5b50346104235760208060031936011261081b5760043590611ab2614104565b818352600b815260ff600160408520015460d01c16156108d357611ad58261356d565b6005811015611c585760048103611afe5760248360405190634a5541ef60e01b82526004820152fd5b60038103611b1e576024836040519063fe19f19f60e01b82526004820152fd5b600214611c4057611b4582600052600b6020526001600160a01b0360406000205416331490565b15610f4157818352600b815260ff604084205460f01c1615611c2857818352600b81526040832060ff60f01b19815416905560058152826001600160a01b03604082205416803b611bd1575b505060405160008051602061460083398151915292807f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f8680a28152a180f35b803b1561081b578180916024604051809481937f341a0bd90000000000000000000000000000000000000000000000000000000083528960048401525af115611b9157611c1d90612b4f565b61081f578238611b91565b602482604051906339c6dc7360e21b82526004820152fd5b602482604051906322cad1af60e11b82526004820152fd5b602484634e487b7160e01b81526021600452fd5b5034610423576020366003190112610423576004356001600160a01b039081811680910361081f5781835416338103610d5b5750600a5491816001600160a01b0319841617600a556040519216825260208201527fa2548bd4b805e907c1558a47b5858324fe8bb4a2e1ddfca647eecbf65610eebc60403392a26009546000198101908111611d295760407f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c91815190600182526020820152a180f35b602482634e487b7160e01b81526011600452fd5b503461042357602036600319011261042357600435808252600b60205260ff600160408420015460d01c16156104c75760408264ffffffffff9260209452600b8452205460c81c16604051908152f35b503461042357602036600319011261042357611da7612abd565b9080546001600160a01b0380821693338503611df9576001600160a01b03199394501691829116178255337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808380a380f35b6040516331b339a960e21b81526001600160a01b0386166004820152336024820152604490fd5b5034610423576020366003190112610423576001600160a01b03611e42612abd565b168015611e5f578160409160209352600683522054604051908152f35b608460405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e657200000000000000000000000000000000000000000000006064820152fd5b5034610423576020366003190112610423576001600160a01b036040602092600435611f0e61072a8260005260056020526001600160a01b0360406000205416151590565b815260058452205416604051908152f35b5034610423576020366003190112610423576020611f3e600435612c74565b6001600160a01b0360405191168152f35b503461042357806003193601126104235760206001600160a01b0360015416604051908152f35b50346104235760203660031901126104235760ff6001604060043593848152600b60205220015460d01c16156104c7576105946020916135f4565b50346104235760203660031901126104235760043590818152600b60205260ff600160408320015460d01c16156108d35780611fec8361356d565b9260058410156120275760026020940361200d575b50506040519015158152f35b8152600b8352604090205460f01c60ff1690503880612001565b602482634e487b7160e01b81526021600452fd5b503461042357602036600319011261042357600435612058614104565b61206181613291565b156121625761206f81614457565b15611a3d5761207d81612c74565b6120868261325a565b15908161215a575b81612147575b5061212f576020816120b460008051602061460083398151915293612c74565b90808552600783526001600160a01b0360408620926001600160a01b03199384815416905516918286526006845260408620600019815401905581865260058452604086209081541690558085604051937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a48152a180f35b602490604051906378630aa960e01b82526004820152fd5b6001600160a01b03915016151538612094565b83915061208e565b602490604051907f817cd6390000000000000000000000000000000000000000000000000000000082526004820152fd5b5034610423576121a236612ae9565b60405191602083019383851067ffffffffffffffff8611176121cd57610a6b94604052858452612d47565b634e487b7160e01b600052604160045260246000fd5b503461042357602036600319011261042357602061046b600435613291565b50346104235760208060031936011261081b5760043590612221614104565b61222a82613291565b156122475760248260405190634a5541ef60e01b82526004820152fd5b612250826132f7565b61258e5761227482600052600b6020526001600160a01b0360406000205416331490565b1580612570575b610f415761228882613328565b91808452600b825261229f60026040862001613226565b6001600160801b039384825116858216101561255857828652600b845260ff604087205460f01c161561254057816122e38287876117af60409683839951166132c8565b848852600b845282882091612372835498600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8b161785558a6003828616968715612526575b019184169a828c6fffffffffffffffffffffffffffffffff198195541617905560016001600160a01b0380921698899360058c52600b8483832054169c5220015416614160565b33840361243d57908891853b6123d0575b5050507f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd260406000805160206146008339815191529786935b825191825288820152a4604051908152a180f35b853b1561081f576040516372eba20360e01b8152600481018890526001600160a01b03861660248201526001600160801b03918216604482015291166064820152818160848183895af1612425575b80612383565b61242e90612b4f565b61243957863861241f565b8680fd5b83989792983b612485575b50507f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd26040859260008051602061460083398151915298996123bc565b833b15612522576040516372eba20360e01b8152600481018790526001600160a01b03861660248201526001600160801b03918216604482015291166064820152868160848183875af16124da575b80612448565b60408592600080516020614600833981519152986125187f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd294612b4f565b98509250506124d4565b8780fd5b60018101600160c81b60ff60c81b1982541617905561232b565b602483604051906339c6dc7360e21b82526004820152fd5b602483604051906322cad1af60e11b82526004820152fd5b50818352600581526001600160a01b0360408420541633141561227b565b6024826040519063fe19f19f60e01b82526004820152fd5b5034610423576020366003190112610423576001600160801b0360406020926001600160a01b036125d5612abd565b16815260028452205416604051908152f35b503461042357610a6b6125f936612ae9565b9161260c6126078433612ddd565b612cd6565b612ebc565b50346104235780600319360112610423576020600954604051908152f35b503461042357602036600319011261042357600435808252600b60205260ff600160408420015460d01c16156104c7576126689061356d565b90600582101561138c5760208215838115612689575b506040519015158152f35b60019150148261267e565b50346104235760203660031901126104235760043590818152600b60205260ff600160408320015460d01c16156108d357602091604082828152600b85522060ff815460f01c1680612722575b6126f9575b50506001600160801b0360405191168152f35b61271b92506001600160801b0360026127159201541691613328565b906132c8565b38806126e6565b5060ff600182015460c81c16156126e1565b50346104235760403660031901126104235761274e612abd565b602435906001600160a01b03808061276585612c74565b1692169180831461285957803314908115612838575b50156127ce57828452600760205260408420826001600160a01b03198254161790556127a683612c74565b167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258480a480f35b608460405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152fd5b9050845260086020526040842033855260205260ff6040852054163861277b565b608460405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152fd5b5034610423576020366003190112610423576020611f3e600435612c99565b5034610423578060031936011261042357604051908060035491600183811c9281851694851561299a575b60209586861081146112a15785885287949392918790821561127f57505060011461294057505061121192500383612bd5565b90859250600382527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b85831061298257505061121193508201013880611203565b8054838901850152879450869390920191810161296a565b93607f169361290d565b90503461081b57602036600319011261081b576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361081f57602092507f80ac58cd000000000000000000000000000000000000000000000000000000008114908115612a4b575b8115612a21575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501438612a1a565b7f5b5e139f0000000000000000000000000000000000000000000000000000000081149150612a13565b60005b838110612a885750506000910152565b8181015183820152602001612a78565b90602091612ab181518092818552858086019101612a75565b601f01601f1916010190565b600435906001600160a01b0382168203610c2757565b602435906001600160a01b0382168203610c2757565b6060906003190112610c27576001600160a01b03906004358281168103610c2757916024359081168103610c27579060443590565b9181601f84011215610c275782359167ffffffffffffffff8311610c27576020808501948460051b010111610c2757565b67ffffffffffffffff81116121cd57604052565b610160810190811067ffffffffffffffff8211176121cd57604052565b610100810190811067ffffffffffffffff8211176121cd57604052565b6060810190811067ffffffffffffffff8211176121cd57604052565b6040810190811067ffffffffffffffff8211176121cd57604052565b90601f8019910116810190811067ffffffffffffffff8211176121cd57604052565b67ffffffffffffffff81116121cd57601f01601f191660200190565b604435906001600160801b0382168203610c2757565b15612c3057565b606460405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152fd5b60005260056020526001600160a01b0360406000205416612c96811515612c29565b90565b612cbc61072a8260005260056020526001600160a01b0360406000205416151590565b60005260076020526001600160a01b036040600020541690565b15612cdd57565b608460405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f766564000000000000000000000000000000000000006064820152fd5b90612d6b939291612d5b6126078433612ddd565b612d66838383612ebc565b613075565b15612d7257565b60405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b906001600160a01b038080612df184612c74565b16931691838314938415612e24575b508315612e0e575b50505090565b612e1a91929350612c99565b1614388080612e08565b909350600052600860205260406000208260005260205260ff604060002054169238612e00565b15612e5257565b608460405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152fd5b90612ee59291612ecb83612c74565b916001600160a01b03948593848094169687911614612e4b565b1690811580612fdc57612ef78461325a565b159081612fd3575b5080612fca575b612fb25791808492612f3460008051602061460083398151915296602096612f2d85612c74565b1614612e4b565b60009382855260078652604085206001600160a01b031990818154169055818652600687526040862060001981540190558286526040862060018154019055838652600587528260408720918254161790557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6040519580a48152a1565b602483604051906378630aa960e01b82526004820152fd5b50831515612f06565b90501538612eff565b608460405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152fd5b3d15613070573d9061305682612bf7565b916130646040519384612bd5565b82523d6000602084013e565b606090565b9290803b156131fe576130df916020916001600160a01b0394604051809581948293897f150b7a02000000000000000000000000000000000000000000000000000000009b8c86523360048701521660248501526044840152608060648401526084830190612a98565b03916000968791165af19082908261319e575b505061317857613100613045565b805190816131735760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000161490565b909192506020813d82116131f6575b816131ba60209383612bd5565b8101031261081b5751907fffffffff000000000000000000000000000000000000000000000000000000008216820361042357509038806130f2565b3d91506131ad565b50505050600190565b6040519061321482612b9d565b60006040838281528260208201520152565b9060405161323381612b9d565b6040819360018154916001600160801b0392838116865260801c6020860152015416910152565b80600052600b60205260ff60016040600020015460d01c16156104c757600052600b60205260ff60016040600020015460d81c1690565b80600052600b60205260ff60016040600020015460d01c16156104c757600052600b60205260ff60016040600020015460c81c1690565b6001600160801b0391821690821603919082116132e157565b634e487b7160e01b600052601160045260246000fd5b80600052600b60205260ff60016040600020015460d01c16156104c757600052600b60205260406000205460f81c90565b600090808252600b6020526040822091825464ffffffffff42818360c81c16116133d65780600186015460a01c1691824210156133c0576133759394955060a01c168091039042036133de565b90828152600b6020526001600160801b039261339b8460026040852001541680946134be565b9283116133a85750501690565b60029350604092508152600b60205220015460801c90565b505050505060026001600160801b039101541690565b505091505090565b670de0b6b3a764000091600019838309928083029283808610950394808603951461349a578285101561345e57908291096001821901821680920460028082600302188083028203028083028203028083028203028083028203028083028203028092029003029360018380600003040190848311900302920304170290565b82606492604051927f63a05778000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b5050809250156134a8570490565b634e487b7160e01b600052601260045260246000fd5b9091906000198382098382029182808310920391808303921461355c57670de0b6b3a7640000908183101561352557947faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066994950990828211900360ee1b910360121c170290565b60449086604051917f5173648d00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050670de0b6b3a764000090049150565b80600052600b602052604060002060ff600182015460c81c16600014613594575050600490565b805460f81c6135ed575460a01c64ffffffffff1642106135e7576135b781613328565b90600052600b6020526001600160801b0380600260406000200154169116106000146135e257600190565b600290565b50600090565b5050600390565b80600052600b60205261360d6002604060002001613226565b81600052600b602052604060002060ff600182015460c81c1660001461364057506001600160801b039150602001511690565b5460f81c6136525750612c9690613328565b612c9691506001600160801b0360408183511692015116906132c8565b906001600160a01b036001541660206001600160a01b036060850151166024604051809481937fdcf844a700000000000000000000000000000000000000000000000000000000835260048301525afa8015613e9b57600090613e67575b6136f091506001600160801b0360408501511690602060e08601510151916144c0565b916001600160801b0383511660c08201519015613e3d5764ffffffffff815116602082019064ffffffffff82511690818111613dfd57505064ffffffffff604091511691019064ffffffffff8251169081811015613dbd57505064ffffffffff8042169151169081811015613d7d575050600954926001600160801b038151166040519061377d82612b9d565b815260006020820152600060408201526001600160a01b036060840151169060c08401519164ffffffffff6020840151169064ffffffffff604085015116906080870151151560a088015115159364ffffffffff6001600160a01b038a5116975116604051976137ec89612b63565b88526020880152604087015260608601526000608086015260a085015260c0840152600060e0840152600161010084015261012083015261014082015284600052600b60205260406000206001600160a01b038251166001600160a01b031982541617815561388364ffffffffff602084015116829064ffffffffff60a01b1964ffffffffff60a01b83549260a01b169116179055565b604082015181547eff0000000000000000000000000000000000000000000000000000000000006060850151151560f01b169078ffffffffffffffffffffffffffffffffffffffffffffffffff7dffffffffff000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000006080880151151560f81b169460c81b1691161717178155600181016001600160a01b0360a0840151166001600160a01b031982541617815561397a64ffffffffff60c085015116829064ffffffffff60a01b1964ffffffffff60a01b83549260a01b169116179055565b60e083015181546101008501516101208601517fffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff90921692151560c81b79ff00000000000000000000000000000000000000000000000000169290921791151560d01b7aff0000000000000000000000000000000000000000000000000000169190911790151560d81b7bff00000000000000000000000000000000000000000000000000000016179055610140909101518051602082015160801b6fffffffffffffffffffffffffffffffff199081166001600160801b03928316176002850155926040906003019201511682825416179055600185016009556001600160a01b0360608401511660005260026020526001600160801b0380604060002054168160208501511601166001600160a01b036060850151166000526040600020918254161790556001600160a01b036020830151168015613d3957613afe613af88660005260056020526001600160a01b0360406000205416151590565b15614021565b613b078561325a565b1580613d30575b80613d28575b613d1057602060008051602061460083398151915291613b4d613af88860005260056020526001600160a01b0360406000205416151590565b806000526006825260406000206001815401905586600052600582526040600020816001600160a01b0319825416179055866040519160007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4868152a1613bdd6001600160a01b036060840151166001600160801b03808451168160208601511601169030903390613ea7565b6001600160801b0360408201511680613ce1575b506001600160a01b038251167f075861cbceafeb777e8f15f357121b08f6f3adba387d599bb7b5278ca6192df5610160866001600160a01b0360208701511694613cd86001600160a01b03606089015116976080810151151560a0820151151590613ca26001600160a01b0360e060c08601519501515116956040519788523360208901526040880190604090816001600160801b0391828151168552826020820151166020860152015116910152565b60a086015260c0850152805164ffffffffff90811660e08601526020820151811661010086015260409091015116610120840152565b610140820152a4565b613d0a906001600160a01b036060850151166001600160a01b0360e08601515116903390613ea7565b38613bf1565b602485604051906378630aa960e01b82526004820152fd5b506000613b14565b50801515613b0e565b606460405162461bcd60e51b815260206004820152602060248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152fd5b6040517f210aec0e00000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b6040517f9fee269100000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b6040517f4c23297000000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b60046040517f6095d3bc000000000000000000000000000000000000000000000000000000008152fd5b6020823d602011613e93575b81613e8060209383612bd5565b8101031261042357506136f090516136cd565b3d9150613e73565b6040513d6000823e3d90fd5b9290604051927f23b872dd0000000000000000000000000000000000000000000000000000000060208501526001600160a01b03809216602485015216604483015260648201526064815260a081019181831067ffffffffffffffff8411176121cd57613f1692604052613f18565b565b6001600160a01b031690613f78604051613f3181612bb9565b6020938482527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564858301526000808587829751910182855af1613f72613045565b9161406c565b805191821591848315613ffd575b505050905015613f935750565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b91938180945001031261081b57820151908115158203610423575080388084613f86565b1561402857565b606460405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152fd5b919290156140cd5750815115614080575090565b3b156140895790565b606460405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b8251909150156140e05750805190602001fd5b6103f79060405191829162461bcd60e51b8352602060048401526024830190612a98565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361413657565b60046040517fa1c0d6e5000000000000000000000000000000000000000000000000000000008152fd5b916001600160a01b03604051927fa9059cbb000000000000000000000000000000000000000000000000000000006020850152166024830152604482015260448152608081019181831067ffffffffffffffff8411176121cd57613f1692604052613f18565b612c96906141d3816135f4565b90600052600b60205260026040600020015460801c906132c8565b91908110156141fe5760051b0190565b634e487b7160e01b600052603260045260246000fd5b9190916001600160801b03808094169116019182116132e157565b929190926001600160801b0380614245836141c6565b16928181169380851161441a5750600095838752602092600b84526142b86142786040946002868c20015460801c614214565b868a52600b86526142b36002868c20019182906001600160801b036fffffffffffffffffffffffffffffffff1983549260801b169116179055565b613226565b906142d38186840151169282868183511692015116906132c8565b1611156143eb575b838752600b83526001600160a01b03916142fe8683856001858d20015416614160565b8488526005845282818920541680331415806143e1575b61434a575b507ffa54f9f9bdcdd28778cbb9f78490df6691cc4e2729588e10f4cc0a26c465686a9495969750519586521693a3565b803b156143dd5797807ffa54f9f9bdcdd28778cbb9f78490df6691cc4e2729588e10f4cc0a26c465686a9697989960848451809481937f13375c3b0000000000000000000000000000000000000000000000000000000083528c600484015233602484015289891660448401528d60648401525af16143ce575b889796955061431a565b6143d790612b4f565b386143c4565b8880fd5b50803b1515614315565b838752600b835281872060018101600160c81b60ff60c81b1982541617905560ff60f01b1981541690556142db565b8360649186604051927fa1fb2bbc000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b60009080825260056020526001600160a01b03806040842054169283331493841561449c575b5050821561448a57505090565b9091506144973392612c99565b161490565b60ff929450906040918152600860205281812033825260205220541691388061447d565b9092916144cb613207565b936001600160801b03928381169182156145d75767016345785d8a00008082116145a0578085116145695750614515856145068193866134be565b169460208901958652846134be565b16918461452c604089019480865282875116614214565b1610156145535761454584918261454e955116906132c8565b915116906132c8565b168252565b634e487b7160e01b600052600160045260246000fd5b84604491604051917f4fea5c1a00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b60449250604051917f47152d6700000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b505050505090506040516145ea81612b9d565b6000815260006020820152600060408201529056fef8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7"; bytes public constant BYTECODE_NFT_DESCRIPTOR = - hex"6080806040523461001757615da890816200001d8239f35b600080fdfe6080604052600436101561001257600080fd5b60003560e01c63e9dc63751461002757600080fd5b346142f35760403660031901126142f3576001600160a01b0360043516600435036142f357610056608061486b565b60006080819052606060a081905260c0819052610100819052610120819052610140819052610160829052610180919091526101a0526004356001600160a01b031660e08190526100a690614c55565b6101005260e0516040517feac8f5b80000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa908115614300576000916147da575b506001600160a01b03610116911680608052615665565b60a05260e0516040517fad35efd40000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa80156143005760009061479d575b6101779150615885565b6101205260e0516040517f4869e12d0000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa80156143005760249160009161477e575b506fffffffffffffffffffffffffffffffff81166101605260e0516040517fa80fc071000000000000000000000000000000000000000000000000000000008152833560048201529260209184919082906001600160a01b03165afa9182156143005760009261474d575b506fffffffffffffffffffffffffffffffff821615614737576fffffffffffffffffffffffffffffffff9182169082166127100282160416610180526102846004356153c3565b610120608001526040514660208201526bffffffffffffffffffffffff1960043560601b16604082015260243560548201526054815280608081011067ffffffffffffffff60808301111761430c57608081016040526020815191012061041b602963ffffffff61032b6103048261016861ffff8860101c160616614b05565b91601e604660ff6103218460146050848d60081c16060116614b05565b9816060116614b05565b6040519485927f68736c2800000000000000000000000000000000000000000000000000000000602085015261036b815180926020602488019101614823565b83017f2c0000000000000000000000000000000000000000000000000000000000000060248201526103a7825180936020602585019101614823565b7f252c000000000000000000000000000000000000000000000000000000000000602583830101526103e58351809460206027868601019101614823565b01017f252900000000000000000000000000000000000000000000000000000000000060278201520360098101845201826148dc565b61042f6001600160a01b0360805116614c55565b60a05160e0516040517fbc2be1be0000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa801561430057602491600091614718575b5060206001600160a01b0360606080015116604051938480927f9067b677000000000000000000000000000000000000000000000000000000008252823560048301525afa8015614300576104f1926000916146e9575b5064ffffffffff80911691166151d1565b61010051610180516105786021610515606461050e818606615740565b9404614b05565b604051938161052e869351809260208087019101614823565b82016105438251809360208085019101614823565b017f250000000000000000000000000000000000000000000000000000000000000060208201520360018101845201826148dc565b610100608001519060a060800151936105bf6fffffffffffffffffffffffffffffffff60e0608001511660ff6105b86001600160a01b03608051166155d8565b1690614e85565b956101206080015197604051996105d58b61486b565b8a5260208a015260408901526060880152608087015260a086015260c085015260e0840152610100830152610120820152604051806101c081011067ffffffffffffffff6101c08301111761430c576101c081016040526060815260006020820152606060408201526000606082015260006080820152606060a0820152600060c0820152600060e08201526060610100820152600061012082015260006101408201526060610160820152600061018082015260006101a082015260808201516106a660a0840151845190615a76565b906109b361015c604051926106ba846148c0565b600884527f50726f677265737300000000000000000000000000000000000000000000000060208501526107236040516106f381614888565b60009052855160208701207fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4701490565b156146e1576090945b61073586614b05565b916040519586938493661e339034b21e9160c91b60208601526109818351958692610767846027840160208901614823565b6d11103334b6361e9111b33333111f60911b602785840101526c1e3932b1ba103bb4b23a341e9160991b603585840101526107ae8551809660206042888701019101614823565b7f22206865696768743d22313030222066696c6c2d6f7061636974793d222e3033828501860160428101919091527f222072783d223135222072793d22313522207374726f6b653d2223666666222060628201527f7374726f6b652d6f7061636974793d222e3122207374726f6b652d77696474686082820152651e911a11179f60d11b60a28201527f3c7465787420783d2232302220793d2233342220666f6e742d66616d696c793d60a88201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f7370616365222060c8820152703337b73a16b9b4bd329e911919383c111f60791b60e88201528651966108b491889160f990910190602001614823565b661e17ba32bc3a1f60c91b8285018601870160f98101919091527f3c7465787420783d2232302220793d2237322220666f6e742d66616d696c793d6101008201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f73706163652220610120820152703337b73a16b9b4bd329e91191b383c111f60791b61014082015287519761094f91899161015190910190602001614823565b661e17ba32bc3a1f60c91b6101518888888887010101010152602061015888888885519c8d9701010101019101614823565b631e17b39f60e11b90860190910190910190910190910161015881019190915281900361013c810190915201826148dc565b60a083015260c0820152602860e0830151604051906109d182614888565b60008252610c7761015c604051926109e8846148c0565b600684527f53746174757300000000000000000000000000000000000000000000000000006020850152610a1b84615cb6565b610a2482615d33565b808211156146d95750945b610a3a878701614b05565b91604051958693661e339034b21e9160c91b60208601528151610a64816027880160208601614823565b85016d11103334b6361e9111b33333111f60911b60278201526c1e3932b1ba103bb4b23a341e9160991b6035820152610aa7825180936020604285019101614823565b017f22206865696768743d22313030222066696c6c2d6f7061636974793d222e303360428201527f222072783d223135222072793d22313522207374726f6b653d2223666666222060628201527f7374726f6b652d6f7061636974793d222e3122207374726f6b652d77696474686082820152651e911a11179f60d11b60a28201527f3c7465787420783d2232302220793d2233342220666f6e742d66616d696c793d60a88201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f7370616365222060c8820152703337b73a16b9b4bd329e911919383c111f60791b60e8820152610ba382518093602060f985019101614823565b01661e17ba32bc3a1f60c91b60f98201527f3c7465787420783d2232302220793d2237322220666f6e742d66616d696c793d6101008201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f73706163652220610120820152703337b73a16b9b4bd329e91191b383c111f60791b610140820152610c3282518093602061015185019101614823565b01661e17ba32bc3a1f60c91b610151820152610c5982518093602061015885019101614823565b01631e17b39f60e11b6101588201520361013c8101845201826148dc565b61010084015201610120820152602861010083015160405190610c9982614888565b60008252610ce361015c60405192610cb0846148c0565b600884527f53747265616d65640000000000000000000000000000000000000000000000006020850152610a1b84615cb6565b6101608401520161018082015261102660608301516030604051610d0681614888565b60008152610fad61015c60405194610d1d866148c0565b600886527f4475726174696f6e0000000000000000000000000000000000000000000000006020870152610d5086615cb6565b610d5982615d33565b808211156146d15750935b610d7060288601614b05565b91604051978893661e339034b21e9160c91b60208601528151610d9a816027880160208601614823565b85016d11103334b6361e9111b33333111f60911b60278201526c1e3932b1ba103bb4b23a341e9160991b6035820152610ddd825180936020604285019101614823565b017f22206865696768743d22313030222066696c6c2d6f7061636974793d222e303360428201527f222072783d223135222072793d22313522207374726f6b653d2223666666222060628201527f7374726f6b652d6f7061636974793d222e3122207374726f6b652d77696474686082820152651e911a11179f60d11b60a28201527f3c7465787420783d2232302220793d2233342220666f6e742d66616d696c793d60a88201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f7370616365222060c8820152703337b73a16b9b4bd329e911919383c111f60791b60e8820152610ed982518093602060f985019101614823565b01661e17ba32bc3a1f60c91b60f98201527f3c7465787420783d2232302220793d2237322220666f6e742d66616d696c793d6101008201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f73706163652220610120820152703337b73a16b9b4bd329e91191b383c111f60791b610140820152610f6882518093602061015185019101614823565b01661e17ba32bc3a1f60c91b610151820152610f8f82518093602061015885019101614823565b01631e17b39f60e11b6101588201520361013c8101865201846148dc565b8260408601526028810160608601526101808501519060c0860151809161012088015192839185010101605881016020890152605719906103e8030160011c8060e0890152016010810161014088015201602081016101a08701520101608084015260a083015161010084015161016085015191614e1c565b8152604051908161010081011067ffffffffffffffff6101008401111761430c57610100820160405260c782527f3c726563742077696474683d223130302522206865696768743d22313030252260208301527f2066696c7465723d2275726c28234e6f69736529222f3e3c7265637420783d2260408301527f37302220793d223730222077696474683d2238363022206865696768743d223860608301527f3630222066696c6c3d2223666666222066696c6c2d6f7061636974793d222e3060808301527f33222072783d223435222072793d22343522207374726f6b653d22236666662260a08301527f207374726f6b652d6f7061636974793d222e3122207374726f6b652d7769647460c08301527f683d2234222f3e0000000000000000000000000000000000000000000000000060e083015282519160e084015191805194604051611175816148a4565b603381527f3c636972636c652069643d22476c6f772220723d22353030222066696c6c3d2260208201527f75726c282352616469616c476c6f7729222f3e000000000000000000000000006040820152604051966111d28861486b565b61011c88527f3c66696c7465722069643d224e6f697365223e3c6665466c6f6f6420783d223060208901527f2220793d2230222077696474683d223130302522206865696768743d2231303060408901527f252220666c6f6f642d636f6c6f723d2268736c283233302c3231252c3131252960608901527f2220666c6f6f642d6f7061636974793d22312220726573756c743d22666c6f6f60808901527f6446696c6c222f3e3c666554757262756c656e6365206261736546726571756560a08901527f6e63793d222e3422206e756d4f6374617665733d22332220726573756c743d2260c08901527f4e6f6973652220747970653d226672616374616c4e6f697365222f3e3c66654260e08901527f6c656e6420696e3d224e6f6973652220696e323d22666c6f6f6446696c6c22206101008901527f6d6f64653d22736f66742d6c69676874222f3e3c2f66696c7465723e0000000061012089015260405197886103a081011067ffffffffffffffff6103a08b01111761430c576103a0890160405261037b89527f3c706174682069643d224c6f676f222066696c6c3d2223666666222066696c6c60208a01527f2d6f7061636974793d222e312220643d226d3133332e3535392c3132342e303360408a01527f34632d2e3031332c322e3431322d312e3035392c342e3834382d322e3932332c60608a01527f362e3430322d322e3535382c312e3831392d352e3136382c332e3433392d372e60808a01527f3838382c342e3939362d31342e34342c382e3236322d33312e3034372c31322e60a08a01527f3536352d34372e3637342c31322e3536392d382e3835382e3033362d31372e3860c08a01527f33382d312e3237322d32362e3332382d332e3636332d392e3830362d322e373660e08a01527f362d31392e3038372d372e3131332d32372e3536322d31322e3737382d31332e6101008a01527f3834322d382e3032352c392e3436382d32382e3630362c31362e3135332d33356101208a01527f2e323635683063322e3033352d312e3833382c342e3235322d332e3534362c366101408a01527f2e3436332d352e323234683063362e3432392d352e3635352c31362e3231382d6101608a01527f322e3833352c32302e3335382c342e31372c342e3134332c352e3035372c382e6101808a01527f3831362c392e3634392c31332e39322c31332e373334682e30333763352e37336101a08a01527f362c362e3436312c31352e3335372d322e3235332c392e33382d382e34382c306101c08a01527f2c302d332e3531352d332e3531352d332e3531352d332e3531352d31312e34396101e08a01527f2d31312e3437382d35322e3635362d35322e3636342d36342e3833372d36342e6102008a01527f3833376c2e3034392d2e303337632d312e3732352d312e3630362d322e3731396102208a01527f2d332e3834372d322e3735312d362e3230346830632d2e3034362d322e3337356102408a01527f2c312e3036322d342e3538322c322e3732362d362e32323968306c2e3138352d6102608a01527f2e3134386830632e3039392d2e3036322c2e3232322d2e3134382c2e33372d2e6102808a01527f323539683063322e30362d312e3336322c332e3935312d322e3632312c362e306102a08a01527f34342d332e3834324335372e3736332d332e3437332c39372e37362d322e33346102c08a01527f312c3132382e3633372c31382e3333326331362e3637312c392e3934362d32366102e08a01527f2e3334342c35342e3831332d33382e3635312c34302e3139392d362e3239392d6103008a01527f362e3039362d31382e3036332d31372e3734332d31392e3636382d31382e38316103208a01527f312d362e3031362d342e3034372d31332e3036312c342e3737362d372e3735326103408a01527f2c392e3735316c36382e3235342c36382e33373163312e3732342c312e3630316103608a01527f2c322e3731342c332e38342c322e3733382c362e3139325a222f3e00000000006103808a0152604051978860a081011067ffffffffffffffff60a08b01111761430c57611cb0611d119160a08b0160405260758b527f3c706174682069643d22466c6f6174696e6754657874222066696c6c3d226e6f60208c01527f6e652220643d224d31323520343568373530733830203020383020383076373560408c01527f307330203830202d3830203830682d373530732d38302030202d3830202d383060608c01527f762d3735307330202d3830203830202d3830222f3e000000000000000000000060808c0152611867615a3d565b906040517f3c72616469616c4772616469656e742069643d2252616469616c476c6f77223e6020820152611d0c60d87f3c73746f70206f66667365743d223025222073746f702d636f6c6f723d22000093846040850152805161199960b88660208501936118d981605e840187614823565b8101997f222073746f702d6f7061636974793d222e36222f3e0000000000000000000000605e8c01527f3c73746f70206f66667365743d2231303025222073746f702d636f6c6f723d229a8b607382015261193e825180936020609385019101614823565b017f222073746f702d6f7061636974793d2230222f3e00000000000000000000000060938201527f3c2f72616469616c4772616469656e743e00000000000000000000000000000060a78201520360988101885201866148dc565b6119a1615a3d565b90604051967f3c6c696e6561724772616469656e742069643d2253616e64546f70222078313d60208901527f223025222079313d223025223e000000000000000000000000000000000000006040890152604d8801528251611a0781606b8a0184614823565b8701917f222f3e00000000000000000000000000000000000000000000000000000000009283606b82015289606e820152611a4c825180936020608e85019101614823565b019082608e830152611a9060a2897f3c2f6c696e6561724772616469656e743e0000000000000000000000000000009485609182015203608281018b5201896148dc565b611bd6610108611a9e615a3d565b6040519b8c917f3c6c696e6561724772616469656e742069643d2253616e64426f74746f6d222060208401527f78313d2231303025222079313d2231303025223e00000000000000000000000060408401527f3c73746f70206f66667365743d22313025222073746f702d636f6c6f723d22006054840152611b2a815180926020607387019101614823565b8201908760738301526076820152875190611b49826096830188614823565b018660968201527f3c616e696d617465206174747269627574654e616d653d22783122206475723d60998201527f2236732220726570656174436f756e743d22696e646566696e6974652220766160b98201527f6c7565733d223330253b3630253b313230253b3630253b3330253b222f3e000060d98201528560f78201520360e881018c52018a6148dc565b611bde615a3d565b906040519a8b957f3c6c696e6561724772616469656e742069643d22486f7572676c61737353747260208801527f6f6b6522206772616469656e745472616e73666f726d3d22726f74617465283960408801527f302922206772616469656e74556e6974733d227573657253706163654f6e557360608801527f65223e000000000000000000000000000000000000000000000000000000000060808801527f3c73746f70206f66667365743d22353025222073746f702d636f6c6f723d2200608388015251809260a2880190614823565b84018360a28201527f3c73746f70206f66667365743d22383025222073746f702d636f6c6f723d220060a5820152611cf282518093602060c485019101614823565b019160c483015260c78201520360b88101875201856148dc565b614e1c565b92611d31611d1d615813565b896020815191012090602081519101201490565b9788156146a8575b506040518060c081011067ffffffffffffffff60c08301111761430c5760c08101604052609081527f3c7061746820643d224d2035302c3336302061203330302c333030203020312c60208201527f31203630302c302061203330302c333030203020312c31202d3630302c30222060408201527f66696c6c3d2223666666222066696c6c2d6f7061636974793d222e303222207360608201527f74726f6b653d2275726c2823486f7572676c6173735374726f6b65292220737460808201527f726f6b652d77696474683d2234222f3e0000000000000000000000000000000060a082015260405193846102c081011067ffffffffffffffff6102c08701111761430c576102c0850160405261029885527f3c7061746820643d226d3536362c3136312e323031762d35332e39323463302d60208601527f31392e3338322d32322e3531332d33372e3536332d36332e3339382d35312e3160408601527f39382d34302e3735362d31332e3539322d39342e3934362d32312e3037392d3160608601527f35322e3538372d32312e303739732d3131312e3833382c372e3438372d31353260808601527f2e3630322c32312e303739632d34302e3839332c31332e3633362d36332e343160a08601527f332c33312e3831362d36332e3431332c35312e3139387635332e39323463302c60c08601527f31372e3138312c31372e3730342c33332e3432372c35302e3232332c34362e3360e08601527f3934763238342e383039632d33322e3531392c31322e39362d35302e3232332c6101008601527f32392e3230362d35302e3232332c34362e3339347635332e39323463302c31396101208601527f2e3338322c32322e35322c33372e3536332c36332e3431332c35312e3139382c6101408601527f34302e3736332c31332e3539322c39342e3935342c32312e3037392c3135322e6101608601527f3630322c32312e303739733131312e3833312d372e3438372c3135322e3538376101808601527f2d32312e3037396334302e3838362d31332e3633362c36332e3339382d33312e6101a08601527f3831362c36332e3339382d35312e313938762d35332e39323463302d31372e316101c08601527f39362d31372e3730342d33332e3433352d35302e3232332d34362e34303156326101e08601527f30372e3630336333322e3531392d31322e3936372c35302e3232332d32392e326102008601527f30362c35302e3232332d34362e3430315a6d2d3334372e3436322c35372e37396102208601527f336c3133302e3935392c3133312e3032372d3133302e3935392c3133312e30316102408601527f33563231382e3939345a6d3236322e3932342e303232763236322e3031386c2d6102608601527f3133302e3933372d3133312e3030362c3133302e3933372d3133312e3031335a6102808601527f222066696c6c3d2223313631383232223e3c2f706174683e00000000000000006102a0860152896000146144835760405161218b81614888565b60008152995b1561432257604051806101e081011067ffffffffffffffff6101e08301111761430c576101e081016040526101b181527f3c7061746820643d226d3438312e34362c3438312e35347638312e3031632d3260208201527f2e33352e37372d342e38322c312e35312d372e33392c322e32332d33302e332c60408201527f382e35342d37342e36352c31332e39322d3132342e30362c31332e39322d353360608201527f2e362c302d3130312e32342d362e33332d3133312e34372d31362e3136762d3860808201527f316c34362e332d34362e3331683137302e33336c34362e32392c34362e33315a60a08201527f222066696c6c3d2275726c282353616e64426f74746f6d29222f3e3c7061746860c08201527f20643d226d3433352e31372c3433352e323363302c312e31372d2e34362c322e60e08201527f33322d312e33332c332e34342d372e31312c392e30382d34312e39332c31352e6101008201527f39382d38332e38312c31352e3938732d37362e372d362e392d38332e38322d316101208201527f352e3938632d2e38372d312e31322d312e33332d322e32372d312e33332d332e6101408201527f3434762d2e30346c382e33342d382e33352e30312d2e30316331332e37322d366101608201527f2e35312c34322e39352d31312e30322c37362e382d31312e30327336322e39376101808201527f2c342e34392c37362e37322c31316c382e34322c382e34325a222066696c6c3d6101a08201527f2275726c282353616e64546f7029222f3e0000000000000000000000000000006101c0820152995b60405196876107e081011067ffffffffffffffff6107e08a01111761430c57613b9c9c612e586036602d9960819f97631e17b39f60e11b8d7f3c2f646566733e000000000000000000000000000000000000000000000000009a612f279f6107e0016040526107a782527f3c672066696c6c3d226e6f6e6522207374726f6b653d2275726c2823486f757260208301527f676c6173735374726f6b652922207374726f6b652d6c696e656361703d22726f60408301527f756e6422207374726f6b652d6d697465726c696d69743d22313022207374726f60608301527f6b652d77696474683d2234223e3c7061746820643d226d3536352e3634312c3160808301527f30372e323863302c392e3533372d352e35362c31382e3632392d31352e36373660a08301527f2c32362e393733682d2e303233632d392e3230342c372e3539362d32322e313960c08301527f342c31342e3536322d33382e3139372c32302e3539322d33392e3530342c313460e08301527f2e3933362d39372e3332352c32342e3335352d3136312e3733332c32342e33356101008301527f352d39302e34382c302d3136372e3934382d31382e3538322d3139392e3935336101208301527f2d34342e393438682d2e303233632d31302e3131352d382e3334342d31352e366101408301527f37362d31372e3433372d31352e3637362d32362e3937332c302d33392e3733356101608301527f2c39362e3535342d37312e3932312c3231352e3635322d37312e3932317332316101808301527f352e3632392c33322e3138352c3231352e3632392c37312e3932315a222f3e3c6101a08301527f7061746820643d226d3133342e33362c3136312e32303363302c33392e3733356101c08301527f2c39362e3535342c37312e3932312c3231352e3635322c37312e3932317332316101e08301527f352e3632392d33322e3138362c3231352e3632392d37312e393231222f3e3c6c6102008301527f696e652078313d223133342e3336222079313d223136312e323033222078323d6102208301527f223133342e3336222079323d223130372e3238222f3e3c6c696e652078313d226102408301527f3536352e3634222079313d223136312e323033222078323d223536352e3634226102608301527f2079323d223130372e3238222f3e3c6c696e652078313d223138342e353834226102808301527f2079313d223230362e383233222078323d223138342e353835222079323d22356102a08301527f33372e353739222f3e3c6c696e652078313d223231382e313831222079313d226102c08301527f3231382e313138222078323d223231382e313831222079323d223536322e35336102e08301527f37222f3e3c6c696e652078313d223438312e383138222079313d223231382e316103008301527f3432222078323d223438312e383139222079323d223536322e343238222f3e3c6103208301527f6c696e652078313d223531352e343135222079313d223230372e3335322220786103408301527f323d223531352e343136222079323d223533372e353739222f3e3c70617468206103608301527f643d226d3138342e35382c3533372e353863302c352e34352c342e32372c31306103808301527f2e36352c31322e30332c31352e3432682e303263352e35312c332e33392c31326103a08301527f2e37392c362e35352c32312e35352c392e34322c33302e32312c392e392c37386103c08301527f2e30322c31362e32382c3133312e38332c31362e32382c34392e34312c302c396103e08301527f332e37362d352e33382c3132342e30362d31332e39322c322e372d2e37362c356104008301527f2e32392d312e35342c372e37352d322e33352c382e37372d322e38372c31362e6104208301527f30352d362e30342c32312e35362d392e3433683063372e37362d342e37372c316104408301527f322e30342d392e39372c31322e30342d31352e3432222f3e3c7061746820643d6104608301527f226d3138342e3538322c3439322e363536632d33312e3335342c31322e3438356104808301527f2d35302e3232332c32382e35382d35302e3232332c34362e3134322c302c392e6104a08301527f3533362c352e3536342c31382e3632372c31352e3637372c32362e393639682e6104c08301527f30323263382e3530332c372e3030352c32302e3231332c31332e3436332c33346104e08301527f2e3532342c31392e3135392c392e3939392c332e3939312c32312e3236392c376105008301527f2e3630392c33332e3539372c31302e3738382c33362e34352c392e3430372c386105208301527f322e3138312c31352e3030322c3133312e3833352c31352e3030327339352e336105408301527f36332d352e3539352c3133312e3830372d31352e3030326331302e3834372d326105608301527f2e37392c32302e3836372d352e3932362c32392e3932342d392e3334392c312e6105808301527f3234342d2e3436372c322e3437332d2e3934322c332e3637332d312e3432342c6105a08301527f31342e3332362d352e3639362c32362e3033352d31322e3136312c33342e35326105c08301527f342d31392e313733682e3032326331302e3131342d382e3334322c31352e36376105e08301527f372d31372e3433332c31352e3637372d32362e3936392c302d31372e3536322d6106008301527f31382e3836392d33332e3636352d35302e3232332d34362e3135222f3e3c70616106208301527f746820643d226d3133342e33362c3539322e373263302c33392e3733352c39366106408301527f2e3535342c37312e3932312c3231352e3635322c37312e393231733231352e366106608301527f32392d33322e3138362c3231352e3632392d37312e393231222f3e3c6c696e656106808301527f2078313d223133342e3336222079313d223539322e3732222078323d223133346106a08301527f2e3336222079323d223533382e373937222f3e3c6c696e652078313d223536356106c08301527f2e3634222079313d223539322e3732222078323d223536352e3634222079323d6106e08301527f223533382e373937222f3e3c706f6c796c696e6520706f696e74733d223438316107008301527f2e383232203438312e393031203438312e373938203438312e383737203438316107208301527f2e373735203438312e383534203335302e303135203335302e303236203231386107408301527f2e313835203231382e313239222f3e3c706f6c796c696e6520706f696e74733d6107608301527f223231382e313835203438312e393031203231382e323331203438312e3835346107808301527f203335302e303135203335302e303236203438312e383232203231382e3135326107a08301527f222f3e3c2f673e000000000000000000000000000000000000000000000000006107c0830152604051998a957f3c672069643d22486f7572676c617373223e000000000000000000000000000060208801528551612df48160329860208a8c019101614823565b8701612e098251809360208a85019101614823565b01612e1d8251809360208985019101614823565b01612e318251809360208885019101614823565b01612e458251809360208785019101614823565b01918201520360168101865201846148dc565b6040519e8f9788977f3c646566733e000000000000000000000000000000000000000000000000000060208a0152612e9b8151809260206026809d019101614823565b8901612eb08251809360208c85019101614823565b01612ec48251809360208b85019101614823565b01612ed88251809360208a85019101614823565b01612eec8251809360208985019101614823565b01612f008251809360208885019101614823565b01612f148251809360208785019101614823565b019182015203600d8101895201876148dc565b6137ba604c60c0830151610120840151936135166131496040602084015193015196612f538186615981565b9461314461012b604051612f66816148c0565b600581527f2d3130302500000000000000000000000000000000000000000000000000000060208201526040519889917f3c74657874506174682073746172744f66667365743d220000000000000000006020840152612fd0815180926020603787019101614823565b7f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666683820160378101919091527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e00000000000000000061010982015282519261311491849161012090910190602001614823565b6a1e17ba32bc3a2830ba341f60a91b90830190910161012081019190915281900361010b810190915201876148dc565b615981565b9561332861012b60405161315c816148c0565b600281527f30250000000000000000000000000000000000000000000000000000000000006020820152604051998a917f3c74657874506174682073746172744f66667365743d2200000000000000000060208401526131c6815180926020603787019101614823565b82017f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666660378201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e00000000000000000061010982015261330382518093602061012085019101614823565b016a1e17ba32bc3a2830ba341f60a91b6101208201520361010b81018a5201886148dc565b61333281846159e9565b9261351161012b604051613345816148c0565b600481527f2d3530250000000000000000000000000000000000000000000000000000000060208201526040519687917f3c74657874506174682073746172744f66667365743d2200000000000000000060208401526133af815180926020603787019101614823565b82017f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666660378201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e0000000000000000006101098201526134ec82518093602061012085019101614823565b016a1e17ba32bc3a2830ba341f60a91b6101208201520361010b8101875201856148dc565b6159e9565b906136f561012b604051613529816148c0565b600381527f353025000000000000000000000000000000000000000000000000000000000060208201526040519485917f3c74657874506174682073746172744f66667365743d220000000000000000006020840152613593815180926020603787019101614823565b82017f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666660378201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e0000000000000000006101098201526136d082518093602061012085019101614823565b016a1e17ba32bc3a2830ba341f60a91b6101208201520361010b8101855201836148dc565b6040519586937f3c7465787420746578742d72656e646572696e673d226f7074696d697a65537060208601527f656564223e000000000000000000000000000000000000000000000000000000604086015261375b815180926020604589019101614823565b8401613771825180936020604585019101614823565b01613786825180936020604585019101614823565b0161379b825180936020604585019101614823565b01661e17ba32bc3a1f60c91b604582015203602c8101845201826148dc565b613a9b61019c60e084015193610140810151906137fc6137f66137f06137ea60806101a086015195015199614b05565b94614b05565b92614b05565b96614b05565b906040519687937f3c75736520687265663d2223476c6f77222066696c6c2d6f7061636974793d2260208601527f2e39222f3e00000000000000000000000000000000000000000000000000000060408601527f3c75736520687265663d2223476c6f772220783d22313030302220793d22313060458601527f3030222066696c6c2d6f7061636974793d222e39222f3e00000000000000000060658601527f3c75736520687265663d22234c6f676f2220783d223137302220793d22313730607c8601527f22207472616e73666f726d3d227363616c65282e3629222f3e3c757365206872609c8601527f65663d2223486f7572676c6173732220783d223135302220793d22393022207460bc8601527f72616e73666f726d3d22726f746174652831302922207472616e73666f726d2d60dc8601527f6f726967696e3d2235303020353030222f3e000000000000000000000000000060fc8601527f3c75736520687265663d222350726f67726573732220783d220000000000000061010e860152805161399681610127936020858a019101614823565b8501927f2220793d22373930222f3e0000000000000000000000000000000000000000008481809694819501527f3c75736520687265663d22235374617475732220783d22000000000000000000610132820152825190613a01826101499560208785019101614823565b01918201527f3c75736520687265663d222353747265616d65642220783d2200000000000000610154820152825190613a448261016d9560208785019101614823565b01918201527f3c75736520687265663d22234475726174696f6e2220783d2200000000000000610178820152825190613a87826101919560208785019101614823565b01918201520361017c8101855201836148dc565b6040519586937f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323060208601527f30302f737667222077696474683d223130303022206865696768743d2231303060408601527f30222076696577426f783d2230203020313030302031303030223e00000000006060860152613b27815180926020607b89019101614823565b8401613b3d825180936020607b85019101614823565b01613b52825180936020607b85019101614823565b01613b67825180936020607b85019101614823565b017f3c2f7376673e0000000000000000000000000000000000000000000000000000607b8201520360618101845201826148dc565b6101405260a05160e0516040517fb971302a0000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa908115614300576000916142b5575b6142b161424a61414f614240609487613d376089613c158a614c55565b9260a0608001516040519485927f5b7b2274726169745f74797065223a224173736574222c2276616c7565223a226020850152613c5c815180926020604088019101614823565b8301907f227d2c7b2274726169745f74797065223a2253656e646572222c2276616c756560408301527f223a22000000000000000000000000000000000000000000000000000000000091826060820152613cc1825180936020606385019101614823565b01907f227d2c7b2274726169745f74797065223a22537461747573222c2276616c756560638301526083820152613d02825180936020608685019101614823565b017f227d5d000000000000000000000000000000000000000000000000000000000060868201520360698101845201826148dc565b6101a05160a05161403961017e613d4f602435614b05565b936080800151613d696001600160a01b0360805116614c55565b90604051968793613f2660208601987f54686973204e465420726570726573656e74732061207061796d656e742073748a527f7265616d20696e2061205361626c696572205632200000000000000000000000604088015282516020840190613dd68160558b0184614823565b8801947f20636f6e74726163742e20546865206f776e6572206f662074686973204e465460558701527f2063616e207769746864726177207468652073747265616d656420617373657460758701527f732c207768696368206172652064656e6f6d696e6174656420696e2000000000609587015282516020840196613e608260b183018a614823565b017f2e5c6e5c6e2d2053747265616d2049443a20000000000000000000000000000060b1820152613e9b82518093602060c385019101614823565b01613ed47f5c6e2d2000000000000000000000000000000000000000000000000000000000958660c384015251809360c7840190614823565b01947f20416464726573733a2000000000000000000000000000000000000000000000958660c7820152613f1282518093602060d185019101614823565b019260d184015251809360d5840190614823565b019060d5820152613f4182518093602060df85019101614823565b017f5c6e5c6e0000000000000000000000000000000000000000000000000000000060df8201527fe29aa0efb88f205741524e494e473a205472616e7366657272696e672074686560e38201527f204e4654206d616b657320746865206e6577206f776e657220746865207265636101038201527f697069656e74206f66207468652073747265616d2e205468652066756e6473206101238201527f617265206e6f74206175746f6d61746963616c6c792077697468647261776e206101438201527f666f72207468652070726576696f757320726563697069656e742e00000000006101638201520361015e8101855201836148dc565b6101a051906141aa61404c602435614b05565b916140cb602d604051809560208201976a029b0b13634b2b9102b19160ad1b8952614081815180926020602b87019101614823565b82017f2023000000000000000000000000000000000000000000000000000000000000602b8201526140bc8251809360208785019101614823565b0103600d8101865201846148dc565b610140516140d890614991565b94604051998a977f7b2261747472696275746573223a00000000000000000000000000000000000060208a0152614119815180926020602e8d019101614823565b8801917f2c226465736372697074696f6e223a2200000000000000000000000000000000602e840152518093603e840190614823565b01917f222c2265787465726e616c5f75726c223a2268747470733a2f2f7361626c6965603e8401527f722e636f6d222c226e616d65223a220000000000000000000000000000000000605e840152518093606d840190614823565b017f222c22696d616765223a22646174613a696d6167652f7376672b786d6c3b6261606d8201527f736536342c000000000000000000000000000000000000000000000000000000608d82015261420b825180936020609285019101614823565b017f227d00000000000000000000000000000000000000000000000000000000000060928201520360748101845201826148dc565b60c0819052614991565b61429d603d60405180937f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000602083015261428d8151809260208686019101614823565b810103601d8101845201826148dc565b604051918291602083526020830190614846565b0390f35b90506020813d6020116142f8575b816142d0602093836148dc565b810103126142f35751906001600160a01b03821682036142f3579061414f613bf8565b600080fd5b3d91506142c3565b6040513d6000823e3d90fd5b634e487b7160e01b600052604160045260246000fd5b6040518061012081011067ffffffffffffffff6101208301111761430c57610120810160405260f881527f3c7061746820643d226d3438312e34362c3530342e3130317635382e3434396360208201527f2d322e33352e37372d342e38322c312e35312d372e33392c322e32332d33302e60408201527f332c382e35342d37342e36352c31332e39322d3132342e30362c31332e39322d60608201527f35332e362c302d3130312e32342d362e33332d3133312e34372d31362e31367660808201527f2d35382e343339683236322e39325a222066696c6c3d2275726c282353616e6460a08201527f426f74746f6d29222f3e3c656c6c697073652063783d22333530222063793d2260c08201527f3530342e313031222072783d223133312e343632222072793d2232382e31303860e08201527f222066696c6c3d2275726c282353616e64546f7029222f3e0000000000000000610100820152996123de565b604051806101c081011067ffffffffffffffff6101c08301111761430c576101c0810160405261019981527f3c706f6c79676f6e20706f696e74733d22333530203335302e3032362034313560208201527f2e3033203238342e39373820323835203238342e39373820333530203335302e60408201527f303236222066696c6c3d2275726c282353616e64426f74746f6d29222f3e3c7060608201527f61746820643d226d3431362e3334312c3238312e39373563302c2e3931342d2e60808201527f3335342c312e3830392d312e3033352c322e36382d352e3534322c372e30373660a08201527f2d33322e3636312c31322e34352d36352e32382c31322e34352d33322e36323460c08201527f2c302d35392e3733382d352e3337342d36352e32382d31322e34352d2e36383160e08201527f2d2e3837322d312e3033352d312e3736372d312e3033352d322e36382c302d2e6101008201527f3931342e3335342d312e3830382c312e3033352d322e3637362c352e3534322d6101208201527f372e3037362c33322e3635362d31322e34352c36352e32382d31322e34352c336101408201527f322e3631392c302c35392e3733382c352e3337342c36352e32382c31322e34356101608201527f2e3638312e3836372c312e3033352c312e3736322c312e3033352c322e3637366101808201527f5a222066696c6c3d2275726c282353616e64546f7029222f3e000000000000006101a082015299612191565b6146ca9198506146b661584c565b906020815191012090602081519101201490565b9638611d39565b905093610d64565b905094610a2f565b60d09461072c565b61470b915060203d602011614711575b61470381836148dc565b810190614926565b386104e0565b503d6146f9565b614731915060203d6020116147115761470381836148dc565b38610489565b634e487b7160e01b600052601260045260246000fd5b61477091925060203d602011614777575b61476881836148dc565b8101906148fe565b903861023d565b503d61475e565b614797915060203d6020116147775761476881836148dc565b386101d2565b506020813d6020116147d2575b816147b7602093836148dc565b810103126142f3575160058110156142f3576101779061016d565b3d91506147aa565b90506020813d60201161481b575b816147f5602093836148dc565b810103126142f357516001600160a01b03811681036142f3576001600160a01b036100ff565b3d91506147e8565b60005b8381106148365750506000910152565b8181015183820152602001614826565b9060209161485f81518092818552858086019101614823565b601f01601f1916010190565b610140810190811067ffffffffffffffff82111761430c57604052565b6020810190811067ffffffffffffffff82111761430c57604052565b6060810190811067ffffffffffffffff82111761430c57604052565b6040810190811067ffffffffffffffff82111761430c57604052565b90601f8019910116810190811067ffffffffffffffff82111761430c57604052565b908160209103126142f357516fffffffffffffffffffffffffffffffff811681036142f35790565b908160209103126142f3575164ffffffffff811681036142f35790565b67ffffffffffffffff811161430c57601f01601f191660200190565b9061496982614943565b61497660405191826148dc565b8281528092614987601f1991614943565b0190602036910137565b805115614af1576040516149a4816148a4565b604081527f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208201527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f60408201528151600292838201809211614adb5760038092047f3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81168103614adb57614a3e908594951b61495f565b936020850193829183518401925b838110614a8a5750505050510680600114614a7757600214614a6c575090565b603d90600019015390565b50603d9081600019820153600119015390565b85600491979293949701918251600190603f9082828260121c16880101518453828282600c1c16880101518385015382828260061c1688010151888501531685010151878201530195929190614a4c565b634e487b7160e01b600052601160045260246000fd5b50604051614afe81614888565b6000815290565b806000917a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000080821015614c47575b506d04ee2d6d415b85acef810000000080831015614c38575b50662386f26fc1000080831015614c29575b506305f5e10080831015614c1a575b5061271080831015614c0b575b506064821015614bfb575b600a80921015614bf1575b600190816021614b9c82870161495f565b95860101905b614bae575b5050505090565b600019019083907f30313233343536373839616263646566000000000000000000000000000000008282061a835304918215614bec57919082614ba2565b614ba7565b9160010191614b8b565b9190606460029104910191614b80565b60049193920491019138614b75565b60089193920491019138614b68565b60109193920491019138614b59565b60209193920491019138614b47565b604093508104915038614b2e565b6001600160a01b031660405190614c6b826148a4565b602a8252602082016040368237825115614d8357603090538151600190811015614d8357607860218401536029905b808211614d08575050614caa5790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602060248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b9091600f81166010811015614d6e577f3031323334353637383961626364656600000000000000000000000000000000901a614d448486614d99565b5360041c918015614d59576000190190614c9a565b60246000634e487b7160e01b81526011600452fd5b60246000634e487b7160e01b81526032600452fd5b634e487b7160e01b600052603260045260246000fd5b908151811015614d83570160200190565b60405190614db7826148c0565b600482527f2667743b000000000000000000000000000000000000000000000000000000006020830152565b60405190614df0826148c0565b600482527f266c743b000000000000000000000000000000000000000000000000000000006020830152565b90614e839294936040519586928451614e3d81602097888089019101614823565b8401614e5182518093888085019101614823565b01614e6482518093878085019101614823565b01614e7782518093868085019101614823565b010380855201836148dc565b565b80156151965760009180615171575090505b6001908082811015614f0457505050614eae614de3565b614f01602260405183614ecb829551809260208086019101614823565b81017f203100000000000000000000000000000000000000000000000000000000000060208201520360028101845201826148dc565b90565b66038d7ea4c6800011156151145760409081519060a0820182811067ffffffffffffffff82111761430c57808452614f3b81614888565b600081528252825190614f4d826148c0565b8482526020917f4b0000000000000000000000000000000000000000000000000000000000000083820152828401528351614f87816148c0565b8581527f4d0000000000000000000000000000000000000000000000000000000000000083820152848401528351614fbe816148c0565b8581527f42000000000000000000000000000000000000000000000000000000000000008382015260608401528351614ff6816148c0565b8581527f54000000000000000000000000000000000000000000000000000000000000008382015260808401526000918583965b6150e8575b5084519461503c866148c0565b6007908187527f2623383830353b0000000000000000000000000000000000000000000000000083880152519560005b8281106150d557505050506150b66150bc917f20000000000000000000000000000000000000000000000000000000000000006027870152600886526150b1866148c0565b614b05565b91615740565b916005851015614d8357614f019460051b015192614e1c565b818101840151888201850152830161506c565b9591926103e89081851061510b57508680916064600a870406950493019661502a565b9392965061502f565b505061511e614daa565b614f0160286040518361513b829551809260208086019101614823565b81017f203939392e39395400000000000000000000000000000000000000000000000060208201520360088101845201826148dc565b600a0a918215615182575004614e97565b80634e487b7160e01b602492526012600452fd5b50506040516151a4816148c0565b600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b620151809103048061523957506151e6614de3565b614f01602660405183615203829551809260208086019101614823565b81017f203120446179000000000000000000000000000000000000000000000000000060208201520360068101845201826148dc565b61270f811161530857600181036152c557614f01602061528d60405161525e816148c0565b600481527f20446179000000000000000000000000000000000000000000000000000000008382015293614b05565b60405193816152a58693518092868087019101614823565b82016152b982518093868085019101614823565b010380845201826148dc565b614f01602061528d6040516152d9816148c0565b600581527f20446179730000000000000000000000000000000000000000000000000000008382015293614b05565b50615311614daa565b614f01602a6040518361532e829551809260208086019101614823565b81017f2039393939204461797300000000000000000000000000000000000000000000602082015203600a8101845201826148dc565b6020818303126142f35780519067ffffffffffffffff82116142f3570181601f820112156142f357805161539781614943565b926153a560405194856148dc565b818452602082840101116142f357614f019160208085019101614823565b6001600160a01b031660409081516395d89b4160e01b8152600081600481855afa90811561559d5760009161557c575b506154588351615402816148c0565b601181527f5341422d56322d4c4f434b55502d4c494e0000000000000000000000000000006020918201528251908301207fc66b376a19264d832c1bc254000c18944ca5aa57ed50f4ea637c4da424d4c3bb1490565b1561549657505051615469816148c0565b600d81527f4c6f636b7570204c696e65617200000000000000000000000000000000000000602082015290565b6154fa83516154a4816148c0565b601181527f5341422d56322d4c4f434b55502d44594e0000000000000000000000000000006020918201528251908301207f6ab655856fa5352de8c05542b1937ac63c59342da992602767c02734cc5391651490565b156155385750505161550b816148c0565b600e81527f4c6f636b75702044796e616d6963000000000000000000000000000000000000602082015290565b6155789083519384937f814a8a2e000000000000000000000000000000000000000000000000000000008552600485015260248401526044830190614846565b0390fd5b615597913d8091833e61558f81836148dc565b810190615364565b386153f3565b83513d6000823e3d90fd5b3d156155d3573d906155b982614943565b916155c760405193846148dc565b82523d6000602084013e565b606090565b60405160208101907f313ce56700000000000000000000000000000000000000000000000000000000825260048152615610816148c0565b6000928392839251915afa6156236155a8565b908061565a575b156156565760208180518101031261565257602001519060ff8216820361564f575090565b80fd5b5080fd5b5090565b50602081511461562a565b6000809160405160208101906395d89b4160e01b825260048152615688816148c0565b51915afa6156946155a8565b90158015615734575b6156fa57806020806156b493518301019101615364565b601e815111600014614f0157506040516156cd816148c0565b600b81527f4c6f6e672053796d626f6c000000000000000000000000000000000000000000602082015290565b50604051615707816148c0565b600581527f4552433230000000000000000000000000000000000000000000000000000000602082015290565b5060408151111561569d565b806157525750604051614afe81614888565b600a8110156157b75761576490614b05565b614f01602260405180937f2e3000000000000000000000000000000000000000000000000000000000000060208301526157a78151809260208686019101614823565b81010360028101845201826148dc565b6157c090614b05565b614f01602160405180937f2e0000000000000000000000000000000000000000000000000000000000000060208301526158038151809260208686019101614823565b81010360018101845201826148dc565b60405190615820826148c0565b600782527f536574746c6564000000000000000000000000000000000000000000000000006020830152565b60405190615859826148c0565b600882527f4465706c657465640000000000000000000000000000000000000000000000006020830152565b600581101561596b576004810361589f5750614f0161584c565b600381036158e157506040516158b4816148c0565b600881527f43616e63656c6564000000000000000000000000000000000000000000000000602082015290565b6001810361592357506040516158f6816148c0565b600981527f53747265616d696e670000000000000000000000000000000000000000000000602082015290565b60020361593257614f01615813565b60405161593e816148c0565b600781527f50656e64696e6700000000000000000000000000000000000000000000000000602082015290565b634e487b7160e01b600052602160045260246000fd5b6030614e839193929360405194816159a3879351809260208087019101614823565b820164010714051160dd1b60208201526a029b0b13634b2b9102b19160ad1b60258201526159da8251809360208785019101614823565b010360108101855201836148dc565b6025614e83919392936040519481615a0b879351809260208087019101614823565b820164010714051160dd1b6020820152615a2e8251809360208785019101614823565b010360058101855201836148dc565b60405190615a4a826148c0565b601082527f68736c283233302c3231252c31312529000000000000000000000000000000006020830152565b8015615ca857615a84615a3d565b90612710908103908111614adb57614f0191615aa261013692614b05565b6040519485927f3c672066696c6c3d226e6f6e65223e000000000000000000000000000000000060208501527f3c636972636c652063783d22313636222063793d2235302220723d2232322220602f8501527f7374726f6b653d22000000000000000000000000000000000000000000000000604f850152615b2e815180926020605788019101614823565b83017f22207374726f6b652d77696474683d223130222f3e000000000000000000000060578201527f3c636972636c652063783d22313636222063793d2235302220706174684c656e606c8201527f6774683d2231303030302220723d22323222207374726f6b653d220000000000608c820152615bb682518093602060a785019101614823565b017f22207374726f6b652d6461736861727261793d22313030303022207374726f6b60a78201527f652d646173686f66667365743d2200000000000000000000000000000000000060c7820152615c1782518093602060d585019101614823565b017f22207374726f6b652d6c696e656361703d22726f756e6422207374726f6b652d60d58201527f77696474683d223522207472616e73666f726d3d22726f74617465282d39302960f58201527f22207472616e73666f726d2d6f726967696e3d22313636203530222f3e000000610115820152631e17b39f60e11b610132820152036101168101845201826148dc565b5050604051614afe81614888565b60009080518015615d2b579060009182915b818310615cda57505050600d02900390565b909193603b60f81b7fff00000000000000000000000000000000000000000000000000000000000000615d0d8785614d99565b511614615d23575b600d01936001019190615cc8565b849350615d15565b505050600090565b60009080518015615d2b579060009182915b818310615d575750505060041b900390565b909193603b60f81b7fff00000000000000000000000000000000000000000000000000000000000000615d8a8785614d99565b511614615da0575b601001936001019190615d45565b849350615d9256"; + hex"6080806040523461001757615dab90816200001d8239f35b600080fdfe6080604052600436101561001257600080fd5b60003560e01c63e9dc63751461002757600080fd5b346142f55760403660031901126142f5576001600160a01b0360043516600435036142f557610056608061486d565b60006080819052606060a081905260c0819052610100819052610120819052610140819052610160829052610180919091526101a0526004356001600160a01b031660e08190526100a690614c57565b6101005260e0516040517feac8f5b80000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa908115614302576000916147dc575b506001600160a01b03610116911680608052615668565b60a05260e0516040517fad35efd40000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa80156143025760009061479f575b6101779150615888565b6101205260e0516040517f4869e12d0000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa801561430257602491600091614780575b506fffffffffffffffffffffffffffffffff81166101605260e0516040517fa80fc071000000000000000000000000000000000000000000000000000000008152833560048201529260209184919082906001600160a01b03165afa9182156143025760009261474f575b506fffffffffffffffffffffffffffffffff821615614739576fffffffffffffffffffffffffffffffff9182169082166127100282160416610180526102846004356153c6565b610120608001526040514660208201526bffffffffffffffffffffffff1960043560601b16604082015260243560548201526054815280608081011067ffffffffffffffff60808301111761430e57608081016040526020815191012061041b602963ffffffff61032b6103048261016861ffff8860101c160616614b07565b91601e604660ff6103218460146050848d60081c16060116614b07565b9816060116614b07565b6040519485927f68736c2800000000000000000000000000000000000000000000000000000000602085015261036b815180926020602488019101614825565b83017f2c0000000000000000000000000000000000000000000000000000000000000060248201526103a7825180936020602585019101614825565b7f252c000000000000000000000000000000000000000000000000000000000000602583830101526103e58351809460206027868601019101614825565b01017f252900000000000000000000000000000000000000000000000000000000000060278201520360098101845201826148de565b61042f6001600160a01b0360805116614c57565b60a05160e0516040517fbc2be1be0000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa80156143025760249160009161471a575b5060206001600160a01b0360606080015116604051938480927f9067b677000000000000000000000000000000000000000000000000000000008252823560048301525afa8015614302576104f1926000916146eb575b5064ffffffffff80911691166151d4565b61010051610180516105786021610515606461050e818606615743565b9404614b07565b604051938161052e869351809260208087019101614825565b82016105438251809360208085019101614825565b017f250000000000000000000000000000000000000000000000000000000000000060208201520360018101845201826148de565b610100608001519060a060800151936105bf6fffffffffffffffffffffffffffffffff60e0608001511660ff6105b86001600160a01b03608051166155db565b1690614e88565b956101206080015197604051996105d58b61486d565b8a5260208a015260408901526060880152608087015260a086015260c085015260e0840152610100830152610120820152604051806101c081011067ffffffffffffffff6101c08301111761430e576101c081016040526060815260006020820152606060408201526000606082015260006080820152606060a0820152600060c0820152600060e08201526060610100820152600061012082015260006101408201526060610160820152600061018082015260006101a082015260808201516106a660a0840151845190615a79565b906109b361015c604051926106ba846148c2565b600884527f50726f677265737300000000000000000000000000000000000000000000000060208501526107236040516106f38161488a565b60009052855160208701207fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4701490565b156146e3576090945b61073586614b07565b916040519586938493661e339034b21e9160c91b60208601526109818351958692610767846027840160208901614825565b6d11103334b6361e9111b33333111f60911b602785840101526c1e3932b1ba103bb4b23a341e9160991b603585840101526107ae8551809660206042888701019101614825565b7f22206865696768743d22313030222066696c6c2d6f7061636974793d222e3033828501860160428101919091527f222072783d223135222072793d22313522207374726f6b653d2223666666222060628201527f7374726f6b652d6f7061636974793d222e3122207374726f6b652d77696474686082820152651e911a11179f60d11b60a28201527f3c7465787420783d2232302220793d2233342220666f6e742d66616d696c793d60a88201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f7370616365222060c8820152703337b73a16b9b4bd329e911919383c111f60791b60e88201528651966108b491889160f990910190602001614825565b661e17ba32bc3a1f60c91b8285018601870160f98101919091527f3c7465787420783d2232302220793d2237322220666f6e742d66616d696c793d6101008201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f73706163652220610120820152703337b73a16b9b4bd329e91191b383c111f60791b61014082015287519761094f91899161015190910190602001614825565b661e17ba32bc3a1f60c91b6101518888888887010101010152602061015888888885519c8d9701010101019101614825565b631e17b39f60e11b90860190910190910190910190910161015881019190915281900361013c810190915201826148de565b60a083015260c0820152602860e0830151604051906109d18261488a565b60008252610c7761015c604051926109e8846148c2565b600684527f53746174757300000000000000000000000000000000000000000000000000006020850152610a1b84615cb9565b610a2482615d36565b808211156146db5750945b610a3a878701614b07565b91604051958693661e339034b21e9160c91b60208601528151610a64816027880160208601614825565b85016d11103334b6361e9111b33333111f60911b60278201526c1e3932b1ba103bb4b23a341e9160991b6035820152610aa7825180936020604285019101614825565b017f22206865696768743d22313030222066696c6c2d6f7061636974793d222e303360428201527f222072783d223135222072793d22313522207374726f6b653d2223666666222060628201527f7374726f6b652d6f7061636974793d222e3122207374726f6b652d77696474686082820152651e911a11179f60d11b60a28201527f3c7465787420783d2232302220793d2233342220666f6e742d66616d696c793d60a88201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f7370616365222060c8820152703337b73a16b9b4bd329e911919383c111f60791b60e8820152610ba382518093602060f985019101614825565b01661e17ba32bc3a1f60c91b60f98201527f3c7465787420783d2232302220793d2237322220666f6e742d66616d696c793d6101008201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f73706163652220610120820152703337b73a16b9b4bd329e91191b383c111f60791b610140820152610c3282518093602061015185019101614825565b01661e17ba32bc3a1f60c91b610151820152610c5982518093602061015885019101614825565b01631e17b39f60e11b6101588201520361013c8101845201826148de565b61010084015201610120820152602861010083015160405190610c998261488a565b60008252610ce361015c60405192610cb0846148c2565b600884527f53747265616d65640000000000000000000000000000000000000000000000006020850152610a1b84615cb9565b6101608401520161018082015261102660608301516030604051610d068161488a565b60008152610fad61015c60405194610d1d866148c2565b600886527f4475726174696f6e0000000000000000000000000000000000000000000000006020870152610d5086615cb9565b610d5982615d36565b808211156146d35750935b610d7060288601614b07565b91604051978893661e339034b21e9160c91b60208601528151610d9a816027880160208601614825565b85016d11103334b6361e9111b33333111f60911b60278201526c1e3932b1ba103bb4b23a341e9160991b6035820152610ddd825180936020604285019101614825565b017f22206865696768743d22313030222066696c6c2d6f7061636974793d222e303360428201527f222072783d223135222072793d22313522207374726f6b653d2223666666222060628201527f7374726f6b652d6f7061636974793d222e3122207374726f6b652d77696474686082820152651e911a11179f60d11b60a28201527f3c7465787420783d2232302220793d2233342220666f6e742d66616d696c793d60a88201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f7370616365222060c8820152703337b73a16b9b4bd329e911919383c111f60791b60e8820152610ed982518093602060f985019101614825565b01661e17ba32bc3a1f60c91b60f98201527f3c7465787420783d2232302220793d2237322220666f6e742d66616d696c793d6101008201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f73706163652220610120820152703337b73a16b9b4bd329e91191b383c111f60791b610140820152610f6882518093602061015185019101614825565b01661e17ba32bc3a1f60c91b610151820152610f8f82518093602061015885019101614825565b01631e17b39f60e11b6101588201520361013c8101865201846148de565b8260408601526028810160608601526101808501519060c0860151809161012088015192839185010101605881016020890152605719906103e8030160011c8060e0890152016010810161014088015201602081016101a08701520101608084015260a083015161010084015161016085015191614e1e565b8152604051908161010081011067ffffffffffffffff6101008401111761430e57610100820160405260c782527f3c726563742077696474683d223130302522206865696768743d22313030252260208301527f2066696c7465723d2275726c28234e6f69736529222f3e3c7265637420783d2260408301527f37302220793d223730222077696474683d2238363022206865696768743d223860608301527f3630222066696c6c3d2223666666222066696c6c2d6f7061636974793d222e3060808301527f33222072783d223435222072793d22343522207374726f6b653d22236666662260a08301527f207374726f6b652d6f7061636974793d222e3122207374726f6b652d7769647460c08301527f683d2234222f3e0000000000000000000000000000000000000000000000000060e083015282519160e084015191805194604051611175816148a6565b603381527f3c636972636c652069643d22476c6f772220723d22353030222066696c6c3d2260208201527f75726c282352616469616c476c6f7729222f3e000000000000000000000000006040820152604051966111d28861486d565b61011c88527f3c66696c7465722069643d224e6f697365223e3c6665466c6f6f6420783d223060208901527f2220793d2230222077696474683d223130302522206865696768743d2231303060408901527f252220666c6f6f642d636f6c6f723d2268736c283233302c3231252c3131252960608901527f2220666c6f6f642d6f7061636974793d22312220726573756c743d22666c6f6f60808901527f6446696c6c222f3e3c666554757262756c656e6365206261736546726571756560a08901527f6e63793d222e3422206e756d4f6374617665733d22332220726573756c743d2260c08901527f4e6f6973652220747970653d226672616374616c4e6f697365222f3e3c66654260e08901527f6c656e6420696e3d224e6f6973652220696e323d22666c6f6f6446696c6c22206101008901527f6d6f64653d22736f66742d6c69676874222f3e3c2f66696c7465723e0000000061012089015260405197886103a081011067ffffffffffffffff6103a08b01111761430e576103a0890160405261037b89527f3c706174682069643d224c6f676f222066696c6c3d2223666666222066696c6c60208a01527f2d6f7061636974793d222e312220643d226d3133332e3535392c3132342e303360408a01527f34632d2e3031332c322e3431322d312e3035392c342e3834382d322e3932332c60608a01527f362e3430322d322e3535382c312e3831392d352e3136382c332e3433392d372e60808a01527f3838382c342e3939362d31342e34342c382e3236322d33312e3034372c31322e60a08a01527f3536352d34372e3637342c31322e3536392d382e3835382e3033362d31372e3860c08a01527f33382d312e3237322d32362e3332382d332e3636332d392e3830362d322e373660e08a01527f362d31392e3038372d372e3131332d32372e3536322d31322e3737382d31332e6101008a01527f3834322d382e3032352c392e3436382d32382e3630362c31362e3135332d33356101208a01527f2e323635683063322e3033352d312e3833382c342e3235322d332e3534362c366101408a01527f2e3436332d352e323234683063362e3432392d352e3635352c31362e3231382d6101608a01527f322e3833352c32302e3335382c342e31372c342e3134332c352e3035372c382e6101808a01527f3831362c392e3634392c31332e39322c31332e373334682e30333763352e37336101a08a01527f362c362e3436312c31352e3335372d322e3235332c392e33382d382e34382c306101c08a01527f2c302d332e3531352d332e3531352d332e3531352d332e3531352d31312e34396101e08a01527f2d31312e3437382d35322e3635362d35322e3636342d36342e3833372d36342e6102008a01527f3833376c2e3034392d2e303337632d312e3732352d312e3630362d322e3731396102208a01527f2d332e3834372d322e3735312d362e3230346830632d2e3034362d322e3337356102408a01527f2c312e3036322d342e3538322c322e3732362d362e32323968306c2e3138352d6102608a01527f2e3134386830632e3039392d2e3036322c2e3232322d2e3134382c2e33372d2e6102808a01527f323539683063322e30362d312e3336322c332e3935312d322e3632312c362e306102a08a01527f34342d332e3834324335372e3736332d332e3437332c39372e37362d322e33346102c08a01527f312c3132382e3633372c31382e3333326331362e3637312c392e3934362d32366102e08a01527f2e3334342c35342e3831332d33382e3635312c34302e3139392d362e3239392d6103008a01527f362e3039362d31382e3036332d31372e3734332d31392e3636382d31382e38316103208a01527f312d362e3031362d342e3034372d31332e3036312c342e3737362d372e3735326103408a01527f2c392e3735316c36382e3235342c36382e33373163312e3732342c312e3630316103608a01527f2c322e3731342c332e38342c322e3733382c362e3139325a222f3e00000000006103808a0152604051978860a081011067ffffffffffffffff60a08b01111761430e57611cb0611d119160a08b0160405260758b527f3c706174682069643d22466c6f6174696e6754657874222066696c6c3d226e6f60208c01527f6e652220643d224d31323520343568373530733830203020383020383076373560408c01527f307330203830202d3830203830682d373530732d38302030202d3830202d383060608c01527f762d3735307330202d3830203830202d3830222f3e000000000000000000000060808c0152611867615a40565b906040517f3c72616469616c4772616469656e742069643d2252616469616c476c6f77223e6020820152611d0c60d87f3c73746f70206f66667365743d223025222073746f702d636f6c6f723d22000093846040850152805161199960b88660208501936118d981605e840187614825565b8101997f222073746f702d6f7061636974793d222e36222f3e0000000000000000000000605e8c01527f3c73746f70206f66667365743d2231303025222073746f702d636f6c6f723d229a8b607382015261193e825180936020609385019101614825565b017f222073746f702d6f7061636974793d2230222f3e00000000000000000000000060938201527f3c2f72616469616c4772616469656e743e00000000000000000000000000000060a78201520360988101885201866148de565b6119a1615a40565b90604051967f3c6c696e6561724772616469656e742069643d2253616e64546f70222078313d60208901527f223025222079313d223025223e000000000000000000000000000000000000006040890152604d8801528251611a0781606b8a0184614825565b8701917f222f3e00000000000000000000000000000000000000000000000000000000009283606b82015289606e820152611a4c825180936020608e85019101614825565b019082608e830152611a9060a2897f3c2f6c696e6561724772616469656e743e0000000000000000000000000000009485609182015203608281018b5201896148de565b611bd6610108611a9e615a40565b6040519b8c917f3c6c696e6561724772616469656e742069643d2253616e64426f74746f6d222060208401527f78313d2231303025222079313d2231303025223e00000000000000000000000060408401527f3c73746f70206f66667365743d22313025222073746f702d636f6c6f723d22006054840152611b2a815180926020607387019101614825565b8201908760738301526076820152875190611b49826096830188614825565b018660968201527f3c616e696d617465206174747269627574654e616d653d22783122206475723d60998201527f2236732220726570656174436f756e743d22696e646566696e6974652220766160b98201527f6c7565733d223330253b3630253b313230253b3630253b3330253b222f3e000060d98201528560f78201520360e881018c52018a6148de565b611bde615a40565b906040519a8b957f3c6c696e6561724772616469656e742069643d22486f7572676c61737353747260208801527f6f6b6522206772616469656e745472616e73666f726d3d22726f74617465283960408801527f302922206772616469656e74556e6974733d227573657253706163654f6e557360608801527f65223e000000000000000000000000000000000000000000000000000000000060808801527f3c73746f70206f66667365743d22353025222073746f702d636f6c6f723d2200608388015251809260a2880190614825565b84018360a28201527f3c73746f70206f66667365743d22383025222073746f702d636f6c6f723d220060a5820152611cf282518093602060c485019101614825565b019160c483015260c78201520360b88101875201856148de565b614e1e565b92611d31611d1d615816565b896020815191012090602081519101201490565b9788156146aa575b506040518060c081011067ffffffffffffffff60c08301111761430e5760c08101604052609081527f3c7061746820643d224d2035302c3336302061203330302c333030203020312c60208201527f31203630302c302061203330302c333030203020312c31202d3630302c30222060408201527f66696c6c3d2223666666222066696c6c2d6f7061636974793d222e303222207360608201527f74726f6b653d2275726c2823486f7572676c6173735374726f6b65292220737460808201527f726f6b652d77696474683d2234222f3e0000000000000000000000000000000060a082015260405193846102c081011067ffffffffffffffff6102c08701111761430e576102c0850160405261029885527f3c7061746820643d226d3536362c3136312e323031762d35332e39323463302d60208601527f31392e3338322d32322e3531332d33372e3536332d36332e3339382d35312e3160408601527f39382d34302e3735362d31332e3539322d39342e3934362d32312e3037392d3160608601527f35322e3538372d32312e303739732d3131312e3833382c372e3438372d31353260808601527f2e3630322c32312e303739632d34302e3839332c31332e3633362d36332e343160a08601527f332c33312e3831362d36332e3431332c35312e3139387635332e39323463302c60c08601527f31372e3138312c31372e3730342c33332e3432372c35302e3232332c34362e3360e08601527f3934763238342e383039632d33322e3531392c31322e39362d35302e3232332c6101008601527f32392e3230362d35302e3232332c34362e3339347635332e39323463302c31396101208601527f2e3338322c32322e35322c33372e3536332c36332e3431332c35312e3139382c6101408601527f34302e3736332c31332e3539322c39342e3935342c32312e3037392c3135322e6101608601527f3630322c32312e303739733131312e3833312d372e3438372c3135322e3538376101808601527f2d32312e3037396334302e3838362d31332e3633362c36332e3339382d33312e6101a08601527f3831362c36332e3339382d35312e313938762d35332e39323463302d31372e316101c08601527f39362d31372e3730342d33332e3433352d35302e3232332d34362e34303156326101e08601527f30372e3630336333322e3531392d31322e3936372c35302e3232332d32392e326102008601527f30362c35302e3232332d34362e3430315a6d2d3334372e3436322c35372e37396102208601527f336c3133302e3935392c3133312e3032372d3133302e3935392c3133312e30316102408601527f33563231382e3939345a6d3236322e3932342e303232763236322e3031386c2d6102608601527f3133302e3933372d3133312e3030362c3133302e3933372d3133312e3031335a6102808601527f222066696c6c3d2223313631383232223e3c2f706174683e00000000000000006102a0860152896000146144855760405161218b8161488a565b60008152995b1561432457604051806101e081011067ffffffffffffffff6101e08301111761430e576101e081016040526101b181527f3c7061746820643d226d3438312e34362c3438312e35347638312e3031632d3260208201527f2e33352e37372d342e38322c312e35312d372e33392c322e32332d33302e332c60408201527f382e35342d37342e36352c31332e39322d3132342e30362c31332e39322d353360608201527f2e362c302d3130312e32342d362e33332d3133312e34372d31362e3136762d3860808201527f316c34362e332d34362e3331683137302e33336c34362e32392c34362e33315a60a08201527f222066696c6c3d2275726c282353616e64426f74746f6d29222f3e3c7061746860c08201527f20643d226d3433352e31372c3433352e323363302c312e31372d2e34362c322e60e08201527f33322d312e33332c332e34342d372e31312c392e30382d34312e39332c31352e6101008201527f39382d38332e38312c31352e3938732d37362e372d362e392d38332e38322d316101208201527f352e3938632d2e38372d312e31322d312e33332d322e32372d312e33332d332e6101408201527f3434762d2e30346c382e33342d382e33352e30312d2e30316331332e37322d366101608201527f2e35312c34322e39352d31312e30322c37362e382d31312e30327336322e39376101808201527f2c342e34392c37362e37322c31316c382e34322c382e34325a222066696c6c3d6101a08201527f2275726c282353616e64546f7029222f3e0000000000000000000000000000006101c0820152995b60405196876107e081011067ffffffffffffffff6107e08a01111761430e57613b9e9c612e596036602d9960819f97631e17b39f60e11b8d7f3c2f646566733e000000000000000000000000000000000000000000000000009a612f2a9f6107e0016040526107a782527f3c672066696c6c3d226e6f6e6522207374726f6b653d2275726c2823486f757260208301527f676c6173735374726f6b652922207374726f6b652d6c696e656361703d22726f60408301527f756e6422207374726f6b652d6d697465726c696d69743d22313022207374726f60608301527f6b652d77696474683d2234223e3c7061746820643d226d3536352e3634312c3160808301527f30372e323863302c392e3533372d352e35362c31382e3632392d31352e36373660a08301527f2c32362e393733682d2e303233632d392e3230342c372e3539362d32322e313960c08301527f342c31342e3536322d33382e3139372c32302e3539322d33392e3530342c313460e08301527f2e3933362d39372e3332352c32342e3335352d3136312e3733332c32342e33356101008301527f352d39302e34382c302d3136372e3934382d31382e3538322d3139392e3935336101208301527f2d34342e393438682d2e303233632d31302e3131352d382e3334342d31352e366101408301527f37362d31372e3433372d31352e3637362d32362e3937332c302d33392e3733356101608301527f2c39362e3535342d37312e3932312c3231352e3635322d37312e3932317332316101808301527f352e3632392c33322e3138352c3231352e3632392c37312e3932315a222f3e3c6101a08301527f7061746820643d226d3133342e33362c3136312e32303363302c33392e3733356101c08301527f2c39362e3535342c37312e3932312c3231352e3635322c37312e3932317332316101e08301527f352e3632392d33322e3138362c3231352e3632392d37312e393231222f3e3c6c6102008301527f696e652078313d223133342e3336222079313d223136312e323033222078323d6102208301527f223133342e3336222079323d223130372e3238222f3e3c6c696e652078313d226102408301527f3536352e3634222079313d223136312e323033222078323d223536352e3634226102608301527f2079323d223130372e3238222f3e3c6c696e652078313d223138342e353834226102808301527f2079313d223230362e383233222078323d223138342e353835222079323d22356102a08301527f33372e353739222f3e3c6c696e652078313d223231382e313831222079313d226102c08301527f3231382e313138222078323d223231382e313831222079323d223536322e35336102e08301527f37222f3e3c6c696e652078313d223438312e383138222079313d223231382e316103008301527f3432222078323d223438312e383139222079323d223536322e343238222f3e3c6103208301527f6c696e652078313d223531352e343135222079313d223230372e3335322220786103408301527f323d223531352e343136222079323d223533372e353739222f3e3c70617468206103608301527f643d226d3138342e35382c3533372e353863302c352e34352c342e32372c31306103808301527f2e36352c31322e30332c31352e3432682e303263352e35312c332e33392c31326103a08301527f2e37392c362e35352c32312e35352c392e34322c33302e32312c392e392c37386103c08301527f2e30322c31362e32382c3133312e38332c31362e32382c34392e34312c302c396103e08301527f332e37362d352e33382c3132342e30362d31332e39322c322e372d2e37362c356104008301527f2e32392d312e35342c372e37352d322e33352c382e37372d322e38372c31362e6104208301527f30352d362e30342c32312e35362d392e3433683063372e37362d342e37372c316104408301527f322e30342d392e39372c31322e30342d31352e3432222f3e3c7061746820643d6104608301527f226d3138342e3538322c3439322e363536632d33312e3335342c31322e3438356104808301527f2d35302e3232332c32382e35382d35302e3232332c34362e3134322c302c392e6104a08301527f3533362c352e3536342c31382e3632372c31352e3637372c32362e393639682e6104c08301527f30323263382e3530332c372e3030352c32302e3231332c31332e3436332c33346104e08301527f2e3532342c31392e3135392c392e3939392c332e3939312c32312e3236392c376105008301527f2e3630392c33332e3539372c31302e3738382c33362e34352c392e3430372c386105208301527f322e3138312c31352e3030322c3133312e3833352c31352e3030327339352e336105408301527f36332d352e3539352c3133312e3830372d31352e3030326331302e3834372d326105608301527f2e37392c32302e3836372d352e3932362c32392e3932342d392e3334392c312e6105808301527f3234342d2e3436372c322e3437332d2e3934322c332e3637332d312e3432342c6105a08301527f31342e3332362d352e3639362c32362e3033352d31322e3136312c33342e35326105c08301527f342d31392e313733682e3032326331302e3131342d382e3334322c31352e36376105e08301527f372d31372e3433332c31352e3637372d32362e3936392c302d31372e3536322d6106008301527f31382e3836392d33332e3636352d35302e3232332d34362e3135222f3e3c70616106208301527f746820643d226d3133342e33362c3539322e373263302c33392e3733352c39366106408301527f2e3535342c37312e3932312c3231352e3635322c37312e393231733231352e366106608301527f32392d33322e3138362c3231352e3632392d37312e393231222f3e3c6c696e656106808301527f2078313d223133342e3336222079313d223539322e3732222078323d223133346106a08301527f2e3336222079323d223533382e373937222f3e3c6c696e652078313d223536356106c08301527f2e3634222079313d223539322e3732222078323d223536352e3634222079323d6106e08301527f223533382e373937222f3e3c706f6c796c696e6520706f696e74733d223438316107008301527f2e383232203438312e393031203438312e373938203438312e383737203438316107208301527f2e373735203438312e383534203335302e303135203335302e303236203231386107408301527f2e313835203231382e313239222f3e3c706f6c796c696e6520706f696e74733d6107608301527f223231382e313835203438312e393031203231382e323331203438312e3835346107808301527f203335302e303135203335302e303236203438312e383232203231382e3135326107a08301527f222f3e3c2f673e000000000000000000000000000000000000000000000000006107c0830152604051998a957f3c672069643d22486f7572676c617373223e00000000000000000000000000006020880152603295612df58151809260208a8c019101614825565b8701612e0a8251809360208a85019101614825565b01612e1e8251809360208985019101614825565b01612e328251809360208885019101614825565b01612e468251809360208785019101614825565b01918201520360168101865201846148de565b6040519e8f9788977f3c646566733e000000000000000000000000000000000000000000000000000060208a0152612e9e6026998260208c9451948593019101614825565b8901612eb38251809360208c85019101614825565b01612ec78251809360208b85019101614825565b01612edb8251809360208a85019101614825565b01612eef8251809360208985019101614825565b01612f038251809360208885019101614825565b01612f178251809360208785019101614825565b019182015203600d8101895201876148de565b6137bd604c60c08301516101208401519361351961314c6040602084015193015196612f568186615984565b9461314761012b604051612f69816148c2565b600581527f2d3130302500000000000000000000000000000000000000000000000000000060208201526040519889917f3c74657874506174682073746172744f66667365743d220000000000000000006020840152612fd3815180926020603787019101614825565b7f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666683820160378101919091527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e00000000000000000061010982015282519261311791849161012090910190602001614825565b6a1e17ba32bc3a2830ba341f60a91b90830190910161012081019190915281900361010b810190915201876148de565b615984565b9561332b61012b60405161315f816148c2565b600281527f30250000000000000000000000000000000000000000000000000000000000006020820152604051998a917f3c74657874506174682073746172744f66667365743d2200000000000000000060208401526131c9815180926020603787019101614825565b82017f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666660378201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e00000000000000000061010982015261330682518093602061012085019101614825565b016a1e17ba32bc3a2830ba341f60a91b6101208201520361010b81018a5201886148de565b61333581846159ec565b9261351461012b604051613348816148c2565b600481527f2d3530250000000000000000000000000000000000000000000000000000000060208201526040519687917f3c74657874506174682073746172744f66667365743d2200000000000000000060208401526133b2815180926020603787019101614825565b82017f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666660378201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e0000000000000000006101098201526134ef82518093602061012085019101614825565b016a1e17ba32bc3a2830ba341f60a91b6101208201520361010b8101875201856148de565b6159ec565b906136f861012b60405161352c816148c2565b600381527f353025000000000000000000000000000000000000000000000000000000000060208201526040519485917f3c74657874506174682073746172744f66667365743d220000000000000000006020840152613596815180926020603787019101614825565b82017f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666660378201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e0000000000000000006101098201526136d382518093602061012085019101614825565b016a1e17ba32bc3a2830ba341f60a91b6101208201520361010b8101855201836148de565b6040519586937f3c7465787420746578742d72656e646572696e673d226f7074696d697a65537060208601527f656564223e000000000000000000000000000000000000000000000000000000604086015261375e815180926020604589019101614825565b8401613774825180936020604585019101614825565b01613789825180936020604585019101614825565b0161379e825180936020604585019101614825565b01661e17ba32bc3a1f60c91b604582015203602c8101845201826148de565b613a9d61019c60e0840151610140850151906137fe6137f86137f26137ec60806101a08b01519a015194614b07565b94614b07565b97614b07565b91614b07565b956040519687937f3c75736520687265663d2223476c6f77222066696c6c2d6f7061636974793d2260208601527f2e39222f3e00000000000000000000000000000000000000000000000000000060408601527f3c75736520687265663d2223476c6f772220783d22313030302220793d22313060458601527f3030222066696c6c2d6f7061636974793d222e39222f3e00000000000000000060658601527f3c75736520687265663d22234c6f676f2220783d223137302220793d22313730607c8601527f22207472616e73666f726d3d227363616c65282e3629222f3e3c757365206872609c8601527f65663d2223486f7572676c6173732220783d223135302220793d22393022207460bc8601527f72616e73666f726d3d22726f746174652831302922207472616e73666f726d2d60dc8601527f6f726967696e3d2235303020353030222f3e000000000000000000000000000060fc8601527f3c75736520687265663d222350726f67726573732220783d220000000000000061010e86015261012790613999815180926020858a019101614825565b8501937f2220793d22373930222f3e00000000000000000000000000000000000000000080948180948801527f3c75736520687265663d22235374617475732220783d2200000000000000000061013288015261014996613a038251809360208b85019101614825565b01958601527f3c75736520687265663d222353747265616d65642220783d220000000000000061015486015261016d94613a468251809360208985019101614825565b01938401527f3c75736520687265663d22234475726174696f6e2220783d220000000000000061017884015261019192613a898251809360208785019101614825565b01918201520361017c8101855201836148de565b6040519586937f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323060208601527f30302f737667222077696474683d223130303022206865696768743d2231303060408601527f30222076696577426f783d2230203020313030302031303030223e00000000006060860152613b29815180926020607b89019101614825565b8401613b3f825180936020607b85019101614825565b01613b54825180936020607b85019101614825565b01613b69825180936020607b85019101614825565b017f3c2f7376673e0000000000000000000000000000000000000000000000000000607b8201520360618101845201826148de565b6101405260a05160e0516040517fb971302a0000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa908115614302576000916142b7575b6142b361424c614151614242609487613d396089613c178a614c57565b9260a0608001516040519485927f5b7b2274726169745f74797065223a224173736574222c2276616c7565223a226020850152613c5e815180926020604088019101614825565b8301907f227d2c7b2274726169745f74797065223a2253656e646572222c2276616c756560408301527f223a22000000000000000000000000000000000000000000000000000000000091826060820152613cc3825180936020606385019101614825565b01907f227d2c7b2274726169745f74797065223a22537461747573222c2276616c756560638301526083820152613d04825180936020608685019101614825565b017f227d5d000000000000000000000000000000000000000000000000000000000060868201520360698101845201826148de565b6101a05160a05161403b61017e613d51602435614b07565b936080800151613d6b6001600160a01b0360805116614c57565b90604051968793613f2860208601987f54686973204e465420726570726573656e74732061207061796d656e742073748a527f7265616d20696e2061205361626c696572205632200000000000000000000000604088015282516020840190613dd88160558b0184614825565b8801947f20636f6e74726163742e20546865206f776e6572206f662074686973204e465460558701527f2063616e207769746864726177207468652073747265616d656420617373657460758701527f732c207768696368206172652064656e6f6d696e6174656420696e2000000000609587015282516020840196613e628260b183018a614825565b017f2e5c6e5c6e2d2053747265616d2049443a20000000000000000000000000000060b1820152613e9d82518093602060c385019101614825565b01613ed67f5c6e2d2000000000000000000000000000000000000000000000000000000000958660c384015251809360c7840190614825565b01947f20416464726573733a2000000000000000000000000000000000000000000000958660c7820152613f1482518093602060d185019101614825565b019260d184015251809360d5840190614825565b019060d5820152613f4382518093602060df85019101614825565b017f5c6e5c6e0000000000000000000000000000000000000000000000000000000060df8201527fe29aa0efb88f205741524e494e473a205472616e7366657272696e672074686560e38201527f204e4654206d616b657320746865206e6577206f776e657220746865207265636101038201527f697069656e74206f66207468652073747265616d2e205468652066756e6473206101238201527f617265206e6f74206175746f6d61746963616c6c792077697468647261776e206101438201527f666f72207468652070726576696f757320726563697069656e742e00000000006101638201520361015e8101855201836148de565b6101a051906141ac61404e602435614b07565b916140cd602d604051809560208201976a029b0b13634b2b9102b19160ad1b8952614083815180926020602b87019101614825565b82017f2023000000000000000000000000000000000000000000000000000000000000602b8201526140be8251809360208785019101614825565b0103600d8101865201846148de565b610140516140da90614993565b94604051998a977f7b2261747472696275746573223a00000000000000000000000000000000000060208a015261411b815180926020602e8d019101614825565b8801917f2c226465736372697074696f6e223a2200000000000000000000000000000000602e840152518093603e840190614825565b01917f222c2265787465726e616c5f75726c223a2268747470733a2f2f7361626c6965603e8401527f722e636f6d222c226e616d65223a220000000000000000000000000000000000605e840152518093606d840190614825565b017f222c22696d616765223a22646174613a696d6167652f7376672b786d6c3b6261606d8201527f736536342c000000000000000000000000000000000000000000000000000000608d82015261420d825180936020609285019101614825565b017f227d00000000000000000000000000000000000000000000000000000000000060928201520360748101845201826148de565b60c0819052614993565b61429f603d60405180937f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000602083015261428f8151809260208686019101614825565b810103601d8101845201826148de565b604051918291602083526020830190614848565b0390f35b90506020813d6020116142fa575b816142d2602093836148de565b810103126142f55751906001600160a01b03821682036142f55790614151613bfa565b600080fd5b3d91506142c5565b6040513d6000823e3d90fd5b634e487b7160e01b600052604160045260246000fd5b6040518061012081011067ffffffffffffffff6101208301111761430e57610120810160405260f881527f3c7061746820643d226d3438312e34362c3530342e3130317635382e3434396360208201527f2d322e33352e37372d342e38322c312e35312d372e33392c322e32332d33302e60408201527f332c382e35342d37342e36352c31332e39322d3132342e30362c31332e39322d60608201527f35332e362c302d3130312e32342d362e33332d3133312e34372d31362e31367660808201527f2d35382e343339683236322e39325a222066696c6c3d2275726c282353616e6460a08201527f426f74746f6d29222f3e3c656c6c697073652063783d22333530222063793d2260c08201527f3530342e313031222072783d223133312e343632222072793d2232382e31303860e08201527f222066696c6c3d2275726c282353616e64546f7029222f3e0000000000000000610100820152996123de565b604051806101c081011067ffffffffffffffff6101c08301111761430e576101c0810160405261019981527f3c706f6c79676f6e20706f696e74733d22333530203335302e3032362034313560208201527f2e3033203238342e39373820323835203238342e39373820333530203335302e60408201527f303236222066696c6c3d2275726c282353616e64426f74746f6d29222f3e3c7060608201527f61746820643d226d3431362e3334312c3238312e39373563302c2e3931342d2e60808201527f3335342c312e3830392d312e3033352c322e36382d352e3534322c372e30373660a08201527f2d33322e3636312c31322e34352d36352e32382c31322e34352d33322e36323460c08201527f2c302d35392e3733382d352e3337342d36352e32382d31322e34352d2e36383160e08201527f2d2e3837322d312e3033352d312e3736372d312e3033352d322e36382c302d2e6101008201527f3931342e3335342d312e3830382c312e3033352d322e3637362c352e3534322d6101208201527f372e3037362c33322e3635362d31322e34352c36352e32382d31322e34352c336101408201527f322e3631392c302c35392e3733382c352e3337342c36352e32382c31322e34356101608201527f2e3638312e3836372c312e3033352c312e3736322c312e3033352c322e3637366101808201527f5a222066696c6c3d2275726c282353616e64546f7029222f3e000000000000006101a082015299612191565b6146cc9198506146b861584f565b906020815191012090602081519101201490565b9638611d39565b905093610d64565b905094610a2f565b60d09461072c565b61470d915060203d602011614713575b61470581836148de565b810190614928565b386104e0565b503d6146fb565b614733915060203d6020116147135761470581836148de565b38610489565b634e487b7160e01b600052601260045260246000fd5b61477291925060203d602011614779575b61476a81836148de565b810190614900565b903861023d565b503d614760565b614799915060203d6020116147795761476a81836148de565b386101d2565b506020813d6020116147d4575b816147b9602093836148de565b810103126142f5575160058110156142f5576101779061016d565b3d91506147ac565b90506020813d60201161481d575b816147f7602093836148de565b810103126142f557516001600160a01b03811681036142f5576001600160a01b036100ff565b3d91506147ea565b60005b8381106148385750506000910152565b8181015183820152602001614828565b9060209161486181518092818552858086019101614825565b601f01601f1916010190565b610140810190811067ffffffffffffffff82111761430e57604052565b6020810190811067ffffffffffffffff82111761430e57604052565b6060810190811067ffffffffffffffff82111761430e57604052565b6040810190811067ffffffffffffffff82111761430e57604052565b90601f8019910116810190811067ffffffffffffffff82111761430e57604052565b908160209103126142f557516fffffffffffffffffffffffffffffffff811681036142f55790565b908160209103126142f5575164ffffffffff811681036142f55790565b67ffffffffffffffff811161430e57601f01601f191660200190565b9061496b82614945565b61497860405191826148de565b8281528092614989601f1991614945565b0190602036910137565b805115614af3576040516149a6816148a6565b604081527f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208201527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f60408201528151600292838201809211614add5760038092047f3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81168103614add57614a40908594951b614961565b936020850193829183518401925b838110614a8c5750505050510680600114614a7957600214614a6e575090565b603d90600019015390565b50603d9081600019820153600119015390565b85600491979293949701918251600190603f9082828260121c16880101518453828282600c1c16880101518385015382828260061c1688010151888501531685010151878201530195929190614a4e565b634e487b7160e01b600052601160045260246000fd5b50604051614b008161488a565b6000815290565b806000917a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000080821015614c49575b506d04ee2d6d415b85acef810000000080831015614c3a575b50662386f26fc1000080831015614c2b575b506305f5e10080831015614c1c575b5061271080831015614c0d575b506064821015614bfd575b600a80921015614bf3575b600190816021614b9e828701614961565b95860101905b614bb0575b5050505090565b600019019083907f30313233343536373839616263646566000000000000000000000000000000008282061a835304918215614bee57919082614ba4565b614ba9565b9160010191614b8d565b9190606460029104910191614b82565b60049193920491019138614b77565b60089193920491019138614b6a565b60109193920491019138614b5b565b60209193920491019138614b49565b604093508104915038614b30565b6001600160a01b031660405190614c6d826148a6565b602a8252602082016040368237825115614d8557603090538151600190811015614d8557607860218401536029905b808211614d0a575050614cac5790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602060248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b9091600f81166010811015614d70577f3031323334353637383961626364656600000000000000000000000000000000901a614d468486614d9b565b5360041c918015614d5b576000190190614c9c565b60246000634e487b7160e01b81526011600452fd5b60246000634e487b7160e01b81526032600452fd5b634e487b7160e01b600052603260045260246000fd5b908151811015614d85570160200190565b60405190614db9826148c2565b600482527f2667743b000000000000000000000000000000000000000000000000000000006020830152565b60405190614df2826148c2565b600482527f266c743b000000000000000000000000000000000000000000000000000000006020830152565b90614e86929493604051958692602094614e4081518092888089019101614825565b8401614e5482518093888085019101614825565b01614e6782518093878085019101614825565b01614e7a82518093868085019101614825565b010380855201836148de565b565b80156151995760009180615174575090505b6001908082811015614f0757505050614eb1614de5565b614f04602260405183614ece829551809260208086019101614825565b81017f203100000000000000000000000000000000000000000000000000000000000060208201520360028101845201826148de565b90565b66038d7ea4c6800011156151175760409081519060a0820182811067ffffffffffffffff82111761430e57808452614f3e8161488a565b600081528252825190614f50826148c2565b8482526020917f4b0000000000000000000000000000000000000000000000000000000000000083820152828401528351614f8a816148c2565b8581527f4d0000000000000000000000000000000000000000000000000000000000000083820152848401528351614fc1816148c2565b8581527f42000000000000000000000000000000000000000000000000000000000000008382015260608401528351614ff9816148c2565b8581527f54000000000000000000000000000000000000000000000000000000000000008382015260808401526000918583965b6150eb575b5084519461503f866148c2565b6007908187527f2623383830353b0000000000000000000000000000000000000000000000000083880152519560005b8281106150d857505050506150b96150bf917f20000000000000000000000000000000000000000000000000000000000000006027870152600886526150b4866148c2565b614b07565b91615743565b916005851015614d8557614f049460051b015192614e1e565b818101840151888201850152830161506f565b9591926103e89081851061510e57508680916064600a870406950493019661502d565b93929650615032565b5050615121614dac565b614f0460286040518361513e829551809260208086019101614825565b81017f203939392e39395400000000000000000000000000000000000000000000000060208201520360088101845201826148de565b600a0a918215615185575004614e9a565b80634e487b7160e01b602492526012600452fd5b50506040516151a7816148c2565b600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b620151809103048061523c57506151e9614de5565b614f04602660405183615206829551809260208086019101614825565b81017f203120446179000000000000000000000000000000000000000000000000000060208201520360068101845201826148de565b61270f811161530b57600181036152c857614f046020615290604051615261816148c2565b600481527f20446179000000000000000000000000000000000000000000000000000000008382015293614b07565b60405193816152a88693518092868087019101614825565b82016152bc82518093868085019101614825565b010380845201826148de565b614f0460206152906040516152dc816148c2565b600581527f20446179730000000000000000000000000000000000000000000000000000008382015293614b07565b50615314614dac565b614f04602a60405183615331829551809260208086019101614825565b81017f2039393939204461797300000000000000000000000000000000000000000000602082015203600a8101845201826148de565b6020818303126142f55780519067ffffffffffffffff82116142f5570181601f820112156142f557805161539a81614945565b926153a860405194856148de565b818452602082840101116142f557614f049160208085019101614825565b6001600160a01b031660409081516395d89b4160e01b8152600081600481855afa9081156155a05760009161557f575b5061545b8351615405816148c2565b601181527f5341422d56322d4c4f434b55502d4c494e0000000000000000000000000000006020918201528251908301207fc66b376a19264d832c1bc254000c18944ca5aa57ed50f4ea637c4da424d4c3bb1490565b156154995750505161546c816148c2565b600d81527f4c6f636b7570204c696e65617200000000000000000000000000000000000000602082015290565b6154fd83516154a7816148c2565b601181527f5341422d56322d4c4f434b55502d44594e0000000000000000000000000000006020918201528251908301207f6ab655856fa5352de8c05542b1937ac63c59342da992602767c02734cc5391651490565b1561553b5750505161550e816148c2565b600e81527f4c6f636b75702044796e616d6963000000000000000000000000000000000000602082015290565b61557b9083519384937f814a8a2e000000000000000000000000000000000000000000000000000000008552600485015260248401526044830190614848565b0390fd5b61559a913d8091833e61559281836148de565b810190615367565b386153f6565b83513d6000823e3d90fd5b3d156155d6573d906155bc82614945565b916155ca60405193846148de565b82523d6000602084013e565b606090565b60405160208101907f313ce56700000000000000000000000000000000000000000000000000000000825260048152615613816148c2565b6000928392839251915afa6156266155ab565b908061565d575b156156595760208180518101031261565557602001519060ff82168203615652575090565b80fd5b5080fd5b5090565b50602081511461562d565b6000809160405160208101906395d89b4160e01b82526004815261568b816148c2565b51915afa6156976155ab565b90158015615737575b6156fd57806020806156b793518301019101615367565b601e815111600014614f0457506040516156d0816148c2565b600b81527f4c6f6e672053796d626f6c000000000000000000000000000000000000000000602082015290565b5060405161570a816148c2565b600581527f4552433230000000000000000000000000000000000000000000000000000000602082015290565b506040815111156156a0565b806157555750604051614b008161488a565b600a8110156157ba5761576790614b07565b614f04602260405180937f2e3000000000000000000000000000000000000000000000000000000000000060208301526157aa8151809260208686019101614825565b81010360028101845201826148de565b6157c390614b07565b614f04602160405180937f2e0000000000000000000000000000000000000000000000000000000000000060208301526158068151809260208686019101614825565b81010360018101845201826148de565b60405190615823826148c2565b600782527f536574746c6564000000000000000000000000000000000000000000000000006020830152565b6040519061585c826148c2565b600882527f4465706c657465640000000000000000000000000000000000000000000000006020830152565b600581101561596e57600481036158a25750614f0461584f565b600381036158e457506040516158b7816148c2565b600881527f43616e63656c6564000000000000000000000000000000000000000000000000602082015290565b6001810361592657506040516158f9816148c2565b600981527f53747265616d696e670000000000000000000000000000000000000000000000602082015290565b60020361593557614f04615816565b604051615941816148c2565b600781527f50656e64696e6700000000000000000000000000000000000000000000000000602082015290565b634e487b7160e01b600052602160045260246000fd5b6030614e869193929360405194816159a6879351809260208087019101614825565b820164010714051160dd1b60208201526a029b0b13634b2b9102b19160ad1b60258201526159dd8251809360208785019101614825565b010360108101855201836148de565b6025614e86919392936040519481615a0e879351809260208087019101614825565b820164010714051160dd1b6020820152615a318251809360208785019101614825565b010360058101855201836148de565b60405190615a4d826148c2565b601082527f68736c283233302c3231252c31312529000000000000000000000000000000006020830152565b8015615cab57615a87615a40565b90612710908103908111614add57614f0491615aa561013692614b07565b6040519485927f3c672066696c6c3d226e6f6e65223e000000000000000000000000000000000060208501527f3c636972636c652063783d22313636222063793d2235302220723d2232322220602f8501527f7374726f6b653d22000000000000000000000000000000000000000000000000604f850152615b31815180926020605788019101614825565b83017f22207374726f6b652d77696474683d223130222f3e000000000000000000000060578201527f3c636972636c652063783d22313636222063793d2235302220706174684c656e606c8201527f6774683d2231303030302220723d22323222207374726f6b653d220000000000608c820152615bb982518093602060a785019101614825565b017f22207374726f6b652d6461736861727261793d22313030303022207374726f6b60a78201527f652d646173686f66667365743d2200000000000000000000000000000000000060c7820152615c1a82518093602060d585019101614825565b017f22207374726f6b652d6c696e656361703d22726f756e6422207374726f6b652d60d58201527f77696474683d223522207472616e73666f726d3d22726f74617465282d39302960f58201527f22207472616e73666f726d2d6f726967696e3d22313636203530222f3e000000610115820152631e17b39f60e11b610132820152036101168101845201826148de565b5050604051614b008161488a565b60009080518015615d2e579060009182915b818310615cdd57505050600d02900390565b909193603b60f81b7fff00000000000000000000000000000000000000000000000000000000000000615d108785614d9b565b511614615d26575b600d01936001019190615ccb565b849350615d18565b505050600090565b60009080518015615d2e579060009182915b818310615d5a5750505060041b900390565b909193603b60f81b7fff00000000000000000000000000000000000000000000000000000000000000615d8d8785614d9b565b511614615da3575b601001936001019190615d48565b849350615d9556"; /*////////////////////////////////////////////////////////////////////////// DEPLOYERS diff --git a/test/utils/Precompiles.t.sol b/test/utils/Precompiles.t.sol index 02a95f874..abc5558ab 100644 --- a/test/utils/Precompiles.t.sol +++ b/test/utils/Precompiles.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity >=0.8.19 <=0.9.0; +pragma solidity >=0.8.19 <0.9.0; import { LibString } from "solady/utils/LibString.sol"; From 915c78207bc8f95bfddf0e82772b125ff0dbaf2f Mon Sep 17 00:00:00 2001 From: Andrei Vlad Birgaoanu <99738872+andreivladbrg@users.noreply.github.com> Date: Sat, 23 Sep 2023 17:10:35 +0300 Subject: [PATCH 16/47] refactor: change the streamed amount to total amount in NFT SVG (#692) * refactor: change the streamed card from NFT SVG with total build: update shell scripts accordingly test: update tests accordingly * chore: say "total amount" in comments for total card * refactor: change the "Total" from NFT SVG with "Amount" build: update shell script accordingly test: update tests accordingly * chore: fix typo in shell script --- script/GenerateSVG.s.sol | 6 ++-- shell/generate-svg-panoply.sh | 10 +++--- shell/generate-svg.sh | 8 ++--- src/SablierV2NFTDescriptor.sol | 10 +++--- src/libraries/NFTSVG.sol | 36 +++++++++---------- src/libraries/SVGElements.sol | 6 ++-- .../lockup-dynamic/token-uri/tokenURI.t.sol | 4 +-- .../lockup-linear/token-uri/tokenURI.t.sol | 4 +-- .../concrete/nft-descriptor/generateSVG.t.sol | 15 ++++---- .../nft-descriptor/stringifyCardType.t.sol | 2 +- test/utils/Precompiles.sol | 2 +- 11 files changed, 53 insertions(+), 50 deletions(-) diff --git a/script/GenerateSVG.s.sol b/script/GenerateSVG.s.sol index 3255632b4..df3bbc9d7 100644 --- a/script/GenerateSVG.s.sol +++ b/script/GenerateSVG.s.sol @@ -19,12 +19,12 @@ contract GenerateSVG is BaseScript, SablierV2NFTDescriptor { /// @param progress The streamed amount as a numerical percentage with 4 implied decimals. /// @param status The status of the stream, as a string. - /// @param streamed The abbreviated streamed amount, as a string. + /// @param amount The abbreviated deposited amount, as a string. /// @param duration The total duration of the stream in days, as a number. function run( uint256 progress, string memory status, - string memory streamed, + string memory amount, uint256 duration ) public @@ -34,6 +34,7 @@ contract GenerateSVG is BaseScript, SablierV2NFTDescriptor { svg = NFTSVG.generateSVG( NFTSVG.SVGParams({ accentColor: generateAccentColor({ sablier: LOCKUP_LINEAR, streamId: uint256(keccak256(msg.data)) }), + amount: string.concat(SVGElements.SIGN_GE, " ", amount), assetAddress: DAI.toHexString(), assetSymbol: "DAI", duration: calculateDurationInDays({ startTime: 0, endTime: duration * 1 days }), @@ -41,7 +42,6 @@ contract GenerateSVG is BaseScript, SablierV2NFTDescriptor { progress: stringifyPercentage(progress), progressNumerical: progress, status: status, - streamed: streamed.equal("0") ? "0" : string.concat(SVGElements.SIGN_GE, " ", streamed), streamingModel: "Lockup Linear" }) ); diff --git a/shell/generate-svg-panoply.sh b/shell/generate-svg-panoply.sh index 0bbf39c36..4f9973ba5 100755 --- a/shell/generate-svg-panoply.sh +++ b/shell/generate-svg-panoply.sh @@ -9,12 +9,12 @@ # Strict mode: https://gist.github.com/vncsna/64825d5609c146e80de8b1fd623011ca set -euo pipefail -./shell/generate-svg.sh 0 "Pending" "0" 5 -./shell/generate-svg.sh 0 "Pending" "0" 21 -./shell/generate-svg.sh 0 "Pending" "0" 565 +./shell/generate-svg.sh 0 "Pending" "100" 5 +./shell/generate-svg.sh 0 "Pending" "100" 21 +./shell/generate-svg.sh 0 "Pending" "100" 565 -./shell/generate-svg.sh 0 "Canceled" "0" 3 -./shell/generate-svg.sh 0 "Canceled" "0" 3 +./shell/generate-svg.sh 0 "Canceled" "100" 3 +./shell/generate-svg.sh 0 "Canceled" "100" 3 ./shell/generate-svg.sh 144 "Canceled" "29.81K" 24 ./shell/generate-svg.sh 7231 "Canceled" "421.11K" 24 diff --git a/shell/generate-svg.sh b/shell/generate-svg.sh index eca4f9379..4f5a0d556 100755 --- a/shell/generate-svg.sh +++ b/shell/generate-svg.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash # Notes: -# - There are four input arguments: progress, status, streamed amount, and duration +# - There are four input arguments: progress, status, deposit amount, and duration # Pre-requisites: # - foundry (https://getfoundry.sh) @@ -12,7 +12,7 @@ set -euo pipefail # Load the arguments while using default values arg_progress=${1:-4235} arg_status=${2:-"Streaming"} -arg_streamed=${3:-"1.23M"} +arg_amount=${3:-"1.23M"} arg_duration=${4:-"91"} # Run the Forge script and extract the SVG from stdout @@ -21,13 +21,13 @@ output=$( --sig "run(uint256,string,string,uint256)" \ "$arg_progress" \ "$arg_status" \ - "$arg_streamed" \ + "$arg_amount" \ "$arg_duration" ) svg=$(echo "$output" | awk -F "svg: string " '{print $2}' | awk 'NF > 0') # Generate the file name -name="nft-${arg_progress}-${arg_status}-${arg_streamed}-${arg_duration}.svg" +name="nft-${arg_progress}-${arg_status}-${arg_amount}-${arg_duration}.svg" sanitized="$(echo "$name" | sed "s/ //g" )" # remove whitespaces # Put the SVG in a file diff --git a/src/SablierV2NFTDescriptor.sol b/src/SablierV2NFTDescriptor.sol index b1bdce663..741bb51ce 100644 --- a/src/SablierV2NFTDescriptor.sol +++ b/src/SablierV2NFTDescriptor.sol @@ -30,12 +30,12 @@ contract SablierV2NFTDescriptor is ISablierV2NFTDescriptor { struct TokenURIVars { address asset; string assetSymbol; + uint128 depositedAmount; string json; ISablierV2Lockup sablier; string sablierAddress; string status; string svg; - uint128 streamedAmount; uint256 streamedPercentage; string streamingModel; } @@ -49,13 +49,13 @@ contract SablierV2NFTDescriptor is ISablierV2NFTDescriptor { vars.sablierAddress = address(sablier).toHexString(); vars.asset = address(vars.sablier.getAsset(streamId)); vars.assetSymbol = safeAssetSymbol(vars.asset); + vars.depositedAmount = vars.sablier.getDepositedAmount(streamId); // Load the stream's data. vars.status = stringifyStatus(vars.sablier.statusOf(streamId)); - vars.streamedAmount = vars.sablier.streamedAmountOf(streamId); vars.streamedPercentage = calculateStreamedPercentage({ - streamedAmount: vars.streamedAmount, - depositedAmount: vars.sablier.getDepositedAmount(streamId) + streamedAmount: vars.sablier.streamedAmountOf(streamId), + depositedAmount: vars.depositedAmount }); vars.streamingModel = mapSymbol(sablier); @@ -63,6 +63,7 @@ contract SablierV2NFTDescriptor is ISablierV2NFTDescriptor { vars.svg = NFTSVG.generateSVG( NFTSVG.SVGParams({ accentColor: generateAccentColor(address(sablier), streamId), + amount: abbreviateAmount({ amount: vars.depositedAmount, decimals: safeAssetDecimals(vars.asset) }), assetAddress: vars.asset.toHexString(), assetSymbol: vars.assetSymbol, duration: calculateDurationInDays({ @@ -73,7 +74,6 @@ contract SablierV2NFTDescriptor is ISablierV2NFTDescriptor { progress: stringifyPercentage(vars.streamedPercentage), progressNumerical: vars.streamedPercentage, status: vars.status, - streamed: abbreviateAmount({ amount: vars.streamedAmount, decimals: safeAssetDecimals(vars.asset) }), streamingModel: vars.streamingModel }) ); diff --git a/src/libraries/NFTSVG.sol b/src/libraries/NFTSVG.sol index 3d3550763..807b03e3b 100644 --- a/src/libraries/NFTSVG.sol +++ b/src/libraries/NFTSVG.sol @@ -13,6 +13,7 @@ library NFTSVG { struct SVGParams { string accentColor; + string amount; string assetAddress; string assetSymbol; string duration; @@ -20,11 +21,13 @@ library NFTSVG { uint256 progressNumerical; string sablierAddress; string status; - string streamed; string streamingModel; } struct SVGVars { + string amountCard; + uint256 amountWidth; + uint256 amountXPosition; string cards; uint256 cardsWidth; string durationCard; @@ -36,9 +39,6 @@ library NFTSVG { string statusCard; uint256 statusWidth; uint256 statusXPosition; - string streamedCard; - uint256 streamedWidth; - uint256 streamedXPosition; } function generateSVG(SVGParams memory params) internal pure returns (string memory) { @@ -58,9 +58,9 @@ library NFTSVG { (vars.statusWidth, vars.statusCard) = SVGElements.card({ cardType: SVGElements.CardType.STATUS, content: params.status }); - // Generate the streamed card. - (vars.streamedWidth, vars.streamedCard) = - SVGElements.card({ cardType: SVGElements.CardType.STREAMED, content: params.streamed }); + // Generate the deposit amount card. + (vars.amountWidth, vars.amountCard) = + SVGElements.card({ cardType: SVGElements.CardType.AMOUNT, content: params.amount }); // Generate the duration card. (vars.durationWidth, vars.durationCard) = @@ -69,28 +69,28 @@ library NFTSVG { unchecked { // Calculate the width of the row containing the cards and the margins between them. vars.cardsWidth = - vars.streamedWidth + vars.durationWidth + vars.progressWidth + vars.statusWidth + CARD_MARGIN * 3; + vars.amountWidth + vars.durationWidth + vars.progressWidth + vars.statusWidth + CARD_MARGIN * 3; // Calculate the positions on the X axis based on the following layout: // - // ___________________________ SVG Width (1000px) _____________________________ - // | | | | | | | | | | - // | <-> | Progress | 16px | Status | 16px | Streamed | 16px | Duration | <-> | + // ___________________________ SVG Width (1000px) ___________________________ + // | | | | | | | | | | + // | <-> | Progress | 16px | Status | 16px | Amount | 16px | Duration | <-> | vars.progressXPosition = (1000 - vars.cardsWidth) / 2; vars.statusXPosition = vars.progressXPosition + vars.progressWidth + CARD_MARGIN; - vars.streamedXPosition = vars.statusXPosition + vars.statusWidth + CARD_MARGIN; - vars.durationXPosition = vars.streamedXPosition + vars.streamedWidth + CARD_MARGIN; + vars.amountXPosition = vars.statusXPosition + vars.statusWidth + CARD_MARGIN; + vars.durationXPosition = vars.amountXPosition + vars.amountWidth + CARD_MARGIN; } // Concatenate all cards. - vars.cards = string.concat(vars.progressCard, vars.statusCard, vars.streamedCard, vars.durationCard); + vars.cards = string.concat(vars.progressCard, vars.statusCard, vars.amountCard, vars.durationCard); return string.concat( '', SVGElements.BACKGROUND, generateDefs(params.accentColor, params.status, vars.cards), generateFloatingText(params.sablierAddress, params.streamingModel, params.assetAddress, params.assetSymbol), - generateHrefs(vars.progressXPosition, vars.statusXPosition, vars.streamedXPosition, vars.durationXPosition), + generateHrefs(vars.progressXPosition, vars.statusXPosition, vars.amountXPosition, vars.durationXPosition), "" ); } @@ -146,7 +146,7 @@ library NFTSVG { function generateHrefs( uint256 progressXPosition, uint256 statusXPosition, - uint256 streamedXPosition, + uint256 amountXPosition, uint256 durationXPosition ) internal @@ -164,8 +164,8 @@ library NFTSVG { '', - '', '0xf3a045dc986015be9ae43bb3462ae5981b0816e0 • Sablier V2 Lockup Linear0xf3a045dc986015be9ae43bb3462ae5981b0816e0 • Sablier V2 Lockup Linear0x03a6a84cd762d9707a21605b548aaab891562aab • DAI0x03a6a84cd762d9707a21605b548aaab891562aab • DAI'; + unicode'Progress0%StatusPendingAmount100Duration5 Days0xf3a045dc986015be9ae43bb3462ae5981b0816e0 • Sablier V2 Lockup Linear0xf3a045dc986015be9ae43bb3462ae5981b0816e0 • Sablier V2 Lockup Linear0x03a6a84cd762d9707a21605b548aaab891562aab • DAI0x03a6a84cd762d9707a21605b548aaab891562aab • DAI'; assertEq(actualSVG, expectedSVG, "SVG mismatch"); } @@ -32,6 +35,7 @@ contract GenerateSVG_Unit_Concrete_Test is NFTDescriptor_Unit_Concrete_Test { string memory actualSVG = nftDescriptorMock.generateSVG_( NFTSVG.SVGParams({ accentColor: "hsl(114,3%,53%)", + amount: string.concat(SVGElements.SIGN_GE, " 1.23M"), assetAddress: "0x03a6a84cd762d9707a21605b548aaab891562aab", assetSymbol: "DAI", duration: "91 Days", @@ -39,12 +43,11 @@ contract GenerateSVG_Unit_Concrete_Test is NFTDescriptor_Unit_Concrete_Test { progressNumerical: 4235, sablierAddress: "0xf3a045dc986015be9ae43bb3462ae5981b0816e0", status: "Streaming", - streamed: string.concat(SVGElements.SIGN_GE, " 1.23M"), streamingModel: "Lockup Linear" }) ); string memory expectedSVG = - unicode'Progress42.35%StatusStreamingStreamed≥ 1.23MDuration91 Days0xf3a045dc986015be9ae43bb3462ae5981b0816e0 • Sablier V2 Lockup Linear0xf3a045dc986015be9ae43bb3462ae5981b0816e0 • Sablier V2 Lockup Linear0x03a6a84cd762d9707a21605b548aaab891562aab • DAI0x03a6a84cd762d9707a21605b548aaab891562aab • DAI'; + unicode'Progress42.35%StatusStreamingAmount≥ 1.23MDuration91 Days0xf3a045dc986015be9ae43bb3462ae5981b0816e0 • Sablier V2 Lockup Linear0xf3a045dc986015be9ae43bb3462ae5981b0816e0 • Sablier V2 Lockup Linear0x03a6a84cd762d9707a21605b548aaab891562aab • DAI0x03a6a84cd762d9707a21605b548aaab891562aab • DAI'; assertEq(actualSVG, expectedSVG, "SVG mismatch"); } @@ -52,6 +55,7 @@ contract GenerateSVG_Unit_Concrete_Test is NFTDescriptor_Unit_Concrete_Test { string memory actualSVG = nftDescriptorMock.generateSVG_( NFTSVG.SVGParams({ accentColor: "hsl(123,25%,44%)", + amount: "100", assetAddress: "0x03a6a84cd762d9707a21605b548aaab891562aab", assetSymbol: "DAI", duration: "5 Days", @@ -59,12 +63,11 @@ contract GenerateSVG_Unit_Concrete_Test is NFTDescriptor_Unit_Concrete_Test { progressNumerical: 100, sablierAddress: "0xf3a045dc986015be9ae43bb3462ae5981b0816e0", status: "Depleted", - streamed: "100", streamingModel: "Lockup Linear" }) ); string memory expectedSVG = - unicode'Progress100%StatusDepletedStreamed100Duration5 Days0xf3a045dc986015be9ae43bb3462ae5981b0816e0 • Sablier V2 Lockup Linear0xf3a045dc986015be9ae43bb3462ae5981b0816e0 • Sablier V2 Lockup Linear0x03a6a84cd762d9707a21605b548aaab891562aab • DAI0x03a6a84cd762d9707a21605b548aaab891562aab • DAI'; + unicode'Progress100%StatusDepletedAmount100Duration5 Days0xf3a045dc986015be9ae43bb3462ae5981b0816e0 • Sablier V2 Lockup Linear0xf3a045dc986015be9ae43bb3462ae5981b0816e0 • Sablier V2 Lockup Linear0x03a6a84cd762d9707a21605b548aaab891562aab • DAI0x03a6a84cd762d9707a21605b548aaab891562aab • DAI'; assertEq(actualSVG, expectedSVG, "SVG mismatch"); } } diff --git a/test/unit/concrete/nft-descriptor/stringifyCardType.t.sol b/test/unit/concrete/nft-descriptor/stringifyCardType.t.sol index 2b75e9abf..9f5797882 100644 --- a/test/unit/concrete/nft-descriptor/stringifyCardType.t.sol +++ b/test/unit/concrete/nft-descriptor/stringifyCardType.t.sol @@ -9,7 +9,7 @@ contract StringifyCardType_Unit_Concrete_Test is NFTDescriptor_Unit_Concrete_Tes function test_StringifyCardType() external { assertEq(nftDescriptorMock.stringifyCardType_(SVGElements.CardType.PROGRESS), "Progress"); assertEq(nftDescriptorMock.stringifyCardType_(SVGElements.CardType.STATUS), "Status"); - assertEq(nftDescriptorMock.stringifyCardType_(SVGElements.CardType.STREAMED), "Streamed"); + assertEq(nftDescriptorMock.stringifyCardType_(SVGElements.CardType.AMOUNT), "Amount"); assertEq(nftDescriptorMock.stringifyCardType_(SVGElements.CardType.DURATION), "Duration"); } } diff --git a/test/utils/Precompiles.sol b/test/utils/Precompiles.sol index c3f5c4952..2bd845cfd 100644 --- a/test/utils/Precompiles.sol +++ b/test/utils/Precompiles.sol @@ -31,7 +31,7 @@ contract Precompiles { bytes public constant BYTECODE_LOCKUP_LINEAR = hex"60a034620003e757601f196001600160401b03601f62004a433881900382810185168601919084831187841017620003ec57808792606094604052833981010312620003e75783516001600160a01b03928382169291839003620003e7576020918287015196858816809803620003e75760400151948516809503620003e7576200008962000402565b90601c82527f5361626c696572205632204c6f636b7570204c696e656172204e46540000000084830152620000bd62000402565b601181527029a0a116ab1916a627a1a5aaa816a624a760791b8582015230608052600080546001600160a01b031990811688178255600180548216909b178b5596817fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a38351858111620003d35760039485548c81811c91168015620003c8575b89821014620003b45790818684931162000361575b508890868311600114620002f8578492620002ec575b505060001982871b1c1916908b1b1784555b8151948511620002d8576004958654998b8b811c9b168015620002cd575b828c1014620002ba57848b1162000271575b869798999a50819487116001146200020a57505093620001fe575b505082871b92600019911b1c19161790555b600a541617600a5560095560405161462090816200042382396080518161410e0152f35b015191503880620001c8565b8883528183208c9890969594939116915b8282106200025757505085116200023c575b50505050811b019055620001da565b01519060f884600019921b161c19169055388080806200022d565b8484015187558c989096019593840193908101906200021b565b87835281832085880160051c81019b838910620002af575b860160051c019a8c905b8c8110620002a3575050620001ad565b848155018c9062000293565b909b508b9062000289565b634e487b7160e01b835260228852602483fd5b9a607f169a6200019b565b634e487b7160e01b81526041600452602490fd5b0151905038806200016b565b908c8e9416918886528a862092865b8c82821062000341575050841162000328575b505050811b0184556200017d565b015160001983891b60f8161c191690553880806200031a565b91929395968291958786015181550195019301908f959493929162000307565b9091508684528884208680850160051c8201928b8610620003aa575b918f91869594930160051c01915b8281106200039b57505062000155565b8681558594508f91016200038b565b925081926200037d565b634e487b7160e01b84526022600452602484fd5b90607f169062000140565b634e487b7160e01b82526041600452602482fd5b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620003ec5760405256fe608080604052600436101561001357600080fd5b600090813560e01c90816301ffc9a7146129a45750806306fdde03146128e2578063081812fc146128c3578063095ea7b3146127345780631400ecec146126945780631c1cdd4c1461262f5780631e99d5691461261157806323b872dd146125e757806339a73c03146125a657806340e58ee514612202578063425d30dd146121e357806342842e0e1461219357806342966c681461203b5780634857501f14611fb15780634869e12d14611f765780635fe3b56714611f4f5780636352211e14611f1f5780636d0cee7514611ec957806370a0823114611e2057806375829def14611d8d578063780a82c814611d3d5780637cad6cd114611c6c5780637de6b1db14611a935780638659c2701461167f578063894e9a0d1461142b5780638bad38dd146113ae5780638f69b993146113125780639067b677146112bf57806395d89b41146111b257806396ce143114611093578063a22cb46514610fc2578063a2ffb89714610d84578063a6202bf214610c7e578063a80fc07114610c2c578063ab167ccc14610af3578063ad35efd414610a91578063b256456914610a72578063b88d4fde146109e1578063b8a3be66146109ac578063b971302a1461095d578063bc063e1a1461093a578063bc2be1be146108ea578063c156a11d1461082f578063c87b56dd146106f1578063cc364f4814610643578063d4dbd20b146105f1578063d511609f146105a5578063d975dfed14610559578063e985e9c514610504578063ea5ead19146104de578063eac8f5b814610475578063f590c1761461044c578063f851a440146104265763fdd46d601461027357600080fd5b346104235760603660031901126104235760043561028f612ad3565b610297612c13565b906102a0614104565b6102a983613291565b61040b576102cd83600052600b6020526001600160a01b0360406000205416331490565b15806103fb575b6103d8576102f883600052600b6020526001600160a01b0360406000205416331490565b806103b6575b610389576001600160a01b0381161561035f576001600160801b03821615610347579161033d602092600080516020614600833981519152948361422f565b604051908152a180f35b6024836040519063d2aabcd960e01b82526004820152fd5b60046040517fc61a0e9e000000000000000000000000000000000000000000000000000000008152fd5b826001600160a01b0360649260405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b5082845260056020526001600160a01b038060408620541690821614156102fe565b60405163216caf0d60e01b815260048101849052336024820152604490fd5b0390fd5b5061040583614457565b156102d4565b60248360405190634a5541ef60e01b82526004820152fd5b80fd5b50346104235780600319360112610423576001600160a01b036020915416604051908152f35b503461042357602036600319011261042357602061046b6004356132f7565b6040519015158152f35b503461042357602036600319011261042357600435808252600b60205260ff600160408420015460d01c16156104c75760016040836001600160a01b039360209552600b855220015416604051908152f35b6024906040519062b8e7e760e51b82526004820152fd5b5034610423576040366003190112610423576004356104fb612ad3565b610297826141c6565b50346104235760403660031901126104235761051e612abd565b6040610528612ad3565b926001600160a01b0380931681526008602052209116600052602052602060ff604060002054166040519015158152f35b50346104235760203660031901126104235760ff6001604060043593848152600b60205220015460d01c16156104c7576105946020916141c6565b6001600160801b0360405191168152f35b503461042357602036600319011261042357600435808252600b60205260ff600160408420015460d01c16156104c75760408260029260209452600b845220015460801c604051908152f35b503461042357602036600319011261042357600435808252600b60205260ff600160408420015460d01c16156104c75760036040836001600160801b039360209552600b855220015416604051908152f35b503461042357602036600319011261042357600435610660613207565b50808252600b60205260ff600160408420015460d01c16156104c7578160409160609352600b60205220600181549164ffffffffff918291015460a01c1690604051926106ac84612b9d565b818160a01c16845260c81c16602083015260408201526106ef60405180926040908164ffffffffff91828151168552826020820151166020860152015116910152565bf35b50346104235760208060031936011261081b5760043561072f61072a8260005260056020526001600160a01b0360406000205416151590565b612c29565b826001600160a01b03600a5416916044604051809481937fe9dc637500000000000000000000000000000000000000000000000000000000835230600484015260248301525afa92831561082357809361079e575b505061079a604051928284938452830190612a98565b0390f35b909192503d8082843e6107b18184612bd5565b820191838184031261081b5780519067ffffffffffffffff821161081f570182601f8201121561081b578051916107e783612bf7565b936107f56040519586612bd5565b83855285848401011161042357509061081391848085019101612a75565b903880610784565b5080fd5b8280fd5b604051903d90823e3d90fd5b50346104235760403660031901126104235760043561084c612ad3565b610854614104565b818352600b60205260ff600160408520015460d01c16156108d35781835260056020526001600160a01b036040842054168033036103d8579161033d81602093600080516020614600833981519152956108ad836141c6565b6001600160801b0381166108c2575b50612ebc565b6108cd90828561422f565b386108bc565b6024826040519062b8e7e760e51b82526004820152fd5b503461042357602036600319011261042357600435808252600b60205260ff600160408420015460d01c16156104c75760408264ffffffffff9260209452600b8452205460a01c16604051908152f35b5034610423578060031936011261042357602060405167016345785d8a00008152f35b503461042357602036600319011261042357600435808252600b60205260ff600160408420015460d01c16156104c7576040826001600160a01b039260209452600b8452205416604051908152f35b50346104235760203660031901126104235760ff600160406020936004358152600b855220015460d01c166040519015158152f35b5034610423576080366003190112610423576109fb612abd565b610a03612ad3565b906064359067ffffffffffffffff8211610a6e5736602383011215610a6e5781600401359284610a3285612bf7565b93610a406040519586612bd5565b858552366024878301011161081b5785610a6b96602460209301838801378501015260443591612d47565b80f35b8380fd5b503461042357602036600319011261042357602061046b60043561325a565b503461042357602036600319011261042357600435808252600b60205260ff600160408420015460d01c16156104c757610aca9061356d565b604051906005811015610adf57602092508152f35b602483634e487b7160e01b81526021600452fd5b50346104235761014036600319011261042357610b0e614104565b610b16613207565b9064ffffffffff80421680845260c4358281168103610c275781018216602085015260e435908183168203610c275701166040830152606435916001600160a01b03918284168094036104235750608435801515809103610c275760a43590811515809203610c275760243594848616809603610c275760043595858716809703610c2757604435906001600160801b038216809203610c275760405197610bbd89612b80565b8852602088015260408701526060860152608085015260a084015260c0830152604061010319360112610c275760405191610bf783612bb9565b610104359182168203610c275782610c1f9260209452610124358482015260e082015261366f565b604051908152f35b600080fd5b503461042357602036600319011261042357600435808252600b60205260ff600160408420015460d01c16156104c75760026040836001600160801b039360209552600b855220015416604051908152f35b503461042357602036600319011261042357610c98612abd565b6001600160a01b0380835416338103610d5b575081169081835260026020526001600160801b03604084205416908115610d2a5781610cfb918486526002602052604086206fffffffffffffffffffffffffffffffff1981541690553390614160565b6040519081527fca7a4a65a94ed2f37538814e00e1cd4c41a78261561e3f3794592f11409cf5af60203392a380f35b602483604051907f8410168c0000000000000000000000000000000000000000000000000000000082526004820152fd5b6040516331b339a960e21b81526001600160a01b03919091166004820152336024820152604490fd5b50346104235760603660031901126104235767ffffffffffffffff60043581811161081f57610db7903690600401612b1e565b91610dc0612ad3565b90604435908111610fbe57610dd9903690600401612b1e565b9093610de3614104565b818103610f8857855b818110610df7578680f35b610e028183876141ee565b35610e0e8285896141ee565b356001600160801b0381168103610c2757610e27614104565b610e3082613291565b610f7057610e5482600052600b6020526001600160a01b0360406000205416331490565b1580610f60575b610f4157610e7f82600052600b6020526001600160a01b0360406000205416331490565b80610f19575b610eec576001600160a01b0386161561035f576001600160801b03811615610ed457602082610ec760008051602061460083398151915293896001979661422f565b604051908152a101610dec565b6024826040519063d2aabcd960e01b82526004820152fd5b6064826001600160a01b038860405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b5081895260056020526001600160a01b0360408a2054166001600160a01b0387161415610e85565b60405163216caf0d60e01b815260048101839052336024820152604490fd5b50610f6a82614457565b15610e5b565b60248260405190634a5541ef60e01b82526004820152fd5b604491604051917faec9344000000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b8480fd5b503461042357604036600319011261042357610fdc612abd565b60243590811515809203610c27576001600160a01b03169081331461104f5733835260086020526040832082600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a380f35b606460405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152fd5b503461042357610160366003190112610423576110ae614104565b604051906110bb82612b80565b6110c3612abd565b82526110cd612ad3565b60208301526110da612c13565b60408301526001600160a01b03906064358281168103610c275760608401526084358015158103610c2757608084015260a4358015158103610c275760a084015260603660c3190112610423575060405161113481612b9d565b64ffffffffff60c4358181168103610c2757825260e4358181168103610c27576020830152610104359081168103610c2757604082015260c0830152604061012319360112610c27576040519161118a83612bb9565b610124359182168203610c275782610c1f9260209452610144358482015260e082015261366f565b5034610423578060031936011261042357604051908060045491600183811c928185169485156112b5575b60209586861081146112a15785885287949392918790821561127f575050600114611225575b505061121192500383612bd5565b61079a604051928284938452830190612a98565b90859250600482527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5b85831061126757505061121193508201013880611203565b8054838901850152879450869390920191810161124f565b925093505061121194915060ff191682840152151560051b8201013880611203565b602483634e487b7160e01b81526022600452fd5b93607f16936111dd565b503461042357602036600319011261042357600435808252600b60205260ff600160408420015460d01c16156104c757600160408364ffffffffff9360209552600b855220015460a01c16604051908152f35b503461042357602036600319011261042357600435808252600b60205260ff600160408420015460d01c16156104c75761134b9061356d565b906005821015908161138c57600283149182156113a0575b8215611377575b6020836040519015158152f35b90915061138c5750600460209114388061136a565b80634e487b7160e01b602492526021600452fd5b506003831491506000611363565b5034610423576020366003190112610423576004356001600160a01b039081811680910361081f5781835416338103610d5b575060015491816001600160a01b03198416176001556040519216825260208201527fdcb09aef4bf01068924ccce937981cbe59d25ba08380cf941aaaea4e4bd3960d60403392a280f35b50346104235760203660031901126104235760405161144981612b63565b8181528160208201528160408201528160608201528160808201528160a08201528160c08201528160e0820152816101008201528161012082015261014061148f613207565b9101526004358152600b60205260ff600160408320015460d01c1615611667576004358152600b602052604081206115686002604051926114cf84612b63565b80546001600160a01b038116855264ffffffffff8160a01c16602086015264ffffffffff8160c81c16604086015260ff8160f01c161515606086015260f81c1515608085015260ff60018201546001600160a01b03811660a087015264ffffffffff8160a01c1660c0870152818160c81c16151560e0870152818160d01c16151561010087015260d81c16151561012085015201613226565b61014082015261157960043561356d565b6005811015610adf579160026101a0931461165c575b506106ef610140604051926001600160a01b03815116845264ffffffffff602082015116602085015264ffffffffff60408201511660408501526060810151151560608501526080810151151560808501526001600160a01b0360a08201511660a085015264ffffffffff60c08201511660c085015260e0810151151560e0850152610100810151151561010085015261012081015115156101208501520151610140830190604090816001600160801b0391828151168552826020820151166020860152015116910152565b60608201523861158f565b602460405162b8e7e760e51b81526004356004820152fd5b503461042357602090816003193601126104235760043567ffffffffffffffff811161081b576116b483913690600401612b1e565b906116bd614104565b83915b8083106116cb578480f35b6116da838284979596976141ee565b35936116e4614104565b6116ed85613291565b1561170a5760248560405190634a5541ef60e01b82526004820152fd5b90919293611717816132f7565b611a7b5761173b81600052600b6020526001600160a01b0360406000205416331490565b1580611a5d575b611a3d5761174f81613328565b818652600b9081885261176760026040892001613226565b6001600160801b0391828251168382161015611a2557848952838a5260ff60408a205460f01c1615611a0d579282826117b986838e6117af8f9a829a60409e9d9a51166132c8565b94015116906132c8565b84875283865288872091611848835494600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff871617855560038185169586156119f3575b0190831699818b6fffffffffffffffffffffffffffffffff19819454161790556001600160a01b0380971696879160058c52818f82205416998c5260019e8f9120015416614160565b33840361193157843b6118aa575b50507f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd260406000805160206146008339815191529786935b825191825288820152a4604051908152a10191909392936116c0565b90919293809596503b1561192d576040516372eba20360e01b8152600481018790526001600160a01b03851660248201526001600160801b039182166044820152911660648201528b94939291908b90818160848183895af115611856576119189192939597949650612b4f565b61192957918a939194928a8d611856565b8980fd5b8b80fd5b833b611974575b50507f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd2604060008051602061460083398151915297869361188e565b90919280949596503b1561192d576040516372eba20360e01b8152600481018790526001600160a01b03861660248201526001600160801b039182166044820152911660648201528b94939291908b90818160848183885af115611938576119e29192939597949650612b4f565b61192957918a939194928a8d611938565b60018101600160c81b60ff60c81b198254161790556117ff565b602485604051906339c6dc7360e21b82526004820152fd5b602485604051906322cad1af60e11b82526004820152fd5b60405163216caf0d60e01b81526004810191909152336024820152604490fd5b50808552600586526001600160a01b03604086205416331415611742565b6024906040519063fe19f19f60e01b82526004820152fd5b50346104235760208060031936011261081b5760043590611ab2614104565b818352600b815260ff600160408520015460d01c16156108d357611ad58261356d565b6005811015611c585760048103611afe5760248360405190634a5541ef60e01b82526004820152fd5b60038103611b1e576024836040519063fe19f19f60e01b82526004820152fd5b600214611c4057611b4582600052600b6020526001600160a01b0360406000205416331490565b15610f4157818352600b815260ff604084205460f01c1615611c2857818352600b81526040832060ff60f01b19815416905560058152826001600160a01b03604082205416803b611bd1575b505060405160008051602061460083398151915292807f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f8680a28152a180f35b803b1561081b578180916024604051809481937f341a0bd90000000000000000000000000000000000000000000000000000000083528960048401525af115611b9157611c1d90612b4f565b61081f578238611b91565b602482604051906339c6dc7360e21b82526004820152fd5b602482604051906322cad1af60e11b82526004820152fd5b602484634e487b7160e01b81526021600452fd5b5034610423576020366003190112610423576004356001600160a01b039081811680910361081f5781835416338103610d5b5750600a5491816001600160a01b0319841617600a556040519216825260208201527fa2548bd4b805e907c1558a47b5858324fe8bb4a2e1ddfca647eecbf65610eebc60403392a26009546000198101908111611d295760407f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c91815190600182526020820152a180f35b602482634e487b7160e01b81526011600452fd5b503461042357602036600319011261042357600435808252600b60205260ff600160408420015460d01c16156104c75760408264ffffffffff9260209452600b8452205460c81c16604051908152f35b503461042357602036600319011261042357611da7612abd565b9080546001600160a01b0380821693338503611df9576001600160a01b03199394501691829116178255337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808380a380f35b6040516331b339a960e21b81526001600160a01b0386166004820152336024820152604490fd5b5034610423576020366003190112610423576001600160a01b03611e42612abd565b168015611e5f578160409160209352600683522054604051908152f35b608460405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e657200000000000000000000000000000000000000000000006064820152fd5b5034610423576020366003190112610423576001600160a01b036040602092600435611f0e61072a8260005260056020526001600160a01b0360406000205416151590565b815260058452205416604051908152f35b5034610423576020366003190112610423576020611f3e600435612c74565b6001600160a01b0360405191168152f35b503461042357806003193601126104235760206001600160a01b0360015416604051908152f35b50346104235760203660031901126104235760ff6001604060043593848152600b60205220015460d01c16156104c7576105946020916135f4565b50346104235760203660031901126104235760043590818152600b60205260ff600160408320015460d01c16156108d35780611fec8361356d565b9260058410156120275760026020940361200d575b50506040519015158152f35b8152600b8352604090205460f01c60ff1690503880612001565b602482634e487b7160e01b81526021600452fd5b503461042357602036600319011261042357600435612058614104565b61206181613291565b156121625761206f81614457565b15611a3d5761207d81612c74565b6120868261325a565b15908161215a575b81612147575b5061212f576020816120b460008051602061460083398151915293612c74565b90808552600783526001600160a01b0360408620926001600160a01b03199384815416905516918286526006845260408620600019815401905581865260058452604086209081541690558085604051937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a48152a180f35b602490604051906378630aa960e01b82526004820152fd5b6001600160a01b03915016151538612094565b83915061208e565b602490604051907f817cd6390000000000000000000000000000000000000000000000000000000082526004820152fd5b5034610423576121a236612ae9565b60405191602083019383851067ffffffffffffffff8611176121cd57610a6b94604052858452612d47565b634e487b7160e01b600052604160045260246000fd5b503461042357602036600319011261042357602061046b600435613291565b50346104235760208060031936011261081b5760043590612221614104565b61222a82613291565b156122475760248260405190634a5541ef60e01b82526004820152fd5b612250826132f7565b61258e5761227482600052600b6020526001600160a01b0360406000205416331490565b1580612570575b610f415761228882613328565b91808452600b825261229f60026040862001613226565b6001600160801b039384825116858216101561255857828652600b845260ff604087205460f01c161561254057816122e38287876117af60409683839951166132c8565b848852600b845282882091612372835498600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8b161785558a6003828616968715612526575b019184169a828c6fffffffffffffffffffffffffffffffff198195541617905560016001600160a01b0380921698899360058c52600b8483832054169c5220015416614160565b33840361243d57908891853b6123d0575b5050507f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd260406000805160206146008339815191529786935b825191825288820152a4604051908152a180f35b853b1561081f576040516372eba20360e01b8152600481018890526001600160a01b03861660248201526001600160801b03918216604482015291166064820152818160848183895af1612425575b80612383565b61242e90612b4f565b61243957863861241f565b8680fd5b83989792983b612485575b50507f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd26040859260008051602061460083398151915298996123bc565b833b15612522576040516372eba20360e01b8152600481018790526001600160a01b03861660248201526001600160801b03918216604482015291166064820152868160848183875af16124da575b80612448565b60408592600080516020614600833981519152986125187f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd294612b4f565b98509250506124d4565b8780fd5b60018101600160c81b60ff60c81b1982541617905561232b565b602483604051906339c6dc7360e21b82526004820152fd5b602483604051906322cad1af60e11b82526004820152fd5b50818352600581526001600160a01b0360408420541633141561227b565b6024826040519063fe19f19f60e01b82526004820152fd5b5034610423576020366003190112610423576001600160801b0360406020926001600160a01b036125d5612abd565b16815260028452205416604051908152f35b503461042357610a6b6125f936612ae9565b9161260c6126078433612ddd565b612cd6565b612ebc565b50346104235780600319360112610423576020600954604051908152f35b503461042357602036600319011261042357600435808252600b60205260ff600160408420015460d01c16156104c7576126689061356d565b90600582101561138c5760208215838115612689575b506040519015158152f35b60019150148261267e565b50346104235760203660031901126104235760043590818152600b60205260ff600160408320015460d01c16156108d357602091604082828152600b85522060ff815460f01c1680612722575b6126f9575b50506001600160801b0360405191168152f35b61271b92506001600160801b0360026127159201541691613328565b906132c8565b38806126e6565b5060ff600182015460c81c16156126e1565b50346104235760403660031901126104235761274e612abd565b602435906001600160a01b03808061276585612c74565b1692169180831461285957803314908115612838575b50156127ce57828452600760205260408420826001600160a01b03198254161790556127a683612c74565b167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258480a480f35b608460405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152fd5b9050845260086020526040842033855260205260ff6040852054163861277b565b608460405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152fd5b5034610423576020366003190112610423576020611f3e600435612c99565b5034610423578060031936011261042357604051908060035491600183811c9281851694851561299a575b60209586861081146112a15785885287949392918790821561127f57505060011461294057505061121192500383612bd5565b90859250600382527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b85831061298257505061121193508201013880611203565b8054838901850152879450869390920191810161296a565b93607f169361290d565b90503461081b57602036600319011261081b576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361081f57602092507f80ac58cd000000000000000000000000000000000000000000000000000000008114908115612a4b575b8115612a21575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501438612a1a565b7f5b5e139f0000000000000000000000000000000000000000000000000000000081149150612a13565b60005b838110612a885750506000910152565b8181015183820152602001612a78565b90602091612ab181518092818552858086019101612a75565b601f01601f1916010190565b600435906001600160a01b0382168203610c2757565b602435906001600160a01b0382168203610c2757565b6060906003190112610c27576001600160a01b03906004358281168103610c2757916024359081168103610c27579060443590565b9181601f84011215610c275782359167ffffffffffffffff8311610c27576020808501948460051b010111610c2757565b67ffffffffffffffff81116121cd57604052565b610160810190811067ffffffffffffffff8211176121cd57604052565b610100810190811067ffffffffffffffff8211176121cd57604052565b6060810190811067ffffffffffffffff8211176121cd57604052565b6040810190811067ffffffffffffffff8211176121cd57604052565b90601f8019910116810190811067ffffffffffffffff8211176121cd57604052565b67ffffffffffffffff81116121cd57601f01601f191660200190565b604435906001600160801b0382168203610c2757565b15612c3057565b606460405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152fd5b60005260056020526001600160a01b0360406000205416612c96811515612c29565b90565b612cbc61072a8260005260056020526001600160a01b0360406000205416151590565b60005260076020526001600160a01b036040600020541690565b15612cdd57565b608460405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f766564000000000000000000000000000000000000006064820152fd5b90612d6b939291612d5b6126078433612ddd565b612d66838383612ebc565b613075565b15612d7257565b60405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b906001600160a01b038080612df184612c74565b16931691838314938415612e24575b508315612e0e575b50505090565b612e1a91929350612c99565b1614388080612e08565b909350600052600860205260406000208260005260205260ff604060002054169238612e00565b15612e5257565b608460405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152fd5b90612ee59291612ecb83612c74565b916001600160a01b03948593848094169687911614612e4b565b1690811580612fdc57612ef78461325a565b159081612fd3575b5080612fca575b612fb25791808492612f3460008051602061460083398151915296602096612f2d85612c74565b1614612e4b565b60009382855260078652604085206001600160a01b031990818154169055818652600687526040862060001981540190558286526040862060018154019055838652600587528260408720918254161790557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6040519580a48152a1565b602483604051906378630aa960e01b82526004820152fd5b50831515612f06565b90501538612eff565b608460405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152fd5b3d15613070573d9061305682612bf7565b916130646040519384612bd5565b82523d6000602084013e565b606090565b9290803b156131fe576130df916020916001600160a01b0394604051809581948293897f150b7a02000000000000000000000000000000000000000000000000000000009b8c86523360048701521660248501526044840152608060648401526084830190612a98565b03916000968791165af19082908261319e575b505061317857613100613045565b805190816131735760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000161490565b909192506020813d82116131f6575b816131ba60209383612bd5565b8101031261081b5751907fffffffff000000000000000000000000000000000000000000000000000000008216820361042357509038806130f2565b3d91506131ad565b50505050600190565b6040519061321482612b9d565b60006040838281528260208201520152565b9060405161323381612b9d565b6040819360018154916001600160801b0392838116865260801c6020860152015416910152565b80600052600b60205260ff60016040600020015460d01c16156104c757600052600b60205260ff60016040600020015460d81c1690565b80600052600b60205260ff60016040600020015460d01c16156104c757600052600b60205260ff60016040600020015460c81c1690565b6001600160801b0391821690821603919082116132e157565b634e487b7160e01b600052601160045260246000fd5b80600052600b60205260ff60016040600020015460d01c16156104c757600052600b60205260406000205460f81c90565b600090808252600b6020526040822091825464ffffffffff42818360c81c16116133d65780600186015460a01c1691824210156133c0576133759394955060a01c168091039042036133de565b90828152600b6020526001600160801b039261339b8460026040852001541680946134be565b9283116133a85750501690565b60029350604092508152600b60205220015460801c90565b505050505060026001600160801b039101541690565b505091505090565b670de0b6b3a764000091600019838309928083029283808610950394808603951461349a578285101561345e57908291096001821901821680920460028082600302188083028203028083028203028083028203028083028203028083028203028092029003029360018380600003040190848311900302920304170290565b82606492604051927f63a05778000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b5050809250156134a8570490565b634e487b7160e01b600052601260045260246000fd5b9091906000198382098382029182808310920391808303921461355c57670de0b6b3a7640000908183101561352557947faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066994950990828211900360ee1b910360121c170290565b60449086604051917f5173648d00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050670de0b6b3a764000090049150565b80600052600b602052604060002060ff600182015460c81c16600014613594575050600490565b805460f81c6135ed575460a01c64ffffffffff1642106135e7576135b781613328565b90600052600b6020526001600160801b0380600260406000200154169116106000146135e257600190565b600290565b50600090565b5050600390565b80600052600b60205261360d6002604060002001613226565b81600052600b602052604060002060ff600182015460c81c1660001461364057506001600160801b039150602001511690565b5460f81c6136525750612c9690613328565b612c9691506001600160801b0360408183511692015116906132c8565b906001600160a01b036001541660206001600160a01b036060850151166024604051809481937fdcf844a700000000000000000000000000000000000000000000000000000000835260048301525afa8015613e9b57600090613e67575b6136f091506001600160801b0360408501511690602060e08601510151916144c0565b916001600160801b0383511660c08201519015613e3d5764ffffffffff815116602082019064ffffffffff82511690818111613dfd57505064ffffffffff604091511691019064ffffffffff8251169081811015613dbd57505064ffffffffff8042169151169081811015613d7d575050600954926001600160801b038151166040519061377d82612b9d565b815260006020820152600060408201526001600160a01b036060840151169060c08401519164ffffffffff6020840151169064ffffffffff604085015116906080870151151560a088015115159364ffffffffff6001600160a01b038a5116975116604051976137ec89612b63565b88526020880152604087015260608601526000608086015260a085015260c0840152600060e0840152600161010084015261012083015261014082015284600052600b60205260406000206001600160a01b038251166001600160a01b031982541617815561388364ffffffffff602084015116829064ffffffffff60a01b1964ffffffffff60a01b83549260a01b169116179055565b604082015181547eff0000000000000000000000000000000000000000000000000000000000006060850151151560f01b169078ffffffffffffffffffffffffffffffffffffffffffffffffff7dffffffffff000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000006080880151151560f81b169460c81b1691161717178155600181016001600160a01b0360a0840151166001600160a01b031982541617815561397a64ffffffffff60c085015116829064ffffffffff60a01b1964ffffffffff60a01b83549260a01b169116179055565b60e083015181546101008501516101208601517fffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff90921692151560c81b79ff00000000000000000000000000000000000000000000000000169290921791151560d01b7aff0000000000000000000000000000000000000000000000000000169190911790151560d81b7bff00000000000000000000000000000000000000000000000000000016179055610140909101518051602082015160801b6fffffffffffffffffffffffffffffffff199081166001600160801b03928316176002850155926040906003019201511682825416179055600185016009556001600160a01b0360608401511660005260026020526001600160801b0380604060002054168160208501511601166001600160a01b036060850151166000526040600020918254161790556001600160a01b036020830151168015613d3957613afe613af88660005260056020526001600160a01b0360406000205416151590565b15614021565b613b078561325a565b1580613d30575b80613d28575b613d1057602060008051602061460083398151915291613b4d613af88860005260056020526001600160a01b0360406000205416151590565b806000526006825260406000206001815401905586600052600582526040600020816001600160a01b0319825416179055866040519160007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4868152a1613bdd6001600160a01b036060840151166001600160801b03808451168160208601511601169030903390613ea7565b6001600160801b0360408201511680613ce1575b506001600160a01b038251167f075861cbceafeb777e8f15f357121b08f6f3adba387d599bb7b5278ca6192df5610160866001600160a01b0360208701511694613cd86001600160a01b03606089015116976080810151151560a0820151151590613ca26001600160a01b0360e060c08601519501515116956040519788523360208901526040880190604090816001600160801b0391828151168552826020820151166020860152015116910152565b60a086015260c0850152805164ffffffffff90811660e08601526020820151811661010086015260409091015116610120840152565b610140820152a4565b613d0a906001600160a01b036060850151166001600160a01b0360e08601515116903390613ea7565b38613bf1565b602485604051906378630aa960e01b82526004820152fd5b506000613b14565b50801515613b0e565b606460405162461bcd60e51b815260206004820152602060248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152fd5b6040517f210aec0e00000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b6040517f9fee269100000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b6040517f4c23297000000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b60046040517f6095d3bc000000000000000000000000000000000000000000000000000000008152fd5b6020823d602011613e93575b81613e8060209383612bd5565b8101031261042357506136f090516136cd565b3d9150613e73565b6040513d6000823e3d90fd5b9290604051927f23b872dd0000000000000000000000000000000000000000000000000000000060208501526001600160a01b03809216602485015216604483015260648201526064815260a081019181831067ffffffffffffffff8411176121cd57613f1692604052613f18565b565b6001600160a01b031690613f78604051613f3181612bb9565b6020938482527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564858301526000808587829751910182855af1613f72613045565b9161406c565b805191821591848315613ffd575b505050905015613f935750565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b91938180945001031261081b57820151908115158203610423575080388084613f86565b1561402857565b606460405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152fd5b919290156140cd5750815115614080575090565b3b156140895790565b606460405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b8251909150156140e05750805190602001fd5b6103f79060405191829162461bcd60e51b8352602060048401526024830190612a98565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361413657565b60046040517fa1c0d6e5000000000000000000000000000000000000000000000000000000008152fd5b916001600160a01b03604051927fa9059cbb000000000000000000000000000000000000000000000000000000006020850152166024830152604482015260448152608081019181831067ffffffffffffffff8411176121cd57613f1692604052613f18565b612c96906141d3816135f4565b90600052600b60205260026040600020015460801c906132c8565b91908110156141fe5760051b0190565b634e487b7160e01b600052603260045260246000fd5b9190916001600160801b03808094169116019182116132e157565b929190926001600160801b0380614245836141c6565b16928181169380851161441a5750600095838752602092600b84526142b86142786040946002868c20015460801c614214565b868a52600b86526142b36002868c20019182906001600160801b036fffffffffffffffffffffffffffffffff1983549260801b169116179055565b613226565b906142d38186840151169282868183511692015116906132c8565b1611156143eb575b838752600b83526001600160a01b03916142fe8683856001858d20015416614160565b8488526005845282818920541680331415806143e1575b61434a575b507ffa54f9f9bdcdd28778cbb9f78490df6691cc4e2729588e10f4cc0a26c465686a9495969750519586521693a3565b803b156143dd5797807ffa54f9f9bdcdd28778cbb9f78490df6691cc4e2729588e10f4cc0a26c465686a9697989960848451809481937f13375c3b0000000000000000000000000000000000000000000000000000000083528c600484015233602484015289891660448401528d60648401525af16143ce575b889796955061431a565b6143d790612b4f565b386143c4565b8880fd5b50803b1515614315565b838752600b835281872060018101600160c81b60ff60c81b1982541617905560ff60f01b1981541690556142db565b8360649186604051927fa1fb2bbc000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b60009080825260056020526001600160a01b03806040842054169283331493841561449c575b5050821561448a57505090565b9091506144973392612c99565b161490565b60ff929450906040918152600860205281812033825260205220541691388061447d565b9092916144cb613207565b936001600160801b03928381169182156145d75767016345785d8a00008082116145a0578085116145695750614515856145068193866134be565b169460208901958652846134be565b16918461452c604089019480865282875116614214565b1610156145535761454584918261454e955116906132c8565b915116906132c8565b168252565b634e487b7160e01b600052600160045260246000fd5b84604491604051917f4fea5c1a00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b60449250604051917f47152d6700000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b505050505090506040516145ea81612b9d565b6000815260006020820152600060408201529056fef8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7"; bytes public constant BYTECODE_NFT_DESCRIPTOR = - hex"6080806040523461001757615dab90816200001d8239f35b600080fdfe6080604052600436101561001257600080fd5b60003560e01c63e9dc63751461002757600080fd5b346142f55760403660031901126142f5576001600160a01b0360043516600435036142f557610056608061486d565b60006080819052606060a081905260c0819052610100819052610120819052610140819052610160829052610180919091526101a0526004356001600160a01b031660e08190526100a690614c57565b6101005260e0516040517feac8f5b80000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa908115614302576000916147dc575b506001600160a01b03610116911680608052615668565b60a05260e0516040517fad35efd40000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa80156143025760009061479f575b6101779150615888565b6101205260e0516040517f4869e12d0000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa801561430257602491600091614780575b506fffffffffffffffffffffffffffffffff81166101605260e0516040517fa80fc071000000000000000000000000000000000000000000000000000000008152833560048201529260209184919082906001600160a01b03165afa9182156143025760009261474f575b506fffffffffffffffffffffffffffffffff821615614739576fffffffffffffffffffffffffffffffff9182169082166127100282160416610180526102846004356153c6565b610120608001526040514660208201526bffffffffffffffffffffffff1960043560601b16604082015260243560548201526054815280608081011067ffffffffffffffff60808301111761430e57608081016040526020815191012061041b602963ffffffff61032b6103048261016861ffff8860101c160616614b07565b91601e604660ff6103218460146050848d60081c16060116614b07565b9816060116614b07565b6040519485927f68736c2800000000000000000000000000000000000000000000000000000000602085015261036b815180926020602488019101614825565b83017f2c0000000000000000000000000000000000000000000000000000000000000060248201526103a7825180936020602585019101614825565b7f252c000000000000000000000000000000000000000000000000000000000000602583830101526103e58351809460206027868601019101614825565b01017f252900000000000000000000000000000000000000000000000000000000000060278201520360098101845201826148de565b61042f6001600160a01b0360805116614c57565b60a05160e0516040517fbc2be1be0000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa80156143025760249160009161471a575b5060206001600160a01b0360606080015116604051938480927f9067b677000000000000000000000000000000000000000000000000000000008252823560048301525afa8015614302576104f1926000916146eb575b5064ffffffffff80911691166151d4565b61010051610180516105786021610515606461050e818606615743565b9404614b07565b604051938161052e869351809260208087019101614825565b82016105438251809360208085019101614825565b017f250000000000000000000000000000000000000000000000000000000000000060208201520360018101845201826148de565b610100608001519060a060800151936105bf6fffffffffffffffffffffffffffffffff60e0608001511660ff6105b86001600160a01b03608051166155db565b1690614e88565b956101206080015197604051996105d58b61486d565b8a5260208a015260408901526060880152608087015260a086015260c085015260e0840152610100830152610120820152604051806101c081011067ffffffffffffffff6101c08301111761430e576101c081016040526060815260006020820152606060408201526000606082015260006080820152606060a0820152600060c0820152600060e08201526060610100820152600061012082015260006101408201526060610160820152600061018082015260006101a082015260808201516106a660a0840151845190615a79565b906109b361015c604051926106ba846148c2565b600884527f50726f677265737300000000000000000000000000000000000000000000000060208501526107236040516106f38161488a565b60009052855160208701207fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4701490565b156146e3576090945b61073586614b07565b916040519586938493661e339034b21e9160c91b60208601526109818351958692610767846027840160208901614825565b6d11103334b6361e9111b33333111f60911b602785840101526c1e3932b1ba103bb4b23a341e9160991b603585840101526107ae8551809660206042888701019101614825565b7f22206865696768743d22313030222066696c6c2d6f7061636974793d222e3033828501860160428101919091527f222072783d223135222072793d22313522207374726f6b653d2223666666222060628201527f7374726f6b652d6f7061636974793d222e3122207374726f6b652d77696474686082820152651e911a11179f60d11b60a28201527f3c7465787420783d2232302220793d2233342220666f6e742d66616d696c793d60a88201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f7370616365222060c8820152703337b73a16b9b4bd329e911919383c111f60791b60e88201528651966108b491889160f990910190602001614825565b661e17ba32bc3a1f60c91b8285018601870160f98101919091527f3c7465787420783d2232302220793d2237322220666f6e742d66616d696c793d6101008201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f73706163652220610120820152703337b73a16b9b4bd329e91191b383c111f60791b61014082015287519761094f91899161015190910190602001614825565b661e17ba32bc3a1f60c91b6101518888888887010101010152602061015888888885519c8d9701010101019101614825565b631e17b39f60e11b90860190910190910190910190910161015881019190915281900361013c810190915201826148de565b60a083015260c0820152602860e0830151604051906109d18261488a565b60008252610c7761015c604051926109e8846148c2565b600684527f53746174757300000000000000000000000000000000000000000000000000006020850152610a1b84615cb9565b610a2482615d36565b808211156146db5750945b610a3a878701614b07565b91604051958693661e339034b21e9160c91b60208601528151610a64816027880160208601614825565b85016d11103334b6361e9111b33333111f60911b60278201526c1e3932b1ba103bb4b23a341e9160991b6035820152610aa7825180936020604285019101614825565b017f22206865696768743d22313030222066696c6c2d6f7061636974793d222e303360428201527f222072783d223135222072793d22313522207374726f6b653d2223666666222060628201527f7374726f6b652d6f7061636974793d222e3122207374726f6b652d77696474686082820152651e911a11179f60d11b60a28201527f3c7465787420783d2232302220793d2233342220666f6e742d66616d696c793d60a88201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f7370616365222060c8820152703337b73a16b9b4bd329e911919383c111f60791b60e8820152610ba382518093602060f985019101614825565b01661e17ba32bc3a1f60c91b60f98201527f3c7465787420783d2232302220793d2237322220666f6e742d66616d696c793d6101008201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f73706163652220610120820152703337b73a16b9b4bd329e91191b383c111f60791b610140820152610c3282518093602061015185019101614825565b01661e17ba32bc3a1f60c91b610151820152610c5982518093602061015885019101614825565b01631e17b39f60e11b6101588201520361013c8101845201826148de565b61010084015201610120820152602861010083015160405190610c998261488a565b60008252610ce361015c60405192610cb0846148c2565b600884527f53747265616d65640000000000000000000000000000000000000000000000006020850152610a1b84615cb9565b6101608401520161018082015261102660608301516030604051610d068161488a565b60008152610fad61015c60405194610d1d866148c2565b600886527f4475726174696f6e0000000000000000000000000000000000000000000000006020870152610d5086615cb9565b610d5982615d36565b808211156146d35750935b610d7060288601614b07565b91604051978893661e339034b21e9160c91b60208601528151610d9a816027880160208601614825565b85016d11103334b6361e9111b33333111f60911b60278201526c1e3932b1ba103bb4b23a341e9160991b6035820152610ddd825180936020604285019101614825565b017f22206865696768743d22313030222066696c6c2d6f7061636974793d222e303360428201527f222072783d223135222072793d22313522207374726f6b653d2223666666222060628201527f7374726f6b652d6f7061636974793d222e3122207374726f6b652d77696474686082820152651e911a11179f60d11b60a28201527f3c7465787420783d2232302220793d2233342220666f6e742d66616d696c793d60a88201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f7370616365222060c8820152703337b73a16b9b4bd329e911919383c111f60791b60e8820152610ed982518093602060f985019101614825565b01661e17ba32bc3a1f60c91b60f98201527f3c7465787420783d2232302220793d2237322220666f6e742d66616d696c793d6101008201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f73706163652220610120820152703337b73a16b9b4bd329e91191b383c111f60791b610140820152610f6882518093602061015185019101614825565b01661e17ba32bc3a1f60c91b610151820152610f8f82518093602061015885019101614825565b01631e17b39f60e11b6101588201520361013c8101865201846148de565b8260408601526028810160608601526101808501519060c0860151809161012088015192839185010101605881016020890152605719906103e8030160011c8060e0890152016010810161014088015201602081016101a08701520101608084015260a083015161010084015161016085015191614e1e565b8152604051908161010081011067ffffffffffffffff6101008401111761430e57610100820160405260c782527f3c726563742077696474683d223130302522206865696768743d22313030252260208301527f2066696c7465723d2275726c28234e6f69736529222f3e3c7265637420783d2260408301527f37302220793d223730222077696474683d2238363022206865696768743d223860608301527f3630222066696c6c3d2223666666222066696c6c2d6f7061636974793d222e3060808301527f33222072783d223435222072793d22343522207374726f6b653d22236666662260a08301527f207374726f6b652d6f7061636974793d222e3122207374726f6b652d7769647460c08301527f683d2234222f3e0000000000000000000000000000000000000000000000000060e083015282519160e084015191805194604051611175816148a6565b603381527f3c636972636c652069643d22476c6f772220723d22353030222066696c6c3d2260208201527f75726c282352616469616c476c6f7729222f3e000000000000000000000000006040820152604051966111d28861486d565b61011c88527f3c66696c7465722069643d224e6f697365223e3c6665466c6f6f6420783d223060208901527f2220793d2230222077696474683d223130302522206865696768743d2231303060408901527f252220666c6f6f642d636f6c6f723d2268736c283233302c3231252c3131252960608901527f2220666c6f6f642d6f7061636974793d22312220726573756c743d22666c6f6f60808901527f6446696c6c222f3e3c666554757262756c656e6365206261736546726571756560a08901527f6e63793d222e3422206e756d4f6374617665733d22332220726573756c743d2260c08901527f4e6f6973652220747970653d226672616374616c4e6f697365222f3e3c66654260e08901527f6c656e6420696e3d224e6f6973652220696e323d22666c6f6f6446696c6c22206101008901527f6d6f64653d22736f66742d6c69676874222f3e3c2f66696c7465723e0000000061012089015260405197886103a081011067ffffffffffffffff6103a08b01111761430e576103a0890160405261037b89527f3c706174682069643d224c6f676f222066696c6c3d2223666666222066696c6c60208a01527f2d6f7061636974793d222e312220643d226d3133332e3535392c3132342e303360408a01527f34632d2e3031332c322e3431322d312e3035392c342e3834382d322e3932332c60608a01527f362e3430322d322e3535382c312e3831392d352e3136382c332e3433392d372e60808a01527f3838382c342e3939362d31342e34342c382e3236322d33312e3034372c31322e60a08a01527f3536352d34372e3637342c31322e3536392d382e3835382e3033362d31372e3860c08a01527f33382d312e3237322d32362e3332382d332e3636332d392e3830362d322e373660e08a01527f362d31392e3038372d372e3131332d32372e3536322d31322e3737382d31332e6101008a01527f3834322d382e3032352c392e3436382d32382e3630362c31362e3135332d33356101208a01527f2e323635683063322e3033352d312e3833382c342e3235322d332e3534362c366101408a01527f2e3436332d352e323234683063362e3432392d352e3635352c31362e3231382d6101608a01527f322e3833352c32302e3335382c342e31372c342e3134332c352e3035372c382e6101808a01527f3831362c392e3634392c31332e39322c31332e373334682e30333763352e37336101a08a01527f362c362e3436312c31352e3335372d322e3235332c392e33382d382e34382c306101c08a01527f2c302d332e3531352d332e3531352d332e3531352d332e3531352d31312e34396101e08a01527f2d31312e3437382d35322e3635362d35322e3636342d36342e3833372d36342e6102008a01527f3833376c2e3034392d2e303337632d312e3732352d312e3630362d322e3731396102208a01527f2d332e3834372d322e3735312d362e3230346830632d2e3034362d322e3337356102408a01527f2c312e3036322d342e3538322c322e3732362d362e32323968306c2e3138352d6102608a01527f2e3134386830632e3039392d2e3036322c2e3232322d2e3134382c2e33372d2e6102808a01527f323539683063322e30362d312e3336322c332e3935312d322e3632312c362e306102a08a01527f34342d332e3834324335372e3736332d332e3437332c39372e37362d322e33346102c08a01527f312c3132382e3633372c31382e3333326331362e3637312c392e3934362d32366102e08a01527f2e3334342c35342e3831332d33382e3635312c34302e3139392d362e3239392d6103008a01527f362e3039362d31382e3036332d31372e3734332d31392e3636382d31382e38316103208a01527f312d362e3031362d342e3034372d31332e3036312c342e3737362d372e3735326103408a01527f2c392e3735316c36382e3235342c36382e33373163312e3732342c312e3630316103608a01527f2c322e3731342c332e38342c322e3733382c362e3139325a222f3e00000000006103808a0152604051978860a081011067ffffffffffffffff60a08b01111761430e57611cb0611d119160a08b0160405260758b527f3c706174682069643d22466c6f6174696e6754657874222066696c6c3d226e6f60208c01527f6e652220643d224d31323520343568373530733830203020383020383076373560408c01527f307330203830202d3830203830682d373530732d38302030202d3830202d383060608c01527f762d3735307330202d3830203830202d3830222f3e000000000000000000000060808c0152611867615a40565b906040517f3c72616469616c4772616469656e742069643d2252616469616c476c6f77223e6020820152611d0c60d87f3c73746f70206f66667365743d223025222073746f702d636f6c6f723d22000093846040850152805161199960b88660208501936118d981605e840187614825565b8101997f222073746f702d6f7061636974793d222e36222f3e0000000000000000000000605e8c01527f3c73746f70206f66667365743d2231303025222073746f702d636f6c6f723d229a8b607382015261193e825180936020609385019101614825565b017f222073746f702d6f7061636974793d2230222f3e00000000000000000000000060938201527f3c2f72616469616c4772616469656e743e00000000000000000000000000000060a78201520360988101885201866148de565b6119a1615a40565b90604051967f3c6c696e6561724772616469656e742069643d2253616e64546f70222078313d60208901527f223025222079313d223025223e000000000000000000000000000000000000006040890152604d8801528251611a0781606b8a0184614825565b8701917f222f3e00000000000000000000000000000000000000000000000000000000009283606b82015289606e820152611a4c825180936020608e85019101614825565b019082608e830152611a9060a2897f3c2f6c696e6561724772616469656e743e0000000000000000000000000000009485609182015203608281018b5201896148de565b611bd6610108611a9e615a40565b6040519b8c917f3c6c696e6561724772616469656e742069643d2253616e64426f74746f6d222060208401527f78313d2231303025222079313d2231303025223e00000000000000000000000060408401527f3c73746f70206f66667365743d22313025222073746f702d636f6c6f723d22006054840152611b2a815180926020607387019101614825565b8201908760738301526076820152875190611b49826096830188614825565b018660968201527f3c616e696d617465206174747269627574654e616d653d22783122206475723d60998201527f2236732220726570656174436f756e743d22696e646566696e6974652220766160b98201527f6c7565733d223330253b3630253b313230253b3630253b3330253b222f3e000060d98201528560f78201520360e881018c52018a6148de565b611bde615a40565b906040519a8b957f3c6c696e6561724772616469656e742069643d22486f7572676c61737353747260208801527f6f6b6522206772616469656e745472616e73666f726d3d22726f74617465283960408801527f302922206772616469656e74556e6974733d227573657253706163654f6e557360608801527f65223e000000000000000000000000000000000000000000000000000000000060808801527f3c73746f70206f66667365743d22353025222073746f702d636f6c6f723d2200608388015251809260a2880190614825565b84018360a28201527f3c73746f70206f66667365743d22383025222073746f702d636f6c6f723d220060a5820152611cf282518093602060c485019101614825565b019160c483015260c78201520360b88101875201856148de565b614e1e565b92611d31611d1d615816565b896020815191012090602081519101201490565b9788156146aa575b506040518060c081011067ffffffffffffffff60c08301111761430e5760c08101604052609081527f3c7061746820643d224d2035302c3336302061203330302c333030203020312c60208201527f31203630302c302061203330302c333030203020312c31202d3630302c30222060408201527f66696c6c3d2223666666222066696c6c2d6f7061636974793d222e303222207360608201527f74726f6b653d2275726c2823486f7572676c6173735374726f6b65292220737460808201527f726f6b652d77696474683d2234222f3e0000000000000000000000000000000060a082015260405193846102c081011067ffffffffffffffff6102c08701111761430e576102c0850160405261029885527f3c7061746820643d226d3536362c3136312e323031762d35332e39323463302d60208601527f31392e3338322d32322e3531332d33372e3536332d36332e3339382d35312e3160408601527f39382d34302e3735362d31332e3539322d39342e3934362d32312e3037392d3160608601527f35322e3538372d32312e303739732d3131312e3833382c372e3438372d31353260808601527f2e3630322c32312e303739632d34302e3839332c31332e3633362d36332e343160a08601527f332c33312e3831362d36332e3431332c35312e3139387635332e39323463302c60c08601527f31372e3138312c31372e3730342c33332e3432372c35302e3232332c34362e3360e08601527f3934763238342e383039632d33322e3531392c31322e39362d35302e3232332c6101008601527f32392e3230362d35302e3232332c34362e3339347635332e39323463302c31396101208601527f2e3338322c32322e35322c33372e3536332c36332e3431332c35312e3139382c6101408601527f34302e3736332c31332e3539322c39342e3935342c32312e3037392c3135322e6101608601527f3630322c32312e303739733131312e3833312d372e3438372c3135322e3538376101808601527f2d32312e3037396334302e3838362d31332e3633362c36332e3339382d33312e6101a08601527f3831362c36332e3339382d35312e313938762d35332e39323463302d31372e316101c08601527f39362d31372e3730342d33332e3433352d35302e3232332d34362e34303156326101e08601527f30372e3630336333322e3531392d31322e3936372c35302e3232332d32392e326102008601527f30362c35302e3232332d34362e3430315a6d2d3334372e3436322c35372e37396102208601527f336c3133302e3935392c3133312e3032372d3133302e3935392c3133312e30316102408601527f33563231382e3939345a6d3236322e3932342e303232763236322e3031386c2d6102608601527f3133302e3933372d3133312e3030362c3133302e3933372d3133312e3031335a6102808601527f222066696c6c3d2223313631383232223e3c2f706174683e00000000000000006102a0860152896000146144855760405161218b8161488a565b60008152995b1561432457604051806101e081011067ffffffffffffffff6101e08301111761430e576101e081016040526101b181527f3c7061746820643d226d3438312e34362c3438312e35347638312e3031632d3260208201527f2e33352e37372d342e38322c312e35312d372e33392c322e32332d33302e332c60408201527f382e35342d37342e36352c31332e39322d3132342e30362c31332e39322d353360608201527f2e362c302d3130312e32342d362e33332d3133312e34372d31362e3136762d3860808201527f316c34362e332d34362e3331683137302e33336c34362e32392c34362e33315a60a08201527f222066696c6c3d2275726c282353616e64426f74746f6d29222f3e3c7061746860c08201527f20643d226d3433352e31372c3433352e323363302c312e31372d2e34362c322e60e08201527f33322d312e33332c332e34342d372e31312c392e30382d34312e39332c31352e6101008201527f39382d38332e38312c31352e3938732d37362e372d362e392d38332e38322d316101208201527f352e3938632d2e38372d312e31322d312e33332d322e32372d312e33332d332e6101408201527f3434762d2e30346c382e33342d382e33352e30312d2e30316331332e37322d366101608201527f2e35312c34322e39352d31312e30322c37362e382d31312e30327336322e39376101808201527f2c342e34392c37362e37322c31316c382e34322c382e34325a222066696c6c3d6101a08201527f2275726c282353616e64546f7029222f3e0000000000000000000000000000006101c0820152995b60405196876107e081011067ffffffffffffffff6107e08a01111761430e57613b9e9c612e596036602d9960819f97631e17b39f60e11b8d7f3c2f646566733e000000000000000000000000000000000000000000000000009a612f2a9f6107e0016040526107a782527f3c672066696c6c3d226e6f6e6522207374726f6b653d2275726c2823486f757260208301527f676c6173735374726f6b652922207374726f6b652d6c696e656361703d22726f60408301527f756e6422207374726f6b652d6d697465726c696d69743d22313022207374726f60608301527f6b652d77696474683d2234223e3c7061746820643d226d3536352e3634312c3160808301527f30372e323863302c392e3533372d352e35362c31382e3632392d31352e36373660a08301527f2c32362e393733682d2e303233632d392e3230342c372e3539362d32322e313960c08301527f342c31342e3536322d33382e3139372c32302e3539322d33392e3530342c313460e08301527f2e3933362d39372e3332352c32342e3335352d3136312e3733332c32342e33356101008301527f352d39302e34382c302d3136372e3934382d31382e3538322d3139392e3935336101208301527f2d34342e393438682d2e303233632d31302e3131352d382e3334342d31352e366101408301527f37362d31372e3433372d31352e3637362d32362e3937332c302d33392e3733356101608301527f2c39362e3535342d37312e3932312c3231352e3635322d37312e3932317332316101808301527f352e3632392c33322e3138352c3231352e3632392c37312e3932315a222f3e3c6101a08301527f7061746820643d226d3133342e33362c3136312e32303363302c33392e3733356101c08301527f2c39362e3535342c37312e3932312c3231352e3635322c37312e3932317332316101e08301527f352e3632392d33322e3138362c3231352e3632392d37312e393231222f3e3c6c6102008301527f696e652078313d223133342e3336222079313d223136312e323033222078323d6102208301527f223133342e3336222079323d223130372e3238222f3e3c6c696e652078313d226102408301527f3536352e3634222079313d223136312e323033222078323d223536352e3634226102608301527f2079323d223130372e3238222f3e3c6c696e652078313d223138342e353834226102808301527f2079313d223230362e383233222078323d223138342e353835222079323d22356102a08301527f33372e353739222f3e3c6c696e652078313d223231382e313831222079313d226102c08301527f3231382e313138222078323d223231382e313831222079323d223536322e35336102e08301527f37222f3e3c6c696e652078313d223438312e383138222079313d223231382e316103008301527f3432222078323d223438312e383139222079323d223536322e343238222f3e3c6103208301527f6c696e652078313d223531352e343135222079313d223230372e3335322220786103408301527f323d223531352e343136222079323d223533372e353739222f3e3c70617468206103608301527f643d226d3138342e35382c3533372e353863302c352e34352c342e32372c31306103808301527f2e36352c31322e30332c31352e3432682e303263352e35312c332e33392c31326103a08301527f2e37392c362e35352c32312e35352c392e34322c33302e32312c392e392c37386103c08301527f2e30322c31362e32382c3133312e38332c31362e32382c34392e34312c302c396103e08301527f332e37362d352e33382c3132342e30362d31332e39322c322e372d2e37362c356104008301527f2e32392d312e35342c372e37352d322e33352c382e37372d322e38372c31362e6104208301527f30352d362e30342c32312e35362d392e3433683063372e37362d342e37372c316104408301527f322e30342d392e39372c31322e30342d31352e3432222f3e3c7061746820643d6104608301527f226d3138342e3538322c3439322e363536632d33312e3335342c31322e3438356104808301527f2d35302e3232332c32382e35382d35302e3232332c34362e3134322c302c392e6104a08301527f3533362c352e3536342c31382e3632372c31352e3637372c32362e393639682e6104c08301527f30323263382e3530332c372e3030352c32302e3231332c31332e3436332c33346104e08301527f2e3532342c31392e3135392c392e3939392c332e3939312c32312e3236392c376105008301527f2e3630392c33332e3539372c31302e3738382c33362e34352c392e3430372c386105208301527f322e3138312c31352e3030322c3133312e3833352c31352e3030327339352e336105408301527f36332d352e3539352c3133312e3830372d31352e3030326331302e3834372d326105608301527f2e37392c32302e3836372d352e3932362c32392e3932342d392e3334392c312e6105808301527f3234342d2e3436372c322e3437332d2e3934322c332e3637332d312e3432342c6105a08301527f31342e3332362d352e3639362c32362e3033352d31322e3136312c33342e35326105c08301527f342d31392e313733682e3032326331302e3131342d382e3334322c31352e36376105e08301527f372d31372e3433332c31352e3637372d32362e3936392c302d31372e3536322d6106008301527f31382e3836392d33332e3636352d35302e3232332d34362e3135222f3e3c70616106208301527f746820643d226d3133342e33362c3539322e373263302c33392e3733352c39366106408301527f2e3535342c37312e3932312c3231352e3635322c37312e393231733231352e366106608301527f32392d33322e3138362c3231352e3632392d37312e393231222f3e3c6c696e656106808301527f2078313d223133342e3336222079313d223539322e3732222078323d223133346106a08301527f2e3336222079323d223533382e373937222f3e3c6c696e652078313d223536356106c08301527f2e3634222079313d223539322e3732222078323d223536352e3634222079323d6106e08301527f223533382e373937222f3e3c706f6c796c696e6520706f696e74733d223438316107008301527f2e383232203438312e393031203438312e373938203438312e383737203438316107208301527f2e373735203438312e383534203335302e303135203335302e303236203231386107408301527f2e313835203231382e313239222f3e3c706f6c796c696e6520706f696e74733d6107608301527f223231382e313835203438312e393031203231382e323331203438312e3835346107808301527f203335302e303135203335302e303236203438312e383232203231382e3135326107a08301527f222f3e3c2f673e000000000000000000000000000000000000000000000000006107c0830152604051998a957f3c672069643d22486f7572676c617373223e00000000000000000000000000006020880152603295612df58151809260208a8c019101614825565b8701612e0a8251809360208a85019101614825565b01612e1e8251809360208985019101614825565b01612e328251809360208885019101614825565b01612e468251809360208785019101614825565b01918201520360168101865201846148de565b6040519e8f9788977f3c646566733e000000000000000000000000000000000000000000000000000060208a0152612e9e6026998260208c9451948593019101614825565b8901612eb38251809360208c85019101614825565b01612ec78251809360208b85019101614825565b01612edb8251809360208a85019101614825565b01612eef8251809360208985019101614825565b01612f038251809360208885019101614825565b01612f178251809360208785019101614825565b019182015203600d8101895201876148de565b6137bd604c60c08301516101208401519361351961314c6040602084015193015196612f568186615984565b9461314761012b604051612f69816148c2565b600581527f2d3130302500000000000000000000000000000000000000000000000000000060208201526040519889917f3c74657874506174682073746172744f66667365743d220000000000000000006020840152612fd3815180926020603787019101614825565b7f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666683820160378101919091527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e00000000000000000061010982015282519261311791849161012090910190602001614825565b6a1e17ba32bc3a2830ba341f60a91b90830190910161012081019190915281900361010b810190915201876148de565b615984565b9561332b61012b60405161315f816148c2565b600281527f30250000000000000000000000000000000000000000000000000000000000006020820152604051998a917f3c74657874506174682073746172744f66667365743d2200000000000000000060208401526131c9815180926020603787019101614825565b82017f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666660378201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e00000000000000000061010982015261330682518093602061012085019101614825565b016a1e17ba32bc3a2830ba341f60a91b6101208201520361010b81018a5201886148de565b61333581846159ec565b9261351461012b604051613348816148c2565b600481527f2d3530250000000000000000000000000000000000000000000000000000000060208201526040519687917f3c74657874506174682073746172744f66667365743d2200000000000000000060208401526133b2815180926020603787019101614825565b82017f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666660378201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e0000000000000000006101098201526134ef82518093602061012085019101614825565b016a1e17ba32bc3a2830ba341f60a91b6101208201520361010b8101875201856148de565b6159ec565b906136f861012b60405161352c816148c2565b600381527f353025000000000000000000000000000000000000000000000000000000000060208201526040519485917f3c74657874506174682073746172744f66667365743d220000000000000000006020840152613596815180926020603787019101614825565b82017f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666660378201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e0000000000000000006101098201526136d382518093602061012085019101614825565b016a1e17ba32bc3a2830ba341f60a91b6101208201520361010b8101855201836148de565b6040519586937f3c7465787420746578742d72656e646572696e673d226f7074696d697a65537060208601527f656564223e000000000000000000000000000000000000000000000000000000604086015261375e815180926020604589019101614825565b8401613774825180936020604585019101614825565b01613789825180936020604585019101614825565b0161379e825180936020604585019101614825565b01661e17ba32bc3a1f60c91b604582015203602c8101845201826148de565b613a9d61019c60e0840151610140850151906137fe6137f86137f26137ec60806101a08b01519a015194614b07565b94614b07565b97614b07565b91614b07565b956040519687937f3c75736520687265663d2223476c6f77222066696c6c2d6f7061636974793d2260208601527f2e39222f3e00000000000000000000000000000000000000000000000000000060408601527f3c75736520687265663d2223476c6f772220783d22313030302220793d22313060458601527f3030222066696c6c2d6f7061636974793d222e39222f3e00000000000000000060658601527f3c75736520687265663d22234c6f676f2220783d223137302220793d22313730607c8601527f22207472616e73666f726d3d227363616c65282e3629222f3e3c757365206872609c8601527f65663d2223486f7572676c6173732220783d223135302220793d22393022207460bc8601527f72616e73666f726d3d22726f746174652831302922207472616e73666f726d2d60dc8601527f6f726967696e3d2235303020353030222f3e000000000000000000000000000060fc8601527f3c75736520687265663d222350726f67726573732220783d220000000000000061010e86015261012790613999815180926020858a019101614825565b8501937f2220793d22373930222f3e00000000000000000000000000000000000000000080948180948801527f3c75736520687265663d22235374617475732220783d2200000000000000000061013288015261014996613a038251809360208b85019101614825565b01958601527f3c75736520687265663d222353747265616d65642220783d220000000000000061015486015261016d94613a468251809360208985019101614825565b01938401527f3c75736520687265663d22234475726174696f6e2220783d220000000000000061017884015261019192613a898251809360208785019101614825565b01918201520361017c8101855201836148de565b6040519586937f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323060208601527f30302f737667222077696474683d223130303022206865696768743d2231303060408601527f30222076696577426f783d2230203020313030302031303030223e00000000006060860152613b29815180926020607b89019101614825565b8401613b3f825180936020607b85019101614825565b01613b54825180936020607b85019101614825565b01613b69825180936020607b85019101614825565b017f3c2f7376673e0000000000000000000000000000000000000000000000000000607b8201520360618101845201826148de565b6101405260a05160e0516040517fb971302a0000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa908115614302576000916142b7575b6142b361424c614151614242609487613d396089613c178a614c57565b9260a0608001516040519485927f5b7b2274726169745f74797065223a224173736574222c2276616c7565223a226020850152613c5e815180926020604088019101614825565b8301907f227d2c7b2274726169745f74797065223a2253656e646572222c2276616c756560408301527f223a22000000000000000000000000000000000000000000000000000000000091826060820152613cc3825180936020606385019101614825565b01907f227d2c7b2274726169745f74797065223a22537461747573222c2276616c756560638301526083820152613d04825180936020608685019101614825565b017f227d5d000000000000000000000000000000000000000000000000000000000060868201520360698101845201826148de565b6101a05160a05161403b61017e613d51602435614b07565b936080800151613d6b6001600160a01b0360805116614c57565b90604051968793613f2860208601987f54686973204e465420726570726573656e74732061207061796d656e742073748a527f7265616d20696e2061205361626c696572205632200000000000000000000000604088015282516020840190613dd88160558b0184614825565b8801947f20636f6e74726163742e20546865206f776e6572206f662074686973204e465460558701527f2063616e207769746864726177207468652073747265616d656420617373657460758701527f732c207768696368206172652064656e6f6d696e6174656420696e2000000000609587015282516020840196613e628260b183018a614825565b017f2e5c6e5c6e2d2053747265616d2049443a20000000000000000000000000000060b1820152613e9d82518093602060c385019101614825565b01613ed67f5c6e2d2000000000000000000000000000000000000000000000000000000000958660c384015251809360c7840190614825565b01947f20416464726573733a2000000000000000000000000000000000000000000000958660c7820152613f1482518093602060d185019101614825565b019260d184015251809360d5840190614825565b019060d5820152613f4382518093602060df85019101614825565b017f5c6e5c6e0000000000000000000000000000000000000000000000000000000060df8201527fe29aa0efb88f205741524e494e473a205472616e7366657272696e672074686560e38201527f204e4654206d616b657320746865206e6577206f776e657220746865207265636101038201527f697069656e74206f66207468652073747265616d2e205468652066756e6473206101238201527f617265206e6f74206175746f6d61746963616c6c792077697468647261776e206101438201527f666f72207468652070726576696f757320726563697069656e742e00000000006101638201520361015e8101855201836148de565b6101a051906141ac61404e602435614b07565b916140cd602d604051809560208201976a029b0b13634b2b9102b19160ad1b8952614083815180926020602b87019101614825565b82017f2023000000000000000000000000000000000000000000000000000000000000602b8201526140be8251809360208785019101614825565b0103600d8101865201846148de565b610140516140da90614993565b94604051998a977f7b2261747472696275746573223a00000000000000000000000000000000000060208a015261411b815180926020602e8d019101614825565b8801917f2c226465736372697074696f6e223a2200000000000000000000000000000000602e840152518093603e840190614825565b01917f222c2265787465726e616c5f75726c223a2268747470733a2f2f7361626c6965603e8401527f722e636f6d222c226e616d65223a220000000000000000000000000000000000605e840152518093606d840190614825565b017f222c22696d616765223a22646174613a696d6167652f7376672b786d6c3b6261606d8201527f736536342c000000000000000000000000000000000000000000000000000000608d82015261420d825180936020609285019101614825565b017f227d00000000000000000000000000000000000000000000000000000000000060928201520360748101845201826148de565b60c0819052614993565b61429f603d60405180937f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000602083015261428f8151809260208686019101614825565b810103601d8101845201826148de565b604051918291602083526020830190614848565b0390f35b90506020813d6020116142fa575b816142d2602093836148de565b810103126142f55751906001600160a01b03821682036142f55790614151613bfa565b600080fd5b3d91506142c5565b6040513d6000823e3d90fd5b634e487b7160e01b600052604160045260246000fd5b6040518061012081011067ffffffffffffffff6101208301111761430e57610120810160405260f881527f3c7061746820643d226d3438312e34362c3530342e3130317635382e3434396360208201527f2d322e33352e37372d342e38322c312e35312d372e33392c322e32332d33302e60408201527f332c382e35342d37342e36352c31332e39322d3132342e30362c31332e39322d60608201527f35332e362c302d3130312e32342d362e33332d3133312e34372d31362e31367660808201527f2d35382e343339683236322e39325a222066696c6c3d2275726c282353616e6460a08201527f426f74746f6d29222f3e3c656c6c697073652063783d22333530222063793d2260c08201527f3530342e313031222072783d223133312e343632222072793d2232382e31303860e08201527f222066696c6c3d2275726c282353616e64546f7029222f3e0000000000000000610100820152996123de565b604051806101c081011067ffffffffffffffff6101c08301111761430e576101c0810160405261019981527f3c706f6c79676f6e20706f696e74733d22333530203335302e3032362034313560208201527f2e3033203238342e39373820323835203238342e39373820333530203335302e60408201527f303236222066696c6c3d2275726c282353616e64426f74746f6d29222f3e3c7060608201527f61746820643d226d3431362e3334312c3238312e39373563302c2e3931342d2e60808201527f3335342c312e3830392d312e3033352c322e36382d352e3534322c372e30373660a08201527f2d33322e3636312c31322e34352d36352e32382c31322e34352d33322e36323460c08201527f2c302d35392e3733382d352e3337342d36352e32382d31322e34352d2e36383160e08201527f2d2e3837322d312e3033352d312e3736372d312e3033352d322e36382c302d2e6101008201527f3931342e3335342d312e3830382c312e3033352d322e3637362c352e3534322d6101208201527f372e3037362c33322e3635362d31322e34352c36352e32382d31322e34352c336101408201527f322e3631392c302c35392e3733382c352e3337342c36352e32382c31322e34356101608201527f2e3638312e3836372c312e3033352c312e3736322c312e3033352c322e3637366101808201527f5a222066696c6c3d2275726c282353616e64546f7029222f3e000000000000006101a082015299612191565b6146cc9198506146b861584f565b906020815191012090602081519101201490565b9638611d39565b905093610d64565b905094610a2f565b60d09461072c565b61470d915060203d602011614713575b61470581836148de565b810190614928565b386104e0565b503d6146fb565b614733915060203d6020116147135761470581836148de565b38610489565b634e487b7160e01b600052601260045260246000fd5b61477291925060203d602011614779575b61476a81836148de565b810190614900565b903861023d565b503d614760565b614799915060203d6020116147795761476a81836148de565b386101d2565b506020813d6020116147d4575b816147b9602093836148de565b810103126142f5575160058110156142f5576101779061016d565b3d91506147ac565b90506020813d60201161481d575b816147f7602093836148de565b810103126142f557516001600160a01b03811681036142f5576001600160a01b036100ff565b3d91506147ea565b60005b8381106148385750506000910152565b8181015183820152602001614828565b9060209161486181518092818552858086019101614825565b601f01601f1916010190565b610140810190811067ffffffffffffffff82111761430e57604052565b6020810190811067ffffffffffffffff82111761430e57604052565b6060810190811067ffffffffffffffff82111761430e57604052565b6040810190811067ffffffffffffffff82111761430e57604052565b90601f8019910116810190811067ffffffffffffffff82111761430e57604052565b908160209103126142f557516fffffffffffffffffffffffffffffffff811681036142f55790565b908160209103126142f5575164ffffffffff811681036142f55790565b67ffffffffffffffff811161430e57601f01601f191660200190565b9061496b82614945565b61497860405191826148de565b8281528092614989601f1991614945565b0190602036910137565b805115614af3576040516149a6816148a6565b604081527f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208201527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f60408201528151600292838201809211614add5760038092047f3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81168103614add57614a40908594951b614961565b936020850193829183518401925b838110614a8c5750505050510680600114614a7957600214614a6e575090565b603d90600019015390565b50603d9081600019820153600119015390565b85600491979293949701918251600190603f9082828260121c16880101518453828282600c1c16880101518385015382828260061c1688010151888501531685010151878201530195929190614a4e565b634e487b7160e01b600052601160045260246000fd5b50604051614b008161488a565b6000815290565b806000917a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000080821015614c49575b506d04ee2d6d415b85acef810000000080831015614c3a575b50662386f26fc1000080831015614c2b575b506305f5e10080831015614c1c575b5061271080831015614c0d575b506064821015614bfd575b600a80921015614bf3575b600190816021614b9e828701614961565b95860101905b614bb0575b5050505090565b600019019083907f30313233343536373839616263646566000000000000000000000000000000008282061a835304918215614bee57919082614ba4565b614ba9565b9160010191614b8d565b9190606460029104910191614b82565b60049193920491019138614b77565b60089193920491019138614b6a565b60109193920491019138614b5b565b60209193920491019138614b49565b604093508104915038614b30565b6001600160a01b031660405190614c6d826148a6565b602a8252602082016040368237825115614d8557603090538151600190811015614d8557607860218401536029905b808211614d0a575050614cac5790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602060248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b9091600f81166010811015614d70577f3031323334353637383961626364656600000000000000000000000000000000901a614d468486614d9b565b5360041c918015614d5b576000190190614c9c565b60246000634e487b7160e01b81526011600452fd5b60246000634e487b7160e01b81526032600452fd5b634e487b7160e01b600052603260045260246000fd5b908151811015614d85570160200190565b60405190614db9826148c2565b600482527f2667743b000000000000000000000000000000000000000000000000000000006020830152565b60405190614df2826148c2565b600482527f266c743b000000000000000000000000000000000000000000000000000000006020830152565b90614e86929493604051958692602094614e4081518092888089019101614825565b8401614e5482518093888085019101614825565b01614e6782518093878085019101614825565b01614e7a82518093868085019101614825565b010380855201836148de565b565b80156151995760009180615174575090505b6001908082811015614f0757505050614eb1614de5565b614f04602260405183614ece829551809260208086019101614825565b81017f203100000000000000000000000000000000000000000000000000000000000060208201520360028101845201826148de565b90565b66038d7ea4c6800011156151175760409081519060a0820182811067ffffffffffffffff82111761430e57808452614f3e8161488a565b600081528252825190614f50826148c2565b8482526020917f4b0000000000000000000000000000000000000000000000000000000000000083820152828401528351614f8a816148c2565b8581527f4d0000000000000000000000000000000000000000000000000000000000000083820152848401528351614fc1816148c2565b8581527f42000000000000000000000000000000000000000000000000000000000000008382015260608401528351614ff9816148c2565b8581527f54000000000000000000000000000000000000000000000000000000000000008382015260808401526000918583965b6150eb575b5084519461503f866148c2565b6007908187527f2623383830353b0000000000000000000000000000000000000000000000000083880152519560005b8281106150d857505050506150b96150bf917f20000000000000000000000000000000000000000000000000000000000000006027870152600886526150b4866148c2565b614b07565b91615743565b916005851015614d8557614f049460051b015192614e1e565b818101840151888201850152830161506f565b9591926103e89081851061510e57508680916064600a870406950493019661502d565b93929650615032565b5050615121614dac565b614f0460286040518361513e829551809260208086019101614825565b81017f203939392e39395400000000000000000000000000000000000000000000000060208201520360088101845201826148de565b600a0a918215615185575004614e9a565b80634e487b7160e01b602492526012600452fd5b50506040516151a7816148c2565b600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b620151809103048061523c57506151e9614de5565b614f04602660405183615206829551809260208086019101614825565b81017f203120446179000000000000000000000000000000000000000000000000000060208201520360068101845201826148de565b61270f811161530b57600181036152c857614f046020615290604051615261816148c2565b600481527f20446179000000000000000000000000000000000000000000000000000000008382015293614b07565b60405193816152a88693518092868087019101614825565b82016152bc82518093868085019101614825565b010380845201826148de565b614f0460206152906040516152dc816148c2565b600581527f20446179730000000000000000000000000000000000000000000000000000008382015293614b07565b50615314614dac565b614f04602a60405183615331829551809260208086019101614825565b81017f2039393939204461797300000000000000000000000000000000000000000000602082015203600a8101845201826148de565b6020818303126142f55780519067ffffffffffffffff82116142f5570181601f820112156142f557805161539a81614945565b926153a860405194856148de565b818452602082840101116142f557614f049160208085019101614825565b6001600160a01b031660409081516395d89b4160e01b8152600081600481855afa9081156155a05760009161557f575b5061545b8351615405816148c2565b601181527f5341422d56322d4c4f434b55502d4c494e0000000000000000000000000000006020918201528251908301207fc66b376a19264d832c1bc254000c18944ca5aa57ed50f4ea637c4da424d4c3bb1490565b156154995750505161546c816148c2565b600d81527f4c6f636b7570204c696e65617200000000000000000000000000000000000000602082015290565b6154fd83516154a7816148c2565b601181527f5341422d56322d4c4f434b55502d44594e0000000000000000000000000000006020918201528251908301207f6ab655856fa5352de8c05542b1937ac63c59342da992602767c02734cc5391651490565b1561553b5750505161550e816148c2565b600e81527f4c6f636b75702044796e616d6963000000000000000000000000000000000000602082015290565b61557b9083519384937f814a8a2e000000000000000000000000000000000000000000000000000000008552600485015260248401526044830190614848565b0390fd5b61559a913d8091833e61559281836148de565b810190615367565b386153f6565b83513d6000823e3d90fd5b3d156155d6573d906155bc82614945565b916155ca60405193846148de565b82523d6000602084013e565b606090565b60405160208101907f313ce56700000000000000000000000000000000000000000000000000000000825260048152615613816148c2565b6000928392839251915afa6156266155ab565b908061565d575b156156595760208180518101031261565557602001519060ff82168203615652575090565b80fd5b5080fd5b5090565b50602081511461562d565b6000809160405160208101906395d89b4160e01b82526004815261568b816148c2565b51915afa6156976155ab565b90158015615737575b6156fd57806020806156b793518301019101615367565b601e815111600014614f0457506040516156d0816148c2565b600b81527f4c6f6e672053796d626f6c000000000000000000000000000000000000000000602082015290565b5060405161570a816148c2565b600581527f4552433230000000000000000000000000000000000000000000000000000000602082015290565b506040815111156156a0565b806157555750604051614b008161488a565b600a8110156157ba5761576790614b07565b614f04602260405180937f2e3000000000000000000000000000000000000000000000000000000000000060208301526157aa8151809260208686019101614825565b81010360028101845201826148de565b6157c390614b07565b614f04602160405180937f2e0000000000000000000000000000000000000000000000000000000000000060208301526158068151809260208686019101614825565b81010360018101845201826148de565b60405190615823826148c2565b600782527f536574746c6564000000000000000000000000000000000000000000000000006020830152565b6040519061585c826148c2565b600882527f4465706c657465640000000000000000000000000000000000000000000000006020830152565b600581101561596e57600481036158a25750614f0461584f565b600381036158e457506040516158b7816148c2565b600881527f43616e63656c6564000000000000000000000000000000000000000000000000602082015290565b6001810361592657506040516158f9816148c2565b600981527f53747265616d696e670000000000000000000000000000000000000000000000602082015290565b60020361593557614f04615816565b604051615941816148c2565b600781527f50656e64696e6700000000000000000000000000000000000000000000000000602082015290565b634e487b7160e01b600052602160045260246000fd5b6030614e869193929360405194816159a6879351809260208087019101614825565b820164010714051160dd1b60208201526a029b0b13634b2b9102b19160ad1b60258201526159dd8251809360208785019101614825565b010360108101855201836148de565b6025614e86919392936040519481615a0e879351809260208087019101614825565b820164010714051160dd1b6020820152615a318251809360208785019101614825565b010360058101855201836148de565b60405190615a4d826148c2565b601082527f68736c283233302c3231252c31312529000000000000000000000000000000006020830152565b8015615cab57615a87615a40565b90612710908103908111614add57614f0491615aa561013692614b07565b6040519485927f3c672066696c6c3d226e6f6e65223e000000000000000000000000000000000060208501527f3c636972636c652063783d22313636222063793d2235302220723d2232322220602f8501527f7374726f6b653d22000000000000000000000000000000000000000000000000604f850152615b31815180926020605788019101614825565b83017f22207374726f6b652d77696474683d223130222f3e000000000000000000000060578201527f3c636972636c652063783d22313636222063793d2235302220706174684c656e606c8201527f6774683d2231303030302220723d22323222207374726f6b653d220000000000608c820152615bb982518093602060a785019101614825565b017f22207374726f6b652d6461736861727261793d22313030303022207374726f6b60a78201527f652d646173686f66667365743d2200000000000000000000000000000000000060c7820152615c1a82518093602060d585019101614825565b017f22207374726f6b652d6c696e656361703d22726f756e6422207374726f6b652d60d58201527f77696474683d223522207472616e73666f726d3d22726f74617465282d39302960f58201527f22207472616e73666f726d2d6f726967696e3d22313636203530222f3e000000610115820152631e17b39f60e11b610132820152036101168101845201826148de565b5050604051614b008161488a565b60009080518015615d2e579060009182915b818310615cdd57505050600d02900390565b909193603b60f81b7fff00000000000000000000000000000000000000000000000000000000000000615d108785614d9b565b511614615d26575b600d01936001019190615ccb565b849350615d18565b505050600090565b60009080518015615d2e579060009182915b818310615d5a5750505060041b900390565b909193603b60f81b7fff00000000000000000000000000000000000000000000000000000000000000615d8d8785614d9b565b511614615da3575b601001936001019190615d48565b849350615d9556"; + hex"6080806040523461001757615dac90816200001d8239f35b600080fdfe6080604052600436101561001257600080fd5b60003560e01c63e9dc63751461002757600080fd5b346142f85760403660031901126142f8576001600160a01b0360043516600435036142f857610056608061486e565b60006080819052606060a081905260c082905260e0819052610120819052610140819052610160819052610180919091526101a0526004356001600160a01b03166101008190526100a690614c58565b61012052610100516040517feac8f5b80000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa908115614305576000916147dd575b506001600160a01b03610117911680608052615669565b60a052610100516040517fa80fc0710000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa8015614305576fffffffffffffffffffffffffffffffff916000916147be575b501660c052610100516040517fad35efd40000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa801561430557600090614781575b6101e59150615889565b61014052610100516040517f4869e12d0000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa90811561430557600091614752575b5060c0516fffffffffffffffffffffffffffffffff16801561473c576fffffffffffffffffffffffffffffffff612710819302160416610100608001526102876004356153c7565b610120608001526040514660208201526bffffffffffffffffffffffff1960043560601b16604082015260243560548201526054815280608081011067ffffffffffffffff60808301111761431157608081016040526020815191012061041a602963ffffffff61032e6103078261016861ffff8860101c160616614b08565b91601e604660ff6103248460146050848d60081c16060116614b08565b9816060116614b08565b6040519485927f68736c2800000000000000000000000000000000000000000000000000000000602085015261036e815180926020602488019101614826565b83017f2c0000000000000000000000000000000000000000000000000000000000000060248201526103aa825180936020602585019101614826565b017f252c00000000000000000000000000000000000000000000000000000000000060258201526103e5825180936020602785019101614826565b017f252900000000000000000000000000000000000000000000000000000000000060278201520360098101845201826148df565b6104526fffffffffffffffffffffffffffffffff6040608001511660ff61044b6001600160a01b03608051166155dc565b1690614e89565b6104666001600160a01b0360805116614c58565b60a051610100516040517fbc2be1be0000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa80156143055760249160009161471d575b5060206001600160a01b03608080015116604051938480927f9067b677000000000000000000000000000000000000000000000000000000008252823560048301525afa801561430557610528926000916146ee575b5064ffffffffff80911691166151d5565b61012051610180519092916105b2602161054f6064610548818706615744565b9504614b08565b6040519481610568879351809260208087019101614826565b820161057d8251809360208085019101614826565b017f250000000000000000000000000000000000000000000000000000000000000060208201520360018101855201836148df565b610100608001519260c060800151956101206080015197604051996105d68b61486e565b8a5260208a015260408901526060880152608087015260a086015260c085015260e0840152610100830152610120820152604051806101c081011067ffffffffffffffff6101c083011117614311576101c0810160405260608152600060208201526000604082015260608082015260006080820152606060a0820152600060c0820152600060e08201526060610100820152600061012082015260006101408201526060610160820152600061018082015260006101a082015260a08201516106a660c0840151845190615a7a565b906109b361015c604051926106ba846148c3565b600884527f50726f677265737300000000000000000000000000000000000000000000000060208501526107236040516106f38161488b565b60009052855160208701207fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4701490565b156146e6576090945b61073586614b08565b916040519586938493661e339034b21e9160c91b60208601526109818351958692610767846027840160208901614826565b6d11103334b6361e9111b33333111f60911b602785840101526c1e3932b1ba103bb4b23a341e9160991b603585840101526107ae8551809660206042888701019101614826565b7f22206865696768743d22313030222066696c6c2d6f7061636974793d222e3033828501860160428101919091527f222072783d223135222072793d22313522207374726f6b653d2223666666222060628201527f7374726f6b652d6f7061636974793d222e3122207374726f6b652d77696474686082820152651e911a11179f60d11b60a28201527f3c7465787420783d2232302220793d2233342220666f6e742d66616d696c793d60a88201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f7370616365222060c8820152703337b73a16b9b4bd329e911919383c111f60791b60e88201528651966108b491889160f990910190602001614826565b661e17ba32bc3a1f60c91b8285018601870160f98101919091527f3c7465787420783d2232302220793d2237322220666f6e742d66616d696c793d6101008201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f73706163652220610120820152703337b73a16b9b4bd329e91191b383c111f60791b61014082015287519761094f91899161015190910190602001614826565b661e17ba32bc3a1f60c91b6101518888888887010101010152602061015888888885519c8d9701010101019101614826565b631e17b39f60e11b90860190910190910190910190910161015881019190915281900361013c810190915201826148df565b6101008301526101208201526028610100830151604051906109d48261488b565b60008252610c7a61015c604051926109eb846148c3565b600684527f53746174757300000000000000000000000000000000000000000000000000006020850152610a1e84615cba565b610a2782615d37565b808211156146de5750945b610a3d878701614b08565b91604051958693661e339034b21e9160c91b60208601528151610a67816027880160208601614826565b85016d11103334b6361e9111b33333111f60911b60278201526c1e3932b1ba103bb4b23a341e9160991b6035820152610aaa825180936020604285019101614826565b017f22206865696768743d22313030222066696c6c2d6f7061636974793d222e303360428201527f222072783d223135222072793d22313522207374726f6b653d2223666666222060628201527f7374726f6b652d6f7061636974793d222e3122207374726f6b652d77696474686082820152651e911a11179f60d11b60a28201527f3c7465787420783d2232302220793d2233342220666f6e742d66616d696c793d60a88201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f7370616365222060c8820152703337b73a16b9b4bd329e911919383c111f60791b60e8820152610ba682518093602060f985019101614826565b01661e17ba32bc3a1f60c91b60f98201527f3c7465787420783d2232302220793d2237322220666f6e742d66616d696c793d6101008201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f73706163652220610120820152703337b73a16b9b4bd329e91191b383c111f60791b610140820152610c3582518093602061015185019101614826565b01661e17ba32bc3a1f60c91b610151820152610c5c82518093602061015885019101614826565b01631e17b39f60e11b6101588201520361013c8101845201826148df565b610160840152016101808201526028602083015160405190610c9b8261488b565b60008252610ce561015c60405192610cb2846148c3565b600684527f416d6f756e7400000000000000000000000000000000000000000000000000006020850152610a1e84615cba565b835201602082015261102060808301516030604051610d038161488b565b60008152610faa61015c60405194610d1a866148c3565b600886527f4475726174696f6e0000000000000000000000000000000000000000000000006020870152610d4d86615cba565b610d5682615d37565b808211156146d65750935b610d6d60288601614b08565b91604051978893661e339034b21e9160c91b60208601528151610d97816027880160208601614826565b85016d11103334b6361e9111b33333111f60911b60278201526c1e3932b1ba103bb4b23a341e9160991b6035820152610dda825180936020604285019101614826565b017f22206865696768743d22313030222066696c6c2d6f7061636974793d222e303360428201527f222072783d223135222072793d22313522207374726f6b653d2223666666222060628201527f7374726f6b652d6f7061636974793d222e3122207374726f6b652d77696474686082820152651e911a11179f60d11b60a28201527f3c7465787420783d2232302220793d2233342220666f6e742d66616d696c793d60a88201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f7370616365222060c8820152703337b73a16b9b4bd329e911919383c111f60791b60e8820152610ed682518093602060f985019101614826565b01661e17ba32bc3a1f60c91b60f98201527f3c7465787420783d2232302220793d2237322220666f6e742d66616d696c793d6101008201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f73706163652220610120820152703337b73a16b9b4bd329e91191b383c111f60791b610140820152610f6582518093602061015185019101614826565b01661e17ba32bc3a1f60c91b610151820152610f8c82518093602061015885019101614826565b01631e17b39f60e11b6101588201520361013c8101865201846148df565b8260a08601526028810160c0860152602085015190610120860151809161018088015192839185010101605881016080890152605719906103e8030160011c8061014089015201601081016101a088015201602081016040870152010160e0840152610100830151610160840151845191614e1f565b6060820152604051908161010081011067ffffffffffffffff6101008401111761431157610100820160405260c782527f3c726563742077696474683d223130302522206865696768743d22313030252260208301527f2066696c7465723d2275726c28234e6f69736529222f3e3c7265637420783d2260408301527f37302220793d223730222077696474683d2238363022206865696768743d223860608301527f3630222066696c6c3d2223666666222066696c6c2d6f7061636974793d222e3060808301527f33222072783d223435222072793d22343522207374726f6b653d22236666662260a08301527f207374726f6b652d6f7061636974793d222e3122207374726f6b652d7769647460c08301527f683d2234222f3e0000000000000000000000000000000000000000000000000060e083015282519161010084015191606081015194604051611176816148a7565b603381527f3c636972636c652069643d22476c6f772220723d22353030222066696c6c3d2260208201527f75726c282352616469616c476c6f7729222f3e000000000000000000000000006040820152604051966111d38861486e565b61011c88527f3c66696c7465722069643d224e6f697365223e3c6665466c6f6f6420783d223060208901527f2220793d2230222077696474683d223130302522206865696768743d2231303060408901527f252220666c6f6f642d636f6c6f723d2268736c283233302c3231252c3131252960608901527f2220666c6f6f642d6f7061636974793d22312220726573756c743d22666c6f6f60808901527f6446696c6c222f3e3c666554757262756c656e6365206261736546726571756560a08901527f6e63793d222e3422206e756d4f6374617665733d22332220726573756c743d2260c08901527f4e6f6973652220747970653d226672616374616c4e6f697365222f3e3c66654260e08901527f6c656e6420696e3d224e6f6973652220696e323d22666c6f6f6446696c6c22206101008901527f6d6f64653d22736f66742d6c69676874222f3e3c2f66696c7465723e0000000061012089015260405197886103a081011067ffffffffffffffff6103a08b011117614311576103a0890160405261037b89527f3c706174682069643d224c6f676f222066696c6c3d2223666666222066696c6c60208a01527f2d6f7061636974793d222e312220643d226d3133332e3535392c3132342e303360408a01527f34632d2e3031332c322e3431322d312e3035392c342e3834382d322e3932332c60608a01527f362e3430322d322e3535382c312e3831392d352e3136382c332e3433392d372e60808a01527f3838382c342e3939362d31342e34342c382e3236322d33312e3034372c31322e60a08a01527f3536352d34372e3637342c31322e3536392d382e3835382e3033362d31372e3860c08a01527f33382d312e3237322d32362e3332382d332e3636332d392e3830362d322e373660e08a01527f362d31392e3038372d372e3131332d32372e3536322d31322e3737382d31332e6101008a01527f3834322d382e3032352c392e3436382d32382e3630362c31362e3135332d33356101208a01527f2e323635683063322e3033352d312e3833382c342e3235322d332e3534362c366101408a01527f2e3436332d352e323234683063362e3432392d352e3635352c31362e3231382d6101608a01527f322e3833352c32302e3335382c342e31372c342e3134332c352e3035372c382e6101808a01527f3831362c392e3634392c31332e39322c31332e373334682e30333763352e37336101a08a01527f362c362e3436312c31352e3335372d322e3235332c392e33382d382e34382c306101c08a01527f2c302d332e3531352d332e3531352d332e3531352d332e3531352d31312e34396101e08a01527f2d31312e3437382d35322e3635362d35322e3636342d36342e3833372d36342e6102008a01527f3833376c2e3034392d2e303337632d312e3732352d312e3630362d322e3731396102208a01527f2d332e3834372d322e3735312d362e3230346830632d2e3034362d322e3337356102408a01527f2c312e3036322d342e3538322c322e3732362d362e32323968306c2e3138352d6102608a01527f2e3134386830632e3039392d2e3036322c2e3232322d2e3134382c2e33372d2e6102808a01527f323539683063322e30362d312e3336322c332e3935312d322e3632312c362e306102a08a01527f34342d332e3834324335372e3736332d332e3437332c39372e37362d322e33346102c08a01527f312c3132382e3633372c31382e3333326331362e3637312c392e3934362d32366102e08a01527f2e3334342c35342e3831332d33382e3635312c34302e3139392d362e3239392d6103008a01527f362e3039362d31382e3036332d31372e3734332d31392e3636382d31382e38316103208a01527f312d362e3031362d342e3034372d31332e3036312c342e3737362d372e3735326103408a01527f2c392e3735316c36382e3235342c36382e33373163312e3732342c312e3630316103608a01527f2c322e3731342c332e38342c322e3733382c362e3139325a222f3e00000000006103808a0152604051978860a081011067ffffffffffffffff60a08b01111761431157611cb1611d129160a08b0160405260758b527f3c706174682069643d22466c6f6174696e6754657874222066696c6c3d226e6f60208c01527f6e652220643d224d31323520343568373530733830203020383020383076373560408c01527f307330203830202d3830203830682d373530732d38302030202d3830202d383060608c01527f762d3735307330202d3830203830202d3830222f3e000000000000000000000060808c0152611868615a41565b906040517f3c72616469616c4772616469656e742069643d2252616469616c476c6f77223e6020820152611d0d60d87f3c73746f70206f66667365743d223025222073746f702d636f6c6f723d22000093846040850152805161199a60b88660208501936118da81605e840187614826565b8101997f222073746f702d6f7061636974793d222e36222f3e0000000000000000000000605e8c01527f3c73746f70206f66667365743d2231303025222073746f702d636f6c6f723d229a8b607382015261193f825180936020609385019101614826565b017f222073746f702d6f7061636974793d2230222f3e00000000000000000000000060938201527f3c2f72616469616c4772616469656e743e00000000000000000000000000000060a78201520360988101885201866148df565b6119a2615a41565b90604051967f3c6c696e6561724772616469656e742069643d2253616e64546f70222078313d60208901527f223025222079313d223025223e000000000000000000000000000000000000006040890152604d8801528251611a0881606b8a0184614826565b8701917f222f3e00000000000000000000000000000000000000000000000000000000009283606b82015289606e820152611a4d825180936020608e85019101614826565b019082608e830152611a9160a2897f3c2f6c696e6561724772616469656e743e0000000000000000000000000000009485609182015203608281018b5201896148df565b611bd7610108611a9f615a41565b6040519b8c917f3c6c696e6561724772616469656e742069643d2253616e64426f74746f6d222060208401527f78313d2231303025222079313d2231303025223e00000000000000000000000060408401527f3c73746f70206f66667365743d22313025222073746f702d636f6c6f723d22006054840152611b2b815180926020607387019101614826565b8201908760738301526076820152875190611b4a826096830188614826565b018660968201527f3c616e696d617465206174747269627574654e616d653d22783122206475723d60998201527f2236732220726570656174436f756e743d22696e646566696e6974652220766160b98201527f6c7565733d223330253b3630253b313230253b3630253b3330253b222f3e000060d98201528560f78201520360e881018c52018a6148df565b611bdf615a41565b906040519a8b957f3c6c696e6561724772616469656e742069643d22486f7572676c61737353747260208801527f6f6b6522206772616469656e745472616e73666f726d3d22726f74617465283960408801527f302922206772616469656e74556e6974733d227573657253706163654f6e557360608801527f65223e000000000000000000000000000000000000000000000000000000000060808801527f3c73746f70206f66667365743d22353025222073746f702d636f6c6f723d2200608388015251809260a2880190614826565b84018360a28201527f3c73746f70206f66667365743d22383025222073746f702d636f6c6f723d220060a5820152611cf382518093602060c485019101614826565b019160c483015260c78201520360b88101875201856148df565b614e1f565b92611d32611d1e615817565b896020815191012090602081519101201490565b9788156146ad575b506040518060c081011067ffffffffffffffff60c0830111176143115760c08101604052609081527f3c7061746820643d224d2035302c3336302061203330302c333030203020312c60208201527f31203630302c302061203330302c333030203020312c31202d3630302c30222060408201527f66696c6c3d2223666666222066696c6c2d6f7061636974793d222e303222207360608201527f74726f6b653d2275726c2823486f7572676c6173735374726f6b65292220737460808201527f726f6b652d77696474683d2234222f3e0000000000000000000000000000000060a082015260405193846102c081011067ffffffffffffffff6102c087011117614311576102c0850160405261029885527f3c7061746820643d226d3536362c3136312e323031762d35332e39323463302d60208601527f31392e3338322d32322e3531332d33372e3536332d36332e3339382d35312e3160408601527f39382d34302e3735362d31332e3539322d39342e3934362d32312e3037392d3160608601527f35322e3538372d32312e303739732d3131312e3833382c372e3438372d31353260808601527f2e3630322c32312e303739632d34302e3839332c31332e3633362d36332e343160a08601527f332c33312e3831362d36332e3431332c35312e3139387635332e39323463302c60c08601527f31372e3138312c31372e3730342c33332e3432372c35302e3232332c34362e3360e08601527f3934763238342e383039632d33322e3531392c31322e39362d35302e3232332c6101008601527f32392e3230362d35302e3232332c34362e3339347635332e39323463302c31396101208601527f2e3338322c32322e35322c33372e3536332c36332e3431332c35312e3139382c6101408601527f34302e3736332c31332e3539322c39342e3935342c32312e3037392c3135322e6101608601527f3630322c32312e303739733131312e3833312d372e3438372c3135322e3538376101808601527f2d32312e3037396334302e3838362d31332e3633362c36332e3339382d33312e6101a08601527f3831362c36332e3339382d35312e313938762d35332e39323463302d31372e316101c08601527f39362d31372e3730342d33332e3433352d35302e3232332d34362e34303156326101e08601527f30372e3630336333322e3531392d31322e3936372c35302e3232332d32392e326102008601527f30362c35302e3232332d34362e3430315a6d2d3334372e3436322c35372e37396102208601527f336c3133302e3935392c3133312e3032372d3133302e3935392c3133312e30316102408601527f33563231382e3939345a6d3236322e3932342e303232763236322e3031386c2d6102608601527f3133302e3933372d3133312e3030362c3133302e3933372d3133312e3031335a6102808601527f222066696c6c3d2223313631383232223e3c2f706174683e00000000000000006102a0860152896000146144885760405161218c8161488b565b60008152995b1561432757604051806101e081011067ffffffffffffffff6101e083011117614311576101e081016040526101b181527f3c7061746820643d226d3438312e34362c3438312e35347638312e3031632d3260208201527f2e33352e37372d342e38322c312e35312d372e33392c322e32332d33302e332c60408201527f382e35342d37342e36352c31332e39322d3132342e30362c31332e39322d353360608201527f2e362c302d3130312e32342d362e33332d3133312e34372d31362e3136762d3860808201527f316c34362e332d34362e3331683137302e33336c34362e32392c34362e33315a60a08201527f222066696c6c3d2275726c282353616e64426f74746f6d29222f3e3c7061746860c08201527f20643d226d3433352e31372c3433352e323363302c312e31372d2e34362c322e60e08201527f33322d312e33332c332e34342d372e31312c392e30382d34312e39332c31352e6101008201527f39382d38332e38312c31352e3938732d37362e372d362e392d38332e38322d316101208201527f352e3938632d2e38372d312e31322d312e33332d322e32372d312e33332d332e6101408201527f3434762d2e30346c382e33342d382e33352e30312d2e30316331332e37322d366101608201527f2e35312c34322e39352d31312e30322c37362e382d31312e30327336322e39376101808201527f2c342e34392c37362e37322c31316c382e34322c382e34325a222066696c6c3d6101a08201527f2275726c282353616e64546f7029222f3e0000000000000000000000000000006101c0820152995b60405196876107e081011067ffffffffffffffff6107e08a01111761431157613b9f9c612e5a6036602d9960819f97631e17b39f60e11b8d7f3c2f646566733e000000000000000000000000000000000000000000000000009a612f2b9f6107e0016040526107a782527f3c672066696c6c3d226e6f6e6522207374726f6b653d2275726c2823486f757260208301527f676c6173735374726f6b652922207374726f6b652d6c696e656361703d22726f60408301527f756e6422207374726f6b652d6d697465726c696d69743d22313022207374726f60608301527f6b652d77696474683d2234223e3c7061746820643d226d3536352e3634312c3160808301527f30372e323863302c392e3533372d352e35362c31382e3632392d31352e36373660a08301527f2c32362e393733682d2e303233632d392e3230342c372e3539362d32322e313960c08301527f342c31342e3536322d33382e3139372c32302e3539322d33392e3530342c313460e08301527f2e3933362d39372e3332352c32342e3335352d3136312e3733332c32342e33356101008301527f352d39302e34382c302d3136372e3934382d31382e3538322d3139392e3935336101208301527f2d34342e393438682d2e303233632d31302e3131352d382e3334342d31352e366101408301527f37362d31372e3433372d31352e3637362d32362e3937332c302d33392e3733356101608301527f2c39362e3535342d37312e3932312c3231352e3635322d37312e3932317332316101808301527f352e3632392c33322e3138352c3231352e3632392c37312e3932315a222f3e3c6101a08301527f7061746820643d226d3133342e33362c3136312e32303363302c33392e3733356101c08301527f2c39362e3535342c37312e3932312c3231352e3635322c37312e3932317332316101e08301527f352e3632392d33322e3138362c3231352e3632392d37312e393231222f3e3c6c6102008301527f696e652078313d223133342e3336222079313d223136312e323033222078323d6102208301527f223133342e3336222079323d223130372e3238222f3e3c6c696e652078313d226102408301527f3536352e3634222079313d223136312e323033222078323d223536352e3634226102608301527f2079323d223130372e3238222f3e3c6c696e652078313d223138342e353834226102808301527f2079313d223230362e383233222078323d223138342e353835222079323d22356102a08301527f33372e353739222f3e3c6c696e652078313d223231382e313831222079313d226102c08301527f3231382e313138222078323d223231382e313831222079323d223536322e35336102e08301527f37222f3e3c6c696e652078313d223438312e383138222079313d223231382e316103008301527f3432222078323d223438312e383139222079323d223536322e343238222f3e3c6103208301527f6c696e652078313d223531352e343135222079313d223230372e3335322220786103408301527f323d223531352e343136222079323d223533372e353739222f3e3c70617468206103608301527f643d226d3138342e35382c3533372e353863302c352e34352c342e32372c31306103808301527f2e36352c31322e30332c31352e3432682e303263352e35312c332e33392c31326103a08301527f2e37392c362e35352c32312e35352c392e34322c33302e32312c392e392c37386103c08301527f2e30322c31362e32382c3133312e38332c31362e32382c34392e34312c302c396103e08301527f332e37362d352e33382c3132342e30362d31332e39322c322e372d2e37362c356104008301527f2e32392d312e35342c372e37352d322e33352c382e37372d322e38372c31362e6104208301527f30352d362e30342c32312e35362d392e3433683063372e37362d342e37372c316104408301527f322e30342d392e39372c31322e30342d31352e3432222f3e3c7061746820643d6104608301527f226d3138342e3538322c3439322e363536632d33312e3335342c31322e3438356104808301527f2d35302e3232332c32382e35382d35302e3232332c34362e3134322c302c392e6104a08301527f3533362c352e3536342c31382e3632372c31352e3637372c32362e393639682e6104c08301527f30323263382e3530332c372e3030352c32302e3231332c31332e3436332c33346104e08301527f2e3532342c31392e3135392c392e3939392c332e3939312c32312e3236392c376105008301527f2e3630392c33332e3539372c31302e3738382c33362e34352c392e3430372c386105208301527f322e3138312c31352e3030322c3133312e3833352c31352e3030327339352e336105408301527f36332d352e3539352c3133312e3830372d31352e3030326331302e3834372d326105608301527f2e37392c32302e3836372d352e3932362c32392e3932342d392e3334392c312e6105808301527f3234342d2e3436372c322e3437332d2e3934322c332e3637332d312e3432342c6105a08301527f31342e3332362d352e3639362c32362e3033352d31322e3136312c33342e35326105c08301527f342d31392e313733682e3032326331302e3131342d382e3334322c31352e36376105e08301527f372d31372e3433332c31352e3637372d32362e3936392c302d31372e3536322d6106008301527f31382e3836392d33332e3636352d35302e3232332d34362e3135222f3e3c70616106208301527f746820643d226d3133342e33362c3539322e373263302c33392e3733352c39366106408301527f2e3535342c37312e3932312c3231352e3635322c37312e393231733231352e366106608301527f32392d33322e3138362c3231352e3632392d37312e393231222f3e3c6c696e656106808301527f2078313d223133342e3336222079313d223539322e3732222078323d223133346106a08301527f2e3336222079323d223533382e373937222f3e3c6c696e652078313d223536356106c08301527f2e3634222079313d223539322e3732222078323d223536352e3634222079323d6106e08301527f223533382e373937222f3e3c706f6c796c696e6520706f696e74733d223438316107008301527f2e383232203438312e393031203438312e373938203438312e383737203438316107208301527f2e373735203438312e383534203335302e303135203335302e303236203231386107408301527f2e313835203231382e313239222f3e3c706f6c796c696e6520706f696e74733d6107608301527f223231382e313835203438312e393031203231382e323331203438312e3835346107808301527f203335302e303135203335302e303236203438312e383232203231382e3135326107a08301527f222f3e3c2f673e000000000000000000000000000000000000000000000000006107c0830152604051998a957f3c672069643d22486f7572676c617373223e00000000000000000000000000006020880152603295612df68151809260208a8c019101614826565b8701612e0b8251809360208a85019101614826565b01612e1f8251809360208985019101614826565b01612e338251809360208885019101614826565b01612e478251809360208785019101614826565b01918201520360168101865201846148df565b6040519e8f9788977f3c646566733e000000000000000000000000000000000000000000000000000060208a0152612e9f6026998260208c9451948593019101614826565b8901612eb48251809360208c85019101614826565b01612ec88251809360208b85019101614826565b01612edc8251809360208a85019101614826565b01612ef08251809360208985019101614826565b01612f048251809360208885019101614826565b01612f188251809360208785019101614826565b019182015203600d8101895201876148df565b6137be604c60e08301516101208401519361351a61314d6060604084015193015196612f578186615985565b9461314861012b604051612f6a816148c3565b600581527f2d3130302500000000000000000000000000000000000000000000000000000060208201526040519889917f3c74657874506174682073746172744f66667365743d220000000000000000006020840152612fd4815180926020603787019101614826565b7f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666683820160378101919091527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e00000000000000000061010982015282519261311891849161012090910190602001614826565b6a1e17ba32bc3a2830ba341f60a91b90830190910161012081019190915281900361010b810190915201876148df565b615985565b9561332c61012b604051613160816148c3565b600281527f30250000000000000000000000000000000000000000000000000000000000006020820152604051998a917f3c74657874506174682073746172744f66667365743d2200000000000000000060208401526131ca815180926020603787019101614826565b82017f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666660378201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e00000000000000000061010982015261330782518093602061012085019101614826565b016a1e17ba32bc3a2830ba341f60a91b6101208201520361010b81018a5201886148df565b61333681846159ed565b9261351561012b604051613349816148c3565b600481527f2d3530250000000000000000000000000000000000000000000000000000000060208201526040519687917f3c74657874506174682073746172744f66667365743d2200000000000000000060208401526133b3815180926020603787019101614826565b82017f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666660378201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e0000000000000000006101098201526134f082518093602061012085019101614826565b016a1e17ba32bc3a2830ba341f60a91b6101208201520361010b8101875201856148df565b6159ed565b906136f961012b60405161352d816148c3565b600381527f353025000000000000000000000000000000000000000000000000000000000060208201526040519485917f3c74657874506174682073746172744f66667365743d220000000000000000006020840152613597815180926020603787019101614826565b82017f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666660378201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e0000000000000000006101098201526136d482518093602061012085019101614826565b016a1e17ba32bc3a2830ba341f60a91b6101208201520361010b8101855201836148df565b6040519586937f3c7465787420746578742d72656e646572696e673d226f7074696d697a65537060208601527f656564223e000000000000000000000000000000000000000000000000000000604086015261375f815180926020604589019101614826565b8401613775825180936020604585019101614826565b0161378a825180936020604585019101614826565b0161379f825180936020604585019101614826565b01661e17ba32bc3a1f60c91b604582015203602c8101845201826148df565b613a9e61019a6101408401516101a0850151906137ff6137f96137f36137ed60e060408b01519a015194614b08565b94614b08565b97614b08565b91614b08565b956040519687937f3c75736520687265663d2223476c6f77222066696c6c2d6f7061636974793d2260208601527f2e39222f3e00000000000000000000000000000000000000000000000000000060408601527f3c75736520687265663d2223476c6f772220783d22313030302220793d22313060458601527f3030222066696c6c2d6f7061636974793d222e39222f3e00000000000000000060658601527f3c75736520687265663d22234c6f676f2220783d223137302220793d22313730607c8601527f22207472616e73666f726d3d227363616c65282e3629222f3e3c757365206872609c8601527f65663d2223486f7572676c6173732220783d223135302220793d22393022207460bc8601527f72616e73666f726d3d22726f746174652831302922207472616e73666f726d2d60dc8601527f6f726967696e3d2235303020353030222f3e000000000000000000000000000060fc8601527f3c75736520687265663d222350726f67726573732220783d220000000000000061010e8601526101279061399a815180926020858a019101614826565b8501937f2220793d22373930222f3e00000000000000000000000000000000000000000080948180948801527f3c75736520687265663d22235374617475732220783d2200000000000000000061013288015261014996613a048251809360208b85019101614826565b01958601527f3c75736520687265663d2223416d6f756e742220783d2200000000000000000061015486015261016b94613a478251809360208985019101614826565b01938401527f3c75736520687265663d22234475726174696f6e2220783d220000000000000061017684015261018f92613a8a8251809360208785019101614826565b01918201520361017a8101855201836148df565b6040519586937f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323060208601527f30302f737667222077696474683d223130303022206865696768743d2231303060408601527f30222076696577426f783d2230203020313030302031303030223e00000000006060860152613b2a815180926020607b89019101614826565b8401613b40825180936020607b85019101614826565b01613b55825180936020607b85019101614826565b01613b6a825180936020607b85019101614826565b017f3c2f7376673e0000000000000000000000000000000000000000000000000000607b8201520360618101845201826148df565b6101605260a051610100516040517fb971302a0000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa908115614305576000916142ba575b6142b661424f614154614245609487613d3b6089613c198a614c58565b9260c0608001516040519485927f5b7b2274726169745f74797065223a224173736574222c2276616c7565223a226020850152613c60815180926020604088019101614826565b8301907f227d2c7b2274726169745f74797065223a2253656e646572222c2276616c756560408301527f223a22000000000000000000000000000000000000000000000000000000000091826060820152613cc5825180936020606385019101614826565b01907f227d2c7b2274726169745f74797065223a22537461747573222c2276616c756560638301526083820152613d06825180936020608685019101614826565b017f227d5d000000000000000000000000000000000000000000000000000000000060868201520360698101845201826148df565b6101a05160a05161403e61017e613d53602435614b08565b9360a060800151613d6e6001600160a01b0360805116614c58565b90604051968793613f2b60208601987f54686973204e465420726570726573656e74732061207061796d656e742073748a527f7265616d20696e2061205361626c696572205632200000000000000000000000604088015282516020840190613ddb8160558b0184614826565b8801947f20636f6e74726163742e20546865206f776e6572206f662074686973204e465460558701527f2063616e207769746864726177207468652073747265616d656420617373657460758701527f732c207768696368206172652064656e6f6d696e6174656420696e2000000000609587015282516020840196613e658260b183018a614826565b017f2e5c6e5c6e2d2053747265616d2049443a20000000000000000000000000000060b1820152613ea082518093602060c385019101614826565b01613ed97f5c6e2d2000000000000000000000000000000000000000000000000000000000958660c384015251809360c7840190614826565b01947f20416464726573733a2000000000000000000000000000000000000000000000958660c7820152613f1782518093602060d185019101614826565b019260d184015251809360d5840190614826565b019060d5820152613f4682518093602060df85019101614826565b017f5c6e5c6e0000000000000000000000000000000000000000000000000000000060df8201527fe29aa0efb88f205741524e494e473a205472616e7366657272696e672074686560e38201527f204e4654206d616b657320746865206e6577206f776e657220746865207265636101038201527f697069656e74206f66207468652073747265616d2e205468652066756e6473206101238201527f617265206e6f74206175746f6d61746963616c6c792077697468647261776e206101438201527f666f72207468652070726576696f757320726563697069656e742e00000000006101638201520361015e8101855201836148df565b6101a051906141af614051602435614b08565b916140d0602d604051809560208201976a029b0b13634b2b9102b19160ad1b8952614086815180926020602b87019101614826565b82017f2023000000000000000000000000000000000000000000000000000000000000602b8201526140c18251809360208785019101614826565b0103600d8101865201846148df565b610160516140dd90614994565b94604051998a977f7b2261747472696275746573223a00000000000000000000000000000000000060208a015261411e815180926020602e8d019101614826565b8801917f2c226465736372697074696f6e223a2200000000000000000000000000000000602e840152518093603e840190614826565b01917f222c2265787465726e616c5f75726c223a2268747470733a2f2f7361626c6965603e8401527f722e636f6d222c226e616d65223a220000000000000000000000000000000000605e840152518093606d840190614826565b017f222c22696d616765223a22646174613a696d6167652f7376672b786d6c3b6261606d8201527f736536342c000000000000000000000000000000000000000000000000000000608d820152614210825180936020609285019101614826565b017f227d00000000000000000000000000000000000000000000000000000000000060928201520360748101845201826148df565b60e0819052614994565b6142a2603d60405180937f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000060208301526142928151809260208686019101614826565b810103601d8101845201826148df565b604051918291602083526020830190614849565b0390f35b90506020813d6020116142fd575b816142d5602093836148df565b810103126142f85751906001600160a01b03821682036142f85790614154613bfc565b600080fd5b3d91506142c8565b6040513d6000823e3d90fd5b634e487b7160e01b600052604160045260246000fd5b6040518061012081011067ffffffffffffffff6101208301111761431157610120810160405260f881527f3c7061746820643d226d3438312e34362c3530342e3130317635382e3434396360208201527f2d322e33352e37372d342e38322c312e35312d372e33392c322e32332d33302e60408201527f332c382e35342d37342e36352c31332e39322d3132342e30362c31332e39322d60608201527f35332e362c302d3130312e32342d362e33332d3133312e34372d31362e31367660808201527f2d35382e343339683236322e39325a222066696c6c3d2275726c282353616e6460a08201527f426f74746f6d29222f3e3c656c6c697073652063783d22333530222063793d2260c08201527f3530342e313031222072783d223133312e343632222072793d2232382e31303860e08201527f222066696c6c3d2275726c282353616e64546f7029222f3e0000000000000000610100820152996123df565b604051806101c081011067ffffffffffffffff6101c083011117614311576101c0810160405261019981527f3c706f6c79676f6e20706f696e74733d22333530203335302e3032362034313560208201527f2e3033203238342e39373820323835203238342e39373820333530203335302e60408201527f303236222066696c6c3d2275726c282353616e64426f74746f6d29222f3e3c7060608201527f61746820643d226d3431362e3334312c3238312e39373563302c2e3931342d2e60808201527f3335342c312e3830392d312e3033352c322e36382d352e3534322c372e30373660a08201527f2d33322e3636312c31322e34352d36352e32382c31322e34352d33322e36323460c08201527f2c302d35392e3733382d352e3337342d36352e32382d31322e34352d2e36383160e08201527f2d2e3837322d312e3033352d312e3736372d312e3033352d322e36382c302d2e6101008201527f3931342e3335342d312e3830382c312e3033352d322e3637362c352e3534322d6101208201527f372e3037362c33322e3635362d31322e34352c36352e32382d31322e34352c336101408201527f322e3631392c302c35392e3733382c352e3337342c36352e32382c31322e34356101608201527f2e3638312e3836372c312e3033352c312e3736322c312e3033352c322e3637366101808201527f5a222066696c6c3d2275726c282353616e64546f7029222f3e000000000000006101a082015299612192565b6146cf9198506146bb615850565b906020815191012090602081519101201490565b9638611d3a565b905093610d61565b905094610a32565b60d09461072c565b614710915060203d602011614716575b61470881836148df565b810190614929565b38610517565b503d6146fe565b614736915060203d6020116147165761470881836148df565b386104c1565b634e487b7160e01b600052601260045260246000fd5b614774915060203d60201161477a575b61476c81836148df565b810190614901565b3861023f565b503d614762565b506020813d6020116147b6575b8161479b602093836148df565b810103126142f8575160058110156142f8576101e5906101db565b3d915061478e565b6147d7915060203d60201161477a5761476c81836148df565b38610181565b90506020813d60201161481e575b816147f8602093836148df565b810103126142f857516001600160a01b03811681036142f8576001600160a01b03610100565b3d91506147eb565b60005b8381106148395750506000910152565b8181015183820152602001614829565b9060209161486281518092818552858086019101614826565b601f01601f1916010190565b610140810190811067ffffffffffffffff82111761431157604052565b6020810190811067ffffffffffffffff82111761431157604052565b6060810190811067ffffffffffffffff82111761431157604052565b6040810190811067ffffffffffffffff82111761431157604052565b90601f8019910116810190811067ffffffffffffffff82111761431157604052565b908160209103126142f857516fffffffffffffffffffffffffffffffff811681036142f85790565b908160209103126142f8575164ffffffffff811681036142f85790565b67ffffffffffffffff811161431157601f01601f191660200190565b9061496c82614946565b61497960405191826148df565b828152809261498a601f1991614946565b0190602036910137565b805115614af4576040516149a7816148a7565b604081527f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208201527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f60408201528151600292838201809211614ade5760038092047f3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81168103614ade57614a41908594951b614962565b936020850193829183518401925b838110614a8d5750505050510680600114614a7a57600214614a6f575090565b603d90600019015390565b50603d9081600019820153600119015390565b85600491979293949701918251600190603f9082828260121c16880101518453828282600c1c16880101518385015382828260061c1688010151888501531685010151878201530195929190614a4f565b634e487b7160e01b600052601160045260246000fd5b50604051614b018161488b565b6000815290565b806000917a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000080821015614c4a575b506d04ee2d6d415b85acef810000000080831015614c3b575b50662386f26fc1000080831015614c2c575b506305f5e10080831015614c1d575b5061271080831015614c0e575b506064821015614bfe575b600a80921015614bf4575b600190816021614b9f828701614962565b95860101905b614bb1575b5050505090565b600019019083907f30313233343536373839616263646566000000000000000000000000000000008282061a835304918215614bef57919082614ba5565b614baa565b9160010191614b8e565b9190606460029104910191614b83565b60049193920491019138614b78565b60089193920491019138614b6b565b60109193920491019138614b5c565b60209193920491019138614b4a565b604093508104915038614b31565b6001600160a01b031660405190614c6e826148a7565b602a8252602082016040368237825115614d8657603090538151600190811015614d8657607860218401536029905b808211614d0b575050614cad5790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602060248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b9091600f81166010811015614d71577f3031323334353637383961626364656600000000000000000000000000000000901a614d478486614d9c565b5360041c918015614d5c576000190190614c9d565b60246000634e487b7160e01b81526011600452fd5b60246000634e487b7160e01b81526032600452fd5b634e487b7160e01b600052603260045260246000fd5b908151811015614d86570160200190565b60405190614dba826148c3565b600482527f2667743b000000000000000000000000000000000000000000000000000000006020830152565b60405190614df3826148c3565b600482527f266c743b000000000000000000000000000000000000000000000000000000006020830152565b90614e87929493604051958692602094614e4181518092888089019101614826565b8401614e5582518093888085019101614826565b01614e6882518093878085019101614826565b01614e7b82518093868085019101614826565b010380855201836148df565b565b801561519a5760009180615175575090505b6001908082811015614f0857505050614eb2614de6565b614f05602260405183614ecf829551809260208086019101614826565b81017f203100000000000000000000000000000000000000000000000000000000000060208201520360028101845201826148df565b90565b66038d7ea4c6800011156151185760409081519060a0820182811067ffffffffffffffff82111761431157808452614f3f8161488b565b600081528252825190614f51826148c3565b8482526020917f4b0000000000000000000000000000000000000000000000000000000000000083820152828401528351614f8b816148c3565b8581527f4d0000000000000000000000000000000000000000000000000000000000000083820152848401528351614fc2816148c3565b8581527f42000000000000000000000000000000000000000000000000000000000000008382015260608401528351614ffa816148c3565b8581527f54000000000000000000000000000000000000000000000000000000000000008382015260808401526000918583965b6150ec575b50845194615040866148c3565b6007908187527f2623383830353b0000000000000000000000000000000000000000000000000083880152519560005b8281106150d957505050506150ba6150c0917f20000000000000000000000000000000000000000000000000000000000000006027870152600886526150b5866148c3565b614b08565b91615744565b916005851015614d8657614f059460051b015192614e1f565b8181018401518882018501528301615070565b9591926103e89081851061510f57508680916064600a870406950493019661502e565b93929650615033565b5050615122614dad565b614f0560286040518361513f829551809260208086019101614826565b81017f203939392e39395400000000000000000000000000000000000000000000000060208201520360088101845201826148df565b600a0a918215615186575004614e9b565b80634e487b7160e01b602492526012600452fd5b50506040516151a8816148c3565b600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b620151809103048061523d57506151ea614de6565b614f05602660405183615207829551809260208086019101614826565b81017f203120446179000000000000000000000000000000000000000000000000000060208201520360068101845201826148df565b61270f811161530c57600181036152c957614f056020615291604051615262816148c3565b600481527f20446179000000000000000000000000000000000000000000000000000000008382015293614b08565b60405193816152a98693518092868087019101614826565b82016152bd82518093868085019101614826565b010380845201826148df565b614f0560206152916040516152dd816148c3565b600581527f20446179730000000000000000000000000000000000000000000000000000008382015293614b08565b50615315614dad565b614f05602a60405183615332829551809260208086019101614826565b81017f2039393939204461797300000000000000000000000000000000000000000000602082015203600a8101845201826148df565b6020818303126142f85780519067ffffffffffffffff82116142f8570181601f820112156142f857805161539b81614946565b926153a960405194856148df565b818452602082840101116142f857614f059160208085019101614826565b6001600160a01b031660409081516395d89b4160e01b8152600081600481855afa9081156155a157600091615580575b5061545c8351615406816148c3565b601181527f5341422d56322d4c4f434b55502d4c494e0000000000000000000000000000006020918201528251908301207fc66b376a19264d832c1bc254000c18944ca5aa57ed50f4ea637c4da424d4c3bb1490565b1561549a5750505161546d816148c3565b600d81527f4c6f636b7570204c696e65617200000000000000000000000000000000000000602082015290565b6154fe83516154a8816148c3565b601181527f5341422d56322d4c4f434b55502d44594e0000000000000000000000000000006020918201528251908301207f6ab655856fa5352de8c05542b1937ac63c59342da992602767c02734cc5391651490565b1561553c5750505161550f816148c3565b600e81527f4c6f636b75702044796e616d6963000000000000000000000000000000000000602082015290565b61557c9083519384937f814a8a2e000000000000000000000000000000000000000000000000000000008552600485015260248401526044830190614849565b0390fd5b61559b913d8091833e61559381836148df565b810190615368565b386153f7565b83513d6000823e3d90fd5b3d156155d7573d906155bd82614946565b916155cb60405193846148df565b82523d6000602084013e565b606090565b60405160208101907f313ce56700000000000000000000000000000000000000000000000000000000825260048152615614816148c3565b6000928392839251915afa6156276155ac565b908061565e575b1561565a5760208180518101031261565657602001519060ff82168203615653575090565b80fd5b5080fd5b5090565b50602081511461562e565b6000809160405160208101906395d89b4160e01b82526004815261568c816148c3565b51915afa6156986155ac565b90158015615738575b6156fe57806020806156b893518301019101615368565b601e815111600014614f0557506040516156d1816148c3565b600b81527f4c6f6e672053796d626f6c000000000000000000000000000000000000000000602082015290565b5060405161570b816148c3565b600581527f4552433230000000000000000000000000000000000000000000000000000000602082015290565b506040815111156156a1565b806157565750604051614b018161488b565b600a8110156157bb5761576890614b08565b614f05602260405180937f2e3000000000000000000000000000000000000000000000000000000000000060208301526157ab8151809260208686019101614826565b81010360028101845201826148df565b6157c490614b08565b614f05602160405180937f2e0000000000000000000000000000000000000000000000000000000000000060208301526158078151809260208686019101614826565b81010360018101845201826148df565b60405190615824826148c3565b600782527f536574746c6564000000000000000000000000000000000000000000000000006020830152565b6040519061585d826148c3565b600882527f4465706c657465640000000000000000000000000000000000000000000000006020830152565b600581101561596f57600481036158a35750614f05615850565b600381036158e557506040516158b8816148c3565b600881527f43616e63656c6564000000000000000000000000000000000000000000000000602082015290565b6001810361592757506040516158fa816148c3565b600981527f53747265616d696e670000000000000000000000000000000000000000000000602082015290565b60020361593657614f05615817565b604051615942816148c3565b600781527f50656e64696e6700000000000000000000000000000000000000000000000000602082015290565b634e487b7160e01b600052602160045260246000fd5b6030614e879193929360405194816159a7879351809260208087019101614826565b820164010714051160dd1b60208201526a029b0b13634b2b9102b19160ad1b60258201526159de8251809360208785019101614826565b010360108101855201836148df565b6025614e87919392936040519481615a0f879351809260208087019101614826565b820164010714051160dd1b6020820152615a328251809360208785019101614826565b010360058101855201836148df565b60405190615a4e826148c3565b601082527f68736c283233302c3231252c31312529000000000000000000000000000000006020830152565b8015615cac57615a88615a41565b90612710908103908111614ade57614f0591615aa661013692614b08565b6040519485927f3c672066696c6c3d226e6f6e65223e000000000000000000000000000000000060208501527f3c636972636c652063783d22313636222063793d2235302220723d2232322220602f8501527f7374726f6b653d22000000000000000000000000000000000000000000000000604f850152615b32815180926020605788019101614826565b83017f22207374726f6b652d77696474683d223130222f3e000000000000000000000060578201527f3c636972636c652063783d22313636222063793d2235302220706174684c656e606c8201527f6774683d2231303030302220723d22323222207374726f6b653d220000000000608c820152615bba82518093602060a785019101614826565b017f22207374726f6b652d6461736861727261793d22313030303022207374726f6b60a78201527f652d646173686f66667365743d2200000000000000000000000000000000000060c7820152615c1b82518093602060d585019101614826565b017f22207374726f6b652d6c696e656361703d22726f756e6422207374726f6b652d60d58201527f77696474683d223522207472616e73666f726d3d22726f74617465282d39302960f58201527f22207472616e73666f726d2d6f726967696e3d22313636203530222f3e000000610115820152631e17b39f60e11b610132820152036101168101845201826148df565b5050604051614b018161488b565b60009080518015615d2f579060009182915b818310615cde57505050600d02900390565b909193603b60f81b7fff00000000000000000000000000000000000000000000000000000000000000615d118785614d9c565b511614615d27575b600d01936001019190615ccc565b849350615d19565b505050600090565b60009080518015615d2f579060009182915b818310615d5b5750505060041b900390565b909193603b60f81b7fff00000000000000000000000000000000000000000000000000000000000000615d8e8785614d9c565b511614615da4575b601001936001019190615d49565b849350615d9656"; /*////////////////////////////////////////////////////////////////////////// DEPLOYERS From 02e772c5ac3a02c17ac072716f725bc9e668b7c8 Mon Sep 17 00:00:00 2001 From: andreivladbrg Date: Mon, 25 Sep 2023 17:05:38 +0300 Subject: [PATCH 17/47] refactor: dry-fy withdraw function refactor: dry-fy renounce function --- src/SablierV2LockupDynamic.sol | 34 ------------------------- src/SablierV2LockupLinear.sol | 34 ------------------------- src/abstracts/SablierV2Lockup.sol | 41 ++++++++++++++++++++++++++++--- test/utils/Precompiles.sol | 4 +-- 4 files changed, 40 insertions(+), 73 deletions(-) diff --git a/src/SablierV2LockupDynamic.sol b/src/SablierV2LockupDynamic.sol index 28fd0e835..00374611d 100644 --- a/src/SablierV2LockupDynamic.sol +++ b/src/SablierV2LockupDynamic.sol @@ -630,26 +630,10 @@ contract SablierV2LockupDynamic is // Effects: renounce the stream by making it not cancelable. _streams[streamId].isCancelable = false; - - // Interactions: if the recipient is a contract, try to invoke the renounce hook on the recipient without - // reverting if the hook is not implemented, and also without bubbling up any potential revert. - address recipient = _ownerOf(streamId); - if (recipient.code.length > 0) { - try ISablierV2LockupRecipient(recipient).onStreamRenounced(streamId) { } catch { } - } - - // Log the renouncement. - emit ISablierV2Lockup.RenounceLockupStream(streamId); } /// @dev See the documentation for the user-facing functions that call this internal function. function _withdraw(uint256 streamId, address to, uint128 amount) internal override { - // Checks: the withdraw amount is not greater than the withdrawable amount. - uint128 withdrawableAmount = _withdrawableAmountOf(streamId); - if (amount > withdrawableAmount) { - revert Errors.SablierV2Lockup_Overdraw(streamId, amount, withdrawableAmount); - } - // Effects: update the withdrawn amount. _streams[streamId].amounts.withdrawn = _streams[streamId].amounts.withdrawn + amount; @@ -668,23 +652,5 @@ contract SablierV2LockupDynamic is // Interactions: perform the ERC-20 transfer. _streams[streamId].asset.safeTransfer({ to: to, value: amount }); - - // Retrieve the recipient from storage. - address recipient = _ownerOf(streamId); - - // Interactions: if `msg.sender` is not the recipient and the recipient is a contract, try to invoke the - // withdraw hook on it without reverting if the hook is not implemented, and also without bubbling up - // any potential revert. - if (msg.sender != recipient && recipient.code.length > 0) { - try ISablierV2LockupRecipient(recipient).onStreamWithdrawn({ - streamId: streamId, - caller: msg.sender, - to: to, - amount: amount - }) { } catch { } - } - - // Log the withdrawal. - emit ISablierV2Lockup.WithdrawFromLockupStream(streamId, to, amount); } } diff --git a/src/SablierV2LockupLinear.sol b/src/SablierV2LockupLinear.sol index db75cf7cb..09d9b4fd1 100644 --- a/src/SablierV2LockupLinear.sol +++ b/src/SablierV2LockupLinear.sol @@ -536,26 +536,10 @@ contract SablierV2LockupLinear is // Effects: renounce the stream by making it not cancelable. _streams[streamId].isCancelable = false; - - // Interactions: if the recipient is a contract, try to invoke the renounce hook on the recipient without - // reverting if the hook is not implemented, and also without bubbling up any potential revert. - address recipient = _ownerOf(streamId); - if (recipient.code.length > 0) { - try ISablierV2LockupRecipient(recipient).onStreamRenounced(streamId) { } catch { } - } - - // Log the renouncement. - emit ISablierV2Lockup.RenounceLockupStream(streamId); } /// @dev See the documentation for the user-facing functions that call this internal function. function _withdraw(uint256 streamId, address to, uint128 amount) internal override { - // Checks: the withdraw amount is not greater than the withdrawable amount. - uint128 withdrawableAmount = _withdrawableAmountOf(streamId); - if (amount > withdrawableAmount) { - revert Errors.SablierV2Lockup_Overdraw(streamId, amount, withdrawableAmount); - } - // Effects: update the withdrawn amount. _streams[streamId].amounts.withdrawn = _streams[streamId].amounts.withdrawn + amount; @@ -574,23 +558,5 @@ contract SablierV2LockupLinear is // Interactions: perform the ERC-20 transfer. _streams[streamId].asset.safeTransfer({ to: to, value: amount }); - - // Retrieve the recipient from storage. - address recipient = _ownerOf(streamId); - - // Interactions: if `msg.sender` is not the recipient and the recipient is a contract, try to invoke the - // withdraw hook on it without reverting if the hook is not implemented, and also without bubbling up - // any potential revert. - if (msg.sender != recipient && recipient.code.length > 0) { - try ISablierV2LockupRecipient(recipient).onStreamWithdrawn({ - streamId: streamId, - caller: msg.sender, - to: to, - amount: amount - }) { } catch { } - } - - // Log the withdrawal. - emit ISablierV2Lockup.WithdrawFromLockupStream(streamId, to, amount); } } diff --git a/src/abstracts/SablierV2Lockup.sol b/src/abstracts/SablierV2Lockup.sol index 6c502dedb..b0b81ef6f 100644 --- a/src/abstracts/SablierV2Lockup.sol +++ b/src/abstracts/SablierV2Lockup.sol @@ -8,6 +8,7 @@ import { IERC721Metadata } from "@openzeppelin/contracts/token/ERC721/extensions import { ISablierV2Comptroller } from "../interfaces/ISablierV2Comptroller.sol"; import { ISablierV2Lockup } from "../interfaces/ISablierV2Lockup.sol"; import { ISablierV2NFTDescriptor } from "../interfaces/ISablierV2NFTDescriptor.sol"; +import { ISablierV2LockupRecipient } from "../interfaces/hooks/ISablierV2LockupRecipient.sol"; import { Errors } from "../libraries/Errors.sol"; import { Lockup } from "../types/DataTypes.sol"; import { SablierV2Base } from "./SablierV2Base.sol"; @@ -198,8 +199,18 @@ abstract contract SablierV2Lockup is revert Errors.SablierV2Lockup_Unauthorized(streamId, msg.sender); } - // Effects: renounce the stream. + // Checks and Effects: renounce the stream. _renounce(streamId); + + // Interactions: if the recipient is a contract, try to invoke the renounce hook on the recipient without + // reverting if the hook is not implemented, and also without bubbling up any potential revert. + address recipient = _ownerOf(streamId); + if (recipient.code.length > 0) { + try ISablierV2LockupRecipient(recipient).onStreamRenounced(streamId) { } catch { } + } + + // Log the renouncement. + emit ISablierV2Lockup.RenounceLockupStream(streamId); } /// @inheritdoc ISablierV2Lockup @@ -255,8 +266,32 @@ abstract contract SablierV2Lockup is revert Errors.SablierV2Lockup_WithdrawAmountZero(streamId); } - // Checks, Effects and Interactions: make the withdrawal. + // Checks: the withdraw amount is not greater than the withdrawable amount. + uint128 withdrawableAmount = _withdrawableAmountOf(streamId); + if (amount > withdrawableAmount) { + revert Errors.SablierV2Lockup_Overdraw(streamId, amount, withdrawableAmount); + } + + // Effects and Interactions: make the withdrawal. _withdraw(streamId, to, amount); + + // Retrieve the recipient from storage. + address recipient = _ownerOf(streamId); + + // Interactions: if `msg.sender` is not the recipient and the recipient is a contract, try to invoke the + // withdraw hook on it without reverting if the hook is not implemented, and also without bubbling up + // any potential revert. + if (msg.sender != recipient && recipient.code.length > 0) { + try ISablierV2LockupRecipient(recipient).onStreamWithdrawn({ + streamId: streamId, + caller: msg.sender, + to: to, + amount: amount + }) { } catch { } + } + + // Log the withdrawal. + emit ISablierV2Lockup.WithdrawFromLockupStream(streamId, to, amount); } /// @inheritdoc ISablierV2Lockup @@ -284,7 +319,7 @@ abstract contract SablierV2Lockup is // Skip the withdrawal if the withdrawable amount is zero. uint128 withdrawableAmount = _withdrawableAmountOf(streamId); if (withdrawableAmount > 0) { - _withdraw({ streamId: streamId, to: currentRecipient, amount: withdrawableAmount }); + withdraw({ streamId: streamId, to: currentRecipient, amount: withdrawableAmount }); } // Checks and Effects: transfer the NFT. diff --git a/test/utils/Precompiles.sol b/test/utils/Precompiles.sol index 2bd845cfd..f80ed164f 100644 --- a/test/utils/Precompiles.sol +++ b/test/utils/Precompiles.sol @@ -27,9 +27,9 @@ contract Precompiles { bytes public constant BYTECODE_COMPTROLLER = hex"60803461009857601f6104a638819003918201601f19168301916001600160401b0383118484101761009d5780849260209460405283398101031261009857516001600160a01b0381169081900361009857600080546001600160a01b0319168217815560405191907fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a36103f290816100b48239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe608060408181526004918236101561001657600080fd5b600092833560e01c9182634d81e51d1461039d5750816375829def146102e5578163907a267b14610253578163b5b3ca2c146101ab578163cb01e30e146100f957508063dcf844a7146100c3578063e07df5b4146100a55763f851a4401461007d57600080fd5b346100a157816003193601126100a1576001600160a01b0360209254169051908152f35b5080fd5b50346100a157816003193601126100a1576020906001549051908152f35b50346100a15760203660031901126100a157806020926001600160a01b036100e96103d7565b1681526003845220549051908152f35b9050346101a75760203660031901126101a7576101146103d7565b6001600160a01b03918285541633810361017a575050169081835260026020528083209081549160ff8316159260ff84169060ff1916179055519081527f8cd3a7bc46b26a3b0c07a05a47af78abcaa647626f631d92ea64f8867b23bbec60203392a380f35b84516331b339a960e21b81526001600160a01b039091169181019182523360208301529081906040010390fd5b8280fd5b9050346101a757816003193601126101a7576101c56103d7565b90602435916001600160a01b039182865416338103610226575050907f371789a3d97098f3070492613273a065a7e8a19e009fd1ae92a4b4d4c71ed62d9116928385526003602052808520928084549455815193845260208401523392a380f35b85516331b339a960e21b81526001600160a01b039091169181019182523360208301529081906040010390fd5b919050346101a75760203660031901126101a7578135916001600160a01b038454163381036102b85750507fc059ba3e07a1c4d1fa8845bdb2af2dd85e844684e0a59e6073499e4338788465906001549280600155815193845260208401523392a280f35b82516331b339a960e21b81526001600160a01b039091169181019182523360208301529081906040010390fd5b919050346101a75760203660031901126101a7578135916001600160a01b03918284168094036103995784549283169033820361036d575050507fffffffffffffffffffffffff00000000000000000000000000000000000000001681178255337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808380a380f35b516331b339a960e21b81526001600160a01b039091169181019182523360208301529081906040010390fd5b8480fd5b849084346101a75760203660031901126101a75760ff906020936001600160a01b036103c76103d7565b1681526002855220541615158152f35b600435906001600160a01b03821682036103ed57565b600080fd"; bytes public constant BYTECODE_LOCKUP_DYNAMIC = - hex"60c0346200046e57601f62005efc38819003918201601f19168301916001600160401b038311848410176200032b578084926080946040528339810103126200046e5780516001600160a01b038082169290918390036200046e5760208101518281168091036200046e5760408201519183831683036200046e5760600151936200008962000473565b90601d82527f5361626c696572205632204c6f636b75702044796e616d6963204e46540000006020830152620000be62000473565b601181527029a0a116ab1916a627a1a5aaa816a22ca760791b602082015230608052600080546001600160a01b03199081168417825560018054909116909517909455927fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a38051906001600160401b0382116200032b5760035490600182811c9216801562000463575b60208310146200044d5781601f849311620003d8575b50602090601f83116001146200034d5760009262000341575b50508160011b916000199060031b1c1916176003555b80516001600160401b0381116200032b576004918254600181811c9116801562000320575b60208210146200030b579081601f849311620002b3575b50602090601f831160011462000248576000926200023c575b50508160011b916000199060031b1c19161790555b1660018060a01b0319600a541617600a5560a0526001600955604051615a68908162000494823960805181615474015260a0518181816110f701526149b70152f35b015190503880620001e5565b6000858152602081209350601f198516905b8181106200029a575090846001959493921062000280575b505050811b019055620001fa565b015160001960f88460031b161c1916905538808062000272565b929360206001819287860151815501950193016200025a565b909150836000526020600020601f840160051c8101916020851062000300575b90601f859493920160051c01905b818110620002f05750620001cc565b60008155849350600101620002e1565b9091508190620002d3565b602284634e487b7160e01b6000525260246000fd5b90607f1690620001b5565b634e487b7160e01b600052604160045260246000fd5b0151905038806200017a565b600360009081527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b9350601f198516905b818110620003bf5750908460019594939210620003a5575b505050811b0160035562000190565b015160001960f88460031b161c1916905538808062000396565b929360206001819287860151815501950193016200037e565b60036000529091507fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f840160051c8101916020851062000442575b90601f859493920160051c01905b81811062000432575062000161565b6000815584935060010162000423565b909150819062000415565b634e487b7160e01b600052602260045260246000fd5b91607f16916200014b565b600080fd5b60408051919082016001600160401b038111838210176200032b5760405256fe608080604052600436101561001357600080fd5b60003560e01c90816301ffc9a714612aba5750806306fdde03146129f7578063081812fc146129d9578063095ea7b3146128455780631400ecec146127a057806316844456146125255780631c1cdd4c146124bf5780631e99d569146124a157806323b872dd1461247857806339a73c031461243557806340e58ee514612094578063425d30dd1461207657806342842e0e1461202657806342966c6814611ec85780634857501f14611e525780634869e12d14611e165780635fe3b56714611def5780636352211e14611dc05780636d0cee7514611d6857806370a0823114611cbe57806375829def14611c2c5780637cad6cd114611b5a5780637de6b1db146119315780638659c270146114d9578063894e9a0d1461126c5780638bad38dd146111f05780638f69b9931461116d5780639067b6771461111a5780639188ec84146110df57806395d89b4114610fd1578063a22cb46514610f00578063a2ffb89714610e07578063a6202bf214610cfe578063a80fc07114610ca9578063ad35efd414610c46578063b256456914610c28578063b637b86514610bc8578063b88d4fde14610b3d578063b8a3be6614610b06578063b971302a14610ab4578063bc063e1a14610a91578063bc2be1be14610a3e578063c156a11d14610961578063c33cd35e1461084c578063c87b56dd14610719578063cc364f481461067f578063d4dbd20b1461062a578063d511609f146105db578063d975dfed1461058e578063e985e9c514610537578063ea5ead19146104ef578063eac8f5b814610483578063f590c1761461045b578063f851a440146104345763fdd46d601461027c57600080fd5b3461042f57606036600319011261042f57600435610298612be7565b604435906001600160801b03821680830361042f576102b561546a565b6102be846134d5565b610417576102e284600052600b6020526001600160a01b0360406000205416331490565b1580610407575b6103e45761030d84600052600b6020526001600160a01b0360406000205416331490565b806103c0575b610393576001600160a01b0382161561036957156103515791610348602092600080516020615a488339815191529483615685565b604051908152a1005b6024836040519063d2aabcd960e01b82526004820152fd5b60046040517fc61a0e9e000000000000000000000000000000000000000000000000000000008152fd5b6064846001600160a01b038460405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b508360005260056020526001600160a01b0380604060002054169083161415610313565b60405163216caf0d60e01b815260048101859052336024820152604490fd5b0390fd5b506104118461589f565b156102e9565b60248460405190634a5541ef60e01b82526004820152fd5b600080fd5b3461042f57600036600319011261042f5760206001600160a01b0360005416604051908152f35b3461042f57602036600319011261042f576020610479600435613525565b6040519015158152f35b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d857600052600b60205260206001600160a01b0360016040600020015416604051908152f35b6024906040519062b8e7e760e51b82526004820152fd5b3461042f57604036600319011261042f57600080516020615a48833981519152602060043561034861051f612be7565b6105288361552c565b9061053161546a565b83615564565b3461042f57604036600319011261042f57610550612bd1565b610558612be7565b906001600160a01b03809116600052600860205260406000209116600052602052602060ff604060002054166040519015158152f35b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d8576105ca60209161552c565b6001600160801b0360405191168152f35b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d857600052600b602052602060026040600020015460801c604051908152f35b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d857600052600b60205260206001600160801b0360036040600020015416604051908152f35b3461042f57602036600319011261042f57600435600060206040516106a381612d21565b828152015280600052600b60205260ff60016040600020015460a81c16156104d857600052600b6020526040806000205464ffffffffff8251916106e683612d21565b818160a01c16835260c81c166020820152610717825180926020908164ffffffffff91828151168552015116910152565bf35b3461042f5760208060031936011261042f57600435906107576107528360005260056020526001600160a01b0360406000205416151590565b612dc0565b60006001600160a01b03600a5416926044604051809581937fe9dc637500000000000000000000000000000000000000000000000000000000835230600484015260248301525afa918215610840576000926107c7575b506107c3604051928284938452830190612bac565b0390f35b9091503d806000833e6107da8183612d6e565b810190828183031261042f5780519067ffffffffffffffff821161042f570181601f8201121561042f57805161080f81612d90565b9261081d6040519485612d6e565b81845284828401011161042f5761083991848085019101612b89565b90826107ae565b6040513d6000823e3d90fd5b3461042f5760031960203682011261042f576004359067ffffffffffffffff9081831161042f5761014090833603011261042f5761088861546a565b6040519161089583612d04565b6108a181600401612bfd565b83526108af60248201613556565b60208401526108c060448201612cdb565b60408401526108d160648201612cdb565b60608401526108e260848201612bfd565b60808401526108f360a48201612dac565b60a084015261090460c48201612bfd565b60c08401526109163660e4830161363c565b60e084015261012481013591821161042f57013660238201121561042f5760209161094e610959923690602460048201359101613568565b610100820152614908565b604051908152f35b3461042f57604036600319011261042f5760043561097d612be7565b61098561546a565b81600052600b60205260ff60016040600020015460a81c1615610a27578160005260056020526001600160a01b0360406000205416803303610a08579161034881602093600080516020615a48833981519152956109e28361552c565b6001600160801b0381166109f7575b50613053565b610a02908285615685565b876109f1565b60405163216caf0d60e01b815260048101849052336024820152604490fd5b6024826040519062b8e7e760e51b82526004820152fd5b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d857600052600b602052602064ffffffffff60406000205460a01c16604051908152f35b3461042f57600036600319011261042f57602060405167016345785d8a00008152f35b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d857600052600b60205260206001600160a01b0360406000205416604051908152f35b3461042f57602036600319011261042f57600435600052600b602052602060ff60016040600020015460a81c166040519015158152f35b3461042f57608036600319011261042f57610b56612bd1565b610b5e612be7565b6064359167ffffffffffffffff831161042f573660238401121561042f57826004013591610b8b83612d90565b92610b996040519485612d6e565b808452366024828701011161042f576020816000926024610bc69801838801378501015260443591612ede565b005b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d857600052600b6020526107c3610c1460046040600020016133bd565b604051918291602083526020830190612c77565b3461042f57602036600319011261042f57602061047960043561349e565b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d857610c809061480c565b6040516005821015610c93576020918152f35b634e487b7160e01b600052602160045260246000fd5b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d857600052600b60205260206001600160801b0360026040600020015416604051908152f35b3461042f57602036600319011261042f57610d17612bd1565b6001600160a01b038060005416338103610dde57508116908160005260026020526001600160801b0360406000205416908115610dad5781610d7f9184600052600260205260406000206fffffffffffffffffffffffffffffffff19815416905533906154c6565b6040519081527fca7a4a65a94ed2f37538814e00e1cd4c41a78261561e3f3794592f11409cf5af60203392a3005b602483604051907f8410168c0000000000000000000000000000000000000000000000000000000082526004820152fd5b6040516331b339a960e21b81526001600160a01b03919091166004820152336024820152604490fd5b3461042f57606036600319011261042f5767ffffffffffffffff60043581811161042f57610e39903690600401612c46565b610e41612be7565b9260443590811161042f57610e5a903690600401612c46565b9190610e6461546a565b828203610ec95760005b828110610e7757005b80600080516020615a488339815191526020610e96600194878a615554565b35610ebc610ead610ea8868b8a615554565b613628565b610eb561546a565b8b83615564565b604051908152a101610e6e565b50604491604051917faec9344000000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b3461042f57604036600319011261042f57610f19612bd1565b6024359081151580920361042f576001600160a01b031690813314610f8d57336000526008602052604060002082600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a3005b606460405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152fd5b3461042f57600036600319011261042f57604051600060045490600182811c918184169182156110d5575b60209485851084146110bf57858794868652918260001461109f575050600114611042575b5061102e92500383612d6e565b6107c3604051928284938452830190612bac565b84915060046000527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b906000915b85831061108757505061102e935082010185611021565b80548389018501528794508693909201918101611070565b60ff19168582015261102e95151560051b85010192508791506110219050565b634e487b7160e01b600052602260045260246000fd5b92607f1692610ffc565b3461042f57600036600319011261042f5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d857600052600b602052602064ffffffffff60406000205460c81c16604051908152f35b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d8576111a79061480c565b600581101580610c9357600282149081156111e3575b81156111d1575b6020826040519015158152f35b9050610c9357600460209114826111c4565b50506003811460006111bd565b3461042f57602036600319011261042f576004356001600160a01b039081811680910361042f578160005416338103610dde575060015491816001600160a01b03198416176001556040519216825260208201527fdcb09aef4bf01068924ccce937981cbe59d25ba08380cf941aaaea4e4bd3960d60403392a2005b3461042f57602036600319011261042f57606061014060405161128e81612d3d565b60008152600060208201526000604082015260008382015260006080820152600060a0820152600060c0820152600060e082015260006101008201526112d261344b565b6101208201520152600435600052600b60205260ff60016040600020015460a81c16156114c157600435600052600b60205260406000206113b560046040519261131b84612d3d565b80546001600160a01b038116855264ffffffffff8160a01c16602086015264ffffffffff8160c81c16604086015260ff8160f01c161515606086015260f81c1515608085015260ff60018201546001600160a01b03811660a0870152818160a01c16151560c0870152818160a81c16151560e087015260b01c1615156101008501526113a96002820161346a565b610120850152016133bd565b6101408201526113c660043561480c565b906005821015610c9357600261014092146114b5575b6107c3604051928392602084526001600160a01b03815116602085015264ffffffffff602082015116604085015264ffffffffff60408201511660608501526060810151151560808501526080810151151560a08501526001600160a01b0360a08201511660c085015260c0810151151560e085015260e0810151151561010085015261010081015115156101208501526114a161012082015183860190604090816001600160801b0391828151168552826020820151166020860152015116910152565b01516101a0808401526101c0830190612c77565b600060608201526113dc565b602460405162b8e7e760e51b81526004356004820152fd5b3461042f5760208060031936011261042f5760043567ffffffffffffffff811161042f5761150b903690600401612c46565b9061151461546a565b6000915b80831061152157005b61152c838284615554565b359261153661546a565b61153f846134d5565b1561155c5760248460405190634a5541ef60e01b82526004820152fd5b61156884929394613525565b6119195761158c82600052600b6020526001600160a01b0360406000205416331490565b15806118f9575b6118da576115a08261366b565b82600052600b928387526115ba600260406000200161346a565b936001600160801b03928386511684821610156118c2578260005281895260ff60406000205460f01c16156118aa579061160982858b6115ff819796838c511661350c565b990151169061350c565b93826000528184526040600020966003885498600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8b1617815583881615611890575b0191811691826fffffffffffffffffffffffffffffffff1982541617905561169c6001600160a01b03809916926005875289604060002054169487528360019a8b60406000200154166154c6565b3382036117ad57823b611709575b7f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd2600080516020615a488339815191529685925b604080516001600160801b03928316815292909116602083015290a4604051908152a1019190611518565b9350813b1561042f576040516372eba20360e01b8152600481018490526001600160a01b03821660248201526001600160801b03858116604483015286166064820152600080516020615a48833981519152958b9585927f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd2929190600081608481838b5af161179e575b5092509650506116aa565b6117a790612d5a565b8e611793565b813b6117ec575b7f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd2600080516020615a488339815191529685926116de565b9350803b1561042f576040516372eba20360e01b8152600481018490526001600160a01b03831660248201526001600160801b03858116604483015286166064820152600080516020615a48833981519152958b9585927f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd2929190600081608481838a5af1611881575b5092509650506117b4565b61188a90612d5a565b8e611876565b60018101600160a01b60ff60a01b1982541617905561164e565b602483604051906339c6dc7360e21b82526004820152fd5b602483604051906322cad1af60e11b82526004820152fd5b60405163216caf0d60e01b815260048101839052336024820152604490fd5b5081600052600585526001600160a01b0360406000205416331415611593565b6024826040519063fe19f19f60e01b82526004820152fd5b3461042f5760208060031936011261042f5760043561194e61546a565b80600052600b825260ff60016040600020015460a81c16156104d8576119738161480c565b916000926005811015610c9357600481036119a05760248360405190634a5541ef60e01b82526004820152fd5b600381036119c0576024836040519063fe19f19f60e01b82526004820152fd5b916002849314611b42576119ea81600052600b6020526001600160a01b0360406000205416331490565b15611b225780600052600b825260ff60406000205460f01c1615611b0a5780600052600b8252604060002060ff60f01b198154169055600582526001600160a01b0360406000205416803b611a78575b50807f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f84600080516020615a4883398151915295a2604051908152a1005b803b1561042f57600080516020615a488339815191529360008084936024604051809481937f341a0bd90000000000000000000000000000000000000000000000000000000083528860048401525af1611ad5575b509350611a3a565b9050611ae19150612d5a565b8060007f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f611acd565b602490604051906339c6dc7360e21b82526004820152fd5b60405163216caf0d60e01b81526004810191909152336024820152604490fd5b602490604051906322cad1af60e11b82526004820152fd5b3461042f57602036600319011261042f576004356001600160a01b039081811680910361042f578160005416338103610dde5750600a5491816001600160a01b0319841617600a556040519216825260208201527fa2548bd4b805e907c1558a47b5858324fe8bb4a2e1ddfca647eecbf65610eebc60403392a26009546000198101908111611c165760407f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c91815190600182526020820152a1005b634e487b7160e01b600052601160045260246000fd5b3461042f57602036600319011261042f57611c45612bd1565b6000546001600160a01b0380821692338403611c97576001600160a01b03199350169182911617600055337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf80600080a3005b6040516331b339a960e21b81526001600160a01b0385166004820152336024820152604490fd5b3461042f57602036600319011261042f576001600160a01b03611cdf612bd1565b168015611cfe5760005260066020526020604060002054604051908152f35b608460405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e657200000000000000000000000000000000000000000000006064820152fd5b3461042f57602036600319011261042f57600435611d9f6107528260005260056020526001600160a01b0360406000205416151590565b600052600560205260206001600160a01b0360406000205416604051908152f35b3461042f57602036600319011261042f576020611dde600435612e0b565b6001600160a01b0360405191168152f35b3461042f57600036600319011261042f5760206001600160a01b0360015416604051908152f35b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d8576105ca60209161488d565b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d8576000611e8e8261480c565b6005811015610c9357600203611eac575b6020906040519015158152f35b50600052600b602052602060ff60406000205460f01c16611e9f565b3461042f57602036600319011261042f57600435611ee461546a565b611eed816134d5565b15611ff557611efb8161589f565b15611b2257611f0981612e0b565b611f128261349e565b159081611fec575b81611fd9575b50611fc157602081611f40600080516020615a4883398151915293612e0b565b9080600052600783526001600160a01b036040600020926001600160a01b031993848154169055169182600052600684526040600020600019815401905581600052600584526040600020908154169055806000604051937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a48152a1005b602490604051906378630aa960e01b82526004820152fd5b6001600160a01b03915016151582611f20565b60009150611f1a565b602490604051907f817cd6390000000000000000000000000000000000000000000000000000000082526004820152fd5b3461042f5761203436612c11565b60405191602083019383851067ffffffffffffffff86111761206057610bc69460405260008452612ede565b634e487b7160e01b600052604160045260246000fd5b3461042f57602036600319011261042f5760206104796004356134d5565b3461042f5760208060031936011261042f57600435906120b261546a565b6120bb826134d5565b156120d85760248260405190634a5541ef60e01b82526004820152fd5b6120e182613525565b6119195761210582600052600b6020526001600160a01b0360406000205416331490565b1580612415575b6118da576121198261366b565b9180600052600b8252612132600260406000200161346a565b926001600160801b03908185511682821610156118c25782600052600b845260ff60406000205460f01c16156118aa5780828561217561217f94838a511661350c565b970151169061350c565b9082600052600b84526040600020916003835493600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8616178155838316156123fb575b0191861691826fffffffffffffffffffffffffffffffff198254161790556122136001600160a01b03809416926005875283856040600020541695600b8952600160406000200154166154c6565b33820361231b57823b61227a575b7f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd28491600080516020615a48833981519152975b604080516001600160801b03928316815292909116602083015290a4604051908152a1005b823b1561042f576040516372eba20360e01b8152600481018590526001600160a01b03831660248201526001600160801b03878116604483015282166064820152600080516020615a488339815191529685927f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd292909190600081608481838b5af161230c575b509750915050612221565b61231590612d5a565b89612301565b813b61235a575b7f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd28491600080516020615a4883398151915297612255565b813b1561042f576040516372eba20360e01b8152600481018590526001600160a01b03841660248201526001600160801b03878116604483015282166064820152600080516020615a488339815191529685927f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd292909190600081608481838a5af16123ec575b509750915050612322565b6123f590612d5a565b896123e1565b60018101600160a01b60ff60a01b198254161790556121c5565b5081600052600581526001600160a01b036040600020541633141561210c565b3461042f57602036600319011261042f576001600160a01b03612456612bd1565b16600052600260205260206001600160801b0360406000205416604051908152f35b3461042f57610bc661248936612c11565b9161249c6124978433612f74565b612e6d565b613053565b3461042f57600036600319011261042f576020600954604051908152f35b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d8576124f99061480c565b6005811015610c9357806020911590811561251a575b506040519015158152f35b60019150148261250f565b3461042f576020600319818136011261042f576004359067ffffffffffffffff9081831161042f576101208336039182011261042f5761256361546a565b610104830135906022190181121561042f57820160048101359082821161042f57602401606082023603811361042f5761259e913691613568565b918251906125ab826133a5565b916125b96040519384612d6e565b808352601f196125c8826133a5565b018660005b82811061278a5750505064ffffffffff90814216946001600160801b0396876125f5826136d6565b515116828a612603846136d6565b5101511685806040612614866136d6565b510151168a0116906040519261262984612ce8565b83528b830152604082015261263d876136d6565b52612647866136d6565b5060019386855b8a8c87831061270957908b846001600160a01b038c60a48101358281169081900361042f57610959956126c9956126f99461268b60248601613607565b61269760448701613607565b6126a360648801613614565b916126b088600401613614565b94846126be60848b01613628565b966040519d8e612d04565b168c528d8c0152151560408b0152151560608a01521660808801521660a086015260c085015260c436910161363c565b60e0830152610100820152614908565b88938580604061273d8b8661272d8a8e9a612724828d6136f9565b5151169a6136f9565b51015116946000198901906136f9565b5101511681604061274e888c6136f9565b510151160116916040519361276285612ce8565b84528301526040820152612776828b6136f9565b52612781818a6136f9565b5001879061264e565b61279261344b565b8282880101520187906125cd565b3461042f57602036600319011261042f5760043580600052600b60205260ff60016040600020015460a81c16156104d85760209060009080600052600b8352604060002060ff815460f01c1680612833575b61280a575b50506001600160801b0360405191168152f35b61282c92506001600160801b036002612826920154169161366b565b9061350c565b82806127f7565b5060ff600182015460a01c16156127f2565b3461042f57604036600319011261042f5761285e612bd1565b602435906001600160a01b03808061287585612e0b565b1692169180831461296f5780331490811561294a575b50156128e0578260005260076020526040600020826001600160a01b03198254161790556128b883612e0b565b167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b608460405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152fd5b9050600052600860205260406000203360005260205260ff604060002054168461288b565b608460405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152fd5b3461042f57602036600319011261042f576020611dde600435612e30565b3461042f57600036600319011261042f57604051600060035490600182811c91818416918215612ab0575b60209485851084146110bf57858794868652918260001461109f575050600114612a53575061102e92500383612d6e565b84915060036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b906000915b858310612a9857505061102e935082010185611021565b80548389018501528794508693909201918101612a81565b92607f1692612a22565b3461042f57602036600319011261042f57600435907fffffffff00000000000000000000000000000000000000000000000000000000821680920361042f57817f80ac58cd0000000000000000000000000000000000000000000000000000000060209314908115612b5f575b8115612b35575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501483612b2e565b7f5b5e139f0000000000000000000000000000000000000000000000000000000081149150612b27565b60005b838110612b9c5750506000910152565b8181015183820152602001612b8c565b90602091612bc581518092818552858086019101612b89565b601f01601f1916010190565b600435906001600160a01b038216820361042f57565b602435906001600160a01b038216820361042f57565b35906001600160a01b038216820361042f57565b606090600319011261042f576001600160a01b0390600435828116810361042f5791602435908116810361042f579060443590565b9181601f8401121561042f5782359167ffffffffffffffff831161042f576020808501948460051b01011161042f57565b90815180825260208080930193019160005b828110612c97575050505090565b835180516001600160801b031686528083015167ffffffffffffffff168684015260409081015164ffffffffff169086015260609094019392810192600101612c89565b3590811515820361042f57565b6060810190811067ffffffffffffffff82111761206057604052565b610120810190811067ffffffffffffffff82111761206057604052565b6040810190811067ffffffffffffffff82111761206057604052565b610160810190811067ffffffffffffffff82111761206057604052565b67ffffffffffffffff811161206057604052565b90601f8019910116810190811067ffffffffffffffff82111761206057604052565b67ffffffffffffffff811161206057601f01601f191660200190565b35906001600160801b038216820361042f57565b15612dc757565b606460405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152fd5b60005260056020526001600160a01b0360406000205416612e2d811515612dc0565b90565b612e536107528260005260056020526001600160a01b0360406000205416151590565b60005260076020526001600160a01b036040600020541690565b15612e7457565b608460405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f766564000000000000000000000000000000000000006064820152fd5b90612f02939291612ef26124978433612f74565b612efd838383613053565b61320c565b15612f0957565b60405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b906001600160a01b038080612f8884612e0b565b16931691838314938415612fbb575b508315612fa5575b50505090565b612fb191929350612e30565b1614388080612f9f565b909350600052600860205260406000208260005260205260ff604060002054169238612f97565b15612fe957565b608460405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152fd5b9061307c929161306283612e0b565b916001600160a01b03948593848094169687911614612fe2565b16908115806131735761308e8461349e565b15908161316a575b5080613161575b61314957918084926130cb600080516020615a48833981519152966020966130c485612e0b565b1614612fe2565b60009382855260078652604085206001600160a01b031990818154169055818652600687526040862060001981540190558286526040862060018154019055838652600587528260408720918254161790557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6040519580a48152a1565b602483604051906378630aa960e01b82526004820152fd5b5083151561309d565b90501538613096565b608460405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152fd5b3d15613207573d906131ed82612d90565b916131fb6040519384612d6e565b82523d6000602084013e565b606090565b9290803b1561339c57613276916020916001600160a01b0394604051809581948293897f150b7a02000000000000000000000000000000000000000000000000000000009b8c86523360048701521660248501526044840152608060648401526084830190612bac565b03916000968791165af190829082613335575b505061330f576132976131dc565b8051908161330a5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000161490565b909192506020813d8211613394575b8161335160209383612d6e565b810103126133905751907fffffffff000000000000000000000000000000000000000000000000000000008216820361338d5750903880613289565b80fd5b5080fd5b3d9150613344565b50505050600190565b67ffffffffffffffff81116120605760051b60200190565b9081546133c9816133a5565b926040936133d985519182612d6e565b828152809460208092019260005281600020906000935b8585106133ff57505050505050565b6001848192845161340f81612ce8565b64ffffffffff87546001600160801b038116835267ffffffffffffffff8160801c168584015260c01c16868201528152019301940193916133f0565b6040519061345882612ce8565b60006040838281528260208201520152565b9060405161347781612ce8565b6040819360018154916001600160801b0392838116865260801c6020860152015416910152565b80600052600b60205260ff60016040600020015460a81c16156104d857600052600b60205260ff60016040600020015460b01c1690565b80600052600b60205260ff60016040600020015460a81c16156104d857600052600b60205260ff60016040600020015460a01c1690565b6001600160801b039182169082160391908211611c1657565b80600052600b60205260ff60016040600020015460a81c16156104d857600052600b60205260406000205460f81c90565b359064ffffffffff8216820361042f57565b929192613574826133a5565b60409461358386519283612d6e565b8195848352602080930191606080960285019481861161042f57925b8584106135af5750505050505050565b868483031261042f578251906135c482612ce8565b6135cd85612dac565b8252858501359067ffffffffffffffff8216820361042f57828792838b9501526135f8868801613556565b8682015281520193019261359f565b35801515810361042f5790565b356001600160a01b038116810361042f5790565b356001600160801b038116810361042f5790565b919082604091031261042f5760405161365481612d21565b602080829461366281612bfd565b84520135910152565b64ffffffffff80421682600052600b602052604060002091825482828260a01c1610156136cc5760c81c1611156136ba5760040154600110156136b157612e2d9061370d565b612e2d9061473d565b6001600160801b039150600201541690565b5050505050600090565b8051156136e35760200190565b634e487b7160e01b600052603260045260246000fd5b80518210156136e35760209160051b010190565b64ffffffffff90814216906000908152600b60205260409081812082519361373485612d3d565b8154956001600160a01b039182881687526020870197828160a01c168952828160c81c168789015260ff8160f01c161515606089015260f81c1515608088015260ff6001938486015490811660a08a0152818160a01c16151560c08a0152818160a81c16151560e08a015260b01c1615156101008801526101406137ce60046137bf6002880161346a565b966101208b01978852016133bd565b97019187835280876137e0889a6136d6565b5101511693828288965b16106138c45750916138746138799284888161387e98976001600160801b039e8f6138168b8a516136f9565b5151169d8a8f9b602061383367ffffffffffffffff928d516136f9565b510151169984836138458484516136f9565b51015116965081156138b857613863929350519060001901906136f9565b5101511680925b0316920316613938565b613ca7565b613b0a565b92831361389757505061389183916138fc565b16011690565b5160200151929392831692841683101591506138b39050575090565b905090565b5050505116809261386a565b8094986001600160801b0390816138dc8c88516136f9565b51511601169801938282808a6138f38989516136f9565b510151166137ea565b600081126139075790565b602490604051907f2463f3d50000000000000000000000000000000000000000000000000000000082526004820152fd5b90600160ff1b808314908115613a20575b506139f65760008212156139ed57613972826000035b60008312156139e6578260000390613a2a565b917f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83116139b057600091600019911813156139ac575090565b0390565b604491604051917fd49c26b300000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b8290613a2a565b6139728261395f565b60046040517f9fe2b450000000000000000000000000000000000000000000000000000000008152fd5b9050811438613949565b670de0b6b3a7640000916000198383099280830292838086109503948086039514613ae65782851015613aaa57908291096001821901821680920460028082600302188083028203028083028203028083028203028083028203028083028203028092029003029360018380600003040190848311900302920304170290565b82606492604051927f63a05778000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b505080925015613af4570490565b634e487b7160e01b600052601260045260246000fd5b90600160ff1b808314908115613bee575b50613bc4576000821215613bbb57613b44826000035b6000831215613bb4578260000390613bf8565b917f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311613b7e57600091600019911813156139ac575090565b604491604051917f120b5b4300000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b8290613bf8565b613b4482613b31565b60046040517fa6070c25000000000000000000000000000000000000000000000000000000008152fd5b9050811438613b1b565b90919060001983820983820291828083109203918083039214613c9657670de0b6b3a76400009081831015613c5f57947faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066994950990828211900360ee1b910360121c170290565b60449086604051917f5173648d00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050670de0b6b3a764000090049150565b80613cc15750600090612e2d5750670de0b6b3a764000090565b90670de0b6b3a7640000808314613d0e575080613ce6575050670de0b6b3a764000090565b670de0b6b3a76400008114613d0a57613d0590613879612e2d936145e8565b613d2e565b5090565b91505090565b8015613af4576ec097ce7bc90715b34b9f10000000000590565b6000811215613d635768033dd1780914b97114198112613d5d57613d5490600003613d2e565b612e2d90613d14565b50600090565b680a688906bd8affffff81136145b757670de0b6b3a764000080604092831b05907780000000000000000000000000000000000000000000000067ff00000000000000831661449a575b66ff0000000000008316614392575b65ff00000000008316614292575b64ff00000000831661419a575b63ff00000083166140aa575b62ff00008316613fc2575b61ff008316613ee2575b60ff8316613e0b575b02911c60bf031c90565b60808316613ed0575b838316613ebe575b60208316613eac575b60108316613e9a575b60088316613e88575b60048316613e76575b60028316613e64575b6001831615613e01576801000000000000000102831c613e01565b6801000000000000000102831c613e49565b6801000000000000000302831c613e40565b6801000000000000000602831c613e37565b6801000000000000000b02831c613e2e565b6801000000000000001602831c613e25565b6801000000000000002c02831c613e1c565b6801000000000000005902831c613e14565b6180008316613fb0575b6140008316613f9e575b6120008316613f8c575b6110008316613f7a575b6108008316613f68575b6104008316613f56575b6102008316613f44575b610100831615613df857680100000000000000b102831c613df8565b6801000000000000016302831c613f28565b680100000000000002c602831c613f1e565b6801000000000000058c02831c613f14565b68010000000000000b1702831c613f0a565b6801000000000000162e02831c613f00565b68010000000000002c5d02831c613ef6565b680100000000000058b902831c613eec565b628000008316614098575b624000008316614086575b622000008316614074575b621000008316614062575b620800008316614050575b62040000831661403e575b62020000831661402c575b62010000831615613dee576801000000000000b17202831c613dee565b680100000000000162e402831c61400f565b6801000000000002c5c802831c614004565b68010000000000058b9102831c613ff9565b680100000000000b172102831c613fee565b68010000000000162e4302831c613fe3565b680100000000002c5c8602831c613fd8565b6801000000000058b90c02831c613fcd565b63800000008316614188575b63400000008316614176575b63200000008316614164575b63100000008316614152575b63080000008316614140575b6304000000831661412e575b6302000000831661411c575b6301000000831615613de35768010000000000b1721802831c613de3565b6801000000000162e43002831c6140fe565b68010000000002c5c86002831c6140f2565b680100000000058b90c002831c6140e6565b6801000000000b17217f02831c6140da565b680100000000162e42ff02831c6140ce565b6801000000002c5c85fe02831c6140c2565b68010000000058b90bfc02831c6140b6565b6480000000008316614280575b644000000000831661426e575b642000000000831661425c575b641000000000831661424a575b6408000000008316614238575b6404000000008316614226575b6402000000008316614214575b640100000000831615613dd757680100000000b17217f802831c613dd7565b68010000000162e42ff102831c6141f5565b680100000002c5c85fe302831c6141e8565b6801000000058b90bfce02831c6141db565b68010000000b17217fbb02831c6141ce565b6801000000162e42fff002831c6141c1565b68010000002c5c8601cc02831c6141b4565b680100000058b90c0b4902831c6141a7565b658000000000008316614380575b65400000000000831661436e575b65200000000000831661435c575b65100000000000831661434a575b650800000000008316614338575b650400000000008316614326575b650200000000008316614314575b65010000000000831615613dca576801000000b17218355102831c613dca565b680100000162e430e5a202831c6142f4565b6801000002c5c863b73f02831c6142e6565b68010000058b90cf1e6e02831c6142d8565b680100000b1721bcfc9a02831c6142ca565b68010000162e43f4f83102831c6142bc565b680100002c5c89d5ec6d02831c6142ae565b6801000058b91b5bc9ae02831c6142a0565b66800000000000008316614488575b66400000000000008316614476575b66200000000000008316614464575b66100000000000008316614452575b66080000000000008316614440575b6604000000000000831661442e575b6602000000000000831661441c575b6601000000000000831615613dbc5768010000b17255775c0402831c613dbc565b6801000162e525ee054702831c6143fb565b68010002c5cc37da949202831c6143ec565b680100058ba01fb9f96d02831c6143dd565b6801000b175effdc76ba02831c6143ce565b680100162f3904051fa102831c6143bf565b6801002c605e2e8cec5002831c6143b0565b68010058c86da1c09ea202831c6143a1565b6780000000000000008316614598575b6740000000000000008316614586575b6720000000000000008316614574575b6710000000000000008316614562575b6708000000000000008316614550575b670400000000000000831661453e575b670200000000000000831661452c575b670100000000000000831615613dad57680100b1afa5abcbed6102831c613dad565b68010163da9fb33356d802831c61450a565b680102c9a3e778060ee702831c6144fa565b6801059b0d31585743ae02831c6144ea565b68010b5586cf9890f62a02831c6144da565b6801172b83c7d517adce02831c6144ca565b6801306fe0a31b7152df02831c6144ba565b5077b504f333f9de6484800000000000000000000000000000006144aa565b602490604051907f0360d0280000000000000000000000000000000000000000000000000000000082526004820152fd5b8060008083131561470c57670de0b6b3a7640000928381126146d557506001925b808305906001600160801b03821160071b91821c9167ffffffffffffffff831160061b92831c63ffffffff811160051b90811c61ffff811160041b90811c60ff811160031b90811c91600f831160021b92831c936001978860038711811b96871c11961717171717171781810294811d908282146146c957506706f05b59d3b20000905b84821361469d5750505050500290565b808391020590671bc16d674ec800008212156146bc575b831d9061468d565b8091950194831d906146b4565b93505093925050020290565b60001993925080156146f8576ec097ce7bc90715b34b9f10000000000591614609565b602482634e487b7160e01b81526012600452fd5b602483604051907f059b101b0000000000000000000000000000000000000000000000000000000082526004820152fd5b64ffffffffff614772600091838352600b60205280806040852054818160a01c1693849160c81c160316918142160316613938565b91808252600b602052600460408320018054156147f85790829167ffffffffffffffff93526147ca6020832054828452600b6020526138796001600160801b03968760026040882001541696879360801c1690613ca7565b9283136147e05750506147dc906138fc565b1690565b60029350604092508152600b60205220015460801c90565b602483634e487b7160e01b81526032600452fd5b80600052600b602052604060002060ff600182015460a01c16600014614833575050600490565b805460f81c614886575460a01c64ffffffffff164210613d5d576148568161366b565b90600052600b6020526001600160801b03806002604060002001541691161060001461488157600190565b600290565b5050600390565b80600052600b6020526148a6600260406000200161346a565b81600052600b602052604060002060ff600182015460a01c166000146148d957506001600160801b039150602001511690565b5460f81c6148eb5750612e2d9061366b565b612e2d91506001600160801b03604081835116920151169061350c565b906001600160a01b036001541660206001600160a01b0360c0850151166024604051809481937fdcf844a700000000000000000000000000000000000000000000000000000000835260048301525afa8015610840576000906151d9575b61498991506001600160801b0360a08501511690602060e0860151015191615908565b6001600160801b038151166101008401519064ffffffffff60208601511681156151af5782518015615185577f00000000000000000000000000000000000000000000000000000000000000008111615154575064ffffffffff60406149ee856136d6565b510151168110156150fd5750600091829083815185905b80821061506a575050505064ffffffffff421664ffffffffff821681101561502a5750506001600160801b0382168103614fe85750506009549283600052600b6020526040600020916001600160801b0381511660028401906fffffffffffffffffffffffffffffffff198254161790556001600160a01b0360c083015116600184015490750100000000000000000000000000000000000000000060408501511515928654927fffffffffffffffffff0000ff000000000000000000000000000000000000000076ff000000000000000000000000000000000000000000006060890151151560b01b16921617171760018601556001600160a01b0384511691610100850151926040614b208551956000198701906136f9565b510151927fff000000000000000000000000000000000000000000000000000000000000007eff0000000000000000000000000000000000000000000000000000000000007dffffffffff0000000000000000000000000000000000000000000000000078ffffffffff000000000000000000000000000000000000000060208b015160a01b169660c81b169460f01b16911617171717845560005b818110614f18575050600185016009556001600160a01b0360c08301511660005260026020526001600160801b0380604060002054168160208401511601166001600160a01b0360c0840151166000526040600020906fffffffffffffffffffffffffffffffff198254161790556001600160a01b036080830151168015614ed457614c67614c618760005260056020526001600160a01b0360406000205416151590565b15615387565b614c708661349e565b1580614ecb575b80614ec3575b614eab576020600080516020615a4883398151915291614cb6614c618960005260056020526001600160a01b0360406000205416151590565b806000526006825260406000206001815401905587600052600582526040600020816001600160a01b0319825416179055876040519160007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4878152a1614d466001600160a01b0360c0840151166001600160801b0380845116816020860151160116903090339061520d565b6001600160801b0360408201511680614e7c575b507fef3d668acee46576ad5d407c42ab4d0cde13f3cd70b28f09a0fb9e3bf5bf09cb614e396001600160a01b03845116926001600160a01b03608086015116946001600160a01b0360c08201511696614e71614e5160408401511515928c606086015115156001600160a01b0360e061010089015194549864ffffffffff6040519a614de58c612d21565b818160a01c168c5260c81c1660208b01520151511695604051998a99610160948b523360208c015260408b0190604090816001600160801b0391828151168552826020820151166020860152015116910152565b60a089015260c08801528060e0880152860190612c77565b926101008501906020908164ffffffffff91828151168552015116910152565b6101408301520390a4565b614ea5906001600160a01b0360c0850151166001600160a01b0360e0860151511690339061520d565b38614d5a565b602486604051906378630aa960e01b82526004820152fd5b506000614c7d565b50801515614c77565b606460405162461bcd60e51b815260206004820152602060248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152fd5b614f27816101008601516136f9565b51906004860154916801000000000000000083101561206057600183018060048901558310156136e35760019260048801600052602060002001906001600160801b03815116908254917fffffff00000000000000000000000000000000000000000000000000000000007cffffffffff000000000000000000000000000000000000000000000000604077ffffffffffffffff00000000000000000000000000000000602086015160801b1694015160c01b169316171717905501614bbc565b6040517fd90b7e390000000000000000000000000000000000000000000000000000000081526001600160801b03918216600482015291166024820152604490fd5b6040517f210aec0e00000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b919350919461508e906001600160801b0361508585896136f9565b5151169061566a565b9464ffffffffff8060406150a286856136f9565b510151169416808511156150c0575060018493019192919092614a05565b8385606492604051927f7b0bada8000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b64ffffffffff604061510e856136d6565b5101516040517fb4c9e52c00000000000000000000000000000000000000000000000000000000815264ffffffffff938416600482015291169091166024820152604490fd5b602490604051907f4757689b0000000000000000000000000000000000000000000000000000000082526004820152fd5b60046040517f3952c64e000000000000000000000000000000000000000000000000000000008152fd5b60046040517f6095d3bc000000000000000000000000000000000000000000000000000000008152fd5b6020823d602011615205575b816151f260209383612d6e565b8101031261338d57506149899051614966565b3d91506151e5565b9290604051927f23b872dd0000000000000000000000000000000000000000000000000000000060208501526001600160a01b03809216602485015216604483015260648201526064815260a081019181831067ffffffffffffffff8411176120605761527c9260405261527e565b565b6001600160a01b0316906152de60405161529781612d21565b6020938482527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564858301526000808587829751910182855af16152d86131dc565b916153d2565b805191821591848315615363575b5050509050156152f95750565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b9193818094500103126133905782015190811515820361338d5750803880846152ec565b1561538e57565b606460405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152fd5b9192901561543357508151156153e6575090565b3b156153ef5790565b606460405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b8251909150156154465750805190602001fd5b6104039060405191829162461bcd60e51b8352602060048401526024830190612bac565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361549c57565b60046040517fa1c0d6e5000000000000000000000000000000000000000000000000000000008152fd5b916001600160a01b03604051927fa9059cbb000000000000000000000000000000000000000000000000000000006020850152166024830152604482015260448152608081019181831067ffffffffffffffff8411176120605761527c9260405261527e565b612e2d906155398161488d565b90600052600b60205260026040600020015460801c9061350c565b91908110156136e35760051b0190565b929190615570846134d5565b6104175761559484600052600b6020526001600160a01b0360406000205416331490565b158061565a575b6103e4576155bf84600052600b6020526001600160a01b0360406000205416331490565b80615636575b615609576001600160a01b03811615610369576001600160801b038216156155f15761527c9293615685565b6024846040519063d2aabcd960e01b82526004820152fd5b836001600160a01b0360649260405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b508360005260056020526001600160a01b03806040600020541690821614156155c5565b506156648461589f565b1561559b565b9190916001600160801b0380809416911601918211611c1657565b929190926001600160801b038061569b8361552c565b1692818116938085116158625750600095838752602092600b84526157006156ce6040946002868c20015460801c61566a565b868a52600b86526002858b200190836fffffffffffffffffffffffffffffffff1983549260801b16911617815561346a565b9061571b81868401511692828681835116920151169061350c565b161115615833575b838752600b83526001600160a01b03916157468683856001858d200154166154c6565b848852600584528281892054168033141580615829575b615792575b507ffa54f9f9bdcdd28778cbb9f78490df6691cc4e2729588e10f4cc0a26c465686a9495969750519586521693a3565b803b156158255797807ffa54f9f9bdcdd28778cbb9f78490df6691cc4e2729588e10f4cc0a26c465686a9697989960848451809481937f13375c3b0000000000000000000000000000000000000000000000000000000083528c600484015233602484015289891660448401528d60648401525af1615816575b8897969550615762565b61581f90612d5a565b3861580c565b8880fd5b50803b151561575d565b838752600b835281872060018101600160a01b60ff60a01b1982541617905560ff60f01b198154169055615723565b8360649186604051927fa1fb2bbc000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b60009080825260056020526001600160a01b0380604084205416928333149384156158e4575b505082156158d257505090565b9091506158df3392612e30565b161490565b60ff92945090604091815260086020528181203382526020522054169138806158c5565b90929161591361344b565b936001600160801b0392838116918215615a1f5767016345785d8a00008082116159e8578085116159b1575061595d8561594e819386613bf8565b16946020890195865284613bf8565b16918461597460408901948086528287511661566a565b16101561599b5761598d8491826159969551169061350c565b9151169061350c565b168252565b634e487b7160e01b600052600160045260246000fd5b84604491604051917f4fea5c1a00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b60449250604051917f47152d6700000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b50505050509050604051615a3281612ce8565b6000815260006020820152600060408201529056fef8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7"; + hex"60c0346200046e57601f6200605838819003918201601f19168301916001600160401b038311848410176200032b578084926080946040528339810103126200046e5780516001600160a01b038082169290918390036200046e5760208101518281168091036200046e5760408201519183831683036200046e5760600151936200008962000473565b90601d82527f5361626c696572205632204c6f636b75702044796e616d6963204e46540000006020830152620000be62000473565b601181527029a0a116ab1916a627a1a5aaa816a22ca760791b602082015230608052600080546001600160a01b03199081168417825560018054909116909517909455927fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a38051906001600160401b0382116200032b5760035490600182811c9216801562000463575b60208310146200044d5781601f849311620003d8575b50602090601f83116001146200034d5760009262000341575b50508160011b916000199060031b1c1916176003555b80516001600160401b0381116200032b576004918254600181811c9116801562000320575b60208210146200030b579081601f849311620002b3575b50602090601f831160011462000248576000926200023c575b50508160011b916000199060031b1c19161790555b1660018060a01b0319600a541617600a5560a0526001600955604051615bc490816200049482396080518161562b015260a0518181816112d20152614b800152f35b015190503880620001e5565b6000858152602081209350601f198516905b8181106200029a575090846001959493921062000280575b505050811b019055620001fa565b015160001960f88460031b161c1916905538808062000272565b929360206001819287860151815501950193016200025a565b909150836000526020600020601f840160051c8101916020851062000300575b90601f859493920160051c01905b818110620002f05750620001cc565b60008155849350600101620002e1565b9091508190620002d3565b602284634e487b7160e01b6000525260246000fd5b90607f1690620001b5565b634e487b7160e01b600052604160045260246000fd5b0151905038806200017a565b600360009081527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b9350601f198516905b818110620003bf5750908460019594939210620003a5575b505050811b0160035562000190565b015160001960f88460031b161c1916905538808062000396565b929360206001819287860151815501950193016200037e565b60036000529091507fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f840160051c8101916020851062000442575b90601f859493920160051c01905b81811062000432575062000161565b6000815584935060010162000423565b909150819062000415565b634e487b7160e01b600052602260045260246000fd5b91607f16916200014b565b600080fd5b60408051919082016001600160401b038111838210176200032b5760405256fe608080604052600436101561001357600080fd5b60003560e01c90816301ffc9a714612c835750806306fdde0314612bc0578063081812fc14612ba2578063095ea7b314612a0e5780631400ecec1461296957806316844456146126ee5780631c1cdd4c146126885780631e99d5691461266a57806323b872dd1461264157806339a73c03146125fe57806340e58ee514612266578063425d30dd1461224857806342842e0e146121f857806342966c681461209a5780634857501f146120245780634869e12d14611fe85780635fe3b56714611fc15780636352211e14611f925780636d0cee7514611f3a57806370a0823114611e9057806375829def14611dfe5780637cad6cd114611d2c5780637de6b1db14611b035780638659c270146116b4578063894e9a0d146114475780638bad38dd146113cb5780638f69b993146113485780639067b677146112f55780639188ec84146112ba57806395d89b41146111ac578063a22cb465146110db578063a2ffb89714610fe2578063a6202bf214610ee2578063a80fc07114610e8d578063ad35efd414610e2a578063b256456914610e0c578063b637b86514610dac578063b88d4fde14610d21578063b8a3be6614610cea578063b971302a14610c98578063bc063e1a14610c75578063bc2be1be14610c22578063c156a11d14610b53578063c33cd35e14610a3e578063c87b56dd1461090b578063cc364f4814610871578063d4dbd20b1461081c578063d511609f146107cd578063d975dfed14610780578063e985e9c514610729578063ea5ead19146106d8578063eac8f5b81461066c578063f590c17614610644578063f851a4401461061d5763fdd46d601461027c57600080fd5b346104c15760603660031901126104c157600435610298612db0565b90604435906001600160801b03808316938484036104c1576102b8615621565b6102c18361369e565b610605576102e583600052600b6020526001600160a01b0360406000205416331490565b15806105f5575b6105d25761031083600052600b6020526001600160a01b0360406000205416331490565b806105ae575b610581576001600160a01b0390818116928315610557578615610526578061033d866156e3565b1680881161050257506103d69187918660005261039a61036e602099600b8b5260026040600020015460801c6159e0565b88600052600b8a52600260406000200190836001600160801b031983549260801b169116178155613633565b906103b6818a84015116928260408183511692015116906136d5565b1611156104d0575b85600052600b8752836001604060002001541661567d565b82600052600584526040600020541680331415806104c6575b610438575b50817ffa54f9f9bdcdd28778cbb9f78490df6691cc4e2729588e10f4cc0a26c465686a84600080516020615ba483398151915296604051908152a3604051908152a1005b803b156104c1577ffa54f9f9bdcdd28778cbb9f78490df6691cc4e2729588e10f4cc0a26c465686a84600080516020615ba48339815191529660008087956084604051809481936313375c3b60e01b83528a60048401523360248401528b60448401528760648401525af16104b2575b50965050506103f4565b6104bb90612f23565b386104a8565b600080fd5b50803b15156103ef565b85600052600b8752604060002060018101600160a01b60ff60a01b1982541617905560ff60f01b1981541690556103be565b85606491896040519263287ecaef60e21b8452600484015260248301526044820152fd5b602485604051907fd2aabcd90000000000000000000000000000000000000000000000000000000082526004820152fd5b60046040517fc61a0e9e000000000000000000000000000000000000000000000000000000008152fd5b826001600160a01b0360649260405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b508260005260056020526001600160a01b0380604060002054169082161415610316565b60405163216caf0d60e01b815260048101849052336024820152604490fd5b0390fd5b506105ff836159fb565b156102ec565b60248360405190634a5541ef60e01b82526004820152fd5b346104c15760003660031901126104c15760206001600160a01b0360005416604051908152f35b346104c15760203660031901126104c15760206106626004356136ee565b6040519015158152f35b346104c15760203660031901126104c15760043580600052600b60205260ff60016040600020015460a81c16156106c157600052600b60205260206001600160a01b0360016040600020015416604051908152f35b6024906040519062b8e7e760e51b82526004820152fd5b346104c15760403660031901126104c157600080516020615ba48339815191526020600435610720610708612db0565b610711836156e3565b9061071a615621565b8361571b565b604051908152a1005b346104c15760403660031901126104c157610742612d9a565b61074a612db0565b906001600160a01b03809116600052600860205260406000209116600052602052602060ff604060002054166040519015158152f35b346104c15760203660031901126104c15760043580600052600b60205260ff60016040600020015460a81c16156106c1576107bc6020916156e3565b6001600160801b0360405191168152f35b346104c15760203660031901126104c15760043580600052600b60205260ff60016040600020015460a81c16156106c157600052600b602052602060026040600020015460801c604051908152f35b346104c15760203660031901126104c15760043580600052600b60205260ff60016040600020015460a81c16156106c157600052600b60205260206001600160801b0360036040600020015416604051908152f35b346104c15760203660031901126104c1576004356000602060405161089581612eea565b828152015280600052600b60205260ff60016040600020015460a81c16156106c157600052600b6020526040806000205464ffffffffff8251916108d883612eea565b818160a01c16835260c81c166020820152610909825180926020908164ffffffffff91828151168552015116910152565bf35b346104c1576020806003193601126104c157600435906109496109448360005260056020526001600160a01b0360406000205416151590565b612f89565b60006001600160a01b03600a5416926044604051809581937fe9dc637500000000000000000000000000000000000000000000000000000000835230600484015260248301525afa918215610a32576000926109b9575b506109b5604051928284938452830190612d75565b0390f35b9091503d806000833e6109cc8183612f37565b81019082818303126104c15780519067ffffffffffffffff82116104c1570181601f820112156104c1578051610a0181612f59565b92610a0f6040519485612f37565b8184528482840101116104c157610a2b91848085019101612d52565b90826109a0565b6040513d6000823e3d90fd5b346104c1576003196020368201126104c1576004359067ffffffffffffffff908183116104c1576101409083360301126104c157610a7a615621565b60405191610a8783612ecd565b610a9381600401612dc6565b8352610aa16024820161371f565b6020840152610ab260448201612ea4565b6040840152610ac360648201612ea4565b6060840152610ad460848201612dc6565b6080840152610ae560a48201612f75565b60a0840152610af660c48201612dc6565b60c0840152610b083660e48301613805565b60e08401526101248101359182116104c15701366023820112156104c157602091610b40610b4b923690602460048201359101613731565b610100820152614ad1565b604051908152f35b346104c15760403660031901126104c157600435610b6f612db0565b610b77615621565b81600052600b60205260ff60016040600020015460a81c1615610c0b578160005260056020526001600160a01b03604060002054168033036105d2579161072081602093600080516020615ba483398151915295610bd4836156e3565b6001600160801b038116610be9575b5061321c565b610bfc90610bf5615621565b828561571b565b8686604051858152a187610be3565b6024826040519062b8e7e760e51b82526004820152fd5b346104c15760203660031901126104c15760043580600052600b60205260ff60016040600020015460a81c16156106c157600052600b602052602064ffffffffff60406000205460a01c16604051908152f35b346104c15760003660031901126104c157602060405167016345785d8a00008152f35b346104c15760203660031901126104c15760043580600052600b60205260ff60016040600020015460a81c16156106c157600052600b60205260206001600160a01b0360406000205416604051908152f35b346104c15760203660031901126104c157600435600052600b602052602060ff60016040600020015460a81c166040519015158152f35b346104c15760803660031901126104c157610d3a612d9a565b610d42612db0565b6064359167ffffffffffffffff83116104c157366023840112156104c157826004013591610d6f83612f59565b92610d7d6040519485612f37565b80845236602482870101116104c1576020816000926024610daa98018388013785010152604435916130a7565b005b346104c15760203660031901126104c15760043580600052600b60205260ff60016040600020015460a81c16156106c157600052600b6020526109b5610df86004604060002001613586565b604051918291602083526020830190612e40565b346104c15760203660031901126104c1576020610662600435613667565b346104c15760203660031901126104c15760043580600052600b60205260ff60016040600020015460a81c16156106c157610e64906149d5565b6040516005821015610e77576020918152f35b634e487b7160e01b600052602160045260246000fd5b346104c15760203660031901126104c15760043580600052600b60205260ff60016040600020015460a81c16156106c157600052600b60205260206001600160801b0360026040600020015416604051908152f35b346104c15760203660031901126104c157610efb612d9a565b6001600160a01b038060005416338103610fb957508116908160005260026020526001600160801b0360406000205416908115610f885781610f5a9184600052600260205260406000206001600160801b03198154169055339061567d565b6040519081527fca7a4a65a94ed2f37538814e00e1cd4c41a78261561e3f3794592f11409cf5af60203392a3005b602483604051907f8410168c0000000000000000000000000000000000000000000000000000000082526004820152fd5b6040516331b339a960e21b81526001600160a01b03919091166004820152336024820152604490fd5b346104c15760603660031901126104c15767ffffffffffffffff6004358181116104c157611014903690600401612e0f565b61101c612db0565b926044359081116104c157611035903690600401612e0f565b919061103f615621565b8282036110a45760005b82811061105257005b80600080516020615ba48339815191526020611071600194878a61570b565b35611097611088611083868b8a61570b565b6137f1565b611090615621565b8b8361571b565b604051908152a101611049565b50604491604051917faec9344000000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b346104c15760403660031901126104c1576110f4612d9a565b602435908115158092036104c1576001600160a01b03169081331461116857336000526008602052604060002082600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a3005b606460405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152fd5b346104c15760003660031901126104c157604051600060045490600182811c918184169182156112b0575b602094858510841461129a57858794868652918260001461127a57505060011461121d575b5061120992500383612f37565b6109b5604051928284938452830190612d75565b84915060046000527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b906000915b8583106112625750506112099350820101856111fc565b8054838901850152879450869390920191810161124b565b60ff19168582015261120995151560051b85010192508791506111fc9050565b634e487b7160e01b600052602260045260246000fd5b92607f16926111d7565b346104c15760003660031901126104c15760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346104c15760203660031901126104c15760043580600052600b60205260ff60016040600020015460a81c16156106c157600052600b602052602064ffffffffff60406000205460c81c16604051908152f35b346104c15760203660031901126104c15760043580600052600b60205260ff60016040600020015460a81c16156106c157611382906149d5565b600581101580610e7757600282149081156113be575b81156113ac575b6020826040519015158152f35b9050610e77576004602091148261139f565b5050600381146000611398565b346104c15760203660031901126104c1576004356001600160a01b03908181168091036104c1578160005416338103610fb9575060015491816001600160a01b03198416176001556040519216825260208201527fdcb09aef4bf01068924ccce937981cbe59d25ba08380cf941aaaea4e4bd3960d60403392a2005b346104c15760203660031901126104c157606061014060405161146981612f06565b60008152600060208201526000604082015260008382015260006080820152600060a0820152600060c0820152600060e082015260006101008201526114ad613614565b6101208201520152600435600052600b60205260ff60016040600020015460a81c161561169c57600435600052600b60205260406000206115906004604051926114f684612f06565b80546001600160a01b038116855264ffffffffff8160a01c16602086015264ffffffffff8160c81c16604086015260ff8160f01c161515606086015260f81c1515608085015260ff60018201546001600160a01b03811660a0870152818160a01c16151560c0870152818160a81c16151560e087015260b01c16151561010085015261158460028201613633565b61012085015201613586565b6101408201526115a16004356149d5565b906005821015610e775760026101409214611690575b6109b5604051928392602084526001600160a01b03815116602085015264ffffffffff602082015116604085015264ffffffffff60408201511660608501526060810151151560808501526080810151151560a08501526001600160a01b0360a08201511660c085015260c0810151151560e085015260e08101511515610100850152610100810151151561012085015261167c61012082015183860190604090816001600160801b0391828151168552826020820151166020860152015116910152565b01516101a0808401526101c0830190612e40565b600060608201526115b7565b602460405162b8e7e760e51b81526004356004820152fd5b346104c1576020806003193601126104c15760043567ffffffffffffffff81116104c1576116e6903690600401612e0f565b906116ef615621565b6000915b8083106116fc57005b61170783828461570b565b3592611711615621565b61171a8461369e565b156117375760248460405190634a5541ef60e01b82526004820152fd5b611743849293946136ee565b611aeb5761176782600052600b6020526001600160a01b0360406000205416331490565b1580611acb575b611aac5761177b82613834565b82600052600b928387526117956002604060002001613633565b936001600160801b0392838651168482161015611a94578260005281895260ff60406000205460f01c1615611a7c57906117e482858b6117da819796838c51166136d5565b99015116906136d5565b93826000528184526040600020966003885498600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8b1617815583881615611a62575b0191811691826001600160801b031982541617905561186e6001600160a01b03809916926005875289604060002054169487528360019a8b604060002001541661567d565b33820361197f57823b6118db575b7f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd2600080516020615ba48339815191529685925b604080516001600160801b03928316815292909116602083015290a4604051908152a10191906116f3565b9350813b156104c1576040516372eba20360e01b8152600481018490526001600160a01b03821660248201526001600160801b03858116604483015286166064820152600080516020615ba4833981519152958b9585927f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd2929190600081608481838b5af1611970575b50925096505061187c565b61197990612f23565b8e611965565b813b6119be575b7f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd2600080516020615ba48339815191529685926118b0565b9350803b156104c1576040516372eba20360e01b8152600481018490526001600160a01b03831660248201526001600160801b03858116604483015286166064820152600080516020615ba4833981519152958b9585927f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd2929190600081608481838a5af1611a53575b509250965050611986565b611a5c90612f23565b8e611a48565b60018101600160a01b60ff60a01b19825416179055611829565b602483604051906339c6dc7360e21b82526004820152fd5b602483604051906322cad1af60e11b82526004820152fd5b60405163216caf0d60e01b815260048101839052336024820152604490fd5b5081600052600585526001600160a01b036040600020541633141561176e565b6024826040519063fe19f19f60e01b82526004820152fd5b346104c1576020806003193601126104c157600435611b20615621565b80600052600b825260ff60016040600020015460a81c16156106c157611b45816149d5565b916000926005811015610e775760048103611b725760248360405190634a5541ef60e01b82526004820152fd5b60038103611b92576024836040519063fe19f19f60e01b82526004820152fd5b916002849314611d1457611bbc81600052600b6020526001600160a01b0360406000205416331490565b15611cf45780600052600b825260ff60406000205460f01c1615611cdc5780600052600b8252604060002060ff60f01b198154169055600582526001600160a01b0360406000205416803b611c4a575b50807f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f84600080516020615ba483398151915295a2604051908152a1005b803b156104c157600080516020615ba48339815191529360008084936024604051809481937f341a0bd90000000000000000000000000000000000000000000000000000000083528860048401525af1611ca7575b509350611c0c565b9050611cb39150612f23565b8060007f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f611c9f565b602490604051906339c6dc7360e21b82526004820152fd5b60405163216caf0d60e01b81526004810191909152336024820152604490fd5b602490604051906322cad1af60e11b82526004820152fd5b346104c15760203660031901126104c1576004356001600160a01b03908181168091036104c1578160005416338103610fb95750600a5491816001600160a01b0319841617600a556040519216825260208201527fa2548bd4b805e907c1558a47b5858324fe8bb4a2e1ddfca647eecbf65610eebc60403392a26009546000198101908111611de85760407f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c91815190600182526020820152a1005b634e487b7160e01b600052601160045260246000fd5b346104c15760203660031901126104c157611e17612d9a565b6000546001600160a01b0380821692338403611e69576001600160a01b03199350169182911617600055337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf80600080a3005b6040516331b339a960e21b81526001600160a01b0385166004820152336024820152604490fd5b346104c15760203660031901126104c1576001600160a01b03611eb1612d9a565b168015611ed05760005260066020526020604060002054604051908152f35b608460405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e657200000000000000000000000000000000000000000000006064820152fd5b346104c15760203660031901126104c157600435611f716109448260005260056020526001600160a01b0360406000205416151590565b600052600560205260206001600160a01b0360406000205416604051908152f35b346104c15760203660031901126104c1576020611fb0600435612fd4565b6001600160a01b0360405191168152f35b346104c15760003660031901126104c15760206001600160a01b0360015416604051908152f35b346104c15760203660031901126104c15760043580600052600b60205260ff60016040600020015460a81c16156106c1576107bc602091614a56565b346104c15760203660031901126104c15760043580600052600b60205260ff60016040600020015460a81c16156106c1576000612060826149d5565b6005811015610e775760020361207e575b6020906040519015158152f35b50600052600b602052602060ff60406000205460f01c16612071565b346104c15760203660031901126104c1576004356120b6615621565b6120bf8161369e565b156121c7576120cd816159fb565b15611cf4576120db81612fd4565b6120e482613667565b1590816121be575b816121ab575b5061219357602081612112600080516020615ba483398151915293612fd4565b9080600052600783526001600160a01b036040600020926001600160a01b031993848154169055169182600052600684526040600020600019815401905581600052600584526040600020908154169055806000604051937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a48152a1005b602490604051906378630aa960e01b82526004820152fd5b6001600160a01b039150161515826120f2565b600091506120ec565b602490604051907f817cd6390000000000000000000000000000000000000000000000000000000082526004820152fd5b346104c15761220636612dda565b60405191602083019383851067ffffffffffffffff86111761223257610daa94604052600084526130a7565b634e487b7160e01b600052604160045260246000fd5b346104c15760203660031901126104c157602061066260043561369e565b346104c1576020806003193601126104c15760043590612284615621565b61228d8261369e565b156122aa5760248260405190634a5541ef60e01b82526004820152fd5b6122b3826136ee565b611aeb576122d782600052600b6020526001600160a01b0360406000205416331490565b15806125de575b611aac576122eb82613834565b9180600052600b82526123046002604060002001613633565b926001600160801b0390818551168282161015611a945782600052600b845260ff60406000205460f01c1615611a7c5780828561234761235194838a51166136d5565b97015116906136d5565b9082600052600b84526040600020916003835493600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8616178155838316156125c4575b0191861691826001600160801b03198254161790556123dc6001600160a01b03809416926005875283856040600020541695600b89526001604060002001541661567d565b3382036124e457823b612443575b7f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd28491600080516020615ba4833981519152975b604080516001600160801b03928316815292909116602083015290a4604051908152a1005b823b156104c1576040516372eba20360e01b8152600481018590526001600160a01b03831660248201526001600160801b03878116604483015282166064820152600080516020615ba48339815191529685927f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd292909190600081608481838b5af16124d5575b5097509150506123ea565b6124de90612f23565b896124ca565b813b612523575b7f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd28491600080516020615ba48339815191529761241e565b813b156104c1576040516372eba20360e01b8152600481018590526001600160a01b03841660248201526001600160801b03878116604483015282166064820152600080516020615ba48339815191529685927f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd292909190600081608481838a5af16125b5575b5097509150506124eb565b6125be90612f23565b896125aa565b60018101600160a01b60ff60a01b19825416179055612397565b5081600052600581526001600160a01b03604060002054163314156122de565b346104c15760203660031901126104c1576001600160a01b0361261f612d9a565b16600052600260205260206001600160801b0360406000205416604051908152f35b346104c157610daa61265236612dda565b91612665612660843361313d565b613036565b61321c565b346104c15760003660031901126104c1576020600954604051908152f35b346104c15760203660031901126104c15760043580600052600b60205260ff60016040600020015460a81c16156106c1576126c2906149d5565b6005811015610e775780602091159081156126e3575b506040519015158152f35b6001915014826126d8565b346104c157602060031981813601126104c1576004359067ffffffffffffffff908183116104c157610120833603918201126104c15761272c615621565b61010483013590602219018112156104c15782016004810135908282116104c15760240160608202360381136104c157612767913691613731565b918251906127748261356e565b916127826040519384612f37565b808352601f196127918261356e565b018660005b8281106129535750505064ffffffffff90814216946001600160801b0396876127be8261389f565b515116828a6127cc8461389f565b51015116858060406127dd8661389f565b510151168a011690604051926127f284612eb1565b83528b83015260408201526128068761389f565b526128108661389f565b5060019386855b8a8c8783106128d257908b846001600160a01b038c60a4810135828116908190036104c157610b4b95612892956128c294612854602486016137d0565b612860604487016137d0565b61286c606488016137dd565b91612879886004016137dd565b948461288760848b016137f1565b966040519d8e612ecd565b168c528d8c0152151560408b0152151560608a01521660808801521660a086015260c085015260c4369101613805565b60e0830152610100820152614ad1565b8893858060406129068b866128f68a8e9a6128ed828d6138c2565b5151169a6138c2565b51015116946000198901906138c2565b51015116816040612917888c6138c2565b510151160116916040519361292b85612eb1565b8452830152604082015261293f828b6138c2565b5261294a818a6138c2565b50018790612817565b61295b613614565b828288010152018790612796565b346104c15760203660031901126104c15760043580600052600b60205260ff60016040600020015460a81c16156106c15760209060009080600052600b8352604060002060ff815460f01c16806129fc575b6129d3575b50506001600160801b0360405191168152f35b6129f592506001600160801b0360026129ef9201541691613834565b906136d5565b82806129c0565b5060ff600182015460a01c16156129bb565b346104c15760403660031901126104c157612a27612d9a565b602435906001600160a01b038080612a3e85612fd4565b16921691808314612b3857803314908115612b13575b5015612aa9578260005260076020526040600020826001600160a01b0319825416179055612a8183612fd4565b167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b608460405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152fd5b9050600052600860205260406000203360005260205260ff6040600020541684612a54565b608460405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152fd5b346104c15760203660031901126104c1576020611fb0600435612ff9565b346104c15760003660031901126104c157604051600060035490600182811c91818416918215612c79575b602094858510841461129a57858794868652918260001461127a575050600114612c1c575061120992500383612f37565b84915060036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b906000915b858310612c615750506112099350820101856111fc565b80548389018501528794508693909201918101612c4a565b92607f1692612beb565b346104c15760203660031901126104c157600435907fffffffff0000000000000000000000000000000000000000000000000000000082168092036104c157817f80ac58cd0000000000000000000000000000000000000000000000000000000060209314908115612d28575b8115612cfe575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501483612cf7565b7f5b5e139f0000000000000000000000000000000000000000000000000000000081149150612cf0565b60005b838110612d655750506000910152565b8181015183820152602001612d55565b90602091612d8e81518092818552858086019101612d52565b601f01601f1916010190565b600435906001600160a01b03821682036104c157565b602435906001600160a01b03821682036104c157565b35906001600160a01b03821682036104c157565b60609060031901126104c1576001600160a01b039060043582811681036104c1579160243590811681036104c1579060443590565b9181601f840112156104c15782359167ffffffffffffffff83116104c1576020808501948460051b0101116104c157565b90815180825260208080930193019160005b828110612e60575050505090565b835180516001600160801b031686528083015167ffffffffffffffff168684015260409081015164ffffffffff169086015260609094019392810192600101612e52565b359081151582036104c157565b6060810190811067ffffffffffffffff82111761223257604052565b610120810190811067ffffffffffffffff82111761223257604052565b6040810190811067ffffffffffffffff82111761223257604052565b610160810190811067ffffffffffffffff82111761223257604052565b67ffffffffffffffff811161223257604052565b90601f8019910116810190811067ffffffffffffffff82111761223257604052565b67ffffffffffffffff811161223257601f01601f191660200190565b35906001600160801b03821682036104c157565b15612f9057565b606460405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152fd5b60005260056020526001600160a01b0360406000205416612ff6811515612f89565b90565b61301c6109448260005260056020526001600160a01b0360406000205416151590565b60005260076020526001600160a01b036040600020541690565b1561303d57565b608460405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f766564000000000000000000000000000000000000006064820152fd5b906130cb9392916130bb612660843361313d565b6130c683838361321c565b6133d5565b156130d257565b60405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b906001600160a01b03808061315184612fd4565b16931691838314938415613184575b50831561316e575b50505090565b61317a91929350612ff9565b1614388080613168565b909350600052600860205260406000208260005260205260ff604060002054169238613160565b156131b257565b608460405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152fd5b90613245929161322b83612fd4565b916001600160a01b039485938480941696879116146131ab565b169081158061333c5761325784613667565b159081613333575b508061332a575b6133125791808492613294600080516020615ba48339815191529660209661328d85612fd4565b16146131ab565b60009382855260078652604085206001600160a01b031990818154169055818652600687526040862060001981540190558286526040862060018154019055838652600587528260408720918254161790557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6040519580a48152a1565b602483604051906378630aa960e01b82526004820152fd5b50831515613266565b9050153861325f565b608460405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152fd5b3d156133d0573d906133b682612f59565b916133c46040519384612f37565b82523d6000602084013e565b606090565b9290803b156135655761343f916020916001600160a01b0394604051809581948293897f150b7a02000000000000000000000000000000000000000000000000000000009b8c86523360048701521660248501526044840152608060648401526084830190612d75565b03916000968791165af1908290826134fe575b50506134d8576134606133a5565b805190816134d35760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000161490565b909192506020813d821161355d575b8161351a60209383612f37565b810103126135595751907fffffffff00000000000000000000000000000000000000000000000000000000821682036135565750903880613452565b80fd5b5080fd5b3d915061350d565b50505050600190565b67ffffffffffffffff81116122325760051b60200190565b9081546135928161356e565b926040936135a285519182612f37565b828152809460208092019260005281600020906000935b8585106135c857505050505050565b600184819284516135d881612eb1565b64ffffffffff87546001600160801b038116835267ffffffffffffffff8160801c168584015260c01c16868201528152019301940193916135b9565b6040519061362182612eb1565b60006040838281528260208201520152565b9060405161364081612eb1565b6040819360018154916001600160801b0392838116865260801c6020860152015416910152565b80600052600b60205260ff60016040600020015460a81c16156106c157600052600b60205260ff60016040600020015460b01c1690565b80600052600b60205260ff60016040600020015460a81c16156106c157600052600b60205260ff60016040600020015460a01c1690565b6001600160801b039182169082160391908211611de857565b80600052600b60205260ff60016040600020015460a81c16156106c157600052600b60205260406000205460f81c90565b359064ffffffffff821682036104c157565b92919261373d8261356e565b60409461374c86519283612f37565b819584835260208093019160608096028501948186116104c157925b8584106137785750505050505050565b86848303126104c15782519061378d82612eb1565b61379685612f75565b8252858501359067ffffffffffffffff821682036104c157828792838b9501526137c186880161371f565b86820152815201930192613768565b3580151581036104c15790565b356001600160a01b03811681036104c15790565b356001600160801b03811681036104c15790565b91908260409103126104c15760405161381d81612eea565b602080829461382b81612dc6565b84520135910152565b64ffffffffff80421682600052600b602052604060002091825482828260a01c1610156138955760c81c16111561388357600401546001101561387a57612ff6906138d6565b612ff690614906565b6001600160801b039150600201541690565b5050505050600090565b8051156138ac5760200190565b634e487b7160e01b600052603260045260246000fd5b80518210156138ac5760209160051b010190565b64ffffffffff90814216906000908152600b6020526040908181208251936138fd85612f06565b8154956001600160a01b039182881687526020870197828160a01c168952828160c81c168789015260ff8160f01c161515606089015260f81c1515608088015260ff6001938486015490811660a08a0152818160a01c16151560c08a0152818160a81c16151560e08a015260b01c161515610100880152610140613997600461398860028801613633565b966101208b0197885201613586565b97019187835280876139a9889a61389f565b5101511693828288965b1610613a8d575091613a3d613a4292848881613a4798976001600160801b039e8f6139df8b8a516138c2565b5151169d8a8f9b60206139fc67ffffffffffffffff928d516138c2565b51015116998483613a0e8484516138c2565b5101511696508115613a8157613a2c929350519060001901906138c2565b5101511680925b0316920316613b01565b613e70565b613cd3565b928313613a60575050613a5a8391613ac5565b16011690565b516020015192939283169284168310159150613a7c9050575090565b905090565b50505051168092613a33565b8094986001600160801b039081613aa58c88516138c2565b51511601169801938282808a613abc8989516138c2565b510151166139b3565b60008112613ad05790565b602490604051907f2463f3d50000000000000000000000000000000000000000000000000000000082526004820152fd5b90600160ff1b808314908115613be9575b50613bbf576000821215613bb657613b3b826000035b6000831215613baf578260000390613bf3565b917f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311613b795760009160001991181315613b75575090565b0390565b604491604051917fd49c26b300000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b8290613bf3565b613b3b82613b28565b60046040517f9fe2b450000000000000000000000000000000000000000000000000000000008152fd5b9050811438613b12565b670de0b6b3a7640000916000198383099280830292838086109503948086039514613caf5782851015613c7357908291096001821901821680920460028082600302188083028203028083028203028083028203028083028203028083028203028092029003029360018380600003040190848311900302920304170290565b82606492604051927f63a05778000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b505080925015613cbd570490565b634e487b7160e01b600052601260045260246000fd5b90600160ff1b808314908115613db7575b50613d8d576000821215613d8457613d0d826000035b6000831215613d7d578260000390613dc1565b917f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311613d475760009160001991181315613b75575090565b604491604051917f120b5b4300000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b8290613dc1565b613d0d82613cfa565b60046040517fa6070c25000000000000000000000000000000000000000000000000000000008152fd5b9050811438613ce4565b90919060001983820983820291828083109203918083039214613e5f57670de0b6b3a76400009081831015613e2857947faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066994950990828211900360ee1b910360121c170290565b60449086604051917f5173648d00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050670de0b6b3a764000090049150565b80613e8a5750600090612ff65750670de0b6b3a764000090565b90670de0b6b3a7640000808314613ed7575080613eaf575050670de0b6b3a764000090565b670de0b6b3a76400008114613ed357613ece90613a42612ff6936147b1565b613ef7565b5090565b91505090565b8015613cbd576ec097ce7bc90715b34b9f10000000000590565b6000811215613f2c5768033dd1780914b97114198112613f2657613f1d90600003613ef7565b612ff690613edd565b50600090565b680a688906bd8affffff811361478057670de0b6b3a764000080604092831b05907780000000000000000000000000000000000000000000000067ff000000000000008316614663575b66ff000000000000831661455b575b65ff0000000000831661445b575b64ff000000008316614363575b63ff0000008316614273575b62ff0000831661418b575b61ff0083166140ab575b60ff8316613fd4575b02911c60bf031c90565b60808316614099575b838316614087575b60208316614075575b60108316614063575b60088316614051575b6004831661403f575b6002831661402d575b6001831615613fca576801000000000000000102831c613fca565b6801000000000000000102831c614012565b6801000000000000000302831c614009565b6801000000000000000602831c614000565b6801000000000000000b02831c613ff7565b6801000000000000001602831c613fee565b6801000000000000002c02831c613fe5565b6801000000000000005902831c613fdd565b6180008316614179575b6140008316614167575b6120008316614155575b6110008316614143575b6108008316614131575b610400831661411f575b610200831661410d575b610100831615613fc157680100000000000000b102831c613fc1565b6801000000000000016302831c6140f1565b680100000000000002c602831c6140e7565b6801000000000000058c02831c6140dd565b68010000000000000b1702831c6140d3565b6801000000000000162e02831c6140c9565b68010000000000002c5d02831c6140bf565b680100000000000058b902831c6140b5565b628000008316614261575b62400000831661424f575b62200000831661423d575b62100000831661422b575b620800008316614219575b620400008316614207575b6202000083166141f5575b62010000831615613fb7576801000000000000b17202831c613fb7565b680100000000000162e402831c6141d8565b6801000000000002c5c802831c6141cd565b68010000000000058b9102831c6141c2565b680100000000000b172102831c6141b7565b68010000000000162e4302831c6141ac565b680100000000002c5c8602831c6141a1565b6801000000000058b90c02831c614196565b63800000008316614351575b6340000000831661433f575b6320000000831661432d575b6310000000831661431b575b63080000008316614309575b630400000083166142f7575b630200000083166142e5575b6301000000831615613fac5768010000000000b1721802831c613fac565b6801000000000162e43002831c6142c7565b68010000000002c5c86002831c6142bb565b680100000000058b90c002831c6142af565b6801000000000b17217f02831c6142a3565b680100000000162e42ff02831c614297565b6801000000002c5c85fe02831c61428b565b68010000000058b90bfc02831c61427f565b6480000000008316614449575b6440000000008316614437575b6420000000008316614425575b6410000000008316614413575b6408000000008316614401575b64040000000083166143ef575b64020000000083166143dd575b640100000000831615613fa057680100000000b17217f802831c613fa0565b68010000000162e42ff102831c6143be565b680100000002c5c85fe302831c6143b1565b6801000000058b90bfce02831c6143a4565b68010000000b17217fbb02831c614397565b6801000000162e42fff002831c61438a565b68010000002c5c8601cc02831c61437d565b680100000058b90c0b4902831c614370565b658000000000008316614549575b654000000000008316614537575b652000000000008316614525575b651000000000008316614513575b650800000000008316614501575b6504000000000083166144ef575b6502000000000083166144dd575b65010000000000831615613f93576801000000b17218355102831c613f93565b680100000162e430e5a202831c6144bd565b6801000002c5c863b73f02831c6144af565b68010000058b90cf1e6e02831c6144a1565b680100000b1721bcfc9a02831c614493565b68010000162e43f4f83102831c614485565b680100002c5c89d5ec6d02831c614477565b6801000058b91b5bc9ae02831c614469565b66800000000000008316614651575b6640000000000000831661463f575b6620000000000000831661462d575b6610000000000000831661461b575b66080000000000008316614609575b660400000000000083166145f7575b660200000000000083166145e5575b6601000000000000831615613f855768010000b17255775c0402831c613f85565b6801000162e525ee054702831c6145c4565b68010002c5cc37da949202831c6145b5565b680100058ba01fb9f96d02831c6145a6565b6801000b175effdc76ba02831c614597565b680100162f3904051fa102831c614588565b6801002c605e2e8cec5002831c614579565b68010058c86da1c09ea202831c61456a565b6780000000000000008316614761575b674000000000000000831661474f575b672000000000000000831661473d575b671000000000000000831661472b575b6708000000000000008316614719575b6704000000000000008316614707575b67020000000000000083166146f5575b670100000000000000831615613f7657680100b1afa5abcbed6102831c613f76565b68010163da9fb33356d802831c6146d3565b680102c9a3e778060ee702831c6146c3565b6801059b0d31585743ae02831c6146b3565b68010b5586cf9890f62a02831c6146a3565b6801172b83c7d517adce02831c614693565b6801306fe0a31b7152df02831c614683565b5077b504f333f9de648480000000000000000000000000000000614673565b602490604051907f0360d0280000000000000000000000000000000000000000000000000000000082526004820152fd5b806000808313156148d557670de0b6b3a76400009283811261489e57506001925b808305906001600160801b03821160071b91821c9167ffffffffffffffff831160061b92831c63ffffffff811160051b90811c61ffff811160041b90811c60ff811160031b90811c91600f831160021b92831c936001978860038711811b96871c11961717171717171781810294811d9082821461489257506706f05b59d3b20000905b8482136148665750505050500290565b808391020590671bc16d674ec80000821215614885575b831d90614856565b8091950194831d9061487d565b93505093925050020290565b60001993925080156148c1576ec097ce7bc90715b34b9f100000000005916147d2565b602482634e487b7160e01b81526012600452fd5b602483604051907f059b101b0000000000000000000000000000000000000000000000000000000082526004820152fd5b64ffffffffff61493b600091838352600b60205280806040852054818160a01c1693849160c81c160316918142160316613b01565b91808252600b602052600460408320018054156149c15790829167ffffffffffffffff93526149936020832054828452600b602052613a426001600160801b03968760026040882001541696879360801c1690613e70565b9283136149a95750506149a590613ac5565b1690565b60029350604092508152600b60205220015460801c90565b602483634e487b7160e01b81526032600452fd5b80600052600b602052604060002060ff600182015460a01c166000146149fc575050600490565b805460f81c614a4f575460a01c64ffffffffff164210613f2657614a1f81613834565b90600052600b6020526001600160801b038060026040600020015416911610600014614a4a57600190565b600290565b5050600390565b80600052600b602052614a6f6002604060002001613633565b81600052600b602052604060002060ff600182015460a01c16600014614aa257506001600160801b039150602001511690565b5460f81c614ab45750612ff690613834565b612ff691506001600160801b0360408183511692015116906136d5565b906001600160a01b036001541660206001600160a01b0360c0850151166024604051809481937fdcf844a700000000000000000000000000000000000000000000000000000000835260048301525afa8015610a3257600090615390575b614b5291506001600160801b0360a08501511690602060e0860151015191615a64565b6001600160801b038151166101008401519064ffffffffff6020860151168115615366578251801561533c577f0000000000000000000000000000000000000000000000000000000000000000811161530b575064ffffffffff6040614bb78561389f565b510151168110156152b45750600091829083815185905b808210615221575050505064ffffffffff421664ffffffffff82168110156151e15750506001600160801b038216810361519f5750506009549283600052600b6020526040600020916001600160801b0381511660028401906001600160801b03198254161790556001600160a01b0360c083015116600184015490750100000000000000000000000000000000000000000060408501511515928654927fffffffffffffffffff0000ff000000000000000000000000000000000000000076ff000000000000000000000000000000000000000000006060890151151560b01b16921617171760018601556001600160a01b0384511691610100850151926040614ce08551956000198701906138c2565b510151927fff000000000000000000000000000000000000000000000000000000000000007eff0000000000000000000000000000000000000000000000000000000000007dffffffffff0000000000000000000000000000000000000000000000000078ffffffffff000000000000000000000000000000000000000060208b015160a01b169660c81b169460f01b16911617171717845560005b8181106150cf575050600185016009556001600160a01b0360c08301511660005260026020526001600160801b0380604060002054168160208401511601166001600160a01b0360c0840151166000526040600020906001600160801b03198254161790556001600160a01b03608083015116801561508b57614e1e614e188760005260056020526001600160a01b0360406000205416151590565b1561553e565b614e2786613667565b1580615082575b8061507a575b615062576020600080516020615ba483398151915291614e6d614e188960005260056020526001600160a01b0360406000205416151590565b806000526006825260406000206001815401905587600052600582526040600020816001600160a01b0319825416179055876040519160007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4878152a1614efd6001600160a01b0360c0840151166001600160801b038084511681602086015116011690309033906153c4565b6001600160801b0360408201511680615033575b507fef3d668acee46576ad5d407c42ab4d0cde13f3cd70b28f09a0fb9e3bf5bf09cb614ff06001600160a01b03845116926001600160a01b03608086015116946001600160a01b0360c0820151169661502861500860408401511515928c606086015115156001600160a01b0360e061010089015194549864ffffffffff6040519a614f9c8c612eea565b818160a01c168c5260c81c1660208b01520151511695604051998a99610160948b523360208c015260408b0190604090816001600160801b0391828151168552826020820151166020860152015116910152565b60a089015260c08801528060e0880152860190612e40565b926101008501906020908164ffffffffff91828151168552015116910152565b6101408301520390a4565b61505c906001600160a01b0360c0850151166001600160a01b0360e086015151169033906153c4565b38614f11565b602486604051906378630aa960e01b82526004820152fd5b506000614e34565b50801515614e2e565b606460405162461bcd60e51b815260206004820152602060248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152fd5b6150de816101008601516138c2565b51906004860154916801000000000000000083101561223257600183018060048901558310156138ac5760019260048801600052602060002001906001600160801b03815116908254917fffffff00000000000000000000000000000000000000000000000000000000007cffffffffff000000000000000000000000000000000000000000000000604077ffffffffffffffff00000000000000000000000000000000602086015160801b1694015160c01b169316171717905501614d7c565b6040517fd90b7e390000000000000000000000000000000000000000000000000000000081526001600160801b03918216600482015291166024820152604490fd5b6040517f210aec0e00000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b9193509194615245906001600160801b0361523c85896138c2565b515116906159e0565b9464ffffffffff80604061525986856138c2565b51015116941680851115615277575060018493019192919092614bce565b8385606492604051927f7b0bada8000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b64ffffffffff60406152c58561389f565b5101516040517fb4c9e52c00000000000000000000000000000000000000000000000000000000815264ffffffffff938416600482015291169091166024820152604490fd5b602490604051907f4757689b0000000000000000000000000000000000000000000000000000000082526004820152fd5b60046040517f3952c64e000000000000000000000000000000000000000000000000000000008152fd5b60046040517f6095d3bc000000000000000000000000000000000000000000000000000000008152fd5b6020823d6020116153bc575b816153a960209383612f37565b810103126135565750614b529051614b2f565b3d915061539c565b9290604051927f23b872dd0000000000000000000000000000000000000000000000000000000060208501526001600160a01b03809216602485015216604483015260648201526064815260a081019181831067ffffffffffffffff8411176122325761543392604052615435565b565b6001600160a01b03169061549560405161544e81612eea565b6020938482527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564858301526000808587829751910182855af161548f6133a5565b91615589565b80519182159184831561551a575b5050509050156154b05750565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b919381809450010312613559578201519081151582036135565750803880846154a3565b1561554557565b606460405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152fd5b919290156155ea575081511561559d575090565b3b156155a65790565b606460405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b8251909150156155fd5750805190602001fd5b6105f19060405191829162461bcd60e51b8352602060048401526024830190612d75565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361565357565b60046040517fa1c0d6e5000000000000000000000000000000000000000000000000000000008152fd5b916001600160a01b03604051927fa9059cbb000000000000000000000000000000000000000000000000000000006020850152166024830152604482015260448152608081019181831067ffffffffffffffff8411176122325761543392604052615435565b612ff6906156f081614a56565b90600052600b60205260026040600020015460801c906136d5565b91908110156138ac5760051b0190565b9291926157278161369e565b6159c85761574b81600052600b6020526001600160a01b0360406000205416331490565b15806159b8575b611cf45761577681600052600b6020526001600160a01b0360406000205416331490565b80615994575b615968576001600160a01b0393848316928315610557576001600160801b039586831691821561052657876157b0866156e3565b16808411615944575090615846836157e89360009a888c5261580e8c600260209a600b8c526040998a9183838620015460801c6159e0565b928d8152600b8d52200190836001600160801b031983549260801b169116178155613633565b90615829818a840151169282898183511692015116906136d5565b161115615915575b878b52600b8752836001868d2001541661567d565b848852600584528188205416803314158061590b575b61588f575b507ffa54f9f9bdcdd28778cbb9f78490df6691cc4e2729588e10f4cc0a26c465686a939495965051908152a3565b803b156159075796807ffa54f9f9bdcdd28778cbb9f78490df6691cc4e2729588e10f4cc0a26c465686a9596979860848451809481936313375c3b60e01b83528b60048401523360248401528c60448401528860648401525af16158f8575b8796959450615861565b61590190612f23565b386158ee565b8780fd5b50803b151561585c565b878b52600b8752848b2060018101600160a01b60ff60a01b1982541617905560ff60f01b198154169055615831565b85606491856040519263287ecaef60e21b8452600484015260248301526044820152fd5b6001600160a01b0360649260405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b508060005260056020526001600160a01b038060406000205416908316141561577c565b506159c2816159fb565b15615752565b60249060405190634a5541ef60e01b82526004820152fd5b9190916001600160801b0380809416911601918211611de857565b60009080825260056020526001600160a01b038060408420541692833314938415615a40575b50508215615a2e57505090565b909150615a3b3392612ff9565b161490565b60ff9294509060409181526008602052818120338252602052205416913880615a21565b909291615a6f613614565b936001600160801b0392838116918215615b7b5767016345785d8a0000808211615b4457808511615b0d5750615ab985615aaa819386613dc1565b16946020890195865284613dc1565b169184615ad06040890194808652828751166159e0565b161015615af757615ae9849182615af2955116906136d5565b915116906136d5565b168252565b634e487b7160e01b600052600160045260246000fd5b84604491604051917f4fea5c1a00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b60449250604051917f47152d6700000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b50505050509050604051615b8e81612eb1565b6000815260006020820152600060408201529056fef8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7"; bytes public constant BYTECODE_LOCKUP_LINEAR = - hex"60a034620003e757601f196001600160401b03601f62004a433881900382810185168601919084831187841017620003ec57808792606094604052833981010312620003e75783516001600160a01b03928382169291839003620003e7576020918287015196858816809803620003e75760400151948516809503620003e7576200008962000402565b90601c82527f5361626c696572205632204c6f636b7570204c696e656172204e46540000000084830152620000bd62000402565b601181527029a0a116ab1916a627a1a5aaa816a624a760791b8582015230608052600080546001600160a01b031990811688178255600180548216909b178b5596817fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a38351858111620003d35760039485548c81811c91168015620003c8575b89821014620003b45790818684931162000361575b508890868311600114620002f8578492620002ec575b505060001982871b1c1916908b1b1784555b8151948511620002d8576004958654998b8b811c9b168015620002cd575b828c1014620002ba57848b1162000271575b869798999a50819487116001146200020a57505093620001fe575b505082871b92600019911b1c19161790555b600a541617600a5560095560405161462090816200042382396080518161410e0152f35b015191503880620001c8565b8883528183208c9890969594939116915b8282106200025757505085116200023c575b50505050811b019055620001da565b01519060f884600019921b161c19169055388080806200022d565b8484015187558c989096019593840193908101906200021b565b87835281832085880160051c81019b838910620002af575b860160051c019a8c905b8c8110620002a3575050620001ad565b848155018c9062000293565b909b508b9062000289565b634e487b7160e01b835260228852602483fd5b9a607f169a6200019b565b634e487b7160e01b81526041600452602490fd5b0151905038806200016b565b908c8e9416918886528a862092865b8c82821062000341575050841162000328575b505050811b0184556200017d565b015160001983891b60f8161c191690553880806200031a565b91929395968291958786015181550195019301908f959493929162000307565b9091508684528884208680850160051c8201928b8610620003aa575b918f91869594930160051c01915b8281106200039b57505062000155565b8681558594508f91016200038b565b925081926200037d565b634e487b7160e01b84526022600452602484fd5b90607f169062000140565b634e487b7160e01b82526041600452602482fd5b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620003ec5760405256fe608080604052600436101561001357600080fd5b600090813560e01c90816301ffc9a7146129a45750806306fdde03146128e2578063081812fc146128c3578063095ea7b3146127345780631400ecec146126945780631c1cdd4c1461262f5780631e99d5691461261157806323b872dd146125e757806339a73c03146125a657806340e58ee514612202578063425d30dd146121e357806342842e0e1461219357806342966c681461203b5780634857501f14611fb15780634869e12d14611f765780635fe3b56714611f4f5780636352211e14611f1f5780636d0cee7514611ec957806370a0823114611e2057806375829def14611d8d578063780a82c814611d3d5780637cad6cd114611c6c5780637de6b1db14611a935780638659c2701461167f578063894e9a0d1461142b5780638bad38dd146113ae5780638f69b993146113125780639067b677146112bf57806395d89b41146111b257806396ce143114611093578063a22cb46514610fc2578063a2ffb89714610d84578063a6202bf214610c7e578063a80fc07114610c2c578063ab167ccc14610af3578063ad35efd414610a91578063b256456914610a72578063b88d4fde146109e1578063b8a3be66146109ac578063b971302a1461095d578063bc063e1a1461093a578063bc2be1be146108ea578063c156a11d1461082f578063c87b56dd146106f1578063cc364f4814610643578063d4dbd20b146105f1578063d511609f146105a5578063d975dfed14610559578063e985e9c514610504578063ea5ead19146104de578063eac8f5b814610475578063f590c1761461044c578063f851a440146104265763fdd46d601461027357600080fd5b346104235760603660031901126104235760043561028f612ad3565b610297612c13565b906102a0614104565b6102a983613291565b61040b576102cd83600052600b6020526001600160a01b0360406000205416331490565b15806103fb575b6103d8576102f883600052600b6020526001600160a01b0360406000205416331490565b806103b6575b610389576001600160a01b0381161561035f576001600160801b03821615610347579161033d602092600080516020614600833981519152948361422f565b604051908152a180f35b6024836040519063d2aabcd960e01b82526004820152fd5b60046040517fc61a0e9e000000000000000000000000000000000000000000000000000000008152fd5b826001600160a01b0360649260405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b5082845260056020526001600160a01b038060408620541690821614156102fe565b60405163216caf0d60e01b815260048101849052336024820152604490fd5b0390fd5b5061040583614457565b156102d4565b60248360405190634a5541ef60e01b82526004820152fd5b80fd5b50346104235780600319360112610423576001600160a01b036020915416604051908152f35b503461042357602036600319011261042357602061046b6004356132f7565b6040519015158152f35b503461042357602036600319011261042357600435808252600b60205260ff600160408420015460d01c16156104c75760016040836001600160a01b039360209552600b855220015416604051908152f35b6024906040519062b8e7e760e51b82526004820152fd5b5034610423576040366003190112610423576004356104fb612ad3565b610297826141c6565b50346104235760403660031901126104235761051e612abd565b6040610528612ad3565b926001600160a01b0380931681526008602052209116600052602052602060ff604060002054166040519015158152f35b50346104235760203660031901126104235760ff6001604060043593848152600b60205220015460d01c16156104c7576105946020916141c6565b6001600160801b0360405191168152f35b503461042357602036600319011261042357600435808252600b60205260ff600160408420015460d01c16156104c75760408260029260209452600b845220015460801c604051908152f35b503461042357602036600319011261042357600435808252600b60205260ff600160408420015460d01c16156104c75760036040836001600160801b039360209552600b855220015416604051908152f35b503461042357602036600319011261042357600435610660613207565b50808252600b60205260ff600160408420015460d01c16156104c7578160409160609352600b60205220600181549164ffffffffff918291015460a01c1690604051926106ac84612b9d565b818160a01c16845260c81c16602083015260408201526106ef60405180926040908164ffffffffff91828151168552826020820151166020860152015116910152565bf35b50346104235760208060031936011261081b5760043561072f61072a8260005260056020526001600160a01b0360406000205416151590565b612c29565b826001600160a01b03600a5416916044604051809481937fe9dc637500000000000000000000000000000000000000000000000000000000835230600484015260248301525afa92831561082357809361079e575b505061079a604051928284938452830190612a98565b0390f35b909192503d8082843e6107b18184612bd5565b820191838184031261081b5780519067ffffffffffffffff821161081f570182601f8201121561081b578051916107e783612bf7565b936107f56040519586612bd5565b83855285848401011161042357509061081391848085019101612a75565b903880610784565b5080fd5b8280fd5b604051903d90823e3d90fd5b50346104235760403660031901126104235760043561084c612ad3565b610854614104565b818352600b60205260ff600160408520015460d01c16156108d35781835260056020526001600160a01b036040842054168033036103d8579161033d81602093600080516020614600833981519152956108ad836141c6565b6001600160801b0381166108c2575b50612ebc565b6108cd90828561422f565b386108bc565b6024826040519062b8e7e760e51b82526004820152fd5b503461042357602036600319011261042357600435808252600b60205260ff600160408420015460d01c16156104c75760408264ffffffffff9260209452600b8452205460a01c16604051908152f35b5034610423578060031936011261042357602060405167016345785d8a00008152f35b503461042357602036600319011261042357600435808252600b60205260ff600160408420015460d01c16156104c7576040826001600160a01b039260209452600b8452205416604051908152f35b50346104235760203660031901126104235760ff600160406020936004358152600b855220015460d01c166040519015158152f35b5034610423576080366003190112610423576109fb612abd565b610a03612ad3565b906064359067ffffffffffffffff8211610a6e5736602383011215610a6e5781600401359284610a3285612bf7565b93610a406040519586612bd5565b858552366024878301011161081b5785610a6b96602460209301838801378501015260443591612d47565b80f35b8380fd5b503461042357602036600319011261042357602061046b60043561325a565b503461042357602036600319011261042357600435808252600b60205260ff600160408420015460d01c16156104c757610aca9061356d565b604051906005811015610adf57602092508152f35b602483634e487b7160e01b81526021600452fd5b50346104235761014036600319011261042357610b0e614104565b610b16613207565b9064ffffffffff80421680845260c4358281168103610c275781018216602085015260e435908183168203610c275701166040830152606435916001600160a01b03918284168094036104235750608435801515809103610c275760a43590811515809203610c275760243594848616809603610c275760043595858716809703610c2757604435906001600160801b038216809203610c275760405197610bbd89612b80565b8852602088015260408701526060860152608085015260a084015260c0830152604061010319360112610c275760405191610bf783612bb9565b610104359182168203610c275782610c1f9260209452610124358482015260e082015261366f565b604051908152f35b600080fd5b503461042357602036600319011261042357600435808252600b60205260ff600160408420015460d01c16156104c75760026040836001600160801b039360209552600b855220015416604051908152f35b503461042357602036600319011261042357610c98612abd565b6001600160a01b0380835416338103610d5b575081169081835260026020526001600160801b03604084205416908115610d2a5781610cfb918486526002602052604086206fffffffffffffffffffffffffffffffff1981541690553390614160565b6040519081527fca7a4a65a94ed2f37538814e00e1cd4c41a78261561e3f3794592f11409cf5af60203392a380f35b602483604051907f8410168c0000000000000000000000000000000000000000000000000000000082526004820152fd5b6040516331b339a960e21b81526001600160a01b03919091166004820152336024820152604490fd5b50346104235760603660031901126104235767ffffffffffffffff60043581811161081f57610db7903690600401612b1e565b91610dc0612ad3565b90604435908111610fbe57610dd9903690600401612b1e565b9093610de3614104565b818103610f8857855b818110610df7578680f35b610e028183876141ee565b35610e0e8285896141ee565b356001600160801b0381168103610c2757610e27614104565b610e3082613291565b610f7057610e5482600052600b6020526001600160a01b0360406000205416331490565b1580610f60575b610f4157610e7f82600052600b6020526001600160a01b0360406000205416331490565b80610f19575b610eec576001600160a01b0386161561035f576001600160801b03811615610ed457602082610ec760008051602061460083398151915293896001979661422f565b604051908152a101610dec565b6024826040519063d2aabcd960e01b82526004820152fd5b6064826001600160a01b038860405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b5081895260056020526001600160a01b0360408a2054166001600160a01b0387161415610e85565b60405163216caf0d60e01b815260048101839052336024820152604490fd5b50610f6a82614457565b15610e5b565b60248260405190634a5541ef60e01b82526004820152fd5b604491604051917faec9344000000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b8480fd5b503461042357604036600319011261042357610fdc612abd565b60243590811515809203610c27576001600160a01b03169081331461104f5733835260086020526040832082600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a380f35b606460405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152fd5b503461042357610160366003190112610423576110ae614104565b604051906110bb82612b80565b6110c3612abd565b82526110cd612ad3565b60208301526110da612c13565b60408301526001600160a01b03906064358281168103610c275760608401526084358015158103610c2757608084015260a4358015158103610c275760a084015260603660c3190112610423575060405161113481612b9d565b64ffffffffff60c4358181168103610c2757825260e4358181168103610c27576020830152610104359081168103610c2757604082015260c0830152604061012319360112610c27576040519161118a83612bb9565b610124359182168203610c275782610c1f9260209452610144358482015260e082015261366f565b5034610423578060031936011261042357604051908060045491600183811c928185169485156112b5575b60209586861081146112a15785885287949392918790821561127f575050600114611225575b505061121192500383612bd5565b61079a604051928284938452830190612a98565b90859250600482527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5b85831061126757505061121193508201013880611203565b8054838901850152879450869390920191810161124f565b925093505061121194915060ff191682840152151560051b8201013880611203565b602483634e487b7160e01b81526022600452fd5b93607f16936111dd565b503461042357602036600319011261042357600435808252600b60205260ff600160408420015460d01c16156104c757600160408364ffffffffff9360209552600b855220015460a01c16604051908152f35b503461042357602036600319011261042357600435808252600b60205260ff600160408420015460d01c16156104c75761134b9061356d565b906005821015908161138c57600283149182156113a0575b8215611377575b6020836040519015158152f35b90915061138c5750600460209114388061136a565b80634e487b7160e01b602492526021600452fd5b506003831491506000611363565b5034610423576020366003190112610423576004356001600160a01b039081811680910361081f5781835416338103610d5b575060015491816001600160a01b03198416176001556040519216825260208201527fdcb09aef4bf01068924ccce937981cbe59d25ba08380cf941aaaea4e4bd3960d60403392a280f35b50346104235760203660031901126104235760405161144981612b63565b8181528160208201528160408201528160608201528160808201528160a08201528160c08201528160e0820152816101008201528161012082015261014061148f613207565b9101526004358152600b60205260ff600160408320015460d01c1615611667576004358152600b602052604081206115686002604051926114cf84612b63565b80546001600160a01b038116855264ffffffffff8160a01c16602086015264ffffffffff8160c81c16604086015260ff8160f01c161515606086015260f81c1515608085015260ff60018201546001600160a01b03811660a087015264ffffffffff8160a01c1660c0870152818160c81c16151560e0870152818160d01c16151561010087015260d81c16151561012085015201613226565b61014082015261157960043561356d565b6005811015610adf579160026101a0931461165c575b506106ef610140604051926001600160a01b03815116845264ffffffffff602082015116602085015264ffffffffff60408201511660408501526060810151151560608501526080810151151560808501526001600160a01b0360a08201511660a085015264ffffffffff60c08201511660c085015260e0810151151560e0850152610100810151151561010085015261012081015115156101208501520151610140830190604090816001600160801b0391828151168552826020820151166020860152015116910152565b60608201523861158f565b602460405162b8e7e760e51b81526004356004820152fd5b503461042357602090816003193601126104235760043567ffffffffffffffff811161081b576116b483913690600401612b1e565b906116bd614104565b83915b8083106116cb578480f35b6116da838284979596976141ee565b35936116e4614104565b6116ed85613291565b1561170a5760248560405190634a5541ef60e01b82526004820152fd5b90919293611717816132f7565b611a7b5761173b81600052600b6020526001600160a01b0360406000205416331490565b1580611a5d575b611a3d5761174f81613328565b818652600b9081885261176760026040892001613226565b6001600160801b0391828251168382161015611a2557848952838a5260ff60408a205460f01c1615611a0d579282826117b986838e6117af8f9a829a60409e9d9a51166132c8565b94015116906132c8565b84875283865288872091611848835494600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff871617855560038185169586156119f3575b0190831699818b6fffffffffffffffffffffffffffffffff19819454161790556001600160a01b0380971696879160058c52818f82205416998c5260019e8f9120015416614160565b33840361193157843b6118aa575b50507f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd260406000805160206146008339815191529786935b825191825288820152a4604051908152a10191909392936116c0565b90919293809596503b1561192d576040516372eba20360e01b8152600481018790526001600160a01b03851660248201526001600160801b039182166044820152911660648201528b94939291908b90818160848183895af115611856576119189192939597949650612b4f565b61192957918a939194928a8d611856565b8980fd5b8b80fd5b833b611974575b50507f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd2604060008051602061460083398151915297869361188e565b90919280949596503b1561192d576040516372eba20360e01b8152600481018790526001600160a01b03861660248201526001600160801b039182166044820152911660648201528b94939291908b90818160848183885af115611938576119e29192939597949650612b4f565b61192957918a939194928a8d611938565b60018101600160c81b60ff60c81b198254161790556117ff565b602485604051906339c6dc7360e21b82526004820152fd5b602485604051906322cad1af60e11b82526004820152fd5b60405163216caf0d60e01b81526004810191909152336024820152604490fd5b50808552600586526001600160a01b03604086205416331415611742565b6024906040519063fe19f19f60e01b82526004820152fd5b50346104235760208060031936011261081b5760043590611ab2614104565b818352600b815260ff600160408520015460d01c16156108d357611ad58261356d565b6005811015611c585760048103611afe5760248360405190634a5541ef60e01b82526004820152fd5b60038103611b1e576024836040519063fe19f19f60e01b82526004820152fd5b600214611c4057611b4582600052600b6020526001600160a01b0360406000205416331490565b15610f4157818352600b815260ff604084205460f01c1615611c2857818352600b81526040832060ff60f01b19815416905560058152826001600160a01b03604082205416803b611bd1575b505060405160008051602061460083398151915292807f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f8680a28152a180f35b803b1561081b578180916024604051809481937f341a0bd90000000000000000000000000000000000000000000000000000000083528960048401525af115611b9157611c1d90612b4f565b61081f578238611b91565b602482604051906339c6dc7360e21b82526004820152fd5b602482604051906322cad1af60e11b82526004820152fd5b602484634e487b7160e01b81526021600452fd5b5034610423576020366003190112610423576004356001600160a01b039081811680910361081f5781835416338103610d5b5750600a5491816001600160a01b0319841617600a556040519216825260208201527fa2548bd4b805e907c1558a47b5858324fe8bb4a2e1ddfca647eecbf65610eebc60403392a26009546000198101908111611d295760407f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c91815190600182526020820152a180f35b602482634e487b7160e01b81526011600452fd5b503461042357602036600319011261042357600435808252600b60205260ff600160408420015460d01c16156104c75760408264ffffffffff9260209452600b8452205460c81c16604051908152f35b503461042357602036600319011261042357611da7612abd565b9080546001600160a01b0380821693338503611df9576001600160a01b03199394501691829116178255337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808380a380f35b6040516331b339a960e21b81526001600160a01b0386166004820152336024820152604490fd5b5034610423576020366003190112610423576001600160a01b03611e42612abd565b168015611e5f578160409160209352600683522054604051908152f35b608460405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e657200000000000000000000000000000000000000000000006064820152fd5b5034610423576020366003190112610423576001600160a01b036040602092600435611f0e61072a8260005260056020526001600160a01b0360406000205416151590565b815260058452205416604051908152f35b5034610423576020366003190112610423576020611f3e600435612c74565b6001600160a01b0360405191168152f35b503461042357806003193601126104235760206001600160a01b0360015416604051908152f35b50346104235760203660031901126104235760ff6001604060043593848152600b60205220015460d01c16156104c7576105946020916135f4565b50346104235760203660031901126104235760043590818152600b60205260ff600160408320015460d01c16156108d35780611fec8361356d565b9260058410156120275760026020940361200d575b50506040519015158152f35b8152600b8352604090205460f01c60ff1690503880612001565b602482634e487b7160e01b81526021600452fd5b503461042357602036600319011261042357600435612058614104565b61206181613291565b156121625761206f81614457565b15611a3d5761207d81612c74565b6120868261325a565b15908161215a575b81612147575b5061212f576020816120b460008051602061460083398151915293612c74565b90808552600783526001600160a01b0360408620926001600160a01b03199384815416905516918286526006845260408620600019815401905581865260058452604086209081541690558085604051937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a48152a180f35b602490604051906378630aa960e01b82526004820152fd5b6001600160a01b03915016151538612094565b83915061208e565b602490604051907f817cd6390000000000000000000000000000000000000000000000000000000082526004820152fd5b5034610423576121a236612ae9565b60405191602083019383851067ffffffffffffffff8611176121cd57610a6b94604052858452612d47565b634e487b7160e01b600052604160045260246000fd5b503461042357602036600319011261042357602061046b600435613291565b50346104235760208060031936011261081b5760043590612221614104565b61222a82613291565b156122475760248260405190634a5541ef60e01b82526004820152fd5b612250826132f7565b61258e5761227482600052600b6020526001600160a01b0360406000205416331490565b1580612570575b610f415761228882613328565b91808452600b825261229f60026040862001613226565b6001600160801b039384825116858216101561255857828652600b845260ff604087205460f01c161561254057816122e38287876117af60409683839951166132c8565b848852600b845282882091612372835498600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8b161785558a6003828616968715612526575b019184169a828c6fffffffffffffffffffffffffffffffff198195541617905560016001600160a01b0380921698899360058c52600b8483832054169c5220015416614160565b33840361243d57908891853b6123d0575b5050507f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd260406000805160206146008339815191529786935b825191825288820152a4604051908152a180f35b853b1561081f576040516372eba20360e01b8152600481018890526001600160a01b03861660248201526001600160801b03918216604482015291166064820152818160848183895af1612425575b80612383565b61242e90612b4f565b61243957863861241f565b8680fd5b83989792983b612485575b50507f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd26040859260008051602061460083398151915298996123bc565b833b15612522576040516372eba20360e01b8152600481018790526001600160a01b03861660248201526001600160801b03918216604482015291166064820152868160848183875af16124da575b80612448565b60408592600080516020614600833981519152986125187f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd294612b4f565b98509250506124d4565b8780fd5b60018101600160c81b60ff60c81b1982541617905561232b565b602483604051906339c6dc7360e21b82526004820152fd5b602483604051906322cad1af60e11b82526004820152fd5b50818352600581526001600160a01b0360408420541633141561227b565b6024826040519063fe19f19f60e01b82526004820152fd5b5034610423576020366003190112610423576001600160801b0360406020926001600160a01b036125d5612abd565b16815260028452205416604051908152f35b503461042357610a6b6125f936612ae9565b9161260c6126078433612ddd565b612cd6565b612ebc565b50346104235780600319360112610423576020600954604051908152f35b503461042357602036600319011261042357600435808252600b60205260ff600160408420015460d01c16156104c7576126689061356d565b90600582101561138c5760208215838115612689575b506040519015158152f35b60019150148261267e565b50346104235760203660031901126104235760043590818152600b60205260ff600160408320015460d01c16156108d357602091604082828152600b85522060ff815460f01c1680612722575b6126f9575b50506001600160801b0360405191168152f35b61271b92506001600160801b0360026127159201541691613328565b906132c8565b38806126e6565b5060ff600182015460c81c16156126e1565b50346104235760403660031901126104235761274e612abd565b602435906001600160a01b03808061276585612c74565b1692169180831461285957803314908115612838575b50156127ce57828452600760205260408420826001600160a01b03198254161790556127a683612c74565b167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258480a480f35b608460405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152fd5b9050845260086020526040842033855260205260ff6040852054163861277b565b608460405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152fd5b5034610423576020366003190112610423576020611f3e600435612c99565b5034610423578060031936011261042357604051908060035491600183811c9281851694851561299a575b60209586861081146112a15785885287949392918790821561127f57505060011461294057505061121192500383612bd5565b90859250600382527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b85831061298257505061121193508201013880611203565b8054838901850152879450869390920191810161296a565b93607f169361290d565b90503461081b57602036600319011261081b576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361081f57602092507f80ac58cd000000000000000000000000000000000000000000000000000000008114908115612a4b575b8115612a21575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501438612a1a565b7f5b5e139f0000000000000000000000000000000000000000000000000000000081149150612a13565b60005b838110612a885750506000910152565b8181015183820152602001612a78565b90602091612ab181518092818552858086019101612a75565b601f01601f1916010190565b600435906001600160a01b0382168203610c2757565b602435906001600160a01b0382168203610c2757565b6060906003190112610c27576001600160a01b03906004358281168103610c2757916024359081168103610c27579060443590565b9181601f84011215610c275782359167ffffffffffffffff8311610c27576020808501948460051b010111610c2757565b67ffffffffffffffff81116121cd57604052565b610160810190811067ffffffffffffffff8211176121cd57604052565b610100810190811067ffffffffffffffff8211176121cd57604052565b6060810190811067ffffffffffffffff8211176121cd57604052565b6040810190811067ffffffffffffffff8211176121cd57604052565b90601f8019910116810190811067ffffffffffffffff8211176121cd57604052565b67ffffffffffffffff81116121cd57601f01601f191660200190565b604435906001600160801b0382168203610c2757565b15612c3057565b606460405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152fd5b60005260056020526001600160a01b0360406000205416612c96811515612c29565b90565b612cbc61072a8260005260056020526001600160a01b0360406000205416151590565b60005260076020526001600160a01b036040600020541690565b15612cdd57565b608460405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f766564000000000000000000000000000000000000006064820152fd5b90612d6b939291612d5b6126078433612ddd565b612d66838383612ebc565b613075565b15612d7257565b60405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b906001600160a01b038080612df184612c74565b16931691838314938415612e24575b508315612e0e575b50505090565b612e1a91929350612c99565b1614388080612e08565b909350600052600860205260406000208260005260205260ff604060002054169238612e00565b15612e5257565b608460405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152fd5b90612ee59291612ecb83612c74565b916001600160a01b03948593848094169687911614612e4b565b1690811580612fdc57612ef78461325a565b159081612fd3575b5080612fca575b612fb25791808492612f3460008051602061460083398151915296602096612f2d85612c74565b1614612e4b565b60009382855260078652604085206001600160a01b031990818154169055818652600687526040862060001981540190558286526040862060018154019055838652600587528260408720918254161790557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6040519580a48152a1565b602483604051906378630aa960e01b82526004820152fd5b50831515612f06565b90501538612eff565b608460405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152fd5b3d15613070573d9061305682612bf7565b916130646040519384612bd5565b82523d6000602084013e565b606090565b9290803b156131fe576130df916020916001600160a01b0394604051809581948293897f150b7a02000000000000000000000000000000000000000000000000000000009b8c86523360048701521660248501526044840152608060648401526084830190612a98565b03916000968791165af19082908261319e575b505061317857613100613045565b805190816131735760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000161490565b909192506020813d82116131f6575b816131ba60209383612bd5565b8101031261081b5751907fffffffff000000000000000000000000000000000000000000000000000000008216820361042357509038806130f2565b3d91506131ad565b50505050600190565b6040519061321482612b9d565b60006040838281528260208201520152565b9060405161323381612b9d565b6040819360018154916001600160801b0392838116865260801c6020860152015416910152565b80600052600b60205260ff60016040600020015460d01c16156104c757600052600b60205260ff60016040600020015460d81c1690565b80600052600b60205260ff60016040600020015460d01c16156104c757600052600b60205260ff60016040600020015460c81c1690565b6001600160801b0391821690821603919082116132e157565b634e487b7160e01b600052601160045260246000fd5b80600052600b60205260ff60016040600020015460d01c16156104c757600052600b60205260406000205460f81c90565b600090808252600b6020526040822091825464ffffffffff42818360c81c16116133d65780600186015460a01c1691824210156133c0576133759394955060a01c168091039042036133de565b90828152600b6020526001600160801b039261339b8460026040852001541680946134be565b9283116133a85750501690565b60029350604092508152600b60205220015460801c90565b505050505060026001600160801b039101541690565b505091505090565b670de0b6b3a764000091600019838309928083029283808610950394808603951461349a578285101561345e57908291096001821901821680920460028082600302188083028203028083028203028083028203028083028203028083028203028092029003029360018380600003040190848311900302920304170290565b82606492604051927f63a05778000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b5050809250156134a8570490565b634e487b7160e01b600052601260045260246000fd5b9091906000198382098382029182808310920391808303921461355c57670de0b6b3a7640000908183101561352557947faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066994950990828211900360ee1b910360121c170290565b60449086604051917f5173648d00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050670de0b6b3a764000090049150565b80600052600b602052604060002060ff600182015460c81c16600014613594575050600490565b805460f81c6135ed575460a01c64ffffffffff1642106135e7576135b781613328565b90600052600b6020526001600160801b0380600260406000200154169116106000146135e257600190565b600290565b50600090565b5050600390565b80600052600b60205261360d6002604060002001613226565b81600052600b602052604060002060ff600182015460c81c1660001461364057506001600160801b039150602001511690565b5460f81c6136525750612c9690613328565b612c9691506001600160801b0360408183511692015116906132c8565b906001600160a01b036001541660206001600160a01b036060850151166024604051809481937fdcf844a700000000000000000000000000000000000000000000000000000000835260048301525afa8015613e9b57600090613e67575b6136f091506001600160801b0360408501511690602060e08601510151916144c0565b916001600160801b0383511660c08201519015613e3d5764ffffffffff815116602082019064ffffffffff82511690818111613dfd57505064ffffffffff604091511691019064ffffffffff8251169081811015613dbd57505064ffffffffff8042169151169081811015613d7d575050600954926001600160801b038151166040519061377d82612b9d565b815260006020820152600060408201526001600160a01b036060840151169060c08401519164ffffffffff6020840151169064ffffffffff604085015116906080870151151560a088015115159364ffffffffff6001600160a01b038a5116975116604051976137ec89612b63565b88526020880152604087015260608601526000608086015260a085015260c0840152600060e0840152600161010084015261012083015261014082015284600052600b60205260406000206001600160a01b038251166001600160a01b031982541617815561388364ffffffffff602084015116829064ffffffffff60a01b1964ffffffffff60a01b83549260a01b169116179055565b604082015181547eff0000000000000000000000000000000000000000000000000000000000006060850151151560f01b169078ffffffffffffffffffffffffffffffffffffffffffffffffff7dffffffffff000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000006080880151151560f81b169460c81b1691161717178155600181016001600160a01b0360a0840151166001600160a01b031982541617815561397a64ffffffffff60c085015116829064ffffffffff60a01b1964ffffffffff60a01b83549260a01b169116179055565b60e083015181546101008501516101208601517fffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff90921692151560c81b79ff00000000000000000000000000000000000000000000000000169290921791151560d01b7aff0000000000000000000000000000000000000000000000000000169190911790151560d81b7bff00000000000000000000000000000000000000000000000000000016179055610140909101518051602082015160801b6fffffffffffffffffffffffffffffffff199081166001600160801b03928316176002850155926040906003019201511682825416179055600185016009556001600160a01b0360608401511660005260026020526001600160801b0380604060002054168160208501511601166001600160a01b036060850151166000526040600020918254161790556001600160a01b036020830151168015613d3957613afe613af88660005260056020526001600160a01b0360406000205416151590565b15614021565b613b078561325a565b1580613d30575b80613d28575b613d1057602060008051602061460083398151915291613b4d613af88860005260056020526001600160a01b0360406000205416151590565b806000526006825260406000206001815401905586600052600582526040600020816001600160a01b0319825416179055866040519160007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4868152a1613bdd6001600160a01b036060840151166001600160801b03808451168160208601511601169030903390613ea7565b6001600160801b0360408201511680613ce1575b506001600160a01b038251167f075861cbceafeb777e8f15f357121b08f6f3adba387d599bb7b5278ca6192df5610160866001600160a01b0360208701511694613cd86001600160a01b03606089015116976080810151151560a0820151151590613ca26001600160a01b0360e060c08601519501515116956040519788523360208901526040880190604090816001600160801b0391828151168552826020820151166020860152015116910152565b60a086015260c0850152805164ffffffffff90811660e08601526020820151811661010086015260409091015116610120840152565b610140820152a4565b613d0a906001600160a01b036060850151166001600160a01b0360e08601515116903390613ea7565b38613bf1565b602485604051906378630aa960e01b82526004820152fd5b506000613b14565b50801515613b0e565b606460405162461bcd60e51b815260206004820152602060248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152fd5b6040517f210aec0e00000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b6040517f9fee269100000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b6040517f4c23297000000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b60046040517f6095d3bc000000000000000000000000000000000000000000000000000000008152fd5b6020823d602011613e93575b81613e8060209383612bd5565b8101031261042357506136f090516136cd565b3d9150613e73565b6040513d6000823e3d90fd5b9290604051927f23b872dd0000000000000000000000000000000000000000000000000000000060208501526001600160a01b03809216602485015216604483015260648201526064815260a081019181831067ffffffffffffffff8411176121cd57613f1692604052613f18565b565b6001600160a01b031690613f78604051613f3181612bb9565b6020938482527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564858301526000808587829751910182855af1613f72613045565b9161406c565b805191821591848315613ffd575b505050905015613f935750565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b91938180945001031261081b57820151908115158203610423575080388084613f86565b1561402857565b606460405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152fd5b919290156140cd5750815115614080575090565b3b156140895790565b606460405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b8251909150156140e05750805190602001fd5b6103f79060405191829162461bcd60e51b8352602060048401526024830190612a98565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361413657565b60046040517fa1c0d6e5000000000000000000000000000000000000000000000000000000008152fd5b916001600160a01b03604051927fa9059cbb000000000000000000000000000000000000000000000000000000006020850152166024830152604482015260448152608081019181831067ffffffffffffffff8411176121cd57613f1692604052613f18565b612c96906141d3816135f4565b90600052600b60205260026040600020015460801c906132c8565b91908110156141fe5760051b0190565b634e487b7160e01b600052603260045260246000fd5b9190916001600160801b03808094169116019182116132e157565b929190926001600160801b0380614245836141c6565b16928181169380851161441a5750600095838752602092600b84526142b86142786040946002868c20015460801c614214565b868a52600b86526142b36002868c20019182906001600160801b036fffffffffffffffffffffffffffffffff1983549260801b169116179055565b613226565b906142d38186840151169282868183511692015116906132c8565b1611156143eb575b838752600b83526001600160a01b03916142fe8683856001858d20015416614160565b8488526005845282818920541680331415806143e1575b61434a575b507ffa54f9f9bdcdd28778cbb9f78490df6691cc4e2729588e10f4cc0a26c465686a9495969750519586521693a3565b803b156143dd5797807ffa54f9f9bdcdd28778cbb9f78490df6691cc4e2729588e10f4cc0a26c465686a9697989960848451809481937f13375c3b0000000000000000000000000000000000000000000000000000000083528c600484015233602484015289891660448401528d60648401525af16143ce575b889796955061431a565b6143d790612b4f565b386143c4565b8880fd5b50803b1515614315565b838752600b835281872060018101600160c81b60ff60c81b1982541617905560ff60f01b1981541690556142db565b8360649186604051927fa1fb2bbc000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b60009080825260056020526001600160a01b03806040842054169283331493841561449c575b5050821561448a57505090565b9091506144973392612c99565b161490565b60ff929450906040918152600860205281812033825260205220541691388061447d565b9092916144cb613207565b936001600160801b03928381169182156145d75767016345785d8a00008082116145a0578085116145695750614515856145068193866134be565b169460208901958652846134be565b16918461452c604089019480865282875116614214565b1610156145535761454584918261454e955116906132c8565b915116906132c8565b168252565b634e487b7160e01b600052600160045260246000fd5b84604491604051917f4fea5c1a00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b60449250604051917f47152d6700000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b505050505090506040516145ea81612b9d565b6000815260006020820152600060408201529056fef8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7"; + hex"60a034620003e757601f196001600160401b03601f62004e4e3881900382810185168601919084831187841017620003ec57808792606094604052833981010312620003e75783516001600160a01b03928382169291839003620003e7576020918287015196858816809803620003e75760400151948516809503620003e7576200008962000402565b90601c82527f5361626c696572205632204c6f636b7570204c696e656172204e46540000000084830152620000bd62000402565b601181527029a0a116ab1916a627a1a5aaa816a624a760791b8582015230608052600080546001600160a01b031990811688178255600180548216909b178b5596817fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a38351858111620003d35760039485548c81811c91168015620003c8575b89821014620003b45790818684931162000361575b508890868311600114620002f8578492620002ec575b505060001982871b1c1916908b1b1784555b8151948511620002d8576004958654998b8b811c9b168015620002cd575b828c1014620002ba57848b1162000271575b869798999a50819487116001146200020a57505093620001fe575b505082871b92600019911b1c19161790555b600a541617600a55600955604051614a2b9081620004238239608051816147410152f35b015191503880620001c8565b8883528183208c9890969594939116915b8282106200025757505085116200023c575b50505050811b019055620001da565b01519060f884600019921b161c19169055388080806200022d565b8484015187558c989096019593840193908101906200021b565b87835281832085880160051c81019b838910620002af575b860160051c019a8c905b8c8110620002a3575050620001ad565b848155018c9062000293565b909b508b9062000289565b634e487b7160e01b835260228852602483fd5b9a607f169a6200019b565b634e487b7160e01b81526041600452602490fd5b0151905038806200016b565b908c8e9416918886528a862092865b8c82821062000341575050841162000328575b505050811b0184556200017d565b015160001983891b60f8161c191690553880806200031a565b91929395968291958786015181550195019301908f959493929162000307565b9091508684528884208680850160051c8201928b8610620003aa575b918f91869594930160051c01915b8281106200039b57505062000155565b8681558594508f91016200038b565b925081926200037d565b634e487b7160e01b84526022600452602484fd5b90607f169062000140565b634e487b7160e01b82526041600452602482fd5b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620003ec5760405256fe608080604052600436101561001357600080fd5b600090813560e01c90816301ffc9a714612fe05750806306fdde0314612f1e578063081812fc14612eff578063095ea7b314612d705780631400ecec14612cd05780631c1cdd4c14612c6b5780631e99d56914612c4d57806323b872dd14612c2357806339a73c0314612be257806340e58ee514612847578063425d30dd1461282857806342842e0e146127d857806342966c68146126805780634857501f146125f65780634869e12d146125bb5780635fe3b567146125945780636352211e146125645780636d0cee751461250e57806370a082311461246557806375829def146123d2578063780a82c8146123825780637cad6cd1146122b15780637de6b1db146120a25780638659c27014611cb7578063894e9a0d14611a635780638bad38dd146119e65780638f69b9931461194a5780639067b677146118f757806395d89b41146117ea57806396ce1431146116cb578063a22cb465146115fa578063a2ffb89714611201578063a6202bf214611104578063a80fc071146110b2578063ab167ccc14610f79578063ad35efd414610f17578063b256456914610ef8578063b88d4fde14610e67578063b8a3be6614610e32578063b971302a14610de3578063bc063e1a14610dc0578063bc2be1be14610d70578063c156a11d146109d3578063c87b56dd14610899578063cc364f48146107eb578063d4dbd20b14610799578063d511609f1461074d578063d975dfed14610701578063e985e9c5146106ac578063ea5ead1914610685578063eac8f5b81461061c578063f590c176146105f3578063f851a440146105cd5763fdd46d601461027357600080fd5b346105ca5760603660031901126105ca5760043561028f61310f565b9061029861324f565b906102a1614737565b6102aa816138cd565b6105b2576102ce81600052600b6020526001600160a01b0360406000205416331490565b15806105a2575b61057e576102f981600052600b6020526001600160a01b0360406000205416331490565b8061055c575b61052f576001600160a01b03808416908115610505576001600160801b03948585169586156104ed5780610332866147f9565b168088116104c95750868893926103d59287865261039b61036360209a600b8c52600260408a20015460801c614847565b898852600b8b52610396600260408a20019182906001600160801b036001600160801b031983549260801b169116179055565b613862565b906103b7818b8401511692826040818351169201511690613904565b161115610499575b868552600b885283600160408720015416614793565b83825260058552604082205416803314158061048f575b610437575b5050817ffa54f9f9bdcdd28778cbb9f78490df6691cc4e2729588e10f4cc0a26c465686a84600080516020614a0b83398151915296604051908152a3604051908152a180f35b803b1561048b578180916084604051809481936313375c3b60e01b83528960048401523360248401528860448401528b60648401525af1156103f15761047c9061318b565b6104875784386103f1565b8480fd5b5080fd5b50803b15156103ec565b868552600b88526040852060018101600160c81b60ff60c81b1982541617905560ff60f01b1981541690556103bf565b85606491896040519263287ecaef60e21b8452600484015260248301526044820152fd5b6024856040519063d2aabcd960e01b82526004820152fd5b60046040517fc61a0e9e000000000000000000000000000000000000000000000000000000008152fd5b6064906001600160a01b038460405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b5080845260056020526001600160a01b038060408620541690841614156102ff565b60405163216caf0d60e01b81526004810191909152336024820152604490fd5b0390fd5b506105ac81614862565b156102d5565b60249060405190634a5541ef60e01b82526004820152fd5b80fd5b50346105ca57806003193601126105ca576001600160a01b036020915416604051908152f35b50346105ca5760203660031901126105ca576020610612600435613933565b6040519015158152f35b50346105ca5760203660031901126105ca57600435808252600b60205260ff600160408420015460d01c161561066e5760016040836001600160a01b039360209552600b855220015416604051908152f35b6024906040519062b8e7e760e51b82526004820152fd5b50346105ca5760403660031901126105ca576004356106a261310f565b90610298816147f9565b50346105ca5760403660031901126105ca576106c66130f9565b60406106d061310f565b926001600160a01b0380931681526008602052209116600052602052602060ff604060002054166040519015158152f35b50346105ca5760203660031901126105ca5760ff6001604060043593848152600b60205220015460d01c161561066e5761073c6020916147f9565b6001600160801b0360405191168152f35b50346105ca5760203660031901126105ca57600435808252600b60205260ff600160408420015460d01c161561066e5760408260029260209452600b845220015460801c604051908152f35b50346105ca5760203660031901126105ca57600435808252600b60205260ff600160408420015460d01c161561066e5760036040836001600160801b039360209552600b855220015416604051908152f35b50346105ca5760203660031901126105ca57600435610808613843565b50808252600b60205260ff600160408420015460d01c161561066e578160409160609352600b60205220600181549164ffffffffff918291015460a01c169060405192610854846131d9565b818160a01c16845260c81c166020830152604082015261089760405180926040908164ffffffffff91828151168552826020820151166020860152015116910152565bf35b50346105ca5760208060031936011261048b576004356108d76108d28260005260056020526001600160a01b0360406000205416151590565b613265565b826001600160a01b03600a5416916044604051809481937fe9dc637500000000000000000000000000000000000000000000000000000000835230600484015260248301525afa9283156109c7578093610946575b50506109426040519282849384528301906130d4565b0390f35b909192503d8082843e6109598184613211565b820191838184031261048b5780519067ffffffffffffffff82116109c3570182601f8201121561048b5780519161098f83613233565b9361099d6040519586613211565b8385528584840101116105ca5750906109bb918480850191016130b1565b90388061092c565b8280fd5b604051903d90823e3d90fd5b50346105ca5760403660031901126105ca576004356109f061310f565b906109f9614737565b808352602090600b825260ff600160408620015460d01c161561066e57808452600582526001600160a01b038060408620541690813303610d5157610a3d836147f9565b906001600160801b038083169283158015610a7a575b89600080516020614a0b8339815191528989610a70818e8c6134f8565b604051908152a180f35b610a82614737565b610a8b876138cd565b610d3957610aaf87600052600b6020526001600160a01b0360406000205416331490565b1580610d29575b610d0a57610ada87600052600b6020526001600160a01b0360406000205416331490565b80610cf3575b610ccf57851561050557610cb75781610af8876147f9565b16808511610c93575090610b55610b228a9493888652600b8a52600260408720015460801c614847565b878552600b8952610396600260408720019182906001600160801b036001600160801b031983549260801b169116179055565b90610b7181898401511692826040818351169201511690613904565b161115610c63575b848252600b8652610b94838583600160408720015416614793565b848252600586526040822054168033141580610c59575b610c05575b5050600080516020614a0b8339815191529482610a7093857ffa54f9f9bdcdd28778cbb9f78490df6691cc4e2729588e10f4cc0a26c465686a888296604051908152a38686604051858152a192819638610a53565b803b1561048b578180916084604051809481936313375c3b60e01b83528a60048401523360248401528960448401528860648401525af115610bb057610c4a9061318b565b610c55578538610bb0565b8580fd5b50803b1515610bab565b848252600b86526040822060018101600160c81b60ff60c81b1982541617905560ff60f01b198154169055610b79565b86606491866040519263287ecaef60e21b8452600484015260248301526044820152fd5b6024866040519063d2aabcd960e01b82526004820152fd5b6064878760405191632dcbf6b960e11b835260048301523360248301526044820152fd5b50868a52600588528360408b205416861415610ae0565b60405163216caf0d60e01b815260048101889052336024820152604490fd5b50610d3387614862565b15610ab6565b60248760405190634a5541ef60e01b82526004820152fd5b60405163216caf0d60e01b815260048101849052336024820152604490fd5b50346105ca5760203660031901126105ca57600435808252600b60205260ff600160408420015460d01c161561066e5760408264ffffffffff9260209452600b8452205460a01c16604051908152f35b50346105ca57806003193601126105ca57602060405167016345785d8a00008152f35b50346105ca5760203660031901126105ca57600435808252600b60205260ff600160408420015460d01c161561066e576040826001600160a01b039260209452600b8452205416604051908152f35b50346105ca5760203660031901126105ca5760ff600160406020936004358152600b855220015460d01c166040519015158152f35b50346105ca5760803660031901126105ca57610e816130f9565b610e8961310f565b906064359067ffffffffffffffff8211610ef45736602383011215610ef45781600401359284610eb885613233565b93610ec66040519586613211565b858552366024878301011161048b5785610ef196602460209301838801378501015260443591613383565b80f35b8380fd5b50346105ca5760203660031901126105ca576020610612600435613896565b50346105ca5760203660031901126105ca57600435808252600b60205260ff600160408420015460d01c161561066e57610f5090613ba9565b604051906005811015610f6557602092508152f35b602483634e487b7160e01b81526021600452fd5b50346105ca576101403660031901126105ca57610f94614737565b610f9c613843565b9064ffffffffff80421680845260c43582811681036110ad5781018216602085015260e4359081831682036110ad5701166040830152606435916001600160a01b03918284168094036105ca57506084358015158091036110ad5760a435908115158092036110ad57602435948486168096036110ad57600435958587168097036110ad57604435906001600160801b0382168092036110ad5760405197611043896131bc565b8852602088015260408701526060860152608085015260a084015260c08301526040610103193601126110ad576040519161107d836131f5565b6101043591821682036110ad57826110a59260209452610124358482015260e0820152613cab565b604051908152f35b600080fd5b50346105ca5760203660031901126105ca57600435808252600b60205260ff600160408420015460d01c161561066e5760026040836001600160801b039360209552600b855220015416604051908152f35b50346105ca5760203660031901126105ca5761111e6130f9565b6001600160a01b03808354163381036111d8575081169081835260026020526001600160801b036040842054169081156111a75781611178918486526002602052604086206001600160801b031981541690553390614793565b6040519081527fca7a4a65a94ed2f37538814e00e1cd4c41a78261561e3f3794592f11409cf5af60203392a380f35b602483604051907f8410168c0000000000000000000000000000000000000000000000000000000082526004820152fd5b6040516331b339a960e21b81526001600160a01b03919091166004820152336024820152604490fd5b50346105ca5760603660031901126105ca5767ffffffffffffffff6004358181116109c35761123490369060040161315a565b9161123d61310f565b906044359081116104875761125690369060040161315a565b9093611260614737565b8181036115c457855b818110611274578680f35b61127f818387614821565b359061128c818589614821565b35916001600160801b03831683036110ad576112a6614737565b6112af816138cd565b6105b2576112d381600052600b6020526001600160a01b0360406000205416331490565b15806115b4575b61057e576112fe81600052600b6020526001600160a01b0360406000205416331490565b8061158c575b61155f576001600160a01b03861615610505576001600160801b03831615611547576001600160801b03611337826147f9565b16806001600160801b0385161161151a5750808952600b8060205261139b8a6103966002604061136f8983838720015460801c614847565b938781528660205220019182906001600160801b036001600160801b031983549260801b169116179055565b6001600160801b036113bf8160208401511692826040818351169201511690613904565b1611156114ea575b818a526020526113f289876001600160a01b03600160406001600160801b0389169420015416614793565b8089526005602052886001600160a01b0360408220541680331415806114e0575b61147a575b50506020600080516020614a0b833981519152916001946001600160801b0360405191168152817ffa54f9f9bdcdd28778cbb9f78490df6691cc4e2729588e10f4cc0a26c465686a846001600160a01b038c1693a3604051908152a101611269565b803b1561048b57816001600160a01b0360848a8360405195869485936313375c3b60e01b85528a60048601523360248601521660448401526001600160801b038b1660648401525af115611418576114d19061318b565b6114dc578838611418565b8880fd5b50803b1515611413565b818a528060205260408a2060018101600160c81b60ff60c81b1982541617905560ff60f01b1981541690556113c7565b606492506001600160801b03846040519363287ecaef60e21b855260048501521660248301526044820152fd5b6024906040519063d2aabcd960e01b82526004820152fd5b6064906001600160a01b038760405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b5080895260056020526001600160a01b0360408a2054166001600160a01b0387161415611304565b506115be81614862565b156112da565b604491604051917faec9344000000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b50346105ca5760403660031901126105ca576116146130f9565b602435908115158092036110ad576001600160a01b0316908133146116875733835260086020526040832082600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a380f35b606460405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152fd5b50346105ca576101603660031901126105ca576116e6614737565b604051906116f3826131bc565b6116fb6130f9565b825261170561310f565b602083015261171261324f565b60408301526001600160a01b039060643582811681036110ad57606084015260843580151581036110ad57608084015260a43580151581036110ad5760a084015260603660c31901126105ca575060405161176c816131d9565b64ffffffffff60c43581811681036110ad57825260e43581811681036110ad5760208301526101043590811681036110ad57604082015260c08301526040610123193601126110ad57604051916117c2836131f5565b6101243591821682036110ad57826110a59260209452610144358482015260e0820152613cab565b50346105ca57806003193601126105ca57604051908060045491600183811c928185169485156118ed575b60209586861081146118d9578588528794939291879082156118b757505060011461185d575b505061184992500383613211565b6109426040519282849384528301906130d4565b90859250600482527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5b85831061189f5750506118499350820101388061183b565b80548389018501528794508693909201918101611887565b925093505061184994915060ff191682840152151560051b820101388061183b565b602483634e487b7160e01b81526022600452fd5b93607f1693611815565b50346105ca5760203660031901126105ca57600435808252600b60205260ff600160408420015460d01c161561066e57600160408364ffffffffff9360209552600b855220015460a01c16604051908152f35b50346105ca5760203660031901126105ca57600435808252600b60205260ff600160408420015460d01c161561066e5761198390613ba9565b90600582101590816119c457600283149182156119d8575b82156119af575b6020836040519015158152f35b9091506119c4575060046020911438806119a2565b80634e487b7160e01b602492526021600452fd5b50600383149150600061199b565b50346105ca5760203660031901126105ca576004356001600160a01b03908181168091036109c357818354163381036111d8575060015491816001600160a01b03198416176001556040519216825260208201527fdcb09aef4bf01068924ccce937981cbe59d25ba08380cf941aaaea4e4bd3960d60403392a280f35b50346105ca5760203660031901126105ca57604051611a818161319f565b8181528160208201528160408201528160608201528160808201528160a08201528160c08201528160e08201528161010082015281610120820152610140611ac7613843565b9101526004358152600b60205260ff600160408320015460d01c1615611c9f576004358152600b60205260408120611ba0600260405192611b078461319f565b80546001600160a01b038116855264ffffffffff8160a01c16602086015264ffffffffff8160c81c16604086015260ff8160f01c161515606086015260f81c1515608085015260ff60018201546001600160a01b03811660a087015264ffffffffff8160a01c1660c0870152818160c81c16151560e0870152818160d01c16151561010087015260d81c16151561012085015201613862565b610140820152611bb1600435613ba9565b6005811015610f65579160026101a09314611c94575b50610897610140604051926001600160a01b03815116845264ffffffffff602082015116602085015264ffffffffff60408201511660408501526060810151151560608501526080810151151560808501526001600160a01b0360a08201511660a085015264ffffffffff60c08201511660c085015260e0810151151560e0850152610100810151151561010085015261012081015115156101208501520151610140830190604090816001600160801b0391828151168552826020820151166020860152015116910152565b606082015238611bc7565b602460405162b8e7e760e51b81526004356004820152fd5b50346105ca57602090816003193601126105ca5760043567ffffffffffffffff811161048b57611cec8391369060040161315a565b90611cf5614737565b83915b808310611d03578480f35b611d1283828497959697614821565b3593611d1c614737565b611d25856138cd565b15611d425760248560405190634a5541ef60e01b82526004820152fd5b90919293611d4f81613933565b61208a57611d7381600052600b6020526001600160a01b0360406000205416331490565b158061206c575b61057e57611d8781613964565b818652600b90818852611d9f60026040892001613862565b6001600160801b039182825116838216101561205457848952838a5260ff60408a205460f01c161561203c57928282611df186838e611de78f9a829a60409e9d9a5116613904565b9401511690613904565b84875283865288872091611e77835494600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff87161785556003818516958615612022575b0190831699818b6001600160801b0319819454161790556001600160a01b0380971696879160058c52818f82205416998c5260019e8f9120015416614793565b338403611f6057843b611ed9575b50507f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd26040600080516020614a0b8339815191529786935b825191825288820152a4604051908152a1019190939293611cf8565b90919293809596503b15611f5c576040516372eba20360e01b8152600481018790526001600160a01b03851660248201526001600160801b039182166044820152911660648201528b94939291908b90818160848183895af115611e8557611f47919293959794965061318b565b611f5857918a939194928a8d611e85565b8980fd5b8b80fd5b833b611fa3575b50507f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd26040600080516020614a0b833981519152978693611ebd565b90919280949596503b15611f5c576040516372eba20360e01b8152600481018790526001600160a01b03861660248201526001600160801b039182166044820152911660648201528b94939291908b90818160848183885af115611f6757612011919293959794965061318b565b611f5857918a939194928a8d611f67565b60018101600160c81b60ff60c81b19825416179055611e37565b602485604051906339c6dc7360e21b82526004820152fd5b602485604051906322cad1af60e11b82526004820152fd5b50808552600586526001600160a01b03604086205416331415611d7a565b6024906040519063fe19f19f60e01b82526004820152fd5b50346105ca5760208060031936011261048b57600435906120c1614737565b818352600b815260ff600160408520015460d01c161561229a576120e482613ba9565b6005811015612286576004810361210d5760248360405190634a5541ef60e01b82526004820152fd5b6003810361212d576024836040519063fe19f19f60e01b82526004820152fd5b60021461226e5761215482600052600b6020526001600160a01b0360406000205416331490565b1561224f57818352600b815260ff604084205460f01c161561223757818352600b81526040832060ff60f01b19815416905560058152826001600160a01b03604082205416803b6121e0575b5050604051600080516020614a0b83398151915292807f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f8680a28152a180f35b803b1561048b578180916024604051809481937f341a0bd90000000000000000000000000000000000000000000000000000000083528960048401525af1156121a05761222c9061318b565b6109c35782386121a0565b602482604051906339c6dc7360e21b82526004820152fd5b60405163216caf0d60e01b815260048101839052336024820152604490fd5b602482604051906322cad1af60e11b82526004820152fd5b602484634e487b7160e01b81526021600452fd5b6024826040519062b8e7e760e51b82526004820152fd5b50346105ca5760203660031901126105ca576004356001600160a01b03908181168091036109c357818354163381036111d85750600a5491816001600160a01b0319841617600a556040519216825260208201527fa2548bd4b805e907c1558a47b5858324fe8bb4a2e1ddfca647eecbf65610eebc60403392a2600954600019810190811161236e5760407f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c91815190600182526020820152a180f35b602482634e487b7160e01b81526011600452fd5b50346105ca5760203660031901126105ca57600435808252600b60205260ff600160408420015460d01c161561066e5760408264ffffffffff9260209452600b8452205460c81c16604051908152f35b50346105ca5760203660031901126105ca576123ec6130f9565b9080546001600160a01b038082169333850361243e576001600160a01b03199394501691829116178255337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808380a380f35b6040516331b339a960e21b81526001600160a01b0386166004820152336024820152604490fd5b50346105ca5760203660031901126105ca576001600160a01b036124876130f9565b1680156124a4578160409160209352600683522054604051908152f35b608460405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e657200000000000000000000000000000000000000000000006064820152fd5b50346105ca5760203660031901126105ca576001600160a01b0360406020926004356125536108d28260005260056020526001600160a01b0360406000205416151590565b815260058452205416604051908152f35b50346105ca5760203660031901126105ca5760206125836004356132b0565b6001600160a01b0360405191168152f35b50346105ca57806003193601126105ca5760206001600160a01b0360015416604051908152f35b50346105ca5760203660031901126105ca5760ff6001604060043593848152600b60205220015460d01c161561066e5761073c602091613c30565b50346105ca5760203660031901126105ca5760043590818152600b60205260ff600160408320015460d01c161561229a578061263183613ba9565b92600584101561266c57600260209403612652575b50506040519015158152f35b8152600b8352604090205460f01c60ff1690503880612646565b602482634e487b7160e01b81526021600452fd5b50346105ca5760203660031901126105ca5760043561269d614737565b6126a6816138cd565b156127a7576126b481614862565b1561057e576126c2816132b0565b6126cb82613896565b15908161279f575b8161278c575b50612774576020816126f9600080516020614a0b833981519152936132b0565b90808552600783526001600160a01b0360408620926001600160a01b03199384815416905516918286526006845260408620600019815401905581865260058452604086209081541690558085604051937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a48152a180f35b602490604051906378630aa960e01b82526004820152fd5b6001600160a01b039150161515386126d9565b8391506126d3565b602490604051907f817cd6390000000000000000000000000000000000000000000000000000000082526004820152fd5b50346105ca576127e736613125565b60405191602083019383851067ffffffffffffffff86111761281257610ef194604052858452613383565b634e487b7160e01b600052604160045260246000fd5b50346105ca5760203660031901126105ca5760206106126004356138cd565b50346105ca5760208060031936011261048b5760043590612866614737565b61286f826138cd565b1561288c5760248260405190634a5541ef60e01b82526004820152fd5b61289582613933565b612bca576128b982600052600b6020526001600160a01b0360406000205416331490565b1580612bac575b61224f576128cd82613964565b91808452600b82526128e460026040862001613862565b6001600160801b0393848251168582161015612b9457828652600b845260ff604087205460f01c1615612b7c5781612928828787611de76040968383995116613904565b848852600b8452828820916129ae835498600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8b161785558a6003828616968715612b62575b019184169a828c6001600160801b03198195541617905560016001600160a01b0380921698899360058c52600b8483832054169c5220015416614793565b338403612a7957908891853b612a0c575b5050507f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd26040600080516020614a0b8339815191529786935b825191825288820152a4604051908152a180f35b853b156109c3576040516372eba20360e01b8152600481018890526001600160a01b03861660248201526001600160801b03918216604482015291166064820152818160848183895af1612a61575b806129bf565b612a6a9061318b565b612a75578638612a5b565b8680fd5b83989792983b612ac1575b50507f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd260408592600080516020614a0b83398151915298996129f8565b833b15612b5e576040516372eba20360e01b8152600481018790526001600160a01b03861660248201526001600160801b03918216604482015291166064820152868160848183875af1612b16575b80612a84565b60408592600080516020614a0b83398151915298612b547f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd29461318b565b9850925050612b10565b8780fd5b60018101600160c81b60ff60c81b19825416179055612970565b602483604051906339c6dc7360e21b82526004820152fd5b602483604051906322cad1af60e11b82526004820152fd5b50818352600581526001600160a01b036040842054163314156128c0565b6024826040519063fe19f19f60e01b82526004820152fd5b50346105ca5760203660031901126105ca576001600160801b0360406020926001600160a01b03612c116130f9565b16815260028452205416604051908152f35b50346105ca57610ef1612c3536613125565b91612c48612c438433613419565b613312565b6134f8565b50346105ca57806003193601126105ca576020600954604051908152f35b50346105ca5760203660031901126105ca57600435808252600b60205260ff600160408420015460d01c161561066e57612ca490613ba9565b9060058210156119c45760208215838115612cc5575b506040519015158152f35b600191501482612cba565b50346105ca5760203660031901126105ca5760043590818152600b60205260ff600160408320015460d01c161561229a57602091604082828152600b85522060ff815460f01c1680612d5e575b612d35575b50506001600160801b0360405191168152f35b612d5792506001600160801b036002612d519201541691613964565b90613904565b3880612d22565b5060ff600182015460c81c1615612d1d565b50346105ca5760403660031901126105ca57612d8a6130f9565b602435906001600160a01b038080612da1856132b0565b16921691808314612e9557803314908115612e74575b5015612e0a57828452600760205260408420826001600160a01b0319825416179055612de2836132b0565b167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258480a480f35b608460405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152fd5b9050845260086020526040842033855260205260ff60408520541638612db7565b608460405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152fd5b50346105ca5760203660031901126105ca5760206125836004356132d5565b50346105ca57806003193601126105ca57604051908060035491600183811c92818516948515612fd6575b60209586861081146118d9578588528794939291879082156118b7575050600114612f7c57505061184992500383613211565b90859250600382527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b858310612fbe5750506118499350820101388061183b565b80548389018501528794508693909201918101612fa6565b93607f1693612f49565b90503461048b57602036600319011261048b576004357fffffffff0000000000000000000000000000000000000000000000000000000081168091036109c357602092507f80ac58cd000000000000000000000000000000000000000000000000000000008114908115613087575b811561305d575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501438613056565b7f5b5e139f000000000000000000000000000000000000000000000000000000008114915061304f565b60005b8381106130c45750506000910152565b81810151838201526020016130b4565b906020916130ed815180928185528580860191016130b1565b601f01601f1916010190565b600435906001600160a01b03821682036110ad57565b602435906001600160a01b03821682036110ad57565b60609060031901126110ad576001600160a01b039060043582811681036110ad579160243590811681036110ad579060443590565b9181601f840112156110ad5782359167ffffffffffffffff83116110ad576020808501948460051b0101116110ad57565b67ffffffffffffffff811161281257604052565b610160810190811067ffffffffffffffff82111761281257604052565b610100810190811067ffffffffffffffff82111761281257604052565b6060810190811067ffffffffffffffff82111761281257604052565b6040810190811067ffffffffffffffff82111761281257604052565b90601f8019910116810190811067ffffffffffffffff82111761281257604052565b67ffffffffffffffff811161281257601f01601f191660200190565b604435906001600160801b03821682036110ad57565b1561326c57565b606460405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152fd5b60005260056020526001600160a01b03604060002054166132d2811515613265565b90565b6132f86108d28260005260056020526001600160a01b0360406000205416151590565b60005260076020526001600160a01b036040600020541690565b1561331957565b608460405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f766564000000000000000000000000000000000000006064820152fd5b906133a7939291613397612c438433613419565b6133a28383836134f8565b6136b1565b156133ae57565b60405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b906001600160a01b03808061342d846132b0565b16931691838314938415613460575b50831561344a575b50505090565b613456919293506132d5565b1614388080613444565b909350600052600860205260406000208260005260205260ff60406000205416923861343c565b1561348e57565b608460405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152fd5b906135219291613507836132b0565b916001600160a01b03948593848094169687911614613487565b16908115806136185761353384613896565b15908161360f575b5080613606575b6135ee5791808492613570600080516020614a0b83398151915296602096613569856132b0565b1614613487565b60009382855260078652604085206001600160a01b031990818154169055818652600687526040862060001981540190558286526040862060018154019055838652600587528260408720918254161790557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6040519580a48152a1565b602483604051906378630aa960e01b82526004820152fd5b50831515613542565b9050153861353b565b608460405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152fd5b3d156136ac573d9061369282613233565b916136a06040519384613211565b82523d6000602084013e565b606090565b9290803b1561383a5761371b916020916001600160a01b0394604051809581948293897f150b7a02000000000000000000000000000000000000000000000000000000009b8c865233600487015216602485015260448401526080606484015260848301906130d4565b03916000968791165af1908290826137da575b50506137b45761373c613681565b805190816137af5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000161490565b909192506020813d8211613832575b816137f660209383613211565b8101031261048b5751907fffffffff00000000000000000000000000000000000000000000000000000000821682036105ca575090388061372e565b3d91506137e9565b50505050600190565b60405190613850826131d9565b60006040838281528260208201520152565b9060405161386f816131d9565b6040819360018154916001600160801b0392838116865260801c6020860152015416910152565b80600052600b60205260ff60016040600020015460d01c161561066e57600052600b60205260ff60016040600020015460d81c1690565b80600052600b60205260ff60016040600020015460d01c161561066e57600052600b60205260ff60016040600020015460c81c1690565b6001600160801b03918216908216039190821161391d57565b634e487b7160e01b600052601160045260246000fd5b80600052600b60205260ff60016040600020015460d01c161561066e57600052600b60205260406000205460f81c90565b600090808252600b6020526040822091825464ffffffffff42818360c81c1611613a125780600186015460a01c1691824210156139fc576139b19394955060a01c16809103904203613a1a565b90828152600b6020526001600160801b03926139d7846002604085200154168094613afa565b9283116139e45750501690565b60029350604092508152600b60205220015460801c90565b505050505060026001600160801b039101541690565b505091505090565b670de0b6b3a7640000916000198383099280830292838086109503948086039514613ad65782851015613a9a57908291096001821901821680920460028082600302188083028203028083028203028083028203028083028203028083028203028092029003029360018380600003040190848311900302920304170290565b82606492604051927f63a05778000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b505080925015613ae4570490565b634e487b7160e01b600052601260045260246000fd5b90919060001983820983820291828083109203918083039214613b9857670de0b6b3a76400009081831015613b6157947faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066994950990828211900360ee1b910360121c170290565b60449086604051917f5173648d00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050670de0b6b3a764000090049150565b80600052600b602052604060002060ff600182015460c81c16600014613bd0575050600490565b805460f81c613c29575460a01c64ffffffffff164210613c2357613bf381613964565b90600052600b6020526001600160801b038060026040600020015416911610600014613c1e57600190565b600290565b50600090565b5050600390565b80600052600b602052613c496002604060002001613862565b81600052600b602052604060002060ff600182015460c81c16600014613c7c57506001600160801b039150602001511690565b5460f81c613c8e57506132d290613964565b6132d291506001600160801b036040818351169201511690613904565b906001600160a01b036001541660206001600160a01b036060850151166024604051809481937fdcf844a700000000000000000000000000000000000000000000000000000000835260048301525afa80156144ce5760009061449a575b613d2c91506001600160801b0360408501511690602060e08601510151916148cb565b916001600160801b0383511660c082015190156144705764ffffffffff815116602082019064ffffffffff8251169081811161443057505064ffffffffff604091511691019064ffffffffff82511690818110156143f057505064ffffffffff80421691511690818110156143b0575050600954926001600160801b0381511660405190613db9826131d9565b815260006020820152600060408201526001600160a01b036060840151169060c08401519164ffffffffff6020840151169064ffffffffff604085015116906080870151151560a088015115159364ffffffffff6001600160a01b038a511697511660405197613e288961319f565b88526020880152604087015260608601526000608086015260a085015260c0840152600060e0840152600161010084015261012083015261014082015284600052600b60205260406000206001600160a01b038251166001600160a01b0319825416178155613ebf64ffffffffff602084015116829064ffffffffff60a01b1964ffffffffff60a01b83549260a01b169116179055565b604082015181547eff0000000000000000000000000000000000000000000000000000000000006060850151151560f01b169078ffffffffffffffffffffffffffffffffffffffffffffffffff7dffffffffff000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000006080880151151560f81b169460c81b1691161717178155600181016001600160a01b0360a0840151166001600160a01b0319825416178155613fb664ffffffffff60c085015116829064ffffffffff60a01b1964ffffffffff60a01b83549260a01b169116179055565b60e083015181546101008501516101208601517fffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff90921692151560c81b79ff00000000000000000000000000000000000000000000000000169290921791151560d01b7aff0000000000000000000000000000000000000000000000000000169190911790151560d81b7bff00000000000000000000000000000000000000000000000000000016179055610140909101518051602082015160801b6001600160801b03199081166001600160801b03928316176002850155926040906003019201511682825416179055600185016009556001600160a01b0360608401511660005260026020526001600160801b0380604060002054168160208501511601166001600160a01b036060850151166000526040600020918254161790556001600160a01b03602083015116801561436c5761413161412b8660005260056020526001600160a01b0360406000205416151590565b15614654565b61413a85613896565b1580614363575b8061435b575b614343576020600080516020614a0b8339815191529161418061412b8860005260056020526001600160a01b0360406000205416151590565b806000526006825260406000206001815401905586600052600582526040600020816001600160a01b0319825416179055866040519160007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4868152a16142106001600160a01b036060840151166001600160801b038084511681602086015116011690309033906144da565b6001600160801b0360408201511680614314575b506001600160a01b038251167f075861cbceafeb777e8f15f357121b08f6f3adba387d599bb7b5278ca6192df5610160866001600160a01b036020870151169461430b6001600160a01b03606089015116976080810151151560a08201511515906142d56001600160a01b0360e060c08601519501515116956040519788523360208901526040880190604090816001600160801b0391828151168552826020820151166020860152015116910152565b60a086015260c0850152805164ffffffffff90811660e08601526020820151811661010086015260409091015116610120840152565b610140820152a4565b61433d906001600160a01b036060850151166001600160a01b0360e086015151169033906144da565b38614224565b602485604051906378630aa960e01b82526004820152fd5b506000614147565b50801515614141565b606460405162461bcd60e51b815260206004820152602060248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152fd5b6040517f210aec0e00000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b6040517f9fee269100000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b6040517f4c23297000000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b60046040517f6095d3bc000000000000000000000000000000000000000000000000000000008152fd5b6020823d6020116144c6575b816144b360209383613211565b810103126105ca5750613d2c9051613d09565b3d91506144a6565b6040513d6000823e3d90fd5b9290604051927f23b872dd0000000000000000000000000000000000000000000000000000000060208501526001600160a01b03809216602485015216604483015260648201526064815260a081019181831067ffffffffffffffff841117612812576145499260405261454b565b565b6001600160a01b0316906145ab604051614564816131f5565b6020938482527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564858301526000808587829751910182855af16145a5613681565b9161469f565b805191821591848315614630575b5050509050156145c65750565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b91938180945001031261048b578201519081151582036105ca5750803880846145b9565b1561465b57565b606460405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152fd5b9192901561470057508151156146b3575090565b3b156146bc5790565b606460405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b8251909150156147135750805190602001fd5b61059e9060405191829162461bcd60e51b83526020600484015260248301906130d4565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361476957565b60046040517fa1c0d6e5000000000000000000000000000000000000000000000000000000008152fd5b916001600160a01b03604051927fa9059cbb000000000000000000000000000000000000000000000000000000006020850152166024830152604482015260448152608081019181831067ffffffffffffffff841117612812576145499260405261454b565b6132d29061480681613c30565b90600052600b60205260026040600020015460801c90613904565b91908110156148315760051b0190565b634e487b7160e01b600052603260045260246000fd5b9190916001600160801b038080941691160191821161391d57565b60009080825260056020526001600160a01b0380604084205416928333149384156148a7575b5050821561489557505090565b9091506148a233926132d5565b161490565b60ff9294509060409181526008602052818120338252602052205416913880614888565b9092916148d6613843565b936001600160801b03928381169182156149e25767016345785d8a00008082116149ab57808511614974575061492085614911819386613afa565b16946020890195865284613afa565b169184614937604089019480865282875116614847565b16101561495e5761495084918261495995511690613904565b91511690613904565b168252565b634e487b7160e01b600052600160045260246000fd5b84604491604051917f4fea5c1a00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b60449250604051917f47152d6700000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b505050505090506040516149f5816131d9565b6000815260006020820152600060408201529056fef8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7"; bytes public constant BYTECODE_NFT_DESCRIPTOR = hex"6080806040523461001757615dac90816200001d8239f35b600080fdfe6080604052600436101561001257600080fd5b60003560e01c63e9dc63751461002757600080fd5b346142f85760403660031901126142f8576001600160a01b0360043516600435036142f857610056608061486e565b60006080819052606060a081905260c082905260e0819052610120819052610140819052610160819052610180919091526101a0526004356001600160a01b03166101008190526100a690614c58565b61012052610100516040517feac8f5b80000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa908115614305576000916147dd575b506001600160a01b03610117911680608052615669565b60a052610100516040517fa80fc0710000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa8015614305576fffffffffffffffffffffffffffffffff916000916147be575b501660c052610100516040517fad35efd40000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa801561430557600090614781575b6101e59150615889565b61014052610100516040517f4869e12d0000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa90811561430557600091614752575b5060c0516fffffffffffffffffffffffffffffffff16801561473c576fffffffffffffffffffffffffffffffff612710819302160416610100608001526102876004356153c7565b610120608001526040514660208201526bffffffffffffffffffffffff1960043560601b16604082015260243560548201526054815280608081011067ffffffffffffffff60808301111761431157608081016040526020815191012061041a602963ffffffff61032e6103078261016861ffff8860101c160616614b08565b91601e604660ff6103248460146050848d60081c16060116614b08565b9816060116614b08565b6040519485927f68736c2800000000000000000000000000000000000000000000000000000000602085015261036e815180926020602488019101614826565b83017f2c0000000000000000000000000000000000000000000000000000000000000060248201526103aa825180936020602585019101614826565b017f252c00000000000000000000000000000000000000000000000000000000000060258201526103e5825180936020602785019101614826565b017f252900000000000000000000000000000000000000000000000000000000000060278201520360098101845201826148df565b6104526fffffffffffffffffffffffffffffffff6040608001511660ff61044b6001600160a01b03608051166155dc565b1690614e89565b6104666001600160a01b0360805116614c58565b60a051610100516040517fbc2be1be0000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa80156143055760249160009161471d575b5060206001600160a01b03608080015116604051938480927f9067b677000000000000000000000000000000000000000000000000000000008252823560048301525afa801561430557610528926000916146ee575b5064ffffffffff80911691166151d5565b61012051610180519092916105b2602161054f6064610548818706615744565b9504614b08565b6040519481610568879351809260208087019101614826565b820161057d8251809360208085019101614826565b017f250000000000000000000000000000000000000000000000000000000000000060208201520360018101855201836148df565b610100608001519260c060800151956101206080015197604051996105d68b61486e565b8a5260208a015260408901526060880152608087015260a086015260c085015260e0840152610100830152610120820152604051806101c081011067ffffffffffffffff6101c083011117614311576101c0810160405260608152600060208201526000604082015260608082015260006080820152606060a0820152600060c0820152600060e08201526060610100820152600061012082015260006101408201526060610160820152600061018082015260006101a082015260a08201516106a660c0840151845190615a7a565b906109b361015c604051926106ba846148c3565b600884527f50726f677265737300000000000000000000000000000000000000000000000060208501526107236040516106f38161488b565b60009052855160208701207fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4701490565b156146e6576090945b61073586614b08565b916040519586938493661e339034b21e9160c91b60208601526109818351958692610767846027840160208901614826565b6d11103334b6361e9111b33333111f60911b602785840101526c1e3932b1ba103bb4b23a341e9160991b603585840101526107ae8551809660206042888701019101614826565b7f22206865696768743d22313030222066696c6c2d6f7061636974793d222e3033828501860160428101919091527f222072783d223135222072793d22313522207374726f6b653d2223666666222060628201527f7374726f6b652d6f7061636974793d222e3122207374726f6b652d77696474686082820152651e911a11179f60d11b60a28201527f3c7465787420783d2232302220793d2233342220666f6e742d66616d696c793d60a88201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f7370616365222060c8820152703337b73a16b9b4bd329e911919383c111f60791b60e88201528651966108b491889160f990910190602001614826565b661e17ba32bc3a1f60c91b8285018601870160f98101919091527f3c7465787420783d2232302220793d2237322220666f6e742d66616d696c793d6101008201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f73706163652220610120820152703337b73a16b9b4bd329e91191b383c111f60791b61014082015287519761094f91899161015190910190602001614826565b661e17ba32bc3a1f60c91b6101518888888887010101010152602061015888888885519c8d9701010101019101614826565b631e17b39f60e11b90860190910190910190910190910161015881019190915281900361013c810190915201826148df565b6101008301526101208201526028610100830151604051906109d48261488b565b60008252610c7a61015c604051926109eb846148c3565b600684527f53746174757300000000000000000000000000000000000000000000000000006020850152610a1e84615cba565b610a2782615d37565b808211156146de5750945b610a3d878701614b08565b91604051958693661e339034b21e9160c91b60208601528151610a67816027880160208601614826565b85016d11103334b6361e9111b33333111f60911b60278201526c1e3932b1ba103bb4b23a341e9160991b6035820152610aaa825180936020604285019101614826565b017f22206865696768743d22313030222066696c6c2d6f7061636974793d222e303360428201527f222072783d223135222072793d22313522207374726f6b653d2223666666222060628201527f7374726f6b652d6f7061636974793d222e3122207374726f6b652d77696474686082820152651e911a11179f60d11b60a28201527f3c7465787420783d2232302220793d2233342220666f6e742d66616d696c793d60a88201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f7370616365222060c8820152703337b73a16b9b4bd329e911919383c111f60791b60e8820152610ba682518093602060f985019101614826565b01661e17ba32bc3a1f60c91b60f98201527f3c7465787420783d2232302220793d2237322220666f6e742d66616d696c793d6101008201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f73706163652220610120820152703337b73a16b9b4bd329e91191b383c111f60791b610140820152610c3582518093602061015185019101614826565b01661e17ba32bc3a1f60c91b610151820152610c5c82518093602061015885019101614826565b01631e17b39f60e11b6101588201520361013c8101845201826148df565b610160840152016101808201526028602083015160405190610c9b8261488b565b60008252610ce561015c60405192610cb2846148c3565b600684527f416d6f756e7400000000000000000000000000000000000000000000000000006020850152610a1e84615cba565b835201602082015261102060808301516030604051610d038161488b565b60008152610faa61015c60405194610d1a866148c3565b600886527f4475726174696f6e0000000000000000000000000000000000000000000000006020870152610d4d86615cba565b610d5682615d37565b808211156146d65750935b610d6d60288601614b08565b91604051978893661e339034b21e9160c91b60208601528151610d97816027880160208601614826565b85016d11103334b6361e9111b33333111f60911b60278201526c1e3932b1ba103bb4b23a341e9160991b6035820152610dda825180936020604285019101614826565b017f22206865696768743d22313030222066696c6c2d6f7061636974793d222e303360428201527f222072783d223135222072793d22313522207374726f6b653d2223666666222060628201527f7374726f6b652d6f7061636974793d222e3122207374726f6b652d77696474686082820152651e911a11179f60d11b60a28201527f3c7465787420783d2232302220793d2233342220666f6e742d66616d696c793d60a88201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f7370616365222060c8820152703337b73a16b9b4bd329e911919383c111f60791b60e8820152610ed682518093602060f985019101614826565b01661e17ba32bc3a1f60c91b60f98201527f3c7465787420783d2232302220793d2237322220666f6e742d66616d696c793d6101008201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f73706163652220610120820152703337b73a16b9b4bd329e91191b383c111f60791b610140820152610f6582518093602061015185019101614826565b01661e17ba32bc3a1f60c91b610151820152610f8c82518093602061015885019101614826565b01631e17b39f60e11b6101588201520361013c8101865201846148df565b8260a08601526028810160c0860152602085015190610120860151809161018088015192839185010101605881016080890152605719906103e8030160011c8061014089015201601081016101a088015201602081016040870152010160e0840152610100830151610160840151845191614e1f565b6060820152604051908161010081011067ffffffffffffffff6101008401111761431157610100820160405260c782527f3c726563742077696474683d223130302522206865696768743d22313030252260208301527f2066696c7465723d2275726c28234e6f69736529222f3e3c7265637420783d2260408301527f37302220793d223730222077696474683d2238363022206865696768743d223860608301527f3630222066696c6c3d2223666666222066696c6c2d6f7061636974793d222e3060808301527f33222072783d223435222072793d22343522207374726f6b653d22236666662260a08301527f207374726f6b652d6f7061636974793d222e3122207374726f6b652d7769647460c08301527f683d2234222f3e0000000000000000000000000000000000000000000000000060e083015282519161010084015191606081015194604051611176816148a7565b603381527f3c636972636c652069643d22476c6f772220723d22353030222066696c6c3d2260208201527f75726c282352616469616c476c6f7729222f3e000000000000000000000000006040820152604051966111d38861486e565b61011c88527f3c66696c7465722069643d224e6f697365223e3c6665466c6f6f6420783d223060208901527f2220793d2230222077696474683d223130302522206865696768743d2231303060408901527f252220666c6f6f642d636f6c6f723d2268736c283233302c3231252c3131252960608901527f2220666c6f6f642d6f7061636974793d22312220726573756c743d22666c6f6f60808901527f6446696c6c222f3e3c666554757262756c656e6365206261736546726571756560a08901527f6e63793d222e3422206e756d4f6374617665733d22332220726573756c743d2260c08901527f4e6f6973652220747970653d226672616374616c4e6f697365222f3e3c66654260e08901527f6c656e6420696e3d224e6f6973652220696e323d22666c6f6f6446696c6c22206101008901527f6d6f64653d22736f66742d6c69676874222f3e3c2f66696c7465723e0000000061012089015260405197886103a081011067ffffffffffffffff6103a08b011117614311576103a0890160405261037b89527f3c706174682069643d224c6f676f222066696c6c3d2223666666222066696c6c60208a01527f2d6f7061636974793d222e312220643d226d3133332e3535392c3132342e303360408a01527f34632d2e3031332c322e3431322d312e3035392c342e3834382d322e3932332c60608a01527f362e3430322d322e3535382c312e3831392d352e3136382c332e3433392d372e60808a01527f3838382c342e3939362d31342e34342c382e3236322d33312e3034372c31322e60a08a01527f3536352d34372e3637342c31322e3536392d382e3835382e3033362d31372e3860c08a01527f33382d312e3237322d32362e3332382d332e3636332d392e3830362d322e373660e08a01527f362d31392e3038372d372e3131332d32372e3536322d31322e3737382d31332e6101008a01527f3834322d382e3032352c392e3436382d32382e3630362c31362e3135332d33356101208a01527f2e323635683063322e3033352d312e3833382c342e3235322d332e3534362c366101408a01527f2e3436332d352e323234683063362e3432392d352e3635352c31362e3231382d6101608a01527f322e3833352c32302e3335382c342e31372c342e3134332c352e3035372c382e6101808a01527f3831362c392e3634392c31332e39322c31332e373334682e30333763352e37336101a08a01527f362c362e3436312c31352e3335372d322e3235332c392e33382d382e34382c306101c08a01527f2c302d332e3531352d332e3531352d332e3531352d332e3531352d31312e34396101e08a01527f2d31312e3437382d35322e3635362d35322e3636342d36342e3833372d36342e6102008a01527f3833376c2e3034392d2e303337632d312e3732352d312e3630362d322e3731396102208a01527f2d332e3834372d322e3735312d362e3230346830632d2e3034362d322e3337356102408a01527f2c312e3036322d342e3538322c322e3732362d362e32323968306c2e3138352d6102608a01527f2e3134386830632e3039392d2e3036322c2e3232322d2e3134382c2e33372d2e6102808a01527f323539683063322e30362d312e3336322c332e3935312d322e3632312c362e306102a08a01527f34342d332e3834324335372e3736332d332e3437332c39372e37362d322e33346102c08a01527f312c3132382e3633372c31382e3333326331362e3637312c392e3934362d32366102e08a01527f2e3334342c35342e3831332d33382e3635312c34302e3139392d362e3239392d6103008a01527f362e3039362d31382e3036332d31372e3734332d31392e3636382d31382e38316103208a01527f312d362e3031362d342e3034372d31332e3036312c342e3737362d372e3735326103408a01527f2c392e3735316c36382e3235342c36382e33373163312e3732342c312e3630316103608a01527f2c322e3731342c332e38342c322e3733382c362e3139325a222f3e00000000006103808a0152604051978860a081011067ffffffffffffffff60a08b01111761431157611cb1611d129160a08b0160405260758b527f3c706174682069643d22466c6f6174696e6754657874222066696c6c3d226e6f60208c01527f6e652220643d224d31323520343568373530733830203020383020383076373560408c01527f307330203830202d3830203830682d373530732d38302030202d3830202d383060608c01527f762d3735307330202d3830203830202d3830222f3e000000000000000000000060808c0152611868615a41565b906040517f3c72616469616c4772616469656e742069643d2252616469616c476c6f77223e6020820152611d0d60d87f3c73746f70206f66667365743d223025222073746f702d636f6c6f723d22000093846040850152805161199a60b88660208501936118da81605e840187614826565b8101997f222073746f702d6f7061636974793d222e36222f3e0000000000000000000000605e8c01527f3c73746f70206f66667365743d2231303025222073746f702d636f6c6f723d229a8b607382015261193f825180936020609385019101614826565b017f222073746f702d6f7061636974793d2230222f3e00000000000000000000000060938201527f3c2f72616469616c4772616469656e743e00000000000000000000000000000060a78201520360988101885201866148df565b6119a2615a41565b90604051967f3c6c696e6561724772616469656e742069643d2253616e64546f70222078313d60208901527f223025222079313d223025223e000000000000000000000000000000000000006040890152604d8801528251611a0881606b8a0184614826565b8701917f222f3e00000000000000000000000000000000000000000000000000000000009283606b82015289606e820152611a4d825180936020608e85019101614826565b019082608e830152611a9160a2897f3c2f6c696e6561724772616469656e743e0000000000000000000000000000009485609182015203608281018b5201896148df565b611bd7610108611a9f615a41565b6040519b8c917f3c6c696e6561724772616469656e742069643d2253616e64426f74746f6d222060208401527f78313d2231303025222079313d2231303025223e00000000000000000000000060408401527f3c73746f70206f66667365743d22313025222073746f702d636f6c6f723d22006054840152611b2b815180926020607387019101614826565b8201908760738301526076820152875190611b4a826096830188614826565b018660968201527f3c616e696d617465206174747269627574654e616d653d22783122206475723d60998201527f2236732220726570656174436f756e743d22696e646566696e6974652220766160b98201527f6c7565733d223330253b3630253b313230253b3630253b3330253b222f3e000060d98201528560f78201520360e881018c52018a6148df565b611bdf615a41565b906040519a8b957f3c6c696e6561724772616469656e742069643d22486f7572676c61737353747260208801527f6f6b6522206772616469656e745472616e73666f726d3d22726f74617465283960408801527f302922206772616469656e74556e6974733d227573657253706163654f6e557360608801527f65223e000000000000000000000000000000000000000000000000000000000060808801527f3c73746f70206f66667365743d22353025222073746f702d636f6c6f723d2200608388015251809260a2880190614826565b84018360a28201527f3c73746f70206f66667365743d22383025222073746f702d636f6c6f723d220060a5820152611cf382518093602060c485019101614826565b019160c483015260c78201520360b88101875201856148df565b614e1f565b92611d32611d1e615817565b896020815191012090602081519101201490565b9788156146ad575b506040518060c081011067ffffffffffffffff60c0830111176143115760c08101604052609081527f3c7061746820643d224d2035302c3336302061203330302c333030203020312c60208201527f31203630302c302061203330302c333030203020312c31202d3630302c30222060408201527f66696c6c3d2223666666222066696c6c2d6f7061636974793d222e303222207360608201527f74726f6b653d2275726c2823486f7572676c6173735374726f6b65292220737460808201527f726f6b652d77696474683d2234222f3e0000000000000000000000000000000060a082015260405193846102c081011067ffffffffffffffff6102c087011117614311576102c0850160405261029885527f3c7061746820643d226d3536362c3136312e323031762d35332e39323463302d60208601527f31392e3338322d32322e3531332d33372e3536332d36332e3339382d35312e3160408601527f39382d34302e3735362d31332e3539322d39342e3934362d32312e3037392d3160608601527f35322e3538372d32312e303739732d3131312e3833382c372e3438372d31353260808601527f2e3630322c32312e303739632d34302e3839332c31332e3633362d36332e343160a08601527f332c33312e3831362d36332e3431332c35312e3139387635332e39323463302c60c08601527f31372e3138312c31372e3730342c33332e3432372c35302e3232332c34362e3360e08601527f3934763238342e383039632d33322e3531392c31322e39362d35302e3232332c6101008601527f32392e3230362d35302e3232332c34362e3339347635332e39323463302c31396101208601527f2e3338322c32322e35322c33372e3536332c36332e3431332c35312e3139382c6101408601527f34302e3736332c31332e3539322c39342e3935342c32312e3037392c3135322e6101608601527f3630322c32312e303739733131312e3833312d372e3438372c3135322e3538376101808601527f2d32312e3037396334302e3838362d31332e3633362c36332e3339382d33312e6101a08601527f3831362c36332e3339382d35312e313938762d35332e39323463302d31372e316101c08601527f39362d31372e3730342d33332e3433352d35302e3232332d34362e34303156326101e08601527f30372e3630336333322e3531392d31322e3936372c35302e3232332d32392e326102008601527f30362c35302e3232332d34362e3430315a6d2d3334372e3436322c35372e37396102208601527f336c3133302e3935392c3133312e3032372d3133302e3935392c3133312e30316102408601527f33563231382e3939345a6d3236322e3932342e303232763236322e3031386c2d6102608601527f3133302e3933372d3133312e3030362c3133302e3933372d3133312e3031335a6102808601527f222066696c6c3d2223313631383232223e3c2f706174683e00000000000000006102a0860152896000146144885760405161218c8161488b565b60008152995b1561432757604051806101e081011067ffffffffffffffff6101e083011117614311576101e081016040526101b181527f3c7061746820643d226d3438312e34362c3438312e35347638312e3031632d3260208201527f2e33352e37372d342e38322c312e35312d372e33392c322e32332d33302e332c60408201527f382e35342d37342e36352c31332e39322d3132342e30362c31332e39322d353360608201527f2e362c302d3130312e32342d362e33332d3133312e34372d31362e3136762d3860808201527f316c34362e332d34362e3331683137302e33336c34362e32392c34362e33315a60a08201527f222066696c6c3d2275726c282353616e64426f74746f6d29222f3e3c7061746860c08201527f20643d226d3433352e31372c3433352e323363302c312e31372d2e34362c322e60e08201527f33322d312e33332c332e34342d372e31312c392e30382d34312e39332c31352e6101008201527f39382d38332e38312c31352e3938732d37362e372d362e392d38332e38322d316101208201527f352e3938632d2e38372d312e31322d312e33332d322e32372d312e33332d332e6101408201527f3434762d2e30346c382e33342d382e33352e30312d2e30316331332e37322d366101608201527f2e35312c34322e39352d31312e30322c37362e382d31312e30327336322e39376101808201527f2c342e34392c37362e37322c31316c382e34322c382e34325a222066696c6c3d6101a08201527f2275726c282353616e64546f7029222f3e0000000000000000000000000000006101c0820152995b60405196876107e081011067ffffffffffffffff6107e08a01111761431157613b9f9c612e5a6036602d9960819f97631e17b39f60e11b8d7f3c2f646566733e000000000000000000000000000000000000000000000000009a612f2b9f6107e0016040526107a782527f3c672066696c6c3d226e6f6e6522207374726f6b653d2275726c2823486f757260208301527f676c6173735374726f6b652922207374726f6b652d6c696e656361703d22726f60408301527f756e6422207374726f6b652d6d697465726c696d69743d22313022207374726f60608301527f6b652d77696474683d2234223e3c7061746820643d226d3536352e3634312c3160808301527f30372e323863302c392e3533372d352e35362c31382e3632392d31352e36373660a08301527f2c32362e393733682d2e303233632d392e3230342c372e3539362d32322e313960c08301527f342c31342e3536322d33382e3139372c32302e3539322d33392e3530342c313460e08301527f2e3933362d39372e3332352c32342e3335352d3136312e3733332c32342e33356101008301527f352d39302e34382c302d3136372e3934382d31382e3538322d3139392e3935336101208301527f2d34342e393438682d2e303233632d31302e3131352d382e3334342d31352e366101408301527f37362d31372e3433372d31352e3637362d32362e3937332c302d33392e3733356101608301527f2c39362e3535342d37312e3932312c3231352e3635322d37312e3932317332316101808301527f352e3632392c33322e3138352c3231352e3632392c37312e3932315a222f3e3c6101a08301527f7061746820643d226d3133342e33362c3136312e32303363302c33392e3733356101c08301527f2c39362e3535342c37312e3932312c3231352e3635322c37312e3932317332316101e08301527f352e3632392d33322e3138362c3231352e3632392d37312e393231222f3e3c6c6102008301527f696e652078313d223133342e3336222079313d223136312e323033222078323d6102208301527f223133342e3336222079323d223130372e3238222f3e3c6c696e652078313d226102408301527f3536352e3634222079313d223136312e323033222078323d223536352e3634226102608301527f2079323d223130372e3238222f3e3c6c696e652078313d223138342e353834226102808301527f2079313d223230362e383233222078323d223138342e353835222079323d22356102a08301527f33372e353739222f3e3c6c696e652078313d223231382e313831222079313d226102c08301527f3231382e313138222078323d223231382e313831222079323d223536322e35336102e08301527f37222f3e3c6c696e652078313d223438312e383138222079313d223231382e316103008301527f3432222078323d223438312e383139222079323d223536322e343238222f3e3c6103208301527f6c696e652078313d223531352e343135222079313d223230372e3335322220786103408301527f323d223531352e343136222079323d223533372e353739222f3e3c70617468206103608301527f643d226d3138342e35382c3533372e353863302c352e34352c342e32372c31306103808301527f2e36352c31322e30332c31352e3432682e303263352e35312c332e33392c31326103a08301527f2e37392c362e35352c32312e35352c392e34322c33302e32312c392e392c37386103c08301527f2e30322c31362e32382c3133312e38332c31362e32382c34392e34312c302c396103e08301527f332e37362d352e33382c3132342e30362d31332e39322c322e372d2e37362c356104008301527f2e32392d312e35342c372e37352d322e33352c382e37372d322e38372c31362e6104208301527f30352d362e30342c32312e35362d392e3433683063372e37362d342e37372c316104408301527f322e30342d392e39372c31322e30342d31352e3432222f3e3c7061746820643d6104608301527f226d3138342e3538322c3439322e363536632d33312e3335342c31322e3438356104808301527f2d35302e3232332c32382e35382d35302e3232332c34362e3134322c302c392e6104a08301527f3533362c352e3536342c31382e3632372c31352e3637372c32362e393639682e6104c08301527f30323263382e3530332c372e3030352c32302e3231332c31332e3436332c33346104e08301527f2e3532342c31392e3135392c392e3939392c332e3939312c32312e3236392c376105008301527f2e3630392c33332e3539372c31302e3738382c33362e34352c392e3430372c386105208301527f322e3138312c31352e3030322c3133312e3833352c31352e3030327339352e336105408301527f36332d352e3539352c3133312e3830372d31352e3030326331302e3834372d326105608301527f2e37392c32302e3836372d352e3932362c32392e3932342d392e3334392c312e6105808301527f3234342d2e3436372c322e3437332d2e3934322c332e3637332d312e3432342c6105a08301527f31342e3332362d352e3639362c32362e3033352d31322e3136312c33342e35326105c08301527f342d31392e313733682e3032326331302e3131342d382e3334322c31352e36376105e08301527f372d31372e3433332c31352e3637372d32362e3936392c302d31372e3536322d6106008301527f31382e3836392d33332e3636352d35302e3232332d34362e3135222f3e3c70616106208301527f746820643d226d3133342e33362c3539322e373263302c33392e3733352c39366106408301527f2e3535342c37312e3932312c3231352e3635322c37312e393231733231352e366106608301527f32392d33322e3138362c3231352e3632392d37312e393231222f3e3c6c696e656106808301527f2078313d223133342e3336222079313d223539322e3732222078323d223133346106a08301527f2e3336222079323d223533382e373937222f3e3c6c696e652078313d223536356106c08301527f2e3634222079313d223539322e3732222078323d223536352e3634222079323d6106e08301527f223533382e373937222f3e3c706f6c796c696e6520706f696e74733d223438316107008301527f2e383232203438312e393031203438312e373938203438312e383737203438316107208301527f2e373735203438312e383534203335302e303135203335302e303236203231386107408301527f2e313835203231382e313239222f3e3c706f6c796c696e6520706f696e74733d6107608301527f223231382e313835203438312e393031203231382e323331203438312e3835346107808301527f203335302e303135203335302e303236203438312e383232203231382e3135326107a08301527f222f3e3c2f673e000000000000000000000000000000000000000000000000006107c0830152604051998a957f3c672069643d22486f7572676c617373223e00000000000000000000000000006020880152603295612df68151809260208a8c019101614826565b8701612e0b8251809360208a85019101614826565b01612e1f8251809360208985019101614826565b01612e338251809360208885019101614826565b01612e478251809360208785019101614826565b01918201520360168101865201846148df565b6040519e8f9788977f3c646566733e000000000000000000000000000000000000000000000000000060208a0152612e9f6026998260208c9451948593019101614826565b8901612eb48251809360208c85019101614826565b01612ec88251809360208b85019101614826565b01612edc8251809360208a85019101614826565b01612ef08251809360208985019101614826565b01612f048251809360208885019101614826565b01612f188251809360208785019101614826565b019182015203600d8101895201876148df565b6137be604c60e08301516101208401519361351a61314d6060604084015193015196612f578186615985565b9461314861012b604051612f6a816148c3565b600581527f2d3130302500000000000000000000000000000000000000000000000000000060208201526040519889917f3c74657874506174682073746172744f66667365743d220000000000000000006020840152612fd4815180926020603787019101614826565b7f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666683820160378101919091527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e00000000000000000061010982015282519261311891849161012090910190602001614826565b6a1e17ba32bc3a2830ba341f60a91b90830190910161012081019190915281900361010b810190915201876148df565b615985565b9561332c61012b604051613160816148c3565b600281527f30250000000000000000000000000000000000000000000000000000000000006020820152604051998a917f3c74657874506174682073746172744f66667365743d2200000000000000000060208401526131ca815180926020603787019101614826565b82017f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666660378201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e00000000000000000061010982015261330782518093602061012085019101614826565b016a1e17ba32bc3a2830ba341f60a91b6101208201520361010b81018a5201886148df565b61333681846159ed565b9261351561012b604051613349816148c3565b600481527f2d3530250000000000000000000000000000000000000000000000000000000060208201526040519687917f3c74657874506174682073746172744f66667365743d2200000000000000000060208401526133b3815180926020603787019101614826565b82017f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666660378201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e0000000000000000006101098201526134f082518093602061012085019101614826565b016a1e17ba32bc3a2830ba341f60a91b6101208201520361010b8101875201856148df565b6159ed565b906136f961012b60405161352d816148c3565b600381527f353025000000000000000000000000000000000000000000000000000000000060208201526040519485917f3c74657874506174682073746172744f66667365743d220000000000000000006020840152613597815180926020603787019101614826565b82017f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666660378201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e0000000000000000006101098201526136d482518093602061012085019101614826565b016a1e17ba32bc3a2830ba341f60a91b6101208201520361010b8101855201836148df565b6040519586937f3c7465787420746578742d72656e646572696e673d226f7074696d697a65537060208601527f656564223e000000000000000000000000000000000000000000000000000000604086015261375f815180926020604589019101614826565b8401613775825180936020604585019101614826565b0161378a825180936020604585019101614826565b0161379f825180936020604585019101614826565b01661e17ba32bc3a1f60c91b604582015203602c8101845201826148df565b613a9e61019a6101408401516101a0850151906137ff6137f96137f36137ed60e060408b01519a015194614b08565b94614b08565b97614b08565b91614b08565b956040519687937f3c75736520687265663d2223476c6f77222066696c6c2d6f7061636974793d2260208601527f2e39222f3e00000000000000000000000000000000000000000000000000000060408601527f3c75736520687265663d2223476c6f772220783d22313030302220793d22313060458601527f3030222066696c6c2d6f7061636974793d222e39222f3e00000000000000000060658601527f3c75736520687265663d22234c6f676f2220783d223137302220793d22313730607c8601527f22207472616e73666f726d3d227363616c65282e3629222f3e3c757365206872609c8601527f65663d2223486f7572676c6173732220783d223135302220793d22393022207460bc8601527f72616e73666f726d3d22726f746174652831302922207472616e73666f726d2d60dc8601527f6f726967696e3d2235303020353030222f3e000000000000000000000000000060fc8601527f3c75736520687265663d222350726f67726573732220783d220000000000000061010e8601526101279061399a815180926020858a019101614826565b8501937f2220793d22373930222f3e00000000000000000000000000000000000000000080948180948801527f3c75736520687265663d22235374617475732220783d2200000000000000000061013288015261014996613a048251809360208b85019101614826565b01958601527f3c75736520687265663d2223416d6f756e742220783d2200000000000000000061015486015261016b94613a478251809360208985019101614826565b01938401527f3c75736520687265663d22234475726174696f6e2220783d220000000000000061017684015261018f92613a8a8251809360208785019101614826565b01918201520361017a8101855201836148df565b6040519586937f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323060208601527f30302f737667222077696474683d223130303022206865696768743d2231303060408601527f30222076696577426f783d2230203020313030302031303030223e00000000006060860152613b2a815180926020607b89019101614826565b8401613b40825180936020607b85019101614826565b01613b55825180936020607b85019101614826565b01613b6a825180936020607b85019101614826565b017f3c2f7376673e0000000000000000000000000000000000000000000000000000607b8201520360618101845201826148df565b6101605260a051610100516040517fb971302a0000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa908115614305576000916142ba575b6142b661424f614154614245609487613d3b6089613c198a614c58565b9260c0608001516040519485927f5b7b2274726169745f74797065223a224173736574222c2276616c7565223a226020850152613c60815180926020604088019101614826565b8301907f227d2c7b2274726169745f74797065223a2253656e646572222c2276616c756560408301527f223a22000000000000000000000000000000000000000000000000000000000091826060820152613cc5825180936020606385019101614826565b01907f227d2c7b2274726169745f74797065223a22537461747573222c2276616c756560638301526083820152613d06825180936020608685019101614826565b017f227d5d000000000000000000000000000000000000000000000000000000000060868201520360698101845201826148df565b6101a05160a05161403e61017e613d53602435614b08565b9360a060800151613d6e6001600160a01b0360805116614c58565b90604051968793613f2b60208601987f54686973204e465420726570726573656e74732061207061796d656e742073748a527f7265616d20696e2061205361626c696572205632200000000000000000000000604088015282516020840190613ddb8160558b0184614826565b8801947f20636f6e74726163742e20546865206f776e6572206f662074686973204e465460558701527f2063616e207769746864726177207468652073747265616d656420617373657460758701527f732c207768696368206172652064656e6f6d696e6174656420696e2000000000609587015282516020840196613e658260b183018a614826565b017f2e5c6e5c6e2d2053747265616d2049443a20000000000000000000000000000060b1820152613ea082518093602060c385019101614826565b01613ed97f5c6e2d2000000000000000000000000000000000000000000000000000000000958660c384015251809360c7840190614826565b01947f20416464726573733a2000000000000000000000000000000000000000000000958660c7820152613f1782518093602060d185019101614826565b019260d184015251809360d5840190614826565b019060d5820152613f4682518093602060df85019101614826565b017f5c6e5c6e0000000000000000000000000000000000000000000000000000000060df8201527fe29aa0efb88f205741524e494e473a205472616e7366657272696e672074686560e38201527f204e4654206d616b657320746865206e6577206f776e657220746865207265636101038201527f697069656e74206f66207468652073747265616d2e205468652066756e6473206101238201527f617265206e6f74206175746f6d61746963616c6c792077697468647261776e206101438201527f666f72207468652070726576696f757320726563697069656e742e00000000006101638201520361015e8101855201836148df565b6101a051906141af614051602435614b08565b916140d0602d604051809560208201976a029b0b13634b2b9102b19160ad1b8952614086815180926020602b87019101614826565b82017f2023000000000000000000000000000000000000000000000000000000000000602b8201526140c18251809360208785019101614826565b0103600d8101865201846148df565b610160516140dd90614994565b94604051998a977f7b2261747472696275746573223a00000000000000000000000000000000000060208a015261411e815180926020602e8d019101614826565b8801917f2c226465736372697074696f6e223a2200000000000000000000000000000000602e840152518093603e840190614826565b01917f222c2265787465726e616c5f75726c223a2268747470733a2f2f7361626c6965603e8401527f722e636f6d222c226e616d65223a220000000000000000000000000000000000605e840152518093606d840190614826565b017f222c22696d616765223a22646174613a696d6167652f7376672b786d6c3b6261606d8201527f736536342c000000000000000000000000000000000000000000000000000000608d820152614210825180936020609285019101614826565b017f227d00000000000000000000000000000000000000000000000000000000000060928201520360748101845201826148df565b60e0819052614994565b6142a2603d60405180937f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000060208301526142928151809260208686019101614826565b810103601d8101845201826148df565b604051918291602083526020830190614849565b0390f35b90506020813d6020116142fd575b816142d5602093836148df565b810103126142f85751906001600160a01b03821682036142f85790614154613bfc565b600080fd5b3d91506142c8565b6040513d6000823e3d90fd5b634e487b7160e01b600052604160045260246000fd5b6040518061012081011067ffffffffffffffff6101208301111761431157610120810160405260f881527f3c7061746820643d226d3438312e34362c3530342e3130317635382e3434396360208201527f2d322e33352e37372d342e38322c312e35312d372e33392c322e32332d33302e60408201527f332c382e35342d37342e36352c31332e39322d3132342e30362c31332e39322d60608201527f35332e362c302d3130312e32342d362e33332d3133312e34372d31362e31367660808201527f2d35382e343339683236322e39325a222066696c6c3d2275726c282353616e6460a08201527f426f74746f6d29222f3e3c656c6c697073652063783d22333530222063793d2260c08201527f3530342e313031222072783d223133312e343632222072793d2232382e31303860e08201527f222066696c6c3d2275726c282353616e64546f7029222f3e0000000000000000610100820152996123df565b604051806101c081011067ffffffffffffffff6101c083011117614311576101c0810160405261019981527f3c706f6c79676f6e20706f696e74733d22333530203335302e3032362034313560208201527f2e3033203238342e39373820323835203238342e39373820333530203335302e60408201527f303236222066696c6c3d2275726c282353616e64426f74746f6d29222f3e3c7060608201527f61746820643d226d3431362e3334312c3238312e39373563302c2e3931342d2e60808201527f3335342c312e3830392d312e3033352c322e36382d352e3534322c372e30373660a08201527f2d33322e3636312c31322e34352d36352e32382c31322e34352d33322e36323460c08201527f2c302d35392e3733382d352e3337342d36352e32382d31322e34352d2e36383160e08201527f2d2e3837322d312e3033352d312e3736372d312e3033352d322e36382c302d2e6101008201527f3931342e3335342d312e3830382c312e3033352d322e3637362c352e3534322d6101208201527f372e3037362c33322e3635362d31322e34352c36352e32382d31322e34352c336101408201527f322e3631392c302c35392e3733382c352e3337342c36352e32382c31322e34356101608201527f2e3638312e3836372c312e3033352c312e3736322c312e3033352c322e3637366101808201527f5a222066696c6c3d2275726c282353616e64546f7029222f3e000000000000006101a082015299612192565b6146cf9198506146bb615850565b906020815191012090602081519101201490565b9638611d3a565b905093610d61565b905094610a32565b60d09461072c565b614710915060203d602011614716575b61470881836148df565b810190614929565b38610517565b503d6146fe565b614736915060203d6020116147165761470881836148df565b386104c1565b634e487b7160e01b600052601260045260246000fd5b614774915060203d60201161477a575b61476c81836148df565b810190614901565b3861023f565b503d614762565b506020813d6020116147b6575b8161479b602093836148df565b810103126142f8575160058110156142f8576101e5906101db565b3d915061478e565b6147d7915060203d60201161477a5761476c81836148df565b38610181565b90506020813d60201161481e575b816147f8602093836148df565b810103126142f857516001600160a01b03811681036142f8576001600160a01b03610100565b3d91506147eb565b60005b8381106148395750506000910152565b8181015183820152602001614829565b9060209161486281518092818552858086019101614826565b601f01601f1916010190565b610140810190811067ffffffffffffffff82111761431157604052565b6020810190811067ffffffffffffffff82111761431157604052565b6060810190811067ffffffffffffffff82111761431157604052565b6040810190811067ffffffffffffffff82111761431157604052565b90601f8019910116810190811067ffffffffffffffff82111761431157604052565b908160209103126142f857516fffffffffffffffffffffffffffffffff811681036142f85790565b908160209103126142f8575164ffffffffff811681036142f85790565b67ffffffffffffffff811161431157601f01601f191660200190565b9061496c82614946565b61497960405191826148df565b828152809261498a601f1991614946565b0190602036910137565b805115614af4576040516149a7816148a7565b604081527f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208201527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f60408201528151600292838201809211614ade5760038092047f3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81168103614ade57614a41908594951b614962565b936020850193829183518401925b838110614a8d5750505050510680600114614a7a57600214614a6f575090565b603d90600019015390565b50603d9081600019820153600119015390565b85600491979293949701918251600190603f9082828260121c16880101518453828282600c1c16880101518385015382828260061c1688010151888501531685010151878201530195929190614a4f565b634e487b7160e01b600052601160045260246000fd5b50604051614b018161488b565b6000815290565b806000917a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000080821015614c4a575b506d04ee2d6d415b85acef810000000080831015614c3b575b50662386f26fc1000080831015614c2c575b506305f5e10080831015614c1d575b5061271080831015614c0e575b506064821015614bfe575b600a80921015614bf4575b600190816021614b9f828701614962565b95860101905b614bb1575b5050505090565b600019019083907f30313233343536373839616263646566000000000000000000000000000000008282061a835304918215614bef57919082614ba5565b614baa565b9160010191614b8e565b9190606460029104910191614b83565b60049193920491019138614b78565b60089193920491019138614b6b565b60109193920491019138614b5c565b60209193920491019138614b4a565b604093508104915038614b31565b6001600160a01b031660405190614c6e826148a7565b602a8252602082016040368237825115614d8657603090538151600190811015614d8657607860218401536029905b808211614d0b575050614cad5790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602060248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b9091600f81166010811015614d71577f3031323334353637383961626364656600000000000000000000000000000000901a614d478486614d9c565b5360041c918015614d5c576000190190614c9d565b60246000634e487b7160e01b81526011600452fd5b60246000634e487b7160e01b81526032600452fd5b634e487b7160e01b600052603260045260246000fd5b908151811015614d86570160200190565b60405190614dba826148c3565b600482527f2667743b000000000000000000000000000000000000000000000000000000006020830152565b60405190614df3826148c3565b600482527f266c743b000000000000000000000000000000000000000000000000000000006020830152565b90614e87929493604051958692602094614e4181518092888089019101614826565b8401614e5582518093888085019101614826565b01614e6882518093878085019101614826565b01614e7b82518093868085019101614826565b010380855201836148df565b565b801561519a5760009180615175575090505b6001908082811015614f0857505050614eb2614de6565b614f05602260405183614ecf829551809260208086019101614826565b81017f203100000000000000000000000000000000000000000000000000000000000060208201520360028101845201826148df565b90565b66038d7ea4c6800011156151185760409081519060a0820182811067ffffffffffffffff82111761431157808452614f3f8161488b565b600081528252825190614f51826148c3565b8482526020917f4b0000000000000000000000000000000000000000000000000000000000000083820152828401528351614f8b816148c3565b8581527f4d0000000000000000000000000000000000000000000000000000000000000083820152848401528351614fc2816148c3565b8581527f42000000000000000000000000000000000000000000000000000000000000008382015260608401528351614ffa816148c3565b8581527f54000000000000000000000000000000000000000000000000000000000000008382015260808401526000918583965b6150ec575b50845194615040866148c3565b6007908187527f2623383830353b0000000000000000000000000000000000000000000000000083880152519560005b8281106150d957505050506150ba6150c0917f20000000000000000000000000000000000000000000000000000000000000006027870152600886526150b5866148c3565b614b08565b91615744565b916005851015614d8657614f059460051b015192614e1f565b8181018401518882018501528301615070565b9591926103e89081851061510f57508680916064600a870406950493019661502e565b93929650615033565b5050615122614dad565b614f0560286040518361513f829551809260208086019101614826565b81017f203939392e39395400000000000000000000000000000000000000000000000060208201520360088101845201826148df565b600a0a918215615186575004614e9b565b80634e487b7160e01b602492526012600452fd5b50506040516151a8816148c3565b600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b620151809103048061523d57506151ea614de6565b614f05602660405183615207829551809260208086019101614826565b81017f203120446179000000000000000000000000000000000000000000000000000060208201520360068101845201826148df565b61270f811161530c57600181036152c957614f056020615291604051615262816148c3565b600481527f20446179000000000000000000000000000000000000000000000000000000008382015293614b08565b60405193816152a98693518092868087019101614826565b82016152bd82518093868085019101614826565b010380845201826148df565b614f0560206152916040516152dd816148c3565b600581527f20446179730000000000000000000000000000000000000000000000000000008382015293614b08565b50615315614dad565b614f05602a60405183615332829551809260208086019101614826565b81017f2039393939204461797300000000000000000000000000000000000000000000602082015203600a8101845201826148df565b6020818303126142f85780519067ffffffffffffffff82116142f8570181601f820112156142f857805161539b81614946565b926153a960405194856148df565b818452602082840101116142f857614f059160208085019101614826565b6001600160a01b031660409081516395d89b4160e01b8152600081600481855afa9081156155a157600091615580575b5061545c8351615406816148c3565b601181527f5341422d56322d4c4f434b55502d4c494e0000000000000000000000000000006020918201528251908301207fc66b376a19264d832c1bc254000c18944ca5aa57ed50f4ea637c4da424d4c3bb1490565b1561549a5750505161546d816148c3565b600d81527f4c6f636b7570204c696e65617200000000000000000000000000000000000000602082015290565b6154fe83516154a8816148c3565b601181527f5341422d56322d4c4f434b55502d44594e0000000000000000000000000000006020918201528251908301207f6ab655856fa5352de8c05542b1937ac63c59342da992602767c02734cc5391651490565b1561553c5750505161550f816148c3565b600e81527f4c6f636b75702044796e616d6963000000000000000000000000000000000000602082015290565b61557c9083519384937f814a8a2e000000000000000000000000000000000000000000000000000000008552600485015260248401526044830190614849565b0390fd5b61559b913d8091833e61559381836148df565b810190615368565b386153f7565b83513d6000823e3d90fd5b3d156155d7573d906155bd82614946565b916155cb60405193846148df565b82523d6000602084013e565b606090565b60405160208101907f313ce56700000000000000000000000000000000000000000000000000000000825260048152615614816148c3565b6000928392839251915afa6156276155ac565b908061565e575b1561565a5760208180518101031261565657602001519060ff82168203615653575090565b80fd5b5080fd5b5090565b50602081511461562e565b6000809160405160208101906395d89b4160e01b82526004815261568c816148c3565b51915afa6156986155ac565b90158015615738575b6156fe57806020806156b893518301019101615368565b601e815111600014614f0557506040516156d1816148c3565b600b81527f4c6f6e672053796d626f6c000000000000000000000000000000000000000000602082015290565b5060405161570b816148c3565b600581527f4552433230000000000000000000000000000000000000000000000000000000602082015290565b506040815111156156a1565b806157565750604051614b018161488b565b600a8110156157bb5761576890614b08565b614f05602260405180937f2e3000000000000000000000000000000000000000000000000000000000000060208301526157ab8151809260208686019101614826565b81010360028101845201826148df565b6157c490614b08565b614f05602160405180937f2e0000000000000000000000000000000000000000000000000000000000000060208301526158078151809260208686019101614826565b81010360018101845201826148df565b60405190615824826148c3565b600782527f536574746c6564000000000000000000000000000000000000000000000000006020830152565b6040519061585d826148c3565b600882527f4465706c657465640000000000000000000000000000000000000000000000006020830152565b600581101561596f57600481036158a35750614f05615850565b600381036158e557506040516158b8816148c3565b600881527f43616e63656c6564000000000000000000000000000000000000000000000000602082015290565b6001810361592757506040516158fa816148c3565b600981527f53747265616d696e670000000000000000000000000000000000000000000000602082015290565b60020361593657614f05615817565b604051615942816148c3565b600781527f50656e64696e6700000000000000000000000000000000000000000000000000602082015290565b634e487b7160e01b600052602160045260246000fd5b6030614e879193929360405194816159a7879351809260208087019101614826565b820164010714051160dd1b60208201526a029b0b13634b2b9102b19160ad1b60258201526159de8251809360208785019101614826565b010360108101855201836148df565b6025614e87919392936040519481615a0f879351809260208087019101614826565b820164010714051160dd1b6020820152615a328251809360208785019101614826565b010360058101855201836148df565b60405190615a4e826148c3565b601082527f68736c283233302c3231252c31312529000000000000000000000000000000006020830152565b8015615cac57615a88615a41565b90612710908103908111614ade57614f0591615aa661013692614b08565b6040519485927f3c672066696c6c3d226e6f6e65223e000000000000000000000000000000000060208501527f3c636972636c652063783d22313636222063793d2235302220723d2232322220602f8501527f7374726f6b653d22000000000000000000000000000000000000000000000000604f850152615b32815180926020605788019101614826565b83017f22207374726f6b652d77696474683d223130222f3e000000000000000000000060578201527f3c636972636c652063783d22313636222063793d2235302220706174684c656e606c8201527f6774683d2231303030302220723d22323222207374726f6b653d220000000000608c820152615bba82518093602060a785019101614826565b017f22207374726f6b652d6461736861727261793d22313030303022207374726f6b60a78201527f652d646173686f66667365743d2200000000000000000000000000000000000060c7820152615c1b82518093602060d585019101614826565b017f22207374726f6b652d6c696e656361703d22726f756e6422207374726f6b652d60d58201527f77696474683d223522207472616e73666f726d3d22726f74617465282d39302960f58201527f22207472616e73666f726d2d6f726967696e3d22313636203530222f3e000000610115820152631e17b39f60e11b610132820152036101168101845201826148df565b5050604051614b018161488b565b60009080518015615d2f579060009182915b818310615cde57505050600d02900390565b909193603b60f81b7fff00000000000000000000000000000000000000000000000000000000000000615d118785614d9c565b511614615d27575b600d01936001019190615ccc565b849350615d19565b505050600090565b60009080518015615d2f579060009182915b818310615d5b5750505060041b900390565b909193603b60f81b7fff00000000000000000000000000000000000000000000000000000000000000615d8e8785614d9c565b511614615da4575b601001936001019190615d49565b849350615d9656"; From 96614cd1240dcc253ab25e4cbfbde0b745f3996a Mon Sep 17 00:00:00 2001 From: Paul Razvan Berg Date: Tue, 26 Sep 2023 18:23:04 +0300 Subject: [PATCH 18/47] build: remove OZ from peer dependencies --- package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package.json b/package.json index ae66ed1c0..7d12e70b1 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,6 @@ "token-streaming" ], "peerDependencies": { - "@openzeppelin/contracts": "4.9.2", "@prb/math": "4.0.1" }, "publishConfig": { From 545c1d5d80c18d05f7cdf8d3e55fd0a1d686ec4f Mon Sep 17 00:00:00 2001 From: Andrei Vlad Birgaoanu <99738872+andreivladbrg@users.noreply.github.com> Date: Wed, 27 Sep 2023 10:03:00 +0300 Subject: [PATCH 19/47] docs: roll 1.1.0 (#693) * docs: roll 1.1.0 * docs: update changelog --------- Co-authored-by: Paul Razvan Berg --- CHANGELOG.md | 18 ++++++++++++++++++ package.json | 2 +- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cfd69bb8c..2bf0ed672 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,10 +4,28 @@ All notable changes to this project will be documented in this file. The format is based on [Common Changelog](https://common-changelog.org/). +[1.1.0]: https://github.com/sablier-labs/v2-core/compare/v1.0.2...v1.1.0 [1.0.2]: https://github.com/sablier-labs/v2-core/compare/v1.0.1...v1.0.2 [1.0.1]: https://github.com/sablier-labs/v2-core/compare/v1.0.0...v1.0.1 [1.0.0]: https://github.com/sablier-labs/v2-core/releases/tag/v1.0.0 +## [1.1.0] - 2023-09-27 + +### Changed + +- Move `isWarm` and `isCold` to `SablierV2Lockup` ([#664](https://github.com/sablier-labs/v2-core/pull/664)) +- Remove `@openzeppelin/contracts` from Node.js peer dependencies + ([#693](https://github.com/sablier-labs/v2-core/pull/693)) +- Replace the streamed amount with the deposit amount in the NFT descriptor + ([#692](https://github.com/sablier-labs/v2-core/pull/692)) +- Simplify `renounce` and `withdraw` implementations ([#683](https://github.com/sablier-labs/v2-core/pull/683)) +- Upgrade Solidity to `0.8.21` ([#688](https://github.com/sablier-labs/v2-core/pull/688)) + +### Added + +- Add `ERC-4906` metadata update in `transferFrom` ([#686](hhttps://github.com/sablier-labs/v2-core/pull/686)) +- Add `transferrable` boolean flag ([#668](https://github.com/sablier-labs/v2-core/pull/668)) + ## [1.0.2] - 2023-08-14 ### Changed diff --git a/package.json b/package.json index 7d12e70b1..19ba1f933 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "@sablier/v2-core", "description": "Core smart contracts of the Sablier V2 token streaming protocol", "license": "BUSL-1.1", - "version": "1.0.2", + "version": "1.1.0", "author": { "name": "Sablier Labs Ltd", "url": "https://sablier.com" From e7e376b0215bdf542f0250834552462745bdce29 Mon Sep 17 00:00:00 2001 From: andreivladbrg Date: Thu, 28 Sep 2023 11:43:23 +0300 Subject: [PATCH 20/47] chore: fix typo in DataTypes --- src/types/DataTypes.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/types/DataTypes.sol b/src/types/DataTypes.sol index 7b7f92122..48a899c75 100644 --- a/src/types/DataTypes.sol +++ b/src/types/DataTypes.sol @@ -159,7 +159,7 @@ library LockupDynamic { /// @param asset The contract address of the ERC-20 asset used for streaming. /// @param isDepleted Boolean indicating if the stream is depleted. /// @param isStream Boolean indicating if the struct entity exists. - /// @param isTransferable BooleaniIndicating if the stream NFT is transferable. + /// @param isTransferable Boolean indicating if the stream NFT is transferable. /// @param amounts Struct containing the deposit, withdrawn, and refunded amounts, all denoted in units of the /// asset's decimals. /// @param segments Segments used to compose the custom streaming curve. From f23e91fc673feb3824a8b04ff65b750125d28737 Mon Sep 17 00:00:00 2001 From: andreivladbrg Date: Thu, 28 Sep 2023 13:32:10 +0300 Subject: [PATCH 21/47] docs: correct github hyperlink docs: order change logs chronologically --- CHANGELOG.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2bf0ed672..f24bf034f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,18 +13,18 @@ The format is based on [Common Changelog](https://common-changelog.org/). ### Changed -- Move `isWarm` and `isCold` to `SablierV2Lockup` ([#664](https://github.com/sablier-labs/v2-core/pull/664)) - Remove `@openzeppelin/contracts` from Node.js peer dependencies - ([#693](https://github.com/sablier-labs/v2-core/pull/693)) + ([#694](https://github.com/sablier-labs/v2-core/pull/694)) - Replace the streamed amount with the deposit amount in the NFT descriptor ([#692](https://github.com/sablier-labs/v2-core/pull/692)) -- Simplify `renounce` and `withdraw` implementations ([#683](https://github.com/sablier-labs/v2-core/pull/683)) - Upgrade Solidity to `0.8.21` ([#688](https://github.com/sablier-labs/v2-core/pull/688)) +- Simplify `renounce` and `withdraw` implementations ([#683](https://github.com/sablier-labs/v2-core/pull/683)) +- Move `isWarm` and `isCold` to `SablierV2Lockup` ([#664](https://github.com/sablier-labs/v2-core/pull/664)) ### Added -- Add `ERC-4906` metadata update in `transferFrom` ([#686](hhttps://github.com/sablier-labs/v2-core/pull/686)) -- Add `transferrable` boolean flag ([#668](https://github.com/sablier-labs/v2-core/pull/668)) +- Add `ERC-4906` metadata update in `transferFrom` ([#686](https://github.com/sablier-labs/v2-core/pull/686)) +- Add `transferable` boolean flag ([#668](https://github.com/sablier-labs/v2-core/pull/668)) ## [1.0.2] - 2023-08-14 From e34919106fbc3bb184f7e51322b507d98d9b87b5 Mon Sep 17 00:00:00 2001 From: Paul Razvan Berg Date: Thu, 28 Sep 2023 21:48:37 +0300 Subject: [PATCH 22/47] docs: update changelog --- CHANGELOG.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f24bf034f..bca470ec3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,8 +13,6 @@ The format is based on [Common Changelog](https://common-changelog.org/). ### Changed -- Remove `@openzeppelin/contracts` from Node.js peer dependencies - ([#694](https://github.com/sablier-labs/v2-core/pull/694)) - Replace the streamed amount with the deposit amount in the NFT descriptor ([#692](https://github.com/sablier-labs/v2-core/pull/692)) - Upgrade Solidity to `0.8.21` ([#688](https://github.com/sablier-labs/v2-core/pull/688)) @@ -26,6 +24,11 @@ The format is based on [Common Changelog](https://common-changelog.org/). - Add `ERC-4906` metadata update in `transferFrom` ([#686](https://github.com/sablier-labs/v2-core/pull/686)) - Add `transferable` boolean flag ([#668](https://github.com/sablier-labs/v2-core/pull/668)) +### Removed + +- Remove `@openzeppelin/contracts` from Node.js peer dependencies + ([#694](https://github.com/sablier-labs/v2-core/pull/694)) + ## [1.0.2] - 2023-08-14 ### Changed From 59e7516191ca5891501012d2ec7ee96144444c39 Mon Sep 17 00:00:00 2001 From: Paul Razvan Berg Date: Fri, 29 Sep 2023 11:17:55 +0300 Subject: [PATCH 23/47] build: switch to "solhint" chore: disable Solhint rules --- .solhint.json | 3 + package.json | 6 +- pnpm-lock.yaml | 169 ++++++++++++++++++++++++++----------------------- 3 files changed, 97 insertions(+), 81 deletions(-) diff --git a/.solhint.json b/.solhint.json index 22cafb398..0c9d1f4a6 100644 --- a/.solhint.json +++ b/.solhint.json @@ -6,12 +6,15 @@ "compiler-version": ["error", ">=0.8.19"], "contract-name-camelcase": "off", "const-name-snakecase": "off", + "custom-errors": "off", + "immutable-vars-naming": "off", "func-name-mixedcase": "off", "func-visibility": ["error", { "ignoreConstructors": true }], "max-line-length": ["error", 123], "named-parameters-mapping": "warn", "no-empty-blocks": "off", "not-rely-on-time": "off", + "one-contract-per-file": "off", "var-name-mixedcase": "off" } } diff --git a/package.json b/package.json index 19ba1f933..f341ca143 100644 --- a/package.json +++ b/package.json @@ -12,11 +12,11 @@ }, "dependencies": { "@openzeppelin/contracts": "4.9.2", - "@prb/math": "4.0.1" + "@prb/math": "4.0.1", + "solhint": "^3.6.2" }, "devDependencies": { - "prettier": "^2.8.8", - "solhint-community": "^3.5.2" + "prettier": "^2.8.8" }, "files": [ "artifacts", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8049a4a94..0dcfdc577 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,14 +11,14 @@ dependencies: '@prb/math': specifier: 4.0.1 version: 4.0.1 + solhint: + specifier: ^3.6.2 + version: 3.6.2 devDependencies: prettier: specifier: ^2.8.8 version: 2.8.8 - solhint-community: - specifier: ^3.5.2 - version: 3.5.2 packages: @@ -27,12 +27,12 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/highlight': 7.22.5 - dev: true + dev: false /@babel/helper-validator-identifier@7.22.5: resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} engines: {node: '>=6.9.0'} - dev: true + dev: false /@babel/highlight@7.22.5: resolution: {integrity: sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==} @@ -41,7 +41,7 @@ packages: '@babel/helper-validator-identifier': 7.22.5 chalk: 2.4.2 js-tokens: 4.0.0 - dev: true + dev: false /@openzeppelin/contracts@4.9.2: resolution: {integrity: sha512-mO+y6JaqXjWeMh9glYVzVu8HYPGknAAnWyxTRhGeckOruyXQMNnlcW6w/Dx9ftLeIQk6N+ZJFuVmTwF7lEIFrg==} @@ -55,7 +55,7 @@ packages: resolution: {integrity: sha512-ESipEcHyRHg4Np4SqBCfcXwyxxna1DgFVz69bgpLV8vzl/NP1DtcKsJ4dJZXWQhY/Z4J2LeKBiOkOVZn9ct33Q==} dependencies: antlr4ts: 0.5.0-alpha.4 - dev: true + dev: false /ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} @@ -64,7 +64,7 @@ packages: fast-json-stable-stringify: 2.1.0 json-schema-traverse: 0.4.1 uri-js: 4.4.1 - dev: true + dev: false /ajv@8.12.0: resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} @@ -73,63 +73,63 @@ packages: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 uri-js: 4.4.1 - dev: true + dev: false /ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - dev: true + dev: false /ansi-styles@3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} engines: {node: '>=4'} dependencies: color-convert: 1.9.3 - dev: true + dev: false /ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} dependencies: color-convert: 2.0.1 - dev: true + dev: false /antlr4@4.13.0: resolution: {integrity: sha512-zooUbt+UscjnWyOrsuY/tVFL4rwrAGwOivpQmvmUDE22hy/lUA467Rc1rcixyRwcRUIXFYBwv7+dClDSHdmmew==} engines: {node: '>=16'} - dev: true + dev: false /antlr4ts@0.5.0-alpha.4: resolution: {integrity: sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==} - dev: true + dev: false /argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - dev: true + dev: false /ast-parents@0.0.1: resolution: {integrity: sha512-XHusKxKz3zoYk1ic8Un640joHbFMhbqneyoZfoKnEGtf2ey9Uh/IdpcQplODdO/kENaMIWsD0nJm4+wX3UNLHA==} - dev: true + dev: false /astral-regex@2.0.0: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} engines: {node: '>=8'} - dev: true + dev: false /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - dev: true + dev: false /brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} dependencies: balanced-match: 1.0.2 - dev: true + dev: false /callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - dev: true + dev: false /chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} @@ -138,7 +138,7 @@ packages: ansi-styles: 3.2.1 escape-string-regexp: 1.0.5 supports-color: 5.5.0 - dev: true + dev: false /chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} @@ -146,33 +146,33 @@ packages: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - dev: true + dev: false /color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: color-name: 1.1.3 - dev: true + dev: false /color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} dependencies: color-name: 1.1.4 - dev: true + dev: false /color-name@1.1.3: resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - dev: true + dev: false /color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - dev: true + dev: false /commander@10.0.1: resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} engines: {node: '>=14'} - dev: true + dev: false /cosmiconfig@8.2.0: resolution: {integrity: sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==} @@ -182,38 +182,38 @@ packages: js-yaml: 4.1.0 parse-json: 5.2.0 path-type: 4.0.0 - dev: true + dev: false /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - dev: true + dev: false /error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} dependencies: is-arrayish: 0.2.1 - dev: true + dev: false /escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} - dev: true + dev: false /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - dev: true + dev: false /fast-diff@1.3.0: resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} - dev: true + dev: false /fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - dev: true + dev: false /fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - dev: true + dev: false /glob@8.1.0: resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} @@ -224,22 +224,22 @@ packages: inherits: 2.0.4 minimatch: 5.1.6 once: 1.4.0 - dev: true + dev: false /has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} - dev: true + dev: false /has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - dev: true + dev: false /ignore@5.2.4: resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} engines: {node: '>= 4'} - dev: true + dev: false /import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} @@ -247,82 +247,89 @@ packages: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 - dev: true + dev: false /inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} dependencies: once: 1.4.0 wrappy: 1.0.2 - dev: true + dev: false /inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - dev: true + dev: false /is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - dev: true + dev: false /is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - dev: true + dev: false /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - dev: true + dev: false /js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true dependencies: argparse: 2.0.1 - dev: true + dev: false /json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - dev: true + dev: false /json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - dev: true + dev: false /json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - dev: true + dev: false /lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - dev: true + dev: false /lodash.truncate@4.4.2: resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} - dev: true + dev: false /lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - dev: true + dev: false + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: false /minimatch@5.1.6: resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} engines: {node: '>=10'} dependencies: brace-expansion: 2.0.1 - dev: true + dev: false /once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: wrappy: 1.0.2 - dev: true + dev: false /parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} dependencies: callsites: 3.1.0 - dev: true + dev: false /parse-json@5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} @@ -332,43 +339,45 @@ packages: error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - dev: true + dev: false /path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - dev: true + dev: false /pluralize@8.0.0: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} - dev: true + dev: false /prettier@2.8.8: resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} engines: {node: '>=10.13.0'} hasBin: true - dev: true /punycode@2.3.0: resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} engines: {node: '>=6'} - dev: true + dev: false /require-from-string@2.0.2: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} - dev: true + dev: false /resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} - dev: true + dev: false - /semver@6.3.0: - resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} hasBin: true - dev: true + dependencies: + lru-cache: 6.0.0 + dev: false /slice-ansi@4.0.0: resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} @@ -377,10 +386,10 @@ packages: ansi-styles: 4.3.0 astral-regex: 2.0.0 is-fullwidth-code-point: 3.0.0 - dev: true + dev: false - /solhint-community@3.5.2: - resolution: {integrity: sha512-l3lF2n8mF33p266u5atCSqjT9SyyOBD1qaWrQBAXHNk2xAxmi+pEynIVuTIn6FVD3JiuHRgutjKJcngs8Iolbg==} + /solhint@3.6.2: + resolution: {integrity: sha512-85EeLbmkcPwD+3JR7aEMKsVC9YrRSxd4qkXuMzrlf7+z2Eqdfm1wHWq1ffTuo5aDhoZxp2I9yF3QkxZOxOL7aQ==} hasBin: true dependencies: '@solidity-parser/parser': 0.16.0 @@ -396,13 +405,13 @@ packages: js-yaml: 4.1.0 lodash: 4.17.21 pluralize: 8.0.0 - semver: 6.3.0 + semver: 7.5.4 strip-ansi: 6.0.1 table: 6.8.1 text-table: 0.2.0 optionalDependencies: prettier: 2.8.8 - dev: true + dev: false /string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} @@ -411,28 +420,28 @@ packages: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - dev: true + dev: false /strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} dependencies: ansi-regex: 5.0.1 - dev: true + dev: false /supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} dependencies: has-flag: 3.0.0 - dev: true + dev: false /supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} dependencies: has-flag: 4.0.0 - dev: true + dev: false /table@6.8.1: resolution: {integrity: sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==} @@ -443,18 +452,22 @@ packages: slice-ansi: 4.0.0 string-width: 4.2.3 strip-ansi: 6.0.1 - dev: true + dev: false /text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - dev: true + dev: false /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: punycode: 2.3.0 - dev: true + dev: false /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - dev: true + dev: false + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: false From db7d1386e67e4c801eedd6eefa54bb7c8fcd0a30 Mon Sep 17 00:00:00 2001 From: Andrei Vlad Birgaoanu <99738872+andreivladbrg@users.noreply.github.com> Date: Mon, 2 Oct 2023 15:08:28 +0300 Subject: [PATCH 24/47] refactor: capitalize immutable variables (#700) * refactor: capitalize immutable variables in NoDelegateCall build: remove "immutable-vars-naming" from solhint file * test: make asset and holder immutable in fork tests test: capitalize constans in fork tests --- .solhint.json | 1 - src/abstracts/NoDelegateCall.sol | 8 ++++---- test/fork/Fork.t.sol | 32 ++++++++++++++++---------------- test/fork/LockupDynamic.t.sol | 32 ++++++++++++++++---------------- test/fork/LockupLinear.t.sol | 32 ++++++++++++++++---------------- test/fork/assets/DAI.t.sol | 8 ++++---- test/fork/assets/EURS.t.sol | 8 ++++---- test/fork/assets/SHIB.t.sol | 8 ++++---- test/fork/assets/USDC.t.sol | 8 ++++---- test/fork/assets/USDT.t.sol | 8 ++++---- 10 files changed, 72 insertions(+), 73 deletions(-) diff --git a/.solhint.json b/.solhint.json index 0c9d1f4a6..31a4d5b8c 100644 --- a/.solhint.json +++ b/.solhint.json @@ -7,7 +7,6 @@ "contract-name-camelcase": "off", "const-name-snakecase": "off", "custom-errors": "off", - "immutable-vars-naming": "off", "func-name-mixedcase": "off", "func-visibility": ["error", { "ignoreConstructors": true }], "max-line-length": ["error", 123], diff --git a/src/abstracts/NoDelegateCall.sol b/src/abstracts/NoDelegateCall.sol index f0684aeb2..c01be8734 100644 --- a/src/abstracts/NoDelegateCall.sol +++ b/src/abstracts/NoDelegateCall.sol @@ -7,11 +7,11 @@ import { Errors } from "../libraries/Errors.sol"; /// @notice This contract implements logic to prevent delegate calls. abstract contract NoDelegateCall { /// @dev The address of the original contract that was deployed. - address private immutable _original; + address private immutable ORIGINAL; /// @dev Sets the original contract address. constructor() { - _original = address(this); + ORIGINAL = address(this); } /// @notice Prevents delegate calls. @@ -23,11 +23,11 @@ abstract contract NoDelegateCall { /// @dev This function checks whether the current call is a delegate call, and reverts if it is. /// /// - A private function is used instead of inlining this logic in a modifier because Solidity copies modifiers into - /// every function that uses them. The `_original` address would get copied in every place the modifier is used, + /// every function that uses them. The `ORIGINAL` address would get copied in every place the modifier is used, /// which would increase the contract size. By using a function instead, we can avoid this duplication of code /// and reduce the overall size of the contract. function _preventDelegateCall() private view { - if (address(this) != _original) { + if (address(this) != ORIGINAL) { revert Errors.DelegateCall(); } } diff --git a/test/fork/Fork.t.sol b/test/fork/Fork.t.sol index 455660636..257f93aaf 100644 --- a/test/fork/Fork.t.sol +++ b/test/fork/Fork.t.sol @@ -12,8 +12,8 @@ abstract contract Fork_Test is Base_Test { CONSTANTS //////////////////////////////////////////////////////////////////////////*/ - IERC20 internal immutable asset; - address internal immutable holder; + IERC20 internal immutable ASSET; + address internal immutable HOLDER; /*////////////////////////////////////////////////////////////////////////// VARIABLES @@ -25,9 +25,9 @@ abstract contract Fork_Test is Base_Test { CONSTRUCTOR //////////////////////////////////////////////////////////////////////////*/ - constructor(IERC20 asset_, address holder_) { - asset = asset_; - holder = holder_; + constructor(IERC20 asset, address holder) { + ASSET = asset; + HOLDER = holder; } /*////////////////////////////////////////////////////////////////////////// @@ -47,11 +47,11 @@ abstract contract Fork_Test is Base_Test { // Label the contracts. labelContracts(); - // Make the asset holder the caller in this test suite. - vm.startPrank({ msgSender: holder }); + // Make the ASSET HOLDER the caller in this test suite. + vm.startPrank({ msgSender: HOLDER }); - // Query the initial balance of the asset holder. - initialHolderBalance = asset.balanceOf(holder); + // Query the initial balance of the ASSET HOLDER. + initialHolderBalance = ASSET.balanceOf(HOLDER); } /*////////////////////////////////////////////////////////////////////////// @@ -63,20 +63,20 @@ abstract contract Fork_Test is Base_Test { // The protocol does not allow the zero address to interact with it. vm.assume(sender != address(0) && recipient != address(0) && broker != address(0)); - // The goal is to not have overlapping users because the asset balance tests would fail otherwise. + // The goal is to not have overlapping users because the ASSET balance tests would fail otherwise. vm.assume(sender != recipient && sender != broker && recipient != broker); - vm.assume(sender != holder && recipient != holder && broker != holder); + vm.assume(sender != HOLDER && recipient != HOLDER && broker != HOLDER); vm.assume(sender != sablierContract && recipient != sablierContract && broker != sablierContract); // Avoid users blacklisted by USDC or USDT. - assumeNoBlacklisted(address(asset), sender); - assumeNoBlacklisted(address(asset), recipient); - assumeNoBlacklisted(address(asset), broker); + assumeNoBlacklisted(address(ASSET), sender); + assumeNoBlacklisted(address(ASSET), recipient); + assumeNoBlacklisted(address(ASSET), broker); } /// @dev Labels the most relevant contracts. function labelContracts() internal { - vm.label({ account: address(asset), newLabel: IERC20Metadata(address(asset)).symbol() }); - vm.label({ account: holder, newLabel: "Holder" }); + vm.label({ account: address(ASSET), newLabel: IERC20Metadata(address(ASSET)).symbol() }); + vm.label({ account: HOLDER, newLabel: "HOLDER" }); } } diff --git a/test/fork/LockupDynamic.t.sol b/test/fork/LockupDynamic.t.sol index 1e35c87e4..5300f05e8 100644 --- a/test/fork/LockupDynamic.t.sol +++ b/test/fork/LockupDynamic.t.sol @@ -14,7 +14,7 @@ abstract contract LockupDynamic_Fork_Test is Fork_Test { CONSTRUCTOR //////////////////////////////////////////////////////////////////////////*/ - constructor(IERC20 asset_, address holder_) Fork_Test(asset_, holder_) { } + constructor(IERC20 asset, address holder) Fork_Test(asset, holder) { } /*////////////////////////////////////////////////////////////////////////// SET-UP FUNCTION @@ -25,7 +25,7 @@ abstract contract LockupDynamic_Fork_Test is Fork_Test { // Approve {SablierV2LockupDynamic} to transfer the holder's assets. // We use a low-level call to ignore reverts because the asset can have the missing return value bug. - (bool success,) = address(asset).call(abi.encodeCall(IERC20.approve, (address(lockupDynamic), MAX_UINT256))); + (bool success,) = address(ASSET).call(abi.encodeCall(IERC20.approve, (address(lockupDynamic), MAX_UINT256))); success; } @@ -136,21 +136,21 @@ abstract contract LockupDynamic_Fork_Test is Fork_Test { // Set the fuzzed protocol fee. changePrank({ msgSender: users.admin }); - comptroller.setProtocolFee({ asset: asset, newProtocolFee: params.protocolFee }); + comptroller.setProtocolFee({ asset: ASSET, newProtocolFee: params.protocolFee }); // Make the holder the caller. - changePrank(holder); + changePrank(HOLDER); /*////////////////////////////////////////////////////////////////////////// CREATE //////////////////////////////////////////////////////////////////////////*/ // Load the pre-create protocol revenues. - vars.initialProtocolRevenues = lockupDynamic.protocolRevenues(asset); + vars.initialProtocolRevenues = lockupDynamic.protocolRevenues(ASSET); // Load the pre-create asset balances. vars.balances = - getTokenBalances(address(asset), Solarray.addresses(address(lockupDynamic), params.broker.account)); + getTokenBalances(address(ASSET), Solarray.addresses(address(lockupDynamic), params.broker.account)); vars.initialLockupDynamicBalance = vars.balances[0]; vars.initialBrokerBalance = vars.balances[1]; @@ -164,11 +164,11 @@ abstract contract LockupDynamic_Fork_Test is Fork_Test { vm.expectEmit({ emitter: address(lockupDynamic) }); emit CreateLockupDynamicStream({ streamId: vars.streamId, - funder: holder, + funder: HOLDER, sender: params.sender, recipient: params.recipient, amounts: vars.createAmounts, - asset: asset, + asset: ASSET, cancelable: true, transferable: params.transferable, segments: params.segments, @@ -179,7 +179,7 @@ abstract contract LockupDynamic_Fork_Test is Fork_Test { // Create the stream. lockupDynamic.createWithMilestones( LockupDynamic.CreateWithMilestones({ - asset: asset, + asset: ASSET, broker: params.broker, cancelable: true, transferable: params.transferable, @@ -199,7 +199,7 @@ abstract contract LockupDynamic_Fork_Test is Fork_Test { // Assert that the stream has been created. LockupDynamic.Stream memory actualStream = lockupDynamic.getStream(vars.streamId); assertEq(actualStream.amounts, Lockup.Amounts(vars.createAmounts.deposit, 0, 0)); - assertEq(actualStream.asset, asset, "asset"); + assertEq(actualStream.asset, ASSET, "asset"); assertEq(actualStream.endTime, vars.range.end, "endTime"); assertEq(actualStream.isCancelable, vars.isCancelable, "isCancelable"); assertEq(actualStream.isDepleted, false, "isDepleted"); @@ -227,7 +227,7 @@ abstract contract LockupDynamic_Fork_Test is Fork_Test { assertEq(vars.actualNextStreamId, vars.expectedNextStreamId, "post-create nextStreamId"); // Assert that the protocol fee has been recorded. - vars.actualProtocolRevenues = lockupDynamic.protocolRevenues(asset); + vars.actualProtocolRevenues = lockupDynamic.protocolRevenues(ASSET); vars.expectedProtocolRevenues = vars.initialProtocolRevenues + vars.createAmounts.protocolFee; assertEq(vars.actualProtocolRevenues, vars.expectedProtocolRevenues, "post-create protocolRevenues"); @@ -238,7 +238,7 @@ abstract contract LockupDynamic_Fork_Test is Fork_Test { // Load the post-create asset balances. vars.balances = - getTokenBalances(address(asset), Solarray.addresses(address(lockupDynamic), holder, params.broker.account)); + getTokenBalances(address(ASSET), Solarray.addresses(address(lockupDynamic), HOLDER, params.broker.account)); vars.actualLockupDynamicBalance = vars.balances[0]; vars.actualHolderBalance = vars.balances[1]; vars.actualBrokerBalance = vars.balances[2]; @@ -281,7 +281,7 @@ abstract contract LockupDynamic_Fork_Test is Fork_Test { if (params.withdrawAmount > 0) { // Load the pre-withdraw asset balances. vars.initialLockupDynamicBalance = vars.actualLockupDynamicBalance; - vars.initialRecipientBalance = asset.balanceOf(params.recipient); + vars.initialRecipientBalance = ASSET.balanceOf(params.recipient); // Expect the relevant events to be emitted. vm.expectEmit({ emitter: address(lockupDynamic) }); @@ -315,7 +315,7 @@ abstract contract LockupDynamic_Fork_Test is Fork_Test { // Load the post-withdraw asset balances. vars.balances = - getTokenBalances(address(asset), Solarray.addresses(address(lockupDynamic), params.recipient)); + getTokenBalances(address(ASSET), Solarray.addresses(address(lockupDynamic), params.recipient)); vars.actualLockupDynamicBalance = vars.balances[0]; vars.actualRecipientBalance = vars.balances[1]; @@ -340,7 +340,7 @@ abstract contract LockupDynamic_Fork_Test is Fork_Test { if (!vars.isDepleted && !vars.isSettled) { // Load the pre-cancel asset balances. vars.balances = getTokenBalances( - address(asset), Solarray.addresses(address(lockupDynamic), params.sender, params.recipient) + address(ASSET), Solarray.addresses(address(lockupDynamic), params.sender, params.recipient) ); vars.initialLockupDynamicBalance = vars.balances[0]; vars.initialSenderBalance = vars.balances[1]; @@ -367,7 +367,7 @@ abstract contract LockupDynamic_Fork_Test is Fork_Test { // Load the post-cancel asset balances. vars.balances = getTokenBalances( - address(asset), Solarray.addresses(address(lockupDynamic), params.sender, params.recipient) + address(ASSET), Solarray.addresses(address(lockupDynamic), params.sender, params.recipient) ); vars.actualLockupDynamicBalance = vars.balances[0]; vars.actualSenderBalance = vars.balances[1]; diff --git a/test/fork/LockupLinear.t.sol b/test/fork/LockupLinear.t.sol index 63c85c972..e7962d1ba 100644 --- a/test/fork/LockupLinear.t.sol +++ b/test/fork/LockupLinear.t.sol @@ -14,7 +14,7 @@ abstract contract LockupLinear_Fork_Test is Fork_Test { CONSTRUCTOR //////////////////////////////////////////////////////////////////////////*/ - constructor(IERC20 asset_, address holder_) Fork_Test(asset_, holder_) { } + constructor(IERC20 asset, address holder) Fork_Test(asset, holder) { } /*////////////////////////////////////////////////////////////////////////// SET-UP FUNCTION @@ -25,7 +25,7 @@ abstract contract LockupLinear_Fork_Test is Fork_Test { // Approve {SablierV2LockupLinear} to transfer the asset holder's assets. // We use a low-level call to ignore reverts because the asset can have the missing return value bug. - (bool success,) = address(asset).call(abi.encodeCall(IERC20.approve, (address(lockupLinear), MAX_UINT256))); + (bool success,) = address(ASSET).call(abi.encodeCall(IERC20.approve, (address(lockupLinear), MAX_UINT256))); success; } @@ -135,10 +135,10 @@ abstract contract LockupLinear_Fork_Test is Fork_Test { // Set the fuzzed protocol fee. changePrank({ msgSender: users.admin }); - comptroller.setProtocolFee({ asset: asset, newProtocolFee: params.protocolFee }); + comptroller.setProtocolFee({ asset: ASSET, newProtocolFee: params.protocolFee }); // Make the holder the caller. - changePrank(holder); + changePrank(HOLDER); /*////////////////////////////////////////////////////////////////////////// CREATE @@ -146,11 +146,11 @@ abstract contract LockupLinear_Fork_Test is Fork_Test { // Load the pre-create protocol revenues. Vars memory vars; - vars.initialProtocolRevenues = lockupLinear.protocolRevenues(asset); + vars.initialProtocolRevenues = lockupLinear.protocolRevenues(ASSET); // Load the pre-create asset balances. vars.balances = - getTokenBalances(address(asset), Solarray.addresses(address(lockupLinear), params.broker.account)); + getTokenBalances(address(ASSET), Solarray.addresses(address(lockupLinear), params.broker.account)); vars.initialLockupLinearBalance = vars.balances[0]; vars.initialBrokerBalance = vars.balances[1]; @@ -167,11 +167,11 @@ abstract contract LockupLinear_Fork_Test is Fork_Test { vm.expectEmit({ emitter: address(lockupLinear) }); emit CreateLockupLinearStream({ streamId: vars.streamId, - funder: holder, + funder: HOLDER, sender: params.sender, recipient: params.recipient, amounts: vars.createAmounts, - asset: asset, + asset: ASSET, cancelable: true, transferable: params.transferable, range: params.range, @@ -181,7 +181,7 @@ abstract contract LockupLinear_Fork_Test is Fork_Test { // Create the stream. lockupLinear.createWithRange( LockupLinear.CreateWithRange({ - asset: asset, + asset: ASSET, broker: params.broker, cancelable: true, transferable: params.transferable, @@ -195,7 +195,7 @@ abstract contract LockupLinear_Fork_Test is Fork_Test { // Assert that the stream has been created. LockupLinear.Stream memory actualStream = lockupLinear.getStream(vars.streamId); assertEq(actualStream.amounts, Lockup.Amounts(vars.createAmounts.deposit, 0, 0)); - assertEq(actualStream.asset, asset, "asset"); + assertEq(actualStream.asset, ASSET, "asset"); assertEq(actualStream.cliffTime, params.range.cliff, "cliffTime"); assertEq(actualStream.endTime, params.range.end, "endTime"); assertEq(actualStream.isCancelable, true, "isCancelable"); @@ -217,7 +217,7 @@ abstract contract LockupLinear_Fork_Test is Fork_Test { assertEq(vars.actualNextStreamId, vars.expectedNextStreamId, "post-create nextStreamId"); // Assert that the protocol fee has been recorded. - vars.actualProtocolRevenues = lockupLinear.protocolRevenues(asset); + vars.actualProtocolRevenues = lockupLinear.protocolRevenues(ASSET); vars.expectedProtocolRevenues = vars.initialProtocolRevenues + vars.createAmounts.protocolFee; assertEq(vars.actualProtocolRevenues, vars.expectedProtocolRevenues, "post-create protocolRevenues"); @@ -228,7 +228,7 @@ abstract contract LockupLinear_Fork_Test is Fork_Test { // Load the post-create asset balances. vars.balances = - getTokenBalances(address(asset), Solarray.addresses(address(lockupLinear), holder, params.broker.account)); + getTokenBalances(address(ASSET), Solarray.addresses(address(lockupLinear), HOLDER, params.broker.account)); vars.actualLockupLinearBalance = vars.balances[0]; vars.actualHolderBalance = vars.balances[1]; vars.actualBrokerBalance = vars.balances[2]; @@ -267,7 +267,7 @@ abstract contract LockupLinear_Fork_Test is Fork_Test { if (params.withdrawAmount > 0) { // Load the pre-withdraw asset balances. vars.initialLockupLinearBalance = vars.actualLockupLinearBalance; - vars.initialRecipientBalance = asset.balanceOf(params.recipient); + vars.initialRecipientBalance = ASSET.balanceOf(params.recipient); // Expect the relevant events to be emitted. vm.expectEmit({ emitter: address(lockupLinear) }); @@ -301,7 +301,7 @@ abstract contract LockupLinear_Fork_Test is Fork_Test { // Load the post-withdraw asset balances. vars.balances = - getTokenBalances(address(asset), Solarray.addresses(address(lockupLinear), params.recipient)); + getTokenBalances(address(ASSET), Solarray.addresses(address(lockupLinear), params.recipient)); vars.actualLockupLinearBalance = vars.balances[0]; vars.actualRecipientBalance = vars.balances[1]; @@ -324,7 +324,7 @@ abstract contract LockupLinear_Fork_Test is Fork_Test { if (!vars.isDepleted && !vars.isSettled) { // Load the pre-cancel asset balances. vars.balances = getTokenBalances( - address(asset), Solarray.addresses(address(lockupLinear), params.sender, params.recipient) + address(ASSET), Solarray.addresses(address(lockupLinear), params.sender, params.recipient) ); vars.initialLockupLinearBalance = vars.balances[0]; vars.initialSenderBalance = vars.balances[1]; @@ -351,7 +351,7 @@ abstract contract LockupLinear_Fork_Test is Fork_Test { // Load the post-cancel asset balances. vars.balances = getTokenBalances( - address(asset), Solarray.addresses(address(lockupLinear), params.sender, params.recipient) + address(ASSET), Solarray.addresses(address(lockupLinear), params.sender, params.recipient) ); vars.actualLockupLinearBalance = vars.balances[0]; vars.actualSenderBalance = vars.balances[1]; diff --git a/test/fork/assets/DAI.t.sol b/test/fork/assets/DAI.t.sol index 063c2cd30..3fdb579c3 100644 --- a/test/fork/assets/DAI.t.sol +++ b/test/fork/assets/DAI.t.sol @@ -7,9 +7,9 @@ import { LockupDynamic_Fork_Test } from "../LockupDynamic.t.sol"; import { LockupLinear_Fork_Test } from "../LockupLinear.t.sol"; /// @dev A typical 18-decimal ERC-20 asset with a normal total supply. -IERC20 constant asset = IERC20(0x6B175474E89094C44Da98b954EedeAC495271d0F); -address constant holder = 0x66F62574ab04989737228D18C3624f7FC1edAe14; +IERC20 constant ASSET = IERC20(0x6B175474E89094C44Da98b954EedeAC495271d0F); +address constant HOLDER = 0x66F62574ab04989737228D18C3624f7FC1edAe14; -contract DAI_LockupDynamic_Fork_Test is LockupDynamic_Fork_Test(asset, holder) { } +contract DAI_LockupDynamic_Fork_Test is LockupDynamic_Fork_Test(ASSET, HOLDER) { } -contract DAI_LockupLinear_Fork_Test is LockupLinear_Fork_Test(asset, holder) { } +contract DAI_LockupLinear_Fork_Test is LockupLinear_Fork_Test(ASSET, HOLDER) { } diff --git a/test/fork/assets/EURS.t.sol b/test/fork/assets/EURS.t.sol index 2d100155c..969daa1bc 100644 --- a/test/fork/assets/EURS.t.sol +++ b/test/fork/assets/EURS.t.sol @@ -7,9 +7,9 @@ import { LockupDynamic_Fork_Test } from "../LockupDynamic.t.sol"; import { LockupLinear_Fork_Test } from "../LockupLinear.t.sol"; /// @dev An ERC-20 asset with 2 decimals. -IERC20 constant asset = IERC20(0xdB25f211AB05b1c97D595516F45794528a807ad8); -address constant holder = 0x9712c160925403A9458BfC6bBD7D8a1E694C984a; +IERC20 constant ASSET = IERC20(0xdB25f211AB05b1c97D595516F45794528a807ad8); +address constant HOLDER = 0x9712c160925403A9458BfC6bBD7D8a1E694C984a; -contract EURS_LockupDynamic_Fork_Test is LockupDynamic_Fork_Test(asset, holder) { } +contract EURS_LockupDynamic_Fork_Test is LockupDynamic_Fork_Test(ASSET, HOLDER) { } -contract EURS_LockupLinear_Fork_Test is LockupLinear_Fork_Test(asset, holder) { } +contract EURS_LockupLinear_Fork_Test is LockupLinear_Fork_Test(ASSET, HOLDER) { } diff --git a/test/fork/assets/SHIB.t.sol b/test/fork/assets/SHIB.t.sol index 0e755b45e..e8d321a03 100644 --- a/test/fork/assets/SHIB.t.sol +++ b/test/fork/assets/SHIB.t.sol @@ -7,9 +7,9 @@ import { LockupDynamic_Fork_Test } from "../LockupDynamic.t.sol"; import { LockupLinear_Fork_Test } from "../LockupLinear.t.sol"; /// @dev An ERC-20 asset with a large total supply. -IERC20 constant asset = IERC20(0x95aD61b0a150d79219dCF64E1E6Cc01f0B64C4cE); -address constant holder = 0x73AF3bcf944a6559933396c1577B257e2054D935; +IERC20 constant ASSET = IERC20(0x95aD61b0a150d79219dCF64E1E6Cc01f0B64C4cE); +address constant HOLDER = 0x73AF3bcf944a6559933396c1577B257e2054D935; -contract SHIB_LockupDynamic_Fork_Test is LockupDynamic_Fork_Test(asset, holder) { } +contract SHIB_LockupDynamic_Fork_Test is LockupDynamic_Fork_Test(ASSET, HOLDER) { } -contract SHIB_LockupLinear_Fork_Test is LockupLinear_Fork_Test(asset, holder) { } +contract SHIB_LockupLinear_Fork_Test is LockupLinear_Fork_Test(ASSET, HOLDER) { } diff --git a/test/fork/assets/USDC.t.sol b/test/fork/assets/USDC.t.sol index 5956d558f..ea79ae380 100644 --- a/test/fork/assets/USDC.t.sol +++ b/test/fork/assets/USDC.t.sol @@ -7,9 +7,9 @@ import { LockupDynamic_Fork_Test } from "../LockupDynamic.t.sol"; import { LockupLinear_Fork_Test } from "../LockupLinear.t.sol"; /// @dev An ERC-20 asset with 6 decimals. -IERC20 constant asset = IERC20(0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48); -address constant holder = 0x09528d637deb5857dc059dddE6316D465a8b3b69; +IERC20 constant ASSET = IERC20(0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48); +address constant HOLDER = 0x09528d637deb5857dc059dddE6316D465a8b3b69; -contract USDC_LockupDynamic_Fork_Test is LockupDynamic_Fork_Test(asset, holder) { } +contract USDC_LockupDynamic_Fork_Test is LockupDynamic_Fork_Test(ASSET, HOLDER) { } -contract USDC_LockupLinear_Fork_Test is LockupLinear_Fork_Test(asset, holder) { } +contract USDC_LockupLinear_Fork_Test is LockupLinear_Fork_Test(ASSET, HOLDER) { } diff --git a/test/fork/assets/USDT.t.sol b/test/fork/assets/USDT.t.sol index 93f78ae2d..421144ca1 100644 --- a/test/fork/assets/USDT.t.sol +++ b/test/fork/assets/USDT.t.sol @@ -7,9 +7,9 @@ import { LockupDynamic_Fork_Test } from "../LockupDynamic.t.sol"; import { LockupLinear_Fork_Test } from "../LockupLinear.t.sol"; /// @dev An ERC-20 asset that suffers from the missing return value bug. -IERC20 constant asset = IERC20(0xdAC17F958D2ee523a2206206994597C13D831ec7); -address constant holder = 0xee5B5B923fFcE93A870B3104b7CA09c3db80047A; +IERC20 constant ASSET = IERC20(0xdAC17F958D2ee523a2206206994597C13D831ec7); +address constant HOLDER = 0xee5B5B923fFcE93A870B3104b7CA09c3db80047A; -contract USDT_LockupDynamic_Fork_Test is LockupDynamic_Fork_Test(asset, holder) { } +contract USDT_LockupDynamic_Fork_Test is LockupDynamic_Fork_Test(ASSET, HOLDER) { } -contract USDT_LockupLinear_Fork_Test is LockupLinear_Fork_Test(asset, holder) { } +contract USDT_LockupLinear_Fork_Test is LockupLinear_Fork_Test(ASSET, HOLDER) { } From 79e4f5df45501531d47daa67542329d32cf1cbc6 Mon Sep 17 00:00:00 2001 From: Paul Razvan Berg Date: Thu, 12 Oct 2023 14:15:40 +0100 Subject: [PATCH 25/47] docs: polish background description --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 7a0877e3d..76437d1f3 100644 --- a/README.md +++ b/README.md @@ -16,13 +16,13 @@ In-depth documentation is available at [docs.sablier.com](https://docs.sablier.c ## Background -Sablier is a smart contract protocol that enables trustless streaming of ERC-20 assets. In this context, streaming means -the ability to make payments by the second. +Sablier is a token streaming protocol that enables by-the-second payments in web3. DAOs and businesses use it for +vesting, payroll, airdrops, and more. -The protocol features two streaming models called Lockup Linear and Lockup Dynamic, in which the sender locks up a -specified amount of ERC-20 assets in a contract. The contract progressively allocates the funds to the designated -recipient, who can access them as they become available over time. The streaming rate is influenced by various factors, -including the start and end times, as well as the total amount of assets locked up. +The sender of a payment stream first deposits a specific amount of ERC-20 tokens in a contract. Then, the contract +progressively allocates the funds to the recipient, who can access them as they become available over time. The payment +rate is influenced by various factors, including the start and end times, as well as the total amount of tokens +deposited. ## Install From d3c96a030eac4edc5f50e9cb2420a3e810a2a286 Mon Sep 17 00:00:00 2001 From: Paul Razvan Berg Date: Sat, 14 Oct 2023 13:21:13 +0100 Subject: [PATCH 26/47] chore: remove "cbor_metadata" --- foundry.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/foundry.toml b/foundry.toml index 0f575053b..7f7a0d690 100644 --- a/foundry.toml +++ b/foundry.toml @@ -1,7 +1,6 @@ [profile.default] auto_detect_solc = false bytecode_hash = "none" - cbor_metadata = false emv_version = "paris" fs_permissions = [{ access = "read", path = "out-optimized" }] libs = ["lib"] From bc4be5b7d848026f9c076796f7247bf0c11d4474 Mon Sep 17 00:00:00 2001 From: andreivladbrg Date: Thu, 12 Oct 2023 19:47:28 +0300 Subject: [PATCH 27/47] perf: optimize withdraw function --- src/abstracts/SablierV2Lockup.sol | 12 +++++++----- test/utils/Precompiles.sol | 4 ++-- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/abstracts/SablierV2Lockup.sol b/src/abstracts/SablierV2Lockup.sol index b0b81ef6f..e269e5c54 100644 --- a/src/abstracts/SablierV2Lockup.sol +++ b/src/abstracts/SablierV2Lockup.sol @@ -246,13 +246,18 @@ abstract contract SablierV2Lockup is revert Errors.SablierV2Lockup_StreamDepleted(streamId); } + bool isCallerStreamSender = _isCallerStreamSender(streamId); + // Checks: `msg.sender` is the stream's sender, the stream's recipient, or an approved third party. - if (!_isCallerStreamSender(streamId) && !_isCallerStreamRecipientOrApproved(streamId)) { + if (!isCallerStreamSender && !_isCallerStreamRecipientOrApproved(streamId)) { revert Errors.SablierV2Lockup_Unauthorized(streamId, msg.sender); } + // Retrieve the recipient from storage. + address recipient = _ownerOf(streamId); + // Checks: if `msg.sender` is the stream's sender, the withdrawal address must be the recipient. - if (_isCallerStreamSender(streamId) && to != _ownerOf(streamId)) { + if (isCallerStreamSender && to != recipient) { revert Errors.SablierV2Lockup_InvalidSenderWithdrawal(streamId, msg.sender, to); } @@ -275,9 +280,6 @@ abstract contract SablierV2Lockup is // Effects and Interactions: make the withdrawal. _withdraw(streamId, to, amount); - // Retrieve the recipient from storage. - address recipient = _ownerOf(streamId); - // Interactions: if `msg.sender` is not the recipient and the recipient is a contract, try to invoke the // withdraw hook on it without reverting if the hook is not implemented, and also without bubbling up // any potential revert. diff --git a/test/utils/Precompiles.sol b/test/utils/Precompiles.sol index f80ed164f..f6185614f 100644 --- a/test/utils/Precompiles.sol +++ b/test/utils/Precompiles.sol @@ -27,9 +27,9 @@ contract Precompiles { bytes public constant BYTECODE_COMPTROLLER = hex"60803461009857601f6104a638819003918201601f19168301916001600160401b0383118484101761009d5780849260209460405283398101031261009857516001600160a01b0381169081900361009857600080546001600160a01b0319168217815560405191907fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a36103f290816100b48239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe608060408181526004918236101561001657600080fd5b600092833560e01c9182634d81e51d1461039d5750816375829def146102e5578163907a267b14610253578163b5b3ca2c146101ab578163cb01e30e146100f957508063dcf844a7146100c3578063e07df5b4146100a55763f851a4401461007d57600080fd5b346100a157816003193601126100a1576001600160a01b0360209254169051908152f35b5080fd5b50346100a157816003193601126100a1576020906001549051908152f35b50346100a15760203660031901126100a157806020926001600160a01b036100e96103d7565b1681526003845220549051908152f35b9050346101a75760203660031901126101a7576101146103d7565b6001600160a01b03918285541633810361017a575050169081835260026020528083209081549160ff8316159260ff84169060ff1916179055519081527f8cd3a7bc46b26a3b0c07a05a47af78abcaa647626f631d92ea64f8867b23bbec60203392a380f35b84516331b339a960e21b81526001600160a01b039091169181019182523360208301529081906040010390fd5b8280fd5b9050346101a757816003193601126101a7576101c56103d7565b90602435916001600160a01b039182865416338103610226575050907f371789a3d97098f3070492613273a065a7e8a19e009fd1ae92a4b4d4c71ed62d9116928385526003602052808520928084549455815193845260208401523392a380f35b85516331b339a960e21b81526001600160a01b039091169181019182523360208301529081906040010390fd5b919050346101a75760203660031901126101a7578135916001600160a01b038454163381036102b85750507fc059ba3e07a1c4d1fa8845bdb2af2dd85e844684e0a59e6073499e4338788465906001549280600155815193845260208401523392a280f35b82516331b339a960e21b81526001600160a01b039091169181019182523360208301529081906040010390fd5b919050346101a75760203660031901126101a7578135916001600160a01b03918284168094036103995784549283169033820361036d575050507fffffffffffffffffffffffff00000000000000000000000000000000000000001681178255337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808380a380f35b516331b339a960e21b81526001600160a01b039091169181019182523360208301529081906040010390fd5b8480fd5b849084346101a75760203660031901126101a75760ff906020936001600160a01b036103c76103d7565b1681526002855220541615158152f35b600435906001600160a01b03821682036103ed57565b600080fd"; bytes public constant BYTECODE_LOCKUP_DYNAMIC = - hex"60c0346200046e57601f6200605838819003918201601f19168301916001600160401b038311848410176200032b578084926080946040528339810103126200046e5780516001600160a01b038082169290918390036200046e5760208101518281168091036200046e5760408201519183831683036200046e5760600151936200008962000473565b90601d82527f5361626c696572205632204c6f636b75702044796e616d6963204e46540000006020830152620000be62000473565b601181527029a0a116ab1916a627a1a5aaa816a22ca760791b602082015230608052600080546001600160a01b03199081168417825560018054909116909517909455927fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a38051906001600160401b0382116200032b5760035490600182811c9216801562000463575b60208310146200044d5781601f849311620003d8575b50602090601f83116001146200034d5760009262000341575b50508160011b916000199060031b1c1916176003555b80516001600160401b0381116200032b576004918254600181811c9116801562000320575b60208210146200030b579081601f849311620002b3575b50602090601f831160011462000248576000926200023c575b50508160011b916000199060031b1c19161790555b1660018060a01b0319600a541617600a5560a0526001600955604051615bc490816200049482396080518161562b015260a0518181816112d20152614b800152f35b015190503880620001e5565b6000858152602081209350601f198516905b8181106200029a575090846001959493921062000280575b505050811b019055620001fa565b015160001960f88460031b161c1916905538808062000272565b929360206001819287860151815501950193016200025a565b909150836000526020600020601f840160051c8101916020851062000300575b90601f859493920160051c01905b818110620002f05750620001cc565b60008155849350600101620002e1565b9091508190620002d3565b602284634e487b7160e01b6000525260246000fd5b90607f1690620001b5565b634e487b7160e01b600052604160045260246000fd5b0151905038806200017a565b600360009081527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b9350601f198516905b818110620003bf5750908460019594939210620003a5575b505050811b0160035562000190565b015160001960f88460031b161c1916905538808062000396565b929360206001819287860151815501950193016200037e565b60036000529091507fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f840160051c8101916020851062000442575b90601f859493920160051c01905b81811062000432575062000161565b6000815584935060010162000423565b909150819062000415565b634e487b7160e01b600052602260045260246000fd5b91607f16916200014b565b600080fd5b60408051919082016001600160401b038111838210176200032b5760405256fe608080604052600436101561001357600080fd5b60003560e01c90816301ffc9a714612c835750806306fdde0314612bc0578063081812fc14612ba2578063095ea7b314612a0e5780631400ecec1461296957806316844456146126ee5780631c1cdd4c146126885780631e99d5691461266a57806323b872dd1461264157806339a73c03146125fe57806340e58ee514612266578063425d30dd1461224857806342842e0e146121f857806342966c681461209a5780634857501f146120245780634869e12d14611fe85780635fe3b56714611fc15780636352211e14611f925780636d0cee7514611f3a57806370a0823114611e9057806375829def14611dfe5780637cad6cd114611d2c5780637de6b1db14611b035780638659c270146116b4578063894e9a0d146114475780638bad38dd146113cb5780638f69b993146113485780639067b677146112f55780639188ec84146112ba57806395d89b41146111ac578063a22cb465146110db578063a2ffb89714610fe2578063a6202bf214610ee2578063a80fc07114610e8d578063ad35efd414610e2a578063b256456914610e0c578063b637b86514610dac578063b88d4fde14610d21578063b8a3be6614610cea578063b971302a14610c98578063bc063e1a14610c75578063bc2be1be14610c22578063c156a11d14610b53578063c33cd35e14610a3e578063c87b56dd1461090b578063cc364f4814610871578063d4dbd20b1461081c578063d511609f146107cd578063d975dfed14610780578063e985e9c514610729578063ea5ead19146106d8578063eac8f5b81461066c578063f590c17614610644578063f851a4401461061d5763fdd46d601461027c57600080fd5b346104c15760603660031901126104c157600435610298612db0565b90604435906001600160801b03808316938484036104c1576102b8615621565b6102c18361369e565b610605576102e583600052600b6020526001600160a01b0360406000205416331490565b15806105f5575b6105d25761031083600052600b6020526001600160a01b0360406000205416331490565b806105ae575b610581576001600160a01b0390818116928315610557578615610526578061033d866156e3565b1680881161050257506103d69187918660005261039a61036e602099600b8b5260026040600020015460801c6159e0565b88600052600b8a52600260406000200190836001600160801b031983549260801b169116178155613633565b906103b6818a84015116928260408183511692015116906136d5565b1611156104d0575b85600052600b8752836001604060002001541661567d565b82600052600584526040600020541680331415806104c6575b610438575b50817ffa54f9f9bdcdd28778cbb9f78490df6691cc4e2729588e10f4cc0a26c465686a84600080516020615ba483398151915296604051908152a3604051908152a1005b803b156104c1577ffa54f9f9bdcdd28778cbb9f78490df6691cc4e2729588e10f4cc0a26c465686a84600080516020615ba48339815191529660008087956084604051809481936313375c3b60e01b83528a60048401523360248401528b60448401528760648401525af16104b2575b50965050506103f4565b6104bb90612f23565b386104a8565b600080fd5b50803b15156103ef565b85600052600b8752604060002060018101600160a01b60ff60a01b1982541617905560ff60f01b1981541690556103be565b85606491896040519263287ecaef60e21b8452600484015260248301526044820152fd5b602485604051907fd2aabcd90000000000000000000000000000000000000000000000000000000082526004820152fd5b60046040517fc61a0e9e000000000000000000000000000000000000000000000000000000008152fd5b826001600160a01b0360649260405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b508260005260056020526001600160a01b0380604060002054169082161415610316565b60405163216caf0d60e01b815260048101849052336024820152604490fd5b0390fd5b506105ff836159fb565b156102ec565b60248360405190634a5541ef60e01b82526004820152fd5b346104c15760003660031901126104c15760206001600160a01b0360005416604051908152f35b346104c15760203660031901126104c15760206106626004356136ee565b6040519015158152f35b346104c15760203660031901126104c15760043580600052600b60205260ff60016040600020015460a81c16156106c157600052600b60205260206001600160a01b0360016040600020015416604051908152f35b6024906040519062b8e7e760e51b82526004820152fd5b346104c15760403660031901126104c157600080516020615ba48339815191526020600435610720610708612db0565b610711836156e3565b9061071a615621565b8361571b565b604051908152a1005b346104c15760403660031901126104c157610742612d9a565b61074a612db0565b906001600160a01b03809116600052600860205260406000209116600052602052602060ff604060002054166040519015158152f35b346104c15760203660031901126104c15760043580600052600b60205260ff60016040600020015460a81c16156106c1576107bc6020916156e3565b6001600160801b0360405191168152f35b346104c15760203660031901126104c15760043580600052600b60205260ff60016040600020015460a81c16156106c157600052600b602052602060026040600020015460801c604051908152f35b346104c15760203660031901126104c15760043580600052600b60205260ff60016040600020015460a81c16156106c157600052600b60205260206001600160801b0360036040600020015416604051908152f35b346104c15760203660031901126104c1576004356000602060405161089581612eea565b828152015280600052600b60205260ff60016040600020015460a81c16156106c157600052600b6020526040806000205464ffffffffff8251916108d883612eea565b818160a01c16835260c81c166020820152610909825180926020908164ffffffffff91828151168552015116910152565bf35b346104c1576020806003193601126104c157600435906109496109448360005260056020526001600160a01b0360406000205416151590565b612f89565b60006001600160a01b03600a5416926044604051809581937fe9dc637500000000000000000000000000000000000000000000000000000000835230600484015260248301525afa918215610a32576000926109b9575b506109b5604051928284938452830190612d75565b0390f35b9091503d806000833e6109cc8183612f37565b81019082818303126104c15780519067ffffffffffffffff82116104c1570181601f820112156104c1578051610a0181612f59565b92610a0f6040519485612f37565b8184528482840101116104c157610a2b91848085019101612d52565b90826109a0565b6040513d6000823e3d90fd5b346104c1576003196020368201126104c1576004359067ffffffffffffffff908183116104c1576101409083360301126104c157610a7a615621565b60405191610a8783612ecd565b610a9381600401612dc6565b8352610aa16024820161371f565b6020840152610ab260448201612ea4565b6040840152610ac360648201612ea4565b6060840152610ad460848201612dc6565b6080840152610ae560a48201612f75565b60a0840152610af660c48201612dc6565b60c0840152610b083660e48301613805565b60e08401526101248101359182116104c15701366023820112156104c157602091610b40610b4b923690602460048201359101613731565b610100820152614ad1565b604051908152f35b346104c15760403660031901126104c157600435610b6f612db0565b610b77615621565b81600052600b60205260ff60016040600020015460a81c1615610c0b578160005260056020526001600160a01b03604060002054168033036105d2579161072081602093600080516020615ba483398151915295610bd4836156e3565b6001600160801b038116610be9575b5061321c565b610bfc90610bf5615621565b828561571b565b8686604051858152a187610be3565b6024826040519062b8e7e760e51b82526004820152fd5b346104c15760203660031901126104c15760043580600052600b60205260ff60016040600020015460a81c16156106c157600052600b602052602064ffffffffff60406000205460a01c16604051908152f35b346104c15760003660031901126104c157602060405167016345785d8a00008152f35b346104c15760203660031901126104c15760043580600052600b60205260ff60016040600020015460a81c16156106c157600052600b60205260206001600160a01b0360406000205416604051908152f35b346104c15760203660031901126104c157600435600052600b602052602060ff60016040600020015460a81c166040519015158152f35b346104c15760803660031901126104c157610d3a612d9a565b610d42612db0565b6064359167ffffffffffffffff83116104c157366023840112156104c157826004013591610d6f83612f59565b92610d7d6040519485612f37565b80845236602482870101116104c1576020816000926024610daa98018388013785010152604435916130a7565b005b346104c15760203660031901126104c15760043580600052600b60205260ff60016040600020015460a81c16156106c157600052600b6020526109b5610df86004604060002001613586565b604051918291602083526020830190612e40565b346104c15760203660031901126104c1576020610662600435613667565b346104c15760203660031901126104c15760043580600052600b60205260ff60016040600020015460a81c16156106c157610e64906149d5565b6040516005821015610e77576020918152f35b634e487b7160e01b600052602160045260246000fd5b346104c15760203660031901126104c15760043580600052600b60205260ff60016040600020015460a81c16156106c157600052600b60205260206001600160801b0360026040600020015416604051908152f35b346104c15760203660031901126104c157610efb612d9a565b6001600160a01b038060005416338103610fb957508116908160005260026020526001600160801b0360406000205416908115610f885781610f5a9184600052600260205260406000206001600160801b03198154169055339061567d565b6040519081527fca7a4a65a94ed2f37538814e00e1cd4c41a78261561e3f3794592f11409cf5af60203392a3005b602483604051907f8410168c0000000000000000000000000000000000000000000000000000000082526004820152fd5b6040516331b339a960e21b81526001600160a01b03919091166004820152336024820152604490fd5b346104c15760603660031901126104c15767ffffffffffffffff6004358181116104c157611014903690600401612e0f565b61101c612db0565b926044359081116104c157611035903690600401612e0f565b919061103f615621565b8282036110a45760005b82811061105257005b80600080516020615ba48339815191526020611071600194878a61570b565b35611097611088611083868b8a61570b565b6137f1565b611090615621565b8b8361571b565b604051908152a101611049565b50604491604051917faec9344000000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b346104c15760403660031901126104c1576110f4612d9a565b602435908115158092036104c1576001600160a01b03169081331461116857336000526008602052604060002082600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a3005b606460405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152fd5b346104c15760003660031901126104c157604051600060045490600182811c918184169182156112b0575b602094858510841461129a57858794868652918260001461127a57505060011461121d575b5061120992500383612f37565b6109b5604051928284938452830190612d75565b84915060046000527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b906000915b8583106112625750506112099350820101856111fc565b8054838901850152879450869390920191810161124b565b60ff19168582015261120995151560051b85010192508791506111fc9050565b634e487b7160e01b600052602260045260246000fd5b92607f16926111d7565b346104c15760003660031901126104c15760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346104c15760203660031901126104c15760043580600052600b60205260ff60016040600020015460a81c16156106c157600052600b602052602064ffffffffff60406000205460c81c16604051908152f35b346104c15760203660031901126104c15760043580600052600b60205260ff60016040600020015460a81c16156106c157611382906149d5565b600581101580610e7757600282149081156113be575b81156113ac575b6020826040519015158152f35b9050610e77576004602091148261139f565b5050600381146000611398565b346104c15760203660031901126104c1576004356001600160a01b03908181168091036104c1578160005416338103610fb9575060015491816001600160a01b03198416176001556040519216825260208201527fdcb09aef4bf01068924ccce937981cbe59d25ba08380cf941aaaea4e4bd3960d60403392a2005b346104c15760203660031901126104c157606061014060405161146981612f06565b60008152600060208201526000604082015260008382015260006080820152600060a0820152600060c0820152600060e082015260006101008201526114ad613614565b6101208201520152600435600052600b60205260ff60016040600020015460a81c161561169c57600435600052600b60205260406000206115906004604051926114f684612f06565b80546001600160a01b038116855264ffffffffff8160a01c16602086015264ffffffffff8160c81c16604086015260ff8160f01c161515606086015260f81c1515608085015260ff60018201546001600160a01b03811660a0870152818160a01c16151560c0870152818160a81c16151560e087015260b01c16151561010085015261158460028201613633565b61012085015201613586565b6101408201526115a16004356149d5565b906005821015610e775760026101409214611690575b6109b5604051928392602084526001600160a01b03815116602085015264ffffffffff602082015116604085015264ffffffffff60408201511660608501526060810151151560808501526080810151151560a08501526001600160a01b0360a08201511660c085015260c0810151151560e085015260e08101511515610100850152610100810151151561012085015261167c61012082015183860190604090816001600160801b0391828151168552826020820151166020860152015116910152565b01516101a0808401526101c0830190612e40565b600060608201526115b7565b602460405162b8e7e760e51b81526004356004820152fd5b346104c1576020806003193601126104c15760043567ffffffffffffffff81116104c1576116e6903690600401612e0f565b906116ef615621565b6000915b8083106116fc57005b61170783828461570b565b3592611711615621565b61171a8461369e565b156117375760248460405190634a5541ef60e01b82526004820152fd5b611743849293946136ee565b611aeb5761176782600052600b6020526001600160a01b0360406000205416331490565b1580611acb575b611aac5761177b82613834565b82600052600b928387526117956002604060002001613633565b936001600160801b0392838651168482161015611a94578260005281895260ff60406000205460f01c1615611a7c57906117e482858b6117da819796838c51166136d5565b99015116906136d5565b93826000528184526040600020966003885498600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8b1617815583881615611a62575b0191811691826001600160801b031982541617905561186e6001600160a01b03809916926005875289604060002054169487528360019a8b604060002001541661567d565b33820361197f57823b6118db575b7f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd2600080516020615ba48339815191529685925b604080516001600160801b03928316815292909116602083015290a4604051908152a10191906116f3565b9350813b156104c1576040516372eba20360e01b8152600481018490526001600160a01b03821660248201526001600160801b03858116604483015286166064820152600080516020615ba4833981519152958b9585927f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd2929190600081608481838b5af1611970575b50925096505061187c565b61197990612f23565b8e611965565b813b6119be575b7f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd2600080516020615ba48339815191529685926118b0565b9350803b156104c1576040516372eba20360e01b8152600481018490526001600160a01b03831660248201526001600160801b03858116604483015286166064820152600080516020615ba4833981519152958b9585927f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd2929190600081608481838a5af1611a53575b509250965050611986565b611a5c90612f23565b8e611a48565b60018101600160a01b60ff60a01b19825416179055611829565b602483604051906339c6dc7360e21b82526004820152fd5b602483604051906322cad1af60e11b82526004820152fd5b60405163216caf0d60e01b815260048101839052336024820152604490fd5b5081600052600585526001600160a01b036040600020541633141561176e565b6024826040519063fe19f19f60e01b82526004820152fd5b346104c1576020806003193601126104c157600435611b20615621565b80600052600b825260ff60016040600020015460a81c16156106c157611b45816149d5565b916000926005811015610e775760048103611b725760248360405190634a5541ef60e01b82526004820152fd5b60038103611b92576024836040519063fe19f19f60e01b82526004820152fd5b916002849314611d1457611bbc81600052600b6020526001600160a01b0360406000205416331490565b15611cf45780600052600b825260ff60406000205460f01c1615611cdc5780600052600b8252604060002060ff60f01b198154169055600582526001600160a01b0360406000205416803b611c4a575b50807f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f84600080516020615ba483398151915295a2604051908152a1005b803b156104c157600080516020615ba48339815191529360008084936024604051809481937f341a0bd90000000000000000000000000000000000000000000000000000000083528860048401525af1611ca7575b509350611c0c565b9050611cb39150612f23565b8060007f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f611c9f565b602490604051906339c6dc7360e21b82526004820152fd5b60405163216caf0d60e01b81526004810191909152336024820152604490fd5b602490604051906322cad1af60e11b82526004820152fd5b346104c15760203660031901126104c1576004356001600160a01b03908181168091036104c1578160005416338103610fb95750600a5491816001600160a01b0319841617600a556040519216825260208201527fa2548bd4b805e907c1558a47b5858324fe8bb4a2e1ddfca647eecbf65610eebc60403392a26009546000198101908111611de85760407f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c91815190600182526020820152a1005b634e487b7160e01b600052601160045260246000fd5b346104c15760203660031901126104c157611e17612d9a565b6000546001600160a01b0380821692338403611e69576001600160a01b03199350169182911617600055337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf80600080a3005b6040516331b339a960e21b81526001600160a01b0385166004820152336024820152604490fd5b346104c15760203660031901126104c1576001600160a01b03611eb1612d9a565b168015611ed05760005260066020526020604060002054604051908152f35b608460405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e657200000000000000000000000000000000000000000000006064820152fd5b346104c15760203660031901126104c157600435611f716109448260005260056020526001600160a01b0360406000205416151590565b600052600560205260206001600160a01b0360406000205416604051908152f35b346104c15760203660031901126104c1576020611fb0600435612fd4565b6001600160a01b0360405191168152f35b346104c15760003660031901126104c15760206001600160a01b0360015416604051908152f35b346104c15760203660031901126104c15760043580600052600b60205260ff60016040600020015460a81c16156106c1576107bc602091614a56565b346104c15760203660031901126104c15760043580600052600b60205260ff60016040600020015460a81c16156106c1576000612060826149d5565b6005811015610e775760020361207e575b6020906040519015158152f35b50600052600b602052602060ff60406000205460f01c16612071565b346104c15760203660031901126104c1576004356120b6615621565b6120bf8161369e565b156121c7576120cd816159fb565b15611cf4576120db81612fd4565b6120e482613667565b1590816121be575b816121ab575b5061219357602081612112600080516020615ba483398151915293612fd4565b9080600052600783526001600160a01b036040600020926001600160a01b031993848154169055169182600052600684526040600020600019815401905581600052600584526040600020908154169055806000604051937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a48152a1005b602490604051906378630aa960e01b82526004820152fd5b6001600160a01b039150161515826120f2565b600091506120ec565b602490604051907f817cd6390000000000000000000000000000000000000000000000000000000082526004820152fd5b346104c15761220636612dda565b60405191602083019383851067ffffffffffffffff86111761223257610daa94604052600084526130a7565b634e487b7160e01b600052604160045260246000fd5b346104c15760203660031901126104c157602061066260043561369e565b346104c1576020806003193601126104c15760043590612284615621565b61228d8261369e565b156122aa5760248260405190634a5541ef60e01b82526004820152fd5b6122b3826136ee565b611aeb576122d782600052600b6020526001600160a01b0360406000205416331490565b15806125de575b611aac576122eb82613834565b9180600052600b82526123046002604060002001613633565b926001600160801b0390818551168282161015611a945782600052600b845260ff60406000205460f01c1615611a7c5780828561234761235194838a51166136d5565b97015116906136d5565b9082600052600b84526040600020916003835493600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8616178155838316156125c4575b0191861691826001600160801b03198254161790556123dc6001600160a01b03809416926005875283856040600020541695600b89526001604060002001541661567d565b3382036124e457823b612443575b7f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd28491600080516020615ba4833981519152975b604080516001600160801b03928316815292909116602083015290a4604051908152a1005b823b156104c1576040516372eba20360e01b8152600481018590526001600160a01b03831660248201526001600160801b03878116604483015282166064820152600080516020615ba48339815191529685927f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd292909190600081608481838b5af16124d5575b5097509150506123ea565b6124de90612f23565b896124ca565b813b612523575b7f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd28491600080516020615ba48339815191529761241e565b813b156104c1576040516372eba20360e01b8152600481018590526001600160a01b03841660248201526001600160801b03878116604483015282166064820152600080516020615ba48339815191529685927f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd292909190600081608481838a5af16125b5575b5097509150506124eb565b6125be90612f23565b896125aa565b60018101600160a01b60ff60a01b19825416179055612397565b5081600052600581526001600160a01b03604060002054163314156122de565b346104c15760203660031901126104c1576001600160a01b0361261f612d9a565b16600052600260205260206001600160801b0360406000205416604051908152f35b346104c157610daa61265236612dda565b91612665612660843361313d565b613036565b61321c565b346104c15760003660031901126104c1576020600954604051908152f35b346104c15760203660031901126104c15760043580600052600b60205260ff60016040600020015460a81c16156106c1576126c2906149d5565b6005811015610e775780602091159081156126e3575b506040519015158152f35b6001915014826126d8565b346104c157602060031981813601126104c1576004359067ffffffffffffffff908183116104c157610120833603918201126104c15761272c615621565b61010483013590602219018112156104c15782016004810135908282116104c15760240160608202360381136104c157612767913691613731565b918251906127748261356e565b916127826040519384612f37565b808352601f196127918261356e565b018660005b8281106129535750505064ffffffffff90814216946001600160801b0396876127be8261389f565b515116828a6127cc8461389f565b51015116858060406127dd8661389f565b510151168a011690604051926127f284612eb1565b83528b83015260408201526128068761389f565b526128108661389f565b5060019386855b8a8c8783106128d257908b846001600160a01b038c60a4810135828116908190036104c157610b4b95612892956128c294612854602486016137d0565b612860604487016137d0565b61286c606488016137dd565b91612879886004016137dd565b948461288760848b016137f1565b966040519d8e612ecd565b168c528d8c0152151560408b0152151560608a01521660808801521660a086015260c085015260c4369101613805565b60e0830152610100820152614ad1565b8893858060406129068b866128f68a8e9a6128ed828d6138c2565b5151169a6138c2565b51015116946000198901906138c2565b51015116816040612917888c6138c2565b510151160116916040519361292b85612eb1565b8452830152604082015261293f828b6138c2565b5261294a818a6138c2565b50018790612817565b61295b613614565b828288010152018790612796565b346104c15760203660031901126104c15760043580600052600b60205260ff60016040600020015460a81c16156106c15760209060009080600052600b8352604060002060ff815460f01c16806129fc575b6129d3575b50506001600160801b0360405191168152f35b6129f592506001600160801b0360026129ef9201541691613834565b906136d5565b82806129c0565b5060ff600182015460a01c16156129bb565b346104c15760403660031901126104c157612a27612d9a565b602435906001600160a01b038080612a3e85612fd4565b16921691808314612b3857803314908115612b13575b5015612aa9578260005260076020526040600020826001600160a01b0319825416179055612a8183612fd4565b167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b608460405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152fd5b9050600052600860205260406000203360005260205260ff6040600020541684612a54565b608460405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152fd5b346104c15760203660031901126104c1576020611fb0600435612ff9565b346104c15760003660031901126104c157604051600060035490600182811c91818416918215612c79575b602094858510841461129a57858794868652918260001461127a575050600114612c1c575061120992500383612f37565b84915060036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b906000915b858310612c615750506112099350820101856111fc565b80548389018501528794508693909201918101612c4a565b92607f1692612beb565b346104c15760203660031901126104c157600435907fffffffff0000000000000000000000000000000000000000000000000000000082168092036104c157817f80ac58cd0000000000000000000000000000000000000000000000000000000060209314908115612d28575b8115612cfe575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501483612cf7565b7f5b5e139f0000000000000000000000000000000000000000000000000000000081149150612cf0565b60005b838110612d655750506000910152565b8181015183820152602001612d55565b90602091612d8e81518092818552858086019101612d52565b601f01601f1916010190565b600435906001600160a01b03821682036104c157565b602435906001600160a01b03821682036104c157565b35906001600160a01b03821682036104c157565b60609060031901126104c1576001600160a01b039060043582811681036104c1579160243590811681036104c1579060443590565b9181601f840112156104c15782359167ffffffffffffffff83116104c1576020808501948460051b0101116104c157565b90815180825260208080930193019160005b828110612e60575050505090565b835180516001600160801b031686528083015167ffffffffffffffff168684015260409081015164ffffffffff169086015260609094019392810192600101612e52565b359081151582036104c157565b6060810190811067ffffffffffffffff82111761223257604052565b610120810190811067ffffffffffffffff82111761223257604052565b6040810190811067ffffffffffffffff82111761223257604052565b610160810190811067ffffffffffffffff82111761223257604052565b67ffffffffffffffff811161223257604052565b90601f8019910116810190811067ffffffffffffffff82111761223257604052565b67ffffffffffffffff811161223257601f01601f191660200190565b35906001600160801b03821682036104c157565b15612f9057565b606460405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152fd5b60005260056020526001600160a01b0360406000205416612ff6811515612f89565b90565b61301c6109448260005260056020526001600160a01b0360406000205416151590565b60005260076020526001600160a01b036040600020541690565b1561303d57565b608460405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f766564000000000000000000000000000000000000006064820152fd5b906130cb9392916130bb612660843361313d565b6130c683838361321c565b6133d5565b156130d257565b60405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b906001600160a01b03808061315184612fd4565b16931691838314938415613184575b50831561316e575b50505090565b61317a91929350612ff9565b1614388080613168565b909350600052600860205260406000208260005260205260ff604060002054169238613160565b156131b257565b608460405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152fd5b90613245929161322b83612fd4565b916001600160a01b039485938480941696879116146131ab565b169081158061333c5761325784613667565b159081613333575b508061332a575b6133125791808492613294600080516020615ba48339815191529660209661328d85612fd4565b16146131ab565b60009382855260078652604085206001600160a01b031990818154169055818652600687526040862060001981540190558286526040862060018154019055838652600587528260408720918254161790557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6040519580a48152a1565b602483604051906378630aa960e01b82526004820152fd5b50831515613266565b9050153861325f565b608460405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152fd5b3d156133d0573d906133b682612f59565b916133c46040519384612f37565b82523d6000602084013e565b606090565b9290803b156135655761343f916020916001600160a01b0394604051809581948293897f150b7a02000000000000000000000000000000000000000000000000000000009b8c86523360048701521660248501526044840152608060648401526084830190612d75565b03916000968791165af1908290826134fe575b50506134d8576134606133a5565b805190816134d35760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000161490565b909192506020813d821161355d575b8161351a60209383612f37565b810103126135595751907fffffffff00000000000000000000000000000000000000000000000000000000821682036135565750903880613452565b80fd5b5080fd5b3d915061350d565b50505050600190565b67ffffffffffffffff81116122325760051b60200190565b9081546135928161356e565b926040936135a285519182612f37565b828152809460208092019260005281600020906000935b8585106135c857505050505050565b600184819284516135d881612eb1565b64ffffffffff87546001600160801b038116835267ffffffffffffffff8160801c168584015260c01c16868201528152019301940193916135b9565b6040519061362182612eb1565b60006040838281528260208201520152565b9060405161364081612eb1565b6040819360018154916001600160801b0392838116865260801c6020860152015416910152565b80600052600b60205260ff60016040600020015460a81c16156106c157600052600b60205260ff60016040600020015460b01c1690565b80600052600b60205260ff60016040600020015460a81c16156106c157600052600b60205260ff60016040600020015460a01c1690565b6001600160801b039182169082160391908211611de857565b80600052600b60205260ff60016040600020015460a81c16156106c157600052600b60205260406000205460f81c90565b359064ffffffffff821682036104c157565b92919261373d8261356e565b60409461374c86519283612f37565b819584835260208093019160608096028501948186116104c157925b8584106137785750505050505050565b86848303126104c15782519061378d82612eb1565b61379685612f75565b8252858501359067ffffffffffffffff821682036104c157828792838b9501526137c186880161371f565b86820152815201930192613768565b3580151581036104c15790565b356001600160a01b03811681036104c15790565b356001600160801b03811681036104c15790565b91908260409103126104c15760405161381d81612eea565b602080829461382b81612dc6565b84520135910152565b64ffffffffff80421682600052600b602052604060002091825482828260a01c1610156138955760c81c16111561388357600401546001101561387a57612ff6906138d6565b612ff690614906565b6001600160801b039150600201541690565b5050505050600090565b8051156138ac5760200190565b634e487b7160e01b600052603260045260246000fd5b80518210156138ac5760209160051b010190565b64ffffffffff90814216906000908152600b6020526040908181208251936138fd85612f06565b8154956001600160a01b039182881687526020870197828160a01c168952828160c81c168789015260ff8160f01c161515606089015260f81c1515608088015260ff6001938486015490811660a08a0152818160a01c16151560c08a0152818160a81c16151560e08a015260b01c161515610100880152610140613997600461398860028801613633565b966101208b0197885201613586565b97019187835280876139a9889a61389f565b5101511693828288965b1610613a8d575091613a3d613a4292848881613a4798976001600160801b039e8f6139df8b8a516138c2565b5151169d8a8f9b60206139fc67ffffffffffffffff928d516138c2565b51015116998483613a0e8484516138c2565b5101511696508115613a8157613a2c929350519060001901906138c2565b5101511680925b0316920316613b01565b613e70565b613cd3565b928313613a60575050613a5a8391613ac5565b16011690565b516020015192939283169284168310159150613a7c9050575090565b905090565b50505051168092613a33565b8094986001600160801b039081613aa58c88516138c2565b51511601169801938282808a613abc8989516138c2565b510151166139b3565b60008112613ad05790565b602490604051907f2463f3d50000000000000000000000000000000000000000000000000000000082526004820152fd5b90600160ff1b808314908115613be9575b50613bbf576000821215613bb657613b3b826000035b6000831215613baf578260000390613bf3565b917f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311613b795760009160001991181315613b75575090565b0390565b604491604051917fd49c26b300000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b8290613bf3565b613b3b82613b28565b60046040517f9fe2b450000000000000000000000000000000000000000000000000000000008152fd5b9050811438613b12565b670de0b6b3a7640000916000198383099280830292838086109503948086039514613caf5782851015613c7357908291096001821901821680920460028082600302188083028203028083028203028083028203028083028203028083028203028092029003029360018380600003040190848311900302920304170290565b82606492604051927f63a05778000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b505080925015613cbd570490565b634e487b7160e01b600052601260045260246000fd5b90600160ff1b808314908115613db7575b50613d8d576000821215613d8457613d0d826000035b6000831215613d7d578260000390613dc1565b917f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311613d475760009160001991181315613b75575090565b604491604051917f120b5b4300000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b8290613dc1565b613d0d82613cfa565b60046040517fa6070c25000000000000000000000000000000000000000000000000000000008152fd5b9050811438613ce4565b90919060001983820983820291828083109203918083039214613e5f57670de0b6b3a76400009081831015613e2857947faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066994950990828211900360ee1b910360121c170290565b60449086604051917f5173648d00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050670de0b6b3a764000090049150565b80613e8a5750600090612ff65750670de0b6b3a764000090565b90670de0b6b3a7640000808314613ed7575080613eaf575050670de0b6b3a764000090565b670de0b6b3a76400008114613ed357613ece90613a42612ff6936147b1565b613ef7565b5090565b91505090565b8015613cbd576ec097ce7bc90715b34b9f10000000000590565b6000811215613f2c5768033dd1780914b97114198112613f2657613f1d90600003613ef7565b612ff690613edd565b50600090565b680a688906bd8affffff811361478057670de0b6b3a764000080604092831b05907780000000000000000000000000000000000000000000000067ff000000000000008316614663575b66ff000000000000831661455b575b65ff0000000000831661445b575b64ff000000008316614363575b63ff0000008316614273575b62ff0000831661418b575b61ff0083166140ab575b60ff8316613fd4575b02911c60bf031c90565b60808316614099575b838316614087575b60208316614075575b60108316614063575b60088316614051575b6004831661403f575b6002831661402d575b6001831615613fca576801000000000000000102831c613fca565b6801000000000000000102831c614012565b6801000000000000000302831c614009565b6801000000000000000602831c614000565b6801000000000000000b02831c613ff7565b6801000000000000001602831c613fee565b6801000000000000002c02831c613fe5565b6801000000000000005902831c613fdd565b6180008316614179575b6140008316614167575b6120008316614155575b6110008316614143575b6108008316614131575b610400831661411f575b610200831661410d575b610100831615613fc157680100000000000000b102831c613fc1565b6801000000000000016302831c6140f1565b680100000000000002c602831c6140e7565b6801000000000000058c02831c6140dd565b68010000000000000b1702831c6140d3565b6801000000000000162e02831c6140c9565b68010000000000002c5d02831c6140bf565b680100000000000058b902831c6140b5565b628000008316614261575b62400000831661424f575b62200000831661423d575b62100000831661422b575b620800008316614219575b620400008316614207575b6202000083166141f5575b62010000831615613fb7576801000000000000b17202831c613fb7565b680100000000000162e402831c6141d8565b6801000000000002c5c802831c6141cd565b68010000000000058b9102831c6141c2565b680100000000000b172102831c6141b7565b68010000000000162e4302831c6141ac565b680100000000002c5c8602831c6141a1565b6801000000000058b90c02831c614196565b63800000008316614351575b6340000000831661433f575b6320000000831661432d575b6310000000831661431b575b63080000008316614309575b630400000083166142f7575b630200000083166142e5575b6301000000831615613fac5768010000000000b1721802831c613fac565b6801000000000162e43002831c6142c7565b68010000000002c5c86002831c6142bb565b680100000000058b90c002831c6142af565b6801000000000b17217f02831c6142a3565b680100000000162e42ff02831c614297565b6801000000002c5c85fe02831c61428b565b68010000000058b90bfc02831c61427f565b6480000000008316614449575b6440000000008316614437575b6420000000008316614425575b6410000000008316614413575b6408000000008316614401575b64040000000083166143ef575b64020000000083166143dd575b640100000000831615613fa057680100000000b17217f802831c613fa0565b68010000000162e42ff102831c6143be565b680100000002c5c85fe302831c6143b1565b6801000000058b90bfce02831c6143a4565b68010000000b17217fbb02831c614397565b6801000000162e42fff002831c61438a565b68010000002c5c8601cc02831c61437d565b680100000058b90c0b4902831c614370565b658000000000008316614549575b654000000000008316614537575b652000000000008316614525575b651000000000008316614513575b650800000000008316614501575b6504000000000083166144ef575b6502000000000083166144dd575b65010000000000831615613f93576801000000b17218355102831c613f93565b680100000162e430e5a202831c6144bd565b6801000002c5c863b73f02831c6144af565b68010000058b90cf1e6e02831c6144a1565b680100000b1721bcfc9a02831c614493565b68010000162e43f4f83102831c614485565b680100002c5c89d5ec6d02831c614477565b6801000058b91b5bc9ae02831c614469565b66800000000000008316614651575b6640000000000000831661463f575b6620000000000000831661462d575b6610000000000000831661461b575b66080000000000008316614609575b660400000000000083166145f7575b660200000000000083166145e5575b6601000000000000831615613f855768010000b17255775c0402831c613f85565b6801000162e525ee054702831c6145c4565b68010002c5cc37da949202831c6145b5565b680100058ba01fb9f96d02831c6145a6565b6801000b175effdc76ba02831c614597565b680100162f3904051fa102831c614588565b6801002c605e2e8cec5002831c614579565b68010058c86da1c09ea202831c61456a565b6780000000000000008316614761575b674000000000000000831661474f575b672000000000000000831661473d575b671000000000000000831661472b575b6708000000000000008316614719575b6704000000000000008316614707575b67020000000000000083166146f5575b670100000000000000831615613f7657680100b1afa5abcbed6102831c613f76565b68010163da9fb33356d802831c6146d3565b680102c9a3e778060ee702831c6146c3565b6801059b0d31585743ae02831c6146b3565b68010b5586cf9890f62a02831c6146a3565b6801172b83c7d517adce02831c614693565b6801306fe0a31b7152df02831c614683565b5077b504f333f9de648480000000000000000000000000000000614673565b602490604051907f0360d0280000000000000000000000000000000000000000000000000000000082526004820152fd5b806000808313156148d557670de0b6b3a76400009283811261489e57506001925b808305906001600160801b03821160071b91821c9167ffffffffffffffff831160061b92831c63ffffffff811160051b90811c61ffff811160041b90811c60ff811160031b90811c91600f831160021b92831c936001978860038711811b96871c11961717171717171781810294811d9082821461489257506706f05b59d3b20000905b8482136148665750505050500290565b808391020590671bc16d674ec80000821215614885575b831d90614856565b8091950194831d9061487d565b93505093925050020290565b60001993925080156148c1576ec097ce7bc90715b34b9f100000000005916147d2565b602482634e487b7160e01b81526012600452fd5b602483604051907f059b101b0000000000000000000000000000000000000000000000000000000082526004820152fd5b64ffffffffff61493b600091838352600b60205280806040852054818160a01c1693849160c81c160316918142160316613b01565b91808252600b602052600460408320018054156149c15790829167ffffffffffffffff93526149936020832054828452600b602052613a426001600160801b03968760026040882001541696879360801c1690613e70565b9283136149a95750506149a590613ac5565b1690565b60029350604092508152600b60205220015460801c90565b602483634e487b7160e01b81526032600452fd5b80600052600b602052604060002060ff600182015460a01c166000146149fc575050600490565b805460f81c614a4f575460a01c64ffffffffff164210613f2657614a1f81613834565b90600052600b6020526001600160801b038060026040600020015416911610600014614a4a57600190565b600290565b5050600390565b80600052600b602052614a6f6002604060002001613633565b81600052600b602052604060002060ff600182015460a01c16600014614aa257506001600160801b039150602001511690565b5460f81c614ab45750612ff690613834565b612ff691506001600160801b0360408183511692015116906136d5565b906001600160a01b036001541660206001600160a01b0360c0850151166024604051809481937fdcf844a700000000000000000000000000000000000000000000000000000000835260048301525afa8015610a3257600090615390575b614b5291506001600160801b0360a08501511690602060e0860151015191615a64565b6001600160801b038151166101008401519064ffffffffff6020860151168115615366578251801561533c577f0000000000000000000000000000000000000000000000000000000000000000811161530b575064ffffffffff6040614bb78561389f565b510151168110156152b45750600091829083815185905b808210615221575050505064ffffffffff421664ffffffffff82168110156151e15750506001600160801b038216810361519f5750506009549283600052600b6020526040600020916001600160801b0381511660028401906001600160801b03198254161790556001600160a01b0360c083015116600184015490750100000000000000000000000000000000000000000060408501511515928654927fffffffffffffffffff0000ff000000000000000000000000000000000000000076ff000000000000000000000000000000000000000000006060890151151560b01b16921617171760018601556001600160a01b0384511691610100850151926040614ce08551956000198701906138c2565b510151927fff000000000000000000000000000000000000000000000000000000000000007eff0000000000000000000000000000000000000000000000000000000000007dffffffffff0000000000000000000000000000000000000000000000000078ffffffffff000000000000000000000000000000000000000060208b015160a01b169660c81b169460f01b16911617171717845560005b8181106150cf575050600185016009556001600160a01b0360c08301511660005260026020526001600160801b0380604060002054168160208401511601166001600160a01b0360c0840151166000526040600020906001600160801b03198254161790556001600160a01b03608083015116801561508b57614e1e614e188760005260056020526001600160a01b0360406000205416151590565b1561553e565b614e2786613667565b1580615082575b8061507a575b615062576020600080516020615ba483398151915291614e6d614e188960005260056020526001600160a01b0360406000205416151590565b806000526006825260406000206001815401905587600052600582526040600020816001600160a01b0319825416179055876040519160007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4878152a1614efd6001600160a01b0360c0840151166001600160801b038084511681602086015116011690309033906153c4565b6001600160801b0360408201511680615033575b507fef3d668acee46576ad5d407c42ab4d0cde13f3cd70b28f09a0fb9e3bf5bf09cb614ff06001600160a01b03845116926001600160a01b03608086015116946001600160a01b0360c0820151169661502861500860408401511515928c606086015115156001600160a01b0360e061010089015194549864ffffffffff6040519a614f9c8c612eea565b818160a01c168c5260c81c1660208b01520151511695604051998a99610160948b523360208c015260408b0190604090816001600160801b0391828151168552826020820151166020860152015116910152565b60a089015260c08801528060e0880152860190612e40565b926101008501906020908164ffffffffff91828151168552015116910152565b6101408301520390a4565b61505c906001600160a01b0360c0850151166001600160a01b0360e086015151169033906153c4565b38614f11565b602486604051906378630aa960e01b82526004820152fd5b506000614e34565b50801515614e2e565b606460405162461bcd60e51b815260206004820152602060248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152fd5b6150de816101008601516138c2565b51906004860154916801000000000000000083101561223257600183018060048901558310156138ac5760019260048801600052602060002001906001600160801b03815116908254917fffffff00000000000000000000000000000000000000000000000000000000007cffffffffff000000000000000000000000000000000000000000000000604077ffffffffffffffff00000000000000000000000000000000602086015160801b1694015160c01b169316171717905501614d7c565b6040517fd90b7e390000000000000000000000000000000000000000000000000000000081526001600160801b03918216600482015291166024820152604490fd5b6040517f210aec0e00000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b9193509194615245906001600160801b0361523c85896138c2565b515116906159e0565b9464ffffffffff80604061525986856138c2565b51015116941680851115615277575060018493019192919092614bce565b8385606492604051927f7b0bada8000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b64ffffffffff60406152c58561389f565b5101516040517fb4c9e52c00000000000000000000000000000000000000000000000000000000815264ffffffffff938416600482015291169091166024820152604490fd5b602490604051907f4757689b0000000000000000000000000000000000000000000000000000000082526004820152fd5b60046040517f3952c64e000000000000000000000000000000000000000000000000000000008152fd5b60046040517f6095d3bc000000000000000000000000000000000000000000000000000000008152fd5b6020823d6020116153bc575b816153a960209383612f37565b810103126135565750614b529051614b2f565b3d915061539c565b9290604051927f23b872dd0000000000000000000000000000000000000000000000000000000060208501526001600160a01b03809216602485015216604483015260648201526064815260a081019181831067ffffffffffffffff8411176122325761543392604052615435565b565b6001600160a01b03169061549560405161544e81612eea565b6020938482527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564858301526000808587829751910182855af161548f6133a5565b91615589565b80519182159184831561551a575b5050509050156154b05750565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b919381809450010312613559578201519081151582036135565750803880846154a3565b1561554557565b606460405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152fd5b919290156155ea575081511561559d575090565b3b156155a65790565b606460405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b8251909150156155fd5750805190602001fd5b6105f19060405191829162461bcd60e51b8352602060048401526024830190612d75565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361565357565b60046040517fa1c0d6e5000000000000000000000000000000000000000000000000000000008152fd5b916001600160a01b03604051927fa9059cbb000000000000000000000000000000000000000000000000000000006020850152166024830152604482015260448152608081019181831067ffffffffffffffff8411176122325761543392604052615435565b612ff6906156f081614a56565b90600052600b60205260026040600020015460801c906136d5565b91908110156138ac5760051b0190565b9291926157278161369e565b6159c85761574b81600052600b6020526001600160a01b0360406000205416331490565b15806159b8575b611cf45761577681600052600b6020526001600160a01b0360406000205416331490565b80615994575b615968576001600160a01b0393848316928315610557576001600160801b039586831691821561052657876157b0866156e3565b16808411615944575090615846836157e89360009a888c5261580e8c600260209a600b8c526040998a9183838620015460801c6159e0565b928d8152600b8d52200190836001600160801b031983549260801b169116178155613633565b90615829818a840151169282898183511692015116906136d5565b161115615915575b878b52600b8752836001868d2001541661567d565b848852600584528188205416803314158061590b575b61588f575b507ffa54f9f9bdcdd28778cbb9f78490df6691cc4e2729588e10f4cc0a26c465686a939495965051908152a3565b803b156159075796807ffa54f9f9bdcdd28778cbb9f78490df6691cc4e2729588e10f4cc0a26c465686a9596979860848451809481936313375c3b60e01b83528b60048401523360248401528c60448401528860648401525af16158f8575b8796959450615861565b61590190612f23565b386158ee565b8780fd5b50803b151561585c565b878b52600b8752848b2060018101600160a01b60ff60a01b1982541617905560ff60f01b198154169055615831565b85606491856040519263287ecaef60e21b8452600484015260248301526044820152fd5b6001600160a01b0360649260405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b508060005260056020526001600160a01b038060406000205416908316141561577c565b506159c2816159fb565b15615752565b60249060405190634a5541ef60e01b82526004820152fd5b9190916001600160801b0380809416911601918211611de857565b60009080825260056020526001600160a01b038060408420541692833314938415615a40575b50508215615a2e57505090565b909150615a3b3392612ff9565b161490565b60ff9294509060409181526008602052818120338252602052205416913880615a21565b909291615a6f613614565b936001600160801b0392838116918215615b7b5767016345785d8a0000808211615b4457808511615b0d5750615ab985615aaa819386613dc1565b16946020890195865284613dc1565b169184615ad06040890194808652828751166159e0565b161015615af757615ae9849182615af2955116906136d5565b915116906136d5565b168252565b634e487b7160e01b600052600160045260246000fd5b84604491604051917f4fea5c1a00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b60449250604051917f47152d6700000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b50505050509050604051615b8e81612eb1565b6000815260006020820152600060408201529056fef8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7"; + hex"60c0346200046e57601f6200600238819003918201601f19168301916001600160401b038311848410176200032b578084926080946040528339810103126200046e5780516001600160a01b038082169290918390036200046e5760208101518281168091036200046e5760408201519183831683036200046e5760600151936200008962000473565b90601d82527f5361626c696572205632204c6f636b75702044796e616d6963204e46540000006020830152620000be62000473565b601181527029a0a116ab1916a627a1a5aaa816a22ca760791b602082015230608052600080546001600160a01b03199081168417825560018054909116909517909455927fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a38051906001600160401b0382116200032b5760035490600182811c9216801562000463575b60208310146200044d5781601f849311620003d8575b50602090601f83116001146200034d5760009262000341575b50508160011b916000199060031b1c1916176003555b80516001600160401b0381116200032b576004918254600181811c9116801562000320575b60208210146200030b579081601f849311620002b3575b50602090601f831160011462000248576000926200023c575b50508160011b916000199060031b1c19161790555b1660018060a01b0319600a541617600a5560a0526001600955604051615b6e9081620004948239608051816155de015260a0518181816112850152614b330152f35b015190503880620001e5565b6000858152602081209350601f198516905b8181106200029a575090846001959493921062000280575b505050811b019055620001fa565b015160001960f88460031b161c1916905538808062000272565b929360206001819287860151815501950193016200025a565b909150836000526020600020601f840160051c8101916020851062000300575b90601f859493920160051c01905b818110620002f05750620001cc565b60008155849350600101620002e1565b9091508190620002d3565b602284634e487b7160e01b6000525260246000fd5b90607f1690620001b5565b634e487b7160e01b600052604160045260246000fd5b0151905038806200017a565b600360009081527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b9350601f198516905b818110620003bf5750908460019594939210620003a5575b505050811b0160035562000190565b015160001960f88460031b161c1916905538808062000396565b929360206001819287860151815501950193016200037e565b60036000529091507fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f840160051c8101916020851062000442575b90601f859493920160051c01905b81811062000432575062000161565b6000815584935060010162000423565b909150819062000415565b634e487b7160e01b600052602260045260246000fd5b91607f16916200014b565b600080fd5b60408051919082016001600160401b038111838210176200032b5760405256fe608080604052600436101561001357600080fd5b60003560e01c90816301ffc9a714612c365750806306fdde0314612b73578063081812fc14612b55578063095ea7b3146129c15780631400ecec1461291c57806316844456146126a15780631c1cdd4c1461263b5780631e99d5691461261d57806323b872dd146125f457806339a73c03146125b157806340e58ee514612219578063425d30dd146121fb57806342842e0e146121ab57806342966c681461204d5780634857501f14611fd75780634869e12d14611f9b5780635fe3b56714611f745780636352211e14611f455780636d0cee7514611eed57806370a0823114611e4357806375829def14611db15780637cad6cd114611cdf5780637de6b1db14611ab65780638659c27014611667578063894e9a0d146113fa5780638bad38dd1461137e5780638f69b993146112fb5780639067b677146112a85780639188ec841461126d57806395d89b411461115f578063a22cb4651461108e578063a2ffb89714610f95578063a6202bf214610e95578063a80fc07114610e40578063ad35efd414610ddd578063b256456914610dbf578063b637b86514610d5f578063b88d4fde14610cd4578063b8a3be6614610c9d578063b971302a14610c4b578063bc063e1a14610c28578063bc2be1be14610bd5578063c156a11d14610ae7578063c33cd35e146109d2578063c87b56dd1461089f578063cc364f4814610805578063d4dbd20b146107b0578063d511609f14610761578063d975dfed14610714578063e985e9c5146106bd578063ea5ead191461066c578063eac8f5b814610600578063f590c176146105d8578063f851a440146105b15763fdd46d601461027c57600080fd5b346104a65760603660031901126104a657600435610298612d63565b6001600160801b036044358181169391928482036104a6576102b86155d4565b6102c183613651565b610599576102e583600052600b6020526001600160a01b0360406000205416331490565b90811580610589575b6105665783600052602094600586526001600160a01b03908160406000205416938061055a575b6105345781831694851561052357881561050b578161033388615696565b16808a116104e75750916103ca939161038f6103638b958a600052600b8c5260026040600020015460801c61597e565b89600052600b8b52600260406000200190836001600160801b031983549260801b1691161781556135e6565b906103ab818b8401511692826040818351169201511690613688565b1611156104b5575b86600052600b885260016040600020015416615630565b80331415806104ab575b61041d575b50817ffa54f9f9bdcdd28778cbb9f78490df6691cc4e2729588e10f4cc0a26c465686a84600080516020615b4283398151915296604051908152a3604051908152a1005b803b156104a6577ffa54f9f9bdcdd28778cbb9f78490df6691cc4e2729588e10f4cc0a26c465686a84600080516020615b428339815191529660008087956084604051809481936313375c3b60e01b83528a60048401523360248401528b60448401528760648401525af1610497575b50965050506103d9565b6104a090612ed6565b3861048d565b600080fd5b50803b15156103d4565b86600052600b8852604060002060018101600160a01b60ff60a01b1982541617905560ff60f01b1981541690556103b3565b876064918b6040519263287ecaef60e21b8452600484015260248301526044820152fd5b6024876040519063d2aabcd960e01b82526004820152fd5b600460405163630d074f60e11b8152fd5b606486838560405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b50838284161415610315565b60405163216caf0d60e01b815260048101859052336024820152604490fd5b0390fd5b5061059384615999565b156102ee565b60248360405190634a5541ef60e01b82526004820152fd5b346104a65760003660031901126104a65760206001600160a01b0360005416604051908152f35b346104a65760203660031901126104a65760206105f66004356136a1565b6040519015158152f35b346104a65760203660031901126104a65760043580600052600b60205260ff60016040600020015460a81c161561065557600052600b60205260206001600160a01b0360016040600020015416604051908152f35b6024906040519062b8e7e760e51b82526004820152fd5b346104a65760403660031901126104a657600080516020615b4283398151915260206004356106b461069c612d63565b6106a583615696565b906106ae6155d4565b836156ce565b604051908152a1005b346104a65760403660031901126104a6576106d6612d4d565b6106de612d63565b906001600160a01b03809116600052600860205260406000209116600052602052602060ff604060002054166040519015158152f35b346104a65760203660031901126104a65760043580600052600b60205260ff60016040600020015460a81c161561065557610750602091615696565b6001600160801b0360405191168152f35b346104a65760203660031901126104a65760043580600052600b60205260ff60016040600020015460a81c161561065557600052600b602052602060026040600020015460801c604051908152f35b346104a65760203660031901126104a65760043580600052600b60205260ff60016040600020015460a81c161561065557600052600b60205260206001600160801b0360036040600020015416604051908152f35b346104a65760203660031901126104a6576004356000602060405161082981612e9d565b828152015280600052600b60205260ff60016040600020015460a81c161561065557600052600b6020526040806000205464ffffffffff82519161086c83612e9d565b818160a01c16835260c81c16602082015261089d825180926020908164ffffffffff91828151168552015116910152565bf35b346104a6576020806003193601126104a657600435906108dd6108d88360005260056020526001600160a01b0360406000205416151590565b612f3c565b60006001600160a01b03600a5416926044604051809581937fe9dc637500000000000000000000000000000000000000000000000000000000835230600484015260248301525afa9182156109c65760009261094d575b50610949604051928284938452830190612d28565b0390f35b9091503d806000833e6109608183612eea565b81019082818303126104a65780519067ffffffffffffffff82116104a6570181601f820112156104a657805161099581612f0c565b926109a36040519485612eea565b8184528482840101116104a6576109bf91848085019101612d05565b9082610934565b6040513d6000823e3d90fd5b346104a6576003196020368201126104a6576004359067ffffffffffffffff908183116104a6576101409083360301126104a657610a0e6155d4565b60405191610a1b83612e80565b610a2781600401612d79565b8352610a35602482016136d2565b6020840152610a4660448201612e57565b6040840152610a5760648201612e57565b6060840152610a6860848201612d79565b6080840152610a7960a48201612f28565b60a0840152610a8a60c48201612d79565b60c0840152610a9c3660e483016137b8565b60e08401526101248101359182116104a65701366023820112156104a657602091610ad4610adf9236906024600482013591016136e4565b610100820152614a84565b604051908152f35b346104a65760403660031901126104a657600435610b03612d63565b610b0b6155d4565b81600052600b60205260ff60016040600020015460a81c1615610bbe578160005260056020526001600160a01b0360406000205416803303610b9f57916106b481602093600080516020615b4283398151915295610b6883615696565b6001600160801b038116610b7d575b506131cf565b610b9090610b896155d4565b82856156ce565b8686604051858152a187610b77565b60405163216caf0d60e01b815260048101849052336024820152604490fd5b6024826040519062b8e7e760e51b82526004820152fd5b346104a65760203660031901126104a65760043580600052600b60205260ff60016040600020015460a81c161561065557600052600b602052602064ffffffffff60406000205460a01c16604051908152f35b346104a65760003660031901126104a657602060405167016345785d8a00008152f35b346104a65760203660031901126104a65760043580600052600b60205260ff60016040600020015460a81c161561065557600052600b60205260206001600160a01b0360406000205416604051908152f35b346104a65760203660031901126104a657600435600052600b602052602060ff60016040600020015460a81c166040519015158152f35b346104a65760803660031901126104a657610ced612d4d565b610cf5612d63565b6064359167ffffffffffffffff83116104a657366023840112156104a657826004013591610d2283612f0c565b92610d306040519485612eea565b80845236602482870101116104a6576020816000926024610d5d980183880137850101526044359161305a565b005b346104a65760203660031901126104a65760043580600052600b60205260ff60016040600020015460a81c161561065557600052600b602052610949610dab6004604060002001613539565b604051918291602083526020830190612df3565b346104a65760203660031901126104a65760206105f660043561361a565b346104a65760203660031901126104a65760043580600052600b60205260ff60016040600020015460a81c161561065557610e1790614988565b6040516005821015610e2a576020918152f35b634e487b7160e01b600052602160045260246000fd5b346104a65760203660031901126104a65760043580600052600b60205260ff60016040600020015460a81c161561065557600052600b60205260206001600160801b0360026040600020015416604051908152f35b346104a65760203660031901126104a657610eae612d4d565b6001600160a01b038060005416338103610f6c57508116908160005260026020526001600160801b0360406000205416908115610f3b5781610f0d9184600052600260205260406000206001600160801b031981541690553390615630565b6040519081527fca7a4a65a94ed2f37538814e00e1cd4c41a78261561e3f3794592f11409cf5af60203392a3005b602483604051907f8410168c0000000000000000000000000000000000000000000000000000000082526004820152fd5b6040516331b339a960e21b81526001600160a01b03919091166004820152336024820152604490fd5b346104a65760603660031901126104a65767ffffffffffffffff6004358181116104a657610fc7903690600401612dc2565b610fcf612d63565b926044359081116104a657610fe8903690600401612dc2565b9190610ff26155d4565b8282036110575760005b82811061100557005b80600080516020615b428339815191526020611024600194878a6156be565b3561104a61103b611036868b8a6156be565b6137a4565b6110436155d4565b8b836156ce565b604051908152a101610ffc565b50604491604051917faec9344000000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b346104a65760403660031901126104a6576110a7612d4d565b602435908115158092036104a6576001600160a01b03169081331461111b57336000526008602052604060002082600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a3005b606460405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152fd5b346104a65760003660031901126104a657604051600060045490600182811c91818416918215611263575b602094858510841461124d57858794868652918260001461122d5750506001146111d0575b506111bc92500383612eea565b610949604051928284938452830190612d28565b84915060046000527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b906000915b8583106112155750506111bc9350820101856111af565b805483890185015287945086939092019181016111fe565b60ff1916858201526111bc95151560051b85010192508791506111af9050565b634e487b7160e01b600052602260045260246000fd5b92607f169261118a565b346104a65760003660031901126104a65760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346104a65760203660031901126104a65760043580600052600b60205260ff60016040600020015460a81c161561065557600052600b602052602064ffffffffff60406000205460c81c16604051908152f35b346104a65760203660031901126104a65760043580600052600b60205260ff60016040600020015460a81c16156106555761133590614988565b600581101580610e2a5760028214908115611371575b811561135f575b6020826040519015158152f35b9050610e2a5760046020911482611352565b505060038114600061134b565b346104a65760203660031901126104a6576004356001600160a01b03908181168091036104a6578160005416338103610f6c575060015491816001600160a01b03198416176001556040519216825260208201527fdcb09aef4bf01068924ccce937981cbe59d25ba08380cf941aaaea4e4bd3960d60403392a2005b346104a65760203660031901126104a657606061014060405161141c81612eb9565b60008152600060208201526000604082015260008382015260006080820152600060a0820152600060c0820152600060e082015260006101008201526114606135c7565b6101208201520152600435600052600b60205260ff60016040600020015460a81c161561164f57600435600052600b60205260406000206115436004604051926114a984612eb9565b80546001600160a01b038116855264ffffffffff8160a01c16602086015264ffffffffff8160c81c16604086015260ff8160f01c161515606086015260f81c1515608085015260ff60018201546001600160a01b03811660a0870152818160a01c16151560c0870152818160a81c16151560e087015260b01c161515610100850152611537600282016135e6565b61012085015201613539565b610140820152611554600435614988565b906005821015610e2a5760026101409214611643575b610949604051928392602084526001600160a01b03815116602085015264ffffffffff602082015116604085015264ffffffffff60408201511660608501526060810151151560808501526080810151151560a08501526001600160a01b0360a08201511660c085015260c0810151151560e085015260e08101511515610100850152610100810151151561012085015261162f61012082015183860190604090816001600160801b0391828151168552826020820151166020860152015116910152565b01516101a0808401526101c0830190612df3565b6000606082015261156a565b602460405162b8e7e760e51b81526004356004820152fd5b346104a6576020806003193601126104a65760043567ffffffffffffffff81116104a657611699903690600401612dc2565b906116a26155d4565b6000915b8083106116af57005b6116ba8382846156be565b35926116c46155d4565b6116cd84613651565b156116ea5760248460405190634a5541ef60e01b82526004820152fd5b6116f6849293946136a1565b611a9e5761171a82600052600b6020526001600160a01b0360406000205416331490565b1580611a7e575b611a5f5761172e826137e7565b82600052600b9283875261174860026040600020016135e6565b936001600160801b0392838651168482161015611a47578260005281895260ff60406000205460f01c1615611a2f579061179782858b61178d819796838c5116613688565b9901511690613688565b93826000528184526040600020966003885498600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8b1617815583881615611a15575b0191811691826001600160801b03198254161790556118216001600160a01b03809916926005875289604060002054169487528360019a8b6040600020015416615630565b33820361193257823b61188e575b7f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd2600080516020615b428339815191529685925b604080516001600160801b03928316815292909116602083015290a4604051908152a10191906116a6565b9350813b156104a6576040516372eba20360e01b8152600481018490526001600160a01b03821660248201526001600160801b03858116604483015286166064820152600080516020615b42833981519152958b9585927f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd2929190600081608481838b5af1611923575b50925096505061182f565b61192c90612ed6565b8e611918565b813b611971575b7f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd2600080516020615b42833981519152968592611863565b9350803b156104a6576040516372eba20360e01b8152600481018490526001600160a01b03831660248201526001600160801b03858116604483015286166064820152600080516020615b42833981519152958b9585927f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd2929190600081608481838a5af1611a06575b509250965050611939565b611a0f90612ed6565b8e6119fb565b60018101600160a01b60ff60a01b198254161790556117dc565b602483604051906339c6dc7360e21b82526004820152fd5b602483604051906322cad1af60e11b82526004820152fd5b60405163216caf0d60e01b815260048101839052336024820152604490fd5b5081600052600585526001600160a01b0360406000205416331415611721565b6024826040519063fe19f19f60e01b82526004820152fd5b346104a6576020806003193601126104a657600435611ad36155d4565b80600052600b825260ff60016040600020015460a81c161561065557611af881614988565b916000926005811015610e2a5760048103611b255760248360405190634a5541ef60e01b82526004820152fd5b60038103611b45576024836040519063fe19f19f60e01b82526004820152fd5b916002849314611cc757611b6f81600052600b6020526001600160a01b0360406000205416331490565b15611ca75780600052600b825260ff60406000205460f01c1615611c8f5780600052600b8252604060002060ff60f01b198154169055600582526001600160a01b0360406000205416803b611bfd575b50807f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f84600080516020615b4283398151915295a2604051908152a1005b803b156104a657600080516020615b428339815191529360008084936024604051809481937f341a0bd90000000000000000000000000000000000000000000000000000000083528860048401525af1611c5a575b509350611bbf565b9050611c669150612ed6565b8060007f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f611c52565b602490604051906339c6dc7360e21b82526004820152fd5b60405163216caf0d60e01b81526004810191909152336024820152604490fd5b602490604051906322cad1af60e11b82526004820152fd5b346104a65760203660031901126104a6576004356001600160a01b03908181168091036104a6578160005416338103610f6c5750600a5491816001600160a01b0319841617600a556040519216825260208201527fa2548bd4b805e907c1558a47b5858324fe8bb4a2e1ddfca647eecbf65610eebc60403392a26009546000198101908111611d9b5760407f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c91815190600182526020820152a1005b634e487b7160e01b600052601160045260246000fd5b346104a65760203660031901126104a657611dca612d4d565b6000546001600160a01b0380821692338403611e1c576001600160a01b03199350169182911617600055337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf80600080a3005b6040516331b339a960e21b81526001600160a01b0385166004820152336024820152604490fd5b346104a65760203660031901126104a6576001600160a01b03611e64612d4d565b168015611e835760005260066020526020604060002054604051908152f35b608460405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e657200000000000000000000000000000000000000000000006064820152fd5b346104a65760203660031901126104a657600435611f246108d88260005260056020526001600160a01b0360406000205416151590565b600052600560205260206001600160a01b0360406000205416604051908152f35b346104a65760203660031901126104a6576020611f63600435612f87565b6001600160a01b0360405191168152f35b346104a65760003660031901126104a65760206001600160a01b0360015416604051908152f35b346104a65760203660031901126104a65760043580600052600b60205260ff60016040600020015460a81c161561065557610750602091614a09565b346104a65760203660031901126104a65760043580600052600b60205260ff60016040600020015460a81c161561065557600061201382614988565b6005811015610e2a57600203612031575b6020906040519015158152f35b50600052600b602052602060ff60406000205460f01c16612024565b346104a65760203660031901126104a6576004356120696155d4565b61207281613651565b1561217a5761208081615999565b15611ca75761208e81612f87565b6120978261361a565b159081612171575b8161215e575b50612146576020816120c5600080516020615b4283398151915293612f87565b9080600052600783526001600160a01b036040600020926001600160a01b031993848154169055169182600052600684526040600020600019815401905581600052600584526040600020908154169055806000604051937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a48152a1005b602490604051906378630aa960e01b82526004820152fd5b6001600160a01b039150161515826120a5565b6000915061209f565b602490604051907f817cd6390000000000000000000000000000000000000000000000000000000082526004820152fd5b346104a6576121b936612d8d565b60405191602083019383851067ffffffffffffffff8611176121e557610d5d946040526000845261305a565b634e487b7160e01b600052604160045260246000fd5b346104a65760203660031901126104a65760206105f6600435613651565b346104a6576020806003193601126104a657600435906122376155d4565b61224082613651565b1561225d5760248260405190634a5541ef60e01b82526004820152fd5b612266826136a1565b611a9e5761228a82600052600b6020526001600160a01b0360406000205416331490565b1580612591575b611a5f5761229e826137e7565b9180600052600b82526122b760026040600020016135e6565b926001600160801b0390818551168282161015611a475782600052600b845260ff60406000205460f01c1615611a2f578082856122fa61230494838a5116613688565b9701511690613688565b9082600052600b84526040600020916003835493600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861617815583831615612577575b0191861691826001600160801b031982541617905561238f6001600160a01b03809416926005875283856040600020541695600b895260016040600020015416615630565b33820361249757823b6123f6575b7f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd28491600080516020615b42833981519152975b604080516001600160801b03928316815292909116602083015290a4604051908152a1005b823b156104a6576040516372eba20360e01b8152600481018590526001600160a01b03831660248201526001600160801b03878116604483015282166064820152600080516020615b428339815191529685927f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd292909190600081608481838b5af1612488575b50975091505061239d565b61249190612ed6565b8961247d565b813b6124d6575b7f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd28491600080516020615b42833981519152976123d1565b813b156104a6576040516372eba20360e01b8152600481018590526001600160a01b03841660248201526001600160801b03878116604483015282166064820152600080516020615b428339815191529685927f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd292909190600081608481838a5af1612568575b50975091505061249e565b61257190612ed6565b8961255d565b60018101600160a01b60ff60a01b1982541617905561234a565b5081600052600581526001600160a01b0360406000205416331415612291565b346104a65760203660031901126104a6576001600160a01b036125d2612d4d565b16600052600260205260206001600160801b0360406000205416604051908152f35b346104a657610d5d61260536612d8d565b9161261861261384336130f0565b612fe9565b6131cf565b346104a65760003660031901126104a6576020600954604051908152f35b346104a65760203660031901126104a65760043580600052600b60205260ff60016040600020015460a81c16156106555761267590614988565b6005811015610e2a578060209115908115612696575b506040519015158152f35b60019150148261268b565b346104a657602060031981813601126104a6576004359067ffffffffffffffff908183116104a657610120833603918201126104a6576126df6155d4565b61010483013590602219018112156104a65782016004810135908282116104a65760240160608202360381136104a65761271a9136916136e4565b9182519061272782613521565b916127356040519384612eea565b808352601f1961274482613521565b018660005b8281106129065750505064ffffffffff90814216946001600160801b03968761277182613852565b515116828a61277f84613852565b510151168580604061279086613852565b510151168a011690604051926127a584612e64565b83528b83015260408201526127b987613852565b526127c386613852565b5060019386855b8a8c87831061288557908b846001600160a01b038c60a4810135828116908190036104a657610adf95612845956128759461280760248601613783565b61281360448701613783565b61281f60648801613790565b9161282c88600401613790565b948461283a60848b016137a4565b966040519d8e612e80565b168c528d8c0152151560408b0152151560608a01521660808801521660a086015260c085015260c43691016137b8565b60e0830152610100820152614a84565b8893858060406128b98b866128a98a8e9a6128a0828d613875565b5151169a613875565b5101511694600019890190613875565b510151168160406128ca888c613875565b51015116011691604051936128de85612e64565b845283015260408201526128f2828b613875565b526128fd818a613875565b500187906127ca565b61290e6135c7565b828288010152018790612749565b346104a65760203660031901126104a65760043580600052600b60205260ff60016040600020015460a81c16156106555760209060009080600052600b8352604060002060ff815460f01c16806129af575b612986575b50506001600160801b0360405191168152f35b6129a892506001600160801b0360026129a292015416916137e7565b90613688565b8280612973565b5060ff600182015460a01c161561296e565b346104a65760403660031901126104a6576129da612d4d565b602435906001600160a01b0380806129f185612f87565b16921691808314612aeb57803314908115612ac6575b5015612a5c578260005260076020526040600020826001600160a01b0319825416179055612a3483612f87565b167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b608460405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152fd5b9050600052600860205260406000203360005260205260ff6040600020541684612a07565b608460405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152fd5b346104a65760203660031901126104a6576020611f63600435612fac565b346104a65760003660031901126104a657604051600060035490600182811c91818416918215612c2c575b602094858510841461124d57858794868652918260001461122d575050600114612bcf57506111bc92500383612eea565b84915060036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b906000915b858310612c145750506111bc9350820101856111af565b80548389018501528794508693909201918101612bfd565b92607f1692612b9e565b346104a65760203660031901126104a657600435907fffffffff0000000000000000000000000000000000000000000000000000000082168092036104a657817f80ac58cd0000000000000000000000000000000000000000000000000000000060209314908115612cdb575b8115612cb1575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501483612caa565b7f5b5e139f0000000000000000000000000000000000000000000000000000000081149150612ca3565b60005b838110612d185750506000910152565b8181015183820152602001612d08565b90602091612d4181518092818552858086019101612d05565b601f01601f1916010190565b600435906001600160a01b03821682036104a657565b602435906001600160a01b03821682036104a657565b35906001600160a01b03821682036104a657565b60609060031901126104a6576001600160a01b039060043582811681036104a6579160243590811681036104a6579060443590565b9181601f840112156104a65782359167ffffffffffffffff83116104a6576020808501948460051b0101116104a657565b90815180825260208080930193019160005b828110612e13575050505090565b835180516001600160801b031686528083015167ffffffffffffffff168684015260409081015164ffffffffff169086015260609094019392810192600101612e05565b359081151582036104a657565b6060810190811067ffffffffffffffff8211176121e557604052565b610120810190811067ffffffffffffffff8211176121e557604052565b6040810190811067ffffffffffffffff8211176121e557604052565b610160810190811067ffffffffffffffff8211176121e557604052565b67ffffffffffffffff81116121e557604052565b90601f8019910116810190811067ffffffffffffffff8211176121e557604052565b67ffffffffffffffff81116121e557601f01601f191660200190565b35906001600160801b03821682036104a657565b15612f4357565b606460405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152fd5b60005260056020526001600160a01b0360406000205416612fa9811515612f3c565b90565b612fcf6108d88260005260056020526001600160a01b0360406000205416151590565b60005260076020526001600160a01b036040600020541690565b15612ff057565b608460405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f766564000000000000000000000000000000000000006064820152fd5b9061307e93929161306e61261384336130f0565b6130798383836131cf565b613388565b1561308557565b60405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b906001600160a01b03808061310484612f87565b16931691838314938415613137575b508315613121575b50505090565b61312d91929350612fac565b161438808061311b565b909350600052600860205260406000208260005260205260ff604060002054169238613113565b1561316557565b608460405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152fd5b906131f892916131de83612f87565b916001600160a01b0394859384809416968791161461315e565b16908115806132ef5761320a8461361a565b1590816132e6575b50806132dd575b6132c55791808492613247600080516020615b428339815191529660209661324085612f87565b161461315e565b60009382855260078652604085206001600160a01b031990818154169055818652600687526040862060001981540190558286526040862060018154019055838652600587528260408720918254161790557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6040519580a48152a1565b602483604051906378630aa960e01b82526004820152fd5b50831515613219565b90501538613212565b608460405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152fd5b3d15613383573d9061336982612f0c565b916133776040519384612eea565b82523d6000602084013e565b606090565b9290803b15613518576133f2916020916001600160a01b0394604051809581948293897f150b7a02000000000000000000000000000000000000000000000000000000009b8c86523360048701521660248501526044840152608060648401526084830190612d28565b03916000968791165af1908290826134b1575b505061348b57613413613358565b805190816134865760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000161490565b909192506020813d8211613510575b816134cd60209383612eea565b8101031261350c5751907fffffffff00000000000000000000000000000000000000000000000000000000821682036135095750903880613405565b80fd5b5080fd5b3d91506134c0565b50505050600190565b67ffffffffffffffff81116121e55760051b60200190565b90815461354581613521565b9260409361355585519182612eea565b828152809460208092019260005281600020906000935b85851061357b57505050505050565b6001848192845161358b81612e64565b64ffffffffff87546001600160801b038116835267ffffffffffffffff8160801c168584015260c01c168682015281520193019401939161356c565b604051906135d482612e64565b60006040838281528260208201520152565b906040516135f381612e64565b6040819360018154916001600160801b0392838116865260801c6020860152015416910152565b80600052600b60205260ff60016040600020015460a81c161561065557600052600b60205260ff60016040600020015460b01c1690565b80600052600b60205260ff60016040600020015460a81c161561065557600052600b60205260ff60016040600020015460a01c1690565b6001600160801b039182169082160391908211611d9b57565b80600052600b60205260ff60016040600020015460a81c161561065557600052600b60205260406000205460f81c90565b359064ffffffffff821682036104a657565b9291926136f082613521565b6040946136ff86519283612eea565b819584835260208093019160608096028501948186116104a657925b85841061372b5750505050505050565b86848303126104a65782519061374082612e64565b61374985612f28565b8252858501359067ffffffffffffffff821682036104a657828792838b9501526137748688016136d2565b8682015281520193019261371b565b3580151581036104a65790565b356001600160a01b03811681036104a65790565b356001600160801b03811681036104a65790565b91908260409103126104a6576040516137d081612e9d565b60208082946137de81612d79565b84520135910152565b64ffffffffff80421682600052600b602052604060002091825482828260a01c1610156138485760c81c16111561383657600401546001101561382d57612fa990613889565b612fa9906148b9565b6001600160801b039150600201541690565b5050505050600090565b80511561385f5760200190565b634e487b7160e01b600052603260045260246000fd5b805182101561385f5760209160051b010190565b64ffffffffff90814216906000908152600b6020526040908181208251936138b085612eb9565b8154956001600160a01b039182881687526020870197828160a01c168952828160c81c168789015260ff8160f01c161515606089015260f81c1515608088015260ff6001938486015490811660a08a0152818160a01c16151560c08a0152818160a81c16151560e08a015260b01c16151561010088015261014061394a600461393b600288016135e6565b966101208b0197885201613539565b970191878352808761395c889a613852565b5101511693828288965b1610613a405750916139f06139f5928488816139fa98976001600160801b039e8f6139928b8a51613875565b5151169d8a8f9b60206139af67ffffffffffffffff928d51613875565b510151169984836139c1848451613875565b5101511696508115613a34576139df92935051906000190190613875565b5101511680925b0316920316613ab4565b613e23565b613c86565b928313613a13575050613a0d8391613a78565b16011690565b516020015192939283169284168310159150613a2f9050575090565b905090565b505050511680926139e6565b8094986001600160801b039081613a588c8851613875565b51511601169801938282808a613a6f898951613875565b51015116613966565b60008112613a835790565b602490604051907f2463f3d50000000000000000000000000000000000000000000000000000000082526004820152fd5b90600160ff1b808314908115613b9c575b50613b72576000821215613b6957613aee826000035b6000831215613b62578260000390613ba6565b917f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311613b2c5760009160001991181315613b28575090565b0390565b604491604051917fd49c26b300000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b8290613ba6565b613aee82613adb565b60046040517f9fe2b450000000000000000000000000000000000000000000000000000000008152fd5b9050811438613ac5565b670de0b6b3a7640000916000198383099280830292838086109503948086039514613c625782851015613c2657908291096001821901821680920460028082600302188083028203028083028203028083028203028083028203028083028203028092029003029360018380600003040190848311900302920304170290565b82606492604051927f63a05778000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b505080925015613c70570490565b634e487b7160e01b600052601260045260246000fd5b90600160ff1b808314908115613d6a575b50613d40576000821215613d3757613cc0826000035b6000831215613d30578260000390613d74565b917f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311613cfa5760009160001991181315613b28575090565b604491604051917f120b5b4300000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b8290613d74565b613cc082613cad565b60046040517fa6070c25000000000000000000000000000000000000000000000000000000008152fd5b9050811438613c97565b90919060001983820983820291828083109203918083039214613e1257670de0b6b3a76400009081831015613ddb57947faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066994950990828211900360ee1b910360121c170290565b60449086604051917f5173648d00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050670de0b6b3a764000090049150565b80613e3d5750600090612fa95750670de0b6b3a764000090565b90670de0b6b3a7640000808314613e8a575080613e62575050670de0b6b3a764000090565b670de0b6b3a76400008114613e8657613e81906139f5612fa993614764565b613eaa565b5090565b91505090565b8015613c70576ec097ce7bc90715b34b9f10000000000590565b6000811215613edf5768033dd1780914b97114198112613ed957613ed090600003613eaa565b612fa990613e90565b50600090565b680a688906bd8affffff811361473357670de0b6b3a764000080604092831b05907780000000000000000000000000000000000000000000000067ff000000000000008316614616575b66ff000000000000831661450e575b65ff0000000000831661440e575b64ff000000008316614316575b63ff0000008316614226575b62ff0000831661413e575b61ff00831661405e575b60ff8316613f87575b02911c60bf031c90565b6080831661404c575b83831661403a575b60208316614028575b60108316614016575b60088316614004575b60048316613ff2575b60028316613fe0575b6001831615613f7d576801000000000000000102831c613f7d565b6801000000000000000102831c613fc5565b6801000000000000000302831c613fbc565b6801000000000000000602831c613fb3565b6801000000000000000b02831c613faa565b6801000000000000001602831c613fa1565b6801000000000000002c02831c613f98565b6801000000000000005902831c613f90565b618000831661412c575b614000831661411a575b6120008316614108575b61100083166140f6575b61080083166140e4575b61040083166140d2575b61020083166140c0575b610100831615613f7457680100000000000000b102831c613f74565b6801000000000000016302831c6140a4565b680100000000000002c602831c61409a565b6801000000000000058c02831c614090565b68010000000000000b1702831c614086565b6801000000000000162e02831c61407c565b68010000000000002c5d02831c614072565b680100000000000058b902831c614068565b628000008316614214575b624000008316614202575b6220000083166141f0575b6210000083166141de575b6208000083166141cc575b6204000083166141ba575b6202000083166141a8575b62010000831615613f6a576801000000000000b17202831c613f6a565b680100000000000162e402831c61418b565b6801000000000002c5c802831c614180565b68010000000000058b9102831c614175565b680100000000000b172102831c61416a565b68010000000000162e4302831c61415f565b680100000000002c5c8602831c614154565b6801000000000058b90c02831c614149565b63800000008316614304575b634000000083166142f2575b632000000083166142e0575b631000000083166142ce575b630800000083166142bc575b630400000083166142aa575b63020000008316614298575b6301000000831615613f5f5768010000000000b1721802831c613f5f565b6801000000000162e43002831c61427a565b68010000000002c5c86002831c61426e565b680100000000058b90c002831c614262565b6801000000000b17217f02831c614256565b680100000000162e42ff02831c61424a565b6801000000002c5c85fe02831c61423e565b68010000000058b90bfc02831c614232565b64800000000083166143fc575b64400000000083166143ea575b64200000000083166143d8575b64100000000083166143c6575b64080000000083166143b4575b64040000000083166143a2575b6402000000008316614390575b640100000000831615613f5357680100000000b17217f802831c613f53565b68010000000162e42ff102831c614371565b680100000002c5c85fe302831c614364565b6801000000058b90bfce02831c614357565b68010000000b17217fbb02831c61434a565b6801000000162e42fff002831c61433d565b68010000002c5c8601cc02831c614330565b680100000058b90c0b4902831c614323565b6580000000000083166144fc575b6540000000000083166144ea575b6520000000000083166144d8575b6510000000000083166144c6575b6508000000000083166144b4575b6504000000000083166144a2575b650200000000008316614490575b65010000000000831615613f46576801000000b17218355102831c613f46565b680100000162e430e5a202831c614470565b6801000002c5c863b73f02831c614462565b68010000058b90cf1e6e02831c614454565b680100000b1721bcfc9a02831c614446565b68010000162e43f4f83102831c614438565b680100002c5c89d5ec6d02831c61442a565b6801000058b91b5bc9ae02831c61441c565b66800000000000008316614604575b664000000000000083166145f2575b662000000000000083166145e0575b661000000000000083166145ce575b660800000000000083166145bc575b660400000000000083166145aa575b66020000000000008316614598575b6601000000000000831615613f385768010000b17255775c0402831c613f38565b6801000162e525ee054702831c614577565b68010002c5cc37da949202831c614568565b680100058ba01fb9f96d02831c614559565b6801000b175effdc76ba02831c61454a565b680100162f3904051fa102831c61453b565b6801002c605e2e8cec5002831c61452c565b68010058c86da1c09ea202831c61451d565b6780000000000000008316614714575b6740000000000000008316614702575b67200000000000000083166146f0575b67100000000000000083166146de575b67080000000000000083166146cc575b67040000000000000083166146ba575b67020000000000000083166146a8575b670100000000000000831615613f2957680100b1afa5abcbed6102831c613f29565b68010163da9fb33356d802831c614686565b680102c9a3e778060ee702831c614676565b6801059b0d31585743ae02831c614666565b68010b5586cf9890f62a02831c614656565b6801172b83c7d517adce02831c614646565b6801306fe0a31b7152df02831c614636565b5077b504f333f9de648480000000000000000000000000000000614626565b602490604051907f0360d0280000000000000000000000000000000000000000000000000000000082526004820152fd5b8060008083131561488857670de0b6b3a76400009283811261485157506001925b808305906001600160801b03821160071b91821c9167ffffffffffffffff831160061b92831c63ffffffff811160051b90811c61ffff811160041b90811c60ff811160031b90811c91600f831160021b92831c936001978860038711811b96871c11961717171717171781810294811d9082821461484557506706f05b59d3b20000905b8482136148195750505050500290565b808391020590671bc16d674ec80000821215614838575b831d90614809565b8091950194831d90614830565b93505093925050020290565b6000199392508015614874576ec097ce7bc90715b34b9f10000000000591614785565b602482634e487b7160e01b81526012600452fd5b602483604051907f059b101b0000000000000000000000000000000000000000000000000000000082526004820152fd5b64ffffffffff6148ee600091838352600b60205280806040852054818160a01c1693849160c81c160316918142160316613ab4565b91808252600b602052600460408320018054156149745790829167ffffffffffffffff93526149466020832054828452600b6020526139f56001600160801b03968760026040882001541696879360801c1690613e23565b92831361495c57505061495890613a78565b1690565b60029350604092508152600b60205220015460801c90565b602483634e487b7160e01b81526032600452fd5b80600052600b602052604060002060ff600182015460a01c166000146149af575050600490565b805460f81c614a02575460a01c64ffffffffff164210613ed9576149d2816137e7565b90600052600b6020526001600160801b0380600260406000200154169116106000146149fd57600190565b600290565b5050600390565b80600052600b602052614a2260026040600020016135e6565b81600052600b602052604060002060ff600182015460a01c16600014614a5557506001600160801b039150602001511690565b5460f81c614a675750612fa9906137e7565b612fa991506001600160801b036040818351169201511690613688565b906001600160a01b036001541660206001600160a01b0360c0850151166024604051809481937fdcf844a700000000000000000000000000000000000000000000000000000000835260048301525afa80156109c657600090615343575b614b0591506001600160801b0360a08501511690602060e0860151015191615a02565b6001600160801b038151166101008401519064ffffffffff602086015116811561531957825180156152ef577f000000000000000000000000000000000000000000000000000000000000000081116152be575064ffffffffff6040614b6a85613852565b510151168110156152675750600091829083815185905b8082106151d4575050505064ffffffffff421664ffffffffff82168110156151945750506001600160801b03821681036151525750506009549283600052600b6020526040600020916001600160801b0381511660028401906001600160801b03198254161790556001600160a01b0360c083015116600184015490750100000000000000000000000000000000000000000060408501511515928654927fffffffffffffffffff0000ff000000000000000000000000000000000000000076ff000000000000000000000000000000000000000000006060890151151560b01b16921617171760018601556001600160a01b0384511691610100850151926040614c93855195600019870190613875565b510151927fff000000000000000000000000000000000000000000000000000000000000007eff0000000000000000000000000000000000000000000000000000000000007dffffffffff0000000000000000000000000000000000000000000000000078ffffffffff000000000000000000000000000000000000000060208b015160a01b169660c81b169460f01b16911617171717845560005b818110615082575050600185016009556001600160a01b0360c08301511660005260026020526001600160801b0380604060002054168160208401511601166001600160a01b0360c0840151166000526040600020906001600160801b03198254161790556001600160a01b03608083015116801561503e57614dd1614dcb8760005260056020526001600160a01b0360406000205416151590565b156154f1565b614dda8661361a565b1580615035575b8061502d575b615015576020600080516020615b4283398151915291614e20614dcb8960005260056020526001600160a01b0360406000205416151590565b806000526006825260406000206001815401905587600052600582526040600020816001600160a01b0319825416179055876040519160007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4878152a1614eb06001600160a01b0360c0840151166001600160801b03808451168160208601511601169030903390615377565b6001600160801b0360408201511680614fe6575b507fef3d668acee46576ad5d407c42ab4d0cde13f3cd70b28f09a0fb9e3bf5bf09cb614fa36001600160a01b03845116926001600160a01b03608086015116946001600160a01b0360c08201511696614fdb614fbb60408401511515928c606086015115156001600160a01b0360e061010089015194549864ffffffffff6040519a614f4f8c612e9d565b818160a01c168c5260c81c1660208b01520151511695604051998a99610160948b523360208c015260408b0190604090816001600160801b0391828151168552826020820151166020860152015116910152565b60a089015260c08801528060e0880152860190612df3565b926101008501906020908164ffffffffff91828151168552015116910152565b6101408301520390a4565b61500f906001600160a01b0360c0850151166001600160a01b0360e08601515116903390615377565b38614ec4565b602486604051906378630aa960e01b82526004820152fd5b506000614de7565b50801515614de1565b606460405162461bcd60e51b815260206004820152602060248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152fd5b61509181610100860151613875565b5190600486015491680100000000000000008310156121e5576001830180600489015583101561385f5760019260048801600052602060002001906001600160801b03815116908254917fffffff00000000000000000000000000000000000000000000000000000000007cffffffffff000000000000000000000000000000000000000000000000604077ffffffffffffffff00000000000000000000000000000000602086015160801b1694015160c01b169316171717905501614d2f565b6040517fd90b7e390000000000000000000000000000000000000000000000000000000081526001600160801b03918216600482015291166024820152604490fd5b6040517f210aec0e00000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b91935091946151f8906001600160801b036151ef8589613875565b5151169061597e565b9464ffffffffff80604061520c8685613875565b5101511694168085111561522a575060018493019192919092614b81565b8385606492604051927f7b0bada8000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b64ffffffffff604061527885613852565b5101516040517fb4c9e52c00000000000000000000000000000000000000000000000000000000815264ffffffffff938416600482015291169091166024820152604490fd5b602490604051907f4757689b0000000000000000000000000000000000000000000000000000000082526004820152fd5b60046040517f3952c64e000000000000000000000000000000000000000000000000000000008152fd5b60046040517f6095d3bc000000000000000000000000000000000000000000000000000000008152fd5b6020823d60201161536f575b8161535c60209383612eea565b810103126135095750614b059051614ae2565b3d915061534f565b9290604051927f23b872dd0000000000000000000000000000000000000000000000000000000060208501526001600160a01b03809216602485015216604483015260648201526064815260a081019181831067ffffffffffffffff8411176121e5576153e6926040526153e8565b565b6001600160a01b03169061544860405161540181612e9d565b6020938482527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564858301526000808587829751910182855af1615442613358565b9161553c565b8051918215918483156154cd575b5050509050156154635750565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b91938180945001031261350c57820151908115158203613509575080388084615456565b156154f857565b606460405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152fd5b9192901561559d5750815115615550575090565b3b156155595790565b606460405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b8251909150156155b05750805190602001fd5b6105859060405191829162461bcd60e51b8352602060048401526024830190612d28565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361560657565b60046040517fa1c0d6e5000000000000000000000000000000000000000000000000000000008152fd5b916001600160a01b03604051927fa9059cbb000000000000000000000000000000000000000000000000000000006020850152166024830152604482015260448152608081019181831067ffffffffffffffff8411176121e5576153e6926040526153e8565b612fa9906156a381614a09565b90600052600b60205260026040600020015460801c90613688565b919081101561385f5760051b0190565b9291926156da81613651565b615966576156fe81600052600b6020526001600160a01b0360406000205416331490565b91821580615956575b611a5f57600094828652602091600583526001600160a01b039460409186838a205416918061594a575b61592557868116968715615915576001600160801b038086169586156158fe578161575b8a615696565b168088116158db5750916157e993916157b28a60028f80600b8e6157908f9b8f9588905283835286868620015460801c61597e565b95835252200190836001600160801b031983549260801b1691161781556135e6565b906157cd818b8401511692828a818351169201511690613688565b1611156158ac575b888c52600b88526001868d20015416615630565b80331415806158a2575b615826575b507ffa54f9f9bdcdd28778cbb9f78490df6691cc4e2729588e10f4cc0a26c465686a939495965051908152a3565b803b1561589e5796807ffa54f9f9bdcdd28778cbb9f78490df6691cc4e2729588e10f4cc0a26c465686a9596979860848451809481936313375c3b60e01b83528b60048401523360248401528c60448401528860648401525af161588f575b87969594506157f8565b61589890612ed6565b38615885565b8780fd5b50803b15156157f3565b888c52600b8852858c2060018101600160a01b60ff60a01b1982541617905560ff60f01b1981541690556157d5565b896064918989519263287ecaef60e21b8452600484015260248301526044820152fd5b60248987519063d2aabcd960e01b82526004820152fd5b6004845163630d074f60e11b8152fd5b8587606492855192632dcbf6b960e11b84526004840152336024840152166044820152fd5b50818782161415615731565b5061596082615999565b15615707565b60249060405190634a5541ef60e01b82526004820152fd5b9190916001600160801b0380809416911601918211611d9b57565b60009080825260056020526001600160a01b0380604084205416928333149384156159de575b505082156159cc57505090565b9091506159d93392612fac565b161490565b60ff92945090604091815260086020528181203382526020522054169138806159bf565b909291615a0d6135c7565b936001600160801b0392838116918215615b195767016345785d8a0000808211615ae257808511615aab5750615a5785615a48819386613d74565b16946020890195865284613d74565b169184615a6e60408901948086528287511661597e565b161015615a9557615a87849182615a9095511690613688565b91511690613688565b168252565b634e487b7160e01b600052600160045260246000fd5b84604491604051917f4fea5c1a00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b60449250604051917f47152d6700000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b50505050509050604051615b2c81612e64565b6000815260006020820152600060408201529056fef8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7a164736f6c6343000815000a"; bytes public constant BYTECODE_LOCKUP_LINEAR = - hex"60a034620003e757601f196001600160401b03601f62004e4e3881900382810185168601919084831187841017620003ec57808792606094604052833981010312620003e75783516001600160a01b03928382169291839003620003e7576020918287015196858816809803620003e75760400151948516809503620003e7576200008962000402565b90601c82527f5361626c696572205632204c6f636b7570204c696e656172204e46540000000084830152620000bd62000402565b601181527029a0a116ab1916a627a1a5aaa816a624a760791b8582015230608052600080546001600160a01b031990811688178255600180548216909b178b5596817fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a38351858111620003d35760039485548c81811c91168015620003c8575b89821014620003b45790818684931162000361575b508890868311600114620002f8578492620002ec575b505060001982871b1c1916908b1b1784555b8151948511620002d8576004958654998b8b811c9b168015620002cd575b828c1014620002ba57848b1162000271575b869798999a50819487116001146200020a57505093620001fe575b505082871b92600019911b1c19161790555b600a541617600a55600955604051614a2b9081620004238239608051816147410152f35b015191503880620001c8565b8883528183208c9890969594939116915b8282106200025757505085116200023c575b50505050811b019055620001da565b01519060f884600019921b161c19169055388080806200022d565b8484015187558c989096019593840193908101906200021b565b87835281832085880160051c81019b838910620002af575b860160051c019a8c905b8c8110620002a3575050620001ad565b848155018c9062000293565b909b508b9062000289565b634e487b7160e01b835260228852602483fd5b9a607f169a6200019b565b634e487b7160e01b81526041600452602490fd5b0151905038806200016b565b908c8e9416918886528a862092865b8c82821062000341575050841162000328575b505050811b0184556200017d565b015160001983891b60f8161c191690553880806200031a565b91929395968291958786015181550195019301908f959493929162000307565b9091508684528884208680850160051c8201928b8610620003aa575b918f91869594930160051c01915b8281106200039b57505062000155565b8681558594508f91016200038b565b925081926200037d565b634e487b7160e01b84526022600452602484fd5b90607f169062000140565b634e487b7160e01b82526041600452602482fd5b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620003ec5760405256fe608080604052600436101561001357600080fd5b600090813560e01c90816301ffc9a714612fe05750806306fdde0314612f1e578063081812fc14612eff578063095ea7b314612d705780631400ecec14612cd05780631c1cdd4c14612c6b5780631e99d56914612c4d57806323b872dd14612c2357806339a73c0314612be257806340e58ee514612847578063425d30dd1461282857806342842e0e146127d857806342966c68146126805780634857501f146125f65780634869e12d146125bb5780635fe3b567146125945780636352211e146125645780636d0cee751461250e57806370a082311461246557806375829def146123d2578063780a82c8146123825780637cad6cd1146122b15780637de6b1db146120a25780638659c27014611cb7578063894e9a0d14611a635780638bad38dd146119e65780638f69b9931461194a5780639067b677146118f757806395d89b41146117ea57806396ce1431146116cb578063a22cb465146115fa578063a2ffb89714611201578063a6202bf214611104578063a80fc071146110b2578063ab167ccc14610f79578063ad35efd414610f17578063b256456914610ef8578063b88d4fde14610e67578063b8a3be6614610e32578063b971302a14610de3578063bc063e1a14610dc0578063bc2be1be14610d70578063c156a11d146109d3578063c87b56dd14610899578063cc364f48146107eb578063d4dbd20b14610799578063d511609f1461074d578063d975dfed14610701578063e985e9c5146106ac578063ea5ead1914610685578063eac8f5b81461061c578063f590c176146105f3578063f851a440146105cd5763fdd46d601461027357600080fd5b346105ca5760603660031901126105ca5760043561028f61310f565b9061029861324f565b906102a1614737565b6102aa816138cd565b6105b2576102ce81600052600b6020526001600160a01b0360406000205416331490565b15806105a2575b61057e576102f981600052600b6020526001600160a01b0360406000205416331490565b8061055c575b61052f576001600160a01b03808416908115610505576001600160801b03948585169586156104ed5780610332866147f9565b168088116104c95750868893926103d59287865261039b61036360209a600b8c52600260408a20015460801c614847565b898852600b8b52610396600260408a20019182906001600160801b036001600160801b031983549260801b169116179055565b613862565b906103b7818b8401511692826040818351169201511690613904565b161115610499575b868552600b885283600160408720015416614793565b83825260058552604082205416803314158061048f575b610437575b5050817ffa54f9f9bdcdd28778cbb9f78490df6691cc4e2729588e10f4cc0a26c465686a84600080516020614a0b83398151915296604051908152a3604051908152a180f35b803b1561048b578180916084604051809481936313375c3b60e01b83528960048401523360248401528860448401528b60648401525af1156103f15761047c9061318b565b6104875784386103f1565b8480fd5b5080fd5b50803b15156103ec565b868552600b88526040852060018101600160c81b60ff60c81b1982541617905560ff60f01b1981541690556103bf565b85606491896040519263287ecaef60e21b8452600484015260248301526044820152fd5b6024856040519063d2aabcd960e01b82526004820152fd5b60046040517fc61a0e9e000000000000000000000000000000000000000000000000000000008152fd5b6064906001600160a01b038460405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b5080845260056020526001600160a01b038060408620541690841614156102ff565b60405163216caf0d60e01b81526004810191909152336024820152604490fd5b0390fd5b506105ac81614862565b156102d5565b60249060405190634a5541ef60e01b82526004820152fd5b80fd5b50346105ca57806003193601126105ca576001600160a01b036020915416604051908152f35b50346105ca5760203660031901126105ca576020610612600435613933565b6040519015158152f35b50346105ca5760203660031901126105ca57600435808252600b60205260ff600160408420015460d01c161561066e5760016040836001600160a01b039360209552600b855220015416604051908152f35b6024906040519062b8e7e760e51b82526004820152fd5b50346105ca5760403660031901126105ca576004356106a261310f565b90610298816147f9565b50346105ca5760403660031901126105ca576106c66130f9565b60406106d061310f565b926001600160a01b0380931681526008602052209116600052602052602060ff604060002054166040519015158152f35b50346105ca5760203660031901126105ca5760ff6001604060043593848152600b60205220015460d01c161561066e5761073c6020916147f9565b6001600160801b0360405191168152f35b50346105ca5760203660031901126105ca57600435808252600b60205260ff600160408420015460d01c161561066e5760408260029260209452600b845220015460801c604051908152f35b50346105ca5760203660031901126105ca57600435808252600b60205260ff600160408420015460d01c161561066e5760036040836001600160801b039360209552600b855220015416604051908152f35b50346105ca5760203660031901126105ca57600435610808613843565b50808252600b60205260ff600160408420015460d01c161561066e578160409160609352600b60205220600181549164ffffffffff918291015460a01c169060405192610854846131d9565b818160a01c16845260c81c166020830152604082015261089760405180926040908164ffffffffff91828151168552826020820151166020860152015116910152565bf35b50346105ca5760208060031936011261048b576004356108d76108d28260005260056020526001600160a01b0360406000205416151590565b613265565b826001600160a01b03600a5416916044604051809481937fe9dc637500000000000000000000000000000000000000000000000000000000835230600484015260248301525afa9283156109c7578093610946575b50506109426040519282849384528301906130d4565b0390f35b909192503d8082843e6109598184613211565b820191838184031261048b5780519067ffffffffffffffff82116109c3570182601f8201121561048b5780519161098f83613233565b9361099d6040519586613211565b8385528584840101116105ca5750906109bb918480850191016130b1565b90388061092c565b8280fd5b604051903d90823e3d90fd5b50346105ca5760403660031901126105ca576004356109f061310f565b906109f9614737565b808352602090600b825260ff600160408620015460d01c161561066e57808452600582526001600160a01b038060408620541690813303610d5157610a3d836147f9565b906001600160801b038083169283158015610a7a575b89600080516020614a0b8339815191528989610a70818e8c6134f8565b604051908152a180f35b610a82614737565b610a8b876138cd565b610d3957610aaf87600052600b6020526001600160a01b0360406000205416331490565b1580610d29575b610d0a57610ada87600052600b6020526001600160a01b0360406000205416331490565b80610cf3575b610ccf57851561050557610cb75781610af8876147f9565b16808511610c93575090610b55610b228a9493888652600b8a52600260408720015460801c614847565b878552600b8952610396600260408720019182906001600160801b036001600160801b031983549260801b169116179055565b90610b7181898401511692826040818351169201511690613904565b161115610c63575b848252600b8652610b94838583600160408720015416614793565b848252600586526040822054168033141580610c59575b610c05575b5050600080516020614a0b8339815191529482610a7093857ffa54f9f9bdcdd28778cbb9f78490df6691cc4e2729588e10f4cc0a26c465686a888296604051908152a38686604051858152a192819638610a53565b803b1561048b578180916084604051809481936313375c3b60e01b83528a60048401523360248401528960448401528860648401525af115610bb057610c4a9061318b565b610c55578538610bb0565b8580fd5b50803b1515610bab565b848252600b86526040822060018101600160c81b60ff60c81b1982541617905560ff60f01b198154169055610b79565b86606491866040519263287ecaef60e21b8452600484015260248301526044820152fd5b6024866040519063d2aabcd960e01b82526004820152fd5b6064878760405191632dcbf6b960e11b835260048301523360248301526044820152fd5b50868a52600588528360408b205416861415610ae0565b60405163216caf0d60e01b815260048101889052336024820152604490fd5b50610d3387614862565b15610ab6565b60248760405190634a5541ef60e01b82526004820152fd5b60405163216caf0d60e01b815260048101849052336024820152604490fd5b50346105ca5760203660031901126105ca57600435808252600b60205260ff600160408420015460d01c161561066e5760408264ffffffffff9260209452600b8452205460a01c16604051908152f35b50346105ca57806003193601126105ca57602060405167016345785d8a00008152f35b50346105ca5760203660031901126105ca57600435808252600b60205260ff600160408420015460d01c161561066e576040826001600160a01b039260209452600b8452205416604051908152f35b50346105ca5760203660031901126105ca5760ff600160406020936004358152600b855220015460d01c166040519015158152f35b50346105ca5760803660031901126105ca57610e816130f9565b610e8961310f565b906064359067ffffffffffffffff8211610ef45736602383011215610ef45781600401359284610eb885613233565b93610ec66040519586613211565b858552366024878301011161048b5785610ef196602460209301838801378501015260443591613383565b80f35b8380fd5b50346105ca5760203660031901126105ca576020610612600435613896565b50346105ca5760203660031901126105ca57600435808252600b60205260ff600160408420015460d01c161561066e57610f5090613ba9565b604051906005811015610f6557602092508152f35b602483634e487b7160e01b81526021600452fd5b50346105ca576101403660031901126105ca57610f94614737565b610f9c613843565b9064ffffffffff80421680845260c43582811681036110ad5781018216602085015260e4359081831682036110ad5701166040830152606435916001600160a01b03918284168094036105ca57506084358015158091036110ad5760a435908115158092036110ad57602435948486168096036110ad57600435958587168097036110ad57604435906001600160801b0382168092036110ad5760405197611043896131bc565b8852602088015260408701526060860152608085015260a084015260c08301526040610103193601126110ad576040519161107d836131f5565b6101043591821682036110ad57826110a59260209452610124358482015260e0820152613cab565b604051908152f35b600080fd5b50346105ca5760203660031901126105ca57600435808252600b60205260ff600160408420015460d01c161561066e5760026040836001600160801b039360209552600b855220015416604051908152f35b50346105ca5760203660031901126105ca5761111e6130f9565b6001600160a01b03808354163381036111d8575081169081835260026020526001600160801b036040842054169081156111a75781611178918486526002602052604086206001600160801b031981541690553390614793565b6040519081527fca7a4a65a94ed2f37538814e00e1cd4c41a78261561e3f3794592f11409cf5af60203392a380f35b602483604051907f8410168c0000000000000000000000000000000000000000000000000000000082526004820152fd5b6040516331b339a960e21b81526001600160a01b03919091166004820152336024820152604490fd5b50346105ca5760603660031901126105ca5767ffffffffffffffff6004358181116109c35761123490369060040161315a565b9161123d61310f565b906044359081116104875761125690369060040161315a565b9093611260614737565b8181036115c457855b818110611274578680f35b61127f818387614821565b359061128c818589614821565b35916001600160801b03831683036110ad576112a6614737565b6112af816138cd565b6105b2576112d381600052600b6020526001600160a01b0360406000205416331490565b15806115b4575b61057e576112fe81600052600b6020526001600160a01b0360406000205416331490565b8061158c575b61155f576001600160a01b03861615610505576001600160801b03831615611547576001600160801b03611337826147f9565b16806001600160801b0385161161151a5750808952600b8060205261139b8a6103966002604061136f8983838720015460801c614847565b938781528660205220019182906001600160801b036001600160801b031983549260801b169116179055565b6001600160801b036113bf8160208401511692826040818351169201511690613904565b1611156114ea575b818a526020526113f289876001600160a01b03600160406001600160801b0389169420015416614793565b8089526005602052886001600160a01b0360408220541680331415806114e0575b61147a575b50506020600080516020614a0b833981519152916001946001600160801b0360405191168152817ffa54f9f9bdcdd28778cbb9f78490df6691cc4e2729588e10f4cc0a26c465686a846001600160a01b038c1693a3604051908152a101611269565b803b1561048b57816001600160a01b0360848a8360405195869485936313375c3b60e01b85528a60048601523360248601521660448401526001600160801b038b1660648401525af115611418576114d19061318b565b6114dc578838611418565b8880fd5b50803b1515611413565b818a528060205260408a2060018101600160c81b60ff60c81b1982541617905560ff60f01b1981541690556113c7565b606492506001600160801b03846040519363287ecaef60e21b855260048501521660248301526044820152fd5b6024906040519063d2aabcd960e01b82526004820152fd5b6064906001600160a01b038760405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b5080895260056020526001600160a01b0360408a2054166001600160a01b0387161415611304565b506115be81614862565b156112da565b604491604051917faec9344000000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b50346105ca5760403660031901126105ca576116146130f9565b602435908115158092036110ad576001600160a01b0316908133146116875733835260086020526040832082600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a380f35b606460405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152fd5b50346105ca576101603660031901126105ca576116e6614737565b604051906116f3826131bc565b6116fb6130f9565b825261170561310f565b602083015261171261324f565b60408301526001600160a01b039060643582811681036110ad57606084015260843580151581036110ad57608084015260a43580151581036110ad5760a084015260603660c31901126105ca575060405161176c816131d9565b64ffffffffff60c43581811681036110ad57825260e43581811681036110ad5760208301526101043590811681036110ad57604082015260c08301526040610123193601126110ad57604051916117c2836131f5565b6101243591821682036110ad57826110a59260209452610144358482015260e0820152613cab565b50346105ca57806003193601126105ca57604051908060045491600183811c928185169485156118ed575b60209586861081146118d9578588528794939291879082156118b757505060011461185d575b505061184992500383613211565b6109426040519282849384528301906130d4565b90859250600482527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5b85831061189f5750506118499350820101388061183b565b80548389018501528794508693909201918101611887565b925093505061184994915060ff191682840152151560051b820101388061183b565b602483634e487b7160e01b81526022600452fd5b93607f1693611815565b50346105ca5760203660031901126105ca57600435808252600b60205260ff600160408420015460d01c161561066e57600160408364ffffffffff9360209552600b855220015460a01c16604051908152f35b50346105ca5760203660031901126105ca57600435808252600b60205260ff600160408420015460d01c161561066e5761198390613ba9565b90600582101590816119c457600283149182156119d8575b82156119af575b6020836040519015158152f35b9091506119c4575060046020911438806119a2565b80634e487b7160e01b602492526021600452fd5b50600383149150600061199b565b50346105ca5760203660031901126105ca576004356001600160a01b03908181168091036109c357818354163381036111d8575060015491816001600160a01b03198416176001556040519216825260208201527fdcb09aef4bf01068924ccce937981cbe59d25ba08380cf941aaaea4e4bd3960d60403392a280f35b50346105ca5760203660031901126105ca57604051611a818161319f565b8181528160208201528160408201528160608201528160808201528160a08201528160c08201528160e08201528161010082015281610120820152610140611ac7613843565b9101526004358152600b60205260ff600160408320015460d01c1615611c9f576004358152600b60205260408120611ba0600260405192611b078461319f565b80546001600160a01b038116855264ffffffffff8160a01c16602086015264ffffffffff8160c81c16604086015260ff8160f01c161515606086015260f81c1515608085015260ff60018201546001600160a01b03811660a087015264ffffffffff8160a01c1660c0870152818160c81c16151560e0870152818160d01c16151561010087015260d81c16151561012085015201613862565b610140820152611bb1600435613ba9565b6005811015610f65579160026101a09314611c94575b50610897610140604051926001600160a01b03815116845264ffffffffff602082015116602085015264ffffffffff60408201511660408501526060810151151560608501526080810151151560808501526001600160a01b0360a08201511660a085015264ffffffffff60c08201511660c085015260e0810151151560e0850152610100810151151561010085015261012081015115156101208501520151610140830190604090816001600160801b0391828151168552826020820151166020860152015116910152565b606082015238611bc7565b602460405162b8e7e760e51b81526004356004820152fd5b50346105ca57602090816003193601126105ca5760043567ffffffffffffffff811161048b57611cec8391369060040161315a565b90611cf5614737565b83915b808310611d03578480f35b611d1283828497959697614821565b3593611d1c614737565b611d25856138cd565b15611d425760248560405190634a5541ef60e01b82526004820152fd5b90919293611d4f81613933565b61208a57611d7381600052600b6020526001600160a01b0360406000205416331490565b158061206c575b61057e57611d8781613964565b818652600b90818852611d9f60026040892001613862565b6001600160801b039182825116838216101561205457848952838a5260ff60408a205460f01c161561203c57928282611df186838e611de78f9a829a60409e9d9a5116613904565b9401511690613904565b84875283865288872091611e77835494600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff87161785556003818516958615612022575b0190831699818b6001600160801b0319819454161790556001600160a01b0380971696879160058c52818f82205416998c5260019e8f9120015416614793565b338403611f6057843b611ed9575b50507f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd26040600080516020614a0b8339815191529786935b825191825288820152a4604051908152a1019190939293611cf8565b90919293809596503b15611f5c576040516372eba20360e01b8152600481018790526001600160a01b03851660248201526001600160801b039182166044820152911660648201528b94939291908b90818160848183895af115611e8557611f47919293959794965061318b565b611f5857918a939194928a8d611e85565b8980fd5b8b80fd5b833b611fa3575b50507f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd26040600080516020614a0b833981519152978693611ebd565b90919280949596503b15611f5c576040516372eba20360e01b8152600481018790526001600160a01b03861660248201526001600160801b039182166044820152911660648201528b94939291908b90818160848183885af115611f6757612011919293959794965061318b565b611f5857918a939194928a8d611f67565b60018101600160c81b60ff60c81b19825416179055611e37565b602485604051906339c6dc7360e21b82526004820152fd5b602485604051906322cad1af60e11b82526004820152fd5b50808552600586526001600160a01b03604086205416331415611d7a565b6024906040519063fe19f19f60e01b82526004820152fd5b50346105ca5760208060031936011261048b57600435906120c1614737565b818352600b815260ff600160408520015460d01c161561229a576120e482613ba9565b6005811015612286576004810361210d5760248360405190634a5541ef60e01b82526004820152fd5b6003810361212d576024836040519063fe19f19f60e01b82526004820152fd5b60021461226e5761215482600052600b6020526001600160a01b0360406000205416331490565b1561224f57818352600b815260ff604084205460f01c161561223757818352600b81526040832060ff60f01b19815416905560058152826001600160a01b03604082205416803b6121e0575b5050604051600080516020614a0b83398151915292807f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f8680a28152a180f35b803b1561048b578180916024604051809481937f341a0bd90000000000000000000000000000000000000000000000000000000083528960048401525af1156121a05761222c9061318b565b6109c35782386121a0565b602482604051906339c6dc7360e21b82526004820152fd5b60405163216caf0d60e01b815260048101839052336024820152604490fd5b602482604051906322cad1af60e11b82526004820152fd5b602484634e487b7160e01b81526021600452fd5b6024826040519062b8e7e760e51b82526004820152fd5b50346105ca5760203660031901126105ca576004356001600160a01b03908181168091036109c357818354163381036111d85750600a5491816001600160a01b0319841617600a556040519216825260208201527fa2548bd4b805e907c1558a47b5858324fe8bb4a2e1ddfca647eecbf65610eebc60403392a2600954600019810190811161236e5760407f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c91815190600182526020820152a180f35b602482634e487b7160e01b81526011600452fd5b50346105ca5760203660031901126105ca57600435808252600b60205260ff600160408420015460d01c161561066e5760408264ffffffffff9260209452600b8452205460c81c16604051908152f35b50346105ca5760203660031901126105ca576123ec6130f9565b9080546001600160a01b038082169333850361243e576001600160a01b03199394501691829116178255337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808380a380f35b6040516331b339a960e21b81526001600160a01b0386166004820152336024820152604490fd5b50346105ca5760203660031901126105ca576001600160a01b036124876130f9565b1680156124a4578160409160209352600683522054604051908152f35b608460405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e657200000000000000000000000000000000000000000000006064820152fd5b50346105ca5760203660031901126105ca576001600160a01b0360406020926004356125536108d28260005260056020526001600160a01b0360406000205416151590565b815260058452205416604051908152f35b50346105ca5760203660031901126105ca5760206125836004356132b0565b6001600160a01b0360405191168152f35b50346105ca57806003193601126105ca5760206001600160a01b0360015416604051908152f35b50346105ca5760203660031901126105ca5760ff6001604060043593848152600b60205220015460d01c161561066e5761073c602091613c30565b50346105ca5760203660031901126105ca5760043590818152600b60205260ff600160408320015460d01c161561229a578061263183613ba9565b92600584101561266c57600260209403612652575b50506040519015158152f35b8152600b8352604090205460f01c60ff1690503880612646565b602482634e487b7160e01b81526021600452fd5b50346105ca5760203660031901126105ca5760043561269d614737565b6126a6816138cd565b156127a7576126b481614862565b1561057e576126c2816132b0565b6126cb82613896565b15908161279f575b8161278c575b50612774576020816126f9600080516020614a0b833981519152936132b0565b90808552600783526001600160a01b0360408620926001600160a01b03199384815416905516918286526006845260408620600019815401905581865260058452604086209081541690558085604051937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a48152a180f35b602490604051906378630aa960e01b82526004820152fd5b6001600160a01b039150161515386126d9565b8391506126d3565b602490604051907f817cd6390000000000000000000000000000000000000000000000000000000082526004820152fd5b50346105ca576127e736613125565b60405191602083019383851067ffffffffffffffff86111761281257610ef194604052858452613383565b634e487b7160e01b600052604160045260246000fd5b50346105ca5760203660031901126105ca5760206106126004356138cd565b50346105ca5760208060031936011261048b5760043590612866614737565b61286f826138cd565b1561288c5760248260405190634a5541ef60e01b82526004820152fd5b61289582613933565b612bca576128b982600052600b6020526001600160a01b0360406000205416331490565b1580612bac575b61224f576128cd82613964565b91808452600b82526128e460026040862001613862565b6001600160801b0393848251168582161015612b9457828652600b845260ff604087205460f01c1615612b7c5781612928828787611de76040968383995116613904565b848852600b8452828820916129ae835498600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8b161785558a6003828616968715612b62575b019184169a828c6001600160801b03198195541617905560016001600160a01b0380921698899360058c52600b8483832054169c5220015416614793565b338403612a7957908891853b612a0c575b5050507f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd26040600080516020614a0b8339815191529786935b825191825288820152a4604051908152a180f35b853b156109c3576040516372eba20360e01b8152600481018890526001600160a01b03861660248201526001600160801b03918216604482015291166064820152818160848183895af1612a61575b806129bf565b612a6a9061318b565b612a75578638612a5b565b8680fd5b83989792983b612ac1575b50507f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd260408592600080516020614a0b83398151915298996129f8565b833b15612b5e576040516372eba20360e01b8152600481018790526001600160a01b03861660248201526001600160801b03918216604482015291166064820152868160848183875af1612b16575b80612a84565b60408592600080516020614a0b83398151915298612b547f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd29461318b565b9850925050612b10565b8780fd5b60018101600160c81b60ff60c81b19825416179055612970565b602483604051906339c6dc7360e21b82526004820152fd5b602483604051906322cad1af60e11b82526004820152fd5b50818352600581526001600160a01b036040842054163314156128c0565b6024826040519063fe19f19f60e01b82526004820152fd5b50346105ca5760203660031901126105ca576001600160801b0360406020926001600160a01b03612c116130f9565b16815260028452205416604051908152f35b50346105ca57610ef1612c3536613125565b91612c48612c438433613419565b613312565b6134f8565b50346105ca57806003193601126105ca576020600954604051908152f35b50346105ca5760203660031901126105ca57600435808252600b60205260ff600160408420015460d01c161561066e57612ca490613ba9565b9060058210156119c45760208215838115612cc5575b506040519015158152f35b600191501482612cba565b50346105ca5760203660031901126105ca5760043590818152600b60205260ff600160408320015460d01c161561229a57602091604082828152600b85522060ff815460f01c1680612d5e575b612d35575b50506001600160801b0360405191168152f35b612d5792506001600160801b036002612d519201541691613964565b90613904565b3880612d22565b5060ff600182015460c81c1615612d1d565b50346105ca5760403660031901126105ca57612d8a6130f9565b602435906001600160a01b038080612da1856132b0565b16921691808314612e9557803314908115612e74575b5015612e0a57828452600760205260408420826001600160a01b0319825416179055612de2836132b0565b167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258480a480f35b608460405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152fd5b9050845260086020526040842033855260205260ff60408520541638612db7565b608460405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152fd5b50346105ca5760203660031901126105ca5760206125836004356132d5565b50346105ca57806003193601126105ca57604051908060035491600183811c92818516948515612fd6575b60209586861081146118d9578588528794939291879082156118b7575050600114612f7c57505061184992500383613211565b90859250600382527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b858310612fbe5750506118499350820101388061183b565b80548389018501528794508693909201918101612fa6565b93607f1693612f49565b90503461048b57602036600319011261048b576004357fffffffff0000000000000000000000000000000000000000000000000000000081168091036109c357602092507f80ac58cd000000000000000000000000000000000000000000000000000000008114908115613087575b811561305d575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501438613056565b7f5b5e139f000000000000000000000000000000000000000000000000000000008114915061304f565b60005b8381106130c45750506000910152565b81810151838201526020016130b4565b906020916130ed815180928185528580860191016130b1565b601f01601f1916010190565b600435906001600160a01b03821682036110ad57565b602435906001600160a01b03821682036110ad57565b60609060031901126110ad576001600160a01b039060043582811681036110ad579160243590811681036110ad579060443590565b9181601f840112156110ad5782359167ffffffffffffffff83116110ad576020808501948460051b0101116110ad57565b67ffffffffffffffff811161281257604052565b610160810190811067ffffffffffffffff82111761281257604052565b610100810190811067ffffffffffffffff82111761281257604052565b6060810190811067ffffffffffffffff82111761281257604052565b6040810190811067ffffffffffffffff82111761281257604052565b90601f8019910116810190811067ffffffffffffffff82111761281257604052565b67ffffffffffffffff811161281257601f01601f191660200190565b604435906001600160801b03821682036110ad57565b1561326c57565b606460405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152fd5b60005260056020526001600160a01b03604060002054166132d2811515613265565b90565b6132f86108d28260005260056020526001600160a01b0360406000205416151590565b60005260076020526001600160a01b036040600020541690565b1561331957565b608460405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f766564000000000000000000000000000000000000006064820152fd5b906133a7939291613397612c438433613419565b6133a28383836134f8565b6136b1565b156133ae57565b60405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b906001600160a01b03808061342d846132b0565b16931691838314938415613460575b50831561344a575b50505090565b613456919293506132d5565b1614388080613444565b909350600052600860205260406000208260005260205260ff60406000205416923861343c565b1561348e57565b608460405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152fd5b906135219291613507836132b0565b916001600160a01b03948593848094169687911614613487565b16908115806136185761353384613896565b15908161360f575b5080613606575b6135ee5791808492613570600080516020614a0b83398151915296602096613569856132b0565b1614613487565b60009382855260078652604085206001600160a01b031990818154169055818652600687526040862060001981540190558286526040862060018154019055838652600587528260408720918254161790557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6040519580a48152a1565b602483604051906378630aa960e01b82526004820152fd5b50831515613542565b9050153861353b565b608460405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152fd5b3d156136ac573d9061369282613233565b916136a06040519384613211565b82523d6000602084013e565b606090565b9290803b1561383a5761371b916020916001600160a01b0394604051809581948293897f150b7a02000000000000000000000000000000000000000000000000000000009b8c865233600487015216602485015260448401526080606484015260848301906130d4565b03916000968791165af1908290826137da575b50506137b45761373c613681565b805190816137af5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000161490565b909192506020813d8211613832575b816137f660209383613211565b8101031261048b5751907fffffffff00000000000000000000000000000000000000000000000000000000821682036105ca575090388061372e565b3d91506137e9565b50505050600190565b60405190613850826131d9565b60006040838281528260208201520152565b9060405161386f816131d9565b6040819360018154916001600160801b0392838116865260801c6020860152015416910152565b80600052600b60205260ff60016040600020015460d01c161561066e57600052600b60205260ff60016040600020015460d81c1690565b80600052600b60205260ff60016040600020015460d01c161561066e57600052600b60205260ff60016040600020015460c81c1690565b6001600160801b03918216908216039190821161391d57565b634e487b7160e01b600052601160045260246000fd5b80600052600b60205260ff60016040600020015460d01c161561066e57600052600b60205260406000205460f81c90565b600090808252600b6020526040822091825464ffffffffff42818360c81c1611613a125780600186015460a01c1691824210156139fc576139b19394955060a01c16809103904203613a1a565b90828152600b6020526001600160801b03926139d7846002604085200154168094613afa565b9283116139e45750501690565b60029350604092508152600b60205220015460801c90565b505050505060026001600160801b039101541690565b505091505090565b670de0b6b3a7640000916000198383099280830292838086109503948086039514613ad65782851015613a9a57908291096001821901821680920460028082600302188083028203028083028203028083028203028083028203028083028203028092029003029360018380600003040190848311900302920304170290565b82606492604051927f63a05778000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b505080925015613ae4570490565b634e487b7160e01b600052601260045260246000fd5b90919060001983820983820291828083109203918083039214613b9857670de0b6b3a76400009081831015613b6157947faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066994950990828211900360ee1b910360121c170290565b60449086604051917f5173648d00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050670de0b6b3a764000090049150565b80600052600b602052604060002060ff600182015460c81c16600014613bd0575050600490565b805460f81c613c29575460a01c64ffffffffff164210613c2357613bf381613964565b90600052600b6020526001600160801b038060026040600020015416911610600014613c1e57600190565b600290565b50600090565b5050600390565b80600052600b602052613c496002604060002001613862565b81600052600b602052604060002060ff600182015460c81c16600014613c7c57506001600160801b039150602001511690565b5460f81c613c8e57506132d290613964565b6132d291506001600160801b036040818351169201511690613904565b906001600160a01b036001541660206001600160a01b036060850151166024604051809481937fdcf844a700000000000000000000000000000000000000000000000000000000835260048301525afa80156144ce5760009061449a575b613d2c91506001600160801b0360408501511690602060e08601510151916148cb565b916001600160801b0383511660c082015190156144705764ffffffffff815116602082019064ffffffffff8251169081811161443057505064ffffffffff604091511691019064ffffffffff82511690818110156143f057505064ffffffffff80421691511690818110156143b0575050600954926001600160801b0381511660405190613db9826131d9565b815260006020820152600060408201526001600160a01b036060840151169060c08401519164ffffffffff6020840151169064ffffffffff604085015116906080870151151560a088015115159364ffffffffff6001600160a01b038a511697511660405197613e288961319f565b88526020880152604087015260608601526000608086015260a085015260c0840152600060e0840152600161010084015261012083015261014082015284600052600b60205260406000206001600160a01b038251166001600160a01b0319825416178155613ebf64ffffffffff602084015116829064ffffffffff60a01b1964ffffffffff60a01b83549260a01b169116179055565b604082015181547eff0000000000000000000000000000000000000000000000000000000000006060850151151560f01b169078ffffffffffffffffffffffffffffffffffffffffffffffffff7dffffffffff000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000006080880151151560f81b169460c81b1691161717178155600181016001600160a01b0360a0840151166001600160a01b0319825416178155613fb664ffffffffff60c085015116829064ffffffffff60a01b1964ffffffffff60a01b83549260a01b169116179055565b60e083015181546101008501516101208601517fffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff90921692151560c81b79ff00000000000000000000000000000000000000000000000000169290921791151560d01b7aff0000000000000000000000000000000000000000000000000000169190911790151560d81b7bff00000000000000000000000000000000000000000000000000000016179055610140909101518051602082015160801b6001600160801b03199081166001600160801b03928316176002850155926040906003019201511682825416179055600185016009556001600160a01b0360608401511660005260026020526001600160801b0380604060002054168160208501511601166001600160a01b036060850151166000526040600020918254161790556001600160a01b03602083015116801561436c5761413161412b8660005260056020526001600160a01b0360406000205416151590565b15614654565b61413a85613896565b1580614363575b8061435b575b614343576020600080516020614a0b8339815191529161418061412b8860005260056020526001600160a01b0360406000205416151590565b806000526006825260406000206001815401905586600052600582526040600020816001600160a01b0319825416179055866040519160007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4868152a16142106001600160a01b036060840151166001600160801b038084511681602086015116011690309033906144da565b6001600160801b0360408201511680614314575b506001600160a01b038251167f075861cbceafeb777e8f15f357121b08f6f3adba387d599bb7b5278ca6192df5610160866001600160a01b036020870151169461430b6001600160a01b03606089015116976080810151151560a08201511515906142d56001600160a01b0360e060c08601519501515116956040519788523360208901526040880190604090816001600160801b0391828151168552826020820151166020860152015116910152565b60a086015260c0850152805164ffffffffff90811660e08601526020820151811661010086015260409091015116610120840152565b610140820152a4565b61433d906001600160a01b036060850151166001600160a01b0360e086015151169033906144da565b38614224565b602485604051906378630aa960e01b82526004820152fd5b506000614147565b50801515614141565b606460405162461bcd60e51b815260206004820152602060248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152fd5b6040517f210aec0e00000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b6040517f9fee269100000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b6040517f4c23297000000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b60046040517f6095d3bc000000000000000000000000000000000000000000000000000000008152fd5b6020823d6020116144c6575b816144b360209383613211565b810103126105ca5750613d2c9051613d09565b3d91506144a6565b6040513d6000823e3d90fd5b9290604051927f23b872dd0000000000000000000000000000000000000000000000000000000060208501526001600160a01b03809216602485015216604483015260648201526064815260a081019181831067ffffffffffffffff841117612812576145499260405261454b565b565b6001600160a01b0316906145ab604051614564816131f5565b6020938482527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564858301526000808587829751910182855af16145a5613681565b9161469f565b805191821591848315614630575b5050509050156145c65750565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b91938180945001031261048b578201519081151582036105ca5750803880846145b9565b1561465b57565b606460405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152fd5b9192901561470057508151156146b3575090565b3b156146bc5790565b606460405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b8251909150156147135750805190602001fd5b61059e9060405191829162461bcd60e51b83526020600484015260248301906130d4565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361476957565b60046040517fa1c0d6e5000000000000000000000000000000000000000000000000000000008152fd5b916001600160a01b03604051927fa9059cbb000000000000000000000000000000000000000000000000000000006020850152166024830152604482015260448152608081019181831067ffffffffffffffff841117612812576145499260405261454b565b6132d29061480681613c30565b90600052600b60205260026040600020015460801c90613904565b91908110156148315760051b0190565b634e487b7160e01b600052603260045260246000fd5b9190916001600160801b038080941691160191821161391d57565b60009080825260056020526001600160a01b0380604084205416928333149384156148a7575b5050821561489557505090565b9091506148a233926132d5565b161490565b60ff9294509060409181526008602052818120338252602052205416913880614888565b9092916148d6613843565b936001600160801b03928381169182156149e25767016345785d8a00008082116149ab57808511614974575061492085614911819386613afa565b16946020890195865284613afa565b169184614937604089019480865282875116614847565b16101561495e5761495084918261495995511690613904565b91511690613904565b168252565b634e487b7160e01b600052600160045260246000fd5b84604491604051917f4fea5c1a00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b60449250604051917f47152d6700000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b505050505090506040516149f5816131d9565b6000815260006020820152600060408201529056fef8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7"; + hex"60a034620003e757601f196001600160401b03601f62004dae3881900382810185168601919084831187841017620003ec57808792606094604052833981010312620003e75783516001600160a01b03928382169291839003620003e7576020918287015196858816809803620003e75760400151948516809503620003e7576200008962000402565b90601c82527f5361626c696572205632204c6f636b7570204c696e656172204e46540000000084830152620000bd62000402565b601181527029a0a116ab1916a627a1a5aaa816a624a760791b8582015230608052600080546001600160a01b031990811688178255600180548216909b178b5596817fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a38351858111620003d35760039485548c81811c91168015620003c8575b89821014620003b45790818684931162000361575b508890868311600114620002f8578492620002ec575b505060001982871b1c1916908b1b1784555b8151948511620002d8576004958654998b8b811c9b168015620002cd575b828c1014620002ba57848b1162000271575b869798999a50819487116001146200020a57505093620001fe575b505082871b92600019911b1c19161790555b600a541617600a5560095560405161498b9081620004238239608051816146950152f35b015191503880620001c8565b8883528183208c9890969594939116915b8282106200025757505085116200023c575b50505050811b019055620001da565b01519060f884600019921b161c19169055388080806200022d565b8484015187558c989096019593840193908101906200021b565b87835281832085880160051c81019b838910620002af575b860160051c019a8c905b8c8110620002a3575050620001ad565b848155018c9062000293565b909b508b9062000289565b634e487b7160e01b835260228852602483fd5b9a607f169a6200019b565b634e487b7160e01b81526041600452602490fd5b0151905038806200016b565b908c8e9416918886528a862092865b8c82821062000341575050841162000328575b505050811b0184556200017d565b015160001983891b60f8161c191690553880806200031a565b91929395968291958786015181550195019301908f959493929162000307565b9091508684528884208680850160051c8201928b8610620003aa575b918f91869594930160051c01915b8281106200039b57505062000155565b8681558594508f91016200038b565b925081926200037d565b634e487b7160e01b84526022600452602484fd5b90607f169062000140565b634e487b7160e01b82526041600452602482fd5b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620003ec5760405256fe608080604052600436101561001357600080fd5b600090813560e01c90816301ffc9a714612f345750806306fdde0314612e72578063081812fc14612e53578063095ea7b314612cc45780631400ecec14612c245780631c1cdd4c14612bbf5780631e99d56914612ba157806323b872dd14612b7757806339a73c0314612b3657806340e58ee51461279b578063425d30dd1461277c57806342842e0e1461272c57806342966c68146125d45780634857501f1461254a5780634869e12d1461250f5780635fe3b567146124e85780636352211e146124b85780636d0cee751461246257806370a08231146123b957806375829def14612326578063780a82c8146122d65780637cad6cd1146122055780637de6b1db146120155780638659c27014611c0a578063894e9a0d146119b65780638bad38dd146119395780638f69b9931461189d5780639067b6771461184a57806395d89b411461173d57806396ce14311461161e578063a22cb4651461154d578063a2ffb89714611186578063a6202bf214611089578063a80fc07114611037578063ab167ccc14610efe578063ad35efd414610e9c578063b256456914610e7d578063b88d4fde14610dec578063b8a3be6614610db7578063b971302a14610d68578063bc063e1a14610d45578063bc2be1be14610cf5578063c156a11d14610998578063c87b56dd1461085e578063cc364f48146107b0578063d4dbd20b1461075e578063d511609f14610712578063d975dfed146106c6578063e985e9c514610671578063ea5ead191461064b578063eac8f5b8146105e2578063f590c176146105b9578063f851a440146105935763fdd46d601461027357600080fd5b346105905760603660031901126105905760043561028f613063565b6102976131a3565b916102a061468b565b6102a981613821565b610578576102cd81600052600b6020526001600160a01b0360406000205416331490565b91821580610568575b61054557818552602092600584526001600160a01b0391826040882054169180610539575b610513578281169283156104e9576001600160801b038088169788156104d157816103258861474d565b16808a116104ad5750926103c692899261038d6103558d98978b8a52600b8d52600260408b20015460801c61479b565b8a8952600b8c52610388600260408b20019182906001600160801b036001600160801b031983549260801b169116179055565b6137b6565b906103a9818c8401511692826040818351169201511690613858565b16111561047d575b878652600b89526001604087200154166146e7565b8033141580610473575b61041b575b5050817ffa54f9f9bdcdd28778cbb9f78490df6691cc4e2729588e10f4cc0a26c465686a8460008051602061495f83398151915296604051908152a3604051908152a180f35b803b1561046f578180916084604051809481936313375c3b60e01b83528960048401523360248401528860448401528b60648401525af1156103d557610460906130df565b61046b5784386103d5565b8480fd5b5080fd5b50803b15156103d0565b878652600b89526040862060018101600160c81b60ff60c81b1982541617905560ff60f01b1981541690556103b1565b876064918b6040519263287ecaef60e21b8452600484015260248301526044820152fd5b6024876040519063d2aabcd960e01b82526004820152fd5b60046040517fc61a0e9e000000000000000000000000000000000000000000000000000000008152fd5b838360649260405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b508183821614156102fb565b60405163216caf0d60e01b815260048101839052336024820152604490fd5b0390fd5b50610572826147b6565b156102d6565b60249060405190634a5541ef60e01b82526004820152fd5b80fd5b50346105905780600319360112610590576001600160a01b036020915416604051908152f35b50346105905760203660031901126105905760206105d8600435613887565b6040519015158152f35b503461059057602036600319011261059057600435808252600b60205260ff600160408420015460d01c16156106345760016040836001600160a01b039360209552600b855220015416604051908152f35b6024906040519062b8e7e760e51b82526004820152fd5b503461059057604036600319011261059057600435610668613063565b6102978261474d565b50346105905760403660031901126105905761068b61304d565b6040610695613063565b926001600160a01b0380931681526008602052209116600052602052602060ff604060002054166040519015158152f35b50346105905760203660031901126105905760ff6001604060043593848152600b60205220015460d01c16156106345761070160209161474d565b6001600160801b0360405191168152f35b503461059057602036600319011261059057600435808252600b60205260ff600160408420015460d01c16156106345760408260029260209452600b845220015460801c604051908152f35b503461059057602036600319011261059057600435808252600b60205260ff600160408420015460d01c16156106345760036040836001600160801b039360209552600b855220015416604051908152f35b5034610590576020366003190112610590576004356107cd613797565b50808252600b60205260ff600160408420015460d01c1615610634578160409160609352600b60205220600181549164ffffffffff918291015460a01c1690604051926108198461312d565b818160a01c16845260c81c166020830152604082015261085c60405180926040908164ffffffffff91828151168552826020820151166020860152015116910152565bf35b50346105905760208060031936011261046f5760043561089c6108978260005260056020526001600160a01b0360406000205416151590565b6131b9565b826001600160a01b03600a5416916044604051809481937fe9dc637500000000000000000000000000000000000000000000000000000000835230600484015260248301525afa92831561098c57809361090b575b5050610907604051928284938452830190613028565b0390f35b909192503d8082843e61091e8184613165565b820191838184031261046f5780519067ffffffffffffffff8211610988570182601f8201121561046f5780519161095483613187565b936109626040519586613165565b83855285848401011161059057509061098091848085019101613005565b9038806108f1565b8280fd5b604051903d90823e3d90fd5b5034610590576040366003190112610590576004356109b5613063565b906109be61468b565b808352602090600b825260ff600160408620015460d01c161561063457808452600582526001600160a01b038060408620541690813303610cd657610a028361474d565b6001600160801b0391828216928315928315610a40575b8960008051602061495f8339815191528989610a36818e8c61344c565b604051908152a180f35b610a4861468b565b610a5187613821565b610cbe57610a7587600052600b6020526001600160a01b0360406000205416331490565b93841580610cae575b610c8f57878b52600589528360408c2054169480610c85575b610c615786156104e9576104d15781610aaf8861474d565b16808611610c3d5750858a9493610b4b93610b12610adf8995600b8e8e8c5252600260408b20015460801c61479b565b8b8952600b8d52610388600260408b20019182906001600160801b036001600160801b031983549260801b169116179055565b90610b2e818d8401511692826040818351169201511690613858565b161115610c0d575b888652600b8a526001604087200154166146e7565b8033141580610c03575b610baf575b505060008051602061495f8339815191529482610a3693857ffa54f9f9bdcdd28778cbb9f78490df6691cc4e2729588e10f4cc0a26c465686a888296604051908152a38686604051858152a192819638610a19565b803b1561046f578180916084604051809481936313375c3b60e01b83528a60048401523360248401528960448401528860648401525af115610b5a57610bf4906130df565b610bff578538610b5a565b8580fd5b50803b1515610b55565b888652600b8a526040862060018101600160c81b60ff60c81b1982541617905560ff60f01b198154169055610b36565b87606491876040519263287ecaef60e21b8452600484015260248301526044820152fd5b6064888860405191632dcbf6b960e11b835260048301523360248301526044820152fd5b5084871415610a97565b60405163216caf0d60e01b815260048101899052336024820152604490fd5b50610cb8886147b6565b15610a7e565b60248760405190634a5541ef60e01b82526004820152fd5b60405163216caf0d60e01b815260048101849052336024820152604490fd5b503461059057602036600319011261059057600435808252600b60205260ff600160408420015460d01c16156106345760408264ffffffffff9260209452600b8452205460a01c16604051908152f35b5034610590578060031936011261059057602060405167016345785d8a00008152f35b503461059057602036600319011261059057600435808252600b60205260ff600160408420015460d01c1615610634576040826001600160a01b039260209452600b8452205416604051908152f35b50346105905760203660031901126105905760ff600160406020936004358152600b855220015460d01c166040519015158152f35b503461059057608036600319011261059057610e0661304d565b610e0e613063565b906064359067ffffffffffffffff8211610e795736602383011215610e795781600401359284610e3d85613187565b93610e4b6040519586613165565b858552366024878301011161046f5785610e76966024602093018388013785010152604435916132d7565b80f35b8380fd5b50346105905760203660031901126105905760206105d86004356137ea565b503461059057602036600319011261059057600435808252600b60205260ff600160408420015460d01c161561063457610ed590613afd565b604051906005811015610eea57602092508152f35b602483634e487b7160e01b81526021600452fd5b50346105905761014036600319011261059057610f1961468b565b610f21613797565b9064ffffffffff80421680845260c43582811681036110325781018216602085015260e4359081831682036110325701166040830152606435916001600160a01b039182841680940361059057506084358015158091036110325760a435908115158092036110325760243594848616809603611032576004359585871680970361103257604435906001600160801b0382168092036110325760405197610fc889613110565b8852602088015260408701526060860152608085015260a084015260c0830152604061010319360112611032576040519161100283613149565b610104359182168203611032578261102a9260209452610124358482015260e0820152613bff565b604051908152f35b600080fd5b503461059057602036600319011261059057600435808252600b60205260ff600160408420015460d01c16156106345760026040836001600160801b039360209552600b855220015416604051908152f35b5034610590576020366003190112610590576110a361304d565b6001600160a01b038083541633810361115d575081169081835260026020526001600160801b0360408420541690811561112c57816110fd918486526002602052604086206001600160801b0319815416905533906146e7565b6040519081527fca7a4a65a94ed2f37538814e00e1cd4c41a78261561e3f3794592f11409cf5af60203392a380f35b602483604051907f8410168c0000000000000000000000000000000000000000000000000000000082526004820152fd5b6040516331b339a960e21b81526001600160a01b03919091166004820152336024820152604490fd5b50346105905760603660031901126105905767ffffffffffffffff600435818111610988576111b99036906004016130ae565b916111c2613063565b9060443590811161046b576111db9036906004016130ae565b90936111e561468b565b81810361151757855b8181106111f9578680f35b611204818387614775565b3590611211818589614775565b35916001600160801b03831683036110325761122b61468b565b61123481613821565b6105785761125881600052600b6020526001600160a01b0360406000205416331490565b801580611507575b61054557818a5260056020526001600160a01b0360408b20541690806114f4575b6114c7576001600160a01b038716156104e9576001600160801b038416156114af576001600160801b036112b48361474d565b16806001600160801b0386161161148257508990828252600b8060205261131b60026103886112ec898360408920015460801c61479b565b918787528460205260408720019182906001600160801b036001600160801b031983549260801b169116179055565b6001600160801b0361133f8160208401511692826040818351169201511690613858565b161115611452575b8383526020526113716001600160801b038616896001600160a01b036001604087200154166146e7565b8033141580611448575b6113e2575b5050602060008051602061495f833981519152916001946001600160801b0360405191168152817ffa54f9f9bdcdd28778cbb9f78490df6691cc4e2729588e10f4cc0a26c465686a846001600160a01b038c1693a3604051908152a1016111ee565b803b1561046f57816001600160a01b0360848a8360405195869485936313375c3b60e01b85528a60048601523360248601521660448401526001600160801b038b1660648401525af11561138057611439906130df565b611444578838611380565b8880fd5b50803b151561137b565b838352806020526040832060018101600160c81b60ff60c81b1982541617905560ff60f01b198154169055611347565b826064916001600160801b03876040519363287ecaef60e21b855260048501521660248301526044820152fd5b6024826040519063d2aabcd960e01b82526004820152fd5b6064826001600160a01b038960405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b50806001600160a01b0388161415611281565b50611511826147b6565b15611260565b604491604051917faec9344000000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b50346105905760403660031901126105905761156761304d565b60243590811515809203611032576001600160a01b0316908133146115da5733835260086020526040832082600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a380f35b606460405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152fd5b5034610590576101603660031901126105905761163961468b565b6040519061164682613110565b61164e61304d565b8252611658613063565b60208301526116656131a3565b60408301526001600160a01b03906064358281168103611032576060840152608435801515810361103257608084015260a43580151581036110325760a084015260603660c319011261059057506040516116bf8161312d565b64ffffffffff60c435818116810361103257825260e435818116810361103257602083015261010435908116810361103257604082015260c0830152604061012319360112611032576040519161171583613149565b610124359182168203611032578261102a9260209452610144358482015260e0820152613bff565b5034610590578060031936011261059057604051908060045491600183811c92818516948515611840575b602095868610811461182c5785885287949392918790821561180a5750506001146117b0575b505061179c92500383613165565b610907604051928284938452830190613028565b90859250600482527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5b8583106117f257505061179c9350820101388061178e565b805483890185015287945086939092019181016117da565b925093505061179c94915060ff191682840152151560051b820101388061178e565b602483634e487b7160e01b81526022600452fd5b93607f1693611768565b503461059057602036600319011261059057600435808252600b60205260ff600160408420015460d01c161561063457600160408364ffffffffff9360209552600b855220015460a01c16604051908152f35b503461059057602036600319011261059057600435808252600b60205260ff600160408420015460d01c1615610634576118d690613afd565b9060058210159081611917576002831491821561192b575b8215611902575b6020836040519015158152f35b909150611917575060046020911438806118f5565b80634e487b7160e01b602492526021600452fd5b5060038314915060006118ee565b5034610590576020366003190112610590576004356001600160a01b0390818116809103610988578183541633810361115d575060015491816001600160a01b03198416176001556040519216825260208201527fdcb09aef4bf01068924ccce937981cbe59d25ba08380cf941aaaea4e4bd3960d60403392a280f35b5034610590576020366003190112610590576040516119d4816130f3565b8181528160208201528160408201528160608201528160808201528160a08201528160c08201528160e08201528161010082015281610120820152610140611a1a613797565b9101526004358152600b60205260ff600160408320015460d01c1615611bf2576004358152600b60205260408120611af3600260405192611a5a846130f3565b80546001600160a01b038116855264ffffffffff8160a01c16602086015264ffffffffff8160c81c16604086015260ff8160f01c161515606086015260f81c1515608085015260ff60018201546001600160a01b03811660a087015264ffffffffff8160a01c1660c0870152818160c81c16151560e0870152818160d01c16151561010087015260d81c161515610120850152016137b6565b610140820152611b04600435613afd565b6005811015610eea579160026101a09314611be7575b5061085c610140604051926001600160a01b03815116845264ffffffffff602082015116602085015264ffffffffff60408201511660408501526060810151151560608501526080810151151560808501526001600160a01b0360a08201511660a085015264ffffffffff60c08201511660c085015260e0810151151560e0850152610100810151151561010085015261012081015115156101208501520151610140830190604090816001600160801b0391828151168552826020820151166020860152015116910152565b606082015238611b1a565b602460405162b8e7e760e51b81526004356004820152fd5b503461059057602090816003193601126105905760043567ffffffffffffffff811161046f57611c3f839136906004016130ae565b90611c4861468b565b83915b808310611c56578480f35b611c6583828497959697614775565b3593611c6f61468b565b611c7885613821565b15611c955760248560405190634a5541ef60e01b82526004820152fd5b90919293611ca281613887565b611ffd57611cc681600052600b6020526001600160a01b0360406000205416331490565b1580611fdf575b611fbf57611cda816138b8565b818652600b90818852611cf2600260408920016137b6565b6001600160801b0391828251168382161015611fa757848952838a5260ff60408a205460f01c1615611f8f57928282611d4486838e611d3a8f9a829a60409e9d9a5116613858565b9401511690613858565b84875283865288872091611dca835494600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff87161785556003818516958615611f75575b0190831699818b6001600160801b0319819454161790556001600160a01b0380971696879160058c52818f82205416998c5260019e8f91200154166146e7565b338403611eb357843b611e2c575b50507f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd2604060008051602061495f8339815191529786935b825191825288820152a4604051908152a1019190939293611c4b565b90919293809596503b15611eaf576040516372eba20360e01b8152600481018790526001600160a01b03851660248201526001600160801b039182166044820152911660648201528b94939291908b90818160848183895af115611dd857611e9a91929395979496506130df565b611eab57918a939194928a8d611dd8565b8980fd5b8b80fd5b833b611ef6575b50507f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd2604060008051602061495f833981519152978693611e10565b90919280949596503b15611eaf576040516372eba20360e01b8152600481018790526001600160a01b03861660248201526001600160801b039182166044820152911660648201528b94939291908b90818160848183885af115611eba57611f6491929395979496506130df565b611eab57918a939194928a8d611eba565b60018101600160c81b60ff60c81b19825416179055611d8a565b602485604051906339c6dc7360e21b82526004820152fd5b602485604051906322cad1af60e11b82526004820152fd5b60405163216caf0d60e01b81526004810191909152336024820152604490fd5b50808552600586526001600160a01b03604086205416331415611ccd565b6024906040519063fe19f19f60e01b82526004820152fd5b50346105905760208060031936011261046f576004359061203461468b565b818352600b815260ff600160408520015460d01c16156121ee5761205782613afd565b60058110156121da57600481036120805760248360405190634a5541ef60e01b82526004820152fd5b600381036120a0576024836040519063fe19f19f60e01b82526004820152fd5b6002146121c2576120c782600052600b6020526001600160a01b0360406000205416331490565b1561054557818352600b815260ff604084205460f01c16156121aa57818352600b81526040832060ff60f01b19815416905560058152826001600160a01b03604082205416803b612153575b505060405160008051602061495f83398151915292807f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f8680a28152a180f35b803b1561046f578180916024604051809481937f341a0bd90000000000000000000000000000000000000000000000000000000083528960048401525af1156121135761219f906130df565b610988578238612113565b602482604051906339c6dc7360e21b82526004820152fd5b602482604051906322cad1af60e11b82526004820152fd5b602484634e487b7160e01b81526021600452fd5b6024826040519062b8e7e760e51b82526004820152fd5b5034610590576020366003190112610590576004356001600160a01b0390818116809103610988578183541633810361115d5750600a5491816001600160a01b0319841617600a556040519216825260208201527fa2548bd4b805e907c1558a47b5858324fe8bb4a2e1ddfca647eecbf65610eebc60403392a260095460001981019081116122c25760407f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c91815190600182526020820152a180f35b602482634e487b7160e01b81526011600452fd5b503461059057602036600319011261059057600435808252600b60205260ff600160408420015460d01c16156106345760408264ffffffffff9260209452600b8452205460c81c16604051908152f35b50346105905760203660031901126105905761234061304d565b9080546001600160a01b0380821693338503612392576001600160a01b03199394501691829116178255337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808380a380f35b6040516331b339a960e21b81526001600160a01b0386166004820152336024820152604490fd5b5034610590576020366003190112610590576001600160a01b036123db61304d565b1680156123f8578160409160209352600683522054604051908152f35b608460405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e657200000000000000000000000000000000000000000000006064820152fd5b5034610590576020366003190112610590576001600160a01b0360406020926004356124a76108978260005260056020526001600160a01b0360406000205416151590565b815260058452205416604051908152f35b50346105905760203660031901126105905760206124d7600435613204565b6001600160a01b0360405191168152f35b503461059057806003193601126105905760206001600160a01b0360015416604051908152f35b50346105905760203660031901126105905760ff6001604060043593848152600b60205220015460d01c161561063457610701602091613b84565b50346105905760203660031901126105905760043590818152600b60205260ff600160408320015460d01c16156121ee578061258583613afd565b9260058410156125c0576002602094036125a6575b50506040519015158152f35b8152600b8352604090205460f01c60ff169050388061259a565b602482634e487b7160e01b81526021600452fd5b5034610590576020366003190112610590576004356125f161468b565b6125fa81613821565b156126fb57612608816147b6565b15611fbf5761261681613204565b61261f826137ea565b1590816126f3575b816126e0575b506126c85760208161264d60008051602061495f83398151915293613204565b90808552600783526001600160a01b0360408620926001600160a01b03199384815416905516918286526006845260408620600019815401905581865260058452604086209081541690558085604051937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a48152a180f35b602490604051906378630aa960e01b82526004820152fd5b6001600160a01b0391501615153861262d565b839150612627565b602490604051907f817cd6390000000000000000000000000000000000000000000000000000000082526004820152fd5b50346105905761273b36613079565b60405191602083019383851067ffffffffffffffff86111761276657610e76946040528584526132d7565b634e487b7160e01b600052604160045260246000fd5b50346105905760203660031901126105905760206105d8600435613821565b50346105905760208060031936011261046f57600435906127ba61468b565b6127c382613821565b156127e05760248260405190634a5541ef60e01b82526004820152fd5b6127e982613887565b612b1e5761280d82600052600b6020526001600160a01b0360406000205416331490565b1580612b00575b61054557612821826138b8565b91808452600b8252612838600260408620016137b6565b6001600160801b0393848251168582161015612ae857828652600b845260ff604087205460f01c1615612ad0578161287c828787611d3a6040968383995116613858565b848852600b845282882091612902835498600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8b161785558a6003828616968715612ab6575b019184169a828c6001600160801b03198195541617905560016001600160a01b0380921698899360058c52600b8483832054169c52200154166146e7565b3384036129cd57908891853b612960575b5050507f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd2604060008051602061495f8339815191529786935b825191825288820152a4604051908152a180f35b853b15610988576040516372eba20360e01b8152600481018890526001600160a01b03861660248201526001600160801b03918216604482015291166064820152818160848183895af16129b5575b80612913565b6129be906130df565b6129c95786386129af565b8680fd5b83989792983b612a15575b50507f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd26040859260008051602061495f833981519152989961294c565b833b15612ab2576040516372eba20360e01b8152600481018790526001600160a01b03861660248201526001600160801b03918216604482015291166064820152868160848183875af1612a6a575b806129d8565b6040859260008051602061495f83398151915298612aa87f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd2946130df565b9850925050612a64565b8780fd5b60018101600160c81b60ff60c81b198254161790556128c4565b602483604051906339c6dc7360e21b82526004820152fd5b602483604051906322cad1af60e11b82526004820152fd5b50818352600581526001600160a01b03604084205416331415612814565b6024826040519063fe19f19f60e01b82526004820152fd5b5034610590576020366003190112610590576001600160801b0360406020926001600160a01b03612b6561304d565b16815260028452205416604051908152f35b503461059057610e76612b8936613079565b91612b9c612b97843361336d565b613266565b61344c565b50346105905780600319360112610590576020600954604051908152f35b503461059057602036600319011261059057600435808252600b60205260ff600160408420015460d01c161561063457612bf890613afd565b9060058210156119175760208215838115612c19575b506040519015158152f35b600191501482612c0e565b50346105905760203660031901126105905760043590818152600b60205260ff600160408320015460d01c16156121ee57602091604082828152600b85522060ff815460f01c1680612cb2575b612c89575b50506001600160801b0360405191168152f35b612cab92506001600160801b036002612ca592015416916138b8565b90613858565b3880612c76565b5060ff600182015460c81c1615612c71565b503461059057604036600319011261059057612cde61304d565b602435906001600160a01b038080612cf585613204565b16921691808314612de957803314908115612dc8575b5015612d5e57828452600760205260408420826001600160a01b0319825416179055612d3683613204565b167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258480a480f35b608460405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152fd5b9050845260086020526040842033855260205260ff60408520541638612d0b565b608460405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152fd5b50346105905760203660031901126105905760206124d7600435613229565b5034610590578060031936011261059057604051908060035491600183811c92818516948515612f2a575b602095868610811461182c5785885287949392918790821561180a575050600114612ed057505061179c92500383613165565b90859250600382527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b858310612f1257505061179c9350820101388061178e565b80548389018501528794508693909201918101612efa565b93607f1693612e9d565b90503461046f57602036600319011261046f576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361098857602092507f80ac58cd000000000000000000000000000000000000000000000000000000008114908115612fdb575b8115612fb1575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501438612faa565b7f5b5e139f0000000000000000000000000000000000000000000000000000000081149150612fa3565b60005b8381106130185750506000910152565b8181015183820152602001613008565b9060209161304181518092818552858086019101613005565b601f01601f1916010190565b600435906001600160a01b038216820361103257565b602435906001600160a01b038216820361103257565b6060906003190112611032576001600160a01b0390600435828116810361103257916024359081168103611032579060443590565b9181601f840112156110325782359167ffffffffffffffff8311611032576020808501948460051b01011161103257565b67ffffffffffffffff811161276657604052565b610160810190811067ffffffffffffffff82111761276657604052565b610100810190811067ffffffffffffffff82111761276657604052565b6060810190811067ffffffffffffffff82111761276657604052565b6040810190811067ffffffffffffffff82111761276657604052565b90601f8019910116810190811067ffffffffffffffff82111761276657604052565b67ffffffffffffffff811161276657601f01601f191660200190565b604435906001600160801b038216820361103257565b156131c057565b606460405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152fd5b60005260056020526001600160a01b03604060002054166132268115156131b9565b90565b61324c6108978260005260056020526001600160a01b0360406000205416151590565b60005260076020526001600160a01b036040600020541690565b1561326d57565b608460405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f766564000000000000000000000000000000000000006064820152fd5b906132fb9392916132eb612b97843361336d565b6132f683838361344c565b613605565b1561330257565b60405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b906001600160a01b03808061338184613204565b169316918383149384156133b4575b50831561339e575b50505090565b6133aa91929350613229565b1614388080613398565b909350600052600860205260406000208260005260205260ff604060002054169238613390565b156133e257565b608460405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152fd5b90613475929161345b83613204565b916001600160a01b039485938480941696879116146133db565b169081158061356c57613487846137ea565b159081613563575b508061355a575b61354257918084926134c460008051602061495f833981519152966020966134bd85613204565b16146133db565b60009382855260078652604085206001600160a01b031990818154169055818652600687526040862060001981540190558286526040862060018154019055838652600587528260408720918254161790557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6040519580a48152a1565b602483604051906378630aa960e01b82526004820152fd5b50831515613496565b9050153861348f565b608460405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152fd5b3d15613600573d906135e682613187565b916135f46040519384613165565b82523d6000602084013e565b606090565b9290803b1561378e5761366f916020916001600160a01b0394604051809581948293897f150b7a02000000000000000000000000000000000000000000000000000000009b8c86523360048701521660248501526044840152608060648401526084830190613028565b03916000968791165af19082908261372e575b5050613708576136906135d5565b805190816137035760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000161490565b909192506020813d8211613786575b8161374a60209383613165565b8101031261046f5751907fffffffff00000000000000000000000000000000000000000000000000000000821682036105905750903880613682565b3d915061373d565b50505050600190565b604051906137a48261312d565b60006040838281528260208201520152565b906040516137c38161312d565b6040819360018154916001600160801b0392838116865260801c6020860152015416910152565b80600052600b60205260ff60016040600020015460d01c161561063457600052600b60205260ff60016040600020015460d81c1690565b80600052600b60205260ff60016040600020015460d01c161561063457600052600b60205260ff60016040600020015460c81c1690565b6001600160801b03918216908216039190821161387157565b634e487b7160e01b600052601160045260246000fd5b80600052600b60205260ff60016040600020015460d01c161561063457600052600b60205260406000205460f81c90565b600090808252600b6020526040822091825464ffffffffff42818360c81c16116139665780600186015460a01c169182421015613950576139059394955060a01c1680910390420361396e565b90828152600b6020526001600160801b039261392b846002604085200154168094613a4e565b9283116139385750501690565b60029350604092508152600b60205220015460801c90565b505050505060026001600160801b039101541690565b505091505090565b670de0b6b3a7640000916000198383099280830292838086109503948086039514613a2a57828510156139ee57908291096001821901821680920460028082600302188083028203028083028203028083028203028083028203028083028203028092029003029360018380600003040190848311900302920304170290565b82606492604051927f63a05778000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b505080925015613a38570490565b634e487b7160e01b600052601260045260246000fd5b90919060001983820983820291828083109203918083039214613aec57670de0b6b3a76400009081831015613ab557947faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066994950990828211900360ee1b910360121c170290565b60449086604051917f5173648d00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050670de0b6b3a764000090049150565b80600052600b602052604060002060ff600182015460c81c16600014613b24575050600490565b805460f81c613b7d575460a01c64ffffffffff164210613b7757613b47816138b8565b90600052600b6020526001600160801b038060026040600020015416911610600014613b7257600190565b600290565b50600090565b5050600390565b80600052600b602052613b9d60026040600020016137b6565b81600052600b602052604060002060ff600182015460c81c16600014613bd057506001600160801b039150602001511690565b5460f81c613be25750613226906138b8565b61322691506001600160801b036040818351169201511690613858565b906001600160a01b036001541660206001600160a01b036060850151166024604051809481937fdcf844a700000000000000000000000000000000000000000000000000000000835260048301525afa8015614422576000906143ee575b613c8091506001600160801b0360408501511690602060e086015101519161481f565b916001600160801b0383511660c082015190156143c45764ffffffffff815116602082019064ffffffffff8251169081811161438457505064ffffffffff604091511691019064ffffffffff825116908181101561434457505064ffffffffff8042169151169081811015614304575050600954926001600160801b0381511660405190613d0d8261312d565b815260006020820152600060408201526001600160a01b036060840151169060c08401519164ffffffffff6020840151169064ffffffffff604085015116906080870151151560a088015115159364ffffffffff6001600160a01b038a511697511660405197613d7c896130f3565b88526020880152604087015260608601526000608086015260a085015260c0840152600060e0840152600161010084015261012083015261014082015284600052600b60205260406000206001600160a01b038251166001600160a01b0319825416178155613e1364ffffffffff602084015116829064ffffffffff60a01b1964ffffffffff60a01b83549260a01b169116179055565b604082015181547eff0000000000000000000000000000000000000000000000000000000000006060850151151560f01b169078ffffffffffffffffffffffffffffffffffffffffffffffffff7dffffffffff000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000006080880151151560f81b169460c81b1691161717178155600181016001600160a01b0360a0840151166001600160a01b0319825416178155613f0a64ffffffffff60c085015116829064ffffffffff60a01b1964ffffffffff60a01b83549260a01b169116179055565b60e083015181546101008501516101208601517fffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff90921692151560c81b79ff00000000000000000000000000000000000000000000000000169290921791151560d01b7aff0000000000000000000000000000000000000000000000000000169190911790151560d81b7bff00000000000000000000000000000000000000000000000000000016179055610140909101518051602082015160801b6001600160801b03199081166001600160801b03928316176002850155926040906003019201511682825416179055600185016009556001600160a01b0360608401511660005260026020526001600160801b0380604060002054168160208501511601166001600160a01b036060850151166000526040600020918254161790556001600160a01b0360208301511680156142c05761408561407f8660005260056020526001600160a01b0360406000205416151590565b156145a8565b61408e856137ea565b15806142b7575b806142af575b61429757602060008051602061495f833981519152916140d461407f8860005260056020526001600160a01b0360406000205416151590565b806000526006825260406000206001815401905586600052600582526040600020816001600160a01b0319825416179055866040519160007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4868152a16141646001600160a01b036060840151166001600160801b0380845116816020860151160116903090339061442e565b6001600160801b0360408201511680614268575b506001600160a01b038251167f075861cbceafeb777e8f15f357121b08f6f3adba387d599bb7b5278ca6192df5610160866001600160a01b036020870151169461425f6001600160a01b03606089015116976080810151151560a08201511515906142296001600160a01b0360e060c08601519501515116956040519788523360208901526040880190604090816001600160801b0391828151168552826020820151166020860152015116910152565b60a086015260c0850152805164ffffffffff90811660e08601526020820151811661010086015260409091015116610120840152565b610140820152a4565b614291906001600160a01b036060850151166001600160a01b0360e0860151511690339061442e565b38614178565b602485604051906378630aa960e01b82526004820152fd5b50600061409b565b50801515614095565b606460405162461bcd60e51b815260206004820152602060248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152fd5b6040517f210aec0e00000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b6040517f9fee269100000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b6040517f4c23297000000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b60046040517f6095d3bc000000000000000000000000000000000000000000000000000000008152fd5b6020823d60201161441a575b8161440760209383613165565b810103126105905750613c809051613c5d565b3d91506143fa565b6040513d6000823e3d90fd5b9290604051927f23b872dd0000000000000000000000000000000000000000000000000000000060208501526001600160a01b03809216602485015216604483015260648201526064815260a081019181831067ffffffffffffffff8411176127665761449d9260405261449f565b565b6001600160a01b0316906144ff6040516144b881613149565b6020938482527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564858301526000808587829751910182855af16144f96135d5565b916145f3565b805191821591848315614584575b50505090501561451a5750565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b91938180945001031261046f5782015190811515820361059057508038808461450d565b156145af57565b606460405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152fd5b919290156146545750815115614607575090565b3b156146105790565b606460405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b8251909150156146675750805190602001fd5b6105649060405191829162461bcd60e51b8352602060048401526024830190613028565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036146bd57565b60046040517fa1c0d6e5000000000000000000000000000000000000000000000000000000008152fd5b916001600160a01b03604051927fa9059cbb000000000000000000000000000000000000000000000000000000006020850152166024830152604482015260448152608081019181831067ffffffffffffffff8411176127665761449d9260405261449f565b6132269061475a81613b84565b90600052600b60205260026040600020015460801c90613858565b91908110156147855760051b0190565b634e487b7160e01b600052603260045260246000fd5b9190916001600160801b038080941691160191821161387157565b60009080825260056020526001600160a01b0380604084205416928333149384156147fb575b505082156147e957505090565b9091506147f63392613229565b161490565b60ff92945090604091815260086020528181203382526020522054169138806147dc565b90929161482a613797565b936001600160801b03928381169182156149365767016345785d8a00008082116148ff578085116148c8575061487485614865819386613a4e565b16946020890195865284613a4e565b16918461488b60408901948086528287511661479b565b1610156148b2576148a48491826148ad95511690613858565b91511690613858565b168252565b634e487b7160e01b600052600160045260246000fd5b84604491604051917f4fea5c1a00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b60449250604051917f47152d6700000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b505050505090506040516149498161312d565b6000815260006020820152600060408201529056fef8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7a164736f6c6343000815000a"; bytes public constant BYTECODE_NFT_DESCRIPTOR = hex"6080806040523461001757615dac90816200001d8239f35b600080fdfe6080604052600436101561001257600080fd5b60003560e01c63e9dc63751461002757600080fd5b346142f85760403660031901126142f8576001600160a01b0360043516600435036142f857610056608061486e565b60006080819052606060a081905260c082905260e0819052610120819052610140819052610160819052610180919091526101a0526004356001600160a01b03166101008190526100a690614c58565b61012052610100516040517feac8f5b80000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa908115614305576000916147dd575b506001600160a01b03610117911680608052615669565b60a052610100516040517fa80fc0710000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa8015614305576fffffffffffffffffffffffffffffffff916000916147be575b501660c052610100516040517fad35efd40000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa801561430557600090614781575b6101e59150615889565b61014052610100516040517f4869e12d0000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa90811561430557600091614752575b5060c0516fffffffffffffffffffffffffffffffff16801561473c576fffffffffffffffffffffffffffffffff612710819302160416610100608001526102876004356153c7565b610120608001526040514660208201526bffffffffffffffffffffffff1960043560601b16604082015260243560548201526054815280608081011067ffffffffffffffff60808301111761431157608081016040526020815191012061041a602963ffffffff61032e6103078261016861ffff8860101c160616614b08565b91601e604660ff6103248460146050848d60081c16060116614b08565b9816060116614b08565b6040519485927f68736c2800000000000000000000000000000000000000000000000000000000602085015261036e815180926020602488019101614826565b83017f2c0000000000000000000000000000000000000000000000000000000000000060248201526103aa825180936020602585019101614826565b017f252c00000000000000000000000000000000000000000000000000000000000060258201526103e5825180936020602785019101614826565b017f252900000000000000000000000000000000000000000000000000000000000060278201520360098101845201826148df565b6104526fffffffffffffffffffffffffffffffff6040608001511660ff61044b6001600160a01b03608051166155dc565b1690614e89565b6104666001600160a01b0360805116614c58565b60a051610100516040517fbc2be1be0000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa80156143055760249160009161471d575b5060206001600160a01b03608080015116604051938480927f9067b677000000000000000000000000000000000000000000000000000000008252823560048301525afa801561430557610528926000916146ee575b5064ffffffffff80911691166151d5565b61012051610180519092916105b2602161054f6064610548818706615744565b9504614b08565b6040519481610568879351809260208087019101614826565b820161057d8251809360208085019101614826565b017f250000000000000000000000000000000000000000000000000000000000000060208201520360018101855201836148df565b610100608001519260c060800151956101206080015197604051996105d68b61486e565b8a5260208a015260408901526060880152608087015260a086015260c085015260e0840152610100830152610120820152604051806101c081011067ffffffffffffffff6101c083011117614311576101c0810160405260608152600060208201526000604082015260608082015260006080820152606060a0820152600060c0820152600060e08201526060610100820152600061012082015260006101408201526060610160820152600061018082015260006101a082015260a08201516106a660c0840151845190615a7a565b906109b361015c604051926106ba846148c3565b600884527f50726f677265737300000000000000000000000000000000000000000000000060208501526107236040516106f38161488b565b60009052855160208701207fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4701490565b156146e6576090945b61073586614b08565b916040519586938493661e339034b21e9160c91b60208601526109818351958692610767846027840160208901614826565b6d11103334b6361e9111b33333111f60911b602785840101526c1e3932b1ba103bb4b23a341e9160991b603585840101526107ae8551809660206042888701019101614826565b7f22206865696768743d22313030222066696c6c2d6f7061636974793d222e3033828501860160428101919091527f222072783d223135222072793d22313522207374726f6b653d2223666666222060628201527f7374726f6b652d6f7061636974793d222e3122207374726f6b652d77696474686082820152651e911a11179f60d11b60a28201527f3c7465787420783d2232302220793d2233342220666f6e742d66616d696c793d60a88201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f7370616365222060c8820152703337b73a16b9b4bd329e911919383c111f60791b60e88201528651966108b491889160f990910190602001614826565b661e17ba32bc3a1f60c91b8285018601870160f98101919091527f3c7465787420783d2232302220793d2237322220666f6e742d66616d696c793d6101008201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f73706163652220610120820152703337b73a16b9b4bd329e91191b383c111f60791b61014082015287519761094f91899161015190910190602001614826565b661e17ba32bc3a1f60c91b6101518888888887010101010152602061015888888885519c8d9701010101019101614826565b631e17b39f60e11b90860190910190910190910190910161015881019190915281900361013c810190915201826148df565b6101008301526101208201526028610100830151604051906109d48261488b565b60008252610c7a61015c604051926109eb846148c3565b600684527f53746174757300000000000000000000000000000000000000000000000000006020850152610a1e84615cba565b610a2782615d37565b808211156146de5750945b610a3d878701614b08565b91604051958693661e339034b21e9160c91b60208601528151610a67816027880160208601614826565b85016d11103334b6361e9111b33333111f60911b60278201526c1e3932b1ba103bb4b23a341e9160991b6035820152610aaa825180936020604285019101614826565b017f22206865696768743d22313030222066696c6c2d6f7061636974793d222e303360428201527f222072783d223135222072793d22313522207374726f6b653d2223666666222060628201527f7374726f6b652d6f7061636974793d222e3122207374726f6b652d77696474686082820152651e911a11179f60d11b60a28201527f3c7465787420783d2232302220793d2233342220666f6e742d66616d696c793d60a88201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f7370616365222060c8820152703337b73a16b9b4bd329e911919383c111f60791b60e8820152610ba682518093602060f985019101614826565b01661e17ba32bc3a1f60c91b60f98201527f3c7465787420783d2232302220793d2237322220666f6e742d66616d696c793d6101008201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f73706163652220610120820152703337b73a16b9b4bd329e91191b383c111f60791b610140820152610c3582518093602061015185019101614826565b01661e17ba32bc3a1f60c91b610151820152610c5c82518093602061015885019101614826565b01631e17b39f60e11b6101588201520361013c8101845201826148df565b610160840152016101808201526028602083015160405190610c9b8261488b565b60008252610ce561015c60405192610cb2846148c3565b600684527f416d6f756e7400000000000000000000000000000000000000000000000000006020850152610a1e84615cba565b835201602082015261102060808301516030604051610d038161488b565b60008152610faa61015c60405194610d1a866148c3565b600886527f4475726174696f6e0000000000000000000000000000000000000000000000006020870152610d4d86615cba565b610d5682615d37565b808211156146d65750935b610d6d60288601614b08565b91604051978893661e339034b21e9160c91b60208601528151610d97816027880160208601614826565b85016d11103334b6361e9111b33333111f60911b60278201526c1e3932b1ba103bb4b23a341e9160991b6035820152610dda825180936020604285019101614826565b017f22206865696768743d22313030222066696c6c2d6f7061636974793d222e303360428201527f222072783d223135222072793d22313522207374726f6b653d2223666666222060628201527f7374726f6b652d6f7061636974793d222e3122207374726f6b652d77696474686082820152651e911a11179f60d11b60a28201527f3c7465787420783d2232302220793d2233342220666f6e742d66616d696c793d60a88201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f7370616365222060c8820152703337b73a16b9b4bd329e911919383c111f60791b60e8820152610ed682518093602060f985019101614826565b01661e17ba32bc3a1f60c91b60f98201527f3c7465787420783d2232302220793d2237322220666f6e742d66616d696c793d6101008201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f73706163652220610120820152703337b73a16b9b4bd329e91191b383c111f60791b610140820152610f6582518093602061015185019101614826565b01661e17ba32bc3a1f60c91b610151820152610f8c82518093602061015885019101614826565b01631e17b39f60e11b6101588201520361013c8101865201846148df565b8260a08601526028810160c0860152602085015190610120860151809161018088015192839185010101605881016080890152605719906103e8030160011c8061014089015201601081016101a088015201602081016040870152010160e0840152610100830151610160840151845191614e1f565b6060820152604051908161010081011067ffffffffffffffff6101008401111761431157610100820160405260c782527f3c726563742077696474683d223130302522206865696768743d22313030252260208301527f2066696c7465723d2275726c28234e6f69736529222f3e3c7265637420783d2260408301527f37302220793d223730222077696474683d2238363022206865696768743d223860608301527f3630222066696c6c3d2223666666222066696c6c2d6f7061636974793d222e3060808301527f33222072783d223435222072793d22343522207374726f6b653d22236666662260a08301527f207374726f6b652d6f7061636974793d222e3122207374726f6b652d7769647460c08301527f683d2234222f3e0000000000000000000000000000000000000000000000000060e083015282519161010084015191606081015194604051611176816148a7565b603381527f3c636972636c652069643d22476c6f772220723d22353030222066696c6c3d2260208201527f75726c282352616469616c476c6f7729222f3e000000000000000000000000006040820152604051966111d38861486e565b61011c88527f3c66696c7465722069643d224e6f697365223e3c6665466c6f6f6420783d223060208901527f2220793d2230222077696474683d223130302522206865696768743d2231303060408901527f252220666c6f6f642d636f6c6f723d2268736c283233302c3231252c3131252960608901527f2220666c6f6f642d6f7061636974793d22312220726573756c743d22666c6f6f60808901527f6446696c6c222f3e3c666554757262756c656e6365206261736546726571756560a08901527f6e63793d222e3422206e756d4f6374617665733d22332220726573756c743d2260c08901527f4e6f6973652220747970653d226672616374616c4e6f697365222f3e3c66654260e08901527f6c656e6420696e3d224e6f6973652220696e323d22666c6f6f6446696c6c22206101008901527f6d6f64653d22736f66742d6c69676874222f3e3c2f66696c7465723e0000000061012089015260405197886103a081011067ffffffffffffffff6103a08b011117614311576103a0890160405261037b89527f3c706174682069643d224c6f676f222066696c6c3d2223666666222066696c6c60208a01527f2d6f7061636974793d222e312220643d226d3133332e3535392c3132342e303360408a01527f34632d2e3031332c322e3431322d312e3035392c342e3834382d322e3932332c60608a01527f362e3430322d322e3535382c312e3831392d352e3136382c332e3433392d372e60808a01527f3838382c342e3939362d31342e34342c382e3236322d33312e3034372c31322e60a08a01527f3536352d34372e3637342c31322e3536392d382e3835382e3033362d31372e3860c08a01527f33382d312e3237322d32362e3332382d332e3636332d392e3830362d322e373660e08a01527f362d31392e3038372d372e3131332d32372e3536322d31322e3737382d31332e6101008a01527f3834322d382e3032352c392e3436382d32382e3630362c31362e3135332d33356101208a01527f2e323635683063322e3033352d312e3833382c342e3235322d332e3534362c366101408a01527f2e3436332d352e323234683063362e3432392d352e3635352c31362e3231382d6101608a01527f322e3833352c32302e3335382c342e31372c342e3134332c352e3035372c382e6101808a01527f3831362c392e3634392c31332e39322c31332e373334682e30333763352e37336101a08a01527f362c362e3436312c31352e3335372d322e3235332c392e33382d382e34382c306101c08a01527f2c302d332e3531352d332e3531352d332e3531352d332e3531352d31312e34396101e08a01527f2d31312e3437382d35322e3635362d35322e3636342d36342e3833372d36342e6102008a01527f3833376c2e3034392d2e303337632d312e3732352d312e3630362d322e3731396102208a01527f2d332e3834372d322e3735312d362e3230346830632d2e3034362d322e3337356102408a01527f2c312e3036322d342e3538322c322e3732362d362e32323968306c2e3138352d6102608a01527f2e3134386830632e3039392d2e3036322c2e3232322d2e3134382c2e33372d2e6102808a01527f323539683063322e30362d312e3336322c332e3935312d322e3632312c362e306102a08a01527f34342d332e3834324335372e3736332d332e3437332c39372e37362d322e33346102c08a01527f312c3132382e3633372c31382e3333326331362e3637312c392e3934362d32366102e08a01527f2e3334342c35342e3831332d33382e3635312c34302e3139392d362e3239392d6103008a01527f362e3039362d31382e3036332d31372e3734332d31392e3636382d31382e38316103208a01527f312d362e3031362d342e3034372d31332e3036312c342e3737362d372e3735326103408a01527f2c392e3735316c36382e3235342c36382e33373163312e3732342c312e3630316103608a01527f2c322e3731342c332e38342c322e3733382c362e3139325a222f3e00000000006103808a0152604051978860a081011067ffffffffffffffff60a08b01111761431157611cb1611d129160a08b0160405260758b527f3c706174682069643d22466c6f6174696e6754657874222066696c6c3d226e6f60208c01527f6e652220643d224d31323520343568373530733830203020383020383076373560408c01527f307330203830202d3830203830682d373530732d38302030202d3830202d383060608c01527f762d3735307330202d3830203830202d3830222f3e000000000000000000000060808c0152611868615a41565b906040517f3c72616469616c4772616469656e742069643d2252616469616c476c6f77223e6020820152611d0d60d87f3c73746f70206f66667365743d223025222073746f702d636f6c6f723d22000093846040850152805161199a60b88660208501936118da81605e840187614826565b8101997f222073746f702d6f7061636974793d222e36222f3e0000000000000000000000605e8c01527f3c73746f70206f66667365743d2231303025222073746f702d636f6c6f723d229a8b607382015261193f825180936020609385019101614826565b017f222073746f702d6f7061636974793d2230222f3e00000000000000000000000060938201527f3c2f72616469616c4772616469656e743e00000000000000000000000000000060a78201520360988101885201866148df565b6119a2615a41565b90604051967f3c6c696e6561724772616469656e742069643d2253616e64546f70222078313d60208901527f223025222079313d223025223e000000000000000000000000000000000000006040890152604d8801528251611a0881606b8a0184614826565b8701917f222f3e00000000000000000000000000000000000000000000000000000000009283606b82015289606e820152611a4d825180936020608e85019101614826565b019082608e830152611a9160a2897f3c2f6c696e6561724772616469656e743e0000000000000000000000000000009485609182015203608281018b5201896148df565b611bd7610108611a9f615a41565b6040519b8c917f3c6c696e6561724772616469656e742069643d2253616e64426f74746f6d222060208401527f78313d2231303025222079313d2231303025223e00000000000000000000000060408401527f3c73746f70206f66667365743d22313025222073746f702d636f6c6f723d22006054840152611b2b815180926020607387019101614826565b8201908760738301526076820152875190611b4a826096830188614826565b018660968201527f3c616e696d617465206174747269627574654e616d653d22783122206475723d60998201527f2236732220726570656174436f756e743d22696e646566696e6974652220766160b98201527f6c7565733d223330253b3630253b313230253b3630253b3330253b222f3e000060d98201528560f78201520360e881018c52018a6148df565b611bdf615a41565b906040519a8b957f3c6c696e6561724772616469656e742069643d22486f7572676c61737353747260208801527f6f6b6522206772616469656e745472616e73666f726d3d22726f74617465283960408801527f302922206772616469656e74556e6974733d227573657253706163654f6e557360608801527f65223e000000000000000000000000000000000000000000000000000000000060808801527f3c73746f70206f66667365743d22353025222073746f702d636f6c6f723d2200608388015251809260a2880190614826565b84018360a28201527f3c73746f70206f66667365743d22383025222073746f702d636f6c6f723d220060a5820152611cf382518093602060c485019101614826565b019160c483015260c78201520360b88101875201856148df565b614e1f565b92611d32611d1e615817565b896020815191012090602081519101201490565b9788156146ad575b506040518060c081011067ffffffffffffffff60c0830111176143115760c08101604052609081527f3c7061746820643d224d2035302c3336302061203330302c333030203020312c60208201527f31203630302c302061203330302c333030203020312c31202d3630302c30222060408201527f66696c6c3d2223666666222066696c6c2d6f7061636974793d222e303222207360608201527f74726f6b653d2275726c2823486f7572676c6173735374726f6b65292220737460808201527f726f6b652d77696474683d2234222f3e0000000000000000000000000000000060a082015260405193846102c081011067ffffffffffffffff6102c087011117614311576102c0850160405261029885527f3c7061746820643d226d3536362c3136312e323031762d35332e39323463302d60208601527f31392e3338322d32322e3531332d33372e3536332d36332e3339382d35312e3160408601527f39382d34302e3735362d31332e3539322d39342e3934362d32312e3037392d3160608601527f35322e3538372d32312e303739732d3131312e3833382c372e3438372d31353260808601527f2e3630322c32312e303739632d34302e3839332c31332e3633362d36332e343160a08601527f332c33312e3831362d36332e3431332c35312e3139387635332e39323463302c60c08601527f31372e3138312c31372e3730342c33332e3432372c35302e3232332c34362e3360e08601527f3934763238342e383039632d33322e3531392c31322e39362d35302e3232332c6101008601527f32392e3230362d35302e3232332c34362e3339347635332e39323463302c31396101208601527f2e3338322c32322e35322c33372e3536332c36332e3431332c35312e3139382c6101408601527f34302e3736332c31332e3539322c39342e3935342c32312e3037392c3135322e6101608601527f3630322c32312e303739733131312e3833312d372e3438372c3135322e3538376101808601527f2d32312e3037396334302e3838362d31332e3633362c36332e3339382d33312e6101a08601527f3831362c36332e3339382d35312e313938762d35332e39323463302d31372e316101c08601527f39362d31372e3730342d33332e3433352d35302e3232332d34362e34303156326101e08601527f30372e3630336333322e3531392d31322e3936372c35302e3232332d32392e326102008601527f30362c35302e3232332d34362e3430315a6d2d3334372e3436322c35372e37396102208601527f336c3133302e3935392c3133312e3032372d3133302e3935392c3133312e30316102408601527f33563231382e3939345a6d3236322e3932342e303232763236322e3031386c2d6102608601527f3133302e3933372d3133312e3030362c3133302e3933372d3133312e3031335a6102808601527f222066696c6c3d2223313631383232223e3c2f706174683e00000000000000006102a0860152896000146144885760405161218c8161488b565b60008152995b1561432757604051806101e081011067ffffffffffffffff6101e083011117614311576101e081016040526101b181527f3c7061746820643d226d3438312e34362c3438312e35347638312e3031632d3260208201527f2e33352e37372d342e38322c312e35312d372e33392c322e32332d33302e332c60408201527f382e35342d37342e36352c31332e39322d3132342e30362c31332e39322d353360608201527f2e362c302d3130312e32342d362e33332d3133312e34372d31362e3136762d3860808201527f316c34362e332d34362e3331683137302e33336c34362e32392c34362e33315a60a08201527f222066696c6c3d2275726c282353616e64426f74746f6d29222f3e3c7061746860c08201527f20643d226d3433352e31372c3433352e323363302c312e31372d2e34362c322e60e08201527f33322d312e33332c332e34342d372e31312c392e30382d34312e39332c31352e6101008201527f39382d38332e38312c31352e3938732d37362e372d362e392d38332e38322d316101208201527f352e3938632d2e38372d312e31322d312e33332d322e32372d312e33332d332e6101408201527f3434762d2e30346c382e33342d382e33352e30312d2e30316331332e37322d366101608201527f2e35312c34322e39352d31312e30322c37362e382d31312e30327336322e39376101808201527f2c342e34392c37362e37322c31316c382e34322c382e34325a222066696c6c3d6101a08201527f2275726c282353616e64546f7029222f3e0000000000000000000000000000006101c0820152995b60405196876107e081011067ffffffffffffffff6107e08a01111761431157613b9f9c612e5a6036602d9960819f97631e17b39f60e11b8d7f3c2f646566733e000000000000000000000000000000000000000000000000009a612f2b9f6107e0016040526107a782527f3c672066696c6c3d226e6f6e6522207374726f6b653d2275726c2823486f757260208301527f676c6173735374726f6b652922207374726f6b652d6c696e656361703d22726f60408301527f756e6422207374726f6b652d6d697465726c696d69743d22313022207374726f60608301527f6b652d77696474683d2234223e3c7061746820643d226d3536352e3634312c3160808301527f30372e323863302c392e3533372d352e35362c31382e3632392d31352e36373660a08301527f2c32362e393733682d2e303233632d392e3230342c372e3539362d32322e313960c08301527f342c31342e3536322d33382e3139372c32302e3539322d33392e3530342c313460e08301527f2e3933362d39372e3332352c32342e3335352d3136312e3733332c32342e33356101008301527f352d39302e34382c302d3136372e3934382d31382e3538322d3139392e3935336101208301527f2d34342e393438682d2e303233632d31302e3131352d382e3334342d31352e366101408301527f37362d31372e3433372d31352e3637362d32362e3937332c302d33392e3733356101608301527f2c39362e3535342d37312e3932312c3231352e3635322d37312e3932317332316101808301527f352e3632392c33322e3138352c3231352e3632392c37312e3932315a222f3e3c6101a08301527f7061746820643d226d3133342e33362c3136312e32303363302c33392e3733356101c08301527f2c39362e3535342c37312e3932312c3231352e3635322c37312e3932317332316101e08301527f352e3632392d33322e3138362c3231352e3632392d37312e393231222f3e3c6c6102008301527f696e652078313d223133342e3336222079313d223136312e323033222078323d6102208301527f223133342e3336222079323d223130372e3238222f3e3c6c696e652078313d226102408301527f3536352e3634222079313d223136312e323033222078323d223536352e3634226102608301527f2079323d223130372e3238222f3e3c6c696e652078313d223138342e353834226102808301527f2079313d223230362e383233222078323d223138342e353835222079323d22356102a08301527f33372e353739222f3e3c6c696e652078313d223231382e313831222079313d226102c08301527f3231382e313138222078323d223231382e313831222079323d223536322e35336102e08301527f37222f3e3c6c696e652078313d223438312e383138222079313d223231382e316103008301527f3432222078323d223438312e383139222079323d223536322e343238222f3e3c6103208301527f6c696e652078313d223531352e343135222079313d223230372e3335322220786103408301527f323d223531352e343136222079323d223533372e353739222f3e3c70617468206103608301527f643d226d3138342e35382c3533372e353863302c352e34352c342e32372c31306103808301527f2e36352c31322e30332c31352e3432682e303263352e35312c332e33392c31326103a08301527f2e37392c362e35352c32312e35352c392e34322c33302e32312c392e392c37386103c08301527f2e30322c31362e32382c3133312e38332c31362e32382c34392e34312c302c396103e08301527f332e37362d352e33382c3132342e30362d31332e39322c322e372d2e37362c356104008301527f2e32392d312e35342c372e37352d322e33352c382e37372d322e38372c31362e6104208301527f30352d362e30342c32312e35362d392e3433683063372e37362d342e37372c316104408301527f322e30342d392e39372c31322e30342d31352e3432222f3e3c7061746820643d6104608301527f226d3138342e3538322c3439322e363536632d33312e3335342c31322e3438356104808301527f2d35302e3232332c32382e35382d35302e3232332c34362e3134322c302c392e6104a08301527f3533362c352e3536342c31382e3632372c31352e3637372c32362e393639682e6104c08301527f30323263382e3530332c372e3030352c32302e3231332c31332e3436332c33346104e08301527f2e3532342c31392e3135392c392e3939392c332e3939312c32312e3236392c376105008301527f2e3630392c33332e3539372c31302e3738382c33362e34352c392e3430372c386105208301527f322e3138312c31352e3030322c3133312e3833352c31352e3030327339352e336105408301527f36332d352e3539352c3133312e3830372d31352e3030326331302e3834372d326105608301527f2e37392c32302e3836372d352e3932362c32392e3932342d392e3334392c312e6105808301527f3234342d2e3436372c322e3437332d2e3934322c332e3637332d312e3432342c6105a08301527f31342e3332362d352e3639362c32362e3033352d31322e3136312c33342e35326105c08301527f342d31392e313733682e3032326331302e3131342d382e3334322c31352e36376105e08301527f372d31372e3433332c31352e3637372d32362e3936392c302d31372e3536322d6106008301527f31382e3836392d33332e3636352d35302e3232332d34362e3135222f3e3c70616106208301527f746820643d226d3133342e33362c3539322e373263302c33392e3733352c39366106408301527f2e3535342c37312e3932312c3231352e3635322c37312e393231733231352e366106608301527f32392d33322e3138362c3231352e3632392d37312e393231222f3e3c6c696e656106808301527f2078313d223133342e3336222079313d223539322e3732222078323d223133346106a08301527f2e3336222079323d223533382e373937222f3e3c6c696e652078313d223536356106c08301527f2e3634222079313d223539322e3732222078323d223536352e3634222079323d6106e08301527f223533382e373937222f3e3c706f6c796c696e6520706f696e74733d223438316107008301527f2e383232203438312e393031203438312e373938203438312e383737203438316107208301527f2e373735203438312e383534203335302e303135203335302e303236203231386107408301527f2e313835203231382e313239222f3e3c706f6c796c696e6520706f696e74733d6107608301527f223231382e313835203438312e393031203231382e323331203438312e3835346107808301527f203335302e303135203335302e303236203438312e383232203231382e3135326107a08301527f222f3e3c2f673e000000000000000000000000000000000000000000000000006107c0830152604051998a957f3c672069643d22486f7572676c617373223e00000000000000000000000000006020880152603295612df68151809260208a8c019101614826565b8701612e0b8251809360208a85019101614826565b01612e1f8251809360208985019101614826565b01612e338251809360208885019101614826565b01612e478251809360208785019101614826565b01918201520360168101865201846148df565b6040519e8f9788977f3c646566733e000000000000000000000000000000000000000000000000000060208a0152612e9f6026998260208c9451948593019101614826565b8901612eb48251809360208c85019101614826565b01612ec88251809360208b85019101614826565b01612edc8251809360208a85019101614826565b01612ef08251809360208985019101614826565b01612f048251809360208885019101614826565b01612f188251809360208785019101614826565b019182015203600d8101895201876148df565b6137be604c60e08301516101208401519361351a61314d6060604084015193015196612f578186615985565b9461314861012b604051612f6a816148c3565b600581527f2d3130302500000000000000000000000000000000000000000000000000000060208201526040519889917f3c74657874506174682073746172744f66667365743d220000000000000000006020840152612fd4815180926020603787019101614826565b7f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666683820160378101919091527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e00000000000000000061010982015282519261311891849161012090910190602001614826565b6a1e17ba32bc3a2830ba341f60a91b90830190910161012081019190915281900361010b810190915201876148df565b615985565b9561332c61012b604051613160816148c3565b600281527f30250000000000000000000000000000000000000000000000000000000000006020820152604051998a917f3c74657874506174682073746172744f66667365743d2200000000000000000060208401526131ca815180926020603787019101614826565b82017f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666660378201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e00000000000000000061010982015261330782518093602061012085019101614826565b016a1e17ba32bc3a2830ba341f60a91b6101208201520361010b81018a5201886148df565b61333681846159ed565b9261351561012b604051613349816148c3565b600481527f2d3530250000000000000000000000000000000000000000000000000000000060208201526040519687917f3c74657874506174682073746172744f66667365743d2200000000000000000060208401526133b3815180926020603787019101614826565b82017f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666660378201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e0000000000000000006101098201526134f082518093602061012085019101614826565b016a1e17ba32bc3a2830ba341f60a91b6101208201520361010b8101875201856148df565b6159ed565b906136f961012b60405161352d816148c3565b600381527f353025000000000000000000000000000000000000000000000000000000000060208201526040519485917f3c74657874506174682073746172744f66667365743d220000000000000000006020840152613597815180926020603787019101614826565b82017f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666660378201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e0000000000000000006101098201526136d482518093602061012085019101614826565b016a1e17ba32bc3a2830ba341f60a91b6101208201520361010b8101855201836148df565b6040519586937f3c7465787420746578742d72656e646572696e673d226f7074696d697a65537060208601527f656564223e000000000000000000000000000000000000000000000000000000604086015261375f815180926020604589019101614826565b8401613775825180936020604585019101614826565b0161378a825180936020604585019101614826565b0161379f825180936020604585019101614826565b01661e17ba32bc3a1f60c91b604582015203602c8101845201826148df565b613a9e61019a6101408401516101a0850151906137ff6137f96137f36137ed60e060408b01519a015194614b08565b94614b08565b97614b08565b91614b08565b956040519687937f3c75736520687265663d2223476c6f77222066696c6c2d6f7061636974793d2260208601527f2e39222f3e00000000000000000000000000000000000000000000000000000060408601527f3c75736520687265663d2223476c6f772220783d22313030302220793d22313060458601527f3030222066696c6c2d6f7061636974793d222e39222f3e00000000000000000060658601527f3c75736520687265663d22234c6f676f2220783d223137302220793d22313730607c8601527f22207472616e73666f726d3d227363616c65282e3629222f3e3c757365206872609c8601527f65663d2223486f7572676c6173732220783d223135302220793d22393022207460bc8601527f72616e73666f726d3d22726f746174652831302922207472616e73666f726d2d60dc8601527f6f726967696e3d2235303020353030222f3e000000000000000000000000000060fc8601527f3c75736520687265663d222350726f67726573732220783d220000000000000061010e8601526101279061399a815180926020858a019101614826565b8501937f2220793d22373930222f3e00000000000000000000000000000000000000000080948180948801527f3c75736520687265663d22235374617475732220783d2200000000000000000061013288015261014996613a048251809360208b85019101614826565b01958601527f3c75736520687265663d2223416d6f756e742220783d2200000000000000000061015486015261016b94613a478251809360208985019101614826565b01938401527f3c75736520687265663d22234475726174696f6e2220783d220000000000000061017684015261018f92613a8a8251809360208785019101614826565b01918201520361017a8101855201836148df565b6040519586937f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323060208601527f30302f737667222077696474683d223130303022206865696768743d2231303060408601527f30222076696577426f783d2230203020313030302031303030223e00000000006060860152613b2a815180926020607b89019101614826565b8401613b40825180936020607b85019101614826565b01613b55825180936020607b85019101614826565b01613b6a825180936020607b85019101614826565b017f3c2f7376673e0000000000000000000000000000000000000000000000000000607b8201520360618101845201826148df565b6101605260a051610100516040517fb971302a0000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa908115614305576000916142ba575b6142b661424f614154614245609487613d3b6089613c198a614c58565b9260c0608001516040519485927f5b7b2274726169745f74797065223a224173736574222c2276616c7565223a226020850152613c60815180926020604088019101614826565b8301907f227d2c7b2274726169745f74797065223a2253656e646572222c2276616c756560408301527f223a22000000000000000000000000000000000000000000000000000000000091826060820152613cc5825180936020606385019101614826565b01907f227d2c7b2274726169745f74797065223a22537461747573222c2276616c756560638301526083820152613d06825180936020608685019101614826565b017f227d5d000000000000000000000000000000000000000000000000000000000060868201520360698101845201826148df565b6101a05160a05161403e61017e613d53602435614b08565b9360a060800151613d6e6001600160a01b0360805116614c58565b90604051968793613f2b60208601987f54686973204e465420726570726573656e74732061207061796d656e742073748a527f7265616d20696e2061205361626c696572205632200000000000000000000000604088015282516020840190613ddb8160558b0184614826565b8801947f20636f6e74726163742e20546865206f776e6572206f662074686973204e465460558701527f2063616e207769746864726177207468652073747265616d656420617373657460758701527f732c207768696368206172652064656e6f6d696e6174656420696e2000000000609587015282516020840196613e658260b183018a614826565b017f2e5c6e5c6e2d2053747265616d2049443a20000000000000000000000000000060b1820152613ea082518093602060c385019101614826565b01613ed97f5c6e2d2000000000000000000000000000000000000000000000000000000000958660c384015251809360c7840190614826565b01947f20416464726573733a2000000000000000000000000000000000000000000000958660c7820152613f1782518093602060d185019101614826565b019260d184015251809360d5840190614826565b019060d5820152613f4682518093602060df85019101614826565b017f5c6e5c6e0000000000000000000000000000000000000000000000000000000060df8201527fe29aa0efb88f205741524e494e473a205472616e7366657272696e672074686560e38201527f204e4654206d616b657320746865206e6577206f776e657220746865207265636101038201527f697069656e74206f66207468652073747265616d2e205468652066756e6473206101238201527f617265206e6f74206175746f6d61746963616c6c792077697468647261776e206101438201527f666f72207468652070726576696f757320726563697069656e742e00000000006101638201520361015e8101855201836148df565b6101a051906141af614051602435614b08565b916140d0602d604051809560208201976a029b0b13634b2b9102b19160ad1b8952614086815180926020602b87019101614826565b82017f2023000000000000000000000000000000000000000000000000000000000000602b8201526140c18251809360208785019101614826565b0103600d8101865201846148df565b610160516140dd90614994565b94604051998a977f7b2261747472696275746573223a00000000000000000000000000000000000060208a015261411e815180926020602e8d019101614826565b8801917f2c226465736372697074696f6e223a2200000000000000000000000000000000602e840152518093603e840190614826565b01917f222c2265787465726e616c5f75726c223a2268747470733a2f2f7361626c6965603e8401527f722e636f6d222c226e616d65223a220000000000000000000000000000000000605e840152518093606d840190614826565b017f222c22696d616765223a22646174613a696d6167652f7376672b786d6c3b6261606d8201527f736536342c000000000000000000000000000000000000000000000000000000608d820152614210825180936020609285019101614826565b017f227d00000000000000000000000000000000000000000000000000000000000060928201520360748101845201826148df565b60e0819052614994565b6142a2603d60405180937f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000060208301526142928151809260208686019101614826565b810103601d8101845201826148df565b604051918291602083526020830190614849565b0390f35b90506020813d6020116142fd575b816142d5602093836148df565b810103126142f85751906001600160a01b03821682036142f85790614154613bfc565b600080fd5b3d91506142c8565b6040513d6000823e3d90fd5b634e487b7160e01b600052604160045260246000fd5b6040518061012081011067ffffffffffffffff6101208301111761431157610120810160405260f881527f3c7061746820643d226d3438312e34362c3530342e3130317635382e3434396360208201527f2d322e33352e37372d342e38322c312e35312d372e33392c322e32332d33302e60408201527f332c382e35342d37342e36352c31332e39322d3132342e30362c31332e39322d60608201527f35332e362c302d3130312e32342d362e33332d3133312e34372d31362e31367660808201527f2d35382e343339683236322e39325a222066696c6c3d2275726c282353616e6460a08201527f426f74746f6d29222f3e3c656c6c697073652063783d22333530222063793d2260c08201527f3530342e313031222072783d223133312e343632222072793d2232382e31303860e08201527f222066696c6c3d2275726c282353616e64546f7029222f3e0000000000000000610100820152996123df565b604051806101c081011067ffffffffffffffff6101c083011117614311576101c0810160405261019981527f3c706f6c79676f6e20706f696e74733d22333530203335302e3032362034313560208201527f2e3033203238342e39373820323835203238342e39373820333530203335302e60408201527f303236222066696c6c3d2275726c282353616e64426f74746f6d29222f3e3c7060608201527f61746820643d226d3431362e3334312c3238312e39373563302c2e3931342d2e60808201527f3335342c312e3830392d312e3033352c322e36382d352e3534322c372e30373660a08201527f2d33322e3636312c31322e34352d36352e32382c31322e34352d33322e36323460c08201527f2c302d35392e3733382d352e3337342d36352e32382d31322e34352d2e36383160e08201527f2d2e3837322d312e3033352d312e3736372d312e3033352d322e36382c302d2e6101008201527f3931342e3335342d312e3830382c312e3033352d322e3637362c352e3534322d6101208201527f372e3037362c33322e3635362d31322e34352c36352e32382d31322e34352c336101408201527f322e3631392c302c35392e3733382c352e3337342c36352e32382c31322e34356101608201527f2e3638312e3836372c312e3033352c312e3736322c312e3033352c322e3637366101808201527f5a222066696c6c3d2275726c282353616e64546f7029222f3e000000000000006101a082015299612192565b6146cf9198506146bb615850565b906020815191012090602081519101201490565b9638611d3a565b905093610d61565b905094610a32565b60d09461072c565b614710915060203d602011614716575b61470881836148df565b810190614929565b38610517565b503d6146fe565b614736915060203d6020116147165761470881836148df565b386104c1565b634e487b7160e01b600052601260045260246000fd5b614774915060203d60201161477a575b61476c81836148df565b810190614901565b3861023f565b503d614762565b506020813d6020116147b6575b8161479b602093836148df565b810103126142f8575160058110156142f8576101e5906101db565b3d915061478e565b6147d7915060203d60201161477a5761476c81836148df565b38610181565b90506020813d60201161481e575b816147f8602093836148df565b810103126142f857516001600160a01b03811681036142f8576001600160a01b03610100565b3d91506147eb565b60005b8381106148395750506000910152565b8181015183820152602001614829565b9060209161486281518092818552858086019101614826565b601f01601f1916010190565b610140810190811067ffffffffffffffff82111761431157604052565b6020810190811067ffffffffffffffff82111761431157604052565b6060810190811067ffffffffffffffff82111761431157604052565b6040810190811067ffffffffffffffff82111761431157604052565b90601f8019910116810190811067ffffffffffffffff82111761431157604052565b908160209103126142f857516fffffffffffffffffffffffffffffffff811681036142f85790565b908160209103126142f8575164ffffffffff811681036142f85790565b67ffffffffffffffff811161431157601f01601f191660200190565b9061496c82614946565b61497960405191826148df565b828152809261498a601f1991614946565b0190602036910137565b805115614af4576040516149a7816148a7565b604081527f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208201527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f60408201528151600292838201809211614ade5760038092047f3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81168103614ade57614a41908594951b614962565b936020850193829183518401925b838110614a8d5750505050510680600114614a7a57600214614a6f575090565b603d90600019015390565b50603d9081600019820153600119015390565b85600491979293949701918251600190603f9082828260121c16880101518453828282600c1c16880101518385015382828260061c1688010151888501531685010151878201530195929190614a4f565b634e487b7160e01b600052601160045260246000fd5b50604051614b018161488b565b6000815290565b806000917a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000080821015614c4a575b506d04ee2d6d415b85acef810000000080831015614c3b575b50662386f26fc1000080831015614c2c575b506305f5e10080831015614c1d575b5061271080831015614c0e575b506064821015614bfe575b600a80921015614bf4575b600190816021614b9f828701614962565b95860101905b614bb1575b5050505090565b600019019083907f30313233343536373839616263646566000000000000000000000000000000008282061a835304918215614bef57919082614ba5565b614baa565b9160010191614b8e565b9190606460029104910191614b83565b60049193920491019138614b78565b60089193920491019138614b6b565b60109193920491019138614b5c565b60209193920491019138614b4a565b604093508104915038614b31565b6001600160a01b031660405190614c6e826148a7565b602a8252602082016040368237825115614d8657603090538151600190811015614d8657607860218401536029905b808211614d0b575050614cad5790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602060248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b9091600f81166010811015614d71577f3031323334353637383961626364656600000000000000000000000000000000901a614d478486614d9c565b5360041c918015614d5c576000190190614c9d565b60246000634e487b7160e01b81526011600452fd5b60246000634e487b7160e01b81526032600452fd5b634e487b7160e01b600052603260045260246000fd5b908151811015614d86570160200190565b60405190614dba826148c3565b600482527f2667743b000000000000000000000000000000000000000000000000000000006020830152565b60405190614df3826148c3565b600482527f266c743b000000000000000000000000000000000000000000000000000000006020830152565b90614e87929493604051958692602094614e4181518092888089019101614826565b8401614e5582518093888085019101614826565b01614e6882518093878085019101614826565b01614e7b82518093868085019101614826565b010380855201836148df565b565b801561519a5760009180615175575090505b6001908082811015614f0857505050614eb2614de6565b614f05602260405183614ecf829551809260208086019101614826565b81017f203100000000000000000000000000000000000000000000000000000000000060208201520360028101845201826148df565b90565b66038d7ea4c6800011156151185760409081519060a0820182811067ffffffffffffffff82111761431157808452614f3f8161488b565b600081528252825190614f51826148c3565b8482526020917f4b0000000000000000000000000000000000000000000000000000000000000083820152828401528351614f8b816148c3565b8581527f4d0000000000000000000000000000000000000000000000000000000000000083820152848401528351614fc2816148c3565b8581527f42000000000000000000000000000000000000000000000000000000000000008382015260608401528351614ffa816148c3565b8581527f54000000000000000000000000000000000000000000000000000000000000008382015260808401526000918583965b6150ec575b50845194615040866148c3565b6007908187527f2623383830353b0000000000000000000000000000000000000000000000000083880152519560005b8281106150d957505050506150ba6150c0917f20000000000000000000000000000000000000000000000000000000000000006027870152600886526150b5866148c3565b614b08565b91615744565b916005851015614d8657614f059460051b015192614e1f565b8181018401518882018501528301615070565b9591926103e89081851061510f57508680916064600a870406950493019661502e565b93929650615033565b5050615122614dad565b614f0560286040518361513f829551809260208086019101614826565b81017f203939392e39395400000000000000000000000000000000000000000000000060208201520360088101845201826148df565b600a0a918215615186575004614e9b565b80634e487b7160e01b602492526012600452fd5b50506040516151a8816148c3565b600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b620151809103048061523d57506151ea614de6565b614f05602660405183615207829551809260208086019101614826565b81017f203120446179000000000000000000000000000000000000000000000000000060208201520360068101845201826148df565b61270f811161530c57600181036152c957614f056020615291604051615262816148c3565b600481527f20446179000000000000000000000000000000000000000000000000000000008382015293614b08565b60405193816152a98693518092868087019101614826565b82016152bd82518093868085019101614826565b010380845201826148df565b614f0560206152916040516152dd816148c3565b600581527f20446179730000000000000000000000000000000000000000000000000000008382015293614b08565b50615315614dad565b614f05602a60405183615332829551809260208086019101614826565b81017f2039393939204461797300000000000000000000000000000000000000000000602082015203600a8101845201826148df565b6020818303126142f85780519067ffffffffffffffff82116142f8570181601f820112156142f857805161539b81614946565b926153a960405194856148df565b818452602082840101116142f857614f059160208085019101614826565b6001600160a01b031660409081516395d89b4160e01b8152600081600481855afa9081156155a157600091615580575b5061545c8351615406816148c3565b601181527f5341422d56322d4c4f434b55502d4c494e0000000000000000000000000000006020918201528251908301207fc66b376a19264d832c1bc254000c18944ca5aa57ed50f4ea637c4da424d4c3bb1490565b1561549a5750505161546d816148c3565b600d81527f4c6f636b7570204c696e65617200000000000000000000000000000000000000602082015290565b6154fe83516154a8816148c3565b601181527f5341422d56322d4c4f434b55502d44594e0000000000000000000000000000006020918201528251908301207f6ab655856fa5352de8c05542b1937ac63c59342da992602767c02734cc5391651490565b1561553c5750505161550f816148c3565b600e81527f4c6f636b75702044796e616d6963000000000000000000000000000000000000602082015290565b61557c9083519384937f814a8a2e000000000000000000000000000000000000000000000000000000008552600485015260248401526044830190614849565b0390fd5b61559b913d8091833e61559381836148df565b810190615368565b386153f7565b83513d6000823e3d90fd5b3d156155d7573d906155bd82614946565b916155cb60405193846148df565b82523d6000602084013e565b606090565b60405160208101907f313ce56700000000000000000000000000000000000000000000000000000000825260048152615614816148c3565b6000928392839251915afa6156276155ac565b908061565e575b1561565a5760208180518101031261565657602001519060ff82168203615653575090565b80fd5b5080fd5b5090565b50602081511461562e565b6000809160405160208101906395d89b4160e01b82526004815261568c816148c3565b51915afa6156986155ac565b90158015615738575b6156fe57806020806156b893518301019101615368565b601e815111600014614f0557506040516156d1816148c3565b600b81527f4c6f6e672053796d626f6c000000000000000000000000000000000000000000602082015290565b5060405161570b816148c3565b600581527f4552433230000000000000000000000000000000000000000000000000000000602082015290565b506040815111156156a1565b806157565750604051614b018161488b565b600a8110156157bb5761576890614b08565b614f05602260405180937f2e3000000000000000000000000000000000000000000000000000000000000060208301526157ab8151809260208686019101614826565b81010360028101845201826148df565b6157c490614b08565b614f05602160405180937f2e0000000000000000000000000000000000000000000000000000000000000060208301526158078151809260208686019101614826565b81010360018101845201826148df565b60405190615824826148c3565b600782527f536574746c6564000000000000000000000000000000000000000000000000006020830152565b6040519061585d826148c3565b600882527f4465706c657465640000000000000000000000000000000000000000000000006020830152565b600581101561596f57600481036158a35750614f05615850565b600381036158e557506040516158b8816148c3565b600881527f43616e63656c6564000000000000000000000000000000000000000000000000602082015290565b6001810361592757506040516158fa816148c3565b600981527f53747265616d696e670000000000000000000000000000000000000000000000602082015290565b60020361593657614f05615817565b604051615942816148c3565b600781527f50656e64696e6700000000000000000000000000000000000000000000000000602082015290565b634e487b7160e01b600052602160045260246000fd5b6030614e879193929360405194816159a7879351809260208087019101614826565b820164010714051160dd1b60208201526a029b0b13634b2b9102b19160ad1b60258201526159de8251809360208785019101614826565b010360108101855201836148df565b6025614e87919392936040519481615a0f879351809260208087019101614826565b820164010714051160dd1b6020820152615a328251809360208785019101614826565b010360058101855201836148df565b60405190615a4e826148c3565b601082527f68736c283233302c3231252c31312529000000000000000000000000000000006020830152565b8015615cac57615a88615a41565b90612710908103908111614ade57614f0591615aa661013692614b08565b6040519485927f3c672066696c6c3d226e6f6e65223e000000000000000000000000000000000060208501527f3c636972636c652063783d22313636222063793d2235302220723d2232322220602f8501527f7374726f6b653d22000000000000000000000000000000000000000000000000604f850152615b32815180926020605788019101614826565b83017f22207374726f6b652d77696474683d223130222f3e000000000000000000000060578201527f3c636972636c652063783d22313636222063793d2235302220706174684c656e606c8201527f6774683d2231303030302220723d22323222207374726f6b653d220000000000608c820152615bba82518093602060a785019101614826565b017f22207374726f6b652d6461736861727261793d22313030303022207374726f6b60a78201527f652d646173686f66667365743d2200000000000000000000000000000000000060c7820152615c1b82518093602060d585019101614826565b017f22207374726f6b652d6c696e656361703d22726f756e6422207374726f6b652d60d58201527f77696474683d223522207472616e73666f726d3d22726f74617465282d39302960f58201527f22207472616e73666f726d2d6f726967696e3d22313636203530222f3e000000610115820152631e17b39f60e11b610132820152036101168101845201826148df565b5050604051614b018161488b565b60009080518015615d2f579060009182915b818310615cde57505050600d02900390565b909193603b60f81b7fff00000000000000000000000000000000000000000000000000000000000000615d118785614d9c565b511614615d27575b600d01936001019190615ccc565b849350615d19565b505050600090565b60009080518015615d2f579060009182915b818310615d5b5750505060041b900390565b909193603b60f81b7fff00000000000000000000000000000000000000000000000000000000000000615d8e8785614d9c565b511614615da4575b601001936001019190615d49565b849350615d9656"; From 0b9b3e14b1f5814ec552042cec14eabaa2e1cd87 Mon Sep 17 00:00:00 2001 From: Andrei Vlad Birgaoanu <99738872+andreivladbrg@users.noreply.github.com> Date: Wed, 18 Oct 2023 15:46:46 +0300 Subject: [PATCH 28/47] Remove the ability to cancel for recipients (#710) * feat: remove ability to cancel for recipient feat: remove sender's hook test: update tests accordingly * feat: emit asset in cancel and withdraw events refactor: remove recipient from cancel event test: update tests accordingly test: update precompiles bytecode * chore: update gas snapshot * test: update Precompiles bytecode * docs: include recipient disable to cancel in changelog * refactor: add "recipient" in cancel event docs: refine explanatory comments refactor: reorder parameters in events * test: update Precompiles bytecode * chore: add explantory comment --------- Co-authored-by: Paul Razvan Berg --- .gas-snapshot | 648 +++++++++--------- CHANGELOG.md | 1 + shell/prepare-artifacts.sh | 1 - src/SablierV2LockupDynamic.sol | 52 +- src/SablierV2LockupLinear.sol | 52 +- src/abstracts/SablierV2Lockup.sol | 7 +- src/interfaces/ISablierV2Lockup.sol | 9 +- .../hooks/ISablierV2LockupSender.sol | 27 - test/Base.t.sol | 4 - test/fork/LockupDynamic.t.sol | 3 +- test/fork/LockupLinear.t.sol | 3 +- test/integration/Integration.t.sol | 6 - .../concrete/lockup/burn/burn.t.sol | 2 + .../cancel-multiple/cancelMultiple.t.sol | 57 +- .../cancel-multiple/cancelMultiple.tree | 22 +- .../concrete/lockup/cancel/cancel.t.sol | 221 +----- .../concrete/lockup/cancel/cancel.tree | 89 +-- .../withdrawMaxAndTransfer.t.sol | 7 +- .../lockup/withdraw-max/withdrawMax.t.sol | 10 +- .../withdraw-multiple/withdrawMultiple.t.sol | 23 +- .../concrete/lockup/withdraw/withdraw.t.sol | 14 +- .../nft-descriptor/generateAccentColor.t.sol | 2 +- .../fuzz/lockup-dynamic/withdraw.t.sol | 2 +- test/integration/fuzz/lockup/cancel.t.sol | 70 +- .../fuzz/lockup/cancelMultiple.t.sol | 2 + test/integration/fuzz/lockup/withdraw.t.sol | 6 +- .../integration/fuzz/lockup/withdrawMax.t.sol | 8 +- .../fuzz/lockup/withdrawMaxAndTransfer.t.sol | 7 +- .../fuzz/lockup/withdrawMultiple.t.sol | 4 +- test/integration/shared/lockup/cancel.t.sol | 28 +- .../shared/lockup/cancelMultiple.t.sol | 2 +- test/mocks/hooks/GoodSender.sol | 21 - test/mocks/hooks/ReentrantSender.sol | 22 - test/mocks/hooks/RevertingSender.sol | 22 - test/utils/Events.sol | 5 +- test/utils/Precompiles.sol | 4 +- 36 files changed, 502 insertions(+), 961 deletions(-) delete mode 100644 src/interfaces/hooks/ISablierV2LockupSender.sol delete mode 100644 test/mocks/hooks/GoodSender.sol delete mode 100644 test/mocks/hooks/ReentrantSender.sol delete mode 100644 test/mocks/hooks/RevertingSender.sol diff --git a/.gas-snapshot b/.gas-snapshot index 31ba7f609..4bf009e11 100644 --- a/.gas-snapshot +++ b/.gas-snapshot @@ -1,425 +1,413 @@ -Burn_LockupDynamic_Integration_Concrete_Test:test_Burn_CallerApprovedOperator() (gas: 87474) -Burn_LockupDynamic_Integration_Concrete_Test:test_Burn_CallerNFTOwner() (gas: 78058) -Burn_LockupDynamic_Integration_Concrete_Test:test_Burn_NonTransferableNFT() (gas: 78067) -Burn_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_NFTDoesNotExist() (gas: 79272) +Burn_LockupDynamic_Integration_Concrete_Test:test_Burn_CallerApprovedOperator() (gas: 87800) +Burn_LockupDynamic_Integration_Concrete_Test:test_Burn_CallerNFTOwner() (gas: 78384) +Burn_LockupDynamic_Integration_Concrete_Test:test_Burn_NonTransferableNFT() (gas: 78393) +Burn_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_NFTDoesNotExist() (gas: 79598) Burn_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11325) -Burn_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StatusCanceled() (gas: 86942) -Burn_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StatusPending() (gas: 14284) -Burn_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StatusSettled() (gas: 19520) -Burn_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StatusStreaming() (gas: 19556) -Burn_LockupLinear_Integration_Concrete_Test:test_Burn_CallerApprovedOperator() (gas: 87711) -Burn_LockupLinear_Integration_Concrete_Test:test_Burn_CallerNFTOwner() (gas: 78284) -Burn_LockupLinear_Integration_Concrete_Test:test_Burn_NonTransferableNFT() (gas: 78293) -Burn_LockupLinear_Integration_Concrete_Test:test_RevertGiven_NFTDoesNotExist() (gas: 79480) +Burn_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StatusCanceled() (gas: 90036) +Burn_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StatusPending() (gas: 14289) +Burn_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StatusSettled() (gas: 19525) +Burn_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StatusStreaming() (gas: 19561) +Burn_LockupLinear_Integration_Concrete_Test:test_Burn_CallerApprovedOperator() (gas: 88034) +Burn_LockupLinear_Integration_Concrete_Test:test_Burn_CallerNFTOwner() (gas: 78607) +Burn_LockupLinear_Integration_Concrete_Test:test_Burn_NonTransferableNFT() (gas: 78616) +Burn_LockupLinear_Integration_Concrete_Test:test_RevertGiven_NFTDoesNotExist() (gas: 79803) Burn_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11311) -Burn_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StatusCanceled() (gas: 77650) -Burn_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StatusPending() (gas: 14270) -Burn_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StatusSettled() (gas: 19506) -Burn_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StatusStreaming() (gas: 19542) -CancelMultiple_LockupDynamic_Integration_Concrete_Test:test_CancelMultiple() (gas: 831368) -CancelMultiple_LockupDynamic_Integration_Concrete_Test:test_CancelMultiple_ArrayCountZero() (gas: 6293) -CancelMultiple_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_AllStreamsCold() (gas: 32410) -CancelMultiple_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_AllStreamsNotCancelable() (gas: 866449) -CancelMultiple_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_OnlyNull() (gas: 12340) -CancelMultiple_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_SomeNull() (gas: 78328) -CancelMultiple_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_SomeStreamsCold() (gas: 340997) -CancelMultiple_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_SomeStreamsNotCancelable() (gas: 950201) -CancelMultiple_LockupDynamic_Integration_Fuzz_Test:testFuzz_CancelMultiple(uint256,uint40) (runs: 50, μ: 1201756, ~: 1206371) -CancelMultiple_LockupLinear_Integration_Concrete_Test:test_CancelMultiple() (gas: 563445) -CancelMultiple_LockupLinear_Integration_Concrete_Test:test_CancelMultiple_ArrayCountZero() (gas: 6313) -CancelMultiple_LockupLinear_Integration_Concrete_Test:test_RevertGiven_AllStreamsCold() (gas: 32558) -CancelMultiple_LockupLinear_Integration_Concrete_Test:test_RevertGiven_AllStreamsNotCancelable() (gas: 579829) -CancelMultiple_LockupLinear_Integration_Concrete_Test:test_RevertGiven_OnlyNull() (gas: 12366) -CancelMultiple_LockupLinear_Integration_Concrete_Test:test_RevertGiven_SomeNull() (gas: 78359) -CancelMultiple_LockupLinear_Integration_Concrete_Test:test_RevertGiven_SomeStreamsCold() (gas: 245143) -CancelMultiple_LockupLinear_Integration_Concrete_Test:test_RevertGiven_SomeStreamsNotCancelable() (gas: 661591) -CancelMultiple_LockupLinear_Integration_Fuzz_Test:testFuzz_CancelMultiple(uint256,uint40) (runs: 50, μ: 801956, ~: 802941) -Cancel_LockupDynamic_Integration_Concrete_Test:test_Cancel_CallerRecipient() (gas: 391618) -Cancel_LockupDynamic_Integration_Concrete_Test:test_Cancel_CallerRecipient_SenderDoesNotImplementHook() (gas: 377197) -Cancel_LockupDynamic_Integration_Concrete_Test:test_Cancel_CallerRecipient_SenderNotContract() (gas: 100017) -Cancel_LockupDynamic_Integration_Concrete_Test:test_Cancel_CallerRecipient_SenderReentrancy() (gas: 379308) -Cancel_LockupDynamic_Integration_Concrete_Test:test_Cancel_CallerRecipient_SenderReverts() (gas: 377695) -Cancel_LockupDynamic_Integration_Concrete_Test:test_Cancel_CallerSender() (gas: 386708) -Cancel_LockupDynamic_Integration_Concrete_Test:test_Cancel_CallerSender_RecipientDoesNotImplementHook() (gas: 372228) -Cancel_LockupDynamic_Integration_Concrete_Test:test_Cancel_CallerSender_RecipientNotContract() (gas: 97299) -Cancel_LockupDynamic_Integration_Concrete_Test:test_Cancel_CallerSender_RecipientReentrancy() (gas: 374398) -Cancel_LockupDynamic_Integration_Concrete_Test:test_Cancel_CallerSender_RecipientReverts() (gas: 372763) -Cancel_LockupDynamic_Integration_Concrete_Test:test_Cancel_StatusPending() (gas: 76399) -Cancel_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11299) -Cancel_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StatusCanceled() (gas: 87330) -Cancel_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StatusDepleted() (gas: 65550) -Cancel_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StatusSettled() (gas: 29268) -Cancel_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StreamNotCancelable() (gas: 261722) -Cancel_LockupDynamic_Integration_Fuzz_Test:testFuzz_Cancel_CallerRecipient(uint256,uint128) (runs: 50, μ: 434849, ~: 435842) -Cancel_LockupDynamic_Integration_Fuzz_Test:testFuzz_Cancel_CallerSender(uint256,uint128) (runs: 50, μ: 453227, ~: 455450) -Cancel_LockupDynamic_Integration_Fuzz_Test:testFuzz_Cancel_StatusPending(uint256) (runs: 50, μ: 76963, ~: 77115) -Cancel_LockupLinear_Integration_Concrete_Test:test_Cancel_CallerRecipient() (gas: 274846) -Cancel_LockupLinear_Integration_Concrete_Test:test_Cancel_CallerRecipient_SenderDoesNotImplementHook() (gas: 260354) -Cancel_LockupLinear_Integration_Concrete_Test:test_Cancel_CallerRecipient_SenderNotContract() (gas: 80371) -Cancel_LockupLinear_Integration_Concrete_Test:test_Cancel_CallerRecipient_SenderReentrancy() (gas: 262451) -Cancel_LockupLinear_Integration_Concrete_Test:test_Cancel_CallerRecipient_SenderReverts() (gas: 260852) -Cancel_LockupLinear_Integration_Concrete_Test:test_Cancel_CallerSender() (gas: 269878) -Cancel_LockupLinear_Integration_Concrete_Test:test_Cancel_CallerSender_RecipientDoesNotImplementHook() (gas: 255372) -Cancel_LockupLinear_Integration_Concrete_Test:test_Cancel_CallerSender_RecipientNotContract() (gas: 77649) -Cancel_LockupLinear_Integration_Concrete_Test:test_Cancel_CallerSender_RecipientReentrancy() (gas: 257528) -Cancel_LockupLinear_Integration_Concrete_Test:test_Cancel_CallerSender_RecipientReverts() (gas: 255907) -Cancel_LockupLinear_Integration_Concrete_Test:test_Cancel_StatusPending() (gas: 76446) -Cancel_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11285) -Cancel_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StatusCanceled() (gas: 78038) -Cancel_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StatusDepleted() (gas: 65769) -Cancel_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StatusSettled() (gas: 29373) -Cancel_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StreamNotCancelable() (gas: 185888) -Cancel_LockupLinear_Integration_Fuzz_Test:testFuzz_Cancel_CallerRecipient(uint256,uint128) (runs: 50, μ: 291315, ~: 291257) -Cancel_LockupLinear_Integration_Fuzz_Test:testFuzz_Cancel_CallerSender(uint256,uint128) (runs: 50, μ: 310015, ~: 310670) -Cancel_LockupLinear_Integration_Fuzz_Test:testFuzz_Cancel_StatusPending(uint256) (runs: 50, μ: 76941, ~: 77016) -ClaimProtocolRevenues_LockupDynamic_Integration_Concrete_Test:test_ClaimProtocolRevenues() (gas: 319860) -ClaimProtocolRevenues_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_ProtocolRevenuesZero() (gas: 18973) -ClaimProtocolRevenues_LockupLinear_Integration_Concrete_Test:test_ClaimProtocolRevenues() (gas: 246630) -ClaimProtocolRevenues_LockupLinear_Integration_Concrete_Test:test_RevertGiven_ProtocolRevenuesZero() (gas: 18981) -Constructor_LockupDynamic_Integration_Concrete_Test:test_Constructor() (gas: 5410963) -Constructor_LockupLinear_Integration_Concrete_Test:test_Constructor() (gas: 4216694) -CreateWithDeltas_LockupDynamic_Integration_Concrete_Test:test_CreateWithDeltas() (gas: 380732) -CreateWithDeltas_LockupDynamic_Integration_Fuzz_Test:testFuzz_CreateWithDeltas((uint128,uint64,uint40)[]) (runs: 50, μ: 4100052, ~: 3555804) -CreateWithDurations_LockupLinear_Integration_Concrete_Test:test_CreateWithDurations() (gas: 287745) -CreateWithDurations_LockupLinear_Integration_Fuzz_Test:testFuzz_CreateWithDurations((uint40,uint40)) (runs: 50, μ: 286647, ~: 286702) -CreateWithMilestones_LockupDynamic_Integration_Concrete_Test:test_CreateWithMilestones() (gas: 370947) -CreateWithMilestones_LockupDynamic_Integration_Concrete_Test:test_CreateWithMilestones_AssetMissingReturnValue() (gas: 377735) +Burn_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StatusCanceled() (gas: 80712) +Burn_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StatusPending() (gas: 14275) +Burn_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StatusSettled() (gas: 19511) +Burn_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StatusStreaming() (gas: 19547) +CancelMultiple_LockupDynamic_Integration_Concrete_Test:test_CancelMultiple() (gas: 831114) +CancelMultiple_LockupDynamic_Integration_Concrete_Test:test_CancelMultiple_ArrayCountZero() (gas: 6265) +CancelMultiple_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_AllStreamsCold() (gas: 32340) +CancelMultiple_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_AllStreamsNotCancelable() (gas: 859532) +CancelMultiple_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_OnlyNull() (gas: 12356) +CancelMultiple_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_SomeNull() (gas: 78320) +CancelMultiple_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_SomeStreamsCold() (gas: 341059) +CancelMultiple_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_SomeStreamsNotCancelable() (gas: 945583) +CancelMultiple_LockupDynamic_Integration_Fuzz_Test:testFuzz_CancelMultiple(uint256,uint40) (runs: 50, μ: 1194589, ~: 1198935) +CancelMultiple_LockupLinear_Integration_Concrete_Test:test_CancelMultiple() (gas: 562805) +CancelMultiple_LockupLinear_Integration_Concrete_Test:test_CancelMultiple_ArrayCountZero() (gas: 6288) +CancelMultiple_LockupLinear_Integration_Concrete_Test:test_RevertGiven_AllStreamsCold() (gas: 32482) +CancelMultiple_LockupLinear_Integration_Concrete_Test:test_RevertGiven_AllStreamsNotCancelable() (gas: 572852) +CancelMultiple_LockupLinear_Integration_Concrete_Test:test_RevertGiven_OnlyNull() (gas: 12373) +CancelMultiple_LockupLinear_Integration_Concrete_Test:test_RevertGiven_SomeNull() (gas: 78250) +CancelMultiple_LockupLinear_Integration_Concrete_Test:test_RevertGiven_SomeStreamsCold() (gas: 245095) +CancelMultiple_LockupLinear_Integration_Concrete_Test:test_RevertGiven_SomeStreamsNotCancelable() (gas: 656729) +CancelMultiple_LockupLinear_Integration_Fuzz_Test:testFuzz_CancelMultiple(uint256,uint40) (runs: 50, μ: 794341, ~: 795547) +Cancel_LockupDynamic_Integration_Concrete_Test:test_Cancel() (gas: 385726) +Cancel_LockupDynamic_Integration_Concrete_Test:test_Cancel_RecipientDoesNotImplementHook() (gas: 371244) +Cancel_LockupDynamic_Integration_Concrete_Test:test_Cancel_RecipientNotContract() (gas: 96900) +Cancel_LockupDynamic_Integration_Concrete_Test:test_Cancel_RecipientReentrancy() (gas: 373435) +Cancel_LockupDynamic_Integration_Concrete_Test:test_Cancel_RecipientReverts() (gas: 371811) +Cancel_LockupDynamic_Integration_Concrete_Test:test_Cancel_StatusPending() (gas: 76125) +Cancel_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11321) +Cancel_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StatusCanceled() (gas: 87122) +Cancel_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StatusDepleted() (gas: 68253) +Cancel_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StatusSettled() (gas: 27019) +Cancel_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StreamNotCancelable() (gas: 261520) +Cancel_LockupDynamic_Integration_Fuzz_Test:testFuzz_Cancel(uint256,uint128) (runs: 50, μ: 453354, ~: 454739) +Cancel_LockupDynamic_Integration_Fuzz_Test:testFuzz_Cancel_StatusPending(uint256) (runs: 50, μ: 76673, ~: 76852) +Cancel_LockupLinear_Integration_Concrete_Test:test_Cancel() (gas: 268892) +Cancel_LockupLinear_Integration_Concrete_Test:test_Cancel_RecipientDoesNotImplementHook() (gas: 254340) +Cancel_LockupLinear_Integration_Concrete_Test:test_Cancel_RecipientNotContract() (gas: 77222) +Cancel_LockupLinear_Integration_Concrete_Test:test_Cancel_RecipientReentrancy() (gas: 256520) +Cancel_LockupLinear_Integration_Concrete_Test:test_Cancel_RecipientReverts() (gas: 254907) +Cancel_LockupLinear_Integration_Concrete_Test:test_Cancel_StatusPending() (gas: 76140) +Cancel_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11310) +Cancel_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StatusCanceled() (gas: 77801) +Cancel_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StatusDepleted() (gas: 68472) +Cancel_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StatusSettled() (gas: 27130) +Cancel_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StreamNotCancelable() (gas: 185680) +Cancel_LockupLinear_Integration_Fuzz_Test:testFuzz_Cancel(uint256,uint128) (runs: 50, μ: 309781, ~: 309696) +Cancel_LockupLinear_Integration_Fuzz_Test:testFuzz_Cancel_StatusPending(uint256) (runs: 50, μ: 76674, ~: 76867) +ClaimProtocolRevenues_LockupDynamic_Integration_Concrete_Test:test_ClaimProtocolRevenues() (gas: 319731) +ClaimProtocolRevenues_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_ProtocolRevenuesZero() (gas: 18907) +ClaimProtocolRevenues_LockupLinear_Integration_Concrete_Test:test_ClaimProtocolRevenues() (gas: 246489) +ClaimProtocolRevenues_LockupLinear_Integration_Concrete_Test:test_RevertGiven_ProtocolRevenuesZero() (gas: 18915) +Constructor_LockupDynamic_Integration_Concrete_Test:test_Constructor() (gas: 5383879) +Constructor_LockupLinear_Integration_Concrete_Test:test_Constructor() (gas: 4189626) +CreateWithDeltas_LockupDynamic_Integration_Concrete_Test:test_CreateWithDeltas() (gas: 380624) +CreateWithDeltas_LockupDynamic_Integration_Fuzz_Test:testFuzz_CreateWithDeltas((uint128,uint64,uint40)[]) (runs: 50, μ: 4099444, ~: 3556313) +CreateWithDurations_LockupLinear_Integration_Concrete_Test:test_CreateWithDurations() (gas: 287625) +CreateWithDurations_LockupLinear_Integration_Fuzz_Test:testFuzz_CreateWithDurations((uint40,uint40)) (runs: 50, μ: 286496, ~: 286576) +CreateWithMilestones_LockupDynamic_Integration_Concrete_Test:test_CreateWithMilestones() (gas: 370971) +CreateWithMilestones_LockupDynamic_Integration_Concrete_Test:test_CreateWithMilestones_AssetMissingReturnValue() (gas: 377759) CreateWithMilestones_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_EndTimeNotInTheFuture() (gas: 47540) CreateWithMilestones_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_ProtocolFeeTooHigh() (gas: 58079) -CreateWithMilestones_LockupDynamic_Integration_Fuzz_Test:testFuzz_CreateWithMilestones(address,(address,uint40,bool,bool,address,uint128,address,(address,uint256),(uint128,uint64,uint40)[]),uint256) (runs: 50, μ: 4646762, ~: 4503477) -CreateWithRange_LockupLinear_Integration_Concrete_Test:test_CreateWithRange() (gas: 283011) -CreateWithRange_LockupLinear_Integration_Concrete_Test:test_CreateWithRange_AssetMissingReturnValue() (gas: 289778) +CreateWithMilestones_LockupDynamic_Integration_Fuzz_Test:testFuzz_CreateWithMilestones(address,(address,uint40,bool,bool,address,uint128,address,(address,uint256),(uint128,uint64,uint40)[]),uint256) (runs: 50, μ: 4697705, ~: 4643584) +CreateWithRange_LockupLinear_Integration_Concrete_Test:test_CreateWithRange() (gas: 283023) +CreateWithRange_LockupLinear_Integration_Concrete_Test:test_CreateWithRange_AssetMissingReturnValue() (gas: 289790) CreateWithRange_LockupLinear_Integration_Concrete_Test:test_RevertGiven_EndTimeNotInTheFuture() (gas: 41154) CreateWithRange_LockupLinear_Integration_Concrete_Test:test_RevertGiven_ProtocolFeeTooHigh() (gas: 51749) -CreateWithRange_LockupLinear_Integration_Fuzz_Test:testFuzz_CreateWithRange(address,(address,address,uint128,address,bool,bool,(uint40,uint40,uint40),(address,uint256)),uint256) (runs: 50, μ: 370169, ~: 370511) +CreateWithRange_LockupLinear_Integration_Fuzz_Test:testFuzz_CreateWithRange(address,(address,address,uint128,address,bool,bool,(uint40,uint40,uint40),(address,uint256)),uint256) (runs: 50, μ: 370443, ~: 370634) FlashFee_Integration_Concrete_Test:test_FlashFee() (gas: 50968) FlashFee_Integration_Concrete_Test:test_RevertGiven_AssetNotFlashLoanable() (gas: 18626) -FlashFee_Integration_Fuzz_Test:testFuzz_FlashFee(uint256,uint256) (runs: 50, μ: 51839, ~: 52081) +FlashFee_Integration_Fuzz_Test:testFuzz_FlashFee(uint256,uint256) (runs: 50, μ: 51814, ~: 52081) FlashLoanFunction_Integration_Concrete_Test:test_FlashLoan() (gas: 402140) FlashLoanFunction_Integration_Concrete_Test:test_RevertGiven_AssetNotFlashLoanable() (gas: 21603) -FlashLoanFunction_Integration_Fuzz_Test:testFuzz_FlashLoanFunction(uint256,uint128,bytes) (runs: 50, μ: 403410, ~: 407188) -GenerateAccentColor_Integration_Concrete_Test:test_GenerateAccentColor() (gas: 12968) -GetAsset_LockupDynamic_Integration_Concrete_Test:test_GetAsset() (gas: 307738) +FlashLoanFunction_Integration_Fuzz_Test:testFuzz_FlashLoanFunction(uint256,uint128,bytes) (runs: 50, μ: 403132, ~: 406851) +GenerateAccentColor_Integration_Concrete_Test:test_GenerateAccentColor() (gas: 13215) +GetAsset_LockupDynamic_Integration_Concrete_Test:test_GetAsset() (gas: 307762) GetAsset_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 12049) -GetAsset_LockupLinear_Integration_Concrete_Test:test_GetAsset() (gas: 234488) +GetAsset_LockupLinear_Integration_Concrete_Test:test_GetAsset() (gas: 234500) GetAsset_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 12035) -GetCliffTime_LockupLinear_Integration_Concrete_Test:test_GetCliffTime() (gas: 234972) +GetCliffTime_LockupLinear_Integration_Concrete_Test:test_GetCliffTime() (gas: 234984) GetCliffTime_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11392) -GetDepositedAmount_LockupDynamic_Integration_Concrete_Test:test_GetDepositedAmount() (gas: 310535) +GetDepositedAmount_LockupDynamic_Integration_Concrete_Test:test_GetDepositedAmount() (gas: 310559) GetDepositedAmount_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11682) -GetDepositedAmount_LockupLinear_Integration_Concrete_Test:test_GetDepositedAmount() (gas: 237259) +GetDepositedAmount_LockupLinear_Integration_Concrete_Test:test_GetDepositedAmount() (gas: 237271) GetDepositedAmount_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11678) -GetEndTime_LockupDynamic_Integration_Concrete_Test:test_GetEndTime() (gas: 310333) +GetEndTime_LockupDynamic_Integration_Concrete_Test:test_GetEndTime() (gas: 310357) GetEndTime_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11538) -GetEndTime_LockupLinear_Integration_Concrete_Test:test_GetEndTime() (gas: 237111) +GetEndTime_LockupLinear_Integration_Concrete_Test:test_GetEndTime() (gas: 237123) GetEndTime_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11546) -GetRange_LockupDynamic_Integration_Concrete_Test:test_GetRange() (gas: 309759) +GetRange_LockupDynamic_Integration_Concrete_Test:test_GetRange() (gas: 309783) GetRange_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 13125) -GetRange_LockupLinear_Integration_Concrete_Test:test_GetRange() (gas: 237329) +GetRange_LockupLinear_Integration_Concrete_Test:test_GetRange() (gas: 237341) GetRange_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 13308) GetRecipient_LockupDynamic_Integration_Concrete_Test:test_GetRecipient() (gas: 12585) -GetRecipient_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_NFTBurned() (gas: 72366) +GetRecipient_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_NFTBurned() (gas: 72692) GetRecipient_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 10989) GetRecipient_LockupLinear_Integration_Concrete_Test:test_GetRecipient() (gas: 12565) -GetRecipient_LockupLinear_Integration_Concrete_Test:test_RevertGiven_NFTBurned() (gas: 72592) +GetRecipient_LockupLinear_Integration_Concrete_Test:test_RevertGiven_NFTBurned() (gas: 72915) GetRecipient_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 10993) -GetRefundedAmount_LockupDynamic_Integration_Concrete_Test:test_GetRefundedAmount_StatusDepleted() (gas: 362872) -GetRefundedAmount_LockupDynamic_Integration_Concrete_Test:test_GetRefundedAmount_StatusPending() (gas: 332677) -GetRefundedAmount_LockupDynamic_Integration_Concrete_Test:test_GetRefundedAmount_StatusSettled() (gas: 337885) -GetRefundedAmount_LockupDynamic_Integration_Concrete_Test:test_GetRefundedAmount_StatusStreaming() (gas: 337899) -GetRefundedAmount_LockupDynamic_Integration_Concrete_Test:test_GetRefundedAmount_StreamHasBeenCanceled_StatusCanceled() (gas: 377267) -GetRefundedAmount_LockupDynamic_Integration_Concrete_Test:test_GetRefundedAmount_StreamHasBeenCanceled_StatusDepleted() (gas: 399131) +GetRefundedAmount_LockupDynamic_Integration_Concrete_Test:test_GetRefundedAmount_StatusDepleted() (gas: 363038) +GetRefundedAmount_LockupDynamic_Integration_Concrete_Test:test_GetRefundedAmount_StatusPending() (gas: 332701) +GetRefundedAmount_LockupDynamic_Integration_Concrete_Test:test_GetRefundedAmount_StatusSettled() (gas: 337909) +GetRefundedAmount_LockupDynamic_Integration_Concrete_Test:test_GetRefundedAmount_StatusStreaming() (gas: 337923) +GetRefundedAmount_LockupDynamic_Integration_Concrete_Test:test_GetRefundedAmount_StreamHasBeenCanceled_StatusCanceled() (gas: 377279) +GetRefundedAmount_LockupDynamic_Integration_Concrete_Test:test_GetRefundedAmount_StreamHasBeenCanceled_StatusDepleted() (gas: 399285) GetRefundedAmount_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 12045) -GetRefundedAmount_LockupLinear_Integration_Concrete_Test:test_GetRefundedAmount_StatusDepleted() (gas: 287867) -GetRefundedAmount_LockupLinear_Integration_Concrete_Test:test_GetRefundedAmount_StatusPending() (gas: 257439) -GetRefundedAmount_LockupLinear_Integration_Concrete_Test:test_GetRefundedAmount_StatusSettled() (gas: 262647) -GetRefundedAmount_LockupLinear_Integration_Concrete_Test:test_GetRefundedAmount_StatusStreaming() (gas: 262661) -GetRefundedAmount_LockupLinear_Integration_Concrete_Test:test_GetRefundedAmount_StreamHasBeenCanceled_StatusCanceled() (gas: 298747) -GetRefundedAmount_LockupLinear_Integration_Concrete_Test:test_GetRefundedAmount_StreamHasBeenCanceled_StatusDepleted() (gas: 320600) +GetRefundedAmount_LockupLinear_Integration_Concrete_Test:test_GetRefundedAmount_StatusDepleted() (gas: 288018) +GetRefundedAmount_LockupLinear_Integration_Concrete_Test:test_GetRefundedAmount_StatusPending() (gas: 257451) +GetRefundedAmount_LockupLinear_Integration_Concrete_Test:test_GetRefundedAmount_StatusSettled() (gas: 262659) +GetRefundedAmount_LockupLinear_Integration_Concrete_Test:test_GetRefundedAmount_StatusStreaming() (gas: 262673) +GetRefundedAmount_LockupLinear_Integration_Concrete_Test:test_GetRefundedAmount_StreamHasBeenCanceled_StatusCanceled() (gas: 298719) +GetRefundedAmount_LockupLinear_Integration_Concrete_Test:test_GetRefundedAmount_StreamHasBeenCanceled_StatusDepleted() (gas: 320711) GetRefundedAmount_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 12031) -GetSegments_LockupDynamic_Integration_Concrete_Test:test_GetSegments() (gas: 315237) +GetSegments_LockupDynamic_Integration_Concrete_Test:test_GetSegments() (gas: 315261) GetSegments_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 13758) -GetSender_LockupDynamic_Integration_Concrete_Test:test_GetSender() (gas: 307456) +GetSender_LockupDynamic_Integration_Concrete_Test:test_GetSender() (gas: 307480) GetSender_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11814) -GetSender_LockupLinear_Integration_Concrete_Test:test_GetSender() (gas: 234222) +GetSender_LockupLinear_Integration_Concrete_Test:test_GetSender() (gas: 234234) GetSender_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11816) -GetStartTime_LockupDynamic_Integration_Concrete_Test:test_GetStartTime() (gas: 310662) +GetStartTime_LockupDynamic_Integration_Concrete_Test:test_GetStartTime() (gas: 310686) GetStartTime_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11823) -GetStartTime_LockupLinear_Integration_Concrete_Test:test_GetStartTime() (gas: 237434) +GetStartTime_LockupLinear_Integration_Concrete_Test:test_GetStartTime() (gas: 237446) GetStartTime_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11831) -GetStream_LockupDynamic_Integration_Concrete_Test:test_GetStream() (gas: 278699) +GetStream_LockupDynamic_Integration_Concrete_Test:test_GetStream() (gas: 278723) GetStream_LockupDynamic_Integration_Concrete_Test:test_GetStream_StatusSettled() (gas: 52024) GetStream_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 15544) GetStream_LockupLinear_Integration_Concrete_Test:test_GetStream() (gas: 34920) GetStream_LockupLinear_Integration_Concrete_Test:test_GetStream_StatusSettled() (gas: 39431) GetStream_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 14299) -GetWithdrawnAmount_LockupDynamic_Integration_Concrete_Test:test_GetWithdrawnAmount() (gas: 384565) -GetWithdrawnAmount_LockupDynamic_Integration_Concrete_Test:test_GetWithdrawnAmount_NoPreviousWithdrawals() (gas: 335859) +GetWithdrawnAmount_LockupDynamic_Integration_Concrete_Test:test_GetWithdrawnAmount() (gas: 384891) +GetWithdrawnAmount_LockupDynamic_Integration_Concrete_Test:test_GetWithdrawnAmount_NoPreviousWithdrawals() (gas: 335883) GetWithdrawnAmount_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 12012) -GetWithdrawnAmount_LockupDynamic_Integration_Fuzz_Test:testFuzz_GetWithdrawnAmount(uint256,uint128) (runs: 50, μ: 387601, ~: 388165) -GetWithdrawnAmount_LockupDynamic_Integration_Fuzz_Test:testFuzz_GetWithdrawnAmount_NoPreviousWithdrawals(uint256) (runs: 50, μ: 337603, ~: 337783) -GetWithdrawnAmount_LockupLinear_Integration_Concrete_Test:test_GetWithdrawnAmount() (gas: 282047) -GetWithdrawnAmount_LockupLinear_Integration_Concrete_Test:test_GetWithdrawnAmount_NoPreviousWithdrawals() (gas: 262621) +GetWithdrawnAmount_LockupDynamic_Integration_Fuzz_Test:testFuzz_GetWithdrawnAmount(uint256,uint128) (runs: 50, μ: 388029, ~: 388565) +GetWithdrawnAmount_LockupDynamic_Integration_Fuzz_Test:testFuzz_GetWithdrawnAmount_NoPreviousWithdrawals(uint256) (runs: 50, μ: 337600, ~: 337807) +GetWithdrawnAmount_LockupLinear_Integration_Concrete_Test:test_GetWithdrawnAmount() (gas: 282382) +GetWithdrawnAmount_LockupLinear_Integration_Concrete_Test:test_GetWithdrawnAmount_NoPreviousWithdrawals() (gas: 262633) GetWithdrawnAmount_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11998) -GetWithdrawnAmount_LockupLinear_Integration_Fuzz_Test:testFuzz_GetWithdrawnAmount(uint256,uint128) (runs: 50, μ: 285233, ~: 285189) -GetWithdrawnAmount_LockupLinear_Integration_Fuzz_Test:testFuzz_GetWithdrawnAmount_NoPreviousWithdrawals(uint256) (runs: 50, μ: 264296, ~: 264259) -IsCancelable_LockupDynamic_Integration_Concrete_Test:test_IsCancelable() (gas: 515823) -IsCancelable_LockupDynamic_Integration_Concrete_Test:test_IsCancelable_Cold() (gas: 336082) -IsCancelable_LockupDynamic_Integration_Concrete_Test:test_IsCancelable_StreamCancelable() (gas: 327326) +GetWithdrawnAmount_LockupLinear_Integration_Fuzz_Test:testFuzz_GetWithdrawnAmount(uint256,uint128) (runs: 50, μ: 285546, ~: 285524) +GetWithdrawnAmount_LockupLinear_Integration_Fuzz_Test:testFuzz_GetWithdrawnAmount_NoPreviousWithdrawals(uint256) (runs: 50, μ: 264363, ~: 264557) +IsCancelable_LockupDynamic_Integration_Concrete_Test:test_IsCancelable() (gas: 515871) +IsCancelable_LockupDynamic_Integration_Concrete_Test:test_IsCancelable_Cold() (gas: 336106) +IsCancelable_LockupDynamic_Integration_Concrete_Test:test_IsCancelable_StreamCancelable() (gas: 327350) IsCancelable_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11239) -IsCancelable_LockupLinear_Integration_Concrete_Test:test_IsCancelable() (gas: 372821) -IsCancelable_LockupLinear_Integration_Concrete_Test:test_IsCancelable_Cold() (gas: 262996) -IsCancelable_LockupLinear_Integration_Concrete_Test:test_IsCancelable_StreamCancelable() (gas: 254123) +IsCancelable_LockupLinear_Integration_Concrete_Test:test_IsCancelable() (gas: 372845) +IsCancelable_LockupLinear_Integration_Concrete_Test:test_IsCancelable_Cold() (gas: 263008) +IsCancelable_LockupLinear_Integration_Concrete_Test:test_IsCancelable_StreamCancelable() (gas: 254135) IsCancelable_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11263) -IsCold_LockupDynamic_Integration_Concrete_Test:test_IsCold_StatusCanceled() (gas: 375998) -IsCold_LockupDynamic_Integration_Concrete_Test:test_IsCold_StatusDepleted() (gas: 362551) -IsCold_LockupDynamic_Integration_Concrete_Test:test_IsCold_StatusPending() (gas: 330616) -IsCold_LockupDynamic_Integration_Concrete_Test:test_IsCold_StatusSettled() (gas: 336386) -IsCold_LockupDynamic_Integration_Concrete_Test:test_IsCold_StatusStreaming() (gas: 352696) -IsCold_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11558) -IsCold_LockupLinear_Integration_Concrete_Test:test_IsCold_StatusCanceled() (gas: 297529) -IsCold_LockupLinear_Integration_Concrete_Test:test_IsCold_StatusDepleted() (gas: 287604) -IsCold_LockupLinear_Integration_Concrete_Test:test_IsCold_StatusPending() (gas: 257436) -IsCold_LockupLinear_Integration_Concrete_Test:test_IsCold_StatusSettled() (gas: 263318) -IsCold_LockupLinear_Integration_Concrete_Test:test_IsCold_StatusStreaming() (gas: 263853) -IsCold_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11601) -IsDepleted_LockupDynamic_Integration_Concrete_Test:test_IsDepleted() (gas: 361956) -IsDepleted_LockupDynamic_Integration_Concrete_Test:test_IsDepleted_StreamNotDepleted() (gas: 326750) +IsCold_LockupDynamic_Integration_Concrete_Test:test_IsCold_StatusCanceled() (gas: 375977) +IsCold_LockupDynamic_Integration_Concrete_Test:test_IsCold_StatusDepleted() (gas: 362684) +IsCold_LockupDynamic_Integration_Concrete_Test:test_IsCold_StatusPending() (gas: 330607) +IsCold_LockupDynamic_Integration_Concrete_Test:test_IsCold_StatusSettled() (gas: 336377) +IsCold_LockupDynamic_Integration_Concrete_Test:test_IsCold_StatusStreaming() (gas: 352687) +IsCold_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11525) +IsCold_LockupLinear_Integration_Concrete_Test:test_IsCold_StatusCanceled() (gas: 297468) +IsCold_LockupLinear_Integration_Concrete_Test:test_IsCold_StatusDepleted() (gas: 287722) +IsCold_LockupLinear_Integration_Concrete_Test:test_IsCold_StatusPending() (gas: 257415) +IsCold_LockupLinear_Integration_Concrete_Test:test_IsCold_StatusSettled() (gas: 263297) +IsCold_LockupLinear_Integration_Concrete_Test:test_IsCold_StatusStreaming() (gas: 263832) +IsCold_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11568) +IsDepleted_LockupDynamic_Integration_Concrete_Test:test_IsDepleted() (gas: 362122) +IsDepleted_LockupDynamic_Integration_Concrete_Test:test_IsDepleted_StreamNotDepleted() (gas: 326774) IsDepleted_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11191) -IsDepleted_LockupLinear_Integration_Concrete_Test:test_IsDepleted() (gas: 286971) -IsDepleted_LockupLinear_Integration_Concrete_Test:test_IsDepleted_StreamNotDepleted() (gas: 253532) +IsDepleted_LockupLinear_Integration_Concrete_Test:test_IsDepleted() (gas: 287122) +IsDepleted_LockupLinear_Integration_Concrete_Test:test_IsDepleted_StreamNotDepleted() (gas: 253544) IsDepleted_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11212) -IsStream_LockupDynamic_Integration_Concrete_Test:test_IsStream() (gas: 327090) +IsStream_LockupDynamic_Integration_Concrete_Test:test_IsStream() (gas: 327114) IsStream_LockupDynamic_Integration_Concrete_Test:test_IsStream_Null() (gas: 8527) -IsStream_LockupLinear_Integration_Concrete_Test:test_IsStream() (gas: 253894) +IsStream_LockupLinear_Integration_Concrete_Test:test_IsStream() (gas: 253906) IsStream_LockupLinear_Integration_Concrete_Test:test_IsStream_Null() (gas: 8570) -IsTransferable_LockupDynamic_Integration_Concrete_Test:test_IsTransferrable_Stream() (gas: 327274) +IsTransferable_LockupDynamic_Integration_Concrete_Test:test_IsTransferrable_Stream() (gas: 327298) IsTransferable_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11674) -IsTransferable_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StreamTransferNotEnabled() (gas: 515789) -IsTransferable_LockupLinear_Integration_Concrete_Test:test_IsTransferrable_Stream() (gas: 254100) +IsTransferable_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StreamTransferNotEnabled() (gas: 515837) +IsTransferable_LockupLinear_Integration_Concrete_Test:test_IsTransferrable_Stream() (gas: 254112) IsTransferable_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11739) -IsTransferable_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StreamTransferNotEnabled() (gas: 372843) -IsWarm_LockupDynamic_Integration_Concrete_Test:test_IsWarm_StatusCanceled() (gas: 375536) -IsWarm_LockupDynamic_Integration_Concrete_Test:test_IsWarm_StatusDepleted() (gas: 362065) -IsWarm_LockupDynamic_Integration_Concrete_Test:test_IsWarm_StatusPending() (gas: 330053) -IsWarm_LockupDynamic_Integration_Concrete_Test:test_IsWarm_StatusSettled() (gas: 335997) -IsWarm_LockupDynamic_Integration_Concrete_Test:test_IsWarm_StatusStreaming() (gas: 352181) -IsWarm_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11118) -IsWarm_LockupLinear_Integration_Concrete_Test:test_IsWarm_StatusCanceled() (gas: 297036) -IsWarm_LockupLinear_Integration_Concrete_Test:test_IsWarm_StatusDepleted() (gas: 287080) -IsWarm_LockupLinear_Integration_Concrete_Test:test_IsWarm_StatusPending() (gas: 256835) -IsWarm_LockupLinear_Integration_Concrete_Test:test_IsWarm_StatusSettled() (gas: 262901) -IsWarm_LockupLinear_Integration_Concrete_Test:test_IsWarm_StatusStreaming() (gas: 263300) -IsWarm_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11139) +IsTransferable_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StreamTransferNotEnabled() (gas: 372867) +IsWarm_LockupDynamic_Integration_Concrete_Test:test_IsWarm_StatusCanceled() (gas: 375515) +IsWarm_LockupDynamic_Integration_Concrete_Test:test_IsWarm_StatusDepleted() (gas: 362198) +IsWarm_LockupDynamic_Integration_Concrete_Test:test_IsWarm_StatusPending() (gas: 330044) +IsWarm_LockupDynamic_Integration_Concrete_Test:test_IsWarm_StatusSettled() (gas: 335988) +IsWarm_LockupDynamic_Integration_Concrete_Test:test_IsWarm_StatusStreaming() (gas: 352172) +IsWarm_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11085) +IsWarm_LockupLinear_Integration_Concrete_Test:test_IsWarm_StatusCanceled() (gas: 296975) +IsWarm_LockupLinear_Integration_Concrete_Test:test_IsWarm_StatusDepleted() (gas: 287198) +IsWarm_LockupLinear_Integration_Concrete_Test:test_IsWarm_StatusPending() (gas: 256814) +IsWarm_LockupLinear_Integration_Concrete_Test:test_IsWarm_StatusSettled() (gas: 262880) +IsWarm_LockupLinear_Integration_Concrete_Test:test_IsWarm_StatusStreaming() (gas: 263279) +IsWarm_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11106) MapSymbol_Integration_Concrete_Test:test_MapSymbol_LockupDynamic() (gas: 16959) MapSymbol_Integration_Concrete_Test:test_MapSymbol_LockupLinear() (gas: 16733) -MapSymbol_Integration_Concrete_Test:test_RevertGiven_UnknownNFT() (gas: 1037150) +MapSymbol_Integration_Concrete_Test:test_RevertGiven_UnknownNFT() (gas: 1039753) MaxFlashLoan_Integration_Concrete_Test:test_MaxFlashLoan() (gas: 178987) MaxFlashLoan_Integration_Concrete_Test:test_MaxFlashLoan_AssetNotFlashLoanable() (gas: 15248) -MaxFlashLoan_Integration_Fuzz_Test:testFuzz_MaxFlashLoan(uint256) (runs: 50, μ: 178984, ~: 179004) +MaxFlashLoan_Integration_Fuzz_Test:testFuzz_MaxFlashLoan(uint256) (runs: 50, μ: 178982, ~: 179000) ProtocolFees_Integration_Concrete_Test:test_ProtocolFees() (gas: 41254) ProtocolFees_Integration_Concrete_Test:test_ProtocolFees_ProtocolFeeNotSet() (gas: 9943) -ProtocolRevenues_LockupDynamic_Integration_Concrete_Test:test_ProtocolRevenues() (gas: 320207) +ProtocolRevenues_LockupDynamic_Integration_Concrete_Test:test_ProtocolRevenues() (gas: 320231) ProtocolRevenues_LockupDynamic_Integration_Concrete_Test:test_ProtocolRevenues_ProtocolRevenuesZero() (gas: 10125) -ProtocolRevenues_LockupLinear_Integration_Concrete_Test:test_ProtocolRevenues() (gas: 246966) +ProtocolRevenues_LockupLinear_Integration_Concrete_Test:test_ProtocolRevenues() (gas: 246978) ProtocolRevenues_LockupLinear_Integration_Concrete_Test:test_ProtocolRevenues_ProtocolRevenuesZero() (gas: 10111) -RefundableAmountOf_LockupDynamic_Integration_Concrete_Test:test_RefundableAmountOf_StatusDepleted() (gas: 361993) -RefundableAmountOf_LockupDynamic_Integration_Concrete_Test:test_RefundableAmountOf_StatusPending() (gas: 335820) -RefundableAmountOf_LockupDynamic_Integration_Concrete_Test:test_RefundableAmountOf_StatusSettled() (gas: 335813) -RefundableAmountOf_LockupDynamic_Integration_Concrete_Test:test_RefundableAmountOf_StatusStreaming() (gas: 342682) -RefundableAmountOf_LockupDynamic_Integration_Concrete_Test:test_RefundableAmountOf_StreamHasBeenCanceled_StatusCanceled() (gas: 375412) -RefundableAmountOf_LockupDynamic_Integration_Concrete_Test:test_RefundableAmountOf_StreamHasBeenCanceled_StatusDepleted() (gas: 398639) -RefundableAmountOf_LockupDynamic_Integration_Concrete_Test:test_RefundableAmountOf_StreamNotCancelable() (gas: 523449) +RefundableAmountOf_LockupDynamic_Integration_Concrete_Test:test_RefundableAmountOf_StatusDepleted() (gas: 362159) +RefundableAmountOf_LockupDynamic_Integration_Concrete_Test:test_RefundableAmountOf_StatusPending() (gas: 335844) +RefundableAmountOf_LockupDynamic_Integration_Concrete_Test:test_RefundableAmountOf_StatusSettled() (gas: 335837) +RefundableAmountOf_LockupDynamic_Integration_Concrete_Test:test_RefundableAmountOf_StatusStreaming() (gas: 342706) +RefundableAmountOf_LockupDynamic_Integration_Concrete_Test:test_RefundableAmountOf_StreamHasBeenCanceled_StatusCanceled() (gas: 375424) +RefundableAmountOf_LockupDynamic_Integration_Concrete_Test:test_RefundableAmountOf_StreamHasBeenCanceled_StatusDepleted() (gas: 398793) +RefundableAmountOf_LockupDynamic_Integration_Concrete_Test:test_RefundableAmountOf_StreamNotCancelable() (gas: 523497) RefundableAmountOf_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11099) -RefundableAmountOf_LockupDynamic_Integration_Fuzz_Test:testFuzz_RefundableAmountOf(uint256) (runs: 50, μ: 48250, ~: 63808) -RefundableAmountOf_LockupLinear_Integration_Concrete_Test:test_RefundableAmountOf_StatusDepleted() (gas: 287004) -RefundableAmountOf_LockupLinear_Integration_Concrete_Test:test_RefundableAmountOf_StatusPending() (gas: 262589) -RefundableAmountOf_LockupLinear_Integration_Concrete_Test:test_RefundableAmountOf_StatusSettled() (gas: 262712) -RefundableAmountOf_LockupLinear_Integration_Concrete_Test:test_RefundableAmountOf_StatusStreaming() (gas: 264199) -RefundableAmountOf_LockupLinear_Integration_Concrete_Test:test_RefundableAmountOf_StreamHasBeenCanceled_StatusCanceled() (gas: 296908) -RefundableAmountOf_LockupLinear_Integration_Concrete_Test:test_RefundableAmountOf_StreamHasBeenCanceled_StatusDepleted() (gas: 320124) -RefundableAmountOf_LockupLinear_Integration_Concrete_Test:test_RefundableAmountOf_StreamNotCancelable() (gas: 380452) +RefundableAmountOf_LockupDynamic_Integration_Fuzz_Test:testFuzz_RefundableAmountOf(uint256) (runs: 50, μ: 44758, ~: 30742) +RefundableAmountOf_LockupLinear_Integration_Concrete_Test:test_RefundableAmountOf_StatusDepleted() (gas: 287155) +RefundableAmountOf_LockupLinear_Integration_Concrete_Test:test_RefundableAmountOf_StatusPending() (gas: 262601) +RefundableAmountOf_LockupLinear_Integration_Concrete_Test:test_RefundableAmountOf_StatusSettled() (gas: 262724) +RefundableAmountOf_LockupLinear_Integration_Concrete_Test:test_RefundableAmountOf_StatusStreaming() (gas: 264211) +RefundableAmountOf_LockupLinear_Integration_Concrete_Test:test_RefundableAmountOf_StreamHasBeenCanceled_StatusCanceled() (gas: 296880) +RefundableAmountOf_LockupLinear_Integration_Concrete_Test:test_RefundableAmountOf_StreamHasBeenCanceled_StatusDepleted() (gas: 320235) +RefundableAmountOf_LockupLinear_Integration_Concrete_Test:test_RefundableAmountOf_StreamNotCancelable() (gas: 380476) RefundableAmountOf_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11110) -RefundableAmountOf_LockupLinear_Integration_Fuzz_Test:testFuzz_RefundableAmountOf(uint256) (runs: 50, μ: 30700, ~: 30858) -Renounce_LockupDynamic_Integration_Concrete_Test:test_Renounce() (gas: 694529) -Renounce_LockupDynamic_Integration_Concrete_Test:test_Renounce_RecipientDoesNotImplementHook() (gas: 687576) -Renounce_LockupDynamic_Integration_Concrete_Test:test_Renounce_RecipientNotContract() (gas: 292583) -Renounce_LockupDynamic_Integration_Concrete_Test:test_Renounce_RecipientReentrancy() (gas: 692741) -Renounce_LockupDynamic_Integration_Concrete_Test:test_Renounce_RecipientReverts() (gas: 688183) +RefundableAmountOf_LockupLinear_Integration_Fuzz_Test:testFuzz_RefundableAmountOf(uint256) (runs: 50, μ: 30789, ~: 30858) +Renounce_LockupDynamic_Integration_Concrete_Test:test_Renounce() (gas: 694601) +Renounce_LockupDynamic_Integration_Concrete_Test:test_Renounce_RecipientDoesNotImplementHook() (gas: 687648) +Renounce_LockupDynamic_Integration_Concrete_Test:test_Renounce_RecipientNotContract() (gas: 292607) +Renounce_LockupDynamic_Integration_Concrete_Test:test_Renounce_RecipientReentrancy() (gas: 692813) +Renounce_LockupDynamic_Integration_Concrete_Test:test_Renounce_RecipientReverts() (gas: 688255) Renounce_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11564) -Renounce_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StatusCanceled() (gas: 87127) -Renounce_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StatusDepleted() (gas: 68421) +Renounce_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StatusCanceled() (gas: 87115) +Renounce_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StatusDepleted() (gas: 68563) Renounce_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StatusSettled() (gas: 24707) -Renounce_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StreamNotCancelable() (gas: 649813) -Renounce_LockupLinear_Integration_Concrete_Test:test_Renounce() (gas: 481658) -Renounce_LockupLinear_Integration_Concrete_Test:test_Renounce_RecipientDoesNotImplementHook() (gas: 474703) -Renounce_LockupLinear_Integration_Concrete_Test:test_Renounce_RecipientNotContract() (gas: 219414) -Renounce_LockupLinear_Integration_Concrete_Test:test_Renounce_RecipientReentrancy() (gas: 479840) -Renounce_LockupLinear_Integration_Concrete_Test:test_Renounce_RecipientReverts() (gas: 475310) +Renounce_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StreamNotCancelable() (gas: 649885) +Renounce_LockupLinear_Integration_Concrete_Test:test_Renounce() (gas: 481694) +Renounce_LockupLinear_Integration_Concrete_Test:test_Renounce_RecipientDoesNotImplementHook() (gas: 474739) +Renounce_LockupLinear_Integration_Concrete_Test:test_Renounce_RecipientNotContract() (gas: 219426) +Renounce_LockupLinear_Integration_Concrete_Test:test_Renounce_RecipientReentrancy() (gas: 479876) +Renounce_LockupLinear_Integration_Concrete_Test:test_Renounce_RecipientReverts() (gas: 475346) Renounce_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11575) -Renounce_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StatusCanceled() (gas: 77847) -Renounce_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StatusDepleted() (gas: 68656) +Renounce_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StatusCanceled() (gas: 77807) +Renounce_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StatusDepleted() (gas: 68795) Renounce_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StatusSettled() (gas: 24822) -Renounce_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StreamNotCancelable() (gas: 436988) +Renounce_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StreamNotCancelable() (gas: 437024) SafeAssetDecimals_Integration_Concrete_Test:test_SafeAssetDecimals() (gas: 12117) SafeAssetDecimals_Integration_Concrete_Test:test_SafeAssetDecimals_DecimalsNotImplemented() (gas: 10852) SafeAssetDecimals_Integration_Concrete_Test:test_SafeAssetDecimals_EOA() (gas: 11625) SafeAssetSymbol_Integration_Concrete_Test:test_SafeAssetSymbol() (gas: 18550) -SafeAssetSymbol_Integration_Concrete_Test:test_SafeAssetSymbol_Bytes32() (gas: 59605) +SafeAssetSymbol_Integration_Concrete_Test:test_SafeAssetSymbol_Bytes32() (gas: 62214) SafeAssetSymbol_Integration_Concrete_Test:test_SafeAssetSymbol_EOA() (gas: 13222) -SafeAssetSymbol_Integration_Concrete_Test:test_SafeAssetSymbol_LongSymbol() (gas: 622290) +SafeAssetSymbol_Integration_Concrete_Test:test_SafeAssetSymbol_LongSymbol() (gas: 624896) SafeAssetSymbol_Integration_Concrete_Test:test_SafeAssetSymbol_SymbolNotImplemented() (gas: 12399) -SetComptroller_LockupDynamic_Integration_Concrete_Test:test_SetComptroller_NewComptroller() (gas: 309153) +SetComptroller_LockupDynamic_Integration_Concrete_Test:test_SetComptroller_NewComptroller() (gas: 311753) SetComptroller_LockupDynamic_Integration_Concrete_Test:test_SetComptroller_SameComptroller() (gas: 23283) -SetComptroller_LockupLinear_Integration_Concrete_Test:test_SetComptroller_NewComptroller() (gas: 309150) +SetComptroller_LockupLinear_Integration_Concrete_Test:test_SetComptroller_NewComptroller() (gas: 311750) SetComptroller_LockupLinear_Integration_Concrete_Test:test_SetComptroller_SameComptroller() (gas: 23280) -SetFlashFee_Integration_Fuzz_Test:testFuzz_SetFlashFee(uint256) (runs: 50, μ: 37809, ~: 40020) -SetNFTDescriptor_LockupDynamic_Integration_Concrete_Test:test_SetNFTDescriptor_NewNFTDescriptor() (gas: 6542473) -SetNFTDescriptor_LockupDynamic_Integration_Concrete_Test:test_SetNFTDescriptor_SameNFTDescriptor() (gas: 2251619) -SetNFTDescriptor_LockupLinear_Integration_Concrete_Test:test_SetNFTDescriptor_NewNFTDescriptor() (gas: 6541265) -SetNFTDescriptor_LockupLinear_Integration_Concrete_Test:test_SetNFTDescriptor_SameNFTDescriptor() (gas: 2250276) +SetFlashFee_Integration_Fuzz_Test:testFuzz_SetFlashFee(uint256) (runs: 50, μ: 37767, ~: 39448) +SetNFTDescriptor_LockupDynamic_Integration_Concrete_Test:test_SetNFTDescriptor_NewNFTDescriptor() (gas: 6551561) +SetNFTDescriptor_LockupDynamic_Integration_Concrete_Test:test_SetNFTDescriptor_SameNFTDescriptor() (gas: 2258131) +SetNFTDescriptor_LockupLinear_Integration_Concrete_Test:test_SetNFTDescriptor_NewNFTDescriptor() (gas: 6550197) +SetNFTDescriptor_LockupLinear_Integration_Concrete_Test:test_SetNFTDescriptor_SameNFTDescriptor() (gas: 2256602) SetProtocolFee_Integration_Concrete_Test:test_SetProtocolFee() (gas: 47804) SetProtocolFee_Integration_Concrete_Test:test_SetProtocolFee_SameFee() (gas: 22636) -SetProtocolFee_Integration_Fuzz_Test:testFuzz_SetProtocolFee(uint256) (runs: 50, μ: 43089, ~: 43074) -StatusOf_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11684) -StatusOf_LockupDynamic_Integration_Concrete_Test:test_StatusOf() (gas: 352818) -StatusOf_LockupDynamic_Integration_Concrete_Test:test_StatusOf_AssetsFullyWithdrawn() (gas: 362690) -StatusOf_LockupDynamic_Integration_Concrete_Test:test_StatusOf_RefundableAmountNotZero() (gas: 336598) -StatusOf_LockupDynamic_Integration_Concrete_Test:test_StatusOf_StartTimeInTheFuture() (gas: 330697) -StatusOf_LockupDynamic_Integration_Concrete_Test:test_StatusOf_StreamCanceled() (gas: 376172) -StatusOf_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11714) -StatusOf_LockupLinear_Integration_Concrete_Test:test_StatusOf() (gas: 263351) -StatusOf_LockupLinear_Integration_Concrete_Test:test_StatusOf_AssetsFullyWithdrawn() (gas: 287719) -StatusOf_LockupLinear_Integration_Concrete_Test:test_StatusOf_RefundableAmountNotZero() (gas: 263516) -StatusOf_LockupLinear_Integration_Concrete_Test:test_StatusOf_StartTimeInTheFuture() (gas: 257493) -StatusOf_LockupLinear_Integration_Concrete_Test:test_StatusOf_StreamCanceled() (gas: 297686) +SetProtocolFee_Integration_Fuzz_Test:testFuzz_SetProtocolFee(uint256) (runs: 50, μ: 43128, ~: 43074) +StatusOf_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11651) +StatusOf_LockupDynamic_Integration_Concrete_Test:test_StatusOf() (gas: 352809) +StatusOf_LockupDynamic_Integration_Concrete_Test:test_StatusOf_AssetsFullyWithdrawn() (gas: 362823) +StatusOf_LockupDynamic_Integration_Concrete_Test:test_StatusOf_RefundableAmountNotZero() (gas: 336589) +StatusOf_LockupDynamic_Integration_Concrete_Test:test_StatusOf_StartTimeInTheFuture() (gas: 330688) +StatusOf_LockupDynamic_Integration_Concrete_Test:test_StatusOf_StreamCanceled() (gas: 376151) +StatusOf_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11681) +StatusOf_LockupLinear_Integration_Concrete_Test:test_StatusOf() (gas: 263330) +StatusOf_LockupLinear_Integration_Concrete_Test:test_StatusOf_AssetsFullyWithdrawn() (gas: 287837) +StatusOf_LockupLinear_Integration_Concrete_Test:test_StatusOf_RefundableAmountNotZero() (gas: 263495) +StatusOf_LockupLinear_Integration_Concrete_Test:test_StatusOf_StartTimeInTheFuture() (gas: 257472) +StatusOf_LockupLinear_Integration_Concrete_Test:test_StatusOf_StreamCanceled() (gas: 297625) StreamedAmountOf_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11319) StreamedAmountOf_LockupDynamic_Integration_Concrete_Test:test_StreamedAmountOf_CurrentMilestone1st() (gas: 45931) StreamedAmountOf_LockupDynamic_Integration_Concrete_Test:test_StreamedAmountOf_CurrentMilestoneNot1st() (gas: 50774) -StreamedAmountOf_LockupDynamic_Integration_Concrete_Test:test_StreamedAmountOf_OneSegment() (gas: 257003) +StreamedAmountOf_LockupDynamic_Integration_Concrete_Test:test_StreamedAmountOf_OneSegment() (gas: 257027) StreamedAmountOf_LockupDynamic_Integration_Concrete_Test:test_StreamedAmountOf_StartTimeInTheFuture() (gas: 20230) StreamedAmountOf_LockupDynamic_Integration_Concrete_Test:test_StreamedAmountOf_StartTimeInThePresent() (gas: 25593) -StreamedAmountOf_LockupDynamic_Integration_Concrete_Test:test_StreamedAmountOf_StatusDepleted() (gas: 68749) +StreamedAmountOf_LockupDynamic_Integration_Concrete_Test:test_StreamedAmountOf_StatusDepleted() (gas: 68891) StreamedAmountOf_LockupDynamic_Integration_Concrete_Test:test_StreamedAmountOf_StatusPending() (gas: 20360) StreamedAmountOf_LockupDynamic_Integration_Concrete_Test:test_StreamedAmountOf_StatusSettled() (gas: 26624) -StreamedAmountOf_LockupDynamic_Integration_Concrete_Test:test_StreamedAmountOf_StreamHasBeenCanceled_StatusCanceled() (gas: 87534) -StreamedAmountOf_LockupDynamic_Integration_Concrete_Test:test_StreamedAmountOf_StreamHasBeenCanceled_StatusDepleted() (gas: 116207) -StreamedAmountOf_LockupDynamic_Integration_Fuzz_Test:testFuzz_StreamedAmountOf_Calculation((uint128,uint64,uint40)[],uint40) (runs: 50, μ: 3520440, ~: 3134690) -StreamedAmountOf_LockupDynamic_Integration_Fuzz_Test:testFuzz_StreamedAmountOf_Monotonicity((uint128,uint64,uint40)[],uint40,uint40) (runs: 50, μ: 3969098, ~: 4086928) -StreamedAmountOf_LockupDynamic_Integration_Fuzz_Test:testFuzz_StreamedAmountOf_OneSegment((uint128,uint64,uint40),uint40) (runs: 50, μ: 276308, ~: 270719) +StreamedAmountOf_LockupDynamic_Integration_Concrete_Test:test_StreamedAmountOf_StreamHasBeenCanceled_StatusCanceled() (gas: 87522) +StreamedAmountOf_LockupDynamic_Integration_Concrete_Test:test_StreamedAmountOf_StreamHasBeenCanceled_StatusDepleted() (gas: 116337) +StreamedAmountOf_LockupDynamic_Integration_Fuzz_Test:testFuzz_StreamedAmountOf_Calculation((uint128,uint64,uint40)[],uint40) (runs: 50, μ: 3523474, ~: 3133486) +StreamedAmountOf_LockupDynamic_Integration_Fuzz_Test:testFuzz_StreamedAmountOf_Monotonicity((uint128,uint64,uint40)[],uint40,uint40) (runs: 50, μ: 3972237, ~: 4084392) +StreamedAmountOf_LockupDynamic_Integration_Fuzz_Test:testFuzz_StreamedAmountOf_OneSegment((uint128,uint64,uint40),uint40) (runs: 50, μ: 276656, ~: 270632) StreamedAmountOf_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11349) StreamedAmountOf_LockupLinear_Integration_Concrete_Test:test_StreamedAmountOf_CliffTimeInTheFuture() (gas: 26236) StreamedAmountOf_LockupLinear_Integration_Concrete_Test:test_StreamedAmountOf_CliffTimeInThePast() (gas: 17291) StreamedAmountOf_LockupLinear_Integration_Concrete_Test:test_StreamedAmountOf_CliffTimeInThePresent() (gas: 27121) -StreamedAmountOf_LockupLinear_Integration_Concrete_Test:test_StreamedAmountOf_StatusDepleted() (gas: 68969) +StreamedAmountOf_LockupLinear_Integration_Concrete_Test:test_StreamedAmountOf_StatusDepleted() (gas: 69108) StreamedAmountOf_LockupLinear_Integration_Concrete_Test:test_StreamedAmountOf_StatusPending() (gas: 20305) StreamedAmountOf_LockupLinear_Integration_Concrete_Test:test_StreamedAmountOf_StatusSettled() (gas: 26688) -StreamedAmountOf_LockupLinear_Integration_Concrete_Test:test_StreamedAmountOf_StreamHasBeenCanceled_StatusCanceled() (gas: 78261) -StreamedAmountOf_LockupLinear_Integration_Concrete_Test:test_StreamedAmountOf_StreamHasBeenCanceled_StatusDepleted() (gas: 106890) -StreamedAmountOf_LockupLinear_Integration_Fuzz_Test:testFuzz_StreamedAmountOf_Calculation(uint40,uint128) (runs: 50, μ: 234531, ~: 235187) +StreamedAmountOf_LockupLinear_Integration_Concrete_Test:test_StreamedAmountOf_StreamHasBeenCanceled_StatusCanceled() (gas: 78221) +StreamedAmountOf_LockupLinear_Integration_Concrete_Test:test_StreamedAmountOf_StreamHasBeenCanceled_StatusDepleted() (gas: 106989) +StreamedAmountOf_LockupLinear_Integration_Fuzz_Test:testFuzz_StreamedAmountOf_Calculation(uint40,uint128) (runs: 50, μ: 234406, ~: 234313) StreamedAmountOf_LockupLinear_Integration_Fuzz_Test:testFuzz_StreamedAmountOf_CliffTimeInTheFuture(uint40) (runs: 50, μ: 27397, ~: 27604) -StreamedAmountOf_LockupLinear_Integration_Fuzz_Test:testFuzz_StreamedAmountOf_Monotonicity(uint40,uint40,uint128) (runs: 50, μ: 239328, ~: 241463) +StreamedAmountOf_LockupLinear_Integration_Fuzz_Test:testFuzz_StreamedAmountOf_Monotonicity(uint40,uint40,uint128) (runs: 50, μ: 239510, ~: 241475) ToggleFlashAsset_Integration_Concrete_Test:test_ToggleFlashAsset() (gas: 31848) ToggleFlashAsset_Integration_Concrete_Test:test_ToggleFlashAsset_FlagNotEnabled() (gas: 41868) TokenURI_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_NFTDoesNotExist() (gas: 13542) -TokenURI_LockupDynamic_Integration_Concrete_Test:test_TokenURI_Decoded() (gas: 5031712) -TokenURI_LockupDynamic_Integration_Concrete_Test:test_TokenURI_Full() (gas: 2738320) +TokenURI_LockupDynamic_Integration_Concrete_Test:test_TokenURI_Decoded() (gas: 6624) +TokenURI_LockupDynamic_Integration_Concrete_Test:test_TokenURI_Full() (gas: 6601) TokenURI_LockupLinear_Integration_Concrete_Test:test_RevertGiven_NFTDoesNotExist() (gas: 13525) -TokenURI_LockupLinear_Integration_Concrete_Test:test_TokenURI_Decoded() (gas: 4949035) -TokenURI_LockupLinear_Integration_Concrete_Test:test_TokenURI_Full() (gas: 2656181) -TransferFrom_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StreamNotTransferable() (gas: 314189) -TransferFrom_LockupDynamic_Integration_Concrete_Test:test_TransferFrom() (gas: 326528) -TransferFrom_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StreamNotTransferable() (gas: 240381) -TransferFrom_LockupLinear_Integration_Concrete_Test:test_TransferFrom() (gas: 253258) +TokenURI_LockupLinear_Integration_Concrete_Test:test_TokenURI_Decoded() (gas: 6624) +TokenURI_LockupLinear_Integration_Concrete_Test:test_TokenURI_Full() (gas: 6601) +TransferFrom_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StreamNotTransferable() (gas: 314213) +TransferFrom_LockupDynamic_Integration_Concrete_Test:test_TransferFrom() (gas: 326552) +TransferFrom_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StreamNotTransferable() (gas: 240393) +TransferFrom_LockupLinear_Integration_Concrete_Test:test_TransferFrom() (gas: 253270) WasCanceled_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 12048) -WasCanceled_LockupDynamic_Integration_Concrete_Test:test_WasCanceled() (gas: 364234) -WasCanceled_LockupDynamic_Integration_Concrete_Test:test_WasCanceled_StreamNotCanceled() (gas: 327640) +WasCanceled_LockupDynamic_Integration_Concrete_Test:test_WasCanceled() (gas: 364246) +WasCanceled_LockupDynamic_Integration_Concrete_Test:test_WasCanceled_StreamNotCanceled() (gas: 327664) WasCanceled_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 12069) -WasCanceled_LockupLinear_Integration_Concrete_Test:test_WasCanceled() (gas: 288988) -WasCanceled_LockupLinear_Integration_Concrete_Test:test_WasCanceled_StreamNotCanceled() (gas: 254422) -WithdrawMaxAndTransfer_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_NFTBurned() (gas: 75279) +WasCanceled_LockupLinear_Integration_Concrete_Test:test_WasCanceled() (gas: 288960) +WasCanceled_LockupLinear_Integration_Concrete_Test:test_WasCanceled_StreamNotCanceled() (gas: 254434) +WithdrawMaxAndTransfer_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_NFTBurned() (gas: 75605) WithdrawMaxAndTransfer_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 14162) -WithdrawMaxAndTransfer_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StreamNotTransferable() (gas: 265080) -WithdrawMaxAndTransfer_LockupDynamic_Integration_Concrete_Test:test_WithdrawMaxAndTransfer() (gas: 156711) -WithdrawMaxAndTransfer_LockupDynamic_Integration_Concrete_Test:test_WithdrawMaxAndTransfer_WithdrawableAmountZero() (gas: 101492) -WithdrawMaxAndTransfer_LockupDynamic_Integration_Fuzz_Test:testFuzz_WithdrawMaxAndTransfer(uint256,address) (runs: 50, μ: 131073, ~: 112693) -WithdrawMaxAndTransfer_LockupLinear_Integration_Concrete_Test:test_RevertGiven_NFTBurned() (gas: 75509) -WithdrawMaxAndTransfer_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 14170) -WithdrawMaxAndTransfer_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StreamNotTransferable() (gas: 189310) -WithdrawMaxAndTransfer_LockupLinear_Integration_Concrete_Test:test_WithdrawMaxAndTransfer() (gas: 109710) -WithdrawMaxAndTransfer_LockupLinear_Integration_Concrete_Test:test_WithdrawMaxAndTransfer_WithdrawableAmountZero() (gas: 101736) -WithdrawMaxAndTransfer_LockupLinear_Integration_Fuzz_Test:testFuzz_WithdrawMaxAndTransfer(uint256,address) (runs: 50, μ: 99903, ~: 108188) -WithdrawMax_LockupDynamic_Integration_Concrete_Test:test_WithdrawMax() (gas: 134665) -WithdrawMax_LockupDynamic_Integration_Concrete_Test:test_WithdrawMax_EndTimeNotInTheFuture() (gas: 79744) -WithdrawMax_LockupDynamic_Integration_Fuzz_Test:testFuzz_WithdrawMax(uint256) (runs: 50, μ: 116864, ~: 119983) -WithdrawMax_LockupDynamic_Integration_Fuzz_Test:testFuzz_WithdrawMax_EndTimeNotInTheFuture(uint256) (runs: 50, μ: 82259, ~: 82427) -WithdrawMax_LockupLinear_Integration_Concrete_Test:test_WithdrawMax() (gas: 74005) -WithdrawMax_LockupLinear_Integration_Concrete_Test:test_WithdrawMax_EndTimeNotInTheFuture() (gas: 80017) -WithdrawMax_LockupLinear_Integration_Fuzz_Test:testFuzz_WithdrawMax(uint256) (runs: 50, μ: 72948, ~: 73116) -WithdrawMax_LockupLinear_Integration_Fuzz_Test:testFuzz_WithdrawMax_EndTimeNotInTheFuture(uint256) (runs: 50, μ: 82490, ~: 82584) -WithdrawMultiple_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_AllStatusesDepleted() (gas: 73926) -WithdrawMultiple_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_OnlyNull() (gas: 21069) -WithdrawMultiple_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_SomeNull() (gas: 124805) -WithdrawMultiple_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_SomeStatusesDepleted() (gas: 83399) -WithdrawMultiple_LockupDynamic_Integration_Concrete_Test:test_WithdrawMultiple() (gas: 1823420) +WithdrawMaxAndTransfer_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StreamNotTransferable() (gas: 265104) +WithdrawMaxAndTransfer_LockupDynamic_Integration_Concrete_Test:test_WithdrawMaxAndTransfer() (gas: 159929) +WithdrawMaxAndTransfer_LockupDynamic_Integration_Concrete_Test:test_WithdrawMaxAndTransfer_WithdrawableAmountZero() (gas: 101818) +WithdrawMaxAndTransfer_LockupDynamic_Integration_Fuzz_Test:testFuzz_WithdrawMaxAndTransfer(uint256,address) (runs: 50, μ: 136606, ~: 156340) +WithdrawMaxAndTransfer_LockupLinear_Integration_Concrete_Test:test_RevertGiven_NFTBurned() (gas: 75850) +WithdrawMaxAndTransfer_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 14179) +WithdrawMaxAndTransfer_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StreamNotTransferable() (gas: 189368) +WithdrawMaxAndTransfer_LockupLinear_Integration_Concrete_Test:test_WithdrawMaxAndTransfer() (gas: 112917) +WithdrawMaxAndTransfer_LockupLinear_Integration_Concrete_Test:test_WithdrawMaxAndTransfer_WithdrawableAmountZero() (gas: 102105) +WithdrawMaxAndTransfer_LockupLinear_Integration_Fuzz_Test:testFuzz_WithdrawMaxAndTransfer(uint256,address) (runs: 50, μ: 99893, ~: 111263) +WithdrawMax_LockupDynamic_Integration_Concrete_Test:test_WithdrawMax() (gas: 135385) +WithdrawMax_LockupDynamic_Integration_Concrete_Test:test_WithdrawMax_EndTimeNotInTheFuture() (gas: 80455) +WithdrawMax_LockupDynamic_Integration_Fuzz_Test:testFuzz_WithdrawMax(uint256) (runs: 50, μ: 117789, ~: 120819) +WithdrawMax_LockupDynamic_Integration_Fuzz_Test:testFuzz_WithdrawMax_EndTimeNotInTheFuture(uint256) (runs: 50, μ: 83083, ~: 83237) +WithdrawMax_LockupLinear_Integration_Concrete_Test:test_WithdrawMax() (gas: 74722) +WithdrawMax_LockupLinear_Integration_Concrete_Test:test_WithdrawMax_EndTimeNotInTheFuture() (gas: 80725) +WithdrawMax_LockupLinear_Integration_Fuzz_Test:testFuzz_WithdrawMax(uint256) (runs: 50, μ: 73792, ~: 73934) +WithdrawMax_LockupLinear_Integration_Fuzz_Test:testFuzz_WithdrawMax_EndTimeNotInTheFuture(uint256) (runs: 50, μ: 83366, ~: 83507) +WithdrawMultiple_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_AllStatusesDepleted() (gas: 74062) +WithdrawMultiple_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_OnlyNull() (gas: 21063) +WithdrawMultiple_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_SomeNull() (gas: 125083) +WithdrawMultiple_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_SomeStatusesDepleted() (gas: 83535) +WithdrawMultiple_LockupDynamic_Integration_Concrete_Test:test_WithdrawMultiple() (gas: 1832166) WithdrawMultiple_LockupDynamic_Integration_Concrete_Test:test_WithdrawMultiple_ArrayCountsZero() (gas: 9109) -WithdrawMultiple_LockupDynamic_Integration_Fuzz_Test:testFuzz_WithdrawMultiple(uint256,address,uint128) (runs: 50, μ: 2741367, ~: 2742123) -WithdrawMultiple_LockupLinear_Integration_Concrete_Test:test_RevertGiven_AllStatusesDepleted() (gas: 74068) -WithdrawMultiple_LockupLinear_Integration_Concrete_Test:test_RevertGiven_OnlyNull() (gas: 20978) -WithdrawMultiple_LockupLinear_Integration_Concrete_Test:test_RevertGiven_SomeNull() (gas: 105128) -WithdrawMultiple_LockupLinear_Integration_Concrete_Test:test_RevertGiven_SomeStatusesDepleted() (gas: 83541) -WithdrawMultiple_LockupLinear_Integration_Concrete_Test:test_WithdrawMultiple() (gas: 1256080) +WithdrawMultiple_LockupDynamic_Integration_Fuzz_Test:testFuzz_WithdrawMultiple(uint256,address,uint128) (runs: 50, μ: 2746451, ~: 2747082) +WithdrawMultiple_LockupLinear_Integration_Concrete_Test:test_RevertGiven_AllStatusesDepleted() (gas: 74210) +WithdrawMultiple_LockupLinear_Integration_Concrete_Test:test_RevertGiven_OnlyNull() (gas: 20981) +WithdrawMultiple_LockupLinear_Integration_Concrete_Test:test_RevertGiven_SomeNull() (gas: 105595) +WithdrawMultiple_LockupLinear_Integration_Concrete_Test:test_RevertGiven_SomeStatusesDepleted() (gas: 83683) +WithdrawMultiple_LockupLinear_Integration_Concrete_Test:test_WithdrawMultiple() (gas: 1265450) WithdrawMultiple_LockupLinear_Integration_Concrete_Test:test_WithdrawMultiple_ArrayCountsZero() (gas: 9126) -WithdrawMultiple_LockupLinear_Integration_Fuzz_Test:testFuzz_WithdrawMultiple(uint256,address,uint128) (runs: 50, μ: 1770198, ~: 1770012) -Withdraw_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 19909) -Withdraw_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StreamDepleted() (gas: 67687) -Withdraw_LockupDynamic_Integration_Concrete_Test:test_Withdraw() (gas: 384728) -Withdraw_LockupDynamic_Integration_Concrete_Test:test_Withdraw_CallerApprovedOperator() (gas: 112603) -Withdraw_LockupDynamic_Integration_Concrete_Test:test_Withdraw_CallerRecipient() (gas: 81162) -Withdraw_LockupDynamic_Integration_Concrete_Test:test_Withdraw_EndTimeNotInTheFuture() (gas: 72576) -Withdraw_LockupDynamic_Integration_Concrete_Test:test_Withdraw_RecipientDoesNotImplementHook() (gas: 362862) -Withdraw_LockupDynamic_Integration_Concrete_Test:test_Withdraw_RecipientNotContract() (gas: 122264) -Withdraw_LockupDynamic_Integration_Concrete_Test:test_Withdraw_RecipientReentrancy() (gas: 390093) -Withdraw_LockupDynamic_Integration_Concrete_Test:test_Withdraw_RecipientReverts() (gas: 363417) -Withdraw_LockupDynamic_Integration_Concrete_Test:test_Withdraw_StreamHasBeenCanceled() (gas: 382275) -Withdraw_LockupDynamic_Integration_Fuzz_Test:testFuzz_Withdraw(uint256,address,uint128) (runs: 50, μ: 123360, ~: 98089) -Withdraw_LockupDynamic_Integration_Fuzz_Test:testFuzz_Withdraw_CallerApprovedOperator(address) (runs: 50, μ: 145346, ~: 145346) -Withdraw_LockupDynamic_Integration_Fuzz_Test:testFuzz_Withdraw_SegmentFuzing(((uint128,uint64,uint40)[],uint256,address)) (runs: 50, μ: 3957016, ~: 3848156) -Withdraw_LockupDynamic_Integration_Fuzz_Test:testFuzz_Withdraw_StreamHasBeenCanceled(uint256,address,uint128) (runs: 50, μ: 158686, ~: 158963) +WithdrawMultiple_LockupLinear_Integration_Fuzz_Test:testFuzz_WithdrawMultiple(uint256,address,uint128) (runs: 50, μ: 1775333, ~: 1775230) +Withdraw_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 19915) +Withdraw_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StreamDepleted() (gas: 68019) +Withdraw_LockupDynamic_Integration_Concrete_Test:test_Withdraw() (gas: 385370) +Withdraw_LockupDynamic_Integration_Concrete_Test:test_Withdraw_CallerApprovedOperator() (gas: 112905) +Withdraw_LockupDynamic_Integration_Concrete_Test:test_Withdraw_CallerRecipient() (gas: 81464) +Withdraw_LockupDynamic_Integration_Concrete_Test:test_Withdraw_EndTimeNotInTheFuture() (gas: 72694) +Withdraw_LockupDynamic_Integration_Concrete_Test:test_Withdraw_RecipientDoesNotImplementHook() (gas: 363017) +Withdraw_LockupDynamic_Integration_Concrete_Test:test_Withdraw_RecipientNotContract() (gas: 122875) +Withdraw_LockupDynamic_Integration_Concrete_Test:test_Withdraw_RecipientReentrancy() (gas: 390550) +Withdraw_LockupDynamic_Integration_Concrete_Test:test_Withdraw_RecipientReverts() (gas: 363572) +Withdraw_LockupDynamic_Integration_Concrete_Test:test_Withdraw_StreamHasBeenCanceled() (gas: 382375) +Withdraw_LockupDynamic_Integration_Fuzz_Test:testFuzz_Withdraw(uint256,address,uint128) (runs: 50, μ: 126673, ~: 98881) +Withdraw_LockupDynamic_Integration_Fuzz_Test:testFuzz_Withdraw_CallerApprovedOperator(address) (runs: 50, μ: 145648, ~: 145648) +Withdraw_LockupDynamic_Integration_Fuzz_Test:testFuzz_Withdraw_SegmentFuzing(((uint128,uint64,uint40)[],uint256,address)) (runs: 50, μ: 3946677, ~: 3885668) +Withdraw_LockupDynamic_Integration_Fuzz_Test:testFuzz_Withdraw_StreamHasBeenCanceled(uint256,address,uint128) (runs: 50, μ: 160521, ~: 160725) Withdraw_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 19917) -Withdraw_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StreamDepleted() (gas: 67928) -Withdraw_LockupLinear_Integration_Concrete_Test:test_Withdraw() (gas: 268028) -Withdraw_LockupLinear_Integration_Concrete_Test:test_Withdraw_CallerApprovedOperator() (gas: 93000) -Withdraw_LockupLinear_Integration_Concrete_Test:test_Withdraw_CallerRecipient() (gas: 61548) -Withdraw_LockupLinear_Integration_Concrete_Test:test_Withdraw_EndTimeNotInTheFuture() (gas: 72811) -Withdraw_LockupLinear_Integration_Concrete_Test:test_Withdraw_RecipientDoesNotImplementHook() (gas: 259830) -Withdraw_LockupLinear_Integration_Concrete_Test:test_Withdraw_RecipientNotContract() (gas: 75345) -Withdraw_LockupLinear_Integration_Concrete_Test:test_Withdraw_RecipientReentrancy() (gas: 273458) -Withdraw_LockupLinear_Integration_Concrete_Test:test_Withdraw_RecipientReverts() (gas: 260385) -Withdraw_LockupLinear_Integration_Concrete_Test:test_Withdraw_StreamHasBeenCanceled() (gas: 292783) -Withdraw_LockupLinear_Integration_Fuzz_Test:testFuzz_Withdraw(uint256,address,uint128) (runs: 50, μ: 98684, ~: 98686) -Withdraw_LockupLinear_Integration_Fuzz_Test:testFuzz_Withdraw_CallerApprovedOperator(address) (runs: 50, μ: 112119, ~: 112119) -Withdraw_LockupLinear_Integration_Fuzz_Test:testFuzz_Withdraw_StreamHasBeenCanceled(uint256,address,uint128) (runs: 50, μ: 139252, ~: 139121) +Withdraw_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StreamDepleted() (gas: 68251) +Withdraw_LockupLinear_Integration_Concrete_Test:test_Withdraw() (gas: 268659) +Withdraw_LockupLinear_Integration_Concrete_Test:test_Withdraw_CallerApprovedOperator() (gas: 93323) +Withdraw_LockupLinear_Integration_Concrete_Test:test_Withdraw_CallerRecipient() (gas: 61871) +Withdraw_LockupLinear_Integration_Concrete_Test:test_Withdraw_EndTimeNotInTheFuture() (gas: 72950) +Withdraw_LockupLinear_Integration_Concrete_Test:test_Withdraw_RecipientDoesNotImplementHook() (gas: 259958) +Withdraw_LockupLinear_Integration_Concrete_Test:test_Withdraw_RecipientNotContract() (gas: 75977) +Withdraw_LockupLinear_Integration_Concrete_Test:test_Withdraw_RecipientReentrancy() (gas: 273925) +Withdraw_LockupLinear_Integration_Concrete_Test:test_Withdraw_RecipientReverts() (gas: 260513) +Withdraw_LockupLinear_Integration_Concrete_Test:test_Withdraw_StreamHasBeenCanceled() (gas: 292880) +Withdraw_LockupLinear_Integration_Fuzz_Test:testFuzz_Withdraw(uint256,address,uint128) (runs: 50, μ: 99550, ~: 99500) +Withdraw_LockupLinear_Integration_Fuzz_Test:testFuzz_Withdraw_CallerApprovedOperator(address) (runs: 50, μ: 112442, ~: 112442) +Withdraw_LockupLinear_Integration_Fuzz_Test:testFuzz_Withdraw_StreamHasBeenCanceled(uint256,address,uint128) (runs: 50, μ: 141061, ~: 140960) WithdrawableAmountOf_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 12045) -WithdrawableAmountOf_LockupDynamic_Integration_Concrete_Test:test_WithdrawableAmountOf() (gas: 378217) -WithdrawableAmountOf_LockupDynamic_Integration_Concrete_Test:test_WithdrawableAmountOf_NoPreviousWithdrawals() (gas: 347660) -WithdrawableAmountOf_LockupDynamic_Integration_Concrete_Test:test_WithdrawableAmountOf_StartTimeInThePresent() (gas: 337237) -WithdrawableAmountOf_LockupDynamic_Integration_Concrete_Test:test_WithdrawableAmountOf_StatusDepleted() (gas: 363787) -WithdrawableAmountOf_LockupDynamic_Integration_Concrete_Test:test_WithdrawableAmountOf_StatusPending() (gas: 333986) -WithdrawableAmountOf_LockupDynamic_Integration_Concrete_Test:test_WithdrawableAmountOf_StatusSettled() (gas: 340209) -WithdrawableAmountOf_LockupDynamic_Integration_Concrete_Test:test_WithdrawableAmountOf_StreamHasBeenCanceled_StatusCanceled() (gas: 378252) -WithdrawableAmountOf_LockupDynamic_Integration_Concrete_Test:test_WithdrawableAmountOf_StreamHasBeenCanceled_StatusDepleted() (gas: 400432) -WithdrawableAmountOf_LockupDynamic_Integration_Fuzz_Test:testFuzz_WithdrawableAmountOf(uint40,uint128) (runs: 50, μ: 332238, ~: 313851) -WithdrawableAmountOf_LockupDynamic_Integration_Fuzz_Test:testFuzz_WithdrawableAmountOf_NoPreviousWithdrawals(uint40) (runs: 50, μ: 298230, ~: 289755) +WithdrawableAmountOf_LockupDynamic_Integration_Concrete_Test:test_WithdrawableAmountOf() (gas: 378359) +WithdrawableAmountOf_LockupDynamic_Integration_Concrete_Test:test_WithdrawableAmountOf_NoPreviousWithdrawals() (gas: 347684) +WithdrawableAmountOf_LockupDynamic_Integration_Concrete_Test:test_WithdrawableAmountOf_StartTimeInThePresent() (gas: 337261) +WithdrawableAmountOf_LockupDynamic_Integration_Concrete_Test:test_WithdrawableAmountOf_StatusDepleted() (gas: 363953) +WithdrawableAmountOf_LockupDynamic_Integration_Concrete_Test:test_WithdrawableAmountOf_StatusPending() (gas: 334010) +WithdrawableAmountOf_LockupDynamic_Integration_Concrete_Test:test_WithdrawableAmountOf_StatusSettled() (gas: 340233) +WithdrawableAmountOf_LockupDynamic_Integration_Concrete_Test:test_WithdrawableAmountOf_StreamHasBeenCanceled_StatusCanceled() (gas: 378264) +WithdrawableAmountOf_LockupDynamic_Integration_Concrete_Test:test_WithdrawableAmountOf_StreamHasBeenCanceled_StatusDepleted() (gas: 400586) +WithdrawableAmountOf_LockupDynamic_Integration_Fuzz_Test:testFuzz_WithdrawableAmountOf(uint40,uint128) (runs: 50, μ: 332863, ~: 313993) +WithdrawableAmountOf_LockupDynamic_Integration_Fuzz_Test:testFuzz_WithdrawableAmountOf_NoPreviousWithdrawals(uint40) (runs: 50, μ: 296253, ~: 289779) WithdrawableAmountOf_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 12076) -WithdrawableAmountOf_LockupLinear_Integration_Concrete_Test:test_WithdrawableAmountOf_CliffTimeInTheFuture() (gas: 253643) -WithdrawableAmountOf_LockupLinear_Integration_Concrete_Test:test_WithdrawableAmountOf_NoPreviousWithdrawals() (gas: 263514) -WithdrawableAmountOf_LockupLinear_Integration_Concrete_Test:test_WithdrawableAmountOf_StatusDepleted() (gas: 288779) -WithdrawableAmountOf_LockupLinear_Integration_Concrete_Test:test_WithdrawableAmountOf_StatusPending() (gas: 258715) -WithdrawableAmountOf_LockupLinear_Integration_Concrete_Test:test_WithdrawableAmountOf_StatusSettled() (gas: 265068) -WithdrawableAmountOf_LockupLinear_Integration_Concrete_Test:test_WithdrawableAmountOf_StreamHasBeenCanceled_StatusCanceled() (gas: 299774) -WithdrawableAmountOf_LockupLinear_Integration_Concrete_Test:test_WithdrawableAmountOf_StreamHasBeenCanceled_StatusDepleted() (gas: 321876) -WithdrawableAmountOf_LockupLinear_Integration_Concrete_Test:test_WithdrawableAmountOf_WithWithdrawals() (gas: 287157) -WithdrawableAmountOf_LockupLinear_Integration_Fuzz_Test:testFuzz_WithdrawableAmountOf(uint40,uint128,uint128) (runs: 50, μ: 464146, ~: 464993) -WithdrawableAmountOf_LockupLinear_Integration_Fuzz_Test:testFuzz_WithdrawableAmountOf_CliffTimeInTheFuture(uint40) (runs: 50, μ: 263735, ~: 263984) -WithdrawableAmountOf_LockupLinear_Integration_Fuzz_Test:testFuzz_WithdrawableAmountOf_NoPreviousWithdrawals(uint40,uint128) (runs: 50, μ: 440223, ~: 441015) \ No newline at end of file +WithdrawableAmountOf_LockupLinear_Integration_Concrete_Test:test_WithdrawableAmountOf_CliffTimeInTheFuture() (gas: 253655) +WithdrawableAmountOf_LockupLinear_Integration_Concrete_Test:test_WithdrawableAmountOf_NoPreviousWithdrawals() (gas: 263526) +WithdrawableAmountOf_LockupLinear_Integration_Concrete_Test:test_WithdrawableAmountOf_StatusDepleted() (gas: 288930) +WithdrawableAmountOf_LockupLinear_Integration_Concrete_Test:test_WithdrawableAmountOf_StatusPending() (gas: 258727) +WithdrawableAmountOf_LockupLinear_Integration_Concrete_Test:test_WithdrawableAmountOf_StatusSettled() (gas: 265080) +WithdrawableAmountOf_LockupLinear_Integration_Concrete_Test:test_WithdrawableAmountOf_StreamHasBeenCanceled_StatusCanceled() (gas: 299746) +WithdrawableAmountOf_LockupLinear_Integration_Concrete_Test:test_WithdrawableAmountOf_StreamHasBeenCanceled_StatusDepleted() (gas: 321987) +WithdrawableAmountOf_LockupLinear_Integration_Concrete_Test:test_WithdrawableAmountOf_WithWithdrawals() (gas: 287308) +WithdrawableAmountOf_LockupLinear_Integration_Fuzz_Test:testFuzz_WithdrawableAmountOf(uint40,uint128,uint128) (runs: 50, μ: 464049, ~: 463390) +WithdrawableAmountOf_LockupLinear_Integration_Fuzz_Test:testFuzz_WithdrawableAmountOf_CliffTimeInTheFuture(uint40) (runs: 50, μ: 263747, ~: 263996) +WithdrawableAmountOf_LockupLinear_Integration_Fuzz_Test:testFuzz_WithdrawableAmountOf_NoPreviousWithdrawals(uint40,uint128) (runs: 50, μ: 440270, ~: 441039) \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index bca470ec3..03ba64f04 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ The format is based on [Common Changelog](https://common-changelog.org/). ### Changed +- **Breaking**: Remove ability to `cancel` for recipients ([#710](https://github.com/sablier-labs/v2-core/pull/710)) - Replace the streamed amount with the deposit amount in the NFT descriptor ([#692](https://github.com/sablier-labs/v2-core/pull/692)) - Upgrade Solidity to `0.8.21` ([#688](https://github.com/sablier-labs/v2-core/pull/688)) diff --git a/shell/prepare-artifacts.sh b/shell/prepare-artifacts.sh index 04ca4f002..06ab4fe97 100755 --- a/shell/prepare-artifacts.sh +++ b/shell/prepare-artifacts.sh @@ -45,7 +45,6 @@ cp out-optimized/IERC721Metadata.sol/IERC721Metadata.json $erc721 hooks=./artifacts/interfaces/hooks cp out-optimized/ISablierV2LockupRecipient.sol/ISablierV2LockupRecipient.json $hooks -cp out-optimized/ISablierV2LockupSender.sol/ISablierV2LockupSender.json $hooks libraries=./artifacts/libraries cp out-optimized/Errors.sol/Errors.json $libraries diff --git a/src/SablierV2LockupDynamic.sol b/src/SablierV2LockupDynamic.sol index 00374611d..4e571acef 100644 --- a/src/SablierV2LockupDynamic.sol +++ b/src/SablierV2LockupDynamic.sol @@ -14,7 +14,6 @@ import { ISablierV2Comptroller } from "./interfaces/ISablierV2Comptroller.sol"; import { ISablierV2Lockup } from "./interfaces/ISablierV2Lockup.sol"; import { ISablierV2LockupDynamic } from "./interfaces/ISablierV2LockupDynamic.sol"; import { ISablierV2LockupRecipient } from "./interfaces/hooks/ISablierV2LockupRecipient.sol"; -import { ISablierV2LockupSender } from "./interfaces/hooks/ISablierV2LockupSender.sol"; import { ISablierV2NFTDescriptor } from "./interfaces/ISablierV2NFTDescriptor.sol"; import { Errors } from "./libraries/Errors.sol"; import { Helpers } from "./libraries/Helpers.sol"; @@ -507,38 +506,25 @@ contract SablierV2LockupDynamic is address sender = _streams[streamId].sender; address recipient = _ownerOf(streamId); + // Retrieve the ERC-20 asset from storage. + IERC20 asset = _streams[streamId].asset; + // Interactions: refund the sender. - _streams[streamId].asset.safeTransfer({ to: sender, value: senderAmount }); - - // Interactions: if `msg.sender` is the sender and the recipient is a contract, try to invoke the cancel - // hook on the recipient without reverting if the hook is not implemented, and without bubbling up any - // potential revert. - if (msg.sender == sender) { - if (recipient.code.length > 0) { - try ISablierV2LockupRecipient(recipient).onStreamCanceled({ - streamId: streamId, - sender: sender, - senderAmount: senderAmount, - recipientAmount: recipientAmount - }) { } catch { } - } - } - // Interactions: if `msg.sender` is the recipient and the sender is a contract, try to invoke the cancel - // hook on the sender without reverting if the hook is not implemented, and also without bubbling up any - // potential revert. - else { - if (sender.code.length > 0) { - try ISablierV2LockupSender(sender).onStreamCanceled({ - streamId: streamId, - recipient: recipient, - senderAmount: senderAmount, - recipientAmount: recipientAmount - }) { } catch { } - } + asset.safeTransfer({ to: sender, value: senderAmount }); + + // Interactions: if the recipient is a contract, try to invoke the cancel hook on the recipient without + // reverting if the hook is not implemented, and without bubbling up any potential revert. + if (recipient.code.length > 0) { + try ISablierV2LockupRecipient(recipient).onStreamCanceled({ + streamId: streamId, + sender: sender, + senderAmount: senderAmount, + recipientAmount: recipientAmount + }) { } catch { } } // Log the cancellation. - emit ISablierV2Lockup.CancelLockupStream(streamId, sender, recipient, senderAmount, recipientAmount); + emit ISablierV2Lockup.CancelLockupStream(streamId, sender, recipient, asset, senderAmount, recipientAmount); } /// @dev See the documentation for the user-facing functions that call this internal function. @@ -650,7 +636,13 @@ contract SablierV2LockupDynamic is _streams[streamId].isCancelable = false; } + // Retrieve the ERC-20 asset from storage. + IERC20 asset = _streams[streamId].asset; + // Interactions: perform the ERC-20 transfer. - _streams[streamId].asset.safeTransfer({ to: to, value: amount }); + asset.safeTransfer({ to: to, value: amount }); + + // Log the withdrawal. + emit ISablierV2Lockup.WithdrawFromLockupStream(streamId, to, asset, amount); } } diff --git a/src/SablierV2LockupLinear.sol b/src/SablierV2LockupLinear.sol index 09d9b4fd1..5644ddd78 100644 --- a/src/SablierV2LockupLinear.sol +++ b/src/SablierV2LockupLinear.sol @@ -12,7 +12,6 @@ import { ISablierV2Lockup } from "./interfaces/ISablierV2Lockup.sol"; import { ISablierV2LockupLinear } from "./interfaces/ISablierV2LockupLinear.sol"; import { ISablierV2NFTDescriptor } from "./interfaces/ISablierV2NFTDescriptor.sol"; import { ISablierV2LockupRecipient } from "./interfaces/hooks/ISablierV2LockupRecipient.sol"; -import { ISablierV2LockupSender } from "./interfaces/hooks/ISablierV2LockupSender.sol"; import { Errors } from "./libraries/Errors.sol"; import { Helpers } from "./libraries/Helpers.sol"; import { Lockup, LockupLinear } from "./types/DataTypes.sol"; @@ -422,38 +421,25 @@ contract SablierV2LockupLinear is address sender = _streams[streamId].sender; address recipient = _ownerOf(streamId); + // Retrieve the ERC-20 asset from storage. + IERC20 asset = _streams[streamId].asset; + // Interactions: refund the sender. - _streams[streamId].asset.safeTransfer({ to: sender, value: senderAmount }); - - // Interactions: if `msg.sender` is the sender and the recipient is a contract, try to invoke the cancel - // hook on the recipient without reverting if the hook is not implemented, and without bubbling up any - // potential revert. - if (msg.sender == sender) { - if (recipient.code.length > 0) { - try ISablierV2LockupRecipient(recipient).onStreamCanceled({ - streamId: streamId, - sender: sender, - senderAmount: senderAmount, - recipientAmount: recipientAmount - }) { } catch { } - } - } - // Interactions: if `msg.sender` is the recipient and the sender is a contract, try to invoke the cancel - // hook on the sender without reverting if the hook is not implemented, and also without bubbling up any - // potential revert. - else { - if (sender.code.length > 0) { - try ISablierV2LockupSender(sender).onStreamCanceled({ - streamId: streamId, - recipient: recipient, - senderAmount: senderAmount, - recipientAmount: recipientAmount - }) { } catch { } - } + asset.safeTransfer({ to: sender, value: senderAmount }); + + // Interactions: if the recipient is a contract, try to invoke the cancel hook on the recipient without + // reverting if the hook is not implemented, and without bubbling up any potential revert. + if (recipient.code.length > 0) { + try ISablierV2LockupRecipient(recipient).onStreamCanceled({ + streamId: streamId, + sender: sender, + senderAmount: senderAmount, + recipientAmount: recipientAmount + }) { } catch { } } // Log the cancellation. - emit ISablierV2Lockup.CancelLockupStream(streamId, sender, recipient, senderAmount, recipientAmount); + emit ISablierV2Lockup.CancelLockupStream(streamId, sender, recipient, asset, senderAmount, recipientAmount); } /// @dev See the documentation for the user-facing functions that call this internal function. @@ -556,7 +542,13 @@ contract SablierV2LockupLinear is _streams[streamId].isCancelable = false; } + // Retrieve the ERC-20 asset from storage. + IERC20 asset = _streams[streamId].asset; + // Interactions: perform the ERC-20 transfer. - _streams[streamId].asset.safeTransfer({ to: to, value: amount }); + asset.safeTransfer({ to: to, value: amount }); + + // Log the withdrawal. + emit ISablierV2Lockup.WithdrawFromLockupStream(streamId, to, asset, amount); } } diff --git a/src/abstracts/SablierV2Lockup.sol b/src/abstracts/SablierV2Lockup.sol index e269e5c54..5f82c6a72 100644 --- a/src/abstracts/SablierV2Lockup.sol +++ b/src/abstracts/SablierV2Lockup.sol @@ -158,8 +158,8 @@ abstract contract SablierV2Lockup is revert Errors.SablierV2Lockup_StreamCanceled(streamId); } - // Checks: `msg.sender` is either the stream's sender or the stream's recipient (i.e. the NFT owner). - if (!_isCallerStreamSender(streamId) && msg.sender != _ownerOf(streamId)) { + // Checks: `msg.sender` is the stream's sender. + if (!_isCallerStreamSender(streamId)) { revert Errors.SablierV2Lockup_Unauthorized(streamId, msg.sender); } @@ -291,9 +291,6 @@ abstract contract SablierV2Lockup is amount: amount }) { } catch { } } - - // Log the withdrawal. - emit ISablierV2Lockup.WithdrawFromLockupStream(streamId, to, amount); } /// @inheritdoc ISablierV2Lockup diff --git a/src/interfaces/ISablierV2Lockup.sol b/src/interfaces/ISablierV2Lockup.sol index 94b8fb5b3..3bb304a3c 100644 --- a/src/interfaces/ISablierV2Lockup.sol +++ b/src/interfaces/ISablierV2Lockup.sol @@ -22,14 +22,16 @@ interface ISablierV2Lockup is /// @param streamId The id of the stream. /// @param sender The address of the stream's sender. /// @param recipient The address of the stream's recipient. + /// @param asset The contract address of the ERC-20 asset used for streaming. /// @param senderAmount The amount of assets refunded to the stream's sender, denoted in units of the asset's /// decimals. /// @param recipientAmount The amount of assets left for the stream's recipient to withdraw, denoted in units of the /// asset's decimals. event CancelLockupStream( - uint256 indexed streamId, + uint256 streamId, address indexed sender, address indexed recipient, + IERC20 indexed asset, uint128 senderAmount, uint128 recipientAmount ); @@ -49,8 +51,9 @@ interface ISablierV2Lockup is /// @notice Emitted when assets are withdrawn from a stream. /// @param streamId The id of the stream. /// @param to The address that has received the withdrawn assets. + /// @param asset The contract address of the ERC-20 asset used for streaming. /// @param amount The amount of assets withdrawn, denoted in units of the asset's decimals. - event WithdrawFromLockupStream(uint256 indexed streamId, address indexed to, uint128 amount); + event WithdrawFromLockupStream(uint256 indexed streamId, address indexed to, IERC20 indexed asset, uint128 amount); /*////////////////////////////////////////////////////////////////////////// CONSTANT FUNCTIONS @@ -187,7 +190,7 @@ interface ISablierV2Lockup is /// Requirements: /// - Must not be delegate called. /// - The stream must be warm and cancelable. - /// - `msg.sender` must be either the stream's sender or the stream's recipient (i.e. the NFT owner). + /// - `msg.sender` must be the stream's sender. /// /// @param streamId The id of the stream to cancel. function cancel(uint256 streamId) external; diff --git a/src/interfaces/hooks/ISablierV2LockupSender.sol b/src/interfaces/hooks/ISablierV2LockupSender.sol deleted file mode 100644 index c3ba379a8..000000000 --- a/src/interfaces/hooks/ISablierV2LockupSender.sol +++ /dev/null @@ -1,27 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-or-later -pragma solidity >=0.8.19; - -/// @title ISablierV2LockupSender -/// @notice Interface for sender contracts capable of reacting to cancellations. -/// @dev Implementation of this interface is optional. If a sender contract doesn't implement this interface, -/// function execution will not revert. -interface ISablierV2LockupSender { - /// @notice Responds to recipient-triggered cancellations. - /// - /// @dev Notes: - /// - This function may revert, but the Sablier contract will ignore the revert. - /// - /// @param streamId The id of the canceled stream. - /// @param recipient The stream's recipient, who canceled the stream. - /// @param senderAmount The amount of assets refunded to the stream's sender, denoted in units of the asset's - /// decimals. - /// @param recipientAmount The amount of assets left for the stream's recipient to withdraw, denoted in units of the - /// asset's decimals. - function onStreamCanceled( - uint256 streamId, - address recipient, - uint128 senderAmount, - uint128 recipientAmount - ) - external; -} diff --git a/test/Base.t.sol b/test/Base.t.sol index d64cc6355..beca5a0c1 100644 --- a/test/Base.t.sol +++ b/test/Base.t.sol @@ -18,7 +18,6 @@ import { ERC20MissingReturn } from "./mocks/erc20/ERC20MissingReturn.sol"; import { GoodFlashLoanReceiver } from "./mocks/flash-loan/GoodFlashLoanReceiver.sol"; import { Noop } from "./mocks/Noop.sol"; import { GoodRecipient } from "./mocks/hooks/GoodRecipient.sol"; -import { GoodSender } from "./mocks/hooks/GoodSender.sol"; import { Assertions } from "./utils/Assertions.sol"; import { Calculations } from "./utils/Calculations.sol"; import { Constants } from "./utils/Constants.sol"; @@ -44,7 +43,6 @@ abstract contract Base_Test is Assertions, Calculations, Constants, Events, Fuzz Defaults internal defaults; GoodFlashLoanReceiver internal goodFlashLoanReceiver; GoodRecipient internal goodRecipient; - GoodSender internal goodSender; ISablierV2LockupDynamic internal lockupDynamic; ISablierV2LockupLinear internal lockupLinear; ISablierV2NFTDescriptor internal nftDescriptor; @@ -60,7 +58,6 @@ abstract contract Base_Test is Assertions, Calculations, Constants, Events, Fuzz dai = new ERC20("Dai Stablecoin", "DAI"); goodFlashLoanReceiver = new GoodFlashLoanReceiver(); goodRecipient = new GoodRecipient(); - goodSender = new GoodSender(); noop = new Noop(); usdt = new ERC20MissingReturn("Tether USD", "USDT", 6); @@ -68,7 +65,6 @@ abstract contract Base_Test is Assertions, Calculations, Constants, Events, Fuzz vm.label({ account: address(dai), newLabel: "DAI" }); vm.label({ account: address(goodFlashLoanReceiver), newLabel: "Good Flash Loan Receiver" }); vm.label({ account: address(goodRecipient), newLabel: "Good Recipient" }); - vm.label({ account: address(goodSender), newLabel: "Good Sender" }); vm.label({ account: address(nftDescriptor), newLabel: "NFT Descriptor" }); vm.label({ account: address(noop), newLabel: "Noop" }); vm.label({ account: address(usdt), newLabel: "USDT" }); diff --git a/test/fork/LockupDynamic.t.sol b/test/fork/LockupDynamic.t.sol index 5300f05e8..7a02372ba 100644 --- a/test/fork/LockupDynamic.t.sol +++ b/test/fork/LockupDynamic.t.sol @@ -288,6 +288,7 @@ abstract contract LockupDynamic_Fork_Test is Fork_Test { emit WithdrawFromLockupStream({ streamId: vars.streamId, to: params.recipient, + asset: ASSET, amount: params.withdrawAmount }); vm.expectEmit({ emitter: address(lockupDynamic) }); @@ -351,7 +352,7 @@ abstract contract LockupDynamic_Fork_Test is Fork_Test { vars.senderAmount = lockupDynamic.refundableAmountOf(vars.streamId); vars.recipientAmount = lockupDynamic.withdrawableAmountOf(vars.streamId); emit CancelLockupStream( - vars.streamId, params.sender, params.recipient, vars.senderAmount, vars.recipientAmount + vars.streamId, params.sender, params.recipient, ASSET, vars.senderAmount, vars.recipientAmount ); vm.expectEmit({ emitter: address(lockupDynamic) }); emit MetadataUpdate({ _tokenId: vars.streamId }); diff --git a/test/fork/LockupLinear.t.sol b/test/fork/LockupLinear.t.sol index e7962d1ba..bd6016c64 100644 --- a/test/fork/LockupLinear.t.sol +++ b/test/fork/LockupLinear.t.sol @@ -274,6 +274,7 @@ abstract contract LockupLinear_Fork_Test is Fork_Test { emit WithdrawFromLockupStream({ streamId: vars.streamId, to: params.recipient, + asset: ASSET, amount: params.withdrawAmount }); vm.expectEmit({ emitter: address(lockupLinear) }); @@ -335,7 +336,7 @@ abstract contract LockupLinear_Fork_Test is Fork_Test { vars.senderAmount = lockupLinear.refundableAmountOf(vars.streamId); vars.recipientAmount = lockupLinear.withdrawableAmountOf(vars.streamId); emit CancelLockupStream( - vars.streamId, params.sender, params.recipient, vars.senderAmount, vars.recipientAmount + vars.streamId, params.sender, params.recipient, ASSET, vars.senderAmount, vars.recipientAmount ); vm.expectEmit({ emitter: address(lockupLinear) }); emit MetadataUpdate({ _tokenId: vars.streamId }); diff --git a/test/integration/Integration.t.sol b/test/integration/Integration.t.sol index eaeba7b0d..2e0c62ab9 100644 --- a/test/integration/Integration.t.sol +++ b/test/integration/Integration.t.sol @@ -7,9 +7,7 @@ import { Base_Test } from "../Base.t.sol"; import { FaultyFlashLoanReceiver } from "../mocks/flash-loan/FaultyFlashLoanReceiver.sol"; import { ReentrantFlashLoanReceiver } from "../mocks/flash-loan/ReentrantFlashLoanReceiver.sol"; import { ReentrantRecipient } from "../mocks/hooks/ReentrantRecipient.sol"; -import { ReentrantSender } from "../mocks/hooks/ReentrantSender.sol"; import { RevertingRecipient } from "../mocks/hooks/RevertingRecipient.sol"; -import { RevertingSender } from "../mocks/hooks/RevertingSender.sol"; /// @notice Common logic needed by all integration tests, both concrete and fuzz tests. abstract contract Integration_Test is Base_Test { @@ -20,9 +18,7 @@ abstract contract Integration_Test is Base_Test { FaultyFlashLoanReceiver internal faultyFlashLoanReceiver = new FaultyFlashLoanReceiver(); ReentrantFlashLoanReceiver internal reentrantFlashLoanReceiver = new ReentrantFlashLoanReceiver(); ReentrantRecipient internal reentrantRecipient = new ReentrantRecipient(); - ReentrantSender internal reentrantSender = new ReentrantSender(); RevertingRecipient internal revertingRecipient = new RevertingRecipient(); - RevertingSender internal revertingSender = new RevertingSender(); /*////////////////////////////////////////////////////////////////////////// SET-UP FUNCTION @@ -53,9 +49,7 @@ abstract contract Integration_Test is Base_Test { vm.label({ account: address(faultyFlashLoanReceiver), newLabel: "Faulty Flash Loan Receiver" }); vm.label({ account: address(reentrantFlashLoanReceiver), newLabel: "Reentrant Flash Loan Receiver" }); vm.label({ account: address(reentrantRecipient), newLabel: "Reentrant Lockup Recipient" }); - vm.label({ account: address(reentrantSender), newLabel: "Reentrant Lockup Sender" }); vm.label({ account: address(revertingRecipient), newLabel: "Reverting Lockup Recipient" }); - vm.label({ account: address(revertingSender), newLabel: "Reverting Lockup Sender" }); } /*////////////////////////////////////////////////////////////////////////// diff --git a/test/integration/concrete/lockup/burn/burn.t.sol b/test/integration/concrete/lockup/burn/burn.t.sol index 219f6ae86..f73493e41 100644 --- a/test/integration/concrete/lockup/burn/burn.t.sol +++ b/test/integration/concrete/lockup/burn/burn.t.sol @@ -83,7 +83,9 @@ abstract contract Burn_Integration_Concrete_Test is Integration_Test, Lockup_Int givenStreamHasNotBeenDepleted { vm.warp({ timestamp: defaults.CLIFF_TIME() }); + changePrank({ msgSender: users.sender }); lockup.cancel(streamId); + changePrank({ msgSender: users.recipient }); vm.expectRevert(abi.encodeWithSelector(Errors.SablierV2Lockup_StreamNotDepleted.selector, streamId)); lockup.burn(streamId); } diff --git a/test/integration/concrete/lockup/cancel-multiple/cancelMultiple.t.sol b/test/integration/concrete/lockup/cancel-multiple/cancelMultiple.t.sol index 67103ba5d..4aab9c7c5 100644 --- a/test/integration/concrete/lockup/cancel-multiple/cancelMultiple.t.sol +++ b/test/integration/concrete/lockup/cancel-multiple/cancelMultiple.t.sol @@ -72,7 +72,7 @@ abstract contract CancelMultiple_Integration_Concrete_Test is lockup.cancelMultiple(testStreamIds); } - function test_RevertWhen_CallerUnauthorizedAllStreams_ApprovedOperator() + function test_RevertWhen_CallerUnauthorizedAllStreams_Recipient() external whenNotDelegateCalled whenArrayCountNotZero @@ -80,32 +80,8 @@ abstract contract CancelMultiple_Integration_Concrete_Test is givenAllStreamsWarm whenCallerUnauthorized { - // Approve the operator for all streams. + // Make the Recipient the caller in this test. changePrank({ msgSender: users.recipient }); - lockup.setApprovalForAll({ operator: users.operator, approved: true }); - - // Make the approved operator the caller in this test. - changePrank({ msgSender: users.operator }); - - // Run the test. - vm.expectRevert( - abi.encodeWithSelector(Errors.SablierV2Lockup_Unauthorized.selector, testStreamIds[0], users.operator) - ); - lockup.cancelMultiple(testStreamIds); - } - - function test_RevertWhen_CallerUnauthorizedAllStreams_FormerRecipient() - external - whenNotDelegateCalled - whenArrayCountNotZero - givenNoNull - givenAllStreamsWarm - whenCallerUnauthorized - { - // Transfer the streams to Alice. - changePrank({ msgSender: users.recipient }); - lockup.transferFrom({ from: users.recipient, to: users.alice, tokenId: testStreamIds[0] }); - lockup.transferFrom({ from: users.recipient, to: users.alice, tokenId: testStreamIds[1] }); // Run the test. vm.expectRevert( @@ -135,29 +111,7 @@ abstract contract CancelMultiple_Integration_Concrete_Test is lockup.cancelMultiple(streamIds); } - function test_RevertWhen_CallerUnauthorizedSomeStreams_ApprovedOperator() - external - whenNotDelegateCalled - whenArrayCountNotZero - givenNoNull - givenAllStreamsWarm - whenCallerUnauthorized - { - // Approve the operator to handle the first stream. - changePrank({ msgSender: users.recipient }); - lockup.approve({ to: users.operator, tokenId: testStreamIds[0] }); - - // Make the approved operator the caller in this test. - changePrank({ msgSender: users.operator }); - - // Run the test. - vm.expectRevert( - abi.encodeWithSelector(Errors.SablierV2Lockup_Unauthorized.selector, testStreamIds[0], users.operator) - ); - lockup.cancelMultiple(testStreamIds); - } - - function test_RevertWhen_CallerUnauthorizedSomeStreams_FormerRecipient() + function test_RevertWhen_CallerUnauthorizedSomeStreams_Recipient() external whenNotDelegateCalled whenArrayCountNotZero @@ -165,9 +119,8 @@ abstract contract CancelMultiple_Integration_Concrete_Test is givenAllStreamsWarm whenCallerUnauthorized { - // Transfer the first stream to Eve. + // Make the Recipient the caller in this test. changePrank({ msgSender: users.recipient }); - lockup.transferFrom({ from: users.recipient, to: users.alice, tokenId: testStreamIds[0] }); // Run the test. vm.expectRevert( @@ -229,6 +182,7 @@ abstract contract CancelMultiple_Integration_Concrete_Test is streamId: testStreamIds[0], sender: users.sender, recipient: users.recipient, + asset: dai, senderAmount: senderAmount0, recipientAmount: defaults.DEPOSIT_AMOUNT() - senderAmount0 }); @@ -237,6 +191,7 @@ abstract contract CancelMultiple_Integration_Concrete_Test is streamId: testStreamIds[1], sender: users.sender, recipient: users.recipient, + asset: dai, senderAmount: senderAmount1, recipientAmount: defaults.DEPOSIT_AMOUNT() - senderAmount1 }); diff --git a/test/integration/concrete/lockup/cancel-multiple/cancelMultiple.tree b/test/integration/concrete/lockup/cancel-multiple/cancelMultiple.tree index 2b7439c4b..2cd6a411f 100644 --- a/test/integration/concrete/lockup/cancel-multiple/cancelMultiple.tree +++ b/test/integration/concrete/lockup/cancel-multiple/cancelMultiple.tree @@ -18,16 +18,12 @@ cancelMultiple.t.sol ├── when the caller is unauthorized for all streams │ ├── when the caller is a malicious third party │ │ └── it should revert - │ ├── when the caller is an approved third party - │ │ └── it should revert - │ └── when the caller is a former recipient + │ └── when the caller is the recipient │ └── it should revert ├── when the caller is unauthorized for some streams │ ├── when the caller is a malicious third party │ │ └── it should revert - │ ├── when the caller is an approved third party - │ │ └── it should revert - │ └── when the caller is a former recipient + │ └── when the caller is the recipient │ └── it should revert └── when the caller is authorized for all streams ├── given all streams are not cancelable @@ -35,13 +31,7 @@ cancelMultiple.t.sol ├── given some streams are not cancelable │ └── it should revert └── given all streams are cancelable - ├── when the caller is the sender - │ ├── it should cancel the streams - │ ├── it should refund the sender - │ ├── it should update the refunded amounts - │ └── it should emit {CancelLockupStream} events - └── when the caller is the recipient - ├── it should cancel the streams - ├── it should refund the sender - ├── it should update the refunded amounts - └── it should emit {CancelLockupStream} events + ├── it should cancel the streams + ├── it should refund the sender + ├── it should update the refunded amounts + └── it should emit {CancelLockupStream} events diff --git a/test/integration/concrete/lockup/cancel/cancel.t.sol b/test/integration/concrete/lockup/cancel/cancel.t.sol index 50b5e5012..616e864ee 100644 --- a/test/integration/concrete/lockup/cancel/cancel.t.sol +++ b/test/integration/concrete/lockup/cancel/cancel.t.sol @@ -3,7 +3,6 @@ pragma solidity >=0.8.19 <0.9.0; import { ISablierV2Lockup } from "src/interfaces/ISablierV2Lockup.sol"; import { ISablierV2LockupRecipient } from "src/interfaces/hooks/ISablierV2LockupRecipient.sol"; -import { ISablierV2LockupSender } from "src/interfaces/hooks/ISablierV2LockupSender.sol"; import { Errors } from "src/libraries/Errors.sol"; import { Lockup } from "src/types/DataTypes.sol"; @@ -65,37 +64,15 @@ abstract contract Cancel_Integration_Concrete_Test is Integration_Test, Cancel_I lockup.cancel(defaultStreamId); } - function test_RevertWhen_CallerUnauthorized_ApprovedOperator() + function test_RevertWhen_CallerUnauthorized_Recipient() external whenNotDelegateCalled givenNotNull givenStreamWarm whenCallerUnauthorized { - // Approve Alice for the stream. + // Make the Recipient the caller in this test. changePrank({ msgSender: users.recipient }); - lockup.approve({ to: users.operator, tokenId: defaultStreamId }); - - // Make Alice the caller in this test. - changePrank({ msgSender: users.operator }); - - // Run the test. - vm.expectRevert( - abi.encodeWithSelector(Errors.SablierV2Lockup_Unauthorized.selector, defaultStreamId, users.operator) - ); - lockup.cancel(defaultStreamId); - } - - function test_RevertWhen_CallerUnauthorized_FormerRecipient() - external - whenNotDelegateCalled - givenNotNull - givenStreamWarm - whenCallerUnauthorized - { - // Transfer the stream to Alice. - changePrank({ msgSender: users.recipient }); - lockup.transferFrom({ from: users.recipient, to: users.alice, tokenId: defaultStreamId }); // Run the test. vm.expectRevert( @@ -133,7 +110,7 @@ abstract contract Cancel_Integration_Concrete_Test is Integration_Test, Cancel_I assertFalse(isCancelable, "isCancelable"); } - function test_Cancel_CallerSender_RecipientNotContract() + function test_Cancel_RecipientNotContract() external whenNotDelegateCalled givenNotNull @@ -141,7 +118,6 @@ abstract contract Cancel_Integration_Concrete_Test is Integration_Test, Cancel_I whenCallerAuthorized givenStreamCancelable givenStatusStreaming - whenCallerSender { lockup.cancel(defaultStreamId); Lockup.Status actualStatus = lockup.statusOf(defaultStreamId); @@ -149,7 +125,7 @@ abstract contract Cancel_Integration_Concrete_Test is Integration_Test, Cancel_I assertEq(actualStatus, expectedStatus); } - function test_Cancel_CallerSender_RecipientDoesNotImplementHook() + function test_Cancel_RecipientDoesNotImplementHook() external whenNotDelegateCalled givenNotNull @@ -157,7 +133,6 @@ abstract contract Cancel_Integration_Concrete_Test is Integration_Test, Cancel_I whenCallerAuthorized givenStreamCancelable givenStatusStreaming - whenCallerSender givenRecipientContract { // Create the stream with a no-op contract as the recipient. @@ -182,7 +157,7 @@ abstract contract Cancel_Integration_Concrete_Test is Integration_Test, Cancel_I assertEq(actualStatus, expectedStatus); } - function test_Cancel_CallerSender_RecipientReverts() + function test_Cancel_RecipientReverts() external whenNotDelegateCalled givenNotNull @@ -190,7 +165,6 @@ abstract contract Cancel_Integration_Concrete_Test is Integration_Test, Cancel_I whenCallerAuthorized givenStreamCancelable givenStatusStreaming - whenCallerSender givenRecipientContract givenRecipientImplementsHook { @@ -216,7 +190,7 @@ abstract contract Cancel_Integration_Concrete_Test is Integration_Test, Cancel_I assertEq(actualStatus, expectedStatus); } - function test_Cancel_CallerSender_RecipientReentrancy() + function test_Cancel_RecipientReentrancy() external whenNotDelegateCalled givenNotNull @@ -224,7 +198,6 @@ abstract contract Cancel_Integration_Concrete_Test is Integration_Test, Cancel_I whenCallerAuthorized givenStreamCancelable givenStatusStreaming - whenCallerSender givenRecipientContract givenRecipientImplementsHook whenRecipientDoesNotRevert @@ -251,7 +224,7 @@ abstract contract Cancel_Integration_Concrete_Test is Integration_Test, Cancel_I assertEq(actualStatus, expectedStatus); } - function test_Cancel_CallerSender() + function test_Cancel() external whenNotDelegateCalled givenNotNull @@ -259,7 +232,6 @@ abstract contract Cancel_Integration_Concrete_Test is Integration_Test, Cancel_I whenCallerAuthorized givenStreamCancelable givenStatusStreaming - whenCallerSender givenRecipientContract givenRecipientImplementsHook whenRecipientDoesNotRevert @@ -283,7 +255,7 @@ abstract contract Cancel_Integration_Concrete_Test is Integration_Test, Cancel_I // Expect the relevant events to be emitted. vm.expectEmit({ emitter: address(lockup) }); - emit CancelLockupStream(streamId, users.sender, address(goodRecipient), senderAmount, recipientAmount); + emit CancelLockupStream(streamId, users.sender, address(goodRecipient), dai, senderAmount, recipientAmount); vm.expectEmit({ emitter: address(lockup) }); emit MetadataUpdate({ _tokenId: streamId }); @@ -309,181 +281,4 @@ abstract contract Cancel_Integration_Concrete_Test is Integration_Test, Cancel_I address expectedNFTOwner = address(goodRecipient); assertEq(actualNFTOwner, expectedNFTOwner, "NFT owner"); } - - function test_Cancel_CallerRecipient_SenderNotContract() - external - whenNotDelegateCalled - givenNotNull - givenStreamWarm - whenCallerAuthorized - givenStreamCancelable - givenStatusStreaming - whenCallerRecipient - { - lockup.cancel(defaultStreamId); - Lockup.Status actualStatus = lockup.statusOf(defaultStreamId); - Lockup.Status expectedStatus = Lockup.Status.CANCELED; - assertEq(actualStatus, expectedStatus); - } - - function test_Cancel_CallerRecipient_SenderDoesNotImplementHook() - external - whenNotDelegateCalled - givenNotNull - givenStreamWarm - whenCallerAuthorized - givenStreamCancelable - givenStatusStreaming - whenCallerRecipient - givenSenderContract - { - // Create a stream with a no-op contract as the stream's sender. - uint256 streamId = createDefaultStreamWithSender(address(noop)); - - // Expect a call to the hook. - uint128 senderAmount = lockup.refundableAmountOf(streamId); - uint128 recipientAmount = lockup.withdrawableAmountOf(streamId); - vm.expectCall( - address(noop), - abi.encodeCall( - ISablierV2LockupSender.onStreamCanceled, (streamId, users.recipient, senderAmount, recipientAmount) - ) - ); - - // Cancel the stream. - lockup.cancel(streamId); - - // Assert that the stream's status is "CANCELED". - Lockup.Status actualStatus = lockup.statusOf(streamId); - Lockup.Status expectedStatus = Lockup.Status.CANCELED; - assertEq(actualStatus, expectedStatus); - } - - function test_Cancel_CallerRecipient_SenderReverts() - external - whenNotDelegateCalled - givenNotNull - givenStreamWarm - whenCallerAuthorized - givenStreamCancelable - givenStatusStreaming - whenCallerRecipient - givenSenderContract - givenSenderImplementsHook - { - // Create a stream with a reverting contract as the stream's sender. - uint256 streamId = createDefaultStreamWithSender(address(revertingSender)); - - // Expect a call to the hook. - uint128 senderAmount = lockup.refundableAmountOf(streamId); - uint128 recipientAmount = lockup.withdrawableAmountOf(streamId); - vm.expectCall( - address(revertingSender), - abi.encodeCall( - ISablierV2LockupSender.onStreamCanceled, (streamId, users.recipient, senderAmount, recipientAmount) - ) - ); - - // Cancel the stream. - lockup.cancel(streamId); - - // Assert that the stream's status is "CANCELED". - Lockup.Status actualStatus = lockup.statusOf(streamId); - Lockup.Status expectedStatus = Lockup.Status.CANCELED; - assertEq(actualStatus, expectedStatus); - } - - function test_Cancel_CallerRecipient_SenderReentrancy() - external - whenNotDelegateCalled - givenNotNull - givenStreamWarm - whenCallerAuthorized - givenStreamCancelable - givenStatusStreaming - whenCallerRecipient - givenSenderContract - givenSenderImplementsHook - whenSenderDoesNotRevert - { - // Create a stream with a reentrant contract as the stream's sender. - uint256 streamId = createDefaultStreamWithSender(address(reentrantSender)); - - // Expect a call to the hook. - uint128 senderAmount = lockup.refundableAmountOf(streamId); - uint128 recipientAmount = lockup.withdrawableAmountOf(streamId); - vm.expectCall( - address(reentrantSender), - abi.encodeCall( - ISablierV2LockupSender.onStreamCanceled, (streamId, users.recipient, senderAmount, recipientAmount) - ) - ); - - // Cancel the stream. - lockup.cancel(streamId); - - // Assert that the stream's status is "CANCELED". - Lockup.Status actualStatus = lockup.statusOf(streamId); - Lockup.Status expectedStatus = Lockup.Status.CANCELED; - assertEq(actualStatus, expectedStatus); - } - - function test_Cancel_CallerRecipient() - external - whenNotDelegateCalled - givenNotNull - givenStreamWarm - whenCallerAuthorized - givenStreamCancelable - givenStatusStreaming - whenCallerRecipient - givenSenderContract - givenSenderImplementsHook - whenSenderDoesNotRevert - whenNoSenderReentrancy - { - // Create the stream. - uint256 streamId = createDefaultStreamWithSender(address(goodSender)); - - // Expect the assets to be refunded to the sender contract. - uint128 senderAmount = lockup.refundableAmountOf(streamId); - expectCallToTransfer({ to: address(goodSender), amount: senderAmount }); - - // Expect a call to the hook. - uint128 recipientAmount = lockup.withdrawableAmountOf(streamId); - vm.expectCall( - address(goodSender), - abi.encodeCall( - ISablierV2LockupSender.onStreamCanceled, (streamId, users.recipient, senderAmount, recipientAmount) - ) - ); - - // Expect the relevant events to be emitted. - vm.expectEmit({ emitter: address(lockup) }); - emit CancelLockupStream(streamId, address(goodSender), users.recipient, senderAmount, recipientAmount); - vm.expectEmit({ emitter: address(lockup) }); - emit MetadataUpdate({ _tokenId: streamId }); - - // Cancel the stream. - lockup.cancel(streamId); - - // Assert that the stream's status is "CANCELED". - Lockup.Status actualStatus = lockup.statusOf(streamId); - Lockup.Status expectedStatus = Lockup.Status.CANCELED; - assertEq(actualStatus, expectedStatus); - - // Assert that the stream is not cancelable anymore. - bool isCancelable = lockup.isCancelable(streamId); - assertFalse(isCancelable, "isCancelable"); - - // Assert that the refunded amount has been updated. - uint128 actualRefundedAmount = lockup.getRefundedAmount(streamId); - uint128 expectedRefundedAmount = senderAmount; - assertEq(actualRefundedAmount, expectedRefundedAmount, "refundedAmount"); - - // Assert that the NFT has not been burned. - address actualNFTOwner = lockup.ownerOf({ tokenId: streamId }); - address expectedNFTOwner = users.recipient; - assertEq(actualNFTOwner, expectedNFTOwner, "NFT owner"); - } } diff --git a/test/integration/concrete/lockup/cancel/cancel.tree b/test/integration/concrete/lockup/cancel/cancel.tree index c1fda77c5..491c3f2e3 100644 --- a/test/integration/concrete/lockup/cancel/cancel.tree +++ b/test/integration/concrete/lockup/cancel/cancel.tree @@ -16,9 +16,7 @@ cancel.t.sol ├── when the caller is unauthorized │ ├── when the caller is a malicious third party │ │ └── it should revert - │ ├── when the caller is an approved third party - │ │ └── it should revert - │ └── when the caller is a former recipient + │ └── when the caller is the recipient │ └── it should revert └── when the caller is authorized ├── given the stream is not cancelable @@ -29,65 +27,34 @@ cancel.t.sol │ ├── it should mark the stream as depleted │ └── it should make the stream not cancelable └── given the stream's status is "STREAMING" - ├── when the caller is the sender - │ ├── given the recipient is not a contract - │ │ ├── it should cancel the stream - │ │ └── it should mark the stream as canceled - │ └── given the recipient is a contract - │ ├── given the recipient does not implement the hook - │ │ ├── it should cancel the stream - │ │ ├── it should mark the stream as canceled - │ │ ├── it should call the recipient hook - │ │ └── it should ignore the revert - │ └── given the recipient implements the hook - │ ├── when the recipient reverts - │ │ ├── it should cancel the stream - │ │ ├── it should mark the stream as canceled - │ │ ├── it should call the recipient hook - │ │ └── it should ignore the revert - │ └── when the recipient does not revert - │ ├── when there is reentrancy - │ │ ├── it should cancel the stream - │ │ ├── it should mark the stream as canceled - │ │ ├── it should call the recipient hook - │ │ └── it should ignore the revert - │ └── when there is no reentrancy - │ ├── it should cancel the stream - │ ├── it should mark the stream as canceled - │ ├── it should make the stream not cancelable - │ ├── it should update the refunded amount - │ ├── it should refund the sender - │ ├── it should call the recipient hook - │ ├── it should emit a {CancelLockupStream} event - │ └── it should emit a {MetadataUpdate} event - └── when the caller is the recipient - ├── given the sender is not a contract + ├── given the recipient is not a contract + │ ├── it should cancel the stream + │ └── it should mark the stream as canceled + └── given the recipient is a contract + ├── given the recipient does not implement the hook │ ├── it should cancel the stream - │ └── it should mark the stream as canceled - └── given the sender is a contract - ├── given the sender does not implement the hook - │ ├── it should cancel the stream - │ ├── it should mark the stream as canceled - │ ├── it should call the sender hook - │ └── it should ignore the revert - └── given the sender implements the hook - ├── when the sender reverts + │ ├── it should mark the stream as canceled + │ ├── it should call the recipient hook + │ └── it should ignore the revert + └── given the recipient implements the hook + ├── when the recipient reverts + │ ├── it should cancel the stream + │ ├── it should mark the stream as canceled + │ ├── it should call the recipient hook + │ └── it should ignore the revert + └── when the recipient does not revert + ├── when there is reentrancy │ ├── it should cancel the stream │ ├── it should mark the stream as canceled - │ ├── it should call the sender hook + │ ├── it should call the recipient hook │ └── it should ignore the revert - └── when the sender does not revert - ├── when there is reentrancy - │ ├── it should cancel the stream - │ ├── it should mark the stream as canceled - │ ├── it should call the sender hook - │ └── it should ignore the revert - └── when there is no reentrancy - ├── it should cancel the stream - ├── it should mark the stream as canceled - ├── it should make the stream not cancelable - ├── it should update the refunded amount - ├── it should refund the sender - ├── it should call the sender hook - ├── it should emit a {MetadataUpdate} event - └── it should emit a {CancelLockupStream} event + └── when there is no reentrancy + ├── it should cancel the stream + ├── it should mark the stream as canceled + ├── it should make the stream not cancelable + ├── it should update the refunded amount + ├── it should refund the sender + ├── it should call the recipient hook + ├── it should emit a {MetadataUpdate} event + └── it should emit a {CancelLockupStream} event + \ No newline at end of file diff --git a/test/integration/concrete/lockup/withdraw-max-and-transfer/withdrawMaxAndTransfer.t.sol b/test/integration/concrete/lockup/withdraw-max-and-transfer/withdrawMaxAndTransfer.t.sol index 9709e5827..5d2faa48d 100644 --- a/test/integration/concrete/lockup/withdraw-max-and-transfer/withdrawMaxAndTransfer.t.sol +++ b/test/integration/concrete/lockup/withdraw-max-and-transfer/withdrawMaxAndTransfer.t.sol @@ -100,7 +100,12 @@ abstract contract WithdrawMaxAndTransfer_Integration_Concrete_Test is // Expect the relevant events to be emitted. vm.expectEmit({ emitter: address(lockup) }); - emit WithdrawFromLockupStream({ streamId: defaultStreamId, to: users.recipient, amount: withdrawAmount }); + emit WithdrawFromLockupStream({ + streamId: defaultStreamId, + to: users.recipient, + amount: withdrawAmount, + asset: dai + }); vm.expectEmit({ emitter: address(lockup) }); emit Transfer({ from: users.recipient, to: users.alice, tokenId: defaultStreamId }); vm.expectEmit({ emitter: address(lockup) }); diff --git a/test/integration/concrete/lockup/withdraw-max/withdrawMax.t.sol b/test/integration/concrete/lockup/withdraw-max/withdrawMax.t.sol index e6f83c856..2721c5654 100644 --- a/test/integration/concrete/lockup/withdraw-max/withdrawMax.t.sol +++ b/test/integration/concrete/lockup/withdraw-max/withdrawMax.t.sol @@ -23,7 +23,8 @@ abstract contract WithdrawMax_Integration_Concrete_Test is Integration_Test, Wit emit WithdrawFromLockupStream({ streamId: defaultStreamId, to: users.recipient, - amount: defaults.DEPOSIT_AMOUNT() + amount: defaults.DEPOSIT_AMOUNT(), + asset: dai }); // Make the max withdrawal. @@ -61,7 +62,12 @@ abstract contract WithdrawMax_Integration_Concrete_Test is Integration_Test, Wit // Expect the relevant event to be emitted. vm.expectEmit({ emitter: address(lockup) }); - emit WithdrawFromLockupStream({ streamId: defaultStreamId, to: users.recipient, amount: withdrawAmount }); + emit WithdrawFromLockupStream({ + streamId: defaultStreamId, + to: users.recipient, + amount: withdrawAmount, + asset: dai + }); // Make the max withdrawal. lockup.withdrawMax({ streamId: defaultStreamId, to: users.recipient }); diff --git a/test/integration/concrete/lockup/withdraw-multiple/withdrawMultiple.t.sol b/test/integration/concrete/lockup/withdraw-multiple/withdrawMultiple.t.sol index 25eb3b761..33173b6a5 100644 --- a/test/integration/concrete/lockup/withdraw-multiple/withdrawMultiple.t.sol +++ b/test/integration/concrete/lockup/withdraw-multiple/withdrawMultiple.t.sol @@ -294,7 +294,7 @@ abstract contract WithdrawMultiple_Integration_Concrete_Test is vm.warp({ timestamp: earlyStopTime }); // Cancel the 3rd stream. - changePrank({ msgSender: users.recipient }); + changePrank({ msgSender: users.sender }); lockup.cancel(testStreamIds[2]); // Run the test with the caller provided in {whenCallerAuthorizedAllStreams}. @@ -307,11 +307,26 @@ abstract contract WithdrawMultiple_Integration_Concrete_Test is // Expect the relevant events to be emitted. vm.expectEmit({ emitter: address(lockup) }); - emit WithdrawFromLockupStream({ streamId: testStreamIds[0], to: users.recipient, amount: testAmounts[0] }); + emit WithdrawFromLockupStream({ + streamId: testStreamIds[0], + to: users.recipient, + asset: dai, + amount: testAmounts[0] + }); vm.expectEmit({ emitter: address(lockup) }); - emit WithdrawFromLockupStream({ streamId: testStreamIds[1], to: users.recipient, amount: testAmounts[1] }); + emit WithdrawFromLockupStream({ + streamId: testStreamIds[1], + to: users.recipient, + asset: dai, + amount: testAmounts[1] + }); vm.expectEmit({ emitter: address(lockup) }); - emit WithdrawFromLockupStream({ streamId: testStreamIds[2], to: users.recipient, amount: testAmounts[2] }); + emit WithdrawFromLockupStream({ + streamId: testStreamIds[2], + to: users.recipient, + asset: dai, + amount: testAmounts[2] + }); // Make the withdrawals. lockup.withdrawMultiple({ streamIds: testStreamIds, to: users.recipient, amounts: testAmounts }); diff --git a/test/integration/concrete/lockup/withdraw/withdraw.t.sol b/test/integration/concrete/lockup/withdraw/withdraw.t.sol index 88faa15d5..fbbeca2f6 100644 --- a/test/integration/concrete/lockup/withdraw/withdraw.t.sol +++ b/test/integration/concrete/lockup/withdraw/withdraw.t.sol @@ -296,7 +296,12 @@ abstract contract Withdraw_Integration_Concrete_Test is Integration_Test, Withdr // Expect the relevant event to be emitted. vm.expectEmit({ emitter: address(lockup) }); - emit WithdrawFromLockupStream({ streamId: defaultStreamId, to: users.recipient, amount: withdrawAmount }); + emit WithdrawFromLockupStream({ + streamId: defaultStreamId, + to: users.recipient, + asset: dai, + amount: withdrawAmount + }); // Make the withdrawal. lockup.withdraw({ streamId: defaultStreamId, to: users.recipient, amount: withdrawAmount }); @@ -491,7 +496,12 @@ abstract contract Withdraw_Integration_Concrete_Test is Integration_Test, Withdr // Expect the relevant events to be emitted. vm.expectEmit({ emitter: address(lockup) }); - emit WithdrawFromLockupStream({ streamId: streamId, to: address(goodRecipient), amount: withdrawAmount }); + emit WithdrawFromLockupStream({ + streamId: streamId, + to: address(goodRecipient), + asset: dai, + amount: withdrawAmount + }); vm.expectEmit({ emitter: address(lockup) }); emit MetadataUpdate({ _tokenId: streamId }); diff --git a/test/integration/concrete/nft-descriptor/generateAccentColor.t.sol b/test/integration/concrete/nft-descriptor/generateAccentColor.t.sol index f1edb0951..4e956be9c 100644 --- a/test/integration/concrete/nft-descriptor/generateAccentColor.t.sol +++ b/test/integration/concrete/nft-descriptor/generateAccentColor.t.sol @@ -7,7 +7,7 @@ contract GenerateAccentColor_Integration_Concrete_Test is NFTDescriptor_Integrat function test_GenerateAccentColor() external { // Passing a dummy contract instead of a real Sablier contract to make this test easy to maintain. string memory actualColor = nftDescriptorMock.generateAccentColor_({ sablier: address(noop), streamId: 1337 }); - string memory expectedColor = "hsl(6,51%,82%)"; + string memory expectedColor = "hsl(302,69%,44%)"; assertEq(actualColor, expectedColor, "accentColor"); } } diff --git a/test/integration/fuzz/lockup-dynamic/withdraw.t.sol b/test/integration/fuzz/lockup-dynamic/withdraw.t.sol index 04177f618..196ac96cb 100644 --- a/test/integration/fuzz/lockup-dynamic/withdraw.t.sol +++ b/test/integration/fuzz/lockup-dynamic/withdraw.t.sol @@ -98,7 +98,7 @@ contract Withdraw_LockupDynamic_Integration_Fuzz_Test is // Expect the relevant events to be emitted. vm.expectEmit({ emitter: address(lockupDynamic) }); - emit WithdrawFromLockupStream({ streamId: vars.streamId, to: params.to, amount: vars.withdrawAmount }); + emit WithdrawFromLockupStream({ streamId: vars.streamId, to: params.to, amount: vars.withdrawAmount, asset: dai }); vm.expectEmit({ emitter: address(lockupDynamic) }); emit MetadataUpdate({ _tokenId: vars.streamId }); diff --git a/test/integration/fuzz/lockup/cancel.t.sol b/test/integration/fuzz/lockup/cancel.t.sol index f83f7ec00..d59082cb5 100644 --- a/test/integration/fuzz/lockup/cancel.t.sol +++ b/test/integration/fuzz/lockup/cancel.t.sol @@ -41,7 +41,7 @@ abstract contract Cancel_Integration_Fuzz_Test is Integration_Test, Cancel_Integ /// /// - Multiple values for the current time /// - With and without withdrawals - function testFuzz_Cancel_CallerSender( + function testFuzz_Cancel( uint256 timeJump, uint128 withdrawAmount ) @@ -52,7 +52,6 @@ abstract contract Cancel_Integration_Fuzz_Test is Integration_Test, Cancel_Integ whenCallerAuthorized givenStreamCancelable givenStatusStreaming - whenCallerSender givenRecipientContract givenRecipientImplementsHook whenRecipientDoesNotRevert @@ -82,7 +81,7 @@ abstract contract Cancel_Integration_Fuzz_Test is Integration_Test, Cancel_Integ // Expect the relevant events to be emitted. uint128 recipientAmount = lockup.withdrawableAmountOf(streamId); vm.expectEmit({ emitter: address(lockup) }); - emit CancelLockupStream(streamId, users.sender, address(goodRecipient), senderAmount, recipientAmount); + emit CancelLockupStream(streamId, users.sender, address(goodRecipient), dai, senderAmount, recipientAmount); vm.expectEmit({ emitter: address(lockup) }); emit MetadataUpdate({ _tokenId: streamId }); @@ -103,69 +102,4 @@ abstract contract Cancel_Integration_Fuzz_Test is Integration_Test, Cancel_Integ address expectedNFTOwner = address(goodRecipient); assertEq(actualNFTOwner, expectedNFTOwner, "NFT owner"); } - - /// @dev Given enough fuzz runs, all of the following scenarios will be fuzzed: - /// - /// - Multiple values for the current time - /// - With and without withdrawals - function testFuzz_Cancel_CallerRecipient( - uint256 timeJump, - uint128 withdrawAmount - ) - external - whenNotDelegateCalled - givenNotNull - givenStreamWarm - whenCallerAuthorized - givenStreamCancelable - givenStatusStreaming - whenCallerRecipient - givenSenderContract - givenSenderImplementsHook - whenSenderDoesNotRevert - whenNoSenderReentrancy - { - timeJump = _bound(timeJump, defaults.CLIFF_DURATION(), defaults.TOTAL_DURATION() - 1); - - // Create the stream. - uint256 streamId = createDefaultStreamWithSender(address(goodSender)); - - // Simulate the passage of time. - vm.warp({ timestamp: defaults.START_TIME() + timeJump }); - - // Bound the withdraw amount. - uint128 streamedAmount = lockup.streamedAmountOf(streamId); - withdrawAmount = boundUint128(withdrawAmount, 0, streamedAmount - 1); - - // Make the withdrawal only if the amount is greater than zero. - if (withdrawAmount > 0) { - lockup.withdraw({ streamId: streamId, to: users.recipient, amount: withdrawAmount }); - } - - // Expect the assets to be refunded to the sender contract. - uint128 senderAmount = lockup.refundableAmountOf(streamId); - expectCallToTransfer({ to: address(goodSender), amount: senderAmount }); - - // Expect the relevant event to be emitted. - uint128 recipientAmount = lockup.withdrawableAmountOf(streamId); - vm.expectEmit({ emitter: address(lockup) }); - emit CancelLockupStream(streamId, address(goodSender), users.recipient, senderAmount, recipientAmount); - - // Cancel the stream. - lockup.cancel(streamId); - - // Assert that the stream's status is "CANCELED". - Lockup.Status actualStatus = lockup.statusOf(streamId); - Lockup.Status expectedStatus = Lockup.Status.CANCELED; - assertEq(actualStatus, expectedStatus); - - // Assert that the stream is not cancelable anymore. - bool isCancelable = lockup.isCancelable(streamId); - assertFalse(isCancelable, "isCancelable"); - - // Assert that the NFT has not been burned. - address actualNFTOwner = lockup.ownerOf({ tokenId: streamId }); - address expectedNFTOwner = users.recipient; - assertEq(actualNFTOwner, expectedNFTOwner, "NFT owner"); - } } diff --git a/test/integration/fuzz/lockup/cancelMultiple.t.sol b/test/integration/fuzz/lockup/cancelMultiple.t.sol index e78a71803..a5333106e 100644 --- a/test/integration/fuzz/lockup/cancelMultiple.t.sol +++ b/test/integration/fuzz/lockup/cancelMultiple.t.sol @@ -48,6 +48,7 @@ abstract contract CancelMultiple_Integration_Fuzz_Test is Integration_Test, Canc streamId: streamIds[0], sender: users.sender, recipient: users.recipient, + asset: dai, senderAmount: senderAmount0, recipientAmount: defaults.DEPOSIT_AMOUNT() - senderAmount0 }); @@ -56,6 +57,7 @@ abstract contract CancelMultiple_Integration_Fuzz_Test is Integration_Test, Canc streamId: streamIds[1], sender: users.sender, recipient: users.recipient, + asset: dai, senderAmount: senderAmount1, recipientAmount: defaults.DEPOSIT_AMOUNT() - senderAmount1 }); diff --git a/test/integration/fuzz/lockup/withdraw.t.sol b/test/integration/fuzz/lockup/withdraw.t.sol index fea5abecb..3ef2815c4 100644 --- a/test/integration/fuzz/lockup/withdraw.t.sol +++ b/test/integration/fuzz/lockup/withdraw.t.sol @@ -75,7 +75,9 @@ abstract contract Withdraw_Integration_Fuzz_Test is Integration_Test, Withdraw_I vm.warp({ timestamp: defaults.START_TIME() + timeJump }); // Cancel the stream. + changePrank({ msgSender: users.sender }); lockup.cancel({ streamId: defaultStreamId }); + changePrank({ msgSender: users.recipient }); // Bound the withdraw amount. uint128 withdrawableAmount = lockup.withdrawableAmountOf(defaultStreamId); @@ -86,7 +88,7 @@ abstract contract Withdraw_Integration_Fuzz_Test is Integration_Test, Withdraw_I // Expect the relevant events to be emitted. vm.expectEmit({ emitter: address(lockup) }); - emit WithdrawFromLockupStream(defaultStreamId, to, withdrawAmount); + emit WithdrawFromLockupStream(defaultStreamId, to, dai, withdrawAmount); vm.expectEmit({ emitter: address(lockup) }); emit MetadataUpdate({ _tokenId: defaultStreamId }); @@ -150,7 +152,7 @@ abstract contract Withdraw_Integration_Fuzz_Test is Integration_Test, Withdraw_I // Expect the relevant events to be emitted. vm.expectEmit({ emitter: address(lockup) }); - emit WithdrawFromLockupStream(defaultStreamId, to, withdrawAmount); + emit WithdrawFromLockupStream(defaultStreamId, to, dai, withdrawAmount); vm.expectEmit({ emitter: address(lockup) }); emit MetadataUpdate({ _tokenId: defaultStreamId }); diff --git a/test/integration/fuzz/lockup/withdrawMax.t.sol b/test/integration/fuzz/lockup/withdrawMax.t.sol index de6199755..60b631199 100644 --- a/test/integration/fuzz/lockup/withdrawMax.t.sol +++ b/test/integration/fuzz/lockup/withdrawMax.t.sol @@ -25,6 +25,7 @@ abstract contract WithdrawMax_Integration_Fuzz_Test is Integration_Test, Withdra emit WithdrawFromLockupStream({ streamId: defaultStreamId, to: users.recipient, + asset: dai, amount: defaults.DEPOSIT_AMOUNT() }); @@ -65,7 +66,12 @@ abstract contract WithdrawMax_Integration_Fuzz_Test is Integration_Test, Withdra // Expect the relevant event to be emitted. vm.expectEmit({ emitter: address(lockup) }); - emit WithdrawFromLockupStream({ streamId: defaultStreamId, to: users.recipient, amount: withdrawAmount }); + emit WithdrawFromLockupStream({ + streamId: defaultStreamId, + to: users.recipient, + asset: dai, + amount: withdrawAmount + }); // Make the max withdrawal. lockup.withdrawMax({ streamId: defaultStreamId, to: users.recipient }); diff --git a/test/integration/fuzz/lockup/withdrawMaxAndTransfer.t.sol b/test/integration/fuzz/lockup/withdrawMaxAndTransfer.t.sol index 00ddfca1d..8aef73118 100644 --- a/test/integration/fuzz/lockup/withdrawMaxAndTransfer.t.sol +++ b/test/integration/fuzz/lockup/withdrawMaxAndTransfer.t.sol @@ -42,7 +42,12 @@ abstract contract WithdrawMaxAndTransfer_Integration_Fuzz_Test is // Expect the relevant event to be emitted. vm.expectEmit({ emitter: address(lockup) }); - emit WithdrawFromLockupStream({ streamId: defaultStreamId, to: users.recipient, amount: withdrawAmount }); + emit WithdrawFromLockupStream({ + streamId: defaultStreamId, + to: users.recipient, + asset: dai, + amount: withdrawAmount + }); } // Expect the relevant event to be emitted. diff --git a/test/integration/fuzz/lockup/withdrawMultiple.t.sol b/test/integration/fuzz/lockup/withdrawMultiple.t.sol index 8b38c8cdd..eff464020 100644 --- a/test/integration/fuzz/lockup/withdrawMultiple.t.sol +++ b/test/integration/fuzz/lockup/withdrawMultiple.t.sol @@ -64,9 +64,9 @@ abstract contract WithdrawMultiple_Integration_Fuzz_Test is // Expect the relevant events to be emitted. vm.expectEmit({ emitter: address(lockup) }); - emit WithdrawFromLockupStream({ streamId: ongoingStreamId, to: to, amount: ongoingWithdrawAmount }); + emit WithdrawFromLockupStream({ streamId: ongoingStreamId, to: to, asset: dai, amount: ongoingWithdrawAmount }); vm.expectEmit({ emitter: address(lockup) }); - emit WithdrawFromLockupStream({ streamId: settledStreamId, to: to, amount: settledWithdrawAmount }); + emit WithdrawFromLockupStream({ streamId: settledStreamId, to: to, asset: dai, amount: settledWithdrawAmount }); // Make the withdrawals. uint256[] memory streamIds = Solarray.uint256s(ongoingStreamId, settledStreamId); diff --git a/test/integration/shared/lockup/cancel.t.sol b/test/integration/shared/lockup/cancel.t.sol index b808ab233..eba14f6ac 100644 --- a/test/integration/shared/lockup/cancel.t.sol +++ b/test/integration/shared/lockup/cancel.t.sol @@ -8,7 +8,7 @@ abstract contract Cancel_Integration_Shared_Test is Lockup_Integration_Shared_Te function setUp() public virtual override { defaultStreamId = createDefaultStream(); - changePrank({ msgSender: users.recipient }); + changePrank({ msgSender: users.sender }); } modifier whenNotDelegateCalled() { @@ -47,11 +47,6 @@ abstract contract Cancel_Integration_Shared_Test is Lockup_Integration_Shared_Te _; } - modifier whenCallerSender() { - changePrank({ msgSender: users.sender }); - _; - } - modifier givenRecipientContract() { _; } @@ -67,25 +62,4 @@ abstract contract Cancel_Integration_Shared_Test is Lockup_Integration_Shared_Te modifier whenNoRecipientReentrancy() { _; } - - modifier whenCallerRecipient() { - changePrank({ msgSender: users.recipient }); - _; - } - - modifier givenSenderContract() { - _; - } - - modifier givenSenderImplementsHook() { - _; - } - - modifier whenSenderDoesNotRevert() { - _; - } - - modifier whenNoSenderReentrancy() { - _; - } } diff --git a/test/integration/shared/lockup/cancelMultiple.t.sol b/test/integration/shared/lockup/cancelMultiple.t.sol index 6efc4de97..f5f366c8b 100644 --- a/test/integration/shared/lockup/cancelMultiple.t.sol +++ b/test/integration/shared/lockup/cancelMultiple.t.sol @@ -48,7 +48,7 @@ abstract contract CancelMultiple_Integration_Shared_Test is Lockup_Integration_S _; vm.warp({ timestamp: originalTime }); createTestStreams(); - changePrank({ msgSender: users.recipient }); + changePrank({ msgSender: users.sender }); _; } diff --git a/test/mocks/hooks/GoodSender.sol b/test/mocks/hooks/GoodSender.sol deleted file mode 100644 index 0710741d8..000000000 --- a/test/mocks/hooks/GoodSender.sol +++ /dev/null @@ -1,21 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-or-later -pragma solidity >=0.8.19; - -import { ISablierV2LockupSender } from "../../../src/interfaces/hooks/ISablierV2LockupSender.sol"; - -contract GoodSender is ISablierV2LockupSender { - function onStreamCanceled( - uint256 streamId, - address recipient, - uint128 senderAmount, - uint128 recipientAmount - ) - external - pure - { - streamId; - recipient; - senderAmount; - recipientAmount; - } -} diff --git a/test/mocks/hooks/ReentrantSender.sol b/test/mocks/hooks/ReentrantSender.sol deleted file mode 100644 index 10baf18e7..000000000 --- a/test/mocks/hooks/ReentrantSender.sol +++ /dev/null @@ -1,22 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-or-later -pragma solidity >=0.8.19; - -import { ISablierV2Lockup } from "../../../src/interfaces/ISablierV2Lockup.sol"; -import { ISablierV2LockupSender } from "../../../src/interfaces/hooks/ISablierV2LockupSender.sol"; - -contract ReentrantSender is ISablierV2LockupSender { - function onStreamCanceled( - uint256 streamId, - address recipient, - uint128 senderAmount, - uint128 recipientAmount - ) - external - { - streamId; - senderAmount; - recipient; - recipientAmount; - ISablierV2Lockup(msg.sender).cancel(streamId); - } -} diff --git a/test/mocks/hooks/RevertingSender.sol b/test/mocks/hooks/RevertingSender.sol deleted file mode 100644 index 1b4863d4e..000000000 --- a/test/mocks/hooks/RevertingSender.sol +++ /dev/null @@ -1,22 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-or-later -pragma solidity >=0.8.19; - -import { ISablierV2LockupSender } from "../../../src/interfaces/hooks/ISablierV2LockupSender.sol"; - -contract RevertingSender is ISablierV2LockupSender { - function onStreamCanceled( - uint256 streamId, - address recipient, - uint128 senderAmount, - uint128 recipientAmount - ) - external - pure - { - streamId; - recipient; - senderAmount; - recipientAmount; - revert("You shall not pass"); - } -} diff --git a/test/utils/Events.sol b/test/utils/Events.sol index f20981d0f..13192c7a9 100644 --- a/test/utils/Events.sol +++ b/test/utils/Events.sol @@ -69,9 +69,10 @@ abstract contract Events { //////////////////////////////////////////////////////////////////////////*/ event CancelLockupStream( - uint256 indexed streamId, + uint256 streamId, address indexed sender, address indexed recipient, + IERC20 indexed asset, uint128 senderAmount, uint128 recipientAmount ); @@ -82,7 +83,7 @@ abstract contract Events { address indexed admin, ISablierV2NFTDescriptor oldNFTDescriptor, ISablierV2NFTDescriptor newNFTDescriptor ); - event WithdrawFromLockupStream(uint256 indexed streamId, address indexed to, uint128 amount); + event WithdrawFromLockupStream(uint256 indexed streamId, address indexed to, IERC20 indexed asset, uint128 amount); /*////////////////////////////////////////////////////////////////////////// SABLIER-V2-LOCKUP-DYNAMIC diff --git a/test/utils/Precompiles.sol b/test/utils/Precompiles.sol index f6185614f..5fca66eed 100644 --- a/test/utils/Precompiles.sol +++ b/test/utils/Precompiles.sol @@ -27,9 +27,9 @@ contract Precompiles { bytes public constant BYTECODE_COMPTROLLER = hex"60803461009857601f6104a638819003918201601f19168301916001600160401b0383118484101761009d5780849260209460405283398101031261009857516001600160a01b0381169081900361009857600080546001600160a01b0319168217815560405191907fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a36103f290816100b48239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe608060408181526004918236101561001657600080fd5b600092833560e01c9182634d81e51d1461039d5750816375829def146102e5578163907a267b14610253578163b5b3ca2c146101ab578163cb01e30e146100f957508063dcf844a7146100c3578063e07df5b4146100a55763f851a4401461007d57600080fd5b346100a157816003193601126100a1576001600160a01b0360209254169051908152f35b5080fd5b50346100a157816003193601126100a1576020906001549051908152f35b50346100a15760203660031901126100a157806020926001600160a01b036100e96103d7565b1681526003845220549051908152f35b9050346101a75760203660031901126101a7576101146103d7565b6001600160a01b03918285541633810361017a575050169081835260026020528083209081549160ff8316159260ff84169060ff1916179055519081527f8cd3a7bc46b26a3b0c07a05a47af78abcaa647626f631d92ea64f8867b23bbec60203392a380f35b84516331b339a960e21b81526001600160a01b039091169181019182523360208301529081906040010390fd5b8280fd5b9050346101a757816003193601126101a7576101c56103d7565b90602435916001600160a01b039182865416338103610226575050907f371789a3d97098f3070492613273a065a7e8a19e009fd1ae92a4b4d4c71ed62d9116928385526003602052808520928084549455815193845260208401523392a380f35b85516331b339a960e21b81526001600160a01b039091169181019182523360208301529081906040010390fd5b919050346101a75760203660031901126101a7578135916001600160a01b038454163381036102b85750507fc059ba3e07a1c4d1fa8845bdb2af2dd85e844684e0a59e6073499e4338788465906001549280600155815193845260208401523392a280f35b82516331b339a960e21b81526001600160a01b039091169181019182523360208301529081906040010390fd5b919050346101a75760203660031901126101a7578135916001600160a01b03918284168094036103995784549283169033820361036d575050507fffffffffffffffffffffffff00000000000000000000000000000000000000001681178255337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808380a380f35b516331b339a960e21b81526001600160a01b039091169181019182523360208301529081906040010390fd5b8480fd5b849084346101a75760203660031901126101a75760ff906020936001600160a01b036103c76103d7565b1681526002855220541615158152f35b600435906001600160a01b03821682036103ed57565b600080fd"; bytes public constant BYTECODE_LOCKUP_DYNAMIC = - hex"60c0346200046e57601f6200600238819003918201601f19168301916001600160401b038311848410176200032b578084926080946040528339810103126200046e5780516001600160a01b038082169290918390036200046e5760208101518281168091036200046e5760408201519183831683036200046e5760600151936200008962000473565b90601d82527f5361626c696572205632204c6f636b75702044796e616d6963204e46540000006020830152620000be62000473565b601181527029a0a116ab1916a627a1a5aaa816a22ca760791b602082015230608052600080546001600160a01b03199081168417825560018054909116909517909455927fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a38051906001600160401b0382116200032b5760035490600182811c9216801562000463575b60208310146200044d5781601f849311620003d8575b50602090601f83116001146200034d5760009262000341575b50508160011b916000199060031b1c1916176003555b80516001600160401b0381116200032b576004918254600181811c9116801562000320575b60208210146200030b579081601f849311620002b3575b50602090601f831160011462000248576000926200023c575b50508160011b916000199060031b1c19161790555b1660018060a01b0319600a541617600a5560a0526001600955604051615b6e9081620004948239608051816155de015260a0518181816112850152614b330152f35b015190503880620001e5565b6000858152602081209350601f198516905b8181106200029a575090846001959493921062000280575b505050811b019055620001fa565b015160001960f88460031b161c1916905538808062000272565b929360206001819287860151815501950193016200025a565b909150836000526020600020601f840160051c8101916020851062000300575b90601f859493920160051c01905b818110620002f05750620001cc565b60008155849350600101620002e1565b9091508190620002d3565b602284634e487b7160e01b6000525260246000fd5b90607f1690620001b5565b634e487b7160e01b600052604160045260246000fd5b0151905038806200017a565b600360009081527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b9350601f198516905b818110620003bf5750908460019594939210620003a5575b505050811b0160035562000190565b015160001960f88460031b161c1916905538808062000396565b929360206001819287860151815501950193016200037e565b60036000529091507fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f840160051c8101916020851062000442575b90601f859493920160051c01905b81811062000432575062000161565b6000815584935060010162000423565b909150819062000415565b634e487b7160e01b600052602260045260246000fd5b91607f16916200014b565b600080fd5b60408051919082016001600160401b038111838210176200032b5760405256fe608080604052600436101561001357600080fd5b60003560e01c90816301ffc9a714612c365750806306fdde0314612b73578063081812fc14612b55578063095ea7b3146129c15780631400ecec1461291c57806316844456146126a15780631c1cdd4c1461263b5780631e99d5691461261d57806323b872dd146125f457806339a73c03146125b157806340e58ee514612219578063425d30dd146121fb57806342842e0e146121ab57806342966c681461204d5780634857501f14611fd75780634869e12d14611f9b5780635fe3b56714611f745780636352211e14611f455780636d0cee7514611eed57806370a0823114611e4357806375829def14611db15780637cad6cd114611cdf5780637de6b1db14611ab65780638659c27014611667578063894e9a0d146113fa5780638bad38dd1461137e5780638f69b993146112fb5780639067b677146112a85780639188ec841461126d57806395d89b411461115f578063a22cb4651461108e578063a2ffb89714610f95578063a6202bf214610e95578063a80fc07114610e40578063ad35efd414610ddd578063b256456914610dbf578063b637b86514610d5f578063b88d4fde14610cd4578063b8a3be6614610c9d578063b971302a14610c4b578063bc063e1a14610c28578063bc2be1be14610bd5578063c156a11d14610ae7578063c33cd35e146109d2578063c87b56dd1461089f578063cc364f4814610805578063d4dbd20b146107b0578063d511609f14610761578063d975dfed14610714578063e985e9c5146106bd578063ea5ead191461066c578063eac8f5b814610600578063f590c176146105d8578063f851a440146105b15763fdd46d601461027c57600080fd5b346104a65760603660031901126104a657600435610298612d63565b6001600160801b036044358181169391928482036104a6576102b86155d4565b6102c183613651565b610599576102e583600052600b6020526001600160a01b0360406000205416331490565b90811580610589575b6105665783600052602094600586526001600160a01b03908160406000205416938061055a575b6105345781831694851561052357881561050b578161033388615696565b16808a116104e75750916103ca939161038f6103638b958a600052600b8c5260026040600020015460801c61597e565b89600052600b8b52600260406000200190836001600160801b031983549260801b1691161781556135e6565b906103ab818b8401511692826040818351169201511690613688565b1611156104b5575b86600052600b885260016040600020015416615630565b80331415806104ab575b61041d575b50817ffa54f9f9bdcdd28778cbb9f78490df6691cc4e2729588e10f4cc0a26c465686a84600080516020615b4283398151915296604051908152a3604051908152a1005b803b156104a6577ffa54f9f9bdcdd28778cbb9f78490df6691cc4e2729588e10f4cc0a26c465686a84600080516020615b428339815191529660008087956084604051809481936313375c3b60e01b83528a60048401523360248401528b60448401528760648401525af1610497575b50965050506103d9565b6104a090612ed6565b3861048d565b600080fd5b50803b15156103d4565b86600052600b8852604060002060018101600160a01b60ff60a01b1982541617905560ff60f01b1981541690556103b3565b876064918b6040519263287ecaef60e21b8452600484015260248301526044820152fd5b6024876040519063d2aabcd960e01b82526004820152fd5b600460405163630d074f60e11b8152fd5b606486838560405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b50838284161415610315565b60405163216caf0d60e01b815260048101859052336024820152604490fd5b0390fd5b5061059384615999565b156102ee565b60248360405190634a5541ef60e01b82526004820152fd5b346104a65760003660031901126104a65760206001600160a01b0360005416604051908152f35b346104a65760203660031901126104a65760206105f66004356136a1565b6040519015158152f35b346104a65760203660031901126104a65760043580600052600b60205260ff60016040600020015460a81c161561065557600052600b60205260206001600160a01b0360016040600020015416604051908152f35b6024906040519062b8e7e760e51b82526004820152fd5b346104a65760403660031901126104a657600080516020615b4283398151915260206004356106b461069c612d63565b6106a583615696565b906106ae6155d4565b836156ce565b604051908152a1005b346104a65760403660031901126104a6576106d6612d4d565b6106de612d63565b906001600160a01b03809116600052600860205260406000209116600052602052602060ff604060002054166040519015158152f35b346104a65760203660031901126104a65760043580600052600b60205260ff60016040600020015460a81c161561065557610750602091615696565b6001600160801b0360405191168152f35b346104a65760203660031901126104a65760043580600052600b60205260ff60016040600020015460a81c161561065557600052600b602052602060026040600020015460801c604051908152f35b346104a65760203660031901126104a65760043580600052600b60205260ff60016040600020015460a81c161561065557600052600b60205260206001600160801b0360036040600020015416604051908152f35b346104a65760203660031901126104a6576004356000602060405161082981612e9d565b828152015280600052600b60205260ff60016040600020015460a81c161561065557600052600b6020526040806000205464ffffffffff82519161086c83612e9d565b818160a01c16835260c81c16602082015261089d825180926020908164ffffffffff91828151168552015116910152565bf35b346104a6576020806003193601126104a657600435906108dd6108d88360005260056020526001600160a01b0360406000205416151590565b612f3c565b60006001600160a01b03600a5416926044604051809581937fe9dc637500000000000000000000000000000000000000000000000000000000835230600484015260248301525afa9182156109c65760009261094d575b50610949604051928284938452830190612d28565b0390f35b9091503d806000833e6109608183612eea565b81019082818303126104a65780519067ffffffffffffffff82116104a6570181601f820112156104a657805161099581612f0c565b926109a36040519485612eea565b8184528482840101116104a6576109bf91848085019101612d05565b9082610934565b6040513d6000823e3d90fd5b346104a6576003196020368201126104a6576004359067ffffffffffffffff908183116104a6576101409083360301126104a657610a0e6155d4565b60405191610a1b83612e80565b610a2781600401612d79565b8352610a35602482016136d2565b6020840152610a4660448201612e57565b6040840152610a5760648201612e57565b6060840152610a6860848201612d79565b6080840152610a7960a48201612f28565b60a0840152610a8a60c48201612d79565b60c0840152610a9c3660e483016137b8565b60e08401526101248101359182116104a65701366023820112156104a657602091610ad4610adf9236906024600482013591016136e4565b610100820152614a84565b604051908152f35b346104a65760403660031901126104a657600435610b03612d63565b610b0b6155d4565b81600052600b60205260ff60016040600020015460a81c1615610bbe578160005260056020526001600160a01b0360406000205416803303610b9f57916106b481602093600080516020615b4283398151915295610b6883615696565b6001600160801b038116610b7d575b506131cf565b610b9090610b896155d4565b82856156ce565b8686604051858152a187610b77565b60405163216caf0d60e01b815260048101849052336024820152604490fd5b6024826040519062b8e7e760e51b82526004820152fd5b346104a65760203660031901126104a65760043580600052600b60205260ff60016040600020015460a81c161561065557600052600b602052602064ffffffffff60406000205460a01c16604051908152f35b346104a65760003660031901126104a657602060405167016345785d8a00008152f35b346104a65760203660031901126104a65760043580600052600b60205260ff60016040600020015460a81c161561065557600052600b60205260206001600160a01b0360406000205416604051908152f35b346104a65760203660031901126104a657600435600052600b602052602060ff60016040600020015460a81c166040519015158152f35b346104a65760803660031901126104a657610ced612d4d565b610cf5612d63565b6064359167ffffffffffffffff83116104a657366023840112156104a657826004013591610d2283612f0c565b92610d306040519485612eea565b80845236602482870101116104a6576020816000926024610d5d980183880137850101526044359161305a565b005b346104a65760203660031901126104a65760043580600052600b60205260ff60016040600020015460a81c161561065557600052600b602052610949610dab6004604060002001613539565b604051918291602083526020830190612df3565b346104a65760203660031901126104a65760206105f660043561361a565b346104a65760203660031901126104a65760043580600052600b60205260ff60016040600020015460a81c161561065557610e1790614988565b6040516005821015610e2a576020918152f35b634e487b7160e01b600052602160045260246000fd5b346104a65760203660031901126104a65760043580600052600b60205260ff60016040600020015460a81c161561065557600052600b60205260206001600160801b0360026040600020015416604051908152f35b346104a65760203660031901126104a657610eae612d4d565b6001600160a01b038060005416338103610f6c57508116908160005260026020526001600160801b0360406000205416908115610f3b5781610f0d9184600052600260205260406000206001600160801b031981541690553390615630565b6040519081527fca7a4a65a94ed2f37538814e00e1cd4c41a78261561e3f3794592f11409cf5af60203392a3005b602483604051907f8410168c0000000000000000000000000000000000000000000000000000000082526004820152fd5b6040516331b339a960e21b81526001600160a01b03919091166004820152336024820152604490fd5b346104a65760603660031901126104a65767ffffffffffffffff6004358181116104a657610fc7903690600401612dc2565b610fcf612d63565b926044359081116104a657610fe8903690600401612dc2565b9190610ff26155d4565b8282036110575760005b82811061100557005b80600080516020615b428339815191526020611024600194878a6156be565b3561104a61103b611036868b8a6156be565b6137a4565b6110436155d4565b8b836156ce565b604051908152a101610ffc565b50604491604051917faec9344000000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b346104a65760403660031901126104a6576110a7612d4d565b602435908115158092036104a6576001600160a01b03169081331461111b57336000526008602052604060002082600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a3005b606460405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152fd5b346104a65760003660031901126104a657604051600060045490600182811c91818416918215611263575b602094858510841461124d57858794868652918260001461122d5750506001146111d0575b506111bc92500383612eea565b610949604051928284938452830190612d28565b84915060046000527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b906000915b8583106112155750506111bc9350820101856111af565b805483890185015287945086939092019181016111fe565b60ff1916858201526111bc95151560051b85010192508791506111af9050565b634e487b7160e01b600052602260045260246000fd5b92607f169261118a565b346104a65760003660031901126104a65760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346104a65760203660031901126104a65760043580600052600b60205260ff60016040600020015460a81c161561065557600052600b602052602064ffffffffff60406000205460c81c16604051908152f35b346104a65760203660031901126104a65760043580600052600b60205260ff60016040600020015460a81c16156106555761133590614988565b600581101580610e2a5760028214908115611371575b811561135f575b6020826040519015158152f35b9050610e2a5760046020911482611352565b505060038114600061134b565b346104a65760203660031901126104a6576004356001600160a01b03908181168091036104a6578160005416338103610f6c575060015491816001600160a01b03198416176001556040519216825260208201527fdcb09aef4bf01068924ccce937981cbe59d25ba08380cf941aaaea4e4bd3960d60403392a2005b346104a65760203660031901126104a657606061014060405161141c81612eb9565b60008152600060208201526000604082015260008382015260006080820152600060a0820152600060c0820152600060e082015260006101008201526114606135c7565b6101208201520152600435600052600b60205260ff60016040600020015460a81c161561164f57600435600052600b60205260406000206115436004604051926114a984612eb9565b80546001600160a01b038116855264ffffffffff8160a01c16602086015264ffffffffff8160c81c16604086015260ff8160f01c161515606086015260f81c1515608085015260ff60018201546001600160a01b03811660a0870152818160a01c16151560c0870152818160a81c16151560e087015260b01c161515610100850152611537600282016135e6565b61012085015201613539565b610140820152611554600435614988565b906005821015610e2a5760026101409214611643575b610949604051928392602084526001600160a01b03815116602085015264ffffffffff602082015116604085015264ffffffffff60408201511660608501526060810151151560808501526080810151151560a08501526001600160a01b0360a08201511660c085015260c0810151151560e085015260e08101511515610100850152610100810151151561012085015261162f61012082015183860190604090816001600160801b0391828151168552826020820151166020860152015116910152565b01516101a0808401526101c0830190612df3565b6000606082015261156a565b602460405162b8e7e760e51b81526004356004820152fd5b346104a6576020806003193601126104a65760043567ffffffffffffffff81116104a657611699903690600401612dc2565b906116a26155d4565b6000915b8083106116af57005b6116ba8382846156be565b35926116c46155d4565b6116cd84613651565b156116ea5760248460405190634a5541ef60e01b82526004820152fd5b6116f6849293946136a1565b611a9e5761171a82600052600b6020526001600160a01b0360406000205416331490565b1580611a7e575b611a5f5761172e826137e7565b82600052600b9283875261174860026040600020016135e6565b936001600160801b0392838651168482161015611a47578260005281895260ff60406000205460f01c1615611a2f579061179782858b61178d819796838c5116613688565b9901511690613688565b93826000528184526040600020966003885498600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8b1617815583881615611a15575b0191811691826001600160801b03198254161790556118216001600160a01b03809916926005875289604060002054169487528360019a8b6040600020015416615630565b33820361193257823b61188e575b7f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd2600080516020615b428339815191529685925b604080516001600160801b03928316815292909116602083015290a4604051908152a10191906116a6565b9350813b156104a6576040516372eba20360e01b8152600481018490526001600160a01b03821660248201526001600160801b03858116604483015286166064820152600080516020615b42833981519152958b9585927f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd2929190600081608481838b5af1611923575b50925096505061182f565b61192c90612ed6565b8e611918565b813b611971575b7f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd2600080516020615b42833981519152968592611863565b9350803b156104a6576040516372eba20360e01b8152600481018490526001600160a01b03831660248201526001600160801b03858116604483015286166064820152600080516020615b42833981519152958b9585927f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd2929190600081608481838a5af1611a06575b509250965050611939565b611a0f90612ed6565b8e6119fb565b60018101600160a01b60ff60a01b198254161790556117dc565b602483604051906339c6dc7360e21b82526004820152fd5b602483604051906322cad1af60e11b82526004820152fd5b60405163216caf0d60e01b815260048101839052336024820152604490fd5b5081600052600585526001600160a01b0360406000205416331415611721565b6024826040519063fe19f19f60e01b82526004820152fd5b346104a6576020806003193601126104a657600435611ad36155d4565b80600052600b825260ff60016040600020015460a81c161561065557611af881614988565b916000926005811015610e2a5760048103611b255760248360405190634a5541ef60e01b82526004820152fd5b60038103611b45576024836040519063fe19f19f60e01b82526004820152fd5b916002849314611cc757611b6f81600052600b6020526001600160a01b0360406000205416331490565b15611ca75780600052600b825260ff60406000205460f01c1615611c8f5780600052600b8252604060002060ff60f01b198154169055600582526001600160a01b0360406000205416803b611bfd575b50807f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f84600080516020615b4283398151915295a2604051908152a1005b803b156104a657600080516020615b428339815191529360008084936024604051809481937f341a0bd90000000000000000000000000000000000000000000000000000000083528860048401525af1611c5a575b509350611bbf565b9050611c669150612ed6565b8060007f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f611c52565b602490604051906339c6dc7360e21b82526004820152fd5b60405163216caf0d60e01b81526004810191909152336024820152604490fd5b602490604051906322cad1af60e11b82526004820152fd5b346104a65760203660031901126104a6576004356001600160a01b03908181168091036104a6578160005416338103610f6c5750600a5491816001600160a01b0319841617600a556040519216825260208201527fa2548bd4b805e907c1558a47b5858324fe8bb4a2e1ddfca647eecbf65610eebc60403392a26009546000198101908111611d9b5760407f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c91815190600182526020820152a1005b634e487b7160e01b600052601160045260246000fd5b346104a65760203660031901126104a657611dca612d4d565b6000546001600160a01b0380821692338403611e1c576001600160a01b03199350169182911617600055337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf80600080a3005b6040516331b339a960e21b81526001600160a01b0385166004820152336024820152604490fd5b346104a65760203660031901126104a6576001600160a01b03611e64612d4d565b168015611e835760005260066020526020604060002054604051908152f35b608460405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e657200000000000000000000000000000000000000000000006064820152fd5b346104a65760203660031901126104a657600435611f246108d88260005260056020526001600160a01b0360406000205416151590565b600052600560205260206001600160a01b0360406000205416604051908152f35b346104a65760203660031901126104a6576020611f63600435612f87565b6001600160a01b0360405191168152f35b346104a65760003660031901126104a65760206001600160a01b0360015416604051908152f35b346104a65760203660031901126104a65760043580600052600b60205260ff60016040600020015460a81c161561065557610750602091614a09565b346104a65760203660031901126104a65760043580600052600b60205260ff60016040600020015460a81c161561065557600061201382614988565b6005811015610e2a57600203612031575b6020906040519015158152f35b50600052600b602052602060ff60406000205460f01c16612024565b346104a65760203660031901126104a6576004356120696155d4565b61207281613651565b1561217a5761208081615999565b15611ca75761208e81612f87565b6120978261361a565b159081612171575b8161215e575b50612146576020816120c5600080516020615b4283398151915293612f87565b9080600052600783526001600160a01b036040600020926001600160a01b031993848154169055169182600052600684526040600020600019815401905581600052600584526040600020908154169055806000604051937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a48152a1005b602490604051906378630aa960e01b82526004820152fd5b6001600160a01b039150161515826120a5565b6000915061209f565b602490604051907f817cd6390000000000000000000000000000000000000000000000000000000082526004820152fd5b346104a6576121b936612d8d565b60405191602083019383851067ffffffffffffffff8611176121e557610d5d946040526000845261305a565b634e487b7160e01b600052604160045260246000fd5b346104a65760203660031901126104a65760206105f6600435613651565b346104a6576020806003193601126104a657600435906122376155d4565b61224082613651565b1561225d5760248260405190634a5541ef60e01b82526004820152fd5b612266826136a1565b611a9e5761228a82600052600b6020526001600160a01b0360406000205416331490565b1580612591575b611a5f5761229e826137e7565b9180600052600b82526122b760026040600020016135e6565b926001600160801b0390818551168282161015611a475782600052600b845260ff60406000205460f01c1615611a2f578082856122fa61230494838a5116613688565b9701511690613688565b9082600052600b84526040600020916003835493600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861617815583831615612577575b0191861691826001600160801b031982541617905561238f6001600160a01b03809416926005875283856040600020541695600b895260016040600020015416615630565b33820361249757823b6123f6575b7f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd28491600080516020615b42833981519152975b604080516001600160801b03928316815292909116602083015290a4604051908152a1005b823b156104a6576040516372eba20360e01b8152600481018590526001600160a01b03831660248201526001600160801b03878116604483015282166064820152600080516020615b428339815191529685927f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd292909190600081608481838b5af1612488575b50975091505061239d565b61249190612ed6565b8961247d565b813b6124d6575b7f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd28491600080516020615b42833981519152976123d1565b813b156104a6576040516372eba20360e01b8152600481018590526001600160a01b03841660248201526001600160801b03878116604483015282166064820152600080516020615b428339815191529685927f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd292909190600081608481838a5af1612568575b50975091505061249e565b61257190612ed6565b8961255d565b60018101600160a01b60ff60a01b1982541617905561234a565b5081600052600581526001600160a01b0360406000205416331415612291565b346104a65760203660031901126104a6576001600160a01b036125d2612d4d565b16600052600260205260206001600160801b0360406000205416604051908152f35b346104a657610d5d61260536612d8d565b9161261861261384336130f0565b612fe9565b6131cf565b346104a65760003660031901126104a6576020600954604051908152f35b346104a65760203660031901126104a65760043580600052600b60205260ff60016040600020015460a81c16156106555761267590614988565b6005811015610e2a578060209115908115612696575b506040519015158152f35b60019150148261268b565b346104a657602060031981813601126104a6576004359067ffffffffffffffff908183116104a657610120833603918201126104a6576126df6155d4565b61010483013590602219018112156104a65782016004810135908282116104a65760240160608202360381136104a65761271a9136916136e4565b9182519061272782613521565b916127356040519384612eea565b808352601f1961274482613521565b018660005b8281106129065750505064ffffffffff90814216946001600160801b03968761277182613852565b515116828a61277f84613852565b510151168580604061279086613852565b510151168a011690604051926127a584612e64565b83528b83015260408201526127b987613852565b526127c386613852565b5060019386855b8a8c87831061288557908b846001600160a01b038c60a4810135828116908190036104a657610adf95612845956128759461280760248601613783565b61281360448701613783565b61281f60648801613790565b9161282c88600401613790565b948461283a60848b016137a4565b966040519d8e612e80565b168c528d8c0152151560408b0152151560608a01521660808801521660a086015260c085015260c43691016137b8565b60e0830152610100820152614a84565b8893858060406128b98b866128a98a8e9a6128a0828d613875565b5151169a613875565b5101511694600019890190613875565b510151168160406128ca888c613875565b51015116011691604051936128de85612e64565b845283015260408201526128f2828b613875565b526128fd818a613875565b500187906127ca565b61290e6135c7565b828288010152018790612749565b346104a65760203660031901126104a65760043580600052600b60205260ff60016040600020015460a81c16156106555760209060009080600052600b8352604060002060ff815460f01c16806129af575b612986575b50506001600160801b0360405191168152f35b6129a892506001600160801b0360026129a292015416916137e7565b90613688565b8280612973565b5060ff600182015460a01c161561296e565b346104a65760403660031901126104a6576129da612d4d565b602435906001600160a01b0380806129f185612f87565b16921691808314612aeb57803314908115612ac6575b5015612a5c578260005260076020526040600020826001600160a01b0319825416179055612a3483612f87565b167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b608460405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152fd5b9050600052600860205260406000203360005260205260ff6040600020541684612a07565b608460405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152fd5b346104a65760203660031901126104a6576020611f63600435612fac565b346104a65760003660031901126104a657604051600060035490600182811c91818416918215612c2c575b602094858510841461124d57858794868652918260001461122d575050600114612bcf57506111bc92500383612eea565b84915060036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b906000915b858310612c145750506111bc9350820101856111af565b80548389018501528794508693909201918101612bfd565b92607f1692612b9e565b346104a65760203660031901126104a657600435907fffffffff0000000000000000000000000000000000000000000000000000000082168092036104a657817f80ac58cd0000000000000000000000000000000000000000000000000000000060209314908115612cdb575b8115612cb1575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501483612caa565b7f5b5e139f0000000000000000000000000000000000000000000000000000000081149150612ca3565b60005b838110612d185750506000910152565b8181015183820152602001612d08565b90602091612d4181518092818552858086019101612d05565b601f01601f1916010190565b600435906001600160a01b03821682036104a657565b602435906001600160a01b03821682036104a657565b35906001600160a01b03821682036104a657565b60609060031901126104a6576001600160a01b039060043582811681036104a6579160243590811681036104a6579060443590565b9181601f840112156104a65782359167ffffffffffffffff83116104a6576020808501948460051b0101116104a657565b90815180825260208080930193019160005b828110612e13575050505090565b835180516001600160801b031686528083015167ffffffffffffffff168684015260409081015164ffffffffff169086015260609094019392810192600101612e05565b359081151582036104a657565b6060810190811067ffffffffffffffff8211176121e557604052565b610120810190811067ffffffffffffffff8211176121e557604052565b6040810190811067ffffffffffffffff8211176121e557604052565b610160810190811067ffffffffffffffff8211176121e557604052565b67ffffffffffffffff81116121e557604052565b90601f8019910116810190811067ffffffffffffffff8211176121e557604052565b67ffffffffffffffff81116121e557601f01601f191660200190565b35906001600160801b03821682036104a657565b15612f4357565b606460405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152fd5b60005260056020526001600160a01b0360406000205416612fa9811515612f3c565b90565b612fcf6108d88260005260056020526001600160a01b0360406000205416151590565b60005260076020526001600160a01b036040600020541690565b15612ff057565b608460405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f766564000000000000000000000000000000000000006064820152fd5b9061307e93929161306e61261384336130f0565b6130798383836131cf565b613388565b1561308557565b60405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b906001600160a01b03808061310484612f87565b16931691838314938415613137575b508315613121575b50505090565b61312d91929350612fac565b161438808061311b565b909350600052600860205260406000208260005260205260ff604060002054169238613113565b1561316557565b608460405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152fd5b906131f892916131de83612f87565b916001600160a01b0394859384809416968791161461315e565b16908115806132ef5761320a8461361a565b1590816132e6575b50806132dd575b6132c55791808492613247600080516020615b428339815191529660209661324085612f87565b161461315e565b60009382855260078652604085206001600160a01b031990818154169055818652600687526040862060001981540190558286526040862060018154019055838652600587528260408720918254161790557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6040519580a48152a1565b602483604051906378630aa960e01b82526004820152fd5b50831515613219565b90501538613212565b608460405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152fd5b3d15613383573d9061336982612f0c565b916133776040519384612eea565b82523d6000602084013e565b606090565b9290803b15613518576133f2916020916001600160a01b0394604051809581948293897f150b7a02000000000000000000000000000000000000000000000000000000009b8c86523360048701521660248501526044840152608060648401526084830190612d28565b03916000968791165af1908290826134b1575b505061348b57613413613358565b805190816134865760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000161490565b909192506020813d8211613510575b816134cd60209383612eea565b8101031261350c5751907fffffffff00000000000000000000000000000000000000000000000000000000821682036135095750903880613405565b80fd5b5080fd5b3d91506134c0565b50505050600190565b67ffffffffffffffff81116121e55760051b60200190565b90815461354581613521565b9260409361355585519182612eea565b828152809460208092019260005281600020906000935b85851061357b57505050505050565b6001848192845161358b81612e64565b64ffffffffff87546001600160801b038116835267ffffffffffffffff8160801c168584015260c01c168682015281520193019401939161356c565b604051906135d482612e64565b60006040838281528260208201520152565b906040516135f381612e64565b6040819360018154916001600160801b0392838116865260801c6020860152015416910152565b80600052600b60205260ff60016040600020015460a81c161561065557600052600b60205260ff60016040600020015460b01c1690565b80600052600b60205260ff60016040600020015460a81c161561065557600052600b60205260ff60016040600020015460a01c1690565b6001600160801b039182169082160391908211611d9b57565b80600052600b60205260ff60016040600020015460a81c161561065557600052600b60205260406000205460f81c90565b359064ffffffffff821682036104a657565b9291926136f082613521565b6040946136ff86519283612eea565b819584835260208093019160608096028501948186116104a657925b85841061372b5750505050505050565b86848303126104a65782519061374082612e64565b61374985612f28565b8252858501359067ffffffffffffffff821682036104a657828792838b9501526137748688016136d2565b8682015281520193019261371b565b3580151581036104a65790565b356001600160a01b03811681036104a65790565b356001600160801b03811681036104a65790565b91908260409103126104a6576040516137d081612e9d565b60208082946137de81612d79565b84520135910152565b64ffffffffff80421682600052600b602052604060002091825482828260a01c1610156138485760c81c16111561383657600401546001101561382d57612fa990613889565b612fa9906148b9565b6001600160801b039150600201541690565b5050505050600090565b80511561385f5760200190565b634e487b7160e01b600052603260045260246000fd5b805182101561385f5760209160051b010190565b64ffffffffff90814216906000908152600b6020526040908181208251936138b085612eb9565b8154956001600160a01b039182881687526020870197828160a01c168952828160c81c168789015260ff8160f01c161515606089015260f81c1515608088015260ff6001938486015490811660a08a0152818160a01c16151560c08a0152818160a81c16151560e08a015260b01c16151561010088015261014061394a600461393b600288016135e6565b966101208b0197885201613539565b970191878352808761395c889a613852565b5101511693828288965b1610613a405750916139f06139f5928488816139fa98976001600160801b039e8f6139928b8a51613875565b5151169d8a8f9b60206139af67ffffffffffffffff928d51613875565b510151169984836139c1848451613875565b5101511696508115613a34576139df92935051906000190190613875565b5101511680925b0316920316613ab4565b613e23565b613c86565b928313613a13575050613a0d8391613a78565b16011690565b516020015192939283169284168310159150613a2f9050575090565b905090565b505050511680926139e6565b8094986001600160801b039081613a588c8851613875565b51511601169801938282808a613a6f898951613875565b51015116613966565b60008112613a835790565b602490604051907f2463f3d50000000000000000000000000000000000000000000000000000000082526004820152fd5b90600160ff1b808314908115613b9c575b50613b72576000821215613b6957613aee826000035b6000831215613b62578260000390613ba6565b917f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311613b2c5760009160001991181315613b28575090565b0390565b604491604051917fd49c26b300000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b8290613ba6565b613aee82613adb565b60046040517f9fe2b450000000000000000000000000000000000000000000000000000000008152fd5b9050811438613ac5565b670de0b6b3a7640000916000198383099280830292838086109503948086039514613c625782851015613c2657908291096001821901821680920460028082600302188083028203028083028203028083028203028083028203028083028203028092029003029360018380600003040190848311900302920304170290565b82606492604051927f63a05778000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b505080925015613c70570490565b634e487b7160e01b600052601260045260246000fd5b90600160ff1b808314908115613d6a575b50613d40576000821215613d3757613cc0826000035b6000831215613d30578260000390613d74565b917f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311613cfa5760009160001991181315613b28575090565b604491604051917f120b5b4300000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b8290613d74565b613cc082613cad565b60046040517fa6070c25000000000000000000000000000000000000000000000000000000008152fd5b9050811438613c97565b90919060001983820983820291828083109203918083039214613e1257670de0b6b3a76400009081831015613ddb57947faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066994950990828211900360ee1b910360121c170290565b60449086604051917f5173648d00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050670de0b6b3a764000090049150565b80613e3d5750600090612fa95750670de0b6b3a764000090565b90670de0b6b3a7640000808314613e8a575080613e62575050670de0b6b3a764000090565b670de0b6b3a76400008114613e8657613e81906139f5612fa993614764565b613eaa565b5090565b91505090565b8015613c70576ec097ce7bc90715b34b9f10000000000590565b6000811215613edf5768033dd1780914b97114198112613ed957613ed090600003613eaa565b612fa990613e90565b50600090565b680a688906bd8affffff811361473357670de0b6b3a764000080604092831b05907780000000000000000000000000000000000000000000000067ff000000000000008316614616575b66ff000000000000831661450e575b65ff0000000000831661440e575b64ff000000008316614316575b63ff0000008316614226575b62ff0000831661413e575b61ff00831661405e575b60ff8316613f87575b02911c60bf031c90565b6080831661404c575b83831661403a575b60208316614028575b60108316614016575b60088316614004575b60048316613ff2575b60028316613fe0575b6001831615613f7d576801000000000000000102831c613f7d565b6801000000000000000102831c613fc5565b6801000000000000000302831c613fbc565b6801000000000000000602831c613fb3565b6801000000000000000b02831c613faa565b6801000000000000001602831c613fa1565b6801000000000000002c02831c613f98565b6801000000000000005902831c613f90565b618000831661412c575b614000831661411a575b6120008316614108575b61100083166140f6575b61080083166140e4575b61040083166140d2575b61020083166140c0575b610100831615613f7457680100000000000000b102831c613f74565b6801000000000000016302831c6140a4565b680100000000000002c602831c61409a565b6801000000000000058c02831c614090565b68010000000000000b1702831c614086565b6801000000000000162e02831c61407c565b68010000000000002c5d02831c614072565b680100000000000058b902831c614068565b628000008316614214575b624000008316614202575b6220000083166141f0575b6210000083166141de575b6208000083166141cc575b6204000083166141ba575b6202000083166141a8575b62010000831615613f6a576801000000000000b17202831c613f6a565b680100000000000162e402831c61418b565b6801000000000002c5c802831c614180565b68010000000000058b9102831c614175565b680100000000000b172102831c61416a565b68010000000000162e4302831c61415f565b680100000000002c5c8602831c614154565b6801000000000058b90c02831c614149565b63800000008316614304575b634000000083166142f2575b632000000083166142e0575b631000000083166142ce575b630800000083166142bc575b630400000083166142aa575b63020000008316614298575b6301000000831615613f5f5768010000000000b1721802831c613f5f565b6801000000000162e43002831c61427a565b68010000000002c5c86002831c61426e565b680100000000058b90c002831c614262565b6801000000000b17217f02831c614256565b680100000000162e42ff02831c61424a565b6801000000002c5c85fe02831c61423e565b68010000000058b90bfc02831c614232565b64800000000083166143fc575b64400000000083166143ea575b64200000000083166143d8575b64100000000083166143c6575b64080000000083166143b4575b64040000000083166143a2575b6402000000008316614390575b640100000000831615613f5357680100000000b17217f802831c613f53565b68010000000162e42ff102831c614371565b680100000002c5c85fe302831c614364565b6801000000058b90bfce02831c614357565b68010000000b17217fbb02831c61434a565b6801000000162e42fff002831c61433d565b68010000002c5c8601cc02831c614330565b680100000058b90c0b4902831c614323565b6580000000000083166144fc575b6540000000000083166144ea575b6520000000000083166144d8575b6510000000000083166144c6575b6508000000000083166144b4575b6504000000000083166144a2575b650200000000008316614490575b65010000000000831615613f46576801000000b17218355102831c613f46565b680100000162e430e5a202831c614470565b6801000002c5c863b73f02831c614462565b68010000058b90cf1e6e02831c614454565b680100000b1721bcfc9a02831c614446565b68010000162e43f4f83102831c614438565b680100002c5c89d5ec6d02831c61442a565b6801000058b91b5bc9ae02831c61441c565b66800000000000008316614604575b664000000000000083166145f2575b662000000000000083166145e0575b661000000000000083166145ce575b660800000000000083166145bc575b660400000000000083166145aa575b66020000000000008316614598575b6601000000000000831615613f385768010000b17255775c0402831c613f38565b6801000162e525ee054702831c614577565b68010002c5cc37da949202831c614568565b680100058ba01fb9f96d02831c614559565b6801000b175effdc76ba02831c61454a565b680100162f3904051fa102831c61453b565b6801002c605e2e8cec5002831c61452c565b68010058c86da1c09ea202831c61451d565b6780000000000000008316614714575b6740000000000000008316614702575b67200000000000000083166146f0575b67100000000000000083166146de575b67080000000000000083166146cc575b67040000000000000083166146ba575b67020000000000000083166146a8575b670100000000000000831615613f2957680100b1afa5abcbed6102831c613f29565b68010163da9fb33356d802831c614686565b680102c9a3e778060ee702831c614676565b6801059b0d31585743ae02831c614666565b68010b5586cf9890f62a02831c614656565b6801172b83c7d517adce02831c614646565b6801306fe0a31b7152df02831c614636565b5077b504f333f9de648480000000000000000000000000000000614626565b602490604051907f0360d0280000000000000000000000000000000000000000000000000000000082526004820152fd5b8060008083131561488857670de0b6b3a76400009283811261485157506001925b808305906001600160801b03821160071b91821c9167ffffffffffffffff831160061b92831c63ffffffff811160051b90811c61ffff811160041b90811c60ff811160031b90811c91600f831160021b92831c936001978860038711811b96871c11961717171717171781810294811d9082821461484557506706f05b59d3b20000905b8482136148195750505050500290565b808391020590671bc16d674ec80000821215614838575b831d90614809565b8091950194831d90614830565b93505093925050020290565b6000199392508015614874576ec097ce7bc90715b34b9f10000000000591614785565b602482634e487b7160e01b81526012600452fd5b602483604051907f059b101b0000000000000000000000000000000000000000000000000000000082526004820152fd5b64ffffffffff6148ee600091838352600b60205280806040852054818160a01c1693849160c81c160316918142160316613ab4565b91808252600b602052600460408320018054156149745790829167ffffffffffffffff93526149466020832054828452600b6020526139f56001600160801b03968760026040882001541696879360801c1690613e23565b92831361495c57505061495890613a78565b1690565b60029350604092508152600b60205220015460801c90565b602483634e487b7160e01b81526032600452fd5b80600052600b602052604060002060ff600182015460a01c166000146149af575050600490565b805460f81c614a02575460a01c64ffffffffff164210613ed9576149d2816137e7565b90600052600b6020526001600160801b0380600260406000200154169116106000146149fd57600190565b600290565b5050600390565b80600052600b602052614a2260026040600020016135e6565b81600052600b602052604060002060ff600182015460a01c16600014614a5557506001600160801b039150602001511690565b5460f81c614a675750612fa9906137e7565b612fa991506001600160801b036040818351169201511690613688565b906001600160a01b036001541660206001600160a01b0360c0850151166024604051809481937fdcf844a700000000000000000000000000000000000000000000000000000000835260048301525afa80156109c657600090615343575b614b0591506001600160801b0360a08501511690602060e0860151015191615a02565b6001600160801b038151166101008401519064ffffffffff602086015116811561531957825180156152ef577f000000000000000000000000000000000000000000000000000000000000000081116152be575064ffffffffff6040614b6a85613852565b510151168110156152675750600091829083815185905b8082106151d4575050505064ffffffffff421664ffffffffff82168110156151945750506001600160801b03821681036151525750506009549283600052600b6020526040600020916001600160801b0381511660028401906001600160801b03198254161790556001600160a01b0360c083015116600184015490750100000000000000000000000000000000000000000060408501511515928654927fffffffffffffffffff0000ff000000000000000000000000000000000000000076ff000000000000000000000000000000000000000000006060890151151560b01b16921617171760018601556001600160a01b0384511691610100850151926040614c93855195600019870190613875565b510151927fff000000000000000000000000000000000000000000000000000000000000007eff0000000000000000000000000000000000000000000000000000000000007dffffffffff0000000000000000000000000000000000000000000000000078ffffffffff000000000000000000000000000000000000000060208b015160a01b169660c81b169460f01b16911617171717845560005b818110615082575050600185016009556001600160a01b0360c08301511660005260026020526001600160801b0380604060002054168160208401511601166001600160a01b0360c0840151166000526040600020906001600160801b03198254161790556001600160a01b03608083015116801561503e57614dd1614dcb8760005260056020526001600160a01b0360406000205416151590565b156154f1565b614dda8661361a565b1580615035575b8061502d575b615015576020600080516020615b4283398151915291614e20614dcb8960005260056020526001600160a01b0360406000205416151590565b806000526006825260406000206001815401905587600052600582526040600020816001600160a01b0319825416179055876040519160007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4878152a1614eb06001600160a01b0360c0840151166001600160801b03808451168160208601511601169030903390615377565b6001600160801b0360408201511680614fe6575b507fef3d668acee46576ad5d407c42ab4d0cde13f3cd70b28f09a0fb9e3bf5bf09cb614fa36001600160a01b03845116926001600160a01b03608086015116946001600160a01b0360c08201511696614fdb614fbb60408401511515928c606086015115156001600160a01b0360e061010089015194549864ffffffffff6040519a614f4f8c612e9d565b818160a01c168c5260c81c1660208b01520151511695604051998a99610160948b523360208c015260408b0190604090816001600160801b0391828151168552826020820151166020860152015116910152565b60a089015260c08801528060e0880152860190612df3565b926101008501906020908164ffffffffff91828151168552015116910152565b6101408301520390a4565b61500f906001600160a01b0360c0850151166001600160a01b0360e08601515116903390615377565b38614ec4565b602486604051906378630aa960e01b82526004820152fd5b506000614de7565b50801515614de1565b606460405162461bcd60e51b815260206004820152602060248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152fd5b61509181610100860151613875565b5190600486015491680100000000000000008310156121e5576001830180600489015583101561385f5760019260048801600052602060002001906001600160801b03815116908254917fffffff00000000000000000000000000000000000000000000000000000000007cffffffffff000000000000000000000000000000000000000000000000604077ffffffffffffffff00000000000000000000000000000000602086015160801b1694015160c01b169316171717905501614d2f565b6040517fd90b7e390000000000000000000000000000000000000000000000000000000081526001600160801b03918216600482015291166024820152604490fd5b6040517f210aec0e00000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b91935091946151f8906001600160801b036151ef8589613875565b5151169061597e565b9464ffffffffff80604061520c8685613875565b5101511694168085111561522a575060018493019192919092614b81565b8385606492604051927f7b0bada8000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b64ffffffffff604061527885613852565b5101516040517fb4c9e52c00000000000000000000000000000000000000000000000000000000815264ffffffffff938416600482015291169091166024820152604490fd5b602490604051907f4757689b0000000000000000000000000000000000000000000000000000000082526004820152fd5b60046040517f3952c64e000000000000000000000000000000000000000000000000000000008152fd5b60046040517f6095d3bc000000000000000000000000000000000000000000000000000000008152fd5b6020823d60201161536f575b8161535c60209383612eea565b810103126135095750614b059051614ae2565b3d915061534f565b9290604051927f23b872dd0000000000000000000000000000000000000000000000000000000060208501526001600160a01b03809216602485015216604483015260648201526064815260a081019181831067ffffffffffffffff8411176121e5576153e6926040526153e8565b565b6001600160a01b03169061544860405161540181612e9d565b6020938482527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564858301526000808587829751910182855af1615442613358565b9161553c565b8051918215918483156154cd575b5050509050156154635750565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b91938180945001031261350c57820151908115158203613509575080388084615456565b156154f857565b606460405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152fd5b9192901561559d5750815115615550575090565b3b156155595790565b606460405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b8251909150156155b05750805190602001fd5b6105859060405191829162461bcd60e51b8352602060048401526024830190612d28565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361560657565b60046040517fa1c0d6e5000000000000000000000000000000000000000000000000000000008152fd5b916001600160a01b03604051927fa9059cbb000000000000000000000000000000000000000000000000000000006020850152166024830152604482015260448152608081019181831067ffffffffffffffff8411176121e5576153e6926040526153e8565b612fa9906156a381614a09565b90600052600b60205260026040600020015460801c90613688565b919081101561385f5760051b0190565b9291926156da81613651565b615966576156fe81600052600b6020526001600160a01b0360406000205416331490565b91821580615956575b611a5f57600094828652602091600583526001600160a01b039460409186838a205416918061594a575b61592557868116968715615915576001600160801b038086169586156158fe578161575b8a615696565b168088116158db5750916157e993916157b28a60028f80600b8e6157908f9b8f9588905283835286868620015460801c61597e565b95835252200190836001600160801b031983549260801b1691161781556135e6565b906157cd818b8401511692828a818351169201511690613688565b1611156158ac575b888c52600b88526001868d20015416615630565b80331415806158a2575b615826575b507ffa54f9f9bdcdd28778cbb9f78490df6691cc4e2729588e10f4cc0a26c465686a939495965051908152a3565b803b1561589e5796807ffa54f9f9bdcdd28778cbb9f78490df6691cc4e2729588e10f4cc0a26c465686a9596979860848451809481936313375c3b60e01b83528b60048401523360248401528c60448401528860648401525af161588f575b87969594506157f8565b61589890612ed6565b38615885565b8780fd5b50803b15156157f3565b888c52600b8852858c2060018101600160a01b60ff60a01b1982541617905560ff60f01b1981541690556157d5565b896064918989519263287ecaef60e21b8452600484015260248301526044820152fd5b60248987519063d2aabcd960e01b82526004820152fd5b6004845163630d074f60e11b8152fd5b8587606492855192632dcbf6b960e11b84526004840152336024840152166044820152fd5b50818782161415615731565b5061596082615999565b15615707565b60249060405190634a5541ef60e01b82526004820152fd5b9190916001600160801b0380809416911601918211611d9b57565b60009080825260056020526001600160a01b0380604084205416928333149384156159de575b505082156159cc57505090565b9091506159d93392612fac565b161490565b60ff92945090604091815260086020528181203382526020522054169138806159bf565b909291615a0d6135c7565b936001600160801b0392838116918215615b195767016345785d8a0000808211615ae257808511615aab5750615a5785615a48819386613d74565b16946020890195865284613d74565b169184615a6e60408901948086528287511661597e565b161015615a9557615a87849182615a9095511690613688565b91511690613688565b168252565b634e487b7160e01b600052600160045260246000fd5b84604491604051917f4fea5c1a00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b60449250604051917f47152d6700000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b50505050509050604051615b2c81612e64565b6000815260006020820152600060408201529056fef8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7a164736f6c6343000815000a"; + hex"60c0346200046e57601f62005db438819003918201601f19168301916001600160401b038311848410176200032b578084926080946040528339810103126200046e5780516001600160a01b038082169290918390036200046e5760208101518281168091036200046e5760408201519183831683036200046e5760600151936200008962000473565b90601d82527f5361626c696572205632204c6f636b75702044796e616d6963204e46540000006020830152620000be62000473565b601181527029a0a116ab1916a627a1a5aaa816a22ca760791b602082015230608052600080546001600160a01b03199081168417825560018054909116909517909455927fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a38051906001600160401b0382116200032b5760035490600182811c9216801562000463575b60208310146200044d5781601f849311620003d8575b50602090601f83116001146200034d5760009262000341575b50508160011b916000199060031b1c1916176003555b80516001600160401b0381116200032b576004918254600181811c9116801562000320575b60208210146200030b579081601f849311620002b3575b50602090601f831160011462000248576000926200023c575b50508160011b916000199060031b1c19161790555b1660018060a01b0319600a541617600a5560a05260016009556040516159209081620004948239608051816153a9015260a05181818161126b01526149090152f35b015190503880620001e5565b6000858152602081209350601f198516905b8181106200029a575090846001959493921062000280575b505050811b019055620001fa565b015160001960f88460031b161c1916905538808062000272565b929360206001819287860151815501950193016200025a565b909150836000526020600020601f840160051c8101916020851062000300575b90601f859493920160051c01905b818110620002f05750620001cc565b60008155849350600101620002e1565b9091508190620002d3565b602284634e487b7160e01b6000525260246000fd5b90607f1690620001b5565b634e487b7160e01b600052604160045260246000fd5b0151905038806200017a565b600360009081527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b9350601f198516905b818110620003bf5750908460019594939210620003a5575b505050811b0160035562000190565b015160001960f88460031b161c1916905538808062000396565b929360206001819287860151815501950193016200037e565b60036000529091507fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f840160051c8101916020851062000442575b90601f859493920160051c01905b81811062000432575062000161565b6000815584935060010162000423565b909150819062000415565b634e487b7160e01b600052602260045260246000fd5b91607f16916200014b565b600080fd5b60408051919082016001600160401b038111838210176200032b5760405256fe608080604052600436101561001357600080fd5b60003560e01c90816301ffc9a714612a0d5750806306fdde031461294a578063081812fc1461292c578063095ea7b3146127985780631400ecec146126f357806316844456146124785780631c1cdd4c146124125780631e99d569146123f457806323b872dd146123cb57806339a73c031461238857806340e58ee514612108578063425d30dd146120ea57806342842e0e1461209a57806342966c6814611f3c5780634857501f14611ec65780634869e12d14611e8a5780635fe3b56714611e635780636352211e14611e345780636d0cee7514611ddc57806370a0823114611d3257806375829def14611ca05780637cad6cd114611bce5780637de6b1db146119a55780638659c2701461164d578063894e9a0d146113e05780638bad38dd146113645780638f69b993146112e15780639067b6771461128e5780639188ec841461125357806395d89b4114611145578063a22cb46514611074578063a2ffb89714610f7b578063a6202bf214610e7b578063a80fc07114610e26578063ad35efd414610dc3578063b256456914610da5578063b637b86514610d45578063b88d4fde14610cba578063b8a3be6614610c83578063b971302a14610c31578063bc063e1a14610c0e578063bc2be1be14610bbb578063c156a11d14610acd578063c33cd35e146109b8578063c87b56dd14610885578063cc364f48146107eb578063d4dbd20b14610796578063d511609f14610747578063d975dfed146106fa578063e985e9c5146106a3578063ea5ead1914610652578063eac8f5b8146105e6578063f590c176146105be578063f851a440146105975763fdd46d601461027c57600080fd5b3461048057606036600319011261048057600435610298612b3a565b604435916001600160801b039182841693848103610480576102b861539f565b6102c183613428565b61057f576102e583600052600b6020526001600160a01b0360406000205416331490565b9182158061056f575b6105505783600052602094600586526001600160a01b039081604060002054169480610544575b61051e5781831693841561050d5788156104f55761033287615461565b8281168a116104c1575091889161038e6103626103cb958a600052600b8c5260026040600020015460801c615730565b89600052600b8b52600260406000200190836001600160801b031983549260801b1691161781556133bd565b906103aa818b840151169282604081835116920151169061345f565b16111561048f575b86600052600b88526001604060002001541692836153fb565b81847f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d876040518a8152a48133141580610485575b61041f575b6000805160206158f48339815191528484604051908152a1005b813b15610480576000805160206158f48339815191529460846000928360405195869485936313375c3b60e01b8552896004860152336024860152604485015260648401525af1610471575b80610405565b61047a90612cad565b3861046b565b600080fd5b50813b1515610400565b86600052600b8852604060002060018101600160a01b60ff60a01b1982541617905560ff60f01b1981541690556103b2565b60405163287ecaef60e21b8152600481018990526001600160801b03928316602482015291166044820152606490fd5b0390fd5b6024876040519063d2aabcd960e01b82526004820152fd5b600460405163630d074f60e11b8152fd5b606486838560405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b50848284161415610315565b60405163216caf0d60e01b815260048101859052336024820152604490fd5b506105798461574b565b156102ee565b60248360405190634a5541ef60e01b82526004820152fd5b346104805760003660031901126104805760206001600160a01b0360005416604051908152f35b346104805760203660031901126104805760206105dc600435613478565b6040519015158152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260206001600160a01b0360016040600020015416604051908152f35b6024906040519062b8e7e760e51b82526004820152fd5b34610480576040366003190112610480576000805160206158f4833981519152602060043561069a610682612b3a565b61068b83615461565b9061069461539f565b83615499565b604051908152a1005b34610480576040366003190112610480576106bc612b24565b6106c4612b3a565b906001600160a01b03809116600052600860205260406000209116600052602052602060ff604060002054166040519015158152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57610736602091615461565b6001600160801b0360405191168152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b602052602060026040600020015460801c604051908152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260206001600160801b0360036040600020015416604051908152f35b34610480576020366003190112610480576004356000602060405161080f81612c74565b828152015280600052600b60205260ff60016040600020015460a81c161561063b57600052600b6020526040806000205464ffffffffff82519161085283612c74565b818160a01c16835260c81c166020820152610883825180926020908164ffffffffff91828151168552015116910152565bf35b346104805760208060031936011261048057600435906108c36108be8360005260056020526001600160a01b0360406000205416151590565b612d13565b60006001600160a01b03600a5416926044604051809581937fe9dc637500000000000000000000000000000000000000000000000000000000835230600484015260248301525afa9182156109ac57600092610933575b5061092f604051928284938452830190612aff565b0390f35b9091503d806000833e6109468183612cc1565b81019082818303126104805780519067ffffffffffffffff8211610480570181601f8201121561048057805161097b81612ce3565b926109896040519485612cc1565b818452848284010111610480576109a591848085019101612adc565b908261091a565b6040513d6000823e3d90fd5b3461048057600319602036820112610480576004359067ffffffffffffffff9081831161048057610140908336030112610480576109f461539f565b60405191610a0183612c57565b610a0d81600401612b50565b8352610a1b602482016134a9565b6020840152610a2c60448201612c2e565b6040840152610a3d60648201612c2e565b6060840152610a4e60848201612b50565b6080840152610a5f60a48201612cff565b60a0840152610a7060c48201612b50565b60c0840152610a823660e4830161358f565b60e084015261012481013591821161048057013660238201121561048057602091610aba610ac59236906024600482013591016134bb565b61010082015261485b565b604051908152f35b3461048057604036600319011261048057600435610ae9612b3a565b610af161539f565b81600052600b60205260ff60016040600020015460a81c1615610ba4578160005260056020526001600160a01b0360406000205416803303610b85579161069a816020936000805160206158f483398151915295610b4e83615461565b6001600160801b038116610b63575b50612fa6565b610b7690610b6f61539f565b8285615499565b8686604051858152a187610b5d565b60405163216caf0d60e01b815260048101849052336024820152604490fd5b6024826040519062b8e7e760e51b82526004820152fd5b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b602052602064ffffffffff60406000205460a01c16604051908152f35b3461048057600036600319011261048057602060405167016345785d8a00008152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260206001600160a01b0360406000205416604051908152f35b3461048057602036600319011261048057600435600052600b602052602060ff60016040600020015460a81c166040519015158152f35b3461048057608036600319011261048057610cd3612b24565b610cdb612b3a565b6064359167ffffffffffffffff8311610480573660238401121561048057826004013591610d0883612ce3565b92610d166040519485612cc1565b8084523660248287010111610480576020816000926024610d439801838801378501015260443591612e31565b005b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205261092f610d916004604060002001613310565b604051918291602083526020830190612bca565b346104805760203660031901126104805760206105dc6004356133f1565b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57610dfd9061475f565b6040516005821015610e10576020918152f35b634e487b7160e01b600052602160045260246000fd5b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260206001600160801b0360026040600020015416604051908152f35b3461048057602036600319011261048057610e94612b24565b6001600160a01b038060005416338103610f5257508116908160005260026020526001600160801b0360406000205416908115610f215781610ef39184600052600260205260406000206001600160801b0319815416905533906153fb565b6040519081527fca7a4a65a94ed2f37538814e00e1cd4c41a78261561e3f3794592f11409cf5af60203392a3005b602483604051907f8410168c0000000000000000000000000000000000000000000000000000000082526004820152fd5b6040516331b339a960e21b81526001600160a01b03919091166004820152336024820152604490fd5b346104805760603660031901126104805767ffffffffffffffff60043581811161048057610fad903690600401612b99565b610fb5612b3a565b9260443590811161048057610fce903690600401612b99565b9190610fd861539f565b82820361103d5760005b828110610feb57005b806000805160206158f4833981519152602061100a600194878a615489565b3561103061102161101c868b8a615489565b61357b565b61102961539f565b8b83615499565b604051908152a101610fe2565b50604491604051917faec9344000000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b346104805760403660031901126104805761108d612b24565b60243590811515809203610480576001600160a01b03169081331461110157336000526008602052604060002082600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a3005b606460405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152fd5b3461048057600036600319011261048057604051600060045490600182811c91818416918215611249575b60209485851084146112335785879486865291826000146112135750506001146111b6575b506111a292500383612cc1565b61092f604051928284938452830190612aff565b84915060046000527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b906000915b8583106111fb5750506111a2935082010185611195565b805483890185015287945086939092019181016111e4565b60ff1916858201526111a295151560051b85010192508791506111959050565b634e487b7160e01b600052602260045260246000fd5b92607f1692611170565b346104805760003660031901126104805760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b602052602064ffffffffff60406000205460c81c16604051908152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b5761131b9061475f565b600581101580610e105760028214908115611357575b8115611345575b6020826040519015158152f35b9050610e105760046020911482611338565b5050600381146000611331565b34610480576020366003190112610480576004356001600160a01b0390818116809103610480578160005416338103610f52575060015491816001600160a01b03198416176001556040519216825260208201527fdcb09aef4bf01068924ccce937981cbe59d25ba08380cf941aaaea4e4bd3960d60403392a2005b3461048057602036600319011261048057606061014060405161140281612c90565b60008152600060208201526000604082015260008382015260006080820152600060a0820152600060c0820152600060e0820152600061010082015261144661339e565b6101208201520152600435600052600b60205260ff60016040600020015460a81c161561163557600435600052600b602052604060002061152960046040519261148f84612c90565b80546001600160a01b038116855264ffffffffff8160a01c16602086015264ffffffffff8160c81c16604086015260ff8160f01c161515606086015260f81c1515608085015260ff60018201546001600160a01b03811660a0870152818160a01c16151560c0870152818160a81c16151560e087015260b01c16151561010085015261151d600282016133bd565b61012085015201613310565b61014082015261153a60043561475f565b906005821015610e105760026101409214611629575b61092f604051928392602084526001600160a01b03815116602085015264ffffffffff602082015116604085015264ffffffffff60408201511660608501526060810151151560808501526080810151151560a08501526001600160a01b0360a08201511660c085015260c0810151151560e085015260e08101511515610100850152610100810151151561012085015261161561012082015183860190604090816001600160801b0391828151168552826020820151166020860152015116910152565b01516101a0808401526101c0830190612bca565b60006060820152611550565b602460405162b8e7e760e51b81526004356004820152fd5b346104805760203660031901126104805760043567ffffffffffffffff81116104805761167e903690600401612b99565b61168661539f565b6000905b80821061169357005b61169e828285615489565b35916116a861539f565b6116b183613428565b156116ce5760248360405190634a5541ef60e01b82526004820152fd5b6116d9839293613478565b61198d576116fd82600052600b6020526001600160a01b0360406000205416331490565b1561196e5761170b826135be565b82600052600b928360205261172660026040600020016133bd565b936001600160801b039283865116848216101561195657826000528160205260ff60406000205460f01c161561193e578084602061176a61177494838b511661345f565b980151169061345f565b9482600052816020526040600020958654600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82161788556003868316988915611924575b0195831695866001600160801b03198254161790556001600160a01b03916005602052826040600020541694602052600198838a604060002001541697611805818686168b6153fb565b863b611888575b505060209594926000805160206158f48339815191529794926118777f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa509360405193849316958984916040919493606084019584526001600160801b03809216602085015216910152565b0390a4604051908152a1019061168a565b9196959390979492843b15610480576118776020987f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa50946000805160206158f48339815191529b604051916372eba20360e01b83528b6004840152868616602484015260448301526064820152600081608481838c5af1611915575b50935050929497819496975061180c565b61191e90612cad565b8f611904565b60018101600160a01b60ff60a01b198254161790556117bb565b602483604051906339c6dc7360e21b82526004820152fd5b602483604051906322cad1af60e11b82526004820152fd5b60405163216caf0d60e01b815260048101839052336024820152604490fd5b6024826040519063fe19f19f60e01b82526004820152fd5b3461048057602080600319360112610480576004356119c261539f565b80600052600b825260ff60016040600020015460a81c161561063b576119e78161475f565b916000926005811015610e105760048103611a145760248360405190634a5541ef60e01b82526004820152fd5b60038103611a34576024836040519063fe19f19f60e01b82526004820152fd5b916002849314611bb657611a5e81600052600b6020526001600160a01b0360406000205416331490565b15611b965780600052600b825260ff60406000205460f01c1615611b7e5780600052600b8252604060002060ff60f01b198154169055600582526001600160a01b0360406000205416803b611aec575b50807f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f846000805160206158f483398151915295a2604051908152a1005b803b15610480576000805160206158f48339815191529360008084936024604051809481937f341a0bd90000000000000000000000000000000000000000000000000000000083528860048401525af1611b49575b509350611aae565b9050611b559150612cad565b8060007f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f611b41565b602490604051906339c6dc7360e21b82526004820152fd5b60405163216caf0d60e01b81526004810191909152336024820152604490fd5b602490604051906322cad1af60e11b82526004820152fd5b34610480576020366003190112610480576004356001600160a01b0390818116809103610480578160005416338103610f525750600a5491816001600160a01b0319841617600a556040519216825260208201527fa2548bd4b805e907c1558a47b5858324fe8bb4a2e1ddfca647eecbf65610eebc60403392a26009546000198101908111611c8a5760407f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c91815190600182526020820152a1005b634e487b7160e01b600052601160045260246000fd5b3461048057602036600319011261048057611cb9612b24565b6000546001600160a01b0380821692338403611d0b576001600160a01b03199350169182911617600055337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf80600080a3005b6040516331b339a960e21b81526001600160a01b0385166004820152336024820152604490fd5b34610480576020366003190112610480576001600160a01b03611d53612b24565b168015611d725760005260066020526020604060002054604051908152f35b608460405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e657200000000000000000000000000000000000000000000006064820152fd5b3461048057602036600319011261048057600435611e136108be8260005260056020526001600160a01b0360406000205416151590565b600052600560205260206001600160a01b0360406000205416604051908152f35b34610480576020366003190112610480576020611e52600435612d5e565b6001600160a01b0360405191168152f35b346104805760003660031901126104805760206001600160a01b0360015416604051908152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b576107366020916147e0565b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b576000611f028261475f565b6005811015610e1057600203611f20575b6020906040519015158152f35b50600052600b602052602060ff60406000205460f01c16611f13565b3461048057602036600319011261048057600435611f5861539f565b611f6181613428565b1561206957611f6f8161574b565b15611b9657611f7d81612d5e565b611f86826133f1565b159081612060575b8161204d575b5061203557602081611fb46000805160206158f483398151915293612d5e565b9080600052600783526001600160a01b036040600020926001600160a01b031993848154169055169182600052600684526040600020600019815401905581600052600584526040600020908154169055806000604051937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a48152a1005b602490604051906378630aa960e01b82526004820152fd5b6001600160a01b03915016151582611f94565b60009150611f8e565b602490604051907f817cd6390000000000000000000000000000000000000000000000000000000082526004820152fd5b34610480576120a836612b64565b60405191602083019383851067ffffffffffffffff8611176120d457610d439460405260008452612e31565b634e487b7160e01b600052604160045260246000fd5b346104805760203660031901126104805760206105dc600435613428565b3461048057602080600319360112610480576004359061212661539f565b61212f82613428565b1561214c5760248260405190634a5541ef60e01b82526004820152fd5b61215582613478565b61198d5761217982600052600b6020526001600160a01b0360406000205416331490565b1561196e57612187826135be565b9180600052600b82526121a060026040600020016133bd565b926001600160801b03908185511682821610156119565782600052600b845260ff60406000205460f01c161561193e578082856121e36121ed94838a511661345f565b970151169061345f565b82600052600b8452604060002091825491600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8416178455600382821694851561236e575b0191871691826001600160801b03198254161790556001600160a01b038093169160058752836040600020541693600b8852600160406000200154169461227c8285886153fb565b843b6122e6575b5050604080518681526001600160801b03988916602082015291909716968101969096526000805160206158f4833981519152957f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa5090606090a4604051908152a1005b919097843b15610480576000805160206158f4833981519152987f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa5093604051916372eba20360e01b835289600484015286602484015260448301526064820152600081608481838a5af161235f575b5097819250612283565b61236890612cad565b89612355565b60018101600160a01b60ff60a01b19825416179055612234565b34610480576020366003190112610480576001600160a01b036123a9612b24565b16600052600260205260206001600160801b0360406000205416604051908152f35b3461048057610d436123dc36612b64565b916123ef6123ea8433612ec7565b612dc0565b612fa6565b34610480576000366003190112610480576020600954604051908152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b5761244c9061475f565b6005811015610e1057806020911590811561246d575b506040519015158152f35b600191501482612462565b346104805760206003198181360112610480576004359067ffffffffffffffff908183116104805761012083360391820112610480576124b661539f565b6101048301359060221901811215610480578201600481013590828211610480576024016060820236038113610480576124f19136916134bb565b918251906124fe826132f8565b9161250c6040519384612cc1565b808352601f1961251b826132f8565b018660005b8281106126dd5750505064ffffffffff90814216946001600160801b03968761254882613629565b515116828a61255684613629565b510151168580604061256786613629565b510151168a0116906040519261257c84612c3b565b83528b830152604082015261259087613629565b5261259a86613629565b5060019386855b8a8c87831061265c57908b846001600160a01b038c60a48101358281169081900361048057610ac59561261c9561264c946125de6024860161355a565b6125ea6044870161355a565b6125f660648801613567565b9161260388600401613567565b948461261160848b0161357b565b966040519d8e612c57565b168c528d8c0152151560408b0152151560608a01521660808801521660a086015260c085015260c436910161358f565b60e083015261010082015261485b565b8893858060406126908b866126808a8e9a612677828d61364c565b5151169a61364c565b510151169460001989019061364c565b510151168160406126a1888c61364c565b51015116011691604051936126b585612c3b565b845283015260408201526126c9828b61364c565b526126d4818a61364c565b500187906125a1565b6126e561339e565b828288010152018790612520565b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b5760209060009080600052600b8352604060002060ff815460f01c1680612786575b61275d575b50506001600160801b0360405191168152f35b61277f92506001600160801b03600261277992015416916135be565b9061345f565b828061274a565b5060ff600182015460a01c1615612745565b34610480576040366003190112610480576127b1612b24565b602435906001600160a01b0380806127c885612d5e565b169216918083146128c25780331490811561289d575b5015612833578260005260076020526040600020826001600160a01b031982541617905561280b83612d5e565b167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b608460405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152fd5b9050600052600860205260406000203360005260205260ff60406000205416846127de565b608460405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152fd5b34610480576020366003190112610480576020611e52600435612d83565b3461048057600036600319011261048057604051600060035490600182811c91818416918215612a03575b60209485851084146112335785879486865291826000146112135750506001146129a657506111a292500383612cc1565b84915060036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b906000915b8583106129eb5750506111a2935082010185611195565b805483890185015287945086939092019181016129d4565b92607f1692612975565b3461048057602036600319011261048057600435907fffffffff00000000000000000000000000000000000000000000000000000000821680920361048057817f80ac58cd0000000000000000000000000000000000000000000000000000000060209314908115612ab2575b8115612a88575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501483612a81565b7f5b5e139f0000000000000000000000000000000000000000000000000000000081149150612a7a565b60005b838110612aef5750506000910152565b8181015183820152602001612adf565b90602091612b1881518092818552858086019101612adc565b601f01601f1916010190565b600435906001600160a01b038216820361048057565b602435906001600160a01b038216820361048057565b35906001600160a01b038216820361048057565b6060906003190112610480576001600160a01b0390600435828116810361048057916024359081168103610480579060443590565b9181601f840112156104805782359167ffffffffffffffff8311610480576020808501948460051b01011161048057565b90815180825260208080930193019160005b828110612bea575050505090565b835180516001600160801b031686528083015167ffffffffffffffff168684015260409081015164ffffffffff169086015260609094019392810192600101612bdc565b3590811515820361048057565b6060810190811067ffffffffffffffff8211176120d457604052565b610120810190811067ffffffffffffffff8211176120d457604052565b6040810190811067ffffffffffffffff8211176120d457604052565b610160810190811067ffffffffffffffff8211176120d457604052565b67ffffffffffffffff81116120d457604052565b90601f8019910116810190811067ffffffffffffffff8211176120d457604052565b67ffffffffffffffff81116120d457601f01601f191660200190565b35906001600160801b038216820361048057565b15612d1a57565b606460405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152fd5b60005260056020526001600160a01b0360406000205416612d80811515612d13565b90565b612da66108be8260005260056020526001600160a01b0360406000205416151590565b60005260076020526001600160a01b036040600020541690565b15612dc757565b608460405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f766564000000000000000000000000000000000000006064820152fd5b90612e55939291612e456123ea8433612ec7565b612e50838383612fa6565b61315f565b15612e5c57565b60405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b906001600160a01b038080612edb84612d5e565b16931691838314938415612f0e575b508315612ef8575b50505090565b612f0491929350612d83565b1614388080612ef2565b909350600052600860205260406000208260005260205260ff604060002054169238612eea565b15612f3c57565b608460405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152fd5b90612fcf9291612fb583612d5e565b916001600160a01b03948593848094169687911614612f35565b16908115806130c657612fe1846133f1565b1590816130bd575b50806130b4575b61309c579180849261301e6000805160206158f48339815191529660209661301785612d5e565b1614612f35565b60009382855260078652604085206001600160a01b031990818154169055818652600687526040862060001981540190558286526040862060018154019055838652600587528260408720918254161790557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6040519580a48152a1565b602483604051906378630aa960e01b82526004820152fd5b50831515612ff0565b90501538612fe9565b608460405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152fd5b3d1561315a573d9061314082612ce3565b9161314e6040519384612cc1565b82523d6000602084013e565b606090565b9290803b156132ef576131c9916020916001600160a01b0394604051809581948293897f150b7a02000000000000000000000000000000000000000000000000000000009b8c86523360048701521660248501526044840152608060648401526084830190612aff565b03916000968791165af190829082613288575b5050613262576131ea61312f565b8051908161325d5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000161490565b909192506020813d82116132e7575b816132a460209383612cc1565b810103126132e35751907fffffffff00000000000000000000000000000000000000000000000000000000821682036132e057509038806131dc565b80fd5b5080fd5b3d9150613297565b50505050600190565b67ffffffffffffffff81116120d45760051b60200190565b90815461331c816132f8565b9260409361332c85519182612cc1565b828152809460208092019260005281600020906000935b85851061335257505050505050565b6001848192845161336281612c3b565b64ffffffffff87546001600160801b038116835267ffffffffffffffff8160801c168584015260c01c1686820152815201930194019391613343565b604051906133ab82612c3b565b60006040838281528260208201520152565b906040516133ca81612c3b565b6040819360018154916001600160801b0392838116865260801c6020860152015416910152565b80600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260ff60016040600020015460b01c1690565b80600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260ff60016040600020015460a01c1690565b6001600160801b039182169082160391908211611c8a57565b80600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260406000205460f81c90565b359064ffffffffff8216820361048057565b9291926134c7826132f8565b6040946134d686519283612cc1565b8195848352602080930191606080960285019481861161048057925b8584106135025750505050505050565b86848303126104805782519061351782612c3b565b61352085612cff565b8252858501359067ffffffffffffffff8216820361048057828792838b95015261354b8688016134a9565b868201528152019301926134f2565b3580151581036104805790565b356001600160a01b03811681036104805790565b356001600160801b03811681036104805790565b9190826040910312610480576040516135a781612c74565b60208082946135b581612b50565b84520135910152565b64ffffffffff80421682600052600b602052604060002091825482828260a01c16101561361f5760c81c16111561360d57600401546001101561360457612d8090613660565b612d8090614690565b6001600160801b039150600201541690565b5050505050600090565b8051156136365760200190565b634e487b7160e01b600052603260045260246000fd5b80518210156136365760209160051b010190565b64ffffffffff90814216906000908152600b60205260409081812082519361368785612c90565b8154956001600160a01b039182881687526020870197828160a01c168952828160c81c168789015260ff8160f01c161515606089015260f81c1515608088015260ff6001938486015490811660a08a0152818160a01c16151560c08a0152818160a81c16151560e08a015260b01c1615156101008801526101406137216004613712600288016133bd565b966101208b0197885201613310565b9701918783528087613733889a613629565b5101511693828288965b16106138175750916137c76137cc928488816137d198976001600160801b039e8f6137698b8a5161364c565b5151169d8a8f9b602061378667ffffffffffffffff928d5161364c565b5101511699848361379884845161364c565b510151169650811561380b576137b69293505190600019019061364c565b5101511680925b031692031661388b565b613bfa565b613a5d565b9283136137ea5750506137e4839161384f565b16011690565b5160200151929392831692841683101591506138069050575090565b905090565b505050511680926137bd565b8094986001600160801b03908161382f8c885161364c565b51511601169801938282808a61384689895161364c565b5101511661373d565b6000811261385a5790565b602490604051907f2463f3d50000000000000000000000000000000000000000000000000000000082526004820152fd5b90600160ff1b808314908115613973575b50613949576000821215613940576138c5826000035b600083121561393957826000039061397d565b917f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831161390357600091600019911813156138ff575090565b0390565b604491604051917fd49c26b300000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b829061397d565b6138c5826138b2565b60046040517f9fe2b450000000000000000000000000000000000000000000000000000000008152fd5b905081143861389c565b670de0b6b3a7640000916000198383099280830292838086109503948086039514613a3957828510156139fd57908291096001821901821680920460028082600302188083028203028083028203028083028203028083028203028083028203028092029003029360018380600003040190848311900302920304170290565b82606492604051927f63a05778000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b505080925015613a47570490565b634e487b7160e01b600052601260045260246000fd5b90600160ff1b808314908115613b41575b50613b17576000821215613b0e57613a97826000035b6000831215613b07578260000390613b4b565b917f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311613ad157600091600019911813156138ff575090565b604491604051917f120b5b4300000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b8290613b4b565b613a9782613a84565b60046040517fa6070c25000000000000000000000000000000000000000000000000000000008152fd5b9050811438613a6e565b90919060001983820983820291828083109203918083039214613be957670de0b6b3a76400009081831015613bb257947faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066994950990828211900360ee1b910360121c170290565b60449086604051917f5173648d00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050670de0b6b3a764000090049150565b80613c145750600090612d805750670de0b6b3a764000090565b90670de0b6b3a7640000808314613c61575080613c39575050670de0b6b3a764000090565b670de0b6b3a76400008114613c5d57613c58906137cc612d809361453b565b613c81565b5090565b91505090565b8015613a47576ec097ce7bc90715b34b9f10000000000590565b6000811215613cb65768033dd1780914b97114198112613cb057613ca790600003613c81565b612d8090613c67565b50600090565b680a688906bd8affffff811361450a57670de0b6b3a764000080604092831b05907780000000000000000000000000000000000000000000000067ff0000000000000083166143ed575b66ff00000000000083166142e5575b65ff000000000083166141e5575b64ff0000000083166140ed575b63ff0000008316613ffd575b62ff00008316613f15575b61ff008316613e35575b60ff8316613d5e575b02911c60bf031c90565b60808316613e23575b838316613e11575b60208316613dff575b60108316613ded575b60088316613ddb575b60048316613dc9575b60028316613db7575b6001831615613d54576801000000000000000102831c613d54565b6801000000000000000102831c613d9c565b6801000000000000000302831c613d93565b6801000000000000000602831c613d8a565b6801000000000000000b02831c613d81565b6801000000000000001602831c613d78565b6801000000000000002c02831c613d6f565b6801000000000000005902831c613d67565b6180008316613f03575b6140008316613ef1575b6120008316613edf575b6110008316613ecd575b6108008316613ebb575b6104008316613ea9575b6102008316613e97575b610100831615613d4b57680100000000000000b102831c613d4b565b6801000000000000016302831c613e7b565b680100000000000002c602831c613e71565b6801000000000000058c02831c613e67565b68010000000000000b1702831c613e5d565b6801000000000000162e02831c613e53565b68010000000000002c5d02831c613e49565b680100000000000058b902831c613e3f565b628000008316613feb575b624000008316613fd9575b622000008316613fc7575b621000008316613fb5575b620800008316613fa3575b620400008316613f91575b620200008316613f7f575b62010000831615613d41576801000000000000b17202831c613d41565b680100000000000162e402831c613f62565b6801000000000002c5c802831c613f57565b68010000000000058b9102831c613f4c565b680100000000000b172102831c613f41565b68010000000000162e4302831c613f36565b680100000000002c5c8602831c613f2b565b6801000000000058b90c02831c613f20565b638000000083166140db575b634000000083166140c9575b632000000083166140b7575b631000000083166140a5575b63080000008316614093575b63040000008316614081575b6302000000831661406f575b6301000000831615613d365768010000000000b1721802831c613d36565b6801000000000162e43002831c614051565b68010000000002c5c86002831c614045565b680100000000058b90c002831c614039565b6801000000000b17217f02831c61402d565b680100000000162e42ff02831c614021565b6801000000002c5c85fe02831c614015565b68010000000058b90bfc02831c614009565b64800000000083166141d3575b64400000000083166141c1575b64200000000083166141af575b641000000000831661419d575b640800000000831661418b575b6404000000008316614179575b6402000000008316614167575b640100000000831615613d2a57680100000000b17217f802831c613d2a565b68010000000162e42ff102831c614148565b680100000002c5c85fe302831c61413b565b6801000000058b90bfce02831c61412e565b68010000000b17217fbb02831c614121565b6801000000162e42fff002831c614114565b68010000002c5c8601cc02831c614107565b680100000058b90c0b4902831c6140fa565b6580000000000083166142d3575b6540000000000083166142c1575b6520000000000083166142af575b65100000000000831661429d575b65080000000000831661428b575b650400000000008316614279575b650200000000008316614267575b65010000000000831615613d1d576801000000b17218355102831c613d1d565b680100000162e430e5a202831c614247565b6801000002c5c863b73f02831c614239565b68010000058b90cf1e6e02831c61422b565b680100000b1721bcfc9a02831c61421d565b68010000162e43f4f83102831c61420f565b680100002c5c89d5ec6d02831c614201565b6801000058b91b5bc9ae02831c6141f3565b668000000000000083166143db575b664000000000000083166143c9575b662000000000000083166143b7575b661000000000000083166143a5575b66080000000000008316614393575b66040000000000008316614381575b6602000000000000831661436f575b6601000000000000831615613d0f5768010000b17255775c0402831c613d0f565b6801000162e525ee054702831c61434e565b68010002c5cc37da949202831c61433f565b680100058ba01fb9f96d02831c614330565b6801000b175effdc76ba02831c614321565b680100162f3904051fa102831c614312565b6801002c605e2e8cec5002831c614303565b68010058c86da1c09ea202831c6142f4565b67800000000000000083166144eb575b67400000000000000083166144d9575b67200000000000000083166144c7575b67100000000000000083166144b5575b67080000000000000083166144a3575b6704000000000000008316614491575b670200000000000000831661447f575b670100000000000000831615613d0057680100b1afa5abcbed6102831c613d00565b68010163da9fb33356d802831c61445d565b680102c9a3e778060ee702831c61444d565b6801059b0d31585743ae02831c61443d565b68010b5586cf9890f62a02831c61442d565b6801172b83c7d517adce02831c61441d565b6801306fe0a31b7152df02831c61440d565b5077b504f333f9de6484800000000000000000000000000000006143fd565b602490604051907f0360d0280000000000000000000000000000000000000000000000000000000082526004820152fd5b8060008083131561465f57670de0b6b3a76400009283811261462857506001925b808305906001600160801b03821160071b91821c9167ffffffffffffffff831160061b92831c63ffffffff811160051b90811c61ffff811160041b90811c60ff811160031b90811c91600f831160021b92831c936001978860038711811b96871c11961717171717171781810294811d9082821461461c57506706f05b59d3b20000905b8482136145f05750505050500290565b808391020590671bc16d674ec8000082121561460f575b831d906145e0565b8091950194831d90614607565b93505093925050020290565b600019939250801561464b576ec097ce7bc90715b34b9f1000000000059161455c565b602482634e487b7160e01b81526012600452fd5b602483604051907f059b101b0000000000000000000000000000000000000000000000000000000082526004820152fd5b64ffffffffff6146c5600091838352600b60205280806040852054818160a01c1693849160c81c16031691814216031661388b565b91808252600b6020526004604083200180541561474b5790829167ffffffffffffffff935261471d6020832054828452600b6020526137cc6001600160801b03968760026040882001541696879360801c1690613bfa565b92831361473357505061472f9061384f565b1690565b60029350604092508152600b60205220015460801c90565b602483634e487b7160e01b81526032600452fd5b80600052600b602052604060002060ff600182015460a01c16600014614786575050600490565b805460f81c6147d9575460a01c64ffffffffff164210613cb0576147a9816135be565b90600052600b6020526001600160801b0380600260406000200154169116106000146147d457600190565b600290565b5050600390565b80600052600b6020526147f960026040600020016133bd565b81600052600b602052604060002060ff600182015460a01c1660001461482c57506001600160801b039150602001511690565b5460f81c61483e5750612d80906135be565b612d8091506001600160801b03604081835116920151169061345f565b906001600160a01b036001541660206001600160a01b0360c0850151166024604051809481937fdcf844a700000000000000000000000000000000000000000000000000000000835260048301525afa80156109ac5760009061510e575b6148dc91506001600160801b0360a08501511690602060e08601510151916157b4565b6001600160801b0381511661010084015164ffffffffff60208601511682156150e457815180156150ba577f00000000000000000000000000000000000000000000000000000000000000008111615089575064ffffffffff604061494084613629565b510151168110156150325750600090819082815184905b808210614f9f575050505064ffffffffff421664ffffffffff8216811015614f5f5750506001600160801b0316808203614f285750506009549283600052600b6020526040600020916001600160801b0381511660028401906001600160801b03198254161790556001600160a01b0360c083015116600184015490750100000000000000000000000000000000000000000060408501511515928654927fffffffffffffffffff0000ff000000000000000000000000000000000000000076ff000000000000000000000000000000000000000000006060890151151560b01b16921617171760018601556001600160a01b0384511691610100850151926040614a6985519560001987019061364c565b510151927fff000000000000000000000000000000000000000000000000000000000000007eff0000000000000000000000000000000000000000000000000000000000007dffffffffff0000000000000000000000000000000000000000000000000078ffffffffff000000000000000000000000000000000000000060208b015160a01b169660c81b169460f01b16911617171717845560005b818110614e58575050600185016009556001600160a01b0360c08301511660005260026020526001600160801b0380604060002054168160208401511601166001600160a01b0360c0840151166000526040600020906001600160801b03198254161790556001600160a01b036080830151168015614e1457614ba7614ba18760005260056020526001600160a01b0360406000205416151590565b156152bc565b614bb0866133f1565b1580614e0b575b80614e03575b614deb5760206000805160206158f483398151915291614bf6614ba18960005260056020526001600160a01b0360406000205416151590565b806000526006825260406000206001815401905587600052600582526040600020816001600160a01b0319825416179055876040519160007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4878152a1614c866001600160a01b0360c0840151166001600160801b03808451168160208601511601169030903390615142565b6001600160801b0360408201511680614dbc575b507fef3d668acee46576ad5d407c42ab4d0cde13f3cd70b28f09a0fb9e3bf5bf09cb614d796001600160a01b03845116926001600160a01b03608086015116946001600160a01b0360c08201511696614db1614d9160408401511515928c606086015115156001600160a01b0360e061010089015194549864ffffffffff6040519a614d258c612c74565b818160a01c168c5260c81c1660208b01520151511695604051998a99610160948b523360208c015260408b0190604090816001600160801b0391828151168552826020820151166020860152015116910152565b60a089015260c08801528060e0880152860190612bca565b926101008501906020908164ffffffffff91828151168552015116910152565b6101408301520390a4565b614de5906001600160a01b0360c0850151166001600160a01b0360e08601515116903390615142565b38614c9a565b602486604051906378630aa960e01b82526004820152fd5b506000614bbd565b50801515614bb7565b606460405162461bcd60e51b815260206004820152602060248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152fd5b614e678161010086015161364c565b5190600486015491680100000000000000008310156120d457600183018060048901558310156136365760019260048801600052602060002001906001600160801b03815116908254917fffffff00000000000000000000000000000000000000000000000000000000007cffffffffff000000000000000000000000000000000000000000000000604077ffffffffffffffff00000000000000000000000000000000602086015160801b1694015160c01b169316171717905501614b05565b60449250604051917fd90b7e3900000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b6040517f210aec0e00000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b9193509193614fc3906001600160801b03614fba858861364c565b51511690615730565b9364ffffffffff806040614fd7868561364c565b51015116941680851115614ff5575060018493019192919092614957565b8385606492604051927f7b0bada8000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b64ffffffffff604061504384613629565b5101516040517fb4c9e52c00000000000000000000000000000000000000000000000000000000815264ffffffffff938416600482015291169091166024820152604490fd5b602490604051907f4757689b0000000000000000000000000000000000000000000000000000000082526004820152fd5b60046040517f3952c64e000000000000000000000000000000000000000000000000000000008152fd5b60046040517f6095d3bc000000000000000000000000000000000000000000000000000000008152fd5b6020823d60201161513a575b8161512760209383612cc1565b810103126132e057506148dc90516148b9565b3d915061511a565b9290604051927f23b872dd0000000000000000000000000000000000000000000000000000000060208501526001600160a01b03809216602485015216604483015260648201526064815260a081019181831067ffffffffffffffff8411176120d4576151b1926040526151b3565b565b6001600160a01b0316906152136040516151cc81612c74565b6020938482527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564858301526000808587829751910182855af161520d61312f565b91615307565b805191821591848315615298575b50505090501561522e5750565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b9193818094500103126132e3578201519081151582036132e0575080388084615221565b156152c357565b606460405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152fd5b91929015615368575081511561531b575090565b3b156153245790565b606460405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b82519091501561537b5750805190602001fd5b6104f19060405191829162461bcd60e51b8352602060048401526024830190612aff565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036153d157565b60046040517fa1c0d6e5000000000000000000000000000000000000000000000000000000008152fd5b916001600160a01b03604051927fa9059cbb000000000000000000000000000000000000000000000000000000006020850152166024830152604482015260448152608081019181831067ffffffffffffffff8411176120d4576151b1926040526151b3565b612d809061546e816147e0565b90600052600b60205260026040600020015460801c9061345f565b91908110156136365760051b0190565b906154a382613428565b615718576154c782600052600b6020526001600160a01b0360406000205416331490565b91821580615708575b611b96576000928184526020600581526001600160a01b039360409185838820541693806156fc575b6156d7578582169586156156c7576001600160801b03808a16998a156156b05761552288615461565b8281168c116156815750926155d68b89946001898e7f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d978f9a6155786155a1918c8552600b8b526002868620015460801c615730565b8b8452600b8a5260028585200190836001600160801b031983549260801b1691161781556133bd565b906155bc818a8401511692828681835116920151169061345f565b161115615653575b888152600b87522001541696876153fb565b85518b8152a48133141580615649575b6155f3575b505050505050565b813b15615645576084929185915196879586946313375c3b60e01b86526004860152336024860152604485015260648401525af1615636575b80808080806155eb565b61563f90612cad565b3861562c565b8480fd5b50813b15156155e6565b888152600b8752818120838101600160a01b60ff60a01b1982541617905560ff60f01b1981541690556155c4565b865163287ecaef60e21b8152600481018a90526001600160801b03928316602482015291166044820152606490fd5b60248887519063d2aabcd960e01b82526004820152fd5b6004845163630d074f60e11b8152fd5b6064858784865192632dcbf6b960e11b84526004840152336024840152166044820152fd5b508386831614156154f9565b506157128161574b565b156154d0565b60248260405190634a5541ef60e01b82526004820152fd5b9190916001600160801b0380809416911601918211611c8a57565b60009080825260056020526001600160a01b038060408420541692833314938415615790575b5050821561577e57505090565b90915061578b3392612d83565b161490565b60ff9294509060409181526008602052818120338252602052205416913880615771565b9092916157bf61339e565b936001600160801b03928381169182156158cb5767016345785d8a00008082116158945780851161585d5750615809856157fa819386613b4b565b16946020890195865284613b4b565b169184615820604089019480865282875116615730565b161015615847576158398491826158429551169061345f565b9151169061345f565b168252565b634e487b7160e01b600052600160045260246000fd5b84604491604051917f4fea5c1a00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b60449250604051917f47152d6700000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b505050505090506040516158de81612c3b565b6000815260006020820152600060408201529056fef8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7a164736f6c6343000815000a"; bytes public constant BYTECODE_LOCKUP_LINEAR = - hex"60a034620003e757601f196001600160401b03601f62004dae3881900382810185168601919084831187841017620003ec57808792606094604052833981010312620003e75783516001600160a01b03928382169291839003620003e7576020918287015196858816809803620003e75760400151948516809503620003e7576200008962000402565b90601c82527f5361626c696572205632204c6f636b7570204c696e656172204e46540000000084830152620000bd62000402565b601181527029a0a116ab1916a627a1a5aaa816a624a760791b8582015230608052600080546001600160a01b031990811688178255600180548216909b178b5596817fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a38351858111620003d35760039485548c81811c91168015620003c8575b89821014620003b45790818684931162000361575b508890868311600114620002f8578492620002ec575b505060001982871b1c1916908b1b1784555b8151948511620002d8576004958654998b8b811c9b168015620002cd575b828c1014620002ba57848b1162000271575b869798999a50819487116001146200020a57505093620001fe575b505082871b92600019911b1c19161790555b600a541617600a5560095560405161498b9081620004238239608051816146950152f35b015191503880620001c8565b8883528183208c9890969594939116915b8282106200025757505085116200023c575b50505050811b019055620001da565b01519060f884600019921b161c19169055388080806200022d565b8484015187558c989096019593840193908101906200021b565b87835281832085880160051c81019b838910620002af575b860160051c019a8c905b8c8110620002a3575050620001ad565b848155018c9062000293565b909b508b9062000289565b634e487b7160e01b835260228852602483fd5b9a607f169a6200019b565b634e487b7160e01b81526041600452602490fd5b0151905038806200016b565b908c8e9416918886528a862092865b8c82821062000341575050841162000328575b505050811b0184556200017d565b015160001983891b60f8161c191690553880806200031a565b91929395968291958786015181550195019301908f959493929162000307565b9091508684528884208680850160051c8201928b8610620003aa575b918f91869594930160051c01915b8281106200039b57505062000155565b8681558594508f91016200038b565b925081926200037d565b634e487b7160e01b84526022600452602484fd5b90607f169062000140565b634e487b7160e01b82526041600452602482fd5b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620003ec5760405256fe608080604052600436101561001357600080fd5b600090813560e01c90816301ffc9a714612f345750806306fdde0314612e72578063081812fc14612e53578063095ea7b314612cc45780631400ecec14612c245780631c1cdd4c14612bbf5780631e99d56914612ba157806323b872dd14612b7757806339a73c0314612b3657806340e58ee51461279b578063425d30dd1461277c57806342842e0e1461272c57806342966c68146125d45780634857501f1461254a5780634869e12d1461250f5780635fe3b567146124e85780636352211e146124b85780636d0cee751461246257806370a08231146123b957806375829def14612326578063780a82c8146122d65780637cad6cd1146122055780637de6b1db146120155780638659c27014611c0a578063894e9a0d146119b65780638bad38dd146119395780638f69b9931461189d5780639067b6771461184a57806395d89b411461173d57806396ce14311461161e578063a22cb4651461154d578063a2ffb89714611186578063a6202bf214611089578063a80fc07114611037578063ab167ccc14610efe578063ad35efd414610e9c578063b256456914610e7d578063b88d4fde14610dec578063b8a3be6614610db7578063b971302a14610d68578063bc063e1a14610d45578063bc2be1be14610cf5578063c156a11d14610998578063c87b56dd1461085e578063cc364f48146107b0578063d4dbd20b1461075e578063d511609f14610712578063d975dfed146106c6578063e985e9c514610671578063ea5ead191461064b578063eac8f5b8146105e2578063f590c176146105b9578063f851a440146105935763fdd46d601461027357600080fd5b346105905760603660031901126105905760043561028f613063565b6102976131a3565b916102a061468b565b6102a981613821565b610578576102cd81600052600b6020526001600160a01b0360406000205416331490565b91821580610568575b61054557818552602092600584526001600160a01b0391826040882054169180610539575b610513578281169283156104e9576001600160801b038088169788156104d157816103258861474d565b16808a116104ad5750926103c692899261038d6103558d98978b8a52600b8d52600260408b20015460801c61479b565b8a8952600b8c52610388600260408b20019182906001600160801b036001600160801b031983549260801b169116179055565b6137b6565b906103a9818c8401511692826040818351169201511690613858565b16111561047d575b878652600b89526001604087200154166146e7565b8033141580610473575b61041b575b5050817ffa54f9f9bdcdd28778cbb9f78490df6691cc4e2729588e10f4cc0a26c465686a8460008051602061495f83398151915296604051908152a3604051908152a180f35b803b1561046f578180916084604051809481936313375c3b60e01b83528960048401523360248401528860448401528b60648401525af1156103d557610460906130df565b61046b5784386103d5565b8480fd5b5080fd5b50803b15156103d0565b878652600b89526040862060018101600160c81b60ff60c81b1982541617905560ff60f01b1981541690556103b1565b876064918b6040519263287ecaef60e21b8452600484015260248301526044820152fd5b6024876040519063d2aabcd960e01b82526004820152fd5b60046040517fc61a0e9e000000000000000000000000000000000000000000000000000000008152fd5b838360649260405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b508183821614156102fb565b60405163216caf0d60e01b815260048101839052336024820152604490fd5b0390fd5b50610572826147b6565b156102d6565b60249060405190634a5541ef60e01b82526004820152fd5b80fd5b50346105905780600319360112610590576001600160a01b036020915416604051908152f35b50346105905760203660031901126105905760206105d8600435613887565b6040519015158152f35b503461059057602036600319011261059057600435808252600b60205260ff600160408420015460d01c16156106345760016040836001600160a01b039360209552600b855220015416604051908152f35b6024906040519062b8e7e760e51b82526004820152fd5b503461059057604036600319011261059057600435610668613063565b6102978261474d565b50346105905760403660031901126105905761068b61304d565b6040610695613063565b926001600160a01b0380931681526008602052209116600052602052602060ff604060002054166040519015158152f35b50346105905760203660031901126105905760ff6001604060043593848152600b60205220015460d01c16156106345761070160209161474d565b6001600160801b0360405191168152f35b503461059057602036600319011261059057600435808252600b60205260ff600160408420015460d01c16156106345760408260029260209452600b845220015460801c604051908152f35b503461059057602036600319011261059057600435808252600b60205260ff600160408420015460d01c16156106345760036040836001600160801b039360209552600b855220015416604051908152f35b5034610590576020366003190112610590576004356107cd613797565b50808252600b60205260ff600160408420015460d01c1615610634578160409160609352600b60205220600181549164ffffffffff918291015460a01c1690604051926108198461312d565b818160a01c16845260c81c166020830152604082015261085c60405180926040908164ffffffffff91828151168552826020820151166020860152015116910152565bf35b50346105905760208060031936011261046f5760043561089c6108978260005260056020526001600160a01b0360406000205416151590565b6131b9565b826001600160a01b03600a5416916044604051809481937fe9dc637500000000000000000000000000000000000000000000000000000000835230600484015260248301525afa92831561098c57809361090b575b5050610907604051928284938452830190613028565b0390f35b909192503d8082843e61091e8184613165565b820191838184031261046f5780519067ffffffffffffffff8211610988570182601f8201121561046f5780519161095483613187565b936109626040519586613165565b83855285848401011161059057509061098091848085019101613005565b9038806108f1565b8280fd5b604051903d90823e3d90fd5b5034610590576040366003190112610590576004356109b5613063565b906109be61468b565b808352602090600b825260ff600160408620015460d01c161561063457808452600582526001600160a01b038060408620541690813303610cd657610a028361474d565b6001600160801b0391828216928315928315610a40575b8960008051602061495f8339815191528989610a36818e8c61344c565b604051908152a180f35b610a4861468b565b610a5187613821565b610cbe57610a7587600052600b6020526001600160a01b0360406000205416331490565b93841580610cae575b610c8f57878b52600589528360408c2054169480610c85575b610c615786156104e9576104d15781610aaf8861474d565b16808611610c3d5750858a9493610b4b93610b12610adf8995600b8e8e8c5252600260408b20015460801c61479b565b8b8952600b8d52610388600260408b20019182906001600160801b036001600160801b031983549260801b169116179055565b90610b2e818d8401511692826040818351169201511690613858565b161115610c0d575b888652600b8a526001604087200154166146e7565b8033141580610c03575b610baf575b505060008051602061495f8339815191529482610a3693857ffa54f9f9bdcdd28778cbb9f78490df6691cc4e2729588e10f4cc0a26c465686a888296604051908152a38686604051858152a192819638610a19565b803b1561046f578180916084604051809481936313375c3b60e01b83528a60048401523360248401528960448401528860648401525af115610b5a57610bf4906130df565b610bff578538610b5a565b8580fd5b50803b1515610b55565b888652600b8a526040862060018101600160c81b60ff60c81b1982541617905560ff60f01b198154169055610b36565b87606491876040519263287ecaef60e21b8452600484015260248301526044820152fd5b6064888860405191632dcbf6b960e11b835260048301523360248301526044820152fd5b5084871415610a97565b60405163216caf0d60e01b815260048101899052336024820152604490fd5b50610cb8886147b6565b15610a7e565b60248760405190634a5541ef60e01b82526004820152fd5b60405163216caf0d60e01b815260048101849052336024820152604490fd5b503461059057602036600319011261059057600435808252600b60205260ff600160408420015460d01c16156106345760408264ffffffffff9260209452600b8452205460a01c16604051908152f35b5034610590578060031936011261059057602060405167016345785d8a00008152f35b503461059057602036600319011261059057600435808252600b60205260ff600160408420015460d01c1615610634576040826001600160a01b039260209452600b8452205416604051908152f35b50346105905760203660031901126105905760ff600160406020936004358152600b855220015460d01c166040519015158152f35b503461059057608036600319011261059057610e0661304d565b610e0e613063565b906064359067ffffffffffffffff8211610e795736602383011215610e795781600401359284610e3d85613187565b93610e4b6040519586613165565b858552366024878301011161046f5785610e76966024602093018388013785010152604435916132d7565b80f35b8380fd5b50346105905760203660031901126105905760206105d86004356137ea565b503461059057602036600319011261059057600435808252600b60205260ff600160408420015460d01c161561063457610ed590613afd565b604051906005811015610eea57602092508152f35b602483634e487b7160e01b81526021600452fd5b50346105905761014036600319011261059057610f1961468b565b610f21613797565b9064ffffffffff80421680845260c43582811681036110325781018216602085015260e4359081831682036110325701166040830152606435916001600160a01b039182841680940361059057506084358015158091036110325760a435908115158092036110325760243594848616809603611032576004359585871680970361103257604435906001600160801b0382168092036110325760405197610fc889613110565b8852602088015260408701526060860152608085015260a084015260c0830152604061010319360112611032576040519161100283613149565b610104359182168203611032578261102a9260209452610124358482015260e0820152613bff565b604051908152f35b600080fd5b503461059057602036600319011261059057600435808252600b60205260ff600160408420015460d01c16156106345760026040836001600160801b039360209552600b855220015416604051908152f35b5034610590576020366003190112610590576110a361304d565b6001600160a01b038083541633810361115d575081169081835260026020526001600160801b0360408420541690811561112c57816110fd918486526002602052604086206001600160801b0319815416905533906146e7565b6040519081527fca7a4a65a94ed2f37538814e00e1cd4c41a78261561e3f3794592f11409cf5af60203392a380f35b602483604051907f8410168c0000000000000000000000000000000000000000000000000000000082526004820152fd5b6040516331b339a960e21b81526001600160a01b03919091166004820152336024820152604490fd5b50346105905760603660031901126105905767ffffffffffffffff600435818111610988576111b99036906004016130ae565b916111c2613063565b9060443590811161046b576111db9036906004016130ae565b90936111e561468b565b81810361151757855b8181106111f9578680f35b611204818387614775565b3590611211818589614775565b35916001600160801b03831683036110325761122b61468b565b61123481613821565b6105785761125881600052600b6020526001600160a01b0360406000205416331490565b801580611507575b61054557818a5260056020526001600160a01b0360408b20541690806114f4575b6114c7576001600160a01b038716156104e9576001600160801b038416156114af576001600160801b036112b48361474d565b16806001600160801b0386161161148257508990828252600b8060205261131b60026103886112ec898360408920015460801c61479b565b918787528460205260408720019182906001600160801b036001600160801b031983549260801b169116179055565b6001600160801b0361133f8160208401511692826040818351169201511690613858565b161115611452575b8383526020526113716001600160801b038616896001600160a01b036001604087200154166146e7565b8033141580611448575b6113e2575b5050602060008051602061495f833981519152916001946001600160801b0360405191168152817ffa54f9f9bdcdd28778cbb9f78490df6691cc4e2729588e10f4cc0a26c465686a846001600160a01b038c1693a3604051908152a1016111ee565b803b1561046f57816001600160a01b0360848a8360405195869485936313375c3b60e01b85528a60048601523360248601521660448401526001600160801b038b1660648401525af11561138057611439906130df565b611444578838611380565b8880fd5b50803b151561137b565b838352806020526040832060018101600160c81b60ff60c81b1982541617905560ff60f01b198154169055611347565b826064916001600160801b03876040519363287ecaef60e21b855260048501521660248301526044820152fd5b6024826040519063d2aabcd960e01b82526004820152fd5b6064826001600160a01b038960405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b50806001600160a01b0388161415611281565b50611511826147b6565b15611260565b604491604051917faec9344000000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b50346105905760403660031901126105905761156761304d565b60243590811515809203611032576001600160a01b0316908133146115da5733835260086020526040832082600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a380f35b606460405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152fd5b5034610590576101603660031901126105905761163961468b565b6040519061164682613110565b61164e61304d565b8252611658613063565b60208301526116656131a3565b60408301526001600160a01b03906064358281168103611032576060840152608435801515810361103257608084015260a43580151581036110325760a084015260603660c319011261059057506040516116bf8161312d565b64ffffffffff60c435818116810361103257825260e435818116810361103257602083015261010435908116810361103257604082015260c0830152604061012319360112611032576040519161171583613149565b610124359182168203611032578261102a9260209452610144358482015260e0820152613bff565b5034610590578060031936011261059057604051908060045491600183811c92818516948515611840575b602095868610811461182c5785885287949392918790821561180a5750506001146117b0575b505061179c92500383613165565b610907604051928284938452830190613028565b90859250600482527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5b8583106117f257505061179c9350820101388061178e565b805483890185015287945086939092019181016117da565b925093505061179c94915060ff191682840152151560051b820101388061178e565b602483634e487b7160e01b81526022600452fd5b93607f1693611768565b503461059057602036600319011261059057600435808252600b60205260ff600160408420015460d01c161561063457600160408364ffffffffff9360209552600b855220015460a01c16604051908152f35b503461059057602036600319011261059057600435808252600b60205260ff600160408420015460d01c1615610634576118d690613afd565b9060058210159081611917576002831491821561192b575b8215611902575b6020836040519015158152f35b909150611917575060046020911438806118f5565b80634e487b7160e01b602492526021600452fd5b5060038314915060006118ee565b5034610590576020366003190112610590576004356001600160a01b0390818116809103610988578183541633810361115d575060015491816001600160a01b03198416176001556040519216825260208201527fdcb09aef4bf01068924ccce937981cbe59d25ba08380cf941aaaea4e4bd3960d60403392a280f35b5034610590576020366003190112610590576040516119d4816130f3565b8181528160208201528160408201528160608201528160808201528160a08201528160c08201528160e08201528161010082015281610120820152610140611a1a613797565b9101526004358152600b60205260ff600160408320015460d01c1615611bf2576004358152600b60205260408120611af3600260405192611a5a846130f3565b80546001600160a01b038116855264ffffffffff8160a01c16602086015264ffffffffff8160c81c16604086015260ff8160f01c161515606086015260f81c1515608085015260ff60018201546001600160a01b03811660a087015264ffffffffff8160a01c1660c0870152818160c81c16151560e0870152818160d01c16151561010087015260d81c161515610120850152016137b6565b610140820152611b04600435613afd565b6005811015610eea579160026101a09314611be7575b5061085c610140604051926001600160a01b03815116845264ffffffffff602082015116602085015264ffffffffff60408201511660408501526060810151151560608501526080810151151560808501526001600160a01b0360a08201511660a085015264ffffffffff60c08201511660c085015260e0810151151560e0850152610100810151151561010085015261012081015115156101208501520151610140830190604090816001600160801b0391828151168552826020820151166020860152015116910152565b606082015238611b1a565b602460405162b8e7e760e51b81526004356004820152fd5b503461059057602090816003193601126105905760043567ffffffffffffffff811161046f57611c3f839136906004016130ae565b90611c4861468b565b83915b808310611c56578480f35b611c6583828497959697614775565b3593611c6f61468b565b611c7885613821565b15611c955760248560405190634a5541ef60e01b82526004820152fd5b90919293611ca281613887565b611ffd57611cc681600052600b6020526001600160a01b0360406000205416331490565b1580611fdf575b611fbf57611cda816138b8565b818652600b90818852611cf2600260408920016137b6565b6001600160801b0391828251168382161015611fa757848952838a5260ff60408a205460f01c1615611f8f57928282611d4486838e611d3a8f9a829a60409e9d9a5116613858565b9401511690613858565b84875283865288872091611dca835494600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff87161785556003818516958615611f75575b0190831699818b6001600160801b0319819454161790556001600160a01b0380971696879160058c52818f82205416998c5260019e8f91200154166146e7565b338403611eb357843b611e2c575b50507f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd2604060008051602061495f8339815191529786935b825191825288820152a4604051908152a1019190939293611c4b565b90919293809596503b15611eaf576040516372eba20360e01b8152600481018790526001600160a01b03851660248201526001600160801b039182166044820152911660648201528b94939291908b90818160848183895af115611dd857611e9a91929395979496506130df565b611eab57918a939194928a8d611dd8565b8980fd5b8b80fd5b833b611ef6575b50507f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd2604060008051602061495f833981519152978693611e10565b90919280949596503b15611eaf576040516372eba20360e01b8152600481018790526001600160a01b03861660248201526001600160801b039182166044820152911660648201528b94939291908b90818160848183885af115611eba57611f6491929395979496506130df565b611eab57918a939194928a8d611eba565b60018101600160c81b60ff60c81b19825416179055611d8a565b602485604051906339c6dc7360e21b82526004820152fd5b602485604051906322cad1af60e11b82526004820152fd5b60405163216caf0d60e01b81526004810191909152336024820152604490fd5b50808552600586526001600160a01b03604086205416331415611ccd565b6024906040519063fe19f19f60e01b82526004820152fd5b50346105905760208060031936011261046f576004359061203461468b565b818352600b815260ff600160408520015460d01c16156121ee5761205782613afd565b60058110156121da57600481036120805760248360405190634a5541ef60e01b82526004820152fd5b600381036120a0576024836040519063fe19f19f60e01b82526004820152fd5b6002146121c2576120c782600052600b6020526001600160a01b0360406000205416331490565b1561054557818352600b815260ff604084205460f01c16156121aa57818352600b81526040832060ff60f01b19815416905560058152826001600160a01b03604082205416803b612153575b505060405160008051602061495f83398151915292807f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f8680a28152a180f35b803b1561046f578180916024604051809481937f341a0bd90000000000000000000000000000000000000000000000000000000083528960048401525af1156121135761219f906130df565b610988578238612113565b602482604051906339c6dc7360e21b82526004820152fd5b602482604051906322cad1af60e11b82526004820152fd5b602484634e487b7160e01b81526021600452fd5b6024826040519062b8e7e760e51b82526004820152fd5b5034610590576020366003190112610590576004356001600160a01b0390818116809103610988578183541633810361115d5750600a5491816001600160a01b0319841617600a556040519216825260208201527fa2548bd4b805e907c1558a47b5858324fe8bb4a2e1ddfca647eecbf65610eebc60403392a260095460001981019081116122c25760407f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c91815190600182526020820152a180f35b602482634e487b7160e01b81526011600452fd5b503461059057602036600319011261059057600435808252600b60205260ff600160408420015460d01c16156106345760408264ffffffffff9260209452600b8452205460c81c16604051908152f35b50346105905760203660031901126105905761234061304d565b9080546001600160a01b0380821693338503612392576001600160a01b03199394501691829116178255337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808380a380f35b6040516331b339a960e21b81526001600160a01b0386166004820152336024820152604490fd5b5034610590576020366003190112610590576001600160a01b036123db61304d565b1680156123f8578160409160209352600683522054604051908152f35b608460405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e657200000000000000000000000000000000000000000000006064820152fd5b5034610590576020366003190112610590576001600160a01b0360406020926004356124a76108978260005260056020526001600160a01b0360406000205416151590565b815260058452205416604051908152f35b50346105905760203660031901126105905760206124d7600435613204565b6001600160a01b0360405191168152f35b503461059057806003193601126105905760206001600160a01b0360015416604051908152f35b50346105905760203660031901126105905760ff6001604060043593848152600b60205220015460d01c161561063457610701602091613b84565b50346105905760203660031901126105905760043590818152600b60205260ff600160408320015460d01c16156121ee578061258583613afd565b9260058410156125c0576002602094036125a6575b50506040519015158152f35b8152600b8352604090205460f01c60ff169050388061259a565b602482634e487b7160e01b81526021600452fd5b5034610590576020366003190112610590576004356125f161468b565b6125fa81613821565b156126fb57612608816147b6565b15611fbf5761261681613204565b61261f826137ea565b1590816126f3575b816126e0575b506126c85760208161264d60008051602061495f83398151915293613204565b90808552600783526001600160a01b0360408620926001600160a01b03199384815416905516918286526006845260408620600019815401905581865260058452604086209081541690558085604051937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a48152a180f35b602490604051906378630aa960e01b82526004820152fd5b6001600160a01b0391501615153861262d565b839150612627565b602490604051907f817cd6390000000000000000000000000000000000000000000000000000000082526004820152fd5b50346105905761273b36613079565b60405191602083019383851067ffffffffffffffff86111761276657610e76946040528584526132d7565b634e487b7160e01b600052604160045260246000fd5b50346105905760203660031901126105905760206105d8600435613821565b50346105905760208060031936011261046f57600435906127ba61468b565b6127c382613821565b156127e05760248260405190634a5541ef60e01b82526004820152fd5b6127e982613887565b612b1e5761280d82600052600b6020526001600160a01b0360406000205416331490565b1580612b00575b61054557612821826138b8565b91808452600b8252612838600260408620016137b6565b6001600160801b0393848251168582161015612ae857828652600b845260ff604087205460f01c1615612ad0578161287c828787611d3a6040968383995116613858565b848852600b845282882091612902835498600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8b161785558a6003828616968715612ab6575b019184169a828c6001600160801b03198195541617905560016001600160a01b0380921698899360058c52600b8483832054169c52200154166146e7565b3384036129cd57908891853b612960575b5050507f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd2604060008051602061495f8339815191529786935b825191825288820152a4604051908152a180f35b853b15610988576040516372eba20360e01b8152600481018890526001600160a01b03861660248201526001600160801b03918216604482015291166064820152818160848183895af16129b5575b80612913565b6129be906130df565b6129c95786386129af565b8680fd5b83989792983b612a15575b50507f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd26040859260008051602061495f833981519152989961294c565b833b15612ab2576040516372eba20360e01b8152600481018790526001600160a01b03861660248201526001600160801b03918216604482015291166064820152868160848183875af1612a6a575b806129d8565b6040859260008051602061495f83398151915298612aa87f2971bd77136e1a620a6b1eb4ad5edd190e9fd391b26bfc5dea50b882fc6b9fd2946130df565b9850925050612a64565b8780fd5b60018101600160c81b60ff60c81b198254161790556128c4565b602483604051906339c6dc7360e21b82526004820152fd5b602483604051906322cad1af60e11b82526004820152fd5b50818352600581526001600160a01b03604084205416331415612814565b6024826040519063fe19f19f60e01b82526004820152fd5b5034610590576020366003190112610590576001600160801b0360406020926001600160a01b03612b6561304d565b16815260028452205416604051908152f35b503461059057610e76612b8936613079565b91612b9c612b97843361336d565b613266565b61344c565b50346105905780600319360112610590576020600954604051908152f35b503461059057602036600319011261059057600435808252600b60205260ff600160408420015460d01c161561063457612bf890613afd565b9060058210156119175760208215838115612c19575b506040519015158152f35b600191501482612c0e565b50346105905760203660031901126105905760043590818152600b60205260ff600160408320015460d01c16156121ee57602091604082828152600b85522060ff815460f01c1680612cb2575b612c89575b50506001600160801b0360405191168152f35b612cab92506001600160801b036002612ca592015416916138b8565b90613858565b3880612c76565b5060ff600182015460c81c1615612c71565b503461059057604036600319011261059057612cde61304d565b602435906001600160a01b038080612cf585613204565b16921691808314612de957803314908115612dc8575b5015612d5e57828452600760205260408420826001600160a01b0319825416179055612d3683613204565b167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258480a480f35b608460405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152fd5b9050845260086020526040842033855260205260ff60408520541638612d0b565b608460405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152fd5b50346105905760203660031901126105905760206124d7600435613229565b5034610590578060031936011261059057604051908060035491600183811c92818516948515612f2a575b602095868610811461182c5785885287949392918790821561180a575050600114612ed057505061179c92500383613165565b90859250600382527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b858310612f1257505061179c9350820101388061178e565b80548389018501528794508693909201918101612efa565b93607f1693612e9d565b90503461046f57602036600319011261046f576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361098857602092507f80ac58cd000000000000000000000000000000000000000000000000000000008114908115612fdb575b8115612fb1575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501438612faa565b7f5b5e139f0000000000000000000000000000000000000000000000000000000081149150612fa3565b60005b8381106130185750506000910152565b8181015183820152602001613008565b9060209161304181518092818552858086019101613005565b601f01601f1916010190565b600435906001600160a01b038216820361103257565b602435906001600160a01b038216820361103257565b6060906003190112611032576001600160a01b0390600435828116810361103257916024359081168103611032579060443590565b9181601f840112156110325782359167ffffffffffffffff8311611032576020808501948460051b01011161103257565b67ffffffffffffffff811161276657604052565b610160810190811067ffffffffffffffff82111761276657604052565b610100810190811067ffffffffffffffff82111761276657604052565b6060810190811067ffffffffffffffff82111761276657604052565b6040810190811067ffffffffffffffff82111761276657604052565b90601f8019910116810190811067ffffffffffffffff82111761276657604052565b67ffffffffffffffff811161276657601f01601f191660200190565b604435906001600160801b038216820361103257565b156131c057565b606460405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152fd5b60005260056020526001600160a01b03604060002054166132268115156131b9565b90565b61324c6108978260005260056020526001600160a01b0360406000205416151590565b60005260076020526001600160a01b036040600020541690565b1561326d57565b608460405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f766564000000000000000000000000000000000000006064820152fd5b906132fb9392916132eb612b97843361336d565b6132f683838361344c565b613605565b1561330257565b60405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b906001600160a01b03808061338184613204565b169316918383149384156133b4575b50831561339e575b50505090565b6133aa91929350613229565b1614388080613398565b909350600052600860205260406000208260005260205260ff604060002054169238613390565b156133e257565b608460405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152fd5b90613475929161345b83613204565b916001600160a01b039485938480941696879116146133db565b169081158061356c57613487846137ea565b159081613563575b508061355a575b61354257918084926134c460008051602061495f833981519152966020966134bd85613204565b16146133db565b60009382855260078652604085206001600160a01b031990818154169055818652600687526040862060001981540190558286526040862060018154019055838652600587528260408720918254161790557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6040519580a48152a1565b602483604051906378630aa960e01b82526004820152fd5b50831515613496565b9050153861348f565b608460405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152fd5b3d15613600573d906135e682613187565b916135f46040519384613165565b82523d6000602084013e565b606090565b9290803b1561378e5761366f916020916001600160a01b0394604051809581948293897f150b7a02000000000000000000000000000000000000000000000000000000009b8c86523360048701521660248501526044840152608060648401526084830190613028565b03916000968791165af19082908261372e575b5050613708576136906135d5565b805190816137035760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000161490565b909192506020813d8211613786575b8161374a60209383613165565b8101031261046f5751907fffffffff00000000000000000000000000000000000000000000000000000000821682036105905750903880613682565b3d915061373d565b50505050600190565b604051906137a48261312d565b60006040838281528260208201520152565b906040516137c38161312d565b6040819360018154916001600160801b0392838116865260801c6020860152015416910152565b80600052600b60205260ff60016040600020015460d01c161561063457600052600b60205260ff60016040600020015460d81c1690565b80600052600b60205260ff60016040600020015460d01c161561063457600052600b60205260ff60016040600020015460c81c1690565b6001600160801b03918216908216039190821161387157565b634e487b7160e01b600052601160045260246000fd5b80600052600b60205260ff60016040600020015460d01c161561063457600052600b60205260406000205460f81c90565b600090808252600b6020526040822091825464ffffffffff42818360c81c16116139665780600186015460a01c169182421015613950576139059394955060a01c1680910390420361396e565b90828152600b6020526001600160801b039261392b846002604085200154168094613a4e565b9283116139385750501690565b60029350604092508152600b60205220015460801c90565b505050505060026001600160801b039101541690565b505091505090565b670de0b6b3a7640000916000198383099280830292838086109503948086039514613a2a57828510156139ee57908291096001821901821680920460028082600302188083028203028083028203028083028203028083028203028083028203028092029003029360018380600003040190848311900302920304170290565b82606492604051927f63a05778000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b505080925015613a38570490565b634e487b7160e01b600052601260045260246000fd5b90919060001983820983820291828083109203918083039214613aec57670de0b6b3a76400009081831015613ab557947faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066994950990828211900360ee1b910360121c170290565b60449086604051917f5173648d00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050670de0b6b3a764000090049150565b80600052600b602052604060002060ff600182015460c81c16600014613b24575050600490565b805460f81c613b7d575460a01c64ffffffffff164210613b7757613b47816138b8565b90600052600b6020526001600160801b038060026040600020015416911610600014613b7257600190565b600290565b50600090565b5050600390565b80600052600b602052613b9d60026040600020016137b6565b81600052600b602052604060002060ff600182015460c81c16600014613bd057506001600160801b039150602001511690565b5460f81c613be25750613226906138b8565b61322691506001600160801b036040818351169201511690613858565b906001600160a01b036001541660206001600160a01b036060850151166024604051809481937fdcf844a700000000000000000000000000000000000000000000000000000000835260048301525afa8015614422576000906143ee575b613c8091506001600160801b0360408501511690602060e086015101519161481f565b916001600160801b0383511660c082015190156143c45764ffffffffff815116602082019064ffffffffff8251169081811161438457505064ffffffffff604091511691019064ffffffffff825116908181101561434457505064ffffffffff8042169151169081811015614304575050600954926001600160801b0381511660405190613d0d8261312d565b815260006020820152600060408201526001600160a01b036060840151169060c08401519164ffffffffff6020840151169064ffffffffff604085015116906080870151151560a088015115159364ffffffffff6001600160a01b038a511697511660405197613d7c896130f3565b88526020880152604087015260608601526000608086015260a085015260c0840152600060e0840152600161010084015261012083015261014082015284600052600b60205260406000206001600160a01b038251166001600160a01b0319825416178155613e1364ffffffffff602084015116829064ffffffffff60a01b1964ffffffffff60a01b83549260a01b169116179055565b604082015181547eff0000000000000000000000000000000000000000000000000000000000006060850151151560f01b169078ffffffffffffffffffffffffffffffffffffffffffffffffff7dffffffffff000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000006080880151151560f81b169460c81b1691161717178155600181016001600160a01b0360a0840151166001600160a01b0319825416178155613f0a64ffffffffff60c085015116829064ffffffffff60a01b1964ffffffffff60a01b83549260a01b169116179055565b60e083015181546101008501516101208601517fffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff90921692151560c81b79ff00000000000000000000000000000000000000000000000000169290921791151560d01b7aff0000000000000000000000000000000000000000000000000000169190911790151560d81b7bff00000000000000000000000000000000000000000000000000000016179055610140909101518051602082015160801b6001600160801b03199081166001600160801b03928316176002850155926040906003019201511682825416179055600185016009556001600160a01b0360608401511660005260026020526001600160801b0380604060002054168160208501511601166001600160a01b036060850151166000526040600020918254161790556001600160a01b0360208301511680156142c05761408561407f8660005260056020526001600160a01b0360406000205416151590565b156145a8565b61408e856137ea565b15806142b7575b806142af575b61429757602060008051602061495f833981519152916140d461407f8860005260056020526001600160a01b0360406000205416151590565b806000526006825260406000206001815401905586600052600582526040600020816001600160a01b0319825416179055866040519160007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4868152a16141646001600160a01b036060840151166001600160801b0380845116816020860151160116903090339061442e565b6001600160801b0360408201511680614268575b506001600160a01b038251167f075861cbceafeb777e8f15f357121b08f6f3adba387d599bb7b5278ca6192df5610160866001600160a01b036020870151169461425f6001600160a01b03606089015116976080810151151560a08201511515906142296001600160a01b0360e060c08601519501515116956040519788523360208901526040880190604090816001600160801b0391828151168552826020820151166020860152015116910152565b60a086015260c0850152805164ffffffffff90811660e08601526020820151811661010086015260409091015116610120840152565b610140820152a4565b614291906001600160a01b036060850151166001600160a01b0360e0860151511690339061442e565b38614178565b602485604051906378630aa960e01b82526004820152fd5b50600061409b565b50801515614095565b606460405162461bcd60e51b815260206004820152602060248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152fd5b6040517f210aec0e00000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b6040517f9fee269100000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b6040517f4c23297000000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b60046040517f6095d3bc000000000000000000000000000000000000000000000000000000008152fd5b6020823d60201161441a575b8161440760209383613165565b810103126105905750613c809051613c5d565b3d91506143fa565b6040513d6000823e3d90fd5b9290604051927f23b872dd0000000000000000000000000000000000000000000000000000000060208501526001600160a01b03809216602485015216604483015260648201526064815260a081019181831067ffffffffffffffff8411176127665761449d9260405261449f565b565b6001600160a01b0316906144ff6040516144b881613149565b6020938482527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564858301526000808587829751910182855af16144f96135d5565b916145f3565b805191821591848315614584575b50505090501561451a5750565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b91938180945001031261046f5782015190811515820361059057508038808461450d565b156145af57565b606460405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152fd5b919290156146545750815115614607575090565b3b156146105790565b606460405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b8251909150156146675750805190602001fd5b6105649060405191829162461bcd60e51b8352602060048401526024830190613028565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036146bd57565b60046040517fa1c0d6e5000000000000000000000000000000000000000000000000000000008152fd5b916001600160a01b03604051927fa9059cbb000000000000000000000000000000000000000000000000000000006020850152166024830152604482015260448152608081019181831067ffffffffffffffff8411176127665761449d9260405261449f565b6132269061475a81613b84565b90600052600b60205260026040600020015460801c90613858565b91908110156147855760051b0190565b634e487b7160e01b600052603260045260246000fd5b9190916001600160801b038080941691160191821161387157565b60009080825260056020526001600160a01b0380604084205416928333149384156147fb575b505082156147e957505090565b9091506147f63392613229565b161490565b60ff92945090604091815260086020528181203382526020522054169138806147dc565b90929161482a613797565b936001600160801b03928381169182156149365767016345785d8a00008082116148ff578085116148c8575061487485614865819386613a4e565b16946020890195865284613a4e565b16918461488b60408901948086528287511661479b565b1610156148b2576148a48491826148ad95511690613858565b91511690613858565b168252565b634e487b7160e01b600052600160045260246000fd5b84604491604051917f4fea5c1a00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b60449250604051917f47152d6700000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b505050505090506040516149498161312d565b6000815260006020820152600060408201529056fef8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7a164736f6c6343000815000a"; + hex"60a034620003e757601f196001600160401b03601f62004c633881900382810185168601919084831187841017620003ec57808792606094604052833981010312620003e75783516001600160a01b03928382169291839003620003e7576020918287015196858816809803620003e75760400151948516809503620003e7576200008962000402565b90601c82527f5361626c696572205632204c6f636b7570204c696e656172204e46540000000084830152620000bd62000402565b601181527029a0a116ab1916a627a1a5aaa816a624a760791b8582015230608052600080546001600160a01b031990811688178255600180548216909b178b5596817fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a38351858111620003d35760039485548c81811c91168015620003c8575b89821014620003b45790818684931162000361575b508890868311600114620002f8578492620002ec575b505060001982871b1c1916908b1b1784555b8151948511620002d8576004958654998b8b811c9b168015620002cd575b828c1014620002ba57848b1162000271575b869798999a50819487116001146200020a57505093620001fe575b505082871b92600019911b1c19161790555b600a541617600a5560095560405161484090816200042382396080518161454a0152f35b015191503880620001c8565b8883528183208c9890969594939116915b8282106200025757505085116200023c575b50505050811b019055620001da565b01519060f884600019921b161c19169055388080806200022d565b8484015187558c989096019593840193908101906200021b565b87835281832085880160051c81019b838910620002af575b860160051c019a8c905b8c8110620002a3575050620001ad565b848155018c9062000293565b909b508b9062000289565b634e487b7160e01b835260228852602483fd5b9a607f169a6200019b565b634e487b7160e01b81526041600452602490fd5b0151905038806200016b565b908c8e9416918886528a862092865b8c82821062000341575050841162000328575b505050811b0184556200017d565b015160001983891b60f8161c191690553880806200031a565b91929395968291958786015181550195019301908f959493929162000307565b9091508684528884208680850160051c8201928b8610620003aa575b918f91869594930160051c01915b8281106200039b57505062000155565b8681558594508f91016200038b565b925081926200037d565b634e487b7160e01b84526022600452602484fd5b90607f169062000140565b634e487b7160e01b82526041600452602482fd5b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620003ec5760405256fe608080604052600436101561001357600080fd5b600090813560e01c90816301ffc9a714612de95750806306fdde0314612d27578063081812fc14612d08578063095ea7b314612b795780631400ecec14612ad95780631c1cdd4c14612a745780631e99d56914612a5657806323b872dd14612a2c57806339a73c03146129eb57806340e58ee51461272b578063425d30dd1461270c57806342842e0e146126bc57806342966c68146125645780634857501f146124da5780634869e12d1461249f5780635fe3b567146124785780636352211e146124485780636d0cee75146123f257806370a082311461234957806375829def146122b6578063780a82c8146122665780637cad6cd1146121955780637de6b1db14611f865780638659c27014611c60578063894e9a0d14611a0c5780638bad38dd1461198f5780638f69b993146118f35780639067b677146118a057806395d89b411461179357806396ce143114611674578063a22cb465146115a3578063a2ffb897146111c8578063a6202bf2146110cb578063a80fc07114611079578063ab167ccc14610f40578063ad35efd414610ede578063b256456914610ebf578063b88d4fde14610e32578063b8a3be6614610dfd578063b971302a14610dae578063bc063e1a14610d8b578063bc2be1be14610d3b578063c156a11d146109af578063c87b56dd14610875578063cc364f48146107c7578063d4dbd20b14610775578063d511609f14610729578063d975dfed146106dd578063e985e9c514610688578063ea5ead1914610662578063eac8f5b8146105f9578063f590c176146105d0578063f851a440146105aa5763fdd46d601461027357600080fd5b346105a75760603660031901126105a75760043561028f612f18565b610297613058565b906102a0614540565b6102a9836136d6565b61058f576102cd83600052600b6020526001600160a01b0360406000205416331490565b9081158061057f575b61056057838552602092600584526001600160a01b0391826040882054169380610554575b61052e57828116928315610504576001600160801b038084169384156104ec5761032489614602565b82811686116104b85750938093926103ca9261038f6103578d9a99988d8c52600b8d52600260408d20015460801c614650565b8c8b52600b8c5261038a600260408d20019182906001600160801b036001600160801b031983549260801b169116179055565b61366b565b906103ab818c840151169282604081835116920151169061370d565b161115610488575b898852600b8952600160408920015416928361459c565b82877f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d88604051868152a4823314158061047e575b610420575b836000805160206148148339815191528688604051908152a180f35b823b1561047a57608484928360405195869485936313375c3b60e01b85528b6004860152336024860152604485015260648401525af1610462575b8080610404565b61046b90612f94565b61047657823861045b565b8280fd5b8380fd5b50823b15156103ff565b898852600b89526040882060018101600160c81b60ff60c81b1982541617905560ff60f01b1981541690556103b3565b60405163287ecaef60e21b8152600481018b90526001600160801b03928316602482015291166044820152606490fd5b0390fd5b6024896040519063d2aabcd960e01b82526004820152fd5b60046040517fc61a0e9e000000000000000000000000000000000000000000000000000000008152fd5b858360649260405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b508383821614156102fb565b60405163216caf0d60e01b815260048101859052336024820152604490fd5b506105898461466b565b156102d6565b60248360405190634a5541ef60e01b82526004820152fd5b80fd5b50346105a757806003193601126105a7576001600160a01b036020915416604051908152f35b50346105a75760203660031901126105a75760206105ef60043561373c565b6040519015158152f35b50346105a75760203660031901126105a757600435808252600b60205260ff600160408420015460d01c161561064b5760016040836001600160a01b039360209552600b855220015416604051908152f35b6024906040519062b8e7e760e51b82526004820152fd5b50346105a75760403660031901126105a75760043561067f612f18565b61029782614602565b50346105a75760403660031901126105a7576106a2612f02565b60406106ac612f18565b926001600160a01b0380931681526008602052209116600052602052602060ff604060002054166040519015158152f35b50346105a75760203660031901126105a75760ff6001604060043593848152600b60205220015460d01c161561064b57610718602091614602565b6001600160801b0360405191168152f35b50346105a75760203660031901126105a757600435808252600b60205260ff600160408420015460d01c161561064b5760408260029260209452600b845220015460801c604051908152f35b50346105a75760203660031901126105a757600435808252600b60205260ff600160408420015460d01c161561064b5760036040836001600160801b039360209552600b855220015416604051908152f35b50346105a75760203660031901126105a7576004356107e461364c565b50808252600b60205260ff600160408420015460d01c161561064b578160409160609352600b60205220600181549164ffffffffff918291015460a01c16906040519261083084612fe2565b818160a01c16845260c81c166020830152604082015261087360405180926040908164ffffffffff91828151168552826020820151166020860152015116910152565bf35b50346105a75760208060031936011261099f576004356108b36108ae8260005260056020526001600160a01b0360406000205416151590565b61306e565b826001600160a01b03600a5416916044604051809481937fe9dc637500000000000000000000000000000000000000000000000000000000835230600484015260248301525afa9283156109a3578093610922575b505061091e604051928284938452830190612edd565b0390f35b909192503d8082843e610935818461301a565b820191838184031261099f5780519067ffffffffffffffff8211610476570182601f8201121561099f5780519161096b8361303c565b93610979604051958661301a565b8385528584840101116105a757509061099791848085019101612eba565b903880610908565b5080fd5b604051903d90823e3d90fd5b50346105a75760403660031901126105a7576004356109cc612f18565b906109d5614540565b808352602090600b825260ff600160408620015460d01c161561064b57808452600582526001600160a01b03928360408620541693843303610d1c57610a1a83614602565b906001600160801b0390818316918215938415610a59575b896000805160206148148339815191528989610a4f818b8f613301565b604051908152a180f35b610a61614540565b610a6a876136d6565b610d0457610a8e87600052600b6020526001600160a01b0360406000205416331490565b94851580610cf4575b610cd557878b52600589528360408c2054169580610ccb575b610ca757891561050457610c8f57610ac787614602565b8281168511610c5f575090610b27610af48b96959493898852600b8b52600260408920015460801c614650565b888752600b8a5261038a600260408920019182906001600160801b036001600160801b031983549260801b169116179055565b90610b43818a840151169282604081835116920151169061370d565b161115610c2f575b858452600b8752600160408520015416610b6682898361459c565b87867f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d89604051868152a48133141580610c25575b610bca575b50505081610a4f91600080516020614814833981519152958686604051858152a195819338610a32565b813b156104765782916084839260405194859384926313375c3b60e01b84528a60048501523360248501528c604485015260648401525af1610c0d575b80610ba0565b610c1690612f94565b610c21578438610c07565b8480fd5b50813b1515610b9b565b858452600b87526040842060018101600160c81b60ff60c81b1982541617905560ff60f01b198154169055610b4b565b60405163287ecaef60e21b8152600481018990526001600160801b03928316602482015291166044820152606490fd5b6024876040519063d2aabcd960e01b82526004820152fd5b6064888b60405191632dcbf6b960e11b835260048301523360248301526044820152fd5b50858a1415610ab0565b60405163216caf0d60e01b815260048101899052336024820152604490fd5b50610cfe8861466b565b15610a97565b60248760405190634a5541ef60e01b82526004820152fd5b60405163216caf0d60e01b815260048101849052336024820152604490fd5b50346105a75760203660031901126105a757600435808252600b60205260ff600160408420015460d01c161561064b5760408264ffffffffff9260209452600b8452205460a01c16604051908152f35b50346105a757806003193601126105a757602060405167016345785d8a00008152f35b50346105a75760203660031901126105a757600435808252600b60205260ff600160408420015460d01c161561064b576040826001600160a01b039260209452600b8452205416604051908152f35b50346105a75760203660031901126105a75760ff600160406020936004358152600b855220015460d01c166040519015158152f35b50346105a75760803660031901126105a757610e4c612f02565b610e54612f18565b906064359067ffffffffffffffff821161047a573660238301121561047a5781600401359284610e838561303c565b93610e91604051958661301a565b858552366024878301011161099f5785610ebc9660246020930183880137850101526044359161318c565b80f35b50346105a75760203660031901126105a75760206105ef60043561369f565b50346105a75760203660031901126105a757600435808252600b60205260ff600160408420015460d01c161561064b57610f17906139b2565b604051906005811015610f2c57602092508152f35b602483634e487b7160e01b81526021600452fd5b50346105a7576101403660031901126105a757610f5b614540565b610f6361364c565b9064ffffffffff80421680845260c43582811681036110745781018216602085015260e4359081831682036110745701166040830152606435916001600160a01b03918284168094036105a757506084358015158091036110745760a435908115158092036110745760243594848616809603611074576004359585871680970361107457604435906001600160801b038216809203611074576040519761100a89612fc5565b8852602088015260408701526060860152608085015260a084015260c0830152604061010319360112611074576040519161104483612ffe565b610104359182168203611074578261106c9260209452610124358482015260e0820152613ab4565b604051908152f35b600080fd5b50346105a75760203660031901126105a757600435808252600b60205260ff600160408420015460d01c161561064b5760026040836001600160801b039360209552600b855220015416604051908152f35b50346105a75760203660031901126105a7576110e5612f02565b6001600160a01b038083541633810361119f575081169081835260026020526001600160801b0360408420541690811561116e578161113f918486526002602052604086206001600160801b03198154169055339061459c565b6040519081527fca7a4a65a94ed2f37538814e00e1cd4c41a78261561e3f3794592f11409cf5af60203392a380f35b602483604051907f8410168c0000000000000000000000000000000000000000000000000000000082526004820152fd5b6040516331b339a960e21b81526001600160a01b03919091166004820152336024820152604490fd5b50346105a75760603660031901126105a75767ffffffffffffffff600435818111610476576111fb903690600401612f63565b90611204612f18565b92604435908111610c215761121d903690600401612f63565b611228949194614540565b80840361156c5791926001600160a01b038216159290865b81811061124b578780f35b61125681838861462a565b359061126381858a61462a565b356001600160801b03811681036110745761127c614540565b611285836136d6565b61058f576112a983600052600b6020526001600160a01b0360406000205416331490565b80158061155c575b61056057838b5260056020526001600160a01b0360408c2054169080611549575b61151c5787610504576001600160801b03821615611504576112f384614602565b6001600160801b0381166001600160801b038416116114d25750908a91848352600b80602052611363600261038a611334868360408a20015460801c614650565b918988528460205260408820019182906001600160801b036001600160801b031983549260801b169116179055565b6001600160801b03611387816020840151169282604081835116920151169061370d565b1611156114a2575b8584526020526001600160a01b036001604085200154166113ba6001600160801b0384168a8361459c565b6040516001600160801b0384168152867f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d60206001600160a01b038d1693a48033141580611498575b61142c575b5050506000805160206148148339815191526020600193604051908152a101611240565b803b15610476576001600160a01b036084898580946001600160801b0360405197889687956313375c3b60e01b87528d60048801523360248801521660448601521660648401525af1611480575b80611408565b61148990612f94565b61149457883861147a565b8880fd5b50803b1515611403565b858452806020526040842060018101600160c81b60ff60c81b1982541617905560ff60f01b19815416905561138f565b60405163287ecaef60e21b8152600481018690526001600160801b038481166024830152919091166044820152606490fd5b6024846040519063d2aabcd960e01b82526004820152fd5b6064846001600160a01b038960405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b50806001600160a01b03881614156112d2565b506115668461466b565b156112b1565b83604491604051917faec9344000000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b50346105a75760403660031901126105a7576115bd612f02565b60243590811515809203611074576001600160a01b0316908133146116305733835260086020526040832082600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a380f35b606460405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152fd5b50346105a7576101603660031901126105a75761168f614540565b6040519061169c82612fc5565b6116a4612f02565b82526116ae612f18565b60208301526116bb613058565b60408301526001600160a01b03906064358281168103611074576060840152608435801515810361107457608084015260a43580151581036110745760a084015260603660c31901126105a7575060405161171581612fe2565b64ffffffffff60c435818116810361107457825260e435818116810361107457602083015261010435908116810361107457604082015260c0830152604061012319360112611074576040519161176b83612ffe565b610124359182168203611074578261106c9260209452610144358482015260e0820152613ab4565b50346105a757806003193601126105a757604051908060045491600183811c92818516948515611896575b602095868610811461188257858852879493929187908215611860575050600114611806575b50506117f29250038361301a565b61091e604051928284938452830190612edd565b90859250600482527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5b8583106118485750506117f2935082010138806117e4565b80548389018501528794508693909201918101611830565b92509350506117f294915060ff191682840152151560051b82010138806117e4565b602483634e487b7160e01b81526022600452fd5b93607f16936117be565b50346105a75760203660031901126105a757600435808252600b60205260ff600160408420015460d01c161561064b57600160408364ffffffffff9360209552600b855220015460a01c16604051908152f35b50346105a75760203660031901126105a757600435808252600b60205260ff600160408420015460d01c161561064b5761192c906139b2565b906005821015908161196d5760028314918215611981575b8215611958575b6020836040519015158152f35b90915061196d5750600460209114388061194b565b80634e487b7160e01b602492526021600452fd5b506003831491506000611944565b50346105a75760203660031901126105a7576004356001600160a01b0390818116809103610476578183541633810361119f575060015491816001600160a01b03198416176001556040519216825260208201527fdcb09aef4bf01068924ccce937981cbe59d25ba08380cf941aaaea4e4bd3960d60403392a280f35b50346105a75760203660031901126105a757604051611a2a81612fa8565b8181528160208201528160408201528160608201528160808201528160a08201528160c08201528160e08201528161010082015281610120820152610140611a7061364c565b9101526004358152600b60205260ff600160408320015460d01c1615611c48576004358152600b60205260408120611b49600260405192611ab084612fa8565b80546001600160a01b038116855264ffffffffff8160a01c16602086015264ffffffffff8160c81c16604086015260ff8160f01c161515606086015260f81c1515608085015260ff60018201546001600160a01b03811660a087015264ffffffffff8160a01c1660c0870152818160c81c16151560e0870152818160d01c16151561010087015260d81c1615156101208501520161366b565b610140820152611b5a6004356139b2565b6005811015610f2c579160026101a09314611c3d575b50610873610140604051926001600160a01b03815116845264ffffffffff602082015116602085015264ffffffffff60408201511660408501526060810151151560608501526080810151151560808501526001600160a01b0360a08201511660a085015264ffffffffff60c08201511660c085015260e0810151151560e0850152610100810151151561010085015261012081015115156101208501520151610140830190604090816001600160801b0391828151168552826020820151166020860152015116910152565b606082015238611b70565b602460405162b8e7e760e51b81526004356004820152fd5b50346105a757602090816003193601126105a75760043567ffffffffffffffff811161099f57611c9583913690600401612f63565b90611c9e614540565b83915b808310611cac578480f35b611cbb8382849795969761462a565b3593611cc5614540565b611cce856136d6565b15611ceb5760248560405190634a5541ef60e01b82526004820152fd5b90919293611cf88161373c565b611f6e57611d1c81600052600b6020526001600160a01b0360406000205416331490565b15611f4e57611d2a8161376d565b90808652600b91828852611d436002604089200161366b565b926001600160801b0391828551168382161015611f3657838952818a5260ff60408a205460f01c1615611f1e579184939189611d9685848e611d8c81998360409e9d511661370d565b990151169061370d565b84825282865288822093898554600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82161787556003838516978815611f04575b01928a1692836001600160801b03198254161790556001600160a01b0391828092169560058b522054169488528d60019b8c912001541694611e1c82858861459c565b843b611e8f575b5050604080518681526001600160801b0398891660208201529190971696810196909652600080516020614814833981519152957f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa5090606090a4604051908152a1019190939293611ca1565b9091929380959697503b15611f00578d9695949392918d91604051916372eba20360e01b835288600484015285602484015260448301526064820152818160848183895af115611e2357611eea919294969893959750612f94565b611efc57949290918b94928b8e611e23565b8a80fd5b8c80fd5b60018101600160c81b60ff60c81b19825416179055611dd9565b602484604051906339c6dc7360e21b82526004820152fd5b602484604051906322cad1af60e11b82526004820152fd5b60405163216caf0d60e01b81526004810191909152336024820152604490fd5b6024906040519063fe19f19f60e01b82526004820152fd5b50346105a75760208060031936011261099f5760043590611fa5614540565b818352600b815260ff600160408520015460d01c161561217e57611fc8826139b2565b600581101561216a5760048103611ff15760248360405190634a5541ef60e01b82526004820152fd5b60038103612011576024836040519063fe19f19f60e01b82526004820152fd5b6002146121525761203882600052600b6020526001600160a01b0360406000205416331490565b1561213357818352600b815260ff604084205460f01c161561211b57818352600b81526040832060ff60f01b19815416905560058152826001600160a01b03604082205416803b6120c4575b505060405160008051602061481483398151915292807f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f8680a28152a180f35b803b1561099f578180916024604051809481937f341a0bd90000000000000000000000000000000000000000000000000000000083528960048401525af1156120845761211090612f94565b610476578238612084565b602482604051906339c6dc7360e21b82526004820152fd5b60405163216caf0d60e01b815260048101839052336024820152604490fd5b602482604051906322cad1af60e11b82526004820152fd5b602484634e487b7160e01b81526021600452fd5b6024826040519062b8e7e760e51b82526004820152fd5b50346105a75760203660031901126105a7576004356001600160a01b0390818116809103610476578183541633810361119f5750600a5491816001600160a01b0319841617600a556040519216825260208201527fa2548bd4b805e907c1558a47b5858324fe8bb4a2e1ddfca647eecbf65610eebc60403392a260095460001981019081116122525760407f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c91815190600182526020820152a180f35b602482634e487b7160e01b81526011600452fd5b50346105a75760203660031901126105a757600435808252600b60205260ff600160408420015460d01c161561064b5760408264ffffffffff9260209452600b8452205460c81c16604051908152f35b50346105a75760203660031901126105a7576122d0612f02565b9080546001600160a01b0380821693338503612322576001600160a01b03199394501691829116178255337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808380a380f35b6040516331b339a960e21b81526001600160a01b0386166004820152336024820152604490fd5b50346105a75760203660031901126105a7576001600160a01b0361236b612f02565b168015612388578160409160209352600683522054604051908152f35b608460405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e657200000000000000000000000000000000000000000000006064820152fd5b50346105a75760203660031901126105a7576001600160a01b0360406020926004356124376108ae8260005260056020526001600160a01b0360406000205416151590565b815260058452205416604051908152f35b50346105a75760203660031901126105a75760206124676004356130b9565b6001600160a01b0360405191168152f35b50346105a757806003193601126105a75760206001600160a01b0360015416604051908152f35b50346105a75760203660031901126105a75760ff6001604060043593848152600b60205220015460d01c161561064b57610718602091613a39565b50346105a75760203660031901126105a75760043590818152600b60205260ff600160408320015460d01c161561217e5780612515836139b2565b92600584101561255057600260209403612536575b50506040519015158152f35b8152600b8352604090205460f01c60ff169050388061252a565b602482634e487b7160e01b81526021600452fd5b50346105a75760203660031901126105a757600435612581614540565b61258a816136d6565b1561268b576125988161466b565b15611f4e576125a6816130b9565b6125af8261369f565b159081612683575b81612670575b50612658576020816125dd600080516020614814833981519152936130b9565b90808552600783526001600160a01b0360408620926001600160a01b03199384815416905516918286526006845260408620600019815401905581865260058452604086209081541690558085604051937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a48152a180f35b602490604051906378630aa960e01b82526004820152fd5b6001600160a01b039150161515386125bd565b8391506125b7565b602490604051907f817cd6390000000000000000000000000000000000000000000000000000000082526004820152fd5b50346105a7576126cb36612f2e565b60405191602083019383851067ffffffffffffffff8611176126f657610ebc9460405285845261318c565b634e487b7160e01b600052604160045260246000fd5b50346105a75760203660031901126105a75760206105ef6004356136d6565b50346105a757602090816003193601126105a7576004359161274b614540565b612754836136d6565b156127715760248360405190634a5541ef60e01b82526004820152fd5b61277a8361373c565b6129d35761279e83600052600b6020526001600160a01b0360406000205416331490565b15610d1c576127ac8361376d565b92808352600b82526127c36002604085200161366b565b936001600160801b03908186511682821610156129bb57828552600b845260ff604086205460f01c16156129a35780828561280461280e94838b511661370d565b980151169061370d565b828552600b84526040852091825491600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84161784556003828216948515612989575b0191881691826001600160801b03198254161790556001600160a01b0380931691600587528360408920541693600b8852600160408a200154169461289982858861459c565b843b612907575b5050604080518681526001600160801b03998a1660208201529190981697810197909752949560008051602061481483398151915295907f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa5090606090a4604051908152a180f35b843b1561149457604051916372eba20360e01b835287600484015284602484015260448301526064820152878160848183885af1612946575b806128a0565b90600080516020614814833981519152976129817f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa5093612f94565b975090612940565b60018101600160c81b60ff60c81b19825416179055612853565b602483604051906339c6dc7360e21b82526004820152fd5b602483604051906322cad1af60e11b82526004820152fd5b6024836040519063fe19f19f60e01b82526004820152fd5b50346105a75760203660031901126105a7576001600160801b0360406020926001600160a01b03612a1a612f02565b16815260028452205416604051908152f35b50346105a757610ebc612a3e36612f2e565b91612a51612a4c8433613222565b61311b565b613301565b50346105a757806003193601126105a7576020600954604051908152f35b50346105a75760203660031901126105a757600435808252600b60205260ff600160408420015460d01c161561064b57612aad906139b2565b90600582101561196d5760208215838115612ace575b506040519015158152f35b600191501482612ac3565b50346105a75760203660031901126105a75760043590818152600b60205260ff600160408320015460d01c161561217e57602091604082828152600b85522060ff815460f01c1680612b67575b612b3e575b50506001600160801b0360405191168152f35b612b6092506001600160801b036002612b5a920154169161376d565b9061370d565b3880612b2b565b5060ff600182015460c81c1615612b26565b50346105a75760403660031901126105a757612b93612f02565b602435906001600160a01b038080612baa856130b9565b16921691808314612c9e57803314908115612c7d575b5015612c1357828452600760205260408420826001600160a01b0319825416179055612beb836130b9565b167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258480a480f35b608460405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152fd5b9050845260086020526040842033855260205260ff60408520541638612bc0565b608460405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152fd5b50346105a75760203660031901126105a75760206124676004356130de565b50346105a757806003193601126105a757604051908060035491600183811c92818516948515612ddf575b602095868610811461188257858852879493929187908215611860575050600114612d855750506117f29250038361301a565b90859250600382527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b858310612dc75750506117f2935082010138806117e4565b80548389018501528794508693909201918101612daf565b93607f1693612d52565b90503461099f57602036600319011261099f576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361047657602092507f80ac58cd000000000000000000000000000000000000000000000000000000008114908115612e90575b8115612e66575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501438612e5f565b7f5b5e139f0000000000000000000000000000000000000000000000000000000081149150612e58565b60005b838110612ecd5750506000910152565b8181015183820152602001612ebd565b90602091612ef681518092818552858086019101612eba565b601f01601f1916010190565b600435906001600160a01b038216820361107457565b602435906001600160a01b038216820361107457565b6060906003190112611074576001600160a01b0390600435828116810361107457916024359081168103611074579060443590565b9181601f840112156110745782359167ffffffffffffffff8311611074576020808501948460051b01011161107457565b67ffffffffffffffff81116126f657604052565b610160810190811067ffffffffffffffff8211176126f657604052565b610100810190811067ffffffffffffffff8211176126f657604052565b6060810190811067ffffffffffffffff8211176126f657604052565b6040810190811067ffffffffffffffff8211176126f657604052565b90601f8019910116810190811067ffffffffffffffff8211176126f657604052565b67ffffffffffffffff81116126f657601f01601f191660200190565b604435906001600160801b038216820361107457565b1561307557565b606460405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152fd5b60005260056020526001600160a01b03604060002054166130db81151561306e565b90565b6131016108ae8260005260056020526001600160a01b0360406000205416151590565b60005260076020526001600160a01b036040600020541690565b1561312257565b608460405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f766564000000000000000000000000000000000000006064820152fd5b906131b09392916131a0612a4c8433613222565b6131ab838383613301565b6134ba565b156131b757565b60405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b906001600160a01b038080613236846130b9565b16931691838314938415613269575b508315613253575b50505090565b61325f919293506130de565b161438808061324d565b909350600052600860205260406000208260005260205260ff604060002054169238613245565b1561329757565b608460405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152fd5b9061332a9291613310836130b9565b916001600160a01b03948593848094169687911614613290565b16908115806134215761333c8461369f565b159081613418575b508061340f575b6133f7579180849261337960008051602061481483398151915296602096613372856130b9565b1614613290565b60009382855260078652604085206001600160a01b031990818154169055818652600687526040862060001981540190558286526040862060018154019055838652600587528260408720918254161790557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6040519580a48152a1565b602483604051906378630aa960e01b82526004820152fd5b5083151561334b565b90501538613344565b608460405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152fd5b3d156134b5573d9061349b8261303c565b916134a9604051938461301a565b82523d6000602084013e565b606090565b9290803b1561364357613524916020916001600160a01b0394604051809581948293897f150b7a02000000000000000000000000000000000000000000000000000000009b8c86523360048701521660248501526044840152608060648401526084830190612edd565b03916000968791165af1908290826135e3575b50506135bd5761354561348a565b805190816135b85760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000161490565b909192506020813d821161363b575b816135ff6020938361301a565b8101031261099f5751907fffffffff00000000000000000000000000000000000000000000000000000000821682036105a75750903880613537565b3d91506135f2565b50505050600190565b6040519061365982612fe2565b60006040838281528260208201520152565b9060405161367881612fe2565b6040819360018154916001600160801b0392838116865260801c6020860152015416910152565b80600052600b60205260ff60016040600020015460d01c161561064b57600052600b60205260ff60016040600020015460d81c1690565b80600052600b60205260ff60016040600020015460d01c161561064b57600052600b60205260ff60016040600020015460c81c1690565b6001600160801b03918216908216039190821161372657565b634e487b7160e01b600052601160045260246000fd5b80600052600b60205260ff60016040600020015460d01c161561064b57600052600b60205260406000205460f81c90565b600090808252600b6020526040822091825464ffffffffff42818360c81c161161381b5780600186015460a01c169182421015613805576137ba9394955060a01c16809103904203613823565b90828152600b6020526001600160801b03926137e0846002604085200154168094613903565b9283116137ed5750501690565b60029350604092508152600b60205220015460801c90565b505050505060026001600160801b039101541690565b505091505090565b670de0b6b3a76400009160001983830992808302928380861095039480860395146138df57828510156138a357908291096001821901821680920460028082600302188083028203028083028203028083028203028083028203028083028203028092029003029360018380600003040190848311900302920304170290565b82606492604051927f63a05778000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b5050809250156138ed570490565b634e487b7160e01b600052601260045260246000fd5b909190600019838209838202918280831092039180830392146139a157670de0b6b3a7640000908183101561396a57947faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066994950990828211900360ee1b910360121c170290565b60449086604051917f5173648d00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050670de0b6b3a764000090049150565b80600052600b602052604060002060ff600182015460c81c166000146139d9575050600490565b805460f81c613a32575460a01c64ffffffffff164210613a2c576139fc8161376d565b90600052600b6020526001600160801b038060026040600020015416911610600014613a2757600190565b600290565b50600090565b5050600390565b80600052600b602052613a52600260406000200161366b565b81600052600b602052604060002060ff600182015460c81c16600014613a8557506001600160801b039150602001511690565b5460f81c613a9757506130db9061376d565b6130db91506001600160801b03604081835116920151169061370d565b906001600160a01b036001541660206001600160a01b036060850151166024604051809481937fdcf844a700000000000000000000000000000000000000000000000000000000835260048301525afa80156142d7576000906142a3575b613b3591506001600160801b0360408501511690602060e08601510151916146d4565b916001600160801b0383511660c082015190156142795764ffffffffff815116602082019064ffffffffff8251169081811161423957505064ffffffffff604091511691019064ffffffffff82511690818110156141f957505064ffffffffff80421691511690818110156141b9575050600954926001600160801b0381511660405190613bc282612fe2565b815260006020820152600060408201526001600160a01b036060840151169060c08401519164ffffffffff6020840151169064ffffffffff604085015116906080870151151560a088015115159364ffffffffff6001600160a01b038a511697511660405197613c3189612fa8565b88526020880152604087015260608601526000608086015260a085015260c0840152600060e0840152600161010084015261012083015261014082015284600052600b60205260406000206001600160a01b038251166001600160a01b0319825416178155613cc864ffffffffff602084015116829064ffffffffff60a01b1964ffffffffff60a01b83549260a01b169116179055565b604082015181547eff0000000000000000000000000000000000000000000000000000000000006060850151151560f01b169078ffffffffffffffffffffffffffffffffffffffffffffffffff7dffffffffff000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000006080880151151560f81b169460c81b1691161717178155600181016001600160a01b0360a0840151166001600160a01b0319825416178155613dbf64ffffffffff60c085015116829064ffffffffff60a01b1964ffffffffff60a01b83549260a01b169116179055565b60e083015181546101008501516101208601517fffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff90921692151560c81b79ff00000000000000000000000000000000000000000000000000169290921791151560d01b7aff0000000000000000000000000000000000000000000000000000169190911790151560d81b7bff00000000000000000000000000000000000000000000000000000016179055610140909101518051602082015160801b6001600160801b03199081166001600160801b03928316176002850155926040906003019201511682825416179055600185016009556001600160a01b0360608401511660005260026020526001600160801b0380604060002054168160208501511601166001600160a01b036060850151166000526040600020918254161790556001600160a01b03602083015116801561417557613f3a613f348660005260056020526001600160a01b0360406000205416151590565b1561445d565b613f438561369f565b158061416c575b80614164575b61414c57602060008051602061481483398151915291613f89613f348860005260056020526001600160a01b0360406000205416151590565b806000526006825260406000206001815401905586600052600582526040600020816001600160a01b0319825416179055866040519160007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4868152a16140196001600160a01b036060840151166001600160801b038084511681602086015116011690309033906142e3565b6001600160801b036040820151168061411d575b506001600160a01b038251167f075861cbceafeb777e8f15f357121b08f6f3adba387d599bb7b5278ca6192df5610160866001600160a01b03602087015116946141146001600160a01b03606089015116976080810151151560a08201511515906140de6001600160a01b0360e060c08601519501515116956040519788523360208901526040880190604090816001600160801b0391828151168552826020820151166020860152015116910152565b60a086015260c0850152805164ffffffffff90811660e08601526020820151811661010086015260409091015116610120840152565b610140820152a4565b614146906001600160a01b036060850151166001600160a01b0360e086015151169033906142e3565b3861402d565b602485604051906378630aa960e01b82526004820152fd5b506000613f50565b50801515613f4a565b606460405162461bcd60e51b815260206004820152602060248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152fd5b6040517f210aec0e00000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b6040517f9fee269100000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b6040517f4c23297000000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b60046040517f6095d3bc000000000000000000000000000000000000000000000000000000008152fd5b6020823d6020116142cf575b816142bc6020938361301a565b810103126105a75750613b359051613b12565b3d91506142af565b6040513d6000823e3d90fd5b9290604051927f23b872dd0000000000000000000000000000000000000000000000000000000060208501526001600160a01b03809216602485015216604483015260648201526064815260a081019181831067ffffffffffffffff8411176126f65761435292604052614354565b565b6001600160a01b0316906143b460405161436d81612ffe565b6020938482527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564858301526000808587829751910182855af16143ae61348a565b916144a8565b805191821591848315614439575b5050509050156143cf5750565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b91938180945001031261099f578201519081151582036105a75750803880846143c2565b1561446457565b606460405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152fd5b9192901561450957508151156144bc575090565b3b156144c55790565b606460405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b82519091501561451c5750805190602001fd5b6104e89060405191829162461bcd60e51b8352602060048401526024830190612edd565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361457257565b60046040517fa1c0d6e5000000000000000000000000000000000000000000000000000000008152fd5b916001600160a01b03604051927fa9059cbb000000000000000000000000000000000000000000000000000000006020850152166024830152604482015260448152608081019181831067ffffffffffffffff8411176126f65761435292604052614354565b6130db9061460f81613a39565b90600052600b60205260026040600020015460801c9061370d565b919081101561463a5760051b0190565b634e487b7160e01b600052603260045260246000fd5b9190916001600160801b038080941691160191821161372657565b60009080825260056020526001600160a01b0380604084205416928333149384156146b0575b5050821561469e57505090565b9091506146ab33926130de565b161490565b60ff9294509060409181526008602052818120338252602052205416913880614691565b9092916146df61364c565b936001600160801b03928381169182156147eb5767016345785d8a00008082116147b45780851161477d57506147298561471a819386613903565b16946020890195865284613903565b169184614740604089019480865282875116614650565b161015614767576147598491826147629551169061370d565b9151169061370d565b168252565b634e487b7160e01b600052600160045260246000fd5b84604491604051917f4fea5c1a00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b60449250604051917f47152d6700000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b505050505090506040516147fe81612fe2565b6000815260006020820152600060408201529056fef8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7a164736f6c6343000815000a"; bytes public constant BYTECODE_NFT_DESCRIPTOR = hex"6080806040523461001757615dac90816200001d8239f35b600080fdfe6080604052600436101561001257600080fd5b60003560e01c63e9dc63751461002757600080fd5b346142f85760403660031901126142f8576001600160a01b0360043516600435036142f857610056608061486e565b60006080819052606060a081905260c082905260e0819052610120819052610140819052610160819052610180919091526101a0526004356001600160a01b03166101008190526100a690614c58565b61012052610100516040517feac8f5b80000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa908115614305576000916147dd575b506001600160a01b03610117911680608052615669565b60a052610100516040517fa80fc0710000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa8015614305576fffffffffffffffffffffffffffffffff916000916147be575b501660c052610100516040517fad35efd40000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa801561430557600090614781575b6101e59150615889565b61014052610100516040517f4869e12d0000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa90811561430557600091614752575b5060c0516fffffffffffffffffffffffffffffffff16801561473c576fffffffffffffffffffffffffffffffff612710819302160416610100608001526102876004356153c7565b610120608001526040514660208201526bffffffffffffffffffffffff1960043560601b16604082015260243560548201526054815280608081011067ffffffffffffffff60808301111761431157608081016040526020815191012061041a602963ffffffff61032e6103078261016861ffff8860101c160616614b08565b91601e604660ff6103248460146050848d60081c16060116614b08565b9816060116614b08565b6040519485927f68736c2800000000000000000000000000000000000000000000000000000000602085015261036e815180926020602488019101614826565b83017f2c0000000000000000000000000000000000000000000000000000000000000060248201526103aa825180936020602585019101614826565b017f252c00000000000000000000000000000000000000000000000000000000000060258201526103e5825180936020602785019101614826565b017f252900000000000000000000000000000000000000000000000000000000000060278201520360098101845201826148df565b6104526fffffffffffffffffffffffffffffffff6040608001511660ff61044b6001600160a01b03608051166155dc565b1690614e89565b6104666001600160a01b0360805116614c58565b60a051610100516040517fbc2be1be0000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa80156143055760249160009161471d575b5060206001600160a01b03608080015116604051938480927f9067b677000000000000000000000000000000000000000000000000000000008252823560048301525afa801561430557610528926000916146ee575b5064ffffffffff80911691166151d5565b61012051610180519092916105b2602161054f6064610548818706615744565b9504614b08565b6040519481610568879351809260208087019101614826565b820161057d8251809360208085019101614826565b017f250000000000000000000000000000000000000000000000000000000000000060208201520360018101855201836148df565b610100608001519260c060800151956101206080015197604051996105d68b61486e565b8a5260208a015260408901526060880152608087015260a086015260c085015260e0840152610100830152610120820152604051806101c081011067ffffffffffffffff6101c083011117614311576101c0810160405260608152600060208201526000604082015260608082015260006080820152606060a0820152600060c0820152600060e08201526060610100820152600061012082015260006101408201526060610160820152600061018082015260006101a082015260a08201516106a660c0840151845190615a7a565b906109b361015c604051926106ba846148c3565b600884527f50726f677265737300000000000000000000000000000000000000000000000060208501526107236040516106f38161488b565b60009052855160208701207fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4701490565b156146e6576090945b61073586614b08565b916040519586938493661e339034b21e9160c91b60208601526109818351958692610767846027840160208901614826565b6d11103334b6361e9111b33333111f60911b602785840101526c1e3932b1ba103bb4b23a341e9160991b603585840101526107ae8551809660206042888701019101614826565b7f22206865696768743d22313030222066696c6c2d6f7061636974793d222e3033828501860160428101919091527f222072783d223135222072793d22313522207374726f6b653d2223666666222060628201527f7374726f6b652d6f7061636974793d222e3122207374726f6b652d77696474686082820152651e911a11179f60d11b60a28201527f3c7465787420783d2232302220793d2233342220666f6e742d66616d696c793d60a88201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f7370616365222060c8820152703337b73a16b9b4bd329e911919383c111f60791b60e88201528651966108b491889160f990910190602001614826565b661e17ba32bc3a1f60c91b8285018601870160f98101919091527f3c7465787420783d2232302220793d2237322220666f6e742d66616d696c793d6101008201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f73706163652220610120820152703337b73a16b9b4bd329e91191b383c111f60791b61014082015287519761094f91899161015190910190602001614826565b661e17ba32bc3a1f60c91b6101518888888887010101010152602061015888888885519c8d9701010101019101614826565b631e17b39f60e11b90860190910190910190910190910161015881019190915281900361013c810190915201826148df565b6101008301526101208201526028610100830151604051906109d48261488b565b60008252610c7a61015c604051926109eb846148c3565b600684527f53746174757300000000000000000000000000000000000000000000000000006020850152610a1e84615cba565b610a2782615d37565b808211156146de5750945b610a3d878701614b08565b91604051958693661e339034b21e9160c91b60208601528151610a67816027880160208601614826565b85016d11103334b6361e9111b33333111f60911b60278201526c1e3932b1ba103bb4b23a341e9160991b6035820152610aaa825180936020604285019101614826565b017f22206865696768743d22313030222066696c6c2d6f7061636974793d222e303360428201527f222072783d223135222072793d22313522207374726f6b653d2223666666222060628201527f7374726f6b652d6f7061636974793d222e3122207374726f6b652d77696474686082820152651e911a11179f60d11b60a28201527f3c7465787420783d2232302220793d2233342220666f6e742d66616d696c793d60a88201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f7370616365222060c8820152703337b73a16b9b4bd329e911919383c111f60791b60e8820152610ba682518093602060f985019101614826565b01661e17ba32bc3a1f60c91b60f98201527f3c7465787420783d2232302220793d2237322220666f6e742d66616d696c793d6101008201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f73706163652220610120820152703337b73a16b9b4bd329e91191b383c111f60791b610140820152610c3582518093602061015185019101614826565b01661e17ba32bc3a1f60c91b610151820152610c5c82518093602061015885019101614826565b01631e17b39f60e11b6101588201520361013c8101845201826148df565b610160840152016101808201526028602083015160405190610c9b8261488b565b60008252610ce561015c60405192610cb2846148c3565b600684527f416d6f756e7400000000000000000000000000000000000000000000000000006020850152610a1e84615cba565b835201602082015261102060808301516030604051610d038161488b565b60008152610faa61015c60405194610d1a866148c3565b600886527f4475726174696f6e0000000000000000000000000000000000000000000000006020870152610d4d86615cba565b610d5682615d37565b808211156146d65750935b610d6d60288601614b08565b91604051978893661e339034b21e9160c91b60208601528151610d97816027880160208601614826565b85016d11103334b6361e9111b33333111f60911b60278201526c1e3932b1ba103bb4b23a341e9160991b6035820152610dda825180936020604285019101614826565b017f22206865696768743d22313030222066696c6c2d6f7061636974793d222e303360428201527f222072783d223135222072793d22313522207374726f6b653d2223666666222060628201527f7374726f6b652d6f7061636974793d222e3122207374726f6b652d77696474686082820152651e911a11179f60d11b60a28201527f3c7465787420783d2232302220793d2233342220666f6e742d66616d696c793d60a88201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f7370616365222060c8820152703337b73a16b9b4bd329e911919383c111f60791b60e8820152610ed682518093602060f985019101614826565b01661e17ba32bc3a1f60c91b60f98201527f3c7465787420783d2232302220793d2237322220666f6e742d66616d696c793d6101008201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f73706163652220610120820152703337b73a16b9b4bd329e91191b383c111f60791b610140820152610f6582518093602061015185019101614826565b01661e17ba32bc3a1f60c91b610151820152610f8c82518093602061015885019101614826565b01631e17b39f60e11b6101588201520361013c8101865201846148df565b8260a08601526028810160c0860152602085015190610120860151809161018088015192839185010101605881016080890152605719906103e8030160011c8061014089015201601081016101a088015201602081016040870152010160e0840152610100830151610160840151845191614e1f565b6060820152604051908161010081011067ffffffffffffffff6101008401111761431157610100820160405260c782527f3c726563742077696474683d223130302522206865696768743d22313030252260208301527f2066696c7465723d2275726c28234e6f69736529222f3e3c7265637420783d2260408301527f37302220793d223730222077696474683d2238363022206865696768743d223860608301527f3630222066696c6c3d2223666666222066696c6c2d6f7061636974793d222e3060808301527f33222072783d223435222072793d22343522207374726f6b653d22236666662260a08301527f207374726f6b652d6f7061636974793d222e3122207374726f6b652d7769647460c08301527f683d2234222f3e0000000000000000000000000000000000000000000000000060e083015282519161010084015191606081015194604051611176816148a7565b603381527f3c636972636c652069643d22476c6f772220723d22353030222066696c6c3d2260208201527f75726c282352616469616c476c6f7729222f3e000000000000000000000000006040820152604051966111d38861486e565b61011c88527f3c66696c7465722069643d224e6f697365223e3c6665466c6f6f6420783d223060208901527f2220793d2230222077696474683d223130302522206865696768743d2231303060408901527f252220666c6f6f642d636f6c6f723d2268736c283233302c3231252c3131252960608901527f2220666c6f6f642d6f7061636974793d22312220726573756c743d22666c6f6f60808901527f6446696c6c222f3e3c666554757262756c656e6365206261736546726571756560a08901527f6e63793d222e3422206e756d4f6374617665733d22332220726573756c743d2260c08901527f4e6f6973652220747970653d226672616374616c4e6f697365222f3e3c66654260e08901527f6c656e6420696e3d224e6f6973652220696e323d22666c6f6f6446696c6c22206101008901527f6d6f64653d22736f66742d6c69676874222f3e3c2f66696c7465723e0000000061012089015260405197886103a081011067ffffffffffffffff6103a08b011117614311576103a0890160405261037b89527f3c706174682069643d224c6f676f222066696c6c3d2223666666222066696c6c60208a01527f2d6f7061636974793d222e312220643d226d3133332e3535392c3132342e303360408a01527f34632d2e3031332c322e3431322d312e3035392c342e3834382d322e3932332c60608a01527f362e3430322d322e3535382c312e3831392d352e3136382c332e3433392d372e60808a01527f3838382c342e3939362d31342e34342c382e3236322d33312e3034372c31322e60a08a01527f3536352d34372e3637342c31322e3536392d382e3835382e3033362d31372e3860c08a01527f33382d312e3237322d32362e3332382d332e3636332d392e3830362d322e373660e08a01527f362d31392e3038372d372e3131332d32372e3536322d31322e3737382d31332e6101008a01527f3834322d382e3032352c392e3436382d32382e3630362c31362e3135332d33356101208a01527f2e323635683063322e3033352d312e3833382c342e3235322d332e3534362c366101408a01527f2e3436332d352e323234683063362e3432392d352e3635352c31362e3231382d6101608a01527f322e3833352c32302e3335382c342e31372c342e3134332c352e3035372c382e6101808a01527f3831362c392e3634392c31332e39322c31332e373334682e30333763352e37336101a08a01527f362c362e3436312c31352e3335372d322e3235332c392e33382d382e34382c306101c08a01527f2c302d332e3531352d332e3531352d332e3531352d332e3531352d31312e34396101e08a01527f2d31312e3437382d35322e3635362d35322e3636342d36342e3833372d36342e6102008a01527f3833376c2e3034392d2e303337632d312e3732352d312e3630362d322e3731396102208a01527f2d332e3834372d322e3735312d362e3230346830632d2e3034362d322e3337356102408a01527f2c312e3036322d342e3538322c322e3732362d362e32323968306c2e3138352d6102608a01527f2e3134386830632e3039392d2e3036322c2e3232322d2e3134382c2e33372d2e6102808a01527f323539683063322e30362d312e3336322c332e3935312d322e3632312c362e306102a08a01527f34342d332e3834324335372e3736332d332e3437332c39372e37362d322e33346102c08a01527f312c3132382e3633372c31382e3333326331362e3637312c392e3934362d32366102e08a01527f2e3334342c35342e3831332d33382e3635312c34302e3139392d362e3239392d6103008a01527f362e3039362d31382e3036332d31372e3734332d31392e3636382d31382e38316103208a01527f312d362e3031362d342e3034372d31332e3036312c342e3737362d372e3735326103408a01527f2c392e3735316c36382e3235342c36382e33373163312e3732342c312e3630316103608a01527f2c322e3731342c332e38342c322e3733382c362e3139325a222f3e00000000006103808a0152604051978860a081011067ffffffffffffffff60a08b01111761431157611cb1611d129160a08b0160405260758b527f3c706174682069643d22466c6f6174696e6754657874222066696c6c3d226e6f60208c01527f6e652220643d224d31323520343568373530733830203020383020383076373560408c01527f307330203830202d3830203830682d373530732d38302030202d3830202d383060608c01527f762d3735307330202d3830203830202d3830222f3e000000000000000000000060808c0152611868615a41565b906040517f3c72616469616c4772616469656e742069643d2252616469616c476c6f77223e6020820152611d0d60d87f3c73746f70206f66667365743d223025222073746f702d636f6c6f723d22000093846040850152805161199a60b88660208501936118da81605e840187614826565b8101997f222073746f702d6f7061636974793d222e36222f3e0000000000000000000000605e8c01527f3c73746f70206f66667365743d2231303025222073746f702d636f6c6f723d229a8b607382015261193f825180936020609385019101614826565b017f222073746f702d6f7061636974793d2230222f3e00000000000000000000000060938201527f3c2f72616469616c4772616469656e743e00000000000000000000000000000060a78201520360988101885201866148df565b6119a2615a41565b90604051967f3c6c696e6561724772616469656e742069643d2253616e64546f70222078313d60208901527f223025222079313d223025223e000000000000000000000000000000000000006040890152604d8801528251611a0881606b8a0184614826565b8701917f222f3e00000000000000000000000000000000000000000000000000000000009283606b82015289606e820152611a4d825180936020608e85019101614826565b019082608e830152611a9160a2897f3c2f6c696e6561724772616469656e743e0000000000000000000000000000009485609182015203608281018b5201896148df565b611bd7610108611a9f615a41565b6040519b8c917f3c6c696e6561724772616469656e742069643d2253616e64426f74746f6d222060208401527f78313d2231303025222079313d2231303025223e00000000000000000000000060408401527f3c73746f70206f66667365743d22313025222073746f702d636f6c6f723d22006054840152611b2b815180926020607387019101614826565b8201908760738301526076820152875190611b4a826096830188614826565b018660968201527f3c616e696d617465206174747269627574654e616d653d22783122206475723d60998201527f2236732220726570656174436f756e743d22696e646566696e6974652220766160b98201527f6c7565733d223330253b3630253b313230253b3630253b3330253b222f3e000060d98201528560f78201520360e881018c52018a6148df565b611bdf615a41565b906040519a8b957f3c6c696e6561724772616469656e742069643d22486f7572676c61737353747260208801527f6f6b6522206772616469656e745472616e73666f726d3d22726f74617465283960408801527f302922206772616469656e74556e6974733d227573657253706163654f6e557360608801527f65223e000000000000000000000000000000000000000000000000000000000060808801527f3c73746f70206f66667365743d22353025222073746f702d636f6c6f723d2200608388015251809260a2880190614826565b84018360a28201527f3c73746f70206f66667365743d22383025222073746f702d636f6c6f723d220060a5820152611cf382518093602060c485019101614826565b019160c483015260c78201520360b88101875201856148df565b614e1f565b92611d32611d1e615817565b896020815191012090602081519101201490565b9788156146ad575b506040518060c081011067ffffffffffffffff60c0830111176143115760c08101604052609081527f3c7061746820643d224d2035302c3336302061203330302c333030203020312c60208201527f31203630302c302061203330302c333030203020312c31202d3630302c30222060408201527f66696c6c3d2223666666222066696c6c2d6f7061636974793d222e303222207360608201527f74726f6b653d2275726c2823486f7572676c6173735374726f6b65292220737460808201527f726f6b652d77696474683d2234222f3e0000000000000000000000000000000060a082015260405193846102c081011067ffffffffffffffff6102c087011117614311576102c0850160405261029885527f3c7061746820643d226d3536362c3136312e323031762d35332e39323463302d60208601527f31392e3338322d32322e3531332d33372e3536332d36332e3339382d35312e3160408601527f39382d34302e3735362d31332e3539322d39342e3934362d32312e3037392d3160608601527f35322e3538372d32312e303739732d3131312e3833382c372e3438372d31353260808601527f2e3630322c32312e303739632d34302e3839332c31332e3633362d36332e343160a08601527f332c33312e3831362d36332e3431332c35312e3139387635332e39323463302c60c08601527f31372e3138312c31372e3730342c33332e3432372c35302e3232332c34362e3360e08601527f3934763238342e383039632d33322e3531392c31322e39362d35302e3232332c6101008601527f32392e3230362d35302e3232332c34362e3339347635332e39323463302c31396101208601527f2e3338322c32322e35322c33372e3536332c36332e3431332c35312e3139382c6101408601527f34302e3736332c31332e3539322c39342e3935342c32312e3037392c3135322e6101608601527f3630322c32312e303739733131312e3833312d372e3438372c3135322e3538376101808601527f2d32312e3037396334302e3838362d31332e3633362c36332e3339382d33312e6101a08601527f3831362c36332e3339382d35312e313938762d35332e39323463302d31372e316101c08601527f39362d31372e3730342d33332e3433352d35302e3232332d34362e34303156326101e08601527f30372e3630336333322e3531392d31322e3936372c35302e3232332d32392e326102008601527f30362c35302e3232332d34362e3430315a6d2d3334372e3436322c35372e37396102208601527f336c3133302e3935392c3133312e3032372d3133302e3935392c3133312e30316102408601527f33563231382e3939345a6d3236322e3932342e303232763236322e3031386c2d6102608601527f3133302e3933372d3133312e3030362c3133302e3933372d3133312e3031335a6102808601527f222066696c6c3d2223313631383232223e3c2f706174683e00000000000000006102a0860152896000146144885760405161218c8161488b565b60008152995b1561432757604051806101e081011067ffffffffffffffff6101e083011117614311576101e081016040526101b181527f3c7061746820643d226d3438312e34362c3438312e35347638312e3031632d3260208201527f2e33352e37372d342e38322c312e35312d372e33392c322e32332d33302e332c60408201527f382e35342d37342e36352c31332e39322d3132342e30362c31332e39322d353360608201527f2e362c302d3130312e32342d362e33332d3133312e34372d31362e3136762d3860808201527f316c34362e332d34362e3331683137302e33336c34362e32392c34362e33315a60a08201527f222066696c6c3d2275726c282353616e64426f74746f6d29222f3e3c7061746860c08201527f20643d226d3433352e31372c3433352e323363302c312e31372d2e34362c322e60e08201527f33322d312e33332c332e34342d372e31312c392e30382d34312e39332c31352e6101008201527f39382d38332e38312c31352e3938732d37362e372d362e392d38332e38322d316101208201527f352e3938632d2e38372d312e31322d312e33332d322e32372d312e33332d332e6101408201527f3434762d2e30346c382e33342d382e33352e30312d2e30316331332e37322d366101608201527f2e35312c34322e39352d31312e30322c37362e382d31312e30327336322e39376101808201527f2c342e34392c37362e37322c31316c382e34322c382e34325a222066696c6c3d6101a08201527f2275726c282353616e64546f7029222f3e0000000000000000000000000000006101c0820152995b60405196876107e081011067ffffffffffffffff6107e08a01111761431157613b9f9c612e5a6036602d9960819f97631e17b39f60e11b8d7f3c2f646566733e000000000000000000000000000000000000000000000000009a612f2b9f6107e0016040526107a782527f3c672066696c6c3d226e6f6e6522207374726f6b653d2275726c2823486f757260208301527f676c6173735374726f6b652922207374726f6b652d6c696e656361703d22726f60408301527f756e6422207374726f6b652d6d697465726c696d69743d22313022207374726f60608301527f6b652d77696474683d2234223e3c7061746820643d226d3536352e3634312c3160808301527f30372e323863302c392e3533372d352e35362c31382e3632392d31352e36373660a08301527f2c32362e393733682d2e303233632d392e3230342c372e3539362d32322e313960c08301527f342c31342e3536322d33382e3139372c32302e3539322d33392e3530342c313460e08301527f2e3933362d39372e3332352c32342e3335352d3136312e3733332c32342e33356101008301527f352d39302e34382c302d3136372e3934382d31382e3538322d3139392e3935336101208301527f2d34342e393438682d2e303233632d31302e3131352d382e3334342d31352e366101408301527f37362d31372e3433372d31352e3637362d32362e3937332c302d33392e3733356101608301527f2c39362e3535342d37312e3932312c3231352e3635322d37312e3932317332316101808301527f352e3632392c33322e3138352c3231352e3632392c37312e3932315a222f3e3c6101a08301527f7061746820643d226d3133342e33362c3136312e32303363302c33392e3733356101c08301527f2c39362e3535342c37312e3932312c3231352e3635322c37312e3932317332316101e08301527f352e3632392d33322e3138362c3231352e3632392d37312e393231222f3e3c6c6102008301527f696e652078313d223133342e3336222079313d223136312e323033222078323d6102208301527f223133342e3336222079323d223130372e3238222f3e3c6c696e652078313d226102408301527f3536352e3634222079313d223136312e323033222078323d223536352e3634226102608301527f2079323d223130372e3238222f3e3c6c696e652078313d223138342e353834226102808301527f2079313d223230362e383233222078323d223138342e353835222079323d22356102a08301527f33372e353739222f3e3c6c696e652078313d223231382e313831222079313d226102c08301527f3231382e313138222078323d223231382e313831222079323d223536322e35336102e08301527f37222f3e3c6c696e652078313d223438312e383138222079313d223231382e316103008301527f3432222078323d223438312e383139222079323d223536322e343238222f3e3c6103208301527f6c696e652078313d223531352e343135222079313d223230372e3335322220786103408301527f323d223531352e343136222079323d223533372e353739222f3e3c70617468206103608301527f643d226d3138342e35382c3533372e353863302c352e34352c342e32372c31306103808301527f2e36352c31322e30332c31352e3432682e303263352e35312c332e33392c31326103a08301527f2e37392c362e35352c32312e35352c392e34322c33302e32312c392e392c37386103c08301527f2e30322c31362e32382c3133312e38332c31362e32382c34392e34312c302c396103e08301527f332e37362d352e33382c3132342e30362d31332e39322c322e372d2e37362c356104008301527f2e32392d312e35342c372e37352d322e33352c382e37372d322e38372c31362e6104208301527f30352d362e30342c32312e35362d392e3433683063372e37362d342e37372c316104408301527f322e30342d392e39372c31322e30342d31352e3432222f3e3c7061746820643d6104608301527f226d3138342e3538322c3439322e363536632d33312e3335342c31322e3438356104808301527f2d35302e3232332c32382e35382d35302e3232332c34362e3134322c302c392e6104a08301527f3533362c352e3536342c31382e3632372c31352e3637372c32362e393639682e6104c08301527f30323263382e3530332c372e3030352c32302e3231332c31332e3436332c33346104e08301527f2e3532342c31392e3135392c392e3939392c332e3939312c32312e3236392c376105008301527f2e3630392c33332e3539372c31302e3738382c33362e34352c392e3430372c386105208301527f322e3138312c31352e3030322c3133312e3833352c31352e3030327339352e336105408301527f36332d352e3539352c3133312e3830372d31352e3030326331302e3834372d326105608301527f2e37392c32302e3836372d352e3932362c32392e3932342d392e3334392c312e6105808301527f3234342d2e3436372c322e3437332d2e3934322c332e3637332d312e3432342c6105a08301527f31342e3332362d352e3639362c32362e3033352d31322e3136312c33342e35326105c08301527f342d31392e313733682e3032326331302e3131342d382e3334322c31352e36376105e08301527f372d31372e3433332c31352e3637372d32362e3936392c302d31372e3536322d6106008301527f31382e3836392d33332e3636352d35302e3232332d34362e3135222f3e3c70616106208301527f746820643d226d3133342e33362c3539322e373263302c33392e3733352c39366106408301527f2e3535342c37312e3932312c3231352e3635322c37312e393231733231352e366106608301527f32392d33322e3138362c3231352e3632392d37312e393231222f3e3c6c696e656106808301527f2078313d223133342e3336222079313d223539322e3732222078323d223133346106a08301527f2e3336222079323d223533382e373937222f3e3c6c696e652078313d223536356106c08301527f2e3634222079313d223539322e3732222078323d223536352e3634222079323d6106e08301527f223533382e373937222f3e3c706f6c796c696e6520706f696e74733d223438316107008301527f2e383232203438312e393031203438312e373938203438312e383737203438316107208301527f2e373735203438312e383534203335302e303135203335302e303236203231386107408301527f2e313835203231382e313239222f3e3c706f6c796c696e6520706f696e74733d6107608301527f223231382e313835203438312e393031203231382e323331203438312e3835346107808301527f203335302e303135203335302e303236203438312e383232203231382e3135326107a08301527f222f3e3c2f673e000000000000000000000000000000000000000000000000006107c0830152604051998a957f3c672069643d22486f7572676c617373223e00000000000000000000000000006020880152603295612df68151809260208a8c019101614826565b8701612e0b8251809360208a85019101614826565b01612e1f8251809360208985019101614826565b01612e338251809360208885019101614826565b01612e478251809360208785019101614826565b01918201520360168101865201846148df565b6040519e8f9788977f3c646566733e000000000000000000000000000000000000000000000000000060208a0152612e9f6026998260208c9451948593019101614826565b8901612eb48251809360208c85019101614826565b01612ec88251809360208b85019101614826565b01612edc8251809360208a85019101614826565b01612ef08251809360208985019101614826565b01612f048251809360208885019101614826565b01612f188251809360208785019101614826565b019182015203600d8101895201876148df565b6137be604c60e08301516101208401519361351a61314d6060604084015193015196612f578186615985565b9461314861012b604051612f6a816148c3565b600581527f2d3130302500000000000000000000000000000000000000000000000000000060208201526040519889917f3c74657874506174682073746172744f66667365743d220000000000000000006020840152612fd4815180926020603787019101614826565b7f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666683820160378101919091527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e00000000000000000061010982015282519261311891849161012090910190602001614826565b6a1e17ba32bc3a2830ba341f60a91b90830190910161012081019190915281900361010b810190915201876148df565b615985565b9561332c61012b604051613160816148c3565b600281527f30250000000000000000000000000000000000000000000000000000000000006020820152604051998a917f3c74657874506174682073746172744f66667365743d2200000000000000000060208401526131ca815180926020603787019101614826565b82017f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666660378201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e00000000000000000061010982015261330782518093602061012085019101614826565b016a1e17ba32bc3a2830ba341f60a91b6101208201520361010b81018a5201886148df565b61333681846159ed565b9261351561012b604051613349816148c3565b600481527f2d3530250000000000000000000000000000000000000000000000000000000060208201526040519687917f3c74657874506174682073746172744f66667365743d2200000000000000000060208401526133b3815180926020603787019101614826565b82017f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666660378201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e0000000000000000006101098201526134f082518093602061012085019101614826565b016a1e17ba32bc3a2830ba341f60a91b6101208201520361010b8101875201856148df565b6159ed565b906136f961012b60405161352d816148c3565b600381527f353025000000000000000000000000000000000000000000000000000000000060208201526040519485917f3c74657874506174682073746172744f66667365743d220000000000000000006020840152613597815180926020603787019101614826565b82017f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666660378201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e0000000000000000006101098201526136d482518093602061012085019101614826565b016a1e17ba32bc3a2830ba341f60a91b6101208201520361010b8101855201836148df565b6040519586937f3c7465787420746578742d72656e646572696e673d226f7074696d697a65537060208601527f656564223e000000000000000000000000000000000000000000000000000000604086015261375f815180926020604589019101614826565b8401613775825180936020604585019101614826565b0161378a825180936020604585019101614826565b0161379f825180936020604585019101614826565b01661e17ba32bc3a1f60c91b604582015203602c8101845201826148df565b613a9e61019a6101408401516101a0850151906137ff6137f96137f36137ed60e060408b01519a015194614b08565b94614b08565b97614b08565b91614b08565b956040519687937f3c75736520687265663d2223476c6f77222066696c6c2d6f7061636974793d2260208601527f2e39222f3e00000000000000000000000000000000000000000000000000000060408601527f3c75736520687265663d2223476c6f772220783d22313030302220793d22313060458601527f3030222066696c6c2d6f7061636974793d222e39222f3e00000000000000000060658601527f3c75736520687265663d22234c6f676f2220783d223137302220793d22313730607c8601527f22207472616e73666f726d3d227363616c65282e3629222f3e3c757365206872609c8601527f65663d2223486f7572676c6173732220783d223135302220793d22393022207460bc8601527f72616e73666f726d3d22726f746174652831302922207472616e73666f726d2d60dc8601527f6f726967696e3d2235303020353030222f3e000000000000000000000000000060fc8601527f3c75736520687265663d222350726f67726573732220783d220000000000000061010e8601526101279061399a815180926020858a019101614826565b8501937f2220793d22373930222f3e00000000000000000000000000000000000000000080948180948801527f3c75736520687265663d22235374617475732220783d2200000000000000000061013288015261014996613a048251809360208b85019101614826565b01958601527f3c75736520687265663d2223416d6f756e742220783d2200000000000000000061015486015261016b94613a478251809360208985019101614826565b01938401527f3c75736520687265663d22234475726174696f6e2220783d220000000000000061017684015261018f92613a8a8251809360208785019101614826565b01918201520361017a8101855201836148df565b6040519586937f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323060208601527f30302f737667222077696474683d223130303022206865696768743d2231303060408601527f30222076696577426f783d2230203020313030302031303030223e00000000006060860152613b2a815180926020607b89019101614826565b8401613b40825180936020607b85019101614826565b01613b55825180936020607b85019101614826565b01613b6a825180936020607b85019101614826565b017f3c2f7376673e0000000000000000000000000000000000000000000000000000607b8201520360618101845201826148df565b6101605260a051610100516040517fb971302a0000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa908115614305576000916142ba575b6142b661424f614154614245609487613d3b6089613c198a614c58565b9260c0608001516040519485927f5b7b2274726169745f74797065223a224173736574222c2276616c7565223a226020850152613c60815180926020604088019101614826565b8301907f227d2c7b2274726169745f74797065223a2253656e646572222c2276616c756560408301527f223a22000000000000000000000000000000000000000000000000000000000091826060820152613cc5825180936020606385019101614826565b01907f227d2c7b2274726169745f74797065223a22537461747573222c2276616c756560638301526083820152613d06825180936020608685019101614826565b017f227d5d000000000000000000000000000000000000000000000000000000000060868201520360698101845201826148df565b6101a05160a05161403e61017e613d53602435614b08565b9360a060800151613d6e6001600160a01b0360805116614c58565b90604051968793613f2b60208601987f54686973204e465420726570726573656e74732061207061796d656e742073748a527f7265616d20696e2061205361626c696572205632200000000000000000000000604088015282516020840190613ddb8160558b0184614826565b8801947f20636f6e74726163742e20546865206f776e6572206f662074686973204e465460558701527f2063616e207769746864726177207468652073747265616d656420617373657460758701527f732c207768696368206172652064656e6f6d696e6174656420696e2000000000609587015282516020840196613e658260b183018a614826565b017f2e5c6e5c6e2d2053747265616d2049443a20000000000000000000000000000060b1820152613ea082518093602060c385019101614826565b01613ed97f5c6e2d2000000000000000000000000000000000000000000000000000000000958660c384015251809360c7840190614826565b01947f20416464726573733a2000000000000000000000000000000000000000000000958660c7820152613f1782518093602060d185019101614826565b019260d184015251809360d5840190614826565b019060d5820152613f4682518093602060df85019101614826565b017f5c6e5c6e0000000000000000000000000000000000000000000000000000000060df8201527fe29aa0efb88f205741524e494e473a205472616e7366657272696e672074686560e38201527f204e4654206d616b657320746865206e6577206f776e657220746865207265636101038201527f697069656e74206f66207468652073747265616d2e205468652066756e6473206101238201527f617265206e6f74206175746f6d61746963616c6c792077697468647261776e206101438201527f666f72207468652070726576696f757320726563697069656e742e00000000006101638201520361015e8101855201836148df565b6101a051906141af614051602435614b08565b916140d0602d604051809560208201976a029b0b13634b2b9102b19160ad1b8952614086815180926020602b87019101614826565b82017f2023000000000000000000000000000000000000000000000000000000000000602b8201526140c18251809360208785019101614826565b0103600d8101865201846148df565b610160516140dd90614994565b94604051998a977f7b2261747472696275746573223a00000000000000000000000000000000000060208a015261411e815180926020602e8d019101614826565b8801917f2c226465736372697074696f6e223a2200000000000000000000000000000000602e840152518093603e840190614826565b01917f222c2265787465726e616c5f75726c223a2268747470733a2f2f7361626c6965603e8401527f722e636f6d222c226e616d65223a220000000000000000000000000000000000605e840152518093606d840190614826565b017f222c22696d616765223a22646174613a696d6167652f7376672b786d6c3b6261606d8201527f736536342c000000000000000000000000000000000000000000000000000000608d820152614210825180936020609285019101614826565b017f227d00000000000000000000000000000000000000000000000000000000000060928201520360748101845201826148df565b60e0819052614994565b6142a2603d60405180937f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000060208301526142928151809260208686019101614826565b810103601d8101845201826148df565b604051918291602083526020830190614849565b0390f35b90506020813d6020116142fd575b816142d5602093836148df565b810103126142f85751906001600160a01b03821682036142f85790614154613bfc565b600080fd5b3d91506142c8565b6040513d6000823e3d90fd5b634e487b7160e01b600052604160045260246000fd5b6040518061012081011067ffffffffffffffff6101208301111761431157610120810160405260f881527f3c7061746820643d226d3438312e34362c3530342e3130317635382e3434396360208201527f2d322e33352e37372d342e38322c312e35312d372e33392c322e32332d33302e60408201527f332c382e35342d37342e36352c31332e39322d3132342e30362c31332e39322d60608201527f35332e362c302d3130312e32342d362e33332d3133312e34372d31362e31367660808201527f2d35382e343339683236322e39325a222066696c6c3d2275726c282353616e6460a08201527f426f74746f6d29222f3e3c656c6c697073652063783d22333530222063793d2260c08201527f3530342e313031222072783d223133312e343632222072793d2232382e31303860e08201527f222066696c6c3d2275726c282353616e64546f7029222f3e0000000000000000610100820152996123df565b604051806101c081011067ffffffffffffffff6101c083011117614311576101c0810160405261019981527f3c706f6c79676f6e20706f696e74733d22333530203335302e3032362034313560208201527f2e3033203238342e39373820323835203238342e39373820333530203335302e60408201527f303236222066696c6c3d2275726c282353616e64426f74746f6d29222f3e3c7060608201527f61746820643d226d3431362e3334312c3238312e39373563302c2e3931342d2e60808201527f3335342c312e3830392d312e3033352c322e36382d352e3534322c372e30373660a08201527f2d33322e3636312c31322e34352d36352e32382c31322e34352d33322e36323460c08201527f2c302d35392e3733382d352e3337342d36352e32382d31322e34352d2e36383160e08201527f2d2e3837322d312e3033352d312e3736372d312e3033352d322e36382c302d2e6101008201527f3931342e3335342d312e3830382c312e3033352d322e3637362c352e3534322d6101208201527f372e3037362c33322e3635362d31322e34352c36352e32382d31322e34352c336101408201527f322e3631392c302c35392e3733382c352e3337342c36352e32382c31322e34356101608201527f2e3638312e3836372c312e3033352c312e3736322c312e3033352c322e3637366101808201527f5a222066696c6c3d2275726c282353616e64546f7029222f3e000000000000006101a082015299612192565b6146cf9198506146bb615850565b906020815191012090602081519101201490565b9638611d3a565b905093610d61565b905094610a32565b60d09461072c565b614710915060203d602011614716575b61470881836148df565b810190614929565b38610517565b503d6146fe565b614736915060203d6020116147165761470881836148df565b386104c1565b634e487b7160e01b600052601260045260246000fd5b614774915060203d60201161477a575b61476c81836148df565b810190614901565b3861023f565b503d614762565b506020813d6020116147b6575b8161479b602093836148df565b810103126142f8575160058110156142f8576101e5906101db565b3d915061478e565b6147d7915060203d60201161477a5761476c81836148df565b38610181565b90506020813d60201161481e575b816147f8602093836148df565b810103126142f857516001600160a01b03811681036142f8576001600160a01b03610100565b3d91506147eb565b60005b8381106148395750506000910152565b8181015183820152602001614829565b9060209161486281518092818552858086019101614826565b601f01601f1916010190565b610140810190811067ffffffffffffffff82111761431157604052565b6020810190811067ffffffffffffffff82111761431157604052565b6060810190811067ffffffffffffffff82111761431157604052565b6040810190811067ffffffffffffffff82111761431157604052565b90601f8019910116810190811067ffffffffffffffff82111761431157604052565b908160209103126142f857516fffffffffffffffffffffffffffffffff811681036142f85790565b908160209103126142f8575164ffffffffff811681036142f85790565b67ffffffffffffffff811161431157601f01601f191660200190565b9061496c82614946565b61497960405191826148df565b828152809261498a601f1991614946565b0190602036910137565b805115614af4576040516149a7816148a7565b604081527f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208201527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f60408201528151600292838201809211614ade5760038092047f3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81168103614ade57614a41908594951b614962565b936020850193829183518401925b838110614a8d5750505050510680600114614a7a57600214614a6f575090565b603d90600019015390565b50603d9081600019820153600119015390565b85600491979293949701918251600190603f9082828260121c16880101518453828282600c1c16880101518385015382828260061c1688010151888501531685010151878201530195929190614a4f565b634e487b7160e01b600052601160045260246000fd5b50604051614b018161488b565b6000815290565b806000917a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000080821015614c4a575b506d04ee2d6d415b85acef810000000080831015614c3b575b50662386f26fc1000080831015614c2c575b506305f5e10080831015614c1d575b5061271080831015614c0e575b506064821015614bfe575b600a80921015614bf4575b600190816021614b9f828701614962565b95860101905b614bb1575b5050505090565b600019019083907f30313233343536373839616263646566000000000000000000000000000000008282061a835304918215614bef57919082614ba5565b614baa565b9160010191614b8e565b9190606460029104910191614b83565b60049193920491019138614b78565b60089193920491019138614b6b565b60109193920491019138614b5c565b60209193920491019138614b4a565b604093508104915038614b31565b6001600160a01b031660405190614c6e826148a7565b602a8252602082016040368237825115614d8657603090538151600190811015614d8657607860218401536029905b808211614d0b575050614cad5790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602060248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b9091600f81166010811015614d71577f3031323334353637383961626364656600000000000000000000000000000000901a614d478486614d9c565b5360041c918015614d5c576000190190614c9d565b60246000634e487b7160e01b81526011600452fd5b60246000634e487b7160e01b81526032600452fd5b634e487b7160e01b600052603260045260246000fd5b908151811015614d86570160200190565b60405190614dba826148c3565b600482527f2667743b000000000000000000000000000000000000000000000000000000006020830152565b60405190614df3826148c3565b600482527f266c743b000000000000000000000000000000000000000000000000000000006020830152565b90614e87929493604051958692602094614e4181518092888089019101614826565b8401614e5582518093888085019101614826565b01614e6882518093878085019101614826565b01614e7b82518093868085019101614826565b010380855201836148df565b565b801561519a5760009180615175575090505b6001908082811015614f0857505050614eb2614de6565b614f05602260405183614ecf829551809260208086019101614826565b81017f203100000000000000000000000000000000000000000000000000000000000060208201520360028101845201826148df565b90565b66038d7ea4c6800011156151185760409081519060a0820182811067ffffffffffffffff82111761431157808452614f3f8161488b565b600081528252825190614f51826148c3565b8482526020917f4b0000000000000000000000000000000000000000000000000000000000000083820152828401528351614f8b816148c3565b8581527f4d0000000000000000000000000000000000000000000000000000000000000083820152848401528351614fc2816148c3565b8581527f42000000000000000000000000000000000000000000000000000000000000008382015260608401528351614ffa816148c3565b8581527f54000000000000000000000000000000000000000000000000000000000000008382015260808401526000918583965b6150ec575b50845194615040866148c3565b6007908187527f2623383830353b0000000000000000000000000000000000000000000000000083880152519560005b8281106150d957505050506150ba6150c0917f20000000000000000000000000000000000000000000000000000000000000006027870152600886526150b5866148c3565b614b08565b91615744565b916005851015614d8657614f059460051b015192614e1f565b8181018401518882018501528301615070565b9591926103e89081851061510f57508680916064600a870406950493019661502e565b93929650615033565b5050615122614dad565b614f0560286040518361513f829551809260208086019101614826565b81017f203939392e39395400000000000000000000000000000000000000000000000060208201520360088101845201826148df565b600a0a918215615186575004614e9b565b80634e487b7160e01b602492526012600452fd5b50506040516151a8816148c3565b600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b620151809103048061523d57506151ea614de6565b614f05602660405183615207829551809260208086019101614826565b81017f203120446179000000000000000000000000000000000000000000000000000060208201520360068101845201826148df565b61270f811161530c57600181036152c957614f056020615291604051615262816148c3565b600481527f20446179000000000000000000000000000000000000000000000000000000008382015293614b08565b60405193816152a98693518092868087019101614826565b82016152bd82518093868085019101614826565b010380845201826148df565b614f0560206152916040516152dd816148c3565b600581527f20446179730000000000000000000000000000000000000000000000000000008382015293614b08565b50615315614dad565b614f05602a60405183615332829551809260208086019101614826565b81017f2039393939204461797300000000000000000000000000000000000000000000602082015203600a8101845201826148df565b6020818303126142f85780519067ffffffffffffffff82116142f8570181601f820112156142f857805161539b81614946565b926153a960405194856148df565b818452602082840101116142f857614f059160208085019101614826565b6001600160a01b031660409081516395d89b4160e01b8152600081600481855afa9081156155a157600091615580575b5061545c8351615406816148c3565b601181527f5341422d56322d4c4f434b55502d4c494e0000000000000000000000000000006020918201528251908301207fc66b376a19264d832c1bc254000c18944ca5aa57ed50f4ea637c4da424d4c3bb1490565b1561549a5750505161546d816148c3565b600d81527f4c6f636b7570204c696e65617200000000000000000000000000000000000000602082015290565b6154fe83516154a8816148c3565b601181527f5341422d56322d4c4f434b55502d44594e0000000000000000000000000000006020918201528251908301207f6ab655856fa5352de8c05542b1937ac63c59342da992602767c02734cc5391651490565b1561553c5750505161550f816148c3565b600e81527f4c6f636b75702044796e616d6963000000000000000000000000000000000000602082015290565b61557c9083519384937f814a8a2e000000000000000000000000000000000000000000000000000000008552600485015260248401526044830190614849565b0390fd5b61559b913d8091833e61559381836148df565b810190615368565b386153f7565b83513d6000823e3d90fd5b3d156155d7573d906155bd82614946565b916155cb60405193846148df565b82523d6000602084013e565b606090565b60405160208101907f313ce56700000000000000000000000000000000000000000000000000000000825260048152615614816148c3565b6000928392839251915afa6156276155ac565b908061565e575b1561565a5760208180518101031261565657602001519060ff82168203615653575090565b80fd5b5080fd5b5090565b50602081511461562e565b6000809160405160208101906395d89b4160e01b82526004815261568c816148c3565b51915afa6156986155ac565b90158015615738575b6156fe57806020806156b893518301019101615368565b601e815111600014614f0557506040516156d1816148c3565b600b81527f4c6f6e672053796d626f6c000000000000000000000000000000000000000000602082015290565b5060405161570b816148c3565b600581527f4552433230000000000000000000000000000000000000000000000000000000602082015290565b506040815111156156a1565b806157565750604051614b018161488b565b600a8110156157bb5761576890614b08565b614f05602260405180937f2e3000000000000000000000000000000000000000000000000000000000000060208301526157ab8151809260208686019101614826565b81010360028101845201826148df565b6157c490614b08565b614f05602160405180937f2e0000000000000000000000000000000000000000000000000000000000000060208301526158078151809260208686019101614826565b81010360018101845201826148df565b60405190615824826148c3565b600782527f536574746c6564000000000000000000000000000000000000000000000000006020830152565b6040519061585d826148c3565b600882527f4465706c657465640000000000000000000000000000000000000000000000006020830152565b600581101561596f57600481036158a35750614f05615850565b600381036158e557506040516158b8816148c3565b600881527f43616e63656c6564000000000000000000000000000000000000000000000000602082015290565b6001810361592757506040516158fa816148c3565b600981527f53747265616d696e670000000000000000000000000000000000000000000000602082015290565b60020361593657614f05615817565b604051615942816148c3565b600781527f50656e64696e6700000000000000000000000000000000000000000000000000602082015290565b634e487b7160e01b600052602160045260246000fd5b6030614e879193929360405194816159a7879351809260208087019101614826565b820164010714051160dd1b60208201526a029b0b13634b2b9102b19160ad1b60258201526159de8251809360208785019101614826565b010360108101855201836148df565b6025614e87919392936040519481615a0f879351809260208087019101614826565b820164010714051160dd1b6020820152615a328251809360208785019101614826565b010360058101855201836148df565b60405190615a4e826148c3565b601082527f68736c283233302c3231252c31312529000000000000000000000000000000006020830152565b8015615cac57615a88615a41565b90612710908103908111614ade57614f0591615aa661013692614b08565b6040519485927f3c672066696c6c3d226e6f6e65223e000000000000000000000000000000000060208501527f3c636972636c652063783d22313636222063793d2235302220723d2232322220602f8501527f7374726f6b653d22000000000000000000000000000000000000000000000000604f850152615b32815180926020605788019101614826565b83017f22207374726f6b652d77696474683d223130222f3e000000000000000000000060578201527f3c636972636c652063783d22313636222063793d2235302220706174684c656e606c8201527f6774683d2231303030302220723d22323222207374726f6b653d220000000000608c820152615bba82518093602060a785019101614826565b017f22207374726f6b652d6461736861727261793d22313030303022207374726f6b60a78201527f652d646173686f66667365743d2200000000000000000000000000000000000060c7820152615c1b82518093602060d585019101614826565b017f22207374726f6b652d6c696e656361703d22726f756e6422207374726f6b652d60d58201527f77696474683d223522207472616e73666f726d3d22726f74617465282d39302960f58201527f22207472616e73666f726d2d6f726967696e3d22313636203530222f3e000000610115820152631e17b39f60e11b610132820152036101168101845201826148df565b5050604051614b018161488b565b60009080518015615d2f579060009182915b818310615cde57505050600d02900390565b909193603b60f81b7fff00000000000000000000000000000000000000000000000000000000000000615d118785614d9c565b511614615d27575b600d01936001019190615ccc565b849350615d19565b505050600090565b60009080518015615d2f579060009182915b818310615d5b5750505060041b900390565b909193603b60f81b7fff00000000000000000000000000000000000000000000000000000000000000615d8e8785614d9c565b511614615da4575b601001936001019190615d49565b849350615d9656"; From 60f91af6bda8659dcdd1f8e0c466726235de2194 Mon Sep 17 00:00:00 2001 From: Andrei Vlad Birgaoanu <99738872+andreivladbrg@users.noreply.github.com> Date: Thu, 19 Oct 2023 14:17:53 +0300 Subject: [PATCH 29/47] test: add DeployOptimized utils contracts (#712) * test: add DeployOptimized utils contracts test: move and rename functions from Base_Test * docs: fix typo in comments * test: rename deploy optimized functions --------- Co-authored-by: Paul Razvan Berg --- test/Base.t.sol | 59 ++------------ .../concrete/comptroller/Comptroller.t.sol | 2 +- test/utils/DeployOptimized.sol | 77 +++++++++++++++++++ test/utils/Precompiles.t.sol | 37 +++++---- 4 files changed, 104 insertions(+), 71 deletions(-) create mode 100644 test/utils/DeployOptimized.sol diff --git a/test/Base.t.sol b/test/Base.t.sol index beca5a0c1..b735e2f5f 100644 --- a/test/Base.t.sol +++ b/test/Base.t.sol @@ -3,7 +3,6 @@ pragma solidity >=0.8.19 <0.9.0; import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import { StdCheats } from "forge-std/StdCheats.sol"; import { ISablierV2Comptroller } from "../src/interfaces/ISablierV2Comptroller.sol"; import { ISablierV2LockupDynamic } from "../src/interfaces/ISablierV2LockupDynamic.sol"; @@ -22,12 +21,13 @@ import { Assertions } from "./utils/Assertions.sol"; import { Calculations } from "./utils/Calculations.sol"; import { Constants } from "./utils/Constants.sol"; import { Defaults } from "./utils/Defaults.sol"; +import { DeployOptimized } from "./utils/DeployOptimized.sol"; import { Events } from "./utils/Events.sol"; import { Fuzzers } from "./utils/Fuzzers.sol"; import { Users } from "./utils/Types.sol"; /// @notice Base test contract with common logic needed by all tests. -abstract contract Base_Test is Assertions, Calculations, Constants, Events, Fuzzers, StdCheats { +abstract contract Base_Test is Assertions, Calculations, Constants, DeployOptimized, Events, Fuzzers { /*////////////////////////////////////////////////////////////////////////// VARIABLES //////////////////////////////////////////////////////////////////////////*/ @@ -132,7 +132,7 @@ abstract contract Base_Test is Assertions, Calculations, Constants, Events, Fuzz return user; } - /// @dev Conditionally deploys V2 Core normally or from a source precompiled with `--via-ir`. + /// @dev Conditionally deploys V2 Core normally or from an optimized source compiled with `--via-ir`. /// We cannot use the {DeployCore} script because some tests rely on hard coded addresses for the /// deployed contracts. Since the script itself would have to be deployed, using it would bump the /// deployer's nonce, which would in turn lead to different addresses (recall that the addresses @@ -145,10 +145,8 @@ abstract contract Base_Test is Assertions, Calculations, Constants, Events, Fuzz new SablierV2LockupDynamic(users.admin, comptroller, nftDescriptor, defaults.MAX_SEGMENT_COUNT()); lockupLinear = new SablierV2LockupLinear(users.admin, comptroller, nftDescriptor); } else { - comptroller = deployPrecompiledComptroller(users.admin); - nftDescriptor = deployPrecompiledNFTDescriptor(); - lockupDynamic = deployPrecompiledDynamic(users.admin, comptroller, nftDescriptor); - lockupLinear = deployPrecompiledLinear(users.admin, comptroller, nftDescriptor); + (comptroller, lockupDynamic, lockupLinear, nftDescriptor) = + deployOptimizedCore(users.admin, defaults.MAX_SEGMENT_COUNT()); } vm.label({ account: address(comptroller), newLabel: "Comptroller" }); @@ -157,53 +155,6 @@ abstract contract Base_Test is Assertions, Calculations, Constants, Events, Fuzz vm.label({ account: address(nftDescriptor), newLabel: "NFTDescriptor" }); } - /// @dev Deploys {SablierV2Comptroller} from a source precompiled with `--via-ir`. - function deployPrecompiledComptroller(address initialAdmin) internal returns (ISablierV2Comptroller) { - return ISablierV2Comptroller( - deployCode("out-optimized/SablierV2Comptroller.sol/SablierV2Comptroller.json", abi.encode(initialAdmin)) - ); - } - - /// @dev Deploys {SablierV2LockupDynamic} from a source precompiled with `--via-ir`. - function deployPrecompiledDynamic( - address initialAdmin, - ISablierV2Comptroller comptroller_, - ISablierV2NFTDescriptor nftDescriptor_ - ) - internal - returns (ISablierV2LockupDynamic) - { - return ISablierV2LockupDynamic( - deployCode( - "out-optimized/SablierV2LockupDynamic.sol/SablierV2LockupDynamic.json", - abi.encode(initialAdmin, address(comptroller_), address(nftDescriptor_), defaults.MAX_SEGMENT_COUNT()) - ) - ); - } - - /// @dev Deploys {SablierV2LockupLinear} from a source precompiled with `--via-ir`. - function deployPrecompiledLinear( - address initialAdmin, - ISablierV2Comptroller comptroller_, - ISablierV2NFTDescriptor nftDescriptor_ - ) - internal - returns (ISablierV2LockupLinear) - { - return ISablierV2LockupLinear( - deployCode( - "out-optimized/SablierV2LockupLinear.sol/SablierV2LockupLinear.json", - abi.encode(initialAdmin, address(comptroller_), address(nftDescriptor_)) - ) - ); - } - - /// @dev Deploys {SablierV2NFTDescriptor} from a source precompiled with `--via-ir`. - function deployPrecompiledNFTDescriptor() internal returns (ISablierV2NFTDescriptor) { - return - ISablierV2NFTDescriptor(deployCode("out-optimized/SablierV2NFTDescriptor.sol/SablierV2NFTDescriptor.json")); - } - /*////////////////////////////////////////////////////////////////////////// CALL EXPECTS //////////////////////////////////////////////////////////////////////////*/ diff --git a/test/unit/concrete/comptroller/Comptroller.t.sol b/test/unit/concrete/comptroller/Comptroller.t.sol index 4d1185ff6..635946627 100644 --- a/test/unit/concrete/comptroller/Comptroller.t.sol +++ b/test/unit/concrete/comptroller/Comptroller.t.sol @@ -16,7 +16,7 @@ contract Comptroller_Unit_Concrete_Test is Base_Test { if (!isTestOptimizedProfile()) { comptroller = new SablierV2Comptroller(users.admin); } else { - comptroller = deployPrecompiledComptroller(users.admin); + comptroller = deployOptimizedComptroller(users.admin); } vm.label({ account: address(comptroller), newLabel: "SablierV2Comptroller" }); } diff --git a/test/utils/DeployOptimized.sol b/test/utils/DeployOptimized.sol new file mode 100644 index 000000000..7fc9f8815 --- /dev/null +++ b/test/utils/DeployOptimized.sol @@ -0,0 +1,77 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >=0.8.19 <0.9.0; + +import { StdCheats } from "forge-std/StdCheats.sol"; + +import { ISablierV2Comptroller } from "../../src/interfaces/ISablierV2Comptroller.sol"; +import { ISablierV2LockupDynamic } from "../../src/interfaces/ISablierV2LockupDynamic.sol"; +import { ISablierV2LockupLinear } from "../../src/interfaces/ISablierV2LockupLinear.sol"; +import { ISablierV2NFTDescriptor } from "../../src/interfaces/ISablierV2NFTDescriptor.sol"; + +abstract contract DeployOptimized is StdCheats { + /// @dev Deploys {SablierV2Comptroller} from an optimized source compiled with `--via-ir`. + function deployOptimizedComptroller(address initialAdmin) internal returns (ISablierV2Comptroller) { + return ISablierV2Comptroller( + deployCode("out-optimized/SablierV2Comptroller.sol/SablierV2Comptroller.json", abi.encode(initialAdmin)) + ); + } + + /// @dev Deploys {SablierV2LockupDynamic} from an optimized source compiled with `--via-ir`. + function deployOptimizedLockupDynamic( + address initialAdmin, + ISablierV2Comptroller comptroller_, + ISablierV2NFTDescriptor nftDescriptor_, + uint256 maxSegmentCount + ) + internal + returns (ISablierV2LockupDynamic) + { + return ISablierV2LockupDynamic( + deployCode( + "out-optimized/SablierV2LockupDynamic.sol/SablierV2LockupDynamic.json", + abi.encode(initialAdmin, address(comptroller_), address(nftDescriptor_), maxSegmentCount) + ) + ); + } + + /// @dev Deploys {SablierV2LockupLinear} from an optimized source compiled with `--via-ir`. + function deployOptimizedLockupLinear( + address initialAdmin, + ISablierV2Comptroller comptroller_, + ISablierV2NFTDescriptor nftDescriptor_ + ) + internal + returns (ISablierV2LockupLinear) + { + return ISablierV2LockupLinear( + deployCode( + "out-optimized/SablierV2LockupLinear.sol/SablierV2LockupLinear.json", + abi.encode(initialAdmin, address(comptroller_), address(nftDescriptor_)) + ) + ); + } + + /// @dev Deploys {SablierV2NFTDescriptor} from an optimized source compiled with `--via-ir`. + function deployOptimizedNFTDescriptor() internal returns (ISablierV2NFTDescriptor) { + return + ISablierV2NFTDescriptor(deployCode("out-optimized/SablierV2NFTDescriptor.sol/SablierV2NFTDescriptor.json")); + } + + function deployOptimizedCore( + address initialAdmin, + uint256 maxSegmentCount + ) + internal + returns ( + ISablierV2Comptroller comptroller_, + ISablierV2LockupDynamic lockupDynamic_, + ISablierV2LockupLinear lockupLinear_, + ISablierV2NFTDescriptor nftDescriptor_ + ) + { + comptroller_ = deployOptimizedComptroller(initialAdmin); + nftDescriptor_ = deployOptimizedNFTDescriptor(); + lockupDynamic_ = deployOptimizedLockupDynamic(initialAdmin, comptroller_, nftDescriptor_, maxSegmentCount); + lockupLinear_ = deployOptimizedLockupLinear(initialAdmin, comptroller_, nftDescriptor_); + } +} diff --git a/test/utils/Precompiles.t.sol b/test/utils/Precompiles.t.sol index abc5558ab..f62ee83cd 100644 --- a/test/utils/Precompiles.t.sol +++ b/test/utils/Precompiles.t.sol @@ -25,14 +25,15 @@ contract Precompiles_Test is Base_Test { function test_DeployComptroller() external onlyTestOptimizedProfile { address actualComptroller = address(precompiles.deployComptroller(users.admin)); - address expectedComptroller = address(deployPrecompiledComptroller(users.admin)); + address expectedComptroller = address(deployOptimizedComptroller(users.admin)); assertEq(actualComptroller.code, expectedComptroller.code, "bytecodes mismatch"); } function test_DeployLockupDynamic() external onlyTestOptimizedProfile { ISablierV2Comptroller comptroller = precompiles.deployComptroller(users.admin); address actualLockupDynamic = address(precompiles.deployLockupDynamic(users.admin, comptroller, nftDescriptor)); - address expectedLockupDynamic = address(deployPrecompiledDynamic(users.admin, comptroller, nftDescriptor)); + address expectedLockupDynamic = + address(deployOptimizedLockupDynamic(users.admin, comptroller, nftDescriptor, defaults.MAX_SEGMENT_COUNT())); bytes memory expectedLockupDynamicCode = adjustBytecode(expectedLockupDynamic.code, expectedLockupDynamic, actualLockupDynamic); assertEq(actualLockupDynamic.code, expectedLockupDynamicCode, "bytecodes mismatch"); @@ -41,7 +42,7 @@ contract Precompiles_Test is Base_Test { function test_DeployLockupLinear() external onlyTestOptimizedProfile { ISablierV2Comptroller comptroller = precompiles.deployComptroller(users.admin); address actualLockupLinear = address(precompiles.deployLockupLinear(users.admin, comptroller, nftDescriptor)); - address expectedLockupLinear = address(deployPrecompiledLinear(users.admin, comptroller, nftDescriptor)); + address expectedLockupLinear = address(deployOptimizedLockupLinear(users.admin, comptroller, nftDescriptor)); bytes memory expectedLockupLinearCode = adjustBytecode(expectedLockupLinear.code, expectedLockupLinear, actualLockupLinear); assertEq(actualLockupLinear.code, expectedLockupLinearCode, "bytecodes mismatch"); @@ -49,7 +50,7 @@ contract Precompiles_Test is Base_Test { function test_DeployNFTDescriptor() external onlyTestOptimizedProfile { address actualNFTDescriptor = address(precompiles.deployNFTDescriptor()); - address expectedNFTDescriptor = address(deployPrecompiledNFTDescriptor()); + address expectedNFTDescriptor = address(deployOptimizedNFTDescriptor()); assertEq(actualNFTDescriptor.code, expectedNFTDescriptor.code, "bytecodes mismatch"); } @@ -61,21 +62,25 @@ contract Precompiles_Test is Base_Test { ISablierV2NFTDescriptor actualNFTDescriptor ) = precompiles.deployCore(users.admin); - address expectedComptroller = address(deployPrecompiledComptroller(users.admin)); - assertEq(address(actualComptroller).code, expectedComptroller.code, "bytecodes mismatch"); + ( + ISablierV2Comptroller expectedComptroller, + ISablierV2LockupDynamic expectedLockupDynamic, + ISablierV2LockupLinear expectedLockupLinear, + ISablierV2NFTDescriptor expectedNFTDescriptor + ) = deployOptimizedCore(users.admin, defaults.MAX_SEGMENT_COUNT()); + + bytes memory expectedLockupDynamicCode = adjustBytecode( + address(expectedLockupDynamic).code, address(expectedLockupDynamic), address(actualLockupDynamic) + ); - address expectedLockupDynamic = address(deployPrecompiledDynamic(users.admin, actualComptroller, nftDescriptor)); - bytes memory expectedLockupDynamicCode = - adjustBytecode(expectedLockupDynamic.code, expectedLockupDynamic, address(actualLockupDynamic)); - assertEq(address(actualLockupDynamic).code, expectedLockupDynamicCode, "bytecodes mismatch"); + bytes memory expectedLockupLinearCode = adjustBytecode( + address(expectedLockupLinear).code, address(expectedLockupLinear), address(actualLockupLinear) + ); - address expectedLockupLinear = address(deployPrecompiledLinear(users.admin, actualComptroller, nftDescriptor)); - bytes memory expectedLockupLinearCode = - adjustBytecode(expectedLockupLinear.code, expectedLockupLinear, address(actualLockupLinear)); + assertEq(address(actualComptroller).code, address(expectedComptroller).code, "bytecodes mismatch"); + assertEq(address(actualLockupDynamic).code, expectedLockupDynamicCode, "bytecodes mismatch"); assertEq(address(actualLockupLinear).code, expectedLockupLinearCode, "bytecodes mismatch"); - - address expectedNFTDescriptor = address(deployPrecompiledNFTDescriptor()); - assertEq(address(actualNFTDescriptor).code, expectedNFTDescriptor.code, "bytecodes mismatch"); + assertEq(address(actualNFTDescriptor).code, address(expectedNFTDescriptor).code, "bytecodes mismatch"); } /// @dev The expected bytecode has to be adjusted because {SablierV2Lockup} inherits from {NoDelegateCall}, which From 9722ecf750d70eb1cf3d8488c1bf46d353c462d3 Mon Sep 17 00:00:00 2001 From: Paul Razvan Berg Date: Thu, 19 Oct 2023 14:14:40 +0100 Subject: [PATCH 30/47] docs: polish changelog --- CHANGELOG.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 03ba64f04..f15d0372d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,16 +9,17 @@ The format is based on [Common Changelog](https://common-changelog.org/). [1.0.1]: https://github.com/sablier-labs/v2-core/compare/v1.0.0...v1.0.1 [1.0.0]: https://github.com/sablier-labs/v2-core/releases/tag/v1.0.0 -## [1.1.0] - 2023-09-27 +## [1.1.0] - 2023-10-19 ### Changed -- **Breaking**: Remove ability to `cancel` for recipients ([#710](https://github.com/sablier-labs/v2-core/pull/710)) +- **Breaking**: Remove ability to cancel for recipients ([#710](https://github.com/sablier-labs/v2-core/pull/710)) +- Move `isWarm` and `isCold` to `SablierV2Lockup` ([#664](https://github.com/sablier-labs/v2-core/pull/664)) - Replace the streamed amount with the deposit amount in the NFT descriptor ([#692](https://github.com/sablier-labs/v2-core/pull/692)) +- Simplify `renounce` and `withdraw` implementations ([#683](https://github.com/sablier-labs/v2-core/pull/683), + [#705](https://github.com/sablier-labs/v2-core/pull/705)) - Upgrade Solidity to `0.8.21` ([#688](https://github.com/sablier-labs/v2-core/pull/688)) -- Simplify `renounce` and `withdraw` implementations ([#683](https://github.com/sablier-labs/v2-core/pull/683)) -- Move `isWarm` and `isCold` to `SablierV2Lockup` ([#664](https://github.com/sablier-labs/v2-core/pull/664)) ### Added From 6b74ddf4fba34142ce7106e191c1029bf81e26b3 Mon Sep 17 00:00:00 2001 From: Ahmed Ihsan Tawfeeq Date: Thu, 26 Oct 2023 06:27:12 -0600 Subject: [PATCH 31/47] ci: add slither job (#714) * ci: add slither job chore: fix solc remap path in slither config * ci: use cached build for slither job * ci: use solc 0.8.21 in slither job * ci: revise slither job revert: ci: use cached build for slither job * ci: remove superfluous "solc-version" config in slither job not required when a compilation framework is used --------- Co-authored-by: andreivladbrg --- .github/workflows/ci.yml | 32 +++++++++++++++++++++++++++++++- slither.config.json | 2 +- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7a5f6eb27..59c164541 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -284,4 +284,34 @@ jobs: - name: "Add coverage summary" run: | echo "## Coverage result" >> $GITHUB_STEP_SUMMARY - echo "✅ Uploaded to Codecov" >> $GITHUB_STEP_SUMMARY \ No newline at end of file + echo "✅ Uploaded to Codecov" >> $GITHUB_STEP_SUMMARY + + slither-analyze: + needs: ["lint", "build"] + runs-on: "ubuntu-latest" + permissions: + actions: "read" + contents: "read" + security-events: "write" + steps: + - name: "Check out the repo" + uses: "actions/checkout@v3" + with: + submodules: "recursive" + + - name: "Run Slither analysis" + uses: "crytic/slither-action@v0.3.0" + id: "slither" + with: + fail-on: "none" + sarif: "results.sarif" + + - name: "Upload SARIF file to GitHub code scanning" + uses: "github/codeql-action/upload-sarif@v2" + with: + sarif_file: ${{ steps.slither.outputs.sarif }} + + - name: "Add Slither summary" + run: | + echo "## Slither result" >> $GITHUB_STEP_SUMMARY + echo "✅ Uploaded to GitHub code scanning" >> $GITHUB_STEP_SUMMARY diff --git a/slither.config.json b/slither.config.json index 725063073..0776b9633 100644 --- a/slither.config.json +++ b/slither.config.json @@ -2,7 +2,7 @@ "detectors_to_exclude": "naming-convention,reentrancy-events,solc-version,timestamp", "filter_paths": "(lib|test)", "solc_remaps": [ - "@openzeppelin/contracts=lib/openzeppelin-contracts/contracts/", + "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/", "@prb/math/=lib/prb-math/", "@prb/test/=lib/prb-test/src/", "forge-std/=lib/forge-std/src/", From e6fa02d1f9dfa9b511bb9c84a984a91aa89eed62 Mon Sep 17 00:00:00 2001 From: Andrei Vlad Birgaoanu <99738872+andreivladbrg@users.noreply.github.com> Date: Fri, 27 Oct 2023 18:15:53 +0300 Subject: [PATCH 32/47] build: remove goerli support (#720) * build: remove goerli support ci: use sepolia for default chain in deployment workflows * docs: mention Sepolia instead of Goerli --------- Co-authored-by: Paul Razvan Berg --- .github/workflows/deploy-comptroller.yml | 2 +- .github/workflows/deploy-core.yml | 2 +- .github/workflows/deploy-lockup-dynamic.yml | 2 +- .github/workflows/deploy-lockup-linear.yml | 2 +- .github/workflows/deploy-nft-descriptor.yml | 2 +- SECURITY.md | 2 +- foundry.toml | 2 -- 7 files changed, 6 insertions(+), 8 deletions(-) diff --git a/.github/workflows/deploy-comptroller.yml b/.github/workflows/deploy-comptroller.yml index fd391ea5d..03eff8a05 100644 --- a/.github/workflows/deploy-comptroller.yml +++ b/.github/workflows/deploy-comptroller.yml @@ -20,7 +20,7 @@ on: description: "Initial contract admin." required: false chain: - default: "goerli" + default: "sepolia" description: "Chain name as defined in the Foundry config." required: false diff --git a/.github/workflows/deploy-core.yml b/.github/workflows/deploy-core.yml index 905257159..24159ddd5 100644 --- a/.github/workflows/deploy-core.yml +++ b/.github/workflows/deploy-core.yml @@ -20,7 +20,7 @@ on: description: "Initial protocol admin." required: false chain: - default: "goerli" + default: "sepolia" description: "Chain name as defined in the Foundry config." required: false max-segment-count: diff --git a/.github/workflows/deploy-lockup-dynamic.yml b/.github/workflows/deploy-lockup-dynamic.yml index d90cbc431..f2d7c72a5 100644 --- a/.github/workflows/deploy-lockup-dynamic.yml +++ b/.github/workflows/deploy-lockup-dynamic.yml @@ -20,7 +20,7 @@ on: description: "Initial contract admin." required: false chain: - default: "goerli" + default: "sepolia" description: "Chain name as defined in the Foundry config." required: false comptroller: diff --git a/.github/workflows/deploy-lockup-linear.yml b/.github/workflows/deploy-lockup-linear.yml index 6ddcb368e..9d51e5855 100644 --- a/.github/workflows/deploy-lockup-linear.yml +++ b/.github/workflows/deploy-lockup-linear.yml @@ -20,7 +20,7 @@ on: description: "Initial contract admin." required: false chain: - default: "goerli" + default: "sepolia" description: "Chain name as defined in the Foundry config." required: false comptroller: diff --git a/.github/workflows/deploy-nft-descriptor.yml b/.github/workflows/deploy-nft-descriptor.yml index 6f76bd1be..ef5ee19f4 100644 --- a/.github/workflows/deploy-nft-descriptor.yml +++ b/.github/workflows/deploy-nft-descriptor.yml @@ -16,7 +16,7 @@ on: workflow_dispatch: inputs: chain: - default: "goerli" + default: "sepolia" description: "Chain name as defined in the Foundry config." required: false diff --git a/SECURITY.md b/SECURITY.md index 22319f6eb..cd19a4eff 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -24,7 +24,7 @@ The Program does NOT cover the following: - Code located in the [test](./test) or [script](./script) directories. - External code in the [lib](./lib) directory, except for code that is explicitly used by a deployed contract located in the [src](./src) directory. -- Contract deployments on test networks, such as Goerli. +- Contract deployments on test networks, such as Sepolia. - Bugs in third-party contracts or platforms interacting with Sablier V2 Core. - Previously reported or discovered vulnerabilities in contracts built by third parties on Sablier V2 Core. - Bugs that have already been reported. diff --git a/foundry.toml b/foundry.toml index 7f7a0d690..0e809433c 100644 --- a/foundry.toml +++ b/foundry.toml @@ -84,7 +84,6 @@ avalanche = { key = "${API_KEY_SNOWTRACE" } bnb_smart_chain = { key = "${API_KEY_BSCSCAN}" } gnosis_chain = { key = "${API_KEY_GNOSISSCAN}" } - goerli = { key = "${API_KEY_ETHERSCAN}" } mainnet = { key = "${API_KEY_ETHERSCAN}" } optimism = { key = "${API_KEY_OPTIMISTIC_ETHERSCAN}" } polygon = { key = "${API_KEY_POLYGONSCAN}" } @@ -105,7 +104,6 @@ avalanche = "https://avalanche-mainnet.infura.io/v3/${API_KEY_INFURA}" bnb_smart_chain = "https://bsc-dataseed.binance.org" gnosis_chain = "https://rpc.gnosischain.com" - goerli = "https://goerli.infura.io/v3/${API_KEY_INFURA}" localhost = "http://localhost:8545" mainnet = "${RPC_URL_MAINNET}" optimism = "https://optimism-mainnet.infura.io/v3/${API_KEY_INFURA}" From d615d0a9144407a1d27531fc8b60152f23db2e2f Mon Sep 17 00:00:00 2001 From: andreivladbrg Date: Thu, 26 Oct 2023 16:24:14 +0300 Subject: [PATCH 33/47] refactor: emit event before calling hooks --- src/SablierV2LockupDynamic.sol | 6 +++--- src/SablierV2LockupLinear.sol | 6 +++--- src/abstracts/SablierV2Lockup.sol | 6 +++--- test/utils/Precompiles.sol | 4 ++-- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/SablierV2LockupDynamic.sol b/src/SablierV2LockupDynamic.sol index 4e571acef..329b3a439 100644 --- a/src/SablierV2LockupDynamic.sol +++ b/src/SablierV2LockupDynamic.sol @@ -512,6 +512,9 @@ contract SablierV2LockupDynamic is // Interactions: refund the sender. asset.safeTransfer({ to: sender, value: senderAmount }); + // Log the cancellation. + emit ISablierV2Lockup.CancelLockupStream(streamId, sender, recipient, asset, senderAmount, recipientAmount); + // Interactions: if the recipient is a contract, try to invoke the cancel hook on the recipient without // reverting if the hook is not implemented, and without bubbling up any potential revert. if (recipient.code.length > 0) { @@ -522,9 +525,6 @@ contract SablierV2LockupDynamic is recipientAmount: recipientAmount }) { } catch { } } - - // Log the cancellation. - emit ISablierV2Lockup.CancelLockupStream(streamId, sender, recipient, asset, senderAmount, recipientAmount); } /// @dev See the documentation for the user-facing functions that call this internal function. diff --git a/src/SablierV2LockupLinear.sol b/src/SablierV2LockupLinear.sol index 5644ddd78..e2d5ef584 100644 --- a/src/SablierV2LockupLinear.sol +++ b/src/SablierV2LockupLinear.sol @@ -427,6 +427,9 @@ contract SablierV2LockupLinear is // Interactions: refund the sender. asset.safeTransfer({ to: sender, value: senderAmount }); + // Log the cancellation. + emit ISablierV2Lockup.CancelLockupStream(streamId, sender, recipient, asset, senderAmount, recipientAmount); + // Interactions: if the recipient is a contract, try to invoke the cancel hook on the recipient without // reverting if the hook is not implemented, and without bubbling up any potential revert. if (recipient.code.length > 0) { @@ -437,9 +440,6 @@ contract SablierV2LockupLinear is recipientAmount: recipientAmount }) { } catch { } } - - // Log the cancellation. - emit ISablierV2Lockup.CancelLockupStream(streamId, sender, recipient, asset, senderAmount, recipientAmount); } /// @dev See the documentation for the user-facing functions that call this internal function. diff --git a/src/abstracts/SablierV2Lockup.sol b/src/abstracts/SablierV2Lockup.sol index 5f82c6a72..9f326a37f 100644 --- a/src/abstracts/SablierV2Lockup.sol +++ b/src/abstracts/SablierV2Lockup.sol @@ -202,15 +202,15 @@ abstract contract SablierV2Lockup is // Checks and Effects: renounce the stream. _renounce(streamId); + // Log the renouncement. + emit ISablierV2Lockup.RenounceLockupStream(streamId); + // Interactions: if the recipient is a contract, try to invoke the renounce hook on the recipient without // reverting if the hook is not implemented, and also without bubbling up any potential revert. address recipient = _ownerOf(streamId); if (recipient.code.length > 0) { try ISablierV2LockupRecipient(recipient).onStreamRenounced(streamId) { } catch { } } - - // Log the renouncement. - emit ISablierV2Lockup.RenounceLockupStream(streamId); } /// @inheritdoc ISablierV2Lockup diff --git a/test/utils/Precompiles.sol b/test/utils/Precompiles.sol index 5fca66eed..c3f9e3efd 100644 --- a/test/utils/Precompiles.sol +++ b/test/utils/Precompiles.sol @@ -27,9 +27,9 @@ contract Precompiles { bytes public constant BYTECODE_COMPTROLLER = hex"60803461009857601f6104a638819003918201601f19168301916001600160401b0383118484101761009d5780849260209460405283398101031261009857516001600160a01b0381169081900361009857600080546001600160a01b0319168217815560405191907fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a36103f290816100b48239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe608060408181526004918236101561001657600080fd5b600092833560e01c9182634d81e51d1461039d5750816375829def146102e5578163907a267b14610253578163b5b3ca2c146101ab578163cb01e30e146100f957508063dcf844a7146100c3578063e07df5b4146100a55763f851a4401461007d57600080fd5b346100a157816003193601126100a1576001600160a01b0360209254169051908152f35b5080fd5b50346100a157816003193601126100a1576020906001549051908152f35b50346100a15760203660031901126100a157806020926001600160a01b036100e96103d7565b1681526003845220549051908152f35b9050346101a75760203660031901126101a7576101146103d7565b6001600160a01b03918285541633810361017a575050169081835260026020528083209081549160ff8316159260ff84169060ff1916179055519081527f8cd3a7bc46b26a3b0c07a05a47af78abcaa647626f631d92ea64f8867b23bbec60203392a380f35b84516331b339a960e21b81526001600160a01b039091169181019182523360208301529081906040010390fd5b8280fd5b9050346101a757816003193601126101a7576101c56103d7565b90602435916001600160a01b039182865416338103610226575050907f371789a3d97098f3070492613273a065a7e8a19e009fd1ae92a4b4d4c71ed62d9116928385526003602052808520928084549455815193845260208401523392a380f35b85516331b339a960e21b81526001600160a01b039091169181019182523360208301529081906040010390fd5b919050346101a75760203660031901126101a7578135916001600160a01b038454163381036102b85750507fc059ba3e07a1c4d1fa8845bdb2af2dd85e844684e0a59e6073499e4338788465906001549280600155815193845260208401523392a280f35b82516331b339a960e21b81526001600160a01b039091169181019182523360208301529081906040010390fd5b919050346101a75760203660031901126101a7578135916001600160a01b03918284168094036103995784549283169033820361036d575050507fffffffffffffffffffffffff00000000000000000000000000000000000000001681178255337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808380a380f35b516331b339a960e21b81526001600160a01b039091169181019182523360208301529081906040010390fd5b8480fd5b849084346101a75760203660031901126101a75760ff906020936001600160a01b036103c76103d7565b1681526002855220541615158152f35b600435906001600160a01b03821682036103ed57565b600080fd"; bytes public constant BYTECODE_LOCKUP_DYNAMIC = - hex"60c0346200046e57601f62005db438819003918201601f19168301916001600160401b038311848410176200032b578084926080946040528339810103126200046e5780516001600160a01b038082169290918390036200046e5760208101518281168091036200046e5760408201519183831683036200046e5760600151936200008962000473565b90601d82527f5361626c696572205632204c6f636b75702044796e616d6963204e46540000006020830152620000be62000473565b601181527029a0a116ab1916a627a1a5aaa816a22ca760791b602082015230608052600080546001600160a01b03199081168417825560018054909116909517909455927fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a38051906001600160401b0382116200032b5760035490600182811c9216801562000463575b60208310146200044d5781601f849311620003d8575b50602090601f83116001146200034d5760009262000341575b50508160011b916000199060031b1c1916176003555b80516001600160401b0381116200032b576004918254600181811c9116801562000320575b60208210146200030b579081601f849311620002b3575b50602090601f831160011462000248576000926200023c575b50508160011b916000199060031b1c19161790555b1660018060a01b0319600a541617600a5560a05260016009556040516159209081620004948239608051816153a9015260a05181818161126b01526149090152f35b015190503880620001e5565b6000858152602081209350601f198516905b8181106200029a575090846001959493921062000280575b505050811b019055620001fa565b015160001960f88460031b161c1916905538808062000272565b929360206001819287860151815501950193016200025a565b909150836000526020600020601f840160051c8101916020851062000300575b90601f859493920160051c01905b818110620002f05750620001cc565b60008155849350600101620002e1565b9091508190620002d3565b602284634e487b7160e01b6000525260246000fd5b90607f1690620001b5565b634e487b7160e01b600052604160045260246000fd5b0151905038806200017a565b600360009081527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b9350601f198516905b818110620003bf5750908460019594939210620003a5575b505050811b0160035562000190565b015160001960f88460031b161c1916905538808062000396565b929360206001819287860151815501950193016200037e565b60036000529091507fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f840160051c8101916020851062000442575b90601f859493920160051c01905b81811062000432575062000161565b6000815584935060010162000423565b909150819062000415565b634e487b7160e01b600052602260045260246000fd5b91607f16916200014b565b600080fd5b60408051919082016001600160401b038111838210176200032b5760405256fe608080604052600436101561001357600080fd5b60003560e01c90816301ffc9a714612a0d5750806306fdde031461294a578063081812fc1461292c578063095ea7b3146127985780631400ecec146126f357806316844456146124785780631c1cdd4c146124125780631e99d569146123f457806323b872dd146123cb57806339a73c031461238857806340e58ee514612108578063425d30dd146120ea57806342842e0e1461209a57806342966c6814611f3c5780634857501f14611ec65780634869e12d14611e8a5780635fe3b56714611e635780636352211e14611e345780636d0cee7514611ddc57806370a0823114611d3257806375829def14611ca05780637cad6cd114611bce5780637de6b1db146119a55780638659c2701461164d578063894e9a0d146113e05780638bad38dd146113645780638f69b993146112e15780639067b6771461128e5780639188ec841461125357806395d89b4114611145578063a22cb46514611074578063a2ffb89714610f7b578063a6202bf214610e7b578063a80fc07114610e26578063ad35efd414610dc3578063b256456914610da5578063b637b86514610d45578063b88d4fde14610cba578063b8a3be6614610c83578063b971302a14610c31578063bc063e1a14610c0e578063bc2be1be14610bbb578063c156a11d14610acd578063c33cd35e146109b8578063c87b56dd14610885578063cc364f48146107eb578063d4dbd20b14610796578063d511609f14610747578063d975dfed146106fa578063e985e9c5146106a3578063ea5ead1914610652578063eac8f5b8146105e6578063f590c176146105be578063f851a440146105975763fdd46d601461027c57600080fd5b3461048057606036600319011261048057600435610298612b3a565b604435916001600160801b039182841693848103610480576102b861539f565b6102c183613428565b61057f576102e583600052600b6020526001600160a01b0360406000205416331490565b9182158061056f575b6105505783600052602094600586526001600160a01b039081604060002054169480610544575b61051e5781831693841561050d5788156104f55761033287615461565b8281168a116104c1575091889161038e6103626103cb958a600052600b8c5260026040600020015460801c615730565b89600052600b8b52600260406000200190836001600160801b031983549260801b1691161781556133bd565b906103aa818b840151169282604081835116920151169061345f565b16111561048f575b86600052600b88526001604060002001541692836153fb565b81847f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d876040518a8152a48133141580610485575b61041f575b6000805160206158f48339815191528484604051908152a1005b813b15610480576000805160206158f48339815191529460846000928360405195869485936313375c3b60e01b8552896004860152336024860152604485015260648401525af1610471575b80610405565b61047a90612cad565b3861046b565b600080fd5b50813b1515610400565b86600052600b8852604060002060018101600160a01b60ff60a01b1982541617905560ff60f01b1981541690556103b2565b60405163287ecaef60e21b8152600481018990526001600160801b03928316602482015291166044820152606490fd5b0390fd5b6024876040519063d2aabcd960e01b82526004820152fd5b600460405163630d074f60e11b8152fd5b606486838560405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b50848284161415610315565b60405163216caf0d60e01b815260048101859052336024820152604490fd5b506105798461574b565b156102ee565b60248360405190634a5541ef60e01b82526004820152fd5b346104805760003660031901126104805760206001600160a01b0360005416604051908152f35b346104805760203660031901126104805760206105dc600435613478565b6040519015158152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260206001600160a01b0360016040600020015416604051908152f35b6024906040519062b8e7e760e51b82526004820152fd5b34610480576040366003190112610480576000805160206158f4833981519152602060043561069a610682612b3a565b61068b83615461565b9061069461539f565b83615499565b604051908152a1005b34610480576040366003190112610480576106bc612b24565b6106c4612b3a565b906001600160a01b03809116600052600860205260406000209116600052602052602060ff604060002054166040519015158152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57610736602091615461565b6001600160801b0360405191168152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b602052602060026040600020015460801c604051908152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260206001600160801b0360036040600020015416604051908152f35b34610480576020366003190112610480576004356000602060405161080f81612c74565b828152015280600052600b60205260ff60016040600020015460a81c161561063b57600052600b6020526040806000205464ffffffffff82519161085283612c74565b818160a01c16835260c81c166020820152610883825180926020908164ffffffffff91828151168552015116910152565bf35b346104805760208060031936011261048057600435906108c36108be8360005260056020526001600160a01b0360406000205416151590565b612d13565b60006001600160a01b03600a5416926044604051809581937fe9dc637500000000000000000000000000000000000000000000000000000000835230600484015260248301525afa9182156109ac57600092610933575b5061092f604051928284938452830190612aff565b0390f35b9091503d806000833e6109468183612cc1565b81019082818303126104805780519067ffffffffffffffff8211610480570181601f8201121561048057805161097b81612ce3565b926109896040519485612cc1565b818452848284010111610480576109a591848085019101612adc565b908261091a565b6040513d6000823e3d90fd5b3461048057600319602036820112610480576004359067ffffffffffffffff9081831161048057610140908336030112610480576109f461539f565b60405191610a0183612c57565b610a0d81600401612b50565b8352610a1b602482016134a9565b6020840152610a2c60448201612c2e565b6040840152610a3d60648201612c2e565b6060840152610a4e60848201612b50565b6080840152610a5f60a48201612cff565b60a0840152610a7060c48201612b50565b60c0840152610a823660e4830161358f565b60e084015261012481013591821161048057013660238201121561048057602091610aba610ac59236906024600482013591016134bb565b61010082015261485b565b604051908152f35b3461048057604036600319011261048057600435610ae9612b3a565b610af161539f565b81600052600b60205260ff60016040600020015460a81c1615610ba4578160005260056020526001600160a01b0360406000205416803303610b85579161069a816020936000805160206158f483398151915295610b4e83615461565b6001600160801b038116610b63575b50612fa6565b610b7690610b6f61539f565b8285615499565b8686604051858152a187610b5d565b60405163216caf0d60e01b815260048101849052336024820152604490fd5b6024826040519062b8e7e760e51b82526004820152fd5b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b602052602064ffffffffff60406000205460a01c16604051908152f35b3461048057600036600319011261048057602060405167016345785d8a00008152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260206001600160a01b0360406000205416604051908152f35b3461048057602036600319011261048057600435600052600b602052602060ff60016040600020015460a81c166040519015158152f35b3461048057608036600319011261048057610cd3612b24565b610cdb612b3a565b6064359167ffffffffffffffff8311610480573660238401121561048057826004013591610d0883612ce3565b92610d166040519485612cc1565b8084523660248287010111610480576020816000926024610d439801838801378501015260443591612e31565b005b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205261092f610d916004604060002001613310565b604051918291602083526020830190612bca565b346104805760203660031901126104805760206105dc6004356133f1565b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57610dfd9061475f565b6040516005821015610e10576020918152f35b634e487b7160e01b600052602160045260246000fd5b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260206001600160801b0360026040600020015416604051908152f35b3461048057602036600319011261048057610e94612b24565b6001600160a01b038060005416338103610f5257508116908160005260026020526001600160801b0360406000205416908115610f215781610ef39184600052600260205260406000206001600160801b0319815416905533906153fb565b6040519081527fca7a4a65a94ed2f37538814e00e1cd4c41a78261561e3f3794592f11409cf5af60203392a3005b602483604051907f8410168c0000000000000000000000000000000000000000000000000000000082526004820152fd5b6040516331b339a960e21b81526001600160a01b03919091166004820152336024820152604490fd5b346104805760603660031901126104805767ffffffffffffffff60043581811161048057610fad903690600401612b99565b610fb5612b3a565b9260443590811161048057610fce903690600401612b99565b9190610fd861539f565b82820361103d5760005b828110610feb57005b806000805160206158f4833981519152602061100a600194878a615489565b3561103061102161101c868b8a615489565b61357b565b61102961539f565b8b83615499565b604051908152a101610fe2565b50604491604051917faec9344000000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b346104805760403660031901126104805761108d612b24565b60243590811515809203610480576001600160a01b03169081331461110157336000526008602052604060002082600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a3005b606460405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152fd5b3461048057600036600319011261048057604051600060045490600182811c91818416918215611249575b60209485851084146112335785879486865291826000146112135750506001146111b6575b506111a292500383612cc1565b61092f604051928284938452830190612aff565b84915060046000527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b906000915b8583106111fb5750506111a2935082010185611195565b805483890185015287945086939092019181016111e4565b60ff1916858201526111a295151560051b85010192508791506111959050565b634e487b7160e01b600052602260045260246000fd5b92607f1692611170565b346104805760003660031901126104805760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b602052602064ffffffffff60406000205460c81c16604051908152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b5761131b9061475f565b600581101580610e105760028214908115611357575b8115611345575b6020826040519015158152f35b9050610e105760046020911482611338565b5050600381146000611331565b34610480576020366003190112610480576004356001600160a01b0390818116809103610480578160005416338103610f52575060015491816001600160a01b03198416176001556040519216825260208201527fdcb09aef4bf01068924ccce937981cbe59d25ba08380cf941aaaea4e4bd3960d60403392a2005b3461048057602036600319011261048057606061014060405161140281612c90565b60008152600060208201526000604082015260008382015260006080820152600060a0820152600060c0820152600060e0820152600061010082015261144661339e565b6101208201520152600435600052600b60205260ff60016040600020015460a81c161561163557600435600052600b602052604060002061152960046040519261148f84612c90565b80546001600160a01b038116855264ffffffffff8160a01c16602086015264ffffffffff8160c81c16604086015260ff8160f01c161515606086015260f81c1515608085015260ff60018201546001600160a01b03811660a0870152818160a01c16151560c0870152818160a81c16151560e087015260b01c16151561010085015261151d600282016133bd565b61012085015201613310565b61014082015261153a60043561475f565b906005821015610e105760026101409214611629575b61092f604051928392602084526001600160a01b03815116602085015264ffffffffff602082015116604085015264ffffffffff60408201511660608501526060810151151560808501526080810151151560a08501526001600160a01b0360a08201511660c085015260c0810151151560e085015260e08101511515610100850152610100810151151561012085015261161561012082015183860190604090816001600160801b0391828151168552826020820151166020860152015116910152565b01516101a0808401526101c0830190612bca565b60006060820152611550565b602460405162b8e7e760e51b81526004356004820152fd5b346104805760203660031901126104805760043567ffffffffffffffff81116104805761167e903690600401612b99565b61168661539f565b6000905b80821061169357005b61169e828285615489565b35916116a861539f565b6116b183613428565b156116ce5760248360405190634a5541ef60e01b82526004820152fd5b6116d9839293613478565b61198d576116fd82600052600b6020526001600160a01b0360406000205416331490565b1561196e5761170b826135be565b82600052600b928360205261172660026040600020016133bd565b936001600160801b039283865116848216101561195657826000528160205260ff60406000205460f01c161561193e578084602061176a61177494838b511661345f565b980151169061345f565b9482600052816020526040600020958654600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82161788556003868316988915611924575b0195831695866001600160801b03198254161790556001600160a01b03916005602052826040600020541694602052600198838a604060002001541697611805818686168b6153fb565b863b611888575b505060209594926000805160206158f48339815191529794926118777f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa509360405193849316958984916040919493606084019584526001600160801b03809216602085015216910152565b0390a4604051908152a1019061168a565b9196959390979492843b15610480576118776020987f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa50946000805160206158f48339815191529b604051916372eba20360e01b83528b6004840152868616602484015260448301526064820152600081608481838c5af1611915575b50935050929497819496975061180c565b61191e90612cad565b8f611904565b60018101600160a01b60ff60a01b198254161790556117bb565b602483604051906339c6dc7360e21b82526004820152fd5b602483604051906322cad1af60e11b82526004820152fd5b60405163216caf0d60e01b815260048101839052336024820152604490fd5b6024826040519063fe19f19f60e01b82526004820152fd5b3461048057602080600319360112610480576004356119c261539f565b80600052600b825260ff60016040600020015460a81c161561063b576119e78161475f565b916000926005811015610e105760048103611a145760248360405190634a5541ef60e01b82526004820152fd5b60038103611a34576024836040519063fe19f19f60e01b82526004820152fd5b916002849314611bb657611a5e81600052600b6020526001600160a01b0360406000205416331490565b15611b965780600052600b825260ff60406000205460f01c1615611b7e5780600052600b8252604060002060ff60f01b198154169055600582526001600160a01b0360406000205416803b611aec575b50807f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f846000805160206158f483398151915295a2604051908152a1005b803b15610480576000805160206158f48339815191529360008084936024604051809481937f341a0bd90000000000000000000000000000000000000000000000000000000083528860048401525af1611b49575b509350611aae565b9050611b559150612cad565b8060007f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f611b41565b602490604051906339c6dc7360e21b82526004820152fd5b60405163216caf0d60e01b81526004810191909152336024820152604490fd5b602490604051906322cad1af60e11b82526004820152fd5b34610480576020366003190112610480576004356001600160a01b0390818116809103610480578160005416338103610f525750600a5491816001600160a01b0319841617600a556040519216825260208201527fa2548bd4b805e907c1558a47b5858324fe8bb4a2e1ddfca647eecbf65610eebc60403392a26009546000198101908111611c8a5760407f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c91815190600182526020820152a1005b634e487b7160e01b600052601160045260246000fd5b3461048057602036600319011261048057611cb9612b24565b6000546001600160a01b0380821692338403611d0b576001600160a01b03199350169182911617600055337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf80600080a3005b6040516331b339a960e21b81526001600160a01b0385166004820152336024820152604490fd5b34610480576020366003190112610480576001600160a01b03611d53612b24565b168015611d725760005260066020526020604060002054604051908152f35b608460405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e657200000000000000000000000000000000000000000000006064820152fd5b3461048057602036600319011261048057600435611e136108be8260005260056020526001600160a01b0360406000205416151590565b600052600560205260206001600160a01b0360406000205416604051908152f35b34610480576020366003190112610480576020611e52600435612d5e565b6001600160a01b0360405191168152f35b346104805760003660031901126104805760206001600160a01b0360015416604051908152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b576107366020916147e0565b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b576000611f028261475f565b6005811015610e1057600203611f20575b6020906040519015158152f35b50600052600b602052602060ff60406000205460f01c16611f13565b3461048057602036600319011261048057600435611f5861539f565b611f6181613428565b1561206957611f6f8161574b565b15611b9657611f7d81612d5e565b611f86826133f1565b159081612060575b8161204d575b5061203557602081611fb46000805160206158f483398151915293612d5e565b9080600052600783526001600160a01b036040600020926001600160a01b031993848154169055169182600052600684526040600020600019815401905581600052600584526040600020908154169055806000604051937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a48152a1005b602490604051906378630aa960e01b82526004820152fd5b6001600160a01b03915016151582611f94565b60009150611f8e565b602490604051907f817cd6390000000000000000000000000000000000000000000000000000000082526004820152fd5b34610480576120a836612b64565b60405191602083019383851067ffffffffffffffff8611176120d457610d439460405260008452612e31565b634e487b7160e01b600052604160045260246000fd5b346104805760203660031901126104805760206105dc600435613428565b3461048057602080600319360112610480576004359061212661539f565b61212f82613428565b1561214c5760248260405190634a5541ef60e01b82526004820152fd5b61215582613478565b61198d5761217982600052600b6020526001600160a01b0360406000205416331490565b1561196e57612187826135be565b9180600052600b82526121a060026040600020016133bd565b926001600160801b03908185511682821610156119565782600052600b845260ff60406000205460f01c161561193e578082856121e36121ed94838a511661345f565b970151169061345f565b82600052600b8452604060002091825491600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8416178455600382821694851561236e575b0191871691826001600160801b03198254161790556001600160a01b038093169160058752836040600020541693600b8852600160406000200154169461227c8285886153fb565b843b6122e6575b5050604080518681526001600160801b03988916602082015291909716968101969096526000805160206158f4833981519152957f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa5090606090a4604051908152a1005b919097843b15610480576000805160206158f4833981519152987f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa5093604051916372eba20360e01b835289600484015286602484015260448301526064820152600081608481838a5af161235f575b5097819250612283565b61236890612cad565b89612355565b60018101600160a01b60ff60a01b19825416179055612234565b34610480576020366003190112610480576001600160a01b036123a9612b24565b16600052600260205260206001600160801b0360406000205416604051908152f35b3461048057610d436123dc36612b64565b916123ef6123ea8433612ec7565b612dc0565b612fa6565b34610480576000366003190112610480576020600954604051908152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b5761244c9061475f565b6005811015610e1057806020911590811561246d575b506040519015158152f35b600191501482612462565b346104805760206003198181360112610480576004359067ffffffffffffffff908183116104805761012083360391820112610480576124b661539f565b6101048301359060221901811215610480578201600481013590828211610480576024016060820236038113610480576124f19136916134bb565b918251906124fe826132f8565b9161250c6040519384612cc1565b808352601f1961251b826132f8565b018660005b8281106126dd5750505064ffffffffff90814216946001600160801b03968761254882613629565b515116828a61255684613629565b510151168580604061256786613629565b510151168a0116906040519261257c84612c3b565b83528b830152604082015261259087613629565b5261259a86613629565b5060019386855b8a8c87831061265c57908b846001600160a01b038c60a48101358281169081900361048057610ac59561261c9561264c946125de6024860161355a565b6125ea6044870161355a565b6125f660648801613567565b9161260388600401613567565b948461261160848b0161357b565b966040519d8e612c57565b168c528d8c0152151560408b0152151560608a01521660808801521660a086015260c085015260c436910161358f565b60e083015261010082015261485b565b8893858060406126908b866126808a8e9a612677828d61364c565b5151169a61364c565b510151169460001989019061364c565b510151168160406126a1888c61364c565b51015116011691604051936126b585612c3b565b845283015260408201526126c9828b61364c565b526126d4818a61364c565b500187906125a1565b6126e561339e565b828288010152018790612520565b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b5760209060009080600052600b8352604060002060ff815460f01c1680612786575b61275d575b50506001600160801b0360405191168152f35b61277f92506001600160801b03600261277992015416916135be565b9061345f565b828061274a565b5060ff600182015460a01c1615612745565b34610480576040366003190112610480576127b1612b24565b602435906001600160a01b0380806127c885612d5e565b169216918083146128c25780331490811561289d575b5015612833578260005260076020526040600020826001600160a01b031982541617905561280b83612d5e565b167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b608460405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152fd5b9050600052600860205260406000203360005260205260ff60406000205416846127de565b608460405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152fd5b34610480576020366003190112610480576020611e52600435612d83565b3461048057600036600319011261048057604051600060035490600182811c91818416918215612a03575b60209485851084146112335785879486865291826000146112135750506001146129a657506111a292500383612cc1565b84915060036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b906000915b8583106129eb5750506111a2935082010185611195565b805483890185015287945086939092019181016129d4565b92607f1692612975565b3461048057602036600319011261048057600435907fffffffff00000000000000000000000000000000000000000000000000000000821680920361048057817f80ac58cd0000000000000000000000000000000000000000000000000000000060209314908115612ab2575b8115612a88575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501483612a81565b7f5b5e139f0000000000000000000000000000000000000000000000000000000081149150612a7a565b60005b838110612aef5750506000910152565b8181015183820152602001612adf565b90602091612b1881518092818552858086019101612adc565b601f01601f1916010190565b600435906001600160a01b038216820361048057565b602435906001600160a01b038216820361048057565b35906001600160a01b038216820361048057565b6060906003190112610480576001600160a01b0390600435828116810361048057916024359081168103610480579060443590565b9181601f840112156104805782359167ffffffffffffffff8311610480576020808501948460051b01011161048057565b90815180825260208080930193019160005b828110612bea575050505090565b835180516001600160801b031686528083015167ffffffffffffffff168684015260409081015164ffffffffff169086015260609094019392810192600101612bdc565b3590811515820361048057565b6060810190811067ffffffffffffffff8211176120d457604052565b610120810190811067ffffffffffffffff8211176120d457604052565b6040810190811067ffffffffffffffff8211176120d457604052565b610160810190811067ffffffffffffffff8211176120d457604052565b67ffffffffffffffff81116120d457604052565b90601f8019910116810190811067ffffffffffffffff8211176120d457604052565b67ffffffffffffffff81116120d457601f01601f191660200190565b35906001600160801b038216820361048057565b15612d1a57565b606460405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152fd5b60005260056020526001600160a01b0360406000205416612d80811515612d13565b90565b612da66108be8260005260056020526001600160a01b0360406000205416151590565b60005260076020526001600160a01b036040600020541690565b15612dc757565b608460405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f766564000000000000000000000000000000000000006064820152fd5b90612e55939291612e456123ea8433612ec7565b612e50838383612fa6565b61315f565b15612e5c57565b60405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b906001600160a01b038080612edb84612d5e565b16931691838314938415612f0e575b508315612ef8575b50505090565b612f0491929350612d83565b1614388080612ef2565b909350600052600860205260406000208260005260205260ff604060002054169238612eea565b15612f3c57565b608460405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152fd5b90612fcf9291612fb583612d5e565b916001600160a01b03948593848094169687911614612f35565b16908115806130c657612fe1846133f1565b1590816130bd575b50806130b4575b61309c579180849261301e6000805160206158f48339815191529660209661301785612d5e565b1614612f35565b60009382855260078652604085206001600160a01b031990818154169055818652600687526040862060001981540190558286526040862060018154019055838652600587528260408720918254161790557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6040519580a48152a1565b602483604051906378630aa960e01b82526004820152fd5b50831515612ff0565b90501538612fe9565b608460405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152fd5b3d1561315a573d9061314082612ce3565b9161314e6040519384612cc1565b82523d6000602084013e565b606090565b9290803b156132ef576131c9916020916001600160a01b0394604051809581948293897f150b7a02000000000000000000000000000000000000000000000000000000009b8c86523360048701521660248501526044840152608060648401526084830190612aff565b03916000968791165af190829082613288575b5050613262576131ea61312f565b8051908161325d5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000161490565b909192506020813d82116132e7575b816132a460209383612cc1565b810103126132e35751907fffffffff00000000000000000000000000000000000000000000000000000000821682036132e057509038806131dc565b80fd5b5080fd5b3d9150613297565b50505050600190565b67ffffffffffffffff81116120d45760051b60200190565b90815461331c816132f8565b9260409361332c85519182612cc1565b828152809460208092019260005281600020906000935b85851061335257505050505050565b6001848192845161336281612c3b565b64ffffffffff87546001600160801b038116835267ffffffffffffffff8160801c168584015260c01c1686820152815201930194019391613343565b604051906133ab82612c3b565b60006040838281528260208201520152565b906040516133ca81612c3b565b6040819360018154916001600160801b0392838116865260801c6020860152015416910152565b80600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260ff60016040600020015460b01c1690565b80600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260ff60016040600020015460a01c1690565b6001600160801b039182169082160391908211611c8a57565b80600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260406000205460f81c90565b359064ffffffffff8216820361048057565b9291926134c7826132f8565b6040946134d686519283612cc1565b8195848352602080930191606080960285019481861161048057925b8584106135025750505050505050565b86848303126104805782519061351782612c3b565b61352085612cff565b8252858501359067ffffffffffffffff8216820361048057828792838b95015261354b8688016134a9565b868201528152019301926134f2565b3580151581036104805790565b356001600160a01b03811681036104805790565b356001600160801b03811681036104805790565b9190826040910312610480576040516135a781612c74565b60208082946135b581612b50565b84520135910152565b64ffffffffff80421682600052600b602052604060002091825482828260a01c16101561361f5760c81c16111561360d57600401546001101561360457612d8090613660565b612d8090614690565b6001600160801b039150600201541690565b5050505050600090565b8051156136365760200190565b634e487b7160e01b600052603260045260246000fd5b80518210156136365760209160051b010190565b64ffffffffff90814216906000908152600b60205260409081812082519361368785612c90565b8154956001600160a01b039182881687526020870197828160a01c168952828160c81c168789015260ff8160f01c161515606089015260f81c1515608088015260ff6001938486015490811660a08a0152818160a01c16151560c08a0152818160a81c16151560e08a015260b01c1615156101008801526101406137216004613712600288016133bd565b966101208b0197885201613310565b9701918783528087613733889a613629565b5101511693828288965b16106138175750916137c76137cc928488816137d198976001600160801b039e8f6137698b8a5161364c565b5151169d8a8f9b602061378667ffffffffffffffff928d5161364c565b5101511699848361379884845161364c565b510151169650811561380b576137b69293505190600019019061364c565b5101511680925b031692031661388b565b613bfa565b613a5d565b9283136137ea5750506137e4839161384f565b16011690565b5160200151929392831692841683101591506138069050575090565b905090565b505050511680926137bd565b8094986001600160801b03908161382f8c885161364c565b51511601169801938282808a61384689895161364c565b5101511661373d565b6000811261385a5790565b602490604051907f2463f3d50000000000000000000000000000000000000000000000000000000082526004820152fd5b90600160ff1b808314908115613973575b50613949576000821215613940576138c5826000035b600083121561393957826000039061397d565b917f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831161390357600091600019911813156138ff575090565b0390565b604491604051917fd49c26b300000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b829061397d565b6138c5826138b2565b60046040517f9fe2b450000000000000000000000000000000000000000000000000000000008152fd5b905081143861389c565b670de0b6b3a7640000916000198383099280830292838086109503948086039514613a3957828510156139fd57908291096001821901821680920460028082600302188083028203028083028203028083028203028083028203028083028203028092029003029360018380600003040190848311900302920304170290565b82606492604051927f63a05778000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b505080925015613a47570490565b634e487b7160e01b600052601260045260246000fd5b90600160ff1b808314908115613b41575b50613b17576000821215613b0e57613a97826000035b6000831215613b07578260000390613b4b565b917f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311613ad157600091600019911813156138ff575090565b604491604051917f120b5b4300000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b8290613b4b565b613a9782613a84565b60046040517fa6070c25000000000000000000000000000000000000000000000000000000008152fd5b9050811438613a6e565b90919060001983820983820291828083109203918083039214613be957670de0b6b3a76400009081831015613bb257947faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066994950990828211900360ee1b910360121c170290565b60449086604051917f5173648d00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050670de0b6b3a764000090049150565b80613c145750600090612d805750670de0b6b3a764000090565b90670de0b6b3a7640000808314613c61575080613c39575050670de0b6b3a764000090565b670de0b6b3a76400008114613c5d57613c58906137cc612d809361453b565b613c81565b5090565b91505090565b8015613a47576ec097ce7bc90715b34b9f10000000000590565b6000811215613cb65768033dd1780914b97114198112613cb057613ca790600003613c81565b612d8090613c67565b50600090565b680a688906bd8affffff811361450a57670de0b6b3a764000080604092831b05907780000000000000000000000000000000000000000000000067ff0000000000000083166143ed575b66ff00000000000083166142e5575b65ff000000000083166141e5575b64ff0000000083166140ed575b63ff0000008316613ffd575b62ff00008316613f15575b61ff008316613e35575b60ff8316613d5e575b02911c60bf031c90565b60808316613e23575b838316613e11575b60208316613dff575b60108316613ded575b60088316613ddb575b60048316613dc9575b60028316613db7575b6001831615613d54576801000000000000000102831c613d54565b6801000000000000000102831c613d9c565b6801000000000000000302831c613d93565b6801000000000000000602831c613d8a565b6801000000000000000b02831c613d81565b6801000000000000001602831c613d78565b6801000000000000002c02831c613d6f565b6801000000000000005902831c613d67565b6180008316613f03575b6140008316613ef1575b6120008316613edf575b6110008316613ecd575b6108008316613ebb575b6104008316613ea9575b6102008316613e97575b610100831615613d4b57680100000000000000b102831c613d4b565b6801000000000000016302831c613e7b565b680100000000000002c602831c613e71565b6801000000000000058c02831c613e67565b68010000000000000b1702831c613e5d565b6801000000000000162e02831c613e53565b68010000000000002c5d02831c613e49565b680100000000000058b902831c613e3f565b628000008316613feb575b624000008316613fd9575b622000008316613fc7575b621000008316613fb5575b620800008316613fa3575b620400008316613f91575b620200008316613f7f575b62010000831615613d41576801000000000000b17202831c613d41565b680100000000000162e402831c613f62565b6801000000000002c5c802831c613f57565b68010000000000058b9102831c613f4c565b680100000000000b172102831c613f41565b68010000000000162e4302831c613f36565b680100000000002c5c8602831c613f2b565b6801000000000058b90c02831c613f20565b638000000083166140db575b634000000083166140c9575b632000000083166140b7575b631000000083166140a5575b63080000008316614093575b63040000008316614081575b6302000000831661406f575b6301000000831615613d365768010000000000b1721802831c613d36565b6801000000000162e43002831c614051565b68010000000002c5c86002831c614045565b680100000000058b90c002831c614039565b6801000000000b17217f02831c61402d565b680100000000162e42ff02831c614021565b6801000000002c5c85fe02831c614015565b68010000000058b90bfc02831c614009565b64800000000083166141d3575b64400000000083166141c1575b64200000000083166141af575b641000000000831661419d575b640800000000831661418b575b6404000000008316614179575b6402000000008316614167575b640100000000831615613d2a57680100000000b17217f802831c613d2a565b68010000000162e42ff102831c614148565b680100000002c5c85fe302831c61413b565b6801000000058b90bfce02831c61412e565b68010000000b17217fbb02831c614121565b6801000000162e42fff002831c614114565b68010000002c5c8601cc02831c614107565b680100000058b90c0b4902831c6140fa565b6580000000000083166142d3575b6540000000000083166142c1575b6520000000000083166142af575b65100000000000831661429d575b65080000000000831661428b575b650400000000008316614279575b650200000000008316614267575b65010000000000831615613d1d576801000000b17218355102831c613d1d565b680100000162e430e5a202831c614247565b6801000002c5c863b73f02831c614239565b68010000058b90cf1e6e02831c61422b565b680100000b1721bcfc9a02831c61421d565b68010000162e43f4f83102831c61420f565b680100002c5c89d5ec6d02831c614201565b6801000058b91b5bc9ae02831c6141f3565b668000000000000083166143db575b664000000000000083166143c9575b662000000000000083166143b7575b661000000000000083166143a5575b66080000000000008316614393575b66040000000000008316614381575b6602000000000000831661436f575b6601000000000000831615613d0f5768010000b17255775c0402831c613d0f565b6801000162e525ee054702831c61434e565b68010002c5cc37da949202831c61433f565b680100058ba01fb9f96d02831c614330565b6801000b175effdc76ba02831c614321565b680100162f3904051fa102831c614312565b6801002c605e2e8cec5002831c614303565b68010058c86da1c09ea202831c6142f4565b67800000000000000083166144eb575b67400000000000000083166144d9575b67200000000000000083166144c7575b67100000000000000083166144b5575b67080000000000000083166144a3575b6704000000000000008316614491575b670200000000000000831661447f575b670100000000000000831615613d0057680100b1afa5abcbed6102831c613d00565b68010163da9fb33356d802831c61445d565b680102c9a3e778060ee702831c61444d565b6801059b0d31585743ae02831c61443d565b68010b5586cf9890f62a02831c61442d565b6801172b83c7d517adce02831c61441d565b6801306fe0a31b7152df02831c61440d565b5077b504f333f9de6484800000000000000000000000000000006143fd565b602490604051907f0360d0280000000000000000000000000000000000000000000000000000000082526004820152fd5b8060008083131561465f57670de0b6b3a76400009283811261462857506001925b808305906001600160801b03821160071b91821c9167ffffffffffffffff831160061b92831c63ffffffff811160051b90811c61ffff811160041b90811c60ff811160031b90811c91600f831160021b92831c936001978860038711811b96871c11961717171717171781810294811d9082821461461c57506706f05b59d3b20000905b8482136145f05750505050500290565b808391020590671bc16d674ec8000082121561460f575b831d906145e0565b8091950194831d90614607565b93505093925050020290565b600019939250801561464b576ec097ce7bc90715b34b9f1000000000059161455c565b602482634e487b7160e01b81526012600452fd5b602483604051907f059b101b0000000000000000000000000000000000000000000000000000000082526004820152fd5b64ffffffffff6146c5600091838352600b60205280806040852054818160a01c1693849160c81c16031691814216031661388b565b91808252600b6020526004604083200180541561474b5790829167ffffffffffffffff935261471d6020832054828452600b6020526137cc6001600160801b03968760026040882001541696879360801c1690613bfa565b92831361473357505061472f9061384f565b1690565b60029350604092508152600b60205220015460801c90565b602483634e487b7160e01b81526032600452fd5b80600052600b602052604060002060ff600182015460a01c16600014614786575050600490565b805460f81c6147d9575460a01c64ffffffffff164210613cb0576147a9816135be565b90600052600b6020526001600160801b0380600260406000200154169116106000146147d457600190565b600290565b5050600390565b80600052600b6020526147f960026040600020016133bd565b81600052600b602052604060002060ff600182015460a01c1660001461482c57506001600160801b039150602001511690565b5460f81c61483e5750612d80906135be565b612d8091506001600160801b03604081835116920151169061345f565b906001600160a01b036001541660206001600160a01b0360c0850151166024604051809481937fdcf844a700000000000000000000000000000000000000000000000000000000835260048301525afa80156109ac5760009061510e575b6148dc91506001600160801b0360a08501511690602060e08601510151916157b4565b6001600160801b0381511661010084015164ffffffffff60208601511682156150e457815180156150ba577f00000000000000000000000000000000000000000000000000000000000000008111615089575064ffffffffff604061494084613629565b510151168110156150325750600090819082815184905b808210614f9f575050505064ffffffffff421664ffffffffff8216811015614f5f5750506001600160801b0316808203614f285750506009549283600052600b6020526040600020916001600160801b0381511660028401906001600160801b03198254161790556001600160a01b0360c083015116600184015490750100000000000000000000000000000000000000000060408501511515928654927fffffffffffffffffff0000ff000000000000000000000000000000000000000076ff000000000000000000000000000000000000000000006060890151151560b01b16921617171760018601556001600160a01b0384511691610100850151926040614a6985519560001987019061364c565b510151927fff000000000000000000000000000000000000000000000000000000000000007eff0000000000000000000000000000000000000000000000000000000000007dffffffffff0000000000000000000000000000000000000000000000000078ffffffffff000000000000000000000000000000000000000060208b015160a01b169660c81b169460f01b16911617171717845560005b818110614e58575050600185016009556001600160a01b0360c08301511660005260026020526001600160801b0380604060002054168160208401511601166001600160a01b0360c0840151166000526040600020906001600160801b03198254161790556001600160a01b036080830151168015614e1457614ba7614ba18760005260056020526001600160a01b0360406000205416151590565b156152bc565b614bb0866133f1565b1580614e0b575b80614e03575b614deb5760206000805160206158f483398151915291614bf6614ba18960005260056020526001600160a01b0360406000205416151590565b806000526006825260406000206001815401905587600052600582526040600020816001600160a01b0319825416179055876040519160007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4878152a1614c866001600160a01b0360c0840151166001600160801b03808451168160208601511601169030903390615142565b6001600160801b0360408201511680614dbc575b507fef3d668acee46576ad5d407c42ab4d0cde13f3cd70b28f09a0fb9e3bf5bf09cb614d796001600160a01b03845116926001600160a01b03608086015116946001600160a01b0360c08201511696614db1614d9160408401511515928c606086015115156001600160a01b0360e061010089015194549864ffffffffff6040519a614d258c612c74565b818160a01c168c5260c81c1660208b01520151511695604051998a99610160948b523360208c015260408b0190604090816001600160801b0391828151168552826020820151166020860152015116910152565b60a089015260c08801528060e0880152860190612bca565b926101008501906020908164ffffffffff91828151168552015116910152565b6101408301520390a4565b614de5906001600160a01b0360c0850151166001600160a01b0360e08601515116903390615142565b38614c9a565b602486604051906378630aa960e01b82526004820152fd5b506000614bbd565b50801515614bb7565b606460405162461bcd60e51b815260206004820152602060248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152fd5b614e678161010086015161364c565b5190600486015491680100000000000000008310156120d457600183018060048901558310156136365760019260048801600052602060002001906001600160801b03815116908254917fffffff00000000000000000000000000000000000000000000000000000000007cffffffffff000000000000000000000000000000000000000000000000604077ffffffffffffffff00000000000000000000000000000000602086015160801b1694015160c01b169316171717905501614b05565b60449250604051917fd90b7e3900000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b6040517f210aec0e00000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b9193509193614fc3906001600160801b03614fba858861364c565b51511690615730565b9364ffffffffff806040614fd7868561364c565b51015116941680851115614ff5575060018493019192919092614957565b8385606492604051927f7b0bada8000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b64ffffffffff604061504384613629565b5101516040517fb4c9e52c00000000000000000000000000000000000000000000000000000000815264ffffffffff938416600482015291169091166024820152604490fd5b602490604051907f4757689b0000000000000000000000000000000000000000000000000000000082526004820152fd5b60046040517f3952c64e000000000000000000000000000000000000000000000000000000008152fd5b60046040517f6095d3bc000000000000000000000000000000000000000000000000000000008152fd5b6020823d60201161513a575b8161512760209383612cc1565b810103126132e057506148dc90516148b9565b3d915061511a565b9290604051927f23b872dd0000000000000000000000000000000000000000000000000000000060208501526001600160a01b03809216602485015216604483015260648201526064815260a081019181831067ffffffffffffffff8411176120d4576151b1926040526151b3565b565b6001600160a01b0316906152136040516151cc81612c74565b6020938482527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564858301526000808587829751910182855af161520d61312f565b91615307565b805191821591848315615298575b50505090501561522e5750565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b9193818094500103126132e3578201519081151582036132e0575080388084615221565b156152c357565b606460405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152fd5b91929015615368575081511561531b575090565b3b156153245790565b606460405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b82519091501561537b5750805190602001fd5b6104f19060405191829162461bcd60e51b8352602060048401526024830190612aff565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036153d157565b60046040517fa1c0d6e5000000000000000000000000000000000000000000000000000000008152fd5b916001600160a01b03604051927fa9059cbb000000000000000000000000000000000000000000000000000000006020850152166024830152604482015260448152608081019181831067ffffffffffffffff8411176120d4576151b1926040526151b3565b612d809061546e816147e0565b90600052600b60205260026040600020015460801c9061345f565b91908110156136365760051b0190565b906154a382613428565b615718576154c782600052600b6020526001600160a01b0360406000205416331490565b91821580615708575b611b96576000928184526020600581526001600160a01b039360409185838820541693806156fc575b6156d7578582169586156156c7576001600160801b03808a16998a156156b05761552288615461565b8281168c116156815750926155d68b89946001898e7f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d978f9a6155786155a1918c8552600b8b526002868620015460801c615730565b8b8452600b8a5260028585200190836001600160801b031983549260801b1691161781556133bd565b906155bc818a8401511692828681835116920151169061345f565b161115615653575b888152600b87522001541696876153fb565b85518b8152a48133141580615649575b6155f3575b505050505050565b813b15615645576084929185915196879586946313375c3b60e01b86526004860152336024860152604485015260648401525af1615636575b80808080806155eb565b61563f90612cad565b3861562c565b8480fd5b50813b15156155e6565b888152600b8752818120838101600160a01b60ff60a01b1982541617905560ff60f01b1981541690556155c4565b865163287ecaef60e21b8152600481018a90526001600160801b03928316602482015291166044820152606490fd5b60248887519063d2aabcd960e01b82526004820152fd5b6004845163630d074f60e11b8152fd5b6064858784865192632dcbf6b960e11b84526004840152336024840152166044820152fd5b508386831614156154f9565b506157128161574b565b156154d0565b60248260405190634a5541ef60e01b82526004820152fd5b9190916001600160801b0380809416911601918211611c8a57565b60009080825260056020526001600160a01b038060408420541692833314938415615790575b5050821561577e57505090565b90915061578b3392612d83565b161490565b60ff9294509060409181526008602052818120338252602052205416913880615771565b9092916157bf61339e565b936001600160801b03928381169182156158cb5767016345785d8a00008082116158945780851161585d5750615809856157fa819386613b4b565b16946020890195865284613b4b565b169184615820604089019480865282875116615730565b161015615847576158398491826158429551169061345f565b9151169061345f565b168252565b634e487b7160e01b600052600160045260246000fd5b84604491604051917f4fea5c1a00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b60449250604051917f47152d6700000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b505050505090506040516158de81612c3b565b6000815260006020820152600060408201529056fef8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7a164736f6c6343000815000a"; + hex"60c0346200046e57601f62005d1238819003918201601f19168301916001600160401b038311848410176200032b578084926080946040528339810103126200046e5780516001600160a01b038082169290918390036200046e5760208101518281168091036200046e5760408201519183831683036200046e5760600151936200008962000473565b90601d82527f5361626c696572205632204c6f636b75702044796e616d6963204e46540000006020830152620000be62000473565b601181527029a0a116ab1916a627a1a5aaa816a22ca760791b602082015230608052600080546001600160a01b03199081168417825560018054909116909517909455927fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a38051906001600160401b0382116200032b5760035490600182811c9216801562000463575b60208310146200044d5781601f849311620003d8575b50602090601f83116001146200034d5760009262000341575b50508160011b916000199060031b1c1916176003555b80516001600160401b0381116200032b576004918254600181811c9116801562000320575b60208210146200030b579081601f849311620002b3575b50602090601f831160011462000248576000926200023c575b50508160011b916000199060031b1c19161790555b1660018060a01b0319600a541617600a5560a052600160095560405161587e908162000494823960805181615307015260a05181818161126b01526148670152f35b015190503880620001e5565b6000858152602081209350601f198516905b8181106200029a575090846001959493921062000280575b505050811b019055620001fa565b015160001960f88460031b161c1916905538808062000272565b929360206001819287860151815501950193016200025a565b909150836000526020600020601f840160051c8101916020851062000300575b90601f859493920160051c01905b818110620002f05750620001cc565b60008155849350600101620002e1565b9091508190620002d3565b602284634e487b7160e01b6000525260246000fd5b90607f1690620001b5565b634e487b7160e01b600052604160045260246000fd5b0151905038806200017a565b600360009081527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b9350601f198516905b818110620003bf5750908460019594939210620003a5575b505050811b0160035562000190565b015160001960f88460031b161c1916905538808062000396565b929360206001819287860151815501950193016200037e565b60036000529091507fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f840160051c8101916020851062000442575b90601f859493920160051c01905b81811062000432575062000161565b6000815584935060010162000423565b909150819062000415565b634e487b7160e01b600052602260045260246000fd5b91607f16916200014b565b600080fd5b60408051919082016001600160401b038111838210176200032b5760405256fe608080604052600436101561001357600080fd5b60003560e01c90816301ffc9a71461296b5750806306fdde03146128a8578063081812fc1461288a578063095ea7b3146126f65780631400ecec1461265157806316844456146123d65780631c1cdd4c146123705780631e99d5691461235257806323b872dd1461232957806339a73c03146122e657806340e58ee51461208e578063425d30dd1461207057806342842e0e1461202057806342966c6814611ea25780634857501f14611e2c5780634869e12d14611df05780635fe3b56714611dc95780636352211e14611d9a5780636d0cee7514611d4257806370a0823114611c9857806375829def14611c065780637cad6cd114611b345780637de6b1db1461195f5780638659c2701461164d578063894e9a0d146113e05780638bad38dd146113645780638f69b993146112e15780639067b6771461128e5780639188ec841461125357806395d89b4114611145578063a22cb46514611074578063a2ffb89714610f7b578063a6202bf214610e7b578063a80fc07114610e26578063ad35efd414610dc3578063b256456914610da5578063b637b86514610d45578063b88d4fde14610cba578063b8a3be6614610c83578063b971302a14610c31578063bc063e1a14610c0e578063bc2be1be14610bbb578063c156a11d14610acd578063c33cd35e146109b8578063c87b56dd14610885578063cc364f48146107eb578063d4dbd20b14610796578063d511609f14610747578063d975dfed146106fa578063e985e9c5146106a3578063ea5ead1914610652578063eac8f5b8146105e6578063f590c176146105be578063f851a440146105975763fdd46d601461027c57600080fd5b3461048057606036600319011261048057600435610298612a98565b604435916001600160801b039182841693848103610480576102b86152fd565b6102c183613386565b61057f576102e583600052600b6020526001600160a01b0360406000205416331490565b9182158061056f575b6105505783600052602094600586526001600160a01b039081604060002054169480610544575b61051e5781831693841561050d5788156104f557610332876153bf565b8281168a116104c1575091889161038e6103626103cb958a600052600b8c5260026040600020015460801c61568e565b89600052600b8b52600260406000200190836001600160801b031983549260801b16911617815561331b565b906103aa818b84015116928260408183511692015116906133bd565b16111561048f575b86600052600b8852600160406000200154169283615359565b81847f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d876040518a8152a48133141580610485575b61041f575b6000805160206158528339815191528484604051908152a1005b813b15610480576000805160206158528339815191529460846000928360405195869485936313375c3b60e01b8552896004860152336024860152604485015260648401525af1610471575b80610405565b61047a90612c0b565b3861046b565b600080fd5b50813b1515610400565b86600052600b8852604060002060018101600160a01b60ff60a01b1982541617905560ff60f01b1981541690556103b2565b60405163287ecaef60e21b8152600481018990526001600160801b03928316602482015291166044820152606490fd5b0390fd5b6024876040519063d2aabcd960e01b82526004820152fd5b600460405163630d074f60e11b8152fd5b606486838560405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b50848284161415610315565b60405163216caf0d60e01b815260048101859052336024820152604490fd5b50610579846156a9565b156102ee565b60248360405190634a5541ef60e01b82526004820152fd5b346104805760003660031901126104805760206001600160a01b0360005416604051908152f35b346104805760203660031901126104805760206105dc6004356133d6565b6040519015158152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260206001600160a01b0360016040600020015416604051908152f35b6024906040519062b8e7e760e51b82526004820152fd5b3461048057604036600319011261048057600080516020615852833981519152602060043561069a610682612a98565b61068b836153bf565b906106946152fd565b836153f7565b604051908152a1005b34610480576040366003190112610480576106bc612a82565b6106c4612a98565b906001600160a01b03809116600052600860205260406000209116600052602052602060ff604060002054166040519015158152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b576107366020916153bf565b6001600160801b0360405191168152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b602052602060026040600020015460801c604051908152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260206001600160801b0360036040600020015416604051908152f35b34610480576020366003190112610480576004356000602060405161080f81612bd2565b828152015280600052600b60205260ff60016040600020015460a81c161561063b57600052600b6020526040806000205464ffffffffff82519161085283612bd2565b818160a01c16835260c81c166020820152610883825180926020908164ffffffffff91828151168552015116910152565bf35b346104805760208060031936011261048057600435906108c36108be8360005260056020526001600160a01b0360406000205416151590565b612c71565b60006001600160a01b03600a5416926044604051809581937fe9dc637500000000000000000000000000000000000000000000000000000000835230600484015260248301525afa9182156109ac57600092610933575b5061092f604051928284938452830190612a5d565b0390f35b9091503d806000833e6109468183612c1f565b81019082818303126104805780519067ffffffffffffffff8211610480570181601f8201121561048057805161097b81612c41565b926109896040519485612c1f565b818452848284010111610480576109a591848085019101612a3a565b908261091a565b6040513d6000823e3d90fd5b3461048057600319602036820112610480576004359067ffffffffffffffff9081831161048057610140908336030112610480576109f46152fd565b60405191610a0183612bb5565b610a0d81600401612aae565b8352610a1b60248201613407565b6020840152610a2c60448201612b8c565b6040840152610a3d60648201612b8c565b6060840152610a4e60848201612aae565b6080840152610a5f60a48201612c5d565b60a0840152610a7060c48201612aae565b60c0840152610a823660e483016134ed565b60e084015261012481013591821161048057013660238201121561048057602091610aba610ac5923690602460048201359101613419565b6101008201526147b9565b604051908152f35b3461048057604036600319011261048057600435610ae9612a98565b610af16152fd565b81600052600b60205260ff60016040600020015460a81c1615610ba4578160005260056020526001600160a01b0360406000205416803303610b85579161069a8160209360008051602061585283398151915295610b4e836153bf565b6001600160801b038116610b63575b50612f04565b610b7690610b6f6152fd565b82856153f7565b8686604051858152a187610b5d565b60405163216caf0d60e01b815260048101849052336024820152604490fd5b6024826040519062b8e7e760e51b82526004820152fd5b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b602052602064ffffffffff60406000205460a01c16604051908152f35b3461048057600036600319011261048057602060405167016345785d8a00008152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260206001600160a01b0360406000205416604051908152f35b3461048057602036600319011261048057600435600052600b602052602060ff60016040600020015460a81c166040519015158152f35b3461048057608036600319011261048057610cd3612a82565b610cdb612a98565b6064359167ffffffffffffffff8311610480573660238401121561048057826004013591610d0883612c41565b92610d166040519485612c1f565b8084523660248287010111610480576020816000926024610d439801838801378501015260443591612d8f565b005b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205261092f610d91600460406000200161326e565b604051918291602083526020830190612b28565b346104805760203660031901126104805760206105dc60043561334f565b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57610dfd906146bd565b6040516005821015610e10576020918152f35b634e487b7160e01b600052602160045260246000fd5b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260206001600160801b0360026040600020015416604051908152f35b3461048057602036600319011261048057610e94612a82565b6001600160a01b038060005416338103610f5257508116908160005260026020526001600160801b0360406000205416908115610f215781610ef39184600052600260205260406000206001600160801b031981541690553390615359565b6040519081527fca7a4a65a94ed2f37538814e00e1cd4c41a78261561e3f3794592f11409cf5af60203392a3005b602483604051907f8410168c0000000000000000000000000000000000000000000000000000000082526004820152fd5b6040516331b339a960e21b81526001600160a01b03919091166004820152336024820152604490fd5b346104805760603660031901126104805767ffffffffffffffff60043581811161048057610fad903690600401612af7565b610fb5612a98565b9260443590811161048057610fce903690600401612af7565b9190610fd86152fd565b82820361103d5760005b828110610feb57005b80600080516020615852833981519152602061100a600194878a6153e7565b3561103061102161101c868b8a6153e7565b6134d9565b6110296152fd565b8b836153f7565b604051908152a101610fe2565b50604491604051917faec9344000000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b346104805760403660031901126104805761108d612a82565b60243590811515809203610480576001600160a01b03169081331461110157336000526008602052604060002082600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a3005b606460405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152fd5b3461048057600036600319011261048057604051600060045490600182811c91818416918215611249575b60209485851084146112335785879486865291826000146112135750506001146111b6575b506111a292500383612c1f565b61092f604051928284938452830190612a5d565b84915060046000527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b906000915b8583106111fb5750506111a2935082010185611195565b805483890185015287945086939092019181016111e4565b60ff1916858201526111a295151560051b85010192508791506111959050565b634e487b7160e01b600052602260045260246000fd5b92607f1692611170565b346104805760003660031901126104805760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b602052602064ffffffffff60406000205460c81c16604051908152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b5761131b906146bd565b600581101580610e105760028214908115611357575b8115611345575b6020826040519015158152f35b9050610e105760046020911482611338565b5050600381146000611331565b34610480576020366003190112610480576004356001600160a01b0390818116809103610480578160005416338103610f52575060015491816001600160a01b03198416176001556040519216825260208201527fdcb09aef4bf01068924ccce937981cbe59d25ba08380cf941aaaea4e4bd3960d60403392a2005b3461048057602036600319011261048057606061014060405161140281612bee565b60008152600060208201526000604082015260008382015260006080820152600060a0820152600060c0820152600060e082015260006101008201526114466132fc565b6101208201520152600435600052600b60205260ff60016040600020015460a81c161561163557600435600052600b602052604060002061152960046040519261148f84612bee565b80546001600160a01b038116855264ffffffffff8160a01c16602086015264ffffffffff8160c81c16604086015260ff8160f01c161515606086015260f81c1515608085015260ff60018201546001600160a01b03811660a0870152818160a01c16151560c0870152818160a81c16151560e087015260b01c16151561010085015261151d6002820161331b565b6101208501520161326e565b61014082015261153a6004356146bd565b906005821015610e105760026101409214611629575b61092f604051928392602084526001600160a01b03815116602085015264ffffffffff602082015116604085015264ffffffffff60408201511660608501526060810151151560808501526080810151151560a08501526001600160a01b0360a08201511660c085015260c0810151151560e085015260e08101511515610100850152610100810151151561012085015261161561012082015183860190604090816001600160801b0391828151168552826020820151166020860152015116910152565b01516101a0808401526101c0830190612b28565b60006060820152611550565b602460405162b8e7e760e51b81526004356004820152fd5b34610480576020806003193601126104805760043567ffffffffffffffff81116104805761167f903690600401612af7565b906116886152fd565b6000915b80831061169557005b6116a08382846153e7565b35926116aa6152fd565b6116b384613386565b156116d05760248460405190634a5541ef60e01b82526004820152fd5b6116dc849293946133d6565b6119475761170082600052600b6020526001600160a01b0360406000205416331490565b156119285761170e8261351c565b82600052600b92838752611728600260406000200161331b565b936001600160801b0392838651168482161015611910578260005281895260ff60406000205460f01c16156118f8579061177782858b61176d819796838c51166133bd565b99015116906133bd565b9082600052808452604060002090815497600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8a1617835560038785169384156118de575b0196811696876001600160801b03198254161790556001600160a01b038099169160058752827f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa508b604060002054169687938a5260019c8d60406000200154169461182a8c8588615359565b604080518b81526001600160801b0392831660208201529290911690820152606090a4823b611877575b5050506000805160206158528339815191529250604051908152a101919061168c565b90918094503b1561048057600080516020615852833981519152946084600092838d9760405196879586946372eba20360e01b86528a60048701526024860152604485015260648401525af16118cf575b8080611854565b6118d890612c0b565b886118c8565b60018101600160a01b60ff60a01b198254161790556117be565b602483604051906339c6dc7360e21b82526004820152fd5b602483604051906322cad1af60e11b82526004820152fd5b60405163216caf0d60e01b815260048101839052336024820152604490fd5b6024826040519063fe19f19f60e01b82526004820152fd5b3461048057602080600319360112610480576004359061197d6152fd565b81600052600b815260ff60016040600020015460a81c1615610ba4576119a2826146bd565b6005811015610e1057600481036119cb5760248360405190634a5541ef60e01b82526004820152fd5b600381036119eb576024836040519063fe19f19f60e01b82526004820152fd5b600214611b1c57611a1282600052600b6020526001600160a01b0360406000205416331490565b156119285781600052600b815260ff60406000205460f01c1615611b045781600052600b8152604060002060ff60f01b19815416905560405191807f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f600080a2600582526001600160a01b036040600020541692833b611aa7575b6000805160206158528339815191528383604051908152a1005b833b156104805760008160248183600080516020615852833981519152987f341a0bd90000000000000000000000000000000000000000000000000000000083528760048401525af115611a8d57611afe90612c0b565b83611a8d565b602482604051906339c6dc7360e21b82526004820152fd5b602482604051906322cad1af60e11b82526004820152fd5b34610480576020366003190112610480576004356001600160a01b0390818116809103610480578160005416338103610f525750600a5491816001600160a01b0319841617600a556040519216825260208201527fa2548bd4b805e907c1558a47b5858324fe8bb4a2e1ddfca647eecbf65610eebc60403392a26009546000198101908111611bf05760407f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c91815190600182526020820152a1005b634e487b7160e01b600052601160045260246000fd5b3461048057602036600319011261048057611c1f612a82565b6000546001600160a01b0380821692338403611c71576001600160a01b03199350169182911617600055337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf80600080a3005b6040516331b339a960e21b81526001600160a01b0385166004820152336024820152604490fd5b34610480576020366003190112610480576001600160a01b03611cb9612a82565b168015611cd85760005260066020526020604060002054604051908152f35b608460405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e657200000000000000000000000000000000000000000000006064820152fd5b3461048057602036600319011261048057600435611d796108be8260005260056020526001600160a01b0360406000205416151590565b600052600560205260206001600160a01b0360406000205416604051908152f35b34610480576020366003190112610480576020611db8600435612cbc565b6001600160a01b0360405191168152f35b346104805760003660031901126104805760206001600160a01b0360015416604051908152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b5761073660209161473e565b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b576000611e68826146bd565b6005811015610e1057600203611e86575b6020906040519015158152f35b50600052600b602052602060ff60406000205460f01c16611e79565b3461048057602036600319011261048057600435611ebe6152fd565b611ec781613386565b15611fef57611ed5816156a9565b15611fcf57611ee381612cbc565b611eec8261334f565b159081611fc6575b81611fb3575b50611f9b57602081611f1a60008051602061585283398151915293612cbc565b9080600052600783526001600160a01b036040600020926001600160a01b031993848154169055169182600052600684526040600020600019815401905581600052600584526040600020908154169055806000604051937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a48152a1005b602490604051906378630aa960e01b82526004820152fd5b6001600160a01b03915016151582611efa565b60009150611ef4565b60405163216caf0d60e01b81526004810191909152336024820152604490fd5b602490604051907f817cd6390000000000000000000000000000000000000000000000000000000082526004820152fd5b346104805761202e36612ac2565b60405191602083019383851067ffffffffffffffff86111761205a57610d439460405260008452612d8f565b634e487b7160e01b600052604160045260246000fd5b346104805760203660031901126104805760206105dc600435613386565b346104805760208060031936011261048057600435906120ac6152fd565b6120b582613386565b156120d25760248260405190634a5541ef60e01b82526004820152fd5b6120db826133d6565b611947576120ff82600052600b6020526001600160a01b0360406000205416331490565b156119285761210d8261351c565b9180600052600b8252612126600260406000200161331b565b926001600160801b03908185511682821610156119105782600052600b845260ff60406000205460f01c16156118f85780828561216961217394838a51166133bd565b97015116906133bd565b9382600052600b8452604060002091825491600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841617845560038288169485156122cc575b0191811691826001600160801b03198254161790556001600160a01b038093169260058752837f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa508260406000205416998a93600b8b526001604060002001541694612227878588615359565b604080518b81526001600160801b0392831660208201529290911690820152606090a4853b61226b575b6000805160206158528339815191528585604051908152a1005b853b15610480576084600092836000805160206158528339815191529860405196879586946372eba20360e01b86528a60048701526024860152604485015260648401525af16122bd575b8080612251565b6122c690612c0b565b836122b6565b60018101600160a01b60ff60a01b198254161790556121bb565b34610480576020366003190112610480576001600160a01b03612307612a82565b16600052600260205260206001600160801b0360406000205416604051908152f35b3461048057610d4361233a36612ac2565b9161234d6123488433612e25565b612d1e565b612f04565b34610480576000366003190112610480576020600954604051908152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b576123aa906146bd565b6005811015610e105780602091159081156123cb575b506040519015158152f35b6001915014826123c0565b346104805760206003198181360112610480576004359067ffffffffffffffff908183116104805761012083360391820112610480576124146152fd565b61010483013590602219018112156104805782016004810135908282116104805760240160608202360381136104805761244f913691613419565b9182519061245c82613256565b9161246a6040519384612c1f565b808352601f1961247982613256565b018660005b82811061263b5750505064ffffffffff90814216946001600160801b0396876124a682613587565b515116828a6124b484613587565b51015116858060406124c586613587565b510151168a011690604051926124da84612b99565b83528b83015260408201526124ee87613587565b526124f886613587565b5060019386855b8a8c8783106125ba57908b846001600160a01b038c60a48101358281169081900361048057610ac59561257a956125aa9461253c602486016134b8565b612548604487016134b8565b612554606488016134c5565b91612561886004016134c5565b948461256f60848b016134d9565b966040519d8e612bb5565b168c528d8c0152151560408b0152151560608a01521660808801521660a086015260c085015260c43691016134ed565b60e08301526101008201526147b9565b8893858060406125ee8b866125de8a8e9a6125d5828d6135aa565b5151169a6135aa565b51015116946000198901906135aa565b510151168160406125ff888c6135aa565b510151160116916040519361261385612b99565b84528301526040820152612627828b6135aa565b52612632818a6135aa565b500187906124ff565b6126436132fc565b82828801015201879061247e565b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b5760209060009080600052600b8352604060002060ff815460f01c16806126e4575b6126bb575b50506001600160801b0360405191168152f35b6126dd92506001600160801b0360026126d7920154169161351c565b906133bd565b82806126a8565b5060ff600182015460a01c16156126a3565b346104805760403660031901126104805761270f612a82565b602435906001600160a01b03808061272685612cbc565b16921691808314612820578033149081156127fb575b5015612791578260005260076020526040600020826001600160a01b031982541617905561276983612cbc565b167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b608460405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152fd5b9050600052600860205260406000203360005260205260ff604060002054168461273c565b608460405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152fd5b34610480576020366003190112610480576020611db8600435612ce1565b3461048057600036600319011261048057604051600060035490600182811c91818416918215612961575b602094858510841461123357858794868652918260001461121357505060011461290457506111a292500383612c1f565b84915060036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b906000915b8583106129495750506111a2935082010185611195565b80548389018501528794508693909201918101612932565b92607f16926128d3565b3461048057602036600319011261048057600435907fffffffff00000000000000000000000000000000000000000000000000000000821680920361048057817f80ac58cd0000000000000000000000000000000000000000000000000000000060209314908115612a10575b81156129e6575b5015158152f35b7f01ffc9a700000000000000000000000000000000000000000000000000000000915014836129df565b7f5b5e139f00000000000000000000000000000000000000000000000000000000811491506129d8565b60005b838110612a4d5750506000910152565b8181015183820152602001612a3d565b90602091612a7681518092818552858086019101612a3a565b601f01601f1916010190565b600435906001600160a01b038216820361048057565b602435906001600160a01b038216820361048057565b35906001600160a01b038216820361048057565b6060906003190112610480576001600160a01b0390600435828116810361048057916024359081168103610480579060443590565b9181601f840112156104805782359167ffffffffffffffff8311610480576020808501948460051b01011161048057565b90815180825260208080930193019160005b828110612b48575050505090565b835180516001600160801b031686528083015167ffffffffffffffff168684015260409081015164ffffffffff169086015260609094019392810192600101612b3a565b3590811515820361048057565b6060810190811067ffffffffffffffff82111761205a57604052565b610120810190811067ffffffffffffffff82111761205a57604052565b6040810190811067ffffffffffffffff82111761205a57604052565b610160810190811067ffffffffffffffff82111761205a57604052565b67ffffffffffffffff811161205a57604052565b90601f8019910116810190811067ffffffffffffffff82111761205a57604052565b67ffffffffffffffff811161205a57601f01601f191660200190565b35906001600160801b038216820361048057565b15612c7857565b606460405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152fd5b60005260056020526001600160a01b0360406000205416612cde811515612c71565b90565b612d046108be8260005260056020526001600160a01b0360406000205416151590565b60005260076020526001600160a01b036040600020541690565b15612d2557565b608460405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f766564000000000000000000000000000000000000006064820152fd5b90612db3939291612da36123488433612e25565b612dae838383612f04565b6130bd565b15612dba57565b60405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b906001600160a01b038080612e3984612cbc565b16931691838314938415612e6c575b508315612e56575b50505090565b612e6291929350612ce1565b1614388080612e50565b909350600052600860205260406000208260005260205260ff604060002054169238612e48565b15612e9a57565b608460405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152fd5b90612f2d9291612f1383612cbc565b916001600160a01b03948593848094169687911614612e93565b169081158061302457612f3f8461334f565b15908161301b575b5080613012575b612ffa5791808492612f7c60008051602061585283398151915296602096612f7585612cbc565b1614612e93565b60009382855260078652604085206001600160a01b031990818154169055818652600687526040862060001981540190558286526040862060018154019055838652600587528260408720918254161790557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6040519580a48152a1565b602483604051906378630aa960e01b82526004820152fd5b50831515612f4e565b90501538612f47565b608460405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152fd5b3d156130b8573d9061309e82612c41565b916130ac6040519384612c1f565b82523d6000602084013e565b606090565b9290803b1561324d57613127916020916001600160a01b0394604051809581948293897f150b7a02000000000000000000000000000000000000000000000000000000009b8c86523360048701521660248501526044840152608060648401526084830190612a5d565b03916000968791165af1908290826131e6575b50506131c05761314861308d565b805190816131bb5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000161490565b909192506020813d8211613245575b8161320260209383612c1f565b810103126132415751907fffffffff000000000000000000000000000000000000000000000000000000008216820361323e575090388061313a565b80fd5b5080fd5b3d91506131f5565b50505050600190565b67ffffffffffffffff811161205a5760051b60200190565b90815461327a81613256565b9260409361328a85519182612c1f565b828152809460208092019260005281600020906000935b8585106132b057505050505050565b600184819284516132c081612b99565b64ffffffffff87546001600160801b038116835267ffffffffffffffff8160801c168584015260c01c16868201528152019301940193916132a1565b6040519061330982612b99565b60006040838281528260208201520152565b9060405161332881612b99565b6040819360018154916001600160801b0392838116865260801c6020860152015416910152565b80600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260ff60016040600020015460b01c1690565b80600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260ff60016040600020015460a01c1690565b6001600160801b039182169082160391908211611bf057565b80600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260406000205460f81c90565b359064ffffffffff8216820361048057565b92919261342582613256565b60409461343486519283612c1f565b8195848352602080930191606080960285019481861161048057925b8584106134605750505050505050565b86848303126104805782519061347582612b99565b61347e85612c5d565b8252858501359067ffffffffffffffff8216820361048057828792838b9501526134a9868801613407565b86820152815201930192613450565b3580151581036104805790565b356001600160a01b03811681036104805790565b356001600160801b03811681036104805790565b91908260409103126104805760405161350581612bd2565b602080829461351381612aae565b84520135910152565b64ffffffffff80421682600052600b602052604060002091825482828260a01c16101561357d5760c81c16111561356b57600401546001101561356257612cde906135be565b612cde906145ee565b6001600160801b039150600201541690565b5050505050600090565b8051156135945760200190565b634e487b7160e01b600052603260045260246000fd5b80518210156135945760209160051b010190565b64ffffffffff90814216906000908152600b6020526040908181208251936135e585612bee565b8154956001600160a01b039182881687526020870197828160a01c168952828160c81c168789015260ff8160f01c161515606089015260f81c1515608088015260ff6001938486015490811660a08a0152818160a01c16151560c08a0152818160a81c16151560e08a015260b01c16151561010088015261014061367f60046136706002880161331b565b966101208b019788520161326e565b9701918783528087613691889a613587565b5101511693828288965b161061377557509161372561372a9284888161372f98976001600160801b039e8f6136c78b8a516135aa565b5151169d8a8f9b60206136e467ffffffffffffffff928d516135aa565b510151169984836136f68484516135aa565b510151169650811561376957613714929350519060001901906135aa565b5101511680925b03169203166137e9565b613b58565b6139bb565b92831361374857505061374283916137ad565b16011690565b5160200151929392831692841683101591506137649050575090565b905090565b5050505116809261371b565b8094986001600160801b03908161378d8c88516135aa565b51511601169801938282808a6137a48989516135aa565b5101511661369b565b600081126137b85790565b602490604051907f2463f3d50000000000000000000000000000000000000000000000000000000082526004820152fd5b90600160ff1b8083149081156138d1575b506138a757600082121561389e57613823826000035b60008312156138975782600003906138db565b917f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311613861576000916000199118131561385d575090565b0390565b604491604051917fd49c26b300000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b82906138db565b61382382613810565b60046040517f9fe2b450000000000000000000000000000000000000000000000000000000008152fd5b90508114386137fa565b670de0b6b3a7640000916000198383099280830292838086109503948086039514613997578285101561395b57908291096001821901821680920460028082600302188083028203028083028203028083028203028083028203028083028203028092029003029360018380600003040190848311900302920304170290565b82606492604051927f63a05778000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b5050809250156139a5570490565b634e487b7160e01b600052601260045260246000fd5b90600160ff1b808314908115613a9f575b50613a75576000821215613a6c576139f5826000035b6000831215613a65578260000390613aa9565b917f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311613a2f576000916000199118131561385d575090565b604491604051917f120b5b4300000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b8290613aa9565b6139f5826139e2565b60046040517fa6070c25000000000000000000000000000000000000000000000000000000008152fd5b90508114386139cc565b90919060001983820983820291828083109203918083039214613b4757670de0b6b3a76400009081831015613b1057947faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066994950990828211900360ee1b910360121c170290565b60449086604051917f5173648d00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050670de0b6b3a764000090049150565b80613b725750600090612cde5750670de0b6b3a764000090565b90670de0b6b3a7640000808314613bbf575080613b97575050670de0b6b3a764000090565b670de0b6b3a76400008114613bbb57613bb69061372a612cde93614499565b613bdf565b5090565b91505090565b80156139a5576ec097ce7bc90715b34b9f10000000000590565b6000811215613c145768033dd1780914b97114198112613c0e57613c0590600003613bdf565b612cde90613bc5565b50600090565b680a688906bd8affffff811361446857670de0b6b3a764000080604092831b05907780000000000000000000000000000000000000000000000067ff00000000000000831661434b575b66ff0000000000008316614243575b65ff00000000008316614143575b64ff00000000831661404b575b63ff0000008316613f5b575b62ff00008316613e73575b61ff008316613d93575b60ff8316613cbc575b02911c60bf031c90565b60808316613d81575b838316613d6f575b60208316613d5d575b60108316613d4b575b60088316613d39575b60048316613d27575b60028316613d15575b6001831615613cb2576801000000000000000102831c613cb2565b6801000000000000000102831c613cfa565b6801000000000000000302831c613cf1565b6801000000000000000602831c613ce8565b6801000000000000000b02831c613cdf565b6801000000000000001602831c613cd6565b6801000000000000002c02831c613ccd565b6801000000000000005902831c613cc5565b6180008316613e61575b6140008316613e4f575b6120008316613e3d575b6110008316613e2b575b6108008316613e19575b6104008316613e07575b6102008316613df5575b610100831615613ca957680100000000000000b102831c613ca9565b6801000000000000016302831c613dd9565b680100000000000002c602831c613dcf565b6801000000000000058c02831c613dc5565b68010000000000000b1702831c613dbb565b6801000000000000162e02831c613db1565b68010000000000002c5d02831c613da7565b680100000000000058b902831c613d9d565b628000008316613f49575b624000008316613f37575b622000008316613f25575b621000008316613f13575b620800008316613f01575b620400008316613eef575b620200008316613edd575b62010000831615613c9f576801000000000000b17202831c613c9f565b680100000000000162e402831c613ec0565b6801000000000002c5c802831c613eb5565b68010000000000058b9102831c613eaa565b680100000000000b172102831c613e9f565b68010000000000162e4302831c613e94565b680100000000002c5c8602831c613e89565b6801000000000058b90c02831c613e7e565b63800000008316614039575b63400000008316614027575b63200000008316614015575b63100000008316614003575b63080000008316613ff1575b63040000008316613fdf575b63020000008316613fcd575b6301000000831615613c945768010000000000b1721802831c613c94565b6801000000000162e43002831c613faf565b68010000000002c5c86002831c613fa3565b680100000000058b90c002831c613f97565b6801000000000b17217f02831c613f8b565b680100000000162e42ff02831c613f7f565b6801000000002c5c85fe02831c613f73565b68010000000058b90bfc02831c613f67565b6480000000008316614131575b644000000000831661411f575b642000000000831661410d575b64100000000083166140fb575b64080000000083166140e9575b64040000000083166140d7575b64020000000083166140c5575b640100000000831615613c8857680100000000b17217f802831c613c88565b68010000000162e42ff102831c6140a6565b680100000002c5c85fe302831c614099565b6801000000058b90bfce02831c61408c565b68010000000b17217fbb02831c61407f565b6801000000162e42fff002831c614072565b68010000002c5c8601cc02831c614065565b680100000058b90c0b4902831c614058565b658000000000008316614231575b65400000000000831661421f575b65200000000000831661420d575b6510000000000083166141fb575b6508000000000083166141e9575b6504000000000083166141d7575b6502000000000083166141c5575b65010000000000831615613c7b576801000000b17218355102831c613c7b565b680100000162e430e5a202831c6141a5565b6801000002c5c863b73f02831c614197565b68010000058b90cf1e6e02831c614189565b680100000b1721bcfc9a02831c61417b565b68010000162e43f4f83102831c61416d565b680100002c5c89d5ec6d02831c61415f565b6801000058b91b5bc9ae02831c614151565b66800000000000008316614339575b66400000000000008316614327575b66200000000000008316614315575b66100000000000008316614303575b660800000000000083166142f1575b660400000000000083166142df575b660200000000000083166142cd575b6601000000000000831615613c6d5768010000b17255775c0402831c613c6d565b6801000162e525ee054702831c6142ac565b68010002c5cc37da949202831c61429d565b680100058ba01fb9f96d02831c61428e565b6801000b175effdc76ba02831c61427f565b680100162f3904051fa102831c614270565b6801002c605e2e8cec5002831c614261565b68010058c86da1c09ea202831c614252565b6780000000000000008316614449575b6740000000000000008316614437575b6720000000000000008316614425575b6710000000000000008316614413575b6708000000000000008316614401575b67040000000000000083166143ef575b67020000000000000083166143dd575b670100000000000000831615613c5e57680100b1afa5abcbed6102831c613c5e565b68010163da9fb33356d802831c6143bb565b680102c9a3e778060ee702831c6143ab565b6801059b0d31585743ae02831c61439b565b68010b5586cf9890f62a02831c61438b565b6801172b83c7d517adce02831c61437b565b6801306fe0a31b7152df02831c61436b565b5077b504f333f9de64848000000000000000000000000000000061435b565b602490604051907f0360d0280000000000000000000000000000000000000000000000000000000082526004820152fd5b806000808313156145bd57670de0b6b3a76400009283811261458657506001925b808305906001600160801b03821160071b91821c9167ffffffffffffffff831160061b92831c63ffffffff811160051b90811c61ffff811160041b90811c60ff811160031b90811c91600f831160021b92831c936001978860038711811b96871c11961717171717171781810294811d9082821461457a57506706f05b59d3b20000905b84821361454e5750505050500290565b808391020590671bc16d674ec8000082121561456d575b831d9061453e565b8091950194831d90614565565b93505093925050020290565b60001993925080156145a9576ec097ce7bc90715b34b9f100000000005916144ba565b602482634e487b7160e01b81526012600452fd5b602483604051907f059b101b0000000000000000000000000000000000000000000000000000000082526004820152fd5b64ffffffffff614623600091838352600b60205280806040852054818160a01c1693849160c81c1603169181421603166137e9565b91808252600b602052600460408320018054156146a95790829167ffffffffffffffff935261467b6020832054828452600b60205261372a6001600160801b03968760026040882001541696879360801c1690613b58565b92831361469157505061468d906137ad565b1690565b60029350604092508152600b60205220015460801c90565b602483634e487b7160e01b81526032600452fd5b80600052600b602052604060002060ff600182015460a01c166000146146e4575050600490565b805460f81c614737575460a01c64ffffffffff164210613c0e576147078161351c565b90600052600b6020526001600160801b03806002604060002001541691161060001461473257600190565b600290565b5050600390565b80600052600b602052614757600260406000200161331b565b81600052600b602052604060002060ff600182015460a01c1660001461478a57506001600160801b039150602001511690565b5460f81c61479c5750612cde9061351c565b612cde91506001600160801b0360408183511692015116906133bd565b906001600160a01b036001541660206001600160a01b0360c0850151166024604051809481937fdcf844a700000000000000000000000000000000000000000000000000000000835260048301525afa80156109ac5760009061506c575b61483a91506001600160801b0360a08501511690602060e0860151015191615712565b6001600160801b0381511661010084015164ffffffffff60208601511682156150425781518015615018577f00000000000000000000000000000000000000000000000000000000000000008111614fe7575064ffffffffff604061489e84613587565b51015116811015614f905750600090819082815184905b808210614efd575050505064ffffffffff421664ffffffffff8216811015614ebd5750506001600160801b0316808203614e865750506009549283600052600b6020526040600020916001600160801b0381511660028401906001600160801b03198254161790556001600160a01b0360c083015116600184015490750100000000000000000000000000000000000000000060408501511515928654927fffffffffffffffffff0000ff000000000000000000000000000000000000000076ff000000000000000000000000000000000000000000006060890151151560b01b16921617171760018601556001600160a01b03845116916101008501519260406149c78551956000198701906135aa565b510151927fff000000000000000000000000000000000000000000000000000000000000007eff0000000000000000000000000000000000000000000000000000000000007dffffffffff0000000000000000000000000000000000000000000000000078ffffffffff000000000000000000000000000000000000000060208b015160a01b169660c81b169460f01b16911617171717845560005b818110614db6575050600185016009556001600160a01b0360c08301511660005260026020526001600160801b0380604060002054168160208401511601166001600160a01b0360c0840151166000526040600020906001600160801b03198254161790556001600160a01b036080830151168015614d7257614b05614aff8760005260056020526001600160a01b0360406000205416151590565b1561521a565b614b0e8661334f565b1580614d69575b80614d61575b614d4957602060008051602061585283398151915291614b54614aff8960005260056020526001600160a01b0360406000205416151590565b806000526006825260406000206001815401905587600052600582526040600020816001600160a01b0319825416179055876040519160007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4878152a1614be46001600160a01b0360c0840151166001600160801b038084511681602086015116011690309033906150a0565b6001600160801b0360408201511680614d1a575b507fef3d668acee46576ad5d407c42ab4d0cde13f3cd70b28f09a0fb9e3bf5bf09cb614cd76001600160a01b03845116926001600160a01b03608086015116946001600160a01b0360c08201511696614d0f614cef60408401511515928c606086015115156001600160a01b0360e061010089015194549864ffffffffff6040519a614c838c612bd2565b818160a01c168c5260c81c1660208b01520151511695604051998a99610160948b523360208c015260408b0190604090816001600160801b0391828151168552826020820151166020860152015116910152565b60a089015260c08801528060e0880152860190612b28565b926101008501906020908164ffffffffff91828151168552015116910152565b6101408301520390a4565b614d43906001600160a01b0360c0850151166001600160a01b0360e086015151169033906150a0565b38614bf8565b602486604051906378630aa960e01b82526004820152fd5b506000614b1b565b50801515614b15565b606460405162461bcd60e51b815260206004820152602060248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152fd5b614dc5816101008601516135aa565b51906004860154916801000000000000000083101561205a57600183018060048901558310156135945760019260048801600052602060002001906001600160801b03815116908254917fffffff00000000000000000000000000000000000000000000000000000000007cffffffffff000000000000000000000000000000000000000000000000604077ffffffffffffffff00000000000000000000000000000000602086015160801b1694015160c01b169316171717905501614a63565b60449250604051917fd90b7e3900000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b6040517f210aec0e00000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b9193509193614f21906001600160801b03614f1885886135aa565b5151169061568e565b9364ffffffffff806040614f3586856135aa565b51015116941680851115614f535750600184930191929190926148b5565b8385606492604051927f7b0bada8000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b64ffffffffff6040614fa184613587565b5101516040517fb4c9e52c00000000000000000000000000000000000000000000000000000000815264ffffffffff938416600482015291169091166024820152604490fd5b602490604051907f4757689b0000000000000000000000000000000000000000000000000000000082526004820152fd5b60046040517f3952c64e000000000000000000000000000000000000000000000000000000008152fd5b60046040517f6095d3bc000000000000000000000000000000000000000000000000000000008152fd5b6020823d602011615098575b8161508560209383612c1f565b8101031261323e575061483a9051614817565b3d9150615078565b9290604051927f23b872dd0000000000000000000000000000000000000000000000000000000060208501526001600160a01b03809216602485015216604483015260648201526064815260a081019181831067ffffffffffffffff84111761205a5761510f92604052615111565b565b6001600160a01b03169061517160405161512a81612bd2565b6020938482527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564858301526000808587829751910182855af161516b61308d565b91615265565b8051918215918483156151f6575b50505090501561518c5750565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b9193818094500103126132415782015190811515820361323e57508038808461517f565b1561522157565b606460405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152fd5b919290156152c65750815115615279575090565b3b156152825790565b606460405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b8251909150156152d95750805190602001fd5b6104f19060405191829162461bcd60e51b8352602060048401526024830190612a5d565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361532f57565b60046040517fa1c0d6e5000000000000000000000000000000000000000000000000000000008152fd5b916001600160a01b03604051927fa9059cbb000000000000000000000000000000000000000000000000000000006020850152166024830152604482015260448152608081019181831067ffffffffffffffff84111761205a5761510f92604052615111565b612cde906153cc8161473e565b90600052600b60205260026040600020015460801c906133bd565b91908110156135945760051b0190565b9061540182613386565b6156765761542582600052600b6020526001600160a01b0360406000205416331490565b91821580615666575b611fcf576000928184526020600581526001600160a01b0393604091858388205416938061565a575b61563557858216958615615625576001600160801b03808a16998a1561560e57615480886153bf565b8281168c116155df5750926155348b89946001898e7f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d978f9a6154d66154ff918c8552600b8b526002868620015460801c61568e565b8b8452600b8a5260028585200190836001600160801b031983549260801b16911617815561331b565b9061551a818a840151169282868183511692015116906133bd565b1611156155b1575b888152600b8752200154169687615359565b85518b8152a481331415806155a7575b615551575b505050505050565b813b156155a3576084929185915196879586946313375c3b60e01b86526004860152336024860152604485015260648401525af1615594575b8080808080615549565b61559d90612c0b565b3861558a565b8480fd5b50813b1515615544565b888152600b8752818120838101600160a01b60ff60a01b1982541617905560ff60f01b198154169055615522565b865163287ecaef60e21b8152600481018a90526001600160801b03928316602482015291166044820152606490fd5b60248887519063d2aabcd960e01b82526004820152fd5b6004845163630d074f60e11b8152fd5b6064858784865192632dcbf6b960e11b84526004840152336024840152166044820152fd5b50838683161415615457565b50615670816156a9565b1561542e565b60248260405190634a5541ef60e01b82526004820152fd5b9190916001600160801b0380809416911601918211611bf057565b60009080825260056020526001600160a01b0380604084205416928333149384156156ee575b505082156156dc57505090565b9091506156e93392612ce1565b161490565b60ff92945090604091815260086020528181203382526020522054169138806156cf565b90929161571d6132fc565b936001600160801b03928381169182156158295767016345785d8a00008082116157f2578085116157bb575061576785615758819386613aa9565b16946020890195865284613aa9565b16918461577e60408901948086528287511661568e565b1610156157a5576157978491826157a0955116906133bd565b915116906133bd565b168252565b634e487b7160e01b600052600160045260246000fd5b84604491604051917f4fea5c1a00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b60449250604051917f47152d6700000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050505050905060405161583c81612b99565b6000815260006020820152600060408201529056fef8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7a164736f6c6343000815000a"; bytes public constant BYTECODE_LOCKUP_LINEAR = - hex"60a034620003e757601f196001600160401b03601f62004c633881900382810185168601919084831187841017620003ec57808792606094604052833981010312620003e75783516001600160a01b03928382169291839003620003e7576020918287015196858816809803620003e75760400151948516809503620003e7576200008962000402565b90601c82527f5361626c696572205632204c6f636b7570204c696e656172204e46540000000084830152620000bd62000402565b601181527029a0a116ab1916a627a1a5aaa816a624a760791b8582015230608052600080546001600160a01b031990811688178255600180548216909b178b5596817fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a38351858111620003d35760039485548c81811c91168015620003c8575b89821014620003b45790818684931162000361575b508890868311600114620002f8578492620002ec575b505060001982871b1c1916908b1b1784555b8151948511620002d8576004958654998b8b811c9b168015620002cd575b828c1014620002ba57848b1162000271575b869798999a50819487116001146200020a57505093620001fe575b505082871b92600019911b1c19161790555b600a541617600a5560095560405161484090816200042382396080518161454a0152f35b015191503880620001c8565b8883528183208c9890969594939116915b8282106200025757505085116200023c575b50505050811b019055620001da565b01519060f884600019921b161c19169055388080806200022d565b8484015187558c989096019593840193908101906200021b565b87835281832085880160051c81019b838910620002af575b860160051c019a8c905b8c8110620002a3575050620001ad565b848155018c9062000293565b909b508b9062000289565b634e487b7160e01b835260228852602483fd5b9a607f169a6200019b565b634e487b7160e01b81526041600452602490fd5b0151905038806200016b565b908c8e9416918886528a862092865b8c82821062000341575050841162000328575b505050811b0184556200017d565b015160001983891b60f8161c191690553880806200031a565b91929395968291958786015181550195019301908f959493929162000307565b9091508684528884208680850160051c8201928b8610620003aa575b918f91869594930160051c01915b8281106200039b57505062000155565b8681558594508f91016200038b565b925081926200037d565b634e487b7160e01b84526022600452602484fd5b90607f169062000140565b634e487b7160e01b82526041600452602482fd5b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620003ec5760405256fe608080604052600436101561001357600080fd5b600090813560e01c90816301ffc9a714612de95750806306fdde0314612d27578063081812fc14612d08578063095ea7b314612b795780631400ecec14612ad95780631c1cdd4c14612a745780631e99d56914612a5657806323b872dd14612a2c57806339a73c03146129eb57806340e58ee51461272b578063425d30dd1461270c57806342842e0e146126bc57806342966c68146125645780634857501f146124da5780634869e12d1461249f5780635fe3b567146124785780636352211e146124485780636d0cee75146123f257806370a082311461234957806375829def146122b6578063780a82c8146122665780637cad6cd1146121955780637de6b1db14611f865780638659c27014611c60578063894e9a0d14611a0c5780638bad38dd1461198f5780638f69b993146118f35780639067b677146118a057806395d89b411461179357806396ce143114611674578063a22cb465146115a3578063a2ffb897146111c8578063a6202bf2146110cb578063a80fc07114611079578063ab167ccc14610f40578063ad35efd414610ede578063b256456914610ebf578063b88d4fde14610e32578063b8a3be6614610dfd578063b971302a14610dae578063bc063e1a14610d8b578063bc2be1be14610d3b578063c156a11d146109af578063c87b56dd14610875578063cc364f48146107c7578063d4dbd20b14610775578063d511609f14610729578063d975dfed146106dd578063e985e9c514610688578063ea5ead1914610662578063eac8f5b8146105f9578063f590c176146105d0578063f851a440146105aa5763fdd46d601461027357600080fd5b346105a75760603660031901126105a75760043561028f612f18565b610297613058565b906102a0614540565b6102a9836136d6565b61058f576102cd83600052600b6020526001600160a01b0360406000205416331490565b9081158061057f575b61056057838552602092600584526001600160a01b0391826040882054169380610554575b61052e57828116928315610504576001600160801b038084169384156104ec5761032489614602565b82811686116104b85750938093926103ca9261038f6103578d9a99988d8c52600b8d52600260408d20015460801c614650565b8c8b52600b8c5261038a600260408d20019182906001600160801b036001600160801b031983549260801b169116179055565b61366b565b906103ab818c840151169282604081835116920151169061370d565b161115610488575b898852600b8952600160408920015416928361459c565b82877f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d88604051868152a4823314158061047e575b610420575b836000805160206148148339815191528688604051908152a180f35b823b1561047a57608484928360405195869485936313375c3b60e01b85528b6004860152336024860152604485015260648401525af1610462575b8080610404565b61046b90612f94565b61047657823861045b565b8280fd5b8380fd5b50823b15156103ff565b898852600b89526040882060018101600160c81b60ff60c81b1982541617905560ff60f01b1981541690556103b3565b60405163287ecaef60e21b8152600481018b90526001600160801b03928316602482015291166044820152606490fd5b0390fd5b6024896040519063d2aabcd960e01b82526004820152fd5b60046040517fc61a0e9e000000000000000000000000000000000000000000000000000000008152fd5b858360649260405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b508383821614156102fb565b60405163216caf0d60e01b815260048101859052336024820152604490fd5b506105898461466b565b156102d6565b60248360405190634a5541ef60e01b82526004820152fd5b80fd5b50346105a757806003193601126105a7576001600160a01b036020915416604051908152f35b50346105a75760203660031901126105a75760206105ef60043561373c565b6040519015158152f35b50346105a75760203660031901126105a757600435808252600b60205260ff600160408420015460d01c161561064b5760016040836001600160a01b039360209552600b855220015416604051908152f35b6024906040519062b8e7e760e51b82526004820152fd5b50346105a75760403660031901126105a75760043561067f612f18565b61029782614602565b50346105a75760403660031901126105a7576106a2612f02565b60406106ac612f18565b926001600160a01b0380931681526008602052209116600052602052602060ff604060002054166040519015158152f35b50346105a75760203660031901126105a75760ff6001604060043593848152600b60205220015460d01c161561064b57610718602091614602565b6001600160801b0360405191168152f35b50346105a75760203660031901126105a757600435808252600b60205260ff600160408420015460d01c161561064b5760408260029260209452600b845220015460801c604051908152f35b50346105a75760203660031901126105a757600435808252600b60205260ff600160408420015460d01c161561064b5760036040836001600160801b039360209552600b855220015416604051908152f35b50346105a75760203660031901126105a7576004356107e461364c565b50808252600b60205260ff600160408420015460d01c161561064b578160409160609352600b60205220600181549164ffffffffff918291015460a01c16906040519261083084612fe2565b818160a01c16845260c81c166020830152604082015261087360405180926040908164ffffffffff91828151168552826020820151166020860152015116910152565bf35b50346105a75760208060031936011261099f576004356108b36108ae8260005260056020526001600160a01b0360406000205416151590565b61306e565b826001600160a01b03600a5416916044604051809481937fe9dc637500000000000000000000000000000000000000000000000000000000835230600484015260248301525afa9283156109a3578093610922575b505061091e604051928284938452830190612edd565b0390f35b909192503d8082843e610935818461301a565b820191838184031261099f5780519067ffffffffffffffff8211610476570182601f8201121561099f5780519161096b8361303c565b93610979604051958661301a565b8385528584840101116105a757509061099791848085019101612eba565b903880610908565b5080fd5b604051903d90823e3d90fd5b50346105a75760403660031901126105a7576004356109cc612f18565b906109d5614540565b808352602090600b825260ff600160408620015460d01c161561064b57808452600582526001600160a01b03928360408620541693843303610d1c57610a1a83614602565b906001600160801b0390818316918215938415610a59575b896000805160206148148339815191528989610a4f818b8f613301565b604051908152a180f35b610a61614540565b610a6a876136d6565b610d0457610a8e87600052600b6020526001600160a01b0360406000205416331490565b94851580610cf4575b610cd557878b52600589528360408c2054169580610ccb575b610ca757891561050457610c8f57610ac787614602565b8281168511610c5f575090610b27610af48b96959493898852600b8b52600260408920015460801c614650565b888752600b8a5261038a600260408920019182906001600160801b036001600160801b031983549260801b169116179055565b90610b43818a840151169282604081835116920151169061370d565b161115610c2f575b858452600b8752600160408520015416610b6682898361459c565b87867f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d89604051868152a48133141580610c25575b610bca575b50505081610a4f91600080516020614814833981519152958686604051858152a195819338610a32565b813b156104765782916084839260405194859384926313375c3b60e01b84528a60048501523360248501528c604485015260648401525af1610c0d575b80610ba0565b610c1690612f94565b610c21578438610c07565b8480fd5b50813b1515610b9b565b858452600b87526040842060018101600160c81b60ff60c81b1982541617905560ff60f01b198154169055610b4b565b60405163287ecaef60e21b8152600481018990526001600160801b03928316602482015291166044820152606490fd5b6024876040519063d2aabcd960e01b82526004820152fd5b6064888b60405191632dcbf6b960e11b835260048301523360248301526044820152fd5b50858a1415610ab0565b60405163216caf0d60e01b815260048101899052336024820152604490fd5b50610cfe8861466b565b15610a97565b60248760405190634a5541ef60e01b82526004820152fd5b60405163216caf0d60e01b815260048101849052336024820152604490fd5b50346105a75760203660031901126105a757600435808252600b60205260ff600160408420015460d01c161561064b5760408264ffffffffff9260209452600b8452205460a01c16604051908152f35b50346105a757806003193601126105a757602060405167016345785d8a00008152f35b50346105a75760203660031901126105a757600435808252600b60205260ff600160408420015460d01c161561064b576040826001600160a01b039260209452600b8452205416604051908152f35b50346105a75760203660031901126105a75760ff600160406020936004358152600b855220015460d01c166040519015158152f35b50346105a75760803660031901126105a757610e4c612f02565b610e54612f18565b906064359067ffffffffffffffff821161047a573660238301121561047a5781600401359284610e838561303c565b93610e91604051958661301a565b858552366024878301011161099f5785610ebc9660246020930183880137850101526044359161318c565b80f35b50346105a75760203660031901126105a75760206105ef60043561369f565b50346105a75760203660031901126105a757600435808252600b60205260ff600160408420015460d01c161561064b57610f17906139b2565b604051906005811015610f2c57602092508152f35b602483634e487b7160e01b81526021600452fd5b50346105a7576101403660031901126105a757610f5b614540565b610f6361364c565b9064ffffffffff80421680845260c43582811681036110745781018216602085015260e4359081831682036110745701166040830152606435916001600160a01b03918284168094036105a757506084358015158091036110745760a435908115158092036110745760243594848616809603611074576004359585871680970361107457604435906001600160801b038216809203611074576040519761100a89612fc5565b8852602088015260408701526060860152608085015260a084015260c0830152604061010319360112611074576040519161104483612ffe565b610104359182168203611074578261106c9260209452610124358482015260e0820152613ab4565b604051908152f35b600080fd5b50346105a75760203660031901126105a757600435808252600b60205260ff600160408420015460d01c161561064b5760026040836001600160801b039360209552600b855220015416604051908152f35b50346105a75760203660031901126105a7576110e5612f02565b6001600160a01b038083541633810361119f575081169081835260026020526001600160801b0360408420541690811561116e578161113f918486526002602052604086206001600160801b03198154169055339061459c565b6040519081527fca7a4a65a94ed2f37538814e00e1cd4c41a78261561e3f3794592f11409cf5af60203392a380f35b602483604051907f8410168c0000000000000000000000000000000000000000000000000000000082526004820152fd5b6040516331b339a960e21b81526001600160a01b03919091166004820152336024820152604490fd5b50346105a75760603660031901126105a75767ffffffffffffffff600435818111610476576111fb903690600401612f63565b90611204612f18565b92604435908111610c215761121d903690600401612f63565b611228949194614540565b80840361156c5791926001600160a01b038216159290865b81811061124b578780f35b61125681838861462a565b359061126381858a61462a565b356001600160801b03811681036110745761127c614540565b611285836136d6565b61058f576112a983600052600b6020526001600160a01b0360406000205416331490565b80158061155c575b61056057838b5260056020526001600160a01b0360408c2054169080611549575b61151c5787610504576001600160801b03821615611504576112f384614602565b6001600160801b0381166001600160801b038416116114d25750908a91848352600b80602052611363600261038a611334868360408a20015460801c614650565b918988528460205260408820019182906001600160801b036001600160801b031983549260801b169116179055565b6001600160801b03611387816020840151169282604081835116920151169061370d565b1611156114a2575b8584526020526001600160a01b036001604085200154166113ba6001600160801b0384168a8361459c565b6040516001600160801b0384168152867f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d60206001600160a01b038d1693a48033141580611498575b61142c575b5050506000805160206148148339815191526020600193604051908152a101611240565b803b15610476576001600160a01b036084898580946001600160801b0360405197889687956313375c3b60e01b87528d60048801523360248801521660448601521660648401525af1611480575b80611408565b61148990612f94565b61149457883861147a565b8880fd5b50803b1515611403565b858452806020526040842060018101600160c81b60ff60c81b1982541617905560ff60f01b19815416905561138f565b60405163287ecaef60e21b8152600481018690526001600160801b038481166024830152919091166044820152606490fd5b6024846040519063d2aabcd960e01b82526004820152fd5b6064846001600160a01b038960405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b50806001600160a01b03881614156112d2565b506115668461466b565b156112b1565b83604491604051917faec9344000000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b50346105a75760403660031901126105a7576115bd612f02565b60243590811515809203611074576001600160a01b0316908133146116305733835260086020526040832082600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a380f35b606460405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152fd5b50346105a7576101603660031901126105a75761168f614540565b6040519061169c82612fc5565b6116a4612f02565b82526116ae612f18565b60208301526116bb613058565b60408301526001600160a01b03906064358281168103611074576060840152608435801515810361107457608084015260a43580151581036110745760a084015260603660c31901126105a7575060405161171581612fe2565b64ffffffffff60c435818116810361107457825260e435818116810361107457602083015261010435908116810361107457604082015260c0830152604061012319360112611074576040519161176b83612ffe565b610124359182168203611074578261106c9260209452610144358482015260e0820152613ab4565b50346105a757806003193601126105a757604051908060045491600183811c92818516948515611896575b602095868610811461188257858852879493929187908215611860575050600114611806575b50506117f29250038361301a565b61091e604051928284938452830190612edd565b90859250600482527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5b8583106118485750506117f2935082010138806117e4565b80548389018501528794508693909201918101611830565b92509350506117f294915060ff191682840152151560051b82010138806117e4565b602483634e487b7160e01b81526022600452fd5b93607f16936117be565b50346105a75760203660031901126105a757600435808252600b60205260ff600160408420015460d01c161561064b57600160408364ffffffffff9360209552600b855220015460a01c16604051908152f35b50346105a75760203660031901126105a757600435808252600b60205260ff600160408420015460d01c161561064b5761192c906139b2565b906005821015908161196d5760028314918215611981575b8215611958575b6020836040519015158152f35b90915061196d5750600460209114388061194b565b80634e487b7160e01b602492526021600452fd5b506003831491506000611944565b50346105a75760203660031901126105a7576004356001600160a01b0390818116809103610476578183541633810361119f575060015491816001600160a01b03198416176001556040519216825260208201527fdcb09aef4bf01068924ccce937981cbe59d25ba08380cf941aaaea4e4bd3960d60403392a280f35b50346105a75760203660031901126105a757604051611a2a81612fa8565b8181528160208201528160408201528160608201528160808201528160a08201528160c08201528160e08201528161010082015281610120820152610140611a7061364c565b9101526004358152600b60205260ff600160408320015460d01c1615611c48576004358152600b60205260408120611b49600260405192611ab084612fa8565b80546001600160a01b038116855264ffffffffff8160a01c16602086015264ffffffffff8160c81c16604086015260ff8160f01c161515606086015260f81c1515608085015260ff60018201546001600160a01b03811660a087015264ffffffffff8160a01c1660c0870152818160c81c16151560e0870152818160d01c16151561010087015260d81c1615156101208501520161366b565b610140820152611b5a6004356139b2565b6005811015610f2c579160026101a09314611c3d575b50610873610140604051926001600160a01b03815116845264ffffffffff602082015116602085015264ffffffffff60408201511660408501526060810151151560608501526080810151151560808501526001600160a01b0360a08201511660a085015264ffffffffff60c08201511660c085015260e0810151151560e0850152610100810151151561010085015261012081015115156101208501520151610140830190604090816001600160801b0391828151168552826020820151166020860152015116910152565b606082015238611b70565b602460405162b8e7e760e51b81526004356004820152fd5b50346105a757602090816003193601126105a75760043567ffffffffffffffff811161099f57611c9583913690600401612f63565b90611c9e614540565b83915b808310611cac578480f35b611cbb8382849795969761462a565b3593611cc5614540565b611cce856136d6565b15611ceb5760248560405190634a5541ef60e01b82526004820152fd5b90919293611cf88161373c565b611f6e57611d1c81600052600b6020526001600160a01b0360406000205416331490565b15611f4e57611d2a8161376d565b90808652600b91828852611d436002604089200161366b565b926001600160801b0391828551168382161015611f3657838952818a5260ff60408a205460f01c1615611f1e579184939189611d9685848e611d8c81998360409e9d511661370d565b990151169061370d565b84825282865288822093898554600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82161787556003838516978815611f04575b01928a1692836001600160801b03198254161790556001600160a01b0391828092169560058b522054169488528d60019b8c912001541694611e1c82858861459c565b843b611e8f575b5050604080518681526001600160801b0398891660208201529190971696810196909652600080516020614814833981519152957f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa5090606090a4604051908152a1019190939293611ca1565b9091929380959697503b15611f00578d9695949392918d91604051916372eba20360e01b835288600484015285602484015260448301526064820152818160848183895af115611e2357611eea919294969893959750612f94565b611efc57949290918b94928b8e611e23565b8a80fd5b8c80fd5b60018101600160c81b60ff60c81b19825416179055611dd9565b602484604051906339c6dc7360e21b82526004820152fd5b602484604051906322cad1af60e11b82526004820152fd5b60405163216caf0d60e01b81526004810191909152336024820152604490fd5b6024906040519063fe19f19f60e01b82526004820152fd5b50346105a75760208060031936011261099f5760043590611fa5614540565b818352600b815260ff600160408520015460d01c161561217e57611fc8826139b2565b600581101561216a5760048103611ff15760248360405190634a5541ef60e01b82526004820152fd5b60038103612011576024836040519063fe19f19f60e01b82526004820152fd5b6002146121525761203882600052600b6020526001600160a01b0360406000205416331490565b1561213357818352600b815260ff604084205460f01c161561211b57818352600b81526040832060ff60f01b19815416905560058152826001600160a01b03604082205416803b6120c4575b505060405160008051602061481483398151915292807f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f8680a28152a180f35b803b1561099f578180916024604051809481937f341a0bd90000000000000000000000000000000000000000000000000000000083528960048401525af1156120845761211090612f94565b610476578238612084565b602482604051906339c6dc7360e21b82526004820152fd5b60405163216caf0d60e01b815260048101839052336024820152604490fd5b602482604051906322cad1af60e11b82526004820152fd5b602484634e487b7160e01b81526021600452fd5b6024826040519062b8e7e760e51b82526004820152fd5b50346105a75760203660031901126105a7576004356001600160a01b0390818116809103610476578183541633810361119f5750600a5491816001600160a01b0319841617600a556040519216825260208201527fa2548bd4b805e907c1558a47b5858324fe8bb4a2e1ddfca647eecbf65610eebc60403392a260095460001981019081116122525760407f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c91815190600182526020820152a180f35b602482634e487b7160e01b81526011600452fd5b50346105a75760203660031901126105a757600435808252600b60205260ff600160408420015460d01c161561064b5760408264ffffffffff9260209452600b8452205460c81c16604051908152f35b50346105a75760203660031901126105a7576122d0612f02565b9080546001600160a01b0380821693338503612322576001600160a01b03199394501691829116178255337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808380a380f35b6040516331b339a960e21b81526001600160a01b0386166004820152336024820152604490fd5b50346105a75760203660031901126105a7576001600160a01b0361236b612f02565b168015612388578160409160209352600683522054604051908152f35b608460405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e657200000000000000000000000000000000000000000000006064820152fd5b50346105a75760203660031901126105a7576001600160a01b0360406020926004356124376108ae8260005260056020526001600160a01b0360406000205416151590565b815260058452205416604051908152f35b50346105a75760203660031901126105a75760206124676004356130b9565b6001600160a01b0360405191168152f35b50346105a757806003193601126105a75760206001600160a01b0360015416604051908152f35b50346105a75760203660031901126105a75760ff6001604060043593848152600b60205220015460d01c161561064b57610718602091613a39565b50346105a75760203660031901126105a75760043590818152600b60205260ff600160408320015460d01c161561217e5780612515836139b2565b92600584101561255057600260209403612536575b50506040519015158152f35b8152600b8352604090205460f01c60ff169050388061252a565b602482634e487b7160e01b81526021600452fd5b50346105a75760203660031901126105a757600435612581614540565b61258a816136d6565b1561268b576125988161466b565b15611f4e576125a6816130b9565b6125af8261369f565b159081612683575b81612670575b50612658576020816125dd600080516020614814833981519152936130b9565b90808552600783526001600160a01b0360408620926001600160a01b03199384815416905516918286526006845260408620600019815401905581865260058452604086209081541690558085604051937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a48152a180f35b602490604051906378630aa960e01b82526004820152fd5b6001600160a01b039150161515386125bd565b8391506125b7565b602490604051907f817cd6390000000000000000000000000000000000000000000000000000000082526004820152fd5b50346105a7576126cb36612f2e565b60405191602083019383851067ffffffffffffffff8611176126f657610ebc9460405285845261318c565b634e487b7160e01b600052604160045260246000fd5b50346105a75760203660031901126105a75760206105ef6004356136d6565b50346105a757602090816003193601126105a7576004359161274b614540565b612754836136d6565b156127715760248360405190634a5541ef60e01b82526004820152fd5b61277a8361373c565b6129d35761279e83600052600b6020526001600160a01b0360406000205416331490565b15610d1c576127ac8361376d565b92808352600b82526127c36002604085200161366b565b936001600160801b03908186511682821610156129bb57828552600b845260ff604086205460f01c16156129a35780828561280461280e94838b511661370d565b980151169061370d565b828552600b84526040852091825491600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84161784556003828216948515612989575b0191881691826001600160801b03198254161790556001600160a01b0380931691600587528360408920541693600b8852600160408a200154169461289982858861459c565b843b612907575b5050604080518681526001600160801b03998a1660208201529190981697810197909752949560008051602061481483398151915295907f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa5090606090a4604051908152a180f35b843b1561149457604051916372eba20360e01b835287600484015284602484015260448301526064820152878160848183885af1612946575b806128a0565b90600080516020614814833981519152976129817f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa5093612f94565b975090612940565b60018101600160c81b60ff60c81b19825416179055612853565b602483604051906339c6dc7360e21b82526004820152fd5b602483604051906322cad1af60e11b82526004820152fd5b6024836040519063fe19f19f60e01b82526004820152fd5b50346105a75760203660031901126105a7576001600160801b0360406020926001600160a01b03612a1a612f02565b16815260028452205416604051908152f35b50346105a757610ebc612a3e36612f2e565b91612a51612a4c8433613222565b61311b565b613301565b50346105a757806003193601126105a7576020600954604051908152f35b50346105a75760203660031901126105a757600435808252600b60205260ff600160408420015460d01c161561064b57612aad906139b2565b90600582101561196d5760208215838115612ace575b506040519015158152f35b600191501482612ac3565b50346105a75760203660031901126105a75760043590818152600b60205260ff600160408320015460d01c161561217e57602091604082828152600b85522060ff815460f01c1680612b67575b612b3e575b50506001600160801b0360405191168152f35b612b6092506001600160801b036002612b5a920154169161376d565b9061370d565b3880612b2b565b5060ff600182015460c81c1615612b26565b50346105a75760403660031901126105a757612b93612f02565b602435906001600160a01b038080612baa856130b9565b16921691808314612c9e57803314908115612c7d575b5015612c1357828452600760205260408420826001600160a01b0319825416179055612beb836130b9565b167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258480a480f35b608460405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152fd5b9050845260086020526040842033855260205260ff60408520541638612bc0565b608460405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152fd5b50346105a75760203660031901126105a75760206124676004356130de565b50346105a757806003193601126105a757604051908060035491600183811c92818516948515612ddf575b602095868610811461188257858852879493929187908215611860575050600114612d855750506117f29250038361301a565b90859250600382527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b858310612dc75750506117f2935082010138806117e4565b80548389018501528794508693909201918101612daf565b93607f1693612d52565b90503461099f57602036600319011261099f576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361047657602092507f80ac58cd000000000000000000000000000000000000000000000000000000008114908115612e90575b8115612e66575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501438612e5f565b7f5b5e139f0000000000000000000000000000000000000000000000000000000081149150612e58565b60005b838110612ecd5750506000910152565b8181015183820152602001612ebd565b90602091612ef681518092818552858086019101612eba565b601f01601f1916010190565b600435906001600160a01b038216820361107457565b602435906001600160a01b038216820361107457565b6060906003190112611074576001600160a01b0390600435828116810361107457916024359081168103611074579060443590565b9181601f840112156110745782359167ffffffffffffffff8311611074576020808501948460051b01011161107457565b67ffffffffffffffff81116126f657604052565b610160810190811067ffffffffffffffff8211176126f657604052565b610100810190811067ffffffffffffffff8211176126f657604052565b6060810190811067ffffffffffffffff8211176126f657604052565b6040810190811067ffffffffffffffff8211176126f657604052565b90601f8019910116810190811067ffffffffffffffff8211176126f657604052565b67ffffffffffffffff81116126f657601f01601f191660200190565b604435906001600160801b038216820361107457565b1561307557565b606460405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152fd5b60005260056020526001600160a01b03604060002054166130db81151561306e565b90565b6131016108ae8260005260056020526001600160a01b0360406000205416151590565b60005260076020526001600160a01b036040600020541690565b1561312257565b608460405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f766564000000000000000000000000000000000000006064820152fd5b906131b09392916131a0612a4c8433613222565b6131ab838383613301565b6134ba565b156131b757565b60405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b906001600160a01b038080613236846130b9565b16931691838314938415613269575b508315613253575b50505090565b61325f919293506130de565b161438808061324d565b909350600052600860205260406000208260005260205260ff604060002054169238613245565b1561329757565b608460405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152fd5b9061332a9291613310836130b9565b916001600160a01b03948593848094169687911614613290565b16908115806134215761333c8461369f565b159081613418575b508061340f575b6133f7579180849261337960008051602061481483398151915296602096613372856130b9565b1614613290565b60009382855260078652604085206001600160a01b031990818154169055818652600687526040862060001981540190558286526040862060018154019055838652600587528260408720918254161790557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6040519580a48152a1565b602483604051906378630aa960e01b82526004820152fd5b5083151561334b565b90501538613344565b608460405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152fd5b3d156134b5573d9061349b8261303c565b916134a9604051938461301a565b82523d6000602084013e565b606090565b9290803b1561364357613524916020916001600160a01b0394604051809581948293897f150b7a02000000000000000000000000000000000000000000000000000000009b8c86523360048701521660248501526044840152608060648401526084830190612edd565b03916000968791165af1908290826135e3575b50506135bd5761354561348a565b805190816135b85760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000161490565b909192506020813d821161363b575b816135ff6020938361301a565b8101031261099f5751907fffffffff00000000000000000000000000000000000000000000000000000000821682036105a75750903880613537565b3d91506135f2565b50505050600190565b6040519061365982612fe2565b60006040838281528260208201520152565b9060405161367881612fe2565b6040819360018154916001600160801b0392838116865260801c6020860152015416910152565b80600052600b60205260ff60016040600020015460d01c161561064b57600052600b60205260ff60016040600020015460d81c1690565b80600052600b60205260ff60016040600020015460d01c161561064b57600052600b60205260ff60016040600020015460c81c1690565b6001600160801b03918216908216039190821161372657565b634e487b7160e01b600052601160045260246000fd5b80600052600b60205260ff60016040600020015460d01c161561064b57600052600b60205260406000205460f81c90565b600090808252600b6020526040822091825464ffffffffff42818360c81c161161381b5780600186015460a01c169182421015613805576137ba9394955060a01c16809103904203613823565b90828152600b6020526001600160801b03926137e0846002604085200154168094613903565b9283116137ed5750501690565b60029350604092508152600b60205220015460801c90565b505050505060026001600160801b039101541690565b505091505090565b670de0b6b3a76400009160001983830992808302928380861095039480860395146138df57828510156138a357908291096001821901821680920460028082600302188083028203028083028203028083028203028083028203028083028203028092029003029360018380600003040190848311900302920304170290565b82606492604051927f63a05778000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b5050809250156138ed570490565b634e487b7160e01b600052601260045260246000fd5b909190600019838209838202918280831092039180830392146139a157670de0b6b3a7640000908183101561396a57947faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066994950990828211900360ee1b910360121c170290565b60449086604051917f5173648d00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050670de0b6b3a764000090049150565b80600052600b602052604060002060ff600182015460c81c166000146139d9575050600490565b805460f81c613a32575460a01c64ffffffffff164210613a2c576139fc8161376d565b90600052600b6020526001600160801b038060026040600020015416911610600014613a2757600190565b600290565b50600090565b5050600390565b80600052600b602052613a52600260406000200161366b565b81600052600b602052604060002060ff600182015460c81c16600014613a8557506001600160801b039150602001511690565b5460f81c613a9757506130db9061376d565b6130db91506001600160801b03604081835116920151169061370d565b906001600160a01b036001541660206001600160a01b036060850151166024604051809481937fdcf844a700000000000000000000000000000000000000000000000000000000835260048301525afa80156142d7576000906142a3575b613b3591506001600160801b0360408501511690602060e08601510151916146d4565b916001600160801b0383511660c082015190156142795764ffffffffff815116602082019064ffffffffff8251169081811161423957505064ffffffffff604091511691019064ffffffffff82511690818110156141f957505064ffffffffff80421691511690818110156141b9575050600954926001600160801b0381511660405190613bc282612fe2565b815260006020820152600060408201526001600160a01b036060840151169060c08401519164ffffffffff6020840151169064ffffffffff604085015116906080870151151560a088015115159364ffffffffff6001600160a01b038a511697511660405197613c3189612fa8565b88526020880152604087015260608601526000608086015260a085015260c0840152600060e0840152600161010084015261012083015261014082015284600052600b60205260406000206001600160a01b038251166001600160a01b0319825416178155613cc864ffffffffff602084015116829064ffffffffff60a01b1964ffffffffff60a01b83549260a01b169116179055565b604082015181547eff0000000000000000000000000000000000000000000000000000000000006060850151151560f01b169078ffffffffffffffffffffffffffffffffffffffffffffffffff7dffffffffff000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000006080880151151560f81b169460c81b1691161717178155600181016001600160a01b0360a0840151166001600160a01b0319825416178155613dbf64ffffffffff60c085015116829064ffffffffff60a01b1964ffffffffff60a01b83549260a01b169116179055565b60e083015181546101008501516101208601517fffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff90921692151560c81b79ff00000000000000000000000000000000000000000000000000169290921791151560d01b7aff0000000000000000000000000000000000000000000000000000169190911790151560d81b7bff00000000000000000000000000000000000000000000000000000016179055610140909101518051602082015160801b6001600160801b03199081166001600160801b03928316176002850155926040906003019201511682825416179055600185016009556001600160a01b0360608401511660005260026020526001600160801b0380604060002054168160208501511601166001600160a01b036060850151166000526040600020918254161790556001600160a01b03602083015116801561417557613f3a613f348660005260056020526001600160a01b0360406000205416151590565b1561445d565b613f438561369f565b158061416c575b80614164575b61414c57602060008051602061481483398151915291613f89613f348860005260056020526001600160a01b0360406000205416151590565b806000526006825260406000206001815401905586600052600582526040600020816001600160a01b0319825416179055866040519160007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4868152a16140196001600160a01b036060840151166001600160801b038084511681602086015116011690309033906142e3565b6001600160801b036040820151168061411d575b506001600160a01b038251167f075861cbceafeb777e8f15f357121b08f6f3adba387d599bb7b5278ca6192df5610160866001600160a01b03602087015116946141146001600160a01b03606089015116976080810151151560a08201511515906140de6001600160a01b0360e060c08601519501515116956040519788523360208901526040880190604090816001600160801b0391828151168552826020820151166020860152015116910152565b60a086015260c0850152805164ffffffffff90811660e08601526020820151811661010086015260409091015116610120840152565b610140820152a4565b614146906001600160a01b036060850151166001600160a01b0360e086015151169033906142e3565b3861402d565b602485604051906378630aa960e01b82526004820152fd5b506000613f50565b50801515613f4a565b606460405162461bcd60e51b815260206004820152602060248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152fd5b6040517f210aec0e00000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b6040517f9fee269100000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b6040517f4c23297000000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b60046040517f6095d3bc000000000000000000000000000000000000000000000000000000008152fd5b6020823d6020116142cf575b816142bc6020938361301a565b810103126105a75750613b359051613b12565b3d91506142af565b6040513d6000823e3d90fd5b9290604051927f23b872dd0000000000000000000000000000000000000000000000000000000060208501526001600160a01b03809216602485015216604483015260648201526064815260a081019181831067ffffffffffffffff8411176126f65761435292604052614354565b565b6001600160a01b0316906143b460405161436d81612ffe565b6020938482527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564858301526000808587829751910182855af16143ae61348a565b916144a8565b805191821591848315614439575b5050509050156143cf5750565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b91938180945001031261099f578201519081151582036105a75750803880846143c2565b1561446457565b606460405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152fd5b9192901561450957508151156144bc575090565b3b156144c55790565b606460405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b82519091501561451c5750805190602001fd5b6104e89060405191829162461bcd60e51b8352602060048401526024830190612edd565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361457257565b60046040517fa1c0d6e5000000000000000000000000000000000000000000000000000000008152fd5b916001600160a01b03604051927fa9059cbb000000000000000000000000000000000000000000000000000000006020850152166024830152604482015260448152608081019181831067ffffffffffffffff8411176126f65761435292604052614354565b6130db9061460f81613a39565b90600052600b60205260026040600020015460801c9061370d565b919081101561463a5760051b0190565b634e487b7160e01b600052603260045260246000fd5b9190916001600160801b038080941691160191821161372657565b60009080825260056020526001600160a01b0380604084205416928333149384156146b0575b5050821561469e57505090565b9091506146ab33926130de565b161490565b60ff9294509060409181526008602052818120338252602052205416913880614691565b9092916146df61364c565b936001600160801b03928381169182156147eb5767016345785d8a00008082116147b45780851161477d57506147298561471a819386613903565b16946020890195865284613903565b169184614740604089019480865282875116614650565b161015614767576147598491826147629551169061370d565b9151169061370d565b168252565b634e487b7160e01b600052600160045260246000fd5b84604491604051917f4fea5c1a00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b60449250604051917f47152d6700000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b505050505090506040516147fe81612fe2565b6000815260006020820152600060408201529056fef8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7a164736f6c6343000815000a"; + hex"60a034620003e757601f196001600160401b03601f62004c403881900382810185168601919084831187841017620003ec57808792606094604052833981010312620003e75783516001600160a01b03928382169291839003620003e7576020918287015196858816809803620003e75760400151948516809503620003e7576200008962000402565b90601c82527f5361626c696572205632204c6f636b7570204c696e656172204e46540000000084830152620000bd62000402565b601181527029a0a116ab1916a627a1a5aaa816a624a760791b8582015230608052600080546001600160a01b031990811688178255600180548216909b178b5596817fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a38351858111620003d35760039485548c81811c91168015620003c8575b89821014620003b45790818684931162000361575b508890868311600114620002f8578492620002ec575b505060001982871b1c1916908b1b1784555b8151948511620002d8576004958654998b8b811c9b168015620002cd575b828c1014620002ba57848b1162000271575b869798999a50819487116001146200020a57505093620001fe575b505082871b92600019911b1c19161790555b600a541617600a5560095560405161481d9081620004238239608051816145270152f35b015191503880620001c8565b8883528183208c9890969594939116915b8282106200025757505085116200023c575b50505050811b019055620001da565b01519060f884600019921b161c19169055388080806200022d565b8484015187558c989096019593840193908101906200021b565b87835281832085880160051c81019b838910620002af575b860160051c019a8c905b8c8110620002a3575050620001ad565b848155018c9062000293565b909b508b9062000289565b634e487b7160e01b835260228852602483fd5b9a607f169a6200019b565b634e487b7160e01b81526041600452602490fd5b0151905038806200016b565b908c8e9416918886528a862092865b8c82821062000341575050841162000328575b505050811b0184556200017d565b015160001983891b60f8161c191690553880806200031a565b91929395968291958786015181550195019301908f959493929162000307565b9091508684528884208680850160051c8201928b8610620003aa575b918f91869594930160051c01915b8281106200039b57505062000155565b8681558594508f91016200038b565b925081926200037d565b634e487b7160e01b84526022600452602484fd5b90607f169062000140565b634e487b7160e01b82526041600452602482fd5b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620003ec5760405256fe608080604052600436101561001357600080fd5b600090813560e01c90816301ffc9a714612dc65750806306fdde0314612d04578063081812fc14612ce5578063095ea7b314612b565780631400ecec14612ab65780631c1cdd4c14612a515780631e99d56914612a3357806323b872dd14612a0957806339a73c03146129c857806340e58ee51461271d578063425d30dd146126fe57806342842e0e146126ae57806342966c68146125365780634857501f146124ac5780634869e12d146124715780635fe3b5671461244a5780636352211e1461241a5780636d0cee75146123c457806370a082311461231b57806375829def14612288578063780a82c8146122385780637cad6cd1146121675780637de6b1db14611f715780638659c27014611c60578063894e9a0d14611a0c5780638bad38dd1461198f5780638f69b993146118f35780639067b677146118a057806395d89b411461179357806396ce143114611674578063a22cb465146115a3578063a2ffb897146111c8578063a6202bf2146110cb578063a80fc07114611079578063ab167ccc14610f40578063ad35efd414610ede578063b256456914610ebf578063b88d4fde14610e32578063b8a3be6614610dfd578063b971302a14610dae578063bc063e1a14610d8b578063bc2be1be14610d3b578063c156a11d146109af578063c87b56dd14610875578063cc364f48146107c7578063d4dbd20b14610775578063d511609f14610729578063d975dfed146106dd578063e985e9c514610688578063ea5ead1914610662578063eac8f5b8146105f9578063f590c176146105d0578063f851a440146105aa5763fdd46d601461027357600080fd5b346105a75760603660031901126105a75760043561028f612ef5565b610297613035565b906102a061451d565b6102a9836136b3565b61058f576102cd83600052600b6020526001600160a01b0360406000205416331490565b9081158061057f575b61056057838552602092600584526001600160a01b0391826040882054169380610554575b61052e57828116928315610504576001600160801b038084169384156104ec57610324896145df565b82811686116104b85750938093926103ca9261038f6103578d9a99988d8c52600b8d52600260408d20015460801c61462d565b8c8b52600b8c5261038a600260408d20019182906001600160801b036001600160801b031983549260801b169116179055565b613648565b906103ab818c84015116928260408183511692015116906136ea565b161115610488575b898852600b89526001604089200154169283614579565b82877f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d88604051868152a4823314158061047e575b610420575b836000805160206147f18339815191528688604051908152a180f35b823b1561047a57608484928360405195869485936313375c3b60e01b85528b6004860152336024860152604485015260648401525af1610462575b8080610404565b61046b90612f71565b61047657823861045b565b8280fd5b8380fd5b50823b15156103ff565b898852600b89526040882060018101600160c81b60ff60c81b1982541617905560ff60f01b1981541690556103b3565b60405163287ecaef60e21b8152600481018b90526001600160801b03928316602482015291166044820152606490fd5b0390fd5b6024896040519063d2aabcd960e01b82526004820152fd5b60046040517fc61a0e9e000000000000000000000000000000000000000000000000000000008152fd5b858360649260405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b508383821614156102fb565b60405163216caf0d60e01b815260048101859052336024820152604490fd5b5061058984614648565b156102d6565b60248360405190634a5541ef60e01b82526004820152fd5b80fd5b50346105a757806003193601126105a7576001600160a01b036020915416604051908152f35b50346105a75760203660031901126105a75760206105ef600435613719565b6040519015158152f35b50346105a75760203660031901126105a757600435808252600b60205260ff600160408420015460d01c161561064b5760016040836001600160a01b039360209552600b855220015416604051908152f35b6024906040519062b8e7e760e51b82526004820152fd5b50346105a75760403660031901126105a75760043561067f612ef5565b610297826145df565b50346105a75760403660031901126105a7576106a2612edf565b60406106ac612ef5565b926001600160a01b0380931681526008602052209116600052602052602060ff604060002054166040519015158152f35b50346105a75760203660031901126105a75760ff6001604060043593848152600b60205220015460d01c161561064b576107186020916145df565b6001600160801b0360405191168152f35b50346105a75760203660031901126105a757600435808252600b60205260ff600160408420015460d01c161561064b5760408260029260209452600b845220015460801c604051908152f35b50346105a75760203660031901126105a757600435808252600b60205260ff600160408420015460d01c161561064b5760036040836001600160801b039360209552600b855220015416604051908152f35b50346105a75760203660031901126105a7576004356107e4613629565b50808252600b60205260ff600160408420015460d01c161561064b578160409160609352600b60205220600181549164ffffffffff918291015460a01c16906040519261083084612fbf565b818160a01c16845260c81c166020830152604082015261087360405180926040908164ffffffffff91828151168552826020820151166020860152015116910152565bf35b50346105a75760208060031936011261099f576004356108b36108ae8260005260056020526001600160a01b0360406000205416151590565b61304b565b826001600160a01b03600a5416916044604051809481937fe9dc637500000000000000000000000000000000000000000000000000000000835230600484015260248301525afa9283156109a3578093610922575b505061091e604051928284938452830190612eba565b0390f35b909192503d8082843e6109358184612ff7565b820191838184031261099f5780519067ffffffffffffffff8211610476570182601f8201121561099f5780519161096b83613019565b936109796040519586612ff7565b8385528584840101116105a757509061099791848085019101612e97565b903880610908565b5080fd5b604051903d90823e3d90fd5b50346105a75760403660031901126105a7576004356109cc612ef5565b906109d561451d565b808352602090600b825260ff600160408620015460d01c161561064b57808452600582526001600160a01b03928360408620541693843303610d1c57610a1a836145df565b906001600160801b0390818316918215938415610a59575b896000805160206147f18339815191528989610a4f818b8f6132de565b604051908152a180f35b610a6161451d565b610a6a876136b3565b610d0457610a8e87600052600b6020526001600160a01b0360406000205416331490565b94851580610cf4575b610cd557878b52600589528360408c2054169580610ccb575b610ca757891561050457610c8f57610ac7876145df565b8281168511610c5f575090610b27610af48b96959493898852600b8b52600260408920015460801c61462d565b888752600b8a5261038a600260408920019182906001600160801b036001600160801b031983549260801b169116179055565b90610b43818a84015116928260408183511692015116906136ea565b161115610c2f575b858452600b8752600160408520015416610b66828983614579565b87867f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d89604051868152a48133141580610c25575b610bca575b50505081610a4f916000805160206147f1833981519152958686604051858152a195819338610a32565b813b156104765782916084839260405194859384926313375c3b60e01b84528a60048501523360248501528c604485015260648401525af1610c0d575b80610ba0565b610c1690612f71565b610c21578438610c07565b8480fd5b50813b1515610b9b565b858452600b87526040842060018101600160c81b60ff60c81b1982541617905560ff60f01b198154169055610b4b565b60405163287ecaef60e21b8152600481018990526001600160801b03928316602482015291166044820152606490fd5b6024876040519063d2aabcd960e01b82526004820152fd5b6064888b60405191632dcbf6b960e11b835260048301523360248301526044820152fd5b50858a1415610ab0565b60405163216caf0d60e01b815260048101899052336024820152604490fd5b50610cfe88614648565b15610a97565b60248760405190634a5541ef60e01b82526004820152fd5b60405163216caf0d60e01b815260048101849052336024820152604490fd5b50346105a75760203660031901126105a757600435808252600b60205260ff600160408420015460d01c161561064b5760408264ffffffffff9260209452600b8452205460a01c16604051908152f35b50346105a757806003193601126105a757602060405167016345785d8a00008152f35b50346105a75760203660031901126105a757600435808252600b60205260ff600160408420015460d01c161561064b576040826001600160a01b039260209452600b8452205416604051908152f35b50346105a75760203660031901126105a75760ff600160406020936004358152600b855220015460d01c166040519015158152f35b50346105a75760803660031901126105a757610e4c612edf565b610e54612ef5565b906064359067ffffffffffffffff821161047a573660238301121561047a5781600401359284610e8385613019565b93610e916040519586612ff7565b858552366024878301011161099f5785610ebc96602460209301838801378501015260443591613169565b80f35b50346105a75760203660031901126105a75760206105ef60043561367c565b50346105a75760203660031901126105a757600435808252600b60205260ff600160408420015460d01c161561064b57610f179061398f565b604051906005811015610f2c57602092508152f35b602483634e487b7160e01b81526021600452fd5b50346105a7576101403660031901126105a757610f5b61451d565b610f63613629565b9064ffffffffff80421680845260c43582811681036110745781018216602085015260e4359081831682036110745701166040830152606435916001600160a01b03918284168094036105a757506084358015158091036110745760a435908115158092036110745760243594848616809603611074576004359585871680970361107457604435906001600160801b038216809203611074576040519761100a89612fa2565b8852602088015260408701526060860152608085015260a084015260c0830152604061010319360112611074576040519161104483612fdb565b610104359182168203611074578261106c9260209452610124358482015260e0820152613a91565b604051908152f35b600080fd5b50346105a75760203660031901126105a757600435808252600b60205260ff600160408420015460d01c161561064b5760026040836001600160801b039360209552600b855220015416604051908152f35b50346105a75760203660031901126105a7576110e5612edf565b6001600160a01b038083541633810361119f575081169081835260026020526001600160801b0360408420541690811561116e578161113f918486526002602052604086206001600160801b031981541690553390614579565b6040519081527fca7a4a65a94ed2f37538814e00e1cd4c41a78261561e3f3794592f11409cf5af60203392a380f35b602483604051907f8410168c0000000000000000000000000000000000000000000000000000000082526004820152fd5b6040516331b339a960e21b81526001600160a01b03919091166004820152336024820152604490fd5b50346105a75760603660031901126105a75767ffffffffffffffff600435818111610476576111fb903690600401612f40565b90611204612ef5565b92604435908111610c215761121d903690600401612f40565b61122894919461451d565b80840361156c5791926001600160a01b038216159290865b81811061124b578780f35b611256818388614607565b359061126381858a614607565b356001600160801b03811681036110745761127c61451d565b611285836136b3565b61058f576112a983600052600b6020526001600160a01b0360406000205416331490565b80158061155c575b61056057838b5260056020526001600160a01b0360408c2054169080611549575b61151c5787610504576001600160801b03821615611504576112f3846145df565b6001600160801b0381166001600160801b038416116114d25750908a91848352600b80602052611363600261038a611334868360408a20015460801c61462d565b918988528460205260408820019182906001600160801b036001600160801b031983549260801b169116179055565b6001600160801b0361138781602084015116928260408183511692015116906136ea565b1611156114a2575b8584526020526001600160a01b036001604085200154166113ba6001600160801b0384168a83614579565b6040516001600160801b0384168152867f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d60206001600160a01b038d1693a48033141580611498575b61142c575b5050506000805160206147f18339815191526020600193604051908152a101611240565b803b15610476576001600160a01b036084898580946001600160801b0360405197889687956313375c3b60e01b87528d60048801523360248801521660448601521660648401525af1611480575b80611408565b61148990612f71565b61149457883861147a565b8880fd5b50803b1515611403565b858452806020526040842060018101600160c81b60ff60c81b1982541617905560ff60f01b19815416905561138f565b60405163287ecaef60e21b8152600481018690526001600160801b038481166024830152919091166044820152606490fd5b6024846040519063d2aabcd960e01b82526004820152fd5b6064846001600160a01b038960405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b50806001600160a01b03881614156112d2565b5061156684614648565b156112b1565b83604491604051917faec9344000000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b50346105a75760403660031901126105a7576115bd612edf565b60243590811515809203611074576001600160a01b0316908133146116305733835260086020526040832082600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a380f35b606460405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152fd5b50346105a7576101603660031901126105a75761168f61451d565b6040519061169c82612fa2565b6116a4612edf565b82526116ae612ef5565b60208301526116bb613035565b60408301526001600160a01b03906064358281168103611074576060840152608435801515810361107457608084015260a43580151581036110745760a084015260603660c31901126105a7575060405161171581612fbf565b64ffffffffff60c435818116810361107457825260e435818116810361107457602083015261010435908116810361107457604082015260c0830152604061012319360112611074576040519161176b83612fdb565b610124359182168203611074578261106c9260209452610144358482015260e0820152613a91565b50346105a757806003193601126105a757604051908060045491600183811c92818516948515611896575b602095868610811461188257858852879493929187908215611860575050600114611806575b50506117f292500383612ff7565b61091e604051928284938452830190612eba565b90859250600482527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5b8583106118485750506117f2935082010138806117e4565b80548389018501528794508693909201918101611830565b92509350506117f294915060ff191682840152151560051b82010138806117e4565b602483634e487b7160e01b81526022600452fd5b93607f16936117be565b50346105a75760203660031901126105a757600435808252600b60205260ff600160408420015460d01c161561064b57600160408364ffffffffff9360209552600b855220015460a01c16604051908152f35b50346105a75760203660031901126105a757600435808252600b60205260ff600160408420015460d01c161561064b5761192c9061398f565b906005821015908161196d5760028314918215611981575b8215611958575b6020836040519015158152f35b90915061196d5750600460209114388061194b565b80634e487b7160e01b602492526021600452fd5b506003831491506000611944565b50346105a75760203660031901126105a7576004356001600160a01b0390818116809103610476578183541633810361119f575060015491816001600160a01b03198416176001556040519216825260208201527fdcb09aef4bf01068924ccce937981cbe59d25ba08380cf941aaaea4e4bd3960d60403392a280f35b50346105a75760203660031901126105a757604051611a2a81612f85565b8181528160208201528160408201528160608201528160808201528160a08201528160c08201528160e08201528161010082015281610120820152610140611a70613629565b9101526004358152600b60205260ff600160408320015460d01c1615611c48576004358152600b60205260408120611b49600260405192611ab084612f85565b80546001600160a01b038116855264ffffffffff8160a01c16602086015264ffffffffff8160c81c16604086015260ff8160f01c161515606086015260f81c1515608085015260ff60018201546001600160a01b03811660a087015264ffffffffff8160a01c1660c0870152818160c81c16151560e0870152818160d01c16151561010087015260d81c16151561012085015201613648565b610140820152611b5a60043561398f565b6005811015610f2c579160026101a09314611c3d575b50610873610140604051926001600160a01b03815116845264ffffffffff602082015116602085015264ffffffffff60408201511660408501526060810151151560608501526080810151151560808501526001600160a01b0360a08201511660a085015264ffffffffff60c08201511660c085015260e0810151151560e0850152610100810151151561010085015261012081015115156101208501520151610140830190604090816001600160801b0391828151168552826020820151166020860152015116910152565b606082015238611b70565b602460405162b8e7e760e51b81526004356004820152fd5b50346105a75760208060031936011261099f5760043567ffffffffffffffff811161047657611c93903690600401612f40565b9190611c9d61451d565b83925b808410611cab578480f35b611cb6848284614607565b3593611cc061451d565b611cc9856136b3565b15611ce65760248560405190634a5541ef60e01b82526004820152fd5b611cf38592939495613719565b611f5957611d1782600052600b6020526001600160a01b0360406000205416331490565b15611f3a57611d258261374a565b91808752600b808752611d3d600260408a2001613648565b936001600160801b0390818651168282161015611f2257838a5282895260ff60408b205460f01c1615611f0a5781611d8b82828c611d818f968299988d51166136ea565b9a015116906136ea565b928583528085526040832091825498600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8b161784556003828716948515611ef0575b01918116918281546001600160801b0319161790556001600160a01b03809a169260058852838b6040882054169788928a5260019c8d60408a2001541693611e19868487614579565b604080518d81526001600160801b03928316602082015292909116908201527f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa5090606090a4843b611e8a575b50505050506000805160206147f183398151915291604051908152a101929190611ca0565b909192938095503b1561047a5760848492838d9760405196879586946372eba20360e01b86528c60048701526024860152604485015260648401525af1611ed5575b80808392611e65565b611ee0919250612f71565b611eec57858738611ecc565b8680fd5b60018101600160c81b60ff60c81b19825416179055611dd0565b602484604051906339c6dc7360e21b82526004820152fd5b602484604051906322cad1af60e11b82526004820152fd5b60405163216caf0d60e01b815260048101839052336024820152604490fd5b6024826040519063fe19f19f60e01b82526004820152fd5b50346105a75760208060031936011261099f5760043590611f9061451d565b818352600b815260ff600160408520015460d01c161561215057611fb38261398f565b600581101561213c5760048103611fdc5760248360405190634a5541ef60e01b82526004820152fd5b60038103611ffc576024836040519063fe19f19f60e01b82526004820152fd5b6002146121245761202382600052600b6020526001600160a01b0360406000205416331490565b15611f3a57818352600b815260ff604084205460f01c161561210c57818352600b81526040832060ff60f01b19815416905582604051837f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f8380a2600583526001600160a01b03604083205416803b6120b4575b5050506000805160206147f183398151915291604051908152a180f35b803b1561047657816024818580947f341a0bd90000000000000000000000000000000000000000000000000000000083528960048401525af16120f8575b80612097565b61210190612f71565b6104765782386120f2565b602482604051906339c6dc7360e21b82526004820152fd5b602482604051906322cad1af60e11b82526004820152fd5b602484634e487b7160e01b81526021600452fd5b6024826040519062b8e7e760e51b82526004820152fd5b50346105a75760203660031901126105a7576004356001600160a01b0390818116809103610476578183541633810361119f5750600a5491816001600160a01b0319841617600a556040519216825260208201527fa2548bd4b805e907c1558a47b5858324fe8bb4a2e1ddfca647eecbf65610eebc60403392a260095460001981019081116122245760407f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c91815190600182526020820152a180f35b602482634e487b7160e01b81526011600452fd5b50346105a75760203660031901126105a757600435808252600b60205260ff600160408420015460d01c161561064b5760408264ffffffffff9260209452600b8452205460c81c16604051908152f35b50346105a75760203660031901126105a7576122a2612edf565b9080546001600160a01b03808216933385036122f4576001600160a01b03199394501691829116178255337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808380a380f35b6040516331b339a960e21b81526001600160a01b0386166004820152336024820152604490fd5b50346105a75760203660031901126105a7576001600160a01b0361233d612edf565b16801561235a578160409160209352600683522054604051908152f35b608460405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e657200000000000000000000000000000000000000000000006064820152fd5b50346105a75760203660031901126105a7576001600160a01b0360406020926004356124096108ae8260005260056020526001600160a01b0360406000205416151590565b815260058452205416604051908152f35b50346105a75760203660031901126105a7576020612439600435613096565b6001600160a01b0360405191168152f35b50346105a757806003193601126105a75760206001600160a01b0360015416604051908152f35b50346105a75760203660031901126105a75760ff6001604060043593848152600b60205220015460d01c161561064b57610718602091613a16565b50346105a75760203660031901126105a75760043590818152600b60205260ff600160408320015460d01c161561215057806124e78361398f565b92600584101561252257600260209403612508575b50506040519015158152f35b8152600b8352604090205460f01c60ff16905038806124fc565b602482634e487b7160e01b81526021600452fd5b50346105a75760203660031901126105a75760043561255361451d565b61255c816136b3565b1561267d5761256a81614648565b1561265d5761257881613096565b6125818261367c565b159081612655575b81612642575b5061262a576020816125af6000805160206147f183398151915293613096565b90808552600783526001600160a01b0360408620926001600160a01b03199384815416905516918286526006845260408620600019815401905581865260058452604086209081541690558085604051937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a48152a180f35b602490604051906378630aa960e01b82526004820152fd5b6001600160a01b0391501615153861258f565b839150612589565b60405163216caf0d60e01b81526004810191909152336024820152604490fd5b602490604051907f817cd6390000000000000000000000000000000000000000000000000000000082526004820152fd5b50346105a7576126bd36612f0b565b60405191602083019383851067ffffffffffffffff8611176126e857610ebc94604052858452613169565b634e487b7160e01b600052604160045260246000fd5b50346105a75760203660031901126105a75760206105ef6004356136b3565b50346105a757602090816003193601126105a7576004359161273d61451d565b612746836136b3565b156127635760248360405190634a5541ef60e01b82526004820152fd5b61276c83613719565b6129b05761279083600052600b6020526001600160a01b0360406000205416331490565b15610d1c5761279e8361374a565b838352600b82526127b460026040852001613648565b906001600160801b039081835116828216101561299857858552600b845260ff604086205460f01c161561298057600b6128038284876127f9604096838a51166136ea565b97015116906136ea565b87875281865285877f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa50858220978b6128d98a54600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216178c5560038b89169c8d15612966575b019a84169a8b6001600160801b031982541617905560016001600160a01b038092169a8b9760058a528382822054169b8c9a5220015416966128af8b878a614579565b60405193849384916040919493606084019584526001600160801b03809216602085015216910152565b0390a4803b6128ff575b856000805160206147f18339815191528689604051908152a180f35b803b15612962578592918360849260405196879586946372eba20360e01b86528c60048701526024860152604485015260648401525af1612943575b8080806128e3565b9161295c6000805160206147f183398151915293612f71565b9161293b565b8580fd5b60018101600160c81b60ff60c81b1982541617905561286c565b602486604051906339c6dc7360e21b82526004820152fd5b602486604051906322cad1af60e11b82526004820152fd5b6024836040519063fe19f19f60e01b82526004820152fd5b50346105a75760203660031901126105a7576001600160801b0360406020926001600160a01b036129f7612edf565b16815260028452205416604051908152f35b50346105a757610ebc612a1b36612f0b565b91612a2e612a2984336131ff565b6130f8565b6132de565b50346105a757806003193601126105a7576020600954604051908152f35b50346105a75760203660031901126105a757600435808252600b60205260ff600160408420015460d01c161561064b57612a8a9061398f565b90600582101561196d5760208215838115612aab575b506040519015158152f35b600191501482612aa0565b50346105a75760203660031901126105a75760043590818152600b60205260ff600160408320015460d01c161561215057602091604082828152600b85522060ff815460f01c1680612b44575b612b1b575b50506001600160801b0360405191168152f35b612b3d92506001600160801b036002612b37920154169161374a565b906136ea565b3880612b08565b5060ff600182015460c81c1615612b03565b50346105a75760403660031901126105a757612b70612edf565b602435906001600160a01b038080612b8785613096565b16921691808314612c7b57803314908115612c5a575b5015612bf057828452600760205260408420826001600160a01b0319825416179055612bc883613096565b167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258480a480f35b608460405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152fd5b9050845260086020526040842033855260205260ff60408520541638612b9d565b608460405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152fd5b50346105a75760203660031901126105a75760206124396004356130bb565b50346105a757806003193601126105a757604051908060035491600183811c92818516948515612dbc575b602095868610811461188257858852879493929187908215611860575050600114612d625750506117f292500383612ff7565b90859250600382527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b858310612da45750506117f2935082010138806117e4565b80548389018501528794508693909201918101612d8c565b93607f1693612d2f565b90503461099f57602036600319011261099f576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361047657602092507f80ac58cd000000000000000000000000000000000000000000000000000000008114908115612e6d575b8115612e43575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501438612e3c565b7f5b5e139f0000000000000000000000000000000000000000000000000000000081149150612e35565b60005b838110612eaa5750506000910152565b8181015183820152602001612e9a565b90602091612ed381518092818552858086019101612e97565b601f01601f1916010190565b600435906001600160a01b038216820361107457565b602435906001600160a01b038216820361107457565b6060906003190112611074576001600160a01b0390600435828116810361107457916024359081168103611074579060443590565b9181601f840112156110745782359167ffffffffffffffff8311611074576020808501948460051b01011161107457565b67ffffffffffffffff81116126e857604052565b610160810190811067ffffffffffffffff8211176126e857604052565b610100810190811067ffffffffffffffff8211176126e857604052565b6060810190811067ffffffffffffffff8211176126e857604052565b6040810190811067ffffffffffffffff8211176126e857604052565b90601f8019910116810190811067ffffffffffffffff8211176126e857604052565b67ffffffffffffffff81116126e857601f01601f191660200190565b604435906001600160801b038216820361107457565b1561305257565b606460405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152fd5b60005260056020526001600160a01b03604060002054166130b881151561304b565b90565b6130de6108ae8260005260056020526001600160a01b0360406000205416151590565b60005260076020526001600160a01b036040600020541690565b156130ff57565b608460405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f766564000000000000000000000000000000000000006064820152fd5b9061318d93929161317d612a2984336131ff565b6131888383836132de565b613497565b1561319457565b60405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b906001600160a01b03808061321384613096565b16931691838314938415613246575b508315613230575b50505090565b61323c919293506130bb565b161438808061322a565b909350600052600860205260406000208260005260205260ff604060002054169238613222565b1561327457565b608460405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152fd5b9061330792916132ed83613096565b916001600160a01b0394859384809416968791161461326d565b16908115806133fe576133198461367c565b1590816133f5575b50806133ec575b6133d457918084926133566000805160206147f18339815191529660209661334f85613096565b161461326d565b60009382855260078652604085206001600160a01b031990818154169055818652600687526040862060001981540190558286526040862060018154019055838652600587528260408720918254161790557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6040519580a48152a1565b602483604051906378630aa960e01b82526004820152fd5b50831515613328565b90501538613321565b608460405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152fd5b3d15613492573d9061347882613019565b916134866040519384612ff7565b82523d6000602084013e565b606090565b9290803b1561362057613501916020916001600160a01b0394604051809581948293897f150b7a02000000000000000000000000000000000000000000000000000000009b8c86523360048701521660248501526044840152608060648401526084830190612eba565b03916000968791165af1908290826135c0575b505061359a57613522613467565b805190816135955760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000161490565b909192506020813d8211613618575b816135dc60209383612ff7565b8101031261099f5751907fffffffff00000000000000000000000000000000000000000000000000000000821682036105a75750903880613514565b3d91506135cf565b50505050600190565b6040519061363682612fbf565b60006040838281528260208201520152565b9060405161365581612fbf565b6040819360018154916001600160801b0392838116865260801c6020860152015416910152565b80600052600b60205260ff60016040600020015460d01c161561064b57600052600b60205260ff60016040600020015460d81c1690565b80600052600b60205260ff60016040600020015460d01c161561064b57600052600b60205260ff60016040600020015460c81c1690565b6001600160801b03918216908216039190821161370357565b634e487b7160e01b600052601160045260246000fd5b80600052600b60205260ff60016040600020015460d01c161561064b57600052600b60205260406000205460f81c90565b600090808252600b6020526040822091825464ffffffffff42818360c81c16116137f85780600186015460a01c1691824210156137e2576137979394955060a01c16809103904203613800565b90828152600b6020526001600160801b03926137bd8460026040852001541680946138e0565b9283116137ca5750501690565b60029350604092508152600b60205220015460801c90565b505050505060026001600160801b039101541690565b505091505090565b670de0b6b3a76400009160001983830992808302928380861095039480860395146138bc578285101561388057908291096001821901821680920460028082600302188083028203028083028203028083028203028083028203028083028203028092029003029360018380600003040190848311900302920304170290565b82606492604051927f63a05778000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b5050809250156138ca570490565b634e487b7160e01b600052601260045260246000fd5b9091906000198382098382029182808310920391808303921461397e57670de0b6b3a7640000908183101561394757947faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066994950990828211900360ee1b910360121c170290565b60449086604051917f5173648d00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050670de0b6b3a764000090049150565b80600052600b602052604060002060ff600182015460c81c166000146139b6575050600490565b805460f81c613a0f575460a01c64ffffffffff164210613a09576139d98161374a565b90600052600b6020526001600160801b038060026040600020015416911610600014613a0457600190565b600290565b50600090565b5050600390565b80600052600b602052613a2f6002604060002001613648565b81600052600b602052604060002060ff600182015460c81c16600014613a6257506001600160801b039150602001511690565b5460f81c613a7457506130b89061374a565b6130b891506001600160801b0360408183511692015116906136ea565b906001600160a01b036001541660206001600160a01b036060850151166024604051809481937fdcf844a700000000000000000000000000000000000000000000000000000000835260048301525afa80156142b457600090614280575b613b1291506001600160801b0360408501511690602060e08601510151916146b1565b916001600160801b0383511660c082015190156142565764ffffffffff815116602082019064ffffffffff8251169081811161421657505064ffffffffff604091511691019064ffffffffff82511690818110156141d657505064ffffffffff8042169151169081811015614196575050600954926001600160801b0381511660405190613b9f82612fbf565b815260006020820152600060408201526001600160a01b036060840151169060c08401519164ffffffffff6020840151169064ffffffffff604085015116906080870151151560a088015115159364ffffffffff6001600160a01b038a511697511660405197613c0e89612f85565b88526020880152604087015260608601526000608086015260a085015260c0840152600060e0840152600161010084015261012083015261014082015284600052600b60205260406000206001600160a01b038251166001600160a01b0319825416178155613ca564ffffffffff602084015116829064ffffffffff60a01b1964ffffffffff60a01b83549260a01b169116179055565b604082015181547eff0000000000000000000000000000000000000000000000000000000000006060850151151560f01b169078ffffffffffffffffffffffffffffffffffffffffffffffffff7dffffffffff000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000006080880151151560f81b169460c81b1691161717178155600181016001600160a01b0360a0840151166001600160a01b0319825416178155613d9c64ffffffffff60c085015116829064ffffffffff60a01b1964ffffffffff60a01b83549260a01b169116179055565b60e083015181546101008501516101208601517fffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff90921692151560c81b79ff00000000000000000000000000000000000000000000000000169290921791151560d01b7aff0000000000000000000000000000000000000000000000000000169190911790151560d81b7bff00000000000000000000000000000000000000000000000000000016179055610140909101518051602082015160801b6001600160801b03199081166001600160801b03928316176002850155926040906003019201511682825416179055600185016009556001600160a01b0360608401511660005260026020526001600160801b0380604060002054168160208501511601166001600160a01b036060850151166000526040600020918254161790556001600160a01b03602083015116801561415257613f17613f118660005260056020526001600160a01b0360406000205416151590565b1561443a565b613f208561367c565b1580614149575b80614141575b6141295760206000805160206147f183398151915291613f66613f118860005260056020526001600160a01b0360406000205416151590565b806000526006825260406000206001815401905586600052600582526040600020816001600160a01b0319825416179055866040519160007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4868152a1613ff66001600160a01b036060840151166001600160801b038084511681602086015116011690309033906142c0565b6001600160801b03604082015116806140fa575b506001600160a01b038251167f075861cbceafeb777e8f15f357121b08f6f3adba387d599bb7b5278ca6192df5610160866001600160a01b03602087015116946140f16001600160a01b03606089015116976080810151151560a08201511515906140bb6001600160a01b0360e060c08601519501515116956040519788523360208901526040880190604090816001600160801b0391828151168552826020820151166020860152015116910152565b60a086015260c0850152805164ffffffffff90811660e08601526020820151811661010086015260409091015116610120840152565b610140820152a4565b614123906001600160a01b036060850151166001600160a01b0360e086015151169033906142c0565b3861400a565b602485604051906378630aa960e01b82526004820152fd5b506000613f2d565b50801515613f27565b606460405162461bcd60e51b815260206004820152602060248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152fd5b6040517f210aec0e00000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b6040517f9fee269100000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b6040517f4c23297000000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b60046040517f6095d3bc000000000000000000000000000000000000000000000000000000008152fd5b6020823d6020116142ac575b8161429960209383612ff7565b810103126105a75750613b129051613aef565b3d915061428c565b6040513d6000823e3d90fd5b9290604051927f23b872dd0000000000000000000000000000000000000000000000000000000060208501526001600160a01b03809216602485015216604483015260648201526064815260a081019181831067ffffffffffffffff8411176126e85761432f92604052614331565b565b6001600160a01b03169061439160405161434a81612fdb565b6020938482527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564858301526000808587829751910182855af161438b613467565b91614485565b805191821591848315614416575b5050509050156143ac5750565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b91938180945001031261099f578201519081151582036105a757508038808461439f565b1561444157565b606460405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152fd5b919290156144e65750815115614499575090565b3b156144a25790565b606460405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b8251909150156144f95750805190602001fd5b6104e89060405191829162461bcd60e51b8352602060048401526024830190612eba565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361454f57565b60046040517fa1c0d6e5000000000000000000000000000000000000000000000000000000008152fd5b916001600160a01b03604051927fa9059cbb000000000000000000000000000000000000000000000000000000006020850152166024830152604482015260448152608081019181831067ffffffffffffffff8411176126e85761432f92604052614331565b6130b8906145ec81613a16565b90600052600b60205260026040600020015460801c906136ea565b91908110156146175760051b0190565b634e487b7160e01b600052603260045260246000fd5b9190916001600160801b038080941691160191821161370357565b60009080825260056020526001600160a01b03806040842054169283331493841561468d575b5050821561467b57505090565b90915061468833926130bb565b161490565b60ff929450906040918152600860205281812033825260205220541691388061466e565b9092916146bc613629565b936001600160801b03928381169182156147c85767016345785d8a00008082116147915780851161475a5750614706856146f78193866138e0565b169460208901958652846138e0565b16918461471d60408901948086528287511661462d565b1610156147445761473684918261473f955116906136ea565b915116906136ea565b168252565b634e487b7160e01b600052600160045260246000fd5b84604491604051917f4fea5c1a00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b60449250604051917f47152d6700000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b505050505090506040516147db81612fbf565b6000815260006020820152600060408201529056fef8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7a164736f6c6343000815000a"; bytes public constant BYTECODE_NFT_DESCRIPTOR = hex"6080806040523461001757615dac90816200001d8239f35b600080fdfe6080604052600436101561001257600080fd5b60003560e01c63e9dc63751461002757600080fd5b346142f85760403660031901126142f8576001600160a01b0360043516600435036142f857610056608061486e565b60006080819052606060a081905260c082905260e0819052610120819052610140819052610160819052610180919091526101a0526004356001600160a01b03166101008190526100a690614c58565b61012052610100516040517feac8f5b80000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa908115614305576000916147dd575b506001600160a01b03610117911680608052615669565b60a052610100516040517fa80fc0710000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa8015614305576fffffffffffffffffffffffffffffffff916000916147be575b501660c052610100516040517fad35efd40000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa801561430557600090614781575b6101e59150615889565b61014052610100516040517f4869e12d0000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa90811561430557600091614752575b5060c0516fffffffffffffffffffffffffffffffff16801561473c576fffffffffffffffffffffffffffffffff612710819302160416610100608001526102876004356153c7565b610120608001526040514660208201526bffffffffffffffffffffffff1960043560601b16604082015260243560548201526054815280608081011067ffffffffffffffff60808301111761431157608081016040526020815191012061041a602963ffffffff61032e6103078261016861ffff8860101c160616614b08565b91601e604660ff6103248460146050848d60081c16060116614b08565b9816060116614b08565b6040519485927f68736c2800000000000000000000000000000000000000000000000000000000602085015261036e815180926020602488019101614826565b83017f2c0000000000000000000000000000000000000000000000000000000000000060248201526103aa825180936020602585019101614826565b017f252c00000000000000000000000000000000000000000000000000000000000060258201526103e5825180936020602785019101614826565b017f252900000000000000000000000000000000000000000000000000000000000060278201520360098101845201826148df565b6104526fffffffffffffffffffffffffffffffff6040608001511660ff61044b6001600160a01b03608051166155dc565b1690614e89565b6104666001600160a01b0360805116614c58565b60a051610100516040517fbc2be1be0000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa80156143055760249160009161471d575b5060206001600160a01b03608080015116604051938480927f9067b677000000000000000000000000000000000000000000000000000000008252823560048301525afa801561430557610528926000916146ee575b5064ffffffffff80911691166151d5565b61012051610180519092916105b2602161054f6064610548818706615744565b9504614b08565b6040519481610568879351809260208087019101614826565b820161057d8251809360208085019101614826565b017f250000000000000000000000000000000000000000000000000000000000000060208201520360018101855201836148df565b610100608001519260c060800151956101206080015197604051996105d68b61486e565b8a5260208a015260408901526060880152608087015260a086015260c085015260e0840152610100830152610120820152604051806101c081011067ffffffffffffffff6101c083011117614311576101c0810160405260608152600060208201526000604082015260608082015260006080820152606060a0820152600060c0820152600060e08201526060610100820152600061012082015260006101408201526060610160820152600061018082015260006101a082015260a08201516106a660c0840151845190615a7a565b906109b361015c604051926106ba846148c3565b600884527f50726f677265737300000000000000000000000000000000000000000000000060208501526107236040516106f38161488b565b60009052855160208701207fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4701490565b156146e6576090945b61073586614b08565b916040519586938493661e339034b21e9160c91b60208601526109818351958692610767846027840160208901614826565b6d11103334b6361e9111b33333111f60911b602785840101526c1e3932b1ba103bb4b23a341e9160991b603585840101526107ae8551809660206042888701019101614826565b7f22206865696768743d22313030222066696c6c2d6f7061636974793d222e3033828501860160428101919091527f222072783d223135222072793d22313522207374726f6b653d2223666666222060628201527f7374726f6b652d6f7061636974793d222e3122207374726f6b652d77696474686082820152651e911a11179f60d11b60a28201527f3c7465787420783d2232302220793d2233342220666f6e742d66616d696c793d60a88201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f7370616365222060c8820152703337b73a16b9b4bd329e911919383c111f60791b60e88201528651966108b491889160f990910190602001614826565b661e17ba32bc3a1f60c91b8285018601870160f98101919091527f3c7465787420783d2232302220793d2237322220666f6e742d66616d696c793d6101008201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f73706163652220610120820152703337b73a16b9b4bd329e91191b383c111f60791b61014082015287519761094f91899161015190910190602001614826565b661e17ba32bc3a1f60c91b6101518888888887010101010152602061015888888885519c8d9701010101019101614826565b631e17b39f60e11b90860190910190910190910190910161015881019190915281900361013c810190915201826148df565b6101008301526101208201526028610100830151604051906109d48261488b565b60008252610c7a61015c604051926109eb846148c3565b600684527f53746174757300000000000000000000000000000000000000000000000000006020850152610a1e84615cba565b610a2782615d37565b808211156146de5750945b610a3d878701614b08565b91604051958693661e339034b21e9160c91b60208601528151610a67816027880160208601614826565b85016d11103334b6361e9111b33333111f60911b60278201526c1e3932b1ba103bb4b23a341e9160991b6035820152610aaa825180936020604285019101614826565b017f22206865696768743d22313030222066696c6c2d6f7061636974793d222e303360428201527f222072783d223135222072793d22313522207374726f6b653d2223666666222060628201527f7374726f6b652d6f7061636974793d222e3122207374726f6b652d77696474686082820152651e911a11179f60d11b60a28201527f3c7465787420783d2232302220793d2233342220666f6e742d66616d696c793d60a88201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f7370616365222060c8820152703337b73a16b9b4bd329e911919383c111f60791b60e8820152610ba682518093602060f985019101614826565b01661e17ba32bc3a1f60c91b60f98201527f3c7465787420783d2232302220793d2237322220666f6e742d66616d696c793d6101008201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f73706163652220610120820152703337b73a16b9b4bd329e91191b383c111f60791b610140820152610c3582518093602061015185019101614826565b01661e17ba32bc3a1f60c91b610151820152610c5c82518093602061015885019101614826565b01631e17b39f60e11b6101588201520361013c8101845201826148df565b610160840152016101808201526028602083015160405190610c9b8261488b565b60008252610ce561015c60405192610cb2846148c3565b600684527f416d6f756e7400000000000000000000000000000000000000000000000000006020850152610a1e84615cba565b835201602082015261102060808301516030604051610d038161488b565b60008152610faa61015c60405194610d1a866148c3565b600886527f4475726174696f6e0000000000000000000000000000000000000000000000006020870152610d4d86615cba565b610d5682615d37565b808211156146d65750935b610d6d60288601614b08565b91604051978893661e339034b21e9160c91b60208601528151610d97816027880160208601614826565b85016d11103334b6361e9111b33333111f60911b60278201526c1e3932b1ba103bb4b23a341e9160991b6035820152610dda825180936020604285019101614826565b017f22206865696768743d22313030222066696c6c2d6f7061636974793d222e303360428201527f222072783d223135222072793d22313522207374726f6b653d2223666666222060628201527f7374726f6b652d6f7061636974793d222e3122207374726f6b652d77696474686082820152651e911a11179f60d11b60a28201527f3c7465787420783d2232302220793d2233342220666f6e742d66616d696c793d60a88201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f7370616365222060c8820152703337b73a16b9b4bd329e911919383c111f60791b60e8820152610ed682518093602060f985019101614826565b01661e17ba32bc3a1f60c91b60f98201527f3c7465787420783d2232302220793d2237322220666f6e742d66616d696c793d6101008201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f73706163652220610120820152703337b73a16b9b4bd329e91191b383c111f60791b610140820152610f6582518093602061015185019101614826565b01661e17ba32bc3a1f60c91b610151820152610f8c82518093602061015885019101614826565b01631e17b39f60e11b6101588201520361013c8101865201846148df565b8260a08601526028810160c0860152602085015190610120860151809161018088015192839185010101605881016080890152605719906103e8030160011c8061014089015201601081016101a088015201602081016040870152010160e0840152610100830151610160840151845191614e1f565b6060820152604051908161010081011067ffffffffffffffff6101008401111761431157610100820160405260c782527f3c726563742077696474683d223130302522206865696768743d22313030252260208301527f2066696c7465723d2275726c28234e6f69736529222f3e3c7265637420783d2260408301527f37302220793d223730222077696474683d2238363022206865696768743d223860608301527f3630222066696c6c3d2223666666222066696c6c2d6f7061636974793d222e3060808301527f33222072783d223435222072793d22343522207374726f6b653d22236666662260a08301527f207374726f6b652d6f7061636974793d222e3122207374726f6b652d7769647460c08301527f683d2234222f3e0000000000000000000000000000000000000000000000000060e083015282519161010084015191606081015194604051611176816148a7565b603381527f3c636972636c652069643d22476c6f772220723d22353030222066696c6c3d2260208201527f75726c282352616469616c476c6f7729222f3e000000000000000000000000006040820152604051966111d38861486e565b61011c88527f3c66696c7465722069643d224e6f697365223e3c6665466c6f6f6420783d223060208901527f2220793d2230222077696474683d223130302522206865696768743d2231303060408901527f252220666c6f6f642d636f6c6f723d2268736c283233302c3231252c3131252960608901527f2220666c6f6f642d6f7061636974793d22312220726573756c743d22666c6f6f60808901527f6446696c6c222f3e3c666554757262756c656e6365206261736546726571756560a08901527f6e63793d222e3422206e756d4f6374617665733d22332220726573756c743d2260c08901527f4e6f6973652220747970653d226672616374616c4e6f697365222f3e3c66654260e08901527f6c656e6420696e3d224e6f6973652220696e323d22666c6f6f6446696c6c22206101008901527f6d6f64653d22736f66742d6c69676874222f3e3c2f66696c7465723e0000000061012089015260405197886103a081011067ffffffffffffffff6103a08b011117614311576103a0890160405261037b89527f3c706174682069643d224c6f676f222066696c6c3d2223666666222066696c6c60208a01527f2d6f7061636974793d222e312220643d226d3133332e3535392c3132342e303360408a01527f34632d2e3031332c322e3431322d312e3035392c342e3834382d322e3932332c60608a01527f362e3430322d322e3535382c312e3831392d352e3136382c332e3433392d372e60808a01527f3838382c342e3939362d31342e34342c382e3236322d33312e3034372c31322e60a08a01527f3536352d34372e3637342c31322e3536392d382e3835382e3033362d31372e3860c08a01527f33382d312e3237322d32362e3332382d332e3636332d392e3830362d322e373660e08a01527f362d31392e3038372d372e3131332d32372e3536322d31322e3737382d31332e6101008a01527f3834322d382e3032352c392e3436382d32382e3630362c31362e3135332d33356101208a01527f2e323635683063322e3033352d312e3833382c342e3235322d332e3534362c366101408a01527f2e3436332d352e323234683063362e3432392d352e3635352c31362e3231382d6101608a01527f322e3833352c32302e3335382c342e31372c342e3134332c352e3035372c382e6101808a01527f3831362c392e3634392c31332e39322c31332e373334682e30333763352e37336101a08a01527f362c362e3436312c31352e3335372d322e3235332c392e33382d382e34382c306101c08a01527f2c302d332e3531352d332e3531352d332e3531352d332e3531352d31312e34396101e08a01527f2d31312e3437382d35322e3635362d35322e3636342d36342e3833372d36342e6102008a01527f3833376c2e3034392d2e303337632d312e3732352d312e3630362d322e3731396102208a01527f2d332e3834372d322e3735312d362e3230346830632d2e3034362d322e3337356102408a01527f2c312e3036322d342e3538322c322e3732362d362e32323968306c2e3138352d6102608a01527f2e3134386830632e3039392d2e3036322c2e3232322d2e3134382c2e33372d2e6102808a01527f323539683063322e30362d312e3336322c332e3935312d322e3632312c362e306102a08a01527f34342d332e3834324335372e3736332d332e3437332c39372e37362d322e33346102c08a01527f312c3132382e3633372c31382e3333326331362e3637312c392e3934362d32366102e08a01527f2e3334342c35342e3831332d33382e3635312c34302e3139392d362e3239392d6103008a01527f362e3039362d31382e3036332d31372e3734332d31392e3636382d31382e38316103208a01527f312d362e3031362d342e3034372d31332e3036312c342e3737362d372e3735326103408a01527f2c392e3735316c36382e3235342c36382e33373163312e3732342c312e3630316103608a01527f2c322e3731342c332e38342c322e3733382c362e3139325a222f3e00000000006103808a0152604051978860a081011067ffffffffffffffff60a08b01111761431157611cb1611d129160a08b0160405260758b527f3c706174682069643d22466c6f6174696e6754657874222066696c6c3d226e6f60208c01527f6e652220643d224d31323520343568373530733830203020383020383076373560408c01527f307330203830202d3830203830682d373530732d38302030202d3830202d383060608c01527f762d3735307330202d3830203830202d3830222f3e000000000000000000000060808c0152611868615a41565b906040517f3c72616469616c4772616469656e742069643d2252616469616c476c6f77223e6020820152611d0d60d87f3c73746f70206f66667365743d223025222073746f702d636f6c6f723d22000093846040850152805161199a60b88660208501936118da81605e840187614826565b8101997f222073746f702d6f7061636974793d222e36222f3e0000000000000000000000605e8c01527f3c73746f70206f66667365743d2231303025222073746f702d636f6c6f723d229a8b607382015261193f825180936020609385019101614826565b017f222073746f702d6f7061636974793d2230222f3e00000000000000000000000060938201527f3c2f72616469616c4772616469656e743e00000000000000000000000000000060a78201520360988101885201866148df565b6119a2615a41565b90604051967f3c6c696e6561724772616469656e742069643d2253616e64546f70222078313d60208901527f223025222079313d223025223e000000000000000000000000000000000000006040890152604d8801528251611a0881606b8a0184614826565b8701917f222f3e00000000000000000000000000000000000000000000000000000000009283606b82015289606e820152611a4d825180936020608e85019101614826565b019082608e830152611a9160a2897f3c2f6c696e6561724772616469656e743e0000000000000000000000000000009485609182015203608281018b5201896148df565b611bd7610108611a9f615a41565b6040519b8c917f3c6c696e6561724772616469656e742069643d2253616e64426f74746f6d222060208401527f78313d2231303025222079313d2231303025223e00000000000000000000000060408401527f3c73746f70206f66667365743d22313025222073746f702d636f6c6f723d22006054840152611b2b815180926020607387019101614826565b8201908760738301526076820152875190611b4a826096830188614826565b018660968201527f3c616e696d617465206174747269627574654e616d653d22783122206475723d60998201527f2236732220726570656174436f756e743d22696e646566696e6974652220766160b98201527f6c7565733d223330253b3630253b313230253b3630253b3330253b222f3e000060d98201528560f78201520360e881018c52018a6148df565b611bdf615a41565b906040519a8b957f3c6c696e6561724772616469656e742069643d22486f7572676c61737353747260208801527f6f6b6522206772616469656e745472616e73666f726d3d22726f74617465283960408801527f302922206772616469656e74556e6974733d227573657253706163654f6e557360608801527f65223e000000000000000000000000000000000000000000000000000000000060808801527f3c73746f70206f66667365743d22353025222073746f702d636f6c6f723d2200608388015251809260a2880190614826565b84018360a28201527f3c73746f70206f66667365743d22383025222073746f702d636f6c6f723d220060a5820152611cf382518093602060c485019101614826565b019160c483015260c78201520360b88101875201856148df565b614e1f565b92611d32611d1e615817565b896020815191012090602081519101201490565b9788156146ad575b506040518060c081011067ffffffffffffffff60c0830111176143115760c08101604052609081527f3c7061746820643d224d2035302c3336302061203330302c333030203020312c60208201527f31203630302c302061203330302c333030203020312c31202d3630302c30222060408201527f66696c6c3d2223666666222066696c6c2d6f7061636974793d222e303222207360608201527f74726f6b653d2275726c2823486f7572676c6173735374726f6b65292220737460808201527f726f6b652d77696474683d2234222f3e0000000000000000000000000000000060a082015260405193846102c081011067ffffffffffffffff6102c087011117614311576102c0850160405261029885527f3c7061746820643d226d3536362c3136312e323031762d35332e39323463302d60208601527f31392e3338322d32322e3531332d33372e3536332d36332e3339382d35312e3160408601527f39382d34302e3735362d31332e3539322d39342e3934362d32312e3037392d3160608601527f35322e3538372d32312e303739732d3131312e3833382c372e3438372d31353260808601527f2e3630322c32312e303739632d34302e3839332c31332e3633362d36332e343160a08601527f332c33312e3831362d36332e3431332c35312e3139387635332e39323463302c60c08601527f31372e3138312c31372e3730342c33332e3432372c35302e3232332c34362e3360e08601527f3934763238342e383039632d33322e3531392c31322e39362d35302e3232332c6101008601527f32392e3230362d35302e3232332c34362e3339347635332e39323463302c31396101208601527f2e3338322c32322e35322c33372e3536332c36332e3431332c35312e3139382c6101408601527f34302e3736332c31332e3539322c39342e3935342c32312e3037392c3135322e6101608601527f3630322c32312e303739733131312e3833312d372e3438372c3135322e3538376101808601527f2d32312e3037396334302e3838362d31332e3633362c36332e3339382d33312e6101a08601527f3831362c36332e3339382d35312e313938762d35332e39323463302d31372e316101c08601527f39362d31372e3730342d33332e3433352d35302e3232332d34362e34303156326101e08601527f30372e3630336333322e3531392d31322e3936372c35302e3232332d32392e326102008601527f30362c35302e3232332d34362e3430315a6d2d3334372e3436322c35372e37396102208601527f336c3133302e3935392c3133312e3032372d3133302e3935392c3133312e30316102408601527f33563231382e3939345a6d3236322e3932342e303232763236322e3031386c2d6102608601527f3133302e3933372d3133312e3030362c3133302e3933372d3133312e3031335a6102808601527f222066696c6c3d2223313631383232223e3c2f706174683e00000000000000006102a0860152896000146144885760405161218c8161488b565b60008152995b1561432757604051806101e081011067ffffffffffffffff6101e083011117614311576101e081016040526101b181527f3c7061746820643d226d3438312e34362c3438312e35347638312e3031632d3260208201527f2e33352e37372d342e38322c312e35312d372e33392c322e32332d33302e332c60408201527f382e35342d37342e36352c31332e39322d3132342e30362c31332e39322d353360608201527f2e362c302d3130312e32342d362e33332d3133312e34372d31362e3136762d3860808201527f316c34362e332d34362e3331683137302e33336c34362e32392c34362e33315a60a08201527f222066696c6c3d2275726c282353616e64426f74746f6d29222f3e3c7061746860c08201527f20643d226d3433352e31372c3433352e323363302c312e31372d2e34362c322e60e08201527f33322d312e33332c332e34342d372e31312c392e30382d34312e39332c31352e6101008201527f39382d38332e38312c31352e3938732d37362e372d362e392d38332e38322d316101208201527f352e3938632d2e38372d312e31322d312e33332d322e32372d312e33332d332e6101408201527f3434762d2e30346c382e33342d382e33352e30312d2e30316331332e37322d366101608201527f2e35312c34322e39352d31312e30322c37362e382d31312e30327336322e39376101808201527f2c342e34392c37362e37322c31316c382e34322c382e34325a222066696c6c3d6101a08201527f2275726c282353616e64546f7029222f3e0000000000000000000000000000006101c0820152995b60405196876107e081011067ffffffffffffffff6107e08a01111761431157613b9f9c612e5a6036602d9960819f97631e17b39f60e11b8d7f3c2f646566733e000000000000000000000000000000000000000000000000009a612f2b9f6107e0016040526107a782527f3c672066696c6c3d226e6f6e6522207374726f6b653d2275726c2823486f757260208301527f676c6173735374726f6b652922207374726f6b652d6c696e656361703d22726f60408301527f756e6422207374726f6b652d6d697465726c696d69743d22313022207374726f60608301527f6b652d77696474683d2234223e3c7061746820643d226d3536352e3634312c3160808301527f30372e323863302c392e3533372d352e35362c31382e3632392d31352e36373660a08301527f2c32362e393733682d2e303233632d392e3230342c372e3539362d32322e313960c08301527f342c31342e3536322d33382e3139372c32302e3539322d33392e3530342c313460e08301527f2e3933362d39372e3332352c32342e3335352d3136312e3733332c32342e33356101008301527f352d39302e34382c302d3136372e3934382d31382e3538322d3139392e3935336101208301527f2d34342e393438682d2e303233632d31302e3131352d382e3334342d31352e366101408301527f37362d31372e3433372d31352e3637362d32362e3937332c302d33392e3733356101608301527f2c39362e3535342d37312e3932312c3231352e3635322d37312e3932317332316101808301527f352e3632392c33322e3138352c3231352e3632392c37312e3932315a222f3e3c6101a08301527f7061746820643d226d3133342e33362c3136312e32303363302c33392e3733356101c08301527f2c39362e3535342c37312e3932312c3231352e3635322c37312e3932317332316101e08301527f352e3632392d33322e3138362c3231352e3632392d37312e393231222f3e3c6c6102008301527f696e652078313d223133342e3336222079313d223136312e323033222078323d6102208301527f223133342e3336222079323d223130372e3238222f3e3c6c696e652078313d226102408301527f3536352e3634222079313d223136312e323033222078323d223536352e3634226102608301527f2079323d223130372e3238222f3e3c6c696e652078313d223138342e353834226102808301527f2079313d223230362e383233222078323d223138342e353835222079323d22356102a08301527f33372e353739222f3e3c6c696e652078313d223231382e313831222079313d226102c08301527f3231382e313138222078323d223231382e313831222079323d223536322e35336102e08301527f37222f3e3c6c696e652078313d223438312e383138222079313d223231382e316103008301527f3432222078323d223438312e383139222079323d223536322e343238222f3e3c6103208301527f6c696e652078313d223531352e343135222079313d223230372e3335322220786103408301527f323d223531352e343136222079323d223533372e353739222f3e3c70617468206103608301527f643d226d3138342e35382c3533372e353863302c352e34352c342e32372c31306103808301527f2e36352c31322e30332c31352e3432682e303263352e35312c332e33392c31326103a08301527f2e37392c362e35352c32312e35352c392e34322c33302e32312c392e392c37386103c08301527f2e30322c31362e32382c3133312e38332c31362e32382c34392e34312c302c396103e08301527f332e37362d352e33382c3132342e30362d31332e39322c322e372d2e37362c356104008301527f2e32392d312e35342c372e37352d322e33352c382e37372d322e38372c31362e6104208301527f30352d362e30342c32312e35362d392e3433683063372e37362d342e37372c316104408301527f322e30342d392e39372c31322e30342d31352e3432222f3e3c7061746820643d6104608301527f226d3138342e3538322c3439322e363536632d33312e3335342c31322e3438356104808301527f2d35302e3232332c32382e35382d35302e3232332c34362e3134322c302c392e6104a08301527f3533362c352e3536342c31382e3632372c31352e3637372c32362e393639682e6104c08301527f30323263382e3530332c372e3030352c32302e3231332c31332e3436332c33346104e08301527f2e3532342c31392e3135392c392e3939392c332e3939312c32312e3236392c376105008301527f2e3630392c33332e3539372c31302e3738382c33362e34352c392e3430372c386105208301527f322e3138312c31352e3030322c3133312e3833352c31352e3030327339352e336105408301527f36332d352e3539352c3133312e3830372d31352e3030326331302e3834372d326105608301527f2e37392c32302e3836372d352e3932362c32392e3932342d392e3334392c312e6105808301527f3234342d2e3436372c322e3437332d2e3934322c332e3637332d312e3432342c6105a08301527f31342e3332362d352e3639362c32362e3033352d31322e3136312c33342e35326105c08301527f342d31392e313733682e3032326331302e3131342d382e3334322c31352e36376105e08301527f372d31372e3433332c31352e3637372d32362e3936392c302d31372e3536322d6106008301527f31382e3836392d33332e3636352d35302e3232332d34362e3135222f3e3c70616106208301527f746820643d226d3133342e33362c3539322e373263302c33392e3733352c39366106408301527f2e3535342c37312e3932312c3231352e3635322c37312e393231733231352e366106608301527f32392d33322e3138362c3231352e3632392d37312e393231222f3e3c6c696e656106808301527f2078313d223133342e3336222079313d223539322e3732222078323d223133346106a08301527f2e3336222079323d223533382e373937222f3e3c6c696e652078313d223536356106c08301527f2e3634222079313d223539322e3732222078323d223536352e3634222079323d6106e08301527f223533382e373937222f3e3c706f6c796c696e6520706f696e74733d223438316107008301527f2e383232203438312e393031203438312e373938203438312e383737203438316107208301527f2e373735203438312e383534203335302e303135203335302e303236203231386107408301527f2e313835203231382e313239222f3e3c706f6c796c696e6520706f696e74733d6107608301527f223231382e313835203438312e393031203231382e323331203438312e3835346107808301527f203335302e303135203335302e303236203438312e383232203231382e3135326107a08301527f222f3e3c2f673e000000000000000000000000000000000000000000000000006107c0830152604051998a957f3c672069643d22486f7572676c617373223e00000000000000000000000000006020880152603295612df68151809260208a8c019101614826565b8701612e0b8251809360208a85019101614826565b01612e1f8251809360208985019101614826565b01612e338251809360208885019101614826565b01612e478251809360208785019101614826565b01918201520360168101865201846148df565b6040519e8f9788977f3c646566733e000000000000000000000000000000000000000000000000000060208a0152612e9f6026998260208c9451948593019101614826565b8901612eb48251809360208c85019101614826565b01612ec88251809360208b85019101614826565b01612edc8251809360208a85019101614826565b01612ef08251809360208985019101614826565b01612f048251809360208885019101614826565b01612f188251809360208785019101614826565b019182015203600d8101895201876148df565b6137be604c60e08301516101208401519361351a61314d6060604084015193015196612f578186615985565b9461314861012b604051612f6a816148c3565b600581527f2d3130302500000000000000000000000000000000000000000000000000000060208201526040519889917f3c74657874506174682073746172744f66667365743d220000000000000000006020840152612fd4815180926020603787019101614826565b7f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666683820160378101919091527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e00000000000000000061010982015282519261311891849161012090910190602001614826565b6a1e17ba32bc3a2830ba341f60a91b90830190910161012081019190915281900361010b810190915201876148df565b615985565b9561332c61012b604051613160816148c3565b600281527f30250000000000000000000000000000000000000000000000000000000000006020820152604051998a917f3c74657874506174682073746172744f66667365743d2200000000000000000060208401526131ca815180926020603787019101614826565b82017f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666660378201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e00000000000000000061010982015261330782518093602061012085019101614826565b016a1e17ba32bc3a2830ba341f60a91b6101208201520361010b81018a5201886148df565b61333681846159ed565b9261351561012b604051613349816148c3565b600481527f2d3530250000000000000000000000000000000000000000000000000000000060208201526040519687917f3c74657874506174682073746172744f66667365743d2200000000000000000060208401526133b3815180926020603787019101614826565b82017f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666660378201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e0000000000000000006101098201526134f082518093602061012085019101614826565b016a1e17ba32bc3a2830ba341f60a91b6101208201520361010b8101875201856148df565b6159ed565b906136f961012b60405161352d816148c3565b600381527f353025000000000000000000000000000000000000000000000000000000000060208201526040519485917f3c74657874506174682073746172744f66667365743d220000000000000000006020840152613597815180926020603787019101614826565b82017f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666660378201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e0000000000000000006101098201526136d482518093602061012085019101614826565b016a1e17ba32bc3a2830ba341f60a91b6101208201520361010b8101855201836148df565b6040519586937f3c7465787420746578742d72656e646572696e673d226f7074696d697a65537060208601527f656564223e000000000000000000000000000000000000000000000000000000604086015261375f815180926020604589019101614826565b8401613775825180936020604585019101614826565b0161378a825180936020604585019101614826565b0161379f825180936020604585019101614826565b01661e17ba32bc3a1f60c91b604582015203602c8101845201826148df565b613a9e61019a6101408401516101a0850151906137ff6137f96137f36137ed60e060408b01519a015194614b08565b94614b08565b97614b08565b91614b08565b956040519687937f3c75736520687265663d2223476c6f77222066696c6c2d6f7061636974793d2260208601527f2e39222f3e00000000000000000000000000000000000000000000000000000060408601527f3c75736520687265663d2223476c6f772220783d22313030302220793d22313060458601527f3030222066696c6c2d6f7061636974793d222e39222f3e00000000000000000060658601527f3c75736520687265663d22234c6f676f2220783d223137302220793d22313730607c8601527f22207472616e73666f726d3d227363616c65282e3629222f3e3c757365206872609c8601527f65663d2223486f7572676c6173732220783d223135302220793d22393022207460bc8601527f72616e73666f726d3d22726f746174652831302922207472616e73666f726d2d60dc8601527f6f726967696e3d2235303020353030222f3e000000000000000000000000000060fc8601527f3c75736520687265663d222350726f67726573732220783d220000000000000061010e8601526101279061399a815180926020858a019101614826565b8501937f2220793d22373930222f3e00000000000000000000000000000000000000000080948180948801527f3c75736520687265663d22235374617475732220783d2200000000000000000061013288015261014996613a048251809360208b85019101614826565b01958601527f3c75736520687265663d2223416d6f756e742220783d2200000000000000000061015486015261016b94613a478251809360208985019101614826565b01938401527f3c75736520687265663d22234475726174696f6e2220783d220000000000000061017684015261018f92613a8a8251809360208785019101614826565b01918201520361017a8101855201836148df565b6040519586937f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323060208601527f30302f737667222077696474683d223130303022206865696768743d2231303060408601527f30222076696577426f783d2230203020313030302031303030223e00000000006060860152613b2a815180926020607b89019101614826565b8401613b40825180936020607b85019101614826565b01613b55825180936020607b85019101614826565b01613b6a825180936020607b85019101614826565b017f3c2f7376673e0000000000000000000000000000000000000000000000000000607b8201520360618101845201826148df565b6101605260a051610100516040517fb971302a0000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa908115614305576000916142ba575b6142b661424f614154614245609487613d3b6089613c198a614c58565b9260c0608001516040519485927f5b7b2274726169745f74797065223a224173736574222c2276616c7565223a226020850152613c60815180926020604088019101614826565b8301907f227d2c7b2274726169745f74797065223a2253656e646572222c2276616c756560408301527f223a22000000000000000000000000000000000000000000000000000000000091826060820152613cc5825180936020606385019101614826565b01907f227d2c7b2274726169745f74797065223a22537461747573222c2276616c756560638301526083820152613d06825180936020608685019101614826565b017f227d5d000000000000000000000000000000000000000000000000000000000060868201520360698101845201826148df565b6101a05160a05161403e61017e613d53602435614b08565b9360a060800151613d6e6001600160a01b0360805116614c58565b90604051968793613f2b60208601987f54686973204e465420726570726573656e74732061207061796d656e742073748a527f7265616d20696e2061205361626c696572205632200000000000000000000000604088015282516020840190613ddb8160558b0184614826565b8801947f20636f6e74726163742e20546865206f776e6572206f662074686973204e465460558701527f2063616e207769746864726177207468652073747265616d656420617373657460758701527f732c207768696368206172652064656e6f6d696e6174656420696e2000000000609587015282516020840196613e658260b183018a614826565b017f2e5c6e5c6e2d2053747265616d2049443a20000000000000000000000000000060b1820152613ea082518093602060c385019101614826565b01613ed97f5c6e2d2000000000000000000000000000000000000000000000000000000000958660c384015251809360c7840190614826565b01947f20416464726573733a2000000000000000000000000000000000000000000000958660c7820152613f1782518093602060d185019101614826565b019260d184015251809360d5840190614826565b019060d5820152613f4682518093602060df85019101614826565b017f5c6e5c6e0000000000000000000000000000000000000000000000000000000060df8201527fe29aa0efb88f205741524e494e473a205472616e7366657272696e672074686560e38201527f204e4654206d616b657320746865206e6577206f776e657220746865207265636101038201527f697069656e74206f66207468652073747265616d2e205468652066756e6473206101238201527f617265206e6f74206175746f6d61746963616c6c792077697468647261776e206101438201527f666f72207468652070726576696f757320726563697069656e742e00000000006101638201520361015e8101855201836148df565b6101a051906141af614051602435614b08565b916140d0602d604051809560208201976a029b0b13634b2b9102b19160ad1b8952614086815180926020602b87019101614826565b82017f2023000000000000000000000000000000000000000000000000000000000000602b8201526140c18251809360208785019101614826565b0103600d8101865201846148df565b610160516140dd90614994565b94604051998a977f7b2261747472696275746573223a00000000000000000000000000000000000060208a015261411e815180926020602e8d019101614826565b8801917f2c226465736372697074696f6e223a2200000000000000000000000000000000602e840152518093603e840190614826565b01917f222c2265787465726e616c5f75726c223a2268747470733a2f2f7361626c6965603e8401527f722e636f6d222c226e616d65223a220000000000000000000000000000000000605e840152518093606d840190614826565b017f222c22696d616765223a22646174613a696d6167652f7376672b786d6c3b6261606d8201527f736536342c000000000000000000000000000000000000000000000000000000608d820152614210825180936020609285019101614826565b017f227d00000000000000000000000000000000000000000000000000000000000060928201520360748101845201826148df565b60e0819052614994565b6142a2603d60405180937f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000060208301526142928151809260208686019101614826565b810103601d8101845201826148df565b604051918291602083526020830190614849565b0390f35b90506020813d6020116142fd575b816142d5602093836148df565b810103126142f85751906001600160a01b03821682036142f85790614154613bfc565b600080fd5b3d91506142c8565b6040513d6000823e3d90fd5b634e487b7160e01b600052604160045260246000fd5b6040518061012081011067ffffffffffffffff6101208301111761431157610120810160405260f881527f3c7061746820643d226d3438312e34362c3530342e3130317635382e3434396360208201527f2d322e33352e37372d342e38322c312e35312d372e33392c322e32332d33302e60408201527f332c382e35342d37342e36352c31332e39322d3132342e30362c31332e39322d60608201527f35332e362c302d3130312e32342d362e33332d3133312e34372d31362e31367660808201527f2d35382e343339683236322e39325a222066696c6c3d2275726c282353616e6460a08201527f426f74746f6d29222f3e3c656c6c697073652063783d22333530222063793d2260c08201527f3530342e313031222072783d223133312e343632222072793d2232382e31303860e08201527f222066696c6c3d2275726c282353616e64546f7029222f3e0000000000000000610100820152996123df565b604051806101c081011067ffffffffffffffff6101c083011117614311576101c0810160405261019981527f3c706f6c79676f6e20706f696e74733d22333530203335302e3032362034313560208201527f2e3033203238342e39373820323835203238342e39373820333530203335302e60408201527f303236222066696c6c3d2275726c282353616e64426f74746f6d29222f3e3c7060608201527f61746820643d226d3431362e3334312c3238312e39373563302c2e3931342d2e60808201527f3335342c312e3830392d312e3033352c322e36382d352e3534322c372e30373660a08201527f2d33322e3636312c31322e34352d36352e32382c31322e34352d33322e36323460c08201527f2c302d35392e3733382d352e3337342d36352e32382d31322e34352d2e36383160e08201527f2d2e3837322d312e3033352d312e3736372d312e3033352d322e36382c302d2e6101008201527f3931342e3335342d312e3830382c312e3033352d322e3637362c352e3534322d6101208201527f372e3037362c33322e3635362d31322e34352c36352e32382d31322e34352c336101408201527f322e3631392c302c35392e3733382c352e3337342c36352e32382c31322e34356101608201527f2e3638312e3836372c312e3033352c312e3736322c312e3033352c322e3637366101808201527f5a222066696c6c3d2275726c282353616e64546f7029222f3e000000000000006101a082015299612192565b6146cf9198506146bb615850565b906020815191012090602081519101201490565b9638611d3a565b905093610d61565b905094610a32565b60d09461072c565b614710915060203d602011614716575b61470881836148df565b810190614929565b38610517565b503d6146fe565b614736915060203d6020116147165761470881836148df565b386104c1565b634e487b7160e01b600052601260045260246000fd5b614774915060203d60201161477a575b61476c81836148df565b810190614901565b3861023f565b503d614762565b506020813d6020116147b6575b8161479b602093836148df565b810103126142f8575160058110156142f8576101e5906101db565b3d915061478e565b6147d7915060203d60201161477a5761476c81836148df565b38610181565b90506020813d60201161481e575b816147f8602093836148df565b810103126142f857516001600160a01b03811681036142f8576001600160a01b03610100565b3d91506147eb565b60005b8381106148395750506000910152565b8181015183820152602001614829565b9060209161486281518092818552858086019101614826565b601f01601f1916010190565b610140810190811067ffffffffffffffff82111761431157604052565b6020810190811067ffffffffffffffff82111761431157604052565b6060810190811067ffffffffffffffff82111761431157604052565b6040810190811067ffffffffffffffff82111761431157604052565b90601f8019910116810190811067ffffffffffffffff82111761431157604052565b908160209103126142f857516fffffffffffffffffffffffffffffffff811681036142f85790565b908160209103126142f8575164ffffffffff811681036142f85790565b67ffffffffffffffff811161431157601f01601f191660200190565b9061496c82614946565b61497960405191826148df565b828152809261498a601f1991614946565b0190602036910137565b805115614af4576040516149a7816148a7565b604081527f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208201527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f60408201528151600292838201809211614ade5760038092047f3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81168103614ade57614a41908594951b614962565b936020850193829183518401925b838110614a8d5750505050510680600114614a7a57600214614a6f575090565b603d90600019015390565b50603d9081600019820153600119015390565b85600491979293949701918251600190603f9082828260121c16880101518453828282600c1c16880101518385015382828260061c1688010151888501531685010151878201530195929190614a4f565b634e487b7160e01b600052601160045260246000fd5b50604051614b018161488b565b6000815290565b806000917a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000080821015614c4a575b506d04ee2d6d415b85acef810000000080831015614c3b575b50662386f26fc1000080831015614c2c575b506305f5e10080831015614c1d575b5061271080831015614c0e575b506064821015614bfe575b600a80921015614bf4575b600190816021614b9f828701614962565b95860101905b614bb1575b5050505090565b600019019083907f30313233343536373839616263646566000000000000000000000000000000008282061a835304918215614bef57919082614ba5565b614baa565b9160010191614b8e565b9190606460029104910191614b83565b60049193920491019138614b78565b60089193920491019138614b6b565b60109193920491019138614b5c565b60209193920491019138614b4a565b604093508104915038614b31565b6001600160a01b031660405190614c6e826148a7565b602a8252602082016040368237825115614d8657603090538151600190811015614d8657607860218401536029905b808211614d0b575050614cad5790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602060248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b9091600f81166010811015614d71577f3031323334353637383961626364656600000000000000000000000000000000901a614d478486614d9c565b5360041c918015614d5c576000190190614c9d565b60246000634e487b7160e01b81526011600452fd5b60246000634e487b7160e01b81526032600452fd5b634e487b7160e01b600052603260045260246000fd5b908151811015614d86570160200190565b60405190614dba826148c3565b600482527f2667743b000000000000000000000000000000000000000000000000000000006020830152565b60405190614df3826148c3565b600482527f266c743b000000000000000000000000000000000000000000000000000000006020830152565b90614e87929493604051958692602094614e4181518092888089019101614826565b8401614e5582518093888085019101614826565b01614e6882518093878085019101614826565b01614e7b82518093868085019101614826565b010380855201836148df565b565b801561519a5760009180615175575090505b6001908082811015614f0857505050614eb2614de6565b614f05602260405183614ecf829551809260208086019101614826565b81017f203100000000000000000000000000000000000000000000000000000000000060208201520360028101845201826148df565b90565b66038d7ea4c6800011156151185760409081519060a0820182811067ffffffffffffffff82111761431157808452614f3f8161488b565b600081528252825190614f51826148c3565b8482526020917f4b0000000000000000000000000000000000000000000000000000000000000083820152828401528351614f8b816148c3565b8581527f4d0000000000000000000000000000000000000000000000000000000000000083820152848401528351614fc2816148c3565b8581527f42000000000000000000000000000000000000000000000000000000000000008382015260608401528351614ffa816148c3565b8581527f54000000000000000000000000000000000000000000000000000000000000008382015260808401526000918583965b6150ec575b50845194615040866148c3565b6007908187527f2623383830353b0000000000000000000000000000000000000000000000000083880152519560005b8281106150d957505050506150ba6150c0917f20000000000000000000000000000000000000000000000000000000000000006027870152600886526150b5866148c3565b614b08565b91615744565b916005851015614d8657614f059460051b015192614e1f565b8181018401518882018501528301615070565b9591926103e89081851061510f57508680916064600a870406950493019661502e565b93929650615033565b5050615122614dad565b614f0560286040518361513f829551809260208086019101614826565b81017f203939392e39395400000000000000000000000000000000000000000000000060208201520360088101845201826148df565b600a0a918215615186575004614e9b565b80634e487b7160e01b602492526012600452fd5b50506040516151a8816148c3565b600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b620151809103048061523d57506151ea614de6565b614f05602660405183615207829551809260208086019101614826565b81017f203120446179000000000000000000000000000000000000000000000000000060208201520360068101845201826148df565b61270f811161530c57600181036152c957614f056020615291604051615262816148c3565b600481527f20446179000000000000000000000000000000000000000000000000000000008382015293614b08565b60405193816152a98693518092868087019101614826565b82016152bd82518093868085019101614826565b010380845201826148df565b614f0560206152916040516152dd816148c3565b600581527f20446179730000000000000000000000000000000000000000000000000000008382015293614b08565b50615315614dad565b614f05602a60405183615332829551809260208086019101614826565b81017f2039393939204461797300000000000000000000000000000000000000000000602082015203600a8101845201826148df565b6020818303126142f85780519067ffffffffffffffff82116142f8570181601f820112156142f857805161539b81614946565b926153a960405194856148df565b818452602082840101116142f857614f059160208085019101614826565b6001600160a01b031660409081516395d89b4160e01b8152600081600481855afa9081156155a157600091615580575b5061545c8351615406816148c3565b601181527f5341422d56322d4c4f434b55502d4c494e0000000000000000000000000000006020918201528251908301207fc66b376a19264d832c1bc254000c18944ca5aa57ed50f4ea637c4da424d4c3bb1490565b1561549a5750505161546d816148c3565b600d81527f4c6f636b7570204c696e65617200000000000000000000000000000000000000602082015290565b6154fe83516154a8816148c3565b601181527f5341422d56322d4c4f434b55502d44594e0000000000000000000000000000006020918201528251908301207f6ab655856fa5352de8c05542b1937ac63c59342da992602767c02734cc5391651490565b1561553c5750505161550f816148c3565b600e81527f4c6f636b75702044796e616d6963000000000000000000000000000000000000602082015290565b61557c9083519384937f814a8a2e000000000000000000000000000000000000000000000000000000008552600485015260248401526044830190614849565b0390fd5b61559b913d8091833e61559381836148df565b810190615368565b386153f7565b83513d6000823e3d90fd5b3d156155d7573d906155bd82614946565b916155cb60405193846148df565b82523d6000602084013e565b606090565b60405160208101907f313ce56700000000000000000000000000000000000000000000000000000000825260048152615614816148c3565b6000928392839251915afa6156276155ac565b908061565e575b1561565a5760208180518101031261565657602001519060ff82168203615653575090565b80fd5b5080fd5b5090565b50602081511461562e565b6000809160405160208101906395d89b4160e01b82526004815261568c816148c3565b51915afa6156986155ac565b90158015615738575b6156fe57806020806156b893518301019101615368565b601e815111600014614f0557506040516156d1816148c3565b600b81527f4c6f6e672053796d626f6c000000000000000000000000000000000000000000602082015290565b5060405161570b816148c3565b600581527f4552433230000000000000000000000000000000000000000000000000000000602082015290565b506040815111156156a1565b806157565750604051614b018161488b565b600a8110156157bb5761576890614b08565b614f05602260405180937f2e3000000000000000000000000000000000000000000000000000000000000060208301526157ab8151809260208686019101614826565b81010360028101845201826148df565b6157c490614b08565b614f05602160405180937f2e0000000000000000000000000000000000000000000000000000000000000060208301526158078151809260208686019101614826565b81010360018101845201826148df565b60405190615824826148c3565b600782527f536574746c6564000000000000000000000000000000000000000000000000006020830152565b6040519061585d826148c3565b600882527f4465706c657465640000000000000000000000000000000000000000000000006020830152565b600581101561596f57600481036158a35750614f05615850565b600381036158e557506040516158b8816148c3565b600881527f43616e63656c6564000000000000000000000000000000000000000000000000602082015290565b6001810361592757506040516158fa816148c3565b600981527f53747265616d696e670000000000000000000000000000000000000000000000602082015290565b60020361593657614f05615817565b604051615942816148c3565b600781527f50656e64696e6700000000000000000000000000000000000000000000000000602082015290565b634e487b7160e01b600052602160045260246000fd5b6030614e879193929360405194816159a7879351809260208087019101614826565b820164010714051160dd1b60208201526a029b0b13634b2b9102b19160ad1b60258201526159de8251809360208785019101614826565b010360108101855201836148df565b6025614e87919392936040519481615a0f879351809260208087019101614826565b820164010714051160dd1b6020820152615a328251809360208785019101614826565b010360058101855201836148df565b60405190615a4e826148c3565b601082527f68736c283233302c3231252c31312529000000000000000000000000000000006020830152565b8015615cac57615a88615a41565b90612710908103908111614ade57614f0591615aa661013692614b08565b6040519485927f3c672066696c6c3d226e6f6e65223e000000000000000000000000000000000060208501527f3c636972636c652063783d22313636222063793d2235302220723d2232322220602f8501527f7374726f6b653d22000000000000000000000000000000000000000000000000604f850152615b32815180926020605788019101614826565b83017f22207374726f6b652d77696474683d223130222f3e000000000000000000000060578201527f3c636972636c652063783d22313636222063793d2235302220706174684c656e606c8201527f6774683d2231303030302220723d22323222207374726f6b653d220000000000608c820152615bba82518093602060a785019101614826565b017f22207374726f6b652d6461736861727261793d22313030303022207374726f6b60a78201527f652d646173686f66667365743d2200000000000000000000000000000000000060c7820152615c1b82518093602060d585019101614826565b017f22207374726f6b652d6c696e656361703d22726f756e6422207374726f6b652d60d58201527f77696474683d223522207472616e73666f726d3d22726f74617465282d39302960f58201527f22207472616e73666f726d2d6f726967696e3d22313636203530222f3e000000610115820152631e17b39f60e11b610132820152036101168101845201826148df565b5050604051614b018161488b565b60009080518015615d2f579060009182915b818310615cde57505050600d02900390565b909193603b60f81b7fff00000000000000000000000000000000000000000000000000000000000000615d118785614d9c565b511614615d27575b600d01936001019190615ccc565b849350615d19565b505050600090565b60009080518015615d2f579060009182915b818310615d5b5750505060041b900390565b909193603b60f81b7fff00000000000000000000000000000000000000000000000000000000000000615d8e8785614d9c565b511614615da4575b601001936001019190615d49565b849350615d9656"; From e5a227f77ededaf4d2737b36ed958445ad86eee9 Mon Sep 17 00:00:00 2001 From: Paul Razvan Berg Date: Sat, 28 Oct 2023 13:56:33 +0100 Subject: [PATCH 34/47] docs: add note about BTT --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 76437d1f3..edab54032 100644 --- a/README.md +++ b/README.md @@ -83,6 +83,11 @@ contract, which is more gas-efficient and easier to maintain. For more information, see the [Technical Overview](https://docs.sablier.com/contracts/v2/reference/overview) in our docs, as well as these [diagrams](https://docs.sablier.com/contracts/v2/reference/diagrams). +### Branching Tree Technique + +You may notice that some test files are accompanied by `.tree` files. This is called the Branching Tree Technique, and +it is explained in depth [here](https://github.com/sablier-labs/v2-core/wiki/Tests#branching-tree-technique). + ## Deployments The list of all deployment addresses can be found [here](https://docs.sablier.com). For guidance on the deploy scripts, From c103f0403cedd459ed232fa678c1b5c00d48aa62 Mon Sep 17 00:00:00 2001 From: Paul Razvan Berg Date: Thu, 16 Nov 2023 12:03:46 +0300 Subject: [PATCH 35/47] docs: add security assumption about ERC-777 --- SECURITY.md | 1 + 1 file changed, 1 insertion(+) diff --git a/SECURITY.md b/SECURITY.md index cd19a4eff..8ae591510 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -52,6 +52,7 @@ vulnerability, it must adhere to these assumptions as well: are not supported. - An address' ERC-20 balance can only change as a result of a `transfer` call by the sender or a `transferFrom` call by an approved address. This excludes rebase tokens and interest-bearing tokens. +- The token contract does not allow callbacks (e.g. ERC-777 is not supported). ### Rewards From 1def370c58efff250c33c4c0d750b02b7a803db2 Mon Sep 17 00:00:00 2001 From: andreivladbrg Date: Fri, 24 Nov 2023 14:38:14 +0200 Subject: [PATCH 36/47] chore: correct explanatory comment for cancel style: order alphabetically functions --- src/interfaces/ISablierV2Lockup.sol | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/interfaces/ISablierV2Lockup.sol b/src/interfaces/ISablierV2Lockup.sol index 3bb304a3c..15ab4f511 100644 --- a/src/interfaces/ISablierV2Lockup.sol +++ b/src/interfaces/ISablierV2Lockup.sol @@ -121,6 +121,11 @@ interface ISablierV2Lockup is /// @param streamId The stream id for the query. function isStream(uint256 streamId) external view returns (bool result); + /// @notice Retrieves a flag indicating whether the stream NFT can be transferred. + /// @dev Reverts if `streamId` references a null stream. + /// @param streamId The stream id for the query. + function isTransferable(uint256 streamId) external view returns (bool result); + /// @notice Retrieves a flag indicating whether the stream is warm, i.e. either pending or streaming. /// @dev Reverts if `streamId` references a null stream. /// @param streamId The stream id for the query. @@ -155,11 +160,6 @@ interface ISablierV2Lockup is /// @param streamId The stream id for the query. function withdrawableAmountOf(uint256 streamId) external view returns (uint128 withdrawableAmount); - /// @notice Retrieves a flag indicating whether the stream NFT can be transferred. - /// @dev Reverts if `streamId` references a null stream. - /// @param streamId The stream id for the query. - function isTransferable(uint256 streamId) external view returns (bool); - /*////////////////////////////////////////////////////////////////////////// NON-CONSTANT FUNCTIONS //////////////////////////////////////////////////////////////////////////*/ @@ -184,8 +184,7 @@ interface ISablierV2Lockup is /// Notes: /// - If there any assets left for the recipient to withdraw, the stream is marked as canceled. Otherwise, the /// stream is marked as depleted. - /// - This function attempts to invoke a hook on either the sender or the recipient, depending on who `msg.sender` - /// is, and if the resolved address is a contract. + /// - This function attempts to invoke a hook on the recipient, if the resolved address is a contract. /// /// Requirements: /// - Must not be delegate called. From d3025248310a126b34c9bdad6c8df307daa3eb5f Mon Sep 17 00:00:00 2001 From: Paul Razvan Berg Date: Tue, 28 Nov 2023 11:16:15 +0200 Subject: [PATCH 37/47] refactor: remove double r --- src/abstracts/SablierV2Lockup.sol | 2 +- src/libraries/Errors.sol | 2 +- .../concrete/lockup/is-transferable/isTransferable.t.sol | 2 +- .../concrete/lockup/transfer-from/transferFrom.t.sol | 2 +- .../withdraw-max-and-transfer/withdrawMaxAndTransfer.t.sol | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/abstracts/SablierV2Lockup.sol b/src/abstracts/SablierV2Lockup.sol index 9f326a37f..26fc5bf2e 100644 --- a/src/abstracts/SablierV2Lockup.sol +++ b/src/abstracts/SablierV2Lockup.sol @@ -387,7 +387,7 @@ abstract contract SablierV2Lockup is override { if (!isTransferable(streamId) && to != address(0) && from != address(0)) { - revert Errors.SablierV2Lockup_NotTransferrable(streamId); + revert Errors.SablierV2Lockup_NotTransferable(streamId); } } diff --git a/src/libraries/Errors.sol b/src/libraries/Errors.sol index 1631329f0..147cf9d1a 100644 --- a/src/libraries/Errors.sol +++ b/src/libraries/Errors.sol @@ -58,7 +58,7 @@ library Errors { error SablierV2Lockup_InvalidSenderWithdrawal(uint256 streamId, address sender, address to); /// @notice Thrown when trying to transfer Stream NFT when transferability is disabled. - error SablierV2Lockup_NotTransferrable(uint256 tokenId); + error SablierV2Lockup_NotTransferable(uint256 tokenId); /// @notice Thrown when the id references a null stream. error SablierV2Lockup_Null(uint256 streamId); diff --git a/test/integration/concrete/lockup/is-transferable/isTransferable.t.sol b/test/integration/concrete/lockup/is-transferable/isTransferable.t.sol index 53652859c..e36599786 100644 --- a/test/integration/concrete/lockup/is-transferable/isTransferable.t.sol +++ b/test/integration/concrete/lockup/is-transferable/isTransferable.t.sol @@ -32,7 +32,7 @@ abstract contract IsTransferable_Integration_Concrete_Test is Integration_Test, _; } - function test_IsTransferrable_Stream() external givenNotNull givenStreamTransferable { + function test_IsTransferable_Stream() external givenNotNull givenStreamTransferable { bool isTransferable = lockup.isTransferable(defaultStreamId); assertTrue(isTransferable, "isTransferable"); } diff --git a/test/integration/concrete/lockup/transfer-from/transferFrom.t.sol b/test/integration/concrete/lockup/transfer-from/transferFrom.t.sol index 21538c4a1..648ee00ce 100644 --- a/test/integration/concrete/lockup/transfer-from/transferFrom.t.sol +++ b/test/integration/concrete/lockup/transfer-from/transferFrom.t.sol @@ -14,7 +14,7 @@ abstract contract TransferFrom_Integration_Concrete_Test is Integration_Test, Lo function test_RevertGiven_StreamNotTransferable() external { uint256 notTransferableStreamId = createDefaultStreamNotTransferable(); vm.expectRevert( - abi.encodeWithSelector(Errors.SablierV2Lockup_NotTransferrable.selector, notTransferableStreamId) + abi.encodeWithSelector(Errors.SablierV2Lockup_NotTransferable.selector, notTransferableStreamId) ); lockup.transferFrom({ from: users.recipient, to: users.alice, tokenId: notTransferableStreamId }); } diff --git a/test/integration/concrete/lockup/withdraw-max-and-transfer/withdrawMaxAndTransfer.t.sol b/test/integration/concrete/lockup/withdraw-max-and-transfer/withdrawMaxAndTransfer.t.sol index 5d2faa48d..86bddab4f 100644 --- a/test/integration/concrete/lockup/withdraw-max-and-transfer/withdrawMaxAndTransfer.t.sol +++ b/test/integration/concrete/lockup/withdraw-max-and-transfer/withdrawMaxAndTransfer.t.sol @@ -75,7 +75,7 @@ abstract contract WithdrawMaxAndTransfer_Integration_Concrete_Test is { uint256 notTransferableStreamId = createDefaultStreamNotTransferable(); vm.expectRevert( - abi.encodeWithSelector(Errors.SablierV2Lockup_NotTransferrable.selector, notTransferableStreamId) + abi.encodeWithSelector(Errors.SablierV2Lockup_NotTransferable.selector, notTransferableStreamId) ); lockup.withdrawMaxAndTransfer({ streamId: notTransferableStreamId, newRecipient: users.recipient }); } From bd2bc9e3ba00c3b55cf6bcb7c68e67029ff1e9b2 Mon Sep 17 00:00:00 2001 From: Andrei Vlad Birgaoanu <99738872+andreivladbrg@users.noreply.github.com> Date: Tue, 28 Nov 2023 15:54:46 +0200 Subject: [PATCH 38/47] Update metadata before hook in cancel function (#727) * fix: update metadata before hook in cancel * test: update Precompiles bytecode * chore: improve explanatory comment in dynamic contract * chore: simplify comments * test: update Precompiles bytecode --------- Co-authored-by: Paul Razvan Berg --- src/SablierV2LockupDynamic.sol | 3 +++ src/SablierV2LockupLinear.sol | 3 +++ src/abstracts/SablierV2Lockup.sol | 2 +- test/utils/Precompiles.sol | 4 ++-- 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/SablierV2LockupDynamic.sol b/src/SablierV2LockupDynamic.sol index 329b3a439..e8a15a4cb 100644 --- a/src/SablierV2LockupDynamic.sol +++ b/src/SablierV2LockupDynamic.sol @@ -515,6 +515,9 @@ contract SablierV2LockupDynamic is // Log the cancellation. emit ISablierV2Lockup.CancelLockupStream(streamId, sender, recipient, asset, senderAmount, recipientAmount); + // Emits an ERC-4906 event to trigger an update of the NFT metadata. + emit MetadataUpdate({ _tokenId: streamId }); + // Interactions: if the recipient is a contract, try to invoke the cancel hook on the recipient without // reverting if the hook is not implemented, and without bubbling up any potential revert. if (recipient.code.length > 0) { diff --git a/src/SablierV2LockupLinear.sol b/src/SablierV2LockupLinear.sol index e2d5ef584..1f0c4da75 100644 --- a/src/SablierV2LockupLinear.sol +++ b/src/SablierV2LockupLinear.sol @@ -430,6 +430,9 @@ contract SablierV2LockupLinear is // Log the cancellation. emit ISablierV2Lockup.CancelLockupStream(streamId, sender, recipient, asset, senderAmount, recipientAmount); + // Emits an ERC-4906 event to trigger an update of the NFT metadata. + emit MetadataUpdate({ _tokenId: streamId }); + // Interactions: if the recipient is a contract, try to invoke the cancel hook on the recipient without // reverting if the hook is not implemented, and without bubbling up any potential revert. if (recipient.code.length > 0) { diff --git a/src/abstracts/SablierV2Lockup.sol b/src/abstracts/SablierV2Lockup.sol index 26fc5bf2e..a99f99a9c 100644 --- a/src/abstracts/SablierV2Lockup.sol +++ b/src/abstracts/SablierV2Lockup.sol @@ -150,7 +150,7 @@ abstract contract SablierV2Lockup is } /// @inheritdoc ISablierV2Lockup - function cancel(uint256 streamId) public override noDelegateCall updateMetadata(streamId) { + function cancel(uint256 streamId) public override noDelegateCall { // Checks: the stream is neither depleted nor canceled. This also checks that the stream is not null. if (isDepleted(streamId)) { revert Errors.SablierV2Lockup_StreamDepleted(streamId); diff --git a/test/utils/Precompiles.sol b/test/utils/Precompiles.sol index c3f9e3efd..dbfbccdff 100644 --- a/test/utils/Precompiles.sol +++ b/test/utils/Precompiles.sol @@ -27,9 +27,9 @@ contract Precompiles { bytes public constant BYTECODE_COMPTROLLER = hex"60803461009857601f6104a638819003918201601f19168301916001600160401b0383118484101761009d5780849260209460405283398101031261009857516001600160a01b0381169081900361009857600080546001600160a01b0319168217815560405191907fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a36103f290816100b48239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe608060408181526004918236101561001657600080fd5b600092833560e01c9182634d81e51d1461039d5750816375829def146102e5578163907a267b14610253578163b5b3ca2c146101ab578163cb01e30e146100f957508063dcf844a7146100c3578063e07df5b4146100a55763f851a4401461007d57600080fd5b346100a157816003193601126100a1576001600160a01b0360209254169051908152f35b5080fd5b50346100a157816003193601126100a1576020906001549051908152f35b50346100a15760203660031901126100a157806020926001600160a01b036100e96103d7565b1681526003845220549051908152f35b9050346101a75760203660031901126101a7576101146103d7565b6001600160a01b03918285541633810361017a575050169081835260026020528083209081549160ff8316159260ff84169060ff1916179055519081527f8cd3a7bc46b26a3b0c07a05a47af78abcaa647626f631d92ea64f8867b23bbec60203392a380f35b84516331b339a960e21b81526001600160a01b039091169181019182523360208301529081906040010390fd5b8280fd5b9050346101a757816003193601126101a7576101c56103d7565b90602435916001600160a01b039182865416338103610226575050907f371789a3d97098f3070492613273a065a7e8a19e009fd1ae92a4b4d4c71ed62d9116928385526003602052808520928084549455815193845260208401523392a380f35b85516331b339a960e21b81526001600160a01b039091169181019182523360208301529081906040010390fd5b919050346101a75760203660031901126101a7578135916001600160a01b038454163381036102b85750507fc059ba3e07a1c4d1fa8845bdb2af2dd85e844684e0a59e6073499e4338788465906001549280600155815193845260208401523392a280f35b82516331b339a960e21b81526001600160a01b039091169181019182523360208301529081906040010390fd5b919050346101a75760203660031901126101a7578135916001600160a01b03918284168094036103995784549283169033820361036d575050507fffffffffffffffffffffffff00000000000000000000000000000000000000001681178255337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808380a380f35b516331b339a960e21b81526001600160a01b039091169181019182523360208301529081906040010390fd5b8480fd5b849084346101a75760203660031901126101a75760ff906020936001600160a01b036103c76103d7565b1681526002855220541615158152f35b600435906001600160a01b03821682036103ed57565b600080fd"; bytes public constant BYTECODE_LOCKUP_DYNAMIC = - hex"60c0346200046e57601f62005d1238819003918201601f19168301916001600160401b038311848410176200032b578084926080946040528339810103126200046e5780516001600160a01b038082169290918390036200046e5760208101518281168091036200046e5760408201519183831683036200046e5760600151936200008962000473565b90601d82527f5361626c696572205632204c6f636b75702044796e616d6963204e46540000006020830152620000be62000473565b601181527029a0a116ab1916a627a1a5aaa816a22ca760791b602082015230608052600080546001600160a01b03199081168417825560018054909116909517909455927fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a38051906001600160401b0382116200032b5760035490600182811c9216801562000463575b60208310146200044d5781601f849311620003d8575b50602090601f83116001146200034d5760009262000341575b50508160011b916000199060031b1c1916176003555b80516001600160401b0381116200032b576004918254600181811c9116801562000320575b60208210146200030b579081601f849311620002b3575b50602090601f831160011462000248576000926200023c575b50508160011b916000199060031b1c19161790555b1660018060a01b0319600a541617600a5560a052600160095560405161587e908162000494823960805181615307015260a05181818161126b01526148670152f35b015190503880620001e5565b6000858152602081209350601f198516905b8181106200029a575090846001959493921062000280575b505050811b019055620001fa565b015160001960f88460031b161c1916905538808062000272565b929360206001819287860151815501950193016200025a565b909150836000526020600020601f840160051c8101916020851062000300575b90601f859493920160051c01905b818110620002f05750620001cc565b60008155849350600101620002e1565b9091508190620002d3565b602284634e487b7160e01b6000525260246000fd5b90607f1690620001b5565b634e487b7160e01b600052604160045260246000fd5b0151905038806200017a565b600360009081527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b9350601f198516905b818110620003bf5750908460019594939210620003a5575b505050811b0160035562000190565b015160001960f88460031b161c1916905538808062000396565b929360206001819287860151815501950193016200037e565b60036000529091507fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f840160051c8101916020851062000442575b90601f859493920160051c01905b81811062000432575062000161565b6000815584935060010162000423565b909150819062000415565b634e487b7160e01b600052602260045260246000fd5b91607f16916200014b565b600080fd5b60408051919082016001600160401b038111838210176200032b5760405256fe608080604052600436101561001357600080fd5b60003560e01c90816301ffc9a71461296b5750806306fdde03146128a8578063081812fc1461288a578063095ea7b3146126f65780631400ecec1461265157806316844456146123d65780631c1cdd4c146123705780631e99d5691461235257806323b872dd1461232957806339a73c03146122e657806340e58ee51461208e578063425d30dd1461207057806342842e0e1461202057806342966c6814611ea25780634857501f14611e2c5780634869e12d14611df05780635fe3b56714611dc95780636352211e14611d9a5780636d0cee7514611d4257806370a0823114611c9857806375829def14611c065780637cad6cd114611b345780637de6b1db1461195f5780638659c2701461164d578063894e9a0d146113e05780638bad38dd146113645780638f69b993146112e15780639067b6771461128e5780639188ec841461125357806395d89b4114611145578063a22cb46514611074578063a2ffb89714610f7b578063a6202bf214610e7b578063a80fc07114610e26578063ad35efd414610dc3578063b256456914610da5578063b637b86514610d45578063b88d4fde14610cba578063b8a3be6614610c83578063b971302a14610c31578063bc063e1a14610c0e578063bc2be1be14610bbb578063c156a11d14610acd578063c33cd35e146109b8578063c87b56dd14610885578063cc364f48146107eb578063d4dbd20b14610796578063d511609f14610747578063d975dfed146106fa578063e985e9c5146106a3578063ea5ead1914610652578063eac8f5b8146105e6578063f590c176146105be578063f851a440146105975763fdd46d601461027c57600080fd5b3461048057606036600319011261048057600435610298612a98565b604435916001600160801b039182841693848103610480576102b86152fd565b6102c183613386565b61057f576102e583600052600b6020526001600160a01b0360406000205416331490565b9182158061056f575b6105505783600052602094600586526001600160a01b039081604060002054169480610544575b61051e5781831693841561050d5788156104f557610332876153bf565b8281168a116104c1575091889161038e6103626103cb958a600052600b8c5260026040600020015460801c61568e565b89600052600b8b52600260406000200190836001600160801b031983549260801b16911617815561331b565b906103aa818b84015116928260408183511692015116906133bd565b16111561048f575b86600052600b8852600160406000200154169283615359565b81847f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d876040518a8152a48133141580610485575b61041f575b6000805160206158528339815191528484604051908152a1005b813b15610480576000805160206158528339815191529460846000928360405195869485936313375c3b60e01b8552896004860152336024860152604485015260648401525af1610471575b80610405565b61047a90612c0b565b3861046b565b600080fd5b50813b1515610400565b86600052600b8852604060002060018101600160a01b60ff60a01b1982541617905560ff60f01b1981541690556103b2565b60405163287ecaef60e21b8152600481018990526001600160801b03928316602482015291166044820152606490fd5b0390fd5b6024876040519063d2aabcd960e01b82526004820152fd5b600460405163630d074f60e11b8152fd5b606486838560405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b50848284161415610315565b60405163216caf0d60e01b815260048101859052336024820152604490fd5b50610579846156a9565b156102ee565b60248360405190634a5541ef60e01b82526004820152fd5b346104805760003660031901126104805760206001600160a01b0360005416604051908152f35b346104805760203660031901126104805760206105dc6004356133d6565b6040519015158152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260206001600160a01b0360016040600020015416604051908152f35b6024906040519062b8e7e760e51b82526004820152fd5b3461048057604036600319011261048057600080516020615852833981519152602060043561069a610682612a98565b61068b836153bf565b906106946152fd565b836153f7565b604051908152a1005b34610480576040366003190112610480576106bc612a82565b6106c4612a98565b906001600160a01b03809116600052600860205260406000209116600052602052602060ff604060002054166040519015158152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b576107366020916153bf565b6001600160801b0360405191168152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b602052602060026040600020015460801c604051908152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260206001600160801b0360036040600020015416604051908152f35b34610480576020366003190112610480576004356000602060405161080f81612bd2565b828152015280600052600b60205260ff60016040600020015460a81c161561063b57600052600b6020526040806000205464ffffffffff82519161085283612bd2565b818160a01c16835260c81c166020820152610883825180926020908164ffffffffff91828151168552015116910152565bf35b346104805760208060031936011261048057600435906108c36108be8360005260056020526001600160a01b0360406000205416151590565b612c71565b60006001600160a01b03600a5416926044604051809581937fe9dc637500000000000000000000000000000000000000000000000000000000835230600484015260248301525afa9182156109ac57600092610933575b5061092f604051928284938452830190612a5d565b0390f35b9091503d806000833e6109468183612c1f565b81019082818303126104805780519067ffffffffffffffff8211610480570181601f8201121561048057805161097b81612c41565b926109896040519485612c1f565b818452848284010111610480576109a591848085019101612a3a565b908261091a565b6040513d6000823e3d90fd5b3461048057600319602036820112610480576004359067ffffffffffffffff9081831161048057610140908336030112610480576109f46152fd565b60405191610a0183612bb5565b610a0d81600401612aae565b8352610a1b60248201613407565b6020840152610a2c60448201612b8c565b6040840152610a3d60648201612b8c565b6060840152610a4e60848201612aae565b6080840152610a5f60a48201612c5d565b60a0840152610a7060c48201612aae565b60c0840152610a823660e483016134ed565b60e084015261012481013591821161048057013660238201121561048057602091610aba610ac5923690602460048201359101613419565b6101008201526147b9565b604051908152f35b3461048057604036600319011261048057600435610ae9612a98565b610af16152fd565b81600052600b60205260ff60016040600020015460a81c1615610ba4578160005260056020526001600160a01b0360406000205416803303610b85579161069a8160209360008051602061585283398151915295610b4e836153bf565b6001600160801b038116610b63575b50612f04565b610b7690610b6f6152fd565b82856153f7565b8686604051858152a187610b5d565b60405163216caf0d60e01b815260048101849052336024820152604490fd5b6024826040519062b8e7e760e51b82526004820152fd5b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b602052602064ffffffffff60406000205460a01c16604051908152f35b3461048057600036600319011261048057602060405167016345785d8a00008152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260206001600160a01b0360406000205416604051908152f35b3461048057602036600319011261048057600435600052600b602052602060ff60016040600020015460a81c166040519015158152f35b3461048057608036600319011261048057610cd3612a82565b610cdb612a98565b6064359167ffffffffffffffff8311610480573660238401121561048057826004013591610d0883612c41565b92610d166040519485612c1f565b8084523660248287010111610480576020816000926024610d439801838801378501015260443591612d8f565b005b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205261092f610d91600460406000200161326e565b604051918291602083526020830190612b28565b346104805760203660031901126104805760206105dc60043561334f565b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57610dfd906146bd565b6040516005821015610e10576020918152f35b634e487b7160e01b600052602160045260246000fd5b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260206001600160801b0360026040600020015416604051908152f35b3461048057602036600319011261048057610e94612a82565b6001600160a01b038060005416338103610f5257508116908160005260026020526001600160801b0360406000205416908115610f215781610ef39184600052600260205260406000206001600160801b031981541690553390615359565b6040519081527fca7a4a65a94ed2f37538814e00e1cd4c41a78261561e3f3794592f11409cf5af60203392a3005b602483604051907f8410168c0000000000000000000000000000000000000000000000000000000082526004820152fd5b6040516331b339a960e21b81526001600160a01b03919091166004820152336024820152604490fd5b346104805760603660031901126104805767ffffffffffffffff60043581811161048057610fad903690600401612af7565b610fb5612a98565b9260443590811161048057610fce903690600401612af7565b9190610fd86152fd565b82820361103d5760005b828110610feb57005b80600080516020615852833981519152602061100a600194878a6153e7565b3561103061102161101c868b8a6153e7565b6134d9565b6110296152fd565b8b836153f7565b604051908152a101610fe2565b50604491604051917faec9344000000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b346104805760403660031901126104805761108d612a82565b60243590811515809203610480576001600160a01b03169081331461110157336000526008602052604060002082600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a3005b606460405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152fd5b3461048057600036600319011261048057604051600060045490600182811c91818416918215611249575b60209485851084146112335785879486865291826000146112135750506001146111b6575b506111a292500383612c1f565b61092f604051928284938452830190612a5d565b84915060046000527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b906000915b8583106111fb5750506111a2935082010185611195565b805483890185015287945086939092019181016111e4565b60ff1916858201526111a295151560051b85010192508791506111959050565b634e487b7160e01b600052602260045260246000fd5b92607f1692611170565b346104805760003660031901126104805760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b602052602064ffffffffff60406000205460c81c16604051908152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b5761131b906146bd565b600581101580610e105760028214908115611357575b8115611345575b6020826040519015158152f35b9050610e105760046020911482611338565b5050600381146000611331565b34610480576020366003190112610480576004356001600160a01b0390818116809103610480578160005416338103610f52575060015491816001600160a01b03198416176001556040519216825260208201527fdcb09aef4bf01068924ccce937981cbe59d25ba08380cf941aaaea4e4bd3960d60403392a2005b3461048057602036600319011261048057606061014060405161140281612bee565b60008152600060208201526000604082015260008382015260006080820152600060a0820152600060c0820152600060e082015260006101008201526114466132fc565b6101208201520152600435600052600b60205260ff60016040600020015460a81c161561163557600435600052600b602052604060002061152960046040519261148f84612bee565b80546001600160a01b038116855264ffffffffff8160a01c16602086015264ffffffffff8160c81c16604086015260ff8160f01c161515606086015260f81c1515608085015260ff60018201546001600160a01b03811660a0870152818160a01c16151560c0870152818160a81c16151560e087015260b01c16151561010085015261151d6002820161331b565b6101208501520161326e565b61014082015261153a6004356146bd565b906005821015610e105760026101409214611629575b61092f604051928392602084526001600160a01b03815116602085015264ffffffffff602082015116604085015264ffffffffff60408201511660608501526060810151151560808501526080810151151560a08501526001600160a01b0360a08201511660c085015260c0810151151560e085015260e08101511515610100850152610100810151151561012085015261161561012082015183860190604090816001600160801b0391828151168552826020820151166020860152015116910152565b01516101a0808401526101c0830190612b28565b60006060820152611550565b602460405162b8e7e760e51b81526004356004820152fd5b34610480576020806003193601126104805760043567ffffffffffffffff81116104805761167f903690600401612af7565b906116886152fd565b6000915b80831061169557005b6116a08382846153e7565b35926116aa6152fd565b6116b384613386565b156116d05760248460405190634a5541ef60e01b82526004820152fd5b6116dc849293946133d6565b6119475761170082600052600b6020526001600160a01b0360406000205416331490565b156119285761170e8261351c565b82600052600b92838752611728600260406000200161331b565b936001600160801b0392838651168482161015611910578260005281895260ff60406000205460f01c16156118f8579061177782858b61176d819796838c51166133bd565b99015116906133bd565b9082600052808452604060002090815497600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8a1617835560038785169384156118de575b0196811696876001600160801b03198254161790556001600160a01b038099169160058752827f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa508b604060002054169687938a5260019c8d60406000200154169461182a8c8588615359565b604080518b81526001600160801b0392831660208201529290911690820152606090a4823b611877575b5050506000805160206158528339815191529250604051908152a101919061168c565b90918094503b1561048057600080516020615852833981519152946084600092838d9760405196879586946372eba20360e01b86528a60048701526024860152604485015260648401525af16118cf575b8080611854565b6118d890612c0b565b886118c8565b60018101600160a01b60ff60a01b198254161790556117be565b602483604051906339c6dc7360e21b82526004820152fd5b602483604051906322cad1af60e11b82526004820152fd5b60405163216caf0d60e01b815260048101839052336024820152604490fd5b6024826040519063fe19f19f60e01b82526004820152fd5b3461048057602080600319360112610480576004359061197d6152fd565b81600052600b815260ff60016040600020015460a81c1615610ba4576119a2826146bd565b6005811015610e1057600481036119cb5760248360405190634a5541ef60e01b82526004820152fd5b600381036119eb576024836040519063fe19f19f60e01b82526004820152fd5b600214611b1c57611a1282600052600b6020526001600160a01b0360406000205416331490565b156119285781600052600b815260ff60406000205460f01c1615611b045781600052600b8152604060002060ff60f01b19815416905560405191807f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f600080a2600582526001600160a01b036040600020541692833b611aa7575b6000805160206158528339815191528383604051908152a1005b833b156104805760008160248183600080516020615852833981519152987f341a0bd90000000000000000000000000000000000000000000000000000000083528760048401525af115611a8d57611afe90612c0b565b83611a8d565b602482604051906339c6dc7360e21b82526004820152fd5b602482604051906322cad1af60e11b82526004820152fd5b34610480576020366003190112610480576004356001600160a01b0390818116809103610480578160005416338103610f525750600a5491816001600160a01b0319841617600a556040519216825260208201527fa2548bd4b805e907c1558a47b5858324fe8bb4a2e1ddfca647eecbf65610eebc60403392a26009546000198101908111611bf05760407f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c91815190600182526020820152a1005b634e487b7160e01b600052601160045260246000fd5b3461048057602036600319011261048057611c1f612a82565b6000546001600160a01b0380821692338403611c71576001600160a01b03199350169182911617600055337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf80600080a3005b6040516331b339a960e21b81526001600160a01b0385166004820152336024820152604490fd5b34610480576020366003190112610480576001600160a01b03611cb9612a82565b168015611cd85760005260066020526020604060002054604051908152f35b608460405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e657200000000000000000000000000000000000000000000006064820152fd5b3461048057602036600319011261048057600435611d796108be8260005260056020526001600160a01b0360406000205416151590565b600052600560205260206001600160a01b0360406000205416604051908152f35b34610480576020366003190112610480576020611db8600435612cbc565b6001600160a01b0360405191168152f35b346104805760003660031901126104805760206001600160a01b0360015416604051908152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b5761073660209161473e565b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b576000611e68826146bd565b6005811015610e1057600203611e86575b6020906040519015158152f35b50600052600b602052602060ff60406000205460f01c16611e79565b3461048057602036600319011261048057600435611ebe6152fd565b611ec781613386565b15611fef57611ed5816156a9565b15611fcf57611ee381612cbc565b611eec8261334f565b159081611fc6575b81611fb3575b50611f9b57602081611f1a60008051602061585283398151915293612cbc565b9080600052600783526001600160a01b036040600020926001600160a01b031993848154169055169182600052600684526040600020600019815401905581600052600584526040600020908154169055806000604051937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a48152a1005b602490604051906378630aa960e01b82526004820152fd5b6001600160a01b03915016151582611efa565b60009150611ef4565b60405163216caf0d60e01b81526004810191909152336024820152604490fd5b602490604051907f817cd6390000000000000000000000000000000000000000000000000000000082526004820152fd5b346104805761202e36612ac2565b60405191602083019383851067ffffffffffffffff86111761205a57610d439460405260008452612d8f565b634e487b7160e01b600052604160045260246000fd5b346104805760203660031901126104805760206105dc600435613386565b346104805760208060031936011261048057600435906120ac6152fd565b6120b582613386565b156120d25760248260405190634a5541ef60e01b82526004820152fd5b6120db826133d6565b611947576120ff82600052600b6020526001600160a01b0360406000205416331490565b156119285761210d8261351c565b9180600052600b8252612126600260406000200161331b565b926001600160801b03908185511682821610156119105782600052600b845260ff60406000205460f01c16156118f85780828561216961217394838a51166133bd565b97015116906133bd565b9382600052600b8452604060002091825491600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841617845560038288169485156122cc575b0191811691826001600160801b03198254161790556001600160a01b038093169260058752837f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa508260406000205416998a93600b8b526001604060002001541694612227878588615359565b604080518b81526001600160801b0392831660208201529290911690820152606090a4853b61226b575b6000805160206158528339815191528585604051908152a1005b853b15610480576084600092836000805160206158528339815191529860405196879586946372eba20360e01b86528a60048701526024860152604485015260648401525af16122bd575b8080612251565b6122c690612c0b565b836122b6565b60018101600160a01b60ff60a01b198254161790556121bb565b34610480576020366003190112610480576001600160a01b03612307612a82565b16600052600260205260206001600160801b0360406000205416604051908152f35b3461048057610d4361233a36612ac2565b9161234d6123488433612e25565b612d1e565b612f04565b34610480576000366003190112610480576020600954604051908152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b576123aa906146bd565b6005811015610e105780602091159081156123cb575b506040519015158152f35b6001915014826123c0565b346104805760206003198181360112610480576004359067ffffffffffffffff908183116104805761012083360391820112610480576124146152fd565b61010483013590602219018112156104805782016004810135908282116104805760240160608202360381136104805761244f913691613419565b9182519061245c82613256565b9161246a6040519384612c1f565b808352601f1961247982613256565b018660005b82811061263b5750505064ffffffffff90814216946001600160801b0396876124a682613587565b515116828a6124b484613587565b51015116858060406124c586613587565b510151168a011690604051926124da84612b99565b83528b83015260408201526124ee87613587565b526124f886613587565b5060019386855b8a8c8783106125ba57908b846001600160a01b038c60a48101358281169081900361048057610ac59561257a956125aa9461253c602486016134b8565b612548604487016134b8565b612554606488016134c5565b91612561886004016134c5565b948461256f60848b016134d9565b966040519d8e612bb5565b168c528d8c0152151560408b0152151560608a01521660808801521660a086015260c085015260c43691016134ed565b60e08301526101008201526147b9565b8893858060406125ee8b866125de8a8e9a6125d5828d6135aa565b5151169a6135aa565b51015116946000198901906135aa565b510151168160406125ff888c6135aa565b510151160116916040519361261385612b99565b84528301526040820152612627828b6135aa565b52612632818a6135aa565b500187906124ff565b6126436132fc565b82828801015201879061247e565b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b5760209060009080600052600b8352604060002060ff815460f01c16806126e4575b6126bb575b50506001600160801b0360405191168152f35b6126dd92506001600160801b0360026126d7920154169161351c565b906133bd565b82806126a8565b5060ff600182015460a01c16156126a3565b346104805760403660031901126104805761270f612a82565b602435906001600160a01b03808061272685612cbc565b16921691808314612820578033149081156127fb575b5015612791578260005260076020526040600020826001600160a01b031982541617905561276983612cbc565b167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b608460405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152fd5b9050600052600860205260406000203360005260205260ff604060002054168461273c565b608460405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152fd5b34610480576020366003190112610480576020611db8600435612ce1565b3461048057600036600319011261048057604051600060035490600182811c91818416918215612961575b602094858510841461123357858794868652918260001461121357505060011461290457506111a292500383612c1f565b84915060036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b906000915b8583106129495750506111a2935082010185611195565b80548389018501528794508693909201918101612932565b92607f16926128d3565b3461048057602036600319011261048057600435907fffffffff00000000000000000000000000000000000000000000000000000000821680920361048057817f80ac58cd0000000000000000000000000000000000000000000000000000000060209314908115612a10575b81156129e6575b5015158152f35b7f01ffc9a700000000000000000000000000000000000000000000000000000000915014836129df565b7f5b5e139f00000000000000000000000000000000000000000000000000000000811491506129d8565b60005b838110612a4d5750506000910152565b8181015183820152602001612a3d565b90602091612a7681518092818552858086019101612a3a565b601f01601f1916010190565b600435906001600160a01b038216820361048057565b602435906001600160a01b038216820361048057565b35906001600160a01b038216820361048057565b6060906003190112610480576001600160a01b0390600435828116810361048057916024359081168103610480579060443590565b9181601f840112156104805782359167ffffffffffffffff8311610480576020808501948460051b01011161048057565b90815180825260208080930193019160005b828110612b48575050505090565b835180516001600160801b031686528083015167ffffffffffffffff168684015260409081015164ffffffffff169086015260609094019392810192600101612b3a565b3590811515820361048057565b6060810190811067ffffffffffffffff82111761205a57604052565b610120810190811067ffffffffffffffff82111761205a57604052565b6040810190811067ffffffffffffffff82111761205a57604052565b610160810190811067ffffffffffffffff82111761205a57604052565b67ffffffffffffffff811161205a57604052565b90601f8019910116810190811067ffffffffffffffff82111761205a57604052565b67ffffffffffffffff811161205a57601f01601f191660200190565b35906001600160801b038216820361048057565b15612c7857565b606460405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152fd5b60005260056020526001600160a01b0360406000205416612cde811515612c71565b90565b612d046108be8260005260056020526001600160a01b0360406000205416151590565b60005260076020526001600160a01b036040600020541690565b15612d2557565b608460405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f766564000000000000000000000000000000000000006064820152fd5b90612db3939291612da36123488433612e25565b612dae838383612f04565b6130bd565b15612dba57565b60405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b906001600160a01b038080612e3984612cbc565b16931691838314938415612e6c575b508315612e56575b50505090565b612e6291929350612ce1565b1614388080612e50565b909350600052600860205260406000208260005260205260ff604060002054169238612e48565b15612e9a57565b608460405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152fd5b90612f2d9291612f1383612cbc565b916001600160a01b03948593848094169687911614612e93565b169081158061302457612f3f8461334f565b15908161301b575b5080613012575b612ffa5791808492612f7c60008051602061585283398151915296602096612f7585612cbc565b1614612e93565b60009382855260078652604085206001600160a01b031990818154169055818652600687526040862060001981540190558286526040862060018154019055838652600587528260408720918254161790557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6040519580a48152a1565b602483604051906378630aa960e01b82526004820152fd5b50831515612f4e565b90501538612f47565b608460405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152fd5b3d156130b8573d9061309e82612c41565b916130ac6040519384612c1f565b82523d6000602084013e565b606090565b9290803b1561324d57613127916020916001600160a01b0394604051809581948293897f150b7a02000000000000000000000000000000000000000000000000000000009b8c86523360048701521660248501526044840152608060648401526084830190612a5d565b03916000968791165af1908290826131e6575b50506131c05761314861308d565b805190816131bb5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000161490565b909192506020813d8211613245575b8161320260209383612c1f565b810103126132415751907fffffffff000000000000000000000000000000000000000000000000000000008216820361323e575090388061313a565b80fd5b5080fd5b3d91506131f5565b50505050600190565b67ffffffffffffffff811161205a5760051b60200190565b90815461327a81613256565b9260409361328a85519182612c1f565b828152809460208092019260005281600020906000935b8585106132b057505050505050565b600184819284516132c081612b99565b64ffffffffff87546001600160801b038116835267ffffffffffffffff8160801c168584015260c01c16868201528152019301940193916132a1565b6040519061330982612b99565b60006040838281528260208201520152565b9060405161332881612b99565b6040819360018154916001600160801b0392838116865260801c6020860152015416910152565b80600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260ff60016040600020015460b01c1690565b80600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260ff60016040600020015460a01c1690565b6001600160801b039182169082160391908211611bf057565b80600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260406000205460f81c90565b359064ffffffffff8216820361048057565b92919261342582613256565b60409461343486519283612c1f565b8195848352602080930191606080960285019481861161048057925b8584106134605750505050505050565b86848303126104805782519061347582612b99565b61347e85612c5d565b8252858501359067ffffffffffffffff8216820361048057828792838b9501526134a9868801613407565b86820152815201930192613450565b3580151581036104805790565b356001600160a01b03811681036104805790565b356001600160801b03811681036104805790565b91908260409103126104805760405161350581612bd2565b602080829461351381612aae565b84520135910152565b64ffffffffff80421682600052600b602052604060002091825482828260a01c16101561357d5760c81c16111561356b57600401546001101561356257612cde906135be565b612cde906145ee565b6001600160801b039150600201541690565b5050505050600090565b8051156135945760200190565b634e487b7160e01b600052603260045260246000fd5b80518210156135945760209160051b010190565b64ffffffffff90814216906000908152600b6020526040908181208251936135e585612bee565b8154956001600160a01b039182881687526020870197828160a01c168952828160c81c168789015260ff8160f01c161515606089015260f81c1515608088015260ff6001938486015490811660a08a0152818160a01c16151560c08a0152818160a81c16151560e08a015260b01c16151561010088015261014061367f60046136706002880161331b565b966101208b019788520161326e565b9701918783528087613691889a613587565b5101511693828288965b161061377557509161372561372a9284888161372f98976001600160801b039e8f6136c78b8a516135aa565b5151169d8a8f9b60206136e467ffffffffffffffff928d516135aa565b510151169984836136f68484516135aa565b510151169650811561376957613714929350519060001901906135aa565b5101511680925b03169203166137e9565b613b58565b6139bb565b92831361374857505061374283916137ad565b16011690565b5160200151929392831692841683101591506137649050575090565b905090565b5050505116809261371b565b8094986001600160801b03908161378d8c88516135aa565b51511601169801938282808a6137a48989516135aa565b5101511661369b565b600081126137b85790565b602490604051907f2463f3d50000000000000000000000000000000000000000000000000000000082526004820152fd5b90600160ff1b8083149081156138d1575b506138a757600082121561389e57613823826000035b60008312156138975782600003906138db565b917f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311613861576000916000199118131561385d575090565b0390565b604491604051917fd49c26b300000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b82906138db565b61382382613810565b60046040517f9fe2b450000000000000000000000000000000000000000000000000000000008152fd5b90508114386137fa565b670de0b6b3a7640000916000198383099280830292838086109503948086039514613997578285101561395b57908291096001821901821680920460028082600302188083028203028083028203028083028203028083028203028083028203028092029003029360018380600003040190848311900302920304170290565b82606492604051927f63a05778000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b5050809250156139a5570490565b634e487b7160e01b600052601260045260246000fd5b90600160ff1b808314908115613a9f575b50613a75576000821215613a6c576139f5826000035b6000831215613a65578260000390613aa9565b917f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311613a2f576000916000199118131561385d575090565b604491604051917f120b5b4300000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b8290613aa9565b6139f5826139e2565b60046040517fa6070c25000000000000000000000000000000000000000000000000000000008152fd5b90508114386139cc565b90919060001983820983820291828083109203918083039214613b4757670de0b6b3a76400009081831015613b1057947faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066994950990828211900360ee1b910360121c170290565b60449086604051917f5173648d00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050670de0b6b3a764000090049150565b80613b725750600090612cde5750670de0b6b3a764000090565b90670de0b6b3a7640000808314613bbf575080613b97575050670de0b6b3a764000090565b670de0b6b3a76400008114613bbb57613bb69061372a612cde93614499565b613bdf565b5090565b91505090565b80156139a5576ec097ce7bc90715b34b9f10000000000590565b6000811215613c145768033dd1780914b97114198112613c0e57613c0590600003613bdf565b612cde90613bc5565b50600090565b680a688906bd8affffff811361446857670de0b6b3a764000080604092831b05907780000000000000000000000000000000000000000000000067ff00000000000000831661434b575b66ff0000000000008316614243575b65ff00000000008316614143575b64ff00000000831661404b575b63ff0000008316613f5b575b62ff00008316613e73575b61ff008316613d93575b60ff8316613cbc575b02911c60bf031c90565b60808316613d81575b838316613d6f575b60208316613d5d575b60108316613d4b575b60088316613d39575b60048316613d27575b60028316613d15575b6001831615613cb2576801000000000000000102831c613cb2565b6801000000000000000102831c613cfa565b6801000000000000000302831c613cf1565b6801000000000000000602831c613ce8565b6801000000000000000b02831c613cdf565b6801000000000000001602831c613cd6565b6801000000000000002c02831c613ccd565b6801000000000000005902831c613cc5565b6180008316613e61575b6140008316613e4f575b6120008316613e3d575b6110008316613e2b575b6108008316613e19575b6104008316613e07575b6102008316613df5575b610100831615613ca957680100000000000000b102831c613ca9565b6801000000000000016302831c613dd9565b680100000000000002c602831c613dcf565b6801000000000000058c02831c613dc5565b68010000000000000b1702831c613dbb565b6801000000000000162e02831c613db1565b68010000000000002c5d02831c613da7565b680100000000000058b902831c613d9d565b628000008316613f49575b624000008316613f37575b622000008316613f25575b621000008316613f13575b620800008316613f01575b620400008316613eef575b620200008316613edd575b62010000831615613c9f576801000000000000b17202831c613c9f565b680100000000000162e402831c613ec0565b6801000000000002c5c802831c613eb5565b68010000000000058b9102831c613eaa565b680100000000000b172102831c613e9f565b68010000000000162e4302831c613e94565b680100000000002c5c8602831c613e89565b6801000000000058b90c02831c613e7e565b63800000008316614039575b63400000008316614027575b63200000008316614015575b63100000008316614003575b63080000008316613ff1575b63040000008316613fdf575b63020000008316613fcd575b6301000000831615613c945768010000000000b1721802831c613c94565b6801000000000162e43002831c613faf565b68010000000002c5c86002831c613fa3565b680100000000058b90c002831c613f97565b6801000000000b17217f02831c613f8b565b680100000000162e42ff02831c613f7f565b6801000000002c5c85fe02831c613f73565b68010000000058b90bfc02831c613f67565b6480000000008316614131575b644000000000831661411f575b642000000000831661410d575b64100000000083166140fb575b64080000000083166140e9575b64040000000083166140d7575b64020000000083166140c5575b640100000000831615613c8857680100000000b17217f802831c613c88565b68010000000162e42ff102831c6140a6565b680100000002c5c85fe302831c614099565b6801000000058b90bfce02831c61408c565b68010000000b17217fbb02831c61407f565b6801000000162e42fff002831c614072565b68010000002c5c8601cc02831c614065565b680100000058b90c0b4902831c614058565b658000000000008316614231575b65400000000000831661421f575b65200000000000831661420d575b6510000000000083166141fb575b6508000000000083166141e9575b6504000000000083166141d7575b6502000000000083166141c5575b65010000000000831615613c7b576801000000b17218355102831c613c7b565b680100000162e430e5a202831c6141a5565b6801000002c5c863b73f02831c614197565b68010000058b90cf1e6e02831c614189565b680100000b1721bcfc9a02831c61417b565b68010000162e43f4f83102831c61416d565b680100002c5c89d5ec6d02831c61415f565b6801000058b91b5bc9ae02831c614151565b66800000000000008316614339575b66400000000000008316614327575b66200000000000008316614315575b66100000000000008316614303575b660800000000000083166142f1575b660400000000000083166142df575b660200000000000083166142cd575b6601000000000000831615613c6d5768010000b17255775c0402831c613c6d565b6801000162e525ee054702831c6142ac565b68010002c5cc37da949202831c61429d565b680100058ba01fb9f96d02831c61428e565b6801000b175effdc76ba02831c61427f565b680100162f3904051fa102831c614270565b6801002c605e2e8cec5002831c614261565b68010058c86da1c09ea202831c614252565b6780000000000000008316614449575b6740000000000000008316614437575b6720000000000000008316614425575b6710000000000000008316614413575b6708000000000000008316614401575b67040000000000000083166143ef575b67020000000000000083166143dd575b670100000000000000831615613c5e57680100b1afa5abcbed6102831c613c5e565b68010163da9fb33356d802831c6143bb565b680102c9a3e778060ee702831c6143ab565b6801059b0d31585743ae02831c61439b565b68010b5586cf9890f62a02831c61438b565b6801172b83c7d517adce02831c61437b565b6801306fe0a31b7152df02831c61436b565b5077b504f333f9de64848000000000000000000000000000000061435b565b602490604051907f0360d0280000000000000000000000000000000000000000000000000000000082526004820152fd5b806000808313156145bd57670de0b6b3a76400009283811261458657506001925b808305906001600160801b03821160071b91821c9167ffffffffffffffff831160061b92831c63ffffffff811160051b90811c61ffff811160041b90811c60ff811160031b90811c91600f831160021b92831c936001978860038711811b96871c11961717171717171781810294811d9082821461457a57506706f05b59d3b20000905b84821361454e5750505050500290565b808391020590671bc16d674ec8000082121561456d575b831d9061453e565b8091950194831d90614565565b93505093925050020290565b60001993925080156145a9576ec097ce7bc90715b34b9f100000000005916144ba565b602482634e487b7160e01b81526012600452fd5b602483604051907f059b101b0000000000000000000000000000000000000000000000000000000082526004820152fd5b64ffffffffff614623600091838352600b60205280806040852054818160a01c1693849160c81c1603169181421603166137e9565b91808252600b602052600460408320018054156146a95790829167ffffffffffffffff935261467b6020832054828452600b60205261372a6001600160801b03968760026040882001541696879360801c1690613b58565b92831361469157505061468d906137ad565b1690565b60029350604092508152600b60205220015460801c90565b602483634e487b7160e01b81526032600452fd5b80600052600b602052604060002060ff600182015460a01c166000146146e4575050600490565b805460f81c614737575460a01c64ffffffffff164210613c0e576147078161351c565b90600052600b6020526001600160801b03806002604060002001541691161060001461473257600190565b600290565b5050600390565b80600052600b602052614757600260406000200161331b565b81600052600b602052604060002060ff600182015460a01c1660001461478a57506001600160801b039150602001511690565b5460f81c61479c5750612cde9061351c565b612cde91506001600160801b0360408183511692015116906133bd565b906001600160a01b036001541660206001600160a01b0360c0850151166024604051809481937fdcf844a700000000000000000000000000000000000000000000000000000000835260048301525afa80156109ac5760009061506c575b61483a91506001600160801b0360a08501511690602060e0860151015191615712565b6001600160801b0381511661010084015164ffffffffff60208601511682156150425781518015615018577f00000000000000000000000000000000000000000000000000000000000000008111614fe7575064ffffffffff604061489e84613587565b51015116811015614f905750600090819082815184905b808210614efd575050505064ffffffffff421664ffffffffff8216811015614ebd5750506001600160801b0316808203614e865750506009549283600052600b6020526040600020916001600160801b0381511660028401906001600160801b03198254161790556001600160a01b0360c083015116600184015490750100000000000000000000000000000000000000000060408501511515928654927fffffffffffffffffff0000ff000000000000000000000000000000000000000076ff000000000000000000000000000000000000000000006060890151151560b01b16921617171760018601556001600160a01b03845116916101008501519260406149c78551956000198701906135aa565b510151927fff000000000000000000000000000000000000000000000000000000000000007eff0000000000000000000000000000000000000000000000000000000000007dffffffffff0000000000000000000000000000000000000000000000000078ffffffffff000000000000000000000000000000000000000060208b015160a01b169660c81b169460f01b16911617171717845560005b818110614db6575050600185016009556001600160a01b0360c08301511660005260026020526001600160801b0380604060002054168160208401511601166001600160a01b0360c0840151166000526040600020906001600160801b03198254161790556001600160a01b036080830151168015614d7257614b05614aff8760005260056020526001600160a01b0360406000205416151590565b1561521a565b614b0e8661334f565b1580614d69575b80614d61575b614d4957602060008051602061585283398151915291614b54614aff8960005260056020526001600160a01b0360406000205416151590565b806000526006825260406000206001815401905587600052600582526040600020816001600160a01b0319825416179055876040519160007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4878152a1614be46001600160a01b0360c0840151166001600160801b038084511681602086015116011690309033906150a0565b6001600160801b0360408201511680614d1a575b507fef3d668acee46576ad5d407c42ab4d0cde13f3cd70b28f09a0fb9e3bf5bf09cb614cd76001600160a01b03845116926001600160a01b03608086015116946001600160a01b0360c08201511696614d0f614cef60408401511515928c606086015115156001600160a01b0360e061010089015194549864ffffffffff6040519a614c838c612bd2565b818160a01c168c5260c81c1660208b01520151511695604051998a99610160948b523360208c015260408b0190604090816001600160801b0391828151168552826020820151166020860152015116910152565b60a089015260c08801528060e0880152860190612b28565b926101008501906020908164ffffffffff91828151168552015116910152565b6101408301520390a4565b614d43906001600160a01b0360c0850151166001600160a01b0360e086015151169033906150a0565b38614bf8565b602486604051906378630aa960e01b82526004820152fd5b506000614b1b565b50801515614b15565b606460405162461bcd60e51b815260206004820152602060248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152fd5b614dc5816101008601516135aa565b51906004860154916801000000000000000083101561205a57600183018060048901558310156135945760019260048801600052602060002001906001600160801b03815116908254917fffffff00000000000000000000000000000000000000000000000000000000007cffffffffff000000000000000000000000000000000000000000000000604077ffffffffffffffff00000000000000000000000000000000602086015160801b1694015160c01b169316171717905501614a63565b60449250604051917fd90b7e3900000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b6040517f210aec0e00000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b9193509193614f21906001600160801b03614f1885886135aa565b5151169061568e565b9364ffffffffff806040614f3586856135aa565b51015116941680851115614f535750600184930191929190926148b5565b8385606492604051927f7b0bada8000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b64ffffffffff6040614fa184613587565b5101516040517fb4c9e52c00000000000000000000000000000000000000000000000000000000815264ffffffffff938416600482015291169091166024820152604490fd5b602490604051907f4757689b0000000000000000000000000000000000000000000000000000000082526004820152fd5b60046040517f3952c64e000000000000000000000000000000000000000000000000000000008152fd5b60046040517f6095d3bc000000000000000000000000000000000000000000000000000000008152fd5b6020823d602011615098575b8161508560209383612c1f565b8101031261323e575061483a9051614817565b3d9150615078565b9290604051927f23b872dd0000000000000000000000000000000000000000000000000000000060208501526001600160a01b03809216602485015216604483015260648201526064815260a081019181831067ffffffffffffffff84111761205a5761510f92604052615111565b565b6001600160a01b03169061517160405161512a81612bd2565b6020938482527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564858301526000808587829751910182855af161516b61308d565b91615265565b8051918215918483156151f6575b50505090501561518c5750565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b9193818094500103126132415782015190811515820361323e57508038808461517f565b1561522157565b606460405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152fd5b919290156152c65750815115615279575090565b3b156152825790565b606460405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b8251909150156152d95750805190602001fd5b6104f19060405191829162461bcd60e51b8352602060048401526024830190612a5d565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361532f57565b60046040517fa1c0d6e5000000000000000000000000000000000000000000000000000000008152fd5b916001600160a01b03604051927fa9059cbb000000000000000000000000000000000000000000000000000000006020850152166024830152604482015260448152608081019181831067ffffffffffffffff84111761205a5761510f92604052615111565b612cde906153cc8161473e565b90600052600b60205260026040600020015460801c906133bd565b91908110156135945760051b0190565b9061540182613386565b6156765761542582600052600b6020526001600160a01b0360406000205416331490565b91821580615666575b611fcf576000928184526020600581526001600160a01b0393604091858388205416938061565a575b61563557858216958615615625576001600160801b03808a16998a1561560e57615480886153bf565b8281168c116155df5750926155348b89946001898e7f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d978f9a6154d66154ff918c8552600b8b526002868620015460801c61568e565b8b8452600b8a5260028585200190836001600160801b031983549260801b16911617815561331b565b9061551a818a840151169282868183511692015116906133bd565b1611156155b1575b888152600b8752200154169687615359565b85518b8152a481331415806155a7575b615551575b505050505050565b813b156155a3576084929185915196879586946313375c3b60e01b86526004860152336024860152604485015260648401525af1615594575b8080808080615549565b61559d90612c0b565b3861558a565b8480fd5b50813b1515615544565b888152600b8752818120838101600160a01b60ff60a01b1982541617905560ff60f01b198154169055615522565b865163287ecaef60e21b8152600481018a90526001600160801b03928316602482015291166044820152606490fd5b60248887519063d2aabcd960e01b82526004820152fd5b6004845163630d074f60e11b8152fd5b6064858784865192632dcbf6b960e11b84526004840152336024840152166044820152fd5b50838683161415615457565b50615670816156a9565b1561542e565b60248260405190634a5541ef60e01b82526004820152fd5b9190916001600160801b0380809416911601918211611bf057565b60009080825260056020526001600160a01b0380604084205416928333149384156156ee575b505082156156dc57505090565b9091506156e93392612ce1565b161490565b60ff92945090604091815260086020528181203382526020522054169138806156cf565b90929161571d6132fc565b936001600160801b03928381169182156158295767016345785d8a00008082116157f2578085116157bb575061576785615758819386613aa9565b16946020890195865284613aa9565b16918461577e60408901948086528287511661568e565b1610156157a5576157978491826157a0955116906133bd565b915116906133bd565b168252565b634e487b7160e01b600052600160045260246000fd5b84604491604051917f4fea5c1a00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b60449250604051917f47152d6700000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050505050905060405161583c81612b99565b6000815260006020820152600060408201529056fef8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7a164736f6c6343000815000a"; + hex"60c0346200046e57601f62005cde38819003918201601f19168301916001600160401b038311848410176200032b578084926080946040528339810103126200046e5780516001600160a01b038082169290918390036200046e5760208101518281168091036200046e5760408201519183831683036200046e5760600151936200008962000473565b90601d82527f5361626c696572205632204c6f636b75702044796e616d6963204e46540000006020830152620000be62000473565b601181527029a0a116ab1916a627a1a5aaa816a22ca760791b602082015230608052600080546001600160a01b03199081168417825560018054909116909517909455927fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a38051906001600160401b0382116200032b5760035490600182811c9216801562000463575b60208310146200044d5781601f849311620003d8575b50602090601f83116001146200034d5760009262000341575b50508160011b916000199060031b1c1916176003555b80516001600160401b0381116200032b576004918254600181811c9116801562000320575b60208210146200030b579081601f849311620002b3575b50602090601f831160011462000248576000926200023c575b50508160011b916000199060031b1c19161790555b1660018060a01b0319600a541617600a5560a052600160095560405161584a9081620004948239608051816152d3015260a05181818161126b01526148330152f35b015190503880620001e5565b6000858152602081209350601f198516905b8181106200029a575090846001959493921062000280575b505050811b019055620001fa565b015160001960f88460031b161c1916905538808062000272565b929360206001819287860151815501950193016200025a565b909150836000526020600020601f840160051c8101916020851062000300575b90601f859493920160051c01905b818110620002f05750620001cc565b60008155849350600101620002e1565b9091508190620002d3565b602284634e487b7160e01b6000525260246000fd5b90607f1690620001b5565b634e487b7160e01b600052604160045260246000fd5b0151905038806200017a565b600360009081527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b9350601f198516905b818110620003bf5750908460019594939210620003a5575b505050811b0160035562000190565b015160001960f88460031b161c1916905538808062000396565b929360206001819287860151815501950193016200037e565b60036000529091507fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f840160051c8101916020851062000442575b90601f859493920160051c01905b81811062000432575062000161565b6000815584935060010162000423565b909150819062000415565b634e487b7160e01b600052602260045260246000fd5b91607f16916200014b565b600080fd5b60408051919082016001600160401b038111838210176200032b5760405256fe608080604052600436101561001357600080fd5b60003560e01c90816301ffc9a7146129375750806306fdde0314612874578063081812fc14612856578063095ea7b3146126c25780631400ecec1461261d57806316844456146123a25780631c1cdd4c1461233c5780631e99d5691461231e57806323b872dd146122f557806339a73c03146122b257806340e58ee514612079578063425d30dd1461205b57806342842e0e1461200b57806342966c6814611e8d5780634857501f14611e175780634869e12d14611ddb5780635fe3b56714611db45780636352211e14611d855780636d0cee7514611d2d57806370a0823114611c8357806375829def14611bf15780637cad6cd114611b1f5780637de6b1db1461194a5780638659c2701461164d578063894e9a0d146113e05780638bad38dd146113645780638f69b993146112e15780639067b6771461128e5780639188ec841461125357806395d89b4114611145578063a22cb46514611074578063a2ffb89714610f7b578063a6202bf214610e7b578063a80fc07114610e26578063ad35efd414610dc3578063b256456914610da5578063b637b86514610d45578063b88d4fde14610cba578063b8a3be6614610c83578063b971302a14610c31578063bc063e1a14610c0e578063bc2be1be14610bbb578063c156a11d14610acd578063c33cd35e146109b8578063c87b56dd14610885578063cc364f48146107eb578063d4dbd20b14610796578063d511609f14610747578063d975dfed146106fa578063e985e9c5146106a3578063ea5ead1914610652578063eac8f5b8146105e6578063f590c176146105be578063f851a440146105975763fdd46d601461027c57600080fd5b3461048057606036600319011261048057600435610298612a64565b604435916001600160801b039182841693848103610480576102b86152c9565b6102c183613352565b61057f576102e583600052600b6020526001600160a01b0360406000205416331490565b9182158061056f575b6105505783600052602094600586526001600160a01b039081604060002054169480610544575b61051e5781831693841561050d5788156104f5576103328761538b565b8281168a116104c1575091889161038e6103626103cb958a600052600b8c5260026040600020015460801c61565a565b89600052600b8b52600260406000200190836001600160801b031983549260801b1691161781556132e7565b906103aa818b8401511692826040818351169201511690613389565b16111561048f575b86600052600b8852600160406000200154169283615325565b81847f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d876040518a8152a48133141580610485575b61041f575b60008051602061581e8339815191528484604051908152a1005b813b156104805760008051602061581e8339815191529460846000928360405195869485936313375c3b60e01b8552896004860152336024860152604485015260648401525af1610471575b80610405565b61047a90612bd7565b3861046b565b600080fd5b50813b1515610400565b86600052600b8852604060002060018101600160a01b60ff60a01b1982541617905560ff60f01b1981541690556103b2565b60405163287ecaef60e21b8152600481018990526001600160801b03928316602482015291166044820152606490fd5b0390fd5b6024876040519063d2aabcd960e01b82526004820152fd5b600460405163630d074f60e11b8152fd5b606486838560405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b50848284161415610315565b60405163216caf0d60e01b815260048101859052336024820152604490fd5b5061057984615675565b156102ee565b60248360405190634a5541ef60e01b82526004820152fd5b346104805760003660031901126104805760206001600160a01b0360005416604051908152f35b346104805760203660031901126104805760206105dc6004356133a2565b6040519015158152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260206001600160a01b0360016040600020015416604051908152f35b6024906040519062b8e7e760e51b82526004820152fd5b346104805760403660031901126104805760008051602061581e833981519152602060043561069a610682612a64565b61068b8361538b565b906106946152c9565b836153c3565b604051908152a1005b34610480576040366003190112610480576106bc612a4e565b6106c4612a64565b906001600160a01b03809116600052600860205260406000209116600052602052602060ff604060002054166040519015158152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b5761073660209161538b565b6001600160801b0360405191168152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b602052602060026040600020015460801c604051908152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260206001600160801b0360036040600020015416604051908152f35b34610480576020366003190112610480576004356000602060405161080f81612b9e565b828152015280600052600b60205260ff60016040600020015460a81c161561063b57600052600b6020526040806000205464ffffffffff82519161085283612b9e565b818160a01c16835260c81c166020820152610883825180926020908164ffffffffff91828151168552015116910152565bf35b346104805760208060031936011261048057600435906108c36108be8360005260056020526001600160a01b0360406000205416151590565b612c3d565b60006001600160a01b03600a5416926044604051809581937fe9dc637500000000000000000000000000000000000000000000000000000000835230600484015260248301525afa9182156109ac57600092610933575b5061092f604051928284938452830190612a29565b0390f35b9091503d806000833e6109468183612beb565b81019082818303126104805780519067ffffffffffffffff8211610480570181601f8201121561048057805161097b81612c0d565b926109896040519485612beb565b818452848284010111610480576109a591848085019101612a06565b908261091a565b6040513d6000823e3d90fd5b3461048057600319602036820112610480576004359067ffffffffffffffff9081831161048057610140908336030112610480576109f46152c9565b60405191610a0183612b81565b610a0d81600401612a7a565b8352610a1b602482016133d3565b6020840152610a2c60448201612b58565b6040840152610a3d60648201612b58565b6060840152610a4e60848201612a7a565b6080840152610a5f60a48201612c29565b60a0840152610a7060c48201612a7a565b60c0840152610a823660e483016134b9565b60e084015261012481013591821161048057013660238201121561048057602091610aba610ac59236906024600482013591016133e5565b610100820152614785565b604051908152f35b3461048057604036600319011261048057600435610ae9612a64565b610af16152c9565b81600052600b60205260ff60016040600020015460a81c1615610ba4578160005260056020526001600160a01b0360406000205416803303610b85579161069a8160209360008051602061581e83398151915295610b4e8361538b565b6001600160801b038116610b63575b50612ed0565b610b7690610b6f6152c9565b82856153c3565b8686604051858152a187610b5d565b60405163216caf0d60e01b815260048101849052336024820152604490fd5b6024826040519062b8e7e760e51b82526004820152fd5b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b602052602064ffffffffff60406000205460a01c16604051908152f35b3461048057600036600319011261048057602060405167016345785d8a00008152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260206001600160a01b0360406000205416604051908152f35b3461048057602036600319011261048057600435600052600b602052602060ff60016040600020015460a81c166040519015158152f35b3461048057608036600319011261048057610cd3612a4e565b610cdb612a64565b6064359167ffffffffffffffff8311610480573660238401121561048057826004013591610d0883612c0d565b92610d166040519485612beb565b8084523660248287010111610480576020816000926024610d439801838801378501015260443591612d5b565b005b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205261092f610d91600460406000200161323a565b604051918291602083526020830190612af4565b346104805760203660031901126104805760206105dc60043561331b565b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57610dfd90614689565b6040516005821015610e10576020918152f35b634e487b7160e01b600052602160045260246000fd5b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260206001600160801b0360026040600020015416604051908152f35b3461048057602036600319011261048057610e94612a4e565b6001600160a01b038060005416338103610f5257508116908160005260026020526001600160801b0360406000205416908115610f215781610ef39184600052600260205260406000206001600160801b031981541690553390615325565b6040519081527fca7a4a65a94ed2f37538814e00e1cd4c41a78261561e3f3794592f11409cf5af60203392a3005b602483604051907f8410168c0000000000000000000000000000000000000000000000000000000082526004820152fd5b6040516331b339a960e21b81526001600160a01b03919091166004820152336024820152604490fd5b346104805760603660031901126104805767ffffffffffffffff60043581811161048057610fad903690600401612ac3565b610fb5612a64565b9260443590811161048057610fce903690600401612ac3565b9190610fd86152c9565b82820361103d5760005b828110610feb57005b8060008051602061581e833981519152602061100a600194878a6153b3565b3561103061102161101c868b8a6153b3565b6134a5565b6110296152c9565b8b836153c3565b604051908152a101610fe2565b50604491604051917faec9344000000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b346104805760403660031901126104805761108d612a4e565b60243590811515809203610480576001600160a01b03169081331461110157336000526008602052604060002082600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a3005b606460405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152fd5b3461048057600036600319011261048057604051600060045490600182811c91818416918215611249575b60209485851084146112335785879486865291826000146112135750506001146111b6575b506111a292500383612beb565b61092f604051928284938452830190612a29565b84915060046000527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b906000915b8583106111fb5750506111a2935082010185611195565b805483890185015287945086939092019181016111e4565b60ff1916858201526111a295151560051b85010192508791506111959050565b634e487b7160e01b600052602260045260246000fd5b92607f1692611170565b346104805760003660031901126104805760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b602052602064ffffffffff60406000205460c81c16604051908152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b5761131b90614689565b600581101580610e105760028214908115611357575b8115611345575b6020826040519015158152f35b9050610e105760046020911482611338565b5050600381146000611331565b34610480576020366003190112610480576004356001600160a01b0390818116809103610480578160005416338103610f52575060015491816001600160a01b03198416176001556040519216825260208201527fdcb09aef4bf01068924ccce937981cbe59d25ba08380cf941aaaea4e4bd3960d60403392a2005b3461048057602036600319011261048057606061014060405161140281612bba565b60008152600060208201526000604082015260008382015260006080820152600060a0820152600060c0820152600060e082015260006101008201526114466132c8565b6101208201520152600435600052600b60205260ff60016040600020015460a81c161561163557600435600052600b602052604060002061152960046040519261148f84612bba565b80546001600160a01b038116855264ffffffffff8160a01c16602086015264ffffffffff8160c81c16604086015260ff8160f01c161515606086015260f81c1515608085015260ff60018201546001600160a01b03811660a0870152818160a01c16151560c0870152818160a81c16151560e087015260b01c16151561010085015261151d600282016132e7565b6101208501520161323a565b61014082015261153a600435614689565b906005821015610e105760026101409214611629575b61092f604051928392602084526001600160a01b03815116602085015264ffffffffff602082015116604085015264ffffffffff60408201511660608501526060810151151560808501526080810151151560a08501526001600160a01b0360a08201511660c085015260c0810151151560e085015260e08101511515610100850152610100810151151561012085015261161561012082015183860190604090816001600160801b0391828151168552826020820151166020860152015116910152565b01516101a0808401526101c0830190612af4565b60006060820152611550565b602460405162b8e7e760e51b81526004356004820152fd5b34610480576020806003193601126104805760043567ffffffffffffffff81116104805761167f903690600401612ac3565b906116886152c9565b6000915b80831061169557005b6116a08382846153b3565b35926116aa6152c9565b6116b384613352565b156116d05760248460405190634a5541ef60e01b82526004820152fd5b6116dc849293946133a2565b6119325761170082600052600b6020526001600160a01b0360406000205416331490565b156119135761170e826134e8565b82600052600b80875261172760026040600020016132e7565b906001600160801b03928383511684821610156118fb578560005281895260ff60406000205460f01c16156118e3579061179582858b61178b7f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa509683895116613389565b9601511690613389565b9580600052818a526040600020938a855498600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8b1617875560038882169788156118c9575b0197831697886001600160801b03198254161790556001600160a01b03809a16958691600584528b604060002054169687945260019b8c6040600020015416946118288b8588615325565b604080518881526001600160801b0392831660208201529290911690820152606090a460008051602061581e8339815191528a604051838152a1813b611876575b505050505001919061168c565b813b15610480576000608492819560405197889687956372eba20360e01b875260048701526024860152604485015260648401525af16118ba575b80808080611869565b6118c390612bd7565b856118b1565b60018101600160a01b60ff60a01b198254161790556117dd565b602486604051906339c6dc7360e21b82526004820152fd5b602486604051906322cad1af60e11b82526004820152fd5b60405163216caf0d60e01b815260048101839052336024820152604490fd5b6024826040519063fe19f19f60e01b82526004820152fd5b346104805760208060031936011261048057600435906119686152c9565b81600052600b815260ff60016040600020015460a81c1615610ba45761198d82614689565b6005811015610e1057600481036119b65760248360405190634a5541ef60e01b82526004820152fd5b600381036119d6576024836040519063fe19f19f60e01b82526004820152fd5b600214611b07576119fd82600052600b6020526001600160a01b0360406000205416331490565b156119135781600052600b815260ff60406000205460f01c1615611aef5781600052600b8152604060002060ff60f01b19815416905560405191807f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f600080a2600582526001600160a01b036040600020541692833b611a92575b60008051602061581e8339815191528383604051908152a1005b833b15610480576000816024818360008051602061581e833981519152987f341a0bd90000000000000000000000000000000000000000000000000000000083528760048401525af115611a7857611ae990612bd7565b83611a78565b602482604051906339c6dc7360e21b82526004820152fd5b602482604051906322cad1af60e11b82526004820152fd5b34610480576020366003190112610480576004356001600160a01b0390818116809103610480578160005416338103610f525750600a5491816001600160a01b0319841617600a556040519216825260208201527fa2548bd4b805e907c1558a47b5858324fe8bb4a2e1ddfca647eecbf65610eebc60403392a26009546000198101908111611bdb5760407f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c91815190600182526020820152a1005b634e487b7160e01b600052601160045260246000fd5b3461048057602036600319011261048057611c0a612a4e565b6000546001600160a01b0380821692338403611c5c576001600160a01b03199350169182911617600055337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf80600080a3005b6040516331b339a960e21b81526001600160a01b0385166004820152336024820152604490fd5b34610480576020366003190112610480576001600160a01b03611ca4612a4e565b168015611cc35760005260066020526020604060002054604051908152f35b608460405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e657200000000000000000000000000000000000000000000006064820152fd5b3461048057602036600319011261048057600435611d646108be8260005260056020526001600160a01b0360406000205416151590565b600052600560205260206001600160a01b0360406000205416604051908152f35b34610480576020366003190112610480576020611da3600435612c88565b6001600160a01b0360405191168152f35b346104805760003660031901126104805760206001600160a01b0360015416604051908152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b5761073660209161470a565b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b576000611e5382614689565b6005811015610e1057600203611e71575b6020906040519015158152f35b50600052600b602052602060ff60406000205460f01c16611e64565b3461048057602036600319011261048057600435611ea96152c9565b611eb281613352565b15611fda57611ec081615675565b15611fba57611ece81612c88565b611ed78261331b565b159081611fb1575b81611f9e575b50611f8657602081611f0560008051602061581e83398151915293612c88565b9080600052600783526001600160a01b036040600020926001600160a01b031993848154169055169182600052600684526040600020600019815401905581600052600584526040600020908154169055806000604051937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a48152a1005b60249060405190630da9b01360e01b82526004820152fd5b6001600160a01b03915016151582611ee5565b60009150611edf565b60405163216caf0d60e01b81526004810191909152336024820152604490fd5b602490604051907f817cd6390000000000000000000000000000000000000000000000000000000082526004820152fd5b346104805761201936612a8e565b60405191602083019383851067ffffffffffffffff86111761204557610d439460405260008452612d5b565b634e487b7160e01b600052604160045260246000fd5b346104805760203660031901126104805760206105dc600435613352565b346104805760208060031936011261048057600435906120976152c9565b6120a082613352565b156120bd5760248260405190634a5541ef60e01b82526004820152fd5b6120c6826133a2565b611932576120ea82600052600b6020526001600160a01b0360406000205416331490565b15611913576120f8826134e8565b9180600052600b825261211160026040600020016132e7565b906001600160801b0393848351168582161015611b075781600052600b845260ff60406000205460f01c1615611aef5780858561215461215e9483885116613389565b9501511690613389565b9080600052600b845260008051602061581e833981519152604060002094855494600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff87161787556003888616978815612298575b0197811697886001600160801b03198254161790556001600160a01b038096169560058352867f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa508260406000205416978893600b875260016040600020015416946122218d8588615325565b604080518a81526001600160801b0392831660208201529290911690820152606090a4604051838152a1813b61225357005b813b15610480576000608492819560405197889687956372eba20360e01b875260048701526024860152604485015260648401525af161228f57005b610d4390612bd7565b60018101600160a01b60ff60a01b198254161790556121b5565b34610480576020366003190112610480576001600160a01b036122d3612a4e565b16600052600260205260206001600160801b0360406000205416604051908152f35b3461048057610d4361230636612a8e565b916123196123148433612df1565b612cea565b612ed0565b34610480576000366003190112610480576020600954604051908152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b5761237690614689565b6005811015610e10578060209115908115612397575b506040519015158152f35b60019150148261238c565b346104805760206003198181360112610480576004359067ffffffffffffffff908183116104805761012083360391820112610480576123e06152c9565b61010483013590602219018112156104805782016004810135908282116104805760240160608202360381136104805761241b9136916133e5565b9182519061242882613222565b916124366040519384612beb565b808352601f1961244582613222565b018660005b8281106126075750505064ffffffffff90814216946001600160801b03968761247282613553565b515116828a61248084613553565b510151168580604061249186613553565b510151168a011690604051926124a684612b65565b83528b83015260408201526124ba87613553565b526124c486613553565b5060019386855b8a8c87831061258657908b846001600160a01b038c60a48101358281169081900361048057610ac595612546956125769461250860248601613484565b61251460448701613484565b61252060648801613491565b9161252d88600401613491565b948461253b60848b016134a5565b966040519d8e612b81565b168c528d8c0152151560408b0152151560608a01521660808801521660a086015260c085015260c43691016134b9565b60e0830152610100820152614785565b8893858060406125ba8b866125aa8a8e9a6125a1828d613576565b5151169a613576565b5101511694600019890190613576565b510151168160406125cb888c613576565b51015116011691604051936125df85612b65565b845283015260408201526125f3828b613576565b526125fe818a613576565b500187906124cb565b61260f6132c8565b82828801015201879061244a565b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b5760209060009080600052600b8352604060002060ff815460f01c16806126b0575b612687575b50506001600160801b0360405191168152f35b6126a992506001600160801b0360026126a392015416916134e8565b90613389565b8280612674565b5060ff600182015460a01c161561266f565b34610480576040366003190112610480576126db612a4e565b602435906001600160a01b0380806126f285612c88565b169216918083146127ec578033149081156127c7575b501561275d578260005260076020526040600020826001600160a01b031982541617905561273583612c88565b167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b608460405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152fd5b9050600052600860205260406000203360005260205260ff6040600020541684612708565b608460405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152fd5b34610480576020366003190112610480576020611da3600435612cad565b3461048057600036600319011261048057604051600060035490600182811c9181841691821561292d575b60209485851084146112335785879486865291826000146112135750506001146128d057506111a292500383612beb565b84915060036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b906000915b8583106129155750506111a2935082010185611195565b805483890185015287945086939092019181016128fe565b92607f169261289f565b3461048057602036600319011261048057600435907fffffffff00000000000000000000000000000000000000000000000000000000821680920361048057817f80ac58cd00000000000000000000000000000000000000000000000000000000602093149081156129dc575b81156129b2575b5015158152f35b7f01ffc9a700000000000000000000000000000000000000000000000000000000915014836129ab565b7f5b5e139f00000000000000000000000000000000000000000000000000000000811491506129a4565b60005b838110612a195750506000910152565b8181015183820152602001612a09565b90602091612a4281518092818552858086019101612a06565b601f01601f1916010190565b600435906001600160a01b038216820361048057565b602435906001600160a01b038216820361048057565b35906001600160a01b038216820361048057565b6060906003190112610480576001600160a01b0390600435828116810361048057916024359081168103610480579060443590565b9181601f840112156104805782359167ffffffffffffffff8311610480576020808501948460051b01011161048057565b90815180825260208080930193019160005b828110612b14575050505090565b835180516001600160801b031686528083015167ffffffffffffffff168684015260409081015164ffffffffff169086015260609094019392810192600101612b06565b3590811515820361048057565b6060810190811067ffffffffffffffff82111761204557604052565b610120810190811067ffffffffffffffff82111761204557604052565b6040810190811067ffffffffffffffff82111761204557604052565b610160810190811067ffffffffffffffff82111761204557604052565b67ffffffffffffffff811161204557604052565b90601f8019910116810190811067ffffffffffffffff82111761204557604052565b67ffffffffffffffff811161204557601f01601f191660200190565b35906001600160801b038216820361048057565b15612c4457565b606460405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152fd5b60005260056020526001600160a01b0360406000205416612caa811515612c3d565b90565b612cd06108be8260005260056020526001600160a01b0360406000205416151590565b60005260076020526001600160a01b036040600020541690565b15612cf157565b608460405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f766564000000000000000000000000000000000000006064820152fd5b90612d7f939291612d6f6123148433612df1565b612d7a838383612ed0565b613089565b15612d8657565b60405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b906001600160a01b038080612e0584612c88565b16931691838314938415612e38575b508315612e22575b50505090565b612e2e91929350612cad565b1614388080612e1c565b909350600052600860205260406000208260005260205260ff604060002054169238612e14565b15612e6657565b608460405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152fd5b90612ef99291612edf83612c88565b916001600160a01b03948593848094169687911614612e5f565b1690811580612ff057612f0b8461331b565b159081612fe7575b5080612fde575b612fc65791808492612f4860008051602061581e83398151915296602096612f4185612c88565b1614612e5f565b60009382855260078652604085206001600160a01b031990818154169055818652600687526040862060001981540190558286526040862060018154019055838652600587528260408720918254161790557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6040519580a48152a1565b60248360405190630da9b01360e01b82526004820152fd5b50831515612f1a565b90501538612f13565b608460405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152fd5b3d15613084573d9061306a82612c0d565b916130786040519384612beb565b82523d6000602084013e565b606090565b9290803b15613219576130f3916020916001600160a01b0394604051809581948293897f150b7a02000000000000000000000000000000000000000000000000000000009b8c86523360048701521660248501526044840152608060648401526084830190612a29565b03916000968791165af1908290826131b2575b505061318c57613114613059565b805190816131875760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000161490565b909192506020813d8211613211575b816131ce60209383612beb565b8101031261320d5751907fffffffff000000000000000000000000000000000000000000000000000000008216820361320a5750903880613106565b80fd5b5080fd5b3d91506131c1565b50505050600190565b67ffffffffffffffff81116120455760051b60200190565b90815461324681613222565b9260409361325685519182612beb565b828152809460208092019260005281600020906000935b85851061327c57505050505050565b6001848192845161328c81612b65565b64ffffffffff87546001600160801b038116835267ffffffffffffffff8160801c168584015260c01c168682015281520193019401939161326d565b604051906132d582612b65565b60006040838281528260208201520152565b906040516132f481612b65565b6040819360018154916001600160801b0392838116865260801c6020860152015416910152565b80600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260ff60016040600020015460b01c1690565b80600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260ff60016040600020015460a01c1690565b6001600160801b039182169082160391908211611bdb57565b80600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260406000205460f81c90565b359064ffffffffff8216820361048057565b9291926133f182613222565b60409461340086519283612beb565b8195848352602080930191606080960285019481861161048057925b85841061342c5750505050505050565b86848303126104805782519061344182612b65565b61344a85612c29565b8252858501359067ffffffffffffffff8216820361048057828792838b9501526134758688016133d3565b8682015281520193019261341c565b3580151581036104805790565b356001600160a01b03811681036104805790565b356001600160801b03811681036104805790565b9190826040910312610480576040516134d181612b9e565b60208082946134df81612a7a565b84520135910152565b64ffffffffff80421682600052600b602052604060002091825482828260a01c1610156135495760c81c16111561353757600401546001101561352e57612caa9061358a565b612caa906145ba565b6001600160801b039150600201541690565b5050505050600090565b8051156135605760200190565b634e487b7160e01b600052603260045260246000fd5b80518210156135605760209160051b010190565b64ffffffffff90814216906000908152600b6020526040908181208251936135b185612bba565b8154956001600160a01b039182881687526020870197828160a01c168952828160c81c168789015260ff8160f01c161515606089015260f81c1515608088015260ff6001938486015490811660a08a0152818160a01c16151560c08a0152818160a81c16151560e08a015260b01c16151561010088015261014061364b600461363c600288016132e7565b966101208b019788520161323a565b970191878352808761365d889a613553565b5101511693828288965b16106137415750916136f16136f6928488816136fb98976001600160801b039e8f6136938b8a51613576565b5151169d8a8f9b60206136b067ffffffffffffffff928d51613576565b510151169984836136c2848451613576565b5101511696508115613735576136e092935051906000190190613576565b5101511680925b03169203166137b5565b613b24565b613987565b92831361371457505061370e8391613779565b16011690565b5160200151929392831692841683101591506137309050575090565b905090565b505050511680926136e7565b8094986001600160801b0390816137598c8851613576565b51511601169801938282808a613770898951613576565b51015116613667565b600081126137845790565b602490604051907f2463f3d50000000000000000000000000000000000000000000000000000000082526004820152fd5b90600160ff1b80831490811561389d575b5061387357600082121561386a576137ef826000035b60008312156138635782600003906138a7565b917f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831161382d5760009160001991181315613829575090565b0390565b604491604051917fd49c26b300000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b82906138a7565b6137ef826137dc565b60046040517f9fe2b450000000000000000000000000000000000000000000000000000000008152fd5b90508114386137c6565b670de0b6b3a7640000916000198383099280830292838086109503948086039514613963578285101561392757908291096001821901821680920460028082600302188083028203028083028203028083028203028083028203028083028203028092029003029360018380600003040190848311900302920304170290565b82606492604051927f63a05778000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b505080925015613971570490565b634e487b7160e01b600052601260045260246000fd5b90600160ff1b808314908115613a6b575b50613a41576000821215613a38576139c1826000035b6000831215613a31578260000390613a75565b917f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83116139fb5760009160001991181315613829575090565b604491604051917f120b5b4300000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b8290613a75565b6139c1826139ae565b60046040517fa6070c25000000000000000000000000000000000000000000000000000000008152fd5b9050811438613998565b90919060001983820983820291828083109203918083039214613b1357670de0b6b3a76400009081831015613adc57947faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066994950990828211900360ee1b910360121c170290565b60449086604051917f5173648d00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050670de0b6b3a764000090049150565b80613b3e5750600090612caa5750670de0b6b3a764000090565b90670de0b6b3a7640000808314613b8b575080613b63575050670de0b6b3a764000090565b670de0b6b3a76400008114613b8757613b82906136f6612caa93614465565b613bab565b5090565b91505090565b8015613971576ec097ce7bc90715b34b9f10000000000590565b6000811215613be05768033dd1780914b97114198112613bda57613bd190600003613bab565b612caa90613b91565b50600090565b680a688906bd8affffff811361443457670de0b6b3a764000080604092831b05907780000000000000000000000000000000000000000000000067ff000000000000008316614317575b66ff000000000000831661420f575b65ff0000000000831661410f575b64ff000000008316614017575b63ff0000008316613f27575b62ff00008316613e3f575b61ff008316613d5f575b60ff8316613c88575b02911c60bf031c90565b60808316613d4d575b838316613d3b575b60208316613d29575b60108316613d17575b60088316613d05575b60048316613cf3575b60028316613ce1575b6001831615613c7e576801000000000000000102831c613c7e565b6801000000000000000102831c613cc6565b6801000000000000000302831c613cbd565b6801000000000000000602831c613cb4565b6801000000000000000b02831c613cab565b6801000000000000001602831c613ca2565b6801000000000000002c02831c613c99565b6801000000000000005902831c613c91565b6180008316613e2d575b6140008316613e1b575b6120008316613e09575b6110008316613df7575b6108008316613de5575b6104008316613dd3575b6102008316613dc1575b610100831615613c7557680100000000000000b102831c613c75565b6801000000000000016302831c613da5565b680100000000000002c602831c613d9b565b6801000000000000058c02831c613d91565b68010000000000000b1702831c613d87565b6801000000000000162e02831c613d7d565b68010000000000002c5d02831c613d73565b680100000000000058b902831c613d69565b628000008316613f15575b624000008316613f03575b622000008316613ef1575b621000008316613edf575b620800008316613ecd575b620400008316613ebb575b620200008316613ea9575b62010000831615613c6b576801000000000000b17202831c613c6b565b680100000000000162e402831c613e8c565b6801000000000002c5c802831c613e81565b68010000000000058b9102831c613e76565b680100000000000b172102831c613e6b565b68010000000000162e4302831c613e60565b680100000000002c5c8602831c613e55565b6801000000000058b90c02831c613e4a565b63800000008316614005575b63400000008316613ff3575b63200000008316613fe1575b63100000008316613fcf575b63080000008316613fbd575b63040000008316613fab575b63020000008316613f99575b6301000000831615613c605768010000000000b1721802831c613c60565b6801000000000162e43002831c613f7b565b68010000000002c5c86002831c613f6f565b680100000000058b90c002831c613f63565b6801000000000b17217f02831c613f57565b680100000000162e42ff02831c613f4b565b6801000000002c5c85fe02831c613f3f565b68010000000058b90bfc02831c613f33565b64800000000083166140fd575b64400000000083166140eb575b64200000000083166140d9575b64100000000083166140c7575b64080000000083166140b5575b64040000000083166140a3575b6402000000008316614091575b640100000000831615613c5457680100000000b17217f802831c613c54565b68010000000162e42ff102831c614072565b680100000002c5c85fe302831c614065565b6801000000058b90bfce02831c614058565b68010000000b17217fbb02831c61404b565b6801000000162e42fff002831c61403e565b68010000002c5c8601cc02831c614031565b680100000058b90c0b4902831c614024565b6580000000000083166141fd575b6540000000000083166141eb575b6520000000000083166141d9575b6510000000000083166141c7575b6508000000000083166141b5575b6504000000000083166141a3575b650200000000008316614191575b65010000000000831615613c47576801000000b17218355102831c613c47565b680100000162e430e5a202831c614171565b6801000002c5c863b73f02831c614163565b68010000058b90cf1e6e02831c614155565b680100000b1721bcfc9a02831c614147565b68010000162e43f4f83102831c614139565b680100002c5c89d5ec6d02831c61412b565b6801000058b91b5bc9ae02831c61411d565b66800000000000008316614305575b664000000000000083166142f3575b662000000000000083166142e1575b661000000000000083166142cf575b660800000000000083166142bd575b660400000000000083166142ab575b66020000000000008316614299575b6601000000000000831615613c395768010000b17255775c0402831c613c39565b6801000162e525ee054702831c614278565b68010002c5cc37da949202831c614269565b680100058ba01fb9f96d02831c61425a565b6801000b175effdc76ba02831c61424b565b680100162f3904051fa102831c61423c565b6801002c605e2e8cec5002831c61422d565b68010058c86da1c09ea202831c61421e565b6780000000000000008316614415575b6740000000000000008316614403575b67200000000000000083166143f1575b67100000000000000083166143df575b67080000000000000083166143cd575b67040000000000000083166143bb575b67020000000000000083166143a9575b670100000000000000831615613c2a57680100b1afa5abcbed6102831c613c2a565b68010163da9fb33356d802831c614387565b680102c9a3e778060ee702831c614377565b6801059b0d31585743ae02831c614367565b68010b5586cf9890f62a02831c614357565b6801172b83c7d517adce02831c614347565b6801306fe0a31b7152df02831c614337565b5077b504f333f9de648480000000000000000000000000000000614327565b602490604051907f0360d0280000000000000000000000000000000000000000000000000000000082526004820152fd5b8060008083131561458957670de0b6b3a76400009283811261455257506001925b808305906001600160801b03821160071b91821c9167ffffffffffffffff831160061b92831c63ffffffff811160051b90811c61ffff811160041b90811c60ff811160031b90811c91600f831160021b92831c936001978860038711811b96871c11961717171717171781810294811d9082821461454657506706f05b59d3b20000905b84821361451a5750505050500290565b808391020590671bc16d674ec80000821215614539575b831d9061450a565b8091950194831d90614531565b93505093925050020290565b6000199392508015614575576ec097ce7bc90715b34b9f10000000000591614486565b602482634e487b7160e01b81526012600452fd5b602483604051907f059b101b0000000000000000000000000000000000000000000000000000000082526004820152fd5b64ffffffffff6145ef600091838352600b60205280806040852054818160a01c1693849160c81c1603169181421603166137b5565b91808252600b602052600460408320018054156146755790829167ffffffffffffffff93526146476020832054828452600b6020526136f66001600160801b03968760026040882001541696879360801c1690613b24565b92831361465d57505061465990613779565b1690565b60029350604092508152600b60205220015460801c90565b602483634e487b7160e01b81526032600452fd5b80600052600b602052604060002060ff600182015460a01c166000146146b0575050600490565b805460f81c614703575460a01c64ffffffffff164210613bda576146d3816134e8565b90600052600b6020526001600160801b0380600260406000200154169116106000146146fe57600190565b600290565b5050600390565b80600052600b60205261472360026040600020016132e7565b81600052600b602052604060002060ff600182015460a01c1660001461475657506001600160801b039150602001511690565b5460f81c6147685750612caa906134e8565b612caa91506001600160801b036040818351169201511690613389565b906001600160a01b036001541660206001600160a01b0360c0850151166024604051809481937fdcf844a700000000000000000000000000000000000000000000000000000000835260048301525afa80156109ac57600090615038575b61480691506001600160801b0360a08501511690602060e08601510151916156de565b6001600160801b0381511661010084015164ffffffffff602086015116821561500e5781518015614fe4577f00000000000000000000000000000000000000000000000000000000000000008111614fb3575064ffffffffff604061486a84613553565b51015116811015614f5c5750600090819082815184905b808210614ec9575050505064ffffffffff421664ffffffffff8216811015614e895750506001600160801b0316808203614e525750506009549283600052600b6020526040600020916001600160801b0381511660028401906001600160801b03198254161790556001600160a01b0360c083015116600184015490750100000000000000000000000000000000000000000060408501511515928654927fffffffffffffffffff0000ff000000000000000000000000000000000000000076ff000000000000000000000000000000000000000000006060890151151560b01b16921617171760018601556001600160a01b0384511691610100850151926040614993855195600019870190613576565b510151927fff000000000000000000000000000000000000000000000000000000000000007eff0000000000000000000000000000000000000000000000000000000000007dffffffffff0000000000000000000000000000000000000000000000000078ffffffffff000000000000000000000000000000000000000060208b015160a01b169660c81b169460f01b16911617171717845560005b818110614d82575050600185016009556001600160a01b0360c08301511660005260026020526001600160801b0380604060002054168160208401511601166001600160a01b0360c0840151166000526040600020906001600160801b03198254161790556001600160a01b036080830151168015614d3e57614ad1614acb8760005260056020526001600160a01b0360406000205416151590565b156151e6565b614ada8661331b565b1580614d35575b80614d2d575b614d1557602060008051602061581e83398151915291614b20614acb8960005260056020526001600160a01b0360406000205416151590565b806000526006825260406000206001815401905587600052600582526040600020816001600160a01b0319825416179055876040519160007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4878152a1614bb06001600160a01b0360c0840151166001600160801b0380845116816020860151160116903090339061506c565b6001600160801b0360408201511680614ce6575b507fef3d668acee46576ad5d407c42ab4d0cde13f3cd70b28f09a0fb9e3bf5bf09cb614ca36001600160a01b03845116926001600160a01b03608086015116946001600160a01b0360c08201511696614cdb614cbb60408401511515928c606086015115156001600160a01b0360e061010089015194549864ffffffffff6040519a614c4f8c612b9e565b818160a01c168c5260c81c1660208b01520151511695604051998a99610160948b523360208c015260408b0190604090816001600160801b0391828151168552826020820151166020860152015116910152565b60a089015260c08801528060e0880152860190612af4565b926101008501906020908164ffffffffff91828151168552015116910152565b6101408301520390a4565b614d0f906001600160a01b0360c0850151166001600160a01b0360e0860151511690339061506c565b38614bc4565b60248660405190630da9b01360e01b82526004820152fd5b506000614ae7565b50801515614ae1565b606460405162461bcd60e51b815260206004820152602060248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152fd5b614d9181610100860151613576565b51906004860154916801000000000000000083101561204557600183018060048901558310156135605760019260048801600052602060002001906001600160801b03815116908254917fffffff00000000000000000000000000000000000000000000000000000000007cffffffffff000000000000000000000000000000000000000000000000604077ffffffffffffffff00000000000000000000000000000000602086015160801b1694015160c01b169316171717905501614a2f565b60449250604051917fd90b7e3900000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b6040517f210aec0e00000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b9193509193614eed906001600160801b03614ee48588613576565b5151169061565a565b9364ffffffffff806040614f018685613576565b51015116941680851115614f1f575060018493019192919092614881565b8385606492604051927f7b0bada8000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b64ffffffffff6040614f6d84613553565b5101516040517fb4c9e52c00000000000000000000000000000000000000000000000000000000815264ffffffffff938416600482015291169091166024820152604490fd5b602490604051907f4757689b0000000000000000000000000000000000000000000000000000000082526004820152fd5b60046040517f3952c64e000000000000000000000000000000000000000000000000000000008152fd5b60046040517f6095d3bc000000000000000000000000000000000000000000000000000000008152fd5b6020823d602011615064575b8161505160209383612beb565b8101031261320a575061480690516147e3565b3d9150615044565b9290604051927f23b872dd0000000000000000000000000000000000000000000000000000000060208501526001600160a01b03809216602485015216604483015260648201526064815260a081019181831067ffffffffffffffff841117612045576150db926040526150dd565b565b6001600160a01b03169061513d6040516150f681612b9e565b6020938482527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564858301526000808587829751910182855af1615137613059565b91615231565b8051918215918483156151c2575b5050509050156151585750565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b91938180945001031261320d5782015190811515820361320a57508038808461514b565b156151ed57565b606460405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152fd5b919290156152925750815115615245575090565b3b1561524e5790565b606460405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b8251909150156152a55750805190602001fd5b6104f19060405191829162461bcd60e51b8352602060048401526024830190612a29565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036152fb57565b60046040517fa1c0d6e5000000000000000000000000000000000000000000000000000000008152fd5b916001600160a01b03604051927fa9059cbb000000000000000000000000000000000000000000000000000000006020850152166024830152604482015260448152608081019181831067ffffffffffffffff841117612045576150db926040526150dd565b612caa906153988161470a565b90600052600b60205260026040600020015460801c90613389565b91908110156135605760051b0190565b906153cd82613352565b615642576153f182600052600b6020526001600160a01b0360406000205416331490565b91821580615632575b611fba576000928184526020600581526001600160a01b03936040918583882054169380615626575b615601578582169586156155f1576001600160801b03808a16998a156155da5761544c8861538b565b8281168c116155ab5750926155008b89946001898e7f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d978f9a6154a26154cb918c8552600b8b526002868620015460801c61565a565b8b8452600b8a5260028585200190836001600160801b031983549260801b1691161781556132e7565b906154e6818a84015116928286818351169201511690613389565b16111561557d575b888152600b8752200154169687615325565b85518b8152a48133141580615573575b61551d575b505050505050565b813b1561556f576084929185915196879586946313375c3b60e01b86526004860152336024860152604485015260648401525af1615560575b8080808080615515565b61556990612bd7565b38615556565b8480fd5b50813b1515615510565b888152600b8752818120838101600160a01b60ff60a01b1982541617905560ff60f01b1981541690556154ee565b865163287ecaef60e21b8152600481018a90526001600160801b03928316602482015291166044820152606490fd5b60248887519063d2aabcd960e01b82526004820152fd5b6004845163630d074f60e11b8152fd5b6064858784865192632dcbf6b960e11b84526004840152336024840152166044820152fd5b50838683161415615423565b5061563c81615675565b156153fa565b60248260405190634a5541ef60e01b82526004820152fd5b9190916001600160801b0380809416911601918211611bdb57565b60009080825260056020526001600160a01b0380604084205416928333149384156156ba575b505082156156a857505090565b9091506156b53392612cad565b161490565b60ff929450906040918152600860205281812033825260205220541691388061569b565b9092916156e96132c8565b936001600160801b03928381169182156157f55767016345785d8a00008082116157be57808511615787575061573385615724819386613a75565b16946020890195865284613a75565b16918461574a60408901948086528287511661565a565b1610156157715761576384918261576c95511690613389565b91511690613389565b168252565b634e487b7160e01b600052600160045260246000fd5b84604491604051917f4fea5c1a00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b60449250604051917f47152d6700000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050505050905060405161580881612b65565b6000815260006020820152600060408201529056fef8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7a164736f6c6343000815000a"; bytes public constant BYTECODE_LOCKUP_LINEAR = - hex"60a034620003e757601f196001600160401b03601f62004c403881900382810185168601919084831187841017620003ec57808792606094604052833981010312620003e75783516001600160a01b03928382169291839003620003e7576020918287015196858816809803620003e75760400151948516809503620003e7576200008962000402565b90601c82527f5361626c696572205632204c6f636b7570204c696e656172204e46540000000084830152620000bd62000402565b601181527029a0a116ab1916a627a1a5aaa816a624a760791b8582015230608052600080546001600160a01b031990811688178255600180548216909b178b5596817fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a38351858111620003d35760039485548c81811c91168015620003c8575b89821014620003b45790818684931162000361575b508890868311600114620002f8578492620002ec575b505060001982871b1c1916908b1b1784555b8151948511620002d8576004958654998b8b811c9b168015620002cd575b828c1014620002ba57848b1162000271575b869798999a50819487116001146200020a57505093620001fe575b505082871b92600019911b1c19161790555b600a541617600a5560095560405161481d9081620004238239608051816145270152f35b015191503880620001c8565b8883528183208c9890969594939116915b8282106200025757505085116200023c575b50505050811b019055620001da565b01519060f884600019921b161c19169055388080806200022d565b8484015187558c989096019593840193908101906200021b565b87835281832085880160051c81019b838910620002af575b860160051c019a8c905b8c8110620002a3575050620001ad565b848155018c9062000293565b909b508b9062000289565b634e487b7160e01b835260228852602483fd5b9a607f169a6200019b565b634e487b7160e01b81526041600452602490fd5b0151905038806200016b565b908c8e9416918886528a862092865b8c82821062000341575050841162000328575b505050811b0184556200017d565b015160001983891b60f8161c191690553880806200031a565b91929395968291958786015181550195019301908f959493929162000307565b9091508684528884208680850160051c8201928b8610620003aa575b918f91869594930160051c01915b8281106200039b57505062000155565b8681558594508f91016200038b565b925081926200037d565b634e487b7160e01b84526022600452602484fd5b90607f169062000140565b634e487b7160e01b82526041600452602482fd5b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620003ec5760405256fe608080604052600436101561001357600080fd5b600090813560e01c90816301ffc9a714612dc65750806306fdde0314612d04578063081812fc14612ce5578063095ea7b314612b565780631400ecec14612ab65780631c1cdd4c14612a515780631e99d56914612a3357806323b872dd14612a0957806339a73c03146129c857806340e58ee51461271d578063425d30dd146126fe57806342842e0e146126ae57806342966c68146125365780634857501f146124ac5780634869e12d146124715780635fe3b5671461244a5780636352211e1461241a5780636d0cee75146123c457806370a082311461231b57806375829def14612288578063780a82c8146122385780637cad6cd1146121675780637de6b1db14611f715780638659c27014611c60578063894e9a0d14611a0c5780638bad38dd1461198f5780638f69b993146118f35780639067b677146118a057806395d89b411461179357806396ce143114611674578063a22cb465146115a3578063a2ffb897146111c8578063a6202bf2146110cb578063a80fc07114611079578063ab167ccc14610f40578063ad35efd414610ede578063b256456914610ebf578063b88d4fde14610e32578063b8a3be6614610dfd578063b971302a14610dae578063bc063e1a14610d8b578063bc2be1be14610d3b578063c156a11d146109af578063c87b56dd14610875578063cc364f48146107c7578063d4dbd20b14610775578063d511609f14610729578063d975dfed146106dd578063e985e9c514610688578063ea5ead1914610662578063eac8f5b8146105f9578063f590c176146105d0578063f851a440146105aa5763fdd46d601461027357600080fd5b346105a75760603660031901126105a75760043561028f612ef5565b610297613035565b906102a061451d565b6102a9836136b3565b61058f576102cd83600052600b6020526001600160a01b0360406000205416331490565b9081158061057f575b61056057838552602092600584526001600160a01b0391826040882054169380610554575b61052e57828116928315610504576001600160801b038084169384156104ec57610324896145df565b82811686116104b85750938093926103ca9261038f6103578d9a99988d8c52600b8d52600260408d20015460801c61462d565b8c8b52600b8c5261038a600260408d20019182906001600160801b036001600160801b031983549260801b169116179055565b613648565b906103ab818c84015116928260408183511692015116906136ea565b161115610488575b898852600b89526001604089200154169283614579565b82877f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d88604051868152a4823314158061047e575b610420575b836000805160206147f18339815191528688604051908152a180f35b823b1561047a57608484928360405195869485936313375c3b60e01b85528b6004860152336024860152604485015260648401525af1610462575b8080610404565b61046b90612f71565b61047657823861045b565b8280fd5b8380fd5b50823b15156103ff565b898852600b89526040882060018101600160c81b60ff60c81b1982541617905560ff60f01b1981541690556103b3565b60405163287ecaef60e21b8152600481018b90526001600160801b03928316602482015291166044820152606490fd5b0390fd5b6024896040519063d2aabcd960e01b82526004820152fd5b60046040517fc61a0e9e000000000000000000000000000000000000000000000000000000008152fd5b858360649260405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b508383821614156102fb565b60405163216caf0d60e01b815260048101859052336024820152604490fd5b5061058984614648565b156102d6565b60248360405190634a5541ef60e01b82526004820152fd5b80fd5b50346105a757806003193601126105a7576001600160a01b036020915416604051908152f35b50346105a75760203660031901126105a75760206105ef600435613719565b6040519015158152f35b50346105a75760203660031901126105a757600435808252600b60205260ff600160408420015460d01c161561064b5760016040836001600160a01b039360209552600b855220015416604051908152f35b6024906040519062b8e7e760e51b82526004820152fd5b50346105a75760403660031901126105a75760043561067f612ef5565b610297826145df565b50346105a75760403660031901126105a7576106a2612edf565b60406106ac612ef5565b926001600160a01b0380931681526008602052209116600052602052602060ff604060002054166040519015158152f35b50346105a75760203660031901126105a75760ff6001604060043593848152600b60205220015460d01c161561064b576107186020916145df565b6001600160801b0360405191168152f35b50346105a75760203660031901126105a757600435808252600b60205260ff600160408420015460d01c161561064b5760408260029260209452600b845220015460801c604051908152f35b50346105a75760203660031901126105a757600435808252600b60205260ff600160408420015460d01c161561064b5760036040836001600160801b039360209552600b855220015416604051908152f35b50346105a75760203660031901126105a7576004356107e4613629565b50808252600b60205260ff600160408420015460d01c161561064b578160409160609352600b60205220600181549164ffffffffff918291015460a01c16906040519261083084612fbf565b818160a01c16845260c81c166020830152604082015261087360405180926040908164ffffffffff91828151168552826020820151166020860152015116910152565bf35b50346105a75760208060031936011261099f576004356108b36108ae8260005260056020526001600160a01b0360406000205416151590565b61304b565b826001600160a01b03600a5416916044604051809481937fe9dc637500000000000000000000000000000000000000000000000000000000835230600484015260248301525afa9283156109a3578093610922575b505061091e604051928284938452830190612eba565b0390f35b909192503d8082843e6109358184612ff7565b820191838184031261099f5780519067ffffffffffffffff8211610476570182601f8201121561099f5780519161096b83613019565b936109796040519586612ff7565b8385528584840101116105a757509061099791848085019101612e97565b903880610908565b5080fd5b604051903d90823e3d90fd5b50346105a75760403660031901126105a7576004356109cc612ef5565b906109d561451d565b808352602090600b825260ff600160408620015460d01c161561064b57808452600582526001600160a01b03928360408620541693843303610d1c57610a1a836145df565b906001600160801b0390818316918215938415610a59575b896000805160206147f18339815191528989610a4f818b8f6132de565b604051908152a180f35b610a6161451d565b610a6a876136b3565b610d0457610a8e87600052600b6020526001600160a01b0360406000205416331490565b94851580610cf4575b610cd557878b52600589528360408c2054169580610ccb575b610ca757891561050457610c8f57610ac7876145df565b8281168511610c5f575090610b27610af48b96959493898852600b8b52600260408920015460801c61462d565b888752600b8a5261038a600260408920019182906001600160801b036001600160801b031983549260801b169116179055565b90610b43818a84015116928260408183511692015116906136ea565b161115610c2f575b858452600b8752600160408520015416610b66828983614579565b87867f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d89604051868152a48133141580610c25575b610bca575b50505081610a4f916000805160206147f1833981519152958686604051858152a195819338610a32565b813b156104765782916084839260405194859384926313375c3b60e01b84528a60048501523360248501528c604485015260648401525af1610c0d575b80610ba0565b610c1690612f71565b610c21578438610c07565b8480fd5b50813b1515610b9b565b858452600b87526040842060018101600160c81b60ff60c81b1982541617905560ff60f01b198154169055610b4b565b60405163287ecaef60e21b8152600481018990526001600160801b03928316602482015291166044820152606490fd5b6024876040519063d2aabcd960e01b82526004820152fd5b6064888b60405191632dcbf6b960e11b835260048301523360248301526044820152fd5b50858a1415610ab0565b60405163216caf0d60e01b815260048101899052336024820152604490fd5b50610cfe88614648565b15610a97565b60248760405190634a5541ef60e01b82526004820152fd5b60405163216caf0d60e01b815260048101849052336024820152604490fd5b50346105a75760203660031901126105a757600435808252600b60205260ff600160408420015460d01c161561064b5760408264ffffffffff9260209452600b8452205460a01c16604051908152f35b50346105a757806003193601126105a757602060405167016345785d8a00008152f35b50346105a75760203660031901126105a757600435808252600b60205260ff600160408420015460d01c161561064b576040826001600160a01b039260209452600b8452205416604051908152f35b50346105a75760203660031901126105a75760ff600160406020936004358152600b855220015460d01c166040519015158152f35b50346105a75760803660031901126105a757610e4c612edf565b610e54612ef5565b906064359067ffffffffffffffff821161047a573660238301121561047a5781600401359284610e8385613019565b93610e916040519586612ff7565b858552366024878301011161099f5785610ebc96602460209301838801378501015260443591613169565b80f35b50346105a75760203660031901126105a75760206105ef60043561367c565b50346105a75760203660031901126105a757600435808252600b60205260ff600160408420015460d01c161561064b57610f179061398f565b604051906005811015610f2c57602092508152f35b602483634e487b7160e01b81526021600452fd5b50346105a7576101403660031901126105a757610f5b61451d565b610f63613629565b9064ffffffffff80421680845260c43582811681036110745781018216602085015260e4359081831682036110745701166040830152606435916001600160a01b03918284168094036105a757506084358015158091036110745760a435908115158092036110745760243594848616809603611074576004359585871680970361107457604435906001600160801b038216809203611074576040519761100a89612fa2565b8852602088015260408701526060860152608085015260a084015260c0830152604061010319360112611074576040519161104483612fdb565b610104359182168203611074578261106c9260209452610124358482015260e0820152613a91565b604051908152f35b600080fd5b50346105a75760203660031901126105a757600435808252600b60205260ff600160408420015460d01c161561064b5760026040836001600160801b039360209552600b855220015416604051908152f35b50346105a75760203660031901126105a7576110e5612edf565b6001600160a01b038083541633810361119f575081169081835260026020526001600160801b0360408420541690811561116e578161113f918486526002602052604086206001600160801b031981541690553390614579565b6040519081527fca7a4a65a94ed2f37538814e00e1cd4c41a78261561e3f3794592f11409cf5af60203392a380f35b602483604051907f8410168c0000000000000000000000000000000000000000000000000000000082526004820152fd5b6040516331b339a960e21b81526001600160a01b03919091166004820152336024820152604490fd5b50346105a75760603660031901126105a75767ffffffffffffffff600435818111610476576111fb903690600401612f40565b90611204612ef5565b92604435908111610c215761121d903690600401612f40565b61122894919461451d565b80840361156c5791926001600160a01b038216159290865b81811061124b578780f35b611256818388614607565b359061126381858a614607565b356001600160801b03811681036110745761127c61451d565b611285836136b3565b61058f576112a983600052600b6020526001600160a01b0360406000205416331490565b80158061155c575b61056057838b5260056020526001600160a01b0360408c2054169080611549575b61151c5787610504576001600160801b03821615611504576112f3846145df565b6001600160801b0381166001600160801b038416116114d25750908a91848352600b80602052611363600261038a611334868360408a20015460801c61462d565b918988528460205260408820019182906001600160801b036001600160801b031983549260801b169116179055565b6001600160801b0361138781602084015116928260408183511692015116906136ea565b1611156114a2575b8584526020526001600160a01b036001604085200154166113ba6001600160801b0384168a83614579565b6040516001600160801b0384168152867f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d60206001600160a01b038d1693a48033141580611498575b61142c575b5050506000805160206147f18339815191526020600193604051908152a101611240565b803b15610476576001600160a01b036084898580946001600160801b0360405197889687956313375c3b60e01b87528d60048801523360248801521660448601521660648401525af1611480575b80611408565b61148990612f71565b61149457883861147a565b8880fd5b50803b1515611403565b858452806020526040842060018101600160c81b60ff60c81b1982541617905560ff60f01b19815416905561138f565b60405163287ecaef60e21b8152600481018690526001600160801b038481166024830152919091166044820152606490fd5b6024846040519063d2aabcd960e01b82526004820152fd5b6064846001600160a01b038960405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b50806001600160a01b03881614156112d2565b5061156684614648565b156112b1565b83604491604051917faec9344000000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b50346105a75760403660031901126105a7576115bd612edf565b60243590811515809203611074576001600160a01b0316908133146116305733835260086020526040832082600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a380f35b606460405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152fd5b50346105a7576101603660031901126105a75761168f61451d565b6040519061169c82612fa2565b6116a4612edf565b82526116ae612ef5565b60208301526116bb613035565b60408301526001600160a01b03906064358281168103611074576060840152608435801515810361107457608084015260a43580151581036110745760a084015260603660c31901126105a7575060405161171581612fbf565b64ffffffffff60c435818116810361107457825260e435818116810361107457602083015261010435908116810361107457604082015260c0830152604061012319360112611074576040519161176b83612fdb565b610124359182168203611074578261106c9260209452610144358482015260e0820152613a91565b50346105a757806003193601126105a757604051908060045491600183811c92818516948515611896575b602095868610811461188257858852879493929187908215611860575050600114611806575b50506117f292500383612ff7565b61091e604051928284938452830190612eba565b90859250600482527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5b8583106118485750506117f2935082010138806117e4565b80548389018501528794508693909201918101611830565b92509350506117f294915060ff191682840152151560051b82010138806117e4565b602483634e487b7160e01b81526022600452fd5b93607f16936117be565b50346105a75760203660031901126105a757600435808252600b60205260ff600160408420015460d01c161561064b57600160408364ffffffffff9360209552600b855220015460a01c16604051908152f35b50346105a75760203660031901126105a757600435808252600b60205260ff600160408420015460d01c161561064b5761192c9061398f565b906005821015908161196d5760028314918215611981575b8215611958575b6020836040519015158152f35b90915061196d5750600460209114388061194b565b80634e487b7160e01b602492526021600452fd5b506003831491506000611944565b50346105a75760203660031901126105a7576004356001600160a01b0390818116809103610476578183541633810361119f575060015491816001600160a01b03198416176001556040519216825260208201527fdcb09aef4bf01068924ccce937981cbe59d25ba08380cf941aaaea4e4bd3960d60403392a280f35b50346105a75760203660031901126105a757604051611a2a81612f85565b8181528160208201528160408201528160608201528160808201528160a08201528160c08201528160e08201528161010082015281610120820152610140611a70613629565b9101526004358152600b60205260ff600160408320015460d01c1615611c48576004358152600b60205260408120611b49600260405192611ab084612f85565b80546001600160a01b038116855264ffffffffff8160a01c16602086015264ffffffffff8160c81c16604086015260ff8160f01c161515606086015260f81c1515608085015260ff60018201546001600160a01b03811660a087015264ffffffffff8160a01c1660c0870152818160c81c16151560e0870152818160d01c16151561010087015260d81c16151561012085015201613648565b610140820152611b5a60043561398f565b6005811015610f2c579160026101a09314611c3d575b50610873610140604051926001600160a01b03815116845264ffffffffff602082015116602085015264ffffffffff60408201511660408501526060810151151560608501526080810151151560808501526001600160a01b0360a08201511660a085015264ffffffffff60c08201511660c085015260e0810151151560e0850152610100810151151561010085015261012081015115156101208501520151610140830190604090816001600160801b0391828151168552826020820151166020860152015116910152565b606082015238611b70565b602460405162b8e7e760e51b81526004356004820152fd5b50346105a75760208060031936011261099f5760043567ffffffffffffffff811161047657611c93903690600401612f40565b9190611c9d61451d565b83925b808410611cab578480f35b611cb6848284614607565b3593611cc061451d565b611cc9856136b3565b15611ce65760248560405190634a5541ef60e01b82526004820152fd5b611cf38592939495613719565b611f5957611d1782600052600b6020526001600160a01b0360406000205416331490565b15611f3a57611d258261374a565b91808752600b808752611d3d600260408a2001613648565b936001600160801b0390818651168282161015611f2257838a5282895260ff60408b205460f01c1615611f0a5781611d8b82828c611d818f968299988d51166136ea565b9a015116906136ea565b928583528085526040832091825498600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8b161784556003828716948515611ef0575b01918116918281546001600160801b0319161790556001600160a01b03809a169260058852838b6040882054169788928a5260019c8d60408a2001541693611e19868487614579565b604080518d81526001600160801b03928316602082015292909116908201527f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa5090606090a4843b611e8a575b50505050506000805160206147f183398151915291604051908152a101929190611ca0565b909192938095503b1561047a5760848492838d9760405196879586946372eba20360e01b86528c60048701526024860152604485015260648401525af1611ed5575b80808392611e65565b611ee0919250612f71565b611eec57858738611ecc565b8680fd5b60018101600160c81b60ff60c81b19825416179055611dd0565b602484604051906339c6dc7360e21b82526004820152fd5b602484604051906322cad1af60e11b82526004820152fd5b60405163216caf0d60e01b815260048101839052336024820152604490fd5b6024826040519063fe19f19f60e01b82526004820152fd5b50346105a75760208060031936011261099f5760043590611f9061451d565b818352600b815260ff600160408520015460d01c161561215057611fb38261398f565b600581101561213c5760048103611fdc5760248360405190634a5541ef60e01b82526004820152fd5b60038103611ffc576024836040519063fe19f19f60e01b82526004820152fd5b6002146121245761202382600052600b6020526001600160a01b0360406000205416331490565b15611f3a57818352600b815260ff604084205460f01c161561210c57818352600b81526040832060ff60f01b19815416905582604051837f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f8380a2600583526001600160a01b03604083205416803b6120b4575b5050506000805160206147f183398151915291604051908152a180f35b803b1561047657816024818580947f341a0bd90000000000000000000000000000000000000000000000000000000083528960048401525af16120f8575b80612097565b61210190612f71565b6104765782386120f2565b602482604051906339c6dc7360e21b82526004820152fd5b602482604051906322cad1af60e11b82526004820152fd5b602484634e487b7160e01b81526021600452fd5b6024826040519062b8e7e760e51b82526004820152fd5b50346105a75760203660031901126105a7576004356001600160a01b0390818116809103610476578183541633810361119f5750600a5491816001600160a01b0319841617600a556040519216825260208201527fa2548bd4b805e907c1558a47b5858324fe8bb4a2e1ddfca647eecbf65610eebc60403392a260095460001981019081116122245760407f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c91815190600182526020820152a180f35b602482634e487b7160e01b81526011600452fd5b50346105a75760203660031901126105a757600435808252600b60205260ff600160408420015460d01c161561064b5760408264ffffffffff9260209452600b8452205460c81c16604051908152f35b50346105a75760203660031901126105a7576122a2612edf565b9080546001600160a01b03808216933385036122f4576001600160a01b03199394501691829116178255337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808380a380f35b6040516331b339a960e21b81526001600160a01b0386166004820152336024820152604490fd5b50346105a75760203660031901126105a7576001600160a01b0361233d612edf565b16801561235a578160409160209352600683522054604051908152f35b608460405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e657200000000000000000000000000000000000000000000006064820152fd5b50346105a75760203660031901126105a7576001600160a01b0360406020926004356124096108ae8260005260056020526001600160a01b0360406000205416151590565b815260058452205416604051908152f35b50346105a75760203660031901126105a7576020612439600435613096565b6001600160a01b0360405191168152f35b50346105a757806003193601126105a75760206001600160a01b0360015416604051908152f35b50346105a75760203660031901126105a75760ff6001604060043593848152600b60205220015460d01c161561064b57610718602091613a16565b50346105a75760203660031901126105a75760043590818152600b60205260ff600160408320015460d01c161561215057806124e78361398f565b92600584101561252257600260209403612508575b50506040519015158152f35b8152600b8352604090205460f01c60ff16905038806124fc565b602482634e487b7160e01b81526021600452fd5b50346105a75760203660031901126105a75760043561255361451d565b61255c816136b3565b1561267d5761256a81614648565b1561265d5761257881613096565b6125818261367c565b159081612655575b81612642575b5061262a576020816125af6000805160206147f183398151915293613096565b90808552600783526001600160a01b0360408620926001600160a01b03199384815416905516918286526006845260408620600019815401905581865260058452604086209081541690558085604051937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a48152a180f35b602490604051906378630aa960e01b82526004820152fd5b6001600160a01b0391501615153861258f565b839150612589565b60405163216caf0d60e01b81526004810191909152336024820152604490fd5b602490604051907f817cd6390000000000000000000000000000000000000000000000000000000082526004820152fd5b50346105a7576126bd36612f0b565b60405191602083019383851067ffffffffffffffff8611176126e857610ebc94604052858452613169565b634e487b7160e01b600052604160045260246000fd5b50346105a75760203660031901126105a75760206105ef6004356136b3565b50346105a757602090816003193601126105a7576004359161273d61451d565b612746836136b3565b156127635760248360405190634a5541ef60e01b82526004820152fd5b61276c83613719565b6129b05761279083600052600b6020526001600160a01b0360406000205416331490565b15610d1c5761279e8361374a565b838352600b82526127b460026040852001613648565b906001600160801b039081835116828216101561299857858552600b845260ff604086205460f01c161561298057600b6128038284876127f9604096838a51166136ea565b97015116906136ea565b87875281865285877f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa50858220978b6128d98a54600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216178c5560038b89169c8d15612966575b019a84169a8b6001600160801b031982541617905560016001600160a01b038092169a8b9760058a528382822054169b8c9a5220015416966128af8b878a614579565b60405193849384916040919493606084019584526001600160801b03809216602085015216910152565b0390a4803b6128ff575b856000805160206147f18339815191528689604051908152a180f35b803b15612962578592918360849260405196879586946372eba20360e01b86528c60048701526024860152604485015260648401525af1612943575b8080806128e3565b9161295c6000805160206147f183398151915293612f71565b9161293b565b8580fd5b60018101600160c81b60ff60c81b1982541617905561286c565b602486604051906339c6dc7360e21b82526004820152fd5b602486604051906322cad1af60e11b82526004820152fd5b6024836040519063fe19f19f60e01b82526004820152fd5b50346105a75760203660031901126105a7576001600160801b0360406020926001600160a01b036129f7612edf565b16815260028452205416604051908152f35b50346105a757610ebc612a1b36612f0b565b91612a2e612a2984336131ff565b6130f8565b6132de565b50346105a757806003193601126105a7576020600954604051908152f35b50346105a75760203660031901126105a757600435808252600b60205260ff600160408420015460d01c161561064b57612a8a9061398f565b90600582101561196d5760208215838115612aab575b506040519015158152f35b600191501482612aa0565b50346105a75760203660031901126105a75760043590818152600b60205260ff600160408320015460d01c161561215057602091604082828152600b85522060ff815460f01c1680612b44575b612b1b575b50506001600160801b0360405191168152f35b612b3d92506001600160801b036002612b37920154169161374a565b906136ea565b3880612b08565b5060ff600182015460c81c1615612b03565b50346105a75760403660031901126105a757612b70612edf565b602435906001600160a01b038080612b8785613096565b16921691808314612c7b57803314908115612c5a575b5015612bf057828452600760205260408420826001600160a01b0319825416179055612bc883613096565b167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258480a480f35b608460405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152fd5b9050845260086020526040842033855260205260ff60408520541638612b9d565b608460405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152fd5b50346105a75760203660031901126105a75760206124396004356130bb565b50346105a757806003193601126105a757604051908060035491600183811c92818516948515612dbc575b602095868610811461188257858852879493929187908215611860575050600114612d625750506117f292500383612ff7565b90859250600382527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b858310612da45750506117f2935082010138806117e4565b80548389018501528794508693909201918101612d8c565b93607f1693612d2f565b90503461099f57602036600319011261099f576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361047657602092507f80ac58cd000000000000000000000000000000000000000000000000000000008114908115612e6d575b8115612e43575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501438612e3c565b7f5b5e139f0000000000000000000000000000000000000000000000000000000081149150612e35565b60005b838110612eaa5750506000910152565b8181015183820152602001612e9a565b90602091612ed381518092818552858086019101612e97565b601f01601f1916010190565b600435906001600160a01b038216820361107457565b602435906001600160a01b038216820361107457565b6060906003190112611074576001600160a01b0390600435828116810361107457916024359081168103611074579060443590565b9181601f840112156110745782359167ffffffffffffffff8311611074576020808501948460051b01011161107457565b67ffffffffffffffff81116126e857604052565b610160810190811067ffffffffffffffff8211176126e857604052565b610100810190811067ffffffffffffffff8211176126e857604052565b6060810190811067ffffffffffffffff8211176126e857604052565b6040810190811067ffffffffffffffff8211176126e857604052565b90601f8019910116810190811067ffffffffffffffff8211176126e857604052565b67ffffffffffffffff81116126e857601f01601f191660200190565b604435906001600160801b038216820361107457565b1561305257565b606460405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152fd5b60005260056020526001600160a01b03604060002054166130b881151561304b565b90565b6130de6108ae8260005260056020526001600160a01b0360406000205416151590565b60005260076020526001600160a01b036040600020541690565b156130ff57565b608460405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f766564000000000000000000000000000000000000006064820152fd5b9061318d93929161317d612a2984336131ff565b6131888383836132de565b613497565b1561319457565b60405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b906001600160a01b03808061321384613096565b16931691838314938415613246575b508315613230575b50505090565b61323c919293506130bb565b161438808061322a565b909350600052600860205260406000208260005260205260ff604060002054169238613222565b1561327457565b608460405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152fd5b9061330792916132ed83613096565b916001600160a01b0394859384809416968791161461326d565b16908115806133fe576133198461367c565b1590816133f5575b50806133ec575b6133d457918084926133566000805160206147f18339815191529660209661334f85613096565b161461326d565b60009382855260078652604085206001600160a01b031990818154169055818652600687526040862060001981540190558286526040862060018154019055838652600587528260408720918254161790557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6040519580a48152a1565b602483604051906378630aa960e01b82526004820152fd5b50831515613328565b90501538613321565b608460405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152fd5b3d15613492573d9061347882613019565b916134866040519384612ff7565b82523d6000602084013e565b606090565b9290803b1561362057613501916020916001600160a01b0394604051809581948293897f150b7a02000000000000000000000000000000000000000000000000000000009b8c86523360048701521660248501526044840152608060648401526084830190612eba565b03916000968791165af1908290826135c0575b505061359a57613522613467565b805190816135955760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000161490565b909192506020813d8211613618575b816135dc60209383612ff7565b8101031261099f5751907fffffffff00000000000000000000000000000000000000000000000000000000821682036105a75750903880613514565b3d91506135cf565b50505050600190565b6040519061363682612fbf565b60006040838281528260208201520152565b9060405161365581612fbf565b6040819360018154916001600160801b0392838116865260801c6020860152015416910152565b80600052600b60205260ff60016040600020015460d01c161561064b57600052600b60205260ff60016040600020015460d81c1690565b80600052600b60205260ff60016040600020015460d01c161561064b57600052600b60205260ff60016040600020015460c81c1690565b6001600160801b03918216908216039190821161370357565b634e487b7160e01b600052601160045260246000fd5b80600052600b60205260ff60016040600020015460d01c161561064b57600052600b60205260406000205460f81c90565b600090808252600b6020526040822091825464ffffffffff42818360c81c16116137f85780600186015460a01c1691824210156137e2576137979394955060a01c16809103904203613800565b90828152600b6020526001600160801b03926137bd8460026040852001541680946138e0565b9283116137ca5750501690565b60029350604092508152600b60205220015460801c90565b505050505060026001600160801b039101541690565b505091505090565b670de0b6b3a76400009160001983830992808302928380861095039480860395146138bc578285101561388057908291096001821901821680920460028082600302188083028203028083028203028083028203028083028203028083028203028092029003029360018380600003040190848311900302920304170290565b82606492604051927f63a05778000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b5050809250156138ca570490565b634e487b7160e01b600052601260045260246000fd5b9091906000198382098382029182808310920391808303921461397e57670de0b6b3a7640000908183101561394757947faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066994950990828211900360ee1b910360121c170290565b60449086604051917f5173648d00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050670de0b6b3a764000090049150565b80600052600b602052604060002060ff600182015460c81c166000146139b6575050600490565b805460f81c613a0f575460a01c64ffffffffff164210613a09576139d98161374a565b90600052600b6020526001600160801b038060026040600020015416911610600014613a0457600190565b600290565b50600090565b5050600390565b80600052600b602052613a2f6002604060002001613648565b81600052600b602052604060002060ff600182015460c81c16600014613a6257506001600160801b039150602001511690565b5460f81c613a7457506130b89061374a565b6130b891506001600160801b0360408183511692015116906136ea565b906001600160a01b036001541660206001600160a01b036060850151166024604051809481937fdcf844a700000000000000000000000000000000000000000000000000000000835260048301525afa80156142b457600090614280575b613b1291506001600160801b0360408501511690602060e08601510151916146b1565b916001600160801b0383511660c082015190156142565764ffffffffff815116602082019064ffffffffff8251169081811161421657505064ffffffffff604091511691019064ffffffffff82511690818110156141d657505064ffffffffff8042169151169081811015614196575050600954926001600160801b0381511660405190613b9f82612fbf565b815260006020820152600060408201526001600160a01b036060840151169060c08401519164ffffffffff6020840151169064ffffffffff604085015116906080870151151560a088015115159364ffffffffff6001600160a01b038a511697511660405197613c0e89612f85565b88526020880152604087015260608601526000608086015260a085015260c0840152600060e0840152600161010084015261012083015261014082015284600052600b60205260406000206001600160a01b038251166001600160a01b0319825416178155613ca564ffffffffff602084015116829064ffffffffff60a01b1964ffffffffff60a01b83549260a01b169116179055565b604082015181547eff0000000000000000000000000000000000000000000000000000000000006060850151151560f01b169078ffffffffffffffffffffffffffffffffffffffffffffffffff7dffffffffff000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000006080880151151560f81b169460c81b1691161717178155600181016001600160a01b0360a0840151166001600160a01b0319825416178155613d9c64ffffffffff60c085015116829064ffffffffff60a01b1964ffffffffff60a01b83549260a01b169116179055565b60e083015181546101008501516101208601517fffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff90921692151560c81b79ff00000000000000000000000000000000000000000000000000169290921791151560d01b7aff0000000000000000000000000000000000000000000000000000169190911790151560d81b7bff00000000000000000000000000000000000000000000000000000016179055610140909101518051602082015160801b6001600160801b03199081166001600160801b03928316176002850155926040906003019201511682825416179055600185016009556001600160a01b0360608401511660005260026020526001600160801b0380604060002054168160208501511601166001600160a01b036060850151166000526040600020918254161790556001600160a01b03602083015116801561415257613f17613f118660005260056020526001600160a01b0360406000205416151590565b1561443a565b613f208561367c565b1580614149575b80614141575b6141295760206000805160206147f183398151915291613f66613f118860005260056020526001600160a01b0360406000205416151590565b806000526006825260406000206001815401905586600052600582526040600020816001600160a01b0319825416179055866040519160007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4868152a1613ff66001600160a01b036060840151166001600160801b038084511681602086015116011690309033906142c0565b6001600160801b03604082015116806140fa575b506001600160a01b038251167f075861cbceafeb777e8f15f357121b08f6f3adba387d599bb7b5278ca6192df5610160866001600160a01b03602087015116946140f16001600160a01b03606089015116976080810151151560a08201511515906140bb6001600160a01b0360e060c08601519501515116956040519788523360208901526040880190604090816001600160801b0391828151168552826020820151166020860152015116910152565b60a086015260c0850152805164ffffffffff90811660e08601526020820151811661010086015260409091015116610120840152565b610140820152a4565b614123906001600160a01b036060850151166001600160a01b0360e086015151169033906142c0565b3861400a565b602485604051906378630aa960e01b82526004820152fd5b506000613f2d565b50801515613f27565b606460405162461bcd60e51b815260206004820152602060248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152fd5b6040517f210aec0e00000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b6040517f9fee269100000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b6040517f4c23297000000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b60046040517f6095d3bc000000000000000000000000000000000000000000000000000000008152fd5b6020823d6020116142ac575b8161429960209383612ff7565b810103126105a75750613b129051613aef565b3d915061428c565b6040513d6000823e3d90fd5b9290604051927f23b872dd0000000000000000000000000000000000000000000000000000000060208501526001600160a01b03809216602485015216604483015260648201526064815260a081019181831067ffffffffffffffff8411176126e85761432f92604052614331565b565b6001600160a01b03169061439160405161434a81612fdb565b6020938482527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564858301526000808587829751910182855af161438b613467565b91614485565b805191821591848315614416575b5050509050156143ac5750565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b91938180945001031261099f578201519081151582036105a757508038808461439f565b1561444157565b606460405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152fd5b919290156144e65750815115614499575090565b3b156144a25790565b606460405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b8251909150156144f95750805190602001fd5b6104e89060405191829162461bcd60e51b8352602060048401526024830190612eba565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361454f57565b60046040517fa1c0d6e5000000000000000000000000000000000000000000000000000000008152fd5b916001600160a01b03604051927fa9059cbb000000000000000000000000000000000000000000000000000000006020850152166024830152604482015260448152608081019181831067ffffffffffffffff8411176126e85761432f92604052614331565b6130b8906145ec81613a16565b90600052600b60205260026040600020015460801c906136ea565b91908110156146175760051b0190565b634e487b7160e01b600052603260045260246000fd5b9190916001600160801b038080941691160191821161370357565b60009080825260056020526001600160a01b03806040842054169283331493841561468d575b5050821561467b57505090565b90915061468833926130bb565b161490565b60ff929450906040918152600860205281812033825260205220541691388061466e565b9092916146bc613629565b936001600160801b03928381169182156147c85767016345785d8a00008082116147915780851161475a5750614706856146f78193866138e0565b169460208901958652846138e0565b16918461471d60408901948086528287511661462d565b1610156147445761473684918261473f955116906136ea565b915116906136ea565b168252565b634e487b7160e01b600052600160045260246000fd5b84604491604051917f4fea5c1a00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b60449250604051917f47152d6700000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b505050505090506040516147db81612fbf565b6000815260006020820152600060408201529056fef8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7a164736f6c6343000815000a"; + hex"60a034620003e757601f196001600160401b03601f62004ca23881900382810185168601919084831187841017620003ec57808792606094604052833981010312620003e75783516001600160a01b03928382169291839003620003e7576020918287015196858816809803620003e75760400151948516809503620003e7576200008962000402565b90601c82527f5361626c696572205632204c6f636b7570204c696e656172204e46540000000084830152620000bd62000402565b601181527029a0a116ab1916a627a1a5aaa816a624a760791b8582015230608052600080546001600160a01b031990811688178255600180548216909b178b5596817fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a38351858111620003d35760039485548c81811c91168015620003c8575b89821014620003b45790818684931162000361575b508890868311600114620002f8578492620002ec575b505060001982871b1c1916908b1b1784555b8151948511620002d8576004958654998b8b811c9b168015620002cd575b828c1014620002ba57848b1162000271575b869798999a50819487116001146200020a57505093620001fe575b505082871b92600019911b1c19161790555b600a541617600a5560095560405161487f9081620004238239608051816145a90152f35b015191503880620001c8565b8883528183208c9890969594939116915b8282106200025757505085116200023c575b50505050811b019055620001da565b01519060f884600019921b161c19169055388080806200022d565b8484015187558c989096019593840193908101906200021b565b87835281832085880160051c81019b838910620002af575b860160051c019a8c905b8c8110620002a3575050620001ad565b848155018c9062000293565b909b508b9062000289565b634e487b7160e01b835260228852602483fd5b9a607f169a6200019b565b634e487b7160e01b81526041600452602490fd5b0151905038806200016b565b908c8e9416918886528a862092865b8c82821062000341575050841162000328575b505050811b0184556200017d565b015160001983891b60f8161c191690553880806200031a565b91929395968291958786015181550195019301908f959493929162000307565b9091508684528884208680850160051c8201928b8610620003aa575b918f91869594930160051c01915b8281106200039b57505062000155565b8681558594508f91016200038b565b925081926200037d565b634e487b7160e01b84526022600452602484fd5b90607f169062000140565b634e487b7160e01b82526041600452602482fd5b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620003ec5760405256fe608080604052600436101561001357600080fd5b600090813560e01c90816301ffc9a714612e245750806306fdde0314612d62578063081812fc14612d43578063095ea7b314612bb45780631400ecec14612b145780631c1cdd4c14612aaf5780631e99d56914612a9157806323b872dd14612a6757806339a73c0314612a2657806340e58ee514612788578063425d30dd1461276957806342842e0e1461271957806342966c681461258f5780634857501f146125055780634869e12d146124ca5780635fe3b567146124a35780636352211e146124735780636d0cee751461241d57806370a082311461237457806375829def146122e1578063780a82c8146122915780637cad6cd1146121c05780637de6b1db14611fc95780638659c27014611ca8578063894e9a0d14611a545780638bad38dd146119d75780638f69b9931461193b5780639067b677146118e857806395d89b41146117db57806396ce1431146116bc578063a22cb465146115eb578063a2ffb897146111fe578063a6202bf214611101578063a80fc071146110af578063ab167ccc14610f76578063ad35efd414610f14578063b256456914610ef5578063b88d4fde14610e68578063b8a3be6614610e33578063b971302a14610de4578063bc063e1a14610dc1578063bc2be1be14610d71578063c156a11d146109c1578063c87b56dd14610887578063cc364f48146107d9578063d4dbd20b14610787578063d511609f1461073b578063d975dfed146106ef578063e985e9c51461069a578063ea5ead1914610674578063eac8f5b81461060b578063f590c176146105e2578063f851a440146105bc5763fdd46d601461027357600080fd5b346105b95760603660031901126105b95760043561028f612f53565b610297613093565b906102a061459f565b6102a983613723565b6105a1576102cd83600052600b6020526001600160a01b0360406000205416331490565b90811580610591575b61057257838552602092600584526001600160a01b0391826040882054169380610566575b61054057828116928315610516576001600160801b038084169384156104fe5761032489614661565b82811686116104ca5750938093926103ca9261038f6103578d9a99988d8c52600b8d52600260408d20015460801c6146af565b8c8b52600b8c5261038a600260408d20019182906001600160801b036001600160801b031983549260801b169116179055565b6136b8565b906103ab818c840151169282604081835116920151169061375a565b16111561049a575b898852600b895260016040892001541692836145fb565b82877f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d88604051868152a48233141580610490575b610432575b837ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce78688604051908152a180f35b823b1561048c57608484928360405195869485936313375c3b60e01b85528b6004860152336024860152604485015260648401525af1610474575b8080610404565b61047d90612fcf565b61048857823861046d565b8280fd5b8380fd5b50823b15156103ff565b898852600b89526040882060018101600160c81b60ff60c81b1982541617905560ff60f01b1981541690556103b3565b60405163287ecaef60e21b8152600481018b90526001600160801b03928316602482015291166044820152606490fd5b0390fd5b6024896040519063d2aabcd960e01b82526004820152fd5b60046040517fc61a0e9e000000000000000000000000000000000000000000000000000000008152fd5b858360649260405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b508383821614156102fb565b60405163216caf0d60e01b815260048101859052336024820152604490fd5b5061059b846146ca565b156102d6565b60248360405190634a5541ef60e01b82526004820152fd5b80fd5b50346105b957806003193601126105b9576001600160a01b036020915416604051908152f35b50346105b95760203660031901126105b9576020610601600435613789565b6040519015158152f35b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d5760016040836001600160a01b039360209552600b855220015416604051908152f35b6024906040519062b8e7e760e51b82526004820152fd5b50346105b95760403660031901126105b957600435610691612f53565b61029782614661565b50346105b95760403660031901126105b9576106b4612f3d565b60406106be612f53565b926001600160a01b0380931681526008602052209116600052602052602060ff604060002054166040519015158152f35b50346105b95760203660031901126105b95760ff6001604060043593848152600b60205220015460d01c161561065d5761072a602091614661565b6001600160801b0360405191168152f35b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d5760408260029260209452600b845220015460801c604051908152f35b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d5760036040836001600160801b039360209552600b855220015416604051908152f35b50346105b95760203660031901126105b9576004356107f6613699565b50808252600b60205260ff600160408420015460d01c161561065d578160409160609352600b60205220600181549164ffffffffff918291015460a01c1690604051926108428461301d565b818160a01c16845260c81c166020830152604082015261088560405180926040908164ffffffffff91828151168552826020820151166020860152015116910152565bf35b50346105b9576020806003193601126109b1576004356108c56108c08260005260056020526001600160a01b0360406000205416151590565b6130a9565b826001600160a01b03600a5416916044604051809481937fe9dc637500000000000000000000000000000000000000000000000000000000835230600484015260248301525afa9283156109b5578093610934575b5050610930604051928284938452830190612f18565b0390f35b909192503d8082843e6109478184613055565b82019183818403126109b15780519067ffffffffffffffff8211610488570182601f820112156109b15780519161097d83613077565b9361098b6040519586613055565b8385528584840101116105b95750906109a991848085019101612ef5565b90388061091a565b5080fd5b604051903d90823e3d90fd5b50346105b95760403660031901126105b9576004356109de612f53565b906109e761459f565b808352602090600b825260ff600160408620015460d01c161561065d57808452600582526001600160a01b03928360408620541693843303610d5257610a2c83614661565b906001600160801b0390818316918215938415610a7d575b897ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce78989610a73818b8f61333c565b604051908152a180f35b610a8561459f565b610a8e87613723565b610d3a57610ab287600052600b6020526001600160a01b0360406000205416331490565b94851580610d2a575b610d0b57878b52600589528360408c2054169580610d01575b610cdd57891561051657610cc557610aeb87614661565b8281168511610c95575090610b4b610b188b96959493898852600b8b52600260408920015460801c6146af565b888752600b8a5261038a600260408920019182906001600160801b036001600160801b031983549260801b169116179055565b90610b67818a840151169282604081835116920151169061375a565b161115610c65575b858452600b8752600160408520015416610b8a8289836145fb565b87867f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d89604051868152a48133141580610c5b575b610c00575b50505081610a73917ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7958686604051858152a195819338610a44565b813b156104885782916084839260405194859384926313375c3b60e01b84528a60048501523360248501528c604485015260648401525af1610c43575b80610bc4565b610c4c90612fcf565b610c57578438610c3d565b8480fd5b50813b1515610bbf565b858452600b87526040842060018101600160c81b60ff60c81b1982541617905560ff60f01b198154169055610b6f565b60405163287ecaef60e21b8152600481018990526001600160801b03928316602482015291166044820152606490fd5b6024876040519063d2aabcd960e01b82526004820152fd5b6064888b60405191632dcbf6b960e11b835260048301523360248301526044820152fd5b50858a1415610ad4565b60405163216caf0d60e01b815260048101899052336024820152604490fd5b50610d34886146ca565b15610abb565b60248760405190634a5541ef60e01b82526004820152fd5b60405163216caf0d60e01b815260048101849052336024820152604490fd5b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d5760408264ffffffffff9260209452600b8452205460a01c16604051908152f35b50346105b957806003193601126105b957602060405167016345785d8a00008152f35b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d576040826001600160a01b039260209452600b8452205416604051908152f35b50346105b95760203660031901126105b95760ff600160406020936004358152600b855220015460d01c166040519015158152f35b50346105b95760803660031901126105b957610e82612f3d565b610e8a612f53565b906064359067ffffffffffffffff821161048c573660238301121561048c5781600401359284610eb985613077565b93610ec76040519586613055565b85855236602487830101116109b15785610ef2966024602093018388013785010152604435916131c7565b80f35b50346105b95760203660031901126105b95760206106016004356136ec565b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d57610f4d906139ff565b604051906005811015610f6257602092508152f35b602483634e487b7160e01b81526021600452fd5b50346105b9576101403660031901126105b957610f9161459f565b610f99613699565b9064ffffffffff80421680845260c43582811681036110aa5781018216602085015260e4359081831682036110aa5701166040830152606435916001600160a01b03918284168094036105b957506084358015158091036110aa5760a435908115158092036110aa57602435948486168096036110aa57600435958587168097036110aa57604435906001600160801b0382168092036110aa576040519761104089613000565b8852602088015260408701526060860152608085015260a084015260c08301526040610103193601126110aa576040519161107a83613039565b6101043591821682036110aa57826110a29260209452610124358482015260e0820152613b01565b604051908152f35b600080fd5b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d5760026040836001600160801b039360209552600b855220015416604051908152f35b50346105b95760203660031901126105b95761111b612f3d565b6001600160a01b03808354163381036111d5575081169081835260026020526001600160801b036040842054169081156111a45781611175918486526002602052604086206001600160801b0319815416905533906145fb565b6040519081527fca7a4a65a94ed2f37538814e00e1cd4c41a78261561e3f3794592f11409cf5af60203392a380f35b602483604051907f8410168c0000000000000000000000000000000000000000000000000000000082526004820152fd5b6040516331b339a960e21b81526001600160a01b03919091166004820152336024820152604490fd5b50346105b95760603660031901126105b95767ffffffffffffffff60043581811161048857611231903690600401612f9e565b9061123a612f53565b92604435908111610c5757611253903690600401612f9e565b61125e94919461459f565b8084036115b45791926001600160a01b038216159290865b818110611281578780f35b61128c818388614689565b359061129981858a614689565b356001600160801b03811681036110aa576112b261459f565b6112bb83613723565b6105a1576112df83600052600b6020526001600160a01b0360406000205416331490565b8015806115a4575b61057257838b5260056020526001600160a01b0360408c2054169080611591575b6115645787610516576001600160801b0382161561154c5761132984614661565b6001600160801b0381166001600160801b0384161161151a5750908a91848352600b80602052611399600261038a61136a868360408a20015460801c6146af565b918988528460205260408820019182906001600160801b036001600160801b031983549260801b169116179055565b6001600160801b036113bd816020840151169282604081835116920151169061375a565b1611156114ea575b8584526020526001600160a01b036001604085200154166113f06001600160801b0384168a836145fb565b6040516001600160801b0384168152867f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d60206001600160a01b038d1693a480331415806114e0575b611474575b5050507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce76020600193604051908152a101611276565b803b15610488576001600160a01b036084898580946001600160801b0360405197889687956313375c3b60e01b87528d60048801523360248801521660448601521660648401525af16114c8575b8061143e565b6114d190612fcf565b6114dc5788386114c2565b8880fd5b50803b1515611439565b858452806020526040842060018101600160c81b60ff60c81b1982541617905560ff60f01b1981541690556113c5565b60405163287ecaef60e21b8152600481018690526001600160801b038481166024830152919091166044820152606490fd5b6024846040519063d2aabcd960e01b82526004820152fd5b6064846001600160a01b038960405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b50806001600160a01b0388161415611308565b506115ae846146ca565b156112e7565b83604491604051917faec9344000000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b50346105b95760403660031901126105b957611605612f3d565b602435908115158092036110aa576001600160a01b0316908133146116785733835260086020526040832082600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a380f35b606460405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152fd5b50346105b9576101603660031901126105b9576116d761459f565b604051906116e482613000565b6116ec612f3d565b82526116f6612f53565b6020830152611703613093565b60408301526001600160a01b039060643582811681036110aa57606084015260843580151581036110aa57608084015260a43580151581036110aa5760a084015260603660c31901126105b9575060405161175d8161301d565b64ffffffffff60c43581811681036110aa57825260e43581811681036110aa5760208301526101043590811681036110aa57604082015260c08301526040610123193601126110aa57604051916117b383613039565b6101243591821682036110aa57826110a29260209452610144358482015260e0820152613b01565b50346105b957806003193601126105b957604051908060045491600183811c928185169485156118de575b60209586861081146118ca578588528794939291879082156118a857505060011461184e575b505061183a92500383613055565b610930604051928284938452830190612f18565b90859250600482527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5b85831061189057505061183a9350820101388061182c565b80548389018501528794508693909201918101611878565b925093505061183a94915060ff191682840152151560051b820101388061182c565b602483634e487b7160e01b81526022600452fd5b93607f1693611806565b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d57600160408364ffffffffff9360209552600b855220015460a01c16604051908152f35b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d57611974906139ff565b90600582101590816119b557600283149182156119c9575b82156119a0575b6020836040519015158152f35b9091506119b557506004602091143880611993565b80634e487b7160e01b602492526021600452fd5b50600383149150600061198c565b50346105b95760203660031901126105b9576004356001600160a01b039081811680910361048857818354163381036111d5575060015491816001600160a01b03198416176001556040519216825260208201527fdcb09aef4bf01068924ccce937981cbe59d25ba08380cf941aaaea4e4bd3960d60403392a280f35b50346105b95760203660031901126105b957604051611a7281612fe3565b8181528160208201528160408201528160608201528160808201528160a08201528160c08201528160e08201528161010082015281610120820152610140611ab8613699565b9101526004358152600b60205260ff600160408320015460d01c1615611c90576004358152600b60205260408120611b91600260405192611af884612fe3565b80546001600160a01b038116855264ffffffffff8160a01c16602086015264ffffffffff8160c81c16604086015260ff8160f01c161515606086015260f81c1515608085015260ff60018201546001600160a01b03811660a087015264ffffffffff8160a01c1660c0870152818160c81c16151560e0870152818160d01c16151561010087015260d81c161515610120850152016136b8565b610140820152611ba26004356139ff565b6005811015610f62579160026101a09314611c85575b50610885610140604051926001600160a01b03815116845264ffffffffff602082015116602085015264ffffffffff60408201511660408501526060810151151560608501526080810151151560808501526001600160a01b0360a08201511660a085015264ffffffffff60c08201511660c085015260e0810151151560e0850152610100810151151561010085015261012081015115156101208501520151610140830190604090816001600160801b0391828151168552826020820151166020860152015116910152565b606082015238611bb8565b602460405162b8e7e760e51b81526004356004820152fd5b50346105b957602090816003193601126105b95760043567ffffffffffffffff81116109b157611cdd83913690600401612f9e565b9190611ce761459f565b83925b808410611cf5578480f35b611d0484828497959697614689565b3594611d0e61459f565b611d1786613723565b15611d345760248660405190634a5541ef60e01b82526004820152fd5b611d3d86613789565b611fb157611d6186600052600b6020526001600160a01b0360406000205416331490565b15611f9257611d6f866137ba565b95808552600b90818752611d88600260408820016136b8565b906001600160801b039283835116848b161015611f7a5781885280895260ff604089205460f01c1615611f6257611dd88a858b611dce60409a9b9c9d9e8389511661375a565b960151169061375a565b92828a52818b52868a20908b8b7f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa50845497600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8a1617865560038a8216968715611f48575b01998516998a6001600160801b03198254161790556001600160a01b0380991698899360058652818e822054169889965260019d8e912001541694611e858b85886145fb565b604080518a81526001600160801b0392831660208201529290911690820152606090a47ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce78b604051858152a1813b611ee9575b505050505001919093919293611cea565b813b15611f4457899493919285809460849360405197889687956372eba20360e01b875260048701526024860152604485015260648401525af1611f30575b808080611ed8565b611f3990612fcf565b610c57578487611f28565b8980fd5b60018101600160c81b60ff60c81b19825416179055611e3f565b602482604051906339c6dc7360e21b82526004820152fd5b602482604051906322cad1af60e11b82526004820152fd5b60405163216caf0d60e01b815260048101879052336024820152604490fd5b6024866040519063fe19f19f60e01b82526004820152fd5b50346105b9576020806003193601126109b15760043590611fe861459f565b818352600b815260ff600160408520015460d01c16156121a95761200b826139ff565b600581101561219557600481036120345760248360405190634a5541ef60e01b82526004820152fd5b60038103612054576024836040519063fe19f19f60e01b82526004820152fd5b600214611f7a5761207b82600052600b6020526001600160a01b0360406000205416331490565b1561217657818352600b815260ff604084205460f01c1615611f6257818352600b81526040832060ff60f01b19815416905582604051837f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f8380a2600583526001600160a01b03604083205416803b61211e575b5050507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce791604051908152a180f35b803b1561048857816024818580947f341a0bd90000000000000000000000000000000000000000000000000000000083528960048401525af1612162575b806120ef565b61216b90612fcf565b61048857823861215c565b60405163216caf0d60e01b815260048101839052336024820152604490fd5b602484634e487b7160e01b81526021600452fd5b6024826040519062b8e7e760e51b82526004820152fd5b50346105b95760203660031901126105b9576004356001600160a01b039081811680910361048857818354163381036111d55750600a5491816001600160a01b0319841617600a556040519216825260208201527fa2548bd4b805e907c1558a47b5858324fe8bb4a2e1ddfca647eecbf65610eebc60403392a2600954600019810190811161227d5760407f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c91815190600182526020820152a180f35b602482634e487b7160e01b81526011600452fd5b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d5760408264ffffffffff9260209452600b8452205460c81c16604051908152f35b50346105b95760203660031901126105b9576122fb612f3d565b9080546001600160a01b038082169333850361234d576001600160a01b03199394501691829116178255337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808380a380f35b6040516331b339a960e21b81526001600160a01b0386166004820152336024820152604490fd5b50346105b95760203660031901126105b9576001600160a01b03612396612f3d565b1680156123b3578160409160209352600683522054604051908152f35b608460405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e657200000000000000000000000000000000000000000000006064820152fd5b50346105b95760203660031901126105b9576001600160a01b0360406020926004356124626108c08260005260056020526001600160a01b0360406000205416151590565b815260058452205416604051908152f35b50346105b95760203660031901126105b95760206124926004356130f4565b6001600160a01b0360405191168152f35b50346105b957806003193601126105b95760206001600160a01b0360015416604051908152f35b50346105b95760203660031901126105b95760ff6001604060043593848152600b60205220015460d01c161561065d5761072a602091613a86565b50346105b95760203660031901126105b95760043590818152600b60205260ff600160408320015460d01c16156121a95780612540836139ff565b92600584101561257b57600260209403612561575b50506040519015158152f35b8152600b8352604090205460f01c60ff1690503880612555565b602482634e487b7160e01b81526021600452fd5b50346105b95760203660031901126105b9576004356125ac61459f565b6125b581613723565b156126e8576125c3816146ca565b156126c8576125d1816130f4565b6125da826136ec565b1590816126c0575b816126ad575b506126955760208161261a7ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7936130f4565b90808552600783526001600160a01b0360408620926001600160a01b03199384815416905516918286526006845260408620600019815401905581865260058452604086209081541690558085604051937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a48152a180f35b60249060405190630da9b01360e01b82526004820152fd5b6001600160a01b039150161515386125e8565b8391506125e2565b60405163216caf0d60e01b81526004810191909152336024820152604490fd5b602490604051907f817cd6390000000000000000000000000000000000000000000000000000000082526004820152fd5b50346105b95761272836612f69565b60405191602083019383851067ffffffffffffffff86111761275357610ef2946040528584526131c7565b634e487b7160e01b600052604160045260246000fd5b50346105b95760203660031901126105b9576020610601600435613723565b50346105b9576020806003193601126109b157600435906127a761459f565b6127b082613723565b156127cd5760248260405190634a5541ef60e01b82526004820152fd5b906127d781613789565b612a0e576127fb81600052600b6020526001600160a01b0360406000205416331490565b156126c857612809816137ba565b818452600b835261281f600260408620016136b8565b926001600160801b03918285511683821610156129f657838652600b825260ff604087205460f01c16156129de5792827ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce783612894878460409761288a8d9b61293f9b8e511661375a565b9b0151169061375a565b92848852600b825287868120947f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa50865491600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841617885560038582169889156129c4575b01948d169c858e6001600160801b0319819854161790556001600160a01b038094169b8c94600589526001818e892054169d8e98600b8c52200154169685886145fb565b604080518b81526001600160801b0392831660208201529290911690820152606090a4604051848152a1823b612973578480f35b823b15610c5757608492859160405197889687956372eba20360e01b875260048701526024860152604485015260648401525af16129b5575b81818080808480f35b6129be90612fcf565b386129ac565b60018101600160c81b60ff60c81b198254161790556128fb565b602484604051906339c6dc7360e21b82526004820152fd5b602484604051906322cad1af60e11b82526004820152fd5b6024906040519063fe19f19f60e01b82526004820152fd5b50346105b95760203660031901126105b9576001600160801b0360406020926001600160a01b03612a55612f3d565b16815260028452205416604051908152f35b50346105b957610ef2612a7936612f69565b91612a8c612a87843361325d565b613156565b61333c565b50346105b957806003193601126105b9576020600954604051908152f35b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d57612ae8906139ff565b9060058210156119b55760208215838115612b09575b506040519015158152f35b600191501482612afe565b50346105b95760203660031901126105b95760043590818152600b60205260ff600160408320015460d01c16156121a957602091604082828152600b85522060ff815460f01c1680612ba2575b612b79575b50506001600160801b0360405191168152f35b612b9b92506001600160801b036002612b9592015416916137ba565b9061375a565b3880612b66565b5060ff600182015460c81c1615612b61565b50346105b95760403660031901126105b957612bce612f3d565b602435906001600160a01b038080612be5856130f4565b16921691808314612cd957803314908115612cb8575b5015612c4e57828452600760205260408420826001600160a01b0319825416179055612c26836130f4565b167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258480a480f35b608460405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152fd5b9050845260086020526040842033855260205260ff60408520541638612bfb565b608460405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152fd5b50346105b95760203660031901126105b9576020612492600435613119565b50346105b957806003193601126105b957604051908060035491600183811c92818516948515612e1a575b60209586861081146118ca578588528794939291879082156118a8575050600114612dc057505061183a92500383613055565b90859250600382527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b858310612e0257505061183a9350820101388061182c565b80548389018501528794508693909201918101612dea565b93607f1693612d8d565b9050346109b15760203660031901126109b1576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361048857602092507f80ac58cd000000000000000000000000000000000000000000000000000000008114908115612ecb575b8115612ea1575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501438612e9a565b7f5b5e139f0000000000000000000000000000000000000000000000000000000081149150612e93565b60005b838110612f085750506000910152565b8181015183820152602001612ef8565b90602091612f3181518092818552858086019101612ef5565b601f01601f1916010190565b600435906001600160a01b03821682036110aa57565b602435906001600160a01b03821682036110aa57565b60609060031901126110aa576001600160a01b039060043582811681036110aa579160243590811681036110aa579060443590565b9181601f840112156110aa5782359167ffffffffffffffff83116110aa576020808501948460051b0101116110aa57565b67ffffffffffffffff811161275357604052565b610160810190811067ffffffffffffffff82111761275357604052565b610100810190811067ffffffffffffffff82111761275357604052565b6060810190811067ffffffffffffffff82111761275357604052565b6040810190811067ffffffffffffffff82111761275357604052565b90601f8019910116810190811067ffffffffffffffff82111761275357604052565b67ffffffffffffffff811161275357601f01601f191660200190565b604435906001600160801b03821682036110aa57565b156130b057565b606460405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152fd5b60005260056020526001600160a01b03604060002054166131168115156130a9565b90565b61313c6108c08260005260056020526001600160a01b0360406000205416151590565b60005260076020526001600160a01b036040600020541690565b1561315d57565b608460405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f766564000000000000000000000000000000000000006064820152fd5b906131eb9392916131db612a87843361325d565b6131e683838361333c565b613507565b156131f257565b60405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b906001600160a01b038080613271846130f4565b169316918383149384156132a4575b50831561328e575b50505090565b61329a91929350613119565b1614388080613288565b909350600052600860205260406000208260005260205260ff604060002054169238613280565b156132d257565b608460405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152fd5b90613365929161334b836130f4565b916001600160a01b039485938480941696879116146132cb565b169081158061346e57613377846136ec565b159081613465575b508061345c575b61344457918084926133c67ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7966020966133bf856130f4565b16146132cb565b60009382855260078652604085206001600160a01b031990818154169055818652600687526040862060001981540190558286526040862060018154019055838652600587528260408720918254161790557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6040519580a48152a1565b60248360405190630da9b01360e01b82526004820152fd5b50831515613386565b9050153861337f565b608460405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152fd5b3d15613502573d906134e882613077565b916134f66040519384613055565b82523d6000602084013e565b606090565b9290803b1561369057613571916020916001600160a01b0394604051809581948293897f150b7a02000000000000000000000000000000000000000000000000000000009b8c86523360048701521660248501526044840152608060648401526084830190612f18565b03916000968791165af190829082613630575b505061360a576135926134d7565b805190816136055760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000161490565b909192506020813d8211613688575b8161364c60209383613055565b810103126109b15751907fffffffff00000000000000000000000000000000000000000000000000000000821682036105b95750903880613584565b3d915061363f565b50505050600190565b604051906136a68261301d565b60006040838281528260208201520152565b906040516136c58161301d565b6040819360018154916001600160801b0392838116865260801c6020860152015416910152565b80600052600b60205260ff60016040600020015460d01c161561065d57600052600b60205260ff60016040600020015460d81c1690565b80600052600b60205260ff60016040600020015460d01c161561065d57600052600b60205260ff60016040600020015460c81c1690565b6001600160801b03918216908216039190821161377357565b634e487b7160e01b600052601160045260246000fd5b80600052600b60205260ff60016040600020015460d01c161561065d57600052600b60205260406000205460f81c90565b600090808252600b6020526040822091825464ffffffffff42818360c81c16116138685780600186015460a01c169182421015613852576138079394955060a01c16809103904203613870565b90828152600b6020526001600160801b039261382d846002604085200154168094613950565b92831161383a5750501690565b60029350604092508152600b60205220015460801c90565b505050505060026001600160801b039101541690565b505091505090565b670de0b6b3a764000091600019838309928083029283808610950394808603951461392c57828510156138f057908291096001821901821680920460028082600302188083028203028083028203028083028203028083028203028083028203028092029003029360018380600003040190848311900302920304170290565b82606492604051927f63a05778000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b50508092501561393a570490565b634e487b7160e01b600052601260045260246000fd5b909190600019838209838202918280831092039180830392146139ee57670de0b6b3a764000090818310156139b757947faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066994950990828211900360ee1b910360121c170290565b60449086604051917f5173648d00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050670de0b6b3a764000090049150565b80600052600b602052604060002060ff600182015460c81c16600014613a26575050600490565b805460f81c613a7f575460a01c64ffffffffff164210613a7957613a49816137ba565b90600052600b6020526001600160801b038060026040600020015416911610600014613a7457600190565b600290565b50600090565b5050600390565b80600052600b602052613a9f60026040600020016136b8565b81600052600b602052604060002060ff600182015460c81c16600014613ad257506001600160801b039150602001511690565b5460f81c613ae45750613116906137ba565b61311691506001600160801b03604081835116920151169061375a565b906001600160a01b036001541660206001600160a01b036060850151166024604051809481937fdcf844a700000000000000000000000000000000000000000000000000000000835260048301525afa801561433657600090614302575b613b8291506001600160801b0360408501511690602060e0860151015191614733565b916001600160801b0383511660c082015190156142d85764ffffffffff815116602082019064ffffffffff8251169081811161429857505064ffffffffff604091511691019064ffffffffff825116908181101561425857505064ffffffffff8042169151169081811015614218575050600954926001600160801b0381511660405190613c0f8261301d565b815260006020820152600060408201526001600160a01b036060840151169060c08401519164ffffffffff6020840151169064ffffffffff604085015116906080870151151560a088015115159364ffffffffff6001600160a01b038a511697511660405197613c7e89612fe3565b88526020880152604087015260608601526000608086015260a085015260c0840152600060e0840152600161010084015261012083015261014082015284600052600b60205260406000206001600160a01b038251166001600160a01b0319825416178155613d1564ffffffffff602084015116829064ffffffffff60a01b1964ffffffffff60a01b83549260a01b169116179055565b604082015181547eff0000000000000000000000000000000000000000000000000000000000006060850151151560f01b169078ffffffffffffffffffffffffffffffffffffffffffffffffff7dffffffffff000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000006080880151151560f81b169460c81b1691161717178155600181016001600160a01b0360a0840151166001600160a01b0319825416178155613e0c64ffffffffff60c085015116829064ffffffffff60a01b1964ffffffffff60a01b83549260a01b169116179055565b60e083015181546101008501516101208601517fffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff90921692151560c81b79ff00000000000000000000000000000000000000000000000000169290921791151560d01b7aff0000000000000000000000000000000000000000000000000000169190911790151560d81b7bff00000000000000000000000000000000000000000000000000000016179055610140909101518051602082015160801b6001600160801b03199081166001600160801b03928316176002850155926040906003019201511682825416179055600185016009556001600160a01b0360608401511660005260026020526001600160801b0380604060002054168160208501511601166001600160a01b036060850151166000526040600020918254161790556001600160a01b0360208301511680156141d457613f87613f818660005260056020526001600160a01b0360406000205416151590565b156144bc565b613f90856136ec565b15806141cb575b806141c3575b6141ab5760207ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce791613fe8613f818860005260056020526001600160a01b0360406000205416151590565b806000526006825260406000206001815401905586600052600582526040600020816001600160a01b0319825416179055866040519160007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4868152a16140786001600160a01b036060840151166001600160801b03808451168160208601511601169030903390614342565b6001600160801b036040820151168061417c575b506001600160a01b038251167f075861cbceafeb777e8f15f357121b08f6f3adba387d599bb7b5278ca6192df5610160866001600160a01b03602087015116946141736001600160a01b03606089015116976080810151151560a082015115159061413d6001600160a01b0360e060c08601519501515116956040519788523360208901526040880190604090816001600160801b0391828151168552826020820151166020860152015116910152565b60a086015260c0850152805164ffffffffff90811660e08601526020820151811661010086015260409091015116610120840152565b610140820152a4565b6141a5906001600160a01b036060850151166001600160a01b0360e08601515116903390614342565b3861408c565b60248560405190630da9b01360e01b82526004820152fd5b506000613f9d565b50801515613f97565b606460405162461bcd60e51b815260206004820152602060248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152fd5b6040517f210aec0e00000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b6040517f9fee269100000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b6040517f4c23297000000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b60046040517f6095d3bc000000000000000000000000000000000000000000000000000000008152fd5b6020823d60201161432e575b8161431b60209383613055565b810103126105b95750613b829051613b5f565b3d915061430e565b6040513d6000823e3d90fd5b9290604051927f23b872dd0000000000000000000000000000000000000000000000000000000060208501526001600160a01b03809216602485015216604483015260648201526064815260a081019181831067ffffffffffffffff841117612753576143b1926040526143b3565b565b6001600160a01b0316906144136040516143cc81613039565b6020938482527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564858301526000808587829751910182855af161440d6134d7565b91614507565b805191821591848315614498575b50505090501561442e5750565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b9193818094500103126109b1578201519081151582036105b9575080388084614421565b156144c357565b606460405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152fd5b91929015614568575081511561451b575090565b3b156145245790565b606460405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b82519091501561457b5750805190602001fd5b6104fa9060405191829162461bcd60e51b8352602060048401526024830190612f18565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036145d157565b60046040517fa1c0d6e5000000000000000000000000000000000000000000000000000000008152fd5b916001600160a01b03604051927fa9059cbb000000000000000000000000000000000000000000000000000000006020850152166024830152604482015260448152608081019181831067ffffffffffffffff841117612753576143b1926040526143b3565b6131169061466e81613a86565b90600052600b60205260026040600020015460801c9061375a565b91908110156146995760051b0190565b634e487b7160e01b600052603260045260246000fd5b9190916001600160801b038080941691160191821161377357565b60009080825260056020526001600160a01b03806040842054169283331493841561470f575b505082156146fd57505090565b90915061470a3392613119565b161490565b60ff92945090604091815260086020528181203382526020522054169138806146f0565b90929161473e613699565b936001600160801b039283811691821561484a5767016345785d8a0000808211614813578085116147dc575061478885614779819386613950565b16946020890195865284613950565b16918461479f6040890194808652828751166146af565b1610156147c6576147b88491826147c19551169061375a565b9151169061375a565b168252565b634e487b7160e01b600052600160045260246000fd5b84604491604051917f4fea5c1a00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b60449250604051917f47152d6700000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050505050905060405161485d8161301d565b6000815260006020820152600060408201529056fea164736f6c6343000815000a"; bytes public constant BYTECODE_NFT_DESCRIPTOR = hex"6080806040523461001757615dac90816200001d8239f35b600080fdfe6080604052600436101561001257600080fd5b60003560e01c63e9dc63751461002757600080fd5b346142f85760403660031901126142f8576001600160a01b0360043516600435036142f857610056608061486e565b60006080819052606060a081905260c082905260e0819052610120819052610140819052610160819052610180919091526101a0526004356001600160a01b03166101008190526100a690614c58565b61012052610100516040517feac8f5b80000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa908115614305576000916147dd575b506001600160a01b03610117911680608052615669565b60a052610100516040517fa80fc0710000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa8015614305576fffffffffffffffffffffffffffffffff916000916147be575b501660c052610100516040517fad35efd40000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa801561430557600090614781575b6101e59150615889565b61014052610100516040517f4869e12d0000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa90811561430557600091614752575b5060c0516fffffffffffffffffffffffffffffffff16801561473c576fffffffffffffffffffffffffffffffff612710819302160416610100608001526102876004356153c7565b610120608001526040514660208201526bffffffffffffffffffffffff1960043560601b16604082015260243560548201526054815280608081011067ffffffffffffffff60808301111761431157608081016040526020815191012061041a602963ffffffff61032e6103078261016861ffff8860101c160616614b08565b91601e604660ff6103248460146050848d60081c16060116614b08565b9816060116614b08565b6040519485927f68736c2800000000000000000000000000000000000000000000000000000000602085015261036e815180926020602488019101614826565b83017f2c0000000000000000000000000000000000000000000000000000000000000060248201526103aa825180936020602585019101614826565b017f252c00000000000000000000000000000000000000000000000000000000000060258201526103e5825180936020602785019101614826565b017f252900000000000000000000000000000000000000000000000000000000000060278201520360098101845201826148df565b6104526fffffffffffffffffffffffffffffffff6040608001511660ff61044b6001600160a01b03608051166155dc565b1690614e89565b6104666001600160a01b0360805116614c58565b60a051610100516040517fbc2be1be0000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa80156143055760249160009161471d575b5060206001600160a01b03608080015116604051938480927f9067b677000000000000000000000000000000000000000000000000000000008252823560048301525afa801561430557610528926000916146ee575b5064ffffffffff80911691166151d5565b61012051610180519092916105b2602161054f6064610548818706615744565b9504614b08565b6040519481610568879351809260208087019101614826565b820161057d8251809360208085019101614826565b017f250000000000000000000000000000000000000000000000000000000000000060208201520360018101855201836148df565b610100608001519260c060800151956101206080015197604051996105d68b61486e565b8a5260208a015260408901526060880152608087015260a086015260c085015260e0840152610100830152610120820152604051806101c081011067ffffffffffffffff6101c083011117614311576101c0810160405260608152600060208201526000604082015260608082015260006080820152606060a0820152600060c0820152600060e08201526060610100820152600061012082015260006101408201526060610160820152600061018082015260006101a082015260a08201516106a660c0840151845190615a7a565b906109b361015c604051926106ba846148c3565b600884527f50726f677265737300000000000000000000000000000000000000000000000060208501526107236040516106f38161488b565b60009052855160208701207fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4701490565b156146e6576090945b61073586614b08565b916040519586938493661e339034b21e9160c91b60208601526109818351958692610767846027840160208901614826565b6d11103334b6361e9111b33333111f60911b602785840101526c1e3932b1ba103bb4b23a341e9160991b603585840101526107ae8551809660206042888701019101614826565b7f22206865696768743d22313030222066696c6c2d6f7061636974793d222e3033828501860160428101919091527f222072783d223135222072793d22313522207374726f6b653d2223666666222060628201527f7374726f6b652d6f7061636974793d222e3122207374726f6b652d77696474686082820152651e911a11179f60d11b60a28201527f3c7465787420783d2232302220793d2233342220666f6e742d66616d696c793d60a88201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f7370616365222060c8820152703337b73a16b9b4bd329e911919383c111f60791b60e88201528651966108b491889160f990910190602001614826565b661e17ba32bc3a1f60c91b8285018601870160f98101919091527f3c7465787420783d2232302220793d2237322220666f6e742d66616d696c793d6101008201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f73706163652220610120820152703337b73a16b9b4bd329e91191b383c111f60791b61014082015287519761094f91899161015190910190602001614826565b661e17ba32bc3a1f60c91b6101518888888887010101010152602061015888888885519c8d9701010101019101614826565b631e17b39f60e11b90860190910190910190910190910161015881019190915281900361013c810190915201826148df565b6101008301526101208201526028610100830151604051906109d48261488b565b60008252610c7a61015c604051926109eb846148c3565b600684527f53746174757300000000000000000000000000000000000000000000000000006020850152610a1e84615cba565b610a2782615d37565b808211156146de5750945b610a3d878701614b08565b91604051958693661e339034b21e9160c91b60208601528151610a67816027880160208601614826565b85016d11103334b6361e9111b33333111f60911b60278201526c1e3932b1ba103bb4b23a341e9160991b6035820152610aaa825180936020604285019101614826565b017f22206865696768743d22313030222066696c6c2d6f7061636974793d222e303360428201527f222072783d223135222072793d22313522207374726f6b653d2223666666222060628201527f7374726f6b652d6f7061636974793d222e3122207374726f6b652d77696474686082820152651e911a11179f60d11b60a28201527f3c7465787420783d2232302220793d2233342220666f6e742d66616d696c793d60a88201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f7370616365222060c8820152703337b73a16b9b4bd329e911919383c111f60791b60e8820152610ba682518093602060f985019101614826565b01661e17ba32bc3a1f60c91b60f98201527f3c7465787420783d2232302220793d2237322220666f6e742d66616d696c793d6101008201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f73706163652220610120820152703337b73a16b9b4bd329e91191b383c111f60791b610140820152610c3582518093602061015185019101614826565b01661e17ba32bc3a1f60c91b610151820152610c5c82518093602061015885019101614826565b01631e17b39f60e11b6101588201520361013c8101845201826148df565b610160840152016101808201526028602083015160405190610c9b8261488b565b60008252610ce561015c60405192610cb2846148c3565b600684527f416d6f756e7400000000000000000000000000000000000000000000000000006020850152610a1e84615cba565b835201602082015261102060808301516030604051610d038161488b565b60008152610faa61015c60405194610d1a866148c3565b600886527f4475726174696f6e0000000000000000000000000000000000000000000000006020870152610d4d86615cba565b610d5682615d37565b808211156146d65750935b610d6d60288601614b08565b91604051978893661e339034b21e9160c91b60208601528151610d97816027880160208601614826565b85016d11103334b6361e9111b33333111f60911b60278201526c1e3932b1ba103bb4b23a341e9160991b6035820152610dda825180936020604285019101614826565b017f22206865696768743d22313030222066696c6c2d6f7061636974793d222e303360428201527f222072783d223135222072793d22313522207374726f6b653d2223666666222060628201527f7374726f6b652d6f7061636974793d222e3122207374726f6b652d77696474686082820152651e911a11179f60d11b60a28201527f3c7465787420783d2232302220793d2233342220666f6e742d66616d696c793d60a88201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f7370616365222060c8820152703337b73a16b9b4bd329e911919383c111f60791b60e8820152610ed682518093602060f985019101614826565b01661e17ba32bc3a1f60c91b60f98201527f3c7465787420783d2232302220793d2237322220666f6e742d66616d696c793d6101008201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f73706163652220610120820152703337b73a16b9b4bd329e91191b383c111f60791b610140820152610f6582518093602061015185019101614826565b01661e17ba32bc3a1f60c91b610151820152610f8c82518093602061015885019101614826565b01631e17b39f60e11b6101588201520361013c8101865201846148df565b8260a08601526028810160c0860152602085015190610120860151809161018088015192839185010101605881016080890152605719906103e8030160011c8061014089015201601081016101a088015201602081016040870152010160e0840152610100830151610160840151845191614e1f565b6060820152604051908161010081011067ffffffffffffffff6101008401111761431157610100820160405260c782527f3c726563742077696474683d223130302522206865696768743d22313030252260208301527f2066696c7465723d2275726c28234e6f69736529222f3e3c7265637420783d2260408301527f37302220793d223730222077696474683d2238363022206865696768743d223860608301527f3630222066696c6c3d2223666666222066696c6c2d6f7061636974793d222e3060808301527f33222072783d223435222072793d22343522207374726f6b653d22236666662260a08301527f207374726f6b652d6f7061636974793d222e3122207374726f6b652d7769647460c08301527f683d2234222f3e0000000000000000000000000000000000000000000000000060e083015282519161010084015191606081015194604051611176816148a7565b603381527f3c636972636c652069643d22476c6f772220723d22353030222066696c6c3d2260208201527f75726c282352616469616c476c6f7729222f3e000000000000000000000000006040820152604051966111d38861486e565b61011c88527f3c66696c7465722069643d224e6f697365223e3c6665466c6f6f6420783d223060208901527f2220793d2230222077696474683d223130302522206865696768743d2231303060408901527f252220666c6f6f642d636f6c6f723d2268736c283233302c3231252c3131252960608901527f2220666c6f6f642d6f7061636974793d22312220726573756c743d22666c6f6f60808901527f6446696c6c222f3e3c666554757262756c656e6365206261736546726571756560a08901527f6e63793d222e3422206e756d4f6374617665733d22332220726573756c743d2260c08901527f4e6f6973652220747970653d226672616374616c4e6f697365222f3e3c66654260e08901527f6c656e6420696e3d224e6f6973652220696e323d22666c6f6f6446696c6c22206101008901527f6d6f64653d22736f66742d6c69676874222f3e3c2f66696c7465723e0000000061012089015260405197886103a081011067ffffffffffffffff6103a08b011117614311576103a0890160405261037b89527f3c706174682069643d224c6f676f222066696c6c3d2223666666222066696c6c60208a01527f2d6f7061636974793d222e312220643d226d3133332e3535392c3132342e303360408a01527f34632d2e3031332c322e3431322d312e3035392c342e3834382d322e3932332c60608a01527f362e3430322d322e3535382c312e3831392d352e3136382c332e3433392d372e60808a01527f3838382c342e3939362d31342e34342c382e3236322d33312e3034372c31322e60a08a01527f3536352d34372e3637342c31322e3536392d382e3835382e3033362d31372e3860c08a01527f33382d312e3237322d32362e3332382d332e3636332d392e3830362d322e373660e08a01527f362d31392e3038372d372e3131332d32372e3536322d31322e3737382d31332e6101008a01527f3834322d382e3032352c392e3436382d32382e3630362c31362e3135332d33356101208a01527f2e323635683063322e3033352d312e3833382c342e3235322d332e3534362c366101408a01527f2e3436332d352e323234683063362e3432392d352e3635352c31362e3231382d6101608a01527f322e3833352c32302e3335382c342e31372c342e3134332c352e3035372c382e6101808a01527f3831362c392e3634392c31332e39322c31332e373334682e30333763352e37336101a08a01527f362c362e3436312c31352e3335372d322e3235332c392e33382d382e34382c306101c08a01527f2c302d332e3531352d332e3531352d332e3531352d332e3531352d31312e34396101e08a01527f2d31312e3437382d35322e3635362d35322e3636342d36342e3833372d36342e6102008a01527f3833376c2e3034392d2e303337632d312e3732352d312e3630362d322e3731396102208a01527f2d332e3834372d322e3735312d362e3230346830632d2e3034362d322e3337356102408a01527f2c312e3036322d342e3538322c322e3732362d362e32323968306c2e3138352d6102608a01527f2e3134386830632e3039392d2e3036322c2e3232322d2e3134382c2e33372d2e6102808a01527f323539683063322e30362d312e3336322c332e3935312d322e3632312c362e306102a08a01527f34342d332e3834324335372e3736332d332e3437332c39372e37362d322e33346102c08a01527f312c3132382e3633372c31382e3333326331362e3637312c392e3934362d32366102e08a01527f2e3334342c35342e3831332d33382e3635312c34302e3139392d362e3239392d6103008a01527f362e3039362d31382e3036332d31372e3734332d31392e3636382d31382e38316103208a01527f312d362e3031362d342e3034372d31332e3036312c342e3737362d372e3735326103408a01527f2c392e3735316c36382e3235342c36382e33373163312e3732342c312e3630316103608a01527f2c322e3731342c332e38342c322e3733382c362e3139325a222f3e00000000006103808a0152604051978860a081011067ffffffffffffffff60a08b01111761431157611cb1611d129160a08b0160405260758b527f3c706174682069643d22466c6f6174696e6754657874222066696c6c3d226e6f60208c01527f6e652220643d224d31323520343568373530733830203020383020383076373560408c01527f307330203830202d3830203830682d373530732d38302030202d3830202d383060608c01527f762d3735307330202d3830203830202d3830222f3e000000000000000000000060808c0152611868615a41565b906040517f3c72616469616c4772616469656e742069643d2252616469616c476c6f77223e6020820152611d0d60d87f3c73746f70206f66667365743d223025222073746f702d636f6c6f723d22000093846040850152805161199a60b88660208501936118da81605e840187614826565b8101997f222073746f702d6f7061636974793d222e36222f3e0000000000000000000000605e8c01527f3c73746f70206f66667365743d2231303025222073746f702d636f6c6f723d229a8b607382015261193f825180936020609385019101614826565b017f222073746f702d6f7061636974793d2230222f3e00000000000000000000000060938201527f3c2f72616469616c4772616469656e743e00000000000000000000000000000060a78201520360988101885201866148df565b6119a2615a41565b90604051967f3c6c696e6561724772616469656e742069643d2253616e64546f70222078313d60208901527f223025222079313d223025223e000000000000000000000000000000000000006040890152604d8801528251611a0881606b8a0184614826565b8701917f222f3e00000000000000000000000000000000000000000000000000000000009283606b82015289606e820152611a4d825180936020608e85019101614826565b019082608e830152611a9160a2897f3c2f6c696e6561724772616469656e743e0000000000000000000000000000009485609182015203608281018b5201896148df565b611bd7610108611a9f615a41565b6040519b8c917f3c6c696e6561724772616469656e742069643d2253616e64426f74746f6d222060208401527f78313d2231303025222079313d2231303025223e00000000000000000000000060408401527f3c73746f70206f66667365743d22313025222073746f702d636f6c6f723d22006054840152611b2b815180926020607387019101614826565b8201908760738301526076820152875190611b4a826096830188614826565b018660968201527f3c616e696d617465206174747269627574654e616d653d22783122206475723d60998201527f2236732220726570656174436f756e743d22696e646566696e6974652220766160b98201527f6c7565733d223330253b3630253b313230253b3630253b3330253b222f3e000060d98201528560f78201520360e881018c52018a6148df565b611bdf615a41565b906040519a8b957f3c6c696e6561724772616469656e742069643d22486f7572676c61737353747260208801527f6f6b6522206772616469656e745472616e73666f726d3d22726f74617465283960408801527f302922206772616469656e74556e6974733d227573657253706163654f6e557360608801527f65223e000000000000000000000000000000000000000000000000000000000060808801527f3c73746f70206f66667365743d22353025222073746f702d636f6c6f723d2200608388015251809260a2880190614826565b84018360a28201527f3c73746f70206f66667365743d22383025222073746f702d636f6c6f723d220060a5820152611cf382518093602060c485019101614826565b019160c483015260c78201520360b88101875201856148df565b614e1f565b92611d32611d1e615817565b896020815191012090602081519101201490565b9788156146ad575b506040518060c081011067ffffffffffffffff60c0830111176143115760c08101604052609081527f3c7061746820643d224d2035302c3336302061203330302c333030203020312c60208201527f31203630302c302061203330302c333030203020312c31202d3630302c30222060408201527f66696c6c3d2223666666222066696c6c2d6f7061636974793d222e303222207360608201527f74726f6b653d2275726c2823486f7572676c6173735374726f6b65292220737460808201527f726f6b652d77696474683d2234222f3e0000000000000000000000000000000060a082015260405193846102c081011067ffffffffffffffff6102c087011117614311576102c0850160405261029885527f3c7061746820643d226d3536362c3136312e323031762d35332e39323463302d60208601527f31392e3338322d32322e3531332d33372e3536332d36332e3339382d35312e3160408601527f39382d34302e3735362d31332e3539322d39342e3934362d32312e3037392d3160608601527f35322e3538372d32312e303739732d3131312e3833382c372e3438372d31353260808601527f2e3630322c32312e303739632d34302e3839332c31332e3633362d36332e343160a08601527f332c33312e3831362d36332e3431332c35312e3139387635332e39323463302c60c08601527f31372e3138312c31372e3730342c33332e3432372c35302e3232332c34362e3360e08601527f3934763238342e383039632d33322e3531392c31322e39362d35302e3232332c6101008601527f32392e3230362d35302e3232332c34362e3339347635332e39323463302c31396101208601527f2e3338322c32322e35322c33372e3536332c36332e3431332c35312e3139382c6101408601527f34302e3736332c31332e3539322c39342e3935342c32312e3037392c3135322e6101608601527f3630322c32312e303739733131312e3833312d372e3438372c3135322e3538376101808601527f2d32312e3037396334302e3838362d31332e3633362c36332e3339382d33312e6101a08601527f3831362c36332e3339382d35312e313938762d35332e39323463302d31372e316101c08601527f39362d31372e3730342d33332e3433352d35302e3232332d34362e34303156326101e08601527f30372e3630336333322e3531392d31322e3936372c35302e3232332d32392e326102008601527f30362c35302e3232332d34362e3430315a6d2d3334372e3436322c35372e37396102208601527f336c3133302e3935392c3133312e3032372d3133302e3935392c3133312e30316102408601527f33563231382e3939345a6d3236322e3932342e303232763236322e3031386c2d6102608601527f3133302e3933372d3133312e3030362c3133302e3933372d3133312e3031335a6102808601527f222066696c6c3d2223313631383232223e3c2f706174683e00000000000000006102a0860152896000146144885760405161218c8161488b565b60008152995b1561432757604051806101e081011067ffffffffffffffff6101e083011117614311576101e081016040526101b181527f3c7061746820643d226d3438312e34362c3438312e35347638312e3031632d3260208201527f2e33352e37372d342e38322c312e35312d372e33392c322e32332d33302e332c60408201527f382e35342d37342e36352c31332e39322d3132342e30362c31332e39322d353360608201527f2e362c302d3130312e32342d362e33332d3133312e34372d31362e3136762d3860808201527f316c34362e332d34362e3331683137302e33336c34362e32392c34362e33315a60a08201527f222066696c6c3d2275726c282353616e64426f74746f6d29222f3e3c7061746860c08201527f20643d226d3433352e31372c3433352e323363302c312e31372d2e34362c322e60e08201527f33322d312e33332c332e34342d372e31312c392e30382d34312e39332c31352e6101008201527f39382d38332e38312c31352e3938732d37362e372d362e392d38332e38322d316101208201527f352e3938632d2e38372d312e31322d312e33332d322e32372d312e33332d332e6101408201527f3434762d2e30346c382e33342d382e33352e30312d2e30316331332e37322d366101608201527f2e35312c34322e39352d31312e30322c37362e382d31312e30327336322e39376101808201527f2c342e34392c37362e37322c31316c382e34322c382e34325a222066696c6c3d6101a08201527f2275726c282353616e64546f7029222f3e0000000000000000000000000000006101c0820152995b60405196876107e081011067ffffffffffffffff6107e08a01111761431157613b9f9c612e5a6036602d9960819f97631e17b39f60e11b8d7f3c2f646566733e000000000000000000000000000000000000000000000000009a612f2b9f6107e0016040526107a782527f3c672066696c6c3d226e6f6e6522207374726f6b653d2275726c2823486f757260208301527f676c6173735374726f6b652922207374726f6b652d6c696e656361703d22726f60408301527f756e6422207374726f6b652d6d697465726c696d69743d22313022207374726f60608301527f6b652d77696474683d2234223e3c7061746820643d226d3536352e3634312c3160808301527f30372e323863302c392e3533372d352e35362c31382e3632392d31352e36373660a08301527f2c32362e393733682d2e303233632d392e3230342c372e3539362d32322e313960c08301527f342c31342e3536322d33382e3139372c32302e3539322d33392e3530342c313460e08301527f2e3933362d39372e3332352c32342e3335352d3136312e3733332c32342e33356101008301527f352d39302e34382c302d3136372e3934382d31382e3538322d3139392e3935336101208301527f2d34342e393438682d2e303233632d31302e3131352d382e3334342d31352e366101408301527f37362d31372e3433372d31352e3637362d32362e3937332c302d33392e3733356101608301527f2c39362e3535342d37312e3932312c3231352e3635322d37312e3932317332316101808301527f352e3632392c33322e3138352c3231352e3632392c37312e3932315a222f3e3c6101a08301527f7061746820643d226d3133342e33362c3136312e32303363302c33392e3733356101c08301527f2c39362e3535342c37312e3932312c3231352e3635322c37312e3932317332316101e08301527f352e3632392d33322e3138362c3231352e3632392d37312e393231222f3e3c6c6102008301527f696e652078313d223133342e3336222079313d223136312e323033222078323d6102208301527f223133342e3336222079323d223130372e3238222f3e3c6c696e652078313d226102408301527f3536352e3634222079313d223136312e323033222078323d223536352e3634226102608301527f2079323d223130372e3238222f3e3c6c696e652078313d223138342e353834226102808301527f2079313d223230362e383233222078323d223138342e353835222079323d22356102a08301527f33372e353739222f3e3c6c696e652078313d223231382e313831222079313d226102c08301527f3231382e313138222078323d223231382e313831222079323d223536322e35336102e08301527f37222f3e3c6c696e652078313d223438312e383138222079313d223231382e316103008301527f3432222078323d223438312e383139222079323d223536322e343238222f3e3c6103208301527f6c696e652078313d223531352e343135222079313d223230372e3335322220786103408301527f323d223531352e343136222079323d223533372e353739222f3e3c70617468206103608301527f643d226d3138342e35382c3533372e353863302c352e34352c342e32372c31306103808301527f2e36352c31322e30332c31352e3432682e303263352e35312c332e33392c31326103a08301527f2e37392c362e35352c32312e35352c392e34322c33302e32312c392e392c37386103c08301527f2e30322c31362e32382c3133312e38332c31362e32382c34392e34312c302c396103e08301527f332e37362d352e33382c3132342e30362d31332e39322c322e372d2e37362c356104008301527f2e32392d312e35342c372e37352d322e33352c382e37372d322e38372c31362e6104208301527f30352d362e30342c32312e35362d392e3433683063372e37362d342e37372c316104408301527f322e30342d392e39372c31322e30342d31352e3432222f3e3c7061746820643d6104608301527f226d3138342e3538322c3439322e363536632d33312e3335342c31322e3438356104808301527f2d35302e3232332c32382e35382d35302e3232332c34362e3134322c302c392e6104a08301527f3533362c352e3536342c31382e3632372c31352e3637372c32362e393639682e6104c08301527f30323263382e3530332c372e3030352c32302e3231332c31332e3436332c33346104e08301527f2e3532342c31392e3135392c392e3939392c332e3939312c32312e3236392c376105008301527f2e3630392c33332e3539372c31302e3738382c33362e34352c392e3430372c386105208301527f322e3138312c31352e3030322c3133312e3833352c31352e3030327339352e336105408301527f36332d352e3539352c3133312e3830372d31352e3030326331302e3834372d326105608301527f2e37392c32302e3836372d352e3932362c32392e3932342d392e3334392c312e6105808301527f3234342d2e3436372c322e3437332d2e3934322c332e3637332d312e3432342c6105a08301527f31342e3332362d352e3639362c32362e3033352d31322e3136312c33342e35326105c08301527f342d31392e313733682e3032326331302e3131342d382e3334322c31352e36376105e08301527f372d31372e3433332c31352e3637372d32362e3936392c302d31372e3536322d6106008301527f31382e3836392d33332e3636352d35302e3232332d34362e3135222f3e3c70616106208301527f746820643d226d3133342e33362c3539322e373263302c33392e3733352c39366106408301527f2e3535342c37312e3932312c3231352e3635322c37312e393231733231352e366106608301527f32392d33322e3138362c3231352e3632392d37312e393231222f3e3c6c696e656106808301527f2078313d223133342e3336222079313d223539322e3732222078323d223133346106a08301527f2e3336222079323d223533382e373937222f3e3c6c696e652078313d223536356106c08301527f2e3634222079313d223539322e3732222078323d223536352e3634222079323d6106e08301527f223533382e373937222f3e3c706f6c796c696e6520706f696e74733d223438316107008301527f2e383232203438312e393031203438312e373938203438312e383737203438316107208301527f2e373735203438312e383534203335302e303135203335302e303236203231386107408301527f2e313835203231382e313239222f3e3c706f6c796c696e6520706f696e74733d6107608301527f223231382e313835203438312e393031203231382e323331203438312e3835346107808301527f203335302e303135203335302e303236203438312e383232203231382e3135326107a08301527f222f3e3c2f673e000000000000000000000000000000000000000000000000006107c0830152604051998a957f3c672069643d22486f7572676c617373223e00000000000000000000000000006020880152603295612df68151809260208a8c019101614826565b8701612e0b8251809360208a85019101614826565b01612e1f8251809360208985019101614826565b01612e338251809360208885019101614826565b01612e478251809360208785019101614826565b01918201520360168101865201846148df565b6040519e8f9788977f3c646566733e000000000000000000000000000000000000000000000000000060208a0152612e9f6026998260208c9451948593019101614826565b8901612eb48251809360208c85019101614826565b01612ec88251809360208b85019101614826565b01612edc8251809360208a85019101614826565b01612ef08251809360208985019101614826565b01612f048251809360208885019101614826565b01612f188251809360208785019101614826565b019182015203600d8101895201876148df565b6137be604c60e08301516101208401519361351a61314d6060604084015193015196612f578186615985565b9461314861012b604051612f6a816148c3565b600581527f2d3130302500000000000000000000000000000000000000000000000000000060208201526040519889917f3c74657874506174682073746172744f66667365743d220000000000000000006020840152612fd4815180926020603787019101614826565b7f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666683820160378101919091527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e00000000000000000061010982015282519261311891849161012090910190602001614826565b6a1e17ba32bc3a2830ba341f60a91b90830190910161012081019190915281900361010b810190915201876148df565b615985565b9561332c61012b604051613160816148c3565b600281527f30250000000000000000000000000000000000000000000000000000000000006020820152604051998a917f3c74657874506174682073746172744f66667365743d2200000000000000000060208401526131ca815180926020603787019101614826565b82017f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666660378201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e00000000000000000061010982015261330782518093602061012085019101614826565b016a1e17ba32bc3a2830ba341f60a91b6101208201520361010b81018a5201886148df565b61333681846159ed565b9261351561012b604051613349816148c3565b600481527f2d3530250000000000000000000000000000000000000000000000000000000060208201526040519687917f3c74657874506174682073746172744f66667365743d2200000000000000000060208401526133b3815180926020603787019101614826565b82017f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666660378201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e0000000000000000006101098201526134f082518093602061012085019101614826565b016a1e17ba32bc3a2830ba341f60a91b6101208201520361010b8101875201856148df565b6159ed565b906136f961012b60405161352d816148c3565b600381527f353025000000000000000000000000000000000000000000000000000000000060208201526040519485917f3c74657874506174682073746172744f66667365743d220000000000000000006020840152613597815180926020603787019101614826565b82017f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666660378201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e0000000000000000006101098201526136d482518093602061012085019101614826565b016a1e17ba32bc3a2830ba341f60a91b6101208201520361010b8101855201836148df565b6040519586937f3c7465787420746578742d72656e646572696e673d226f7074696d697a65537060208601527f656564223e000000000000000000000000000000000000000000000000000000604086015261375f815180926020604589019101614826565b8401613775825180936020604585019101614826565b0161378a825180936020604585019101614826565b0161379f825180936020604585019101614826565b01661e17ba32bc3a1f60c91b604582015203602c8101845201826148df565b613a9e61019a6101408401516101a0850151906137ff6137f96137f36137ed60e060408b01519a015194614b08565b94614b08565b97614b08565b91614b08565b956040519687937f3c75736520687265663d2223476c6f77222066696c6c2d6f7061636974793d2260208601527f2e39222f3e00000000000000000000000000000000000000000000000000000060408601527f3c75736520687265663d2223476c6f772220783d22313030302220793d22313060458601527f3030222066696c6c2d6f7061636974793d222e39222f3e00000000000000000060658601527f3c75736520687265663d22234c6f676f2220783d223137302220793d22313730607c8601527f22207472616e73666f726d3d227363616c65282e3629222f3e3c757365206872609c8601527f65663d2223486f7572676c6173732220783d223135302220793d22393022207460bc8601527f72616e73666f726d3d22726f746174652831302922207472616e73666f726d2d60dc8601527f6f726967696e3d2235303020353030222f3e000000000000000000000000000060fc8601527f3c75736520687265663d222350726f67726573732220783d220000000000000061010e8601526101279061399a815180926020858a019101614826565b8501937f2220793d22373930222f3e00000000000000000000000000000000000000000080948180948801527f3c75736520687265663d22235374617475732220783d2200000000000000000061013288015261014996613a048251809360208b85019101614826565b01958601527f3c75736520687265663d2223416d6f756e742220783d2200000000000000000061015486015261016b94613a478251809360208985019101614826565b01938401527f3c75736520687265663d22234475726174696f6e2220783d220000000000000061017684015261018f92613a8a8251809360208785019101614826565b01918201520361017a8101855201836148df565b6040519586937f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323060208601527f30302f737667222077696474683d223130303022206865696768743d2231303060408601527f30222076696577426f783d2230203020313030302031303030223e00000000006060860152613b2a815180926020607b89019101614826565b8401613b40825180936020607b85019101614826565b01613b55825180936020607b85019101614826565b01613b6a825180936020607b85019101614826565b017f3c2f7376673e0000000000000000000000000000000000000000000000000000607b8201520360618101845201826148df565b6101605260a051610100516040517fb971302a0000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa908115614305576000916142ba575b6142b661424f614154614245609487613d3b6089613c198a614c58565b9260c0608001516040519485927f5b7b2274726169745f74797065223a224173736574222c2276616c7565223a226020850152613c60815180926020604088019101614826565b8301907f227d2c7b2274726169745f74797065223a2253656e646572222c2276616c756560408301527f223a22000000000000000000000000000000000000000000000000000000000091826060820152613cc5825180936020606385019101614826565b01907f227d2c7b2274726169745f74797065223a22537461747573222c2276616c756560638301526083820152613d06825180936020608685019101614826565b017f227d5d000000000000000000000000000000000000000000000000000000000060868201520360698101845201826148df565b6101a05160a05161403e61017e613d53602435614b08565b9360a060800151613d6e6001600160a01b0360805116614c58565b90604051968793613f2b60208601987f54686973204e465420726570726573656e74732061207061796d656e742073748a527f7265616d20696e2061205361626c696572205632200000000000000000000000604088015282516020840190613ddb8160558b0184614826565b8801947f20636f6e74726163742e20546865206f776e6572206f662074686973204e465460558701527f2063616e207769746864726177207468652073747265616d656420617373657460758701527f732c207768696368206172652064656e6f6d696e6174656420696e2000000000609587015282516020840196613e658260b183018a614826565b017f2e5c6e5c6e2d2053747265616d2049443a20000000000000000000000000000060b1820152613ea082518093602060c385019101614826565b01613ed97f5c6e2d2000000000000000000000000000000000000000000000000000000000958660c384015251809360c7840190614826565b01947f20416464726573733a2000000000000000000000000000000000000000000000958660c7820152613f1782518093602060d185019101614826565b019260d184015251809360d5840190614826565b019060d5820152613f4682518093602060df85019101614826565b017f5c6e5c6e0000000000000000000000000000000000000000000000000000000060df8201527fe29aa0efb88f205741524e494e473a205472616e7366657272696e672074686560e38201527f204e4654206d616b657320746865206e6577206f776e657220746865207265636101038201527f697069656e74206f66207468652073747265616d2e205468652066756e6473206101238201527f617265206e6f74206175746f6d61746963616c6c792077697468647261776e206101438201527f666f72207468652070726576696f757320726563697069656e742e00000000006101638201520361015e8101855201836148df565b6101a051906141af614051602435614b08565b916140d0602d604051809560208201976a029b0b13634b2b9102b19160ad1b8952614086815180926020602b87019101614826565b82017f2023000000000000000000000000000000000000000000000000000000000000602b8201526140c18251809360208785019101614826565b0103600d8101865201846148df565b610160516140dd90614994565b94604051998a977f7b2261747472696275746573223a00000000000000000000000000000000000060208a015261411e815180926020602e8d019101614826565b8801917f2c226465736372697074696f6e223a2200000000000000000000000000000000602e840152518093603e840190614826565b01917f222c2265787465726e616c5f75726c223a2268747470733a2f2f7361626c6965603e8401527f722e636f6d222c226e616d65223a220000000000000000000000000000000000605e840152518093606d840190614826565b017f222c22696d616765223a22646174613a696d6167652f7376672b786d6c3b6261606d8201527f736536342c000000000000000000000000000000000000000000000000000000608d820152614210825180936020609285019101614826565b017f227d00000000000000000000000000000000000000000000000000000000000060928201520360748101845201826148df565b60e0819052614994565b6142a2603d60405180937f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000060208301526142928151809260208686019101614826565b810103601d8101845201826148df565b604051918291602083526020830190614849565b0390f35b90506020813d6020116142fd575b816142d5602093836148df565b810103126142f85751906001600160a01b03821682036142f85790614154613bfc565b600080fd5b3d91506142c8565b6040513d6000823e3d90fd5b634e487b7160e01b600052604160045260246000fd5b6040518061012081011067ffffffffffffffff6101208301111761431157610120810160405260f881527f3c7061746820643d226d3438312e34362c3530342e3130317635382e3434396360208201527f2d322e33352e37372d342e38322c312e35312d372e33392c322e32332d33302e60408201527f332c382e35342d37342e36352c31332e39322d3132342e30362c31332e39322d60608201527f35332e362c302d3130312e32342d362e33332d3133312e34372d31362e31367660808201527f2d35382e343339683236322e39325a222066696c6c3d2275726c282353616e6460a08201527f426f74746f6d29222f3e3c656c6c697073652063783d22333530222063793d2260c08201527f3530342e313031222072783d223133312e343632222072793d2232382e31303860e08201527f222066696c6c3d2275726c282353616e64546f7029222f3e0000000000000000610100820152996123df565b604051806101c081011067ffffffffffffffff6101c083011117614311576101c0810160405261019981527f3c706f6c79676f6e20706f696e74733d22333530203335302e3032362034313560208201527f2e3033203238342e39373820323835203238342e39373820333530203335302e60408201527f303236222066696c6c3d2275726c282353616e64426f74746f6d29222f3e3c7060608201527f61746820643d226d3431362e3334312c3238312e39373563302c2e3931342d2e60808201527f3335342c312e3830392d312e3033352c322e36382d352e3534322c372e30373660a08201527f2d33322e3636312c31322e34352d36352e32382c31322e34352d33322e36323460c08201527f2c302d35392e3733382d352e3337342d36352e32382d31322e34352d2e36383160e08201527f2d2e3837322d312e3033352d312e3736372d312e3033352d322e36382c302d2e6101008201527f3931342e3335342d312e3830382c312e3033352d322e3637362c352e3534322d6101208201527f372e3037362c33322e3635362d31322e34352c36352e32382d31322e34352c336101408201527f322e3631392c302c35392e3733382c352e3337342c36352e32382c31322e34356101608201527f2e3638312e3836372c312e3033352c312e3736322c312e3033352c322e3637366101808201527f5a222066696c6c3d2275726c282353616e64546f7029222f3e000000000000006101a082015299612192565b6146cf9198506146bb615850565b906020815191012090602081519101201490565b9638611d3a565b905093610d61565b905094610a32565b60d09461072c565b614710915060203d602011614716575b61470881836148df565b810190614929565b38610517565b503d6146fe565b614736915060203d6020116147165761470881836148df565b386104c1565b634e487b7160e01b600052601260045260246000fd5b614774915060203d60201161477a575b61476c81836148df565b810190614901565b3861023f565b503d614762565b506020813d6020116147b6575b8161479b602093836148df565b810103126142f8575160058110156142f8576101e5906101db565b3d915061478e565b6147d7915060203d60201161477a5761476c81836148df565b38610181565b90506020813d60201161481e575b816147f8602093836148df565b810103126142f857516001600160a01b03811681036142f8576001600160a01b03610100565b3d91506147eb565b60005b8381106148395750506000910152565b8181015183820152602001614829565b9060209161486281518092818552858086019101614826565b601f01601f1916010190565b610140810190811067ffffffffffffffff82111761431157604052565b6020810190811067ffffffffffffffff82111761431157604052565b6060810190811067ffffffffffffffff82111761431157604052565b6040810190811067ffffffffffffffff82111761431157604052565b90601f8019910116810190811067ffffffffffffffff82111761431157604052565b908160209103126142f857516fffffffffffffffffffffffffffffffff811681036142f85790565b908160209103126142f8575164ffffffffff811681036142f85790565b67ffffffffffffffff811161431157601f01601f191660200190565b9061496c82614946565b61497960405191826148df565b828152809261498a601f1991614946565b0190602036910137565b805115614af4576040516149a7816148a7565b604081527f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208201527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f60408201528151600292838201809211614ade5760038092047f3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81168103614ade57614a41908594951b614962565b936020850193829183518401925b838110614a8d5750505050510680600114614a7a57600214614a6f575090565b603d90600019015390565b50603d9081600019820153600119015390565b85600491979293949701918251600190603f9082828260121c16880101518453828282600c1c16880101518385015382828260061c1688010151888501531685010151878201530195929190614a4f565b634e487b7160e01b600052601160045260246000fd5b50604051614b018161488b565b6000815290565b806000917a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000080821015614c4a575b506d04ee2d6d415b85acef810000000080831015614c3b575b50662386f26fc1000080831015614c2c575b506305f5e10080831015614c1d575b5061271080831015614c0e575b506064821015614bfe575b600a80921015614bf4575b600190816021614b9f828701614962565b95860101905b614bb1575b5050505090565b600019019083907f30313233343536373839616263646566000000000000000000000000000000008282061a835304918215614bef57919082614ba5565b614baa565b9160010191614b8e565b9190606460029104910191614b83565b60049193920491019138614b78565b60089193920491019138614b6b565b60109193920491019138614b5c565b60209193920491019138614b4a565b604093508104915038614b31565b6001600160a01b031660405190614c6e826148a7565b602a8252602082016040368237825115614d8657603090538151600190811015614d8657607860218401536029905b808211614d0b575050614cad5790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602060248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b9091600f81166010811015614d71577f3031323334353637383961626364656600000000000000000000000000000000901a614d478486614d9c565b5360041c918015614d5c576000190190614c9d565b60246000634e487b7160e01b81526011600452fd5b60246000634e487b7160e01b81526032600452fd5b634e487b7160e01b600052603260045260246000fd5b908151811015614d86570160200190565b60405190614dba826148c3565b600482527f2667743b000000000000000000000000000000000000000000000000000000006020830152565b60405190614df3826148c3565b600482527f266c743b000000000000000000000000000000000000000000000000000000006020830152565b90614e87929493604051958692602094614e4181518092888089019101614826565b8401614e5582518093888085019101614826565b01614e6882518093878085019101614826565b01614e7b82518093868085019101614826565b010380855201836148df565b565b801561519a5760009180615175575090505b6001908082811015614f0857505050614eb2614de6565b614f05602260405183614ecf829551809260208086019101614826565b81017f203100000000000000000000000000000000000000000000000000000000000060208201520360028101845201826148df565b90565b66038d7ea4c6800011156151185760409081519060a0820182811067ffffffffffffffff82111761431157808452614f3f8161488b565b600081528252825190614f51826148c3565b8482526020917f4b0000000000000000000000000000000000000000000000000000000000000083820152828401528351614f8b816148c3565b8581527f4d0000000000000000000000000000000000000000000000000000000000000083820152848401528351614fc2816148c3565b8581527f42000000000000000000000000000000000000000000000000000000000000008382015260608401528351614ffa816148c3565b8581527f54000000000000000000000000000000000000000000000000000000000000008382015260808401526000918583965b6150ec575b50845194615040866148c3565b6007908187527f2623383830353b0000000000000000000000000000000000000000000000000083880152519560005b8281106150d957505050506150ba6150c0917f20000000000000000000000000000000000000000000000000000000000000006027870152600886526150b5866148c3565b614b08565b91615744565b916005851015614d8657614f059460051b015192614e1f565b8181018401518882018501528301615070565b9591926103e89081851061510f57508680916064600a870406950493019661502e565b93929650615033565b5050615122614dad565b614f0560286040518361513f829551809260208086019101614826565b81017f203939392e39395400000000000000000000000000000000000000000000000060208201520360088101845201826148df565b600a0a918215615186575004614e9b565b80634e487b7160e01b602492526012600452fd5b50506040516151a8816148c3565b600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b620151809103048061523d57506151ea614de6565b614f05602660405183615207829551809260208086019101614826565b81017f203120446179000000000000000000000000000000000000000000000000000060208201520360068101845201826148df565b61270f811161530c57600181036152c957614f056020615291604051615262816148c3565b600481527f20446179000000000000000000000000000000000000000000000000000000008382015293614b08565b60405193816152a98693518092868087019101614826565b82016152bd82518093868085019101614826565b010380845201826148df565b614f0560206152916040516152dd816148c3565b600581527f20446179730000000000000000000000000000000000000000000000000000008382015293614b08565b50615315614dad565b614f05602a60405183615332829551809260208086019101614826565b81017f2039393939204461797300000000000000000000000000000000000000000000602082015203600a8101845201826148df565b6020818303126142f85780519067ffffffffffffffff82116142f8570181601f820112156142f857805161539b81614946565b926153a960405194856148df565b818452602082840101116142f857614f059160208085019101614826565b6001600160a01b031660409081516395d89b4160e01b8152600081600481855afa9081156155a157600091615580575b5061545c8351615406816148c3565b601181527f5341422d56322d4c4f434b55502d4c494e0000000000000000000000000000006020918201528251908301207fc66b376a19264d832c1bc254000c18944ca5aa57ed50f4ea637c4da424d4c3bb1490565b1561549a5750505161546d816148c3565b600d81527f4c6f636b7570204c696e65617200000000000000000000000000000000000000602082015290565b6154fe83516154a8816148c3565b601181527f5341422d56322d4c4f434b55502d44594e0000000000000000000000000000006020918201528251908301207f6ab655856fa5352de8c05542b1937ac63c59342da992602767c02734cc5391651490565b1561553c5750505161550f816148c3565b600e81527f4c6f636b75702044796e616d6963000000000000000000000000000000000000602082015290565b61557c9083519384937f814a8a2e000000000000000000000000000000000000000000000000000000008552600485015260248401526044830190614849565b0390fd5b61559b913d8091833e61559381836148df565b810190615368565b386153f7565b83513d6000823e3d90fd5b3d156155d7573d906155bd82614946565b916155cb60405193846148df565b82523d6000602084013e565b606090565b60405160208101907f313ce56700000000000000000000000000000000000000000000000000000000825260048152615614816148c3565b6000928392839251915afa6156276155ac565b908061565e575b1561565a5760208180518101031261565657602001519060ff82168203615653575090565b80fd5b5080fd5b5090565b50602081511461562e565b6000809160405160208101906395d89b4160e01b82526004815261568c816148c3565b51915afa6156986155ac565b90158015615738575b6156fe57806020806156b893518301019101615368565b601e815111600014614f0557506040516156d1816148c3565b600b81527f4c6f6e672053796d626f6c000000000000000000000000000000000000000000602082015290565b5060405161570b816148c3565b600581527f4552433230000000000000000000000000000000000000000000000000000000602082015290565b506040815111156156a1565b806157565750604051614b018161488b565b600a8110156157bb5761576890614b08565b614f05602260405180937f2e3000000000000000000000000000000000000000000000000000000000000060208301526157ab8151809260208686019101614826565b81010360028101845201826148df565b6157c490614b08565b614f05602160405180937f2e0000000000000000000000000000000000000000000000000000000000000060208301526158078151809260208686019101614826565b81010360018101845201826148df565b60405190615824826148c3565b600782527f536574746c6564000000000000000000000000000000000000000000000000006020830152565b6040519061585d826148c3565b600882527f4465706c657465640000000000000000000000000000000000000000000000006020830152565b600581101561596f57600481036158a35750614f05615850565b600381036158e557506040516158b8816148c3565b600881527f43616e63656c6564000000000000000000000000000000000000000000000000602082015290565b6001810361592757506040516158fa816148c3565b600981527f53747265616d696e670000000000000000000000000000000000000000000000602082015290565b60020361593657614f05615817565b604051615942816148c3565b600781527f50656e64696e6700000000000000000000000000000000000000000000000000602082015290565b634e487b7160e01b600052602160045260246000fd5b6030614e879193929360405194816159a7879351809260208087019101614826565b820164010714051160dd1b60208201526a029b0b13634b2b9102b19160ad1b60258201526159de8251809360208785019101614826565b010360108101855201836148df565b6025614e87919392936040519481615a0f879351809260208087019101614826565b820164010714051160dd1b6020820152615a328251809360208785019101614826565b010360058101855201836148df565b60405190615a4e826148c3565b601082527f68736c283233302c3231252c31312529000000000000000000000000000000006020830152565b8015615cac57615a88615a41565b90612710908103908111614ade57614f0591615aa661013692614b08565b6040519485927f3c672066696c6c3d226e6f6e65223e000000000000000000000000000000000060208501527f3c636972636c652063783d22313636222063793d2235302220723d2232322220602f8501527f7374726f6b653d22000000000000000000000000000000000000000000000000604f850152615b32815180926020605788019101614826565b83017f22207374726f6b652d77696474683d223130222f3e000000000000000000000060578201527f3c636972636c652063783d22313636222063793d2235302220706174684c656e606c8201527f6774683d2231303030302220723d22323222207374726f6b653d220000000000608c820152615bba82518093602060a785019101614826565b017f22207374726f6b652d6461736861727261793d22313030303022207374726f6b60a78201527f652d646173686f66667365743d2200000000000000000000000000000000000060c7820152615c1b82518093602060d585019101614826565b017f22207374726f6b652d6c696e656361703d22726f756e6422207374726f6b652d60d58201527f77696474683d223522207472616e73666f726d3d22726f74617465282d39302960f58201527f22207472616e73666f726d2d6f726967696e3d22313636203530222f3e000000610115820152631e17b39f60e11b610132820152036101168101845201826148df565b5050604051614b018161488b565b60009080518015615d2f579060009182915b818310615cde57505050600d02900390565b909193603b60f81b7fff00000000000000000000000000000000000000000000000000000000000000615d118785614d9c565b511614615d27575b600d01936001019190615ccc565b849350615d19565b505050600090565b60009080518015615d2f579060009182915b818310615d5b5750505060041b900390565b909193603b60f81b7fff00000000000000000000000000000000000000000000000000000000000000615d8e8785614d9c565b511614615da4575b601001936001019190615d49565b849350615d9656"; From 9412400aa07ce96f000e64cb16032f511260e4d0 Mon Sep 17 00:00:00 2001 From: Paul Razvan Berg Date: Wed, 29 Nov 2023 12:04:03 +0200 Subject: [PATCH 39/47] refactor: update gas snapshot --- .gas-snapshot | 578 +++++++++++++++++++++++++------------------------- 1 file changed, 289 insertions(+), 289 deletions(-) diff --git a/.gas-snapshot b/.gas-snapshot index 4bf009e11..1ecfb10fc 100644 --- a/.gas-snapshot +++ b/.gas-snapshot @@ -1,254 +1,254 @@ -Burn_LockupDynamic_Integration_Concrete_Test:test_Burn_CallerApprovedOperator() (gas: 87800) -Burn_LockupDynamic_Integration_Concrete_Test:test_Burn_CallerNFTOwner() (gas: 78384) -Burn_LockupDynamic_Integration_Concrete_Test:test_Burn_NonTransferableNFT() (gas: 78393) -Burn_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_NFTDoesNotExist() (gas: 79598) +Burn_LockupDynamic_Integration_Concrete_Test:test_Burn_CallerApprovedOperator() (gas: 87602) +Burn_LockupDynamic_Integration_Concrete_Test:test_Burn_CallerNFTOwner() (gas: 78186) +Burn_LockupDynamic_Integration_Concrete_Test:test_Burn_NonTransferableNFT() (gas: 78195) +Burn_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_NFTDoesNotExist() (gas: 79400) Burn_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11325) -Burn_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StatusCanceled() (gas: 90036) +Burn_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StatusCanceled() (gas: 90312) Burn_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StatusPending() (gas: 14289) Burn_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StatusSettled() (gas: 19525) Burn_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StatusStreaming() (gas: 19561) -Burn_LockupLinear_Integration_Concrete_Test:test_Burn_CallerApprovedOperator() (gas: 88034) -Burn_LockupLinear_Integration_Concrete_Test:test_Burn_CallerNFTOwner() (gas: 78607) -Burn_LockupLinear_Integration_Concrete_Test:test_Burn_NonTransferableNFT() (gas: 78616) -Burn_LockupLinear_Integration_Concrete_Test:test_RevertGiven_NFTDoesNotExist() (gas: 79803) +Burn_LockupLinear_Integration_Concrete_Test:test_Burn_CallerApprovedOperator() (gas: 87770) +Burn_LockupLinear_Integration_Concrete_Test:test_Burn_CallerNFTOwner() (gas: 78343) +Burn_LockupLinear_Integration_Concrete_Test:test_Burn_NonTransferableNFT() (gas: 78352) +Burn_LockupLinear_Integration_Concrete_Test:test_RevertGiven_NFTDoesNotExist() (gas: 79539) Burn_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11311) -Burn_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StatusCanceled() (gas: 80712) +Burn_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StatusCanceled() (gas: 81013) Burn_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StatusPending() (gas: 14275) Burn_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StatusSettled() (gas: 19511) Burn_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StatusStreaming() (gas: 19547) -CancelMultiple_LockupDynamic_Integration_Concrete_Test:test_CancelMultiple() (gas: 831114) -CancelMultiple_LockupDynamic_Integration_Concrete_Test:test_CancelMultiple_ArrayCountZero() (gas: 6265) -CancelMultiple_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_AllStreamsCold() (gas: 32340) +CancelMultiple_LockupDynamic_Integration_Concrete_Test:test_CancelMultiple() (gas: 833554) +CancelMultiple_LockupDynamic_Integration_Concrete_Test:test_CancelMultiple_ArrayCountZero() (gas: 6271) +CancelMultiple_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_AllStreamsCold() (gas: 32346) CancelMultiple_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_AllStreamsNotCancelable() (gas: 859532) -CancelMultiple_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_OnlyNull() (gas: 12356) -CancelMultiple_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_SomeNull() (gas: 78320) -CancelMultiple_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_SomeStreamsCold() (gas: 341059) -CancelMultiple_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_SomeStreamsNotCancelable() (gas: 945583) -CancelMultiple_LockupDynamic_Integration_Fuzz_Test:testFuzz_CancelMultiple(uint256,uint40) (runs: 50, μ: 1194589, ~: 1198935) -CancelMultiple_LockupLinear_Integration_Concrete_Test:test_CancelMultiple() (gas: 562805) -CancelMultiple_LockupLinear_Integration_Concrete_Test:test_CancelMultiple_ArrayCountZero() (gas: 6288) -CancelMultiple_LockupLinear_Integration_Concrete_Test:test_RevertGiven_AllStreamsCold() (gas: 32482) -CancelMultiple_LockupLinear_Integration_Concrete_Test:test_RevertGiven_AllStreamsNotCancelable() (gas: 572852) -CancelMultiple_LockupLinear_Integration_Concrete_Test:test_RevertGiven_OnlyNull() (gas: 12373) -CancelMultiple_LockupLinear_Integration_Concrete_Test:test_RevertGiven_SomeNull() (gas: 78250) -CancelMultiple_LockupLinear_Integration_Concrete_Test:test_RevertGiven_SomeStreamsCold() (gas: 245095) -CancelMultiple_LockupLinear_Integration_Concrete_Test:test_RevertGiven_SomeStreamsNotCancelable() (gas: 656729) -CancelMultiple_LockupLinear_Integration_Fuzz_Test:testFuzz_CancelMultiple(uint256,uint40) (runs: 50, μ: 794341, ~: 795547) -Cancel_LockupDynamic_Integration_Concrete_Test:test_Cancel() (gas: 385726) -Cancel_LockupDynamic_Integration_Concrete_Test:test_Cancel_RecipientDoesNotImplementHook() (gas: 371244) -Cancel_LockupDynamic_Integration_Concrete_Test:test_Cancel_RecipientNotContract() (gas: 96900) -Cancel_LockupDynamic_Integration_Concrete_Test:test_Cancel_RecipientReentrancy() (gas: 373435) -Cancel_LockupDynamic_Integration_Concrete_Test:test_Cancel_RecipientReverts() (gas: 371811) -Cancel_LockupDynamic_Integration_Concrete_Test:test_Cancel_StatusPending() (gas: 76125) +CancelMultiple_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_OnlyNull() (gas: 12362) +CancelMultiple_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_SomeNull() (gas: 78556) +CancelMultiple_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_SomeStreamsCold() (gas: 341289) +CancelMultiple_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_SomeStreamsNotCancelable() (gas: 946037) +CancelMultiple_LockupDynamic_Integration_Fuzz_Test:testFuzz_CancelMultiple(uint256,uint40) (runs: 50, μ: 1197185, ~: 1201634) +CancelMultiple_LockupLinear_Integration_Concrete_Test:test_CancelMultiple() (gas: 565501) +CancelMultiple_LockupLinear_Integration_Concrete_Test:test_CancelMultiple_ArrayCountZero() (gas: 6294) +CancelMultiple_LockupLinear_Integration_Concrete_Test:test_RevertGiven_AllStreamsCold() (gas: 32494) +CancelMultiple_LockupLinear_Integration_Concrete_Test:test_RevertGiven_AllStreamsNotCancelable() (gas: 572744) +CancelMultiple_LockupLinear_Integration_Concrete_Test:test_RevertGiven_OnlyNull() (gas: 12391) +CancelMultiple_LockupLinear_Integration_Concrete_Test:test_RevertGiven_SomeNull() (gas: 78577) +CancelMultiple_LockupLinear_Integration_Concrete_Test:test_RevertGiven_SomeStreamsCold() (gas: 245380) +CancelMultiple_LockupLinear_Integration_Concrete_Test:test_RevertGiven_SomeStreamsNotCancelable() (gas: 657233) +CancelMultiple_LockupLinear_Integration_Fuzz_Test:testFuzz_CancelMultiple(uint256,uint40) (runs: 50, μ: 796979, ~: 798072) +Cancel_LockupDynamic_Integration_Concrete_Test:test_Cancel() (gas: 386274) +Cancel_LockupDynamic_Integration_Concrete_Test:test_Cancel_RecipientDoesNotImplementHook() (gas: 371426) +Cancel_LockupDynamic_Integration_Concrete_Test:test_Cancel_RecipientNotContract() (gas: 97176) +Cancel_LockupDynamic_Integration_Concrete_Test:test_Cancel_RecipientReentrancy() (gas: 373617) +Cancel_LockupDynamic_Integration_Concrete_Test:test_Cancel_RecipientReverts() (gas: 371993) +Cancel_LockupDynamic_Integration_Concrete_Test:test_Cancel_StatusPending() (gas: 76401) Cancel_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11321) -Cancel_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StatusCanceled() (gas: 87122) -Cancel_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StatusDepleted() (gas: 68253) -Cancel_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StatusSettled() (gas: 27019) +Cancel_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StatusCanceled() (gas: 87398) +Cancel_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StatusDepleted() (gas: 68055) +Cancel_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StatusSettled() (gas: 27022) Cancel_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StreamNotCancelable() (gas: 261520) -Cancel_LockupDynamic_Integration_Fuzz_Test:testFuzz_Cancel(uint256,uint128) (runs: 50, μ: 453354, ~: 454739) -Cancel_LockupDynamic_Integration_Fuzz_Test:testFuzz_Cancel_StatusPending(uint256) (runs: 50, μ: 76673, ~: 76852) -Cancel_LockupLinear_Integration_Concrete_Test:test_Cancel() (gas: 268892) -Cancel_LockupLinear_Integration_Concrete_Test:test_Cancel_RecipientDoesNotImplementHook() (gas: 254340) -Cancel_LockupLinear_Integration_Concrete_Test:test_Cancel_RecipientNotContract() (gas: 77222) -Cancel_LockupLinear_Integration_Concrete_Test:test_Cancel_RecipientReentrancy() (gas: 256520) -Cancel_LockupLinear_Integration_Concrete_Test:test_Cancel_RecipientReverts() (gas: 254907) -Cancel_LockupLinear_Integration_Concrete_Test:test_Cancel_StatusPending() (gas: 76140) -Cancel_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11310) -Cancel_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StatusCanceled() (gas: 77801) -Cancel_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StatusDepleted() (gas: 68472) +Cancel_LockupDynamic_Integration_Fuzz_Test:testFuzz_Cancel(uint256,uint128) (runs: 50, μ: 453882, ~: 455045) +Cancel_LockupDynamic_Integration_Fuzz_Test:testFuzz_Cancel_StatusPending(uint256) (runs: 50, μ: 76949, ~: 77128) +Cancel_LockupLinear_Integration_Concrete_Test:test_Cancel() (gas: 269481) +Cancel_LockupLinear_Integration_Concrete_Test:test_Cancel_RecipientDoesNotImplementHook() (gas: 254609) +Cancel_LockupLinear_Integration_Concrete_Test:test_Cancel_RecipientNotContract() (gas: 77523) +Cancel_LockupLinear_Integration_Concrete_Test:test_Cancel_RecipientReentrancy() (gas: 256789) +Cancel_LockupLinear_Integration_Concrete_Test:test_Cancel_RecipientReverts() (gas: 255176) +Cancel_LockupLinear_Integration_Concrete_Test:test_Cancel_StatusPending() (gas: 76441) +Cancel_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11307) +Cancel_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StatusCanceled() (gas: 78102) +Cancel_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StatusDepleted() (gas: 68238) Cancel_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StatusSettled() (gas: 27130) -Cancel_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StreamNotCancelable() (gas: 185680) -Cancel_LockupLinear_Integration_Fuzz_Test:testFuzz_Cancel(uint256,uint128) (runs: 50, μ: 309781, ~: 309696) -Cancel_LockupLinear_Integration_Fuzz_Test:testFuzz_Cancel_StatusPending(uint256) (runs: 50, μ: 76674, ~: 76867) -ClaimProtocolRevenues_LockupDynamic_Integration_Concrete_Test:test_ClaimProtocolRevenues() (gas: 319731) +Cancel_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StreamNotCancelable() (gas: 185647) +Cancel_LockupLinear_Integration_Fuzz_Test:testFuzz_Cancel(uint256,uint128) (runs: 50, μ: 310112, ~: 310054) +Cancel_LockupLinear_Integration_Fuzz_Test:testFuzz_Cancel_StatusPending(uint256) (runs: 50, μ: 77003, ~: 77168) +ClaimProtocolRevenues_LockupDynamic_Integration_Concrete_Test:test_ClaimProtocolRevenues() (gas: 319728) ClaimProtocolRevenues_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_ProtocolRevenuesZero() (gas: 18907) -ClaimProtocolRevenues_LockupLinear_Integration_Concrete_Test:test_ClaimProtocolRevenues() (gas: 246489) +ClaimProtocolRevenues_LockupLinear_Integration_Concrete_Test:test_ClaimProtocolRevenues() (gas: 246456) ClaimProtocolRevenues_LockupLinear_Integration_Concrete_Test:test_RevertGiven_ProtocolRevenuesZero() (gas: 18915) -Constructor_LockupDynamic_Integration_Concrete_Test:test_Constructor() (gas: 5383879) -Constructor_LockupLinear_Integration_Concrete_Test:test_Constructor() (gas: 4189626) -CreateWithDeltas_LockupDynamic_Integration_Concrete_Test:test_CreateWithDeltas() (gas: 380624) -CreateWithDeltas_LockupDynamic_Integration_Fuzz_Test:testFuzz_CreateWithDeltas((uint128,uint64,uint40)[]) (runs: 50, μ: 4099444, ~: 3556313) -CreateWithDurations_LockupLinear_Integration_Concrete_Test:test_CreateWithDurations() (gas: 287625) -CreateWithDurations_LockupLinear_Integration_Fuzz_Test:testFuzz_CreateWithDurations((uint40,uint40)) (runs: 50, μ: 286496, ~: 286576) -CreateWithMilestones_LockupDynamic_Integration_Concrete_Test:test_CreateWithMilestones() (gas: 370971) -CreateWithMilestones_LockupDynamic_Integration_Concrete_Test:test_CreateWithMilestones_AssetMissingReturnValue() (gas: 377759) -CreateWithMilestones_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_EndTimeNotInTheFuture() (gas: 47540) +Constructor_LockupDynamic_Integration_Concrete_Test:test_Constructor() (gas: 5384679) +Constructor_LockupLinear_Integration_Concrete_Test:test_Constructor() (gas: 4190426) +CreateWithDeltas_LockupDynamic_Integration_Concrete_Test:test_CreateWithDeltas() (gas: 380621) +CreateWithDeltas_LockupDynamic_Integration_Fuzz_Test:testFuzz_CreateWithDeltas((uint128,uint64,uint40)[]) (runs: 50, μ: 4100590, ~: 3557971) +CreateWithDurations_LockupLinear_Integration_Concrete_Test:test_CreateWithDurations() (gas: 287592) +CreateWithDurations_LockupLinear_Integration_Fuzz_Test:testFuzz_CreateWithDurations((uint40,uint40)) (runs: 50, μ: 286543, ~: 286543) +CreateWithMilestones_LockupDynamic_Integration_Concrete_Test:test_CreateWithMilestones() (gas: 370968) +CreateWithMilestones_LockupDynamic_Integration_Concrete_Test:test_CreateWithMilestones_AssetMissingReturnValue() (gas: 377756) +CreateWithMilestones_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_EndTimeNotInTheFuture() (gas: 47537) CreateWithMilestones_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_ProtocolFeeTooHigh() (gas: 58079) -CreateWithMilestones_LockupDynamic_Integration_Fuzz_Test:testFuzz_CreateWithMilestones(address,(address,uint40,bool,bool,address,uint128,address,(address,uint256),(uint128,uint64,uint40)[]),uint256) (runs: 50, μ: 4697705, ~: 4643584) -CreateWithRange_LockupLinear_Integration_Concrete_Test:test_CreateWithRange() (gas: 283023) -CreateWithRange_LockupLinear_Integration_Concrete_Test:test_CreateWithRange_AssetMissingReturnValue() (gas: 289790) +CreateWithMilestones_LockupDynamic_Integration_Fuzz_Test:testFuzz_CreateWithMilestones(address,(address,uint40,bool,bool,address,uint128,address,(address,uint256),(uint128,uint64,uint40)[]),uint256) (runs: 50, μ: 3951267, ~: 3991455) +CreateWithRange_LockupLinear_Integration_Concrete_Test:test_CreateWithRange() (gas: 282990) +CreateWithRange_LockupLinear_Integration_Concrete_Test:test_CreateWithRange_AssetMissingReturnValue() (gas: 289757) CreateWithRange_LockupLinear_Integration_Concrete_Test:test_RevertGiven_EndTimeNotInTheFuture() (gas: 41154) CreateWithRange_LockupLinear_Integration_Concrete_Test:test_RevertGiven_ProtocolFeeTooHigh() (gas: 51749) -CreateWithRange_LockupLinear_Integration_Fuzz_Test:testFuzz_CreateWithRange(address,(address,address,uint128,address,bool,bool,(uint40,uint40,uint40),(address,uint256)),uint256) (runs: 50, μ: 370443, ~: 370634) +CreateWithRange_LockupLinear_Integration_Fuzz_Test:testFuzz_CreateWithRange(address,(address,address,uint128,address,bool,bool,(uint40,uint40,uint40),(address,uint256)),uint256) (runs: 50, μ: 374036, ~: 389079) FlashFee_Integration_Concrete_Test:test_FlashFee() (gas: 50968) FlashFee_Integration_Concrete_Test:test_RevertGiven_AssetNotFlashLoanable() (gas: 18626) -FlashFee_Integration_Fuzz_Test:testFuzz_FlashFee(uint256,uint256) (runs: 50, μ: 51814, ~: 52081) +FlashFee_Integration_Fuzz_Test:testFuzz_FlashFee(uint256,uint256) (runs: 50, μ: 51818, ~: 52081) FlashLoanFunction_Integration_Concrete_Test:test_FlashLoan() (gas: 402140) FlashLoanFunction_Integration_Concrete_Test:test_RevertGiven_AssetNotFlashLoanable() (gas: 21603) -FlashLoanFunction_Integration_Fuzz_Test:testFuzz_FlashLoanFunction(uint256,uint128,bytes) (runs: 50, μ: 403132, ~: 406851) +FlashLoanFunction_Integration_Fuzz_Test:testFuzz_FlashLoanFunction(uint256,uint128,bytes) (runs: 50, μ: 402214, ~: 406940) GenerateAccentColor_Integration_Concrete_Test:test_GenerateAccentColor() (gas: 13215) -GetAsset_LockupDynamic_Integration_Concrete_Test:test_GetAsset() (gas: 307762) +GetAsset_LockupDynamic_Integration_Concrete_Test:test_GetAsset() (gas: 307759) GetAsset_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 12049) -GetAsset_LockupLinear_Integration_Concrete_Test:test_GetAsset() (gas: 234500) +GetAsset_LockupLinear_Integration_Concrete_Test:test_GetAsset() (gas: 234467) GetAsset_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 12035) -GetCliffTime_LockupLinear_Integration_Concrete_Test:test_GetCliffTime() (gas: 234984) +GetCliffTime_LockupLinear_Integration_Concrete_Test:test_GetCliffTime() (gas: 234951) GetCliffTime_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11392) -GetDepositedAmount_LockupDynamic_Integration_Concrete_Test:test_GetDepositedAmount() (gas: 310559) +GetDepositedAmount_LockupDynamic_Integration_Concrete_Test:test_GetDepositedAmount() (gas: 310556) GetDepositedAmount_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11682) -GetDepositedAmount_LockupLinear_Integration_Concrete_Test:test_GetDepositedAmount() (gas: 237271) +GetDepositedAmount_LockupLinear_Integration_Concrete_Test:test_GetDepositedAmount() (gas: 237238) GetDepositedAmount_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11678) -GetEndTime_LockupDynamic_Integration_Concrete_Test:test_GetEndTime() (gas: 310357) +GetEndTime_LockupDynamic_Integration_Concrete_Test:test_GetEndTime() (gas: 310354) GetEndTime_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11538) -GetEndTime_LockupLinear_Integration_Concrete_Test:test_GetEndTime() (gas: 237123) +GetEndTime_LockupLinear_Integration_Concrete_Test:test_GetEndTime() (gas: 237090) GetEndTime_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11546) -GetRange_LockupDynamic_Integration_Concrete_Test:test_GetRange() (gas: 309783) +GetRange_LockupDynamic_Integration_Concrete_Test:test_GetRange() (gas: 309780) GetRange_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 13125) -GetRange_LockupLinear_Integration_Concrete_Test:test_GetRange() (gas: 237341) +GetRange_LockupLinear_Integration_Concrete_Test:test_GetRange() (gas: 237308) GetRange_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 13308) GetRecipient_LockupDynamic_Integration_Concrete_Test:test_GetRecipient() (gas: 12585) -GetRecipient_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_NFTBurned() (gas: 72692) +GetRecipient_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_NFTBurned() (gas: 72494) GetRecipient_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 10989) GetRecipient_LockupLinear_Integration_Concrete_Test:test_GetRecipient() (gas: 12565) -GetRecipient_LockupLinear_Integration_Concrete_Test:test_RevertGiven_NFTBurned() (gas: 72915) +GetRecipient_LockupLinear_Integration_Concrete_Test:test_RevertGiven_NFTBurned() (gas: 72651) GetRecipient_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 10993) -GetRefundedAmount_LockupDynamic_Integration_Concrete_Test:test_GetRefundedAmount_StatusDepleted() (gas: 363038) -GetRefundedAmount_LockupDynamic_Integration_Concrete_Test:test_GetRefundedAmount_StatusPending() (gas: 332701) -GetRefundedAmount_LockupDynamic_Integration_Concrete_Test:test_GetRefundedAmount_StatusSettled() (gas: 337909) -GetRefundedAmount_LockupDynamic_Integration_Concrete_Test:test_GetRefundedAmount_StatusStreaming() (gas: 337923) -GetRefundedAmount_LockupDynamic_Integration_Concrete_Test:test_GetRefundedAmount_StreamHasBeenCanceled_StatusCanceled() (gas: 377279) -GetRefundedAmount_LockupDynamic_Integration_Concrete_Test:test_GetRefundedAmount_StreamHasBeenCanceled_StatusDepleted() (gas: 399285) +GetRefundedAmount_LockupDynamic_Integration_Concrete_Test:test_GetRefundedAmount_StatusDepleted() (gas: 362837) +GetRefundedAmount_LockupDynamic_Integration_Concrete_Test:test_GetRefundedAmount_StatusPending() (gas: 332698) +GetRefundedAmount_LockupDynamic_Integration_Concrete_Test:test_GetRefundedAmount_StatusSettled() (gas: 337906) +GetRefundedAmount_LockupDynamic_Integration_Concrete_Test:test_GetRefundedAmount_StatusStreaming() (gas: 337920) +GetRefundedAmount_LockupDynamic_Integration_Concrete_Test:test_GetRefundedAmount_StreamHasBeenCanceled_StatusCanceled() (gas: 377552) +GetRefundedAmount_LockupDynamic_Integration_Concrete_Test:test_GetRefundedAmount_StreamHasBeenCanceled_StatusDepleted() (gas: 399360) GetRefundedAmount_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 12045) -GetRefundedAmount_LockupLinear_Integration_Concrete_Test:test_GetRefundedAmount_StatusDepleted() (gas: 288018) -GetRefundedAmount_LockupLinear_Integration_Concrete_Test:test_GetRefundedAmount_StatusPending() (gas: 257451) -GetRefundedAmount_LockupLinear_Integration_Concrete_Test:test_GetRefundedAmount_StatusSettled() (gas: 262659) -GetRefundedAmount_LockupLinear_Integration_Concrete_Test:test_GetRefundedAmount_StatusStreaming() (gas: 262673) -GetRefundedAmount_LockupLinear_Integration_Concrete_Test:test_GetRefundedAmount_StreamHasBeenCanceled_StatusCanceled() (gas: 298719) -GetRefundedAmount_LockupLinear_Integration_Concrete_Test:test_GetRefundedAmount_StreamHasBeenCanceled_StatusDepleted() (gas: 320711) +GetRefundedAmount_LockupLinear_Integration_Concrete_Test:test_GetRefundedAmount_StatusDepleted() (gas: 287754) +GetRefundedAmount_LockupLinear_Integration_Concrete_Test:test_GetRefundedAmount_StatusPending() (gas: 257418) +GetRefundedAmount_LockupLinear_Integration_Concrete_Test:test_GetRefundedAmount_StatusSettled() (gas: 262626) +GetRefundedAmount_LockupLinear_Integration_Concrete_Test:test_GetRefundedAmount_StatusStreaming() (gas: 262640) +GetRefundedAmount_LockupLinear_Integration_Concrete_Test:test_GetRefundedAmount_StreamHasBeenCanceled_StatusCanceled() (gas: 298987) +GetRefundedAmount_LockupLinear_Integration_Concrete_Test:test_GetRefundedAmount_StreamHasBeenCanceled_StatusDepleted() (gas: 320748) GetRefundedAmount_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 12031) -GetSegments_LockupDynamic_Integration_Concrete_Test:test_GetSegments() (gas: 315261) +GetSegments_LockupDynamic_Integration_Concrete_Test:test_GetSegments() (gas: 315258) GetSegments_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 13758) -GetSender_LockupDynamic_Integration_Concrete_Test:test_GetSender() (gas: 307480) +GetSender_LockupDynamic_Integration_Concrete_Test:test_GetSender() (gas: 307477) GetSender_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11814) -GetSender_LockupLinear_Integration_Concrete_Test:test_GetSender() (gas: 234234) +GetSender_LockupLinear_Integration_Concrete_Test:test_GetSender() (gas: 234201) GetSender_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11816) -GetStartTime_LockupDynamic_Integration_Concrete_Test:test_GetStartTime() (gas: 310686) +GetStartTime_LockupDynamic_Integration_Concrete_Test:test_GetStartTime() (gas: 310683) GetStartTime_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11823) -GetStartTime_LockupLinear_Integration_Concrete_Test:test_GetStartTime() (gas: 237446) +GetStartTime_LockupLinear_Integration_Concrete_Test:test_GetStartTime() (gas: 237413) GetStartTime_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11831) -GetStream_LockupDynamic_Integration_Concrete_Test:test_GetStream() (gas: 278723) +GetStream_LockupDynamic_Integration_Concrete_Test:test_GetStream() (gas: 278720) GetStream_LockupDynamic_Integration_Concrete_Test:test_GetStream_StatusSettled() (gas: 52024) GetStream_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 15544) GetStream_LockupLinear_Integration_Concrete_Test:test_GetStream() (gas: 34920) GetStream_LockupLinear_Integration_Concrete_Test:test_GetStream_StatusSettled() (gas: 39431) GetStream_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 14299) -GetWithdrawnAmount_LockupDynamic_Integration_Concrete_Test:test_GetWithdrawnAmount() (gas: 384891) -GetWithdrawnAmount_LockupDynamic_Integration_Concrete_Test:test_GetWithdrawnAmount_NoPreviousWithdrawals() (gas: 335883) +GetWithdrawnAmount_LockupDynamic_Integration_Concrete_Test:test_GetWithdrawnAmount() (gas: 384696) +GetWithdrawnAmount_LockupDynamic_Integration_Concrete_Test:test_GetWithdrawnAmount_NoPreviousWithdrawals() (gas: 335880) GetWithdrawnAmount_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 12012) -GetWithdrawnAmount_LockupDynamic_Integration_Fuzz_Test:testFuzz_GetWithdrawnAmount(uint256,uint128) (runs: 50, μ: 388029, ~: 388565) -GetWithdrawnAmount_LockupDynamic_Integration_Fuzz_Test:testFuzz_GetWithdrawnAmount_NoPreviousWithdrawals(uint256) (runs: 50, μ: 337600, ~: 337807) -GetWithdrawnAmount_LockupLinear_Integration_Concrete_Test:test_GetWithdrawnAmount() (gas: 282382) -GetWithdrawnAmount_LockupLinear_Integration_Concrete_Test:test_GetWithdrawnAmount_NoPreviousWithdrawals() (gas: 262633) +GetWithdrawnAmount_LockupDynamic_Integration_Fuzz_Test:testFuzz_GetWithdrawnAmount(uint256,uint128) (runs: 50, μ: 387706, ~: 388207) +GetWithdrawnAmount_LockupDynamic_Integration_Fuzz_Test:testFuzz_GetWithdrawnAmount_NoPreviousWithdrawals(uint256) (runs: 50, μ: 337569, ~: 337804) +GetWithdrawnAmount_LockupLinear_Integration_Concrete_Test:test_GetWithdrawnAmount() (gas: 282118) +GetWithdrawnAmount_LockupLinear_Integration_Concrete_Test:test_GetWithdrawnAmount_NoPreviousWithdrawals() (gas: 262600) GetWithdrawnAmount_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11998) -GetWithdrawnAmount_LockupLinear_Integration_Fuzz_Test:testFuzz_GetWithdrawnAmount(uint256,uint128) (runs: 50, μ: 285546, ~: 285524) -GetWithdrawnAmount_LockupLinear_Integration_Fuzz_Test:testFuzz_GetWithdrawnAmount_NoPreviousWithdrawals(uint256) (runs: 50, μ: 264363, ~: 264557) -IsCancelable_LockupDynamic_Integration_Concrete_Test:test_IsCancelable() (gas: 515871) -IsCancelable_LockupDynamic_Integration_Concrete_Test:test_IsCancelable_Cold() (gas: 336106) -IsCancelable_LockupDynamic_Integration_Concrete_Test:test_IsCancelable_StreamCancelable() (gas: 327350) +GetWithdrawnAmount_LockupLinear_Integration_Fuzz_Test:testFuzz_GetWithdrawnAmount(uint256,uint128) (runs: 50, μ: 285304, ~: 285260) +GetWithdrawnAmount_LockupLinear_Integration_Fuzz_Test:testFuzz_GetWithdrawnAmount_NoPreviousWithdrawals(uint256) (runs: 50, μ: 264330, ~: 264524) +IsCancelable_LockupDynamic_Integration_Concrete_Test:test_IsCancelable() (gas: 515865) +IsCancelable_LockupDynamic_Integration_Concrete_Test:test_IsCancelable_Cold() (gas: 336103) +IsCancelable_LockupDynamic_Integration_Concrete_Test:test_IsCancelable_StreamCancelable() (gas: 327347) IsCancelable_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11239) -IsCancelable_LockupLinear_Integration_Concrete_Test:test_IsCancelable() (gas: 372845) -IsCancelable_LockupLinear_Integration_Concrete_Test:test_IsCancelable_Cold() (gas: 263008) -IsCancelable_LockupLinear_Integration_Concrete_Test:test_IsCancelable_StreamCancelable() (gas: 254135) +IsCancelable_LockupLinear_Integration_Concrete_Test:test_IsCancelable() (gas: 372779) +IsCancelable_LockupLinear_Integration_Concrete_Test:test_IsCancelable_Cold() (gas: 262975) +IsCancelable_LockupLinear_Integration_Concrete_Test:test_IsCancelable_StreamCancelable() (gas: 254102) IsCancelable_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11263) -IsCold_LockupDynamic_Integration_Concrete_Test:test_IsCold_StatusCanceled() (gas: 375977) -IsCold_LockupDynamic_Integration_Concrete_Test:test_IsCold_StatusDepleted() (gas: 362684) -IsCold_LockupDynamic_Integration_Concrete_Test:test_IsCold_StatusPending() (gas: 330607) -IsCold_LockupDynamic_Integration_Concrete_Test:test_IsCold_StatusSettled() (gas: 336377) -IsCold_LockupDynamic_Integration_Concrete_Test:test_IsCold_StatusStreaming() (gas: 352687) +IsCold_LockupDynamic_Integration_Concrete_Test:test_IsCold_StatusCanceled() (gas: 376250) +IsCold_LockupDynamic_Integration_Concrete_Test:test_IsCold_StatusDepleted() (gas: 362483) +IsCold_LockupDynamic_Integration_Concrete_Test:test_IsCold_StatusPending() (gas: 330604) +IsCold_LockupDynamic_Integration_Concrete_Test:test_IsCold_StatusSettled() (gas: 336374) +IsCold_LockupDynamic_Integration_Concrete_Test:test_IsCold_StatusStreaming() (gas: 352684) IsCold_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11525) -IsCold_LockupLinear_Integration_Concrete_Test:test_IsCold_StatusCanceled() (gas: 297468) -IsCold_LockupLinear_Integration_Concrete_Test:test_IsCold_StatusDepleted() (gas: 287722) -IsCold_LockupLinear_Integration_Concrete_Test:test_IsCold_StatusPending() (gas: 257415) -IsCold_LockupLinear_Integration_Concrete_Test:test_IsCold_StatusSettled() (gas: 263297) -IsCold_LockupLinear_Integration_Concrete_Test:test_IsCold_StatusStreaming() (gas: 263832) +IsCold_LockupLinear_Integration_Concrete_Test:test_IsCold_StatusCanceled() (gas: 297736) +IsCold_LockupLinear_Integration_Concrete_Test:test_IsCold_StatusDepleted() (gas: 287458) +IsCold_LockupLinear_Integration_Concrete_Test:test_IsCold_StatusPending() (gas: 257382) +IsCold_LockupLinear_Integration_Concrete_Test:test_IsCold_StatusSettled() (gas: 263264) +IsCold_LockupLinear_Integration_Concrete_Test:test_IsCold_StatusStreaming() (gas: 263799) IsCold_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11568) -IsDepleted_LockupDynamic_Integration_Concrete_Test:test_IsDepleted() (gas: 362122) -IsDepleted_LockupDynamic_Integration_Concrete_Test:test_IsDepleted_StreamNotDepleted() (gas: 326774) +IsDepleted_LockupDynamic_Integration_Concrete_Test:test_IsDepleted() (gas: 361921) +IsDepleted_LockupDynamic_Integration_Concrete_Test:test_IsDepleted_StreamNotDepleted() (gas: 326771) IsDepleted_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11191) -IsDepleted_LockupLinear_Integration_Concrete_Test:test_IsDepleted() (gas: 287122) -IsDepleted_LockupLinear_Integration_Concrete_Test:test_IsDepleted_StreamNotDepleted() (gas: 253544) +IsDepleted_LockupLinear_Integration_Concrete_Test:test_IsDepleted() (gas: 286858) +IsDepleted_LockupLinear_Integration_Concrete_Test:test_IsDepleted_StreamNotDepleted() (gas: 253511) IsDepleted_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11212) -IsStream_LockupDynamic_Integration_Concrete_Test:test_IsStream() (gas: 327114) +IsStream_LockupDynamic_Integration_Concrete_Test:test_IsStream() (gas: 327111) IsStream_LockupDynamic_Integration_Concrete_Test:test_IsStream_Null() (gas: 8527) -IsStream_LockupLinear_Integration_Concrete_Test:test_IsStream() (gas: 253906) +IsStream_LockupLinear_Integration_Concrete_Test:test_IsStream() (gas: 253873) IsStream_LockupLinear_Integration_Concrete_Test:test_IsStream_Null() (gas: 8570) -IsTransferable_LockupDynamic_Integration_Concrete_Test:test_IsTransferrable_Stream() (gas: 327298) +IsTransferable_LockupDynamic_Integration_Concrete_Test:test_IsTransferable_Stream() (gas: 327273) IsTransferable_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11674) -IsTransferable_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StreamTransferNotEnabled() (gas: 515837) -IsTransferable_LockupLinear_Integration_Concrete_Test:test_IsTransferrable_Stream() (gas: 254112) +IsTransferable_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StreamTransferNotEnabled() (gas: 515864) +IsTransferable_LockupLinear_Integration_Concrete_Test:test_IsTransferable_Stream() (gas: 254057) IsTransferable_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11739) -IsTransferable_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StreamTransferNotEnabled() (gas: 372867) -IsWarm_LockupDynamic_Integration_Concrete_Test:test_IsWarm_StatusCanceled() (gas: 375515) -IsWarm_LockupDynamic_Integration_Concrete_Test:test_IsWarm_StatusDepleted() (gas: 362198) -IsWarm_LockupDynamic_Integration_Concrete_Test:test_IsWarm_StatusPending() (gas: 330044) -IsWarm_LockupDynamic_Integration_Concrete_Test:test_IsWarm_StatusSettled() (gas: 335988) -IsWarm_LockupDynamic_Integration_Concrete_Test:test_IsWarm_StatusStreaming() (gas: 352172) +IsTransferable_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StreamTransferNotEnabled() (gas: 372834) +IsWarm_LockupDynamic_Integration_Concrete_Test:test_IsWarm_StatusCanceled() (gas: 375788) +IsWarm_LockupDynamic_Integration_Concrete_Test:test_IsWarm_StatusDepleted() (gas: 361997) +IsWarm_LockupDynamic_Integration_Concrete_Test:test_IsWarm_StatusPending() (gas: 330041) +IsWarm_LockupDynamic_Integration_Concrete_Test:test_IsWarm_StatusSettled() (gas: 335985) +IsWarm_LockupDynamic_Integration_Concrete_Test:test_IsWarm_StatusStreaming() (gas: 352169) IsWarm_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11085) -IsWarm_LockupLinear_Integration_Concrete_Test:test_IsWarm_StatusCanceled() (gas: 296975) -IsWarm_LockupLinear_Integration_Concrete_Test:test_IsWarm_StatusDepleted() (gas: 287198) -IsWarm_LockupLinear_Integration_Concrete_Test:test_IsWarm_StatusPending() (gas: 256814) -IsWarm_LockupLinear_Integration_Concrete_Test:test_IsWarm_StatusSettled() (gas: 262880) -IsWarm_LockupLinear_Integration_Concrete_Test:test_IsWarm_StatusStreaming() (gas: 263279) +IsWarm_LockupLinear_Integration_Concrete_Test:test_IsWarm_StatusCanceled() (gas: 297243) +IsWarm_LockupLinear_Integration_Concrete_Test:test_IsWarm_StatusDepleted() (gas: 286934) +IsWarm_LockupLinear_Integration_Concrete_Test:test_IsWarm_StatusPending() (gas: 256781) +IsWarm_LockupLinear_Integration_Concrete_Test:test_IsWarm_StatusSettled() (gas: 262847) +IsWarm_LockupLinear_Integration_Concrete_Test:test_IsWarm_StatusStreaming() (gas: 263246) IsWarm_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11106) MapSymbol_Integration_Concrete_Test:test_MapSymbol_LockupDynamic() (gas: 16959) MapSymbol_Integration_Concrete_Test:test_MapSymbol_LockupLinear() (gas: 16733) MapSymbol_Integration_Concrete_Test:test_RevertGiven_UnknownNFT() (gas: 1039753) MaxFlashLoan_Integration_Concrete_Test:test_MaxFlashLoan() (gas: 178987) MaxFlashLoan_Integration_Concrete_Test:test_MaxFlashLoan_AssetNotFlashLoanable() (gas: 15248) -MaxFlashLoan_Integration_Fuzz_Test:testFuzz_MaxFlashLoan(uint256) (runs: 50, μ: 178982, ~: 179000) +MaxFlashLoan_Integration_Fuzz_Test:testFuzz_MaxFlashLoan(uint256) (runs: 50, μ: 178984, ~: 179002) ProtocolFees_Integration_Concrete_Test:test_ProtocolFees() (gas: 41254) ProtocolFees_Integration_Concrete_Test:test_ProtocolFees_ProtocolFeeNotSet() (gas: 9943) -ProtocolRevenues_LockupDynamic_Integration_Concrete_Test:test_ProtocolRevenues() (gas: 320231) +ProtocolRevenues_LockupDynamic_Integration_Concrete_Test:test_ProtocolRevenues() (gas: 320228) ProtocolRevenues_LockupDynamic_Integration_Concrete_Test:test_ProtocolRevenues_ProtocolRevenuesZero() (gas: 10125) -ProtocolRevenues_LockupLinear_Integration_Concrete_Test:test_ProtocolRevenues() (gas: 246978) +ProtocolRevenues_LockupLinear_Integration_Concrete_Test:test_ProtocolRevenues() (gas: 246945) ProtocolRevenues_LockupLinear_Integration_Concrete_Test:test_ProtocolRevenues_ProtocolRevenuesZero() (gas: 10111) -RefundableAmountOf_LockupDynamic_Integration_Concrete_Test:test_RefundableAmountOf_StatusDepleted() (gas: 362159) -RefundableAmountOf_LockupDynamic_Integration_Concrete_Test:test_RefundableAmountOf_StatusPending() (gas: 335844) -RefundableAmountOf_LockupDynamic_Integration_Concrete_Test:test_RefundableAmountOf_StatusSettled() (gas: 335837) -RefundableAmountOf_LockupDynamic_Integration_Concrete_Test:test_RefundableAmountOf_StatusStreaming() (gas: 342706) -RefundableAmountOf_LockupDynamic_Integration_Concrete_Test:test_RefundableAmountOf_StreamHasBeenCanceled_StatusCanceled() (gas: 375424) -RefundableAmountOf_LockupDynamic_Integration_Concrete_Test:test_RefundableAmountOf_StreamHasBeenCanceled_StatusDepleted() (gas: 398793) -RefundableAmountOf_LockupDynamic_Integration_Concrete_Test:test_RefundableAmountOf_StreamNotCancelable() (gas: 523497) +RefundableAmountOf_LockupDynamic_Integration_Concrete_Test:test_RefundableAmountOf_StatusDepleted() (gas: 361958) +RefundableAmountOf_LockupDynamic_Integration_Concrete_Test:test_RefundableAmountOf_StatusPending() (gas: 335841) +RefundableAmountOf_LockupDynamic_Integration_Concrete_Test:test_RefundableAmountOf_StatusSettled() (gas: 335834) +RefundableAmountOf_LockupDynamic_Integration_Concrete_Test:test_RefundableAmountOf_StatusStreaming() (gas: 342703) +RefundableAmountOf_LockupDynamic_Integration_Concrete_Test:test_RefundableAmountOf_StreamHasBeenCanceled_StatusCanceled() (gas: 375697) +RefundableAmountOf_LockupDynamic_Integration_Concrete_Test:test_RefundableAmountOf_StreamHasBeenCanceled_StatusDepleted() (gas: 398868) +RefundableAmountOf_LockupDynamic_Integration_Concrete_Test:test_RefundableAmountOf_StreamNotCancelable() (gas: 523491) RefundableAmountOf_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11099) -RefundableAmountOf_LockupDynamic_Integration_Fuzz_Test:testFuzz_RefundableAmountOf(uint256) (runs: 50, μ: 44758, ~: 30742) -RefundableAmountOf_LockupLinear_Integration_Concrete_Test:test_RefundableAmountOf_StatusDepleted() (gas: 287155) -RefundableAmountOf_LockupLinear_Integration_Concrete_Test:test_RefundableAmountOf_StatusPending() (gas: 262601) -RefundableAmountOf_LockupLinear_Integration_Concrete_Test:test_RefundableAmountOf_StatusSettled() (gas: 262724) -RefundableAmountOf_LockupLinear_Integration_Concrete_Test:test_RefundableAmountOf_StatusStreaming() (gas: 264211) -RefundableAmountOf_LockupLinear_Integration_Concrete_Test:test_RefundableAmountOf_StreamHasBeenCanceled_StatusCanceled() (gas: 296880) -RefundableAmountOf_LockupLinear_Integration_Concrete_Test:test_RefundableAmountOf_StreamHasBeenCanceled_StatusDepleted() (gas: 320235) -RefundableAmountOf_LockupLinear_Integration_Concrete_Test:test_RefundableAmountOf_StreamNotCancelable() (gas: 380476) +RefundableAmountOf_LockupDynamic_Integration_Fuzz_Test:testFuzz_RefundableAmountOf(uint256) (runs: 50, μ: 42776, ~: 30742) +RefundableAmountOf_LockupLinear_Integration_Concrete_Test:test_RefundableAmountOf_StatusDepleted() (gas: 286891) +RefundableAmountOf_LockupLinear_Integration_Concrete_Test:test_RefundableAmountOf_StatusPending() (gas: 262568) +RefundableAmountOf_LockupLinear_Integration_Concrete_Test:test_RefundableAmountOf_StatusSettled() (gas: 262691) +RefundableAmountOf_LockupLinear_Integration_Concrete_Test:test_RefundableAmountOf_StatusStreaming() (gas: 264178) +RefundableAmountOf_LockupLinear_Integration_Concrete_Test:test_RefundableAmountOf_StreamHasBeenCanceled_StatusCanceled() (gas: 297148) +RefundableAmountOf_LockupLinear_Integration_Concrete_Test:test_RefundableAmountOf_StreamHasBeenCanceled_StatusDepleted() (gas: 320272) +RefundableAmountOf_LockupLinear_Integration_Concrete_Test:test_RefundableAmountOf_StreamNotCancelable() (gas: 380410) RefundableAmountOf_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11110) -RefundableAmountOf_LockupLinear_Integration_Fuzz_Test:testFuzz_RefundableAmountOf(uint256) (runs: 50, μ: 30789, ~: 30858) -Renounce_LockupDynamic_Integration_Concrete_Test:test_Renounce() (gas: 694601) -Renounce_LockupDynamic_Integration_Concrete_Test:test_Renounce_RecipientDoesNotImplementHook() (gas: 687648) -Renounce_LockupDynamic_Integration_Concrete_Test:test_Renounce_RecipientNotContract() (gas: 292607) -Renounce_LockupDynamic_Integration_Concrete_Test:test_Renounce_RecipientReentrancy() (gas: 692813) -Renounce_LockupDynamic_Integration_Concrete_Test:test_Renounce_RecipientReverts() (gas: 688255) -Renounce_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11564) -Renounce_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StatusCanceled() (gas: 87115) -Renounce_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StatusDepleted() (gas: 68563) -Renounce_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StatusSettled() (gas: 24707) -Renounce_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StreamNotCancelable() (gas: 649885) -Renounce_LockupLinear_Integration_Concrete_Test:test_Renounce() (gas: 481694) -Renounce_LockupLinear_Integration_Concrete_Test:test_Renounce_RecipientDoesNotImplementHook() (gas: 474739) -Renounce_LockupLinear_Integration_Concrete_Test:test_Renounce_RecipientNotContract() (gas: 219426) -Renounce_LockupLinear_Integration_Concrete_Test:test_Renounce_RecipientReentrancy() (gas: 479876) -Renounce_LockupLinear_Integration_Concrete_Test:test_Renounce_RecipientReverts() (gas: 475346) +RefundableAmountOf_LockupLinear_Integration_Fuzz_Test:testFuzz_RefundableAmountOf(uint256) (runs: 50, μ: 30748, ~: 30858) +Renounce_LockupDynamic_Integration_Concrete_Test:test_Renounce() (gas: 694498) +Renounce_LockupDynamic_Integration_Concrete_Test:test_Renounce_RecipientDoesNotImplementHook() (gas: 687573) +Renounce_LockupDynamic_Integration_Concrete_Test:test_Renounce_RecipientNotContract() (gas: 292606) +Renounce_LockupDynamic_Integration_Concrete_Test:test_Renounce_RecipientReentrancy() (gas: 692702) +Renounce_LockupDynamic_Integration_Concrete_Test:test_Renounce_RecipientReverts() (gas: 688180) +Renounce_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11567) +Renounce_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StatusCanceled() (gas: 87385) +Renounce_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StatusDepleted() (gas: 68359) +Renounce_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StatusSettled() (gas: 24692) +Renounce_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StreamNotCancelable() (gas: 649846) +Renounce_LockupLinear_Integration_Concrete_Test:test_Renounce() (gas: 481553) +Renounce_LockupLinear_Integration_Concrete_Test:test_Renounce_RecipientDoesNotImplementHook() (gas: 474596) +Renounce_LockupLinear_Integration_Concrete_Test:test_Renounce_RecipientNotContract() (gas: 219349) +Renounce_LockupLinear_Integration_Concrete_Test:test_Renounce_RecipientReentrancy() (gas: 479733) +Renounce_LockupLinear_Integration_Concrete_Test:test_Renounce_RecipientReverts() (gas: 475203) Renounce_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11575) -Renounce_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StatusCanceled() (gas: 77807) -Renounce_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StatusDepleted() (gas: 68795) +Renounce_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StatusCanceled() (gas: 78108) +Renounce_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StatusDepleted() (gas: 68564) Renounce_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StatusSettled() (gas: 24822) -Renounce_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StreamNotCancelable() (gas: 437024) +Renounce_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StreamNotCancelable() (gas: 436925) SafeAssetDecimals_Integration_Concrete_Test:test_SafeAssetDecimals() (gas: 12117) SafeAssetDecimals_Integration_Concrete_Test:test_SafeAssetDecimals_DecimalsNotImplemented() (gas: 10852) SafeAssetDecimals_Integration_Concrete_Test:test_SafeAssetDecimals_EOA() (gas: 11625) @@ -261,52 +261,52 @@ SetComptroller_LockupDynamic_Integration_Concrete_Test:test_SetComptroller_NewCo SetComptroller_LockupDynamic_Integration_Concrete_Test:test_SetComptroller_SameComptroller() (gas: 23283) SetComptroller_LockupLinear_Integration_Concrete_Test:test_SetComptroller_NewComptroller() (gas: 311750) SetComptroller_LockupLinear_Integration_Concrete_Test:test_SetComptroller_SameComptroller() (gas: 23280) -SetFlashFee_Integration_Fuzz_Test:testFuzz_SetFlashFee(uint256) (runs: 50, μ: 37767, ~: 39448) +SetFlashFee_Integration_Fuzz_Test:testFuzz_SetFlashFee(uint256) (runs: 50, μ: 37740, ~: 39448) SetNFTDescriptor_LockupDynamic_Integration_Concrete_Test:test_SetNFTDescriptor_NewNFTDescriptor() (gas: 6551561) SetNFTDescriptor_LockupDynamic_Integration_Concrete_Test:test_SetNFTDescriptor_SameNFTDescriptor() (gas: 2258131) SetNFTDescriptor_LockupLinear_Integration_Concrete_Test:test_SetNFTDescriptor_NewNFTDescriptor() (gas: 6550197) SetNFTDescriptor_LockupLinear_Integration_Concrete_Test:test_SetNFTDescriptor_SameNFTDescriptor() (gas: 2256602) SetProtocolFee_Integration_Concrete_Test:test_SetProtocolFee() (gas: 47804) SetProtocolFee_Integration_Concrete_Test:test_SetProtocolFee_SameFee() (gas: 22636) -SetProtocolFee_Integration_Fuzz_Test:testFuzz_SetProtocolFee(uint256) (runs: 50, μ: 43128, ~: 43074) +SetProtocolFee_Integration_Fuzz_Test:testFuzz_SetProtocolFee(uint256) (runs: 50, μ: 43144, ~: 43219) StatusOf_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11651) -StatusOf_LockupDynamic_Integration_Concrete_Test:test_StatusOf() (gas: 352809) -StatusOf_LockupDynamic_Integration_Concrete_Test:test_StatusOf_AssetsFullyWithdrawn() (gas: 362823) -StatusOf_LockupDynamic_Integration_Concrete_Test:test_StatusOf_RefundableAmountNotZero() (gas: 336589) -StatusOf_LockupDynamic_Integration_Concrete_Test:test_StatusOf_StartTimeInTheFuture() (gas: 330688) -StatusOf_LockupDynamic_Integration_Concrete_Test:test_StatusOf_StreamCanceled() (gas: 376151) +StatusOf_LockupDynamic_Integration_Concrete_Test:test_StatusOf() (gas: 352806) +StatusOf_LockupDynamic_Integration_Concrete_Test:test_StatusOf_AssetsFullyWithdrawn() (gas: 362622) +StatusOf_LockupDynamic_Integration_Concrete_Test:test_StatusOf_RefundableAmountNotZero() (gas: 336586) +StatusOf_LockupDynamic_Integration_Concrete_Test:test_StatusOf_StartTimeInTheFuture() (gas: 330685) +StatusOf_LockupDynamic_Integration_Concrete_Test:test_StatusOf_StreamCanceled() (gas: 376424) StatusOf_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11681) -StatusOf_LockupLinear_Integration_Concrete_Test:test_StatusOf() (gas: 263330) -StatusOf_LockupLinear_Integration_Concrete_Test:test_StatusOf_AssetsFullyWithdrawn() (gas: 287837) -StatusOf_LockupLinear_Integration_Concrete_Test:test_StatusOf_RefundableAmountNotZero() (gas: 263495) -StatusOf_LockupLinear_Integration_Concrete_Test:test_StatusOf_StartTimeInTheFuture() (gas: 257472) -StatusOf_LockupLinear_Integration_Concrete_Test:test_StatusOf_StreamCanceled() (gas: 297625) +StatusOf_LockupLinear_Integration_Concrete_Test:test_StatusOf() (gas: 263297) +StatusOf_LockupLinear_Integration_Concrete_Test:test_StatusOf_AssetsFullyWithdrawn() (gas: 287573) +StatusOf_LockupLinear_Integration_Concrete_Test:test_StatusOf_RefundableAmountNotZero() (gas: 263462) +StatusOf_LockupLinear_Integration_Concrete_Test:test_StatusOf_StartTimeInTheFuture() (gas: 257439) +StatusOf_LockupLinear_Integration_Concrete_Test:test_StatusOf_StreamCanceled() (gas: 297893) StreamedAmountOf_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11319) StreamedAmountOf_LockupDynamic_Integration_Concrete_Test:test_StreamedAmountOf_CurrentMilestone1st() (gas: 45931) StreamedAmountOf_LockupDynamic_Integration_Concrete_Test:test_StreamedAmountOf_CurrentMilestoneNot1st() (gas: 50774) -StreamedAmountOf_LockupDynamic_Integration_Concrete_Test:test_StreamedAmountOf_OneSegment() (gas: 257027) +StreamedAmountOf_LockupDynamic_Integration_Concrete_Test:test_StreamedAmountOf_OneSegment() (gas: 257024) StreamedAmountOf_LockupDynamic_Integration_Concrete_Test:test_StreamedAmountOf_StartTimeInTheFuture() (gas: 20230) StreamedAmountOf_LockupDynamic_Integration_Concrete_Test:test_StreamedAmountOf_StartTimeInThePresent() (gas: 25593) -StreamedAmountOf_LockupDynamic_Integration_Concrete_Test:test_StreamedAmountOf_StatusDepleted() (gas: 68891) +StreamedAmountOf_LockupDynamic_Integration_Concrete_Test:test_StreamedAmountOf_StatusDepleted() (gas: 68693) StreamedAmountOf_LockupDynamic_Integration_Concrete_Test:test_StreamedAmountOf_StatusPending() (gas: 20360) StreamedAmountOf_LockupDynamic_Integration_Concrete_Test:test_StreamedAmountOf_StatusSettled() (gas: 26624) -StreamedAmountOf_LockupDynamic_Integration_Concrete_Test:test_StreamedAmountOf_StreamHasBeenCanceled_StatusCanceled() (gas: 87522) -StreamedAmountOf_LockupDynamic_Integration_Concrete_Test:test_StreamedAmountOf_StreamHasBeenCanceled_StatusDepleted() (gas: 116337) -StreamedAmountOf_LockupDynamic_Integration_Fuzz_Test:testFuzz_StreamedAmountOf_Calculation((uint128,uint64,uint40)[],uint40) (runs: 50, μ: 3523474, ~: 3133486) -StreamedAmountOf_LockupDynamic_Integration_Fuzz_Test:testFuzz_StreamedAmountOf_Monotonicity((uint128,uint64,uint40)[],uint40,uint40) (runs: 50, μ: 3972237, ~: 4084392) -StreamedAmountOf_LockupDynamic_Integration_Fuzz_Test:testFuzz_StreamedAmountOf_OneSegment((uint128,uint64,uint40),uint40) (runs: 50, μ: 276656, ~: 270632) +StreamedAmountOf_LockupDynamic_Integration_Concrete_Test:test_StreamedAmountOf_StreamHasBeenCanceled_StatusCanceled() (gas: 87798) +StreamedAmountOf_LockupDynamic_Integration_Concrete_Test:test_StreamedAmountOf_StreamHasBeenCanceled_StatusDepleted() (gas: 116415) +StreamedAmountOf_LockupDynamic_Integration_Fuzz_Test:testFuzz_StreamedAmountOf_Calculation((uint128,uint64,uint40)[],uint40) (runs: 50, μ: 3525063, ~: 3130793) +StreamedAmountOf_LockupDynamic_Integration_Fuzz_Test:testFuzz_StreamedAmountOf_Monotonicity((uint128,uint64,uint40)[],uint40,uint40) (runs: 50, μ: 3968937, ~: 4106456) +StreamedAmountOf_LockupDynamic_Integration_Fuzz_Test:testFuzz_StreamedAmountOf_OneSegment((uint128,uint64,uint40),uint40) (runs: 50, μ: 276737, ~: 270630) StreamedAmountOf_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 11349) StreamedAmountOf_LockupLinear_Integration_Concrete_Test:test_StreamedAmountOf_CliffTimeInTheFuture() (gas: 26236) StreamedAmountOf_LockupLinear_Integration_Concrete_Test:test_StreamedAmountOf_CliffTimeInThePast() (gas: 17291) StreamedAmountOf_LockupLinear_Integration_Concrete_Test:test_StreamedAmountOf_CliffTimeInThePresent() (gas: 27121) -StreamedAmountOf_LockupLinear_Integration_Concrete_Test:test_StreamedAmountOf_StatusDepleted() (gas: 69108) +StreamedAmountOf_LockupLinear_Integration_Concrete_Test:test_StreamedAmountOf_StatusDepleted() (gas: 68877) StreamedAmountOf_LockupLinear_Integration_Concrete_Test:test_StreamedAmountOf_StatusPending() (gas: 20305) StreamedAmountOf_LockupLinear_Integration_Concrete_Test:test_StreamedAmountOf_StatusSettled() (gas: 26688) -StreamedAmountOf_LockupLinear_Integration_Concrete_Test:test_StreamedAmountOf_StreamHasBeenCanceled_StatusCanceled() (gas: 78221) -StreamedAmountOf_LockupLinear_Integration_Concrete_Test:test_StreamedAmountOf_StreamHasBeenCanceled_StatusDepleted() (gas: 106989) -StreamedAmountOf_LockupLinear_Integration_Fuzz_Test:testFuzz_StreamedAmountOf_Calculation(uint40,uint128) (runs: 50, μ: 234406, ~: 234313) -StreamedAmountOf_LockupLinear_Integration_Fuzz_Test:testFuzz_StreamedAmountOf_CliffTimeInTheFuture(uint40) (runs: 50, μ: 27397, ~: 27604) -StreamedAmountOf_LockupLinear_Integration_Fuzz_Test:testFuzz_StreamedAmountOf_Monotonicity(uint40,uint40,uint128) (runs: 50, μ: 239510, ~: 241475) +StreamedAmountOf_LockupLinear_Integration_Concrete_Test:test_StreamedAmountOf_StreamHasBeenCanceled_StatusCanceled() (gas: 78522) +StreamedAmountOf_LockupLinear_Integration_Concrete_Test:test_StreamedAmountOf_StreamHasBeenCanceled_StatusDepleted() (gas: 107059) +StreamedAmountOf_LockupLinear_Integration_Fuzz_Test:testFuzz_StreamedAmountOf_Calculation(uint40,uint128) (runs: 50, μ: 234376, ~: 234297) +StreamedAmountOf_LockupLinear_Integration_Fuzz_Test:testFuzz_StreamedAmountOf_CliffTimeInTheFuture(uint40) (runs: 50, μ: 27341, ~: 27604) +StreamedAmountOf_LockupLinear_Integration_Fuzz_Test:testFuzz_StreamedAmountOf_Monotonicity(uint40,uint40,uint128) (runs: 50, μ: 239452, ~: 241444) ToggleFlashAsset_Integration_Concrete_Test:test_ToggleFlashAsset() (gas: 31848) ToggleFlashAsset_Integration_Concrete_Test:test_ToggleFlashAsset_FlagNotEnabled() (gas: 41868) TokenURI_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_NFTDoesNotExist() (gas: 13542) @@ -315,99 +315,99 @@ TokenURI_LockupDynamic_Integration_Concrete_Test:test_TokenURI_Full() (gas: 6601 TokenURI_LockupLinear_Integration_Concrete_Test:test_RevertGiven_NFTDoesNotExist() (gas: 13525) TokenURI_LockupLinear_Integration_Concrete_Test:test_TokenURI_Decoded() (gas: 6624) TokenURI_LockupLinear_Integration_Concrete_Test:test_TokenURI_Full() (gas: 6601) -TransferFrom_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StreamNotTransferable() (gas: 314213) -TransferFrom_LockupDynamic_Integration_Concrete_Test:test_TransferFrom() (gas: 326552) -TransferFrom_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StreamNotTransferable() (gas: 240393) -TransferFrom_LockupLinear_Integration_Concrete_Test:test_TransferFrom() (gas: 253270) +TransferFrom_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StreamNotTransferable() (gas: 314210) +TransferFrom_LockupDynamic_Integration_Concrete_Test:test_TransferFrom() (gas: 326549) +TransferFrom_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StreamNotTransferable() (gas: 240360) +TransferFrom_LockupLinear_Integration_Concrete_Test:test_TransferFrom() (gas: 253204) WasCanceled_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 12048) -WasCanceled_LockupDynamic_Integration_Concrete_Test:test_WasCanceled() (gas: 364246) -WasCanceled_LockupDynamic_Integration_Concrete_Test:test_WasCanceled_StreamNotCanceled() (gas: 327664) +WasCanceled_LockupDynamic_Integration_Concrete_Test:test_WasCanceled() (gas: 364519) +WasCanceled_LockupDynamic_Integration_Concrete_Test:test_WasCanceled_StreamNotCanceled() (gas: 327661) WasCanceled_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 12069) -WasCanceled_LockupLinear_Integration_Concrete_Test:test_WasCanceled() (gas: 288960) -WasCanceled_LockupLinear_Integration_Concrete_Test:test_WasCanceled_StreamNotCanceled() (gas: 254434) -WithdrawMaxAndTransfer_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_NFTBurned() (gas: 75605) +WasCanceled_LockupLinear_Integration_Concrete_Test:test_WasCanceled() (gas: 289228) +WasCanceled_LockupLinear_Integration_Concrete_Test:test_WasCanceled_StreamNotCanceled() (gas: 254401) +WithdrawMaxAndTransfer_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_NFTBurned() (gas: 75407) WithdrawMaxAndTransfer_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 14162) -WithdrawMaxAndTransfer_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StreamNotTransferable() (gas: 265104) -WithdrawMaxAndTransfer_LockupDynamic_Integration_Concrete_Test:test_WithdrawMaxAndTransfer() (gas: 159929) -WithdrawMaxAndTransfer_LockupDynamic_Integration_Concrete_Test:test_WithdrawMaxAndTransfer_WithdrawableAmountZero() (gas: 101818) -WithdrawMaxAndTransfer_LockupDynamic_Integration_Fuzz_Test:testFuzz_WithdrawMaxAndTransfer(uint256,address) (runs: 50, μ: 136606, ~: 156340) -WithdrawMaxAndTransfer_LockupLinear_Integration_Concrete_Test:test_RevertGiven_NFTBurned() (gas: 75850) +WithdrawMaxAndTransfer_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StreamNotTransferable() (gas: 265101) +WithdrawMaxAndTransfer_LockupDynamic_Integration_Concrete_Test:test_WithdrawMaxAndTransfer() (gas: 159731) +WithdrawMaxAndTransfer_LockupDynamic_Integration_Concrete_Test:test_WithdrawMaxAndTransfer_WithdrawableAmountZero() (gas: 101620) +WithdrawMaxAndTransfer_LockupDynamic_Integration_Fuzz_Test:testFuzz_WithdrawMaxAndTransfer(uint256,address) (runs: 50, μ: 136641, ~: 156598) +WithdrawMaxAndTransfer_LockupLinear_Integration_Concrete_Test:test_RevertGiven_NFTBurned() (gas: 75586) WithdrawMaxAndTransfer_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 14179) -WithdrawMaxAndTransfer_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StreamNotTransferable() (gas: 189368) -WithdrawMaxAndTransfer_LockupLinear_Integration_Concrete_Test:test_WithdrawMaxAndTransfer() (gas: 112917) -WithdrawMaxAndTransfer_LockupLinear_Integration_Concrete_Test:test_WithdrawMaxAndTransfer_WithdrawableAmountZero() (gas: 102105) -WithdrawMaxAndTransfer_LockupLinear_Integration_Fuzz_Test:testFuzz_WithdrawMaxAndTransfer(uint256,address) (runs: 50, μ: 99893, ~: 111263) -WithdrawMax_LockupDynamic_Integration_Concrete_Test:test_WithdrawMax() (gas: 135385) -WithdrawMax_LockupDynamic_Integration_Concrete_Test:test_WithdrawMax_EndTimeNotInTheFuture() (gas: 80455) -WithdrawMax_LockupDynamic_Integration_Fuzz_Test:testFuzz_WithdrawMax(uint256) (runs: 50, μ: 117789, ~: 120819) -WithdrawMax_LockupDynamic_Integration_Fuzz_Test:testFuzz_WithdrawMax_EndTimeNotInTheFuture(uint256) (runs: 50, μ: 83083, ~: 83237) -WithdrawMax_LockupLinear_Integration_Concrete_Test:test_WithdrawMax() (gas: 74722) -WithdrawMax_LockupLinear_Integration_Concrete_Test:test_WithdrawMax_EndTimeNotInTheFuture() (gas: 80725) -WithdrawMax_LockupLinear_Integration_Fuzz_Test:testFuzz_WithdrawMax(uint256) (runs: 50, μ: 73792, ~: 73934) -WithdrawMax_LockupLinear_Integration_Fuzz_Test:testFuzz_WithdrawMax_EndTimeNotInTheFuture(uint256) (runs: 50, μ: 83366, ~: 83507) -WithdrawMultiple_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_AllStatusesDepleted() (gas: 74062) +WithdrawMaxAndTransfer_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StreamNotTransferable() (gas: 189302) +WithdrawMaxAndTransfer_LockupLinear_Integration_Concrete_Test:test_WithdrawMaxAndTransfer() (gas: 112620) +WithdrawMaxAndTransfer_LockupLinear_Integration_Concrete_Test:test_WithdrawMaxAndTransfer_WithdrawableAmountZero() (gas: 101808) +WithdrawMaxAndTransfer_LockupLinear_Integration_Fuzz_Test:testFuzz_WithdrawMaxAndTransfer(uint256,address) (runs: 50, μ: 102527, ~: 110966) +WithdrawMax_LockupDynamic_Integration_Concrete_Test:test_WithdrawMax() (gas: 135187) +WithdrawMax_LockupDynamic_Integration_Concrete_Test:test_WithdrawMax_EndTimeNotInTheFuture() (gas: 80257) +WithdrawMax_LockupDynamic_Integration_Fuzz_Test:testFuzz_WithdrawMax(uint256) (runs: 50, μ: 117346, ~: 120408) +WithdrawMax_LockupDynamic_Integration_Fuzz_Test:testFuzz_WithdrawMax_EndTimeNotInTheFuture(uint256) (runs: 50, μ: 82843, ~: 82981) +WithdrawMax_LockupLinear_Integration_Concrete_Test:test_WithdrawMax() (gas: 74491) +WithdrawMax_LockupLinear_Integration_Concrete_Test:test_WithdrawMax_EndTimeNotInTheFuture() (gas: 80494) +WithdrawMax_LockupLinear_Integration_Fuzz_Test:testFuzz_WithdrawMax(uint256) (runs: 50, μ: 73588, ~: 73703) +WithdrawMax_LockupLinear_Integration_Fuzz_Test:testFuzz_WithdrawMax_EndTimeNotInTheFuture(uint256) (runs: 50, μ: 83108, ~: 83276) +WithdrawMultiple_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_AllStatusesDepleted() (gas: 73864) WithdrawMultiple_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_OnlyNull() (gas: 21063) -WithdrawMultiple_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_SomeNull() (gas: 125083) -WithdrawMultiple_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_SomeStatusesDepleted() (gas: 83535) -WithdrawMultiple_LockupDynamic_Integration_Concrete_Test:test_WithdrawMultiple() (gas: 1832166) +WithdrawMultiple_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_SomeNull() (gas: 124687) +WithdrawMultiple_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_SomeStatusesDepleted() (gas: 83337) +WithdrawMultiple_LockupDynamic_Integration_Concrete_Test:test_WithdrawMultiple() (gas: 1831194) WithdrawMultiple_LockupDynamic_Integration_Concrete_Test:test_WithdrawMultiple_ArrayCountsZero() (gas: 9109) -WithdrawMultiple_LockupDynamic_Integration_Fuzz_Test:testFuzz_WithdrawMultiple(uint256,address,uint128) (runs: 50, μ: 2746451, ~: 2747082) -WithdrawMultiple_LockupLinear_Integration_Concrete_Test:test_RevertGiven_AllStatusesDepleted() (gas: 74210) -WithdrawMultiple_LockupLinear_Integration_Concrete_Test:test_RevertGiven_OnlyNull() (gas: 20981) -WithdrawMultiple_LockupLinear_Integration_Concrete_Test:test_RevertGiven_SomeNull() (gas: 105595) -WithdrawMultiple_LockupLinear_Integration_Concrete_Test:test_RevertGiven_SomeStatusesDepleted() (gas: 83683) -WithdrawMultiple_LockupLinear_Integration_Concrete_Test:test_WithdrawMultiple() (gas: 1265450) -WithdrawMultiple_LockupLinear_Integration_Concrete_Test:test_WithdrawMultiple_ArrayCountsZero() (gas: 9126) -WithdrawMultiple_LockupLinear_Integration_Fuzz_Test:testFuzz_WithdrawMultiple(uint256,address,uint128) (runs: 50, μ: 1775333, ~: 1775230) -Withdraw_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 19915) -Withdraw_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StreamDepleted() (gas: 68019) -Withdraw_LockupDynamic_Integration_Concrete_Test:test_Withdraw() (gas: 385370) -Withdraw_LockupDynamic_Integration_Concrete_Test:test_Withdraw_CallerApprovedOperator() (gas: 112905) -Withdraw_LockupDynamic_Integration_Concrete_Test:test_Withdraw_CallerRecipient() (gas: 81464) -Withdraw_LockupDynamic_Integration_Concrete_Test:test_Withdraw_EndTimeNotInTheFuture() (gas: 72694) -Withdraw_LockupDynamic_Integration_Concrete_Test:test_Withdraw_RecipientDoesNotImplementHook() (gas: 363017) -Withdraw_LockupDynamic_Integration_Concrete_Test:test_Withdraw_RecipientNotContract() (gas: 122875) -Withdraw_LockupDynamic_Integration_Concrete_Test:test_Withdraw_RecipientReentrancy() (gas: 390550) -Withdraw_LockupDynamic_Integration_Concrete_Test:test_Withdraw_RecipientReverts() (gas: 363572) -Withdraw_LockupDynamic_Integration_Concrete_Test:test_Withdraw_StreamHasBeenCanceled() (gas: 382375) -Withdraw_LockupDynamic_Integration_Fuzz_Test:testFuzz_Withdraw(uint256,address,uint128) (runs: 50, μ: 126673, ~: 98881) -Withdraw_LockupDynamic_Integration_Fuzz_Test:testFuzz_Withdraw_CallerApprovedOperator(address) (runs: 50, μ: 145648, ~: 145648) -Withdraw_LockupDynamic_Integration_Fuzz_Test:testFuzz_Withdraw_SegmentFuzing(((uint128,uint64,uint40)[],uint256,address)) (runs: 50, μ: 3946677, ~: 3885668) -Withdraw_LockupDynamic_Integration_Fuzz_Test:testFuzz_Withdraw_StreamHasBeenCanceled(uint256,address,uint128) (runs: 50, μ: 160521, ~: 160725) +WithdrawMultiple_LockupDynamic_Integration_Fuzz_Test:testFuzz_WithdrawMultiple(uint256,address,uint128) (runs: 50, μ: 2745377, ~: 2745599) +WithdrawMultiple_LockupLinear_Integration_Concrete_Test:test_RevertGiven_AllStatusesDepleted() (gas: 74018) +WithdrawMultiple_LockupLinear_Integration_Concrete_Test:test_RevertGiven_OnlyNull() (gas: 21020) +WithdrawMultiple_LockupLinear_Integration_Concrete_Test:test_RevertGiven_SomeNull() (gas: 105130) +WithdrawMultiple_LockupLinear_Integration_Concrete_Test:test_RevertGiven_SomeStatusesDepleted() (gas: 83491) +WithdrawMultiple_LockupLinear_Integration_Concrete_Test:test_WithdrawMultiple() (gas: 1264004) +WithdrawMultiple_LockupLinear_Integration_Concrete_Test:test_WithdrawMultiple_ArrayCountsZero() (gas: 9165) +WithdrawMultiple_LockupLinear_Integration_Fuzz_Test:testFuzz_WithdrawMultiple(uint256,address,uint128) (runs: 50, μ: 1773543, ~: 1773439) +Withdraw_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 19918) +Withdraw_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_StreamDepleted() (gas: 67824) +Withdraw_LockupDynamic_Integration_Concrete_Test:test_Withdraw() (gas: 385175) +Withdraw_LockupDynamic_Integration_Concrete_Test:test_Withdraw_CallerApprovedOperator() (gas: 112713) +Withdraw_LockupDynamic_Integration_Concrete_Test:test_Withdraw_CallerRecipient() (gas: 81272) +Withdraw_LockupDynamic_Integration_Concrete_Test:test_Withdraw_EndTimeNotInTheFuture() (gas: 72502) +Withdraw_LockupDynamic_Integration_Concrete_Test:test_Withdraw_RecipientDoesNotImplementHook() (gas: 362822) +Withdraw_LockupDynamic_Integration_Concrete_Test:test_Withdraw_RecipientNotContract() (gas: 122683) +Withdraw_LockupDynamic_Integration_Concrete_Test:test_Withdraw_RecipientReentrancy() (gas: 390163) +Withdraw_LockupDynamic_Integration_Concrete_Test:test_Withdraw_RecipientReverts() (gas: 363377) +Withdraw_LockupDynamic_Integration_Concrete_Test:test_Withdraw_StreamHasBeenCanceled() (gas: 382351) +Withdraw_LockupDynamic_Integration_Fuzz_Test:testFuzz_Withdraw(uint256,address,uint128) (runs: 50, μ: 125244, ~: 98689) +Withdraw_LockupDynamic_Integration_Fuzz_Test:testFuzz_Withdraw_CallerApprovedOperator(address) (runs: 50, μ: 145456, ~: 145456) +Withdraw_LockupDynamic_Integration_Fuzz_Test:testFuzz_Withdraw_SegmentFuzing(((uint128,uint64,uint40)[],uint256,address)) (runs: 50, μ: 3969894, ~: 4005165) +Withdraw_LockupDynamic_Integration_Fuzz_Test:testFuzz_Withdraw_StreamHasBeenCanceled(uint256,address,uint128) (runs: 50, μ: 160727, ~: 160960) Withdraw_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 19917) -Withdraw_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StreamDepleted() (gas: 68251) -Withdraw_LockupLinear_Integration_Concrete_Test:test_Withdraw() (gas: 268659) -Withdraw_LockupLinear_Integration_Concrete_Test:test_Withdraw_CallerApprovedOperator() (gas: 93323) -Withdraw_LockupLinear_Integration_Concrete_Test:test_Withdraw_CallerRecipient() (gas: 61871) -Withdraw_LockupLinear_Integration_Concrete_Test:test_Withdraw_EndTimeNotInTheFuture() (gas: 72950) -Withdraw_LockupLinear_Integration_Concrete_Test:test_Withdraw_RecipientDoesNotImplementHook() (gas: 259958) -Withdraw_LockupLinear_Integration_Concrete_Test:test_Withdraw_RecipientNotContract() (gas: 75977) -Withdraw_LockupLinear_Integration_Concrete_Test:test_Withdraw_RecipientReentrancy() (gas: 273925) -Withdraw_LockupLinear_Integration_Concrete_Test:test_Withdraw_RecipientReverts() (gas: 260513) -Withdraw_LockupLinear_Integration_Concrete_Test:test_Withdraw_StreamHasBeenCanceled() (gas: 292880) -Withdraw_LockupLinear_Integration_Fuzz_Test:testFuzz_Withdraw(uint256,address,uint128) (runs: 50, μ: 99550, ~: 99500) -Withdraw_LockupLinear_Integration_Fuzz_Test:testFuzz_Withdraw_CallerApprovedOperator(address) (runs: 50, μ: 112442, ~: 112442) -Withdraw_LockupLinear_Integration_Fuzz_Test:testFuzz_Withdraw_StreamHasBeenCanceled(uint256,address,uint128) (runs: 50, μ: 141061, ~: 140960) +Withdraw_LockupLinear_Integration_Concrete_Test:test_RevertGiven_StreamDepleted() (gas: 68020) +Withdraw_LockupLinear_Integration_Concrete_Test:test_Withdraw() (gas: 268395) +Withdraw_LockupLinear_Integration_Concrete_Test:test_Withdraw_CallerApprovedOperator() (gas: 93092) +Withdraw_LockupLinear_Integration_Concrete_Test:test_Withdraw_CallerRecipient() (gas: 61640) +Withdraw_LockupLinear_Integration_Concrete_Test:test_Withdraw_EndTimeNotInTheFuture() (gas: 72719) +Withdraw_LockupLinear_Integration_Concrete_Test:test_Withdraw_RecipientDoesNotImplementHook() (gas: 259694) +Withdraw_LockupLinear_Integration_Concrete_Test:test_Withdraw_RecipientNotContract() (gas: 75746) +Withdraw_LockupLinear_Integration_Concrete_Test:test_Withdraw_RecipientReentrancy() (gas: 273430) +Withdraw_LockupLinear_Integration_Concrete_Test:test_Withdraw_RecipientReverts() (gas: 260249) +Withdraw_LockupLinear_Integration_Concrete_Test:test_Withdraw_StreamHasBeenCanceled() (gas: 292858) +Withdraw_LockupLinear_Integration_Fuzz_Test:testFuzz_Withdraw(uint256,address,uint128) (runs: 50, μ: 99397, ~: 99269) +Withdraw_LockupLinear_Integration_Fuzz_Test:testFuzz_Withdraw_CallerApprovedOperator(address) (runs: 50, μ: 112211, ~: 112211) +Withdraw_LockupLinear_Integration_Fuzz_Test:testFuzz_Withdraw_StreamHasBeenCanceled(uint256,address,uint128) (runs: 50, μ: 141197, ~: 141030) WithdrawableAmountOf_LockupDynamic_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 12045) -WithdrawableAmountOf_LockupDynamic_Integration_Concrete_Test:test_WithdrawableAmountOf() (gas: 378359) -WithdrawableAmountOf_LockupDynamic_Integration_Concrete_Test:test_WithdrawableAmountOf_NoPreviousWithdrawals() (gas: 347684) -WithdrawableAmountOf_LockupDynamic_Integration_Concrete_Test:test_WithdrawableAmountOf_StartTimeInThePresent() (gas: 337261) -WithdrawableAmountOf_LockupDynamic_Integration_Concrete_Test:test_WithdrawableAmountOf_StatusDepleted() (gas: 363953) -WithdrawableAmountOf_LockupDynamic_Integration_Concrete_Test:test_WithdrawableAmountOf_StatusPending() (gas: 334010) -WithdrawableAmountOf_LockupDynamic_Integration_Concrete_Test:test_WithdrawableAmountOf_StatusSettled() (gas: 340233) -WithdrawableAmountOf_LockupDynamic_Integration_Concrete_Test:test_WithdrawableAmountOf_StreamHasBeenCanceled_StatusCanceled() (gas: 378264) -WithdrawableAmountOf_LockupDynamic_Integration_Concrete_Test:test_WithdrawableAmountOf_StreamHasBeenCanceled_StatusDepleted() (gas: 400586) -WithdrawableAmountOf_LockupDynamic_Integration_Fuzz_Test:testFuzz_WithdrawableAmountOf(uint40,uint128) (runs: 50, μ: 332863, ~: 313993) -WithdrawableAmountOf_LockupDynamic_Integration_Fuzz_Test:testFuzz_WithdrawableAmountOf_NoPreviousWithdrawals(uint40) (runs: 50, μ: 296253, ~: 289779) +WithdrawableAmountOf_LockupDynamic_Integration_Concrete_Test:test_WithdrawableAmountOf() (gas: 378164) +WithdrawableAmountOf_LockupDynamic_Integration_Concrete_Test:test_WithdrawableAmountOf_NoPreviousWithdrawals() (gas: 347681) +WithdrawableAmountOf_LockupDynamic_Integration_Concrete_Test:test_WithdrawableAmountOf_StartTimeInThePresent() (gas: 337258) +WithdrawableAmountOf_LockupDynamic_Integration_Concrete_Test:test_WithdrawableAmountOf_StatusDepleted() (gas: 363752) +WithdrawableAmountOf_LockupDynamic_Integration_Concrete_Test:test_WithdrawableAmountOf_StatusPending() (gas: 334007) +WithdrawableAmountOf_LockupDynamic_Integration_Concrete_Test:test_WithdrawableAmountOf_StatusSettled() (gas: 340230) +WithdrawableAmountOf_LockupDynamic_Integration_Concrete_Test:test_WithdrawableAmountOf_StreamHasBeenCanceled_StatusCanceled() (gas: 378537) +WithdrawableAmountOf_LockupDynamic_Integration_Concrete_Test:test_WithdrawableAmountOf_StreamHasBeenCanceled_StatusDepleted() (gas: 400661) +WithdrawableAmountOf_LockupDynamic_Integration_Fuzz_Test:testFuzz_WithdrawableAmountOf(uint40,uint128) (runs: 50, μ: 335946, ~: 352606) +WithdrawableAmountOf_LockupDynamic_Integration_Fuzz_Test:testFuzz_WithdrawableAmountOf_NoPreviousWithdrawals(uint40) (runs: 50, μ: 298357, ~: 289776) WithdrawableAmountOf_LockupLinear_Integration_Concrete_Test:test_RevertGiven_Null() (gas: 12076) -WithdrawableAmountOf_LockupLinear_Integration_Concrete_Test:test_WithdrawableAmountOf_CliffTimeInTheFuture() (gas: 253655) -WithdrawableAmountOf_LockupLinear_Integration_Concrete_Test:test_WithdrawableAmountOf_NoPreviousWithdrawals() (gas: 263526) -WithdrawableAmountOf_LockupLinear_Integration_Concrete_Test:test_WithdrawableAmountOf_StatusDepleted() (gas: 288930) -WithdrawableAmountOf_LockupLinear_Integration_Concrete_Test:test_WithdrawableAmountOf_StatusPending() (gas: 258727) -WithdrawableAmountOf_LockupLinear_Integration_Concrete_Test:test_WithdrawableAmountOf_StatusSettled() (gas: 265080) -WithdrawableAmountOf_LockupLinear_Integration_Concrete_Test:test_WithdrawableAmountOf_StreamHasBeenCanceled_StatusCanceled() (gas: 299746) -WithdrawableAmountOf_LockupLinear_Integration_Concrete_Test:test_WithdrawableAmountOf_StreamHasBeenCanceled_StatusDepleted() (gas: 321987) -WithdrawableAmountOf_LockupLinear_Integration_Concrete_Test:test_WithdrawableAmountOf_WithWithdrawals() (gas: 287308) -WithdrawableAmountOf_LockupLinear_Integration_Fuzz_Test:testFuzz_WithdrawableAmountOf(uint40,uint128,uint128) (runs: 50, μ: 464049, ~: 463390) -WithdrawableAmountOf_LockupLinear_Integration_Fuzz_Test:testFuzz_WithdrawableAmountOf_CliffTimeInTheFuture(uint40) (runs: 50, μ: 263747, ~: 263996) -WithdrawableAmountOf_LockupLinear_Integration_Fuzz_Test:testFuzz_WithdrawableAmountOf_NoPreviousWithdrawals(uint40,uint128) (runs: 50, μ: 440270, ~: 441039) \ No newline at end of file +WithdrawableAmountOf_LockupLinear_Integration_Concrete_Test:test_WithdrawableAmountOf_CliffTimeInTheFuture() (gas: 253622) +WithdrawableAmountOf_LockupLinear_Integration_Concrete_Test:test_WithdrawableAmountOf_NoPreviousWithdrawals() (gas: 263493) +WithdrawableAmountOf_LockupLinear_Integration_Concrete_Test:test_WithdrawableAmountOf_StatusDepleted() (gas: 288666) +WithdrawableAmountOf_LockupLinear_Integration_Concrete_Test:test_WithdrawableAmountOf_StatusPending() (gas: 258694) +WithdrawableAmountOf_LockupLinear_Integration_Concrete_Test:test_WithdrawableAmountOf_StatusSettled() (gas: 265047) +WithdrawableAmountOf_LockupLinear_Integration_Concrete_Test:test_WithdrawableAmountOf_StreamHasBeenCanceled_StatusCanceled() (gas: 300014) +WithdrawableAmountOf_LockupLinear_Integration_Concrete_Test:test_WithdrawableAmountOf_StreamHasBeenCanceled_StatusDepleted() (gas: 322024) +WithdrawableAmountOf_LockupLinear_Integration_Concrete_Test:test_WithdrawableAmountOf_WithWithdrawals() (gas: 287044) +WithdrawableAmountOf_LockupLinear_Integration_Fuzz_Test:testFuzz_WithdrawableAmountOf(uint40,uint128,uint128) (runs: 50, μ: 464066, ~: 464719) +WithdrawableAmountOf_LockupLinear_Integration_Fuzz_Test:testFuzz_WithdrawableAmountOf_CliffTimeInTheFuture(uint40) (runs: 50, μ: 263687, ~: 263963) +WithdrawableAmountOf_LockupLinear_Integration_Fuzz_Test:testFuzz_WithdrawableAmountOf_NoPreviousWithdrawals(uint40,uint128) (runs: 50, μ: 439908, ~: 438806) \ No newline at end of file From 4348b0595b0a2522fa13e6031c49f8e56e2e2675 Mon Sep 17 00:00:00 2001 From: Paul Razvan Berg Date: Wed, 29 Nov 2023 12:33:36 +0200 Subject: [PATCH 40/47] docs: update description and keywords --- README.md | 12 ++++++------ package.json | 9 +++++++-- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index edab54032..3fcc3eda0 100644 --- a/README.md +++ b/README.md @@ -16,13 +16,13 @@ In-depth documentation is available at [docs.sablier.com](https://docs.sablier.c ## Background -Sablier is a token streaming protocol that enables by-the-second payments in web3. DAOs and businesses use it for -vesting, payroll, airdrops, and more. +Sablier V2 is a token distribution protocol used by DAOs and businesses for vesting, payroll, airdrops, and more. The +linear stream is our flagship payment model, which distributes assets on a continuous, by-the-second basis. -The sender of a payment stream first deposits a specific amount of ERC-20 tokens in a contract. Then, the contract -progressively allocates the funds to the recipient, who can access them as they become available over time. The payment -rate is influenced by various factors, including the start and end times, as well as the total amount of tokens -deposited. +The way it works is that the sender of a payment stream first deposits a specific amount of ERC-20 tokens in a contract. +Then, the contract progressively allocates the funds to the recipient, who can access them as they become available over +time. The payment rate is influenced by various factors, including the start and end times, as well as the total amount +of tokens deposited. ## Install diff --git a/package.json b/package.json index f341ca143..1c2791f0c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@sablier/v2-core", - "description": "Core smart contracts of the Sablier V2 token streaming protocol", + "description": "Core smart contracts of the Sablier V2 token distribution protocol", "license": "BUSL-1.1", "version": "1.1.0", "author": { @@ -26,6 +26,7 @@ ], "homepage": "https://github.com/sablier-labs/v2-core#readme", "keywords": [ + "asset-distribution", "asset-streaming", "blockchain", "cryptoasset-streaming", @@ -38,7 +39,11 @@ "sablier-v2", "smart-contracts", "solidity", - "token-streaming" + "token-distribution", + "token-streaming", + "token-vesting", + "vesting", + "web3" ], "peerDependencies": { "@prb/math": "4.0.1" From 02c87748f495b31590638d768c32a76efa188eae Mon Sep 17 00:00:00 2001 From: andreivladbrg Date: Tue, 5 Dec 2023 00:10:58 +0200 Subject: [PATCH 41/47] perf: remove reduntant modifier in withdrawMaxAndTransfer test: update Precompiles bytecode --- src/abstracts/SablierV2Lockup.sol | 1 - test/utils/Precompiles.sol | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/abstracts/SablierV2Lockup.sol b/src/abstracts/SablierV2Lockup.sol index a99f99a9c..a3a323f3e 100644 --- a/src/abstracts/SablierV2Lockup.sol +++ b/src/abstracts/SablierV2Lockup.sol @@ -307,7 +307,6 @@ abstract contract SablierV2Lockup is override noDelegateCall notNull(streamId) - updateMetadata(streamId) { // Checks: the caller is the current recipient. This also checks that the NFT was not burned. address currentRecipient = _ownerOf(streamId); diff --git a/test/utils/Precompiles.sol b/test/utils/Precompiles.sol index dbfbccdff..8fb7deb4c 100644 --- a/test/utils/Precompiles.sol +++ b/test/utils/Precompiles.sol @@ -27,9 +27,9 @@ contract Precompiles { bytes public constant BYTECODE_COMPTROLLER = hex"60803461009857601f6104a638819003918201601f19168301916001600160401b0383118484101761009d5780849260209460405283398101031261009857516001600160a01b0381169081900361009857600080546001600160a01b0319168217815560405191907fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a36103f290816100b48239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe608060408181526004918236101561001657600080fd5b600092833560e01c9182634d81e51d1461039d5750816375829def146102e5578163907a267b14610253578163b5b3ca2c146101ab578163cb01e30e146100f957508063dcf844a7146100c3578063e07df5b4146100a55763f851a4401461007d57600080fd5b346100a157816003193601126100a1576001600160a01b0360209254169051908152f35b5080fd5b50346100a157816003193601126100a1576020906001549051908152f35b50346100a15760203660031901126100a157806020926001600160a01b036100e96103d7565b1681526003845220549051908152f35b9050346101a75760203660031901126101a7576101146103d7565b6001600160a01b03918285541633810361017a575050169081835260026020528083209081549160ff8316159260ff84169060ff1916179055519081527f8cd3a7bc46b26a3b0c07a05a47af78abcaa647626f631d92ea64f8867b23bbec60203392a380f35b84516331b339a960e21b81526001600160a01b039091169181019182523360208301529081906040010390fd5b8280fd5b9050346101a757816003193601126101a7576101c56103d7565b90602435916001600160a01b039182865416338103610226575050907f371789a3d97098f3070492613273a065a7e8a19e009fd1ae92a4b4d4c71ed62d9116928385526003602052808520928084549455815193845260208401523392a380f35b85516331b339a960e21b81526001600160a01b039091169181019182523360208301529081906040010390fd5b919050346101a75760203660031901126101a7578135916001600160a01b038454163381036102b85750507fc059ba3e07a1c4d1fa8845bdb2af2dd85e844684e0a59e6073499e4338788465906001549280600155815193845260208401523392a280f35b82516331b339a960e21b81526001600160a01b039091169181019182523360208301529081906040010390fd5b919050346101a75760203660031901126101a7578135916001600160a01b03918284168094036103995784549283169033820361036d575050507fffffffffffffffffffffffff00000000000000000000000000000000000000001681178255337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808380a380f35b516331b339a960e21b81526001600160a01b039091169181019182523360208301529081906040010390fd5b8480fd5b849084346101a75760203660031901126101a75760ff906020936001600160a01b036103c76103d7565b1681526002855220541615158152f35b600435906001600160a01b03821682036103ed57565b600080fd"; bytes public constant BYTECODE_LOCKUP_DYNAMIC = - hex"60c0346200046e57601f62005cde38819003918201601f19168301916001600160401b038311848410176200032b578084926080946040528339810103126200046e5780516001600160a01b038082169290918390036200046e5760208101518281168091036200046e5760408201519183831683036200046e5760600151936200008962000473565b90601d82527f5361626c696572205632204c6f636b75702044796e616d6963204e46540000006020830152620000be62000473565b601181527029a0a116ab1916a627a1a5aaa816a22ca760791b602082015230608052600080546001600160a01b03199081168417825560018054909116909517909455927fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a38051906001600160401b0382116200032b5760035490600182811c9216801562000463575b60208310146200044d5781601f849311620003d8575b50602090601f83116001146200034d5760009262000341575b50508160011b916000199060031b1c1916176003555b80516001600160401b0381116200032b576004918254600181811c9116801562000320575b60208210146200030b579081601f849311620002b3575b50602090601f831160011462000248576000926200023c575b50508160011b916000199060031b1c19161790555b1660018060a01b0319600a541617600a5560a052600160095560405161584a9081620004948239608051816152d3015260a05181818161126b01526148330152f35b015190503880620001e5565b6000858152602081209350601f198516905b8181106200029a575090846001959493921062000280575b505050811b019055620001fa565b015160001960f88460031b161c1916905538808062000272565b929360206001819287860151815501950193016200025a565b909150836000526020600020601f840160051c8101916020851062000300575b90601f859493920160051c01905b818110620002f05750620001cc565b60008155849350600101620002e1565b9091508190620002d3565b602284634e487b7160e01b6000525260246000fd5b90607f1690620001b5565b634e487b7160e01b600052604160045260246000fd5b0151905038806200017a565b600360009081527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b9350601f198516905b818110620003bf5750908460019594939210620003a5575b505050811b0160035562000190565b015160001960f88460031b161c1916905538808062000396565b929360206001819287860151815501950193016200037e565b60036000529091507fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f840160051c8101916020851062000442575b90601f859493920160051c01905b81811062000432575062000161565b6000815584935060010162000423565b909150819062000415565b634e487b7160e01b600052602260045260246000fd5b91607f16916200014b565b600080fd5b60408051919082016001600160401b038111838210176200032b5760405256fe608080604052600436101561001357600080fd5b60003560e01c90816301ffc9a7146129375750806306fdde0314612874578063081812fc14612856578063095ea7b3146126c25780631400ecec1461261d57806316844456146123a25780631c1cdd4c1461233c5780631e99d5691461231e57806323b872dd146122f557806339a73c03146122b257806340e58ee514612079578063425d30dd1461205b57806342842e0e1461200b57806342966c6814611e8d5780634857501f14611e175780634869e12d14611ddb5780635fe3b56714611db45780636352211e14611d855780636d0cee7514611d2d57806370a0823114611c8357806375829def14611bf15780637cad6cd114611b1f5780637de6b1db1461194a5780638659c2701461164d578063894e9a0d146113e05780638bad38dd146113645780638f69b993146112e15780639067b6771461128e5780639188ec841461125357806395d89b4114611145578063a22cb46514611074578063a2ffb89714610f7b578063a6202bf214610e7b578063a80fc07114610e26578063ad35efd414610dc3578063b256456914610da5578063b637b86514610d45578063b88d4fde14610cba578063b8a3be6614610c83578063b971302a14610c31578063bc063e1a14610c0e578063bc2be1be14610bbb578063c156a11d14610acd578063c33cd35e146109b8578063c87b56dd14610885578063cc364f48146107eb578063d4dbd20b14610796578063d511609f14610747578063d975dfed146106fa578063e985e9c5146106a3578063ea5ead1914610652578063eac8f5b8146105e6578063f590c176146105be578063f851a440146105975763fdd46d601461027c57600080fd5b3461048057606036600319011261048057600435610298612a64565b604435916001600160801b039182841693848103610480576102b86152c9565b6102c183613352565b61057f576102e583600052600b6020526001600160a01b0360406000205416331490565b9182158061056f575b6105505783600052602094600586526001600160a01b039081604060002054169480610544575b61051e5781831693841561050d5788156104f5576103328761538b565b8281168a116104c1575091889161038e6103626103cb958a600052600b8c5260026040600020015460801c61565a565b89600052600b8b52600260406000200190836001600160801b031983549260801b1691161781556132e7565b906103aa818b8401511692826040818351169201511690613389565b16111561048f575b86600052600b8852600160406000200154169283615325565b81847f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d876040518a8152a48133141580610485575b61041f575b60008051602061581e8339815191528484604051908152a1005b813b156104805760008051602061581e8339815191529460846000928360405195869485936313375c3b60e01b8552896004860152336024860152604485015260648401525af1610471575b80610405565b61047a90612bd7565b3861046b565b600080fd5b50813b1515610400565b86600052600b8852604060002060018101600160a01b60ff60a01b1982541617905560ff60f01b1981541690556103b2565b60405163287ecaef60e21b8152600481018990526001600160801b03928316602482015291166044820152606490fd5b0390fd5b6024876040519063d2aabcd960e01b82526004820152fd5b600460405163630d074f60e11b8152fd5b606486838560405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b50848284161415610315565b60405163216caf0d60e01b815260048101859052336024820152604490fd5b5061057984615675565b156102ee565b60248360405190634a5541ef60e01b82526004820152fd5b346104805760003660031901126104805760206001600160a01b0360005416604051908152f35b346104805760203660031901126104805760206105dc6004356133a2565b6040519015158152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260206001600160a01b0360016040600020015416604051908152f35b6024906040519062b8e7e760e51b82526004820152fd5b346104805760403660031901126104805760008051602061581e833981519152602060043561069a610682612a64565b61068b8361538b565b906106946152c9565b836153c3565b604051908152a1005b34610480576040366003190112610480576106bc612a4e565b6106c4612a64565b906001600160a01b03809116600052600860205260406000209116600052602052602060ff604060002054166040519015158152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b5761073660209161538b565b6001600160801b0360405191168152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b602052602060026040600020015460801c604051908152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260206001600160801b0360036040600020015416604051908152f35b34610480576020366003190112610480576004356000602060405161080f81612b9e565b828152015280600052600b60205260ff60016040600020015460a81c161561063b57600052600b6020526040806000205464ffffffffff82519161085283612b9e565b818160a01c16835260c81c166020820152610883825180926020908164ffffffffff91828151168552015116910152565bf35b346104805760208060031936011261048057600435906108c36108be8360005260056020526001600160a01b0360406000205416151590565b612c3d565b60006001600160a01b03600a5416926044604051809581937fe9dc637500000000000000000000000000000000000000000000000000000000835230600484015260248301525afa9182156109ac57600092610933575b5061092f604051928284938452830190612a29565b0390f35b9091503d806000833e6109468183612beb565b81019082818303126104805780519067ffffffffffffffff8211610480570181601f8201121561048057805161097b81612c0d565b926109896040519485612beb565b818452848284010111610480576109a591848085019101612a06565b908261091a565b6040513d6000823e3d90fd5b3461048057600319602036820112610480576004359067ffffffffffffffff9081831161048057610140908336030112610480576109f46152c9565b60405191610a0183612b81565b610a0d81600401612a7a565b8352610a1b602482016133d3565b6020840152610a2c60448201612b58565b6040840152610a3d60648201612b58565b6060840152610a4e60848201612a7a565b6080840152610a5f60a48201612c29565b60a0840152610a7060c48201612a7a565b60c0840152610a823660e483016134b9565b60e084015261012481013591821161048057013660238201121561048057602091610aba610ac59236906024600482013591016133e5565b610100820152614785565b604051908152f35b3461048057604036600319011261048057600435610ae9612a64565b610af16152c9565b81600052600b60205260ff60016040600020015460a81c1615610ba4578160005260056020526001600160a01b0360406000205416803303610b85579161069a8160209360008051602061581e83398151915295610b4e8361538b565b6001600160801b038116610b63575b50612ed0565b610b7690610b6f6152c9565b82856153c3565b8686604051858152a187610b5d565b60405163216caf0d60e01b815260048101849052336024820152604490fd5b6024826040519062b8e7e760e51b82526004820152fd5b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b602052602064ffffffffff60406000205460a01c16604051908152f35b3461048057600036600319011261048057602060405167016345785d8a00008152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260206001600160a01b0360406000205416604051908152f35b3461048057602036600319011261048057600435600052600b602052602060ff60016040600020015460a81c166040519015158152f35b3461048057608036600319011261048057610cd3612a4e565b610cdb612a64565b6064359167ffffffffffffffff8311610480573660238401121561048057826004013591610d0883612c0d565b92610d166040519485612beb565b8084523660248287010111610480576020816000926024610d439801838801378501015260443591612d5b565b005b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205261092f610d91600460406000200161323a565b604051918291602083526020830190612af4565b346104805760203660031901126104805760206105dc60043561331b565b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57610dfd90614689565b6040516005821015610e10576020918152f35b634e487b7160e01b600052602160045260246000fd5b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260206001600160801b0360026040600020015416604051908152f35b3461048057602036600319011261048057610e94612a4e565b6001600160a01b038060005416338103610f5257508116908160005260026020526001600160801b0360406000205416908115610f215781610ef39184600052600260205260406000206001600160801b031981541690553390615325565b6040519081527fca7a4a65a94ed2f37538814e00e1cd4c41a78261561e3f3794592f11409cf5af60203392a3005b602483604051907f8410168c0000000000000000000000000000000000000000000000000000000082526004820152fd5b6040516331b339a960e21b81526001600160a01b03919091166004820152336024820152604490fd5b346104805760603660031901126104805767ffffffffffffffff60043581811161048057610fad903690600401612ac3565b610fb5612a64565b9260443590811161048057610fce903690600401612ac3565b9190610fd86152c9565b82820361103d5760005b828110610feb57005b8060008051602061581e833981519152602061100a600194878a6153b3565b3561103061102161101c868b8a6153b3565b6134a5565b6110296152c9565b8b836153c3565b604051908152a101610fe2565b50604491604051917faec9344000000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b346104805760403660031901126104805761108d612a4e565b60243590811515809203610480576001600160a01b03169081331461110157336000526008602052604060002082600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a3005b606460405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152fd5b3461048057600036600319011261048057604051600060045490600182811c91818416918215611249575b60209485851084146112335785879486865291826000146112135750506001146111b6575b506111a292500383612beb565b61092f604051928284938452830190612a29565b84915060046000527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b906000915b8583106111fb5750506111a2935082010185611195565b805483890185015287945086939092019181016111e4565b60ff1916858201526111a295151560051b85010192508791506111959050565b634e487b7160e01b600052602260045260246000fd5b92607f1692611170565b346104805760003660031901126104805760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b602052602064ffffffffff60406000205460c81c16604051908152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b5761131b90614689565b600581101580610e105760028214908115611357575b8115611345575b6020826040519015158152f35b9050610e105760046020911482611338565b5050600381146000611331565b34610480576020366003190112610480576004356001600160a01b0390818116809103610480578160005416338103610f52575060015491816001600160a01b03198416176001556040519216825260208201527fdcb09aef4bf01068924ccce937981cbe59d25ba08380cf941aaaea4e4bd3960d60403392a2005b3461048057602036600319011261048057606061014060405161140281612bba565b60008152600060208201526000604082015260008382015260006080820152600060a0820152600060c0820152600060e082015260006101008201526114466132c8565b6101208201520152600435600052600b60205260ff60016040600020015460a81c161561163557600435600052600b602052604060002061152960046040519261148f84612bba565b80546001600160a01b038116855264ffffffffff8160a01c16602086015264ffffffffff8160c81c16604086015260ff8160f01c161515606086015260f81c1515608085015260ff60018201546001600160a01b03811660a0870152818160a01c16151560c0870152818160a81c16151560e087015260b01c16151561010085015261151d600282016132e7565b6101208501520161323a565b61014082015261153a600435614689565b906005821015610e105760026101409214611629575b61092f604051928392602084526001600160a01b03815116602085015264ffffffffff602082015116604085015264ffffffffff60408201511660608501526060810151151560808501526080810151151560a08501526001600160a01b0360a08201511660c085015260c0810151151560e085015260e08101511515610100850152610100810151151561012085015261161561012082015183860190604090816001600160801b0391828151168552826020820151166020860152015116910152565b01516101a0808401526101c0830190612af4565b60006060820152611550565b602460405162b8e7e760e51b81526004356004820152fd5b34610480576020806003193601126104805760043567ffffffffffffffff81116104805761167f903690600401612ac3565b906116886152c9565b6000915b80831061169557005b6116a08382846153b3565b35926116aa6152c9565b6116b384613352565b156116d05760248460405190634a5541ef60e01b82526004820152fd5b6116dc849293946133a2565b6119325761170082600052600b6020526001600160a01b0360406000205416331490565b156119135761170e826134e8565b82600052600b80875261172760026040600020016132e7565b906001600160801b03928383511684821610156118fb578560005281895260ff60406000205460f01c16156118e3579061179582858b61178b7f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa509683895116613389565b9601511690613389565b9580600052818a526040600020938a855498600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8b1617875560038882169788156118c9575b0197831697886001600160801b03198254161790556001600160a01b03809a16958691600584528b604060002054169687945260019b8c6040600020015416946118288b8588615325565b604080518881526001600160801b0392831660208201529290911690820152606090a460008051602061581e8339815191528a604051838152a1813b611876575b505050505001919061168c565b813b15610480576000608492819560405197889687956372eba20360e01b875260048701526024860152604485015260648401525af16118ba575b80808080611869565b6118c390612bd7565b856118b1565b60018101600160a01b60ff60a01b198254161790556117dd565b602486604051906339c6dc7360e21b82526004820152fd5b602486604051906322cad1af60e11b82526004820152fd5b60405163216caf0d60e01b815260048101839052336024820152604490fd5b6024826040519063fe19f19f60e01b82526004820152fd5b346104805760208060031936011261048057600435906119686152c9565b81600052600b815260ff60016040600020015460a81c1615610ba45761198d82614689565b6005811015610e1057600481036119b65760248360405190634a5541ef60e01b82526004820152fd5b600381036119d6576024836040519063fe19f19f60e01b82526004820152fd5b600214611b07576119fd82600052600b6020526001600160a01b0360406000205416331490565b156119135781600052600b815260ff60406000205460f01c1615611aef5781600052600b8152604060002060ff60f01b19815416905560405191807f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f600080a2600582526001600160a01b036040600020541692833b611a92575b60008051602061581e8339815191528383604051908152a1005b833b15610480576000816024818360008051602061581e833981519152987f341a0bd90000000000000000000000000000000000000000000000000000000083528760048401525af115611a7857611ae990612bd7565b83611a78565b602482604051906339c6dc7360e21b82526004820152fd5b602482604051906322cad1af60e11b82526004820152fd5b34610480576020366003190112610480576004356001600160a01b0390818116809103610480578160005416338103610f525750600a5491816001600160a01b0319841617600a556040519216825260208201527fa2548bd4b805e907c1558a47b5858324fe8bb4a2e1ddfca647eecbf65610eebc60403392a26009546000198101908111611bdb5760407f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c91815190600182526020820152a1005b634e487b7160e01b600052601160045260246000fd5b3461048057602036600319011261048057611c0a612a4e565b6000546001600160a01b0380821692338403611c5c576001600160a01b03199350169182911617600055337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf80600080a3005b6040516331b339a960e21b81526001600160a01b0385166004820152336024820152604490fd5b34610480576020366003190112610480576001600160a01b03611ca4612a4e565b168015611cc35760005260066020526020604060002054604051908152f35b608460405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e657200000000000000000000000000000000000000000000006064820152fd5b3461048057602036600319011261048057600435611d646108be8260005260056020526001600160a01b0360406000205416151590565b600052600560205260206001600160a01b0360406000205416604051908152f35b34610480576020366003190112610480576020611da3600435612c88565b6001600160a01b0360405191168152f35b346104805760003660031901126104805760206001600160a01b0360015416604051908152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b5761073660209161470a565b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b576000611e5382614689565b6005811015610e1057600203611e71575b6020906040519015158152f35b50600052600b602052602060ff60406000205460f01c16611e64565b3461048057602036600319011261048057600435611ea96152c9565b611eb281613352565b15611fda57611ec081615675565b15611fba57611ece81612c88565b611ed78261331b565b159081611fb1575b81611f9e575b50611f8657602081611f0560008051602061581e83398151915293612c88565b9080600052600783526001600160a01b036040600020926001600160a01b031993848154169055169182600052600684526040600020600019815401905581600052600584526040600020908154169055806000604051937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a48152a1005b60249060405190630da9b01360e01b82526004820152fd5b6001600160a01b03915016151582611ee5565b60009150611edf565b60405163216caf0d60e01b81526004810191909152336024820152604490fd5b602490604051907f817cd6390000000000000000000000000000000000000000000000000000000082526004820152fd5b346104805761201936612a8e565b60405191602083019383851067ffffffffffffffff86111761204557610d439460405260008452612d5b565b634e487b7160e01b600052604160045260246000fd5b346104805760203660031901126104805760206105dc600435613352565b346104805760208060031936011261048057600435906120976152c9565b6120a082613352565b156120bd5760248260405190634a5541ef60e01b82526004820152fd5b6120c6826133a2565b611932576120ea82600052600b6020526001600160a01b0360406000205416331490565b15611913576120f8826134e8565b9180600052600b825261211160026040600020016132e7565b906001600160801b0393848351168582161015611b075781600052600b845260ff60406000205460f01c1615611aef5780858561215461215e9483885116613389565b9501511690613389565b9080600052600b845260008051602061581e833981519152604060002094855494600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff87161787556003888616978815612298575b0197811697886001600160801b03198254161790556001600160a01b038096169560058352867f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa508260406000205416978893600b875260016040600020015416946122218d8588615325565b604080518a81526001600160801b0392831660208201529290911690820152606090a4604051838152a1813b61225357005b813b15610480576000608492819560405197889687956372eba20360e01b875260048701526024860152604485015260648401525af161228f57005b610d4390612bd7565b60018101600160a01b60ff60a01b198254161790556121b5565b34610480576020366003190112610480576001600160a01b036122d3612a4e565b16600052600260205260206001600160801b0360406000205416604051908152f35b3461048057610d4361230636612a8e565b916123196123148433612df1565b612cea565b612ed0565b34610480576000366003190112610480576020600954604051908152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b5761237690614689565b6005811015610e10578060209115908115612397575b506040519015158152f35b60019150148261238c565b346104805760206003198181360112610480576004359067ffffffffffffffff908183116104805761012083360391820112610480576123e06152c9565b61010483013590602219018112156104805782016004810135908282116104805760240160608202360381136104805761241b9136916133e5565b9182519061242882613222565b916124366040519384612beb565b808352601f1961244582613222565b018660005b8281106126075750505064ffffffffff90814216946001600160801b03968761247282613553565b515116828a61248084613553565b510151168580604061249186613553565b510151168a011690604051926124a684612b65565b83528b83015260408201526124ba87613553565b526124c486613553565b5060019386855b8a8c87831061258657908b846001600160a01b038c60a48101358281169081900361048057610ac595612546956125769461250860248601613484565b61251460448701613484565b61252060648801613491565b9161252d88600401613491565b948461253b60848b016134a5565b966040519d8e612b81565b168c528d8c0152151560408b0152151560608a01521660808801521660a086015260c085015260c43691016134b9565b60e0830152610100820152614785565b8893858060406125ba8b866125aa8a8e9a6125a1828d613576565b5151169a613576565b5101511694600019890190613576565b510151168160406125cb888c613576565b51015116011691604051936125df85612b65565b845283015260408201526125f3828b613576565b526125fe818a613576565b500187906124cb565b61260f6132c8565b82828801015201879061244a565b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b5760209060009080600052600b8352604060002060ff815460f01c16806126b0575b612687575b50506001600160801b0360405191168152f35b6126a992506001600160801b0360026126a392015416916134e8565b90613389565b8280612674565b5060ff600182015460a01c161561266f565b34610480576040366003190112610480576126db612a4e565b602435906001600160a01b0380806126f285612c88565b169216918083146127ec578033149081156127c7575b501561275d578260005260076020526040600020826001600160a01b031982541617905561273583612c88565b167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b608460405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152fd5b9050600052600860205260406000203360005260205260ff6040600020541684612708565b608460405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152fd5b34610480576020366003190112610480576020611da3600435612cad565b3461048057600036600319011261048057604051600060035490600182811c9181841691821561292d575b60209485851084146112335785879486865291826000146112135750506001146128d057506111a292500383612beb565b84915060036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b906000915b8583106129155750506111a2935082010185611195565b805483890185015287945086939092019181016128fe565b92607f169261289f565b3461048057602036600319011261048057600435907fffffffff00000000000000000000000000000000000000000000000000000000821680920361048057817f80ac58cd00000000000000000000000000000000000000000000000000000000602093149081156129dc575b81156129b2575b5015158152f35b7f01ffc9a700000000000000000000000000000000000000000000000000000000915014836129ab565b7f5b5e139f00000000000000000000000000000000000000000000000000000000811491506129a4565b60005b838110612a195750506000910152565b8181015183820152602001612a09565b90602091612a4281518092818552858086019101612a06565b601f01601f1916010190565b600435906001600160a01b038216820361048057565b602435906001600160a01b038216820361048057565b35906001600160a01b038216820361048057565b6060906003190112610480576001600160a01b0390600435828116810361048057916024359081168103610480579060443590565b9181601f840112156104805782359167ffffffffffffffff8311610480576020808501948460051b01011161048057565b90815180825260208080930193019160005b828110612b14575050505090565b835180516001600160801b031686528083015167ffffffffffffffff168684015260409081015164ffffffffff169086015260609094019392810192600101612b06565b3590811515820361048057565b6060810190811067ffffffffffffffff82111761204557604052565b610120810190811067ffffffffffffffff82111761204557604052565b6040810190811067ffffffffffffffff82111761204557604052565b610160810190811067ffffffffffffffff82111761204557604052565b67ffffffffffffffff811161204557604052565b90601f8019910116810190811067ffffffffffffffff82111761204557604052565b67ffffffffffffffff811161204557601f01601f191660200190565b35906001600160801b038216820361048057565b15612c4457565b606460405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152fd5b60005260056020526001600160a01b0360406000205416612caa811515612c3d565b90565b612cd06108be8260005260056020526001600160a01b0360406000205416151590565b60005260076020526001600160a01b036040600020541690565b15612cf157565b608460405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f766564000000000000000000000000000000000000006064820152fd5b90612d7f939291612d6f6123148433612df1565b612d7a838383612ed0565b613089565b15612d8657565b60405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b906001600160a01b038080612e0584612c88565b16931691838314938415612e38575b508315612e22575b50505090565b612e2e91929350612cad565b1614388080612e1c565b909350600052600860205260406000208260005260205260ff604060002054169238612e14565b15612e6657565b608460405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152fd5b90612ef99291612edf83612c88565b916001600160a01b03948593848094169687911614612e5f565b1690811580612ff057612f0b8461331b565b159081612fe7575b5080612fde575b612fc65791808492612f4860008051602061581e83398151915296602096612f4185612c88565b1614612e5f565b60009382855260078652604085206001600160a01b031990818154169055818652600687526040862060001981540190558286526040862060018154019055838652600587528260408720918254161790557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6040519580a48152a1565b60248360405190630da9b01360e01b82526004820152fd5b50831515612f1a565b90501538612f13565b608460405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152fd5b3d15613084573d9061306a82612c0d565b916130786040519384612beb565b82523d6000602084013e565b606090565b9290803b15613219576130f3916020916001600160a01b0394604051809581948293897f150b7a02000000000000000000000000000000000000000000000000000000009b8c86523360048701521660248501526044840152608060648401526084830190612a29565b03916000968791165af1908290826131b2575b505061318c57613114613059565b805190816131875760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000161490565b909192506020813d8211613211575b816131ce60209383612beb565b8101031261320d5751907fffffffff000000000000000000000000000000000000000000000000000000008216820361320a5750903880613106565b80fd5b5080fd5b3d91506131c1565b50505050600190565b67ffffffffffffffff81116120455760051b60200190565b90815461324681613222565b9260409361325685519182612beb565b828152809460208092019260005281600020906000935b85851061327c57505050505050565b6001848192845161328c81612b65565b64ffffffffff87546001600160801b038116835267ffffffffffffffff8160801c168584015260c01c168682015281520193019401939161326d565b604051906132d582612b65565b60006040838281528260208201520152565b906040516132f481612b65565b6040819360018154916001600160801b0392838116865260801c6020860152015416910152565b80600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260ff60016040600020015460b01c1690565b80600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260ff60016040600020015460a01c1690565b6001600160801b039182169082160391908211611bdb57565b80600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260406000205460f81c90565b359064ffffffffff8216820361048057565b9291926133f182613222565b60409461340086519283612beb565b8195848352602080930191606080960285019481861161048057925b85841061342c5750505050505050565b86848303126104805782519061344182612b65565b61344a85612c29565b8252858501359067ffffffffffffffff8216820361048057828792838b9501526134758688016133d3565b8682015281520193019261341c565b3580151581036104805790565b356001600160a01b03811681036104805790565b356001600160801b03811681036104805790565b9190826040910312610480576040516134d181612b9e565b60208082946134df81612a7a565b84520135910152565b64ffffffffff80421682600052600b602052604060002091825482828260a01c1610156135495760c81c16111561353757600401546001101561352e57612caa9061358a565b612caa906145ba565b6001600160801b039150600201541690565b5050505050600090565b8051156135605760200190565b634e487b7160e01b600052603260045260246000fd5b80518210156135605760209160051b010190565b64ffffffffff90814216906000908152600b6020526040908181208251936135b185612bba565b8154956001600160a01b039182881687526020870197828160a01c168952828160c81c168789015260ff8160f01c161515606089015260f81c1515608088015260ff6001938486015490811660a08a0152818160a01c16151560c08a0152818160a81c16151560e08a015260b01c16151561010088015261014061364b600461363c600288016132e7565b966101208b019788520161323a565b970191878352808761365d889a613553565b5101511693828288965b16106137415750916136f16136f6928488816136fb98976001600160801b039e8f6136938b8a51613576565b5151169d8a8f9b60206136b067ffffffffffffffff928d51613576565b510151169984836136c2848451613576565b5101511696508115613735576136e092935051906000190190613576565b5101511680925b03169203166137b5565b613b24565b613987565b92831361371457505061370e8391613779565b16011690565b5160200151929392831692841683101591506137309050575090565b905090565b505050511680926136e7565b8094986001600160801b0390816137598c8851613576565b51511601169801938282808a613770898951613576565b51015116613667565b600081126137845790565b602490604051907f2463f3d50000000000000000000000000000000000000000000000000000000082526004820152fd5b90600160ff1b80831490811561389d575b5061387357600082121561386a576137ef826000035b60008312156138635782600003906138a7565b917f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831161382d5760009160001991181315613829575090565b0390565b604491604051917fd49c26b300000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b82906138a7565b6137ef826137dc565b60046040517f9fe2b450000000000000000000000000000000000000000000000000000000008152fd5b90508114386137c6565b670de0b6b3a7640000916000198383099280830292838086109503948086039514613963578285101561392757908291096001821901821680920460028082600302188083028203028083028203028083028203028083028203028083028203028092029003029360018380600003040190848311900302920304170290565b82606492604051927f63a05778000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b505080925015613971570490565b634e487b7160e01b600052601260045260246000fd5b90600160ff1b808314908115613a6b575b50613a41576000821215613a38576139c1826000035b6000831215613a31578260000390613a75565b917f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83116139fb5760009160001991181315613829575090565b604491604051917f120b5b4300000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b8290613a75565b6139c1826139ae565b60046040517fa6070c25000000000000000000000000000000000000000000000000000000008152fd5b9050811438613998565b90919060001983820983820291828083109203918083039214613b1357670de0b6b3a76400009081831015613adc57947faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066994950990828211900360ee1b910360121c170290565b60449086604051917f5173648d00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050670de0b6b3a764000090049150565b80613b3e5750600090612caa5750670de0b6b3a764000090565b90670de0b6b3a7640000808314613b8b575080613b63575050670de0b6b3a764000090565b670de0b6b3a76400008114613b8757613b82906136f6612caa93614465565b613bab565b5090565b91505090565b8015613971576ec097ce7bc90715b34b9f10000000000590565b6000811215613be05768033dd1780914b97114198112613bda57613bd190600003613bab565b612caa90613b91565b50600090565b680a688906bd8affffff811361443457670de0b6b3a764000080604092831b05907780000000000000000000000000000000000000000000000067ff000000000000008316614317575b66ff000000000000831661420f575b65ff0000000000831661410f575b64ff000000008316614017575b63ff0000008316613f27575b62ff00008316613e3f575b61ff008316613d5f575b60ff8316613c88575b02911c60bf031c90565b60808316613d4d575b838316613d3b575b60208316613d29575b60108316613d17575b60088316613d05575b60048316613cf3575b60028316613ce1575b6001831615613c7e576801000000000000000102831c613c7e565b6801000000000000000102831c613cc6565b6801000000000000000302831c613cbd565b6801000000000000000602831c613cb4565b6801000000000000000b02831c613cab565b6801000000000000001602831c613ca2565b6801000000000000002c02831c613c99565b6801000000000000005902831c613c91565b6180008316613e2d575b6140008316613e1b575b6120008316613e09575b6110008316613df7575b6108008316613de5575b6104008316613dd3575b6102008316613dc1575b610100831615613c7557680100000000000000b102831c613c75565b6801000000000000016302831c613da5565b680100000000000002c602831c613d9b565b6801000000000000058c02831c613d91565b68010000000000000b1702831c613d87565b6801000000000000162e02831c613d7d565b68010000000000002c5d02831c613d73565b680100000000000058b902831c613d69565b628000008316613f15575b624000008316613f03575b622000008316613ef1575b621000008316613edf575b620800008316613ecd575b620400008316613ebb575b620200008316613ea9575b62010000831615613c6b576801000000000000b17202831c613c6b565b680100000000000162e402831c613e8c565b6801000000000002c5c802831c613e81565b68010000000000058b9102831c613e76565b680100000000000b172102831c613e6b565b68010000000000162e4302831c613e60565b680100000000002c5c8602831c613e55565b6801000000000058b90c02831c613e4a565b63800000008316614005575b63400000008316613ff3575b63200000008316613fe1575b63100000008316613fcf575b63080000008316613fbd575b63040000008316613fab575b63020000008316613f99575b6301000000831615613c605768010000000000b1721802831c613c60565b6801000000000162e43002831c613f7b565b68010000000002c5c86002831c613f6f565b680100000000058b90c002831c613f63565b6801000000000b17217f02831c613f57565b680100000000162e42ff02831c613f4b565b6801000000002c5c85fe02831c613f3f565b68010000000058b90bfc02831c613f33565b64800000000083166140fd575b64400000000083166140eb575b64200000000083166140d9575b64100000000083166140c7575b64080000000083166140b5575b64040000000083166140a3575b6402000000008316614091575b640100000000831615613c5457680100000000b17217f802831c613c54565b68010000000162e42ff102831c614072565b680100000002c5c85fe302831c614065565b6801000000058b90bfce02831c614058565b68010000000b17217fbb02831c61404b565b6801000000162e42fff002831c61403e565b68010000002c5c8601cc02831c614031565b680100000058b90c0b4902831c614024565b6580000000000083166141fd575b6540000000000083166141eb575b6520000000000083166141d9575b6510000000000083166141c7575b6508000000000083166141b5575b6504000000000083166141a3575b650200000000008316614191575b65010000000000831615613c47576801000000b17218355102831c613c47565b680100000162e430e5a202831c614171565b6801000002c5c863b73f02831c614163565b68010000058b90cf1e6e02831c614155565b680100000b1721bcfc9a02831c614147565b68010000162e43f4f83102831c614139565b680100002c5c89d5ec6d02831c61412b565b6801000058b91b5bc9ae02831c61411d565b66800000000000008316614305575b664000000000000083166142f3575b662000000000000083166142e1575b661000000000000083166142cf575b660800000000000083166142bd575b660400000000000083166142ab575b66020000000000008316614299575b6601000000000000831615613c395768010000b17255775c0402831c613c39565b6801000162e525ee054702831c614278565b68010002c5cc37da949202831c614269565b680100058ba01fb9f96d02831c61425a565b6801000b175effdc76ba02831c61424b565b680100162f3904051fa102831c61423c565b6801002c605e2e8cec5002831c61422d565b68010058c86da1c09ea202831c61421e565b6780000000000000008316614415575b6740000000000000008316614403575b67200000000000000083166143f1575b67100000000000000083166143df575b67080000000000000083166143cd575b67040000000000000083166143bb575b67020000000000000083166143a9575b670100000000000000831615613c2a57680100b1afa5abcbed6102831c613c2a565b68010163da9fb33356d802831c614387565b680102c9a3e778060ee702831c614377565b6801059b0d31585743ae02831c614367565b68010b5586cf9890f62a02831c614357565b6801172b83c7d517adce02831c614347565b6801306fe0a31b7152df02831c614337565b5077b504f333f9de648480000000000000000000000000000000614327565b602490604051907f0360d0280000000000000000000000000000000000000000000000000000000082526004820152fd5b8060008083131561458957670de0b6b3a76400009283811261455257506001925b808305906001600160801b03821160071b91821c9167ffffffffffffffff831160061b92831c63ffffffff811160051b90811c61ffff811160041b90811c60ff811160031b90811c91600f831160021b92831c936001978860038711811b96871c11961717171717171781810294811d9082821461454657506706f05b59d3b20000905b84821361451a5750505050500290565b808391020590671bc16d674ec80000821215614539575b831d9061450a565b8091950194831d90614531565b93505093925050020290565b6000199392508015614575576ec097ce7bc90715b34b9f10000000000591614486565b602482634e487b7160e01b81526012600452fd5b602483604051907f059b101b0000000000000000000000000000000000000000000000000000000082526004820152fd5b64ffffffffff6145ef600091838352600b60205280806040852054818160a01c1693849160c81c1603169181421603166137b5565b91808252600b602052600460408320018054156146755790829167ffffffffffffffff93526146476020832054828452600b6020526136f66001600160801b03968760026040882001541696879360801c1690613b24565b92831361465d57505061465990613779565b1690565b60029350604092508152600b60205220015460801c90565b602483634e487b7160e01b81526032600452fd5b80600052600b602052604060002060ff600182015460a01c166000146146b0575050600490565b805460f81c614703575460a01c64ffffffffff164210613bda576146d3816134e8565b90600052600b6020526001600160801b0380600260406000200154169116106000146146fe57600190565b600290565b5050600390565b80600052600b60205261472360026040600020016132e7565b81600052600b602052604060002060ff600182015460a01c1660001461475657506001600160801b039150602001511690565b5460f81c6147685750612caa906134e8565b612caa91506001600160801b036040818351169201511690613389565b906001600160a01b036001541660206001600160a01b0360c0850151166024604051809481937fdcf844a700000000000000000000000000000000000000000000000000000000835260048301525afa80156109ac57600090615038575b61480691506001600160801b0360a08501511690602060e08601510151916156de565b6001600160801b0381511661010084015164ffffffffff602086015116821561500e5781518015614fe4577f00000000000000000000000000000000000000000000000000000000000000008111614fb3575064ffffffffff604061486a84613553565b51015116811015614f5c5750600090819082815184905b808210614ec9575050505064ffffffffff421664ffffffffff8216811015614e895750506001600160801b0316808203614e525750506009549283600052600b6020526040600020916001600160801b0381511660028401906001600160801b03198254161790556001600160a01b0360c083015116600184015490750100000000000000000000000000000000000000000060408501511515928654927fffffffffffffffffff0000ff000000000000000000000000000000000000000076ff000000000000000000000000000000000000000000006060890151151560b01b16921617171760018601556001600160a01b0384511691610100850151926040614993855195600019870190613576565b510151927fff000000000000000000000000000000000000000000000000000000000000007eff0000000000000000000000000000000000000000000000000000000000007dffffffffff0000000000000000000000000000000000000000000000000078ffffffffff000000000000000000000000000000000000000060208b015160a01b169660c81b169460f01b16911617171717845560005b818110614d82575050600185016009556001600160a01b0360c08301511660005260026020526001600160801b0380604060002054168160208401511601166001600160a01b0360c0840151166000526040600020906001600160801b03198254161790556001600160a01b036080830151168015614d3e57614ad1614acb8760005260056020526001600160a01b0360406000205416151590565b156151e6565b614ada8661331b565b1580614d35575b80614d2d575b614d1557602060008051602061581e83398151915291614b20614acb8960005260056020526001600160a01b0360406000205416151590565b806000526006825260406000206001815401905587600052600582526040600020816001600160a01b0319825416179055876040519160007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4878152a1614bb06001600160a01b0360c0840151166001600160801b0380845116816020860151160116903090339061506c565b6001600160801b0360408201511680614ce6575b507fef3d668acee46576ad5d407c42ab4d0cde13f3cd70b28f09a0fb9e3bf5bf09cb614ca36001600160a01b03845116926001600160a01b03608086015116946001600160a01b0360c08201511696614cdb614cbb60408401511515928c606086015115156001600160a01b0360e061010089015194549864ffffffffff6040519a614c4f8c612b9e565b818160a01c168c5260c81c1660208b01520151511695604051998a99610160948b523360208c015260408b0190604090816001600160801b0391828151168552826020820151166020860152015116910152565b60a089015260c08801528060e0880152860190612af4565b926101008501906020908164ffffffffff91828151168552015116910152565b6101408301520390a4565b614d0f906001600160a01b0360c0850151166001600160a01b0360e0860151511690339061506c565b38614bc4565b60248660405190630da9b01360e01b82526004820152fd5b506000614ae7565b50801515614ae1565b606460405162461bcd60e51b815260206004820152602060248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152fd5b614d9181610100860151613576565b51906004860154916801000000000000000083101561204557600183018060048901558310156135605760019260048801600052602060002001906001600160801b03815116908254917fffffff00000000000000000000000000000000000000000000000000000000007cffffffffff000000000000000000000000000000000000000000000000604077ffffffffffffffff00000000000000000000000000000000602086015160801b1694015160c01b169316171717905501614a2f565b60449250604051917fd90b7e3900000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b6040517f210aec0e00000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b9193509193614eed906001600160801b03614ee48588613576565b5151169061565a565b9364ffffffffff806040614f018685613576565b51015116941680851115614f1f575060018493019192919092614881565b8385606492604051927f7b0bada8000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b64ffffffffff6040614f6d84613553565b5101516040517fb4c9e52c00000000000000000000000000000000000000000000000000000000815264ffffffffff938416600482015291169091166024820152604490fd5b602490604051907f4757689b0000000000000000000000000000000000000000000000000000000082526004820152fd5b60046040517f3952c64e000000000000000000000000000000000000000000000000000000008152fd5b60046040517f6095d3bc000000000000000000000000000000000000000000000000000000008152fd5b6020823d602011615064575b8161505160209383612beb565b8101031261320a575061480690516147e3565b3d9150615044565b9290604051927f23b872dd0000000000000000000000000000000000000000000000000000000060208501526001600160a01b03809216602485015216604483015260648201526064815260a081019181831067ffffffffffffffff841117612045576150db926040526150dd565b565b6001600160a01b03169061513d6040516150f681612b9e565b6020938482527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564858301526000808587829751910182855af1615137613059565b91615231565b8051918215918483156151c2575b5050509050156151585750565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b91938180945001031261320d5782015190811515820361320a57508038808461514b565b156151ed57565b606460405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152fd5b919290156152925750815115615245575090565b3b1561524e5790565b606460405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b8251909150156152a55750805190602001fd5b6104f19060405191829162461bcd60e51b8352602060048401526024830190612a29565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036152fb57565b60046040517fa1c0d6e5000000000000000000000000000000000000000000000000000000008152fd5b916001600160a01b03604051927fa9059cbb000000000000000000000000000000000000000000000000000000006020850152166024830152604482015260448152608081019181831067ffffffffffffffff841117612045576150db926040526150dd565b612caa906153988161470a565b90600052600b60205260026040600020015460801c90613389565b91908110156135605760051b0190565b906153cd82613352565b615642576153f182600052600b6020526001600160a01b0360406000205416331490565b91821580615632575b611fba576000928184526020600581526001600160a01b03936040918583882054169380615626575b615601578582169586156155f1576001600160801b03808a16998a156155da5761544c8861538b565b8281168c116155ab5750926155008b89946001898e7f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d978f9a6154a26154cb918c8552600b8b526002868620015460801c61565a565b8b8452600b8a5260028585200190836001600160801b031983549260801b1691161781556132e7565b906154e6818a84015116928286818351169201511690613389565b16111561557d575b888152600b8752200154169687615325565b85518b8152a48133141580615573575b61551d575b505050505050565b813b1561556f576084929185915196879586946313375c3b60e01b86526004860152336024860152604485015260648401525af1615560575b8080808080615515565b61556990612bd7565b38615556565b8480fd5b50813b1515615510565b888152600b8752818120838101600160a01b60ff60a01b1982541617905560ff60f01b1981541690556154ee565b865163287ecaef60e21b8152600481018a90526001600160801b03928316602482015291166044820152606490fd5b60248887519063d2aabcd960e01b82526004820152fd5b6004845163630d074f60e11b8152fd5b6064858784865192632dcbf6b960e11b84526004840152336024840152166044820152fd5b50838683161415615423565b5061563c81615675565b156153fa565b60248260405190634a5541ef60e01b82526004820152fd5b9190916001600160801b0380809416911601918211611bdb57565b60009080825260056020526001600160a01b0380604084205416928333149384156156ba575b505082156156a857505090565b9091506156b53392612cad565b161490565b60ff929450906040918152600860205281812033825260205220541691388061569b565b9092916156e96132c8565b936001600160801b03928381169182156157f55767016345785d8a00008082116157be57808511615787575061573385615724819386613a75565b16946020890195865284613a75565b16918461574a60408901948086528287511661565a565b1610156157715761576384918261576c95511690613389565b91511690613389565b168252565b634e487b7160e01b600052600160045260246000fd5b84604491604051917f4fea5c1a00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b60449250604051917f47152d6700000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050505050905060405161580881612b65565b6000815260006020820152600060408201529056fef8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7a164736f6c6343000815000a"; + hex"60c0346200046e57601f62005ca638819003918201601f19168301916001600160401b038311848410176200032b578084926080946040528339810103126200046e5780516001600160a01b038082169290918390036200046e5760208101518281168091036200046e5760408201519183831683036200046e5760600151936200008962000473565b90601d82527f5361626c696572205632204c6f636b75702044796e616d6963204e46540000006020830152620000be62000473565b601181527029a0a116ab1916a627a1a5aaa816a22ca760791b602082015230608052600080546001600160a01b03199081168417825560018054909116909517909455927fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a38051906001600160401b0382116200032b5760035490600182811c9216801562000463575b60208310146200044d5781601f849311620003d8575b50602090601f83116001146200034d5760009262000341575b50508160011b916000199060031b1c1916176003555b80516001600160401b0381116200032b576004918254600181811c9116801562000320575b60208210146200030b579081601f849311620002b3575b50602090601f831160011462000248576000926200023c575b50508160011b916000199060031b1c19161790555b1660018060a01b0319600a541617600a5560a052600160095560405161581290816200049482396080518161526e015260a05181818161120e01526147ce0152f35b015190503880620001e5565b6000858152602081209350601f198516905b8181106200029a575090846001959493921062000280575b505050811b019055620001fa565b015160001960f88460031b161c1916905538808062000272565b929360206001819287860151815501950193016200025a565b909150836000526020600020601f840160051c8101916020851062000300575b90601f859493920160051c01905b818110620002f05750620001cc565b60008155849350600101620002e1565b9091508190620002d3565b602284634e487b7160e01b6000525260246000fd5b90607f1690620001b5565b634e487b7160e01b600052604160045260246000fd5b0151905038806200017a565b600360009081527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b9350601f198516905b818110620003bf5750908460019594939210620003a5575b505050811b0160035562000190565b015160001960f88460031b161c1916905538808062000396565b929360206001819287860151815501950193016200037e565b60036000529091507fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f840160051c8101916020851062000442575b90601f859493920160051c01905b81811062000432575062000161565b6000815584935060010162000423565b909150819062000415565b634e487b7160e01b600052602260045260246000fd5b91607f16916200014b565b600080fd5b60408051919082016001600160401b038111838210176200032b5760405256fe608080604052600436101561001357600080fd5b60003560e01c90816301ffc9a7146128d25750806306fdde031461280f578063081812fc146127f1578063095ea7b31461265d5780631400ecec146125b8578063168444561461233d5780631c1cdd4c146122d75780631e99d569146122b957806323b872dd1461229057806339a73c031461224d57806340e58ee514612014578063425d30dd14611ff657806342842e0e14611fa657806342966c6814611e285780634857501f14611db25780634869e12d14611d765780635fe3b56714611d4f5780636352211e14611d205780636d0cee7514611cc857806370a0823114611c1e57806375829def14611b8c5780637cad6cd114611aba5780637de6b1db146118ce5780638659c270146115f0578063894e9a0d146113835780638bad38dd146113075780638f69b993146112845780639067b677146112315780639188ec84146111f657806395d89b41146110e8578063a22cb46514611017578063a2ffb89714610f1e578063a6202bf214610e1e578063a80fc07114610dc9578063ad35efd414610d66578063b256456914610d48578063b637b86514610ce8578063b88d4fde14610c5f578063b8a3be6614610c28578063b971302a14610bd6578063bc063e1a14610bb3578063bc2be1be14610b60578063c156a11d14610aac578063c33cd35e14610997578063c87b56dd14610864578063cc364f48146107ca578063d4dbd20b14610775578063d511609f14610726578063d975dfed146106d9578063e985e9c514610682578063ea5ead1914610652578063eac8f5b8146105e6578063f590c176146105be578063f851a440146105975763fdd46d601461027c57600080fd5b34610480576060366003190112610480576004356102986129ff565b604435916001600160801b039182841693848103610480576102b8615264565b6102c1836132ed565b61057f576102e583600052600b6020526001600160a01b0360406000205416331490565b9182158061056f575b6105505783600052602094600586526001600160a01b039081604060002054169480610544575b61051e5781831693841561050d5788156104f55761033287615326565b8281168a116104c1575091889161038e6103626103cb958a600052600b8c5260026040600020015460801c615622565b89600052600b8b52600260406000200190836001600160801b031983549260801b169116178155613282565b906103aa818b8401511692826040818351169201511690613324565b16111561048f575b86600052600b88526001604060002001541692836152c0565b81847f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d876040518a8152a48133141580610485575b61041f575b6000805160206157e68339815191528484604051908152a1005b813b15610480576000805160206157e68339815191529460846000928360405195869485936313375c3b60e01b8552896004860152336024860152604485015260648401525af1610471575b80610405565b61047a90612b72565b3861046b565b600080fd5b50813b1515610400565b86600052600b8852604060002060018101600160a01b60ff60a01b1982541617905560ff60f01b1981541690556103b2565b60405163287ecaef60e21b8152600481018990526001600160801b03928316602482015291166044820152606490fd5b0390fd5b6024876040519063d2aabcd960e01b82526004820152fd5b600460405163630d074f60e11b8152fd5b606486838560405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b50848284161415610315565b60405163216caf0d60e01b815260048101859052336024820152604490fd5b506105798461563d565b156102ee565b60248360405190634a5541ef60e01b82526004820152fd5b346104805760003660031901126104805760206001600160a01b0360005416604051908152f35b346104805760203660031901126104805760206105dc60043561333d565b6040519015158152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260206001600160a01b0360016040600020015416604051908152f35b6024906040519062b8e7e760e51b82526004820152fd5b34610480576040366003190112610480576106806004356106716129ff565b61067a82615326565b9161535e565b005b346104805760403660031901126104805761069b6129e9565b6106a36129ff565b906001600160a01b03809116600052600860205260406000209116600052602052602060ff604060002054166040519015158152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57610715602091615326565b6001600160801b0360405191168152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b602052602060026040600020015460801c604051908152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260206001600160801b0360036040600020015416604051908152f35b3461048057602036600319011261048057600435600060206040516107ee81612b39565b828152015280600052600b60205260ff60016040600020015460a81c161561063b57600052600b6020526040806000205464ffffffffff82519161083183612b39565b818160a01c16835260c81c166020820152610862825180926020908164ffffffffff91828151168552015116910152565bf35b346104805760208060031936011261048057600435906108a261089d8360005260056020526001600160a01b0360406000205416151590565b612bd8565b60006001600160a01b03600a5416926044604051809581937fe9dc637500000000000000000000000000000000000000000000000000000000835230600484015260248301525afa91821561098b57600092610912575b5061090e6040519282849384528301906129c4565b0390f35b9091503d806000833e6109258183612b86565b81019082818303126104805780519067ffffffffffffffff8211610480570181601f8201121561048057805161095a81612ba8565b926109686040519485612b86565b81845284828401011161048057610984918480850191016129a1565b90826108f9565b6040513d6000823e3d90fd5b3461048057600319602036820112610480576004359067ffffffffffffffff9081831161048057610140908336030112610480576109d3615264565b604051916109e083612b1c565b6109ec81600401612a15565b83526109fa6024820161336e565b6020840152610a0b60448201612af3565b6040840152610a1c60648201612af3565b6060840152610a2d60848201612a15565b6080840152610a3e60a48201612bc4565b60a0840152610a4f60c48201612a15565b60c0840152610a613660e48301613454565b60e084015261012481013591821161048057013660238201121561048057602091610a99610aa4923690602460048201359101613380565b610100820152614720565b604051908152f35b3461048057604036600319011261048057600435610ac86129ff565b90610ad1615264565b80600052600b60205260ff60016040600020015460a81c161561063b578060005260056020526001600160a01b036040600020541691823303610b415761068092610b1b83615326565b6001600160801b038116610b30575b50612e6b565b610b3b90828561535e565b84610b2a565b60405163216caf0d60e01b815260048101839052336024820152604490fd5b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b602052602064ffffffffff60406000205460a01c16604051908152f35b3461048057600036600319011261048057602060405167016345785d8a00008152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260206001600160a01b0360406000205416604051908152f35b3461048057602036600319011261048057600435600052600b602052602060ff60016040600020015460a81c166040519015158152f35b3461048057608036600319011261048057610c786129e9565b610c806129ff565b6064359167ffffffffffffffff8311610480573660238401121561048057826004013591610cad83612ba8565b92610cbb6040519485612b86565b80845236602482870101116104805760208160009260246106809801838801378501015260443591612cf6565b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205261090e610d3460046040600020016131d5565b604051918291602083526020830190612a8f565b346104805760203660031901126104805760206105dc6004356132b6565b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57610da090614624565b6040516005821015610db3576020918152f35b634e487b7160e01b600052602160045260246000fd5b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260206001600160801b0360026040600020015416604051908152f35b3461048057602036600319011261048057610e376129e9565b6001600160a01b038060005416338103610ef557508116908160005260026020526001600160801b0360406000205416908115610ec45781610e969184600052600260205260406000206001600160801b0319815416905533906152c0565b6040519081527fca7a4a65a94ed2f37538814e00e1cd4c41a78261561e3f3794592f11409cf5af60203392a3005b602483604051907f8410168c0000000000000000000000000000000000000000000000000000000082526004820152fd5b6040516331b339a960e21b81526001600160a01b03919091166004820152336024820152604490fd5b346104805760603660031901126104805767ffffffffffffffff60043581811161048057610f50903690600401612a5e565b610f586129ff565b9260443590811161048057610f71903690600401612a5e565b9190610f7b615264565b828203610fe05760005b828110610f8e57005b806000805160206157e68339815191526020610fad600194878a61534e565b35610fd3610fc4610fbf868b8a61534e565b613440565b610fcc615264565b8b8361538b565b604051908152a101610f85565b50604491604051917faec9344000000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b34610480576040366003190112610480576110306129e9565b60243590811515809203610480576001600160a01b0316908133146110a457336000526008602052604060002082600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a3005b606460405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152fd5b3461048057600036600319011261048057604051600060045490600182811c918184169182156111ec575b60209485851084146111d65785879486865291826000146111b6575050600114611159575b5061114592500383612b86565b61090e6040519282849384528301906129c4565b84915060046000527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b906000915b85831061119e575050611145935082010185611138565b80548389018501528794508693909201918101611187565b60ff19168582015261114595151560051b85010192508791506111389050565b634e487b7160e01b600052602260045260246000fd5b92607f1692611113565b346104805760003660031901126104805760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b602052602064ffffffffff60406000205460c81c16604051908152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b576112be90614624565b600581101580610db357600282149081156112fa575b81156112e8575b6020826040519015158152f35b9050610db357600460209114826112db565b50506003811460006112d4565b34610480576020366003190112610480576004356001600160a01b0390818116809103610480578160005416338103610ef5575060015491816001600160a01b03198416176001556040519216825260208201527fdcb09aef4bf01068924ccce937981cbe59d25ba08380cf941aaaea4e4bd3960d60403392a2005b346104805760203660031901126104805760606101406040516113a581612b55565b60008152600060208201526000604082015260008382015260006080820152600060a0820152600060c0820152600060e082015260006101008201526113e9613263565b6101208201520152600435600052600b60205260ff60016040600020015460a81c16156115d857600435600052600b60205260406000206114cc60046040519261143284612b55565b80546001600160a01b038116855264ffffffffff8160a01c16602086015264ffffffffff8160c81c16604086015260ff8160f01c161515606086015260f81c1515608085015260ff60018201546001600160a01b03811660a0870152818160a01c16151560c0870152818160a81c16151560e087015260b01c1615156101008501526114c060028201613282565b610120850152016131d5565b6101408201526114dd600435614624565b906005821015610db357600261014092146115cc575b61090e604051928392602084526001600160a01b03815116602085015264ffffffffff602082015116604085015264ffffffffff60408201511660608501526060810151151560808501526080810151151560a08501526001600160a01b0360a08201511660c085015260c0810151151560e085015260e0810151151561010085015261010081015115156101208501526115b861012082015183860190604090816001600160801b0391828151168552826020820151166020860152015116910152565b01516101a0808401526101c0830190612a8f565b600060608201526114f3565b602460405162b8e7e760e51b81526004356004820152fd5b34610480576020806003193601126104805760043567ffffffffffffffff811161048057611622903690600401612a5e565b9061162b615264565b6000915b80831061163857005b61164383828461534e565b359261164d615264565b611656846132ed565b156116735760248460405190634a5541ef60e01b82526004820152fd5b61167f8492939461333d565b6118b6576116a382600052600b6020526001600160a01b0360406000205416331490565b15610b41576116b182613483565b82600052600b8087526116ca6002604060002001613282565b906001600160801b039283835116848216101561189e578560005281895260ff60406000205460f01c1615611886579061173882858b61172e7f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa509683895116613324565b9601511690613324565b9580600052818a526040600020938a855498600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8b16178755600388821697881561186c575b0197831697886001600160801b03198254161790556001600160a01b03809a16958691600584528b604060002054169687945260019b8c6040600020015416946117cb8b85886152c0565b604080518881526001600160801b0392831660208201529290911690820152606090a46000805160206157e68339815191528a604051838152a1813b611819575b505050505001919061162f565b813b15610480576000608492819560405197889687956372eba20360e01b875260048701526024860152604485015260648401525af161185d575b8080808061180c565b61186690612b72565b85611854565b60018101600160a01b60ff60a01b19825416179055611780565b602486604051906339c6dc7360e21b82526004820152fd5b602486604051906322cad1af60e11b82526004820152fd5b6024826040519063fe19f19f60e01b82526004820152fd5b346104805760208060031936011261048057600435906118ec615264565b81600052600b815260ff60016040600020015460a81c1615611aa35761191182614624565b6005811015610db3576004810361193a5760248360405190634a5541ef60e01b82526004820152fd5b6003810361195a576024836040519063fe19f19f60e01b82526004820152fd5b600214611a8b5761198182600052600b6020526001600160a01b0360406000205416331490565b15610b415781600052600b815260ff60406000205460f01c1615611a735781600052600b8152604060002060ff60f01b19815416905560405191807f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f600080a2600582526001600160a01b036040600020541692833b611a16575b6000805160206157e68339815191528383604051908152a1005b833b1561048057600081602481836000805160206157e6833981519152987f341a0bd90000000000000000000000000000000000000000000000000000000083528760048401525af1156119fc57611a6d90612b72565b836119fc565b602482604051906339c6dc7360e21b82526004820152fd5b602482604051906322cad1af60e11b82526004820152fd5b6024826040519062b8e7e760e51b82526004820152fd5b34610480576020366003190112610480576004356001600160a01b0390818116809103610480578160005416338103610ef55750600a5491816001600160a01b0319841617600a556040519216825260208201527fa2548bd4b805e907c1558a47b5858324fe8bb4a2e1ddfca647eecbf65610eebc60403392a26009546000198101908111611b765760407f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c91815190600182526020820152a1005b634e487b7160e01b600052601160045260246000fd5b3461048057602036600319011261048057611ba56129e9565b6000546001600160a01b0380821692338403611bf7576001600160a01b03199350169182911617600055337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf80600080a3005b6040516331b339a960e21b81526001600160a01b0385166004820152336024820152604490fd5b34610480576020366003190112610480576001600160a01b03611c3f6129e9565b168015611c5e5760005260066020526020604060002054604051908152f35b608460405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e657200000000000000000000000000000000000000000000006064820152fd5b3461048057602036600319011261048057600435611cff61089d8260005260056020526001600160a01b0360406000205416151590565b600052600560205260206001600160a01b0360406000205416604051908152f35b34610480576020366003190112610480576020611d3e600435612c23565b6001600160a01b0360405191168152f35b346104805760003660031901126104805760206001600160a01b0360015416604051908152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b576107156020916146a5565b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b576000611dee82614624565b6005811015610db357600203611e0c575b6020906040519015158152f35b50600052600b602052602060ff60406000205460f01c16611dff565b3461048057602036600319011261048057600435611e44615264565b611e4d816132ed565b15611f7557611e5b8161563d565b15611f5557611e6981612c23565b611e72826132b6565b159081611f4c575b81611f39575b50611f2157602081611ea06000805160206157e683398151915293612c23565b9080600052600783526001600160a01b036040600020926001600160a01b031993848154169055169182600052600684526040600020600019815401905581600052600584526040600020908154169055806000604051937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a48152a1005b60249060405190630da9b01360e01b82526004820152fd5b6001600160a01b03915016151582611e80565b60009150611e7a565b60405163216caf0d60e01b81526004810191909152336024820152604490fd5b602490604051907f817cd6390000000000000000000000000000000000000000000000000000000082526004820152fd5b3461048057611fb436612a29565b60405191602083019383851067ffffffffffffffff861117611fe0576106809460405260008452612cf6565b634e487b7160e01b600052604160045260246000fd5b346104805760203660031901126104805760206105dc6004356132ed565b34610480576020806003193601126104805760043590612032615264565b61203b826132ed565b156120585760248260405190634a5541ef60e01b82526004820152fd5b6120618261333d565b6118b65761208582600052600b6020526001600160a01b0360406000205416331490565b15610b415761209382613483565b9180600052600b82526120ac6002604060002001613282565b906001600160801b0393848351168582161015611a8b5781600052600b845260ff60406000205460f01c1615611a73578085856120ef6120f99483885116613324565b9501511690613324565b9080600052600b84526000805160206157e6833981519152604060002094855494600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff87161787556003888616978815612233575b0197811697886001600160801b03198254161790556001600160a01b038096169560058352867f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa508260406000205416978893600b875260016040600020015416946121bc8d85886152c0565b604080518a81526001600160801b0392831660208201529290911690820152606090a4604051838152a1813b6121ee57005b813b15610480576000608492819560405197889687956372eba20360e01b875260048701526024860152604485015260648401525af161222a57005b61068090612b72565b60018101600160a01b60ff60a01b19825416179055612150565b34610480576020366003190112610480576001600160a01b0361226e6129e9565b16600052600260205260206001600160801b0360406000205416604051908152f35b34610480576106806122a136612a29565b916122b46122af8433612d8c565b612c85565b612e6b565b34610480576000366003190112610480576020600954604051908152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b5761231190614624565b6005811015610db3578060209115908115612332575b506040519015158152f35b600191501482612327565b346104805760206003198181360112610480576004359067ffffffffffffffff9081831161048057610120833603918201126104805761237b615264565b6101048301359060221901811215610480578201600481013590828211610480576024016060820236038113610480576123b6913691613380565b918251906123c3826131bd565b916123d16040519384612b86565b808352601f196123e0826131bd565b018660005b8281106125a25750505064ffffffffff90814216946001600160801b03968761240d826134ee565b515116828a61241b846134ee565b510151168580604061242c866134ee565b510151168a0116906040519261244184612b00565b83528b8301526040820152612455876134ee565b5261245f866134ee565b5060019386855b8a8c87831061252157908b846001600160a01b038c60a48101358281169081900361048057610aa4956124e195612511946124a36024860161341f565b6124af6044870161341f565b6124bb6064880161342c565b916124c88860040161342c565b94846124d660848b01613440565b966040519d8e612b1c565b168c528d8c0152151560408b0152151560608a01521660808801521660a086015260c085015260c4369101613454565b60e0830152610100820152614720565b8893858060406125558b866125458a8e9a61253c828d613511565b5151169a613511565b5101511694600019890190613511565b51015116816040612566888c613511565b510151160116916040519361257a85612b00565b8452830152604082015261258e828b613511565b52612599818a613511565b50018790612466565b6125aa613263565b8282880101520187906123e5565b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b5760209060009080600052600b8352604060002060ff815460f01c168061264b575b612622575b50506001600160801b0360405191168152f35b61264492506001600160801b03600261263e9201541691613483565b90613324565b828061260f565b5060ff600182015460a01c161561260a565b34610480576040366003190112610480576126766129e9565b602435906001600160a01b03808061268d85612c23565b1692169180831461278757803314908115612762575b50156126f8578260005260076020526040600020826001600160a01b03198254161790556126d083612c23565b167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b608460405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152fd5b9050600052600860205260406000203360005260205260ff60406000205416846126a3565b608460405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152fd5b34610480576020366003190112610480576020611d3e600435612c48565b3461048057600036600319011261048057604051600060035490600182811c918184169182156128c8575b60209485851084146111d65785879486865291826000146111b657505060011461286b575061114592500383612b86565b84915060036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b906000915b8583106128b0575050611145935082010185611138565b80548389018501528794508693909201918101612899565b92607f169261283a565b3461048057602036600319011261048057600435907fffffffff00000000000000000000000000000000000000000000000000000000821680920361048057817f80ac58cd0000000000000000000000000000000000000000000000000000000060209314908115612977575b811561294d575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501483612946565b7f5b5e139f000000000000000000000000000000000000000000000000000000008114915061293f565b60005b8381106129b45750506000910152565b81810151838201526020016129a4565b906020916129dd815180928185528580860191016129a1565b601f01601f1916010190565b600435906001600160a01b038216820361048057565b602435906001600160a01b038216820361048057565b35906001600160a01b038216820361048057565b6060906003190112610480576001600160a01b0390600435828116810361048057916024359081168103610480579060443590565b9181601f840112156104805782359167ffffffffffffffff8311610480576020808501948460051b01011161048057565b90815180825260208080930193019160005b828110612aaf575050505090565b835180516001600160801b031686528083015167ffffffffffffffff168684015260409081015164ffffffffff169086015260609094019392810192600101612aa1565b3590811515820361048057565b6060810190811067ffffffffffffffff821117611fe057604052565b610120810190811067ffffffffffffffff821117611fe057604052565b6040810190811067ffffffffffffffff821117611fe057604052565b610160810190811067ffffffffffffffff821117611fe057604052565b67ffffffffffffffff8111611fe057604052565b90601f8019910116810190811067ffffffffffffffff821117611fe057604052565b67ffffffffffffffff8111611fe057601f01601f191660200190565b35906001600160801b038216820361048057565b15612bdf57565b606460405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152fd5b60005260056020526001600160a01b0360406000205416612c45811515612bd8565b90565b612c6b61089d8260005260056020526001600160a01b0360406000205416151590565b60005260076020526001600160a01b036040600020541690565b15612c8c57565b608460405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f766564000000000000000000000000000000000000006064820152fd5b90612d1a939291612d0a6122af8433612d8c565b612d15838383612e6b565b613024565b15612d2157565b60405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b906001600160a01b038080612da084612c23565b16931691838314938415612dd3575b508315612dbd575b50505090565b612dc991929350612c48565b1614388080612db7565b909350600052600860205260406000208260005260205260ff604060002054169238612daf565b15612e0157565b608460405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152fd5b90612e949291612e7a83612c23565b916001600160a01b03948593848094169687911614612dfa565b1690811580612f8b57612ea6846132b6565b159081612f82575b5080612f79575b612f615791808492612ee36000805160206157e683398151915296602096612edc85612c23565b1614612dfa565b60009382855260078652604085206001600160a01b031990818154169055818652600687526040862060001981540190558286526040862060018154019055838652600587528260408720918254161790557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6040519580a48152a1565b60248360405190630da9b01360e01b82526004820152fd5b50831515612eb5565b90501538612eae565b608460405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152fd5b3d1561301f573d9061300582612ba8565b916130136040519384612b86565b82523d6000602084013e565b606090565b9290803b156131b45761308e916020916001600160a01b0394604051809581948293897f150b7a02000000000000000000000000000000000000000000000000000000009b8c865233600487015216602485015260448401526080606484015260848301906129c4565b03916000968791165af19082908261314d575b5050613127576130af612ff4565b805190816131225760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000161490565b909192506020813d82116131ac575b8161316960209383612b86565b810103126131a85751907fffffffff00000000000000000000000000000000000000000000000000000000821682036131a557509038806130a1565b80fd5b5080fd5b3d915061315c565b50505050600190565b67ffffffffffffffff8111611fe05760051b60200190565b9081546131e1816131bd565b926040936131f185519182612b86565b828152809460208092019260005281600020906000935b85851061321757505050505050565b6001848192845161322781612b00565b64ffffffffff87546001600160801b038116835267ffffffffffffffff8160801c168584015260c01c1686820152815201930194019391613208565b6040519061327082612b00565b60006040838281528260208201520152565b9060405161328f81612b00565b6040819360018154916001600160801b0392838116865260801c6020860152015416910152565b80600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260ff60016040600020015460b01c1690565b80600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260ff60016040600020015460a01c1690565b6001600160801b039182169082160391908211611b7657565b80600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260406000205460f81c90565b359064ffffffffff8216820361048057565b92919261338c826131bd565b60409461339b86519283612b86565b8195848352602080930191606080960285019481861161048057925b8584106133c75750505050505050565b8684830312610480578251906133dc82612b00565b6133e585612bc4565b8252858501359067ffffffffffffffff8216820361048057828792838b95015261341086880161336e565b868201528152019301926133b7565b3580151581036104805790565b356001600160a01b03811681036104805790565b356001600160801b03811681036104805790565b91908260409103126104805760405161346c81612b39565b602080829461347a81612a15565b84520135910152565b64ffffffffff80421682600052600b602052604060002091825482828260a01c1610156134e45760c81c1611156134d25760040154600110156134c957612c4590613525565b612c4590614555565b6001600160801b039150600201541690565b5050505050600090565b8051156134fb5760200190565b634e487b7160e01b600052603260045260246000fd5b80518210156134fb5760209160051b010190565b64ffffffffff90814216906000908152600b60205260409081812082519361354c85612b55565b8154956001600160a01b039182881687526020870197828160a01c168952828160c81c168789015260ff8160f01c161515606089015260f81c1515608088015260ff6001938486015490811660a08a0152818160a01c16151560c08a0152818160a81c16151560e08a015260b01c1615156101008801526101406135e660046135d760028801613282565b966101208b01978852016131d5565b97019187835280876135f8889a6134ee565b5101511693828288965b16106136dc57509161368c6136919284888161369698976001600160801b039e8f61362e8b8a51613511565b5151169d8a8f9b602061364b67ffffffffffffffff928d51613511565b5101511699848361365d848451613511565b51015116965081156136d05761367b92935051906000190190613511565b5101511680925b0316920316613750565b613abf565b613922565b9283136136af5750506136a98391613714565b16011690565b5160200151929392831692841683101591506136cb9050575090565b905090565b50505051168092613682565b8094986001600160801b0390816136f48c8851613511565b51511601169801938282808a61370b898951613511565b51015116613602565b6000811261371f5790565b602490604051907f2463f3d50000000000000000000000000000000000000000000000000000000082526004820152fd5b90600160ff1b808314908115613838575b5061380e5760008212156138055761378a826000035b60008312156137fe578260000390613842565b917f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83116137c857600091600019911813156137c4575090565b0390565b604491604051917fd49c26b300000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b8290613842565b61378a82613777565b60046040517f9fe2b450000000000000000000000000000000000000000000000000000000008152fd5b9050811438613761565b670de0b6b3a76400009160001983830992808302928380861095039480860395146138fe57828510156138c257908291096001821901821680920460028082600302188083028203028083028203028083028203028083028203028083028203028092029003029360018380600003040190848311900302920304170290565b82606492604051927f63a05778000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b50508092501561390c570490565b634e487b7160e01b600052601260045260246000fd5b90600160ff1b808314908115613a06575b506139dc5760008212156139d35761395c826000035b60008312156139cc578260000390613a10565b917f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831161399657600091600019911813156137c4575090565b604491604051917f120b5b4300000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b8290613a10565b61395c82613949565b60046040517fa6070c25000000000000000000000000000000000000000000000000000000008152fd5b9050811438613933565b90919060001983820983820291828083109203918083039214613aae57670de0b6b3a76400009081831015613a7757947faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066994950990828211900360ee1b910360121c170290565b60449086604051917f5173648d00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050670de0b6b3a764000090049150565b80613ad95750600090612c455750670de0b6b3a764000090565b90670de0b6b3a7640000808314613b26575080613afe575050670de0b6b3a764000090565b670de0b6b3a76400008114613b2257613b1d90613691612c4593614400565b613b46565b5090565b91505090565b801561390c576ec097ce7bc90715b34b9f10000000000590565b6000811215613b7b5768033dd1780914b97114198112613b7557613b6c90600003613b46565b612c4590613b2c565b50600090565b680a688906bd8affffff81136143cf57670de0b6b3a764000080604092831b05907780000000000000000000000000000000000000000000000067ff0000000000000083166142b2575b66ff00000000000083166141aa575b65ff000000000083166140aa575b64ff000000008316613fb2575b63ff0000008316613ec2575b62ff00008316613dda575b61ff008316613cfa575b60ff8316613c23575b02911c60bf031c90565b60808316613ce8575b838316613cd6575b60208316613cc4575b60108316613cb2575b60088316613ca0575b60048316613c8e575b60028316613c7c575b6001831615613c19576801000000000000000102831c613c19565b6801000000000000000102831c613c61565b6801000000000000000302831c613c58565b6801000000000000000602831c613c4f565b6801000000000000000b02831c613c46565b6801000000000000001602831c613c3d565b6801000000000000002c02831c613c34565b6801000000000000005902831c613c2c565b6180008316613dc8575b6140008316613db6575b6120008316613da4575b6110008316613d92575b6108008316613d80575b6104008316613d6e575b6102008316613d5c575b610100831615613c1057680100000000000000b102831c613c10565b6801000000000000016302831c613d40565b680100000000000002c602831c613d36565b6801000000000000058c02831c613d2c565b68010000000000000b1702831c613d22565b6801000000000000162e02831c613d18565b68010000000000002c5d02831c613d0e565b680100000000000058b902831c613d04565b628000008316613eb0575b624000008316613e9e575b622000008316613e8c575b621000008316613e7a575b620800008316613e68575b620400008316613e56575b620200008316613e44575b62010000831615613c06576801000000000000b17202831c613c06565b680100000000000162e402831c613e27565b6801000000000002c5c802831c613e1c565b68010000000000058b9102831c613e11565b680100000000000b172102831c613e06565b68010000000000162e4302831c613dfb565b680100000000002c5c8602831c613df0565b6801000000000058b90c02831c613de5565b63800000008316613fa0575b63400000008316613f8e575b63200000008316613f7c575b63100000008316613f6a575b63080000008316613f58575b63040000008316613f46575b63020000008316613f34575b6301000000831615613bfb5768010000000000b1721802831c613bfb565b6801000000000162e43002831c613f16565b68010000000002c5c86002831c613f0a565b680100000000058b90c002831c613efe565b6801000000000b17217f02831c613ef2565b680100000000162e42ff02831c613ee6565b6801000000002c5c85fe02831c613eda565b68010000000058b90bfc02831c613ece565b6480000000008316614098575b6440000000008316614086575b6420000000008316614074575b6410000000008316614062575b6408000000008316614050575b640400000000831661403e575b640200000000831661402c575b640100000000831615613bef57680100000000b17217f802831c613bef565b68010000000162e42ff102831c61400d565b680100000002c5c85fe302831c614000565b6801000000058b90bfce02831c613ff3565b68010000000b17217fbb02831c613fe6565b6801000000162e42fff002831c613fd9565b68010000002c5c8601cc02831c613fcc565b680100000058b90c0b4902831c613fbf565b658000000000008316614198575b654000000000008316614186575b652000000000008316614174575b651000000000008316614162575b650800000000008316614150575b65040000000000831661413e575b65020000000000831661412c575b65010000000000831615613be2576801000000b17218355102831c613be2565b680100000162e430e5a202831c61410c565b6801000002c5c863b73f02831c6140fe565b68010000058b90cf1e6e02831c6140f0565b680100000b1721bcfc9a02831c6140e2565b68010000162e43f4f83102831c6140d4565b680100002c5c89d5ec6d02831c6140c6565b6801000058b91b5bc9ae02831c6140b8565b668000000000000083166142a0575b6640000000000000831661428e575b6620000000000000831661427c575b6610000000000000831661426a575b66080000000000008316614258575b66040000000000008316614246575b66020000000000008316614234575b6601000000000000831615613bd45768010000b17255775c0402831c613bd4565b6801000162e525ee054702831c614213565b68010002c5cc37da949202831c614204565b680100058ba01fb9f96d02831c6141f5565b6801000b175effdc76ba02831c6141e6565b680100162f3904051fa102831c6141d7565b6801002c605e2e8cec5002831c6141c8565b68010058c86da1c09ea202831c6141b9565b67800000000000000083166143b0575b674000000000000000831661439e575b672000000000000000831661438c575b671000000000000000831661437a575b6708000000000000008316614368575b6704000000000000008316614356575b6702000000000000008316614344575b670100000000000000831615613bc557680100b1afa5abcbed6102831c613bc5565b68010163da9fb33356d802831c614322565b680102c9a3e778060ee702831c614312565b6801059b0d31585743ae02831c614302565b68010b5586cf9890f62a02831c6142f2565b6801172b83c7d517adce02831c6142e2565b6801306fe0a31b7152df02831c6142d2565b5077b504f333f9de6484800000000000000000000000000000006142c2565b602490604051907f0360d0280000000000000000000000000000000000000000000000000000000082526004820152fd5b8060008083131561452457670de0b6b3a7640000928381126144ed57506001925b808305906001600160801b03821160071b91821c9167ffffffffffffffff831160061b92831c63ffffffff811160051b90811c61ffff811160041b90811c60ff811160031b90811c91600f831160021b92831c936001978860038711811b96871c11961717171717171781810294811d908282146144e157506706f05b59d3b20000905b8482136144b55750505050500290565b808391020590671bc16d674ec800008212156144d4575b831d906144a5565b8091950194831d906144cc565b93505093925050020290565b6000199392508015614510576ec097ce7bc90715b34b9f10000000000591614421565b602482634e487b7160e01b81526012600452fd5b602483604051907f059b101b0000000000000000000000000000000000000000000000000000000082526004820152fd5b64ffffffffff61458a600091838352600b60205280806040852054818160a01c1693849160c81c160316918142160316613750565b91808252600b602052600460408320018054156146105790829167ffffffffffffffff93526145e26020832054828452600b6020526136916001600160801b03968760026040882001541696879360801c1690613abf565b9283136145f85750506145f490613714565b1690565b60029350604092508152600b60205220015460801c90565b602483634e487b7160e01b81526032600452fd5b80600052600b602052604060002060ff600182015460a01c1660001461464b575050600490565b805460f81c61469e575460a01c64ffffffffff164210613b755761466e81613483565b90600052600b6020526001600160801b03806002604060002001541691161060001461469957600190565b600290565b5050600390565b80600052600b6020526146be6002604060002001613282565b81600052600b602052604060002060ff600182015460a01c166000146146f157506001600160801b039150602001511690565b5460f81c6147035750612c4590613483565b612c4591506001600160801b036040818351169201511690613324565b906001600160a01b036001541660206001600160a01b0360c0850151166024604051809481937fdcf844a700000000000000000000000000000000000000000000000000000000835260048301525afa801561098b57600090614fd3575b6147a191506001600160801b0360a08501511690602060e08601510151916156a6565b6001600160801b0381511661010084015164ffffffffff6020860151168215614fa95781518015614f7f577f00000000000000000000000000000000000000000000000000000000000000008111614f4e575064ffffffffff6040614805846134ee565b51015116811015614ef75750600090819082815184905b808210614e64575050505064ffffffffff421664ffffffffff8216811015614e245750506001600160801b0316808203614ded5750506009549283600052600b6020526040600020916001600160801b0381511660028401906001600160801b03198254161790556001600160a01b0360c083015116600184015490750100000000000000000000000000000000000000000060408501511515928654927fffffffffffffffffff0000ff000000000000000000000000000000000000000076ff000000000000000000000000000000000000000000006060890151151560b01b16921617171760018601556001600160a01b038451169161010085015192604061492e855195600019870190613511565b510151927fff000000000000000000000000000000000000000000000000000000000000007eff0000000000000000000000000000000000000000000000000000000000007dffffffffff0000000000000000000000000000000000000000000000000078ffffffffff000000000000000000000000000000000000000060208b015160a01b169660c81b169460f01b16911617171717845560005b818110614d1d575050600185016009556001600160a01b0360c08301511660005260026020526001600160801b0380604060002054168160208401511601166001600160a01b0360c0840151166000526040600020906001600160801b03198254161790556001600160a01b036080830151168015614cd957614a6c614a668760005260056020526001600160a01b0360406000205416151590565b15615181565b614a75866132b6565b1580614cd0575b80614cc8575b614cb05760206000805160206157e683398151915291614abb614a668960005260056020526001600160a01b0360406000205416151590565b806000526006825260406000206001815401905587600052600582526040600020816001600160a01b0319825416179055876040519160007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4878152a1614b4b6001600160a01b0360c0840151166001600160801b03808451168160208601511601169030903390615007565b6001600160801b0360408201511680614c81575b507fef3d668acee46576ad5d407c42ab4d0cde13f3cd70b28f09a0fb9e3bf5bf09cb614c3e6001600160a01b03845116926001600160a01b03608086015116946001600160a01b0360c08201511696614c76614c5660408401511515928c606086015115156001600160a01b0360e061010089015194549864ffffffffff6040519a614bea8c612b39565b818160a01c168c5260c81c1660208b01520151511695604051998a99610160948b523360208c015260408b0190604090816001600160801b0391828151168552826020820151166020860152015116910152565b60a089015260c08801528060e0880152860190612a8f565b926101008501906020908164ffffffffff91828151168552015116910152565b6101408301520390a4565b614caa906001600160a01b0360c0850151166001600160a01b0360e08601515116903390615007565b38614b5f565b60248660405190630da9b01360e01b82526004820152fd5b506000614a82565b50801515614a7c565b606460405162461bcd60e51b815260206004820152602060248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152fd5b614d2c81610100860151613511565b519060048601549168010000000000000000831015611fe057600183018060048901558310156134fb5760019260048801600052602060002001906001600160801b03815116908254917fffffff00000000000000000000000000000000000000000000000000000000007cffffffffff000000000000000000000000000000000000000000000000604077ffffffffffffffff00000000000000000000000000000000602086015160801b1694015160c01b1693161717179055016149ca565b60449250604051917fd90b7e3900000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b6040517f210aec0e00000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b9193509193614e88906001600160801b03614e7f8588613511565b51511690615622565b9364ffffffffff806040614e9c8685613511565b51015116941680851115614eba57506001849301919291909261481c565b8385606492604051927f7b0bada8000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b64ffffffffff6040614f08846134ee565b5101516040517fb4c9e52c00000000000000000000000000000000000000000000000000000000815264ffffffffff938416600482015291169091166024820152604490fd5b602490604051907f4757689b0000000000000000000000000000000000000000000000000000000082526004820152fd5b60046040517f3952c64e000000000000000000000000000000000000000000000000000000008152fd5b60046040517f6095d3bc000000000000000000000000000000000000000000000000000000008152fd5b6020823d602011614fff575b81614fec60209383612b86565b810103126131a557506147a1905161477e565b3d9150614fdf565b9290604051927f23b872dd0000000000000000000000000000000000000000000000000000000060208501526001600160a01b03809216602485015216604483015260648201526064815260a081019181831067ffffffffffffffff841117611fe05761507692604052615078565b565b6001600160a01b0316906150d860405161509181612b39565b6020938482527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564858301526000808587829751910182855af16150d2612ff4565b916151cc565b80519182159184831561515d575b5050509050156150f35750565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b9193818094500103126131a8578201519081151582036131a55750803880846150e6565b1561518857565b606460405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152fd5b9192901561522d57508151156151e0575090565b3b156151e95790565b606460405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b8251909150156152405750805190602001fd5b6104f19060405191829162461bcd60e51b83526020600484015260248301906129c4565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361529657565b60046040517fa1c0d6e5000000000000000000000000000000000000000000000000000000008152fd5b916001600160a01b03604051927fa9059cbb000000000000000000000000000000000000000000000000000000006020850152166024830152604482015260448152608081019181831067ffffffffffffffff841117611fe05761507692604052615078565b612c4590615333816146a5565b90600052600b60205260026040600020015460801c90613324565b91908110156134fb5760051b0190565b6153826000805160206157e68339815191529360209361537c615264565b8361538b565b604051908152a1565b90615395826132ed565b61560a576153b982600052600b6020526001600160a01b0360406000205416331490565b918215806155fa575b611f55576000928184526020600581526001600160a01b039360409185838820541693806155ee575b6155c9578582169586156155b9576001600160801b03808a16998a156155a25761541488615326565b8281168c116155735750926154c88b89946001898e7f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d978f9a61546a615493918c8552600b8b526002868620015460801c615622565b8b8452600b8a5260028585200190836001600160801b031983549260801b169116178155613282565b906154ae818a84015116928286818351169201511690613324565b161115615545575b888152600b87522001541696876152c0565b85518b8152a4813314158061553b575b6154e5575b505050505050565b813b15615537576084929185915196879586946313375c3b60e01b86526004860152336024860152604485015260648401525af1615528575b80808080806154dd565b61553190612b72565b3861551e565b8480fd5b50813b15156154d8565b888152600b8752818120838101600160a01b60ff60a01b1982541617905560ff60f01b1981541690556154b6565b865163287ecaef60e21b8152600481018a90526001600160801b03928316602482015291166044820152606490fd5b60248887519063d2aabcd960e01b82526004820152fd5b6004845163630d074f60e11b8152fd5b6064858784865192632dcbf6b960e11b84526004840152336024840152166044820152fd5b508386831614156153eb565b506156048161563d565b156153c2565b60248260405190634a5541ef60e01b82526004820152fd5b9190916001600160801b0380809416911601918211611b7657565b60009080825260056020526001600160a01b038060408420541692833314938415615682575b5050821561567057505090565b90915061567d3392612c48565b161490565b60ff9294509060409181526008602052818120338252602052205416913880615663565b9092916156b1613263565b936001600160801b03928381169182156157bd5767016345785d8a00008082116157865780851161574f57506156fb856156ec819386613a10565b16946020890195865284613a10565b169184615712604089019480865282875116615622565b1610156157395761572b84918261573495511690613324565b91511690613324565b168252565b634e487b7160e01b600052600160045260246000fd5b84604491604051917f4fea5c1a00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b60449250604051917f47152d6700000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b505050505090506040516157d081612b00565b6000815260006020820152600060408201529056fef8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7a164736f6c6343000815000a"; bytes public constant BYTECODE_LOCKUP_LINEAR = - hex"60a034620003e757601f196001600160401b03601f62004ca23881900382810185168601919084831187841017620003ec57808792606094604052833981010312620003e75783516001600160a01b03928382169291839003620003e7576020918287015196858816809803620003e75760400151948516809503620003e7576200008962000402565b90601c82527f5361626c696572205632204c6f636b7570204c696e656172204e46540000000084830152620000bd62000402565b601181527029a0a116ab1916a627a1a5aaa816a624a760791b8582015230608052600080546001600160a01b031990811688178255600180548216909b178b5596817fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a38351858111620003d35760039485548c81811c91168015620003c8575b89821014620003b45790818684931162000361575b508890868311600114620002f8578492620002ec575b505060001982871b1c1916908b1b1784555b8151948511620002d8576004958654998b8b811c9b168015620002cd575b828c1014620002ba57848b1162000271575b869798999a50819487116001146200020a57505093620001fe575b505082871b92600019911b1c19161790555b600a541617600a5560095560405161487f9081620004238239608051816145a90152f35b015191503880620001c8565b8883528183208c9890969594939116915b8282106200025757505085116200023c575b50505050811b019055620001da565b01519060f884600019921b161c19169055388080806200022d565b8484015187558c989096019593840193908101906200021b565b87835281832085880160051c81019b838910620002af575b860160051c019a8c905b8c8110620002a3575050620001ad565b848155018c9062000293565b909b508b9062000289565b634e487b7160e01b835260228852602483fd5b9a607f169a6200019b565b634e487b7160e01b81526041600452602490fd5b0151905038806200016b565b908c8e9416918886528a862092865b8c82821062000341575050841162000328575b505050811b0184556200017d565b015160001983891b60f8161c191690553880806200031a565b91929395968291958786015181550195019301908f959493929162000307565b9091508684528884208680850160051c8201928b8610620003aa575b918f91869594930160051c01915b8281106200039b57505062000155565b8681558594508f91016200038b565b925081926200037d565b634e487b7160e01b84526022600452602484fd5b90607f169062000140565b634e487b7160e01b82526041600452602482fd5b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620003ec5760405256fe608080604052600436101561001357600080fd5b600090813560e01c90816301ffc9a714612e245750806306fdde0314612d62578063081812fc14612d43578063095ea7b314612bb45780631400ecec14612b145780631c1cdd4c14612aaf5780631e99d56914612a9157806323b872dd14612a6757806339a73c0314612a2657806340e58ee514612788578063425d30dd1461276957806342842e0e1461271957806342966c681461258f5780634857501f146125055780634869e12d146124ca5780635fe3b567146124a35780636352211e146124735780636d0cee751461241d57806370a082311461237457806375829def146122e1578063780a82c8146122915780637cad6cd1146121c05780637de6b1db14611fc95780638659c27014611ca8578063894e9a0d14611a545780638bad38dd146119d75780638f69b9931461193b5780639067b677146118e857806395d89b41146117db57806396ce1431146116bc578063a22cb465146115eb578063a2ffb897146111fe578063a6202bf214611101578063a80fc071146110af578063ab167ccc14610f76578063ad35efd414610f14578063b256456914610ef5578063b88d4fde14610e68578063b8a3be6614610e33578063b971302a14610de4578063bc063e1a14610dc1578063bc2be1be14610d71578063c156a11d146109c1578063c87b56dd14610887578063cc364f48146107d9578063d4dbd20b14610787578063d511609f1461073b578063d975dfed146106ef578063e985e9c51461069a578063ea5ead1914610674578063eac8f5b81461060b578063f590c176146105e2578063f851a440146105bc5763fdd46d601461027357600080fd5b346105b95760603660031901126105b95760043561028f612f53565b610297613093565b906102a061459f565b6102a983613723565b6105a1576102cd83600052600b6020526001600160a01b0360406000205416331490565b90811580610591575b61057257838552602092600584526001600160a01b0391826040882054169380610566575b61054057828116928315610516576001600160801b038084169384156104fe5761032489614661565b82811686116104ca5750938093926103ca9261038f6103578d9a99988d8c52600b8d52600260408d20015460801c6146af565b8c8b52600b8c5261038a600260408d20019182906001600160801b036001600160801b031983549260801b169116179055565b6136b8565b906103ab818c840151169282604081835116920151169061375a565b16111561049a575b898852600b895260016040892001541692836145fb565b82877f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d88604051868152a48233141580610490575b610432575b837ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce78688604051908152a180f35b823b1561048c57608484928360405195869485936313375c3b60e01b85528b6004860152336024860152604485015260648401525af1610474575b8080610404565b61047d90612fcf565b61048857823861046d565b8280fd5b8380fd5b50823b15156103ff565b898852600b89526040882060018101600160c81b60ff60c81b1982541617905560ff60f01b1981541690556103b3565b60405163287ecaef60e21b8152600481018b90526001600160801b03928316602482015291166044820152606490fd5b0390fd5b6024896040519063d2aabcd960e01b82526004820152fd5b60046040517fc61a0e9e000000000000000000000000000000000000000000000000000000008152fd5b858360649260405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b508383821614156102fb565b60405163216caf0d60e01b815260048101859052336024820152604490fd5b5061059b846146ca565b156102d6565b60248360405190634a5541ef60e01b82526004820152fd5b80fd5b50346105b957806003193601126105b9576001600160a01b036020915416604051908152f35b50346105b95760203660031901126105b9576020610601600435613789565b6040519015158152f35b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d5760016040836001600160a01b039360209552600b855220015416604051908152f35b6024906040519062b8e7e760e51b82526004820152fd5b50346105b95760403660031901126105b957600435610691612f53565b61029782614661565b50346105b95760403660031901126105b9576106b4612f3d565b60406106be612f53565b926001600160a01b0380931681526008602052209116600052602052602060ff604060002054166040519015158152f35b50346105b95760203660031901126105b95760ff6001604060043593848152600b60205220015460d01c161561065d5761072a602091614661565b6001600160801b0360405191168152f35b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d5760408260029260209452600b845220015460801c604051908152f35b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d5760036040836001600160801b039360209552600b855220015416604051908152f35b50346105b95760203660031901126105b9576004356107f6613699565b50808252600b60205260ff600160408420015460d01c161561065d578160409160609352600b60205220600181549164ffffffffff918291015460a01c1690604051926108428461301d565b818160a01c16845260c81c166020830152604082015261088560405180926040908164ffffffffff91828151168552826020820151166020860152015116910152565bf35b50346105b9576020806003193601126109b1576004356108c56108c08260005260056020526001600160a01b0360406000205416151590565b6130a9565b826001600160a01b03600a5416916044604051809481937fe9dc637500000000000000000000000000000000000000000000000000000000835230600484015260248301525afa9283156109b5578093610934575b5050610930604051928284938452830190612f18565b0390f35b909192503d8082843e6109478184613055565b82019183818403126109b15780519067ffffffffffffffff8211610488570182601f820112156109b15780519161097d83613077565b9361098b6040519586613055565b8385528584840101116105b95750906109a991848085019101612ef5565b90388061091a565b5080fd5b604051903d90823e3d90fd5b50346105b95760403660031901126105b9576004356109de612f53565b906109e761459f565b808352602090600b825260ff600160408620015460d01c161561065d57808452600582526001600160a01b03928360408620541693843303610d5257610a2c83614661565b906001600160801b0390818316918215938415610a7d575b897ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce78989610a73818b8f61333c565b604051908152a180f35b610a8561459f565b610a8e87613723565b610d3a57610ab287600052600b6020526001600160a01b0360406000205416331490565b94851580610d2a575b610d0b57878b52600589528360408c2054169580610d01575b610cdd57891561051657610cc557610aeb87614661565b8281168511610c95575090610b4b610b188b96959493898852600b8b52600260408920015460801c6146af565b888752600b8a5261038a600260408920019182906001600160801b036001600160801b031983549260801b169116179055565b90610b67818a840151169282604081835116920151169061375a565b161115610c65575b858452600b8752600160408520015416610b8a8289836145fb565b87867f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d89604051868152a48133141580610c5b575b610c00575b50505081610a73917ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7958686604051858152a195819338610a44565b813b156104885782916084839260405194859384926313375c3b60e01b84528a60048501523360248501528c604485015260648401525af1610c43575b80610bc4565b610c4c90612fcf565b610c57578438610c3d565b8480fd5b50813b1515610bbf565b858452600b87526040842060018101600160c81b60ff60c81b1982541617905560ff60f01b198154169055610b6f565b60405163287ecaef60e21b8152600481018990526001600160801b03928316602482015291166044820152606490fd5b6024876040519063d2aabcd960e01b82526004820152fd5b6064888b60405191632dcbf6b960e11b835260048301523360248301526044820152fd5b50858a1415610ad4565b60405163216caf0d60e01b815260048101899052336024820152604490fd5b50610d34886146ca565b15610abb565b60248760405190634a5541ef60e01b82526004820152fd5b60405163216caf0d60e01b815260048101849052336024820152604490fd5b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d5760408264ffffffffff9260209452600b8452205460a01c16604051908152f35b50346105b957806003193601126105b957602060405167016345785d8a00008152f35b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d576040826001600160a01b039260209452600b8452205416604051908152f35b50346105b95760203660031901126105b95760ff600160406020936004358152600b855220015460d01c166040519015158152f35b50346105b95760803660031901126105b957610e82612f3d565b610e8a612f53565b906064359067ffffffffffffffff821161048c573660238301121561048c5781600401359284610eb985613077565b93610ec76040519586613055565b85855236602487830101116109b15785610ef2966024602093018388013785010152604435916131c7565b80f35b50346105b95760203660031901126105b95760206106016004356136ec565b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d57610f4d906139ff565b604051906005811015610f6257602092508152f35b602483634e487b7160e01b81526021600452fd5b50346105b9576101403660031901126105b957610f9161459f565b610f99613699565b9064ffffffffff80421680845260c43582811681036110aa5781018216602085015260e4359081831682036110aa5701166040830152606435916001600160a01b03918284168094036105b957506084358015158091036110aa5760a435908115158092036110aa57602435948486168096036110aa57600435958587168097036110aa57604435906001600160801b0382168092036110aa576040519761104089613000565b8852602088015260408701526060860152608085015260a084015260c08301526040610103193601126110aa576040519161107a83613039565b6101043591821682036110aa57826110a29260209452610124358482015260e0820152613b01565b604051908152f35b600080fd5b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d5760026040836001600160801b039360209552600b855220015416604051908152f35b50346105b95760203660031901126105b95761111b612f3d565b6001600160a01b03808354163381036111d5575081169081835260026020526001600160801b036040842054169081156111a45781611175918486526002602052604086206001600160801b0319815416905533906145fb565b6040519081527fca7a4a65a94ed2f37538814e00e1cd4c41a78261561e3f3794592f11409cf5af60203392a380f35b602483604051907f8410168c0000000000000000000000000000000000000000000000000000000082526004820152fd5b6040516331b339a960e21b81526001600160a01b03919091166004820152336024820152604490fd5b50346105b95760603660031901126105b95767ffffffffffffffff60043581811161048857611231903690600401612f9e565b9061123a612f53565b92604435908111610c5757611253903690600401612f9e565b61125e94919461459f565b8084036115b45791926001600160a01b038216159290865b818110611281578780f35b61128c818388614689565b359061129981858a614689565b356001600160801b03811681036110aa576112b261459f565b6112bb83613723565b6105a1576112df83600052600b6020526001600160a01b0360406000205416331490565b8015806115a4575b61057257838b5260056020526001600160a01b0360408c2054169080611591575b6115645787610516576001600160801b0382161561154c5761132984614661565b6001600160801b0381166001600160801b0384161161151a5750908a91848352600b80602052611399600261038a61136a868360408a20015460801c6146af565b918988528460205260408820019182906001600160801b036001600160801b031983549260801b169116179055565b6001600160801b036113bd816020840151169282604081835116920151169061375a565b1611156114ea575b8584526020526001600160a01b036001604085200154166113f06001600160801b0384168a836145fb565b6040516001600160801b0384168152867f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d60206001600160a01b038d1693a480331415806114e0575b611474575b5050507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce76020600193604051908152a101611276565b803b15610488576001600160a01b036084898580946001600160801b0360405197889687956313375c3b60e01b87528d60048801523360248801521660448601521660648401525af16114c8575b8061143e565b6114d190612fcf565b6114dc5788386114c2565b8880fd5b50803b1515611439565b858452806020526040842060018101600160c81b60ff60c81b1982541617905560ff60f01b1981541690556113c5565b60405163287ecaef60e21b8152600481018690526001600160801b038481166024830152919091166044820152606490fd5b6024846040519063d2aabcd960e01b82526004820152fd5b6064846001600160a01b038960405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b50806001600160a01b0388161415611308565b506115ae846146ca565b156112e7565b83604491604051917faec9344000000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b50346105b95760403660031901126105b957611605612f3d565b602435908115158092036110aa576001600160a01b0316908133146116785733835260086020526040832082600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a380f35b606460405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152fd5b50346105b9576101603660031901126105b9576116d761459f565b604051906116e482613000565b6116ec612f3d565b82526116f6612f53565b6020830152611703613093565b60408301526001600160a01b039060643582811681036110aa57606084015260843580151581036110aa57608084015260a43580151581036110aa5760a084015260603660c31901126105b9575060405161175d8161301d565b64ffffffffff60c43581811681036110aa57825260e43581811681036110aa5760208301526101043590811681036110aa57604082015260c08301526040610123193601126110aa57604051916117b383613039565b6101243591821682036110aa57826110a29260209452610144358482015260e0820152613b01565b50346105b957806003193601126105b957604051908060045491600183811c928185169485156118de575b60209586861081146118ca578588528794939291879082156118a857505060011461184e575b505061183a92500383613055565b610930604051928284938452830190612f18565b90859250600482527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5b85831061189057505061183a9350820101388061182c565b80548389018501528794508693909201918101611878565b925093505061183a94915060ff191682840152151560051b820101388061182c565b602483634e487b7160e01b81526022600452fd5b93607f1693611806565b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d57600160408364ffffffffff9360209552600b855220015460a01c16604051908152f35b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d57611974906139ff565b90600582101590816119b557600283149182156119c9575b82156119a0575b6020836040519015158152f35b9091506119b557506004602091143880611993565b80634e487b7160e01b602492526021600452fd5b50600383149150600061198c565b50346105b95760203660031901126105b9576004356001600160a01b039081811680910361048857818354163381036111d5575060015491816001600160a01b03198416176001556040519216825260208201527fdcb09aef4bf01068924ccce937981cbe59d25ba08380cf941aaaea4e4bd3960d60403392a280f35b50346105b95760203660031901126105b957604051611a7281612fe3565b8181528160208201528160408201528160608201528160808201528160a08201528160c08201528160e08201528161010082015281610120820152610140611ab8613699565b9101526004358152600b60205260ff600160408320015460d01c1615611c90576004358152600b60205260408120611b91600260405192611af884612fe3565b80546001600160a01b038116855264ffffffffff8160a01c16602086015264ffffffffff8160c81c16604086015260ff8160f01c161515606086015260f81c1515608085015260ff60018201546001600160a01b03811660a087015264ffffffffff8160a01c1660c0870152818160c81c16151560e0870152818160d01c16151561010087015260d81c161515610120850152016136b8565b610140820152611ba26004356139ff565b6005811015610f62579160026101a09314611c85575b50610885610140604051926001600160a01b03815116845264ffffffffff602082015116602085015264ffffffffff60408201511660408501526060810151151560608501526080810151151560808501526001600160a01b0360a08201511660a085015264ffffffffff60c08201511660c085015260e0810151151560e0850152610100810151151561010085015261012081015115156101208501520151610140830190604090816001600160801b0391828151168552826020820151166020860152015116910152565b606082015238611bb8565b602460405162b8e7e760e51b81526004356004820152fd5b50346105b957602090816003193601126105b95760043567ffffffffffffffff81116109b157611cdd83913690600401612f9e565b9190611ce761459f565b83925b808410611cf5578480f35b611d0484828497959697614689565b3594611d0e61459f565b611d1786613723565b15611d345760248660405190634a5541ef60e01b82526004820152fd5b611d3d86613789565b611fb157611d6186600052600b6020526001600160a01b0360406000205416331490565b15611f9257611d6f866137ba565b95808552600b90818752611d88600260408820016136b8565b906001600160801b039283835116848b161015611f7a5781885280895260ff604089205460f01c1615611f6257611dd88a858b611dce60409a9b9c9d9e8389511661375a565b960151169061375a565b92828a52818b52868a20908b8b7f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa50845497600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8a1617865560038a8216968715611f48575b01998516998a6001600160801b03198254161790556001600160a01b0380991698899360058652818e822054169889965260019d8e912001541694611e858b85886145fb565b604080518a81526001600160801b0392831660208201529290911690820152606090a47ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce78b604051858152a1813b611ee9575b505050505001919093919293611cea565b813b15611f4457899493919285809460849360405197889687956372eba20360e01b875260048701526024860152604485015260648401525af1611f30575b808080611ed8565b611f3990612fcf565b610c57578487611f28565b8980fd5b60018101600160c81b60ff60c81b19825416179055611e3f565b602482604051906339c6dc7360e21b82526004820152fd5b602482604051906322cad1af60e11b82526004820152fd5b60405163216caf0d60e01b815260048101879052336024820152604490fd5b6024866040519063fe19f19f60e01b82526004820152fd5b50346105b9576020806003193601126109b15760043590611fe861459f565b818352600b815260ff600160408520015460d01c16156121a95761200b826139ff565b600581101561219557600481036120345760248360405190634a5541ef60e01b82526004820152fd5b60038103612054576024836040519063fe19f19f60e01b82526004820152fd5b600214611f7a5761207b82600052600b6020526001600160a01b0360406000205416331490565b1561217657818352600b815260ff604084205460f01c1615611f6257818352600b81526040832060ff60f01b19815416905582604051837f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f8380a2600583526001600160a01b03604083205416803b61211e575b5050507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce791604051908152a180f35b803b1561048857816024818580947f341a0bd90000000000000000000000000000000000000000000000000000000083528960048401525af1612162575b806120ef565b61216b90612fcf565b61048857823861215c565b60405163216caf0d60e01b815260048101839052336024820152604490fd5b602484634e487b7160e01b81526021600452fd5b6024826040519062b8e7e760e51b82526004820152fd5b50346105b95760203660031901126105b9576004356001600160a01b039081811680910361048857818354163381036111d55750600a5491816001600160a01b0319841617600a556040519216825260208201527fa2548bd4b805e907c1558a47b5858324fe8bb4a2e1ddfca647eecbf65610eebc60403392a2600954600019810190811161227d5760407f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c91815190600182526020820152a180f35b602482634e487b7160e01b81526011600452fd5b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d5760408264ffffffffff9260209452600b8452205460c81c16604051908152f35b50346105b95760203660031901126105b9576122fb612f3d565b9080546001600160a01b038082169333850361234d576001600160a01b03199394501691829116178255337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808380a380f35b6040516331b339a960e21b81526001600160a01b0386166004820152336024820152604490fd5b50346105b95760203660031901126105b9576001600160a01b03612396612f3d565b1680156123b3578160409160209352600683522054604051908152f35b608460405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e657200000000000000000000000000000000000000000000006064820152fd5b50346105b95760203660031901126105b9576001600160a01b0360406020926004356124626108c08260005260056020526001600160a01b0360406000205416151590565b815260058452205416604051908152f35b50346105b95760203660031901126105b95760206124926004356130f4565b6001600160a01b0360405191168152f35b50346105b957806003193601126105b95760206001600160a01b0360015416604051908152f35b50346105b95760203660031901126105b95760ff6001604060043593848152600b60205220015460d01c161561065d5761072a602091613a86565b50346105b95760203660031901126105b95760043590818152600b60205260ff600160408320015460d01c16156121a95780612540836139ff565b92600584101561257b57600260209403612561575b50506040519015158152f35b8152600b8352604090205460f01c60ff1690503880612555565b602482634e487b7160e01b81526021600452fd5b50346105b95760203660031901126105b9576004356125ac61459f565b6125b581613723565b156126e8576125c3816146ca565b156126c8576125d1816130f4565b6125da826136ec565b1590816126c0575b816126ad575b506126955760208161261a7ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7936130f4565b90808552600783526001600160a01b0360408620926001600160a01b03199384815416905516918286526006845260408620600019815401905581865260058452604086209081541690558085604051937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a48152a180f35b60249060405190630da9b01360e01b82526004820152fd5b6001600160a01b039150161515386125e8565b8391506125e2565b60405163216caf0d60e01b81526004810191909152336024820152604490fd5b602490604051907f817cd6390000000000000000000000000000000000000000000000000000000082526004820152fd5b50346105b95761272836612f69565b60405191602083019383851067ffffffffffffffff86111761275357610ef2946040528584526131c7565b634e487b7160e01b600052604160045260246000fd5b50346105b95760203660031901126105b9576020610601600435613723565b50346105b9576020806003193601126109b157600435906127a761459f565b6127b082613723565b156127cd5760248260405190634a5541ef60e01b82526004820152fd5b906127d781613789565b612a0e576127fb81600052600b6020526001600160a01b0360406000205416331490565b156126c857612809816137ba565b818452600b835261281f600260408620016136b8565b926001600160801b03918285511683821610156129f657838652600b825260ff604087205460f01c16156129de5792827ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce783612894878460409761288a8d9b61293f9b8e511661375a565b9b0151169061375a565b92848852600b825287868120947f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa50865491600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841617885560038582169889156129c4575b01948d169c858e6001600160801b0319819854161790556001600160a01b038094169b8c94600589526001818e892054169d8e98600b8c52200154169685886145fb565b604080518b81526001600160801b0392831660208201529290911690820152606090a4604051848152a1823b612973578480f35b823b15610c5757608492859160405197889687956372eba20360e01b875260048701526024860152604485015260648401525af16129b5575b81818080808480f35b6129be90612fcf565b386129ac565b60018101600160c81b60ff60c81b198254161790556128fb565b602484604051906339c6dc7360e21b82526004820152fd5b602484604051906322cad1af60e11b82526004820152fd5b6024906040519063fe19f19f60e01b82526004820152fd5b50346105b95760203660031901126105b9576001600160801b0360406020926001600160a01b03612a55612f3d565b16815260028452205416604051908152f35b50346105b957610ef2612a7936612f69565b91612a8c612a87843361325d565b613156565b61333c565b50346105b957806003193601126105b9576020600954604051908152f35b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d57612ae8906139ff565b9060058210156119b55760208215838115612b09575b506040519015158152f35b600191501482612afe565b50346105b95760203660031901126105b95760043590818152600b60205260ff600160408320015460d01c16156121a957602091604082828152600b85522060ff815460f01c1680612ba2575b612b79575b50506001600160801b0360405191168152f35b612b9b92506001600160801b036002612b9592015416916137ba565b9061375a565b3880612b66565b5060ff600182015460c81c1615612b61565b50346105b95760403660031901126105b957612bce612f3d565b602435906001600160a01b038080612be5856130f4565b16921691808314612cd957803314908115612cb8575b5015612c4e57828452600760205260408420826001600160a01b0319825416179055612c26836130f4565b167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258480a480f35b608460405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152fd5b9050845260086020526040842033855260205260ff60408520541638612bfb565b608460405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152fd5b50346105b95760203660031901126105b9576020612492600435613119565b50346105b957806003193601126105b957604051908060035491600183811c92818516948515612e1a575b60209586861081146118ca578588528794939291879082156118a8575050600114612dc057505061183a92500383613055565b90859250600382527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b858310612e0257505061183a9350820101388061182c565b80548389018501528794508693909201918101612dea565b93607f1693612d8d565b9050346109b15760203660031901126109b1576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361048857602092507f80ac58cd000000000000000000000000000000000000000000000000000000008114908115612ecb575b8115612ea1575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501438612e9a565b7f5b5e139f0000000000000000000000000000000000000000000000000000000081149150612e93565b60005b838110612f085750506000910152565b8181015183820152602001612ef8565b90602091612f3181518092818552858086019101612ef5565b601f01601f1916010190565b600435906001600160a01b03821682036110aa57565b602435906001600160a01b03821682036110aa57565b60609060031901126110aa576001600160a01b039060043582811681036110aa579160243590811681036110aa579060443590565b9181601f840112156110aa5782359167ffffffffffffffff83116110aa576020808501948460051b0101116110aa57565b67ffffffffffffffff811161275357604052565b610160810190811067ffffffffffffffff82111761275357604052565b610100810190811067ffffffffffffffff82111761275357604052565b6060810190811067ffffffffffffffff82111761275357604052565b6040810190811067ffffffffffffffff82111761275357604052565b90601f8019910116810190811067ffffffffffffffff82111761275357604052565b67ffffffffffffffff811161275357601f01601f191660200190565b604435906001600160801b03821682036110aa57565b156130b057565b606460405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152fd5b60005260056020526001600160a01b03604060002054166131168115156130a9565b90565b61313c6108c08260005260056020526001600160a01b0360406000205416151590565b60005260076020526001600160a01b036040600020541690565b1561315d57565b608460405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f766564000000000000000000000000000000000000006064820152fd5b906131eb9392916131db612a87843361325d565b6131e683838361333c565b613507565b156131f257565b60405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b906001600160a01b038080613271846130f4565b169316918383149384156132a4575b50831561328e575b50505090565b61329a91929350613119565b1614388080613288565b909350600052600860205260406000208260005260205260ff604060002054169238613280565b156132d257565b608460405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152fd5b90613365929161334b836130f4565b916001600160a01b039485938480941696879116146132cb565b169081158061346e57613377846136ec565b159081613465575b508061345c575b61344457918084926133c67ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7966020966133bf856130f4565b16146132cb565b60009382855260078652604085206001600160a01b031990818154169055818652600687526040862060001981540190558286526040862060018154019055838652600587528260408720918254161790557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6040519580a48152a1565b60248360405190630da9b01360e01b82526004820152fd5b50831515613386565b9050153861337f565b608460405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152fd5b3d15613502573d906134e882613077565b916134f66040519384613055565b82523d6000602084013e565b606090565b9290803b1561369057613571916020916001600160a01b0394604051809581948293897f150b7a02000000000000000000000000000000000000000000000000000000009b8c86523360048701521660248501526044840152608060648401526084830190612f18565b03916000968791165af190829082613630575b505061360a576135926134d7565b805190816136055760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000161490565b909192506020813d8211613688575b8161364c60209383613055565b810103126109b15751907fffffffff00000000000000000000000000000000000000000000000000000000821682036105b95750903880613584565b3d915061363f565b50505050600190565b604051906136a68261301d565b60006040838281528260208201520152565b906040516136c58161301d565b6040819360018154916001600160801b0392838116865260801c6020860152015416910152565b80600052600b60205260ff60016040600020015460d01c161561065d57600052600b60205260ff60016040600020015460d81c1690565b80600052600b60205260ff60016040600020015460d01c161561065d57600052600b60205260ff60016040600020015460c81c1690565b6001600160801b03918216908216039190821161377357565b634e487b7160e01b600052601160045260246000fd5b80600052600b60205260ff60016040600020015460d01c161561065d57600052600b60205260406000205460f81c90565b600090808252600b6020526040822091825464ffffffffff42818360c81c16116138685780600186015460a01c169182421015613852576138079394955060a01c16809103904203613870565b90828152600b6020526001600160801b039261382d846002604085200154168094613950565b92831161383a5750501690565b60029350604092508152600b60205220015460801c90565b505050505060026001600160801b039101541690565b505091505090565b670de0b6b3a764000091600019838309928083029283808610950394808603951461392c57828510156138f057908291096001821901821680920460028082600302188083028203028083028203028083028203028083028203028083028203028092029003029360018380600003040190848311900302920304170290565b82606492604051927f63a05778000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b50508092501561393a570490565b634e487b7160e01b600052601260045260246000fd5b909190600019838209838202918280831092039180830392146139ee57670de0b6b3a764000090818310156139b757947faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066994950990828211900360ee1b910360121c170290565b60449086604051917f5173648d00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050670de0b6b3a764000090049150565b80600052600b602052604060002060ff600182015460c81c16600014613a26575050600490565b805460f81c613a7f575460a01c64ffffffffff164210613a7957613a49816137ba565b90600052600b6020526001600160801b038060026040600020015416911610600014613a7457600190565b600290565b50600090565b5050600390565b80600052600b602052613a9f60026040600020016136b8565b81600052600b602052604060002060ff600182015460c81c16600014613ad257506001600160801b039150602001511690565b5460f81c613ae45750613116906137ba565b61311691506001600160801b03604081835116920151169061375a565b906001600160a01b036001541660206001600160a01b036060850151166024604051809481937fdcf844a700000000000000000000000000000000000000000000000000000000835260048301525afa801561433657600090614302575b613b8291506001600160801b0360408501511690602060e0860151015191614733565b916001600160801b0383511660c082015190156142d85764ffffffffff815116602082019064ffffffffff8251169081811161429857505064ffffffffff604091511691019064ffffffffff825116908181101561425857505064ffffffffff8042169151169081811015614218575050600954926001600160801b0381511660405190613c0f8261301d565b815260006020820152600060408201526001600160a01b036060840151169060c08401519164ffffffffff6020840151169064ffffffffff604085015116906080870151151560a088015115159364ffffffffff6001600160a01b038a511697511660405197613c7e89612fe3565b88526020880152604087015260608601526000608086015260a085015260c0840152600060e0840152600161010084015261012083015261014082015284600052600b60205260406000206001600160a01b038251166001600160a01b0319825416178155613d1564ffffffffff602084015116829064ffffffffff60a01b1964ffffffffff60a01b83549260a01b169116179055565b604082015181547eff0000000000000000000000000000000000000000000000000000000000006060850151151560f01b169078ffffffffffffffffffffffffffffffffffffffffffffffffff7dffffffffff000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000006080880151151560f81b169460c81b1691161717178155600181016001600160a01b0360a0840151166001600160a01b0319825416178155613e0c64ffffffffff60c085015116829064ffffffffff60a01b1964ffffffffff60a01b83549260a01b169116179055565b60e083015181546101008501516101208601517fffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff90921692151560c81b79ff00000000000000000000000000000000000000000000000000169290921791151560d01b7aff0000000000000000000000000000000000000000000000000000169190911790151560d81b7bff00000000000000000000000000000000000000000000000000000016179055610140909101518051602082015160801b6001600160801b03199081166001600160801b03928316176002850155926040906003019201511682825416179055600185016009556001600160a01b0360608401511660005260026020526001600160801b0380604060002054168160208501511601166001600160a01b036060850151166000526040600020918254161790556001600160a01b0360208301511680156141d457613f87613f818660005260056020526001600160a01b0360406000205416151590565b156144bc565b613f90856136ec565b15806141cb575b806141c3575b6141ab5760207ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce791613fe8613f818860005260056020526001600160a01b0360406000205416151590565b806000526006825260406000206001815401905586600052600582526040600020816001600160a01b0319825416179055866040519160007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4868152a16140786001600160a01b036060840151166001600160801b03808451168160208601511601169030903390614342565b6001600160801b036040820151168061417c575b506001600160a01b038251167f075861cbceafeb777e8f15f357121b08f6f3adba387d599bb7b5278ca6192df5610160866001600160a01b03602087015116946141736001600160a01b03606089015116976080810151151560a082015115159061413d6001600160a01b0360e060c08601519501515116956040519788523360208901526040880190604090816001600160801b0391828151168552826020820151166020860152015116910152565b60a086015260c0850152805164ffffffffff90811660e08601526020820151811661010086015260409091015116610120840152565b610140820152a4565b6141a5906001600160a01b036060850151166001600160a01b0360e08601515116903390614342565b3861408c565b60248560405190630da9b01360e01b82526004820152fd5b506000613f9d565b50801515613f97565b606460405162461bcd60e51b815260206004820152602060248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152fd5b6040517f210aec0e00000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b6040517f9fee269100000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b6040517f4c23297000000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b60046040517f6095d3bc000000000000000000000000000000000000000000000000000000008152fd5b6020823d60201161432e575b8161431b60209383613055565b810103126105b95750613b829051613b5f565b3d915061430e565b6040513d6000823e3d90fd5b9290604051927f23b872dd0000000000000000000000000000000000000000000000000000000060208501526001600160a01b03809216602485015216604483015260648201526064815260a081019181831067ffffffffffffffff841117612753576143b1926040526143b3565b565b6001600160a01b0316906144136040516143cc81613039565b6020938482527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564858301526000808587829751910182855af161440d6134d7565b91614507565b805191821591848315614498575b50505090501561442e5750565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b9193818094500103126109b1578201519081151582036105b9575080388084614421565b156144c357565b606460405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152fd5b91929015614568575081511561451b575090565b3b156145245790565b606460405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b82519091501561457b5750805190602001fd5b6104fa9060405191829162461bcd60e51b8352602060048401526024830190612f18565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036145d157565b60046040517fa1c0d6e5000000000000000000000000000000000000000000000000000000008152fd5b916001600160a01b03604051927fa9059cbb000000000000000000000000000000000000000000000000000000006020850152166024830152604482015260448152608081019181831067ffffffffffffffff841117612753576143b1926040526143b3565b6131169061466e81613a86565b90600052600b60205260026040600020015460801c9061375a565b91908110156146995760051b0190565b634e487b7160e01b600052603260045260246000fd5b9190916001600160801b038080941691160191821161377357565b60009080825260056020526001600160a01b03806040842054169283331493841561470f575b505082156146fd57505090565b90915061470a3392613119565b161490565b60ff92945090604091815260086020528181203382526020522054169138806146f0565b90929161473e613699565b936001600160801b039283811691821561484a5767016345785d8a0000808211614813578085116147dc575061478885614779819386613950565b16946020890195865284613950565b16918461479f6040890194808652828751166146af565b1610156147c6576147b88491826147c19551169061375a565b9151169061375a565b168252565b634e487b7160e01b600052600160045260246000fd5b84604491604051917f4fea5c1a00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b60449250604051917f47152d6700000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050505050905060405161485d8161301d565b6000815260006020820152600060408201529056fea164736f6c6343000815000a"; + hex"60a034620003e757601f196001600160401b03601f62004c523881900382810185168601919084831187841017620003ec57808792606094604052833981010312620003e75783516001600160a01b03928382169291839003620003e7576020918287015196858816809803620003e75760400151948516809503620003e7576200008962000402565b90601c82527f5361626c696572205632204c6f636b7570204c696e656172204e46540000000084830152620000bd62000402565b601181527029a0a116ab1916a627a1a5aaa816a624a760791b8582015230608052600080546001600160a01b031990811688178255600180548216909b178b5596817fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a38351858111620003d35760039485548c81811c91168015620003c8575b89821014620003b45790818684931162000361575b508890868311600114620002f8578492620002ec575b505060001982871b1c1916908b1b1784555b8151948511620002d8576004958654998b8b811c9b168015620002cd575b828c1014620002ba57848b1162000271575b869798999a50819487116001146200020a57505093620001fe575b505082871b92600019911b1c19161790555b600a541617600a5560095560405161482f9081620004238239608051816145590152f35b015191503880620001c8565b8883528183208c9890969594939116915b8282106200025757505085116200023c575b50505050811b019055620001da565b01519060f884600019921b161c19169055388080806200022d565b8484015187558c989096019593840193908101906200021b565b87835281832085880160051c81019b838910620002af575b860160051c019a8c905b8c8110620002a3575050620001ad565b848155018c9062000293565b909b508b9062000289565b634e487b7160e01b835260228852602483fd5b9a607f169a6200019b565b634e487b7160e01b81526041600452602490fd5b0151905038806200016b565b908c8e9416918886528a862092865b8c82821062000341575050841162000328575b505050811b0184556200017d565b015160001983891b60f8161c191690553880806200031a565b91929395968291958786015181550195019301908f959493929162000307565b9091508684528884208680850160051c8201928b8610620003aa575b918f91869594930160051c01915b8281106200039b57505062000155565b8681558594508f91016200038b565b925081926200037d565b634e487b7160e01b84526022600452602484fd5b90607f169062000140565b634e487b7160e01b82526041600452602482fd5b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620003ec5760405256fe608080604052600436101561001357600080fd5b600090813560e01c90816301ffc9a714612dd45750806306fdde0314612d12578063081812fc14612cf3578063095ea7b314612b645780631400ecec14612ac45780631c1cdd4c14612a5f5780631e99d56914612a4157806323b872dd14612a1757806339a73c03146129d657806340e58ee514612738578063425d30dd1461271957806342842e0e146126c957806342966c681461253f5780634857501f146124b55780634869e12d1461247a5780635fe3b567146124535780636352211e146124235780636d0cee75146123cd57806370a082311461232457806375829def14612291578063780a82c8146122415780637cad6cd1146121705780637de6b1db14611f905780638659c27014611c6f578063894e9a0d14611a1b5780638bad38dd1461199e5780638f69b993146119025780639067b677146118af57806395d89b41146117a257806396ce143114611683578063a22cb465146115b2578063a2ffb897146111c5578063a6202bf2146110c8578063a80fc07114611076578063ab167ccc14610f3d578063ad35efd414610edb578063b256456914610ebc578063b88d4fde14610e32578063b8a3be6614610dfd578063b971302a14610dae578063bc063e1a14610d8b578063bc2be1be14610d3b578063c156a11d146109c1578063c87b56dd14610887578063cc364f48146107d9578063d4dbd20b14610787578063d511609f1461073b578063d975dfed146106ef578063e985e9c51461069a578063ea5ead1914610674578063eac8f5b81461060b578063f590c176146105e2578063f851a440146105bc5763fdd46d601461027357600080fd5b346105b95760603660031901126105b95760043561028f612f03565b610297613043565b906102a061454f565b6102a9836136d3565b6105a1576102cd83600052600b6020526001600160a01b0360406000205416331490565b90811580610591575b61057257838552602092600584526001600160a01b0391826040882054169380610566575b61054057828116928315610516576001600160801b038084169384156104fe5761032489614611565b82811686116104ca5750938093926103ca9261038f6103578d9a99988d8c52600b8d52600260408d20015460801c61465f565b8c8b52600b8c5261038a600260408d20019182906001600160801b036001600160801b031983549260801b169116179055565b613668565b906103ab818c840151169282604081835116920151169061370a565b16111561049a575b898852600b895260016040892001541692836145ab565b82877f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d88604051868152a48233141580610490575b610432575b837ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce78688604051908152a180f35b823b1561048c57608484928360405195869485936313375c3b60e01b85528b6004860152336024860152604485015260648401525af1610474575b8080610404565b61047d90612f7f565b61048857823861046d565b8280fd5b8380fd5b50823b15156103ff565b898852600b89526040882060018101600160c81b60ff60c81b1982541617905560ff60f01b1981541690556103b3565b60405163287ecaef60e21b8152600481018b90526001600160801b03928316602482015291166044820152606490fd5b0390fd5b6024896040519063d2aabcd960e01b82526004820152fd5b60046040517fc61a0e9e000000000000000000000000000000000000000000000000000000008152fd5b858360649260405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b508383821614156102fb565b60405163216caf0d60e01b815260048101859052336024820152604490fd5b5061059b8461467a565b156102d6565b60248360405190634a5541ef60e01b82526004820152fd5b80fd5b50346105b957806003193601126105b9576001600160a01b036020915416604051908152f35b50346105b95760203660031901126105b9576020610601600435613739565b6040519015158152f35b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d5760016040836001600160a01b039360209552600b855220015416604051908152f35b6024906040519062b8e7e760e51b82526004820152fd5b50346105b95760403660031901126105b957600435610691612f03565b61029782614611565b50346105b95760403660031901126105b9576106b4612eed565b60406106be612f03565b926001600160a01b0380931681526008602052209116600052602052602060ff604060002054166040519015158152f35b50346105b95760203660031901126105b95760ff6001604060043593848152600b60205220015460d01c161561065d5761072a602091614611565b6001600160801b0360405191168152f35b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d5760408260029260209452600b845220015460801c604051908152f35b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d5760036040836001600160801b039360209552600b855220015416604051908152f35b50346105b95760203660031901126105b9576004356107f6613649565b50808252600b60205260ff600160408420015460d01c161561065d578160409160609352600b60205220600181549164ffffffffff918291015460a01c16906040519261084284612fcd565b818160a01c16845260c81c166020830152604082015261088560405180926040908164ffffffffff91828151168552826020820151166020860152015116910152565bf35b50346105b9576020806003193601126109b1576004356108c56108c08260005260056020526001600160a01b0360406000205416151590565b613059565b826001600160a01b03600a5416916044604051809481937fe9dc637500000000000000000000000000000000000000000000000000000000835230600484015260248301525afa9283156109b5578093610934575b5050610930604051928284938452830190612ec8565b0390f35b909192503d8082843e6109478184613005565b82019183818403126109b15780519067ffffffffffffffff8211610488570182601f820112156109b15780519161097d83613027565b9361098b6040519586613005565b8385528584840101116105b95750906109a991848085019101612ea5565b90388061091a565b5080fd5b604051903d90823e3d90fd5b50346105b95760403660031901126105b9576004356109de612f03565b906109e761454f565b808352602091600b835260ff600160408620015460d01c1615610d2457818452600583526001600160a01b03806040862054169081330361057257610a2b84614611565b906001600160801b0390818316918215938415610a52575b89610a4f8989896132ec565b80f35b610a5a61454f565b610a63886136d3565b610d0c57610a8788600052600b6020526001600160a01b0360406000205416331490565b94851580610cfc575b610cdd57888b5260058a528360408c2054169580610cd3575b610caf57861561051657610c9757610ac088614611565b8281168511610c67575090610b20610aed8b969594938a8852600b8c52600260408920015460801c61465f565b898752600b8b5261038a600260408920019182906001600160801b036001600160801b031983549260801b169116179055565b90610b3c818b840151169282604081835116920151169061370a565b161115610c37575b868452600b8852600160408520015416610b5f8286836145ab565b84877f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d8a604051868152a48133141580610c2d575b610bd2575b5050507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7610a4f94604051858152a13880808080610a43565b813b156104885782916084839260405194859384926313375c3b60e01b84528b600485015233602485015289604485015260648401525af1610c15575b80610b99565b610c1e90612f7f565b610c29578438610c0f565b8480fd5b50813b1515610b94565b868452600b88526040842060018101600160c81b60ff60c81b1982541617905560ff60f01b198154169055610b44565b60405163287ecaef60e21b8152600481018a90526001600160801b03928316602482015291166044820152606490fd5b6024886040519063d2aabcd960e01b82526004820152fd5b6064898860405191632dcbf6b960e11b835260048301523360248301526044820152fd5b5085871415610aa9565b60405163216caf0d60e01b8152600481018a9052336024820152604490fd5b50610d068961467a565b15610a90565b60248860405190634a5541ef60e01b82526004820152fd5b6024826040519062b8e7e760e51b82526004820152fd5b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d5760408264ffffffffff9260209452600b8452205460a01c16604051908152f35b50346105b957806003193601126105b957602060405167016345785d8a00008152f35b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d576040826001600160a01b039260209452600b8452205416604051908152f35b50346105b95760203660031901126105b95760ff600160406020936004358152600b855220015460d01c166040519015158152f35b50346105b95760803660031901126105b957610e4c612eed565b610e54612f03565b906064359067ffffffffffffffff821161048c573660238301121561048c5781600401359284610e8385613027565b93610e916040519586613005565b85855236602487830101116109b15785610a4f96602460209301838801378501015260443591613177565b50346105b95760203660031901126105b957602061060160043561369c565b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d57610f14906139af565b604051906005811015610f2957602092508152f35b602483634e487b7160e01b81526021600452fd5b50346105b9576101403660031901126105b957610f5861454f565b610f60613649565b9064ffffffffff80421680845260c43582811681036110715781018216602085015260e4359081831682036110715701166040830152606435916001600160a01b03918284168094036105b957506084358015158091036110715760a435908115158092036110715760243594848616809603611071576004359585871680970361107157604435906001600160801b038216809203611071576040519761100789612fb0565b8852602088015260408701526060860152608085015260a084015260c0830152604061010319360112611071576040519161104183612fe9565b61010435918216820361107157826110699260209452610124358482015260e0820152613ab1565b604051908152f35b600080fd5b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d5760026040836001600160801b039360209552600b855220015416604051908152f35b50346105b95760203660031901126105b9576110e2612eed565b6001600160a01b038083541633810361119c575081169081835260026020526001600160801b0360408420541690811561116b578161113c918486526002602052604086206001600160801b0319815416905533906145ab565b6040519081527fca7a4a65a94ed2f37538814e00e1cd4c41a78261561e3f3794592f11409cf5af60203392a380f35b602483604051907f8410168c0000000000000000000000000000000000000000000000000000000082526004820152fd5b6040516331b339a960e21b81526001600160a01b03919091166004820152336024820152604490fd5b50346105b95760603660031901126105b95767ffffffffffffffff600435818111610488576111f8903690600401612f4e565b90611201612f03565b92604435908111610c295761121a903690600401612f4e565b61122594919461454f565b80840361157b5791926001600160a01b038216159290865b818110611248578780f35b611253818388614639565b359061126081858a614639565b356001600160801b03811681036110715761127961454f565b611282836136d3565b6105a1576112a683600052600b6020526001600160a01b0360406000205416331490565b80158061156b575b61057257838b5260056020526001600160a01b0360408c2054169080611558575b61152b5787610516576001600160801b03821615611513576112f084614611565b6001600160801b0381166001600160801b038416116114e15750908a91848352600b80602052611360600261038a611331868360408a20015460801c61465f565b918988528460205260408820019182906001600160801b036001600160801b031983549260801b169116179055565b6001600160801b03611384816020840151169282604081835116920151169061370a565b1611156114b1575b8584526020526001600160a01b036001604085200154166113b76001600160801b0384168a836145ab565b6040516001600160801b0384168152867f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d60206001600160a01b038d1693a480331415806114a7575b61143b575b5050507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce76020600193604051908152a10161123d565b803b15610488576001600160a01b036084898580946001600160801b0360405197889687956313375c3b60e01b87528d60048801523360248801521660448601521660648401525af161148f575b80611405565b61149890612f7f565b6114a3578838611489565b8880fd5b50803b1515611400565b858452806020526040842060018101600160c81b60ff60c81b1982541617905560ff60f01b19815416905561138c565b60405163287ecaef60e21b8152600481018690526001600160801b038481166024830152919091166044820152606490fd5b6024846040519063d2aabcd960e01b82526004820152fd5b6064846001600160a01b038960405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b50806001600160a01b03881614156112cf565b506115758461467a565b156112ae565b83604491604051917faec9344000000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b50346105b95760403660031901126105b9576115cc612eed565b60243590811515809203611071576001600160a01b03169081331461163f5733835260086020526040832082600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a380f35b606460405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152fd5b50346105b9576101603660031901126105b95761169e61454f565b604051906116ab82612fb0565b6116b3612eed565b82526116bd612f03565b60208301526116ca613043565b60408301526001600160a01b03906064358281168103611071576060840152608435801515810361107157608084015260a43580151581036110715760a084015260603660c31901126105b9575060405161172481612fcd565b64ffffffffff60c435818116810361107157825260e435818116810361107157602083015261010435908116810361107157604082015260c0830152604061012319360112611071576040519161177a83612fe9565b61012435918216820361107157826110699260209452610144358482015260e0820152613ab1565b50346105b957806003193601126105b957604051908060045491600183811c928185169485156118a5575b60209586861081146118915785885287949392918790821561186f575050600114611815575b505061180192500383613005565b610930604051928284938452830190612ec8565b90859250600482527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5b858310611857575050611801935082010138806117f3565b8054838901850152879450869390920191810161183f565b925093505061180194915060ff191682840152151560051b82010138806117f3565b602483634e487b7160e01b81526022600452fd5b93607f16936117cd565b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d57600160408364ffffffffff9360209552600b855220015460a01c16604051908152f35b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d5761193b906139af565b906005821015908161197c5760028314918215611990575b8215611967575b6020836040519015158152f35b90915061197c5750600460209114388061195a565b80634e487b7160e01b602492526021600452fd5b506003831491506000611953565b50346105b95760203660031901126105b9576004356001600160a01b0390818116809103610488578183541633810361119c575060015491816001600160a01b03198416176001556040519216825260208201527fdcb09aef4bf01068924ccce937981cbe59d25ba08380cf941aaaea4e4bd3960d60403392a280f35b50346105b95760203660031901126105b957604051611a3981612f93565b8181528160208201528160408201528160608201528160808201528160a08201528160c08201528160e08201528161010082015281610120820152610140611a7f613649565b9101526004358152600b60205260ff600160408320015460d01c1615611c57576004358152600b60205260408120611b58600260405192611abf84612f93565b80546001600160a01b038116855264ffffffffff8160a01c16602086015264ffffffffff8160c81c16604086015260ff8160f01c161515606086015260f81c1515608085015260ff60018201546001600160a01b03811660a087015264ffffffffff8160a01c1660c0870152818160c81c16151560e0870152818160d01c16151561010087015260d81c16151561012085015201613668565b610140820152611b696004356139af565b6005811015610f29579160026101a09314611c4c575b50610885610140604051926001600160a01b03815116845264ffffffffff602082015116602085015264ffffffffff60408201511660408501526060810151151560608501526080810151151560808501526001600160a01b0360a08201511660a085015264ffffffffff60c08201511660c085015260e0810151151560e0850152610100810151151561010085015261012081015115156101208501520151610140830190604090816001600160801b0391828151168552826020820151166020860152015116910152565b606082015238611b7f565b602460405162b8e7e760e51b81526004356004820152fd5b50346105b957602090816003193601126105b95760043567ffffffffffffffff81116109b157611ca483913690600401612f4e565b9190611cae61454f565b83925b808410611cbc578480f35b611ccb84828497959697614639565b3594611cd561454f565b611cde866136d3565b15611cfb5760248660405190634a5541ef60e01b82526004820152fd5b611d0486613739565b611f7857611d2886600052600b6020526001600160a01b0360406000205416331490565b15611f5957611d368661376a565b95808552600b90818752611d4f60026040882001613668565b906001600160801b039283835116848b161015611f415781885280895260ff604089205460f01c1615611f2957611d9f8a858b611d9560409a9b9c9d9e8389511661370a565b960151169061370a565b92828a52818b52868a20908b8b7f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa50845497600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8a1617865560038a8216968715611f0f575b01998516998a6001600160801b03198254161790556001600160a01b0380991698899360058652818e822054169889965260019d8e912001541694611e4c8b85886145ab565b604080518a81526001600160801b0392831660208201529290911690820152606090a47ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce78b604051858152a1813b611eb0575b505050505001919093919293611cb1565b813b15611f0b57899493919285809460849360405197889687956372eba20360e01b875260048701526024860152604485015260648401525af1611ef7575b808080611e9f565b611f0090612f7f565b610c29578487611eef565b8980fd5b60018101600160c81b60ff60c81b19825416179055611e06565b602482604051906339c6dc7360e21b82526004820152fd5b602482604051906322cad1af60e11b82526004820152fd5b60405163216caf0d60e01b815260048101879052336024820152604490fd5b6024866040519063fe19f19f60e01b82526004820152fd5b50346105b9576020806003193601126109b15760043590611faf61454f565b818352600b815260ff600160408520015460d01c1615610d2457611fd2826139af565b600581101561215c5760048103611ffb5760248360405190634a5541ef60e01b82526004820152fd5b6003810361201b576024836040519063fe19f19f60e01b82526004820152fd5b600214611f415761204282600052600b6020526001600160a01b0360406000205416331490565b1561213d57818352600b815260ff604084205460f01c1615611f2957818352600b81526040832060ff60f01b19815416905582604051837f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f8380a2600583526001600160a01b03604083205416803b6120e5575b5050507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce791604051908152a180f35b803b1561048857816024818580947f341a0bd90000000000000000000000000000000000000000000000000000000083528960048401525af1612129575b806120b6565b61213290612f7f565b610488578238612123565b60405163216caf0d60e01b815260048101839052336024820152604490fd5b602484634e487b7160e01b81526021600452fd5b50346105b95760203660031901126105b9576004356001600160a01b0390818116809103610488578183541633810361119c5750600a5491816001600160a01b0319841617600a556040519216825260208201527fa2548bd4b805e907c1558a47b5858324fe8bb4a2e1ddfca647eecbf65610eebc60403392a2600954600019810190811161222d5760407f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c91815190600182526020820152a180f35b602482634e487b7160e01b81526011600452fd5b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d5760408264ffffffffff9260209452600b8452205460c81c16604051908152f35b50346105b95760203660031901126105b9576122ab612eed565b9080546001600160a01b03808216933385036122fd576001600160a01b03199394501691829116178255337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808380a380f35b6040516331b339a960e21b81526001600160a01b0386166004820152336024820152604490fd5b50346105b95760203660031901126105b9576001600160a01b03612346612eed565b168015612363578160409160209352600683522054604051908152f35b608460405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e657200000000000000000000000000000000000000000000006064820152fd5b50346105b95760203660031901126105b9576001600160a01b0360406020926004356124126108c08260005260056020526001600160a01b0360406000205416151590565b815260058452205416604051908152f35b50346105b95760203660031901126105b95760206124426004356130a4565b6001600160a01b0360405191168152f35b50346105b957806003193601126105b95760206001600160a01b0360015416604051908152f35b50346105b95760203660031901126105b95760ff6001604060043593848152600b60205220015460d01c161561065d5761072a602091613a36565b50346105b95760203660031901126105b95760043590818152600b60205260ff600160408320015460d01c1615610d2457806124f0836139af565b92600584101561252b57600260209403612511575b50506040519015158152f35b8152600b8352604090205460f01c60ff1690503880612505565b602482634e487b7160e01b81526021600452fd5b50346105b95760203660031901126105b95760043561255c61454f565b612565816136d3565b15612698576125738161467a565b1561267857612581816130a4565b61258a8261369c565b159081612670575b8161265d575b50612645576020816125ca7ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7936130a4565b90808552600783526001600160a01b0360408620926001600160a01b03199384815416905516918286526006845260408620600019815401905581865260058452604086209081541690558085604051937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a48152a180f35b60249060405190630da9b01360e01b82526004820152fd5b6001600160a01b03915016151538612598565b839150612592565b60405163216caf0d60e01b81526004810191909152336024820152604490fd5b602490604051907f817cd6390000000000000000000000000000000000000000000000000000000082526004820152fd5b50346105b9576126d836612f19565b60405191602083019383851067ffffffffffffffff86111761270357610a4f94604052858452613177565b634e487b7160e01b600052604160045260246000fd5b50346105b95760203660031901126105b95760206106016004356136d3565b50346105b9576020806003193601126109b1576004359061275761454f565b612760826136d3565b1561277d5760248260405190634a5541ef60e01b82526004820152fd5b9061278781613739565b6129be576127ab81600052600b6020526001600160a01b0360406000205416331490565b15612678576127b98161376a565b818452600b83526127cf60026040862001613668565b926001600160801b03918285511683821610156129a657838652600b825260ff604087205460f01c161561298e5792827ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce783612844878460409761283a8d9b6128ef9b8e511661370a565b9b0151169061370a565b92848852600b825287868120947f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa50865491600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84161788556003858216988915612974575b01948d169c858e6001600160801b0319819854161790556001600160a01b038094169b8c94600589526001818e892054169d8e98600b8c52200154169685886145ab565b604080518b81526001600160801b0392831660208201529290911690820152606090a4604051848152a1823b612923578480f35b823b15610c2957608492859160405197889687956372eba20360e01b875260048701526024860152604485015260648401525af1612965575b81818080808480f35b61296e90612f7f565b3861295c565b60018101600160c81b60ff60c81b198254161790556128ab565b602484604051906339c6dc7360e21b82526004820152fd5b602484604051906322cad1af60e11b82526004820152fd5b6024906040519063fe19f19f60e01b82526004820152fd5b50346105b95760203660031901126105b9576001600160801b0360406020926001600160a01b03612a05612eed565b16815260028452205416604051908152f35b50346105b957610a4f612a2936612f19565b91612a3c612a37843361320d565b613106565b6132ec565b50346105b957806003193601126105b9576020600954604051908152f35b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d57612a98906139af565b90600582101561197c5760208215838115612ab9575b506040519015158152f35b600191501482612aae565b50346105b95760203660031901126105b95760043590818152600b60205260ff600160408320015460d01c1615610d2457602091604082828152600b85522060ff815460f01c1680612b52575b612b29575b50506001600160801b0360405191168152f35b612b4b92506001600160801b036002612b45920154169161376a565b9061370a565b3880612b16565b5060ff600182015460c81c1615612b11565b50346105b95760403660031901126105b957612b7e612eed565b602435906001600160a01b038080612b95856130a4565b16921691808314612c8957803314908115612c68575b5015612bfe57828452600760205260408420826001600160a01b0319825416179055612bd6836130a4565b167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258480a480f35b608460405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152fd5b9050845260086020526040842033855260205260ff60408520541638612bab565b608460405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152fd5b50346105b95760203660031901126105b95760206124426004356130c9565b50346105b957806003193601126105b957604051908060035491600183811c92818516948515612dca575b60209586861081146118915785885287949392918790821561186f575050600114612d7057505061180192500383613005565b90859250600382527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b858310612db2575050611801935082010138806117f3565b80548389018501528794508693909201918101612d9a565b93607f1693612d3d565b9050346109b15760203660031901126109b1576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361048857602092507f80ac58cd000000000000000000000000000000000000000000000000000000008114908115612e7b575b8115612e51575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501438612e4a565b7f5b5e139f0000000000000000000000000000000000000000000000000000000081149150612e43565b60005b838110612eb85750506000910152565b8181015183820152602001612ea8565b90602091612ee181518092818552858086019101612ea5565b601f01601f1916010190565b600435906001600160a01b038216820361107157565b602435906001600160a01b038216820361107157565b6060906003190112611071576001600160a01b0390600435828116810361107157916024359081168103611071579060443590565b9181601f840112156110715782359167ffffffffffffffff8311611071576020808501948460051b01011161107157565b67ffffffffffffffff811161270357604052565b610160810190811067ffffffffffffffff82111761270357604052565b610100810190811067ffffffffffffffff82111761270357604052565b6060810190811067ffffffffffffffff82111761270357604052565b6040810190811067ffffffffffffffff82111761270357604052565b90601f8019910116810190811067ffffffffffffffff82111761270357604052565b67ffffffffffffffff811161270357601f01601f191660200190565b604435906001600160801b038216820361107157565b1561306057565b606460405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152fd5b60005260056020526001600160a01b03604060002054166130c6811515613059565b90565b6130ec6108c08260005260056020526001600160a01b0360406000205416151590565b60005260076020526001600160a01b036040600020541690565b1561310d57565b608460405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f766564000000000000000000000000000000000000006064820152fd5b9061319b93929161318b612a37843361320d565b6131968383836132ec565b6134b7565b156131a257565b60405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b906001600160a01b038080613221846130a4565b16931691838314938415613254575b50831561323e575b50505090565b61324a919293506130c9565b1614388080613238565b909350600052600860205260406000208260005260205260ff604060002054169238613230565b1561328257565b608460405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152fd5b9061331592916132fb836130a4565b916001600160a01b0394859384809416968791161461327b565b169081158061341e576133278461369c565b159081613415575b508061340c575b6133f457918084926133767ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce79660209661336f856130a4565b161461327b565b60009382855260078652604085206001600160a01b031990818154169055818652600687526040862060001981540190558286526040862060018154019055838652600587528260408720918254161790557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6040519580a48152a1565b60248360405190630da9b01360e01b82526004820152fd5b50831515613336565b9050153861332f565b608460405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152fd5b3d156134b2573d9061349882613027565b916134a66040519384613005565b82523d6000602084013e565b606090565b9290803b1561364057613521916020916001600160a01b0394604051809581948293897f150b7a02000000000000000000000000000000000000000000000000000000009b8c86523360048701521660248501526044840152608060648401526084830190612ec8565b03916000968791165af1908290826135e0575b50506135ba57613542613487565b805190816135b55760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000161490565b909192506020813d8211613638575b816135fc60209383613005565b810103126109b15751907fffffffff00000000000000000000000000000000000000000000000000000000821682036105b95750903880613534565b3d91506135ef565b50505050600190565b6040519061365682612fcd565b60006040838281528260208201520152565b9060405161367581612fcd565b6040819360018154916001600160801b0392838116865260801c6020860152015416910152565b80600052600b60205260ff60016040600020015460d01c161561065d57600052600b60205260ff60016040600020015460d81c1690565b80600052600b60205260ff60016040600020015460d01c161561065d57600052600b60205260ff60016040600020015460c81c1690565b6001600160801b03918216908216039190821161372357565b634e487b7160e01b600052601160045260246000fd5b80600052600b60205260ff60016040600020015460d01c161561065d57600052600b60205260406000205460f81c90565b600090808252600b6020526040822091825464ffffffffff42818360c81c16116138185780600186015460a01c169182421015613802576137b79394955060a01c16809103904203613820565b90828152600b6020526001600160801b03926137dd846002604085200154168094613900565b9283116137ea5750501690565b60029350604092508152600b60205220015460801c90565b505050505060026001600160801b039101541690565b505091505090565b670de0b6b3a76400009160001983830992808302928380861095039480860395146138dc57828510156138a057908291096001821901821680920460028082600302188083028203028083028203028083028203028083028203028083028203028092029003029360018380600003040190848311900302920304170290565b82606492604051927f63a05778000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b5050809250156138ea570490565b634e487b7160e01b600052601260045260246000fd5b9091906000198382098382029182808310920391808303921461399e57670de0b6b3a7640000908183101561396757947faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066994950990828211900360ee1b910360121c170290565b60449086604051917f5173648d00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050670de0b6b3a764000090049150565b80600052600b602052604060002060ff600182015460c81c166000146139d6575050600490565b805460f81c613a2f575460a01c64ffffffffff164210613a29576139f98161376a565b90600052600b6020526001600160801b038060026040600020015416911610600014613a2457600190565b600290565b50600090565b5050600390565b80600052600b602052613a4f6002604060002001613668565b81600052600b602052604060002060ff600182015460c81c16600014613a8257506001600160801b039150602001511690565b5460f81c613a9457506130c69061376a565b6130c691506001600160801b03604081835116920151169061370a565b906001600160a01b036001541660206001600160a01b036060850151166024604051809481937fdcf844a700000000000000000000000000000000000000000000000000000000835260048301525afa80156142e6576000906142b2575b613b3291506001600160801b0360408501511690602060e08601510151916146e3565b916001600160801b0383511660c082015190156142885764ffffffffff815116602082019064ffffffffff8251169081811161424857505064ffffffffff604091511691019064ffffffffff825116908181101561420857505064ffffffffff80421691511690818110156141c8575050600954926001600160801b0381511660405190613bbf82612fcd565b815260006020820152600060408201526001600160a01b036060840151169060c08401519164ffffffffff6020840151169064ffffffffff604085015116906080870151151560a088015115159364ffffffffff6001600160a01b038a511697511660405197613c2e89612f93565b88526020880152604087015260608601526000608086015260a085015260c0840152600060e0840152600161010084015261012083015261014082015284600052600b60205260406000206001600160a01b038251166001600160a01b0319825416178155613cc564ffffffffff602084015116829064ffffffffff60a01b1964ffffffffff60a01b83549260a01b169116179055565b604082015181547eff0000000000000000000000000000000000000000000000000000000000006060850151151560f01b169078ffffffffffffffffffffffffffffffffffffffffffffffffff7dffffffffff000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000006080880151151560f81b169460c81b1691161717178155600181016001600160a01b0360a0840151166001600160a01b0319825416178155613dbc64ffffffffff60c085015116829064ffffffffff60a01b1964ffffffffff60a01b83549260a01b169116179055565b60e083015181546101008501516101208601517fffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff90921692151560c81b79ff00000000000000000000000000000000000000000000000000169290921791151560d01b7aff0000000000000000000000000000000000000000000000000000169190911790151560d81b7bff00000000000000000000000000000000000000000000000000000016179055610140909101518051602082015160801b6001600160801b03199081166001600160801b03928316176002850155926040906003019201511682825416179055600185016009556001600160a01b0360608401511660005260026020526001600160801b0380604060002054168160208501511601166001600160a01b036060850151166000526040600020918254161790556001600160a01b03602083015116801561418457613f37613f318660005260056020526001600160a01b0360406000205416151590565b1561446c565b613f408561369c565b158061417b575b80614173575b61415b5760207ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce791613f98613f318860005260056020526001600160a01b0360406000205416151590565b806000526006825260406000206001815401905586600052600582526040600020816001600160a01b0319825416179055866040519160007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4868152a16140286001600160a01b036060840151166001600160801b038084511681602086015116011690309033906142f2565b6001600160801b036040820151168061412c575b506001600160a01b038251167f075861cbceafeb777e8f15f357121b08f6f3adba387d599bb7b5278ca6192df5610160866001600160a01b03602087015116946141236001600160a01b03606089015116976080810151151560a08201511515906140ed6001600160a01b0360e060c08601519501515116956040519788523360208901526040880190604090816001600160801b0391828151168552826020820151166020860152015116910152565b60a086015260c0850152805164ffffffffff90811660e08601526020820151811661010086015260409091015116610120840152565b610140820152a4565b614155906001600160a01b036060850151166001600160a01b0360e086015151169033906142f2565b3861403c565b60248560405190630da9b01360e01b82526004820152fd5b506000613f4d565b50801515613f47565b606460405162461bcd60e51b815260206004820152602060248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152fd5b6040517f210aec0e00000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b6040517f9fee269100000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b6040517f4c23297000000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b60046040517f6095d3bc000000000000000000000000000000000000000000000000000000008152fd5b6020823d6020116142de575b816142cb60209383613005565b810103126105b95750613b329051613b0f565b3d91506142be565b6040513d6000823e3d90fd5b9290604051927f23b872dd0000000000000000000000000000000000000000000000000000000060208501526001600160a01b03809216602485015216604483015260648201526064815260a081019181831067ffffffffffffffff8411176127035761436192604052614363565b565b6001600160a01b0316906143c360405161437c81612fe9565b6020938482527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564858301526000808587829751910182855af16143bd613487565b916144b7565b805191821591848315614448575b5050509050156143de5750565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b9193818094500103126109b1578201519081151582036105b95750803880846143d1565b1561447357565b606460405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152fd5b9192901561451857508151156144cb575090565b3b156144d45790565b606460405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b82519091501561452b5750805190602001fd5b6104fa9060405191829162461bcd60e51b8352602060048401526024830190612ec8565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361458157565b60046040517fa1c0d6e5000000000000000000000000000000000000000000000000000000008152fd5b916001600160a01b03604051927fa9059cbb000000000000000000000000000000000000000000000000000000006020850152166024830152604482015260448152608081019181831067ffffffffffffffff8411176127035761436192604052614363565b6130c69061461e81613a36565b90600052600b60205260026040600020015460801c9061370a565b91908110156146495760051b0190565b634e487b7160e01b600052603260045260246000fd5b9190916001600160801b038080941691160191821161372357565b60009080825260056020526001600160a01b0380604084205416928333149384156146bf575b505082156146ad57505090565b9091506146ba33926130c9565b161490565b60ff92945090604091815260086020528181203382526020522054169138806146a0565b9092916146ee613649565b936001600160801b03928381169182156147fa5767016345785d8a00008082116147c35780851161478c575061473885614729819386613900565b16946020890195865284613900565b16918461474f60408901948086528287511661465f565b161015614776576147688491826147719551169061370a565b9151169061370a565b168252565b634e487b7160e01b600052600160045260246000fd5b84604491604051917f4fea5c1a00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b60449250604051917f47152d6700000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050505050905060405161480d81612fcd565b6000815260006020820152600060408201529056fea164736f6c6343000815000a"; bytes public constant BYTECODE_NFT_DESCRIPTOR = hex"6080806040523461001757615dac90816200001d8239f35b600080fdfe6080604052600436101561001257600080fd5b60003560e01c63e9dc63751461002757600080fd5b346142f85760403660031901126142f8576001600160a01b0360043516600435036142f857610056608061486e565b60006080819052606060a081905260c082905260e0819052610120819052610140819052610160819052610180919091526101a0526004356001600160a01b03166101008190526100a690614c58565b61012052610100516040517feac8f5b80000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa908115614305576000916147dd575b506001600160a01b03610117911680608052615669565b60a052610100516040517fa80fc0710000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa8015614305576fffffffffffffffffffffffffffffffff916000916147be575b501660c052610100516040517fad35efd40000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa801561430557600090614781575b6101e59150615889565b61014052610100516040517f4869e12d0000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa90811561430557600091614752575b5060c0516fffffffffffffffffffffffffffffffff16801561473c576fffffffffffffffffffffffffffffffff612710819302160416610100608001526102876004356153c7565b610120608001526040514660208201526bffffffffffffffffffffffff1960043560601b16604082015260243560548201526054815280608081011067ffffffffffffffff60808301111761431157608081016040526020815191012061041a602963ffffffff61032e6103078261016861ffff8860101c160616614b08565b91601e604660ff6103248460146050848d60081c16060116614b08565b9816060116614b08565b6040519485927f68736c2800000000000000000000000000000000000000000000000000000000602085015261036e815180926020602488019101614826565b83017f2c0000000000000000000000000000000000000000000000000000000000000060248201526103aa825180936020602585019101614826565b017f252c00000000000000000000000000000000000000000000000000000000000060258201526103e5825180936020602785019101614826565b017f252900000000000000000000000000000000000000000000000000000000000060278201520360098101845201826148df565b6104526fffffffffffffffffffffffffffffffff6040608001511660ff61044b6001600160a01b03608051166155dc565b1690614e89565b6104666001600160a01b0360805116614c58565b60a051610100516040517fbc2be1be0000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa80156143055760249160009161471d575b5060206001600160a01b03608080015116604051938480927f9067b677000000000000000000000000000000000000000000000000000000008252823560048301525afa801561430557610528926000916146ee575b5064ffffffffff80911691166151d5565b61012051610180519092916105b2602161054f6064610548818706615744565b9504614b08565b6040519481610568879351809260208087019101614826565b820161057d8251809360208085019101614826565b017f250000000000000000000000000000000000000000000000000000000000000060208201520360018101855201836148df565b610100608001519260c060800151956101206080015197604051996105d68b61486e565b8a5260208a015260408901526060880152608087015260a086015260c085015260e0840152610100830152610120820152604051806101c081011067ffffffffffffffff6101c083011117614311576101c0810160405260608152600060208201526000604082015260608082015260006080820152606060a0820152600060c0820152600060e08201526060610100820152600061012082015260006101408201526060610160820152600061018082015260006101a082015260a08201516106a660c0840151845190615a7a565b906109b361015c604051926106ba846148c3565b600884527f50726f677265737300000000000000000000000000000000000000000000000060208501526107236040516106f38161488b565b60009052855160208701207fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4701490565b156146e6576090945b61073586614b08565b916040519586938493661e339034b21e9160c91b60208601526109818351958692610767846027840160208901614826565b6d11103334b6361e9111b33333111f60911b602785840101526c1e3932b1ba103bb4b23a341e9160991b603585840101526107ae8551809660206042888701019101614826565b7f22206865696768743d22313030222066696c6c2d6f7061636974793d222e3033828501860160428101919091527f222072783d223135222072793d22313522207374726f6b653d2223666666222060628201527f7374726f6b652d6f7061636974793d222e3122207374726f6b652d77696474686082820152651e911a11179f60d11b60a28201527f3c7465787420783d2232302220793d2233342220666f6e742d66616d696c793d60a88201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f7370616365222060c8820152703337b73a16b9b4bd329e911919383c111f60791b60e88201528651966108b491889160f990910190602001614826565b661e17ba32bc3a1f60c91b8285018601870160f98101919091527f3c7465787420783d2232302220793d2237322220666f6e742d66616d696c793d6101008201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f73706163652220610120820152703337b73a16b9b4bd329e91191b383c111f60791b61014082015287519761094f91899161015190910190602001614826565b661e17ba32bc3a1f60c91b6101518888888887010101010152602061015888888885519c8d9701010101019101614826565b631e17b39f60e11b90860190910190910190910190910161015881019190915281900361013c810190915201826148df565b6101008301526101208201526028610100830151604051906109d48261488b565b60008252610c7a61015c604051926109eb846148c3565b600684527f53746174757300000000000000000000000000000000000000000000000000006020850152610a1e84615cba565b610a2782615d37565b808211156146de5750945b610a3d878701614b08565b91604051958693661e339034b21e9160c91b60208601528151610a67816027880160208601614826565b85016d11103334b6361e9111b33333111f60911b60278201526c1e3932b1ba103bb4b23a341e9160991b6035820152610aaa825180936020604285019101614826565b017f22206865696768743d22313030222066696c6c2d6f7061636974793d222e303360428201527f222072783d223135222072793d22313522207374726f6b653d2223666666222060628201527f7374726f6b652d6f7061636974793d222e3122207374726f6b652d77696474686082820152651e911a11179f60d11b60a28201527f3c7465787420783d2232302220793d2233342220666f6e742d66616d696c793d60a88201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f7370616365222060c8820152703337b73a16b9b4bd329e911919383c111f60791b60e8820152610ba682518093602060f985019101614826565b01661e17ba32bc3a1f60c91b60f98201527f3c7465787420783d2232302220793d2237322220666f6e742d66616d696c793d6101008201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f73706163652220610120820152703337b73a16b9b4bd329e91191b383c111f60791b610140820152610c3582518093602061015185019101614826565b01661e17ba32bc3a1f60c91b610151820152610c5c82518093602061015885019101614826565b01631e17b39f60e11b6101588201520361013c8101845201826148df565b610160840152016101808201526028602083015160405190610c9b8261488b565b60008252610ce561015c60405192610cb2846148c3565b600684527f416d6f756e7400000000000000000000000000000000000000000000000000006020850152610a1e84615cba565b835201602082015261102060808301516030604051610d038161488b565b60008152610faa61015c60405194610d1a866148c3565b600886527f4475726174696f6e0000000000000000000000000000000000000000000000006020870152610d4d86615cba565b610d5682615d37565b808211156146d65750935b610d6d60288601614b08565b91604051978893661e339034b21e9160c91b60208601528151610d97816027880160208601614826565b85016d11103334b6361e9111b33333111f60911b60278201526c1e3932b1ba103bb4b23a341e9160991b6035820152610dda825180936020604285019101614826565b017f22206865696768743d22313030222066696c6c2d6f7061636974793d222e303360428201527f222072783d223135222072793d22313522207374726f6b653d2223666666222060628201527f7374726f6b652d6f7061636974793d222e3122207374726f6b652d77696474686082820152651e911a11179f60d11b60a28201527f3c7465787420783d2232302220793d2233342220666f6e742d66616d696c793d60a88201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f7370616365222060c8820152703337b73a16b9b4bd329e911919383c111f60791b60e8820152610ed682518093602060f985019101614826565b01661e17ba32bc3a1f60c91b60f98201527f3c7465787420783d2232302220793d2237322220666f6e742d66616d696c793d6101008201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f73706163652220610120820152703337b73a16b9b4bd329e91191b383c111f60791b610140820152610f6582518093602061015185019101614826565b01661e17ba32bc3a1f60c91b610151820152610f8c82518093602061015885019101614826565b01631e17b39f60e11b6101588201520361013c8101865201846148df565b8260a08601526028810160c0860152602085015190610120860151809161018088015192839185010101605881016080890152605719906103e8030160011c8061014089015201601081016101a088015201602081016040870152010160e0840152610100830151610160840151845191614e1f565b6060820152604051908161010081011067ffffffffffffffff6101008401111761431157610100820160405260c782527f3c726563742077696474683d223130302522206865696768743d22313030252260208301527f2066696c7465723d2275726c28234e6f69736529222f3e3c7265637420783d2260408301527f37302220793d223730222077696474683d2238363022206865696768743d223860608301527f3630222066696c6c3d2223666666222066696c6c2d6f7061636974793d222e3060808301527f33222072783d223435222072793d22343522207374726f6b653d22236666662260a08301527f207374726f6b652d6f7061636974793d222e3122207374726f6b652d7769647460c08301527f683d2234222f3e0000000000000000000000000000000000000000000000000060e083015282519161010084015191606081015194604051611176816148a7565b603381527f3c636972636c652069643d22476c6f772220723d22353030222066696c6c3d2260208201527f75726c282352616469616c476c6f7729222f3e000000000000000000000000006040820152604051966111d38861486e565b61011c88527f3c66696c7465722069643d224e6f697365223e3c6665466c6f6f6420783d223060208901527f2220793d2230222077696474683d223130302522206865696768743d2231303060408901527f252220666c6f6f642d636f6c6f723d2268736c283233302c3231252c3131252960608901527f2220666c6f6f642d6f7061636974793d22312220726573756c743d22666c6f6f60808901527f6446696c6c222f3e3c666554757262756c656e6365206261736546726571756560a08901527f6e63793d222e3422206e756d4f6374617665733d22332220726573756c743d2260c08901527f4e6f6973652220747970653d226672616374616c4e6f697365222f3e3c66654260e08901527f6c656e6420696e3d224e6f6973652220696e323d22666c6f6f6446696c6c22206101008901527f6d6f64653d22736f66742d6c69676874222f3e3c2f66696c7465723e0000000061012089015260405197886103a081011067ffffffffffffffff6103a08b011117614311576103a0890160405261037b89527f3c706174682069643d224c6f676f222066696c6c3d2223666666222066696c6c60208a01527f2d6f7061636974793d222e312220643d226d3133332e3535392c3132342e303360408a01527f34632d2e3031332c322e3431322d312e3035392c342e3834382d322e3932332c60608a01527f362e3430322d322e3535382c312e3831392d352e3136382c332e3433392d372e60808a01527f3838382c342e3939362d31342e34342c382e3236322d33312e3034372c31322e60a08a01527f3536352d34372e3637342c31322e3536392d382e3835382e3033362d31372e3860c08a01527f33382d312e3237322d32362e3332382d332e3636332d392e3830362d322e373660e08a01527f362d31392e3038372d372e3131332d32372e3536322d31322e3737382d31332e6101008a01527f3834322d382e3032352c392e3436382d32382e3630362c31362e3135332d33356101208a01527f2e323635683063322e3033352d312e3833382c342e3235322d332e3534362c366101408a01527f2e3436332d352e323234683063362e3432392d352e3635352c31362e3231382d6101608a01527f322e3833352c32302e3335382c342e31372c342e3134332c352e3035372c382e6101808a01527f3831362c392e3634392c31332e39322c31332e373334682e30333763352e37336101a08a01527f362c362e3436312c31352e3335372d322e3235332c392e33382d382e34382c306101c08a01527f2c302d332e3531352d332e3531352d332e3531352d332e3531352d31312e34396101e08a01527f2d31312e3437382d35322e3635362d35322e3636342d36342e3833372d36342e6102008a01527f3833376c2e3034392d2e303337632d312e3732352d312e3630362d322e3731396102208a01527f2d332e3834372d322e3735312d362e3230346830632d2e3034362d322e3337356102408a01527f2c312e3036322d342e3538322c322e3732362d362e32323968306c2e3138352d6102608a01527f2e3134386830632e3039392d2e3036322c2e3232322d2e3134382c2e33372d2e6102808a01527f323539683063322e30362d312e3336322c332e3935312d322e3632312c362e306102a08a01527f34342d332e3834324335372e3736332d332e3437332c39372e37362d322e33346102c08a01527f312c3132382e3633372c31382e3333326331362e3637312c392e3934362d32366102e08a01527f2e3334342c35342e3831332d33382e3635312c34302e3139392d362e3239392d6103008a01527f362e3039362d31382e3036332d31372e3734332d31392e3636382d31382e38316103208a01527f312d362e3031362d342e3034372d31332e3036312c342e3737362d372e3735326103408a01527f2c392e3735316c36382e3235342c36382e33373163312e3732342c312e3630316103608a01527f2c322e3731342c332e38342c322e3733382c362e3139325a222f3e00000000006103808a0152604051978860a081011067ffffffffffffffff60a08b01111761431157611cb1611d129160a08b0160405260758b527f3c706174682069643d22466c6f6174696e6754657874222066696c6c3d226e6f60208c01527f6e652220643d224d31323520343568373530733830203020383020383076373560408c01527f307330203830202d3830203830682d373530732d38302030202d3830202d383060608c01527f762d3735307330202d3830203830202d3830222f3e000000000000000000000060808c0152611868615a41565b906040517f3c72616469616c4772616469656e742069643d2252616469616c476c6f77223e6020820152611d0d60d87f3c73746f70206f66667365743d223025222073746f702d636f6c6f723d22000093846040850152805161199a60b88660208501936118da81605e840187614826565b8101997f222073746f702d6f7061636974793d222e36222f3e0000000000000000000000605e8c01527f3c73746f70206f66667365743d2231303025222073746f702d636f6c6f723d229a8b607382015261193f825180936020609385019101614826565b017f222073746f702d6f7061636974793d2230222f3e00000000000000000000000060938201527f3c2f72616469616c4772616469656e743e00000000000000000000000000000060a78201520360988101885201866148df565b6119a2615a41565b90604051967f3c6c696e6561724772616469656e742069643d2253616e64546f70222078313d60208901527f223025222079313d223025223e000000000000000000000000000000000000006040890152604d8801528251611a0881606b8a0184614826565b8701917f222f3e00000000000000000000000000000000000000000000000000000000009283606b82015289606e820152611a4d825180936020608e85019101614826565b019082608e830152611a9160a2897f3c2f6c696e6561724772616469656e743e0000000000000000000000000000009485609182015203608281018b5201896148df565b611bd7610108611a9f615a41565b6040519b8c917f3c6c696e6561724772616469656e742069643d2253616e64426f74746f6d222060208401527f78313d2231303025222079313d2231303025223e00000000000000000000000060408401527f3c73746f70206f66667365743d22313025222073746f702d636f6c6f723d22006054840152611b2b815180926020607387019101614826565b8201908760738301526076820152875190611b4a826096830188614826565b018660968201527f3c616e696d617465206174747269627574654e616d653d22783122206475723d60998201527f2236732220726570656174436f756e743d22696e646566696e6974652220766160b98201527f6c7565733d223330253b3630253b313230253b3630253b3330253b222f3e000060d98201528560f78201520360e881018c52018a6148df565b611bdf615a41565b906040519a8b957f3c6c696e6561724772616469656e742069643d22486f7572676c61737353747260208801527f6f6b6522206772616469656e745472616e73666f726d3d22726f74617465283960408801527f302922206772616469656e74556e6974733d227573657253706163654f6e557360608801527f65223e000000000000000000000000000000000000000000000000000000000060808801527f3c73746f70206f66667365743d22353025222073746f702d636f6c6f723d2200608388015251809260a2880190614826565b84018360a28201527f3c73746f70206f66667365743d22383025222073746f702d636f6c6f723d220060a5820152611cf382518093602060c485019101614826565b019160c483015260c78201520360b88101875201856148df565b614e1f565b92611d32611d1e615817565b896020815191012090602081519101201490565b9788156146ad575b506040518060c081011067ffffffffffffffff60c0830111176143115760c08101604052609081527f3c7061746820643d224d2035302c3336302061203330302c333030203020312c60208201527f31203630302c302061203330302c333030203020312c31202d3630302c30222060408201527f66696c6c3d2223666666222066696c6c2d6f7061636974793d222e303222207360608201527f74726f6b653d2275726c2823486f7572676c6173735374726f6b65292220737460808201527f726f6b652d77696474683d2234222f3e0000000000000000000000000000000060a082015260405193846102c081011067ffffffffffffffff6102c087011117614311576102c0850160405261029885527f3c7061746820643d226d3536362c3136312e323031762d35332e39323463302d60208601527f31392e3338322d32322e3531332d33372e3536332d36332e3339382d35312e3160408601527f39382d34302e3735362d31332e3539322d39342e3934362d32312e3037392d3160608601527f35322e3538372d32312e303739732d3131312e3833382c372e3438372d31353260808601527f2e3630322c32312e303739632d34302e3839332c31332e3633362d36332e343160a08601527f332c33312e3831362d36332e3431332c35312e3139387635332e39323463302c60c08601527f31372e3138312c31372e3730342c33332e3432372c35302e3232332c34362e3360e08601527f3934763238342e383039632d33322e3531392c31322e39362d35302e3232332c6101008601527f32392e3230362d35302e3232332c34362e3339347635332e39323463302c31396101208601527f2e3338322c32322e35322c33372e3536332c36332e3431332c35312e3139382c6101408601527f34302e3736332c31332e3539322c39342e3935342c32312e3037392c3135322e6101608601527f3630322c32312e303739733131312e3833312d372e3438372c3135322e3538376101808601527f2d32312e3037396334302e3838362d31332e3633362c36332e3339382d33312e6101a08601527f3831362c36332e3339382d35312e313938762d35332e39323463302d31372e316101c08601527f39362d31372e3730342d33332e3433352d35302e3232332d34362e34303156326101e08601527f30372e3630336333322e3531392d31322e3936372c35302e3232332d32392e326102008601527f30362c35302e3232332d34362e3430315a6d2d3334372e3436322c35372e37396102208601527f336c3133302e3935392c3133312e3032372d3133302e3935392c3133312e30316102408601527f33563231382e3939345a6d3236322e3932342e303232763236322e3031386c2d6102608601527f3133302e3933372d3133312e3030362c3133302e3933372d3133312e3031335a6102808601527f222066696c6c3d2223313631383232223e3c2f706174683e00000000000000006102a0860152896000146144885760405161218c8161488b565b60008152995b1561432757604051806101e081011067ffffffffffffffff6101e083011117614311576101e081016040526101b181527f3c7061746820643d226d3438312e34362c3438312e35347638312e3031632d3260208201527f2e33352e37372d342e38322c312e35312d372e33392c322e32332d33302e332c60408201527f382e35342d37342e36352c31332e39322d3132342e30362c31332e39322d353360608201527f2e362c302d3130312e32342d362e33332d3133312e34372d31362e3136762d3860808201527f316c34362e332d34362e3331683137302e33336c34362e32392c34362e33315a60a08201527f222066696c6c3d2275726c282353616e64426f74746f6d29222f3e3c7061746860c08201527f20643d226d3433352e31372c3433352e323363302c312e31372d2e34362c322e60e08201527f33322d312e33332c332e34342d372e31312c392e30382d34312e39332c31352e6101008201527f39382d38332e38312c31352e3938732d37362e372d362e392d38332e38322d316101208201527f352e3938632d2e38372d312e31322d312e33332d322e32372d312e33332d332e6101408201527f3434762d2e30346c382e33342d382e33352e30312d2e30316331332e37322d366101608201527f2e35312c34322e39352d31312e30322c37362e382d31312e30327336322e39376101808201527f2c342e34392c37362e37322c31316c382e34322c382e34325a222066696c6c3d6101a08201527f2275726c282353616e64546f7029222f3e0000000000000000000000000000006101c0820152995b60405196876107e081011067ffffffffffffffff6107e08a01111761431157613b9f9c612e5a6036602d9960819f97631e17b39f60e11b8d7f3c2f646566733e000000000000000000000000000000000000000000000000009a612f2b9f6107e0016040526107a782527f3c672066696c6c3d226e6f6e6522207374726f6b653d2275726c2823486f757260208301527f676c6173735374726f6b652922207374726f6b652d6c696e656361703d22726f60408301527f756e6422207374726f6b652d6d697465726c696d69743d22313022207374726f60608301527f6b652d77696474683d2234223e3c7061746820643d226d3536352e3634312c3160808301527f30372e323863302c392e3533372d352e35362c31382e3632392d31352e36373660a08301527f2c32362e393733682d2e303233632d392e3230342c372e3539362d32322e313960c08301527f342c31342e3536322d33382e3139372c32302e3539322d33392e3530342c313460e08301527f2e3933362d39372e3332352c32342e3335352d3136312e3733332c32342e33356101008301527f352d39302e34382c302d3136372e3934382d31382e3538322d3139392e3935336101208301527f2d34342e393438682d2e303233632d31302e3131352d382e3334342d31352e366101408301527f37362d31372e3433372d31352e3637362d32362e3937332c302d33392e3733356101608301527f2c39362e3535342d37312e3932312c3231352e3635322d37312e3932317332316101808301527f352e3632392c33322e3138352c3231352e3632392c37312e3932315a222f3e3c6101a08301527f7061746820643d226d3133342e33362c3136312e32303363302c33392e3733356101c08301527f2c39362e3535342c37312e3932312c3231352e3635322c37312e3932317332316101e08301527f352e3632392d33322e3138362c3231352e3632392d37312e393231222f3e3c6c6102008301527f696e652078313d223133342e3336222079313d223136312e323033222078323d6102208301527f223133342e3336222079323d223130372e3238222f3e3c6c696e652078313d226102408301527f3536352e3634222079313d223136312e323033222078323d223536352e3634226102608301527f2079323d223130372e3238222f3e3c6c696e652078313d223138342e353834226102808301527f2079313d223230362e383233222078323d223138342e353835222079323d22356102a08301527f33372e353739222f3e3c6c696e652078313d223231382e313831222079313d226102c08301527f3231382e313138222078323d223231382e313831222079323d223536322e35336102e08301527f37222f3e3c6c696e652078313d223438312e383138222079313d223231382e316103008301527f3432222078323d223438312e383139222079323d223536322e343238222f3e3c6103208301527f6c696e652078313d223531352e343135222079313d223230372e3335322220786103408301527f323d223531352e343136222079323d223533372e353739222f3e3c70617468206103608301527f643d226d3138342e35382c3533372e353863302c352e34352c342e32372c31306103808301527f2e36352c31322e30332c31352e3432682e303263352e35312c332e33392c31326103a08301527f2e37392c362e35352c32312e35352c392e34322c33302e32312c392e392c37386103c08301527f2e30322c31362e32382c3133312e38332c31362e32382c34392e34312c302c396103e08301527f332e37362d352e33382c3132342e30362d31332e39322c322e372d2e37362c356104008301527f2e32392d312e35342c372e37352d322e33352c382e37372d322e38372c31362e6104208301527f30352d362e30342c32312e35362d392e3433683063372e37362d342e37372c316104408301527f322e30342d392e39372c31322e30342d31352e3432222f3e3c7061746820643d6104608301527f226d3138342e3538322c3439322e363536632d33312e3335342c31322e3438356104808301527f2d35302e3232332c32382e35382d35302e3232332c34362e3134322c302c392e6104a08301527f3533362c352e3536342c31382e3632372c31352e3637372c32362e393639682e6104c08301527f30323263382e3530332c372e3030352c32302e3231332c31332e3436332c33346104e08301527f2e3532342c31392e3135392c392e3939392c332e3939312c32312e3236392c376105008301527f2e3630392c33332e3539372c31302e3738382c33362e34352c392e3430372c386105208301527f322e3138312c31352e3030322c3133312e3833352c31352e3030327339352e336105408301527f36332d352e3539352c3133312e3830372d31352e3030326331302e3834372d326105608301527f2e37392c32302e3836372d352e3932362c32392e3932342d392e3334392c312e6105808301527f3234342d2e3436372c322e3437332d2e3934322c332e3637332d312e3432342c6105a08301527f31342e3332362d352e3639362c32362e3033352d31322e3136312c33342e35326105c08301527f342d31392e313733682e3032326331302e3131342d382e3334322c31352e36376105e08301527f372d31372e3433332c31352e3637372d32362e3936392c302d31372e3536322d6106008301527f31382e3836392d33332e3636352d35302e3232332d34362e3135222f3e3c70616106208301527f746820643d226d3133342e33362c3539322e373263302c33392e3733352c39366106408301527f2e3535342c37312e3932312c3231352e3635322c37312e393231733231352e366106608301527f32392d33322e3138362c3231352e3632392d37312e393231222f3e3c6c696e656106808301527f2078313d223133342e3336222079313d223539322e3732222078323d223133346106a08301527f2e3336222079323d223533382e373937222f3e3c6c696e652078313d223536356106c08301527f2e3634222079313d223539322e3732222078323d223536352e3634222079323d6106e08301527f223533382e373937222f3e3c706f6c796c696e6520706f696e74733d223438316107008301527f2e383232203438312e393031203438312e373938203438312e383737203438316107208301527f2e373735203438312e383534203335302e303135203335302e303236203231386107408301527f2e313835203231382e313239222f3e3c706f6c796c696e6520706f696e74733d6107608301527f223231382e313835203438312e393031203231382e323331203438312e3835346107808301527f203335302e303135203335302e303236203438312e383232203231382e3135326107a08301527f222f3e3c2f673e000000000000000000000000000000000000000000000000006107c0830152604051998a957f3c672069643d22486f7572676c617373223e00000000000000000000000000006020880152603295612df68151809260208a8c019101614826565b8701612e0b8251809360208a85019101614826565b01612e1f8251809360208985019101614826565b01612e338251809360208885019101614826565b01612e478251809360208785019101614826565b01918201520360168101865201846148df565b6040519e8f9788977f3c646566733e000000000000000000000000000000000000000000000000000060208a0152612e9f6026998260208c9451948593019101614826565b8901612eb48251809360208c85019101614826565b01612ec88251809360208b85019101614826565b01612edc8251809360208a85019101614826565b01612ef08251809360208985019101614826565b01612f048251809360208885019101614826565b01612f188251809360208785019101614826565b019182015203600d8101895201876148df565b6137be604c60e08301516101208401519361351a61314d6060604084015193015196612f578186615985565b9461314861012b604051612f6a816148c3565b600581527f2d3130302500000000000000000000000000000000000000000000000000000060208201526040519889917f3c74657874506174682073746172744f66667365743d220000000000000000006020840152612fd4815180926020603787019101614826565b7f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666683820160378101919091527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e00000000000000000061010982015282519261311891849161012090910190602001614826565b6a1e17ba32bc3a2830ba341f60a91b90830190910161012081019190915281900361010b810190915201876148df565b615985565b9561332c61012b604051613160816148c3565b600281527f30250000000000000000000000000000000000000000000000000000000000006020820152604051998a917f3c74657874506174682073746172744f66667365743d2200000000000000000060208401526131ca815180926020603787019101614826565b82017f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666660378201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e00000000000000000061010982015261330782518093602061012085019101614826565b016a1e17ba32bc3a2830ba341f60a91b6101208201520361010b81018a5201886148df565b61333681846159ed565b9261351561012b604051613349816148c3565b600481527f2d3530250000000000000000000000000000000000000000000000000000000060208201526040519687917f3c74657874506174682073746172744f66667365743d2200000000000000000060208401526133b3815180926020603787019101614826565b82017f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666660378201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e0000000000000000006101098201526134f082518093602061012085019101614826565b016a1e17ba32bc3a2830ba341f60a91b6101208201520361010b8101875201856148df565b6159ed565b906136f961012b60405161352d816148c3565b600381527f353025000000000000000000000000000000000000000000000000000000000060208201526040519485917f3c74657874506174682073746172744f66667365743d220000000000000000006020840152613597815180926020603787019101614826565b82017f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666660378201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e0000000000000000006101098201526136d482518093602061012085019101614826565b016a1e17ba32bc3a2830ba341f60a91b6101208201520361010b8101855201836148df565b6040519586937f3c7465787420746578742d72656e646572696e673d226f7074696d697a65537060208601527f656564223e000000000000000000000000000000000000000000000000000000604086015261375f815180926020604589019101614826565b8401613775825180936020604585019101614826565b0161378a825180936020604585019101614826565b0161379f825180936020604585019101614826565b01661e17ba32bc3a1f60c91b604582015203602c8101845201826148df565b613a9e61019a6101408401516101a0850151906137ff6137f96137f36137ed60e060408b01519a015194614b08565b94614b08565b97614b08565b91614b08565b956040519687937f3c75736520687265663d2223476c6f77222066696c6c2d6f7061636974793d2260208601527f2e39222f3e00000000000000000000000000000000000000000000000000000060408601527f3c75736520687265663d2223476c6f772220783d22313030302220793d22313060458601527f3030222066696c6c2d6f7061636974793d222e39222f3e00000000000000000060658601527f3c75736520687265663d22234c6f676f2220783d223137302220793d22313730607c8601527f22207472616e73666f726d3d227363616c65282e3629222f3e3c757365206872609c8601527f65663d2223486f7572676c6173732220783d223135302220793d22393022207460bc8601527f72616e73666f726d3d22726f746174652831302922207472616e73666f726d2d60dc8601527f6f726967696e3d2235303020353030222f3e000000000000000000000000000060fc8601527f3c75736520687265663d222350726f67726573732220783d220000000000000061010e8601526101279061399a815180926020858a019101614826565b8501937f2220793d22373930222f3e00000000000000000000000000000000000000000080948180948801527f3c75736520687265663d22235374617475732220783d2200000000000000000061013288015261014996613a048251809360208b85019101614826565b01958601527f3c75736520687265663d2223416d6f756e742220783d2200000000000000000061015486015261016b94613a478251809360208985019101614826565b01938401527f3c75736520687265663d22234475726174696f6e2220783d220000000000000061017684015261018f92613a8a8251809360208785019101614826565b01918201520361017a8101855201836148df565b6040519586937f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323060208601527f30302f737667222077696474683d223130303022206865696768743d2231303060408601527f30222076696577426f783d2230203020313030302031303030223e00000000006060860152613b2a815180926020607b89019101614826565b8401613b40825180936020607b85019101614826565b01613b55825180936020607b85019101614826565b01613b6a825180936020607b85019101614826565b017f3c2f7376673e0000000000000000000000000000000000000000000000000000607b8201520360618101845201826148df565b6101605260a051610100516040517fb971302a0000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa908115614305576000916142ba575b6142b661424f614154614245609487613d3b6089613c198a614c58565b9260c0608001516040519485927f5b7b2274726169745f74797065223a224173736574222c2276616c7565223a226020850152613c60815180926020604088019101614826565b8301907f227d2c7b2274726169745f74797065223a2253656e646572222c2276616c756560408301527f223a22000000000000000000000000000000000000000000000000000000000091826060820152613cc5825180936020606385019101614826565b01907f227d2c7b2274726169745f74797065223a22537461747573222c2276616c756560638301526083820152613d06825180936020608685019101614826565b017f227d5d000000000000000000000000000000000000000000000000000000000060868201520360698101845201826148df565b6101a05160a05161403e61017e613d53602435614b08565b9360a060800151613d6e6001600160a01b0360805116614c58565b90604051968793613f2b60208601987f54686973204e465420726570726573656e74732061207061796d656e742073748a527f7265616d20696e2061205361626c696572205632200000000000000000000000604088015282516020840190613ddb8160558b0184614826565b8801947f20636f6e74726163742e20546865206f776e6572206f662074686973204e465460558701527f2063616e207769746864726177207468652073747265616d656420617373657460758701527f732c207768696368206172652064656e6f6d696e6174656420696e2000000000609587015282516020840196613e658260b183018a614826565b017f2e5c6e5c6e2d2053747265616d2049443a20000000000000000000000000000060b1820152613ea082518093602060c385019101614826565b01613ed97f5c6e2d2000000000000000000000000000000000000000000000000000000000958660c384015251809360c7840190614826565b01947f20416464726573733a2000000000000000000000000000000000000000000000958660c7820152613f1782518093602060d185019101614826565b019260d184015251809360d5840190614826565b019060d5820152613f4682518093602060df85019101614826565b017f5c6e5c6e0000000000000000000000000000000000000000000000000000000060df8201527fe29aa0efb88f205741524e494e473a205472616e7366657272696e672074686560e38201527f204e4654206d616b657320746865206e6577206f776e657220746865207265636101038201527f697069656e74206f66207468652073747265616d2e205468652066756e6473206101238201527f617265206e6f74206175746f6d61746963616c6c792077697468647261776e206101438201527f666f72207468652070726576696f757320726563697069656e742e00000000006101638201520361015e8101855201836148df565b6101a051906141af614051602435614b08565b916140d0602d604051809560208201976a029b0b13634b2b9102b19160ad1b8952614086815180926020602b87019101614826565b82017f2023000000000000000000000000000000000000000000000000000000000000602b8201526140c18251809360208785019101614826565b0103600d8101865201846148df565b610160516140dd90614994565b94604051998a977f7b2261747472696275746573223a00000000000000000000000000000000000060208a015261411e815180926020602e8d019101614826565b8801917f2c226465736372697074696f6e223a2200000000000000000000000000000000602e840152518093603e840190614826565b01917f222c2265787465726e616c5f75726c223a2268747470733a2f2f7361626c6965603e8401527f722e636f6d222c226e616d65223a220000000000000000000000000000000000605e840152518093606d840190614826565b017f222c22696d616765223a22646174613a696d6167652f7376672b786d6c3b6261606d8201527f736536342c000000000000000000000000000000000000000000000000000000608d820152614210825180936020609285019101614826565b017f227d00000000000000000000000000000000000000000000000000000000000060928201520360748101845201826148df565b60e0819052614994565b6142a2603d60405180937f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000060208301526142928151809260208686019101614826565b810103601d8101845201826148df565b604051918291602083526020830190614849565b0390f35b90506020813d6020116142fd575b816142d5602093836148df565b810103126142f85751906001600160a01b03821682036142f85790614154613bfc565b600080fd5b3d91506142c8565b6040513d6000823e3d90fd5b634e487b7160e01b600052604160045260246000fd5b6040518061012081011067ffffffffffffffff6101208301111761431157610120810160405260f881527f3c7061746820643d226d3438312e34362c3530342e3130317635382e3434396360208201527f2d322e33352e37372d342e38322c312e35312d372e33392c322e32332d33302e60408201527f332c382e35342d37342e36352c31332e39322d3132342e30362c31332e39322d60608201527f35332e362c302d3130312e32342d362e33332d3133312e34372d31362e31367660808201527f2d35382e343339683236322e39325a222066696c6c3d2275726c282353616e6460a08201527f426f74746f6d29222f3e3c656c6c697073652063783d22333530222063793d2260c08201527f3530342e313031222072783d223133312e343632222072793d2232382e31303860e08201527f222066696c6c3d2275726c282353616e64546f7029222f3e0000000000000000610100820152996123df565b604051806101c081011067ffffffffffffffff6101c083011117614311576101c0810160405261019981527f3c706f6c79676f6e20706f696e74733d22333530203335302e3032362034313560208201527f2e3033203238342e39373820323835203238342e39373820333530203335302e60408201527f303236222066696c6c3d2275726c282353616e64426f74746f6d29222f3e3c7060608201527f61746820643d226d3431362e3334312c3238312e39373563302c2e3931342d2e60808201527f3335342c312e3830392d312e3033352c322e36382d352e3534322c372e30373660a08201527f2d33322e3636312c31322e34352d36352e32382c31322e34352d33322e36323460c08201527f2c302d35392e3733382d352e3337342d36352e32382d31322e34352d2e36383160e08201527f2d2e3837322d312e3033352d312e3736372d312e3033352d322e36382c302d2e6101008201527f3931342e3335342d312e3830382c312e3033352d322e3637362c352e3534322d6101208201527f372e3037362c33322e3635362d31322e34352c36352e32382d31322e34352c336101408201527f322e3631392c302c35392e3733382c352e3337342c36352e32382c31322e34356101608201527f2e3638312e3836372c312e3033352c312e3736322c312e3033352c322e3637366101808201527f5a222066696c6c3d2275726c282353616e64546f7029222f3e000000000000006101a082015299612192565b6146cf9198506146bb615850565b906020815191012090602081519101201490565b9638611d3a565b905093610d61565b905094610a32565b60d09461072c565b614710915060203d602011614716575b61470881836148df565b810190614929565b38610517565b503d6146fe565b614736915060203d6020116147165761470881836148df565b386104c1565b634e487b7160e01b600052601260045260246000fd5b614774915060203d60201161477a575b61476c81836148df565b810190614901565b3861023f565b503d614762565b506020813d6020116147b6575b8161479b602093836148df565b810103126142f8575160058110156142f8576101e5906101db565b3d915061478e565b6147d7915060203d60201161477a5761476c81836148df565b38610181565b90506020813d60201161481e575b816147f8602093836148df565b810103126142f857516001600160a01b03811681036142f8576001600160a01b03610100565b3d91506147eb565b60005b8381106148395750506000910152565b8181015183820152602001614829565b9060209161486281518092818552858086019101614826565b601f01601f1916010190565b610140810190811067ffffffffffffffff82111761431157604052565b6020810190811067ffffffffffffffff82111761431157604052565b6060810190811067ffffffffffffffff82111761431157604052565b6040810190811067ffffffffffffffff82111761431157604052565b90601f8019910116810190811067ffffffffffffffff82111761431157604052565b908160209103126142f857516fffffffffffffffffffffffffffffffff811681036142f85790565b908160209103126142f8575164ffffffffff811681036142f85790565b67ffffffffffffffff811161431157601f01601f191660200190565b9061496c82614946565b61497960405191826148df565b828152809261498a601f1991614946565b0190602036910137565b805115614af4576040516149a7816148a7565b604081527f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208201527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f60408201528151600292838201809211614ade5760038092047f3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81168103614ade57614a41908594951b614962565b936020850193829183518401925b838110614a8d5750505050510680600114614a7a57600214614a6f575090565b603d90600019015390565b50603d9081600019820153600119015390565b85600491979293949701918251600190603f9082828260121c16880101518453828282600c1c16880101518385015382828260061c1688010151888501531685010151878201530195929190614a4f565b634e487b7160e01b600052601160045260246000fd5b50604051614b018161488b565b6000815290565b806000917a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000080821015614c4a575b506d04ee2d6d415b85acef810000000080831015614c3b575b50662386f26fc1000080831015614c2c575b506305f5e10080831015614c1d575b5061271080831015614c0e575b506064821015614bfe575b600a80921015614bf4575b600190816021614b9f828701614962565b95860101905b614bb1575b5050505090565b600019019083907f30313233343536373839616263646566000000000000000000000000000000008282061a835304918215614bef57919082614ba5565b614baa565b9160010191614b8e565b9190606460029104910191614b83565b60049193920491019138614b78565b60089193920491019138614b6b565b60109193920491019138614b5c565b60209193920491019138614b4a565b604093508104915038614b31565b6001600160a01b031660405190614c6e826148a7565b602a8252602082016040368237825115614d8657603090538151600190811015614d8657607860218401536029905b808211614d0b575050614cad5790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602060248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b9091600f81166010811015614d71577f3031323334353637383961626364656600000000000000000000000000000000901a614d478486614d9c565b5360041c918015614d5c576000190190614c9d565b60246000634e487b7160e01b81526011600452fd5b60246000634e487b7160e01b81526032600452fd5b634e487b7160e01b600052603260045260246000fd5b908151811015614d86570160200190565b60405190614dba826148c3565b600482527f2667743b000000000000000000000000000000000000000000000000000000006020830152565b60405190614df3826148c3565b600482527f266c743b000000000000000000000000000000000000000000000000000000006020830152565b90614e87929493604051958692602094614e4181518092888089019101614826565b8401614e5582518093888085019101614826565b01614e6882518093878085019101614826565b01614e7b82518093868085019101614826565b010380855201836148df565b565b801561519a5760009180615175575090505b6001908082811015614f0857505050614eb2614de6565b614f05602260405183614ecf829551809260208086019101614826565b81017f203100000000000000000000000000000000000000000000000000000000000060208201520360028101845201826148df565b90565b66038d7ea4c6800011156151185760409081519060a0820182811067ffffffffffffffff82111761431157808452614f3f8161488b565b600081528252825190614f51826148c3565b8482526020917f4b0000000000000000000000000000000000000000000000000000000000000083820152828401528351614f8b816148c3565b8581527f4d0000000000000000000000000000000000000000000000000000000000000083820152848401528351614fc2816148c3565b8581527f42000000000000000000000000000000000000000000000000000000000000008382015260608401528351614ffa816148c3565b8581527f54000000000000000000000000000000000000000000000000000000000000008382015260808401526000918583965b6150ec575b50845194615040866148c3565b6007908187527f2623383830353b0000000000000000000000000000000000000000000000000083880152519560005b8281106150d957505050506150ba6150c0917f20000000000000000000000000000000000000000000000000000000000000006027870152600886526150b5866148c3565b614b08565b91615744565b916005851015614d8657614f059460051b015192614e1f565b8181018401518882018501528301615070565b9591926103e89081851061510f57508680916064600a870406950493019661502e565b93929650615033565b5050615122614dad565b614f0560286040518361513f829551809260208086019101614826565b81017f203939392e39395400000000000000000000000000000000000000000000000060208201520360088101845201826148df565b600a0a918215615186575004614e9b565b80634e487b7160e01b602492526012600452fd5b50506040516151a8816148c3565b600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b620151809103048061523d57506151ea614de6565b614f05602660405183615207829551809260208086019101614826565b81017f203120446179000000000000000000000000000000000000000000000000000060208201520360068101845201826148df565b61270f811161530c57600181036152c957614f056020615291604051615262816148c3565b600481527f20446179000000000000000000000000000000000000000000000000000000008382015293614b08565b60405193816152a98693518092868087019101614826565b82016152bd82518093868085019101614826565b010380845201826148df565b614f0560206152916040516152dd816148c3565b600581527f20446179730000000000000000000000000000000000000000000000000000008382015293614b08565b50615315614dad565b614f05602a60405183615332829551809260208086019101614826565b81017f2039393939204461797300000000000000000000000000000000000000000000602082015203600a8101845201826148df565b6020818303126142f85780519067ffffffffffffffff82116142f8570181601f820112156142f857805161539b81614946565b926153a960405194856148df565b818452602082840101116142f857614f059160208085019101614826565b6001600160a01b031660409081516395d89b4160e01b8152600081600481855afa9081156155a157600091615580575b5061545c8351615406816148c3565b601181527f5341422d56322d4c4f434b55502d4c494e0000000000000000000000000000006020918201528251908301207fc66b376a19264d832c1bc254000c18944ca5aa57ed50f4ea637c4da424d4c3bb1490565b1561549a5750505161546d816148c3565b600d81527f4c6f636b7570204c696e65617200000000000000000000000000000000000000602082015290565b6154fe83516154a8816148c3565b601181527f5341422d56322d4c4f434b55502d44594e0000000000000000000000000000006020918201528251908301207f6ab655856fa5352de8c05542b1937ac63c59342da992602767c02734cc5391651490565b1561553c5750505161550f816148c3565b600e81527f4c6f636b75702044796e616d6963000000000000000000000000000000000000602082015290565b61557c9083519384937f814a8a2e000000000000000000000000000000000000000000000000000000008552600485015260248401526044830190614849565b0390fd5b61559b913d8091833e61559381836148df565b810190615368565b386153f7565b83513d6000823e3d90fd5b3d156155d7573d906155bd82614946565b916155cb60405193846148df565b82523d6000602084013e565b606090565b60405160208101907f313ce56700000000000000000000000000000000000000000000000000000000825260048152615614816148c3565b6000928392839251915afa6156276155ac565b908061565e575b1561565a5760208180518101031261565657602001519060ff82168203615653575090565b80fd5b5080fd5b5090565b50602081511461562e565b6000809160405160208101906395d89b4160e01b82526004815261568c816148c3565b51915afa6156986155ac565b90158015615738575b6156fe57806020806156b893518301019101615368565b601e815111600014614f0557506040516156d1816148c3565b600b81527f4c6f6e672053796d626f6c000000000000000000000000000000000000000000602082015290565b5060405161570b816148c3565b600581527f4552433230000000000000000000000000000000000000000000000000000000602082015290565b506040815111156156a1565b806157565750604051614b018161488b565b600a8110156157bb5761576890614b08565b614f05602260405180937f2e3000000000000000000000000000000000000000000000000000000000000060208301526157ab8151809260208686019101614826565b81010360028101845201826148df565b6157c490614b08565b614f05602160405180937f2e0000000000000000000000000000000000000000000000000000000000000060208301526158078151809260208686019101614826565b81010360018101845201826148df565b60405190615824826148c3565b600782527f536574746c6564000000000000000000000000000000000000000000000000006020830152565b6040519061585d826148c3565b600882527f4465706c657465640000000000000000000000000000000000000000000000006020830152565b600581101561596f57600481036158a35750614f05615850565b600381036158e557506040516158b8816148c3565b600881527f43616e63656c6564000000000000000000000000000000000000000000000000602082015290565b6001810361592757506040516158fa816148c3565b600981527f53747265616d696e670000000000000000000000000000000000000000000000602082015290565b60020361593657614f05615817565b604051615942816148c3565b600781527f50656e64696e6700000000000000000000000000000000000000000000000000602082015290565b634e487b7160e01b600052602160045260246000fd5b6030614e879193929360405194816159a7879351809260208087019101614826565b820164010714051160dd1b60208201526a029b0b13634b2b9102b19160ad1b60258201526159de8251809360208785019101614826565b010360108101855201836148df565b6025614e87919392936040519481615a0f879351809260208087019101614826565b820164010714051160dd1b6020820152615a328251809360208785019101614826565b010360058101855201836148df565b60405190615a4e826148c3565b601082527f68736c283233302c3231252c31312529000000000000000000000000000000006020830152565b8015615cac57615a88615a41565b90612710908103908111614ade57614f0591615aa661013692614b08565b6040519485927f3c672066696c6c3d226e6f6e65223e000000000000000000000000000000000060208501527f3c636972636c652063783d22313636222063793d2235302220723d2232322220602f8501527f7374726f6b653d22000000000000000000000000000000000000000000000000604f850152615b32815180926020605788019101614826565b83017f22207374726f6b652d77696474683d223130222f3e000000000000000000000060578201527f3c636972636c652063783d22313636222063793d2235302220706174684c656e606c8201527f6774683d2231303030302220723d22323222207374726f6b653d220000000000608c820152615bba82518093602060a785019101614826565b017f22207374726f6b652d6461736861727261793d22313030303022207374726f6b60a78201527f652d646173686f66667365743d2200000000000000000000000000000000000060c7820152615c1b82518093602060d585019101614826565b017f22207374726f6b652d6c696e656361703d22726f756e6422207374726f6b652d60d58201527f77696474683d223522207472616e73666f726d3d22726f74617465282d39302960f58201527f22207472616e73666f726d2d6f726967696e3d22313636203530222f3e000000610115820152631e17b39f60e11b610132820152036101168101845201826148df565b5050604051614b018161488b565b60009080518015615d2f579060009182915b818310615cde57505050600d02900390565b909193603b60f81b7fff00000000000000000000000000000000000000000000000000000000000000615d118785614d9c565b511614615d27575b600d01936001019190615ccc565b849350615d19565b505050600090565b60009080518015615d2f579060009182915b818310615d5b5750505060041b900390565b909193603b60f81b7fff00000000000000000000000000000000000000000000000000000000000000615d8e8785614d9c565b511614615da4575b601001936001019190615d49565b849350615d9656"; From a1e36f742938508b539cc6ffafdcb77e33e326f2 Mon Sep 17 00:00:00 2001 From: Andrei Vlad Birgaoanu <99738872+andreivladbrg@users.noreply.github.com> Date: Fri, 15 Dec 2023 14:34:27 +0200 Subject: [PATCH 42/47] Install dependencies with Node.js instead of git modules (#734) * build: install deps only with Node.js build: remove .gitmodules build: remove lib dir build: include test/utils in files published docs: specify recommended installation method on README chore: update remappings accordingly ci: install deps with pnpm install and remove "recursive" * feat: remove re-exported types * style: add line * ci: install pnpm and Node.js on each job * chore: update Slither config * test: update Precompiles bytecode * build: include remappings.txt file in the package * ci: cache the node modules and re use them * docs: improve README * build: remove unnecessary remmapings file from package * ci: rename cached key ci: restore the node modules in coverage job * ci: consistent caching keys chore: fix formatting in CI files chore: improve wording in CI files ci: remove redundant "pnpm install" steps * build: set peer dep version to "4.0.x" --------- Co-authored-by: Paul Razvan Berg --- .github/workflows/ci-deep.yml | 53 ++- .github/workflows/ci.yml | 82 ++-- .gitmodules | 24 - README.md | 37 +- lib/forge-std | 1 - lib/openzeppelin-contracts | 1 - lib/prb-math | 1 - lib/prb-test | 1 - lib/solady | 1 - lib/solarray | 1 - package.json | 13 +- pnpm-lock.yaml | 425 ++++++++++++++---- remappings.txt | 12 +- script/Base.s.sol | 2 +- script/Init.s.sol | 5 +- slither.config.json | 14 +- src/types/Math.sol | 12 - src/types/Tokens.sol | 11 - test/fork/LockupDynamic.t.sol | 2 +- test/fork/LockupLinear.t.sol | 2 +- .../createWithMilestones.t.sol | 2 +- .../lockup-dynamic/token-uri/tokenURI.t.sol | 8 +- .../lockup-linear/token-uri/tokenURI.t.sol | 8 +- .../cancel-multiple/cancelMultiple.t.sol | 2 +- .../withdraw-multiple/withdrawMultiple.t.sol | 2 +- .../lockup-dynamic/createWithMilestones.t.sol | 2 +- .../fuzz/lockup/cancelMultiple.t.sol | 2 +- .../fuzz/lockup/withdrawMultiple.t.sol | 2 +- test/invariant/Invariant.t.sol | 2 +- test/invariant/handlers/BaseHandler.sol | 4 +- .../concrete/nft-descriptor/hourglass.t.sol | 2 +- test/utils/Assertions.sol | 4 +- test/utils/DeployOptimized.sol | 2 +- test/utils/Precompiles.sol | 4 +- test/utils/Precompiles.t.sol | 2 +- test/utils/Utils.sol | 6 +- 36 files changed, 507 insertions(+), 247 deletions(-) delete mode 100644 .gitmodules delete mode 160000 lib/forge-std delete mode 160000 lib/openzeppelin-contracts delete mode 160000 lib/prb-math delete mode 160000 lib/prb-test delete mode 160000 lib/solady delete mode 160000 lib/solarray delete mode 100644 src/types/Math.sol delete mode 100644 src/types/Tokens.sol diff --git a/.github/workflows/ci-deep.yml b/.github/workflows/ci-deep.yml index f00248f20..66f525ad6 100644 --- a/.github/workflows/ci-deep.yml +++ b/.github/workflows/ci-deep.yml @@ -68,12 +68,24 @@ jobs: steps: - name: "Check out the repo" uses: "actions/checkout@v3" - with: - submodules: "recursive" - name: "Install Foundry" uses: "foundry-rs/foundry-toolchain@v1" + - name: "Install Pnpm" + uses: "pnpm/action-setup@v2" + with: + version: "8" + + - name: "Install Node.js" + uses: "actions/setup-node@v3" + with: + cache: "pnpm" + node-version: "lts/*" + + - name: "Install the Node.js dependencies" + run: "pnpm install" + - name: "Show the Foundry config" run: "forge config" @@ -81,14 +93,15 @@ jobs: run: "FOUNDRY_PROFILE=optimized forge build" - name: "Build the test contracts" - run: "FOUNDRY_PROFILE=test-optimized forge build" + run: "FOUNDRY_PROFILE=test-optimized forge build" - - name: "Cache the build so that it can be re-used by the other jobs" + - name: "Cache the build and the node modules so that they can be re-used by the other jobs" uses: "actions/cache/save@v3" with: - key: "foundry-build-${{ github.sha }}" + key: "build-and-modules-${{ github.sha }}" path: | cache + node_modules out out-optimized @@ -105,19 +118,18 @@ jobs: steps: - name: "Check out the repo" uses: "actions/checkout@v3" - with: - submodules: "recursive" - name: "Install Foundry" uses: "foundry-rs/foundry-toolchain@v1" - - name: "Restore the cached build" + - name: "Restore the cached build and the node modules" uses: "actions/cache/restore@v3" with: fail-on-cache-miss: true - key: "foundry-build-${{ github.sha }}" + key: "build-and-modules-${{ github.sha }}" path: | cache + node_modules out out-optimized @@ -137,19 +149,18 @@ jobs: steps: - name: "Check out the repo" uses: "actions/checkout@v3" - with: - submodules: "recursive" - name: "Install Foundry" uses: "foundry-rs/foundry-toolchain@v1" - - name: "Restore the cached build" + - name: "Restore the cached build and the node modules" uses: "actions/cache/restore@v3" with: fail-on-cache-miss: true - key: "foundry-build-${{ github.sha }}" + key: "build-and-modules-${{ github.sha }}" path: | cache + node_modules out out-optimized @@ -170,19 +181,18 @@ jobs: steps: - name: "Check out the repo" uses: "actions/checkout@v3" - with: - submodules: "recursive" - name: "Install Foundry" uses: "foundry-rs/foundry-toolchain@v1" - - name: "Restore the cached build" + - name: "Restore the cached build and the node modules" uses: "actions/cache/restore@v3" with: fail-on-cache-miss: true - key: "foundry-build-${{ github.sha }}" + key: "build-and-modules-${{ github.sha }}" path: | cache + node_modules out out-optimized @@ -202,19 +212,18 @@ jobs: steps: - name: "Check out the repo" uses: "actions/checkout@v3" - with: - submodules: "recursive" - name: "Install Foundry" uses: "foundry-rs/foundry-toolchain@v1" - - name: "Restore the cached build" + - name: "Restore the cached build and the node modules" uses: "actions/cache/restore@v3" with: fail-on-cache-miss: true - key: "foundry-build-${{ github.sha }}" + key: "build-and-modules-${{ github.sha }}" path: | cache + node_modules out out-optimized @@ -224,4 +233,4 @@ jobs: - name: "Add test summary" run: | echo "## Fork tests result" >> $GITHUB_STEP_SUMMARY - echo "✅ Passed" >> $GITHUB_STEP_SUMMARY \ No newline at end of file + echo "✅ Passed" >> $GITHUB_STEP_SUMMARY diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 59c164541..24a6f34b3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -53,8 +53,6 @@ jobs: steps: - name: "Check out the repo" uses: "actions/checkout@v3" - with: - submodules: "recursive" - name: "Install Foundry" uses: "foundry-rs/foundry-toolchain@v1" @@ -78,16 +76,17 @@ jobs: - name: "Generate and prepare the contract artifacts" run: "./shell/prepare-artifacts.sh" - + - name: "Build the test contracts" run: "FOUNDRY_PROFILE=test-optimized forge build" - - name: "Cache the build so that it can be re-used by the other jobs" + - name: "Cache the build and the node modules so that they can be re-used by the other jobs" uses: "actions/cache/save@v3" with: - key: "foundry-build-${{ github.sha }}" + key: "build-and-modules-${{ github.sha }}" path: | cache + node_modules out out-optimized @@ -109,19 +108,29 @@ jobs: steps: - name: "Check out the repo" uses: "actions/checkout@v3" - with: - submodules: "recursive" - name: "Install Foundry" uses: "foundry-rs/foundry-toolchain@v1" - - name: "Restore the cached build" + - name: "Install Pnpm" + uses: "pnpm/action-setup@v2" + with: + version: "8" + + - name: "Install Node.js" + uses: "actions/setup-node@v3" + with: + cache: "pnpm" + node-version: "lts/*" + + - name: "Restore the cached build and the node modules" uses: "actions/cache/restore@v3" with: fail-on-cache-miss: true - key: "foundry-build-${{ github.sha }}" + key: "build-and-modules-${{ github.sha }}" path: | cache + node_modules out out-optimized @@ -141,19 +150,18 @@ jobs: steps: - name: "Check out the repo" uses: "actions/checkout@v3" - with: - submodules: "recursive" - name: "Install Foundry" uses: "foundry-rs/foundry-toolchain@v1" - - name: "Restore the cached build" + - name: "Restore the cached build and the node modules" uses: "actions/cache/restore@v3" with: fail-on-cache-miss: true - key: "foundry-build-${{ github.sha }}" + key: "build-and-modules-${{ github.sha }}" path: | cache + node_modules out out-optimized @@ -171,19 +179,18 @@ jobs: steps: - name: "Check out the repo" uses: "actions/checkout@v3" - with: - submodules: "recursive" - name: "Install Foundry" uses: "foundry-rs/foundry-toolchain@v1" - - name: "Restore the cached build" + - name: "Restore the cached build and the node modules" uses: "actions/cache/restore@v3" with: fail-on-cache-miss: true - key: "foundry-build-${{ github.sha }}" + key: "build-and-modules-${{ github.sha }}" path: | cache + node_modules out out-optimized @@ -201,19 +208,18 @@ jobs: steps: - name: "Check out the repo" uses: "actions/checkout@v3" - with: - submodules: "recursive" - name: "Install Foundry" uses: "foundry-rs/foundry-toolchain@v1" - - name: "Restore the cached build" + - name: "Restore the cached build and the node modules" uses: "actions/cache/restore@v3" with: fail-on-cache-miss: true - key: "foundry-build-${{ github.sha }}" + key: "build-and-modules-${{ github.sha }}" path: | cache + node_modules out out-optimized @@ -233,19 +239,18 @@ jobs: steps: - name: "Check out the repo" uses: "actions/checkout@v3" - with: - submodules: "recursive" - name: "Install Foundry" uses: "foundry-rs/foundry-toolchain@v1" - - name: "Restore the cached build" + - name: "Restore the cached build and the node modules" uses: "actions/cache/restore@v3" with: fail-on-cache-miss: true - key: "foundry-build-${{ github.sha }}" + key: "build-and-modules-${{ github.sha }}" path: | cache + node_modules out out-optimized @@ -267,12 +272,21 @@ jobs: steps: - name: "Check out the repo" uses: "actions/checkout@v3" - with: - submodules: "recursive" - name: "Install Foundry" uses: "foundry-rs/foundry-toolchain@v1" + - name: "Restore the cached build and the node modules" + uses: "actions/cache/restore@v3" + with: + fail-on-cache-miss: true + key: "build-and-modules-${{ github.sha }}" + path: | + cache + node_modules + out + out-optimized + - name: "Generate the coverage report using the unit and the integration tests" run: "forge coverage --match-path \"test/{unit,integration}/**/*.sol\" --report lcov" @@ -296,8 +310,20 @@ jobs: steps: - name: "Check out the repo" uses: "actions/checkout@v3" + + - name: "Install Pnpm" + uses: "pnpm/action-setup@v2" with: - submodules: "recursive" + version: "8" + + - name: "Install Node.js" + uses: "actions/setup-node@v3" + with: + cache: "pnpm" + node-version: "lts/*" + + - name: "Install the Node.js dependencies" + run: "pnpm install" - name: "Run Slither analysis" uses: "crytic/slither-action@v0.3.0" diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 4c47bc02c..000000000 --- a/.gitmodules +++ /dev/null @@ -1,24 +0,0 @@ -[submodule "lib/forge-std"] - branch = "v1" - path = "lib/forge-std" - url = "https://github.com/foundry-rs/forge-std" -[submodule "lib/openzeppelin-contracts"] - branch = "release-v4.9" - path = "lib/openzeppelin-contracts" - url = "https://github.com/OpenZeppelin/openzeppelin-contracts" -[submodule "lib/prb-math"] - branch = "release-v4" - path = "lib/prb-math" - url = "https://github.com/PaulRBerg/prb-math" -[submodule "lib/prb-test"] - branch = "release-v0" - path = "lib/prb-test" - url = "https://github.com/PaulRBerg/prb-test" -[submodule "lib/solady"] - branch = "main" - path = "lib/solady" - url = "https://github.com/Vectorized/solady" -[submodule "lib/solarray"] - branch = "master" - path = "lib/solarray" - url = "https://github.com/evmcheb/solarray" diff --git a/README.md b/README.md index 3fcc3eda0..147a9d1e7 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,22 @@ of tokens deposited. ## Install +### Node.js (recommended) + +Sablier V2 Core is available as a Node.js package: + +```shell +yarn add @sablier/v2-core +``` + +Finally, add these to your `remappings.txt` file: + +```text +@sablier/v2-core/=node_modules/@sablier/v2-core/ +@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/ +@prb/math/=node_modules/@prb/math/ +``` + ### Foundry First, run the install step: @@ -34,27 +50,18 @@ First, run the install step: forge install sablier-labs/v2-core ``` -Your `.gitmodules` file should now contain the following entry: +Second, you need to install the project's dependencies: -```toml -[submodule "lib/v2-core"] - branch = "release" - path = "lib/v2-core" - url = "https://github.com/sablier-labs/v2-core" +```shell +forge install --no-commit OpenZeppelin/openzeppelin-contracts@v4.9.2 PaulRBerg/prb-math ``` -Finally, add this to your `remappings.txt` file: +Finally, add these to your `remappings.txt` file: ```text @sablier/v2-core/=lib/v2-core/ -``` - -### Node.js - -Sablier V2 Core is available as a Node.js package: - -```shell -pnpm add @sablier/v2-core +@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/ +@prb/math/=lib/prb-math/ ``` ## Usage diff --git a/lib/forge-std b/lib/forge-std deleted file mode 160000 index e8a047e3f..000000000 --- a/lib/forge-std +++ /dev/null @@ -1 +0,0 @@ -Subproject commit e8a047e3f40f13fa37af6fe14e6e06283d9a060e diff --git a/lib/openzeppelin-contracts b/lib/openzeppelin-contracts deleted file mode 160000 index e50c24f58..000000000 --- a/lib/openzeppelin-contracts +++ /dev/null @@ -1 +0,0 @@ -Subproject commit e50c24f5839db17f46991478384bfda14acfb830 diff --git a/lib/prb-math b/lib/prb-math deleted file mode 160000 index 77fa88eda..000000000 --- a/lib/prb-math +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 77fa88eda4a4a91b3f3e9431df291292c26b6c71 diff --git a/lib/prb-test b/lib/prb-test deleted file mode 160000 index 1e9ead2f7..000000000 --- a/lib/prb-test +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 1e9ead2f7bfaedda3038081c16484b0d7d0b2712 diff --git a/lib/solady b/lib/solady deleted file mode 160000 index c863813a6..000000000 --- a/lib/solady +++ /dev/null @@ -1 +0,0 @@ -Subproject commit c863813a6fa2068e1ec834ebc037ededb99a6f97 diff --git a/lib/solarray b/lib/solarray deleted file mode 160000 index 0625e7e43..000000000 --- a/lib/solarray +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 0625e7e4369eb299753fcb90a3cd7ffb91e1b5bc diff --git a/package.json b/package.json index 1c2791f0c..7e452e296 100644 --- a/package.json +++ b/package.json @@ -12,15 +12,20 @@ }, "dependencies": { "@openzeppelin/contracts": "4.9.2", - "@prb/math": "4.0.1", - "solhint": "^3.6.2" + "@prb/math": "4.0.2" }, "devDependencies": { - "prettier": "^2.8.8" + "@prb/test": "0.6.4", + "forge-std": "github:foundry-rs/forge-std#e8a047e3f40f13fa37af6fe14e6e06283d9a060e", + "prettier": "^2.8.8", + "solady": "0.0.129", + "solarray": "github:evmcheb/solarray#0625e7e4369eb299753fcb90a3cd7ffb91e1b5bc", + "solhint": "^4.0.0" }, "files": [ "artifacts", "src", + "test/utils", "CHANGELOG.md", "LICENSE-GPL.md" ], @@ -46,7 +51,7 @@ "web3" ], "peerDependencies": { - "@prb/math": "4.0.1" + "@prb/math": "4.0.x" }, "publishConfig": { "access": "public" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0dcfdc577..fa7d38c08 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,16 +9,28 @@ dependencies: specifier: 4.9.2 version: 4.9.2 '@prb/math': - specifier: 4.0.1 - version: 4.0.1 - solhint: - specifier: ^3.6.2 - version: 3.6.2 + specifier: 4.0.2 + version: 4.0.2 devDependencies: + '@prb/test': + specifier: 0.6.4 + version: 0.6.4 + forge-std: + specifier: github:foundry-rs/forge-std#e8a047e3f40f13fa37af6fe14e6e06283d9a060e + version: github.com/foundry-rs/forge-std/e8a047e3f40f13fa37af6fe14e6e06283d9a060e prettier: specifier: ^2.8.8 version: 2.8.8 + solady: + specifier: 0.0.129 + version: 0.0.129 + solarray: + specifier: github:evmcheb/solarray#0625e7e4369eb299753fcb90a3cd7ffb91e1b5bc + version: github.com/evmcheb/solarray/0625e7e4369eb299753fcb90a3cd7ffb91e1b5bc + solhint: + specifier: ^4.0.0 + version: 4.0.0 packages: @@ -27,12 +39,12 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/highlight': 7.22.5 - dev: false + dev: true /@babel/helper-validator-identifier@7.22.5: resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} engines: {node: '>=6.9.0'} - dev: false + dev: true /@babel/highlight@7.22.5: resolution: {integrity: sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==} @@ -41,21 +53,62 @@ packages: '@babel/helper-validator-identifier': 7.22.5 chalk: 2.4.2 js-tokens: 4.0.0 - dev: false + dev: true /@openzeppelin/contracts@4.9.2: resolution: {integrity: sha512-mO+y6JaqXjWeMh9glYVzVu8HYPGknAAnWyxTRhGeckOruyXQMNnlcW6w/Dx9ftLeIQk6N+ZJFuVmTwF7lEIFrg==} dev: false - /@prb/math@4.0.1: - resolution: {integrity: sha512-ANTz2KMV+dMdZ57mWgDTR6jZo5uQzUczQEHCxd7CvJZZ9yafnfPhUUILHvvigIOZ85fZbTPVkC8YoRG1z5Qf7g==} + /@pnpm/config.env-replace@1.1.0: + resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==} + engines: {node: '>=12.22.0'} + dev: true + + /@pnpm/network.ca-file@1.0.2: + resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==} + engines: {node: '>=12.22.0'} + dependencies: + graceful-fs: 4.2.10 + dev: true + + /@pnpm/npm-conf@2.2.2: + resolution: {integrity: sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==} + engines: {node: '>=12'} + dependencies: + '@pnpm/config.env-replace': 1.1.0 + '@pnpm/network.ca-file': 1.0.2 + config-chain: 1.1.13 + dev: true + + /@prb/math@4.0.2: + resolution: {integrity: sha512-kJgqvXR6iyU7+N959RzggSFhBdnRuSDnc/bs8u6MzdWw7aYIUaAr+uMVdpP6Dheypjerd7sfJgFOs19FRFhscg==} dev: false + /@prb/test@0.6.4: + resolution: {integrity: sha512-P0tTMsB6XQ0Wp61EYdXJYFhsOVGyZvcOFub2y9yk0sF+GYDusctR7DzEI+vOP0SILm3knFkEJASjewHEBppdRQ==} + dev: true + + /@sindresorhus/is@5.6.0: + resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} + engines: {node: '>=14.16'} + dev: true + /@solidity-parser/parser@0.16.0: resolution: {integrity: sha512-ESipEcHyRHg4Np4SqBCfcXwyxxna1DgFVz69bgpLV8vzl/NP1DtcKsJ4dJZXWQhY/Z4J2LeKBiOkOVZn9ct33Q==} dependencies: antlr4ts: 0.5.0-alpha.4 - dev: false + dev: true + + /@szmarczak/http-timer@5.0.1: + resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} + engines: {node: '>=14.16'} + dependencies: + defer-to-connect: 2.0.1 + dev: true + + /@types/http-cache-semantics@4.0.4: + resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + dev: true /ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} @@ -64,7 +117,7 @@ packages: fast-json-stable-stringify: 2.1.0 json-schema-traverse: 0.4.1 uri-js: 4.4.1 - dev: false + dev: true /ajv@8.12.0: resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} @@ -73,63 +126,81 @@ packages: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 uri-js: 4.4.1 - dev: false + dev: true /ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - dev: false + dev: true /ansi-styles@3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} engines: {node: '>=4'} dependencies: color-convert: 1.9.3 - dev: false + dev: true /ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} dependencies: color-convert: 2.0.1 - dev: false + dev: true /antlr4@4.13.0: resolution: {integrity: sha512-zooUbt+UscjnWyOrsuY/tVFL4rwrAGwOivpQmvmUDE22hy/lUA467Rc1rcixyRwcRUIXFYBwv7+dClDSHdmmew==} engines: {node: '>=16'} - dev: false + dev: true /antlr4ts@0.5.0-alpha.4: resolution: {integrity: sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==} - dev: false + dev: true /argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - dev: false + dev: true /ast-parents@0.0.1: resolution: {integrity: sha512-XHusKxKz3zoYk1ic8Un640joHbFMhbqneyoZfoKnEGtf2ey9Uh/IdpcQplODdO/kENaMIWsD0nJm4+wX3UNLHA==} - dev: false + dev: true /astral-regex@2.0.0: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} engines: {node: '>=8'} - dev: false + dev: true /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - dev: false + dev: true /brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} dependencies: balanced-match: 1.0.2 - dev: false + dev: true + + /cacheable-lookup@7.0.0: + resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} + engines: {node: '>=14.16'} + dev: true + + /cacheable-request@10.2.14: + resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==} + engines: {node: '>=14.16'} + dependencies: + '@types/http-cache-semantics': 4.0.4 + get-stream: 6.0.1 + http-cache-semantics: 4.1.1 + keyv: 4.5.4 + mimic-response: 4.0.0 + normalize-url: 8.0.0 + responselike: 3.0.0 + dev: true /callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - dev: false + dev: true /chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} @@ -138,7 +209,7 @@ packages: ansi-styles: 3.2.1 escape-string-regexp: 1.0.5 supports-color: 5.5.0 - dev: false + dev: true /chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} @@ -146,33 +217,40 @@ packages: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - dev: false + dev: true /color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: color-name: 1.1.3 - dev: false + dev: true /color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} dependencies: color-name: 1.1.4 - dev: false + dev: true /color-name@1.1.3: resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - dev: false + dev: true /color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - dev: false + dev: true /commander@10.0.1: resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} engines: {node: '>=14'} - dev: false + dev: true + + /config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + dev: true /cosmiconfig@8.2.0: resolution: {integrity: sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==} @@ -182,38 +260,65 @@ packages: js-yaml: 4.1.0 parse-json: 5.2.0 path-type: 4.0.0 - dev: false + dev: true + + /decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + dependencies: + mimic-response: 3.1.0 + dev: true + + /deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + dev: true + + /defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + dev: true /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - dev: false + dev: true /error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} dependencies: is-arrayish: 0.2.1 - dev: false + dev: true /escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} - dev: false + dev: true /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - dev: false + dev: true /fast-diff@1.3.0: resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} - dev: false + dev: true /fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - dev: false + dev: true + + /form-data-encoder@2.1.4: + resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} + engines: {node: '>= 14.17'} + dev: true /fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - dev: false + dev: true + + /get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: true /glob@8.1.0: resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} @@ -224,22 +329,55 @@ packages: inherits: 2.0.4 minimatch: 5.1.6 once: 1.4.0 - dev: false + dev: true + + /got@12.6.1: + resolution: {integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==} + engines: {node: '>=14.16'} + dependencies: + '@sindresorhus/is': 5.6.0 + '@szmarczak/http-timer': 5.0.1 + cacheable-lookup: 7.0.0 + cacheable-request: 10.2.14 + decompress-response: 6.0.0 + form-data-encoder: 2.1.4 + get-stream: 6.0.1 + http2-wrapper: 2.2.1 + lowercase-keys: 3.0.0 + p-cancelable: 3.0.0 + responselike: 3.0.0 + dev: true + + /graceful-fs@4.2.10: + resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} + dev: true /has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} - dev: false + dev: true /has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - dev: false + dev: true + + /http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + dev: true + + /http2-wrapper@2.2.1: + resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} + engines: {node: '>=10.19.0'} + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + dev: true /ignore@5.2.4: resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} engines: {node: '>= 4'} - dev: false + dev: true /import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} @@ -247,89 +385,149 @@ packages: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 - dev: false + dev: true /inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} dependencies: once: 1.4.0 wrappy: 1.0.2 - dev: false + dev: true /inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - dev: false + dev: true + + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: true /is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - dev: false + dev: true /is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - dev: false + dev: true /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - dev: false + dev: true /js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true dependencies: argparse: 2.0.1 - dev: false + dev: true + + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + dev: true /json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - dev: false + dev: true /json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - dev: false + dev: true /json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - dev: false + dev: true + + /keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + dependencies: + json-buffer: 3.0.1 + dev: true + + /latest-version@7.0.0: + resolution: {integrity: sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==} + engines: {node: '>=14.16'} + dependencies: + package-json: 8.1.1 + dev: true /lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - dev: false + dev: true /lodash.truncate@4.4.2: resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} - dev: false + dev: true /lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - dev: false + dev: true + + /lowercase-keys@3.0.0: + resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true /lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} dependencies: yallist: 4.0.0 - dev: false + dev: true + + /mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + dev: true + + /mimic-response@4.0.0: + resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true /minimatch@5.1.6: resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} engines: {node: '>=10'} dependencies: brace-expansion: 2.0.1 - dev: false + dev: true + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: true + + /normalize-url@8.0.0: + resolution: {integrity: sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==} + engines: {node: '>=14.16'} + dev: true /once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: wrappy: 1.0.2 - dev: false + dev: true + + /p-cancelable@3.0.0: + resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} + engines: {node: '>=12.20'} + dev: true + + /package-json@8.1.1: + resolution: {integrity: sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==} + engines: {node: '>=14.16'} + dependencies: + got: 12.6.1 + registry-auth-token: 5.0.2 + registry-url: 6.0.1 + semver: 7.5.4 + dev: true /parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} dependencies: callsites: 3.1.0 - dev: false + dev: true /parse-json@5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} @@ -339,37 +537,82 @@ packages: error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - dev: false + dev: true /path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - dev: false + dev: true /pluralize@8.0.0: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} - dev: false + dev: true /prettier@2.8.8: resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} engines: {node: '>=10.13.0'} hasBin: true + dev: true + + /proto-list@1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + dev: true /punycode@2.3.0: resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} engines: {node: '>=6'} - dev: false + dev: true + + /quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + dev: true + + /rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + dev: true + + /registry-auth-token@5.0.2: + resolution: {integrity: sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==} + engines: {node: '>=14'} + dependencies: + '@pnpm/npm-conf': 2.2.2 + dev: true + + /registry-url@6.0.1: + resolution: {integrity: sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==} + engines: {node: '>=12'} + dependencies: + rc: 1.2.8 + dev: true /require-from-string@2.0.2: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} - dev: false + dev: true + + /resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + dev: true /resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} - dev: false + dev: true + + /responselike@3.0.0: + resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} + engines: {node: '>=14.16'} + dependencies: + lowercase-keys: 3.0.0 + dev: true /semver@7.5.4: resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} @@ -377,7 +620,7 @@ packages: hasBin: true dependencies: lru-cache: 6.0.0 - dev: false + dev: true /slice-ansi@4.0.0: resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} @@ -386,10 +629,14 @@ packages: ansi-styles: 4.3.0 astral-regex: 2.0.0 is-fullwidth-code-point: 3.0.0 - dev: false + dev: true + + /solady@0.0.129: + resolution: {integrity: sha512-2i+8lsLLT7nAED+A9C+ZLi8YmpSnUNKGKozkesN2Qm3P3iMvorXAsD5LyT1MAC3eyVfhY3PuvBkvgd31nUzkoQ==} + dev: true - /solhint@3.6.2: - resolution: {integrity: sha512-85EeLbmkcPwD+3JR7aEMKsVC9YrRSxd4qkXuMzrlf7+z2Eqdfm1wHWq1ffTuo5aDhoZxp2I9yF3QkxZOxOL7aQ==} + /solhint@4.0.0: + resolution: {integrity: sha512-bFViMcFvhqVd/HK3Roo7xZXX5nbujS7Bxeg5vnZc9QvH0yCWCrQ38Yrn1pbAY9tlKROc6wFr+rK1mxYgYrjZgA==} hasBin: true dependencies: '@solidity-parser/parser': 0.16.0 @@ -403,6 +650,7 @@ packages: glob: 8.1.0 ignore: 5.2.4 js-yaml: 4.1.0 + latest-version: 7.0.0 lodash: 4.17.21 pluralize: 8.0.0 semver: 7.5.4 @@ -411,7 +659,7 @@ packages: text-table: 0.2.0 optionalDependencies: prettier: 2.8.8 - dev: false + dev: true /string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} @@ -420,28 +668,33 @@ packages: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - dev: false + dev: true /strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} dependencies: ansi-regex: 5.0.1 - dev: false + dev: true + + /strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + dev: true /supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} dependencies: has-flag: 3.0.0 - dev: false + dev: true /supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} dependencies: has-flag: 4.0.0 - dev: false + dev: true /table@6.8.1: resolution: {integrity: sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==} @@ -452,22 +705,34 @@ packages: slice-ansi: 4.0.0 string-width: 4.2.3 strip-ansi: 6.0.1 - dev: false + dev: true /text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - dev: false + dev: true /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: punycode: 2.3.0 - dev: false + dev: true /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - dev: false + dev: true /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: false + dev: true + + github.com/evmcheb/solarray/0625e7e4369eb299753fcb90a3cd7ffb91e1b5bc: + resolution: {tarball: https://codeload.github.com/evmcheb/solarray/tar.gz/0625e7e4369eb299753fcb90a3cd7ffb91e1b5bc} + name: solarray#0625e7e4369eb299753fcb90a3cd7ffb91e1b5bc + version: 0.0.0 + dev: true + + github.com/foundry-rs/forge-std/e8a047e3f40f13fa37af6fe14e6e06283d9a060e: + resolution: {tarball: https://codeload.github.com/foundry-rs/forge-std/tar.gz/e8a047e3f40f13fa37af6fe14e6e06283d9a060e} + name: forge-std + version: 1.5.6 + dev: true diff --git a/remappings.txt b/remappings.txt index b35a5d2ab..167506d32 100644 --- a/remappings.txt +++ b/remappings.txt @@ -1,6 +1,6 @@ -@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/ -@prb/math/=lib/prb-math/ -@prb/test/=lib/prb-test/src/ -forge-std/=lib/forge-std/src/ -solady/=lib/solady/src/ -solarray/=lib/solarray/src/ +@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/ +@prb/math/=node_modules/@prb/math/ +@prb/test/=node_modules/@prb/test/ +forge-std/=node_modules/forge-std/ +solady/=node_modules/solady/ +solarray/=node_modules/solarray/ \ No newline at end of file diff --git a/script/Base.s.sol b/script/Base.s.sol index 32b96a58e..e9f18740e 100644 --- a/script/Base.s.sol +++ b/script/Base.s.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: GPL-3.0-or-later pragma solidity >=0.8.19 <0.9.0; -import { Script } from "forge-std/Script.sol"; +import { Script } from "forge-std/src/Script.sol"; abstract contract BaseScript is Script { /// @dev Included to enable compilation of the script without a $MNEMONIC environment variable. diff --git a/script/Init.s.sol b/script/Init.s.sol index d5a970f28..8a99762ac 100644 --- a/script/Init.s.sol +++ b/script/Init.s.sol @@ -2,14 +2,15 @@ pragma solidity >=0.8.19 <0.9.0; import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import { ud2x18 } from "@prb/math/src/UD2x18.sol"; +import { ud60x18 } from "@prb/math/src/UD60x18.sol"; -import { Solarray } from "solarray/Solarray.sol"; +import { Solarray } from "solarray/src/Solarray.sol"; import { ISablierV2Comptroller } from "../src/interfaces/ISablierV2Comptroller.sol"; import { ISablierV2LockupDynamic } from "../src/interfaces/ISablierV2LockupDynamic.sol"; import { ISablierV2LockupLinear } from "../src/interfaces/ISablierV2LockupLinear.sol"; import { Broker, LockupDynamic, LockupLinear } from "../src/types/DataTypes.sol"; -import { ud2x18, ud60x18 } from "../src/types/Math.sol"; import { BaseScript } from "./Base.s.sol"; diff --git a/slither.config.json b/slither.config.json index 0776b9633..16f73fce4 100644 --- a/slither.config.json +++ b/slither.config.json @@ -1,12 +1,12 @@ { "detectors_to_exclude": "naming-convention,reentrancy-events,solc-version,timestamp", - "filter_paths": "(lib|test)", + "filter_paths": "(test)", "solc_remaps": [ - "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/", - "@prb/math/=lib/prb-math/", - "@prb/test/=lib/prb-test/src/", - "forge-std/=lib/forge-std/src/", - "solady/=lib/solady/src/", - "solarray/=lib/solarray/src/" + "@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/", + "@prb/math/=node_modules/@prb-math/", + "@prb/test/=node_modules/@prb/test/", + "forge-std/=node_modules/forge-std/", + "solady/=node_modules/solady/", + "solarray/=node_modules/solarray/" ] } diff --git a/src/types/Math.sol b/src/types/Math.sol deleted file mode 100644 index bccd1b910..000000000 --- a/src/types/Math.sol +++ /dev/null @@ -1,12 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-or-later -// solhint-disable no-unused-import -pragma solidity >=0.8.19; - -// Math.sol -// -// This file re-exports all PRBMath types used in V2 Core. It is provided for convenience so -// that users don't have to install PRBMath separately. - -import { SD59x18, sd, sd59x18 } from "@prb/math/src/SD59x18.sol"; -import { UD2x18, ud2x18 } from "@prb/math/src/UD2x18.sol"; -import { UD60x18, ud, ud60x18 } from "@prb/math/src/UD60x18.sol"; diff --git a/src/types/Tokens.sol b/src/types/Tokens.sol deleted file mode 100644 index 0bf468e5c..000000000 --- a/src/types/Tokens.sol +++ /dev/null @@ -1,11 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-or-later -// solhint-disable no-unused-import -pragma solidity >=0.8.19; - -// Tokens.sol -// -// This file re-exports all token interfaces used in V2 Core. It is provided for convenience so -// that users don't have to install OpenZeppelin separately. - -import { IERC721 } from "@openzeppelin/contracts/token/ERC721/IERC721.sol"; -import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; diff --git a/test/fork/LockupDynamic.t.sol b/test/fork/LockupDynamic.t.sol index 7a02372ba..54c671cb4 100644 --- a/test/fork/LockupDynamic.t.sol +++ b/test/fork/LockupDynamic.t.sol @@ -3,7 +3,7 @@ pragma solidity >=0.8.19 <0.9.0; import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import { UD60x18 } from "@prb/math/src/UD60x18.sol"; -import { Solarray } from "solarray/Solarray.sol"; +import { Solarray } from "solarray/src/Solarray.sol"; import { Broker, Lockup, LockupDynamic } from "src/types/DataTypes.sol"; diff --git a/test/fork/LockupLinear.t.sol b/test/fork/LockupLinear.t.sol index bd6016c64..e0fa7c6a6 100644 --- a/test/fork/LockupLinear.t.sol +++ b/test/fork/LockupLinear.t.sol @@ -3,7 +3,7 @@ pragma solidity >=0.8.19 <0.9.0; import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import { UD60x18, ud } from "@prb/math/src/UD60x18.sol"; -import { Solarray } from "solarray/Solarray.sol"; +import { Solarray } from "solarray/src/Solarray.sol"; import { Broker, Lockup, LockupLinear } from "src/types/DataTypes.sol"; diff --git a/test/integration/concrete/lockup-dynamic/create-with-milestones/createWithMilestones.t.sol b/test/integration/concrete/lockup-dynamic/create-with-milestones/createWithMilestones.t.sol index f065c4738..46e62461a 100644 --- a/test/integration/concrete/lockup-dynamic/create-with-milestones/createWithMilestones.t.sol +++ b/test/integration/concrete/lockup-dynamic/create-with-milestones/createWithMilestones.t.sol @@ -3,7 +3,7 @@ pragma solidity >=0.8.19 <0.9.0; import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import { UD60x18, ud, ZERO } from "@prb/math/src/UD60x18.sol"; -import { stdError } from "forge-std/StdError.sol"; +import { stdError } from "forge-std/src/StdError.sol"; import { ISablierV2LockupDynamic } from "src/interfaces/ISablierV2LockupDynamic.sol"; import { Errors } from "src/libraries/Errors.sol"; diff --git a/test/integration/concrete/lockup-dynamic/token-uri/tokenURI.t.sol b/test/integration/concrete/lockup-dynamic/token-uri/tokenURI.t.sol index 2c5714634..80f06f345 100644 --- a/test/integration/concrete/lockup-dynamic/token-uri/tokenURI.t.sol +++ b/test/integration/concrete/lockup-dynamic/token-uri/tokenURI.t.sol @@ -2,10 +2,10 @@ // solhint-disable max-line-length,no-console,quotes pragma solidity >=0.8.19 <0.9.0; -import { console2 } from "forge-std/console2.sol"; -import { LibString } from "solady/utils/LibString.sol"; -import { StdStyle } from "forge-std/StdStyle.sol"; -import { Base64 } from "solady/utils/Base64.sol"; +import { console2 } from "forge-std/src/console2.sol"; +import { LibString } from "solady/src/utils/LibString.sol"; +import { StdStyle } from "forge-std/src/StdStyle.sol"; +import { Base64 } from "solady/src/utils/Base64.sol"; import { LockupDynamic_Integration_Concrete_Test } from "../LockupDynamic.t.sol"; diff --git a/test/integration/concrete/lockup-linear/token-uri/tokenURI.t.sol b/test/integration/concrete/lockup-linear/token-uri/tokenURI.t.sol index cfe16f35d..2f1d12906 100644 --- a/test/integration/concrete/lockup-linear/token-uri/tokenURI.t.sol +++ b/test/integration/concrete/lockup-linear/token-uri/tokenURI.t.sol @@ -2,10 +2,10 @@ // solhint-disable max-line-length,no-console,quotes pragma solidity >=0.8.19 <0.9.0; -import { console2 } from "forge-std/console2.sol"; -import { LibString } from "solady/utils/LibString.sol"; -import { StdStyle } from "forge-std/StdStyle.sol"; -import { Base64 } from "solady/utils/Base64.sol"; +import { console2 } from "forge-std/src/console2.sol"; +import { LibString } from "solady/src/utils/LibString.sol"; +import { StdStyle } from "forge-std/src/StdStyle.sol"; +import { Base64 } from "solady/src/utils/Base64.sol"; import { LockupLinear_Integration_Concrete_Test } from "../LockupLinear.t.sol"; diff --git a/test/integration/concrete/lockup/cancel-multiple/cancelMultiple.t.sol b/test/integration/concrete/lockup/cancel-multiple/cancelMultiple.t.sol index 4aab9c7c5..0e69e0b64 100644 --- a/test/integration/concrete/lockup/cancel-multiple/cancelMultiple.t.sol +++ b/test/integration/concrete/lockup/cancel-multiple/cancelMultiple.t.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: UNLICENSED pragma solidity >=0.8.19 <0.9.0; -import { Solarray } from "solarray/Solarray.sol"; +import { Solarray } from "solarray/src/Solarray.sol"; import { ISablierV2Lockup } from "src/interfaces/ISablierV2Lockup.sol"; import { Errors } from "src/libraries/Errors.sol"; diff --git a/test/integration/concrete/lockup/withdraw-multiple/withdrawMultiple.t.sol b/test/integration/concrete/lockup/withdraw-multiple/withdrawMultiple.t.sol index 33173b6a5..308fc2b3a 100644 --- a/test/integration/concrete/lockup/withdraw-multiple/withdrawMultiple.t.sol +++ b/test/integration/concrete/lockup/withdraw-multiple/withdrawMultiple.t.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: UNLICENSED pragma solidity >=0.8.19 <0.9.0; -import { Solarray } from "solarray/Solarray.sol"; +import { Solarray } from "solarray/src/Solarray.sol"; import { ISablierV2Lockup } from "src/interfaces/ISablierV2Lockup.sol"; import { Errors } from "src/libraries/Errors.sol"; diff --git a/test/integration/fuzz/lockup-dynamic/createWithMilestones.t.sol b/test/integration/fuzz/lockup-dynamic/createWithMilestones.t.sol index d64dfee64..cbcf7d2c0 100644 --- a/test/integration/fuzz/lockup-dynamic/createWithMilestones.t.sol +++ b/test/integration/fuzz/lockup-dynamic/createWithMilestones.t.sol @@ -2,7 +2,7 @@ pragma solidity >=0.8.19 <0.9.0; import { MAX_UD60x18, UD60x18, ud, ZERO } from "@prb/math/src/UD60x18.sol"; -import { stdError } from "forge-std/StdError.sol"; +import { stdError } from "forge-std/src/StdError.sol"; import { Errors } from "src/libraries/Errors.sol"; import { Broker, Lockup, LockupDynamic } from "src/types/DataTypes.sol"; diff --git a/test/integration/fuzz/lockup/cancelMultiple.t.sol b/test/integration/fuzz/lockup/cancelMultiple.t.sol index a5333106e..d9e2b451e 100644 --- a/test/integration/fuzz/lockup/cancelMultiple.t.sol +++ b/test/integration/fuzz/lockup/cancelMultiple.t.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: UNLICENSED pragma solidity >=0.8.19 <0.9.0; -import { Solarray } from "solarray/Solarray.sol"; +import { Solarray } from "solarray/src/Solarray.sol"; import { Lockup } from "src/types/DataTypes.sol"; diff --git a/test/integration/fuzz/lockup/withdrawMultiple.t.sol b/test/integration/fuzz/lockup/withdrawMultiple.t.sol index eff464020..e26326d4c 100644 --- a/test/integration/fuzz/lockup/withdrawMultiple.t.sol +++ b/test/integration/fuzz/lockup/withdrawMultiple.t.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: UNLICENSED pragma solidity >=0.8.19 <0.9.0; -import { Solarray } from "solarray/Solarray.sol"; +import { Solarray } from "solarray/src/Solarray.sol"; import { Lockup } from "src/types/DataTypes.sol"; diff --git a/test/invariant/Invariant.t.sol b/test/invariant/Invariant.t.sol index e9e3b3fa5..8e563b6c5 100644 --- a/test/invariant/Invariant.t.sol +++ b/test/invariant/Invariant.t.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: UNLICENSED pragma solidity >=0.8.19 <0.9.0; -import { StdInvariant } from "forge-std/StdInvariant.sol"; +import { StdInvariant } from "forge-std/src/StdInvariant.sol"; import { Base_Test } from "../Base.t.sol"; import { ComptrollerHandler } from "./handlers/ComptrollerHandler.sol"; diff --git a/test/invariant/handlers/BaseHandler.sol b/test/invariant/handlers/BaseHandler.sol index 797f7932b..75523ea07 100644 --- a/test/invariant/handlers/BaseHandler.sol +++ b/test/invariant/handlers/BaseHandler.sol @@ -2,8 +2,8 @@ pragma solidity >=0.8.19 <0.9.0; import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import { Vm } from "@prb/test/PRBTest.sol"; -import { StdCheats } from "forge-std/StdCheats.sol"; +import { Vm } from "@prb/test/src/PRBTest.sol"; +import { StdCheats } from "forge-std/src/StdCheats.sol"; import { Constants } from "../../utils/Constants.sol"; import { Fuzzers } from "../../utils/Fuzzers.sol"; diff --git a/test/unit/concrete/nft-descriptor/hourglass.t.sol b/test/unit/concrete/nft-descriptor/hourglass.t.sol index 257ebbd90..4c67580de 100644 --- a/test/unit/concrete/nft-descriptor/hourglass.t.sol +++ b/test/unit/concrete/nft-descriptor/hourglass.t.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: UNLICENSED pragma solidity >=0.8.19 <0.9.0; -import { LibString } from "solady/utils/LibString.sol"; +import { LibString } from "solady/src/utils/LibString.sol"; import { SVGElements } from "src/libraries/SVGElements.sol"; diff --git a/test/utils/Assertions.sol b/test/utils/Assertions.sol index 0966009f8..f4f86cd5c 100644 --- a/test/utils/Assertions.sol +++ b/test/utils/Assertions.sol @@ -2,8 +2,8 @@ pragma solidity >=0.8.19; import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import { PRBMathAssertions } from "@prb/math/src/test/Assertions.sol"; -import { PRBTest } from "@prb/test/PRBTest.sol"; +import { PRBMathAssertions } from "@prb/math/test/utils/Assertions.sol"; +import { PRBTest } from "@prb/test/src/PRBTest.sol"; import { Lockup, LockupDynamic, LockupLinear } from "../../src/types/DataTypes.sol"; diff --git a/test/utils/DeployOptimized.sol b/test/utils/DeployOptimized.sol index 7fc9f8815..6891b70cf 100644 --- a/test/utils/DeployOptimized.sol +++ b/test/utils/DeployOptimized.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: UNLICENSED pragma solidity >=0.8.19 <0.9.0; -import { StdCheats } from "forge-std/StdCheats.sol"; +import { StdCheats } from "forge-std/src/StdCheats.sol"; import { ISablierV2Comptroller } from "../../src/interfaces/ISablierV2Comptroller.sol"; import { ISablierV2LockupDynamic } from "../../src/interfaces/ISablierV2LockupDynamic.sol"; diff --git a/test/utils/Precompiles.sol b/test/utils/Precompiles.sol index 8fb7deb4c..07c44ac94 100644 --- a/test/utils/Precompiles.sol +++ b/test/utils/Precompiles.sol @@ -27,9 +27,9 @@ contract Precompiles { bytes public constant BYTECODE_COMPTROLLER = hex"60803461009857601f6104a638819003918201601f19168301916001600160401b0383118484101761009d5780849260209460405283398101031261009857516001600160a01b0381169081900361009857600080546001600160a01b0319168217815560405191907fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a36103f290816100b48239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe608060408181526004918236101561001657600080fd5b600092833560e01c9182634d81e51d1461039d5750816375829def146102e5578163907a267b14610253578163b5b3ca2c146101ab578163cb01e30e146100f957508063dcf844a7146100c3578063e07df5b4146100a55763f851a4401461007d57600080fd5b346100a157816003193601126100a1576001600160a01b0360209254169051908152f35b5080fd5b50346100a157816003193601126100a1576020906001549051908152f35b50346100a15760203660031901126100a157806020926001600160a01b036100e96103d7565b1681526003845220549051908152f35b9050346101a75760203660031901126101a7576101146103d7565b6001600160a01b03918285541633810361017a575050169081835260026020528083209081549160ff8316159260ff84169060ff1916179055519081527f8cd3a7bc46b26a3b0c07a05a47af78abcaa647626f631d92ea64f8867b23bbec60203392a380f35b84516331b339a960e21b81526001600160a01b039091169181019182523360208301529081906040010390fd5b8280fd5b9050346101a757816003193601126101a7576101c56103d7565b90602435916001600160a01b039182865416338103610226575050907f371789a3d97098f3070492613273a065a7e8a19e009fd1ae92a4b4d4c71ed62d9116928385526003602052808520928084549455815193845260208401523392a380f35b85516331b339a960e21b81526001600160a01b039091169181019182523360208301529081906040010390fd5b919050346101a75760203660031901126101a7578135916001600160a01b038454163381036102b85750507fc059ba3e07a1c4d1fa8845bdb2af2dd85e844684e0a59e6073499e4338788465906001549280600155815193845260208401523392a280f35b82516331b339a960e21b81526001600160a01b039091169181019182523360208301529081906040010390fd5b919050346101a75760203660031901126101a7578135916001600160a01b03918284168094036103995784549283169033820361036d575050507fffffffffffffffffffffffff00000000000000000000000000000000000000001681178255337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808380a380f35b516331b339a960e21b81526001600160a01b039091169181019182523360208301529081906040010390fd5b8480fd5b849084346101a75760203660031901126101a75760ff906020936001600160a01b036103c76103d7565b1681526002855220541615158152f35b600435906001600160a01b03821682036103ed57565b600080fd"; bytes public constant BYTECODE_LOCKUP_DYNAMIC = - hex"60c0346200046e57601f62005ca638819003918201601f19168301916001600160401b038311848410176200032b578084926080946040528339810103126200046e5780516001600160a01b038082169290918390036200046e5760208101518281168091036200046e5760408201519183831683036200046e5760600151936200008962000473565b90601d82527f5361626c696572205632204c6f636b75702044796e616d6963204e46540000006020830152620000be62000473565b601181527029a0a116ab1916a627a1a5aaa816a22ca760791b602082015230608052600080546001600160a01b03199081168417825560018054909116909517909455927fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a38051906001600160401b0382116200032b5760035490600182811c9216801562000463575b60208310146200044d5781601f849311620003d8575b50602090601f83116001146200034d5760009262000341575b50508160011b916000199060031b1c1916176003555b80516001600160401b0381116200032b576004918254600181811c9116801562000320575b60208210146200030b579081601f849311620002b3575b50602090601f831160011462000248576000926200023c575b50508160011b916000199060031b1c19161790555b1660018060a01b0319600a541617600a5560a052600160095560405161581290816200049482396080518161526e015260a05181818161120e01526147ce0152f35b015190503880620001e5565b6000858152602081209350601f198516905b8181106200029a575090846001959493921062000280575b505050811b019055620001fa565b015160001960f88460031b161c1916905538808062000272565b929360206001819287860151815501950193016200025a565b909150836000526020600020601f840160051c8101916020851062000300575b90601f859493920160051c01905b818110620002f05750620001cc565b60008155849350600101620002e1565b9091508190620002d3565b602284634e487b7160e01b6000525260246000fd5b90607f1690620001b5565b634e487b7160e01b600052604160045260246000fd5b0151905038806200017a565b600360009081527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b9350601f198516905b818110620003bf5750908460019594939210620003a5575b505050811b0160035562000190565b015160001960f88460031b161c1916905538808062000396565b929360206001819287860151815501950193016200037e565b60036000529091507fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f840160051c8101916020851062000442575b90601f859493920160051c01905b81811062000432575062000161565b6000815584935060010162000423565b909150819062000415565b634e487b7160e01b600052602260045260246000fd5b91607f16916200014b565b600080fd5b60408051919082016001600160401b038111838210176200032b5760405256fe608080604052600436101561001357600080fd5b60003560e01c90816301ffc9a7146128d25750806306fdde031461280f578063081812fc146127f1578063095ea7b31461265d5780631400ecec146125b8578063168444561461233d5780631c1cdd4c146122d75780631e99d569146122b957806323b872dd1461229057806339a73c031461224d57806340e58ee514612014578063425d30dd14611ff657806342842e0e14611fa657806342966c6814611e285780634857501f14611db25780634869e12d14611d765780635fe3b56714611d4f5780636352211e14611d205780636d0cee7514611cc857806370a0823114611c1e57806375829def14611b8c5780637cad6cd114611aba5780637de6b1db146118ce5780638659c270146115f0578063894e9a0d146113835780638bad38dd146113075780638f69b993146112845780639067b677146112315780639188ec84146111f657806395d89b41146110e8578063a22cb46514611017578063a2ffb89714610f1e578063a6202bf214610e1e578063a80fc07114610dc9578063ad35efd414610d66578063b256456914610d48578063b637b86514610ce8578063b88d4fde14610c5f578063b8a3be6614610c28578063b971302a14610bd6578063bc063e1a14610bb3578063bc2be1be14610b60578063c156a11d14610aac578063c33cd35e14610997578063c87b56dd14610864578063cc364f48146107ca578063d4dbd20b14610775578063d511609f14610726578063d975dfed146106d9578063e985e9c514610682578063ea5ead1914610652578063eac8f5b8146105e6578063f590c176146105be578063f851a440146105975763fdd46d601461027c57600080fd5b34610480576060366003190112610480576004356102986129ff565b604435916001600160801b039182841693848103610480576102b8615264565b6102c1836132ed565b61057f576102e583600052600b6020526001600160a01b0360406000205416331490565b9182158061056f575b6105505783600052602094600586526001600160a01b039081604060002054169480610544575b61051e5781831693841561050d5788156104f55761033287615326565b8281168a116104c1575091889161038e6103626103cb958a600052600b8c5260026040600020015460801c615622565b89600052600b8b52600260406000200190836001600160801b031983549260801b169116178155613282565b906103aa818b8401511692826040818351169201511690613324565b16111561048f575b86600052600b88526001604060002001541692836152c0565b81847f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d876040518a8152a48133141580610485575b61041f575b6000805160206157e68339815191528484604051908152a1005b813b15610480576000805160206157e68339815191529460846000928360405195869485936313375c3b60e01b8552896004860152336024860152604485015260648401525af1610471575b80610405565b61047a90612b72565b3861046b565b600080fd5b50813b1515610400565b86600052600b8852604060002060018101600160a01b60ff60a01b1982541617905560ff60f01b1981541690556103b2565b60405163287ecaef60e21b8152600481018990526001600160801b03928316602482015291166044820152606490fd5b0390fd5b6024876040519063d2aabcd960e01b82526004820152fd5b600460405163630d074f60e11b8152fd5b606486838560405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b50848284161415610315565b60405163216caf0d60e01b815260048101859052336024820152604490fd5b506105798461563d565b156102ee565b60248360405190634a5541ef60e01b82526004820152fd5b346104805760003660031901126104805760206001600160a01b0360005416604051908152f35b346104805760203660031901126104805760206105dc60043561333d565b6040519015158152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260206001600160a01b0360016040600020015416604051908152f35b6024906040519062b8e7e760e51b82526004820152fd5b34610480576040366003190112610480576106806004356106716129ff565b61067a82615326565b9161535e565b005b346104805760403660031901126104805761069b6129e9565b6106a36129ff565b906001600160a01b03809116600052600860205260406000209116600052602052602060ff604060002054166040519015158152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57610715602091615326565b6001600160801b0360405191168152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b602052602060026040600020015460801c604051908152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260206001600160801b0360036040600020015416604051908152f35b3461048057602036600319011261048057600435600060206040516107ee81612b39565b828152015280600052600b60205260ff60016040600020015460a81c161561063b57600052600b6020526040806000205464ffffffffff82519161083183612b39565b818160a01c16835260c81c166020820152610862825180926020908164ffffffffff91828151168552015116910152565bf35b346104805760208060031936011261048057600435906108a261089d8360005260056020526001600160a01b0360406000205416151590565b612bd8565b60006001600160a01b03600a5416926044604051809581937fe9dc637500000000000000000000000000000000000000000000000000000000835230600484015260248301525afa91821561098b57600092610912575b5061090e6040519282849384528301906129c4565b0390f35b9091503d806000833e6109258183612b86565b81019082818303126104805780519067ffffffffffffffff8211610480570181601f8201121561048057805161095a81612ba8565b926109686040519485612b86565b81845284828401011161048057610984918480850191016129a1565b90826108f9565b6040513d6000823e3d90fd5b3461048057600319602036820112610480576004359067ffffffffffffffff9081831161048057610140908336030112610480576109d3615264565b604051916109e083612b1c565b6109ec81600401612a15565b83526109fa6024820161336e565b6020840152610a0b60448201612af3565b6040840152610a1c60648201612af3565b6060840152610a2d60848201612a15565b6080840152610a3e60a48201612bc4565b60a0840152610a4f60c48201612a15565b60c0840152610a613660e48301613454565b60e084015261012481013591821161048057013660238201121561048057602091610a99610aa4923690602460048201359101613380565b610100820152614720565b604051908152f35b3461048057604036600319011261048057600435610ac86129ff565b90610ad1615264565b80600052600b60205260ff60016040600020015460a81c161561063b578060005260056020526001600160a01b036040600020541691823303610b415761068092610b1b83615326565b6001600160801b038116610b30575b50612e6b565b610b3b90828561535e565b84610b2a565b60405163216caf0d60e01b815260048101839052336024820152604490fd5b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b602052602064ffffffffff60406000205460a01c16604051908152f35b3461048057600036600319011261048057602060405167016345785d8a00008152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260206001600160a01b0360406000205416604051908152f35b3461048057602036600319011261048057600435600052600b602052602060ff60016040600020015460a81c166040519015158152f35b3461048057608036600319011261048057610c786129e9565b610c806129ff565b6064359167ffffffffffffffff8311610480573660238401121561048057826004013591610cad83612ba8565b92610cbb6040519485612b86565b80845236602482870101116104805760208160009260246106809801838801378501015260443591612cf6565b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205261090e610d3460046040600020016131d5565b604051918291602083526020830190612a8f565b346104805760203660031901126104805760206105dc6004356132b6565b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57610da090614624565b6040516005821015610db3576020918152f35b634e487b7160e01b600052602160045260246000fd5b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260206001600160801b0360026040600020015416604051908152f35b3461048057602036600319011261048057610e376129e9565b6001600160a01b038060005416338103610ef557508116908160005260026020526001600160801b0360406000205416908115610ec45781610e969184600052600260205260406000206001600160801b0319815416905533906152c0565b6040519081527fca7a4a65a94ed2f37538814e00e1cd4c41a78261561e3f3794592f11409cf5af60203392a3005b602483604051907f8410168c0000000000000000000000000000000000000000000000000000000082526004820152fd5b6040516331b339a960e21b81526001600160a01b03919091166004820152336024820152604490fd5b346104805760603660031901126104805767ffffffffffffffff60043581811161048057610f50903690600401612a5e565b610f586129ff565b9260443590811161048057610f71903690600401612a5e565b9190610f7b615264565b828203610fe05760005b828110610f8e57005b806000805160206157e68339815191526020610fad600194878a61534e565b35610fd3610fc4610fbf868b8a61534e565b613440565b610fcc615264565b8b8361538b565b604051908152a101610f85565b50604491604051917faec9344000000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b34610480576040366003190112610480576110306129e9565b60243590811515809203610480576001600160a01b0316908133146110a457336000526008602052604060002082600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a3005b606460405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152fd5b3461048057600036600319011261048057604051600060045490600182811c918184169182156111ec575b60209485851084146111d65785879486865291826000146111b6575050600114611159575b5061114592500383612b86565b61090e6040519282849384528301906129c4565b84915060046000527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b906000915b85831061119e575050611145935082010185611138565b80548389018501528794508693909201918101611187565b60ff19168582015261114595151560051b85010192508791506111389050565b634e487b7160e01b600052602260045260246000fd5b92607f1692611113565b346104805760003660031901126104805760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b602052602064ffffffffff60406000205460c81c16604051908152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b576112be90614624565b600581101580610db357600282149081156112fa575b81156112e8575b6020826040519015158152f35b9050610db357600460209114826112db565b50506003811460006112d4565b34610480576020366003190112610480576004356001600160a01b0390818116809103610480578160005416338103610ef5575060015491816001600160a01b03198416176001556040519216825260208201527fdcb09aef4bf01068924ccce937981cbe59d25ba08380cf941aaaea4e4bd3960d60403392a2005b346104805760203660031901126104805760606101406040516113a581612b55565b60008152600060208201526000604082015260008382015260006080820152600060a0820152600060c0820152600060e082015260006101008201526113e9613263565b6101208201520152600435600052600b60205260ff60016040600020015460a81c16156115d857600435600052600b60205260406000206114cc60046040519261143284612b55565b80546001600160a01b038116855264ffffffffff8160a01c16602086015264ffffffffff8160c81c16604086015260ff8160f01c161515606086015260f81c1515608085015260ff60018201546001600160a01b03811660a0870152818160a01c16151560c0870152818160a81c16151560e087015260b01c1615156101008501526114c060028201613282565b610120850152016131d5565b6101408201526114dd600435614624565b906005821015610db357600261014092146115cc575b61090e604051928392602084526001600160a01b03815116602085015264ffffffffff602082015116604085015264ffffffffff60408201511660608501526060810151151560808501526080810151151560a08501526001600160a01b0360a08201511660c085015260c0810151151560e085015260e0810151151561010085015261010081015115156101208501526115b861012082015183860190604090816001600160801b0391828151168552826020820151166020860152015116910152565b01516101a0808401526101c0830190612a8f565b600060608201526114f3565b602460405162b8e7e760e51b81526004356004820152fd5b34610480576020806003193601126104805760043567ffffffffffffffff811161048057611622903690600401612a5e565b9061162b615264565b6000915b80831061163857005b61164383828461534e565b359261164d615264565b611656846132ed565b156116735760248460405190634a5541ef60e01b82526004820152fd5b61167f8492939461333d565b6118b6576116a382600052600b6020526001600160a01b0360406000205416331490565b15610b41576116b182613483565b82600052600b8087526116ca6002604060002001613282565b906001600160801b039283835116848216101561189e578560005281895260ff60406000205460f01c1615611886579061173882858b61172e7f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa509683895116613324565b9601511690613324565b9580600052818a526040600020938a855498600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8b16178755600388821697881561186c575b0197831697886001600160801b03198254161790556001600160a01b03809a16958691600584528b604060002054169687945260019b8c6040600020015416946117cb8b85886152c0565b604080518881526001600160801b0392831660208201529290911690820152606090a46000805160206157e68339815191528a604051838152a1813b611819575b505050505001919061162f565b813b15610480576000608492819560405197889687956372eba20360e01b875260048701526024860152604485015260648401525af161185d575b8080808061180c565b61186690612b72565b85611854565b60018101600160a01b60ff60a01b19825416179055611780565b602486604051906339c6dc7360e21b82526004820152fd5b602486604051906322cad1af60e11b82526004820152fd5b6024826040519063fe19f19f60e01b82526004820152fd5b346104805760208060031936011261048057600435906118ec615264565b81600052600b815260ff60016040600020015460a81c1615611aa35761191182614624565b6005811015610db3576004810361193a5760248360405190634a5541ef60e01b82526004820152fd5b6003810361195a576024836040519063fe19f19f60e01b82526004820152fd5b600214611a8b5761198182600052600b6020526001600160a01b0360406000205416331490565b15610b415781600052600b815260ff60406000205460f01c1615611a735781600052600b8152604060002060ff60f01b19815416905560405191807f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f600080a2600582526001600160a01b036040600020541692833b611a16575b6000805160206157e68339815191528383604051908152a1005b833b1561048057600081602481836000805160206157e6833981519152987f341a0bd90000000000000000000000000000000000000000000000000000000083528760048401525af1156119fc57611a6d90612b72565b836119fc565b602482604051906339c6dc7360e21b82526004820152fd5b602482604051906322cad1af60e11b82526004820152fd5b6024826040519062b8e7e760e51b82526004820152fd5b34610480576020366003190112610480576004356001600160a01b0390818116809103610480578160005416338103610ef55750600a5491816001600160a01b0319841617600a556040519216825260208201527fa2548bd4b805e907c1558a47b5858324fe8bb4a2e1ddfca647eecbf65610eebc60403392a26009546000198101908111611b765760407f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c91815190600182526020820152a1005b634e487b7160e01b600052601160045260246000fd5b3461048057602036600319011261048057611ba56129e9565b6000546001600160a01b0380821692338403611bf7576001600160a01b03199350169182911617600055337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf80600080a3005b6040516331b339a960e21b81526001600160a01b0385166004820152336024820152604490fd5b34610480576020366003190112610480576001600160a01b03611c3f6129e9565b168015611c5e5760005260066020526020604060002054604051908152f35b608460405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e657200000000000000000000000000000000000000000000006064820152fd5b3461048057602036600319011261048057600435611cff61089d8260005260056020526001600160a01b0360406000205416151590565b600052600560205260206001600160a01b0360406000205416604051908152f35b34610480576020366003190112610480576020611d3e600435612c23565b6001600160a01b0360405191168152f35b346104805760003660031901126104805760206001600160a01b0360015416604051908152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b576107156020916146a5565b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b576000611dee82614624565b6005811015610db357600203611e0c575b6020906040519015158152f35b50600052600b602052602060ff60406000205460f01c16611dff565b3461048057602036600319011261048057600435611e44615264565b611e4d816132ed565b15611f7557611e5b8161563d565b15611f5557611e6981612c23565b611e72826132b6565b159081611f4c575b81611f39575b50611f2157602081611ea06000805160206157e683398151915293612c23565b9080600052600783526001600160a01b036040600020926001600160a01b031993848154169055169182600052600684526040600020600019815401905581600052600584526040600020908154169055806000604051937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a48152a1005b60249060405190630da9b01360e01b82526004820152fd5b6001600160a01b03915016151582611e80565b60009150611e7a565b60405163216caf0d60e01b81526004810191909152336024820152604490fd5b602490604051907f817cd6390000000000000000000000000000000000000000000000000000000082526004820152fd5b3461048057611fb436612a29565b60405191602083019383851067ffffffffffffffff861117611fe0576106809460405260008452612cf6565b634e487b7160e01b600052604160045260246000fd5b346104805760203660031901126104805760206105dc6004356132ed565b34610480576020806003193601126104805760043590612032615264565b61203b826132ed565b156120585760248260405190634a5541ef60e01b82526004820152fd5b6120618261333d565b6118b65761208582600052600b6020526001600160a01b0360406000205416331490565b15610b415761209382613483565b9180600052600b82526120ac6002604060002001613282565b906001600160801b0393848351168582161015611a8b5781600052600b845260ff60406000205460f01c1615611a73578085856120ef6120f99483885116613324565b9501511690613324565b9080600052600b84526000805160206157e6833981519152604060002094855494600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff87161787556003888616978815612233575b0197811697886001600160801b03198254161790556001600160a01b038096169560058352867f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa508260406000205416978893600b875260016040600020015416946121bc8d85886152c0565b604080518a81526001600160801b0392831660208201529290911690820152606090a4604051838152a1813b6121ee57005b813b15610480576000608492819560405197889687956372eba20360e01b875260048701526024860152604485015260648401525af161222a57005b61068090612b72565b60018101600160a01b60ff60a01b19825416179055612150565b34610480576020366003190112610480576001600160a01b0361226e6129e9565b16600052600260205260206001600160801b0360406000205416604051908152f35b34610480576106806122a136612a29565b916122b46122af8433612d8c565b612c85565b612e6b565b34610480576000366003190112610480576020600954604051908152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b5761231190614624565b6005811015610db3578060209115908115612332575b506040519015158152f35b600191501482612327565b346104805760206003198181360112610480576004359067ffffffffffffffff9081831161048057610120833603918201126104805761237b615264565b6101048301359060221901811215610480578201600481013590828211610480576024016060820236038113610480576123b6913691613380565b918251906123c3826131bd565b916123d16040519384612b86565b808352601f196123e0826131bd565b018660005b8281106125a25750505064ffffffffff90814216946001600160801b03968761240d826134ee565b515116828a61241b846134ee565b510151168580604061242c866134ee565b510151168a0116906040519261244184612b00565b83528b8301526040820152612455876134ee565b5261245f866134ee565b5060019386855b8a8c87831061252157908b846001600160a01b038c60a48101358281169081900361048057610aa4956124e195612511946124a36024860161341f565b6124af6044870161341f565b6124bb6064880161342c565b916124c88860040161342c565b94846124d660848b01613440565b966040519d8e612b1c565b168c528d8c0152151560408b0152151560608a01521660808801521660a086015260c085015260c4369101613454565b60e0830152610100820152614720565b8893858060406125558b866125458a8e9a61253c828d613511565b5151169a613511565b5101511694600019890190613511565b51015116816040612566888c613511565b510151160116916040519361257a85612b00565b8452830152604082015261258e828b613511565b52612599818a613511565b50018790612466565b6125aa613263565b8282880101520187906123e5565b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b5760209060009080600052600b8352604060002060ff815460f01c168061264b575b612622575b50506001600160801b0360405191168152f35b61264492506001600160801b03600261263e9201541691613483565b90613324565b828061260f565b5060ff600182015460a01c161561260a565b34610480576040366003190112610480576126766129e9565b602435906001600160a01b03808061268d85612c23565b1692169180831461278757803314908115612762575b50156126f8578260005260076020526040600020826001600160a01b03198254161790556126d083612c23565b167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b608460405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152fd5b9050600052600860205260406000203360005260205260ff60406000205416846126a3565b608460405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152fd5b34610480576020366003190112610480576020611d3e600435612c48565b3461048057600036600319011261048057604051600060035490600182811c918184169182156128c8575b60209485851084146111d65785879486865291826000146111b657505060011461286b575061114592500383612b86565b84915060036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b906000915b8583106128b0575050611145935082010185611138565b80548389018501528794508693909201918101612899565b92607f169261283a565b3461048057602036600319011261048057600435907fffffffff00000000000000000000000000000000000000000000000000000000821680920361048057817f80ac58cd0000000000000000000000000000000000000000000000000000000060209314908115612977575b811561294d575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501483612946565b7f5b5e139f000000000000000000000000000000000000000000000000000000008114915061293f565b60005b8381106129b45750506000910152565b81810151838201526020016129a4565b906020916129dd815180928185528580860191016129a1565b601f01601f1916010190565b600435906001600160a01b038216820361048057565b602435906001600160a01b038216820361048057565b35906001600160a01b038216820361048057565b6060906003190112610480576001600160a01b0390600435828116810361048057916024359081168103610480579060443590565b9181601f840112156104805782359167ffffffffffffffff8311610480576020808501948460051b01011161048057565b90815180825260208080930193019160005b828110612aaf575050505090565b835180516001600160801b031686528083015167ffffffffffffffff168684015260409081015164ffffffffff169086015260609094019392810192600101612aa1565b3590811515820361048057565b6060810190811067ffffffffffffffff821117611fe057604052565b610120810190811067ffffffffffffffff821117611fe057604052565b6040810190811067ffffffffffffffff821117611fe057604052565b610160810190811067ffffffffffffffff821117611fe057604052565b67ffffffffffffffff8111611fe057604052565b90601f8019910116810190811067ffffffffffffffff821117611fe057604052565b67ffffffffffffffff8111611fe057601f01601f191660200190565b35906001600160801b038216820361048057565b15612bdf57565b606460405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152fd5b60005260056020526001600160a01b0360406000205416612c45811515612bd8565b90565b612c6b61089d8260005260056020526001600160a01b0360406000205416151590565b60005260076020526001600160a01b036040600020541690565b15612c8c57565b608460405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f766564000000000000000000000000000000000000006064820152fd5b90612d1a939291612d0a6122af8433612d8c565b612d15838383612e6b565b613024565b15612d2157565b60405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b906001600160a01b038080612da084612c23565b16931691838314938415612dd3575b508315612dbd575b50505090565b612dc991929350612c48565b1614388080612db7565b909350600052600860205260406000208260005260205260ff604060002054169238612daf565b15612e0157565b608460405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152fd5b90612e949291612e7a83612c23565b916001600160a01b03948593848094169687911614612dfa565b1690811580612f8b57612ea6846132b6565b159081612f82575b5080612f79575b612f615791808492612ee36000805160206157e683398151915296602096612edc85612c23565b1614612dfa565b60009382855260078652604085206001600160a01b031990818154169055818652600687526040862060001981540190558286526040862060018154019055838652600587528260408720918254161790557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6040519580a48152a1565b60248360405190630da9b01360e01b82526004820152fd5b50831515612eb5565b90501538612eae565b608460405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152fd5b3d1561301f573d9061300582612ba8565b916130136040519384612b86565b82523d6000602084013e565b606090565b9290803b156131b45761308e916020916001600160a01b0394604051809581948293897f150b7a02000000000000000000000000000000000000000000000000000000009b8c865233600487015216602485015260448401526080606484015260848301906129c4565b03916000968791165af19082908261314d575b5050613127576130af612ff4565b805190816131225760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000161490565b909192506020813d82116131ac575b8161316960209383612b86565b810103126131a85751907fffffffff00000000000000000000000000000000000000000000000000000000821682036131a557509038806130a1565b80fd5b5080fd5b3d915061315c565b50505050600190565b67ffffffffffffffff8111611fe05760051b60200190565b9081546131e1816131bd565b926040936131f185519182612b86565b828152809460208092019260005281600020906000935b85851061321757505050505050565b6001848192845161322781612b00565b64ffffffffff87546001600160801b038116835267ffffffffffffffff8160801c168584015260c01c1686820152815201930194019391613208565b6040519061327082612b00565b60006040838281528260208201520152565b9060405161328f81612b00565b6040819360018154916001600160801b0392838116865260801c6020860152015416910152565b80600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260ff60016040600020015460b01c1690565b80600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260ff60016040600020015460a01c1690565b6001600160801b039182169082160391908211611b7657565b80600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260406000205460f81c90565b359064ffffffffff8216820361048057565b92919261338c826131bd565b60409461339b86519283612b86565b8195848352602080930191606080960285019481861161048057925b8584106133c75750505050505050565b8684830312610480578251906133dc82612b00565b6133e585612bc4565b8252858501359067ffffffffffffffff8216820361048057828792838b95015261341086880161336e565b868201528152019301926133b7565b3580151581036104805790565b356001600160a01b03811681036104805790565b356001600160801b03811681036104805790565b91908260409103126104805760405161346c81612b39565b602080829461347a81612a15565b84520135910152565b64ffffffffff80421682600052600b602052604060002091825482828260a01c1610156134e45760c81c1611156134d25760040154600110156134c957612c4590613525565b612c4590614555565b6001600160801b039150600201541690565b5050505050600090565b8051156134fb5760200190565b634e487b7160e01b600052603260045260246000fd5b80518210156134fb5760209160051b010190565b64ffffffffff90814216906000908152600b60205260409081812082519361354c85612b55565b8154956001600160a01b039182881687526020870197828160a01c168952828160c81c168789015260ff8160f01c161515606089015260f81c1515608088015260ff6001938486015490811660a08a0152818160a01c16151560c08a0152818160a81c16151560e08a015260b01c1615156101008801526101406135e660046135d760028801613282565b966101208b01978852016131d5565b97019187835280876135f8889a6134ee565b5101511693828288965b16106136dc57509161368c6136919284888161369698976001600160801b039e8f61362e8b8a51613511565b5151169d8a8f9b602061364b67ffffffffffffffff928d51613511565b5101511699848361365d848451613511565b51015116965081156136d05761367b92935051906000190190613511565b5101511680925b0316920316613750565b613abf565b613922565b9283136136af5750506136a98391613714565b16011690565b5160200151929392831692841683101591506136cb9050575090565b905090565b50505051168092613682565b8094986001600160801b0390816136f48c8851613511565b51511601169801938282808a61370b898951613511565b51015116613602565b6000811261371f5790565b602490604051907f2463f3d50000000000000000000000000000000000000000000000000000000082526004820152fd5b90600160ff1b808314908115613838575b5061380e5760008212156138055761378a826000035b60008312156137fe578260000390613842565b917f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83116137c857600091600019911813156137c4575090565b0390565b604491604051917fd49c26b300000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b8290613842565b61378a82613777565b60046040517f9fe2b450000000000000000000000000000000000000000000000000000000008152fd5b9050811438613761565b670de0b6b3a76400009160001983830992808302928380861095039480860395146138fe57828510156138c257908291096001821901821680920460028082600302188083028203028083028203028083028203028083028203028083028203028092029003029360018380600003040190848311900302920304170290565b82606492604051927f63a05778000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b50508092501561390c570490565b634e487b7160e01b600052601260045260246000fd5b90600160ff1b808314908115613a06575b506139dc5760008212156139d35761395c826000035b60008312156139cc578260000390613a10565b917f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831161399657600091600019911813156137c4575090565b604491604051917f120b5b4300000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b8290613a10565b61395c82613949565b60046040517fa6070c25000000000000000000000000000000000000000000000000000000008152fd5b9050811438613933565b90919060001983820983820291828083109203918083039214613aae57670de0b6b3a76400009081831015613a7757947faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066994950990828211900360ee1b910360121c170290565b60449086604051917f5173648d00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050670de0b6b3a764000090049150565b80613ad95750600090612c455750670de0b6b3a764000090565b90670de0b6b3a7640000808314613b26575080613afe575050670de0b6b3a764000090565b670de0b6b3a76400008114613b2257613b1d90613691612c4593614400565b613b46565b5090565b91505090565b801561390c576ec097ce7bc90715b34b9f10000000000590565b6000811215613b7b5768033dd1780914b97114198112613b7557613b6c90600003613b46565b612c4590613b2c565b50600090565b680a688906bd8affffff81136143cf57670de0b6b3a764000080604092831b05907780000000000000000000000000000000000000000000000067ff0000000000000083166142b2575b66ff00000000000083166141aa575b65ff000000000083166140aa575b64ff000000008316613fb2575b63ff0000008316613ec2575b62ff00008316613dda575b61ff008316613cfa575b60ff8316613c23575b02911c60bf031c90565b60808316613ce8575b838316613cd6575b60208316613cc4575b60108316613cb2575b60088316613ca0575b60048316613c8e575b60028316613c7c575b6001831615613c19576801000000000000000102831c613c19565b6801000000000000000102831c613c61565b6801000000000000000302831c613c58565b6801000000000000000602831c613c4f565b6801000000000000000b02831c613c46565b6801000000000000001602831c613c3d565b6801000000000000002c02831c613c34565b6801000000000000005902831c613c2c565b6180008316613dc8575b6140008316613db6575b6120008316613da4575b6110008316613d92575b6108008316613d80575b6104008316613d6e575b6102008316613d5c575b610100831615613c1057680100000000000000b102831c613c10565b6801000000000000016302831c613d40565b680100000000000002c602831c613d36565b6801000000000000058c02831c613d2c565b68010000000000000b1702831c613d22565b6801000000000000162e02831c613d18565b68010000000000002c5d02831c613d0e565b680100000000000058b902831c613d04565b628000008316613eb0575b624000008316613e9e575b622000008316613e8c575b621000008316613e7a575b620800008316613e68575b620400008316613e56575b620200008316613e44575b62010000831615613c06576801000000000000b17202831c613c06565b680100000000000162e402831c613e27565b6801000000000002c5c802831c613e1c565b68010000000000058b9102831c613e11565b680100000000000b172102831c613e06565b68010000000000162e4302831c613dfb565b680100000000002c5c8602831c613df0565b6801000000000058b90c02831c613de5565b63800000008316613fa0575b63400000008316613f8e575b63200000008316613f7c575b63100000008316613f6a575b63080000008316613f58575b63040000008316613f46575b63020000008316613f34575b6301000000831615613bfb5768010000000000b1721802831c613bfb565b6801000000000162e43002831c613f16565b68010000000002c5c86002831c613f0a565b680100000000058b90c002831c613efe565b6801000000000b17217f02831c613ef2565b680100000000162e42ff02831c613ee6565b6801000000002c5c85fe02831c613eda565b68010000000058b90bfc02831c613ece565b6480000000008316614098575b6440000000008316614086575b6420000000008316614074575b6410000000008316614062575b6408000000008316614050575b640400000000831661403e575b640200000000831661402c575b640100000000831615613bef57680100000000b17217f802831c613bef565b68010000000162e42ff102831c61400d565b680100000002c5c85fe302831c614000565b6801000000058b90bfce02831c613ff3565b68010000000b17217fbb02831c613fe6565b6801000000162e42fff002831c613fd9565b68010000002c5c8601cc02831c613fcc565b680100000058b90c0b4902831c613fbf565b658000000000008316614198575b654000000000008316614186575b652000000000008316614174575b651000000000008316614162575b650800000000008316614150575b65040000000000831661413e575b65020000000000831661412c575b65010000000000831615613be2576801000000b17218355102831c613be2565b680100000162e430e5a202831c61410c565b6801000002c5c863b73f02831c6140fe565b68010000058b90cf1e6e02831c6140f0565b680100000b1721bcfc9a02831c6140e2565b68010000162e43f4f83102831c6140d4565b680100002c5c89d5ec6d02831c6140c6565b6801000058b91b5bc9ae02831c6140b8565b668000000000000083166142a0575b6640000000000000831661428e575b6620000000000000831661427c575b6610000000000000831661426a575b66080000000000008316614258575b66040000000000008316614246575b66020000000000008316614234575b6601000000000000831615613bd45768010000b17255775c0402831c613bd4565b6801000162e525ee054702831c614213565b68010002c5cc37da949202831c614204565b680100058ba01fb9f96d02831c6141f5565b6801000b175effdc76ba02831c6141e6565b680100162f3904051fa102831c6141d7565b6801002c605e2e8cec5002831c6141c8565b68010058c86da1c09ea202831c6141b9565b67800000000000000083166143b0575b674000000000000000831661439e575b672000000000000000831661438c575b671000000000000000831661437a575b6708000000000000008316614368575b6704000000000000008316614356575b6702000000000000008316614344575b670100000000000000831615613bc557680100b1afa5abcbed6102831c613bc5565b68010163da9fb33356d802831c614322565b680102c9a3e778060ee702831c614312565b6801059b0d31585743ae02831c614302565b68010b5586cf9890f62a02831c6142f2565b6801172b83c7d517adce02831c6142e2565b6801306fe0a31b7152df02831c6142d2565b5077b504f333f9de6484800000000000000000000000000000006142c2565b602490604051907f0360d0280000000000000000000000000000000000000000000000000000000082526004820152fd5b8060008083131561452457670de0b6b3a7640000928381126144ed57506001925b808305906001600160801b03821160071b91821c9167ffffffffffffffff831160061b92831c63ffffffff811160051b90811c61ffff811160041b90811c60ff811160031b90811c91600f831160021b92831c936001978860038711811b96871c11961717171717171781810294811d908282146144e157506706f05b59d3b20000905b8482136144b55750505050500290565b808391020590671bc16d674ec800008212156144d4575b831d906144a5565b8091950194831d906144cc565b93505093925050020290565b6000199392508015614510576ec097ce7bc90715b34b9f10000000000591614421565b602482634e487b7160e01b81526012600452fd5b602483604051907f059b101b0000000000000000000000000000000000000000000000000000000082526004820152fd5b64ffffffffff61458a600091838352600b60205280806040852054818160a01c1693849160c81c160316918142160316613750565b91808252600b602052600460408320018054156146105790829167ffffffffffffffff93526145e26020832054828452600b6020526136916001600160801b03968760026040882001541696879360801c1690613abf565b9283136145f85750506145f490613714565b1690565b60029350604092508152600b60205220015460801c90565b602483634e487b7160e01b81526032600452fd5b80600052600b602052604060002060ff600182015460a01c1660001461464b575050600490565b805460f81c61469e575460a01c64ffffffffff164210613b755761466e81613483565b90600052600b6020526001600160801b03806002604060002001541691161060001461469957600190565b600290565b5050600390565b80600052600b6020526146be6002604060002001613282565b81600052600b602052604060002060ff600182015460a01c166000146146f157506001600160801b039150602001511690565b5460f81c6147035750612c4590613483565b612c4591506001600160801b036040818351169201511690613324565b906001600160a01b036001541660206001600160a01b0360c0850151166024604051809481937fdcf844a700000000000000000000000000000000000000000000000000000000835260048301525afa801561098b57600090614fd3575b6147a191506001600160801b0360a08501511690602060e08601510151916156a6565b6001600160801b0381511661010084015164ffffffffff6020860151168215614fa95781518015614f7f577f00000000000000000000000000000000000000000000000000000000000000008111614f4e575064ffffffffff6040614805846134ee565b51015116811015614ef75750600090819082815184905b808210614e64575050505064ffffffffff421664ffffffffff8216811015614e245750506001600160801b0316808203614ded5750506009549283600052600b6020526040600020916001600160801b0381511660028401906001600160801b03198254161790556001600160a01b0360c083015116600184015490750100000000000000000000000000000000000000000060408501511515928654927fffffffffffffffffff0000ff000000000000000000000000000000000000000076ff000000000000000000000000000000000000000000006060890151151560b01b16921617171760018601556001600160a01b038451169161010085015192604061492e855195600019870190613511565b510151927fff000000000000000000000000000000000000000000000000000000000000007eff0000000000000000000000000000000000000000000000000000000000007dffffffffff0000000000000000000000000000000000000000000000000078ffffffffff000000000000000000000000000000000000000060208b015160a01b169660c81b169460f01b16911617171717845560005b818110614d1d575050600185016009556001600160a01b0360c08301511660005260026020526001600160801b0380604060002054168160208401511601166001600160a01b0360c0840151166000526040600020906001600160801b03198254161790556001600160a01b036080830151168015614cd957614a6c614a668760005260056020526001600160a01b0360406000205416151590565b15615181565b614a75866132b6565b1580614cd0575b80614cc8575b614cb05760206000805160206157e683398151915291614abb614a668960005260056020526001600160a01b0360406000205416151590565b806000526006825260406000206001815401905587600052600582526040600020816001600160a01b0319825416179055876040519160007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4878152a1614b4b6001600160a01b0360c0840151166001600160801b03808451168160208601511601169030903390615007565b6001600160801b0360408201511680614c81575b507fef3d668acee46576ad5d407c42ab4d0cde13f3cd70b28f09a0fb9e3bf5bf09cb614c3e6001600160a01b03845116926001600160a01b03608086015116946001600160a01b0360c08201511696614c76614c5660408401511515928c606086015115156001600160a01b0360e061010089015194549864ffffffffff6040519a614bea8c612b39565b818160a01c168c5260c81c1660208b01520151511695604051998a99610160948b523360208c015260408b0190604090816001600160801b0391828151168552826020820151166020860152015116910152565b60a089015260c08801528060e0880152860190612a8f565b926101008501906020908164ffffffffff91828151168552015116910152565b6101408301520390a4565b614caa906001600160a01b0360c0850151166001600160a01b0360e08601515116903390615007565b38614b5f565b60248660405190630da9b01360e01b82526004820152fd5b506000614a82565b50801515614a7c565b606460405162461bcd60e51b815260206004820152602060248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152fd5b614d2c81610100860151613511565b519060048601549168010000000000000000831015611fe057600183018060048901558310156134fb5760019260048801600052602060002001906001600160801b03815116908254917fffffff00000000000000000000000000000000000000000000000000000000007cffffffffff000000000000000000000000000000000000000000000000604077ffffffffffffffff00000000000000000000000000000000602086015160801b1694015160c01b1693161717179055016149ca565b60449250604051917fd90b7e3900000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b6040517f210aec0e00000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b9193509193614e88906001600160801b03614e7f8588613511565b51511690615622565b9364ffffffffff806040614e9c8685613511565b51015116941680851115614eba57506001849301919291909261481c565b8385606492604051927f7b0bada8000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b64ffffffffff6040614f08846134ee565b5101516040517fb4c9e52c00000000000000000000000000000000000000000000000000000000815264ffffffffff938416600482015291169091166024820152604490fd5b602490604051907f4757689b0000000000000000000000000000000000000000000000000000000082526004820152fd5b60046040517f3952c64e000000000000000000000000000000000000000000000000000000008152fd5b60046040517f6095d3bc000000000000000000000000000000000000000000000000000000008152fd5b6020823d602011614fff575b81614fec60209383612b86565b810103126131a557506147a1905161477e565b3d9150614fdf565b9290604051927f23b872dd0000000000000000000000000000000000000000000000000000000060208501526001600160a01b03809216602485015216604483015260648201526064815260a081019181831067ffffffffffffffff841117611fe05761507692604052615078565b565b6001600160a01b0316906150d860405161509181612b39565b6020938482527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564858301526000808587829751910182855af16150d2612ff4565b916151cc565b80519182159184831561515d575b5050509050156150f35750565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b9193818094500103126131a8578201519081151582036131a55750803880846150e6565b1561518857565b606460405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152fd5b9192901561522d57508151156151e0575090565b3b156151e95790565b606460405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b8251909150156152405750805190602001fd5b6104f19060405191829162461bcd60e51b83526020600484015260248301906129c4565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361529657565b60046040517fa1c0d6e5000000000000000000000000000000000000000000000000000000008152fd5b916001600160a01b03604051927fa9059cbb000000000000000000000000000000000000000000000000000000006020850152166024830152604482015260448152608081019181831067ffffffffffffffff841117611fe05761507692604052615078565b612c4590615333816146a5565b90600052600b60205260026040600020015460801c90613324565b91908110156134fb5760051b0190565b6153826000805160206157e68339815191529360209361537c615264565b8361538b565b604051908152a1565b90615395826132ed565b61560a576153b982600052600b6020526001600160a01b0360406000205416331490565b918215806155fa575b611f55576000928184526020600581526001600160a01b039360409185838820541693806155ee575b6155c9578582169586156155b9576001600160801b03808a16998a156155a25761541488615326565b8281168c116155735750926154c88b89946001898e7f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d978f9a61546a615493918c8552600b8b526002868620015460801c615622565b8b8452600b8a5260028585200190836001600160801b031983549260801b169116178155613282565b906154ae818a84015116928286818351169201511690613324565b161115615545575b888152600b87522001541696876152c0565b85518b8152a4813314158061553b575b6154e5575b505050505050565b813b15615537576084929185915196879586946313375c3b60e01b86526004860152336024860152604485015260648401525af1615528575b80808080806154dd565b61553190612b72565b3861551e565b8480fd5b50813b15156154d8565b888152600b8752818120838101600160a01b60ff60a01b1982541617905560ff60f01b1981541690556154b6565b865163287ecaef60e21b8152600481018a90526001600160801b03928316602482015291166044820152606490fd5b60248887519063d2aabcd960e01b82526004820152fd5b6004845163630d074f60e11b8152fd5b6064858784865192632dcbf6b960e11b84526004840152336024840152166044820152fd5b508386831614156153eb565b506156048161563d565b156153c2565b60248260405190634a5541ef60e01b82526004820152fd5b9190916001600160801b0380809416911601918211611b7657565b60009080825260056020526001600160a01b038060408420541692833314938415615682575b5050821561567057505090565b90915061567d3392612c48565b161490565b60ff9294509060409181526008602052818120338252602052205416913880615663565b9092916156b1613263565b936001600160801b03928381169182156157bd5767016345785d8a00008082116157865780851161574f57506156fb856156ec819386613a10565b16946020890195865284613a10565b169184615712604089019480865282875116615622565b1610156157395761572b84918261573495511690613324565b91511690613324565b168252565b634e487b7160e01b600052600160045260246000fd5b84604491604051917f4fea5c1a00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b60449250604051917f47152d6700000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b505050505090506040516157d081612b00565b6000815260006020820152600060408201529056fef8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7a164736f6c6343000815000a"; + hex"60c0346200046e57601f62005ca638819003918201601f19168301916001600160401b038311848410176200032b578084926080946040528339810103126200046e5780516001600160a01b038082169290918390036200046e5760208101518281168091036200046e5760408201519183831683036200046e5760600151936200008962000473565b90601d82527f5361626c696572205632204c6f636b75702044796e616d6963204e46540000006020830152620000be62000473565b601181527029a0a116ab1916a627a1a5aaa816a22ca760791b602082015230608052600080546001600160a01b03199081168417825560018054909116909517909455927fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a38051906001600160401b0382116200032b5760035490600182811c9216801562000463575b60208310146200044d5781601f849311620003d8575b50602090601f83116001146200034d5760009262000341575b50508160011b916000199060031b1c1916176003555b80516001600160401b0381116200032b576004918254600181811c9116801562000320575b60208210146200030b579081601f849311620002b3575b50602090601f831160011462000248576000926200023c575b50508160011b916000199060031b1c19161790555b1660018060a01b0319600a541617600a5560a052600160095560405161581290816200049482396080518161439b015260a05181818161120e01526139930152f35b015190503880620001e5565b6000858152602081209350601f198516905b8181106200029a575090846001959493921062000280575b505050811b019055620001fa565b015160001960f88460031b161c1916905538808062000272565b929360206001819287860151815501950193016200025a565b909150836000526020600020601f840160051c8101916020851062000300575b90601f859493920160051c01905b818110620002f05750620001cc565b60008155849350600101620002e1565b9091508190620002d3565b602284634e487b7160e01b6000525260246000fd5b90607f1690620001b5565b634e487b7160e01b600052604160045260246000fd5b0151905038806200017a565b600360009081527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b9350601f198516905b818110620003bf5750908460019594939210620003a5575b505050811b0160035562000190565b015160001960f88460031b161c1916905538808062000396565b929360206001819287860151815501950193016200037e565b60036000529091507fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f840160051c8101916020851062000442575b90601f859493920160051c01905b81811062000432575062000161565b6000815584935060010162000423565b909150819062000415565b634e487b7160e01b600052602260045260246000fd5b91607f16916200014b565b600080fd5b60408051919082016001600160401b038111838210176200032b5760405256fe608080604052600436101561001357600080fd5b60003560e01c90816301ffc9a7146128d25750806306fdde031461280f578063081812fc146127f1578063095ea7b31461265d5780631400ecec146125b8578063168444561461233d5780631c1cdd4c146122d75780631e99d569146122b957806323b872dd1461229057806339a73c031461224d57806340e58ee514612014578063425d30dd14611ff657806342842e0e14611fa657806342966c6814611e285780634857501f14611db25780634869e12d14611d765780635fe3b56714611d4f5780636352211e14611d205780636d0cee7514611cc857806370a0823114611c1e57806375829def14611b8c5780637cad6cd114611aba5780637de6b1db146118ce5780638659c270146115f0578063894e9a0d146113835780638bad38dd146113075780638f69b993146112845780639067b677146112315780639188ec84146111f657806395d89b41146110e8578063a22cb46514611017578063a2ffb89714610f1e578063a6202bf214610e1e578063a80fc07114610dc9578063ad35efd414610d66578063b256456914610d48578063b637b86514610ce8578063b88d4fde14610c5f578063b8a3be6614610c28578063b971302a14610bd6578063bc063e1a14610bb3578063bc2be1be14610b60578063c156a11d14610aac578063c33cd35e14610997578063c87b56dd14610864578063cc364f48146107ca578063d4dbd20b14610775578063d511609f14610726578063d975dfed146106d9578063e985e9c514610682578063ea5ead1914610652578063eac8f5b8146105e6578063f590c176146105be578063f851a440146105975763fdd46d601461027c57600080fd5b34610480576060366003190112610480576004356102986129ff565b604435916001600160801b039182841693848103610480576102b8614391565b6102c1836132ed565b61057f576102e583600052600b6020526001600160a01b0360406000205416331490565b9182158061056f575b6105505783600052602094600586526001600160a01b039081604060002054169480610544575b61051e5781831693841561050d5788156104f55761033287614453565b8281168a116104c1575091889161038e6103626103cb958a600052600b8c5260026040600020015460801c61474f565b89600052600b8b52600260406000200190836001600160801b031983549260801b169116178155613282565b906103aa818b8401511692826040818351169201511690613324565b16111561048f575b86600052600b88526001604060002001541692836143ed565b81847f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d876040518a8152a48133141580610485575b61041f575b6000805160206157e68339815191528484604051908152a1005b813b15610480576000805160206157e68339815191529460846000928360405195869485936313375c3b60e01b8552896004860152336024860152604485015260648401525af1610471575b80610405565b61047a90612b72565b3861046b565b600080fd5b50813b1515610400565b86600052600b8852604060002060018101600160a01b60ff60a01b1982541617905560ff60f01b1981541690556103b2565b60405163287ecaef60e21b8152600481018990526001600160801b03928316602482015291166044820152606490fd5b0390fd5b6024876040519063d2aabcd960e01b82526004820152fd5b600460405163630d074f60e11b8152fd5b606486838560405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b50848284161415610315565b60405163216caf0d60e01b815260048101859052336024820152604490fd5b506105798461476a565b156102ee565b60248360405190634a5541ef60e01b82526004820152fd5b346104805760003660031901126104805760206001600160a01b0360005416604051908152f35b346104805760203660031901126104805760206105dc60043561333d565b6040519015158152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260206001600160a01b0360016040600020015416604051908152f35b6024906040519062b8e7e760e51b82526004820152fd5b34610480576040366003190112610480576106806004356106716129ff565b61067a82614453565b9161448b565b005b346104805760403660031901126104805761069b6129e9565b6106a36129ff565b906001600160a01b03809116600052600860205260406000209116600052602052602060ff604060002054166040519015158152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57610715602091614453565b6001600160801b0360405191168152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b602052602060026040600020015460801c604051908152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260206001600160801b0360036040600020015416604051908152f35b3461048057602036600319011261048057600435600060206040516107ee81612b39565b828152015280600052600b60205260ff60016040600020015460a81c161561063b57600052600b6020526040806000205464ffffffffff82519161083183612b39565b818160a01c16835260c81c166020820152610862825180926020908164ffffffffff91828151168552015116910152565bf35b346104805760208060031936011261048057600435906108a261089d8360005260056020526001600160a01b0360406000205416151590565b612bd8565b60006001600160a01b03600a5416926044604051809581937fe9dc637500000000000000000000000000000000000000000000000000000000835230600484015260248301525afa91821561098b57600092610912575b5061090e6040519282849384528301906129c4565b0390f35b9091503d806000833e6109258183612b86565b81019082818303126104805780519067ffffffffffffffff8211610480570181601f8201121561048057805161095a81612ba8565b926109686040519485612b86565b81845284828401011161048057610984918480850191016129a1565b90826108f9565b6040513d6000823e3d90fd5b3461048057600319602036820112610480576004359067ffffffffffffffff9081831161048057610140908336030112610480576109d3614391565b604051916109e083612b1c565b6109ec81600401612a15565b83526109fa6024820161336e565b6020840152610a0b60448201612af3565b6040840152610a1c60648201612af3565b6060840152610a2d60848201612a15565b6080840152610a3e60a48201612bc4565b60a0840152610a4f60c48201612a15565b60c0840152610a613660e48301613454565b60e084015261012481013591821161048057013660238201121561048057602091610a99610aa4923690602460048201359101613380565b6101008201526138e5565b604051908152f35b3461048057604036600319011261048057600435610ac86129ff565b90610ad1614391565b80600052600b60205260ff60016040600020015460a81c161561063b578060005260056020526001600160a01b036040600020541691823303610b415761068092610b1b83614453565b6001600160801b038116610b30575b50612e6b565b610b3b90828561448b565b84610b2a565b60405163216caf0d60e01b815260048101839052336024820152604490fd5b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b602052602064ffffffffff60406000205460a01c16604051908152f35b3461048057600036600319011261048057602060405167016345785d8a00008152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260206001600160a01b0360406000205416604051908152f35b3461048057602036600319011261048057600435600052600b602052602060ff60016040600020015460a81c166040519015158152f35b3461048057608036600319011261048057610c786129e9565b610c806129ff565b6064359167ffffffffffffffff8311610480573660238401121561048057826004013591610cad83612ba8565b92610cbb6040519485612b86565b80845236602482870101116104805760208160009260246106809801838801378501015260443591612cf6565b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205261090e610d3460046040600020016131d5565b604051918291602083526020830190612a8f565b346104805760203660031901126104805760206105dc6004356132b6565b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57610da0906137e3565b6040516005821015610db3576020918152f35b634e487b7160e01b600052602160045260246000fd5b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260206001600160801b0360026040600020015416604051908152f35b3461048057602036600319011261048057610e376129e9565b6001600160a01b038060005416338103610ef557508116908160005260026020526001600160801b0360406000205416908115610ec45781610e969184600052600260205260406000206001600160801b0319815416905533906143ed565b6040519081527fca7a4a65a94ed2f37538814e00e1cd4c41a78261561e3f3794592f11409cf5af60203392a3005b602483604051907f8410168c0000000000000000000000000000000000000000000000000000000082526004820152fd5b6040516331b339a960e21b81526001600160a01b03919091166004820152336024820152604490fd5b346104805760603660031901126104805767ffffffffffffffff60043581811161048057610f50903690600401612a5e565b610f586129ff565b9260443590811161048057610f71903690600401612a5e565b9190610f7b614391565b828203610fe05760005b828110610f8e57005b806000805160206157e68339815191526020610fad600194878a61447b565b35610fd3610fc4610fbf868b8a61447b565b613440565b610fcc614391565b8b836144b8565b604051908152a101610f85565b50604491604051917faec9344000000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b34610480576040366003190112610480576110306129e9565b60243590811515809203610480576001600160a01b0316908133146110a457336000526008602052604060002082600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a3005b606460405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152fd5b3461048057600036600319011261048057604051600060045490600182811c918184169182156111ec575b60209485851084146111d65785879486865291826000146111b6575050600114611159575b5061114592500383612b86565b61090e6040519282849384528301906129c4565b84915060046000527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b906000915b85831061119e575050611145935082010185611138565b80548389018501528794508693909201918101611187565b60ff19168582015261114595151560051b85010192508791506111389050565b634e487b7160e01b600052602260045260246000fd5b92607f1692611113565b346104805760003660031901126104805760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b602052602064ffffffffff60406000205460c81c16604051908152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b576112be906137e3565b600581101580610db357600282149081156112fa575b81156112e8575b6020826040519015158152f35b9050610db357600460209114826112db565b50506003811460006112d4565b34610480576020366003190112610480576004356001600160a01b0390818116809103610480578160005416338103610ef5575060015491816001600160a01b03198416176001556040519216825260208201527fdcb09aef4bf01068924ccce937981cbe59d25ba08380cf941aaaea4e4bd3960d60403392a2005b346104805760203660031901126104805760606101406040516113a581612b55565b60008152600060208201526000604082015260008382015260006080820152600060a0820152600060c0820152600060e082015260006101008201526113e9613263565b6101208201520152600435600052600b60205260ff60016040600020015460a81c16156115d857600435600052600b60205260406000206114cc60046040519261143284612b55565b80546001600160a01b038116855264ffffffffff8160a01c16602086015264ffffffffff8160c81c16604086015260ff8160f01c161515606086015260f81c1515608085015260ff60018201546001600160a01b03811660a0870152818160a01c16151560c0870152818160a81c16151560e087015260b01c1615156101008501526114c060028201613282565b610120850152016131d5565b6101408201526114dd6004356137e3565b906005821015610db357600261014092146115cc575b61090e604051928392602084526001600160a01b03815116602085015264ffffffffff602082015116604085015264ffffffffff60408201511660608501526060810151151560808501526080810151151560a08501526001600160a01b0360a08201511660c085015260c0810151151560e085015260e0810151151561010085015261010081015115156101208501526115b861012082015183860190604090816001600160801b0391828151168552826020820151166020860152015116910152565b01516101a0808401526101c0830190612a8f565b600060608201526114f3565b602460405162b8e7e760e51b81526004356004820152fd5b34610480576020806003193601126104805760043567ffffffffffffffff811161048057611622903690600401612a5e565b9061162b614391565b6000915b80831061163857005b61164383828461447b565b359261164d614391565b611656846132ed565b156116735760248460405190634a5541ef60e01b82526004820152fd5b61167f8492939461333d565b6118b6576116a382600052600b6020526001600160a01b0360406000205416331490565b15610b41576116b182613483565b82600052600b8087526116ca6002604060002001613282565b906001600160801b039283835116848216101561189e578560005281895260ff60406000205460f01c1615611886579061173882858b61172e7f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa509683895116613324565b9601511690613324565b9580600052818a526040600020938a855498600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8b16178755600388821697881561186c575b0197831697886001600160801b03198254161790556001600160a01b03809a16958691600584528b604060002054169687945260019b8c6040600020015416946117cb8b85886143ed565b604080518881526001600160801b0392831660208201529290911690820152606090a46000805160206157e68339815191528a604051838152a1813b611819575b505050505001919061162f565b813b15610480576000608492819560405197889687956372eba20360e01b875260048701526024860152604485015260648401525af161185d575b8080808061180c565b61186690612b72565b85611854565b60018101600160a01b60ff60a01b19825416179055611780565b602486604051906339c6dc7360e21b82526004820152fd5b602486604051906322cad1af60e11b82526004820152fd5b6024826040519063fe19f19f60e01b82526004820152fd5b346104805760208060031936011261048057600435906118ec614391565b81600052600b815260ff60016040600020015460a81c1615611aa357611911826137e3565b6005811015610db3576004810361193a5760248360405190634a5541ef60e01b82526004820152fd5b6003810361195a576024836040519063fe19f19f60e01b82526004820152fd5b600214611a8b5761198182600052600b6020526001600160a01b0360406000205416331490565b15610b415781600052600b815260ff60406000205460f01c1615611a735781600052600b8152604060002060ff60f01b19815416905560405191807f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f600080a2600582526001600160a01b036040600020541692833b611a16575b6000805160206157e68339815191528383604051908152a1005b833b1561048057600081602481836000805160206157e6833981519152987f341a0bd90000000000000000000000000000000000000000000000000000000083528760048401525af1156119fc57611a6d90612b72565b836119fc565b602482604051906339c6dc7360e21b82526004820152fd5b602482604051906322cad1af60e11b82526004820152fd5b6024826040519062b8e7e760e51b82526004820152fd5b34610480576020366003190112610480576004356001600160a01b0390818116809103610480578160005416338103610ef55750600a5491816001600160a01b0319841617600a556040519216825260208201527fa2548bd4b805e907c1558a47b5858324fe8bb4a2e1ddfca647eecbf65610eebc60403392a26009546000198101908111611b765760407f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c91815190600182526020820152a1005b634e487b7160e01b600052601160045260246000fd5b3461048057602036600319011261048057611ba56129e9565b6000546001600160a01b0380821692338403611bf7576001600160a01b03199350169182911617600055337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf80600080a3005b6040516331b339a960e21b81526001600160a01b0385166004820152336024820152604490fd5b34610480576020366003190112610480576001600160a01b03611c3f6129e9565b168015611c5e5760005260066020526020604060002054604051908152f35b608460405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e657200000000000000000000000000000000000000000000006064820152fd5b3461048057602036600319011261048057600435611cff61089d8260005260056020526001600160a01b0360406000205416151590565b600052600560205260206001600160a01b0360406000205416604051908152f35b34610480576020366003190112610480576020611d3e600435612c23565b6001600160a01b0360405191168152f35b346104805760003660031901126104805760206001600160a01b0360015416604051908152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b5761071560209161386a565b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b576000611dee826137e3565b6005811015610db357600203611e0c575b6020906040519015158152f35b50600052600b602052602060ff60406000205460f01c16611dff565b3461048057602036600319011261048057600435611e44614391565b611e4d816132ed565b15611f7557611e5b8161476a565b15611f5557611e6981612c23565b611e72826132b6565b159081611f4c575b81611f39575b50611f2157602081611ea06000805160206157e683398151915293612c23565b9080600052600783526001600160a01b036040600020926001600160a01b031993848154169055169182600052600684526040600020600019815401905581600052600584526040600020908154169055806000604051937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a48152a1005b60249060405190630da9b01360e01b82526004820152fd5b6001600160a01b03915016151582611e80565b60009150611e7a565b60405163216caf0d60e01b81526004810191909152336024820152604490fd5b602490604051907f817cd6390000000000000000000000000000000000000000000000000000000082526004820152fd5b3461048057611fb436612a29565b60405191602083019383851067ffffffffffffffff861117611fe0576106809460405260008452612cf6565b634e487b7160e01b600052604160045260246000fd5b346104805760203660031901126104805760206105dc6004356132ed565b34610480576020806003193601126104805760043590612032614391565b61203b826132ed565b156120585760248260405190634a5541ef60e01b82526004820152fd5b6120618261333d565b6118b65761208582600052600b6020526001600160a01b0360406000205416331490565b15610b415761209382613483565b9180600052600b82526120ac6002604060002001613282565b906001600160801b0393848351168582161015611a8b5781600052600b845260ff60406000205460f01c1615611a73578085856120ef6120f99483885116613324565b9501511690613324565b9080600052600b84526000805160206157e6833981519152604060002094855494600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff87161787556003888616978815612233575b0197811697886001600160801b03198254161790556001600160a01b038096169560058352867f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa508260406000205416978893600b875260016040600020015416946121bc8d85886143ed565b604080518a81526001600160801b0392831660208201529290911690820152606090a4604051838152a1813b6121ee57005b813b15610480576000608492819560405197889687956372eba20360e01b875260048701526024860152604485015260648401525af161222a57005b61068090612b72565b60018101600160a01b60ff60a01b19825416179055612150565b34610480576020366003190112610480576001600160a01b0361226e6129e9565b16600052600260205260206001600160801b0360406000205416604051908152f35b34610480576106806122a136612a29565b916122b46122af8433612d8c565b612c85565b612e6b565b34610480576000366003190112610480576020600954604051908152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57612311906137e3565b6005811015610db3578060209115908115612332575b506040519015158152f35b600191501482612327565b346104805760206003198181360112610480576004359067ffffffffffffffff9081831161048057610120833603918201126104805761237b614391565b6101048301359060221901811215610480578201600481013590828211610480576024016060820236038113610480576123b6913691613380565b918251906123c3826131bd565b916123d16040519384612b86565b808352601f196123e0826131bd565b018660005b8281106125a25750505064ffffffffff90814216946001600160801b03968761240d826134ee565b515116828a61241b846134ee565b510151168580604061242c866134ee565b510151168a0116906040519261244184612b00565b83528b8301526040820152612455876134ee565b5261245f866134ee565b5060019386855b8a8c87831061252157908b846001600160a01b038c60a48101358281169081900361048057610aa4956124e195612511946124a36024860161341f565b6124af6044870161341f565b6124bb6064880161342c565b916124c88860040161342c565b94846124d660848b01613440565b966040519d8e612b1c565b168c528d8c0152151560408b0152151560608a01521660808801521660a086015260c085015260c4369101613454565b60e08301526101008201526138e5565b8893858060406125558b866125458a8e9a61253c828d613511565b5151169a613511565b5101511694600019890190613511565b51015116816040612566888c613511565b510151160116916040519361257a85612b00565b8452830152604082015261258e828b613511565b52612599818a613511565b50018790612466565b6125aa613263565b8282880101520187906123e5565b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b5760209060009080600052600b8352604060002060ff815460f01c168061264b575b612622575b50506001600160801b0360405191168152f35b61264492506001600160801b03600261263e9201541691613483565b90613324565b828061260f565b5060ff600182015460a01c161561260a565b34610480576040366003190112610480576126766129e9565b602435906001600160a01b03808061268d85612c23565b1692169180831461278757803314908115612762575b50156126f8578260005260076020526040600020826001600160a01b03198254161790556126d083612c23565b167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b608460405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152fd5b9050600052600860205260406000203360005260205260ff60406000205416846126a3565b608460405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152fd5b34610480576020366003190112610480576020611d3e600435612c48565b3461048057600036600319011261048057604051600060035490600182811c918184169182156128c8575b60209485851084146111d65785879486865291826000146111b657505060011461286b575061114592500383612b86565b84915060036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b906000915b8583106128b0575050611145935082010185611138565b80548389018501528794508693909201918101612899565b92607f169261283a565b3461048057602036600319011261048057600435907fffffffff00000000000000000000000000000000000000000000000000000000821680920361048057817f80ac58cd0000000000000000000000000000000000000000000000000000000060209314908115612977575b811561294d575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501483612946565b7f5b5e139f000000000000000000000000000000000000000000000000000000008114915061293f565b60005b8381106129b45750506000910152565b81810151838201526020016129a4565b906020916129dd815180928185528580860191016129a1565b601f01601f1916010190565b600435906001600160a01b038216820361048057565b602435906001600160a01b038216820361048057565b35906001600160a01b038216820361048057565b6060906003190112610480576001600160a01b0390600435828116810361048057916024359081168103610480579060443590565b9181601f840112156104805782359167ffffffffffffffff8311610480576020808501948460051b01011161048057565b90815180825260208080930193019160005b828110612aaf575050505090565b835180516001600160801b031686528083015167ffffffffffffffff168684015260409081015164ffffffffff169086015260609094019392810192600101612aa1565b3590811515820361048057565b6060810190811067ffffffffffffffff821117611fe057604052565b610120810190811067ffffffffffffffff821117611fe057604052565b6040810190811067ffffffffffffffff821117611fe057604052565b610160810190811067ffffffffffffffff821117611fe057604052565b67ffffffffffffffff8111611fe057604052565b90601f8019910116810190811067ffffffffffffffff821117611fe057604052565b67ffffffffffffffff8111611fe057601f01601f191660200190565b35906001600160801b038216820361048057565b15612bdf57565b606460405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152fd5b60005260056020526001600160a01b0360406000205416612c45811515612bd8565b90565b612c6b61089d8260005260056020526001600160a01b0360406000205416151590565b60005260076020526001600160a01b036040600020541690565b15612c8c57565b608460405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f766564000000000000000000000000000000000000006064820152fd5b90612d1a939291612d0a6122af8433612d8c565b612d15838383612e6b565b613024565b15612d2157565b60405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b906001600160a01b038080612da084612c23565b16931691838314938415612dd3575b508315612dbd575b50505090565b612dc991929350612c48565b1614388080612db7565b909350600052600860205260406000208260005260205260ff604060002054169238612daf565b15612e0157565b608460405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152fd5b90612e949291612e7a83612c23565b916001600160a01b03948593848094169687911614612dfa565b1690811580612f8b57612ea6846132b6565b159081612f82575b5080612f79575b612f615791808492612ee36000805160206157e683398151915296602096612edc85612c23565b1614612dfa565b60009382855260078652604085206001600160a01b031990818154169055818652600687526040862060001981540190558286526040862060018154019055838652600587528260408720918254161790557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6040519580a48152a1565b60248360405190630da9b01360e01b82526004820152fd5b50831515612eb5565b90501538612eae565b608460405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152fd5b3d1561301f573d9061300582612ba8565b916130136040519384612b86565b82523d6000602084013e565b606090565b9290803b156131b45761308e916020916001600160a01b0394604051809581948293897f150b7a02000000000000000000000000000000000000000000000000000000009b8c865233600487015216602485015260448401526080606484015260848301906129c4565b03916000968791165af19082908261314d575b5050613127576130af612ff4565b805190816131225760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000161490565b909192506020813d82116131ac575b8161316960209383612b86565b810103126131a85751907fffffffff00000000000000000000000000000000000000000000000000000000821682036131a557509038806130a1565b80fd5b5080fd5b3d915061315c565b50505050600190565b67ffffffffffffffff8111611fe05760051b60200190565b9081546131e1816131bd565b926040936131f185519182612b86565b828152809460208092019260005281600020906000935b85851061321757505050505050565b6001848192845161322781612b00565b64ffffffffff87546001600160801b038116835267ffffffffffffffff8160801c168584015260c01c1686820152815201930194019391613208565b6040519061327082612b00565b60006040838281528260208201520152565b9060405161328f81612b00565b6040819360018154916001600160801b0392838116865260801c6020860152015416910152565b80600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260ff60016040600020015460b01c1690565b80600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260ff60016040600020015460a01c1690565b6001600160801b039182169082160391908211611b7657565b80600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260406000205460f81c90565b359064ffffffffff8216820361048057565b92919261338c826131bd565b60409461339b86519283612b86565b8195848352602080930191606080960285019481861161048057925b8584106133c75750505050505050565b8684830312610480578251906133dc82612b00565b6133e585612bc4565b8252858501359067ffffffffffffffff8216820361048057828792838b95015261341086880161336e565b868201528152019301926133b7565b3580151581036104805790565b356001600160a01b03811681036104805790565b356001600160801b03811681036104805790565b91908260409103126104805760405161346c81612b39565b602080829461347a81612a15565b84520135910152565b64ffffffffff80421682600052600b602052604060002091825482828260a01c1610156134e45760c81c1611156134d25760040154600110156134c957612c4590613525565b612c4590613714565b6001600160801b039150600201541690565b5050505050600090565b8051156134fb5760200190565b634e487b7160e01b600052603260045260246000fd5b80518210156134fb5760209160051b010190565b64ffffffffff90814216906000908152600b60205260409081812082519361354c85612b55565b8154956001600160a01b039182881687526020870197828160a01c168952828160c81c168789015260ff8160f01c161515606089015260f81c1515608088015260ff6001938486015490811660a08a0152818160a01c16151560c08a0152818160a81c16151560e08a015260b01c1615156101008801526101406135e660046135d760028801613282565b966101208b01978852016131d5565b97019187835280876135f8889a6134ee565b5101511693828288965b16106136dc57509161368c6136919284888161369698976001600160801b039e8f61362e8b8a51613511565b5151169d8a8f9b602061364b67ffffffffffffffff928d51613511565b5101511699848361365d848451613511565b51015116965081156136d05761367b92935051906000190190613511565b5101511680925b03169203166149e6565b614bc6565b614ad8565b9283136136af5750506136a983916149aa565b16011690565b5160200151929392831692841683101591506136cb9050575090565b905090565b50505051168092613682565b8094986001600160801b0390816136f48c8851613511565b51511601169801938282808a61370b898951613511565b51015116613602565b64ffffffffff613749600091838352600b60205280806040852054818160a01c1693849160c81c1603169181421603166149e6565b91808252600b602052600460408320018054156137cf5790829167ffffffffffffffff93526137a16020832054828452600b6020526136916001600160801b03968760026040882001541696879360801c1690614bc6565b9283136137b75750506137b3906149aa565b1690565b60029350604092508152600b60205220015460801c90565b602483634e487b7160e01b81526032600452fd5b80600052600b602052604060002060ff600182015460a01c1660001461380a575050600490565b805460f81c613863575460a01c64ffffffffff16421061385d5761382d81613483565b90600052600b6020526001600160801b03806002604060002001541691161060001461385857600190565b600290565b50600090565b5050600390565b80600052600b6020526138836002604060002001613282565b81600052600b602052604060002060ff600182015460a01c166000146138b657506001600160801b039150602001511690565b5460f81c6138c85750612c4590613483565b612c4591506001600160801b036040818351169201511690613324565b906001600160a01b036001541660206001600160a01b0360c0850151166024604051809481937fdcf844a700000000000000000000000000000000000000000000000000000000835260048301525afa801561098b57600090614198575b61396691506001600160801b0360a08501511690602060e08601510151916147d3565b6001600160801b0381511661010084015164ffffffffff602086015116821561416e5781518015614144577f00000000000000000000000000000000000000000000000000000000000000008111614113575064ffffffffff60406139ca846134ee565b510151168110156140bc5750600090819082815184905b808210614029575050505064ffffffffff421664ffffffffff8216811015613fe95750506001600160801b0316808203613fb25750506009549283600052600b6020526040600020916001600160801b0381511660028401906001600160801b03198254161790556001600160a01b0360c083015116600184015490750100000000000000000000000000000000000000000060408501511515928654927fffffffffffffffffff0000ff000000000000000000000000000000000000000076ff000000000000000000000000000000000000000000006060890151151560b01b16921617171760018601556001600160a01b0384511691610100850151926040613af3855195600019870190613511565b510151927fff000000000000000000000000000000000000000000000000000000000000007eff0000000000000000000000000000000000000000000000000000000000007dffffffffff0000000000000000000000000000000000000000000000000078ffffffffff000000000000000000000000000000000000000060208b015160a01b169660c81b169460f01b16911617171717845560005b818110613ee2575050600185016009556001600160a01b0360c08301511660005260026020526001600160801b0380604060002054168160208401511601166001600160a01b0360c0840151166000526040600020906001600160801b03198254161790556001600160a01b036080830151168015613e9e57613c31613c2b8760005260056020526001600160a01b0360406000205416151590565b15614346565b613c3a866132b6565b1580613e95575b80613e8d575b613e755760206000805160206157e683398151915291613c80613c2b8960005260056020526001600160a01b0360406000205416151590565b806000526006825260406000206001815401905587600052600582526040600020816001600160a01b0319825416179055876040519160007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4878152a1613d106001600160a01b0360c0840151166001600160801b038084511681602086015116011690309033906141cc565b6001600160801b0360408201511680613e46575b507fef3d668acee46576ad5d407c42ab4d0cde13f3cd70b28f09a0fb9e3bf5bf09cb613e036001600160a01b03845116926001600160a01b03608086015116946001600160a01b0360c08201511696613e3b613e1b60408401511515928c606086015115156001600160a01b0360e061010089015194549864ffffffffff6040519a613daf8c612b39565b818160a01c168c5260c81c1660208b01520151511695604051998a99610160948b523360208c015260408b0190604090816001600160801b0391828151168552826020820151166020860152015116910152565b60a089015260c08801528060e0880152860190612a8f565b926101008501906020908164ffffffffff91828151168552015116910152565b6101408301520390a4565b613e6f906001600160a01b0360c0850151166001600160a01b0360e086015151169033906141cc565b38613d24565b60248660405190630da9b01360e01b82526004820152fd5b506000613c47565b50801515613c41565b606460405162461bcd60e51b815260206004820152602060248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152fd5b613ef181610100860151613511565b519060048601549168010000000000000000831015611fe057600183018060048901558310156134fb5760019260048801600052602060002001906001600160801b03815116908254917fffffff00000000000000000000000000000000000000000000000000000000007cffffffffff000000000000000000000000000000000000000000000000604077ffffffffffffffff00000000000000000000000000000000602086015160801b1694015160c01b169316171717905501613b8f565b60449250604051917fd90b7e3900000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b6040517f210aec0e00000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b919350919361404d906001600160801b036140448588613511565b5151169061474f565b9364ffffffffff8060406140618685613511565b5101511694168085111561407f5750600184930191929190926139e1565b8385606492604051927f7b0bada8000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b64ffffffffff60406140cd846134ee565b5101516040517fb4c9e52c00000000000000000000000000000000000000000000000000000000815264ffffffffff938416600482015291169091166024820152604490fd5b602490604051907f4757689b0000000000000000000000000000000000000000000000000000000082526004820152fd5b60046040517f3952c64e000000000000000000000000000000000000000000000000000000008152fd5b60046040517f6095d3bc000000000000000000000000000000000000000000000000000000008152fd5b6020823d6020116141c4575b816141b160209383612b86565b810103126131a557506139669051613943565b3d91506141a4565b9290604051927f23b872dd0000000000000000000000000000000000000000000000000000000060208501526001600160a01b03809216602485015216604483015260648201526064815260a081019181831067ffffffffffffffff841117611fe05761423b9260405261423d565b565b6001600160a01b03169061429d60405161425681612b39565b6020938482527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564858301526000808587829751910182855af1614297612ff4565b91614912565b805191821591848315614322575b5050509050156142b85750565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b9193818094500103126131a8578201519081151582036131a55750803880846142ab565b1561434d57565b606460405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152fd5b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036143c357565b60046040517fa1c0d6e5000000000000000000000000000000000000000000000000000000008152fd5b916001600160a01b03604051927fa9059cbb000000000000000000000000000000000000000000000000000000006020850152166024830152604482015260448152608081019181831067ffffffffffffffff841117611fe05761423b9260405261423d565b612c45906144608161386a565b90600052600b60205260026040600020015460801c90613324565b91908110156134fb5760051b0190565b6144af6000805160206157e6833981519152936020936144a9614391565b836144b8565b604051908152a1565b906144c2826132ed565b614737576144e682600052600b6020526001600160a01b0360406000205416331490565b91821580614727575b611f55576000928184526020600581526001600160a01b0393604091858388205416938061471b575b6146f6578582169586156146e6576001600160801b03808a16998a156146cf5761454188614453565b8281168c116146a05750926145f58b89946001898e7f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d978f9a6145976145c0918c8552600b8b526002868620015460801c61474f565b8b8452600b8a5260028585200190836001600160801b031983549260801b169116178155613282565b906145db818a84015116928286818351169201511690613324565b161115614672575b888152600b87522001541696876143ed565b85518b8152a48133141580614668575b614612575b505050505050565b813b15614664576084929185915196879586946313375c3b60e01b86526004860152336024860152604485015260648401525af1614655575b808080808061460a565b61465e90612b72565b3861464b565b8480fd5b50813b1515614605565b888152600b8752818120838101600160a01b60ff60a01b1982541617905560ff60f01b1981541690556145e3565b865163287ecaef60e21b8152600481018a90526001600160801b03928316602482015291166044820152606490fd5b60248887519063d2aabcd960e01b82526004820152fd5b6004845163630d074f60e11b8152fd5b6064858784865192632dcbf6b960e11b84526004840152336024840152166044820152fd5b50838683161415614518565b506147318161476a565b156144ef565b60248260405190634a5541ef60e01b82526004820152fd5b9190916001600160801b0380809416911601918211611b7657565b60009080825260056020526001600160a01b0380604084205416928333149384156147af575b5050821561479d57505090565b9091506147aa3392612c48565b161490565b60ff9294509060409181526008602052818120338252602052205416913880614790565b9092916147de613263565b936001600160801b03928381169182156148ea5767016345785d8a00008082116148b35780851161487c575061482885614819819386615736565b16946020890195865284615736565b16918461483f60408901948086528287511661474f565b1610156148665761485884918261486195511690613324565b91511690613324565b168252565b634e487b7160e01b600052600160045260246000fd5b84604491604051917f4fea5c1a00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b60449250604051917f47152d6700000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b505050505090506040516148fd81612b00565b60008152600060208201526000604082015290565b919290156149735750815115614926575090565b3b1561492f5790565b606460405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b8251909150156149865750805190602001fd5b6104f19060405191829162461bcd60e51b83526020600484015260248301906129c4565b600081126149b55790565b602490604051907f2463f3d50000000000000000000000000000000000000000000000000000000082526004820152fd5b90600160ff1b808314908115614ace575b50614aa4576000821215614a9b57614a20826000035b6000831215614a9457826000039061566c565b917f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311614a5e5760009160001991181315614a5a575090565b0390565b604491604051917fd49c26b300000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b829061566c565b614a2082614a0d565b60046040517f9fe2b450000000000000000000000000000000000000000000000000000000008152fd5b90508114386149f7565b90600160ff1b808314908115614bbc575b50614b92576000821215614b8957614b12826000035b6000831215614b82578260000390615736565b917f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311614b4c5760009160001991181315614a5a575090565b604491604051917f120b5b4300000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b8290615736565b614b1282614aff565b60046040517fa6070c25000000000000000000000000000000000000000000000000000000008152fd5b9050811438614ae9565b80614be05750600090612c455750670de0b6b3a764000090565b90670de0b6b3a7640000808314614c2d575080614c05575050670de0b6b3a764000090565b670de0b6b3a76400008114614c2957614c2490613691612c4593615517565b614c63565b5090565b91505090565b8015614c4d576ec097ce7bc90715b34b9f10000000000590565b634e487b7160e01b600052601260045260246000fd5b6000811215614c925768033dd1780914b9711419811261385d57614c8990600003614c63565b612c4590614c33565b680a688906bd8affffff81136154e657670de0b6b3a764000080604092831b05907780000000000000000000000000000000000000000000000067ff0000000000000083166153c9575b66ff00000000000083166152c1575b65ff000000000083166151c1575b64ff0000000083166150c9575b63ff0000008316614fd9575b62ff00008316614ef1575b61ff008316614e11575b60ff8316614d3a575b02911c60bf031c90565b60808316614dff575b838316614ded575b60208316614ddb575b60108316614dc9575b60088316614db7575b60048316614da5575b60028316614d93575b6001831615614d30576801000000000000000102831c614d30565b6801000000000000000102831c614d78565b6801000000000000000302831c614d6f565b6801000000000000000602831c614d66565b6801000000000000000b02831c614d5d565b6801000000000000001602831c614d54565b6801000000000000002c02831c614d4b565b6801000000000000005902831c614d43565b6180008316614edf575b6140008316614ecd575b6120008316614ebb575b6110008316614ea9575b6108008316614e97575b6104008316614e85575b6102008316614e73575b610100831615614d2757680100000000000000b102831c614d27565b6801000000000000016302831c614e57565b680100000000000002c602831c614e4d565b6801000000000000058c02831c614e43565b68010000000000000b1702831c614e39565b6801000000000000162e02831c614e2f565b68010000000000002c5d02831c614e25565b680100000000000058b902831c614e1b565b628000008316614fc7575b624000008316614fb5575b622000008316614fa3575b621000008316614f91575b620800008316614f7f575b620400008316614f6d575b620200008316614f5b575b62010000831615614d1d576801000000000000b17202831c614d1d565b680100000000000162e402831c614f3e565b6801000000000002c5c802831c614f33565b68010000000000058b9102831c614f28565b680100000000000b172102831c614f1d565b68010000000000162e4302831c614f12565b680100000000002c5c8602831c614f07565b6801000000000058b90c02831c614efc565b638000000083166150b7575b634000000083166150a5575b63200000008316615093575b63100000008316615081575b6308000000831661506f575b6304000000831661505d575b6302000000831661504b575b6301000000831615614d125768010000000000b1721802831c614d12565b6801000000000162e43002831c61502d565b68010000000002c5c86002831c615021565b680100000000058b90c002831c615015565b6801000000000b17217f02831c615009565b680100000000162e42ff02831c614ffd565b6801000000002c5c85fe02831c614ff1565b68010000000058b90bfc02831c614fe5565b64800000000083166151af575b644000000000831661519d575b642000000000831661518b575b6410000000008316615179575b6408000000008316615167575b6404000000008316615155575b6402000000008316615143575b640100000000831615614d0657680100000000b17217f802831c614d06565b68010000000162e42ff102831c615124565b680100000002c5c85fe302831c615117565b6801000000058b90bfce02831c61510a565b68010000000b17217fbb02831c6150fd565b6801000000162e42fff002831c6150f0565b68010000002c5c8601cc02831c6150e3565b680100000058b90c0b4902831c6150d6565b6580000000000083166152af575b65400000000000831661529d575b65200000000000831661528b575b651000000000008316615279575b650800000000008316615267575b650400000000008316615255575b650200000000008316615243575b65010000000000831615614cf9576801000000b17218355102831c614cf9565b680100000162e430e5a202831c615223565b6801000002c5c863b73f02831c615215565b68010000058b90cf1e6e02831c615207565b680100000b1721bcfc9a02831c6151f9565b68010000162e43f4f83102831c6151eb565b680100002c5c89d5ec6d02831c6151dd565b6801000058b91b5bc9ae02831c6151cf565b668000000000000083166153b7575b664000000000000083166153a5575b66200000000000008316615393575b66100000000000008316615381575b6608000000000000831661536f575b6604000000000000831661535d575b6602000000000000831661534b575b6601000000000000831615614ceb5768010000b17255775c0402831c614ceb565b6801000162e525ee054702831c61532a565b68010002c5cc37da949202831c61531b565b680100058ba01fb9f96d02831c61530c565b6801000b175effdc76ba02831c6152fd565b680100162f3904051fa102831c6152ee565b6801002c605e2e8cec5002831c6152df565b68010058c86da1c09ea202831c6152d0565b67800000000000000083166154c7575b67400000000000000083166154b5575b67200000000000000083166154a3575b6710000000000000008316615491575b670800000000000000831661547f575b670400000000000000831661546d575b670200000000000000831661545b575b670100000000000000831615614cdc57680100b1afa5abcbed6102831c614cdc565b68010163da9fb33356d802831c615439565b680102c9a3e778060ee702831c615429565b6801059b0d31585743ae02831c615419565b68010b5586cf9890f62a02831c615409565b6801172b83c7d517adce02831c6153f9565b6801306fe0a31b7152df02831c6153e9565b5077b504f333f9de6484800000000000000000000000000000006153d9565b602490604051907f0360d0280000000000000000000000000000000000000000000000000000000082526004820152fd5b8060008083131561563b57670de0b6b3a76400009283811261560457506001925b808305906001600160801b03821160071b91821c9167ffffffffffffffff831160061b92831c63ffffffff811160051b90811c61ffff811160041b90811c60ff811160031b90811c91600f831160021b92831c936001978860038711811b96871c11961717171717171781810294811d908282146155f857506706f05b59d3b20000905b8482136155cc5750505050500290565b808391020590671bc16d674ec800008212156155eb575b831d906155bc565b8091950194831d906155e3565b93505093925050020290565b6000199392508015615627576ec097ce7bc90715b34b9f10000000000591615538565b602482634e487b7160e01b81526012600452fd5b602483604051907f059b101b0000000000000000000000000000000000000000000000000000000082526004820152fd5b670de0b6b3a764000091600019838309928083029283808610950394808603951461572857828510156156ec57908291096001821901821680920460028082600302188083028203028083028203028083028203028083028203028083028203028092029003029360018380600003040190848311900302920304170290565b82606492604051927f63a05778000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b505080925015614c4d570490565b909190600019838209838202918280831092039180830392146157d457670de0b6b3a7640000908183101561579d57947faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066994950990828211900360ee1b910360121c170290565b60449086604051917f5173648d00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050670de0b6b3a76400009004915056fef8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7a164736f6c6343000815000a"; bytes public constant BYTECODE_LOCKUP_LINEAR = - hex"60a034620003e757601f196001600160401b03601f62004c523881900382810185168601919084831187841017620003ec57808792606094604052833981010312620003e75783516001600160a01b03928382169291839003620003e7576020918287015196858816809803620003e75760400151948516809503620003e7576200008962000402565b90601c82527f5361626c696572205632204c6f636b7570204c696e656172204e46540000000084830152620000bd62000402565b601181527029a0a116ab1916a627a1a5aaa816a624a760791b8582015230608052600080546001600160a01b031990811688178255600180548216909b178b5596817fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a38351858111620003d35760039485548c81811c91168015620003c8575b89821014620003b45790818684931162000361575b508890868311600114620002f8578492620002ec575b505060001982871b1c1916908b1b1784555b8151948511620002d8576004958654998b8b811c9b168015620002cd575b828c1014620002ba57848b1162000271575b869798999a50819487116001146200020a57505093620001fe575b505082871b92600019911b1c19161790555b600a541617600a5560095560405161482f9081620004238239608051816145590152f35b015191503880620001c8565b8883528183208c9890969594939116915b8282106200025757505085116200023c575b50505050811b019055620001da565b01519060f884600019921b161c19169055388080806200022d565b8484015187558c989096019593840193908101906200021b565b87835281832085880160051c81019b838910620002af575b860160051c019a8c905b8c8110620002a3575050620001ad565b848155018c9062000293565b909b508b9062000289565b634e487b7160e01b835260228852602483fd5b9a607f169a6200019b565b634e487b7160e01b81526041600452602490fd5b0151905038806200016b565b908c8e9416918886528a862092865b8c82821062000341575050841162000328575b505050811b0184556200017d565b015160001983891b60f8161c191690553880806200031a565b91929395968291958786015181550195019301908f959493929162000307565b9091508684528884208680850160051c8201928b8610620003aa575b918f91869594930160051c01915b8281106200039b57505062000155565b8681558594508f91016200038b565b925081926200037d565b634e487b7160e01b84526022600452602484fd5b90607f169062000140565b634e487b7160e01b82526041600452602482fd5b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620003ec5760405256fe608080604052600436101561001357600080fd5b600090813560e01c90816301ffc9a714612dd45750806306fdde0314612d12578063081812fc14612cf3578063095ea7b314612b645780631400ecec14612ac45780631c1cdd4c14612a5f5780631e99d56914612a4157806323b872dd14612a1757806339a73c03146129d657806340e58ee514612738578063425d30dd1461271957806342842e0e146126c957806342966c681461253f5780634857501f146124b55780634869e12d1461247a5780635fe3b567146124535780636352211e146124235780636d0cee75146123cd57806370a082311461232457806375829def14612291578063780a82c8146122415780637cad6cd1146121705780637de6b1db14611f905780638659c27014611c6f578063894e9a0d14611a1b5780638bad38dd1461199e5780638f69b993146119025780639067b677146118af57806395d89b41146117a257806396ce143114611683578063a22cb465146115b2578063a2ffb897146111c5578063a6202bf2146110c8578063a80fc07114611076578063ab167ccc14610f3d578063ad35efd414610edb578063b256456914610ebc578063b88d4fde14610e32578063b8a3be6614610dfd578063b971302a14610dae578063bc063e1a14610d8b578063bc2be1be14610d3b578063c156a11d146109c1578063c87b56dd14610887578063cc364f48146107d9578063d4dbd20b14610787578063d511609f1461073b578063d975dfed146106ef578063e985e9c51461069a578063ea5ead1914610674578063eac8f5b81461060b578063f590c176146105e2578063f851a440146105bc5763fdd46d601461027357600080fd5b346105b95760603660031901126105b95760043561028f612f03565b610297613043565b906102a061454f565b6102a9836136d3565b6105a1576102cd83600052600b6020526001600160a01b0360406000205416331490565b90811580610591575b61057257838552602092600584526001600160a01b0391826040882054169380610566575b61054057828116928315610516576001600160801b038084169384156104fe5761032489614611565b82811686116104ca5750938093926103ca9261038f6103578d9a99988d8c52600b8d52600260408d20015460801c61465f565b8c8b52600b8c5261038a600260408d20019182906001600160801b036001600160801b031983549260801b169116179055565b613668565b906103ab818c840151169282604081835116920151169061370a565b16111561049a575b898852600b895260016040892001541692836145ab565b82877f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d88604051868152a48233141580610490575b610432575b837ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce78688604051908152a180f35b823b1561048c57608484928360405195869485936313375c3b60e01b85528b6004860152336024860152604485015260648401525af1610474575b8080610404565b61047d90612f7f565b61048857823861046d565b8280fd5b8380fd5b50823b15156103ff565b898852600b89526040882060018101600160c81b60ff60c81b1982541617905560ff60f01b1981541690556103b3565b60405163287ecaef60e21b8152600481018b90526001600160801b03928316602482015291166044820152606490fd5b0390fd5b6024896040519063d2aabcd960e01b82526004820152fd5b60046040517fc61a0e9e000000000000000000000000000000000000000000000000000000008152fd5b858360649260405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b508383821614156102fb565b60405163216caf0d60e01b815260048101859052336024820152604490fd5b5061059b8461467a565b156102d6565b60248360405190634a5541ef60e01b82526004820152fd5b80fd5b50346105b957806003193601126105b9576001600160a01b036020915416604051908152f35b50346105b95760203660031901126105b9576020610601600435613739565b6040519015158152f35b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d5760016040836001600160a01b039360209552600b855220015416604051908152f35b6024906040519062b8e7e760e51b82526004820152fd5b50346105b95760403660031901126105b957600435610691612f03565b61029782614611565b50346105b95760403660031901126105b9576106b4612eed565b60406106be612f03565b926001600160a01b0380931681526008602052209116600052602052602060ff604060002054166040519015158152f35b50346105b95760203660031901126105b95760ff6001604060043593848152600b60205220015460d01c161561065d5761072a602091614611565b6001600160801b0360405191168152f35b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d5760408260029260209452600b845220015460801c604051908152f35b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d5760036040836001600160801b039360209552600b855220015416604051908152f35b50346105b95760203660031901126105b9576004356107f6613649565b50808252600b60205260ff600160408420015460d01c161561065d578160409160609352600b60205220600181549164ffffffffff918291015460a01c16906040519261084284612fcd565b818160a01c16845260c81c166020830152604082015261088560405180926040908164ffffffffff91828151168552826020820151166020860152015116910152565bf35b50346105b9576020806003193601126109b1576004356108c56108c08260005260056020526001600160a01b0360406000205416151590565b613059565b826001600160a01b03600a5416916044604051809481937fe9dc637500000000000000000000000000000000000000000000000000000000835230600484015260248301525afa9283156109b5578093610934575b5050610930604051928284938452830190612ec8565b0390f35b909192503d8082843e6109478184613005565b82019183818403126109b15780519067ffffffffffffffff8211610488570182601f820112156109b15780519161097d83613027565b9361098b6040519586613005565b8385528584840101116105b95750906109a991848085019101612ea5565b90388061091a565b5080fd5b604051903d90823e3d90fd5b50346105b95760403660031901126105b9576004356109de612f03565b906109e761454f565b808352602091600b835260ff600160408620015460d01c1615610d2457818452600583526001600160a01b03806040862054169081330361057257610a2b84614611565b906001600160801b0390818316918215938415610a52575b89610a4f8989896132ec565b80f35b610a5a61454f565b610a63886136d3565b610d0c57610a8788600052600b6020526001600160a01b0360406000205416331490565b94851580610cfc575b610cdd57888b5260058a528360408c2054169580610cd3575b610caf57861561051657610c9757610ac088614611565b8281168511610c67575090610b20610aed8b969594938a8852600b8c52600260408920015460801c61465f565b898752600b8b5261038a600260408920019182906001600160801b036001600160801b031983549260801b169116179055565b90610b3c818b840151169282604081835116920151169061370a565b161115610c37575b868452600b8852600160408520015416610b5f8286836145ab565b84877f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d8a604051868152a48133141580610c2d575b610bd2575b5050507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7610a4f94604051858152a13880808080610a43565b813b156104885782916084839260405194859384926313375c3b60e01b84528b600485015233602485015289604485015260648401525af1610c15575b80610b99565b610c1e90612f7f565b610c29578438610c0f565b8480fd5b50813b1515610b94565b868452600b88526040842060018101600160c81b60ff60c81b1982541617905560ff60f01b198154169055610b44565b60405163287ecaef60e21b8152600481018a90526001600160801b03928316602482015291166044820152606490fd5b6024886040519063d2aabcd960e01b82526004820152fd5b6064898860405191632dcbf6b960e11b835260048301523360248301526044820152fd5b5085871415610aa9565b60405163216caf0d60e01b8152600481018a9052336024820152604490fd5b50610d068961467a565b15610a90565b60248860405190634a5541ef60e01b82526004820152fd5b6024826040519062b8e7e760e51b82526004820152fd5b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d5760408264ffffffffff9260209452600b8452205460a01c16604051908152f35b50346105b957806003193601126105b957602060405167016345785d8a00008152f35b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d576040826001600160a01b039260209452600b8452205416604051908152f35b50346105b95760203660031901126105b95760ff600160406020936004358152600b855220015460d01c166040519015158152f35b50346105b95760803660031901126105b957610e4c612eed565b610e54612f03565b906064359067ffffffffffffffff821161048c573660238301121561048c5781600401359284610e8385613027565b93610e916040519586613005565b85855236602487830101116109b15785610a4f96602460209301838801378501015260443591613177565b50346105b95760203660031901126105b957602061060160043561369c565b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d57610f14906139af565b604051906005811015610f2957602092508152f35b602483634e487b7160e01b81526021600452fd5b50346105b9576101403660031901126105b957610f5861454f565b610f60613649565b9064ffffffffff80421680845260c43582811681036110715781018216602085015260e4359081831682036110715701166040830152606435916001600160a01b03918284168094036105b957506084358015158091036110715760a435908115158092036110715760243594848616809603611071576004359585871680970361107157604435906001600160801b038216809203611071576040519761100789612fb0565b8852602088015260408701526060860152608085015260a084015260c0830152604061010319360112611071576040519161104183612fe9565b61010435918216820361107157826110699260209452610124358482015260e0820152613ab1565b604051908152f35b600080fd5b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d5760026040836001600160801b039360209552600b855220015416604051908152f35b50346105b95760203660031901126105b9576110e2612eed565b6001600160a01b038083541633810361119c575081169081835260026020526001600160801b0360408420541690811561116b578161113c918486526002602052604086206001600160801b0319815416905533906145ab565b6040519081527fca7a4a65a94ed2f37538814e00e1cd4c41a78261561e3f3794592f11409cf5af60203392a380f35b602483604051907f8410168c0000000000000000000000000000000000000000000000000000000082526004820152fd5b6040516331b339a960e21b81526001600160a01b03919091166004820152336024820152604490fd5b50346105b95760603660031901126105b95767ffffffffffffffff600435818111610488576111f8903690600401612f4e565b90611201612f03565b92604435908111610c295761121a903690600401612f4e565b61122594919461454f565b80840361157b5791926001600160a01b038216159290865b818110611248578780f35b611253818388614639565b359061126081858a614639565b356001600160801b03811681036110715761127961454f565b611282836136d3565b6105a1576112a683600052600b6020526001600160a01b0360406000205416331490565b80158061156b575b61057257838b5260056020526001600160a01b0360408c2054169080611558575b61152b5787610516576001600160801b03821615611513576112f084614611565b6001600160801b0381166001600160801b038416116114e15750908a91848352600b80602052611360600261038a611331868360408a20015460801c61465f565b918988528460205260408820019182906001600160801b036001600160801b031983549260801b169116179055565b6001600160801b03611384816020840151169282604081835116920151169061370a565b1611156114b1575b8584526020526001600160a01b036001604085200154166113b76001600160801b0384168a836145ab565b6040516001600160801b0384168152867f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d60206001600160a01b038d1693a480331415806114a7575b61143b575b5050507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce76020600193604051908152a10161123d565b803b15610488576001600160a01b036084898580946001600160801b0360405197889687956313375c3b60e01b87528d60048801523360248801521660448601521660648401525af161148f575b80611405565b61149890612f7f565b6114a3578838611489565b8880fd5b50803b1515611400565b858452806020526040842060018101600160c81b60ff60c81b1982541617905560ff60f01b19815416905561138c565b60405163287ecaef60e21b8152600481018690526001600160801b038481166024830152919091166044820152606490fd5b6024846040519063d2aabcd960e01b82526004820152fd5b6064846001600160a01b038960405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b50806001600160a01b03881614156112cf565b506115758461467a565b156112ae565b83604491604051917faec9344000000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b50346105b95760403660031901126105b9576115cc612eed565b60243590811515809203611071576001600160a01b03169081331461163f5733835260086020526040832082600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a380f35b606460405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152fd5b50346105b9576101603660031901126105b95761169e61454f565b604051906116ab82612fb0565b6116b3612eed565b82526116bd612f03565b60208301526116ca613043565b60408301526001600160a01b03906064358281168103611071576060840152608435801515810361107157608084015260a43580151581036110715760a084015260603660c31901126105b9575060405161172481612fcd565b64ffffffffff60c435818116810361107157825260e435818116810361107157602083015261010435908116810361107157604082015260c0830152604061012319360112611071576040519161177a83612fe9565b61012435918216820361107157826110699260209452610144358482015260e0820152613ab1565b50346105b957806003193601126105b957604051908060045491600183811c928185169485156118a5575b60209586861081146118915785885287949392918790821561186f575050600114611815575b505061180192500383613005565b610930604051928284938452830190612ec8565b90859250600482527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5b858310611857575050611801935082010138806117f3565b8054838901850152879450869390920191810161183f565b925093505061180194915060ff191682840152151560051b82010138806117f3565b602483634e487b7160e01b81526022600452fd5b93607f16936117cd565b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d57600160408364ffffffffff9360209552600b855220015460a01c16604051908152f35b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d5761193b906139af565b906005821015908161197c5760028314918215611990575b8215611967575b6020836040519015158152f35b90915061197c5750600460209114388061195a565b80634e487b7160e01b602492526021600452fd5b506003831491506000611953565b50346105b95760203660031901126105b9576004356001600160a01b0390818116809103610488578183541633810361119c575060015491816001600160a01b03198416176001556040519216825260208201527fdcb09aef4bf01068924ccce937981cbe59d25ba08380cf941aaaea4e4bd3960d60403392a280f35b50346105b95760203660031901126105b957604051611a3981612f93565b8181528160208201528160408201528160608201528160808201528160a08201528160c08201528160e08201528161010082015281610120820152610140611a7f613649565b9101526004358152600b60205260ff600160408320015460d01c1615611c57576004358152600b60205260408120611b58600260405192611abf84612f93565b80546001600160a01b038116855264ffffffffff8160a01c16602086015264ffffffffff8160c81c16604086015260ff8160f01c161515606086015260f81c1515608085015260ff60018201546001600160a01b03811660a087015264ffffffffff8160a01c1660c0870152818160c81c16151560e0870152818160d01c16151561010087015260d81c16151561012085015201613668565b610140820152611b696004356139af565b6005811015610f29579160026101a09314611c4c575b50610885610140604051926001600160a01b03815116845264ffffffffff602082015116602085015264ffffffffff60408201511660408501526060810151151560608501526080810151151560808501526001600160a01b0360a08201511660a085015264ffffffffff60c08201511660c085015260e0810151151560e0850152610100810151151561010085015261012081015115156101208501520151610140830190604090816001600160801b0391828151168552826020820151166020860152015116910152565b606082015238611b7f565b602460405162b8e7e760e51b81526004356004820152fd5b50346105b957602090816003193601126105b95760043567ffffffffffffffff81116109b157611ca483913690600401612f4e565b9190611cae61454f565b83925b808410611cbc578480f35b611ccb84828497959697614639565b3594611cd561454f565b611cde866136d3565b15611cfb5760248660405190634a5541ef60e01b82526004820152fd5b611d0486613739565b611f7857611d2886600052600b6020526001600160a01b0360406000205416331490565b15611f5957611d368661376a565b95808552600b90818752611d4f60026040882001613668565b906001600160801b039283835116848b161015611f415781885280895260ff604089205460f01c1615611f2957611d9f8a858b611d9560409a9b9c9d9e8389511661370a565b960151169061370a565b92828a52818b52868a20908b8b7f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa50845497600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8a1617865560038a8216968715611f0f575b01998516998a6001600160801b03198254161790556001600160a01b0380991698899360058652818e822054169889965260019d8e912001541694611e4c8b85886145ab565b604080518a81526001600160801b0392831660208201529290911690820152606090a47ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce78b604051858152a1813b611eb0575b505050505001919093919293611cb1565b813b15611f0b57899493919285809460849360405197889687956372eba20360e01b875260048701526024860152604485015260648401525af1611ef7575b808080611e9f565b611f0090612f7f565b610c29578487611eef565b8980fd5b60018101600160c81b60ff60c81b19825416179055611e06565b602482604051906339c6dc7360e21b82526004820152fd5b602482604051906322cad1af60e11b82526004820152fd5b60405163216caf0d60e01b815260048101879052336024820152604490fd5b6024866040519063fe19f19f60e01b82526004820152fd5b50346105b9576020806003193601126109b15760043590611faf61454f565b818352600b815260ff600160408520015460d01c1615610d2457611fd2826139af565b600581101561215c5760048103611ffb5760248360405190634a5541ef60e01b82526004820152fd5b6003810361201b576024836040519063fe19f19f60e01b82526004820152fd5b600214611f415761204282600052600b6020526001600160a01b0360406000205416331490565b1561213d57818352600b815260ff604084205460f01c1615611f2957818352600b81526040832060ff60f01b19815416905582604051837f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f8380a2600583526001600160a01b03604083205416803b6120e5575b5050507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce791604051908152a180f35b803b1561048857816024818580947f341a0bd90000000000000000000000000000000000000000000000000000000083528960048401525af1612129575b806120b6565b61213290612f7f565b610488578238612123565b60405163216caf0d60e01b815260048101839052336024820152604490fd5b602484634e487b7160e01b81526021600452fd5b50346105b95760203660031901126105b9576004356001600160a01b0390818116809103610488578183541633810361119c5750600a5491816001600160a01b0319841617600a556040519216825260208201527fa2548bd4b805e907c1558a47b5858324fe8bb4a2e1ddfca647eecbf65610eebc60403392a2600954600019810190811161222d5760407f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c91815190600182526020820152a180f35b602482634e487b7160e01b81526011600452fd5b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d5760408264ffffffffff9260209452600b8452205460c81c16604051908152f35b50346105b95760203660031901126105b9576122ab612eed565b9080546001600160a01b03808216933385036122fd576001600160a01b03199394501691829116178255337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808380a380f35b6040516331b339a960e21b81526001600160a01b0386166004820152336024820152604490fd5b50346105b95760203660031901126105b9576001600160a01b03612346612eed565b168015612363578160409160209352600683522054604051908152f35b608460405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e657200000000000000000000000000000000000000000000006064820152fd5b50346105b95760203660031901126105b9576001600160a01b0360406020926004356124126108c08260005260056020526001600160a01b0360406000205416151590565b815260058452205416604051908152f35b50346105b95760203660031901126105b95760206124426004356130a4565b6001600160a01b0360405191168152f35b50346105b957806003193601126105b95760206001600160a01b0360015416604051908152f35b50346105b95760203660031901126105b95760ff6001604060043593848152600b60205220015460d01c161561065d5761072a602091613a36565b50346105b95760203660031901126105b95760043590818152600b60205260ff600160408320015460d01c1615610d2457806124f0836139af565b92600584101561252b57600260209403612511575b50506040519015158152f35b8152600b8352604090205460f01c60ff1690503880612505565b602482634e487b7160e01b81526021600452fd5b50346105b95760203660031901126105b95760043561255c61454f565b612565816136d3565b15612698576125738161467a565b1561267857612581816130a4565b61258a8261369c565b159081612670575b8161265d575b50612645576020816125ca7ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7936130a4565b90808552600783526001600160a01b0360408620926001600160a01b03199384815416905516918286526006845260408620600019815401905581865260058452604086209081541690558085604051937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a48152a180f35b60249060405190630da9b01360e01b82526004820152fd5b6001600160a01b03915016151538612598565b839150612592565b60405163216caf0d60e01b81526004810191909152336024820152604490fd5b602490604051907f817cd6390000000000000000000000000000000000000000000000000000000082526004820152fd5b50346105b9576126d836612f19565b60405191602083019383851067ffffffffffffffff86111761270357610a4f94604052858452613177565b634e487b7160e01b600052604160045260246000fd5b50346105b95760203660031901126105b95760206106016004356136d3565b50346105b9576020806003193601126109b1576004359061275761454f565b612760826136d3565b1561277d5760248260405190634a5541ef60e01b82526004820152fd5b9061278781613739565b6129be576127ab81600052600b6020526001600160a01b0360406000205416331490565b15612678576127b98161376a565b818452600b83526127cf60026040862001613668565b926001600160801b03918285511683821610156129a657838652600b825260ff604087205460f01c161561298e5792827ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce783612844878460409761283a8d9b6128ef9b8e511661370a565b9b0151169061370a565b92848852600b825287868120947f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa50865491600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84161788556003858216988915612974575b01948d169c858e6001600160801b0319819854161790556001600160a01b038094169b8c94600589526001818e892054169d8e98600b8c52200154169685886145ab565b604080518b81526001600160801b0392831660208201529290911690820152606090a4604051848152a1823b612923578480f35b823b15610c2957608492859160405197889687956372eba20360e01b875260048701526024860152604485015260648401525af1612965575b81818080808480f35b61296e90612f7f565b3861295c565b60018101600160c81b60ff60c81b198254161790556128ab565b602484604051906339c6dc7360e21b82526004820152fd5b602484604051906322cad1af60e11b82526004820152fd5b6024906040519063fe19f19f60e01b82526004820152fd5b50346105b95760203660031901126105b9576001600160801b0360406020926001600160a01b03612a05612eed565b16815260028452205416604051908152f35b50346105b957610a4f612a2936612f19565b91612a3c612a37843361320d565b613106565b6132ec565b50346105b957806003193601126105b9576020600954604051908152f35b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d57612a98906139af565b90600582101561197c5760208215838115612ab9575b506040519015158152f35b600191501482612aae565b50346105b95760203660031901126105b95760043590818152600b60205260ff600160408320015460d01c1615610d2457602091604082828152600b85522060ff815460f01c1680612b52575b612b29575b50506001600160801b0360405191168152f35b612b4b92506001600160801b036002612b45920154169161376a565b9061370a565b3880612b16565b5060ff600182015460c81c1615612b11565b50346105b95760403660031901126105b957612b7e612eed565b602435906001600160a01b038080612b95856130a4565b16921691808314612c8957803314908115612c68575b5015612bfe57828452600760205260408420826001600160a01b0319825416179055612bd6836130a4565b167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258480a480f35b608460405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152fd5b9050845260086020526040842033855260205260ff60408520541638612bab565b608460405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152fd5b50346105b95760203660031901126105b95760206124426004356130c9565b50346105b957806003193601126105b957604051908060035491600183811c92818516948515612dca575b60209586861081146118915785885287949392918790821561186f575050600114612d7057505061180192500383613005565b90859250600382527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b858310612db2575050611801935082010138806117f3565b80548389018501528794508693909201918101612d9a565b93607f1693612d3d565b9050346109b15760203660031901126109b1576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361048857602092507f80ac58cd000000000000000000000000000000000000000000000000000000008114908115612e7b575b8115612e51575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501438612e4a565b7f5b5e139f0000000000000000000000000000000000000000000000000000000081149150612e43565b60005b838110612eb85750506000910152565b8181015183820152602001612ea8565b90602091612ee181518092818552858086019101612ea5565b601f01601f1916010190565b600435906001600160a01b038216820361107157565b602435906001600160a01b038216820361107157565b6060906003190112611071576001600160a01b0390600435828116810361107157916024359081168103611071579060443590565b9181601f840112156110715782359167ffffffffffffffff8311611071576020808501948460051b01011161107157565b67ffffffffffffffff811161270357604052565b610160810190811067ffffffffffffffff82111761270357604052565b610100810190811067ffffffffffffffff82111761270357604052565b6060810190811067ffffffffffffffff82111761270357604052565b6040810190811067ffffffffffffffff82111761270357604052565b90601f8019910116810190811067ffffffffffffffff82111761270357604052565b67ffffffffffffffff811161270357601f01601f191660200190565b604435906001600160801b038216820361107157565b1561306057565b606460405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152fd5b60005260056020526001600160a01b03604060002054166130c6811515613059565b90565b6130ec6108c08260005260056020526001600160a01b0360406000205416151590565b60005260076020526001600160a01b036040600020541690565b1561310d57565b608460405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f766564000000000000000000000000000000000000006064820152fd5b9061319b93929161318b612a37843361320d565b6131968383836132ec565b6134b7565b156131a257565b60405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b906001600160a01b038080613221846130a4565b16931691838314938415613254575b50831561323e575b50505090565b61324a919293506130c9565b1614388080613238565b909350600052600860205260406000208260005260205260ff604060002054169238613230565b1561328257565b608460405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152fd5b9061331592916132fb836130a4565b916001600160a01b0394859384809416968791161461327b565b169081158061341e576133278461369c565b159081613415575b508061340c575b6133f457918084926133767ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce79660209661336f856130a4565b161461327b565b60009382855260078652604085206001600160a01b031990818154169055818652600687526040862060001981540190558286526040862060018154019055838652600587528260408720918254161790557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6040519580a48152a1565b60248360405190630da9b01360e01b82526004820152fd5b50831515613336565b9050153861332f565b608460405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152fd5b3d156134b2573d9061349882613027565b916134a66040519384613005565b82523d6000602084013e565b606090565b9290803b1561364057613521916020916001600160a01b0394604051809581948293897f150b7a02000000000000000000000000000000000000000000000000000000009b8c86523360048701521660248501526044840152608060648401526084830190612ec8565b03916000968791165af1908290826135e0575b50506135ba57613542613487565b805190816135b55760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000161490565b909192506020813d8211613638575b816135fc60209383613005565b810103126109b15751907fffffffff00000000000000000000000000000000000000000000000000000000821682036105b95750903880613534565b3d91506135ef565b50505050600190565b6040519061365682612fcd565b60006040838281528260208201520152565b9060405161367581612fcd565b6040819360018154916001600160801b0392838116865260801c6020860152015416910152565b80600052600b60205260ff60016040600020015460d01c161561065d57600052600b60205260ff60016040600020015460d81c1690565b80600052600b60205260ff60016040600020015460d01c161561065d57600052600b60205260ff60016040600020015460c81c1690565b6001600160801b03918216908216039190821161372357565b634e487b7160e01b600052601160045260246000fd5b80600052600b60205260ff60016040600020015460d01c161561065d57600052600b60205260406000205460f81c90565b600090808252600b6020526040822091825464ffffffffff42818360c81c16116138185780600186015460a01c169182421015613802576137b79394955060a01c16809103904203613820565b90828152600b6020526001600160801b03926137dd846002604085200154168094613900565b9283116137ea5750501690565b60029350604092508152600b60205220015460801c90565b505050505060026001600160801b039101541690565b505091505090565b670de0b6b3a76400009160001983830992808302928380861095039480860395146138dc57828510156138a057908291096001821901821680920460028082600302188083028203028083028203028083028203028083028203028083028203028092029003029360018380600003040190848311900302920304170290565b82606492604051927f63a05778000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b5050809250156138ea570490565b634e487b7160e01b600052601260045260246000fd5b9091906000198382098382029182808310920391808303921461399e57670de0b6b3a7640000908183101561396757947faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066994950990828211900360ee1b910360121c170290565b60449086604051917f5173648d00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050670de0b6b3a764000090049150565b80600052600b602052604060002060ff600182015460c81c166000146139d6575050600490565b805460f81c613a2f575460a01c64ffffffffff164210613a29576139f98161376a565b90600052600b6020526001600160801b038060026040600020015416911610600014613a2457600190565b600290565b50600090565b5050600390565b80600052600b602052613a4f6002604060002001613668565b81600052600b602052604060002060ff600182015460c81c16600014613a8257506001600160801b039150602001511690565b5460f81c613a9457506130c69061376a565b6130c691506001600160801b03604081835116920151169061370a565b906001600160a01b036001541660206001600160a01b036060850151166024604051809481937fdcf844a700000000000000000000000000000000000000000000000000000000835260048301525afa80156142e6576000906142b2575b613b3291506001600160801b0360408501511690602060e08601510151916146e3565b916001600160801b0383511660c082015190156142885764ffffffffff815116602082019064ffffffffff8251169081811161424857505064ffffffffff604091511691019064ffffffffff825116908181101561420857505064ffffffffff80421691511690818110156141c8575050600954926001600160801b0381511660405190613bbf82612fcd565b815260006020820152600060408201526001600160a01b036060840151169060c08401519164ffffffffff6020840151169064ffffffffff604085015116906080870151151560a088015115159364ffffffffff6001600160a01b038a511697511660405197613c2e89612f93565b88526020880152604087015260608601526000608086015260a085015260c0840152600060e0840152600161010084015261012083015261014082015284600052600b60205260406000206001600160a01b038251166001600160a01b0319825416178155613cc564ffffffffff602084015116829064ffffffffff60a01b1964ffffffffff60a01b83549260a01b169116179055565b604082015181547eff0000000000000000000000000000000000000000000000000000000000006060850151151560f01b169078ffffffffffffffffffffffffffffffffffffffffffffffffff7dffffffffff000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000006080880151151560f81b169460c81b1691161717178155600181016001600160a01b0360a0840151166001600160a01b0319825416178155613dbc64ffffffffff60c085015116829064ffffffffff60a01b1964ffffffffff60a01b83549260a01b169116179055565b60e083015181546101008501516101208601517fffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff90921692151560c81b79ff00000000000000000000000000000000000000000000000000169290921791151560d01b7aff0000000000000000000000000000000000000000000000000000169190911790151560d81b7bff00000000000000000000000000000000000000000000000000000016179055610140909101518051602082015160801b6001600160801b03199081166001600160801b03928316176002850155926040906003019201511682825416179055600185016009556001600160a01b0360608401511660005260026020526001600160801b0380604060002054168160208501511601166001600160a01b036060850151166000526040600020918254161790556001600160a01b03602083015116801561418457613f37613f318660005260056020526001600160a01b0360406000205416151590565b1561446c565b613f408561369c565b158061417b575b80614173575b61415b5760207ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce791613f98613f318860005260056020526001600160a01b0360406000205416151590565b806000526006825260406000206001815401905586600052600582526040600020816001600160a01b0319825416179055866040519160007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4868152a16140286001600160a01b036060840151166001600160801b038084511681602086015116011690309033906142f2565b6001600160801b036040820151168061412c575b506001600160a01b038251167f075861cbceafeb777e8f15f357121b08f6f3adba387d599bb7b5278ca6192df5610160866001600160a01b03602087015116946141236001600160a01b03606089015116976080810151151560a08201511515906140ed6001600160a01b0360e060c08601519501515116956040519788523360208901526040880190604090816001600160801b0391828151168552826020820151166020860152015116910152565b60a086015260c0850152805164ffffffffff90811660e08601526020820151811661010086015260409091015116610120840152565b610140820152a4565b614155906001600160a01b036060850151166001600160a01b0360e086015151169033906142f2565b3861403c565b60248560405190630da9b01360e01b82526004820152fd5b506000613f4d565b50801515613f47565b606460405162461bcd60e51b815260206004820152602060248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152fd5b6040517f210aec0e00000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b6040517f9fee269100000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b6040517f4c23297000000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b60046040517f6095d3bc000000000000000000000000000000000000000000000000000000008152fd5b6020823d6020116142de575b816142cb60209383613005565b810103126105b95750613b329051613b0f565b3d91506142be565b6040513d6000823e3d90fd5b9290604051927f23b872dd0000000000000000000000000000000000000000000000000000000060208501526001600160a01b03809216602485015216604483015260648201526064815260a081019181831067ffffffffffffffff8411176127035761436192604052614363565b565b6001600160a01b0316906143c360405161437c81612fe9565b6020938482527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564858301526000808587829751910182855af16143bd613487565b916144b7565b805191821591848315614448575b5050509050156143de5750565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b9193818094500103126109b1578201519081151582036105b95750803880846143d1565b1561447357565b606460405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152fd5b9192901561451857508151156144cb575090565b3b156144d45790565b606460405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b82519091501561452b5750805190602001fd5b6104fa9060405191829162461bcd60e51b8352602060048401526024830190612ec8565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361458157565b60046040517fa1c0d6e5000000000000000000000000000000000000000000000000000000008152fd5b916001600160a01b03604051927fa9059cbb000000000000000000000000000000000000000000000000000000006020850152166024830152604482015260448152608081019181831067ffffffffffffffff8411176127035761436192604052614363565b6130c69061461e81613a36565b90600052600b60205260026040600020015460801c9061370a565b91908110156146495760051b0190565b634e487b7160e01b600052603260045260246000fd5b9190916001600160801b038080941691160191821161372357565b60009080825260056020526001600160a01b0380604084205416928333149384156146bf575b505082156146ad57505090565b9091506146ba33926130c9565b161490565b60ff92945090604091815260086020528181203382526020522054169138806146a0565b9092916146ee613649565b936001600160801b03928381169182156147fa5767016345785d8a00008082116147c35780851161478c575061473885614729819386613900565b16946020890195865284613900565b16918461474f60408901948086528287511661465f565b161015614776576147688491826147719551169061370a565b9151169061370a565b168252565b634e487b7160e01b600052600160045260246000fd5b84604491604051917f4fea5c1a00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b60449250604051917f47152d6700000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050505050905060405161480d81612fcd565b6000815260006020820152600060408201529056fea164736f6c6343000815000a"; + hex"60a034620003e757601f196001600160401b03601f62004c523881900382810185168601919084831187841017620003ec57808792606094604052833981010312620003e75783516001600160a01b03928382169291839003620003e7576020918287015196858816809803620003e75760400151948516809503620003e7576200008962000402565b90601c82527f5361626c696572205632204c6f636b7570204c696e656172204e46540000000084830152620000bd62000402565b601181527029a0a116ab1916a627a1a5aaa816a624a760791b8582015230608052600080546001600160a01b031990811688178255600180548216909b178b5596817fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a38351858111620003d35760039485548c81811c91168015620003c8575b89821014620003b45790818684931162000361575b508890868311600114620002f8578492620002ec575b505060001982871b1c1916908b1b1784555b8151948511620002d8576004958654998b8b811c9b168015620002cd575b828c1014620002ba57848b1162000271575b869798999a50819487116001146200020a57505093620001fe575b505082871b92600019911b1c19161790555b600a541617600a5560095560405161482f9081620004238239608051816143320152f35b015191503880620001c8565b8883528183208c9890969594939116915b8282106200025757505085116200023c575b50505050811b019055620001da565b01519060f884600019921b161c19169055388080806200022d565b8484015187558c989096019593840193908101906200021b565b87835281832085880160051c81019b838910620002af575b860160051c019a8c905b8c8110620002a3575050620001ad565b848155018c9062000293565b909b508b9062000289565b634e487b7160e01b835260228852602483fd5b9a607f169a6200019b565b634e487b7160e01b81526041600452602490fd5b0151905038806200016b565b908c8e9416918886528a862092865b8c82821062000341575050841162000328575b505050811b0184556200017d565b015160001983891b60f8161c191690553880806200031a565b91929395968291958786015181550195019301908f959493929162000307565b9091508684528884208680850160051c8201928b8610620003aa575b918f91869594930160051c01915b8281106200039b57505062000155565b8681558594508f91016200038b565b925081926200037d565b634e487b7160e01b84526022600452602484fd5b90607f169062000140565b634e487b7160e01b82526041600452602482fd5b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620003ec5760405256fe608080604052600436101561001357600080fd5b600090813560e01c90816301ffc9a714612dd45750806306fdde0314612d12578063081812fc14612cf3578063095ea7b314612b645780631400ecec14612ac45780631c1cdd4c14612a5f5780631e99d56914612a4157806323b872dd14612a1757806339a73c03146129d657806340e58ee514612738578063425d30dd1461271957806342842e0e146126c957806342966c681461253f5780634857501f146124b55780634869e12d1461247a5780635fe3b567146124535780636352211e146124235780636d0cee75146123cd57806370a082311461232457806375829def14612291578063780a82c8146122415780637cad6cd1146121705780637de6b1db14611f905780638659c27014611c6f578063894e9a0d14611a1b5780638bad38dd1461199e5780638f69b993146119025780639067b677146118af57806395d89b41146117a257806396ce143114611683578063a22cb465146115b2578063a2ffb897146111c5578063a6202bf2146110c8578063a80fc07114611076578063ab167ccc14610f3d578063ad35efd414610edb578063b256456914610ebc578063b88d4fde14610e32578063b8a3be6614610dfd578063b971302a14610dae578063bc063e1a14610d8b578063bc2be1be14610d3b578063c156a11d146109c1578063c87b56dd14610887578063cc364f48146107d9578063d4dbd20b14610787578063d511609f1461073b578063d975dfed146106ef578063e985e9c51461069a578063ea5ead1914610674578063eac8f5b81461060b578063f590c176146105e2578063f851a440146105bc5763fdd46d601461027357600080fd5b346105b95760603660031901126105b95760043561028f612f03565b610297613043565b906102a0614328565b6102a9836136d3565b6105a1576102cd83600052600b6020526001600160a01b0360406000205416331490565b90811580610591575b61057257838552602092600584526001600160a01b0391826040882054169380610566575b61054057828116928315610516576001600160801b038084169384156104fe57610324896143ea565b82811686116104ca5750938093926103ca9261038f6103578d9a99988d8c52600b8d52600260408d20015460801c614438565b8c8b52600b8c5261038a600260408d20019182906001600160801b036001600160801b031983549260801b169116179055565b613668565b906103ab818c840151169282604081835116920151169061370a565b16111561049a575b898852600b89526001604089200154169283614384565b82877f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d88604051868152a48233141580610490575b610432575b837ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce78688604051908152a180f35b823b1561048c57608484928360405195869485936313375c3b60e01b85528b6004860152336024860152604485015260648401525af1610474575b8080610404565b61047d90612f7f565b61048857823861046d565b8280fd5b8380fd5b50823b15156103ff565b898852600b89526040882060018101600160c81b60ff60c81b1982541617905560ff60f01b1981541690556103b3565b60405163287ecaef60e21b8152600481018b90526001600160801b03928316602482015291166044820152606490fd5b0390fd5b6024896040519063d2aabcd960e01b82526004820152fd5b60046040517fc61a0e9e000000000000000000000000000000000000000000000000000000008152fd5b858360649260405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b508383821614156102fb565b60405163216caf0d60e01b815260048101859052336024820152604490fd5b5061059b84614453565b156102d6565b60248360405190634a5541ef60e01b82526004820152fd5b80fd5b50346105b957806003193601126105b9576001600160a01b036020915416604051908152f35b50346105b95760203660031901126105b9576020610601600435613739565b6040519015158152f35b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d5760016040836001600160a01b039360209552600b855220015416604051908152f35b6024906040519062b8e7e760e51b82526004820152fd5b50346105b95760403660031901126105b957600435610691612f03565b610297826143ea565b50346105b95760403660031901126105b9576106b4612eed565b60406106be612f03565b926001600160a01b0380931681526008602052209116600052602052602060ff604060002054166040519015158152f35b50346105b95760203660031901126105b95760ff6001604060043593848152600b60205220015460d01c161561065d5761072a6020916143ea565b6001600160801b0360405191168152f35b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d5760408260029260209452600b845220015460801c604051908152f35b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d5760036040836001600160801b039360209552600b855220015416604051908152f35b50346105b95760203660031901126105b9576004356107f6613649565b50808252600b60205260ff600160408420015460d01c161561065d578160409160609352600b60205220600181549164ffffffffff918291015460a01c16906040519261084284612fcd565b818160a01c16845260c81c166020830152604082015261088560405180926040908164ffffffffff91828151168552826020820151166020860152015116910152565bf35b50346105b9576020806003193601126109b1576004356108c56108c08260005260056020526001600160a01b0360406000205416151590565b613059565b826001600160a01b03600a5416916044604051809481937fe9dc637500000000000000000000000000000000000000000000000000000000835230600484015260248301525afa9283156109b5578093610934575b5050610930604051928284938452830190612ec8565b0390f35b909192503d8082843e6109478184613005565b82019183818403126109b15780519067ffffffffffffffff8211610488570182601f820112156109b15780519161097d83613027565b9361098b6040519586613005565b8385528584840101116105b95750906109a991848085019101612ea5565b90388061091a565b5080fd5b604051903d90823e3d90fd5b50346105b95760403660031901126105b9576004356109de612f03565b906109e7614328565b808352602091600b835260ff600160408620015460d01c1615610d2457818452600583526001600160a01b03806040862054169081330361057257610a2b846143ea565b906001600160801b0390818316918215938415610a52575b89610a4f8989896132ec565b80f35b610a5a614328565b610a63886136d3565b610d0c57610a8788600052600b6020526001600160a01b0360406000205416331490565b94851580610cfc575b610cdd57888b5260058a528360408c2054169580610cd3575b610caf57861561051657610c9757610ac0886143ea565b8281168511610c67575090610b20610aed8b969594938a8852600b8c52600260408920015460801c614438565b898752600b8b5261038a600260408920019182906001600160801b036001600160801b031983549260801b169116179055565b90610b3c818b840151169282604081835116920151169061370a565b161115610c37575b868452600b8852600160408520015416610b5f828683614384565b84877f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d8a604051868152a48133141580610c2d575b610bd2575b5050507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7610a4f94604051858152a13880808080610a43565b813b156104885782916084839260405194859384926313375c3b60e01b84528b600485015233602485015289604485015260648401525af1610c15575b80610b99565b610c1e90612f7f565b610c29578438610c0f565b8480fd5b50813b1515610b94565b868452600b88526040842060018101600160c81b60ff60c81b1982541617905560ff60f01b198154169055610b44565b60405163287ecaef60e21b8152600481018a90526001600160801b03928316602482015291166044820152606490fd5b6024886040519063d2aabcd960e01b82526004820152fd5b6064898860405191632dcbf6b960e11b835260048301523360248301526044820152fd5b5085871415610aa9565b60405163216caf0d60e01b8152600481018a9052336024820152604490fd5b50610d0689614453565b15610a90565b60248860405190634a5541ef60e01b82526004820152fd5b6024826040519062b8e7e760e51b82526004820152fd5b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d5760408264ffffffffff9260209452600b8452205460a01c16604051908152f35b50346105b957806003193601126105b957602060405167016345785d8a00008152f35b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d576040826001600160a01b039260209452600b8452205416604051908152f35b50346105b95760203660031901126105b95760ff600160406020936004358152600b855220015460d01c166040519015158152f35b50346105b95760803660031901126105b957610e4c612eed565b610e54612f03565b906064359067ffffffffffffffff821161048c573660238301121561048c5781600401359284610e8385613027565b93610e916040519586613005565b85855236602487830101116109b15785610a4f96602460209301838801378501015260443591613177565b50346105b95760203660031901126105b957602061060160043561369c565b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d57610f1490613820565b604051906005811015610f2957602092508152f35b602483634e487b7160e01b81526021600452fd5b50346105b9576101403660031901126105b957610f58614328565b610f60613649565b9064ffffffffff80421680845260c43582811681036110715781018216602085015260e4359081831682036110715701166040830152606435916001600160a01b03918284168094036105b957506084358015158091036110715760a435908115158092036110715760243594848616809603611071576004359585871680970361107157604435906001600160801b038216809203611071576040519761100789612fb0565b8852602088015260408701526060860152608085015260a084015260c0830152604061010319360112611071576040519161104183612fe9565b61010435918216820361107157826110699260209452610124358482015260e0820152613922565b604051908152f35b600080fd5b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d5760026040836001600160801b039360209552600b855220015416604051908152f35b50346105b95760203660031901126105b9576110e2612eed565b6001600160a01b038083541633810361119c575081169081835260026020526001600160801b0360408420541690811561116b578161113c918486526002602052604086206001600160801b031981541690553390614384565b6040519081527fca7a4a65a94ed2f37538814e00e1cd4c41a78261561e3f3794592f11409cf5af60203392a380f35b602483604051907f8410168c0000000000000000000000000000000000000000000000000000000082526004820152fd5b6040516331b339a960e21b81526001600160a01b03919091166004820152336024820152604490fd5b50346105b95760603660031901126105b95767ffffffffffffffff600435818111610488576111f8903690600401612f4e565b90611201612f03565b92604435908111610c295761121a903690600401612f4e565b611225949194614328565b80840361157b5791926001600160a01b038216159290865b818110611248578780f35b611253818388614412565b359061126081858a614412565b356001600160801b038116810361107157611279614328565b611282836136d3565b6105a1576112a683600052600b6020526001600160a01b0360406000205416331490565b80158061156b575b61057257838b5260056020526001600160a01b0360408c2054169080611558575b61152b5787610516576001600160801b03821615611513576112f0846143ea565b6001600160801b0381166001600160801b038416116114e15750908a91848352600b80602052611360600261038a611331868360408a20015460801c614438565b918988528460205260408820019182906001600160801b036001600160801b031983549260801b169116179055565b6001600160801b03611384816020840151169282604081835116920151169061370a565b1611156114b1575b8584526020526001600160a01b036001604085200154166113b76001600160801b0384168a83614384565b6040516001600160801b0384168152867f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d60206001600160a01b038d1693a480331415806114a7575b61143b575b5050507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce76020600193604051908152a10161123d565b803b15610488576001600160a01b036084898580946001600160801b0360405197889687956313375c3b60e01b87528d60048801523360248801521660448601521660648401525af161148f575b80611405565b61149890612f7f565b6114a3578838611489565b8880fd5b50803b1515611400565b858452806020526040842060018101600160c81b60ff60c81b1982541617905560ff60f01b19815416905561138c565b60405163287ecaef60e21b8152600481018690526001600160801b038481166024830152919091166044820152606490fd5b6024846040519063d2aabcd960e01b82526004820152fd5b6064846001600160a01b038960405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b50806001600160a01b03881614156112cf565b5061157584614453565b156112ae565b83604491604051917faec9344000000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b50346105b95760403660031901126105b9576115cc612eed565b60243590811515809203611071576001600160a01b03169081331461163f5733835260086020526040832082600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a380f35b606460405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152fd5b50346105b9576101603660031901126105b95761169e614328565b604051906116ab82612fb0565b6116b3612eed565b82526116bd612f03565b60208301526116ca613043565b60408301526001600160a01b03906064358281168103611071576060840152608435801515810361107157608084015260a43580151581036110715760a084015260603660c31901126105b9575060405161172481612fcd565b64ffffffffff60c435818116810361107157825260e435818116810361107157602083015261010435908116810361107157604082015260c0830152604061012319360112611071576040519161177a83612fe9565b61012435918216820361107157826110699260209452610144358482015260e0820152613922565b50346105b957806003193601126105b957604051908060045491600183811c928185169485156118a5575b60209586861081146118915785885287949392918790821561186f575050600114611815575b505061180192500383613005565b610930604051928284938452830190612ec8565b90859250600482527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5b858310611857575050611801935082010138806117f3565b8054838901850152879450869390920191810161183f565b925093505061180194915060ff191682840152151560051b82010138806117f3565b602483634e487b7160e01b81526022600452fd5b93607f16936117cd565b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d57600160408364ffffffffff9360209552600b855220015460a01c16604051908152f35b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d5761193b90613820565b906005821015908161197c5760028314918215611990575b8215611967575b6020836040519015158152f35b90915061197c5750600460209114388061195a565b80634e487b7160e01b602492526021600452fd5b506003831491506000611953565b50346105b95760203660031901126105b9576004356001600160a01b0390818116809103610488578183541633810361119c575060015491816001600160a01b03198416176001556040519216825260208201527fdcb09aef4bf01068924ccce937981cbe59d25ba08380cf941aaaea4e4bd3960d60403392a280f35b50346105b95760203660031901126105b957604051611a3981612f93565b8181528160208201528160408201528160608201528160808201528160a08201528160c08201528160e08201528161010082015281610120820152610140611a7f613649565b9101526004358152600b60205260ff600160408320015460d01c1615611c57576004358152600b60205260408120611b58600260405192611abf84612f93565b80546001600160a01b038116855264ffffffffff8160a01c16602086015264ffffffffff8160c81c16604086015260ff8160f01c161515606086015260f81c1515608085015260ff60018201546001600160a01b03811660a087015264ffffffffff8160a01c1660c0870152818160c81c16151560e0870152818160d01c16151561010087015260d81c16151561012085015201613668565b610140820152611b69600435613820565b6005811015610f29579160026101a09314611c4c575b50610885610140604051926001600160a01b03815116845264ffffffffff602082015116602085015264ffffffffff60408201511660408501526060810151151560608501526080810151151560808501526001600160a01b0360a08201511660a085015264ffffffffff60c08201511660c085015260e0810151151560e0850152610100810151151561010085015261012081015115156101208501520151610140830190604090816001600160801b0391828151168552826020820151166020860152015116910152565b606082015238611b7f565b602460405162b8e7e760e51b81526004356004820152fd5b50346105b957602090816003193601126105b95760043567ffffffffffffffff81116109b157611ca483913690600401612f4e565b9190611cae614328565b83925b808410611cbc578480f35b611ccb84828497959697614412565b3594611cd5614328565b611cde866136d3565b15611cfb5760248660405190634a5541ef60e01b82526004820152fd5b611d0486613739565b611f7857611d2886600052600b6020526001600160a01b0360406000205416331490565b15611f5957611d368661376a565b95808552600b90818752611d4f60026040882001613668565b906001600160801b039283835116848b161015611f415781885280895260ff604089205460f01c1615611f2957611d9f8a858b611d9560409a9b9c9d9e8389511661370a565b960151169061370a565b92828a52818b52868a20908b8b7f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa50845497600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8a1617865560038a8216968715611f0f575b01998516998a6001600160801b03198254161790556001600160a01b0380991698899360058652818e822054169889965260019d8e912001541694611e4c8b8588614384565b604080518a81526001600160801b0392831660208201529290911690820152606090a47ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce78b604051858152a1813b611eb0575b505050505001919093919293611cb1565b813b15611f0b57899493919285809460849360405197889687956372eba20360e01b875260048701526024860152604485015260648401525af1611ef7575b808080611e9f565b611f0090612f7f565b610c29578487611eef565b8980fd5b60018101600160c81b60ff60c81b19825416179055611e06565b602482604051906339c6dc7360e21b82526004820152fd5b602482604051906322cad1af60e11b82526004820152fd5b60405163216caf0d60e01b815260048101879052336024820152604490fd5b6024866040519063fe19f19f60e01b82526004820152fd5b50346105b9576020806003193601126109b15760043590611faf614328565b818352600b815260ff600160408520015460d01c1615610d2457611fd282613820565b600581101561215c5760048103611ffb5760248360405190634a5541ef60e01b82526004820152fd5b6003810361201b576024836040519063fe19f19f60e01b82526004820152fd5b600214611f415761204282600052600b6020526001600160a01b0360406000205416331490565b1561213d57818352600b815260ff604084205460f01c1615611f2957818352600b81526040832060ff60f01b19815416905582604051837f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f8380a2600583526001600160a01b03604083205416803b6120e5575b5050507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce791604051908152a180f35b803b1561048857816024818580947f341a0bd90000000000000000000000000000000000000000000000000000000083528960048401525af1612129575b806120b6565b61213290612f7f565b610488578238612123565b60405163216caf0d60e01b815260048101839052336024820152604490fd5b602484634e487b7160e01b81526021600452fd5b50346105b95760203660031901126105b9576004356001600160a01b0390818116809103610488578183541633810361119c5750600a5491816001600160a01b0319841617600a556040519216825260208201527fa2548bd4b805e907c1558a47b5858324fe8bb4a2e1ddfca647eecbf65610eebc60403392a2600954600019810190811161222d5760407f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c91815190600182526020820152a180f35b602482634e487b7160e01b81526011600452fd5b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d5760408264ffffffffff9260209452600b8452205460c81c16604051908152f35b50346105b95760203660031901126105b9576122ab612eed565b9080546001600160a01b03808216933385036122fd576001600160a01b03199394501691829116178255337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808380a380f35b6040516331b339a960e21b81526001600160a01b0386166004820152336024820152604490fd5b50346105b95760203660031901126105b9576001600160a01b03612346612eed565b168015612363578160409160209352600683522054604051908152f35b608460405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e657200000000000000000000000000000000000000000000006064820152fd5b50346105b95760203660031901126105b9576001600160a01b0360406020926004356124126108c08260005260056020526001600160a01b0360406000205416151590565b815260058452205416604051908152f35b50346105b95760203660031901126105b95760206124426004356130a4565b6001600160a01b0360405191168152f35b50346105b957806003193601126105b95760206001600160a01b0360015416604051908152f35b50346105b95760203660031901126105b95760ff6001604060043593848152600b60205220015460d01c161561065d5761072a6020916138a7565b50346105b95760203660031901126105b95760043590818152600b60205260ff600160408320015460d01c1615610d2457806124f083613820565b92600584101561252b57600260209403612511575b50506040519015158152f35b8152600b8352604090205460f01c60ff1690503880612505565b602482634e487b7160e01b81526021600452fd5b50346105b95760203660031901126105b95760043561255c614328565b612565816136d3565b156126985761257381614453565b1561267857612581816130a4565b61258a8261369c565b159081612670575b8161265d575b50612645576020816125ca7ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7936130a4565b90808552600783526001600160a01b0360408620926001600160a01b03199384815416905516918286526006845260408620600019815401905581865260058452604086209081541690558085604051937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a48152a180f35b60249060405190630da9b01360e01b82526004820152fd5b6001600160a01b03915016151538612598565b839150612592565b60405163216caf0d60e01b81526004810191909152336024820152604490fd5b602490604051907f817cd6390000000000000000000000000000000000000000000000000000000082526004820152fd5b50346105b9576126d836612f19565b60405191602083019383851067ffffffffffffffff86111761270357610a4f94604052858452613177565b634e487b7160e01b600052604160045260246000fd5b50346105b95760203660031901126105b95760206106016004356136d3565b50346105b9576020806003193601126109b15760043590612757614328565b612760826136d3565b1561277d5760248260405190634a5541ef60e01b82526004820152fd5b9061278781613739565b6129be576127ab81600052600b6020526001600160a01b0360406000205416331490565b15612678576127b98161376a565b818452600b83526127cf60026040862001613668565b926001600160801b03918285511683821610156129a657838652600b825260ff604087205460f01c161561298e5792827ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce783612844878460409761283a8d9b6128ef9b8e511661370a565b9b0151169061370a565b92848852600b825287868120947f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa50865491600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84161788556003858216988915612974575b01948d169c858e6001600160801b0319819854161790556001600160a01b038094169b8c94600589526001818e892054169d8e98600b8c5220015416968588614384565b604080518b81526001600160801b0392831660208201529290911690820152606090a4604051848152a1823b612923578480f35b823b15610c2957608492859160405197889687956372eba20360e01b875260048701526024860152604485015260648401525af1612965575b81818080808480f35b61296e90612f7f565b3861295c565b60018101600160c81b60ff60c81b198254161790556128ab565b602484604051906339c6dc7360e21b82526004820152fd5b602484604051906322cad1af60e11b82526004820152fd5b6024906040519063fe19f19f60e01b82526004820152fd5b50346105b95760203660031901126105b9576001600160801b0360406020926001600160a01b03612a05612eed565b16815260028452205416604051908152f35b50346105b957610a4f612a2936612f19565b91612a3c612a37843361320d565b613106565b6132ec565b50346105b957806003193601126105b9576020600954604051908152f35b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d57612a9890613820565b90600582101561197c5760208215838115612ab9575b506040519015158152f35b600191501482612aae565b50346105b95760203660031901126105b95760043590818152600b60205260ff600160408320015460d01c1615610d2457602091604082828152600b85522060ff815460f01c1680612b52575b612b29575b50506001600160801b0360405191168152f35b612b4b92506001600160801b036002612b45920154169161376a565b9061370a565b3880612b16565b5060ff600182015460c81c1615612b11565b50346105b95760403660031901126105b957612b7e612eed565b602435906001600160a01b038080612b95856130a4565b16921691808314612c8957803314908115612c68575b5015612bfe57828452600760205260408420826001600160a01b0319825416179055612bd6836130a4565b167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258480a480f35b608460405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152fd5b9050845260086020526040842033855260205260ff60408520541638612bab565b608460405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152fd5b50346105b95760203660031901126105b95760206124426004356130c9565b50346105b957806003193601126105b957604051908060035491600183811c92818516948515612dca575b60209586861081146118915785885287949392918790821561186f575050600114612d7057505061180192500383613005565b90859250600382527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b858310612db2575050611801935082010138806117f3565b80548389018501528794508693909201918101612d9a565b93607f1693612d3d565b9050346109b15760203660031901126109b1576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361048857602092507f80ac58cd000000000000000000000000000000000000000000000000000000008114908115612e7b575b8115612e51575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501438612e4a565b7f5b5e139f0000000000000000000000000000000000000000000000000000000081149150612e43565b60005b838110612eb85750506000910152565b8181015183820152602001612ea8565b90602091612ee181518092818552858086019101612ea5565b601f01601f1916010190565b600435906001600160a01b038216820361107157565b602435906001600160a01b038216820361107157565b6060906003190112611071576001600160a01b0390600435828116810361107157916024359081168103611071579060443590565b9181601f840112156110715782359167ffffffffffffffff8311611071576020808501948460051b01011161107157565b67ffffffffffffffff811161270357604052565b610160810190811067ffffffffffffffff82111761270357604052565b610100810190811067ffffffffffffffff82111761270357604052565b6060810190811067ffffffffffffffff82111761270357604052565b6040810190811067ffffffffffffffff82111761270357604052565b90601f8019910116810190811067ffffffffffffffff82111761270357604052565b67ffffffffffffffff811161270357601f01601f191660200190565b604435906001600160801b038216820361107157565b1561306057565b606460405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152fd5b60005260056020526001600160a01b03604060002054166130c6811515613059565b90565b6130ec6108c08260005260056020526001600160a01b0360406000205416151590565b60005260076020526001600160a01b036040600020541690565b1561310d57565b608460405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f766564000000000000000000000000000000000000006064820152fd5b9061319b93929161318b612a37843361320d565b6131968383836132ec565b6134b7565b156131a257565b60405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b906001600160a01b038080613221846130a4565b16931691838314938415613254575b50831561323e575b50505090565b61324a919293506130c9565b1614388080613238565b909350600052600860205260406000208260005260205260ff604060002054169238613230565b1561328257565b608460405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152fd5b9061331592916132fb836130a4565b916001600160a01b0394859384809416968791161461327b565b169081158061341e576133278461369c565b159081613415575b508061340c575b6133f457918084926133767ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce79660209661336f856130a4565b161461327b565b60009382855260078652604085206001600160a01b031990818154169055818652600687526040862060001981540190558286526040862060018154019055838652600587528260408720918254161790557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6040519580a48152a1565b60248360405190630da9b01360e01b82526004820152fd5b50831515613336565b9050153861332f565b608460405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152fd5b3d156134b2573d9061349882613027565b916134a66040519384613005565b82523d6000602084013e565b606090565b9290803b1561364057613521916020916001600160a01b0394604051809581948293897f150b7a02000000000000000000000000000000000000000000000000000000009b8c86523360048701521660248501526044840152608060648401526084830190612ec8565b03916000968791165af1908290826135e0575b50506135ba57613542613487565b805190816135b55760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000161490565b909192506020813d8211613638575b816135fc60209383613005565b810103126109b15751907fffffffff00000000000000000000000000000000000000000000000000000000821682036105b95750903880613534565b3d91506135ef565b50505050600190565b6040519061365682612fcd565b60006040838281528260208201520152565b9060405161367581612fcd565b6040819360018154916001600160801b0392838116865260801c6020860152015416910152565b80600052600b60205260ff60016040600020015460d01c161561065d57600052600b60205260ff60016040600020015460d81c1690565b80600052600b60205260ff60016040600020015460d01c161561065d57600052600b60205260ff60016040600020015460c81c1690565b6001600160801b03918216908216039190821161372357565b634e487b7160e01b600052601160045260246000fd5b80600052600b60205260ff60016040600020015460d01c161561065d57600052600b60205260406000205460f81c90565b600090808252600b6020526040822091825464ffffffffff42818360c81c16116138185780600186015460a01c169182421015613802576137b79394955060a01c16809103904203614693565b90828152600b6020526001600160801b03926137dd846002604085200154168094614773565b9283116137ea5750501690565b60029350604092508152600b60205220015460801c90565b505050505060026001600160801b039101541690565b505091505090565b80600052600b602052604060002060ff600182015460c81c16600014613847575050600490565b805460f81c6138a0575460a01c64ffffffffff16421061389a5761386a8161376a565b90600052600b6020526001600160801b03806002604060002001541691161060001461389557600190565b600290565b50600090565b5050600390565b80600052600b6020526138c06002604060002001613668565b81600052600b602052604060002060ff600182015460c81c166000146138f357506001600160801b039150602001511690565b5460f81c61390557506130c69061376a565b6130c691506001600160801b03604081835116920151169061370a565b906001600160a01b036001541660206001600160a01b036060850151166024604051809481937fdcf844a700000000000000000000000000000000000000000000000000000000835260048301525afa801561415757600090614123575b6139a391506001600160801b0360408501511690602060e08601510151916144bc565b916001600160801b0383511660c082015190156140f95764ffffffffff815116602082019064ffffffffff825116908181116140b957505064ffffffffff604091511691019064ffffffffff825116908181101561407957505064ffffffffff8042169151169081811015614039575050600954926001600160801b0381511660405190613a3082612fcd565b815260006020820152600060408201526001600160a01b036060840151169060c08401519164ffffffffff6020840151169064ffffffffff604085015116906080870151151560a088015115159364ffffffffff6001600160a01b038a511697511660405197613a9f89612f93565b88526020880152604087015260608601526000608086015260a085015260c0840152600060e0840152600161010084015261012083015261014082015284600052600b60205260406000206001600160a01b038251166001600160a01b0319825416178155613b3664ffffffffff602084015116829064ffffffffff60a01b1964ffffffffff60a01b83549260a01b169116179055565b604082015181547eff0000000000000000000000000000000000000000000000000000000000006060850151151560f01b169078ffffffffffffffffffffffffffffffffffffffffffffffffff7dffffffffff000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000006080880151151560f81b169460c81b1691161717178155600181016001600160a01b0360a0840151166001600160a01b0319825416178155613c2d64ffffffffff60c085015116829064ffffffffff60a01b1964ffffffffff60a01b83549260a01b169116179055565b60e083015181546101008501516101208601517fffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff90921692151560c81b79ff00000000000000000000000000000000000000000000000000169290921791151560d01b7aff0000000000000000000000000000000000000000000000000000169190911790151560d81b7bff00000000000000000000000000000000000000000000000000000016179055610140909101518051602082015160801b6001600160801b03199081166001600160801b03928316176002850155926040906003019201511682825416179055600185016009556001600160a01b0360608401511660005260026020526001600160801b0380604060002054168160208501511601166001600160a01b036060850151166000526040600020918254161790556001600160a01b036020830151168015613ff557613da8613da28660005260056020526001600160a01b0360406000205416151590565b156142dd565b613db18561369c565b1580613fec575b80613fe4575b613fcc5760207ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce791613e09613da28860005260056020526001600160a01b0360406000205416151590565b806000526006825260406000206001815401905586600052600582526040600020816001600160a01b0319825416179055866040519160007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4868152a1613e996001600160a01b036060840151166001600160801b03808451168160208601511601169030903390614163565b6001600160801b0360408201511680613f9d575b506001600160a01b038251167f075861cbceafeb777e8f15f357121b08f6f3adba387d599bb7b5278ca6192df5610160866001600160a01b0360208701511694613f946001600160a01b03606089015116976080810151151560a0820151151590613f5e6001600160a01b0360e060c08601519501515116956040519788523360208901526040880190604090816001600160801b0391828151168552826020820151166020860152015116910152565b60a086015260c0850152805164ffffffffff90811660e08601526020820151811661010086015260409091015116610120840152565b610140820152a4565b613fc6906001600160a01b036060850151166001600160a01b0360e08601515116903390614163565b38613ead565b60248560405190630da9b01360e01b82526004820152fd5b506000613dbe565b50801515613db8565b606460405162461bcd60e51b815260206004820152602060248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152fd5b6040517f210aec0e00000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b6040517f9fee269100000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b6040517f4c23297000000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b60046040517f6095d3bc000000000000000000000000000000000000000000000000000000008152fd5b6020823d60201161414f575b8161413c60209383613005565b810103126105b957506139a39051613980565b3d915061412f565b6040513d6000823e3d90fd5b9290604051927f23b872dd0000000000000000000000000000000000000000000000000000000060208501526001600160a01b03809216602485015216604483015260648201526064815260a081019181831067ffffffffffffffff841117612703576141d2926040526141d4565b565b6001600160a01b0316906142346040516141ed81612fe9565b6020938482527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564858301526000808587829751910182855af161422e613487565b916145fb565b8051918215918483156142b9575b50505090501561424f5750565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b9193818094500103126109b1578201519081151582036105b9575080388084614242565b156142e457565b606460405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152fd5b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361435a57565b60046040517fa1c0d6e5000000000000000000000000000000000000000000000000000000008152fd5b916001600160a01b03604051927fa9059cbb000000000000000000000000000000000000000000000000000000006020850152166024830152604482015260448152608081019181831067ffffffffffffffff841117612703576141d2926040526141d4565b6130c6906143f7816138a7565b90600052600b60205260026040600020015460801c9061370a565b91908110156144225760051b0190565b634e487b7160e01b600052603260045260246000fd5b9190916001600160801b038080941691160191821161372357565b60009080825260056020526001600160a01b038060408420541692833314938415614498575b5050821561448657505090565b90915061449333926130c9565b161490565b60ff9294509060409181526008602052818120338252602052205416913880614479565b9092916144c7613649565b936001600160801b03928381169182156145d35767016345785d8a000080821161459c57808511614565575061451185614502819386614773565b16946020890195865284614773565b169184614528604089019480865282875116614438565b16101561454f5761454184918261454a9551169061370a565b9151169061370a565b168252565b634e487b7160e01b600052600160045260246000fd5b84604491604051917f4fea5c1a00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b60449250604051917f47152d6700000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b505050505090506040516145e681612fcd565b60008152600060208201526000604082015290565b9192901561465c575081511561460f575090565b3b156146185790565b606460405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b82519091501561466f5750805190602001fd5b6104fa9060405191829162461bcd60e51b8352602060048401526024830190612ec8565b670de0b6b3a764000091600019838309928083029283808610950394808603951461474f578285101561471357908291096001821901821680920460028082600302188083028203028083028203028083028203028083028203028083028203028092029003029360018380600003040190848311900302920304170290565b82606492604051927f63a05778000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b50508092501561475d570490565b634e487b7160e01b600052601260045260246000fd5b9091906000198382098382029182808310920391808303921461481157670de0b6b3a764000090818310156147da57947faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066994950990828211900360ee1b910360121c170290565b60449086604051917f5173648d00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050670de0b6b3a76400009004915056fea164736f6c6343000815000a"; bytes public constant BYTECODE_NFT_DESCRIPTOR = hex"6080806040523461001757615dac90816200001d8239f35b600080fdfe6080604052600436101561001257600080fd5b60003560e01c63e9dc63751461002757600080fd5b346142f85760403660031901126142f8576001600160a01b0360043516600435036142f857610056608061486e565b60006080819052606060a081905260c082905260e0819052610120819052610140819052610160819052610180919091526101a0526004356001600160a01b03166101008190526100a690614c58565b61012052610100516040517feac8f5b80000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa908115614305576000916147dd575b506001600160a01b03610117911680608052615669565b60a052610100516040517fa80fc0710000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa8015614305576fffffffffffffffffffffffffffffffff916000916147be575b501660c052610100516040517fad35efd40000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa801561430557600090614781575b6101e59150615889565b61014052610100516040517f4869e12d0000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa90811561430557600091614752575b5060c0516fffffffffffffffffffffffffffffffff16801561473c576fffffffffffffffffffffffffffffffff612710819302160416610100608001526102876004356153c7565b610120608001526040514660208201526bffffffffffffffffffffffff1960043560601b16604082015260243560548201526054815280608081011067ffffffffffffffff60808301111761431157608081016040526020815191012061041a602963ffffffff61032e6103078261016861ffff8860101c160616614b08565b91601e604660ff6103248460146050848d60081c16060116614b08565b9816060116614b08565b6040519485927f68736c2800000000000000000000000000000000000000000000000000000000602085015261036e815180926020602488019101614826565b83017f2c0000000000000000000000000000000000000000000000000000000000000060248201526103aa825180936020602585019101614826565b017f252c00000000000000000000000000000000000000000000000000000000000060258201526103e5825180936020602785019101614826565b017f252900000000000000000000000000000000000000000000000000000000000060278201520360098101845201826148df565b6104526fffffffffffffffffffffffffffffffff6040608001511660ff61044b6001600160a01b03608051166155dc565b1690614e89565b6104666001600160a01b0360805116614c58565b60a051610100516040517fbc2be1be0000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa80156143055760249160009161471d575b5060206001600160a01b03608080015116604051938480927f9067b677000000000000000000000000000000000000000000000000000000008252823560048301525afa801561430557610528926000916146ee575b5064ffffffffff80911691166151d5565b61012051610180519092916105b2602161054f6064610548818706615744565b9504614b08565b6040519481610568879351809260208087019101614826565b820161057d8251809360208085019101614826565b017f250000000000000000000000000000000000000000000000000000000000000060208201520360018101855201836148df565b610100608001519260c060800151956101206080015197604051996105d68b61486e565b8a5260208a015260408901526060880152608087015260a086015260c085015260e0840152610100830152610120820152604051806101c081011067ffffffffffffffff6101c083011117614311576101c0810160405260608152600060208201526000604082015260608082015260006080820152606060a0820152600060c0820152600060e08201526060610100820152600061012082015260006101408201526060610160820152600061018082015260006101a082015260a08201516106a660c0840151845190615a7a565b906109b361015c604051926106ba846148c3565b600884527f50726f677265737300000000000000000000000000000000000000000000000060208501526107236040516106f38161488b565b60009052855160208701207fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4701490565b156146e6576090945b61073586614b08565b916040519586938493661e339034b21e9160c91b60208601526109818351958692610767846027840160208901614826565b6d11103334b6361e9111b33333111f60911b602785840101526c1e3932b1ba103bb4b23a341e9160991b603585840101526107ae8551809660206042888701019101614826565b7f22206865696768743d22313030222066696c6c2d6f7061636974793d222e3033828501860160428101919091527f222072783d223135222072793d22313522207374726f6b653d2223666666222060628201527f7374726f6b652d6f7061636974793d222e3122207374726f6b652d77696474686082820152651e911a11179f60d11b60a28201527f3c7465787420783d2232302220793d2233342220666f6e742d66616d696c793d60a88201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f7370616365222060c8820152703337b73a16b9b4bd329e911919383c111f60791b60e88201528651966108b491889160f990910190602001614826565b661e17ba32bc3a1f60c91b8285018601870160f98101919091527f3c7465787420783d2232302220793d2237322220666f6e742d66616d696c793d6101008201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f73706163652220610120820152703337b73a16b9b4bd329e91191b383c111f60791b61014082015287519761094f91899161015190910190602001614826565b661e17ba32bc3a1f60c91b6101518888888887010101010152602061015888888885519c8d9701010101019101614826565b631e17b39f60e11b90860190910190910190910190910161015881019190915281900361013c810190915201826148df565b6101008301526101208201526028610100830151604051906109d48261488b565b60008252610c7a61015c604051926109eb846148c3565b600684527f53746174757300000000000000000000000000000000000000000000000000006020850152610a1e84615cba565b610a2782615d37565b808211156146de5750945b610a3d878701614b08565b91604051958693661e339034b21e9160c91b60208601528151610a67816027880160208601614826565b85016d11103334b6361e9111b33333111f60911b60278201526c1e3932b1ba103bb4b23a341e9160991b6035820152610aaa825180936020604285019101614826565b017f22206865696768743d22313030222066696c6c2d6f7061636974793d222e303360428201527f222072783d223135222072793d22313522207374726f6b653d2223666666222060628201527f7374726f6b652d6f7061636974793d222e3122207374726f6b652d77696474686082820152651e911a11179f60d11b60a28201527f3c7465787420783d2232302220793d2233342220666f6e742d66616d696c793d60a88201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f7370616365222060c8820152703337b73a16b9b4bd329e911919383c111f60791b60e8820152610ba682518093602060f985019101614826565b01661e17ba32bc3a1f60c91b60f98201527f3c7465787420783d2232302220793d2237322220666f6e742d66616d696c793d6101008201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f73706163652220610120820152703337b73a16b9b4bd329e91191b383c111f60791b610140820152610c3582518093602061015185019101614826565b01661e17ba32bc3a1f60c91b610151820152610c5c82518093602061015885019101614826565b01631e17b39f60e11b6101588201520361013c8101845201826148df565b610160840152016101808201526028602083015160405190610c9b8261488b565b60008252610ce561015c60405192610cb2846148c3565b600684527f416d6f756e7400000000000000000000000000000000000000000000000000006020850152610a1e84615cba565b835201602082015261102060808301516030604051610d038161488b565b60008152610faa61015c60405194610d1a866148c3565b600886527f4475726174696f6e0000000000000000000000000000000000000000000000006020870152610d4d86615cba565b610d5682615d37565b808211156146d65750935b610d6d60288601614b08565b91604051978893661e339034b21e9160c91b60208601528151610d97816027880160208601614826565b85016d11103334b6361e9111b33333111f60911b60278201526c1e3932b1ba103bb4b23a341e9160991b6035820152610dda825180936020604285019101614826565b017f22206865696768743d22313030222066696c6c2d6f7061636974793d222e303360428201527f222072783d223135222072793d22313522207374726f6b653d2223666666222060628201527f7374726f6b652d6f7061636974793d222e3122207374726f6b652d77696474686082820152651e911a11179f60d11b60a28201527f3c7465787420783d2232302220793d2233342220666f6e742d66616d696c793d60a88201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f7370616365222060c8820152703337b73a16b9b4bd329e911919383c111f60791b60e8820152610ed682518093602060f985019101614826565b01661e17ba32bc3a1f60c91b60f98201527f3c7465787420783d2232302220793d2237322220666f6e742d66616d696c793d6101008201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f73706163652220610120820152703337b73a16b9b4bd329e91191b383c111f60791b610140820152610f6582518093602061015185019101614826565b01661e17ba32bc3a1f60c91b610151820152610f8c82518093602061015885019101614826565b01631e17b39f60e11b6101588201520361013c8101865201846148df565b8260a08601526028810160c0860152602085015190610120860151809161018088015192839185010101605881016080890152605719906103e8030160011c8061014089015201601081016101a088015201602081016040870152010160e0840152610100830151610160840151845191614e1f565b6060820152604051908161010081011067ffffffffffffffff6101008401111761431157610100820160405260c782527f3c726563742077696474683d223130302522206865696768743d22313030252260208301527f2066696c7465723d2275726c28234e6f69736529222f3e3c7265637420783d2260408301527f37302220793d223730222077696474683d2238363022206865696768743d223860608301527f3630222066696c6c3d2223666666222066696c6c2d6f7061636974793d222e3060808301527f33222072783d223435222072793d22343522207374726f6b653d22236666662260a08301527f207374726f6b652d6f7061636974793d222e3122207374726f6b652d7769647460c08301527f683d2234222f3e0000000000000000000000000000000000000000000000000060e083015282519161010084015191606081015194604051611176816148a7565b603381527f3c636972636c652069643d22476c6f772220723d22353030222066696c6c3d2260208201527f75726c282352616469616c476c6f7729222f3e000000000000000000000000006040820152604051966111d38861486e565b61011c88527f3c66696c7465722069643d224e6f697365223e3c6665466c6f6f6420783d223060208901527f2220793d2230222077696474683d223130302522206865696768743d2231303060408901527f252220666c6f6f642d636f6c6f723d2268736c283233302c3231252c3131252960608901527f2220666c6f6f642d6f7061636974793d22312220726573756c743d22666c6f6f60808901527f6446696c6c222f3e3c666554757262756c656e6365206261736546726571756560a08901527f6e63793d222e3422206e756d4f6374617665733d22332220726573756c743d2260c08901527f4e6f6973652220747970653d226672616374616c4e6f697365222f3e3c66654260e08901527f6c656e6420696e3d224e6f6973652220696e323d22666c6f6f6446696c6c22206101008901527f6d6f64653d22736f66742d6c69676874222f3e3c2f66696c7465723e0000000061012089015260405197886103a081011067ffffffffffffffff6103a08b011117614311576103a0890160405261037b89527f3c706174682069643d224c6f676f222066696c6c3d2223666666222066696c6c60208a01527f2d6f7061636974793d222e312220643d226d3133332e3535392c3132342e303360408a01527f34632d2e3031332c322e3431322d312e3035392c342e3834382d322e3932332c60608a01527f362e3430322d322e3535382c312e3831392d352e3136382c332e3433392d372e60808a01527f3838382c342e3939362d31342e34342c382e3236322d33312e3034372c31322e60a08a01527f3536352d34372e3637342c31322e3536392d382e3835382e3033362d31372e3860c08a01527f33382d312e3237322d32362e3332382d332e3636332d392e3830362d322e373660e08a01527f362d31392e3038372d372e3131332d32372e3536322d31322e3737382d31332e6101008a01527f3834322d382e3032352c392e3436382d32382e3630362c31362e3135332d33356101208a01527f2e323635683063322e3033352d312e3833382c342e3235322d332e3534362c366101408a01527f2e3436332d352e323234683063362e3432392d352e3635352c31362e3231382d6101608a01527f322e3833352c32302e3335382c342e31372c342e3134332c352e3035372c382e6101808a01527f3831362c392e3634392c31332e39322c31332e373334682e30333763352e37336101a08a01527f362c362e3436312c31352e3335372d322e3235332c392e33382d382e34382c306101c08a01527f2c302d332e3531352d332e3531352d332e3531352d332e3531352d31312e34396101e08a01527f2d31312e3437382d35322e3635362d35322e3636342d36342e3833372d36342e6102008a01527f3833376c2e3034392d2e303337632d312e3732352d312e3630362d322e3731396102208a01527f2d332e3834372d322e3735312d362e3230346830632d2e3034362d322e3337356102408a01527f2c312e3036322d342e3538322c322e3732362d362e32323968306c2e3138352d6102608a01527f2e3134386830632e3039392d2e3036322c2e3232322d2e3134382c2e33372d2e6102808a01527f323539683063322e30362d312e3336322c332e3935312d322e3632312c362e306102a08a01527f34342d332e3834324335372e3736332d332e3437332c39372e37362d322e33346102c08a01527f312c3132382e3633372c31382e3333326331362e3637312c392e3934362d32366102e08a01527f2e3334342c35342e3831332d33382e3635312c34302e3139392d362e3239392d6103008a01527f362e3039362d31382e3036332d31372e3734332d31392e3636382d31382e38316103208a01527f312d362e3031362d342e3034372d31332e3036312c342e3737362d372e3735326103408a01527f2c392e3735316c36382e3235342c36382e33373163312e3732342c312e3630316103608a01527f2c322e3731342c332e38342c322e3733382c362e3139325a222f3e00000000006103808a0152604051978860a081011067ffffffffffffffff60a08b01111761431157611cb1611d129160a08b0160405260758b527f3c706174682069643d22466c6f6174696e6754657874222066696c6c3d226e6f60208c01527f6e652220643d224d31323520343568373530733830203020383020383076373560408c01527f307330203830202d3830203830682d373530732d38302030202d3830202d383060608c01527f762d3735307330202d3830203830202d3830222f3e000000000000000000000060808c0152611868615a41565b906040517f3c72616469616c4772616469656e742069643d2252616469616c476c6f77223e6020820152611d0d60d87f3c73746f70206f66667365743d223025222073746f702d636f6c6f723d22000093846040850152805161199a60b88660208501936118da81605e840187614826565b8101997f222073746f702d6f7061636974793d222e36222f3e0000000000000000000000605e8c01527f3c73746f70206f66667365743d2231303025222073746f702d636f6c6f723d229a8b607382015261193f825180936020609385019101614826565b017f222073746f702d6f7061636974793d2230222f3e00000000000000000000000060938201527f3c2f72616469616c4772616469656e743e00000000000000000000000000000060a78201520360988101885201866148df565b6119a2615a41565b90604051967f3c6c696e6561724772616469656e742069643d2253616e64546f70222078313d60208901527f223025222079313d223025223e000000000000000000000000000000000000006040890152604d8801528251611a0881606b8a0184614826565b8701917f222f3e00000000000000000000000000000000000000000000000000000000009283606b82015289606e820152611a4d825180936020608e85019101614826565b019082608e830152611a9160a2897f3c2f6c696e6561724772616469656e743e0000000000000000000000000000009485609182015203608281018b5201896148df565b611bd7610108611a9f615a41565b6040519b8c917f3c6c696e6561724772616469656e742069643d2253616e64426f74746f6d222060208401527f78313d2231303025222079313d2231303025223e00000000000000000000000060408401527f3c73746f70206f66667365743d22313025222073746f702d636f6c6f723d22006054840152611b2b815180926020607387019101614826565b8201908760738301526076820152875190611b4a826096830188614826565b018660968201527f3c616e696d617465206174747269627574654e616d653d22783122206475723d60998201527f2236732220726570656174436f756e743d22696e646566696e6974652220766160b98201527f6c7565733d223330253b3630253b313230253b3630253b3330253b222f3e000060d98201528560f78201520360e881018c52018a6148df565b611bdf615a41565b906040519a8b957f3c6c696e6561724772616469656e742069643d22486f7572676c61737353747260208801527f6f6b6522206772616469656e745472616e73666f726d3d22726f74617465283960408801527f302922206772616469656e74556e6974733d227573657253706163654f6e557360608801527f65223e000000000000000000000000000000000000000000000000000000000060808801527f3c73746f70206f66667365743d22353025222073746f702d636f6c6f723d2200608388015251809260a2880190614826565b84018360a28201527f3c73746f70206f66667365743d22383025222073746f702d636f6c6f723d220060a5820152611cf382518093602060c485019101614826565b019160c483015260c78201520360b88101875201856148df565b614e1f565b92611d32611d1e615817565b896020815191012090602081519101201490565b9788156146ad575b506040518060c081011067ffffffffffffffff60c0830111176143115760c08101604052609081527f3c7061746820643d224d2035302c3336302061203330302c333030203020312c60208201527f31203630302c302061203330302c333030203020312c31202d3630302c30222060408201527f66696c6c3d2223666666222066696c6c2d6f7061636974793d222e303222207360608201527f74726f6b653d2275726c2823486f7572676c6173735374726f6b65292220737460808201527f726f6b652d77696474683d2234222f3e0000000000000000000000000000000060a082015260405193846102c081011067ffffffffffffffff6102c087011117614311576102c0850160405261029885527f3c7061746820643d226d3536362c3136312e323031762d35332e39323463302d60208601527f31392e3338322d32322e3531332d33372e3536332d36332e3339382d35312e3160408601527f39382d34302e3735362d31332e3539322d39342e3934362d32312e3037392d3160608601527f35322e3538372d32312e303739732d3131312e3833382c372e3438372d31353260808601527f2e3630322c32312e303739632d34302e3839332c31332e3633362d36332e343160a08601527f332c33312e3831362d36332e3431332c35312e3139387635332e39323463302c60c08601527f31372e3138312c31372e3730342c33332e3432372c35302e3232332c34362e3360e08601527f3934763238342e383039632d33322e3531392c31322e39362d35302e3232332c6101008601527f32392e3230362d35302e3232332c34362e3339347635332e39323463302c31396101208601527f2e3338322c32322e35322c33372e3536332c36332e3431332c35312e3139382c6101408601527f34302e3736332c31332e3539322c39342e3935342c32312e3037392c3135322e6101608601527f3630322c32312e303739733131312e3833312d372e3438372c3135322e3538376101808601527f2d32312e3037396334302e3838362d31332e3633362c36332e3339382d33312e6101a08601527f3831362c36332e3339382d35312e313938762d35332e39323463302d31372e316101c08601527f39362d31372e3730342d33332e3433352d35302e3232332d34362e34303156326101e08601527f30372e3630336333322e3531392d31322e3936372c35302e3232332d32392e326102008601527f30362c35302e3232332d34362e3430315a6d2d3334372e3436322c35372e37396102208601527f336c3133302e3935392c3133312e3032372d3133302e3935392c3133312e30316102408601527f33563231382e3939345a6d3236322e3932342e303232763236322e3031386c2d6102608601527f3133302e3933372d3133312e3030362c3133302e3933372d3133312e3031335a6102808601527f222066696c6c3d2223313631383232223e3c2f706174683e00000000000000006102a0860152896000146144885760405161218c8161488b565b60008152995b1561432757604051806101e081011067ffffffffffffffff6101e083011117614311576101e081016040526101b181527f3c7061746820643d226d3438312e34362c3438312e35347638312e3031632d3260208201527f2e33352e37372d342e38322c312e35312d372e33392c322e32332d33302e332c60408201527f382e35342d37342e36352c31332e39322d3132342e30362c31332e39322d353360608201527f2e362c302d3130312e32342d362e33332d3133312e34372d31362e3136762d3860808201527f316c34362e332d34362e3331683137302e33336c34362e32392c34362e33315a60a08201527f222066696c6c3d2275726c282353616e64426f74746f6d29222f3e3c7061746860c08201527f20643d226d3433352e31372c3433352e323363302c312e31372d2e34362c322e60e08201527f33322d312e33332c332e34342d372e31312c392e30382d34312e39332c31352e6101008201527f39382d38332e38312c31352e3938732d37362e372d362e392d38332e38322d316101208201527f352e3938632d2e38372d312e31322d312e33332d322e32372d312e33332d332e6101408201527f3434762d2e30346c382e33342d382e33352e30312d2e30316331332e37322d366101608201527f2e35312c34322e39352d31312e30322c37362e382d31312e30327336322e39376101808201527f2c342e34392c37362e37322c31316c382e34322c382e34325a222066696c6c3d6101a08201527f2275726c282353616e64546f7029222f3e0000000000000000000000000000006101c0820152995b60405196876107e081011067ffffffffffffffff6107e08a01111761431157613b9f9c612e5a6036602d9960819f97631e17b39f60e11b8d7f3c2f646566733e000000000000000000000000000000000000000000000000009a612f2b9f6107e0016040526107a782527f3c672066696c6c3d226e6f6e6522207374726f6b653d2275726c2823486f757260208301527f676c6173735374726f6b652922207374726f6b652d6c696e656361703d22726f60408301527f756e6422207374726f6b652d6d697465726c696d69743d22313022207374726f60608301527f6b652d77696474683d2234223e3c7061746820643d226d3536352e3634312c3160808301527f30372e323863302c392e3533372d352e35362c31382e3632392d31352e36373660a08301527f2c32362e393733682d2e303233632d392e3230342c372e3539362d32322e313960c08301527f342c31342e3536322d33382e3139372c32302e3539322d33392e3530342c313460e08301527f2e3933362d39372e3332352c32342e3335352d3136312e3733332c32342e33356101008301527f352d39302e34382c302d3136372e3934382d31382e3538322d3139392e3935336101208301527f2d34342e393438682d2e303233632d31302e3131352d382e3334342d31352e366101408301527f37362d31372e3433372d31352e3637362d32362e3937332c302d33392e3733356101608301527f2c39362e3535342d37312e3932312c3231352e3635322d37312e3932317332316101808301527f352e3632392c33322e3138352c3231352e3632392c37312e3932315a222f3e3c6101a08301527f7061746820643d226d3133342e33362c3136312e32303363302c33392e3733356101c08301527f2c39362e3535342c37312e3932312c3231352e3635322c37312e3932317332316101e08301527f352e3632392d33322e3138362c3231352e3632392d37312e393231222f3e3c6c6102008301527f696e652078313d223133342e3336222079313d223136312e323033222078323d6102208301527f223133342e3336222079323d223130372e3238222f3e3c6c696e652078313d226102408301527f3536352e3634222079313d223136312e323033222078323d223536352e3634226102608301527f2079323d223130372e3238222f3e3c6c696e652078313d223138342e353834226102808301527f2079313d223230362e383233222078323d223138342e353835222079323d22356102a08301527f33372e353739222f3e3c6c696e652078313d223231382e313831222079313d226102c08301527f3231382e313138222078323d223231382e313831222079323d223536322e35336102e08301527f37222f3e3c6c696e652078313d223438312e383138222079313d223231382e316103008301527f3432222078323d223438312e383139222079323d223536322e343238222f3e3c6103208301527f6c696e652078313d223531352e343135222079313d223230372e3335322220786103408301527f323d223531352e343136222079323d223533372e353739222f3e3c70617468206103608301527f643d226d3138342e35382c3533372e353863302c352e34352c342e32372c31306103808301527f2e36352c31322e30332c31352e3432682e303263352e35312c332e33392c31326103a08301527f2e37392c362e35352c32312e35352c392e34322c33302e32312c392e392c37386103c08301527f2e30322c31362e32382c3133312e38332c31362e32382c34392e34312c302c396103e08301527f332e37362d352e33382c3132342e30362d31332e39322c322e372d2e37362c356104008301527f2e32392d312e35342c372e37352d322e33352c382e37372d322e38372c31362e6104208301527f30352d362e30342c32312e35362d392e3433683063372e37362d342e37372c316104408301527f322e30342d392e39372c31322e30342d31352e3432222f3e3c7061746820643d6104608301527f226d3138342e3538322c3439322e363536632d33312e3335342c31322e3438356104808301527f2d35302e3232332c32382e35382d35302e3232332c34362e3134322c302c392e6104a08301527f3533362c352e3536342c31382e3632372c31352e3637372c32362e393639682e6104c08301527f30323263382e3530332c372e3030352c32302e3231332c31332e3436332c33346104e08301527f2e3532342c31392e3135392c392e3939392c332e3939312c32312e3236392c376105008301527f2e3630392c33332e3539372c31302e3738382c33362e34352c392e3430372c386105208301527f322e3138312c31352e3030322c3133312e3833352c31352e3030327339352e336105408301527f36332d352e3539352c3133312e3830372d31352e3030326331302e3834372d326105608301527f2e37392c32302e3836372d352e3932362c32392e3932342d392e3334392c312e6105808301527f3234342d2e3436372c322e3437332d2e3934322c332e3637332d312e3432342c6105a08301527f31342e3332362d352e3639362c32362e3033352d31322e3136312c33342e35326105c08301527f342d31392e313733682e3032326331302e3131342d382e3334322c31352e36376105e08301527f372d31372e3433332c31352e3637372d32362e3936392c302d31372e3536322d6106008301527f31382e3836392d33332e3636352d35302e3232332d34362e3135222f3e3c70616106208301527f746820643d226d3133342e33362c3539322e373263302c33392e3733352c39366106408301527f2e3535342c37312e3932312c3231352e3635322c37312e393231733231352e366106608301527f32392d33322e3138362c3231352e3632392d37312e393231222f3e3c6c696e656106808301527f2078313d223133342e3336222079313d223539322e3732222078323d223133346106a08301527f2e3336222079323d223533382e373937222f3e3c6c696e652078313d223536356106c08301527f2e3634222079313d223539322e3732222078323d223536352e3634222079323d6106e08301527f223533382e373937222f3e3c706f6c796c696e6520706f696e74733d223438316107008301527f2e383232203438312e393031203438312e373938203438312e383737203438316107208301527f2e373735203438312e383534203335302e303135203335302e303236203231386107408301527f2e313835203231382e313239222f3e3c706f6c796c696e6520706f696e74733d6107608301527f223231382e313835203438312e393031203231382e323331203438312e3835346107808301527f203335302e303135203335302e303236203438312e383232203231382e3135326107a08301527f222f3e3c2f673e000000000000000000000000000000000000000000000000006107c0830152604051998a957f3c672069643d22486f7572676c617373223e00000000000000000000000000006020880152603295612df68151809260208a8c019101614826565b8701612e0b8251809360208a85019101614826565b01612e1f8251809360208985019101614826565b01612e338251809360208885019101614826565b01612e478251809360208785019101614826565b01918201520360168101865201846148df565b6040519e8f9788977f3c646566733e000000000000000000000000000000000000000000000000000060208a0152612e9f6026998260208c9451948593019101614826565b8901612eb48251809360208c85019101614826565b01612ec88251809360208b85019101614826565b01612edc8251809360208a85019101614826565b01612ef08251809360208985019101614826565b01612f048251809360208885019101614826565b01612f188251809360208785019101614826565b019182015203600d8101895201876148df565b6137be604c60e08301516101208401519361351a61314d6060604084015193015196612f578186615985565b9461314861012b604051612f6a816148c3565b600581527f2d3130302500000000000000000000000000000000000000000000000000000060208201526040519889917f3c74657874506174682073746172744f66667365743d220000000000000000006020840152612fd4815180926020603787019101614826565b7f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666683820160378101919091527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e00000000000000000061010982015282519261311891849161012090910190602001614826565b6a1e17ba32bc3a2830ba341f60a91b90830190910161012081019190915281900361010b810190915201876148df565b615985565b9561332c61012b604051613160816148c3565b600281527f30250000000000000000000000000000000000000000000000000000000000006020820152604051998a917f3c74657874506174682073746172744f66667365743d2200000000000000000060208401526131ca815180926020603787019101614826565b82017f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666660378201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e00000000000000000061010982015261330782518093602061012085019101614826565b016a1e17ba32bc3a2830ba341f60a91b6101208201520361010b81018a5201886148df565b61333681846159ed565b9261351561012b604051613349816148c3565b600481527f2d3530250000000000000000000000000000000000000000000000000000000060208201526040519687917f3c74657874506174682073746172744f66667365743d2200000000000000000060208401526133b3815180926020603787019101614826565b82017f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666660378201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e0000000000000000006101098201526134f082518093602061012085019101614826565b016a1e17ba32bc3a2830ba341f60a91b6101208201520361010b8101875201856148df565b6159ed565b906136f961012b60405161352d816148c3565b600381527f353025000000000000000000000000000000000000000000000000000000000060208201526040519485917f3c74657874506174682073746172744f66667365743d220000000000000000006020840152613597815180926020603787019101614826565b82017f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666660378201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e0000000000000000006101098201526136d482518093602061012085019101614826565b016a1e17ba32bc3a2830ba341f60a91b6101208201520361010b8101855201836148df565b6040519586937f3c7465787420746578742d72656e646572696e673d226f7074696d697a65537060208601527f656564223e000000000000000000000000000000000000000000000000000000604086015261375f815180926020604589019101614826565b8401613775825180936020604585019101614826565b0161378a825180936020604585019101614826565b0161379f825180936020604585019101614826565b01661e17ba32bc3a1f60c91b604582015203602c8101845201826148df565b613a9e61019a6101408401516101a0850151906137ff6137f96137f36137ed60e060408b01519a015194614b08565b94614b08565b97614b08565b91614b08565b956040519687937f3c75736520687265663d2223476c6f77222066696c6c2d6f7061636974793d2260208601527f2e39222f3e00000000000000000000000000000000000000000000000000000060408601527f3c75736520687265663d2223476c6f772220783d22313030302220793d22313060458601527f3030222066696c6c2d6f7061636974793d222e39222f3e00000000000000000060658601527f3c75736520687265663d22234c6f676f2220783d223137302220793d22313730607c8601527f22207472616e73666f726d3d227363616c65282e3629222f3e3c757365206872609c8601527f65663d2223486f7572676c6173732220783d223135302220793d22393022207460bc8601527f72616e73666f726d3d22726f746174652831302922207472616e73666f726d2d60dc8601527f6f726967696e3d2235303020353030222f3e000000000000000000000000000060fc8601527f3c75736520687265663d222350726f67726573732220783d220000000000000061010e8601526101279061399a815180926020858a019101614826565b8501937f2220793d22373930222f3e00000000000000000000000000000000000000000080948180948801527f3c75736520687265663d22235374617475732220783d2200000000000000000061013288015261014996613a048251809360208b85019101614826565b01958601527f3c75736520687265663d2223416d6f756e742220783d2200000000000000000061015486015261016b94613a478251809360208985019101614826565b01938401527f3c75736520687265663d22234475726174696f6e2220783d220000000000000061017684015261018f92613a8a8251809360208785019101614826565b01918201520361017a8101855201836148df565b6040519586937f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323060208601527f30302f737667222077696474683d223130303022206865696768743d2231303060408601527f30222076696577426f783d2230203020313030302031303030223e00000000006060860152613b2a815180926020607b89019101614826565b8401613b40825180936020607b85019101614826565b01613b55825180936020607b85019101614826565b01613b6a825180936020607b85019101614826565b017f3c2f7376673e0000000000000000000000000000000000000000000000000000607b8201520360618101845201826148df565b6101605260a051610100516040517fb971302a0000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa908115614305576000916142ba575b6142b661424f614154614245609487613d3b6089613c198a614c58565b9260c0608001516040519485927f5b7b2274726169745f74797065223a224173736574222c2276616c7565223a226020850152613c60815180926020604088019101614826565b8301907f227d2c7b2274726169745f74797065223a2253656e646572222c2276616c756560408301527f223a22000000000000000000000000000000000000000000000000000000000091826060820152613cc5825180936020606385019101614826565b01907f227d2c7b2274726169745f74797065223a22537461747573222c2276616c756560638301526083820152613d06825180936020608685019101614826565b017f227d5d000000000000000000000000000000000000000000000000000000000060868201520360698101845201826148df565b6101a05160a05161403e61017e613d53602435614b08565b9360a060800151613d6e6001600160a01b0360805116614c58565b90604051968793613f2b60208601987f54686973204e465420726570726573656e74732061207061796d656e742073748a527f7265616d20696e2061205361626c696572205632200000000000000000000000604088015282516020840190613ddb8160558b0184614826565b8801947f20636f6e74726163742e20546865206f776e6572206f662074686973204e465460558701527f2063616e207769746864726177207468652073747265616d656420617373657460758701527f732c207768696368206172652064656e6f6d696e6174656420696e2000000000609587015282516020840196613e658260b183018a614826565b017f2e5c6e5c6e2d2053747265616d2049443a20000000000000000000000000000060b1820152613ea082518093602060c385019101614826565b01613ed97f5c6e2d2000000000000000000000000000000000000000000000000000000000958660c384015251809360c7840190614826565b01947f20416464726573733a2000000000000000000000000000000000000000000000958660c7820152613f1782518093602060d185019101614826565b019260d184015251809360d5840190614826565b019060d5820152613f4682518093602060df85019101614826565b017f5c6e5c6e0000000000000000000000000000000000000000000000000000000060df8201527fe29aa0efb88f205741524e494e473a205472616e7366657272696e672074686560e38201527f204e4654206d616b657320746865206e6577206f776e657220746865207265636101038201527f697069656e74206f66207468652073747265616d2e205468652066756e6473206101238201527f617265206e6f74206175746f6d61746963616c6c792077697468647261776e206101438201527f666f72207468652070726576696f757320726563697069656e742e00000000006101638201520361015e8101855201836148df565b6101a051906141af614051602435614b08565b916140d0602d604051809560208201976a029b0b13634b2b9102b19160ad1b8952614086815180926020602b87019101614826565b82017f2023000000000000000000000000000000000000000000000000000000000000602b8201526140c18251809360208785019101614826565b0103600d8101865201846148df565b610160516140dd90614994565b94604051998a977f7b2261747472696275746573223a00000000000000000000000000000000000060208a015261411e815180926020602e8d019101614826565b8801917f2c226465736372697074696f6e223a2200000000000000000000000000000000602e840152518093603e840190614826565b01917f222c2265787465726e616c5f75726c223a2268747470733a2f2f7361626c6965603e8401527f722e636f6d222c226e616d65223a220000000000000000000000000000000000605e840152518093606d840190614826565b017f222c22696d616765223a22646174613a696d6167652f7376672b786d6c3b6261606d8201527f736536342c000000000000000000000000000000000000000000000000000000608d820152614210825180936020609285019101614826565b017f227d00000000000000000000000000000000000000000000000000000000000060928201520360748101845201826148df565b60e0819052614994565b6142a2603d60405180937f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000060208301526142928151809260208686019101614826565b810103601d8101845201826148df565b604051918291602083526020830190614849565b0390f35b90506020813d6020116142fd575b816142d5602093836148df565b810103126142f85751906001600160a01b03821682036142f85790614154613bfc565b600080fd5b3d91506142c8565b6040513d6000823e3d90fd5b634e487b7160e01b600052604160045260246000fd5b6040518061012081011067ffffffffffffffff6101208301111761431157610120810160405260f881527f3c7061746820643d226d3438312e34362c3530342e3130317635382e3434396360208201527f2d322e33352e37372d342e38322c312e35312d372e33392c322e32332d33302e60408201527f332c382e35342d37342e36352c31332e39322d3132342e30362c31332e39322d60608201527f35332e362c302d3130312e32342d362e33332d3133312e34372d31362e31367660808201527f2d35382e343339683236322e39325a222066696c6c3d2275726c282353616e6460a08201527f426f74746f6d29222f3e3c656c6c697073652063783d22333530222063793d2260c08201527f3530342e313031222072783d223133312e343632222072793d2232382e31303860e08201527f222066696c6c3d2275726c282353616e64546f7029222f3e0000000000000000610100820152996123df565b604051806101c081011067ffffffffffffffff6101c083011117614311576101c0810160405261019981527f3c706f6c79676f6e20706f696e74733d22333530203335302e3032362034313560208201527f2e3033203238342e39373820323835203238342e39373820333530203335302e60408201527f303236222066696c6c3d2275726c282353616e64426f74746f6d29222f3e3c7060608201527f61746820643d226d3431362e3334312c3238312e39373563302c2e3931342d2e60808201527f3335342c312e3830392d312e3033352c322e36382d352e3534322c372e30373660a08201527f2d33322e3636312c31322e34352d36352e32382c31322e34352d33322e36323460c08201527f2c302d35392e3733382d352e3337342d36352e32382d31322e34352d2e36383160e08201527f2d2e3837322d312e3033352d312e3736372d312e3033352d322e36382c302d2e6101008201527f3931342e3335342d312e3830382c312e3033352d322e3637362c352e3534322d6101208201527f372e3037362c33322e3635362d31322e34352c36352e32382d31322e34352c336101408201527f322e3631392c302c35392e3733382c352e3337342c36352e32382c31322e34356101608201527f2e3638312e3836372c312e3033352c312e3736322c312e3033352c322e3637366101808201527f5a222066696c6c3d2275726c282353616e64546f7029222f3e000000000000006101a082015299612192565b6146cf9198506146bb615850565b906020815191012090602081519101201490565b9638611d3a565b905093610d61565b905094610a32565b60d09461072c565b614710915060203d602011614716575b61470881836148df565b810190614929565b38610517565b503d6146fe565b614736915060203d6020116147165761470881836148df565b386104c1565b634e487b7160e01b600052601260045260246000fd5b614774915060203d60201161477a575b61476c81836148df565b810190614901565b3861023f565b503d614762565b506020813d6020116147b6575b8161479b602093836148df565b810103126142f8575160058110156142f8576101e5906101db565b3d915061478e565b6147d7915060203d60201161477a5761476c81836148df565b38610181565b90506020813d60201161481e575b816147f8602093836148df565b810103126142f857516001600160a01b03811681036142f8576001600160a01b03610100565b3d91506147eb565b60005b8381106148395750506000910152565b8181015183820152602001614829565b9060209161486281518092818552858086019101614826565b601f01601f1916010190565b610140810190811067ffffffffffffffff82111761431157604052565b6020810190811067ffffffffffffffff82111761431157604052565b6060810190811067ffffffffffffffff82111761431157604052565b6040810190811067ffffffffffffffff82111761431157604052565b90601f8019910116810190811067ffffffffffffffff82111761431157604052565b908160209103126142f857516fffffffffffffffffffffffffffffffff811681036142f85790565b908160209103126142f8575164ffffffffff811681036142f85790565b67ffffffffffffffff811161431157601f01601f191660200190565b9061496c82614946565b61497960405191826148df565b828152809261498a601f1991614946565b0190602036910137565b805115614af4576040516149a7816148a7565b604081527f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208201527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f60408201528151600292838201809211614ade5760038092047f3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81168103614ade57614a41908594951b614962565b936020850193829183518401925b838110614a8d5750505050510680600114614a7a57600214614a6f575090565b603d90600019015390565b50603d9081600019820153600119015390565b85600491979293949701918251600190603f9082828260121c16880101518453828282600c1c16880101518385015382828260061c1688010151888501531685010151878201530195929190614a4f565b634e487b7160e01b600052601160045260246000fd5b50604051614b018161488b565b6000815290565b806000917a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000080821015614c4a575b506d04ee2d6d415b85acef810000000080831015614c3b575b50662386f26fc1000080831015614c2c575b506305f5e10080831015614c1d575b5061271080831015614c0e575b506064821015614bfe575b600a80921015614bf4575b600190816021614b9f828701614962565b95860101905b614bb1575b5050505090565b600019019083907f30313233343536373839616263646566000000000000000000000000000000008282061a835304918215614bef57919082614ba5565b614baa565b9160010191614b8e565b9190606460029104910191614b83565b60049193920491019138614b78565b60089193920491019138614b6b565b60109193920491019138614b5c565b60209193920491019138614b4a565b604093508104915038614b31565b6001600160a01b031660405190614c6e826148a7565b602a8252602082016040368237825115614d8657603090538151600190811015614d8657607860218401536029905b808211614d0b575050614cad5790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602060248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b9091600f81166010811015614d71577f3031323334353637383961626364656600000000000000000000000000000000901a614d478486614d9c565b5360041c918015614d5c576000190190614c9d565b60246000634e487b7160e01b81526011600452fd5b60246000634e487b7160e01b81526032600452fd5b634e487b7160e01b600052603260045260246000fd5b908151811015614d86570160200190565b60405190614dba826148c3565b600482527f2667743b000000000000000000000000000000000000000000000000000000006020830152565b60405190614df3826148c3565b600482527f266c743b000000000000000000000000000000000000000000000000000000006020830152565b90614e87929493604051958692602094614e4181518092888089019101614826565b8401614e5582518093888085019101614826565b01614e6882518093878085019101614826565b01614e7b82518093868085019101614826565b010380855201836148df565b565b801561519a5760009180615175575090505b6001908082811015614f0857505050614eb2614de6565b614f05602260405183614ecf829551809260208086019101614826565b81017f203100000000000000000000000000000000000000000000000000000000000060208201520360028101845201826148df565b90565b66038d7ea4c6800011156151185760409081519060a0820182811067ffffffffffffffff82111761431157808452614f3f8161488b565b600081528252825190614f51826148c3565b8482526020917f4b0000000000000000000000000000000000000000000000000000000000000083820152828401528351614f8b816148c3565b8581527f4d0000000000000000000000000000000000000000000000000000000000000083820152848401528351614fc2816148c3565b8581527f42000000000000000000000000000000000000000000000000000000000000008382015260608401528351614ffa816148c3565b8581527f54000000000000000000000000000000000000000000000000000000000000008382015260808401526000918583965b6150ec575b50845194615040866148c3565b6007908187527f2623383830353b0000000000000000000000000000000000000000000000000083880152519560005b8281106150d957505050506150ba6150c0917f20000000000000000000000000000000000000000000000000000000000000006027870152600886526150b5866148c3565b614b08565b91615744565b916005851015614d8657614f059460051b015192614e1f565b8181018401518882018501528301615070565b9591926103e89081851061510f57508680916064600a870406950493019661502e565b93929650615033565b5050615122614dad565b614f0560286040518361513f829551809260208086019101614826565b81017f203939392e39395400000000000000000000000000000000000000000000000060208201520360088101845201826148df565b600a0a918215615186575004614e9b565b80634e487b7160e01b602492526012600452fd5b50506040516151a8816148c3565b600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b620151809103048061523d57506151ea614de6565b614f05602660405183615207829551809260208086019101614826565b81017f203120446179000000000000000000000000000000000000000000000000000060208201520360068101845201826148df565b61270f811161530c57600181036152c957614f056020615291604051615262816148c3565b600481527f20446179000000000000000000000000000000000000000000000000000000008382015293614b08565b60405193816152a98693518092868087019101614826565b82016152bd82518093868085019101614826565b010380845201826148df565b614f0560206152916040516152dd816148c3565b600581527f20446179730000000000000000000000000000000000000000000000000000008382015293614b08565b50615315614dad565b614f05602a60405183615332829551809260208086019101614826565b81017f2039393939204461797300000000000000000000000000000000000000000000602082015203600a8101845201826148df565b6020818303126142f85780519067ffffffffffffffff82116142f8570181601f820112156142f857805161539b81614946565b926153a960405194856148df565b818452602082840101116142f857614f059160208085019101614826565b6001600160a01b031660409081516395d89b4160e01b8152600081600481855afa9081156155a157600091615580575b5061545c8351615406816148c3565b601181527f5341422d56322d4c4f434b55502d4c494e0000000000000000000000000000006020918201528251908301207fc66b376a19264d832c1bc254000c18944ca5aa57ed50f4ea637c4da424d4c3bb1490565b1561549a5750505161546d816148c3565b600d81527f4c6f636b7570204c696e65617200000000000000000000000000000000000000602082015290565b6154fe83516154a8816148c3565b601181527f5341422d56322d4c4f434b55502d44594e0000000000000000000000000000006020918201528251908301207f6ab655856fa5352de8c05542b1937ac63c59342da992602767c02734cc5391651490565b1561553c5750505161550f816148c3565b600e81527f4c6f636b75702044796e616d6963000000000000000000000000000000000000602082015290565b61557c9083519384937f814a8a2e000000000000000000000000000000000000000000000000000000008552600485015260248401526044830190614849565b0390fd5b61559b913d8091833e61559381836148df565b810190615368565b386153f7565b83513d6000823e3d90fd5b3d156155d7573d906155bd82614946565b916155cb60405193846148df565b82523d6000602084013e565b606090565b60405160208101907f313ce56700000000000000000000000000000000000000000000000000000000825260048152615614816148c3565b6000928392839251915afa6156276155ac565b908061565e575b1561565a5760208180518101031261565657602001519060ff82168203615653575090565b80fd5b5080fd5b5090565b50602081511461562e565b6000809160405160208101906395d89b4160e01b82526004815261568c816148c3565b51915afa6156986155ac565b90158015615738575b6156fe57806020806156b893518301019101615368565b601e815111600014614f0557506040516156d1816148c3565b600b81527f4c6f6e672053796d626f6c000000000000000000000000000000000000000000602082015290565b5060405161570b816148c3565b600581527f4552433230000000000000000000000000000000000000000000000000000000602082015290565b506040815111156156a1565b806157565750604051614b018161488b565b600a8110156157bb5761576890614b08565b614f05602260405180937f2e3000000000000000000000000000000000000000000000000000000000000060208301526157ab8151809260208686019101614826565b81010360028101845201826148df565b6157c490614b08565b614f05602160405180937f2e0000000000000000000000000000000000000000000000000000000000000060208301526158078151809260208686019101614826565b81010360018101845201826148df565b60405190615824826148c3565b600782527f536574746c6564000000000000000000000000000000000000000000000000006020830152565b6040519061585d826148c3565b600882527f4465706c657465640000000000000000000000000000000000000000000000006020830152565b600581101561596f57600481036158a35750614f05615850565b600381036158e557506040516158b8816148c3565b600881527f43616e63656c6564000000000000000000000000000000000000000000000000602082015290565b6001810361592757506040516158fa816148c3565b600981527f53747265616d696e670000000000000000000000000000000000000000000000602082015290565b60020361593657614f05615817565b604051615942816148c3565b600781527f50656e64696e6700000000000000000000000000000000000000000000000000602082015290565b634e487b7160e01b600052602160045260246000fd5b6030614e879193929360405194816159a7879351809260208087019101614826565b820164010714051160dd1b60208201526a029b0b13634b2b9102b19160ad1b60258201526159de8251809360208785019101614826565b010360108101855201836148df565b6025614e87919392936040519481615a0f879351809260208087019101614826565b820164010714051160dd1b6020820152615a328251809360208785019101614826565b010360058101855201836148df565b60405190615a4e826148c3565b601082527f68736c283233302c3231252c31312529000000000000000000000000000000006020830152565b8015615cac57615a88615a41565b90612710908103908111614ade57614f0591615aa661013692614b08565b6040519485927f3c672066696c6c3d226e6f6e65223e000000000000000000000000000000000060208501527f3c636972636c652063783d22313636222063793d2235302220723d2232322220602f8501527f7374726f6b653d22000000000000000000000000000000000000000000000000604f850152615b32815180926020605788019101614826565b83017f22207374726f6b652d77696474683d223130222f3e000000000000000000000060578201527f3c636972636c652063783d22313636222063793d2235302220706174684c656e606c8201527f6774683d2231303030302220723d22323222207374726f6b653d220000000000608c820152615bba82518093602060a785019101614826565b017f22207374726f6b652d6461736861727261793d22313030303022207374726f6b60a78201527f652d646173686f66667365743d2200000000000000000000000000000000000060c7820152615c1b82518093602060d585019101614826565b017f22207374726f6b652d6c696e656361703d22726f756e6422207374726f6b652d60d58201527f77696474683d223522207472616e73666f726d3d22726f74617465282d39302960f58201527f22207472616e73666f726d2d6f726967696e3d22313636203530222f3e000000610115820152631e17b39f60e11b610132820152036101168101845201826148df565b5050604051614b018161488b565b60009080518015615d2f579060009182915b818310615cde57505050600d02900390565b909193603b60f81b7fff00000000000000000000000000000000000000000000000000000000000000615d118785614d9c565b511614615d27575b600d01936001019190615ccc565b849350615d19565b505050600090565b60009080518015615d2f579060009182915b818310615d5b5750505060041b900390565b909193603b60f81b7fff00000000000000000000000000000000000000000000000000000000000000615d8e8785614d9c565b511614615da4575b601001936001019190615d49565b849350615d9656"; diff --git a/test/utils/Precompiles.t.sol b/test/utils/Precompiles.t.sol index f62ee83cd..998f48a5c 100644 --- a/test/utils/Precompiles.t.sol +++ b/test/utils/Precompiles.t.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: UNLICENSED pragma solidity >=0.8.19 <0.9.0; -import { LibString } from "solady/utils/LibString.sol"; +import { LibString } from "solady/src/utils/LibString.sol"; import { ISablierV2Comptroller } from "../../src/interfaces/ISablierV2Comptroller.sol"; import { ISablierV2LockupDynamic } from "../../src/interfaces/ISablierV2LockupDynamic.sol"; diff --git a/test/utils/Utils.sol b/test/utils/Utils.sol index 9748d2d3a..f2e483e6e 100644 --- a/test/utils/Utils.sol +++ b/test/utils/Utils.sol @@ -2,10 +2,10 @@ pragma solidity >=0.8.19; import { Strings } from "@openzeppelin/contracts/utils/Strings.sol"; -import { PRBMathUtils } from "@prb/math/src/test/Utils.sol"; +import { PRBMathUtils } from "@prb/math/test/utils/Utils.sol"; -import { Vm } from "@prb/test/PRBTest.sol"; -import { StdUtils } from "forge-std/StdUtils.sol"; +import { Vm } from "@prb/test/src/PRBTest.sol"; +import { StdUtils } from "forge-std/src/StdUtils.sol"; import { LockupDynamic } from "../../src/types/DataTypes.sol"; From 0e9bf3fef11a3b37930c3c3400c3afcac061166d Mon Sep 17 00:00:00 2001 From: Andrei Vlad Birgaoanu <99738872+andreivladbrg@users.noreply.github.com> Date: Fri, 15 Dec 2023 15:04:58 +0200 Subject: [PATCH 43/47] ci: add ci-slither file (#726) * ci: add ci-slither file ci: move Slither job from ci.yml to its dedicated file to run weekly * ci: remove lint and build jobs in slither * ci: bring back "lint" job --------- Co-authored-by: Paul Razvan Berg --- .github/workflows/ci-slither.yml | 83 ++++++++++++++++++++++++++++++++ .github/workflows/ci.yml | 42 ---------------- 2 files changed, 83 insertions(+), 42 deletions(-) create mode 100644 .github/workflows/ci-slither.yml diff --git a/.github/workflows/ci-slither.yml b/.github/workflows/ci-slither.yml new file mode 100644 index 000000000..d2e2f57d5 --- /dev/null +++ b/.github/workflows/ci-slither.yml @@ -0,0 +1,83 @@ +name: "CI Slither" + +env: + API_KEY_ETHERSCAN: ${{ secrets.API_KEY_ETHERSCAN }} + API_KEY_INFURA: ${{ secrets.API_KEY_INFURA }} + RPC_URL_MAINNET: ${{ secrets.RPC_URL_MAINNET }} + +on: + schedule: + - cron: "0 3 * * 0" # at 3:00am UTC every Sunday + +jobs: + lint: + runs-on: "ubuntu-latest" + steps: + - name: "Check out the repo" + uses: "actions/checkout@v3" + + - name: "Install Foundry" + uses: "foundry-rs/foundry-toolchain@v1" + + - name: "Install Pnpm" + uses: "pnpm/action-setup@v2" + with: + version: "8" + + - name: "Install Node.js" + uses: "actions/setup-node@v3" + with: + cache: "pnpm" + node-version: "lts/*" + + - name: "Install the Node.js dependencies" + run: "pnpm install" + + - name: "Lint the contracts" + run: "pnpm lint" + + - name: "Add lint summary" + run: | + echo "## Lint result" >> $GITHUB_STEP_SUMMARY + echo "✅ Passed" >> $GITHUB_STEP_SUMMARY + + slither-analyze: + runs-on: "ubuntu-latest" + permissions: + actions: "read" + contents: "read" + security-events: "write" + steps: + - name: "Check out the repo" + uses: "actions/checkout@v3" + + - name: "Install Pnpm" + uses: "pnpm/action-setup@v2" + with: + version: "8" + + - name: "Install Node.js" + uses: "actions/setup-node@v3" + with: + cache: "pnpm" + node-version: "lts/*" + + - name: "Install the Node.js dependencies" + run: "pnpm install" + + - name: "Run Slither analysis" + uses: "crytic/slither-action@v0.3.0" + id: "slither" + with: + fail-on: "none" + sarif: "results.sarif" + + - name: "Upload SARIF file to GitHub code scanning" + uses: "github/codeql-action/upload-sarif@v2" + with: + sarif_file: ${{ steps.slither.outputs.sarif }} + + - name: "Add Slither summary" + run: | + echo "## Slither result" >> $GITHUB_STEP_SUMMARY + echo "✅ Uploaded to GitHub code scanning" >> $GITHUB_STEP_SUMMARY diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 24a6f34b3..2c424484e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -299,45 +299,3 @@ jobs: run: | echo "## Coverage result" >> $GITHUB_STEP_SUMMARY echo "✅ Uploaded to Codecov" >> $GITHUB_STEP_SUMMARY - - slither-analyze: - needs: ["lint", "build"] - runs-on: "ubuntu-latest" - permissions: - actions: "read" - contents: "read" - security-events: "write" - steps: - - name: "Check out the repo" - uses: "actions/checkout@v3" - - - name: "Install Pnpm" - uses: "pnpm/action-setup@v2" - with: - version: "8" - - - name: "Install Node.js" - uses: "actions/setup-node@v3" - with: - cache: "pnpm" - node-version: "lts/*" - - - name: "Install the Node.js dependencies" - run: "pnpm install" - - - name: "Run Slither analysis" - uses: "crytic/slither-action@v0.3.0" - id: "slither" - with: - fail-on: "none" - sarif: "results.sarif" - - - name: "Upload SARIF file to GitHub code scanning" - uses: "github/codeql-action/upload-sarif@v2" - with: - sarif_file: ${{ steps.slither.outputs.sarif }} - - - name: "Add Slither summary" - run: | - echo "## Slither result" >> $GITHUB_STEP_SUMMARY - echo "✅ Uploaded to GitHub code scanning" >> $GITHUB_STEP_SUMMARY From c7c61acc74bba39cc1050e79cc9b32383c4e8c05 Mon Sep 17 00:00:00 2001 From: andreivladbrg Date: Fri, 15 Dec 2023 15:58:57 +0200 Subject: [PATCH 44/47] docs: include #734 in changelog docs: update date in changelog --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f15d0372d..ebbe9af96 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,7 @@ The format is based on [Common Changelog](https://common-changelog.org/). [1.0.1]: https://github.com/sablier-labs/v2-core/compare/v1.0.0...v1.0.1 [1.0.0]: https://github.com/sablier-labs/v2-core/releases/tag/v1.0.0 -## [1.1.0] - 2023-10-19 +## [1.1.0] - 2023-12-15 ### Changed @@ -19,6 +19,7 @@ The format is based on [Common Changelog](https://common-changelog.org/). ([#692](https://github.com/sablier-labs/v2-core/pull/692)) - Simplify `renounce` and `withdraw` implementations ([#683](https://github.com/sablier-labs/v2-core/pull/683), [#705](https://github.com/sablier-labs/v2-core/pull/705)) +- Update import paths to use Node.js dependencies ([#734](https://github.com/sablier-labs/v2-core/pull/734)) - Upgrade Solidity to `0.8.21` ([#688](https://github.com/sablier-labs/v2-core/pull/688)) ### Added From 332b130f64d4ba9242e5f0ab024a8a976cff5f8e Mon Sep 17 00:00:00 2001 From: andreivladbrg Date: Fri, 15 Dec 2023 16:12:25 +0200 Subject: [PATCH 45/47] test: update Precompiles bytecodes --- test/utils/Precompiles.sol | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/utils/Precompiles.sol b/test/utils/Precompiles.sol index 07c44ac94..53593d15b 100644 --- a/test/utils/Precompiles.sol +++ b/test/utils/Precompiles.sol @@ -25,13 +25,13 @@ contract Precompiles { //////////////////////////////////////////////////////////////////////////*/ bytes public constant BYTECODE_COMPTROLLER = - hex"60803461009857601f6104a638819003918201601f19168301916001600160401b0383118484101761009d5780849260209460405283398101031261009857516001600160a01b0381169081900361009857600080546001600160a01b0319168217815560405191907fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a36103f290816100b48239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe608060408181526004918236101561001657600080fd5b600092833560e01c9182634d81e51d1461039d5750816375829def146102e5578163907a267b14610253578163b5b3ca2c146101ab578163cb01e30e146100f957508063dcf844a7146100c3578063e07df5b4146100a55763f851a4401461007d57600080fd5b346100a157816003193601126100a1576001600160a01b0360209254169051908152f35b5080fd5b50346100a157816003193601126100a1576020906001549051908152f35b50346100a15760203660031901126100a157806020926001600160a01b036100e96103d7565b1681526003845220549051908152f35b9050346101a75760203660031901126101a7576101146103d7565b6001600160a01b03918285541633810361017a575050169081835260026020528083209081549160ff8316159260ff84169060ff1916179055519081527f8cd3a7bc46b26a3b0c07a05a47af78abcaa647626f631d92ea64f8867b23bbec60203392a380f35b84516331b339a960e21b81526001600160a01b039091169181019182523360208301529081906040010390fd5b8280fd5b9050346101a757816003193601126101a7576101c56103d7565b90602435916001600160a01b039182865416338103610226575050907f371789a3d97098f3070492613273a065a7e8a19e009fd1ae92a4b4d4c71ed62d9116928385526003602052808520928084549455815193845260208401523392a380f35b85516331b339a960e21b81526001600160a01b039091169181019182523360208301529081906040010390fd5b919050346101a75760203660031901126101a7578135916001600160a01b038454163381036102b85750507fc059ba3e07a1c4d1fa8845bdb2af2dd85e844684e0a59e6073499e4338788465906001549280600155815193845260208401523392a280f35b82516331b339a960e21b81526001600160a01b039091169181019182523360208301529081906040010390fd5b919050346101a75760203660031901126101a7578135916001600160a01b03918284168094036103995784549283169033820361036d575050507fffffffffffffffffffffffff00000000000000000000000000000000000000001681178255337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808380a380f35b516331b339a960e21b81526001600160a01b039091169181019182523360208301529081906040010390fd5b8480fd5b849084346101a75760203660031901126101a75760ff906020936001600160a01b036103c76103d7565b1681526002855220541615158152f35b600435906001600160a01b03821682036103ed57565b600080fd"; + hex"60803461009857601f6104b338819003918201601f19168301916001600160401b0383118484101761009d5780849260209460405283398101031261009857516001600160a01b0381169081900361009857600080546001600160a01b0319168217815560405191907fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a36103ff90816100b48239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe608060408181526004918236101561001657600080fd5b600092833560e01c9182634d81e51d1461039d5750816375829def146102e5578163907a267b14610253578163b5b3ca2c146101ab578163cb01e30e146100f957508063dcf844a7146100c3578063e07df5b4146100a55763f851a4401461007d57600080fd5b346100a157816003193601126100a1576001600160a01b0360209254169051908152f35b5080fd5b50346100a157816003193601126100a1576020906001549051908152f35b50346100a15760203660031901126100a157806020926001600160a01b036100e96103d7565b1681526003845220549051908152f35b9050346101a75760203660031901126101a7576101146103d7565b6001600160a01b03918285541633810361017a575050169081835260026020528083209081549160ff8316159260ff84169060ff1916179055519081527f8cd3a7bc46b26a3b0c07a05a47af78abcaa647626f631d92ea64f8867b23bbec60203392a380f35b84516331b339a960e21b81526001600160a01b039091169181019182523360208301529081906040010390fd5b8280fd5b9050346101a757816003193601126101a7576101c56103d7565b90602435916001600160a01b039182865416338103610226575050907f371789a3d97098f3070492613273a065a7e8a19e009fd1ae92a4b4d4c71ed62d9116928385526003602052808520928084549455815193845260208401523392a380f35b85516331b339a960e21b81526001600160a01b039091169181019182523360208301529081906040010390fd5b919050346101a75760203660031901126101a7578135916001600160a01b038454163381036102b85750507fc059ba3e07a1c4d1fa8845bdb2af2dd85e844684e0a59e6073499e4338788465906001549280600155815193845260208401523392a280f35b82516331b339a960e21b81526001600160a01b039091169181019182523360208301529081906040010390fd5b919050346101a75760203660031901126101a7578135916001600160a01b03918284168094036103995784549283169033820361036d575050507fffffffffffffffffffffffff00000000000000000000000000000000000000001681178255337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808380a380f35b516331b339a960e21b81526001600160a01b039091169181019182523360208301529081906040010390fd5b8480fd5b849084346101a75760203660031901126101a75760ff906020936001600160a01b036103c76103d7565b1681526002855220541615158152f35b600435906001600160a01b03821682036103ed57565b600080fdfea164736f6c6343000815000a"; bytes public constant BYTECODE_LOCKUP_DYNAMIC = - hex"60c0346200046e57601f62005ca638819003918201601f19168301916001600160401b038311848410176200032b578084926080946040528339810103126200046e5780516001600160a01b038082169290918390036200046e5760208101518281168091036200046e5760408201519183831683036200046e5760600151936200008962000473565b90601d82527f5361626c696572205632204c6f636b75702044796e616d6963204e46540000006020830152620000be62000473565b601181527029a0a116ab1916a627a1a5aaa816a22ca760791b602082015230608052600080546001600160a01b03199081168417825560018054909116909517909455927fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a38051906001600160401b0382116200032b5760035490600182811c9216801562000463575b60208310146200044d5781601f849311620003d8575b50602090601f83116001146200034d5760009262000341575b50508160011b916000199060031b1c1916176003555b80516001600160401b0381116200032b576004918254600181811c9116801562000320575b60208210146200030b579081601f849311620002b3575b50602090601f831160011462000248576000926200023c575b50508160011b916000199060031b1c19161790555b1660018060a01b0319600a541617600a5560a052600160095560405161581290816200049482396080518161439b015260a05181818161120e01526139930152f35b015190503880620001e5565b6000858152602081209350601f198516905b8181106200029a575090846001959493921062000280575b505050811b019055620001fa565b015160001960f88460031b161c1916905538808062000272565b929360206001819287860151815501950193016200025a565b909150836000526020600020601f840160051c8101916020851062000300575b90601f859493920160051c01905b818110620002f05750620001cc565b60008155849350600101620002e1565b9091508190620002d3565b602284634e487b7160e01b6000525260246000fd5b90607f1690620001b5565b634e487b7160e01b600052604160045260246000fd5b0151905038806200017a565b600360009081527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b9350601f198516905b818110620003bf5750908460019594939210620003a5575b505050811b0160035562000190565b015160001960f88460031b161c1916905538808062000396565b929360206001819287860151815501950193016200037e565b60036000529091507fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f840160051c8101916020851062000442575b90601f859493920160051c01905b81811062000432575062000161565b6000815584935060010162000423565b909150819062000415565b634e487b7160e01b600052602260045260246000fd5b91607f16916200014b565b600080fd5b60408051919082016001600160401b038111838210176200032b5760405256fe608080604052600436101561001357600080fd5b60003560e01c90816301ffc9a7146128d25750806306fdde031461280f578063081812fc146127f1578063095ea7b31461265d5780631400ecec146125b8578063168444561461233d5780631c1cdd4c146122d75780631e99d569146122b957806323b872dd1461229057806339a73c031461224d57806340e58ee514612014578063425d30dd14611ff657806342842e0e14611fa657806342966c6814611e285780634857501f14611db25780634869e12d14611d765780635fe3b56714611d4f5780636352211e14611d205780636d0cee7514611cc857806370a0823114611c1e57806375829def14611b8c5780637cad6cd114611aba5780637de6b1db146118ce5780638659c270146115f0578063894e9a0d146113835780638bad38dd146113075780638f69b993146112845780639067b677146112315780639188ec84146111f657806395d89b41146110e8578063a22cb46514611017578063a2ffb89714610f1e578063a6202bf214610e1e578063a80fc07114610dc9578063ad35efd414610d66578063b256456914610d48578063b637b86514610ce8578063b88d4fde14610c5f578063b8a3be6614610c28578063b971302a14610bd6578063bc063e1a14610bb3578063bc2be1be14610b60578063c156a11d14610aac578063c33cd35e14610997578063c87b56dd14610864578063cc364f48146107ca578063d4dbd20b14610775578063d511609f14610726578063d975dfed146106d9578063e985e9c514610682578063ea5ead1914610652578063eac8f5b8146105e6578063f590c176146105be578063f851a440146105975763fdd46d601461027c57600080fd5b34610480576060366003190112610480576004356102986129ff565b604435916001600160801b039182841693848103610480576102b8614391565b6102c1836132ed565b61057f576102e583600052600b6020526001600160a01b0360406000205416331490565b9182158061056f575b6105505783600052602094600586526001600160a01b039081604060002054169480610544575b61051e5781831693841561050d5788156104f55761033287614453565b8281168a116104c1575091889161038e6103626103cb958a600052600b8c5260026040600020015460801c61474f565b89600052600b8b52600260406000200190836001600160801b031983549260801b169116178155613282565b906103aa818b8401511692826040818351169201511690613324565b16111561048f575b86600052600b88526001604060002001541692836143ed565b81847f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d876040518a8152a48133141580610485575b61041f575b6000805160206157e68339815191528484604051908152a1005b813b15610480576000805160206157e68339815191529460846000928360405195869485936313375c3b60e01b8552896004860152336024860152604485015260648401525af1610471575b80610405565b61047a90612b72565b3861046b565b600080fd5b50813b1515610400565b86600052600b8852604060002060018101600160a01b60ff60a01b1982541617905560ff60f01b1981541690556103b2565b60405163287ecaef60e21b8152600481018990526001600160801b03928316602482015291166044820152606490fd5b0390fd5b6024876040519063d2aabcd960e01b82526004820152fd5b600460405163630d074f60e11b8152fd5b606486838560405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b50848284161415610315565b60405163216caf0d60e01b815260048101859052336024820152604490fd5b506105798461476a565b156102ee565b60248360405190634a5541ef60e01b82526004820152fd5b346104805760003660031901126104805760206001600160a01b0360005416604051908152f35b346104805760203660031901126104805760206105dc60043561333d565b6040519015158152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260206001600160a01b0360016040600020015416604051908152f35b6024906040519062b8e7e760e51b82526004820152fd5b34610480576040366003190112610480576106806004356106716129ff565b61067a82614453565b9161448b565b005b346104805760403660031901126104805761069b6129e9565b6106a36129ff565b906001600160a01b03809116600052600860205260406000209116600052602052602060ff604060002054166040519015158152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57610715602091614453565b6001600160801b0360405191168152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b602052602060026040600020015460801c604051908152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260206001600160801b0360036040600020015416604051908152f35b3461048057602036600319011261048057600435600060206040516107ee81612b39565b828152015280600052600b60205260ff60016040600020015460a81c161561063b57600052600b6020526040806000205464ffffffffff82519161083183612b39565b818160a01c16835260c81c166020820152610862825180926020908164ffffffffff91828151168552015116910152565bf35b346104805760208060031936011261048057600435906108a261089d8360005260056020526001600160a01b0360406000205416151590565b612bd8565b60006001600160a01b03600a5416926044604051809581937fe9dc637500000000000000000000000000000000000000000000000000000000835230600484015260248301525afa91821561098b57600092610912575b5061090e6040519282849384528301906129c4565b0390f35b9091503d806000833e6109258183612b86565b81019082818303126104805780519067ffffffffffffffff8211610480570181601f8201121561048057805161095a81612ba8565b926109686040519485612b86565b81845284828401011161048057610984918480850191016129a1565b90826108f9565b6040513d6000823e3d90fd5b3461048057600319602036820112610480576004359067ffffffffffffffff9081831161048057610140908336030112610480576109d3614391565b604051916109e083612b1c565b6109ec81600401612a15565b83526109fa6024820161336e565b6020840152610a0b60448201612af3565b6040840152610a1c60648201612af3565b6060840152610a2d60848201612a15565b6080840152610a3e60a48201612bc4565b60a0840152610a4f60c48201612a15565b60c0840152610a613660e48301613454565b60e084015261012481013591821161048057013660238201121561048057602091610a99610aa4923690602460048201359101613380565b6101008201526138e5565b604051908152f35b3461048057604036600319011261048057600435610ac86129ff565b90610ad1614391565b80600052600b60205260ff60016040600020015460a81c161561063b578060005260056020526001600160a01b036040600020541691823303610b415761068092610b1b83614453565b6001600160801b038116610b30575b50612e6b565b610b3b90828561448b565b84610b2a565b60405163216caf0d60e01b815260048101839052336024820152604490fd5b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b602052602064ffffffffff60406000205460a01c16604051908152f35b3461048057600036600319011261048057602060405167016345785d8a00008152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260206001600160a01b0360406000205416604051908152f35b3461048057602036600319011261048057600435600052600b602052602060ff60016040600020015460a81c166040519015158152f35b3461048057608036600319011261048057610c786129e9565b610c806129ff565b6064359167ffffffffffffffff8311610480573660238401121561048057826004013591610cad83612ba8565b92610cbb6040519485612b86565b80845236602482870101116104805760208160009260246106809801838801378501015260443591612cf6565b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205261090e610d3460046040600020016131d5565b604051918291602083526020830190612a8f565b346104805760203660031901126104805760206105dc6004356132b6565b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57610da0906137e3565b6040516005821015610db3576020918152f35b634e487b7160e01b600052602160045260246000fd5b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260206001600160801b0360026040600020015416604051908152f35b3461048057602036600319011261048057610e376129e9565b6001600160a01b038060005416338103610ef557508116908160005260026020526001600160801b0360406000205416908115610ec45781610e969184600052600260205260406000206001600160801b0319815416905533906143ed565b6040519081527fca7a4a65a94ed2f37538814e00e1cd4c41a78261561e3f3794592f11409cf5af60203392a3005b602483604051907f8410168c0000000000000000000000000000000000000000000000000000000082526004820152fd5b6040516331b339a960e21b81526001600160a01b03919091166004820152336024820152604490fd5b346104805760603660031901126104805767ffffffffffffffff60043581811161048057610f50903690600401612a5e565b610f586129ff565b9260443590811161048057610f71903690600401612a5e565b9190610f7b614391565b828203610fe05760005b828110610f8e57005b806000805160206157e68339815191526020610fad600194878a61447b565b35610fd3610fc4610fbf868b8a61447b565b613440565b610fcc614391565b8b836144b8565b604051908152a101610f85565b50604491604051917faec9344000000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b34610480576040366003190112610480576110306129e9565b60243590811515809203610480576001600160a01b0316908133146110a457336000526008602052604060002082600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a3005b606460405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152fd5b3461048057600036600319011261048057604051600060045490600182811c918184169182156111ec575b60209485851084146111d65785879486865291826000146111b6575050600114611159575b5061114592500383612b86565b61090e6040519282849384528301906129c4565b84915060046000527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b906000915b85831061119e575050611145935082010185611138565b80548389018501528794508693909201918101611187565b60ff19168582015261114595151560051b85010192508791506111389050565b634e487b7160e01b600052602260045260246000fd5b92607f1692611113565b346104805760003660031901126104805760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b602052602064ffffffffff60406000205460c81c16604051908152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b576112be906137e3565b600581101580610db357600282149081156112fa575b81156112e8575b6020826040519015158152f35b9050610db357600460209114826112db565b50506003811460006112d4565b34610480576020366003190112610480576004356001600160a01b0390818116809103610480578160005416338103610ef5575060015491816001600160a01b03198416176001556040519216825260208201527fdcb09aef4bf01068924ccce937981cbe59d25ba08380cf941aaaea4e4bd3960d60403392a2005b346104805760203660031901126104805760606101406040516113a581612b55565b60008152600060208201526000604082015260008382015260006080820152600060a0820152600060c0820152600060e082015260006101008201526113e9613263565b6101208201520152600435600052600b60205260ff60016040600020015460a81c16156115d857600435600052600b60205260406000206114cc60046040519261143284612b55565b80546001600160a01b038116855264ffffffffff8160a01c16602086015264ffffffffff8160c81c16604086015260ff8160f01c161515606086015260f81c1515608085015260ff60018201546001600160a01b03811660a0870152818160a01c16151560c0870152818160a81c16151560e087015260b01c1615156101008501526114c060028201613282565b610120850152016131d5565b6101408201526114dd6004356137e3565b906005821015610db357600261014092146115cc575b61090e604051928392602084526001600160a01b03815116602085015264ffffffffff602082015116604085015264ffffffffff60408201511660608501526060810151151560808501526080810151151560a08501526001600160a01b0360a08201511660c085015260c0810151151560e085015260e0810151151561010085015261010081015115156101208501526115b861012082015183860190604090816001600160801b0391828151168552826020820151166020860152015116910152565b01516101a0808401526101c0830190612a8f565b600060608201526114f3565b602460405162b8e7e760e51b81526004356004820152fd5b34610480576020806003193601126104805760043567ffffffffffffffff811161048057611622903690600401612a5e565b9061162b614391565b6000915b80831061163857005b61164383828461447b565b359261164d614391565b611656846132ed565b156116735760248460405190634a5541ef60e01b82526004820152fd5b61167f8492939461333d565b6118b6576116a382600052600b6020526001600160a01b0360406000205416331490565b15610b41576116b182613483565b82600052600b8087526116ca6002604060002001613282565b906001600160801b039283835116848216101561189e578560005281895260ff60406000205460f01c1615611886579061173882858b61172e7f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa509683895116613324565b9601511690613324565b9580600052818a526040600020938a855498600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8b16178755600388821697881561186c575b0197831697886001600160801b03198254161790556001600160a01b03809a16958691600584528b604060002054169687945260019b8c6040600020015416946117cb8b85886143ed565b604080518881526001600160801b0392831660208201529290911690820152606090a46000805160206157e68339815191528a604051838152a1813b611819575b505050505001919061162f565b813b15610480576000608492819560405197889687956372eba20360e01b875260048701526024860152604485015260648401525af161185d575b8080808061180c565b61186690612b72565b85611854565b60018101600160a01b60ff60a01b19825416179055611780565b602486604051906339c6dc7360e21b82526004820152fd5b602486604051906322cad1af60e11b82526004820152fd5b6024826040519063fe19f19f60e01b82526004820152fd5b346104805760208060031936011261048057600435906118ec614391565b81600052600b815260ff60016040600020015460a81c1615611aa357611911826137e3565b6005811015610db3576004810361193a5760248360405190634a5541ef60e01b82526004820152fd5b6003810361195a576024836040519063fe19f19f60e01b82526004820152fd5b600214611a8b5761198182600052600b6020526001600160a01b0360406000205416331490565b15610b415781600052600b815260ff60406000205460f01c1615611a735781600052600b8152604060002060ff60f01b19815416905560405191807f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f600080a2600582526001600160a01b036040600020541692833b611a16575b6000805160206157e68339815191528383604051908152a1005b833b1561048057600081602481836000805160206157e6833981519152987f341a0bd90000000000000000000000000000000000000000000000000000000083528760048401525af1156119fc57611a6d90612b72565b836119fc565b602482604051906339c6dc7360e21b82526004820152fd5b602482604051906322cad1af60e11b82526004820152fd5b6024826040519062b8e7e760e51b82526004820152fd5b34610480576020366003190112610480576004356001600160a01b0390818116809103610480578160005416338103610ef55750600a5491816001600160a01b0319841617600a556040519216825260208201527fa2548bd4b805e907c1558a47b5858324fe8bb4a2e1ddfca647eecbf65610eebc60403392a26009546000198101908111611b765760407f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c91815190600182526020820152a1005b634e487b7160e01b600052601160045260246000fd5b3461048057602036600319011261048057611ba56129e9565b6000546001600160a01b0380821692338403611bf7576001600160a01b03199350169182911617600055337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf80600080a3005b6040516331b339a960e21b81526001600160a01b0385166004820152336024820152604490fd5b34610480576020366003190112610480576001600160a01b03611c3f6129e9565b168015611c5e5760005260066020526020604060002054604051908152f35b608460405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e657200000000000000000000000000000000000000000000006064820152fd5b3461048057602036600319011261048057600435611cff61089d8260005260056020526001600160a01b0360406000205416151590565b600052600560205260206001600160a01b0360406000205416604051908152f35b34610480576020366003190112610480576020611d3e600435612c23565b6001600160a01b0360405191168152f35b346104805760003660031901126104805760206001600160a01b0360015416604051908152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b5761071560209161386a565b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b576000611dee826137e3565b6005811015610db357600203611e0c575b6020906040519015158152f35b50600052600b602052602060ff60406000205460f01c16611dff565b3461048057602036600319011261048057600435611e44614391565b611e4d816132ed565b15611f7557611e5b8161476a565b15611f5557611e6981612c23565b611e72826132b6565b159081611f4c575b81611f39575b50611f2157602081611ea06000805160206157e683398151915293612c23565b9080600052600783526001600160a01b036040600020926001600160a01b031993848154169055169182600052600684526040600020600019815401905581600052600584526040600020908154169055806000604051937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a48152a1005b60249060405190630da9b01360e01b82526004820152fd5b6001600160a01b03915016151582611e80565b60009150611e7a565b60405163216caf0d60e01b81526004810191909152336024820152604490fd5b602490604051907f817cd6390000000000000000000000000000000000000000000000000000000082526004820152fd5b3461048057611fb436612a29565b60405191602083019383851067ffffffffffffffff861117611fe0576106809460405260008452612cf6565b634e487b7160e01b600052604160045260246000fd5b346104805760203660031901126104805760206105dc6004356132ed565b34610480576020806003193601126104805760043590612032614391565b61203b826132ed565b156120585760248260405190634a5541ef60e01b82526004820152fd5b6120618261333d565b6118b65761208582600052600b6020526001600160a01b0360406000205416331490565b15610b415761209382613483565b9180600052600b82526120ac6002604060002001613282565b906001600160801b0393848351168582161015611a8b5781600052600b845260ff60406000205460f01c1615611a73578085856120ef6120f99483885116613324565b9501511690613324565b9080600052600b84526000805160206157e6833981519152604060002094855494600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff87161787556003888616978815612233575b0197811697886001600160801b03198254161790556001600160a01b038096169560058352867f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa508260406000205416978893600b875260016040600020015416946121bc8d85886143ed565b604080518a81526001600160801b0392831660208201529290911690820152606090a4604051838152a1813b6121ee57005b813b15610480576000608492819560405197889687956372eba20360e01b875260048701526024860152604485015260648401525af161222a57005b61068090612b72565b60018101600160a01b60ff60a01b19825416179055612150565b34610480576020366003190112610480576001600160a01b0361226e6129e9565b16600052600260205260206001600160801b0360406000205416604051908152f35b34610480576106806122a136612a29565b916122b46122af8433612d8c565b612c85565b612e6b565b34610480576000366003190112610480576020600954604051908152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57612311906137e3565b6005811015610db3578060209115908115612332575b506040519015158152f35b600191501482612327565b346104805760206003198181360112610480576004359067ffffffffffffffff9081831161048057610120833603918201126104805761237b614391565b6101048301359060221901811215610480578201600481013590828211610480576024016060820236038113610480576123b6913691613380565b918251906123c3826131bd565b916123d16040519384612b86565b808352601f196123e0826131bd565b018660005b8281106125a25750505064ffffffffff90814216946001600160801b03968761240d826134ee565b515116828a61241b846134ee565b510151168580604061242c866134ee565b510151168a0116906040519261244184612b00565b83528b8301526040820152612455876134ee565b5261245f866134ee565b5060019386855b8a8c87831061252157908b846001600160a01b038c60a48101358281169081900361048057610aa4956124e195612511946124a36024860161341f565b6124af6044870161341f565b6124bb6064880161342c565b916124c88860040161342c565b94846124d660848b01613440565b966040519d8e612b1c565b168c528d8c0152151560408b0152151560608a01521660808801521660a086015260c085015260c4369101613454565b60e08301526101008201526138e5565b8893858060406125558b866125458a8e9a61253c828d613511565b5151169a613511565b5101511694600019890190613511565b51015116816040612566888c613511565b510151160116916040519361257a85612b00565b8452830152604082015261258e828b613511565b52612599818a613511565b50018790612466565b6125aa613263565b8282880101520187906123e5565b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b5760209060009080600052600b8352604060002060ff815460f01c168061264b575b612622575b50506001600160801b0360405191168152f35b61264492506001600160801b03600261263e9201541691613483565b90613324565b828061260f565b5060ff600182015460a01c161561260a565b34610480576040366003190112610480576126766129e9565b602435906001600160a01b03808061268d85612c23565b1692169180831461278757803314908115612762575b50156126f8578260005260076020526040600020826001600160a01b03198254161790556126d083612c23565b167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b608460405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152fd5b9050600052600860205260406000203360005260205260ff60406000205416846126a3565b608460405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152fd5b34610480576020366003190112610480576020611d3e600435612c48565b3461048057600036600319011261048057604051600060035490600182811c918184169182156128c8575b60209485851084146111d65785879486865291826000146111b657505060011461286b575061114592500383612b86565b84915060036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b906000915b8583106128b0575050611145935082010185611138565b80548389018501528794508693909201918101612899565b92607f169261283a565b3461048057602036600319011261048057600435907fffffffff00000000000000000000000000000000000000000000000000000000821680920361048057817f80ac58cd0000000000000000000000000000000000000000000000000000000060209314908115612977575b811561294d575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501483612946565b7f5b5e139f000000000000000000000000000000000000000000000000000000008114915061293f565b60005b8381106129b45750506000910152565b81810151838201526020016129a4565b906020916129dd815180928185528580860191016129a1565b601f01601f1916010190565b600435906001600160a01b038216820361048057565b602435906001600160a01b038216820361048057565b35906001600160a01b038216820361048057565b6060906003190112610480576001600160a01b0390600435828116810361048057916024359081168103610480579060443590565b9181601f840112156104805782359167ffffffffffffffff8311610480576020808501948460051b01011161048057565b90815180825260208080930193019160005b828110612aaf575050505090565b835180516001600160801b031686528083015167ffffffffffffffff168684015260409081015164ffffffffff169086015260609094019392810192600101612aa1565b3590811515820361048057565b6060810190811067ffffffffffffffff821117611fe057604052565b610120810190811067ffffffffffffffff821117611fe057604052565b6040810190811067ffffffffffffffff821117611fe057604052565b610160810190811067ffffffffffffffff821117611fe057604052565b67ffffffffffffffff8111611fe057604052565b90601f8019910116810190811067ffffffffffffffff821117611fe057604052565b67ffffffffffffffff8111611fe057601f01601f191660200190565b35906001600160801b038216820361048057565b15612bdf57565b606460405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152fd5b60005260056020526001600160a01b0360406000205416612c45811515612bd8565b90565b612c6b61089d8260005260056020526001600160a01b0360406000205416151590565b60005260076020526001600160a01b036040600020541690565b15612c8c57565b608460405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f766564000000000000000000000000000000000000006064820152fd5b90612d1a939291612d0a6122af8433612d8c565b612d15838383612e6b565b613024565b15612d2157565b60405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b906001600160a01b038080612da084612c23565b16931691838314938415612dd3575b508315612dbd575b50505090565b612dc991929350612c48565b1614388080612db7565b909350600052600860205260406000208260005260205260ff604060002054169238612daf565b15612e0157565b608460405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152fd5b90612e949291612e7a83612c23565b916001600160a01b03948593848094169687911614612dfa565b1690811580612f8b57612ea6846132b6565b159081612f82575b5080612f79575b612f615791808492612ee36000805160206157e683398151915296602096612edc85612c23565b1614612dfa565b60009382855260078652604085206001600160a01b031990818154169055818652600687526040862060001981540190558286526040862060018154019055838652600587528260408720918254161790557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6040519580a48152a1565b60248360405190630da9b01360e01b82526004820152fd5b50831515612eb5565b90501538612eae565b608460405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152fd5b3d1561301f573d9061300582612ba8565b916130136040519384612b86565b82523d6000602084013e565b606090565b9290803b156131b45761308e916020916001600160a01b0394604051809581948293897f150b7a02000000000000000000000000000000000000000000000000000000009b8c865233600487015216602485015260448401526080606484015260848301906129c4565b03916000968791165af19082908261314d575b5050613127576130af612ff4565b805190816131225760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000161490565b909192506020813d82116131ac575b8161316960209383612b86565b810103126131a85751907fffffffff00000000000000000000000000000000000000000000000000000000821682036131a557509038806130a1565b80fd5b5080fd5b3d915061315c565b50505050600190565b67ffffffffffffffff8111611fe05760051b60200190565b9081546131e1816131bd565b926040936131f185519182612b86565b828152809460208092019260005281600020906000935b85851061321757505050505050565b6001848192845161322781612b00565b64ffffffffff87546001600160801b038116835267ffffffffffffffff8160801c168584015260c01c1686820152815201930194019391613208565b6040519061327082612b00565b60006040838281528260208201520152565b9060405161328f81612b00565b6040819360018154916001600160801b0392838116865260801c6020860152015416910152565b80600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260ff60016040600020015460b01c1690565b80600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260ff60016040600020015460a01c1690565b6001600160801b039182169082160391908211611b7657565b80600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260406000205460f81c90565b359064ffffffffff8216820361048057565b92919261338c826131bd565b60409461339b86519283612b86565b8195848352602080930191606080960285019481861161048057925b8584106133c75750505050505050565b8684830312610480578251906133dc82612b00565b6133e585612bc4565b8252858501359067ffffffffffffffff8216820361048057828792838b95015261341086880161336e565b868201528152019301926133b7565b3580151581036104805790565b356001600160a01b03811681036104805790565b356001600160801b03811681036104805790565b91908260409103126104805760405161346c81612b39565b602080829461347a81612a15565b84520135910152565b64ffffffffff80421682600052600b602052604060002091825482828260a01c1610156134e45760c81c1611156134d25760040154600110156134c957612c4590613525565b612c4590613714565b6001600160801b039150600201541690565b5050505050600090565b8051156134fb5760200190565b634e487b7160e01b600052603260045260246000fd5b80518210156134fb5760209160051b010190565b64ffffffffff90814216906000908152600b60205260409081812082519361354c85612b55565b8154956001600160a01b039182881687526020870197828160a01c168952828160c81c168789015260ff8160f01c161515606089015260f81c1515608088015260ff6001938486015490811660a08a0152818160a01c16151560c08a0152818160a81c16151560e08a015260b01c1615156101008801526101406135e660046135d760028801613282565b966101208b01978852016131d5565b97019187835280876135f8889a6134ee565b5101511693828288965b16106136dc57509161368c6136919284888161369698976001600160801b039e8f61362e8b8a51613511565b5151169d8a8f9b602061364b67ffffffffffffffff928d51613511565b5101511699848361365d848451613511565b51015116965081156136d05761367b92935051906000190190613511565b5101511680925b03169203166149e6565b614bc6565b614ad8565b9283136136af5750506136a983916149aa565b16011690565b5160200151929392831692841683101591506136cb9050575090565b905090565b50505051168092613682565b8094986001600160801b0390816136f48c8851613511565b51511601169801938282808a61370b898951613511565b51015116613602565b64ffffffffff613749600091838352600b60205280806040852054818160a01c1693849160c81c1603169181421603166149e6565b91808252600b602052600460408320018054156137cf5790829167ffffffffffffffff93526137a16020832054828452600b6020526136916001600160801b03968760026040882001541696879360801c1690614bc6565b9283136137b75750506137b3906149aa565b1690565b60029350604092508152600b60205220015460801c90565b602483634e487b7160e01b81526032600452fd5b80600052600b602052604060002060ff600182015460a01c1660001461380a575050600490565b805460f81c613863575460a01c64ffffffffff16421061385d5761382d81613483565b90600052600b6020526001600160801b03806002604060002001541691161060001461385857600190565b600290565b50600090565b5050600390565b80600052600b6020526138836002604060002001613282565b81600052600b602052604060002060ff600182015460a01c166000146138b657506001600160801b039150602001511690565b5460f81c6138c85750612c4590613483565b612c4591506001600160801b036040818351169201511690613324565b906001600160a01b036001541660206001600160a01b0360c0850151166024604051809481937fdcf844a700000000000000000000000000000000000000000000000000000000835260048301525afa801561098b57600090614198575b61396691506001600160801b0360a08501511690602060e08601510151916147d3565b6001600160801b0381511661010084015164ffffffffff602086015116821561416e5781518015614144577f00000000000000000000000000000000000000000000000000000000000000008111614113575064ffffffffff60406139ca846134ee565b510151168110156140bc5750600090819082815184905b808210614029575050505064ffffffffff421664ffffffffff8216811015613fe95750506001600160801b0316808203613fb25750506009549283600052600b6020526040600020916001600160801b0381511660028401906001600160801b03198254161790556001600160a01b0360c083015116600184015490750100000000000000000000000000000000000000000060408501511515928654927fffffffffffffffffff0000ff000000000000000000000000000000000000000076ff000000000000000000000000000000000000000000006060890151151560b01b16921617171760018601556001600160a01b0384511691610100850151926040613af3855195600019870190613511565b510151927fff000000000000000000000000000000000000000000000000000000000000007eff0000000000000000000000000000000000000000000000000000000000007dffffffffff0000000000000000000000000000000000000000000000000078ffffffffff000000000000000000000000000000000000000060208b015160a01b169660c81b169460f01b16911617171717845560005b818110613ee2575050600185016009556001600160a01b0360c08301511660005260026020526001600160801b0380604060002054168160208401511601166001600160a01b0360c0840151166000526040600020906001600160801b03198254161790556001600160a01b036080830151168015613e9e57613c31613c2b8760005260056020526001600160a01b0360406000205416151590565b15614346565b613c3a866132b6565b1580613e95575b80613e8d575b613e755760206000805160206157e683398151915291613c80613c2b8960005260056020526001600160a01b0360406000205416151590565b806000526006825260406000206001815401905587600052600582526040600020816001600160a01b0319825416179055876040519160007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4878152a1613d106001600160a01b0360c0840151166001600160801b038084511681602086015116011690309033906141cc565b6001600160801b0360408201511680613e46575b507fef3d668acee46576ad5d407c42ab4d0cde13f3cd70b28f09a0fb9e3bf5bf09cb613e036001600160a01b03845116926001600160a01b03608086015116946001600160a01b0360c08201511696613e3b613e1b60408401511515928c606086015115156001600160a01b0360e061010089015194549864ffffffffff6040519a613daf8c612b39565b818160a01c168c5260c81c1660208b01520151511695604051998a99610160948b523360208c015260408b0190604090816001600160801b0391828151168552826020820151166020860152015116910152565b60a089015260c08801528060e0880152860190612a8f565b926101008501906020908164ffffffffff91828151168552015116910152565b6101408301520390a4565b613e6f906001600160a01b0360c0850151166001600160a01b0360e086015151169033906141cc565b38613d24565b60248660405190630da9b01360e01b82526004820152fd5b506000613c47565b50801515613c41565b606460405162461bcd60e51b815260206004820152602060248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152fd5b613ef181610100860151613511565b519060048601549168010000000000000000831015611fe057600183018060048901558310156134fb5760019260048801600052602060002001906001600160801b03815116908254917fffffff00000000000000000000000000000000000000000000000000000000007cffffffffff000000000000000000000000000000000000000000000000604077ffffffffffffffff00000000000000000000000000000000602086015160801b1694015160c01b169316171717905501613b8f565b60449250604051917fd90b7e3900000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b6040517f210aec0e00000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b919350919361404d906001600160801b036140448588613511565b5151169061474f565b9364ffffffffff8060406140618685613511565b5101511694168085111561407f5750600184930191929190926139e1565b8385606492604051927f7b0bada8000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b64ffffffffff60406140cd846134ee565b5101516040517fb4c9e52c00000000000000000000000000000000000000000000000000000000815264ffffffffff938416600482015291169091166024820152604490fd5b602490604051907f4757689b0000000000000000000000000000000000000000000000000000000082526004820152fd5b60046040517f3952c64e000000000000000000000000000000000000000000000000000000008152fd5b60046040517f6095d3bc000000000000000000000000000000000000000000000000000000008152fd5b6020823d6020116141c4575b816141b160209383612b86565b810103126131a557506139669051613943565b3d91506141a4565b9290604051927f23b872dd0000000000000000000000000000000000000000000000000000000060208501526001600160a01b03809216602485015216604483015260648201526064815260a081019181831067ffffffffffffffff841117611fe05761423b9260405261423d565b565b6001600160a01b03169061429d60405161425681612b39565b6020938482527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564858301526000808587829751910182855af1614297612ff4565b91614912565b805191821591848315614322575b5050509050156142b85750565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b9193818094500103126131a8578201519081151582036131a55750803880846142ab565b1561434d57565b606460405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152fd5b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036143c357565b60046040517fa1c0d6e5000000000000000000000000000000000000000000000000000000008152fd5b916001600160a01b03604051927fa9059cbb000000000000000000000000000000000000000000000000000000006020850152166024830152604482015260448152608081019181831067ffffffffffffffff841117611fe05761423b9260405261423d565b612c45906144608161386a565b90600052600b60205260026040600020015460801c90613324565b91908110156134fb5760051b0190565b6144af6000805160206157e6833981519152936020936144a9614391565b836144b8565b604051908152a1565b906144c2826132ed565b614737576144e682600052600b6020526001600160a01b0360406000205416331490565b91821580614727575b611f55576000928184526020600581526001600160a01b0393604091858388205416938061471b575b6146f6578582169586156146e6576001600160801b03808a16998a156146cf5761454188614453565b8281168c116146a05750926145f58b89946001898e7f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d978f9a6145976145c0918c8552600b8b526002868620015460801c61474f565b8b8452600b8a5260028585200190836001600160801b031983549260801b169116178155613282565b906145db818a84015116928286818351169201511690613324565b161115614672575b888152600b87522001541696876143ed565b85518b8152a48133141580614668575b614612575b505050505050565b813b15614664576084929185915196879586946313375c3b60e01b86526004860152336024860152604485015260648401525af1614655575b808080808061460a565b61465e90612b72565b3861464b565b8480fd5b50813b1515614605565b888152600b8752818120838101600160a01b60ff60a01b1982541617905560ff60f01b1981541690556145e3565b865163287ecaef60e21b8152600481018a90526001600160801b03928316602482015291166044820152606490fd5b60248887519063d2aabcd960e01b82526004820152fd5b6004845163630d074f60e11b8152fd5b6064858784865192632dcbf6b960e11b84526004840152336024840152166044820152fd5b50838683161415614518565b506147318161476a565b156144ef565b60248260405190634a5541ef60e01b82526004820152fd5b9190916001600160801b0380809416911601918211611b7657565b60009080825260056020526001600160a01b0380604084205416928333149384156147af575b5050821561479d57505090565b9091506147aa3392612c48565b161490565b60ff9294509060409181526008602052818120338252602052205416913880614790565b9092916147de613263565b936001600160801b03928381169182156148ea5767016345785d8a00008082116148b35780851161487c575061482885614819819386615736565b16946020890195865284615736565b16918461483f60408901948086528287511661474f565b1610156148665761485884918261486195511690613324565b91511690613324565b168252565b634e487b7160e01b600052600160045260246000fd5b84604491604051917f4fea5c1a00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b60449250604051917f47152d6700000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b505050505090506040516148fd81612b00565b60008152600060208201526000604082015290565b919290156149735750815115614926575090565b3b1561492f5790565b606460405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b8251909150156149865750805190602001fd5b6104f19060405191829162461bcd60e51b83526020600484015260248301906129c4565b600081126149b55790565b602490604051907f2463f3d50000000000000000000000000000000000000000000000000000000082526004820152fd5b90600160ff1b808314908115614ace575b50614aa4576000821215614a9b57614a20826000035b6000831215614a9457826000039061566c565b917f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311614a5e5760009160001991181315614a5a575090565b0390565b604491604051917fd49c26b300000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b829061566c565b614a2082614a0d565b60046040517f9fe2b450000000000000000000000000000000000000000000000000000000008152fd5b90508114386149f7565b90600160ff1b808314908115614bbc575b50614b92576000821215614b8957614b12826000035b6000831215614b82578260000390615736565b917f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311614b4c5760009160001991181315614a5a575090565b604491604051917f120b5b4300000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b8290615736565b614b1282614aff565b60046040517fa6070c25000000000000000000000000000000000000000000000000000000008152fd5b9050811438614ae9565b80614be05750600090612c455750670de0b6b3a764000090565b90670de0b6b3a7640000808314614c2d575080614c05575050670de0b6b3a764000090565b670de0b6b3a76400008114614c2957614c2490613691612c4593615517565b614c63565b5090565b91505090565b8015614c4d576ec097ce7bc90715b34b9f10000000000590565b634e487b7160e01b600052601260045260246000fd5b6000811215614c925768033dd1780914b9711419811261385d57614c8990600003614c63565b612c4590614c33565b680a688906bd8affffff81136154e657670de0b6b3a764000080604092831b05907780000000000000000000000000000000000000000000000067ff0000000000000083166153c9575b66ff00000000000083166152c1575b65ff000000000083166151c1575b64ff0000000083166150c9575b63ff0000008316614fd9575b62ff00008316614ef1575b61ff008316614e11575b60ff8316614d3a575b02911c60bf031c90565b60808316614dff575b838316614ded575b60208316614ddb575b60108316614dc9575b60088316614db7575b60048316614da5575b60028316614d93575b6001831615614d30576801000000000000000102831c614d30565b6801000000000000000102831c614d78565b6801000000000000000302831c614d6f565b6801000000000000000602831c614d66565b6801000000000000000b02831c614d5d565b6801000000000000001602831c614d54565b6801000000000000002c02831c614d4b565b6801000000000000005902831c614d43565b6180008316614edf575b6140008316614ecd575b6120008316614ebb575b6110008316614ea9575b6108008316614e97575b6104008316614e85575b6102008316614e73575b610100831615614d2757680100000000000000b102831c614d27565b6801000000000000016302831c614e57565b680100000000000002c602831c614e4d565b6801000000000000058c02831c614e43565b68010000000000000b1702831c614e39565b6801000000000000162e02831c614e2f565b68010000000000002c5d02831c614e25565b680100000000000058b902831c614e1b565b628000008316614fc7575b624000008316614fb5575b622000008316614fa3575b621000008316614f91575b620800008316614f7f575b620400008316614f6d575b620200008316614f5b575b62010000831615614d1d576801000000000000b17202831c614d1d565b680100000000000162e402831c614f3e565b6801000000000002c5c802831c614f33565b68010000000000058b9102831c614f28565b680100000000000b172102831c614f1d565b68010000000000162e4302831c614f12565b680100000000002c5c8602831c614f07565b6801000000000058b90c02831c614efc565b638000000083166150b7575b634000000083166150a5575b63200000008316615093575b63100000008316615081575b6308000000831661506f575b6304000000831661505d575b6302000000831661504b575b6301000000831615614d125768010000000000b1721802831c614d12565b6801000000000162e43002831c61502d565b68010000000002c5c86002831c615021565b680100000000058b90c002831c615015565b6801000000000b17217f02831c615009565b680100000000162e42ff02831c614ffd565b6801000000002c5c85fe02831c614ff1565b68010000000058b90bfc02831c614fe5565b64800000000083166151af575b644000000000831661519d575b642000000000831661518b575b6410000000008316615179575b6408000000008316615167575b6404000000008316615155575b6402000000008316615143575b640100000000831615614d0657680100000000b17217f802831c614d06565b68010000000162e42ff102831c615124565b680100000002c5c85fe302831c615117565b6801000000058b90bfce02831c61510a565b68010000000b17217fbb02831c6150fd565b6801000000162e42fff002831c6150f0565b68010000002c5c8601cc02831c6150e3565b680100000058b90c0b4902831c6150d6565b6580000000000083166152af575b65400000000000831661529d575b65200000000000831661528b575b651000000000008316615279575b650800000000008316615267575b650400000000008316615255575b650200000000008316615243575b65010000000000831615614cf9576801000000b17218355102831c614cf9565b680100000162e430e5a202831c615223565b6801000002c5c863b73f02831c615215565b68010000058b90cf1e6e02831c615207565b680100000b1721bcfc9a02831c6151f9565b68010000162e43f4f83102831c6151eb565b680100002c5c89d5ec6d02831c6151dd565b6801000058b91b5bc9ae02831c6151cf565b668000000000000083166153b7575b664000000000000083166153a5575b66200000000000008316615393575b66100000000000008316615381575b6608000000000000831661536f575b6604000000000000831661535d575b6602000000000000831661534b575b6601000000000000831615614ceb5768010000b17255775c0402831c614ceb565b6801000162e525ee054702831c61532a565b68010002c5cc37da949202831c61531b565b680100058ba01fb9f96d02831c61530c565b6801000b175effdc76ba02831c6152fd565b680100162f3904051fa102831c6152ee565b6801002c605e2e8cec5002831c6152df565b68010058c86da1c09ea202831c6152d0565b67800000000000000083166154c7575b67400000000000000083166154b5575b67200000000000000083166154a3575b6710000000000000008316615491575b670800000000000000831661547f575b670400000000000000831661546d575b670200000000000000831661545b575b670100000000000000831615614cdc57680100b1afa5abcbed6102831c614cdc565b68010163da9fb33356d802831c615439565b680102c9a3e778060ee702831c615429565b6801059b0d31585743ae02831c615419565b68010b5586cf9890f62a02831c615409565b6801172b83c7d517adce02831c6153f9565b6801306fe0a31b7152df02831c6153e9565b5077b504f333f9de6484800000000000000000000000000000006153d9565b602490604051907f0360d0280000000000000000000000000000000000000000000000000000000082526004820152fd5b8060008083131561563b57670de0b6b3a76400009283811261560457506001925b808305906001600160801b03821160071b91821c9167ffffffffffffffff831160061b92831c63ffffffff811160051b90811c61ffff811160041b90811c60ff811160031b90811c91600f831160021b92831c936001978860038711811b96871c11961717171717171781810294811d908282146155f857506706f05b59d3b20000905b8482136155cc5750505050500290565b808391020590671bc16d674ec800008212156155eb575b831d906155bc565b8091950194831d906155e3565b93505093925050020290565b6000199392508015615627576ec097ce7bc90715b34b9f10000000000591615538565b602482634e487b7160e01b81526012600452fd5b602483604051907f059b101b0000000000000000000000000000000000000000000000000000000082526004820152fd5b670de0b6b3a764000091600019838309928083029283808610950394808603951461572857828510156156ec57908291096001821901821680920460028082600302188083028203028083028203028083028203028083028203028083028203028092029003029360018380600003040190848311900302920304170290565b82606492604051927f63a05778000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b505080925015614c4d570490565b909190600019838209838202918280831092039180830392146157d457670de0b6b3a7640000908183101561579d57947faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066994950990828211900360ee1b910360121c170290565b60449086604051917f5173648d00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050670de0b6b3a76400009004915056fef8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7a164736f6c6343000815000a"; + hex"60c0346200046e57601f62005ca638819003918201601f19168301916001600160401b038311848410176200032b578084926080946040528339810103126200046e5780516001600160a01b038082169290918390036200046e5760208101518281168091036200046e5760408201519183831683036200046e5760600151936200008962000473565b90601d82527f5361626c696572205632204c6f636b75702044796e616d6963204e46540000006020830152620000be62000473565b601181527029a0a116ab1916a627a1a5aaa816a22ca760791b602082015230608052600080546001600160a01b03199081168417825560018054909116909517909455927fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a38051906001600160401b0382116200032b5760035490600182811c9216801562000463575b60208310146200044d5781601f849311620003d8575b50602090601f83116001146200034d5760009262000341575b50508160011b916000199060031b1c1916176003555b80516001600160401b0381116200032b576004918254600181811c9116801562000320575b60208210146200030b579081601f849311620002b3575b50602090601f831160011462000248576000926200023c575b50508160011b916000199060031b1c19161790555b1660018060a01b0319600a541617600a5560a052600160095560405161581290816200049482396080518161526e015260a05181818161120e01526147ce0152f35b015190503880620001e5565b6000858152602081209350601f198516905b8181106200029a575090846001959493921062000280575b505050811b019055620001fa565b015160001960f88460031b161c1916905538808062000272565b929360206001819287860151815501950193016200025a565b909150836000526020600020601f840160051c8101916020851062000300575b90601f859493920160051c01905b818110620002f05750620001cc565b60008155849350600101620002e1565b9091508190620002d3565b602284634e487b7160e01b6000525260246000fd5b90607f1690620001b5565b634e487b7160e01b600052604160045260246000fd5b0151905038806200017a565b600360009081527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b9350601f198516905b818110620003bf5750908460019594939210620003a5575b505050811b0160035562000190565b015160001960f88460031b161c1916905538808062000396565b929360206001819287860151815501950193016200037e565b60036000529091507fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f840160051c8101916020851062000442575b90601f859493920160051c01905b81811062000432575062000161565b6000815584935060010162000423565b909150819062000415565b634e487b7160e01b600052602260045260246000fd5b91607f16916200014b565b600080fd5b60408051919082016001600160401b038111838210176200032b5760405256fe608080604052600436101561001357600080fd5b60003560e01c90816301ffc9a7146128d25750806306fdde031461280f578063081812fc146127f1578063095ea7b31461265d5780631400ecec146125b8578063168444561461233d5780631c1cdd4c146122d75780631e99d569146122b957806323b872dd1461229057806339a73c031461224d57806340e58ee514612014578063425d30dd14611ff657806342842e0e14611fa657806342966c6814611e285780634857501f14611db25780634869e12d14611d765780635fe3b56714611d4f5780636352211e14611d205780636d0cee7514611cc857806370a0823114611c1e57806375829def14611b8c5780637cad6cd114611aba5780637de6b1db146118ce5780638659c270146115f0578063894e9a0d146113835780638bad38dd146113075780638f69b993146112845780639067b677146112315780639188ec84146111f657806395d89b41146110e8578063a22cb46514611017578063a2ffb89714610f1e578063a6202bf214610e1e578063a80fc07114610dc9578063ad35efd414610d66578063b256456914610d48578063b637b86514610ce8578063b88d4fde14610c5f578063b8a3be6614610c28578063b971302a14610bd6578063bc063e1a14610bb3578063bc2be1be14610b60578063c156a11d14610aac578063c33cd35e14610997578063c87b56dd14610864578063cc364f48146107ca578063d4dbd20b14610775578063d511609f14610726578063d975dfed146106d9578063e985e9c514610682578063ea5ead1914610652578063eac8f5b8146105e6578063f590c176146105be578063f851a440146105975763fdd46d601461027c57600080fd5b34610480576060366003190112610480576004356102986129ff565b604435916001600160801b039182841693848103610480576102b8615264565b6102c1836132ed565b61057f576102e583600052600b6020526001600160a01b0360406000205416331490565b9182158061056f575b6105505783600052602094600586526001600160a01b039081604060002054169480610544575b61051e5781831693841561050d5788156104f55761033287615326565b8281168a116104c1575091889161038e6103626103cb958a600052600b8c5260026040600020015460801c615622565b89600052600b8b52600260406000200190836001600160801b031983549260801b169116178155613282565b906103aa818b8401511692826040818351169201511690613324565b16111561048f575b86600052600b88526001604060002001541692836152c0565b81847f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d876040518a8152a48133141580610485575b61041f575b6000805160206157e68339815191528484604051908152a1005b813b15610480576000805160206157e68339815191529460846000928360405195869485936313375c3b60e01b8552896004860152336024860152604485015260648401525af1610471575b80610405565b61047a90612b72565b3861046b565b600080fd5b50813b1515610400565b86600052600b8852604060002060018101600160a01b60ff60a01b1982541617905560ff60f01b1981541690556103b2565b60405163287ecaef60e21b8152600481018990526001600160801b03928316602482015291166044820152606490fd5b0390fd5b6024876040519063d2aabcd960e01b82526004820152fd5b600460405163630d074f60e11b8152fd5b606486838560405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b50848284161415610315565b60405163216caf0d60e01b815260048101859052336024820152604490fd5b506105798461563d565b156102ee565b60248360405190634a5541ef60e01b82526004820152fd5b346104805760003660031901126104805760206001600160a01b0360005416604051908152f35b346104805760203660031901126104805760206105dc60043561333d565b6040519015158152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260206001600160a01b0360016040600020015416604051908152f35b6024906040519062b8e7e760e51b82526004820152fd5b34610480576040366003190112610480576106806004356106716129ff565b61067a82615326565b9161535e565b005b346104805760403660031901126104805761069b6129e9565b6106a36129ff565b906001600160a01b03809116600052600860205260406000209116600052602052602060ff604060002054166040519015158152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57610715602091615326565b6001600160801b0360405191168152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b602052602060026040600020015460801c604051908152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260206001600160801b0360036040600020015416604051908152f35b3461048057602036600319011261048057600435600060206040516107ee81612b39565b828152015280600052600b60205260ff60016040600020015460a81c161561063b57600052600b6020526040806000205464ffffffffff82519161083183612b39565b818160a01c16835260c81c166020820152610862825180926020908164ffffffffff91828151168552015116910152565bf35b346104805760208060031936011261048057600435906108a261089d8360005260056020526001600160a01b0360406000205416151590565b612bd8565b60006001600160a01b03600a5416926044604051809581937fe9dc637500000000000000000000000000000000000000000000000000000000835230600484015260248301525afa91821561098b57600092610912575b5061090e6040519282849384528301906129c4565b0390f35b9091503d806000833e6109258183612b86565b81019082818303126104805780519067ffffffffffffffff8211610480570181601f8201121561048057805161095a81612ba8565b926109686040519485612b86565b81845284828401011161048057610984918480850191016129a1565b90826108f9565b6040513d6000823e3d90fd5b3461048057600319602036820112610480576004359067ffffffffffffffff9081831161048057610140908336030112610480576109d3615264565b604051916109e083612b1c565b6109ec81600401612a15565b83526109fa6024820161336e565b6020840152610a0b60448201612af3565b6040840152610a1c60648201612af3565b6060840152610a2d60848201612a15565b6080840152610a3e60a48201612bc4565b60a0840152610a4f60c48201612a15565b60c0840152610a613660e48301613454565b60e084015261012481013591821161048057013660238201121561048057602091610a99610aa4923690602460048201359101613380565b610100820152614720565b604051908152f35b3461048057604036600319011261048057600435610ac86129ff565b90610ad1615264565b80600052600b60205260ff60016040600020015460a81c161561063b578060005260056020526001600160a01b036040600020541691823303610b415761068092610b1b83615326565b6001600160801b038116610b30575b50612e6b565b610b3b90828561535e565b84610b2a565b60405163216caf0d60e01b815260048101839052336024820152604490fd5b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b602052602064ffffffffff60406000205460a01c16604051908152f35b3461048057600036600319011261048057602060405167016345785d8a00008152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260206001600160a01b0360406000205416604051908152f35b3461048057602036600319011261048057600435600052600b602052602060ff60016040600020015460a81c166040519015158152f35b3461048057608036600319011261048057610c786129e9565b610c806129ff565b6064359167ffffffffffffffff8311610480573660238401121561048057826004013591610cad83612ba8565b92610cbb6040519485612b86565b80845236602482870101116104805760208160009260246106809801838801378501015260443591612cf6565b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205261090e610d3460046040600020016131d5565b604051918291602083526020830190612a8f565b346104805760203660031901126104805760206105dc6004356132b6565b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57610da090614624565b6040516005821015610db3576020918152f35b634e487b7160e01b600052602160045260246000fd5b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260206001600160801b0360026040600020015416604051908152f35b3461048057602036600319011261048057610e376129e9565b6001600160a01b038060005416338103610ef557508116908160005260026020526001600160801b0360406000205416908115610ec45781610e969184600052600260205260406000206001600160801b0319815416905533906152c0565b6040519081527fca7a4a65a94ed2f37538814e00e1cd4c41a78261561e3f3794592f11409cf5af60203392a3005b602483604051907f8410168c0000000000000000000000000000000000000000000000000000000082526004820152fd5b6040516331b339a960e21b81526001600160a01b03919091166004820152336024820152604490fd5b346104805760603660031901126104805767ffffffffffffffff60043581811161048057610f50903690600401612a5e565b610f586129ff565b9260443590811161048057610f71903690600401612a5e565b9190610f7b615264565b828203610fe05760005b828110610f8e57005b806000805160206157e68339815191526020610fad600194878a61534e565b35610fd3610fc4610fbf868b8a61534e565b613440565b610fcc615264565b8b8361538b565b604051908152a101610f85565b50604491604051917faec9344000000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b34610480576040366003190112610480576110306129e9565b60243590811515809203610480576001600160a01b0316908133146110a457336000526008602052604060002082600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a3005b606460405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152fd5b3461048057600036600319011261048057604051600060045490600182811c918184169182156111ec575b60209485851084146111d65785879486865291826000146111b6575050600114611159575b5061114592500383612b86565b61090e6040519282849384528301906129c4565b84915060046000527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b906000915b85831061119e575050611145935082010185611138565b80548389018501528794508693909201918101611187565b60ff19168582015261114595151560051b85010192508791506111389050565b634e487b7160e01b600052602260045260246000fd5b92607f1692611113565b346104805760003660031901126104805760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b602052602064ffffffffff60406000205460c81c16604051908152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b576112be90614624565b600581101580610db357600282149081156112fa575b81156112e8575b6020826040519015158152f35b9050610db357600460209114826112db565b50506003811460006112d4565b34610480576020366003190112610480576004356001600160a01b0390818116809103610480578160005416338103610ef5575060015491816001600160a01b03198416176001556040519216825260208201527fdcb09aef4bf01068924ccce937981cbe59d25ba08380cf941aaaea4e4bd3960d60403392a2005b346104805760203660031901126104805760606101406040516113a581612b55565b60008152600060208201526000604082015260008382015260006080820152600060a0820152600060c0820152600060e082015260006101008201526113e9613263565b6101208201520152600435600052600b60205260ff60016040600020015460a81c16156115d857600435600052600b60205260406000206114cc60046040519261143284612b55565b80546001600160a01b038116855264ffffffffff8160a01c16602086015264ffffffffff8160c81c16604086015260ff8160f01c161515606086015260f81c1515608085015260ff60018201546001600160a01b03811660a0870152818160a01c16151560c0870152818160a81c16151560e087015260b01c1615156101008501526114c060028201613282565b610120850152016131d5565b6101408201526114dd600435614624565b906005821015610db357600261014092146115cc575b61090e604051928392602084526001600160a01b03815116602085015264ffffffffff602082015116604085015264ffffffffff60408201511660608501526060810151151560808501526080810151151560a08501526001600160a01b0360a08201511660c085015260c0810151151560e085015260e0810151151561010085015261010081015115156101208501526115b861012082015183860190604090816001600160801b0391828151168552826020820151166020860152015116910152565b01516101a0808401526101c0830190612a8f565b600060608201526114f3565b602460405162b8e7e760e51b81526004356004820152fd5b34610480576020806003193601126104805760043567ffffffffffffffff811161048057611622903690600401612a5e565b9061162b615264565b6000915b80831061163857005b61164383828461534e565b359261164d615264565b611656846132ed565b156116735760248460405190634a5541ef60e01b82526004820152fd5b61167f8492939461333d565b6118b6576116a382600052600b6020526001600160a01b0360406000205416331490565b15610b41576116b182613483565b82600052600b8087526116ca6002604060002001613282565b906001600160801b039283835116848216101561189e578560005281895260ff60406000205460f01c1615611886579061173882858b61172e7f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa509683895116613324565b9601511690613324565b9580600052818a526040600020938a855498600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8b16178755600388821697881561186c575b0197831697886001600160801b03198254161790556001600160a01b03809a16958691600584528b604060002054169687945260019b8c6040600020015416946117cb8b85886152c0565b604080518881526001600160801b0392831660208201529290911690820152606090a46000805160206157e68339815191528a604051838152a1813b611819575b505050505001919061162f565b813b15610480576000608492819560405197889687956372eba20360e01b875260048701526024860152604485015260648401525af161185d575b8080808061180c565b61186690612b72565b85611854565b60018101600160a01b60ff60a01b19825416179055611780565b602486604051906339c6dc7360e21b82526004820152fd5b602486604051906322cad1af60e11b82526004820152fd5b6024826040519063fe19f19f60e01b82526004820152fd5b346104805760208060031936011261048057600435906118ec615264565b81600052600b815260ff60016040600020015460a81c1615611aa35761191182614624565b6005811015610db3576004810361193a5760248360405190634a5541ef60e01b82526004820152fd5b6003810361195a576024836040519063fe19f19f60e01b82526004820152fd5b600214611a8b5761198182600052600b6020526001600160a01b0360406000205416331490565b15610b415781600052600b815260ff60406000205460f01c1615611a735781600052600b8152604060002060ff60f01b19815416905560405191807f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f600080a2600582526001600160a01b036040600020541692833b611a16575b6000805160206157e68339815191528383604051908152a1005b833b1561048057600081602481836000805160206157e6833981519152987f341a0bd90000000000000000000000000000000000000000000000000000000083528760048401525af1156119fc57611a6d90612b72565b836119fc565b602482604051906339c6dc7360e21b82526004820152fd5b602482604051906322cad1af60e11b82526004820152fd5b6024826040519062b8e7e760e51b82526004820152fd5b34610480576020366003190112610480576004356001600160a01b0390818116809103610480578160005416338103610ef55750600a5491816001600160a01b0319841617600a556040519216825260208201527fa2548bd4b805e907c1558a47b5858324fe8bb4a2e1ddfca647eecbf65610eebc60403392a26009546000198101908111611b765760407f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c91815190600182526020820152a1005b634e487b7160e01b600052601160045260246000fd5b3461048057602036600319011261048057611ba56129e9565b6000546001600160a01b0380821692338403611bf7576001600160a01b03199350169182911617600055337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf80600080a3005b6040516331b339a960e21b81526001600160a01b0385166004820152336024820152604490fd5b34610480576020366003190112610480576001600160a01b03611c3f6129e9565b168015611c5e5760005260066020526020604060002054604051908152f35b608460405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e657200000000000000000000000000000000000000000000006064820152fd5b3461048057602036600319011261048057600435611cff61089d8260005260056020526001600160a01b0360406000205416151590565b600052600560205260206001600160a01b0360406000205416604051908152f35b34610480576020366003190112610480576020611d3e600435612c23565b6001600160a01b0360405191168152f35b346104805760003660031901126104805760206001600160a01b0360015416604051908152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b576107156020916146a5565b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b576000611dee82614624565b6005811015610db357600203611e0c575b6020906040519015158152f35b50600052600b602052602060ff60406000205460f01c16611dff565b3461048057602036600319011261048057600435611e44615264565b611e4d816132ed565b15611f7557611e5b8161563d565b15611f5557611e6981612c23565b611e72826132b6565b159081611f4c575b81611f39575b50611f2157602081611ea06000805160206157e683398151915293612c23565b9080600052600783526001600160a01b036040600020926001600160a01b031993848154169055169182600052600684526040600020600019815401905581600052600584526040600020908154169055806000604051937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a48152a1005b60249060405190630da9b01360e01b82526004820152fd5b6001600160a01b03915016151582611e80565b60009150611e7a565b60405163216caf0d60e01b81526004810191909152336024820152604490fd5b602490604051907f817cd6390000000000000000000000000000000000000000000000000000000082526004820152fd5b3461048057611fb436612a29565b60405191602083019383851067ffffffffffffffff861117611fe0576106809460405260008452612cf6565b634e487b7160e01b600052604160045260246000fd5b346104805760203660031901126104805760206105dc6004356132ed565b34610480576020806003193601126104805760043590612032615264565b61203b826132ed565b156120585760248260405190634a5541ef60e01b82526004820152fd5b6120618261333d565b6118b65761208582600052600b6020526001600160a01b0360406000205416331490565b15610b415761209382613483565b9180600052600b82526120ac6002604060002001613282565b906001600160801b0393848351168582161015611a8b5781600052600b845260ff60406000205460f01c1615611a73578085856120ef6120f99483885116613324565b9501511690613324565b9080600052600b84526000805160206157e6833981519152604060002094855494600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff87161787556003888616978815612233575b0197811697886001600160801b03198254161790556001600160a01b038096169560058352867f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa508260406000205416978893600b875260016040600020015416946121bc8d85886152c0565b604080518a81526001600160801b0392831660208201529290911690820152606090a4604051838152a1813b6121ee57005b813b15610480576000608492819560405197889687956372eba20360e01b875260048701526024860152604485015260648401525af161222a57005b61068090612b72565b60018101600160a01b60ff60a01b19825416179055612150565b34610480576020366003190112610480576001600160a01b0361226e6129e9565b16600052600260205260206001600160801b0360406000205416604051908152f35b34610480576106806122a136612a29565b916122b46122af8433612d8c565b612c85565b612e6b565b34610480576000366003190112610480576020600954604051908152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b5761231190614624565b6005811015610db3578060209115908115612332575b506040519015158152f35b600191501482612327565b346104805760206003198181360112610480576004359067ffffffffffffffff9081831161048057610120833603918201126104805761237b615264565b6101048301359060221901811215610480578201600481013590828211610480576024016060820236038113610480576123b6913691613380565b918251906123c3826131bd565b916123d16040519384612b86565b808352601f196123e0826131bd565b018660005b8281106125a25750505064ffffffffff90814216946001600160801b03968761240d826134ee565b515116828a61241b846134ee565b510151168580604061242c866134ee565b510151168a0116906040519261244184612b00565b83528b8301526040820152612455876134ee565b5261245f866134ee565b5060019386855b8a8c87831061252157908b846001600160a01b038c60a48101358281169081900361048057610aa4956124e195612511946124a36024860161341f565b6124af6044870161341f565b6124bb6064880161342c565b916124c88860040161342c565b94846124d660848b01613440565b966040519d8e612b1c565b168c528d8c0152151560408b0152151560608a01521660808801521660a086015260c085015260c4369101613454565b60e0830152610100820152614720565b8893858060406125558b866125458a8e9a61253c828d613511565b5151169a613511565b5101511694600019890190613511565b51015116816040612566888c613511565b510151160116916040519361257a85612b00565b8452830152604082015261258e828b613511565b52612599818a613511565b50018790612466565b6125aa613263565b8282880101520187906123e5565b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b5760209060009080600052600b8352604060002060ff815460f01c168061264b575b612622575b50506001600160801b0360405191168152f35b61264492506001600160801b03600261263e9201541691613483565b90613324565b828061260f565b5060ff600182015460a01c161561260a565b34610480576040366003190112610480576126766129e9565b602435906001600160a01b03808061268d85612c23565b1692169180831461278757803314908115612762575b50156126f8578260005260076020526040600020826001600160a01b03198254161790556126d083612c23565b167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b608460405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152fd5b9050600052600860205260406000203360005260205260ff60406000205416846126a3565b608460405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152fd5b34610480576020366003190112610480576020611d3e600435612c48565b3461048057600036600319011261048057604051600060035490600182811c918184169182156128c8575b60209485851084146111d65785879486865291826000146111b657505060011461286b575061114592500383612b86565b84915060036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b906000915b8583106128b0575050611145935082010185611138565b80548389018501528794508693909201918101612899565b92607f169261283a565b3461048057602036600319011261048057600435907fffffffff00000000000000000000000000000000000000000000000000000000821680920361048057817f80ac58cd0000000000000000000000000000000000000000000000000000000060209314908115612977575b811561294d575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501483612946565b7f5b5e139f000000000000000000000000000000000000000000000000000000008114915061293f565b60005b8381106129b45750506000910152565b81810151838201526020016129a4565b906020916129dd815180928185528580860191016129a1565b601f01601f1916010190565b600435906001600160a01b038216820361048057565b602435906001600160a01b038216820361048057565b35906001600160a01b038216820361048057565b6060906003190112610480576001600160a01b0390600435828116810361048057916024359081168103610480579060443590565b9181601f840112156104805782359167ffffffffffffffff8311610480576020808501948460051b01011161048057565b90815180825260208080930193019160005b828110612aaf575050505090565b835180516001600160801b031686528083015167ffffffffffffffff168684015260409081015164ffffffffff169086015260609094019392810192600101612aa1565b3590811515820361048057565b6060810190811067ffffffffffffffff821117611fe057604052565b610120810190811067ffffffffffffffff821117611fe057604052565b6040810190811067ffffffffffffffff821117611fe057604052565b610160810190811067ffffffffffffffff821117611fe057604052565b67ffffffffffffffff8111611fe057604052565b90601f8019910116810190811067ffffffffffffffff821117611fe057604052565b67ffffffffffffffff8111611fe057601f01601f191660200190565b35906001600160801b038216820361048057565b15612bdf57565b606460405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152fd5b60005260056020526001600160a01b0360406000205416612c45811515612bd8565b90565b612c6b61089d8260005260056020526001600160a01b0360406000205416151590565b60005260076020526001600160a01b036040600020541690565b15612c8c57565b608460405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f766564000000000000000000000000000000000000006064820152fd5b90612d1a939291612d0a6122af8433612d8c565b612d15838383612e6b565b613024565b15612d2157565b60405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b906001600160a01b038080612da084612c23565b16931691838314938415612dd3575b508315612dbd575b50505090565b612dc991929350612c48565b1614388080612db7565b909350600052600860205260406000208260005260205260ff604060002054169238612daf565b15612e0157565b608460405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152fd5b90612e949291612e7a83612c23565b916001600160a01b03948593848094169687911614612dfa565b1690811580612f8b57612ea6846132b6565b159081612f82575b5080612f79575b612f615791808492612ee36000805160206157e683398151915296602096612edc85612c23565b1614612dfa565b60009382855260078652604085206001600160a01b031990818154169055818652600687526040862060001981540190558286526040862060018154019055838652600587528260408720918254161790557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6040519580a48152a1565b60248360405190630da9b01360e01b82526004820152fd5b50831515612eb5565b90501538612eae565b608460405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152fd5b3d1561301f573d9061300582612ba8565b916130136040519384612b86565b82523d6000602084013e565b606090565b9290803b156131b45761308e916020916001600160a01b0394604051809581948293897f150b7a02000000000000000000000000000000000000000000000000000000009b8c865233600487015216602485015260448401526080606484015260848301906129c4565b03916000968791165af19082908261314d575b5050613127576130af612ff4565b805190816131225760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000161490565b909192506020813d82116131ac575b8161316960209383612b86565b810103126131a85751907fffffffff00000000000000000000000000000000000000000000000000000000821682036131a557509038806130a1565b80fd5b5080fd5b3d915061315c565b50505050600190565b67ffffffffffffffff8111611fe05760051b60200190565b9081546131e1816131bd565b926040936131f185519182612b86565b828152809460208092019260005281600020906000935b85851061321757505050505050565b6001848192845161322781612b00565b64ffffffffff87546001600160801b038116835267ffffffffffffffff8160801c168584015260c01c1686820152815201930194019391613208565b6040519061327082612b00565b60006040838281528260208201520152565b9060405161328f81612b00565b6040819360018154916001600160801b0392838116865260801c6020860152015416910152565b80600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260ff60016040600020015460b01c1690565b80600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260ff60016040600020015460a01c1690565b6001600160801b039182169082160391908211611b7657565b80600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260406000205460f81c90565b359064ffffffffff8216820361048057565b92919261338c826131bd565b60409461339b86519283612b86565b8195848352602080930191606080960285019481861161048057925b8584106133c75750505050505050565b8684830312610480578251906133dc82612b00565b6133e585612bc4565b8252858501359067ffffffffffffffff8216820361048057828792838b95015261341086880161336e565b868201528152019301926133b7565b3580151581036104805790565b356001600160a01b03811681036104805790565b356001600160801b03811681036104805790565b91908260409103126104805760405161346c81612b39565b602080829461347a81612a15565b84520135910152565b64ffffffffff80421682600052600b602052604060002091825482828260a01c1610156134e45760c81c1611156134d25760040154600110156134c957612c4590613525565b612c4590614555565b6001600160801b039150600201541690565b5050505050600090565b8051156134fb5760200190565b634e487b7160e01b600052603260045260246000fd5b80518210156134fb5760209160051b010190565b64ffffffffff90814216906000908152600b60205260409081812082519361354c85612b55565b8154956001600160a01b039182881687526020870197828160a01c168952828160c81c168789015260ff8160f01c161515606089015260f81c1515608088015260ff6001938486015490811660a08a0152818160a01c16151560c08a0152818160a81c16151560e08a015260b01c1615156101008801526101406135e660046135d760028801613282565b966101208b01978852016131d5565b97019187835280876135f8889a6134ee565b5101511693828288965b16106136dc57509161368c6136919284888161369698976001600160801b039e8f61362e8b8a51613511565b5151169d8a8f9b602061364b67ffffffffffffffff928d51613511565b5101511699848361365d848451613511565b51015116965081156136d05761367b92935051906000190190613511565b5101511680925b0316920316613750565b613abf565b613922565b9283136136af5750506136a98391613714565b16011690565b5160200151929392831692841683101591506136cb9050575090565b905090565b50505051168092613682565b8094986001600160801b0390816136f48c8851613511565b51511601169801938282808a61370b898951613511565b51015116613602565b6000811261371f5790565b602490604051907f2463f3d50000000000000000000000000000000000000000000000000000000082526004820152fd5b90600160ff1b808314908115613838575b5061380e5760008212156138055761378a826000035b60008312156137fe578260000390613842565b917f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83116137c857600091600019911813156137c4575090565b0390565b604491604051917fd49c26b300000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b8290613842565b61378a82613777565b60046040517f9fe2b450000000000000000000000000000000000000000000000000000000008152fd5b9050811438613761565b670de0b6b3a76400009160001983830992808302928380861095039480860395146138fe57828510156138c257908291096001821901821680920460028082600302188083028203028083028203028083028203028083028203028083028203028092029003029360018380600003040190848311900302920304170290565b82606492604051927f63a05778000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b50508092501561390c570490565b634e487b7160e01b600052601260045260246000fd5b90600160ff1b808314908115613a06575b506139dc5760008212156139d35761395c826000035b60008312156139cc578260000390613a10565b917f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831161399657600091600019911813156137c4575090565b604491604051917f120b5b4300000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b8290613a10565b61395c82613949565b60046040517fa6070c25000000000000000000000000000000000000000000000000000000008152fd5b9050811438613933565b90919060001983820983820291828083109203918083039214613aae57670de0b6b3a76400009081831015613a7757947faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066994950990828211900360ee1b910360121c170290565b60449086604051917f5173648d00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050670de0b6b3a764000090049150565b80613ad95750600090612c455750670de0b6b3a764000090565b90670de0b6b3a7640000808314613b26575080613afe575050670de0b6b3a764000090565b670de0b6b3a76400008114613b2257613b1d90613691612c4593614400565b613b46565b5090565b91505090565b801561390c576ec097ce7bc90715b34b9f10000000000590565b6000811215613b7b5768033dd1780914b97114198112613b7557613b6c90600003613b46565b612c4590613b2c565b50600090565b680a688906bd8affffff81136143cf57670de0b6b3a764000080604092831b05907780000000000000000000000000000000000000000000000067ff0000000000000083166142b2575b66ff00000000000083166141aa575b65ff000000000083166140aa575b64ff000000008316613fb2575b63ff0000008316613ec2575b62ff00008316613dda575b61ff008316613cfa575b60ff8316613c23575b02911c60bf031c90565b60808316613ce8575b838316613cd6575b60208316613cc4575b60108316613cb2575b60088316613ca0575b60048316613c8e575b60028316613c7c575b6001831615613c19576801000000000000000102831c613c19565b6801000000000000000102831c613c61565b6801000000000000000302831c613c58565b6801000000000000000602831c613c4f565b6801000000000000000b02831c613c46565b6801000000000000001602831c613c3d565b6801000000000000002c02831c613c34565b6801000000000000005902831c613c2c565b6180008316613dc8575b6140008316613db6575b6120008316613da4575b6110008316613d92575b6108008316613d80575b6104008316613d6e575b6102008316613d5c575b610100831615613c1057680100000000000000b102831c613c10565b6801000000000000016302831c613d40565b680100000000000002c602831c613d36565b6801000000000000058c02831c613d2c565b68010000000000000b1702831c613d22565b6801000000000000162e02831c613d18565b68010000000000002c5d02831c613d0e565b680100000000000058b902831c613d04565b628000008316613eb0575b624000008316613e9e575b622000008316613e8c575b621000008316613e7a575b620800008316613e68575b620400008316613e56575b620200008316613e44575b62010000831615613c06576801000000000000b17202831c613c06565b680100000000000162e402831c613e27565b6801000000000002c5c802831c613e1c565b68010000000000058b9102831c613e11565b680100000000000b172102831c613e06565b68010000000000162e4302831c613dfb565b680100000000002c5c8602831c613df0565b6801000000000058b90c02831c613de5565b63800000008316613fa0575b63400000008316613f8e575b63200000008316613f7c575b63100000008316613f6a575b63080000008316613f58575b63040000008316613f46575b63020000008316613f34575b6301000000831615613bfb5768010000000000b1721802831c613bfb565b6801000000000162e43002831c613f16565b68010000000002c5c86002831c613f0a565b680100000000058b90c002831c613efe565b6801000000000b17217f02831c613ef2565b680100000000162e42ff02831c613ee6565b6801000000002c5c85fe02831c613eda565b68010000000058b90bfc02831c613ece565b6480000000008316614098575b6440000000008316614086575b6420000000008316614074575b6410000000008316614062575b6408000000008316614050575b640400000000831661403e575b640200000000831661402c575b640100000000831615613bef57680100000000b17217f802831c613bef565b68010000000162e42ff102831c61400d565b680100000002c5c85fe302831c614000565b6801000000058b90bfce02831c613ff3565b68010000000b17217fbb02831c613fe6565b6801000000162e42fff002831c613fd9565b68010000002c5c8601cc02831c613fcc565b680100000058b90c0b4902831c613fbf565b658000000000008316614198575b654000000000008316614186575b652000000000008316614174575b651000000000008316614162575b650800000000008316614150575b65040000000000831661413e575b65020000000000831661412c575b65010000000000831615613be2576801000000b17218355102831c613be2565b680100000162e430e5a202831c61410c565b6801000002c5c863b73f02831c6140fe565b68010000058b90cf1e6e02831c6140f0565b680100000b1721bcfc9a02831c6140e2565b68010000162e43f4f83102831c6140d4565b680100002c5c89d5ec6d02831c6140c6565b6801000058b91b5bc9ae02831c6140b8565b668000000000000083166142a0575b6640000000000000831661428e575b6620000000000000831661427c575b6610000000000000831661426a575b66080000000000008316614258575b66040000000000008316614246575b66020000000000008316614234575b6601000000000000831615613bd45768010000b17255775c0402831c613bd4565b6801000162e525ee054702831c614213565b68010002c5cc37da949202831c614204565b680100058ba01fb9f96d02831c6141f5565b6801000b175effdc76ba02831c6141e6565b680100162f3904051fa102831c6141d7565b6801002c605e2e8cec5002831c6141c8565b68010058c86da1c09ea202831c6141b9565b67800000000000000083166143b0575b674000000000000000831661439e575b672000000000000000831661438c575b671000000000000000831661437a575b6708000000000000008316614368575b6704000000000000008316614356575b6702000000000000008316614344575b670100000000000000831615613bc557680100b1afa5abcbed6102831c613bc5565b68010163da9fb33356d802831c614322565b680102c9a3e778060ee702831c614312565b6801059b0d31585743ae02831c614302565b68010b5586cf9890f62a02831c6142f2565b6801172b83c7d517adce02831c6142e2565b6801306fe0a31b7152df02831c6142d2565b5077b504f333f9de6484800000000000000000000000000000006142c2565b602490604051907f0360d0280000000000000000000000000000000000000000000000000000000082526004820152fd5b8060008083131561452457670de0b6b3a7640000928381126144ed57506001925b808305906001600160801b03821160071b91821c9167ffffffffffffffff831160061b92831c63ffffffff811160051b90811c61ffff811160041b90811c60ff811160031b90811c91600f831160021b92831c936001978860038711811b96871c11961717171717171781810294811d908282146144e157506706f05b59d3b20000905b8482136144b55750505050500290565b808391020590671bc16d674ec800008212156144d4575b831d906144a5565b8091950194831d906144cc565b93505093925050020290565b6000199392508015614510576ec097ce7bc90715b34b9f10000000000591614421565b602482634e487b7160e01b81526012600452fd5b602483604051907f059b101b0000000000000000000000000000000000000000000000000000000082526004820152fd5b64ffffffffff61458a600091838352600b60205280806040852054818160a01c1693849160c81c160316918142160316613750565b91808252600b602052600460408320018054156146105790829167ffffffffffffffff93526145e26020832054828452600b6020526136916001600160801b03968760026040882001541696879360801c1690613abf565b9283136145f85750506145f490613714565b1690565b60029350604092508152600b60205220015460801c90565b602483634e487b7160e01b81526032600452fd5b80600052600b602052604060002060ff600182015460a01c1660001461464b575050600490565b805460f81c61469e575460a01c64ffffffffff164210613b755761466e81613483565b90600052600b6020526001600160801b03806002604060002001541691161060001461469957600190565b600290565b5050600390565b80600052600b6020526146be6002604060002001613282565b81600052600b602052604060002060ff600182015460a01c166000146146f157506001600160801b039150602001511690565b5460f81c6147035750612c4590613483565b612c4591506001600160801b036040818351169201511690613324565b906001600160a01b036001541660206001600160a01b0360c0850151166024604051809481937fdcf844a700000000000000000000000000000000000000000000000000000000835260048301525afa801561098b57600090614fd3575b6147a191506001600160801b0360a08501511690602060e08601510151916156a6565b6001600160801b0381511661010084015164ffffffffff6020860151168215614fa95781518015614f7f577f00000000000000000000000000000000000000000000000000000000000000008111614f4e575064ffffffffff6040614805846134ee565b51015116811015614ef75750600090819082815184905b808210614e64575050505064ffffffffff421664ffffffffff8216811015614e245750506001600160801b0316808203614ded5750506009549283600052600b6020526040600020916001600160801b0381511660028401906001600160801b03198254161790556001600160a01b0360c083015116600184015490750100000000000000000000000000000000000000000060408501511515928654927fffffffffffffffffff0000ff000000000000000000000000000000000000000076ff000000000000000000000000000000000000000000006060890151151560b01b16921617171760018601556001600160a01b038451169161010085015192604061492e855195600019870190613511565b510151927fff000000000000000000000000000000000000000000000000000000000000007eff0000000000000000000000000000000000000000000000000000000000007dffffffffff0000000000000000000000000000000000000000000000000078ffffffffff000000000000000000000000000000000000000060208b015160a01b169660c81b169460f01b16911617171717845560005b818110614d1d575050600185016009556001600160a01b0360c08301511660005260026020526001600160801b0380604060002054168160208401511601166001600160a01b0360c0840151166000526040600020906001600160801b03198254161790556001600160a01b036080830151168015614cd957614a6c614a668760005260056020526001600160a01b0360406000205416151590565b15615181565b614a75866132b6565b1580614cd0575b80614cc8575b614cb05760206000805160206157e683398151915291614abb614a668960005260056020526001600160a01b0360406000205416151590565b806000526006825260406000206001815401905587600052600582526040600020816001600160a01b0319825416179055876040519160007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4878152a1614b4b6001600160a01b0360c0840151166001600160801b03808451168160208601511601169030903390615007565b6001600160801b0360408201511680614c81575b507fef3d668acee46576ad5d407c42ab4d0cde13f3cd70b28f09a0fb9e3bf5bf09cb614c3e6001600160a01b03845116926001600160a01b03608086015116946001600160a01b0360c08201511696614c76614c5660408401511515928c606086015115156001600160a01b0360e061010089015194549864ffffffffff6040519a614bea8c612b39565b818160a01c168c5260c81c1660208b01520151511695604051998a99610160948b523360208c015260408b0190604090816001600160801b0391828151168552826020820151166020860152015116910152565b60a089015260c08801528060e0880152860190612a8f565b926101008501906020908164ffffffffff91828151168552015116910152565b6101408301520390a4565b614caa906001600160a01b0360c0850151166001600160a01b0360e08601515116903390615007565b38614b5f565b60248660405190630da9b01360e01b82526004820152fd5b506000614a82565b50801515614a7c565b606460405162461bcd60e51b815260206004820152602060248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152fd5b614d2c81610100860151613511565b519060048601549168010000000000000000831015611fe057600183018060048901558310156134fb5760019260048801600052602060002001906001600160801b03815116908254917fffffff00000000000000000000000000000000000000000000000000000000007cffffffffff000000000000000000000000000000000000000000000000604077ffffffffffffffff00000000000000000000000000000000602086015160801b1694015160c01b1693161717179055016149ca565b60449250604051917fd90b7e3900000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b6040517f210aec0e00000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b9193509193614e88906001600160801b03614e7f8588613511565b51511690615622565b9364ffffffffff806040614e9c8685613511565b51015116941680851115614eba57506001849301919291909261481c565b8385606492604051927f7b0bada8000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b64ffffffffff6040614f08846134ee565b5101516040517fb4c9e52c00000000000000000000000000000000000000000000000000000000815264ffffffffff938416600482015291169091166024820152604490fd5b602490604051907f4757689b0000000000000000000000000000000000000000000000000000000082526004820152fd5b60046040517f3952c64e000000000000000000000000000000000000000000000000000000008152fd5b60046040517f6095d3bc000000000000000000000000000000000000000000000000000000008152fd5b6020823d602011614fff575b81614fec60209383612b86565b810103126131a557506147a1905161477e565b3d9150614fdf565b9290604051927f23b872dd0000000000000000000000000000000000000000000000000000000060208501526001600160a01b03809216602485015216604483015260648201526064815260a081019181831067ffffffffffffffff841117611fe05761507692604052615078565b565b6001600160a01b0316906150d860405161509181612b39565b6020938482527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564858301526000808587829751910182855af16150d2612ff4565b916151cc565b80519182159184831561515d575b5050509050156150f35750565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b9193818094500103126131a8578201519081151582036131a55750803880846150e6565b1561518857565b606460405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152fd5b9192901561522d57508151156151e0575090565b3b156151e95790565b606460405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b8251909150156152405750805190602001fd5b6104f19060405191829162461bcd60e51b83526020600484015260248301906129c4565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361529657565b60046040517fa1c0d6e5000000000000000000000000000000000000000000000000000000008152fd5b916001600160a01b03604051927fa9059cbb000000000000000000000000000000000000000000000000000000006020850152166024830152604482015260448152608081019181831067ffffffffffffffff841117611fe05761507692604052615078565b612c4590615333816146a5565b90600052600b60205260026040600020015460801c90613324565b91908110156134fb5760051b0190565b6153826000805160206157e68339815191529360209361537c615264565b8361538b565b604051908152a1565b90615395826132ed565b61560a576153b982600052600b6020526001600160a01b0360406000205416331490565b918215806155fa575b611f55576000928184526020600581526001600160a01b039360409185838820541693806155ee575b6155c9578582169586156155b9576001600160801b03808a16998a156155a25761541488615326565b8281168c116155735750926154c88b89946001898e7f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d978f9a61546a615493918c8552600b8b526002868620015460801c615622565b8b8452600b8a5260028585200190836001600160801b031983549260801b169116178155613282565b906154ae818a84015116928286818351169201511690613324565b161115615545575b888152600b87522001541696876152c0565b85518b8152a4813314158061553b575b6154e5575b505050505050565b813b15615537576084929185915196879586946313375c3b60e01b86526004860152336024860152604485015260648401525af1615528575b80808080806154dd565b61553190612b72565b3861551e565b8480fd5b50813b15156154d8565b888152600b8752818120838101600160a01b60ff60a01b1982541617905560ff60f01b1981541690556154b6565b865163287ecaef60e21b8152600481018a90526001600160801b03928316602482015291166044820152606490fd5b60248887519063d2aabcd960e01b82526004820152fd5b6004845163630d074f60e11b8152fd5b6064858784865192632dcbf6b960e11b84526004840152336024840152166044820152fd5b508386831614156153eb565b506156048161563d565b156153c2565b60248260405190634a5541ef60e01b82526004820152fd5b9190916001600160801b0380809416911601918211611b7657565b60009080825260056020526001600160a01b038060408420541692833314938415615682575b5050821561567057505090565b90915061567d3392612c48565b161490565b60ff9294509060409181526008602052818120338252602052205416913880615663565b9092916156b1613263565b936001600160801b03928381169182156157bd5767016345785d8a00008082116157865780851161574f57506156fb856156ec819386613a10565b16946020890195865284613a10565b169184615712604089019480865282875116615622565b1610156157395761572b84918261573495511690613324565b91511690613324565b168252565b634e487b7160e01b600052600160045260246000fd5b84604491604051917f4fea5c1a00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b60449250604051917f47152d6700000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b505050505090506040516157d081612b00565b6000815260006020820152600060408201529056fef8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7a164736f6c6343000815000a"; bytes public constant BYTECODE_LOCKUP_LINEAR = - hex"60a034620003e757601f196001600160401b03601f62004c523881900382810185168601919084831187841017620003ec57808792606094604052833981010312620003e75783516001600160a01b03928382169291839003620003e7576020918287015196858816809803620003e75760400151948516809503620003e7576200008962000402565b90601c82527f5361626c696572205632204c6f636b7570204c696e656172204e46540000000084830152620000bd62000402565b601181527029a0a116ab1916a627a1a5aaa816a624a760791b8582015230608052600080546001600160a01b031990811688178255600180548216909b178b5596817fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a38351858111620003d35760039485548c81811c91168015620003c8575b89821014620003b45790818684931162000361575b508890868311600114620002f8578492620002ec575b505060001982871b1c1916908b1b1784555b8151948511620002d8576004958654998b8b811c9b168015620002cd575b828c1014620002ba57848b1162000271575b869798999a50819487116001146200020a57505093620001fe575b505082871b92600019911b1c19161790555b600a541617600a5560095560405161482f9081620004238239608051816143320152f35b015191503880620001c8565b8883528183208c9890969594939116915b8282106200025757505085116200023c575b50505050811b019055620001da565b01519060f884600019921b161c19169055388080806200022d565b8484015187558c989096019593840193908101906200021b565b87835281832085880160051c81019b838910620002af575b860160051c019a8c905b8c8110620002a3575050620001ad565b848155018c9062000293565b909b508b9062000289565b634e487b7160e01b835260228852602483fd5b9a607f169a6200019b565b634e487b7160e01b81526041600452602490fd5b0151905038806200016b565b908c8e9416918886528a862092865b8c82821062000341575050841162000328575b505050811b0184556200017d565b015160001983891b60f8161c191690553880806200031a565b91929395968291958786015181550195019301908f959493929162000307565b9091508684528884208680850160051c8201928b8610620003aa575b918f91869594930160051c01915b8281106200039b57505062000155565b8681558594508f91016200038b565b925081926200037d565b634e487b7160e01b84526022600452602484fd5b90607f169062000140565b634e487b7160e01b82526041600452602482fd5b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620003ec5760405256fe608080604052600436101561001357600080fd5b600090813560e01c90816301ffc9a714612dd45750806306fdde0314612d12578063081812fc14612cf3578063095ea7b314612b645780631400ecec14612ac45780631c1cdd4c14612a5f5780631e99d56914612a4157806323b872dd14612a1757806339a73c03146129d657806340e58ee514612738578063425d30dd1461271957806342842e0e146126c957806342966c681461253f5780634857501f146124b55780634869e12d1461247a5780635fe3b567146124535780636352211e146124235780636d0cee75146123cd57806370a082311461232457806375829def14612291578063780a82c8146122415780637cad6cd1146121705780637de6b1db14611f905780638659c27014611c6f578063894e9a0d14611a1b5780638bad38dd1461199e5780638f69b993146119025780639067b677146118af57806395d89b41146117a257806396ce143114611683578063a22cb465146115b2578063a2ffb897146111c5578063a6202bf2146110c8578063a80fc07114611076578063ab167ccc14610f3d578063ad35efd414610edb578063b256456914610ebc578063b88d4fde14610e32578063b8a3be6614610dfd578063b971302a14610dae578063bc063e1a14610d8b578063bc2be1be14610d3b578063c156a11d146109c1578063c87b56dd14610887578063cc364f48146107d9578063d4dbd20b14610787578063d511609f1461073b578063d975dfed146106ef578063e985e9c51461069a578063ea5ead1914610674578063eac8f5b81461060b578063f590c176146105e2578063f851a440146105bc5763fdd46d601461027357600080fd5b346105b95760603660031901126105b95760043561028f612f03565b610297613043565b906102a0614328565b6102a9836136d3565b6105a1576102cd83600052600b6020526001600160a01b0360406000205416331490565b90811580610591575b61057257838552602092600584526001600160a01b0391826040882054169380610566575b61054057828116928315610516576001600160801b038084169384156104fe57610324896143ea565b82811686116104ca5750938093926103ca9261038f6103578d9a99988d8c52600b8d52600260408d20015460801c614438565b8c8b52600b8c5261038a600260408d20019182906001600160801b036001600160801b031983549260801b169116179055565b613668565b906103ab818c840151169282604081835116920151169061370a565b16111561049a575b898852600b89526001604089200154169283614384565b82877f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d88604051868152a48233141580610490575b610432575b837ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce78688604051908152a180f35b823b1561048c57608484928360405195869485936313375c3b60e01b85528b6004860152336024860152604485015260648401525af1610474575b8080610404565b61047d90612f7f565b61048857823861046d565b8280fd5b8380fd5b50823b15156103ff565b898852600b89526040882060018101600160c81b60ff60c81b1982541617905560ff60f01b1981541690556103b3565b60405163287ecaef60e21b8152600481018b90526001600160801b03928316602482015291166044820152606490fd5b0390fd5b6024896040519063d2aabcd960e01b82526004820152fd5b60046040517fc61a0e9e000000000000000000000000000000000000000000000000000000008152fd5b858360649260405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b508383821614156102fb565b60405163216caf0d60e01b815260048101859052336024820152604490fd5b5061059b84614453565b156102d6565b60248360405190634a5541ef60e01b82526004820152fd5b80fd5b50346105b957806003193601126105b9576001600160a01b036020915416604051908152f35b50346105b95760203660031901126105b9576020610601600435613739565b6040519015158152f35b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d5760016040836001600160a01b039360209552600b855220015416604051908152f35b6024906040519062b8e7e760e51b82526004820152fd5b50346105b95760403660031901126105b957600435610691612f03565b610297826143ea565b50346105b95760403660031901126105b9576106b4612eed565b60406106be612f03565b926001600160a01b0380931681526008602052209116600052602052602060ff604060002054166040519015158152f35b50346105b95760203660031901126105b95760ff6001604060043593848152600b60205220015460d01c161561065d5761072a6020916143ea565b6001600160801b0360405191168152f35b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d5760408260029260209452600b845220015460801c604051908152f35b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d5760036040836001600160801b039360209552600b855220015416604051908152f35b50346105b95760203660031901126105b9576004356107f6613649565b50808252600b60205260ff600160408420015460d01c161561065d578160409160609352600b60205220600181549164ffffffffff918291015460a01c16906040519261084284612fcd565b818160a01c16845260c81c166020830152604082015261088560405180926040908164ffffffffff91828151168552826020820151166020860152015116910152565bf35b50346105b9576020806003193601126109b1576004356108c56108c08260005260056020526001600160a01b0360406000205416151590565b613059565b826001600160a01b03600a5416916044604051809481937fe9dc637500000000000000000000000000000000000000000000000000000000835230600484015260248301525afa9283156109b5578093610934575b5050610930604051928284938452830190612ec8565b0390f35b909192503d8082843e6109478184613005565b82019183818403126109b15780519067ffffffffffffffff8211610488570182601f820112156109b15780519161097d83613027565b9361098b6040519586613005565b8385528584840101116105b95750906109a991848085019101612ea5565b90388061091a565b5080fd5b604051903d90823e3d90fd5b50346105b95760403660031901126105b9576004356109de612f03565b906109e7614328565b808352602091600b835260ff600160408620015460d01c1615610d2457818452600583526001600160a01b03806040862054169081330361057257610a2b846143ea565b906001600160801b0390818316918215938415610a52575b89610a4f8989896132ec565b80f35b610a5a614328565b610a63886136d3565b610d0c57610a8788600052600b6020526001600160a01b0360406000205416331490565b94851580610cfc575b610cdd57888b5260058a528360408c2054169580610cd3575b610caf57861561051657610c9757610ac0886143ea565b8281168511610c67575090610b20610aed8b969594938a8852600b8c52600260408920015460801c614438565b898752600b8b5261038a600260408920019182906001600160801b036001600160801b031983549260801b169116179055565b90610b3c818b840151169282604081835116920151169061370a565b161115610c37575b868452600b8852600160408520015416610b5f828683614384565b84877f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d8a604051868152a48133141580610c2d575b610bd2575b5050507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7610a4f94604051858152a13880808080610a43565b813b156104885782916084839260405194859384926313375c3b60e01b84528b600485015233602485015289604485015260648401525af1610c15575b80610b99565b610c1e90612f7f565b610c29578438610c0f565b8480fd5b50813b1515610b94565b868452600b88526040842060018101600160c81b60ff60c81b1982541617905560ff60f01b198154169055610b44565b60405163287ecaef60e21b8152600481018a90526001600160801b03928316602482015291166044820152606490fd5b6024886040519063d2aabcd960e01b82526004820152fd5b6064898860405191632dcbf6b960e11b835260048301523360248301526044820152fd5b5085871415610aa9565b60405163216caf0d60e01b8152600481018a9052336024820152604490fd5b50610d0689614453565b15610a90565b60248860405190634a5541ef60e01b82526004820152fd5b6024826040519062b8e7e760e51b82526004820152fd5b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d5760408264ffffffffff9260209452600b8452205460a01c16604051908152f35b50346105b957806003193601126105b957602060405167016345785d8a00008152f35b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d576040826001600160a01b039260209452600b8452205416604051908152f35b50346105b95760203660031901126105b95760ff600160406020936004358152600b855220015460d01c166040519015158152f35b50346105b95760803660031901126105b957610e4c612eed565b610e54612f03565b906064359067ffffffffffffffff821161048c573660238301121561048c5781600401359284610e8385613027565b93610e916040519586613005565b85855236602487830101116109b15785610a4f96602460209301838801378501015260443591613177565b50346105b95760203660031901126105b957602061060160043561369c565b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d57610f1490613820565b604051906005811015610f2957602092508152f35b602483634e487b7160e01b81526021600452fd5b50346105b9576101403660031901126105b957610f58614328565b610f60613649565b9064ffffffffff80421680845260c43582811681036110715781018216602085015260e4359081831682036110715701166040830152606435916001600160a01b03918284168094036105b957506084358015158091036110715760a435908115158092036110715760243594848616809603611071576004359585871680970361107157604435906001600160801b038216809203611071576040519761100789612fb0565b8852602088015260408701526060860152608085015260a084015260c0830152604061010319360112611071576040519161104183612fe9565b61010435918216820361107157826110699260209452610124358482015260e0820152613922565b604051908152f35b600080fd5b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d5760026040836001600160801b039360209552600b855220015416604051908152f35b50346105b95760203660031901126105b9576110e2612eed565b6001600160a01b038083541633810361119c575081169081835260026020526001600160801b0360408420541690811561116b578161113c918486526002602052604086206001600160801b031981541690553390614384565b6040519081527fca7a4a65a94ed2f37538814e00e1cd4c41a78261561e3f3794592f11409cf5af60203392a380f35b602483604051907f8410168c0000000000000000000000000000000000000000000000000000000082526004820152fd5b6040516331b339a960e21b81526001600160a01b03919091166004820152336024820152604490fd5b50346105b95760603660031901126105b95767ffffffffffffffff600435818111610488576111f8903690600401612f4e565b90611201612f03565b92604435908111610c295761121a903690600401612f4e565b611225949194614328565b80840361157b5791926001600160a01b038216159290865b818110611248578780f35b611253818388614412565b359061126081858a614412565b356001600160801b038116810361107157611279614328565b611282836136d3565b6105a1576112a683600052600b6020526001600160a01b0360406000205416331490565b80158061156b575b61057257838b5260056020526001600160a01b0360408c2054169080611558575b61152b5787610516576001600160801b03821615611513576112f0846143ea565b6001600160801b0381166001600160801b038416116114e15750908a91848352600b80602052611360600261038a611331868360408a20015460801c614438565b918988528460205260408820019182906001600160801b036001600160801b031983549260801b169116179055565b6001600160801b03611384816020840151169282604081835116920151169061370a565b1611156114b1575b8584526020526001600160a01b036001604085200154166113b76001600160801b0384168a83614384565b6040516001600160801b0384168152867f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d60206001600160a01b038d1693a480331415806114a7575b61143b575b5050507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce76020600193604051908152a10161123d565b803b15610488576001600160a01b036084898580946001600160801b0360405197889687956313375c3b60e01b87528d60048801523360248801521660448601521660648401525af161148f575b80611405565b61149890612f7f565b6114a3578838611489565b8880fd5b50803b1515611400565b858452806020526040842060018101600160c81b60ff60c81b1982541617905560ff60f01b19815416905561138c565b60405163287ecaef60e21b8152600481018690526001600160801b038481166024830152919091166044820152606490fd5b6024846040519063d2aabcd960e01b82526004820152fd5b6064846001600160a01b038960405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b50806001600160a01b03881614156112cf565b5061157584614453565b156112ae565b83604491604051917faec9344000000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b50346105b95760403660031901126105b9576115cc612eed565b60243590811515809203611071576001600160a01b03169081331461163f5733835260086020526040832082600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a380f35b606460405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152fd5b50346105b9576101603660031901126105b95761169e614328565b604051906116ab82612fb0565b6116b3612eed565b82526116bd612f03565b60208301526116ca613043565b60408301526001600160a01b03906064358281168103611071576060840152608435801515810361107157608084015260a43580151581036110715760a084015260603660c31901126105b9575060405161172481612fcd565b64ffffffffff60c435818116810361107157825260e435818116810361107157602083015261010435908116810361107157604082015260c0830152604061012319360112611071576040519161177a83612fe9565b61012435918216820361107157826110699260209452610144358482015260e0820152613922565b50346105b957806003193601126105b957604051908060045491600183811c928185169485156118a5575b60209586861081146118915785885287949392918790821561186f575050600114611815575b505061180192500383613005565b610930604051928284938452830190612ec8565b90859250600482527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5b858310611857575050611801935082010138806117f3565b8054838901850152879450869390920191810161183f565b925093505061180194915060ff191682840152151560051b82010138806117f3565b602483634e487b7160e01b81526022600452fd5b93607f16936117cd565b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d57600160408364ffffffffff9360209552600b855220015460a01c16604051908152f35b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d5761193b90613820565b906005821015908161197c5760028314918215611990575b8215611967575b6020836040519015158152f35b90915061197c5750600460209114388061195a565b80634e487b7160e01b602492526021600452fd5b506003831491506000611953565b50346105b95760203660031901126105b9576004356001600160a01b0390818116809103610488578183541633810361119c575060015491816001600160a01b03198416176001556040519216825260208201527fdcb09aef4bf01068924ccce937981cbe59d25ba08380cf941aaaea4e4bd3960d60403392a280f35b50346105b95760203660031901126105b957604051611a3981612f93565b8181528160208201528160408201528160608201528160808201528160a08201528160c08201528160e08201528161010082015281610120820152610140611a7f613649565b9101526004358152600b60205260ff600160408320015460d01c1615611c57576004358152600b60205260408120611b58600260405192611abf84612f93565b80546001600160a01b038116855264ffffffffff8160a01c16602086015264ffffffffff8160c81c16604086015260ff8160f01c161515606086015260f81c1515608085015260ff60018201546001600160a01b03811660a087015264ffffffffff8160a01c1660c0870152818160c81c16151560e0870152818160d01c16151561010087015260d81c16151561012085015201613668565b610140820152611b69600435613820565b6005811015610f29579160026101a09314611c4c575b50610885610140604051926001600160a01b03815116845264ffffffffff602082015116602085015264ffffffffff60408201511660408501526060810151151560608501526080810151151560808501526001600160a01b0360a08201511660a085015264ffffffffff60c08201511660c085015260e0810151151560e0850152610100810151151561010085015261012081015115156101208501520151610140830190604090816001600160801b0391828151168552826020820151166020860152015116910152565b606082015238611b7f565b602460405162b8e7e760e51b81526004356004820152fd5b50346105b957602090816003193601126105b95760043567ffffffffffffffff81116109b157611ca483913690600401612f4e565b9190611cae614328565b83925b808410611cbc578480f35b611ccb84828497959697614412565b3594611cd5614328565b611cde866136d3565b15611cfb5760248660405190634a5541ef60e01b82526004820152fd5b611d0486613739565b611f7857611d2886600052600b6020526001600160a01b0360406000205416331490565b15611f5957611d368661376a565b95808552600b90818752611d4f60026040882001613668565b906001600160801b039283835116848b161015611f415781885280895260ff604089205460f01c1615611f2957611d9f8a858b611d9560409a9b9c9d9e8389511661370a565b960151169061370a565b92828a52818b52868a20908b8b7f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa50845497600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8a1617865560038a8216968715611f0f575b01998516998a6001600160801b03198254161790556001600160a01b0380991698899360058652818e822054169889965260019d8e912001541694611e4c8b8588614384565b604080518a81526001600160801b0392831660208201529290911690820152606090a47ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce78b604051858152a1813b611eb0575b505050505001919093919293611cb1565b813b15611f0b57899493919285809460849360405197889687956372eba20360e01b875260048701526024860152604485015260648401525af1611ef7575b808080611e9f565b611f0090612f7f565b610c29578487611eef565b8980fd5b60018101600160c81b60ff60c81b19825416179055611e06565b602482604051906339c6dc7360e21b82526004820152fd5b602482604051906322cad1af60e11b82526004820152fd5b60405163216caf0d60e01b815260048101879052336024820152604490fd5b6024866040519063fe19f19f60e01b82526004820152fd5b50346105b9576020806003193601126109b15760043590611faf614328565b818352600b815260ff600160408520015460d01c1615610d2457611fd282613820565b600581101561215c5760048103611ffb5760248360405190634a5541ef60e01b82526004820152fd5b6003810361201b576024836040519063fe19f19f60e01b82526004820152fd5b600214611f415761204282600052600b6020526001600160a01b0360406000205416331490565b1561213d57818352600b815260ff604084205460f01c1615611f2957818352600b81526040832060ff60f01b19815416905582604051837f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f8380a2600583526001600160a01b03604083205416803b6120e5575b5050507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce791604051908152a180f35b803b1561048857816024818580947f341a0bd90000000000000000000000000000000000000000000000000000000083528960048401525af1612129575b806120b6565b61213290612f7f565b610488578238612123565b60405163216caf0d60e01b815260048101839052336024820152604490fd5b602484634e487b7160e01b81526021600452fd5b50346105b95760203660031901126105b9576004356001600160a01b0390818116809103610488578183541633810361119c5750600a5491816001600160a01b0319841617600a556040519216825260208201527fa2548bd4b805e907c1558a47b5858324fe8bb4a2e1ddfca647eecbf65610eebc60403392a2600954600019810190811161222d5760407f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c91815190600182526020820152a180f35b602482634e487b7160e01b81526011600452fd5b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d5760408264ffffffffff9260209452600b8452205460c81c16604051908152f35b50346105b95760203660031901126105b9576122ab612eed565b9080546001600160a01b03808216933385036122fd576001600160a01b03199394501691829116178255337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808380a380f35b6040516331b339a960e21b81526001600160a01b0386166004820152336024820152604490fd5b50346105b95760203660031901126105b9576001600160a01b03612346612eed565b168015612363578160409160209352600683522054604051908152f35b608460405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e657200000000000000000000000000000000000000000000006064820152fd5b50346105b95760203660031901126105b9576001600160a01b0360406020926004356124126108c08260005260056020526001600160a01b0360406000205416151590565b815260058452205416604051908152f35b50346105b95760203660031901126105b95760206124426004356130a4565b6001600160a01b0360405191168152f35b50346105b957806003193601126105b95760206001600160a01b0360015416604051908152f35b50346105b95760203660031901126105b95760ff6001604060043593848152600b60205220015460d01c161561065d5761072a6020916138a7565b50346105b95760203660031901126105b95760043590818152600b60205260ff600160408320015460d01c1615610d2457806124f083613820565b92600584101561252b57600260209403612511575b50506040519015158152f35b8152600b8352604090205460f01c60ff1690503880612505565b602482634e487b7160e01b81526021600452fd5b50346105b95760203660031901126105b95760043561255c614328565b612565816136d3565b156126985761257381614453565b1561267857612581816130a4565b61258a8261369c565b159081612670575b8161265d575b50612645576020816125ca7ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7936130a4565b90808552600783526001600160a01b0360408620926001600160a01b03199384815416905516918286526006845260408620600019815401905581865260058452604086209081541690558085604051937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a48152a180f35b60249060405190630da9b01360e01b82526004820152fd5b6001600160a01b03915016151538612598565b839150612592565b60405163216caf0d60e01b81526004810191909152336024820152604490fd5b602490604051907f817cd6390000000000000000000000000000000000000000000000000000000082526004820152fd5b50346105b9576126d836612f19565b60405191602083019383851067ffffffffffffffff86111761270357610a4f94604052858452613177565b634e487b7160e01b600052604160045260246000fd5b50346105b95760203660031901126105b95760206106016004356136d3565b50346105b9576020806003193601126109b15760043590612757614328565b612760826136d3565b1561277d5760248260405190634a5541ef60e01b82526004820152fd5b9061278781613739565b6129be576127ab81600052600b6020526001600160a01b0360406000205416331490565b15612678576127b98161376a565b818452600b83526127cf60026040862001613668565b926001600160801b03918285511683821610156129a657838652600b825260ff604087205460f01c161561298e5792827ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce783612844878460409761283a8d9b6128ef9b8e511661370a565b9b0151169061370a565b92848852600b825287868120947f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa50865491600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84161788556003858216988915612974575b01948d169c858e6001600160801b0319819854161790556001600160a01b038094169b8c94600589526001818e892054169d8e98600b8c5220015416968588614384565b604080518b81526001600160801b0392831660208201529290911690820152606090a4604051848152a1823b612923578480f35b823b15610c2957608492859160405197889687956372eba20360e01b875260048701526024860152604485015260648401525af1612965575b81818080808480f35b61296e90612f7f565b3861295c565b60018101600160c81b60ff60c81b198254161790556128ab565b602484604051906339c6dc7360e21b82526004820152fd5b602484604051906322cad1af60e11b82526004820152fd5b6024906040519063fe19f19f60e01b82526004820152fd5b50346105b95760203660031901126105b9576001600160801b0360406020926001600160a01b03612a05612eed565b16815260028452205416604051908152f35b50346105b957610a4f612a2936612f19565b91612a3c612a37843361320d565b613106565b6132ec565b50346105b957806003193601126105b9576020600954604051908152f35b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d57612a9890613820565b90600582101561197c5760208215838115612ab9575b506040519015158152f35b600191501482612aae565b50346105b95760203660031901126105b95760043590818152600b60205260ff600160408320015460d01c1615610d2457602091604082828152600b85522060ff815460f01c1680612b52575b612b29575b50506001600160801b0360405191168152f35b612b4b92506001600160801b036002612b45920154169161376a565b9061370a565b3880612b16565b5060ff600182015460c81c1615612b11565b50346105b95760403660031901126105b957612b7e612eed565b602435906001600160a01b038080612b95856130a4565b16921691808314612c8957803314908115612c68575b5015612bfe57828452600760205260408420826001600160a01b0319825416179055612bd6836130a4565b167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258480a480f35b608460405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152fd5b9050845260086020526040842033855260205260ff60408520541638612bab565b608460405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152fd5b50346105b95760203660031901126105b95760206124426004356130c9565b50346105b957806003193601126105b957604051908060035491600183811c92818516948515612dca575b60209586861081146118915785885287949392918790821561186f575050600114612d7057505061180192500383613005565b90859250600382527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b858310612db2575050611801935082010138806117f3565b80548389018501528794508693909201918101612d9a565b93607f1693612d3d565b9050346109b15760203660031901126109b1576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361048857602092507f80ac58cd000000000000000000000000000000000000000000000000000000008114908115612e7b575b8115612e51575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501438612e4a565b7f5b5e139f0000000000000000000000000000000000000000000000000000000081149150612e43565b60005b838110612eb85750506000910152565b8181015183820152602001612ea8565b90602091612ee181518092818552858086019101612ea5565b601f01601f1916010190565b600435906001600160a01b038216820361107157565b602435906001600160a01b038216820361107157565b6060906003190112611071576001600160a01b0390600435828116810361107157916024359081168103611071579060443590565b9181601f840112156110715782359167ffffffffffffffff8311611071576020808501948460051b01011161107157565b67ffffffffffffffff811161270357604052565b610160810190811067ffffffffffffffff82111761270357604052565b610100810190811067ffffffffffffffff82111761270357604052565b6060810190811067ffffffffffffffff82111761270357604052565b6040810190811067ffffffffffffffff82111761270357604052565b90601f8019910116810190811067ffffffffffffffff82111761270357604052565b67ffffffffffffffff811161270357601f01601f191660200190565b604435906001600160801b038216820361107157565b1561306057565b606460405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152fd5b60005260056020526001600160a01b03604060002054166130c6811515613059565b90565b6130ec6108c08260005260056020526001600160a01b0360406000205416151590565b60005260076020526001600160a01b036040600020541690565b1561310d57565b608460405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f766564000000000000000000000000000000000000006064820152fd5b9061319b93929161318b612a37843361320d565b6131968383836132ec565b6134b7565b156131a257565b60405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b906001600160a01b038080613221846130a4565b16931691838314938415613254575b50831561323e575b50505090565b61324a919293506130c9565b1614388080613238565b909350600052600860205260406000208260005260205260ff604060002054169238613230565b1561328257565b608460405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152fd5b9061331592916132fb836130a4565b916001600160a01b0394859384809416968791161461327b565b169081158061341e576133278461369c565b159081613415575b508061340c575b6133f457918084926133767ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce79660209661336f856130a4565b161461327b565b60009382855260078652604085206001600160a01b031990818154169055818652600687526040862060001981540190558286526040862060018154019055838652600587528260408720918254161790557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6040519580a48152a1565b60248360405190630da9b01360e01b82526004820152fd5b50831515613336565b9050153861332f565b608460405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152fd5b3d156134b2573d9061349882613027565b916134a66040519384613005565b82523d6000602084013e565b606090565b9290803b1561364057613521916020916001600160a01b0394604051809581948293897f150b7a02000000000000000000000000000000000000000000000000000000009b8c86523360048701521660248501526044840152608060648401526084830190612ec8565b03916000968791165af1908290826135e0575b50506135ba57613542613487565b805190816135b55760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000161490565b909192506020813d8211613638575b816135fc60209383613005565b810103126109b15751907fffffffff00000000000000000000000000000000000000000000000000000000821682036105b95750903880613534565b3d91506135ef565b50505050600190565b6040519061365682612fcd565b60006040838281528260208201520152565b9060405161367581612fcd565b6040819360018154916001600160801b0392838116865260801c6020860152015416910152565b80600052600b60205260ff60016040600020015460d01c161561065d57600052600b60205260ff60016040600020015460d81c1690565b80600052600b60205260ff60016040600020015460d01c161561065d57600052600b60205260ff60016040600020015460c81c1690565b6001600160801b03918216908216039190821161372357565b634e487b7160e01b600052601160045260246000fd5b80600052600b60205260ff60016040600020015460d01c161561065d57600052600b60205260406000205460f81c90565b600090808252600b6020526040822091825464ffffffffff42818360c81c16116138185780600186015460a01c169182421015613802576137b79394955060a01c16809103904203614693565b90828152600b6020526001600160801b03926137dd846002604085200154168094614773565b9283116137ea5750501690565b60029350604092508152600b60205220015460801c90565b505050505060026001600160801b039101541690565b505091505090565b80600052600b602052604060002060ff600182015460c81c16600014613847575050600490565b805460f81c6138a0575460a01c64ffffffffff16421061389a5761386a8161376a565b90600052600b6020526001600160801b03806002604060002001541691161060001461389557600190565b600290565b50600090565b5050600390565b80600052600b6020526138c06002604060002001613668565b81600052600b602052604060002060ff600182015460c81c166000146138f357506001600160801b039150602001511690565b5460f81c61390557506130c69061376a565b6130c691506001600160801b03604081835116920151169061370a565b906001600160a01b036001541660206001600160a01b036060850151166024604051809481937fdcf844a700000000000000000000000000000000000000000000000000000000835260048301525afa801561415757600090614123575b6139a391506001600160801b0360408501511690602060e08601510151916144bc565b916001600160801b0383511660c082015190156140f95764ffffffffff815116602082019064ffffffffff825116908181116140b957505064ffffffffff604091511691019064ffffffffff825116908181101561407957505064ffffffffff8042169151169081811015614039575050600954926001600160801b0381511660405190613a3082612fcd565b815260006020820152600060408201526001600160a01b036060840151169060c08401519164ffffffffff6020840151169064ffffffffff604085015116906080870151151560a088015115159364ffffffffff6001600160a01b038a511697511660405197613a9f89612f93565b88526020880152604087015260608601526000608086015260a085015260c0840152600060e0840152600161010084015261012083015261014082015284600052600b60205260406000206001600160a01b038251166001600160a01b0319825416178155613b3664ffffffffff602084015116829064ffffffffff60a01b1964ffffffffff60a01b83549260a01b169116179055565b604082015181547eff0000000000000000000000000000000000000000000000000000000000006060850151151560f01b169078ffffffffffffffffffffffffffffffffffffffffffffffffff7dffffffffff000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000006080880151151560f81b169460c81b1691161717178155600181016001600160a01b0360a0840151166001600160a01b0319825416178155613c2d64ffffffffff60c085015116829064ffffffffff60a01b1964ffffffffff60a01b83549260a01b169116179055565b60e083015181546101008501516101208601517fffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff90921692151560c81b79ff00000000000000000000000000000000000000000000000000169290921791151560d01b7aff0000000000000000000000000000000000000000000000000000169190911790151560d81b7bff00000000000000000000000000000000000000000000000000000016179055610140909101518051602082015160801b6001600160801b03199081166001600160801b03928316176002850155926040906003019201511682825416179055600185016009556001600160a01b0360608401511660005260026020526001600160801b0380604060002054168160208501511601166001600160a01b036060850151166000526040600020918254161790556001600160a01b036020830151168015613ff557613da8613da28660005260056020526001600160a01b0360406000205416151590565b156142dd565b613db18561369c565b1580613fec575b80613fe4575b613fcc5760207ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce791613e09613da28860005260056020526001600160a01b0360406000205416151590565b806000526006825260406000206001815401905586600052600582526040600020816001600160a01b0319825416179055866040519160007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4868152a1613e996001600160a01b036060840151166001600160801b03808451168160208601511601169030903390614163565b6001600160801b0360408201511680613f9d575b506001600160a01b038251167f075861cbceafeb777e8f15f357121b08f6f3adba387d599bb7b5278ca6192df5610160866001600160a01b0360208701511694613f946001600160a01b03606089015116976080810151151560a0820151151590613f5e6001600160a01b0360e060c08601519501515116956040519788523360208901526040880190604090816001600160801b0391828151168552826020820151166020860152015116910152565b60a086015260c0850152805164ffffffffff90811660e08601526020820151811661010086015260409091015116610120840152565b610140820152a4565b613fc6906001600160a01b036060850151166001600160a01b0360e08601515116903390614163565b38613ead565b60248560405190630da9b01360e01b82526004820152fd5b506000613dbe565b50801515613db8565b606460405162461bcd60e51b815260206004820152602060248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152fd5b6040517f210aec0e00000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b6040517f9fee269100000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b6040517f4c23297000000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b60046040517f6095d3bc000000000000000000000000000000000000000000000000000000008152fd5b6020823d60201161414f575b8161413c60209383613005565b810103126105b957506139a39051613980565b3d915061412f565b6040513d6000823e3d90fd5b9290604051927f23b872dd0000000000000000000000000000000000000000000000000000000060208501526001600160a01b03809216602485015216604483015260648201526064815260a081019181831067ffffffffffffffff841117612703576141d2926040526141d4565b565b6001600160a01b0316906142346040516141ed81612fe9565b6020938482527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564858301526000808587829751910182855af161422e613487565b916145fb565b8051918215918483156142b9575b50505090501561424f5750565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b9193818094500103126109b1578201519081151582036105b9575080388084614242565b156142e457565b606460405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152fd5b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361435a57565b60046040517fa1c0d6e5000000000000000000000000000000000000000000000000000000008152fd5b916001600160a01b03604051927fa9059cbb000000000000000000000000000000000000000000000000000000006020850152166024830152604482015260448152608081019181831067ffffffffffffffff841117612703576141d2926040526141d4565b6130c6906143f7816138a7565b90600052600b60205260026040600020015460801c9061370a565b91908110156144225760051b0190565b634e487b7160e01b600052603260045260246000fd5b9190916001600160801b038080941691160191821161372357565b60009080825260056020526001600160a01b038060408420541692833314938415614498575b5050821561448657505090565b90915061449333926130c9565b161490565b60ff9294509060409181526008602052818120338252602052205416913880614479565b9092916144c7613649565b936001600160801b03928381169182156145d35767016345785d8a000080821161459c57808511614565575061451185614502819386614773565b16946020890195865284614773565b169184614528604089019480865282875116614438565b16101561454f5761454184918261454a9551169061370a565b9151169061370a565b168252565b634e487b7160e01b600052600160045260246000fd5b84604491604051917f4fea5c1a00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b60449250604051917f47152d6700000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b505050505090506040516145e681612fcd565b60008152600060208201526000604082015290565b9192901561465c575081511561460f575090565b3b156146185790565b606460405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b82519091501561466f5750805190602001fd5b6104fa9060405191829162461bcd60e51b8352602060048401526024830190612ec8565b670de0b6b3a764000091600019838309928083029283808610950394808603951461474f578285101561471357908291096001821901821680920460028082600302188083028203028083028203028083028203028083028203028083028203028092029003029360018380600003040190848311900302920304170290565b82606492604051927f63a05778000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b50508092501561475d570490565b634e487b7160e01b600052601260045260246000fd5b9091906000198382098382029182808310920391808303921461481157670de0b6b3a764000090818310156147da57947faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066994950990828211900360ee1b910360121c170290565b60449086604051917f5173648d00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050670de0b6b3a76400009004915056fea164736f6c6343000815000a"; + hex"60a034620003e757601f196001600160401b03601f62004c523881900382810185168601919084831187841017620003ec57808792606094604052833981010312620003e75783516001600160a01b03928382169291839003620003e7576020918287015196858816809803620003e75760400151948516809503620003e7576200008962000402565b90601c82527f5361626c696572205632204c6f636b7570204c696e656172204e46540000000084830152620000bd62000402565b601181527029a0a116ab1916a627a1a5aaa816a624a760791b8582015230608052600080546001600160a01b031990811688178255600180548216909b178b5596817fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a38351858111620003d35760039485548c81811c91168015620003c8575b89821014620003b45790818684931162000361575b508890868311600114620002f8578492620002ec575b505060001982871b1c1916908b1b1784555b8151948511620002d8576004958654998b8b811c9b168015620002cd575b828c1014620002ba57848b1162000271575b869798999a50819487116001146200020a57505093620001fe575b505082871b92600019911b1c19161790555b600a541617600a5560095560405161482f9081620004238239608051816145590152f35b015191503880620001c8565b8883528183208c9890969594939116915b8282106200025757505085116200023c575b50505050811b019055620001da565b01519060f884600019921b161c19169055388080806200022d565b8484015187558c989096019593840193908101906200021b565b87835281832085880160051c81019b838910620002af575b860160051c019a8c905b8c8110620002a3575050620001ad565b848155018c9062000293565b909b508b9062000289565b634e487b7160e01b835260228852602483fd5b9a607f169a6200019b565b634e487b7160e01b81526041600452602490fd5b0151905038806200016b565b908c8e9416918886528a862092865b8c82821062000341575050841162000328575b505050811b0184556200017d565b015160001983891b60f8161c191690553880806200031a565b91929395968291958786015181550195019301908f959493929162000307565b9091508684528884208680850160051c8201928b8610620003aa575b918f91869594930160051c01915b8281106200039b57505062000155565b8681558594508f91016200038b565b925081926200037d565b634e487b7160e01b84526022600452602484fd5b90607f169062000140565b634e487b7160e01b82526041600452602482fd5b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620003ec5760405256fe608080604052600436101561001357600080fd5b600090813560e01c90816301ffc9a714612dd45750806306fdde0314612d12578063081812fc14612cf3578063095ea7b314612b645780631400ecec14612ac45780631c1cdd4c14612a5f5780631e99d56914612a4157806323b872dd14612a1757806339a73c03146129d657806340e58ee514612738578063425d30dd1461271957806342842e0e146126c957806342966c681461253f5780634857501f146124b55780634869e12d1461247a5780635fe3b567146124535780636352211e146124235780636d0cee75146123cd57806370a082311461232457806375829def14612291578063780a82c8146122415780637cad6cd1146121705780637de6b1db14611f905780638659c27014611c6f578063894e9a0d14611a1b5780638bad38dd1461199e5780638f69b993146119025780639067b677146118af57806395d89b41146117a257806396ce143114611683578063a22cb465146115b2578063a2ffb897146111c5578063a6202bf2146110c8578063a80fc07114611076578063ab167ccc14610f3d578063ad35efd414610edb578063b256456914610ebc578063b88d4fde14610e32578063b8a3be6614610dfd578063b971302a14610dae578063bc063e1a14610d8b578063bc2be1be14610d3b578063c156a11d146109c1578063c87b56dd14610887578063cc364f48146107d9578063d4dbd20b14610787578063d511609f1461073b578063d975dfed146106ef578063e985e9c51461069a578063ea5ead1914610674578063eac8f5b81461060b578063f590c176146105e2578063f851a440146105bc5763fdd46d601461027357600080fd5b346105b95760603660031901126105b95760043561028f612f03565b610297613043565b906102a061454f565b6102a9836136d3565b6105a1576102cd83600052600b6020526001600160a01b0360406000205416331490565b90811580610591575b61057257838552602092600584526001600160a01b0391826040882054169380610566575b61054057828116928315610516576001600160801b038084169384156104fe5761032489614611565b82811686116104ca5750938093926103ca9261038f6103578d9a99988d8c52600b8d52600260408d20015460801c61465f565b8c8b52600b8c5261038a600260408d20019182906001600160801b036001600160801b031983549260801b169116179055565b613668565b906103ab818c840151169282604081835116920151169061370a565b16111561049a575b898852600b895260016040892001541692836145ab565b82877f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d88604051868152a48233141580610490575b610432575b837ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce78688604051908152a180f35b823b1561048c57608484928360405195869485936313375c3b60e01b85528b6004860152336024860152604485015260648401525af1610474575b8080610404565b61047d90612f7f565b61048857823861046d565b8280fd5b8380fd5b50823b15156103ff565b898852600b89526040882060018101600160c81b60ff60c81b1982541617905560ff60f01b1981541690556103b3565b60405163287ecaef60e21b8152600481018b90526001600160801b03928316602482015291166044820152606490fd5b0390fd5b6024896040519063d2aabcd960e01b82526004820152fd5b60046040517fc61a0e9e000000000000000000000000000000000000000000000000000000008152fd5b858360649260405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b508383821614156102fb565b60405163216caf0d60e01b815260048101859052336024820152604490fd5b5061059b8461467a565b156102d6565b60248360405190634a5541ef60e01b82526004820152fd5b80fd5b50346105b957806003193601126105b9576001600160a01b036020915416604051908152f35b50346105b95760203660031901126105b9576020610601600435613739565b6040519015158152f35b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d5760016040836001600160a01b039360209552600b855220015416604051908152f35b6024906040519062b8e7e760e51b82526004820152fd5b50346105b95760403660031901126105b957600435610691612f03565b61029782614611565b50346105b95760403660031901126105b9576106b4612eed565b60406106be612f03565b926001600160a01b0380931681526008602052209116600052602052602060ff604060002054166040519015158152f35b50346105b95760203660031901126105b95760ff6001604060043593848152600b60205220015460d01c161561065d5761072a602091614611565b6001600160801b0360405191168152f35b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d5760408260029260209452600b845220015460801c604051908152f35b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d5760036040836001600160801b039360209552600b855220015416604051908152f35b50346105b95760203660031901126105b9576004356107f6613649565b50808252600b60205260ff600160408420015460d01c161561065d578160409160609352600b60205220600181549164ffffffffff918291015460a01c16906040519261084284612fcd565b818160a01c16845260c81c166020830152604082015261088560405180926040908164ffffffffff91828151168552826020820151166020860152015116910152565bf35b50346105b9576020806003193601126109b1576004356108c56108c08260005260056020526001600160a01b0360406000205416151590565b613059565b826001600160a01b03600a5416916044604051809481937fe9dc637500000000000000000000000000000000000000000000000000000000835230600484015260248301525afa9283156109b5578093610934575b5050610930604051928284938452830190612ec8565b0390f35b909192503d8082843e6109478184613005565b82019183818403126109b15780519067ffffffffffffffff8211610488570182601f820112156109b15780519161097d83613027565b9361098b6040519586613005565b8385528584840101116105b95750906109a991848085019101612ea5565b90388061091a565b5080fd5b604051903d90823e3d90fd5b50346105b95760403660031901126105b9576004356109de612f03565b906109e761454f565b808352602091600b835260ff600160408620015460d01c1615610d2457818452600583526001600160a01b03806040862054169081330361057257610a2b84614611565b906001600160801b0390818316918215938415610a52575b89610a4f8989896132ec565b80f35b610a5a61454f565b610a63886136d3565b610d0c57610a8788600052600b6020526001600160a01b0360406000205416331490565b94851580610cfc575b610cdd57888b5260058a528360408c2054169580610cd3575b610caf57861561051657610c9757610ac088614611565b8281168511610c67575090610b20610aed8b969594938a8852600b8c52600260408920015460801c61465f565b898752600b8b5261038a600260408920019182906001600160801b036001600160801b031983549260801b169116179055565b90610b3c818b840151169282604081835116920151169061370a565b161115610c37575b868452600b8852600160408520015416610b5f8286836145ab565b84877f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d8a604051868152a48133141580610c2d575b610bd2575b5050507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7610a4f94604051858152a13880808080610a43565b813b156104885782916084839260405194859384926313375c3b60e01b84528b600485015233602485015289604485015260648401525af1610c15575b80610b99565b610c1e90612f7f565b610c29578438610c0f565b8480fd5b50813b1515610b94565b868452600b88526040842060018101600160c81b60ff60c81b1982541617905560ff60f01b198154169055610b44565b60405163287ecaef60e21b8152600481018a90526001600160801b03928316602482015291166044820152606490fd5b6024886040519063d2aabcd960e01b82526004820152fd5b6064898860405191632dcbf6b960e11b835260048301523360248301526044820152fd5b5085871415610aa9565b60405163216caf0d60e01b8152600481018a9052336024820152604490fd5b50610d068961467a565b15610a90565b60248860405190634a5541ef60e01b82526004820152fd5b6024826040519062b8e7e760e51b82526004820152fd5b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d5760408264ffffffffff9260209452600b8452205460a01c16604051908152f35b50346105b957806003193601126105b957602060405167016345785d8a00008152f35b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d576040826001600160a01b039260209452600b8452205416604051908152f35b50346105b95760203660031901126105b95760ff600160406020936004358152600b855220015460d01c166040519015158152f35b50346105b95760803660031901126105b957610e4c612eed565b610e54612f03565b906064359067ffffffffffffffff821161048c573660238301121561048c5781600401359284610e8385613027565b93610e916040519586613005565b85855236602487830101116109b15785610a4f96602460209301838801378501015260443591613177565b50346105b95760203660031901126105b957602061060160043561369c565b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d57610f14906139af565b604051906005811015610f2957602092508152f35b602483634e487b7160e01b81526021600452fd5b50346105b9576101403660031901126105b957610f5861454f565b610f60613649565b9064ffffffffff80421680845260c43582811681036110715781018216602085015260e4359081831682036110715701166040830152606435916001600160a01b03918284168094036105b957506084358015158091036110715760a435908115158092036110715760243594848616809603611071576004359585871680970361107157604435906001600160801b038216809203611071576040519761100789612fb0565b8852602088015260408701526060860152608085015260a084015260c0830152604061010319360112611071576040519161104183612fe9565b61010435918216820361107157826110699260209452610124358482015260e0820152613ab1565b604051908152f35b600080fd5b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d5760026040836001600160801b039360209552600b855220015416604051908152f35b50346105b95760203660031901126105b9576110e2612eed565b6001600160a01b038083541633810361119c575081169081835260026020526001600160801b0360408420541690811561116b578161113c918486526002602052604086206001600160801b0319815416905533906145ab565b6040519081527fca7a4a65a94ed2f37538814e00e1cd4c41a78261561e3f3794592f11409cf5af60203392a380f35b602483604051907f8410168c0000000000000000000000000000000000000000000000000000000082526004820152fd5b6040516331b339a960e21b81526001600160a01b03919091166004820152336024820152604490fd5b50346105b95760603660031901126105b95767ffffffffffffffff600435818111610488576111f8903690600401612f4e565b90611201612f03565b92604435908111610c295761121a903690600401612f4e565b61122594919461454f565b80840361157b5791926001600160a01b038216159290865b818110611248578780f35b611253818388614639565b359061126081858a614639565b356001600160801b03811681036110715761127961454f565b611282836136d3565b6105a1576112a683600052600b6020526001600160a01b0360406000205416331490565b80158061156b575b61057257838b5260056020526001600160a01b0360408c2054169080611558575b61152b5787610516576001600160801b03821615611513576112f084614611565b6001600160801b0381166001600160801b038416116114e15750908a91848352600b80602052611360600261038a611331868360408a20015460801c61465f565b918988528460205260408820019182906001600160801b036001600160801b031983549260801b169116179055565b6001600160801b03611384816020840151169282604081835116920151169061370a565b1611156114b1575b8584526020526001600160a01b036001604085200154166113b76001600160801b0384168a836145ab565b6040516001600160801b0384168152867f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d60206001600160a01b038d1693a480331415806114a7575b61143b575b5050507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce76020600193604051908152a10161123d565b803b15610488576001600160a01b036084898580946001600160801b0360405197889687956313375c3b60e01b87528d60048801523360248801521660448601521660648401525af161148f575b80611405565b61149890612f7f565b6114a3578838611489565b8880fd5b50803b1515611400565b858452806020526040842060018101600160c81b60ff60c81b1982541617905560ff60f01b19815416905561138c565b60405163287ecaef60e21b8152600481018690526001600160801b038481166024830152919091166044820152606490fd5b6024846040519063d2aabcd960e01b82526004820152fd5b6064846001600160a01b038960405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b50806001600160a01b03881614156112cf565b506115758461467a565b156112ae565b83604491604051917faec9344000000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b50346105b95760403660031901126105b9576115cc612eed565b60243590811515809203611071576001600160a01b03169081331461163f5733835260086020526040832082600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a380f35b606460405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152fd5b50346105b9576101603660031901126105b95761169e61454f565b604051906116ab82612fb0565b6116b3612eed565b82526116bd612f03565b60208301526116ca613043565b60408301526001600160a01b03906064358281168103611071576060840152608435801515810361107157608084015260a43580151581036110715760a084015260603660c31901126105b9575060405161172481612fcd565b64ffffffffff60c435818116810361107157825260e435818116810361107157602083015261010435908116810361107157604082015260c0830152604061012319360112611071576040519161177a83612fe9565b61012435918216820361107157826110699260209452610144358482015260e0820152613ab1565b50346105b957806003193601126105b957604051908060045491600183811c928185169485156118a5575b60209586861081146118915785885287949392918790821561186f575050600114611815575b505061180192500383613005565b610930604051928284938452830190612ec8565b90859250600482527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5b858310611857575050611801935082010138806117f3565b8054838901850152879450869390920191810161183f565b925093505061180194915060ff191682840152151560051b82010138806117f3565b602483634e487b7160e01b81526022600452fd5b93607f16936117cd565b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d57600160408364ffffffffff9360209552600b855220015460a01c16604051908152f35b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d5761193b906139af565b906005821015908161197c5760028314918215611990575b8215611967575b6020836040519015158152f35b90915061197c5750600460209114388061195a565b80634e487b7160e01b602492526021600452fd5b506003831491506000611953565b50346105b95760203660031901126105b9576004356001600160a01b0390818116809103610488578183541633810361119c575060015491816001600160a01b03198416176001556040519216825260208201527fdcb09aef4bf01068924ccce937981cbe59d25ba08380cf941aaaea4e4bd3960d60403392a280f35b50346105b95760203660031901126105b957604051611a3981612f93565b8181528160208201528160408201528160608201528160808201528160a08201528160c08201528160e08201528161010082015281610120820152610140611a7f613649565b9101526004358152600b60205260ff600160408320015460d01c1615611c57576004358152600b60205260408120611b58600260405192611abf84612f93565b80546001600160a01b038116855264ffffffffff8160a01c16602086015264ffffffffff8160c81c16604086015260ff8160f01c161515606086015260f81c1515608085015260ff60018201546001600160a01b03811660a087015264ffffffffff8160a01c1660c0870152818160c81c16151560e0870152818160d01c16151561010087015260d81c16151561012085015201613668565b610140820152611b696004356139af565b6005811015610f29579160026101a09314611c4c575b50610885610140604051926001600160a01b03815116845264ffffffffff602082015116602085015264ffffffffff60408201511660408501526060810151151560608501526080810151151560808501526001600160a01b0360a08201511660a085015264ffffffffff60c08201511660c085015260e0810151151560e0850152610100810151151561010085015261012081015115156101208501520151610140830190604090816001600160801b0391828151168552826020820151166020860152015116910152565b606082015238611b7f565b602460405162b8e7e760e51b81526004356004820152fd5b50346105b957602090816003193601126105b95760043567ffffffffffffffff81116109b157611ca483913690600401612f4e565b9190611cae61454f565b83925b808410611cbc578480f35b611ccb84828497959697614639565b3594611cd561454f565b611cde866136d3565b15611cfb5760248660405190634a5541ef60e01b82526004820152fd5b611d0486613739565b611f7857611d2886600052600b6020526001600160a01b0360406000205416331490565b15611f5957611d368661376a565b95808552600b90818752611d4f60026040882001613668565b906001600160801b039283835116848b161015611f415781885280895260ff604089205460f01c1615611f2957611d9f8a858b611d9560409a9b9c9d9e8389511661370a565b960151169061370a565b92828a52818b52868a20908b8b7f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa50845497600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8a1617865560038a8216968715611f0f575b01998516998a6001600160801b03198254161790556001600160a01b0380991698899360058652818e822054169889965260019d8e912001541694611e4c8b85886145ab565b604080518a81526001600160801b0392831660208201529290911690820152606090a47ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce78b604051858152a1813b611eb0575b505050505001919093919293611cb1565b813b15611f0b57899493919285809460849360405197889687956372eba20360e01b875260048701526024860152604485015260648401525af1611ef7575b808080611e9f565b611f0090612f7f565b610c29578487611eef565b8980fd5b60018101600160c81b60ff60c81b19825416179055611e06565b602482604051906339c6dc7360e21b82526004820152fd5b602482604051906322cad1af60e11b82526004820152fd5b60405163216caf0d60e01b815260048101879052336024820152604490fd5b6024866040519063fe19f19f60e01b82526004820152fd5b50346105b9576020806003193601126109b15760043590611faf61454f565b818352600b815260ff600160408520015460d01c1615610d2457611fd2826139af565b600581101561215c5760048103611ffb5760248360405190634a5541ef60e01b82526004820152fd5b6003810361201b576024836040519063fe19f19f60e01b82526004820152fd5b600214611f415761204282600052600b6020526001600160a01b0360406000205416331490565b1561213d57818352600b815260ff604084205460f01c1615611f2957818352600b81526040832060ff60f01b19815416905582604051837f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f8380a2600583526001600160a01b03604083205416803b6120e5575b5050507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce791604051908152a180f35b803b1561048857816024818580947f341a0bd90000000000000000000000000000000000000000000000000000000083528960048401525af1612129575b806120b6565b61213290612f7f565b610488578238612123565b60405163216caf0d60e01b815260048101839052336024820152604490fd5b602484634e487b7160e01b81526021600452fd5b50346105b95760203660031901126105b9576004356001600160a01b0390818116809103610488578183541633810361119c5750600a5491816001600160a01b0319841617600a556040519216825260208201527fa2548bd4b805e907c1558a47b5858324fe8bb4a2e1ddfca647eecbf65610eebc60403392a2600954600019810190811161222d5760407f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c91815190600182526020820152a180f35b602482634e487b7160e01b81526011600452fd5b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d5760408264ffffffffff9260209452600b8452205460c81c16604051908152f35b50346105b95760203660031901126105b9576122ab612eed565b9080546001600160a01b03808216933385036122fd576001600160a01b03199394501691829116178255337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808380a380f35b6040516331b339a960e21b81526001600160a01b0386166004820152336024820152604490fd5b50346105b95760203660031901126105b9576001600160a01b03612346612eed565b168015612363578160409160209352600683522054604051908152f35b608460405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e657200000000000000000000000000000000000000000000006064820152fd5b50346105b95760203660031901126105b9576001600160a01b0360406020926004356124126108c08260005260056020526001600160a01b0360406000205416151590565b815260058452205416604051908152f35b50346105b95760203660031901126105b95760206124426004356130a4565b6001600160a01b0360405191168152f35b50346105b957806003193601126105b95760206001600160a01b0360015416604051908152f35b50346105b95760203660031901126105b95760ff6001604060043593848152600b60205220015460d01c161561065d5761072a602091613a36565b50346105b95760203660031901126105b95760043590818152600b60205260ff600160408320015460d01c1615610d2457806124f0836139af565b92600584101561252b57600260209403612511575b50506040519015158152f35b8152600b8352604090205460f01c60ff1690503880612505565b602482634e487b7160e01b81526021600452fd5b50346105b95760203660031901126105b95760043561255c61454f565b612565816136d3565b15612698576125738161467a565b1561267857612581816130a4565b61258a8261369c565b159081612670575b8161265d575b50612645576020816125ca7ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7936130a4565b90808552600783526001600160a01b0360408620926001600160a01b03199384815416905516918286526006845260408620600019815401905581865260058452604086209081541690558085604051937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a48152a180f35b60249060405190630da9b01360e01b82526004820152fd5b6001600160a01b03915016151538612598565b839150612592565b60405163216caf0d60e01b81526004810191909152336024820152604490fd5b602490604051907f817cd6390000000000000000000000000000000000000000000000000000000082526004820152fd5b50346105b9576126d836612f19565b60405191602083019383851067ffffffffffffffff86111761270357610a4f94604052858452613177565b634e487b7160e01b600052604160045260246000fd5b50346105b95760203660031901126105b95760206106016004356136d3565b50346105b9576020806003193601126109b1576004359061275761454f565b612760826136d3565b1561277d5760248260405190634a5541ef60e01b82526004820152fd5b9061278781613739565b6129be576127ab81600052600b6020526001600160a01b0360406000205416331490565b15612678576127b98161376a565b818452600b83526127cf60026040862001613668565b926001600160801b03918285511683821610156129a657838652600b825260ff604087205460f01c161561298e5792827ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce783612844878460409761283a8d9b6128ef9b8e511661370a565b9b0151169061370a565b92848852600b825287868120947f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa50865491600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84161788556003858216988915612974575b01948d169c858e6001600160801b0319819854161790556001600160a01b038094169b8c94600589526001818e892054169d8e98600b8c52200154169685886145ab565b604080518b81526001600160801b0392831660208201529290911690820152606090a4604051848152a1823b612923578480f35b823b15610c2957608492859160405197889687956372eba20360e01b875260048701526024860152604485015260648401525af1612965575b81818080808480f35b61296e90612f7f565b3861295c565b60018101600160c81b60ff60c81b198254161790556128ab565b602484604051906339c6dc7360e21b82526004820152fd5b602484604051906322cad1af60e11b82526004820152fd5b6024906040519063fe19f19f60e01b82526004820152fd5b50346105b95760203660031901126105b9576001600160801b0360406020926001600160a01b03612a05612eed565b16815260028452205416604051908152f35b50346105b957610a4f612a2936612f19565b91612a3c612a37843361320d565b613106565b6132ec565b50346105b957806003193601126105b9576020600954604051908152f35b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d57612a98906139af565b90600582101561197c5760208215838115612ab9575b506040519015158152f35b600191501482612aae565b50346105b95760203660031901126105b95760043590818152600b60205260ff600160408320015460d01c1615610d2457602091604082828152600b85522060ff815460f01c1680612b52575b612b29575b50506001600160801b0360405191168152f35b612b4b92506001600160801b036002612b45920154169161376a565b9061370a565b3880612b16565b5060ff600182015460c81c1615612b11565b50346105b95760403660031901126105b957612b7e612eed565b602435906001600160a01b038080612b95856130a4565b16921691808314612c8957803314908115612c68575b5015612bfe57828452600760205260408420826001600160a01b0319825416179055612bd6836130a4565b167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258480a480f35b608460405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152fd5b9050845260086020526040842033855260205260ff60408520541638612bab565b608460405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152fd5b50346105b95760203660031901126105b95760206124426004356130c9565b50346105b957806003193601126105b957604051908060035491600183811c92818516948515612dca575b60209586861081146118915785885287949392918790821561186f575050600114612d7057505061180192500383613005565b90859250600382527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b858310612db2575050611801935082010138806117f3565b80548389018501528794508693909201918101612d9a565b93607f1693612d3d565b9050346109b15760203660031901126109b1576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361048857602092507f80ac58cd000000000000000000000000000000000000000000000000000000008114908115612e7b575b8115612e51575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501438612e4a565b7f5b5e139f0000000000000000000000000000000000000000000000000000000081149150612e43565b60005b838110612eb85750506000910152565b8181015183820152602001612ea8565b90602091612ee181518092818552858086019101612ea5565b601f01601f1916010190565b600435906001600160a01b038216820361107157565b602435906001600160a01b038216820361107157565b6060906003190112611071576001600160a01b0390600435828116810361107157916024359081168103611071579060443590565b9181601f840112156110715782359167ffffffffffffffff8311611071576020808501948460051b01011161107157565b67ffffffffffffffff811161270357604052565b610160810190811067ffffffffffffffff82111761270357604052565b610100810190811067ffffffffffffffff82111761270357604052565b6060810190811067ffffffffffffffff82111761270357604052565b6040810190811067ffffffffffffffff82111761270357604052565b90601f8019910116810190811067ffffffffffffffff82111761270357604052565b67ffffffffffffffff811161270357601f01601f191660200190565b604435906001600160801b038216820361107157565b1561306057565b606460405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152fd5b60005260056020526001600160a01b03604060002054166130c6811515613059565b90565b6130ec6108c08260005260056020526001600160a01b0360406000205416151590565b60005260076020526001600160a01b036040600020541690565b1561310d57565b608460405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f766564000000000000000000000000000000000000006064820152fd5b9061319b93929161318b612a37843361320d565b6131968383836132ec565b6134b7565b156131a257565b60405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b906001600160a01b038080613221846130a4565b16931691838314938415613254575b50831561323e575b50505090565b61324a919293506130c9565b1614388080613238565b909350600052600860205260406000208260005260205260ff604060002054169238613230565b1561328257565b608460405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152fd5b9061331592916132fb836130a4565b916001600160a01b0394859384809416968791161461327b565b169081158061341e576133278461369c565b159081613415575b508061340c575b6133f457918084926133767ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce79660209661336f856130a4565b161461327b565b60009382855260078652604085206001600160a01b031990818154169055818652600687526040862060001981540190558286526040862060018154019055838652600587528260408720918254161790557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6040519580a48152a1565b60248360405190630da9b01360e01b82526004820152fd5b50831515613336565b9050153861332f565b608460405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152fd5b3d156134b2573d9061349882613027565b916134a66040519384613005565b82523d6000602084013e565b606090565b9290803b1561364057613521916020916001600160a01b0394604051809581948293897f150b7a02000000000000000000000000000000000000000000000000000000009b8c86523360048701521660248501526044840152608060648401526084830190612ec8565b03916000968791165af1908290826135e0575b50506135ba57613542613487565b805190816135b55760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000161490565b909192506020813d8211613638575b816135fc60209383613005565b810103126109b15751907fffffffff00000000000000000000000000000000000000000000000000000000821682036105b95750903880613534565b3d91506135ef565b50505050600190565b6040519061365682612fcd565b60006040838281528260208201520152565b9060405161367581612fcd565b6040819360018154916001600160801b0392838116865260801c6020860152015416910152565b80600052600b60205260ff60016040600020015460d01c161561065d57600052600b60205260ff60016040600020015460d81c1690565b80600052600b60205260ff60016040600020015460d01c161561065d57600052600b60205260ff60016040600020015460c81c1690565b6001600160801b03918216908216039190821161372357565b634e487b7160e01b600052601160045260246000fd5b80600052600b60205260ff60016040600020015460d01c161561065d57600052600b60205260406000205460f81c90565b600090808252600b6020526040822091825464ffffffffff42818360c81c16116138185780600186015460a01c169182421015613802576137b79394955060a01c16809103904203613820565b90828152600b6020526001600160801b03926137dd846002604085200154168094613900565b9283116137ea5750501690565b60029350604092508152600b60205220015460801c90565b505050505060026001600160801b039101541690565b505091505090565b670de0b6b3a76400009160001983830992808302928380861095039480860395146138dc57828510156138a057908291096001821901821680920460028082600302188083028203028083028203028083028203028083028203028083028203028092029003029360018380600003040190848311900302920304170290565b82606492604051927f63a05778000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b5050809250156138ea570490565b634e487b7160e01b600052601260045260246000fd5b9091906000198382098382029182808310920391808303921461399e57670de0b6b3a7640000908183101561396757947faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066994950990828211900360ee1b910360121c170290565b60449086604051917f5173648d00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050670de0b6b3a764000090049150565b80600052600b602052604060002060ff600182015460c81c166000146139d6575050600490565b805460f81c613a2f575460a01c64ffffffffff164210613a29576139f98161376a565b90600052600b6020526001600160801b038060026040600020015416911610600014613a2457600190565b600290565b50600090565b5050600390565b80600052600b602052613a4f6002604060002001613668565b81600052600b602052604060002060ff600182015460c81c16600014613a8257506001600160801b039150602001511690565b5460f81c613a9457506130c69061376a565b6130c691506001600160801b03604081835116920151169061370a565b906001600160a01b036001541660206001600160a01b036060850151166024604051809481937fdcf844a700000000000000000000000000000000000000000000000000000000835260048301525afa80156142e6576000906142b2575b613b3291506001600160801b0360408501511690602060e08601510151916146e3565b916001600160801b0383511660c082015190156142885764ffffffffff815116602082019064ffffffffff8251169081811161424857505064ffffffffff604091511691019064ffffffffff825116908181101561420857505064ffffffffff80421691511690818110156141c8575050600954926001600160801b0381511660405190613bbf82612fcd565b815260006020820152600060408201526001600160a01b036060840151169060c08401519164ffffffffff6020840151169064ffffffffff604085015116906080870151151560a088015115159364ffffffffff6001600160a01b038a511697511660405197613c2e89612f93565b88526020880152604087015260608601526000608086015260a085015260c0840152600060e0840152600161010084015261012083015261014082015284600052600b60205260406000206001600160a01b038251166001600160a01b0319825416178155613cc564ffffffffff602084015116829064ffffffffff60a01b1964ffffffffff60a01b83549260a01b169116179055565b604082015181547eff0000000000000000000000000000000000000000000000000000000000006060850151151560f01b169078ffffffffffffffffffffffffffffffffffffffffffffffffff7dffffffffff000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000006080880151151560f81b169460c81b1691161717178155600181016001600160a01b0360a0840151166001600160a01b0319825416178155613dbc64ffffffffff60c085015116829064ffffffffff60a01b1964ffffffffff60a01b83549260a01b169116179055565b60e083015181546101008501516101208601517fffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff90921692151560c81b79ff00000000000000000000000000000000000000000000000000169290921791151560d01b7aff0000000000000000000000000000000000000000000000000000169190911790151560d81b7bff00000000000000000000000000000000000000000000000000000016179055610140909101518051602082015160801b6001600160801b03199081166001600160801b03928316176002850155926040906003019201511682825416179055600185016009556001600160a01b0360608401511660005260026020526001600160801b0380604060002054168160208501511601166001600160a01b036060850151166000526040600020918254161790556001600160a01b03602083015116801561418457613f37613f318660005260056020526001600160a01b0360406000205416151590565b1561446c565b613f408561369c565b158061417b575b80614173575b61415b5760207ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce791613f98613f318860005260056020526001600160a01b0360406000205416151590565b806000526006825260406000206001815401905586600052600582526040600020816001600160a01b0319825416179055866040519160007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4868152a16140286001600160a01b036060840151166001600160801b038084511681602086015116011690309033906142f2565b6001600160801b036040820151168061412c575b506001600160a01b038251167f075861cbceafeb777e8f15f357121b08f6f3adba387d599bb7b5278ca6192df5610160866001600160a01b03602087015116946141236001600160a01b03606089015116976080810151151560a08201511515906140ed6001600160a01b0360e060c08601519501515116956040519788523360208901526040880190604090816001600160801b0391828151168552826020820151166020860152015116910152565b60a086015260c0850152805164ffffffffff90811660e08601526020820151811661010086015260409091015116610120840152565b610140820152a4565b614155906001600160a01b036060850151166001600160a01b0360e086015151169033906142f2565b3861403c565b60248560405190630da9b01360e01b82526004820152fd5b506000613f4d565b50801515613f47565b606460405162461bcd60e51b815260206004820152602060248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152fd5b6040517f210aec0e00000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b6040517f9fee269100000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b6040517f4c23297000000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b60046040517f6095d3bc000000000000000000000000000000000000000000000000000000008152fd5b6020823d6020116142de575b816142cb60209383613005565b810103126105b95750613b329051613b0f565b3d91506142be565b6040513d6000823e3d90fd5b9290604051927f23b872dd0000000000000000000000000000000000000000000000000000000060208501526001600160a01b03809216602485015216604483015260648201526064815260a081019181831067ffffffffffffffff8411176127035761436192604052614363565b565b6001600160a01b0316906143c360405161437c81612fe9565b6020938482527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564858301526000808587829751910182855af16143bd613487565b916144b7565b805191821591848315614448575b5050509050156143de5750565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b9193818094500103126109b1578201519081151582036105b95750803880846143d1565b1561447357565b606460405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152fd5b9192901561451857508151156144cb575090565b3b156144d45790565b606460405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b82519091501561452b5750805190602001fd5b6104fa9060405191829162461bcd60e51b8352602060048401526024830190612ec8565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361458157565b60046040517fa1c0d6e5000000000000000000000000000000000000000000000000000000008152fd5b916001600160a01b03604051927fa9059cbb000000000000000000000000000000000000000000000000000000006020850152166024830152604482015260448152608081019181831067ffffffffffffffff8411176127035761436192604052614363565b6130c69061461e81613a36565b90600052600b60205260026040600020015460801c9061370a565b91908110156146495760051b0190565b634e487b7160e01b600052603260045260246000fd5b9190916001600160801b038080941691160191821161372357565b60009080825260056020526001600160a01b0380604084205416928333149384156146bf575b505082156146ad57505090565b9091506146ba33926130c9565b161490565b60ff92945090604091815260086020528181203382526020522054169138806146a0565b9092916146ee613649565b936001600160801b03928381169182156147fa5767016345785d8a00008082116147c35780851161478c575061473885614729819386613900565b16946020890195865284613900565b16918461474f60408901948086528287511661465f565b161015614776576147688491826147719551169061370a565b9151169061370a565b168252565b634e487b7160e01b600052600160045260246000fd5b84604491604051917f4fea5c1a00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b60449250604051917f47152d6700000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050505050905060405161480d81612fcd565b6000815260006020820152600060408201529056fea164736f6c6343000815000a"; bytes public constant BYTECODE_NFT_DESCRIPTOR = - hex"6080806040523461001757615dac90816200001d8239f35b600080fdfe6080604052600436101561001257600080fd5b60003560e01c63e9dc63751461002757600080fd5b346142f85760403660031901126142f8576001600160a01b0360043516600435036142f857610056608061486e565b60006080819052606060a081905260c082905260e0819052610120819052610140819052610160819052610180919091526101a0526004356001600160a01b03166101008190526100a690614c58565b61012052610100516040517feac8f5b80000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa908115614305576000916147dd575b506001600160a01b03610117911680608052615669565b60a052610100516040517fa80fc0710000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa8015614305576fffffffffffffffffffffffffffffffff916000916147be575b501660c052610100516040517fad35efd40000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa801561430557600090614781575b6101e59150615889565b61014052610100516040517f4869e12d0000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa90811561430557600091614752575b5060c0516fffffffffffffffffffffffffffffffff16801561473c576fffffffffffffffffffffffffffffffff612710819302160416610100608001526102876004356153c7565b610120608001526040514660208201526bffffffffffffffffffffffff1960043560601b16604082015260243560548201526054815280608081011067ffffffffffffffff60808301111761431157608081016040526020815191012061041a602963ffffffff61032e6103078261016861ffff8860101c160616614b08565b91601e604660ff6103248460146050848d60081c16060116614b08565b9816060116614b08565b6040519485927f68736c2800000000000000000000000000000000000000000000000000000000602085015261036e815180926020602488019101614826565b83017f2c0000000000000000000000000000000000000000000000000000000000000060248201526103aa825180936020602585019101614826565b017f252c00000000000000000000000000000000000000000000000000000000000060258201526103e5825180936020602785019101614826565b017f252900000000000000000000000000000000000000000000000000000000000060278201520360098101845201826148df565b6104526fffffffffffffffffffffffffffffffff6040608001511660ff61044b6001600160a01b03608051166155dc565b1690614e89565b6104666001600160a01b0360805116614c58565b60a051610100516040517fbc2be1be0000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa80156143055760249160009161471d575b5060206001600160a01b03608080015116604051938480927f9067b677000000000000000000000000000000000000000000000000000000008252823560048301525afa801561430557610528926000916146ee575b5064ffffffffff80911691166151d5565b61012051610180519092916105b2602161054f6064610548818706615744565b9504614b08565b6040519481610568879351809260208087019101614826565b820161057d8251809360208085019101614826565b017f250000000000000000000000000000000000000000000000000000000000000060208201520360018101855201836148df565b610100608001519260c060800151956101206080015197604051996105d68b61486e565b8a5260208a015260408901526060880152608087015260a086015260c085015260e0840152610100830152610120820152604051806101c081011067ffffffffffffffff6101c083011117614311576101c0810160405260608152600060208201526000604082015260608082015260006080820152606060a0820152600060c0820152600060e08201526060610100820152600061012082015260006101408201526060610160820152600061018082015260006101a082015260a08201516106a660c0840151845190615a7a565b906109b361015c604051926106ba846148c3565b600884527f50726f677265737300000000000000000000000000000000000000000000000060208501526107236040516106f38161488b565b60009052855160208701207fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4701490565b156146e6576090945b61073586614b08565b916040519586938493661e339034b21e9160c91b60208601526109818351958692610767846027840160208901614826565b6d11103334b6361e9111b33333111f60911b602785840101526c1e3932b1ba103bb4b23a341e9160991b603585840101526107ae8551809660206042888701019101614826565b7f22206865696768743d22313030222066696c6c2d6f7061636974793d222e3033828501860160428101919091527f222072783d223135222072793d22313522207374726f6b653d2223666666222060628201527f7374726f6b652d6f7061636974793d222e3122207374726f6b652d77696474686082820152651e911a11179f60d11b60a28201527f3c7465787420783d2232302220793d2233342220666f6e742d66616d696c793d60a88201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f7370616365222060c8820152703337b73a16b9b4bd329e911919383c111f60791b60e88201528651966108b491889160f990910190602001614826565b661e17ba32bc3a1f60c91b8285018601870160f98101919091527f3c7465787420783d2232302220793d2237322220666f6e742d66616d696c793d6101008201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f73706163652220610120820152703337b73a16b9b4bd329e91191b383c111f60791b61014082015287519761094f91899161015190910190602001614826565b661e17ba32bc3a1f60c91b6101518888888887010101010152602061015888888885519c8d9701010101019101614826565b631e17b39f60e11b90860190910190910190910190910161015881019190915281900361013c810190915201826148df565b6101008301526101208201526028610100830151604051906109d48261488b565b60008252610c7a61015c604051926109eb846148c3565b600684527f53746174757300000000000000000000000000000000000000000000000000006020850152610a1e84615cba565b610a2782615d37565b808211156146de5750945b610a3d878701614b08565b91604051958693661e339034b21e9160c91b60208601528151610a67816027880160208601614826565b85016d11103334b6361e9111b33333111f60911b60278201526c1e3932b1ba103bb4b23a341e9160991b6035820152610aaa825180936020604285019101614826565b017f22206865696768743d22313030222066696c6c2d6f7061636974793d222e303360428201527f222072783d223135222072793d22313522207374726f6b653d2223666666222060628201527f7374726f6b652d6f7061636974793d222e3122207374726f6b652d77696474686082820152651e911a11179f60d11b60a28201527f3c7465787420783d2232302220793d2233342220666f6e742d66616d696c793d60a88201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f7370616365222060c8820152703337b73a16b9b4bd329e911919383c111f60791b60e8820152610ba682518093602060f985019101614826565b01661e17ba32bc3a1f60c91b60f98201527f3c7465787420783d2232302220793d2237322220666f6e742d66616d696c793d6101008201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f73706163652220610120820152703337b73a16b9b4bd329e91191b383c111f60791b610140820152610c3582518093602061015185019101614826565b01661e17ba32bc3a1f60c91b610151820152610c5c82518093602061015885019101614826565b01631e17b39f60e11b6101588201520361013c8101845201826148df565b610160840152016101808201526028602083015160405190610c9b8261488b565b60008252610ce561015c60405192610cb2846148c3565b600684527f416d6f756e7400000000000000000000000000000000000000000000000000006020850152610a1e84615cba565b835201602082015261102060808301516030604051610d038161488b565b60008152610faa61015c60405194610d1a866148c3565b600886527f4475726174696f6e0000000000000000000000000000000000000000000000006020870152610d4d86615cba565b610d5682615d37565b808211156146d65750935b610d6d60288601614b08565b91604051978893661e339034b21e9160c91b60208601528151610d97816027880160208601614826565b85016d11103334b6361e9111b33333111f60911b60278201526c1e3932b1ba103bb4b23a341e9160991b6035820152610dda825180936020604285019101614826565b017f22206865696768743d22313030222066696c6c2d6f7061636974793d222e303360428201527f222072783d223135222072793d22313522207374726f6b653d2223666666222060628201527f7374726f6b652d6f7061636974793d222e3122207374726f6b652d77696474686082820152651e911a11179f60d11b60a28201527f3c7465787420783d2232302220793d2233342220666f6e742d66616d696c793d60a88201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f7370616365222060c8820152703337b73a16b9b4bd329e911919383c111f60791b60e8820152610ed682518093602060f985019101614826565b01661e17ba32bc3a1f60c91b60f98201527f3c7465787420783d2232302220793d2237322220666f6e742d66616d696c793d6101008201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f73706163652220610120820152703337b73a16b9b4bd329e91191b383c111f60791b610140820152610f6582518093602061015185019101614826565b01661e17ba32bc3a1f60c91b610151820152610f8c82518093602061015885019101614826565b01631e17b39f60e11b6101588201520361013c8101865201846148df565b8260a08601526028810160c0860152602085015190610120860151809161018088015192839185010101605881016080890152605719906103e8030160011c8061014089015201601081016101a088015201602081016040870152010160e0840152610100830151610160840151845191614e1f565b6060820152604051908161010081011067ffffffffffffffff6101008401111761431157610100820160405260c782527f3c726563742077696474683d223130302522206865696768743d22313030252260208301527f2066696c7465723d2275726c28234e6f69736529222f3e3c7265637420783d2260408301527f37302220793d223730222077696474683d2238363022206865696768743d223860608301527f3630222066696c6c3d2223666666222066696c6c2d6f7061636974793d222e3060808301527f33222072783d223435222072793d22343522207374726f6b653d22236666662260a08301527f207374726f6b652d6f7061636974793d222e3122207374726f6b652d7769647460c08301527f683d2234222f3e0000000000000000000000000000000000000000000000000060e083015282519161010084015191606081015194604051611176816148a7565b603381527f3c636972636c652069643d22476c6f772220723d22353030222066696c6c3d2260208201527f75726c282352616469616c476c6f7729222f3e000000000000000000000000006040820152604051966111d38861486e565b61011c88527f3c66696c7465722069643d224e6f697365223e3c6665466c6f6f6420783d223060208901527f2220793d2230222077696474683d223130302522206865696768743d2231303060408901527f252220666c6f6f642d636f6c6f723d2268736c283233302c3231252c3131252960608901527f2220666c6f6f642d6f7061636974793d22312220726573756c743d22666c6f6f60808901527f6446696c6c222f3e3c666554757262756c656e6365206261736546726571756560a08901527f6e63793d222e3422206e756d4f6374617665733d22332220726573756c743d2260c08901527f4e6f6973652220747970653d226672616374616c4e6f697365222f3e3c66654260e08901527f6c656e6420696e3d224e6f6973652220696e323d22666c6f6f6446696c6c22206101008901527f6d6f64653d22736f66742d6c69676874222f3e3c2f66696c7465723e0000000061012089015260405197886103a081011067ffffffffffffffff6103a08b011117614311576103a0890160405261037b89527f3c706174682069643d224c6f676f222066696c6c3d2223666666222066696c6c60208a01527f2d6f7061636974793d222e312220643d226d3133332e3535392c3132342e303360408a01527f34632d2e3031332c322e3431322d312e3035392c342e3834382d322e3932332c60608a01527f362e3430322d322e3535382c312e3831392d352e3136382c332e3433392d372e60808a01527f3838382c342e3939362d31342e34342c382e3236322d33312e3034372c31322e60a08a01527f3536352d34372e3637342c31322e3536392d382e3835382e3033362d31372e3860c08a01527f33382d312e3237322d32362e3332382d332e3636332d392e3830362d322e373660e08a01527f362d31392e3038372d372e3131332d32372e3536322d31322e3737382d31332e6101008a01527f3834322d382e3032352c392e3436382d32382e3630362c31362e3135332d33356101208a01527f2e323635683063322e3033352d312e3833382c342e3235322d332e3534362c366101408a01527f2e3436332d352e323234683063362e3432392d352e3635352c31362e3231382d6101608a01527f322e3833352c32302e3335382c342e31372c342e3134332c352e3035372c382e6101808a01527f3831362c392e3634392c31332e39322c31332e373334682e30333763352e37336101a08a01527f362c362e3436312c31352e3335372d322e3235332c392e33382d382e34382c306101c08a01527f2c302d332e3531352d332e3531352d332e3531352d332e3531352d31312e34396101e08a01527f2d31312e3437382d35322e3635362d35322e3636342d36342e3833372d36342e6102008a01527f3833376c2e3034392d2e303337632d312e3732352d312e3630362d322e3731396102208a01527f2d332e3834372d322e3735312d362e3230346830632d2e3034362d322e3337356102408a01527f2c312e3036322d342e3538322c322e3732362d362e32323968306c2e3138352d6102608a01527f2e3134386830632e3039392d2e3036322c2e3232322d2e3134382c2e33372d2e6102808a01527f323539683063322e30362d312e3336322c332e3935312d322e3632312c362e306102a08a01527f34342d332e3834324335372e3736332d332e3437332c39372e37362d322e33346102c08a01527f312c3132382e3633372c31382e3333326331362e3637312c392e3934362d32366102e08a01527f2e3334342c35342e3831332d33382e3635312c34302e3139392d362e3239392d6103008a01527f362e3039362d31382e3036332d31372e3734332d31392e3636382d31382e38316103208a01527f312d362e3031362d342e3034372d31332e3036312c342e3737362d372e3735326103408a01527f2c392e3735316c36382e3235342c36382e33373163312e3732342c312e3630316103608a01527f2c322e3731342c332e38342c322e3733382c362e3139325a222f3e00000000006103808a0152604051978860a081011067ffffffffffffffff60a08b01111761431157611cb1611d129160a08b0160405260758b527f3c706174682069643d22466c6f6174696e6754657874222066696c6c3d226e6f60208c01527f6e652220643d224d31323520343568373530733830203020383020383076373560408c01527f307330203830202d3830203830682d373530732d38302030202d3830202d383060608c01527f762d3735307330202d3830203830202d3830222f3e000000000000000000000060808c0152611868615a41565b906040517f3c72616469616c4772616469656e742069643d2252616469616c476c6f77223e6020820152611d0d60d87f3c73746f70206f66667365743d223025222073746f702d636f6c6f723d22000093846040850152805161199a60b88660208501936118da81605e840187614826565b8101997f222073746f702d6f7061636974793d222e36222f3e0000000000000000000000605e8c01527f3c73746f70206f66667365743d2231303025222073746f702d636f6c6f723d229a8b607382015261193f825180936020609385019101614826565b017f222073746f702d6f7061636974793d2230222f3e00000000000000000000000060938201527f3c2f72616469616c4772616469656e743e00000000000000000000000000000060a78201520360988101885201866148df565b6119a2615a41565b90604051967f3c6c696e6561724772616469656e742069643d2253616e64546f70222078313d60208901527f223025222079313d223025223e000000000000000000000000000000000000006040890152604d8801528251611a0881606b8a0184614826565b8701917f222f3e00000000000000000000000000000000000000000000000000000000009283606b82015289606e820152611a4d825180936020608e85019101614826565b019082608e830152611a9160a2897f3c2f6c696e6561724772616469656e743e0000000000000000000000000000009485609182015203608281018b5201896148df565b611bd7610108611a9f615a41565b6040519b8c917f3c6c696e6561724772616469656e742069643d2253616e64426f74746f6d222060208401527f78313d2231303025222079313d2231303025223e00000000000000000000000060408401527f3c73746f70206f66667365743d22313025222073746f702d636f6c6f723d22006054840152611b2b815180926020607387019101614826565b8201908760738301526076820152875190611b4a826096830188614826565b018660968201527f3c616e696d617465206174747269627574654e616d653d22783122206475723d60998201527f2236732220726570656174436f756e743d22696e646566696e6974652220766160b98201527f6c7565733d223330253b3630253b313230253b3630253b3330253b222f3e000060d98201528560f78201520360e881018c52018a6148df565b611bdf615a41565b906040519a8b957f3c6c696e6561724772616469656e742069643d22486f7572676c61737353747260208801527f6f6b6522206772616469656e745472616e73666f726d3d22726f74617465283960408801527f302922206772616469656e74556e6974733d227573657253706163654f6e557360608801527f65223e000000000000000000000000000000000000000000000000000000000060808801527f3c73746f70206f66667365743d22353025222073746f702d636f6c6f723d2200608388015251809260a2880190614826565b84018360a28201527f3c73746f70206f66667365743d22383025222073746f702d636f6c6f723d220060a5820152611cf382518093602060c485019101614826565b019160c483015260c78201520360b88101875201856148df565b614e1f565b92611d32611d1e615817565b896020815191012090602081519101201490565b9788156146ad575b506040518060c081011067ffffffffffffffff60c0830111176143115760c08101604052609081527f3c7061746820643d224d2035302c3336302061203330302c333030203020312c60208201527f31203630302c302061203330302c333030203020312c31202d3630302c30222060408201527f66696c6c3d2223666666222066696c6c2d6f7061636974793d222e303222207360608201527f74726f6b653d2275726c2823486f7572676c6173735374726f6b65292220737460808201527f726f6b652d77696474683d2234222f3e0000000000000000000000000000000060a082015260405193846102c081011067ffffffffffffffff6102c087011117614311576102c0850160405261029885527f3c7061746820643d226d3536362c3136312e323031762d35332e39323463302d60208601527f31392e3338322d32322e3531332d33372e3536332d36332e3339382d35312e3160408601527f39382d34302e3735362d31332e3539322d39342e3934362d32312e3037392d3160608601527f35322e3538372d32312e303739732d3131312e3833382c372e3438372d31353260808601527f2e3630322c32312e303739632d34302e3839332c31332e3633362d36332e343160a08601527f332c33312e3831362d36332e3431332c35312e3139387635332e39323463302c60c08601527f31372e3138312c31372e3730342c33332e3432372c35302e3232332c34362e3360e08601527f3934763238342e383039632d33322e3531392c31322e39362d35302e3232332c6101008601527f32392e3230362d35302e3232332c34362e3339347635332e39323463302c31396101208601527f2e3338322c32322e35322c33372e3536332c36332e3431332c35312e3139382c6101408601527f34302e3736332c31332e3539322c39342e3935342c32312e3037392c3135322e6101608601527f3630322c32312e303739733131312e3833312d372e3438372c3135322e3538376101808601527f2d32312e3037396334302e3838362d31332e3633362c36332e3339382d33312e6101a08601527f3831362c36332e3339382d35312e313938762d35332e39323463302d31372e316101c08601527f39362d31372e3730342d33332e3433352d35302e3232332d34362e34303156326101e08601527f30372e3630336333322e3531392d31322e3936372c35302e3232332d32392e326102008601527f30362c35302e3232332d34362e3430315a6d2d3334372e3436322c35372e37396102208601527f336c3133302e3935392c3133312e3032372d3133302e3935392c3133312e30316102408601527f33563231382e3939345a6d3236322e3932342e303232763236322e3031386c2d6102608601527f3133302e3933372d3133312e3030362c3133302e3933372d3133312e3031335a6102808601527f222066696c6c3d2223313631383232223e3c2f706174683e00000000000000006102a0860152896000146144885760405161218c8161488b565b60008152995b1561432757604051806101e081011067ffffffffffffffff6101e083011117614311576101e081016040526101b181527f3c7061746820643d226d3438312e34362c3438312e35347638312e3031632d3260208201527f2e33352e37372d342e38322c312e35312d372e33392c322e32332d33302e332c60408201527f382e35342d37342e36352c31332e39322d3132342e30362c31332e39322d353360608201527f2e362c302d3130312e32342d362e33332d3133312e34372d31362e3136762d3860808201527f316c34362e332d34362e3331683137302e33336c34362e32392c34362e33315a60a08201527f222066696c6c3d2275726c282353616e64426f74746f6d29222f3e3c7061746860c08201527f20643d226d3433352e31372c3433352e323363302c312e31372d2e34362c322e60e08201527f33322d312e33332c332e34342d372e31312c392e30382d34312e39332c31352e6101008201527f39382d38332e38312c31352e3938732d37362e372d362e392d38332e38322d316101208201527f352e3938632d2e38372d312e31322d312e33332d322e32372d312e33332d332e6101408201527f3434762d2e30346c382e33342d382e33352e30312d2e30316331332e37322d366101608201527f2e35312c34322e39352d31312e30322c37362e382d31312e30327336322e39376101808201527f2c342e34392c37362e37322c31316c382e34322c382e34325a222066696c6c3d6101a08201527f2275726c282353616e64546f7029222f3e0000000000000000000000000000006101c0820152995b60405196876107e081011067ffffffffffffffff6107e08a01111761431157613b9f9c612e5a6036602d9960819f97631e17b39f60e11b8d7f3c2f646566733e000000000000000000000000000000000000000000000000009a612f2b9f6107e0016040526107a782527f3c672066696c6c3d226e6f6e6522207374726f6b653d2275726c2823486f757260208301527f676c6173735374726f6b652922207374726f6b652d6c696e656361703d22726f60408301527f756e6422207374726f6b652d6d697465726c696d69743d22313022207374726f60608301527f6b652d77696474683d2234223e3c7061746820643d226d3536352e3634312c3160808301527f30372e323863302c392e3533372d352e35362c31382e3632392d31352e36373660a08301527f2c32362e393733682d2e303233632d392e3230342c372e3539362d32322e313960c08301527f342c31342e3536322d33382e3139372c32302e3539322d33392e3530342c313460e08301527f2e3933362d39372e3332352c32342e3335352d3136312e3733332c32342e33356101008301527f352d39302e34382c302d3136372e3934382d31382e3538322d3139392e3935336101208301527f2d34342e393438682d2e303233632d31302e3131352d382e3334342d31352e366101408301527f37362d31372e3433372d31352e3637362d32362e3937332c302d33392e3733356101608301527f2c39362e3535342d37312e3932312c3231352e3635322d37312e3932317332316101808301527f352e3632392c33322e3138352c3231352e3632392c37312e3932315a222f3e3c6101a08301527f7061746820643d226d3133342e33362c3136312e32303363302c33392e3733356101c08301527f2c39362e3535342c37312e3932312c3231352e3635322c37312e3932317332316101e08301527f352e3632392d33322e3138362c3231352e3632392d37312e393231222f3e3c6c6102008301527f696e652078313d223133342e3336222079313d223136312e323033222078323d6102208301527f223133342e3336222079323d223130372e3238222f3e3c6c696e652078313d226102408301527f3536352e3634222079313d223136312e323033222078323d223536352e3634226102608301527f2079323d223130372e3238222f3e3c6c696e652078313d223138342e353834226102808301527f2079313d223230362e383233222078323d223138342e353835222079323d22356102a08301527f33372e353739222f3e3c6c696e652078313d223231382e313831222079313d226102c08301527f3231382e313138222078323d223231382e313831222079323d223536322e35336102e08301527f37222f3e3c6c696e652078313d223438312e383138222079313d223231382e316103008301527f3432222078323d223438312e383139222079323d223536322e343238222f3e3c6103208301527f6c696e652078313d223531352e343135222079313d223230372e3335322220786103408301527f323d223531352e343136222079323d223533372e353739222f3e3c70617468206103608301527f643d226d3138342e35382c3533372e353863302c352e34352c342e32372c31306103808301527f2e36352c31322e30332c31352e3432682e303263352e35312c332e33392c31326103a08301527f2e37392c362e35352c32312e35352c392e34322c33302e32312c392e392c37386103c08301527f2e30322c31362e32382c3133312e38332c31362e32382c34392e34312c302c396103e08301527f332e37362d352e33382c3132342e30362d31332e39322c322e372d2e37362c356104008301527f2e32392d312e35342c372e37352d322e33352c382e37372d322e38372c31362e6104208301527f30352d362e30342c32312e35362d392e3433683063372e37362d342e37372c316104408301527f322e30342d392e39372c31322e30342d31352e3432222f3e3c7061746820643d6104608301527f226d3138342e3538322c3439322e363536632d33312e3335342c31322e3438356104808301527f2d35302e3232332c32382e35382d35302e3232332c34362e3134322c302c392e6104a08301527f3533362c352e3536342c31382e3632372c31352e3637372c32362e393639682e6104c08301527f30323263382e3530332c372e3030352c32302e3231332c31332e3436332c33346104e08301527f2e3532342c31392e3135392c392e3939392c332e3939312c32312e3236392c376105008301527f2e3630392c33332e3539372c31302e3738382c33362e34352c392e3430372c386105208301527f322e3138312c31352e3030322c3133312e3833352c31352e3030327339352e336105408301527f36332d352e3539352c3133312e3830372d31352e3030326331302e3834372d326105608301527f2e37392c32302e3836372d352e3932362c32392e3932342d392e3334392c312e6105808301527f3234342d2e3436372c322e3437332d2e3934322c332e3637332d312e3432342c6105a08301527f31342e3332362d352e3639362c32362e3033352d31322e3136312c33342e35326105c08301527f342d31392e313733682e3032326331302e3131342d382e3334322c31352e36376105e08301527f372d31372e3433332c31352e3637372d32362e3936392c302d31372e3536322d6106008301527f31382e3836392d33332e3636352d35302e3232332d34362e3135222f3e3c70616106208301527f746820643d226d3133342e33362c3539322e373263302c33392e3733352c39366106408301527f2e3535342c37312e3932312c3231352e3635322c37312e393231733231352e366106608301527f32392d33322e3138362c3231352e3632392d37312e393231222f3e3c6c696e656106808301527f2078313d223133342e3336222079313d223539322e3732222078323d223133346106a08301527f2e3336222079323d223533382e373937222f3e3c6c696e652078313d223536356106c08301527f2e3634222079313d223539322e3732222078323d223536352e3634222079323d6106e08301527f223533382e373937222f3e3c706f6c796c696e6520706f696e74733d223438316107008301527f2e383232203438312e393031203438312e373938203438312e383737203438316107208301527f2e373735203438312e383534203335302e303135203335302e303236203231386107408301527f2e313835203231382e313239222f3e3c706f6c796c696e6520706f696e74733d6107608301527f223231382e313835203438312e393031203231382e323331203438312e3835346107808301527f203335302e303135203335302e303236203438312e383232203231382e3135326107a08301527f222f3e3c2f673e000000000000000000000000000000000000000000000000006107c0830152604051998a957f3c672069643d22486f7572676c617373223e00000000000000000000000000006020880152603295612df68151809260208a8c019101614826565b8701612e0b8251809360208a85019101614826565b01612e1f8251809360208985019101614826565b01612e338251809360208885019101614826565b01612e478251809360208785019101614826565b01918201520360168101865201846148df565b6040519e8f9788977f3c646566733e000000000000000000000000000000000000000000000000000060208a0152612e9f6026998260208c9451948593019101614826565b8901612eb48251809360208c85019101614826565b01612ec88251809360208b85019101614826565b01612edc8251809360208a85019101614826565b01612ef08251809360208985019101614826565b01612f048251809360208885019101614826565b01612f188251809360208785019101614826565b019182015203600d8101895201876148df565b6137be604c60e08301516101208401519361351a61314d6060604084015193015196612f578186615985565b9461314861012b604051612f6a816148c3565b600581527f2d3130302500000000000000000000000000000000000000000000000000000060208201526040519889917f3c74657874506174682073746172744f66667365743d220000000000000000006020840152612fd4815180926020603787019101614826565b7f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666683820160378101919091527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e00000000000000000061010982015282519261311891849161012090910190602001614826565b6a1e17ba32bc3a2830ba341f60a91b90830190910161012081019190915281900361010b810190915201876148df565b615985565b9561332c61012b604051613160816148c3565b600281527f30250000000000000000000000000000000000000000000000000000000000006020820152604051998a917f3c74657874506174682073746172744f66667365743d2200000000000000000060208401526131ca815180926020603787019101614826565b82017f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666660378201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e00000000000000000061010982015261330782518093602061012085019101614826565b016a1e17ba32bc3a2830ba341f60a91b6101208201520361010b81018a5201886148df565b61333681846159ed565b9261351561012b604051613349816148c3565b600481527f2d3530250000000000000000000000000000000000000000000000000000000060208201526040519687917f3c74657874506174682073746172744f66667365743d2200000000000000000060208401526133b3815180926020603787019101614826565b82017f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666660378201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e0000000000000000006101098201526134f082518093602061012085019101614826565b016a1e17ba32bc3a2830ba341f60a91b6101208201520361010b8101875201856148df565b6159ed565b906136f961012b60405161352d816148c3565b600381527f353025000000000000000000000000000000000000000000000000000000000060208201526040519485917f3c74657874506174682073746172744f66667365743d220000000000000000006020840152613597815180926020603787019101614826565b82017f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666660378201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e0000000000000000006101098201526136d482518093602061012085019101614826565b016a1e17ba32bc3a2830ba341f60a91b6101208201520361010b8101855201836148df565b6040519586937f3c7465787420746578742d72656e646572696e673d226f7074696d697a65537060208601527f656564223e000000000000000000000000000000000000000000000000000000604086015261375f815180926020604589019101614826565b8401613775825180936020604585019101614826565b0161378a825180936020604585019101614826565b0161379f825180936020604585019101614826565b01661e17ba32bc3a1f60c91b604582015203602c8101845201826148df565b613a9e61019a6101408401516101a0850151906137ff6137f96137f36137ed60e060408b01519a015194614b08565b94614b08565b97614b08565b91614b08565b956040519687937f3c75736520687265663d2223476c6f77222066696c6c2d6f7061636974793d2260208601527f2e39222f3e00000000000000000000000000000000000000000000000000000060408601527f3c75736520687265663d2223476c6f772220783d22313030302220793d22313060458601527f3030222066696c6c2d6f7061636974793d222e39222f3e00000000000000000060658601527f3c75736520687265663d22234c6f676f2220783d223137302220793d22313730607c8601527f22207472616e73666f726d3d227363616c65282e3629222f3e3c757365206872609c8601527f65663d2223486f7572676c6173732220783d223135302220793d22393022207460bc8601527f72616e73666f726d3d22726f746174652831302922207472616e73666f726d2d60dc8601527f6f726967696e3d2235303020353030222f3e000000000000000000000000000060fc8601527f3c75736520687265663d222350726f67726573732220783d220000000000000061010e8601526101279061399a815180926020858a019101614826565b8501937f2220793d22373930222f3e00000000000000000000000000000000000000000080948180948801527f3c75736520687265663d22235374617475732220783d2200000000000000000061013288015261014996613a048251809360208b85019101614826565b01958601527f3c75736520687265663d2223416d6f756e742220783d2200000000000000000061015486015261016b94613a478251809360208985019101614826565b01938401527f3c75736520687265663d22234475726174696f6e2220783d220000000000000061017684015261018f92613a8a8251809360208785019101614826565b01918201520361017a8101855201836148df565b6040519586937f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323060208601527f30302f737667222077696474683d223130303022206865696768743d2231303060408601527f30222076696577426f783d2230203020313030302031303030223e00000000006060860152613b2a815180926020607b89019101614826565b8401613b40825180936020607b85019101614826565b01613b55825180936020607b85019101614826565b01613b6a825180936020607b85019101614826565b017f3c2f7376673e0000000000000000000000000000000000000000000000000000607b8201520360618101845201826148df565b6101605260a051610100516040517fb971302a0000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa908115614305576000916142ba575b6142b661424f614154614245609487613d3b6089613c198a614c58565b9260c0608001516040519485927f5b7b2274726169745f74797065223a224173736574222c2276616c7565223a226020850152613c60815180926020604088019101614826565b8301907f227d2c7b2274726169745f74797065223a2253656e646572222c2276616c756560408301527f223a22000000000000000000000000000000000000000000000000000000000091826060820152613cc5825180936020606385019101614826565b01907f227d2c7b2274726169745f74797065223a22537461747573222c2276616c756560638301526083820152613d06825180936020608685019101614826565b017f227d5d000000000000000000000000000000000000000000000000000000000060868201520360698101845201826148df565b6101a05160a05161403e61017e613d53602435614b08565b9360a060800151613d6e6001600160a01b0360805116614c58565b90604051968793613f2b60208601987f54686973204e465420726570726573656e74732061207061796d656e742073748a527f7265616d20696e2061205361626c696572205632200000000000000000000000604088015282516020840190613ddb8160558b0184614826565b8801947f20636f6e74726163742e20546865206f776e6572206f662074686973204e465460558701527f2063616e207769746864726177207468652073747265616d656420617373657460758701527f732c207768696368206172652064656e6f6d696e6174656420696e2000000000609587015282516020840196613e658260b183018a614826565b017f2e5c6e5c6e2d2053747265616d2049443a20000000000000000000000000000060b1820152613ea082518093602060c385019101614826565b01613ed97f5c6e2d2000000000000000000000000000000000000000000000000000000000958660c384015251809360c7840190614826565b01947f20416464726573733a2000000000000000000000000000000000000000000000958660c7820152613f1782518093602060d185019101614826565b019260d184015251809360d5840190614826565b019060d5820152613f4682518093602060df85019101614826565b017f5c6e5c6e0000000000000000000000000000000000000000000000000000000060df8201527fe29aa0efb88f205741524e494e473a205472616e7366657272696e672074686560e38201527f204e4654206d616b657320746865206e6577206f776e657220746865207265636101038201527f697069656e74206f66207468652073747265616d2e205468652066756e6473206101238201527f617265206e6f74206175746f6d61746963616c6c792077697468647261776e206101438201527f666f72207468652070726576696f757320726563697069656e742e00000000006101638201520361015e8101855201836148df565b6101a051906141af614051602435614b08565b916140d0602d604051809560208201976a029b0b13634b2b9102b19160ad1b8952614086815180926020602b87019101614826565b82017f2023000000000000000000000000000000000000000000000000000000000000602b8201526140c18251809360208785019101614826565b0103600d8101865201846148df565b610160516140dd90614994565b94604051998a977f7b2261747472696275746573223a00000000000000000000000000000000000060208a015261411e815180926020602e8d019101614826565b8801917f2c226465736372697074696f6e223a2200000000000000000000000000000000602e840152518093603e840190614826565b01917f222c2265787465726e616c5f75726c223a2268747470733a2f2f7361626c6965603e8401527f722e636f6d222c226e616d65223a220000000000000000000000000000000000605e840152518093606d840190614826565b017f222c22696d616765223a22646174613a696d6167652f7376672b786d6c3b6261606d8201527f736536342c000000000000000000000000000000000000000000000000000000608d820152614210825180936020609285019101614826565b017f227d00000000000000000000000000000000000000000000000000000000000060928201520360748101845201826148df565b60e0819052614994565b6142a2603d60405180937f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000060208301526142928151809260208686019101614826565b810103601d8101845201826148df565b604051918291602083526020830190614849565b0390f35b90506020813d6020116142fd575b816142d5602093836148df565b810103126142f85751906001600160a01b03821682036142f85790614154613bfc565b600080fd5b3d91506142c8565b6040513d6000823e3d90fd5b634e487b7160e01b600052604160045260246000fd5b6040518061012081011067ffffffffffffffff6101208301111761431157610120810160405260f881527f3c7061746820643d226d3438312e34362c3530342e3130317635382e3434396360208201527f2d322e33352e37372d342e38322c312e35312d372e33392c322e32332d33302e60408201527f332c382e35342d37342e36352c31332e39322d3132342e30362c31332e39322d60608201527f35332e362c302d3130312e32342d362e33332d3133312e34372d31362e31367660808201527f2d35382e343339683236322e39325a222066696c6c3d2275726c282353616e6460a08201527f426f74746f6d29222f3e3c656c6c697073652063783d22333530222063793d2260c08201527f3530342e313031222072783d223133312e343632222072793d2232382e31303860e08201527f222066696c6c3d2275726c282353616e64546f7029222f3e0000000000000000610100820152996123df565b604051806101c081011067ffffffffffffffff6101c083011117614311576101c0810160405261019981527f3c706f6c79676f6e20706f696e74733d22333530203335302e3032362034313560208201527f2e3033203238342e39373820323835203238342e39373820333530203335302e60408201527f303236222066696c6c3d2275726c282353616e64426f74746f6d29222f3e3c7060608201527f61746820643d226d3431362e3334312c3238312e39373563302c2e3931342d2e60808201527f3335342c312e3830392d312e3033352c322e36382d352e3534322c372e30373660a08201527f2d33322e3636312c31322e34352d36352e32382c31322e34352d33322e36323460c08201527f2c302d35392e3733382d352e3337342d36352e32382d31322e34352d2e36383160e08201527f2d2e3837322d312e3033352d312e3736372d312e3033352d322e36382c302d2e6101008201527f3931342e3335342d312e3830382c312e3033352d322e3637362c352e3534322d6101208201527f372e3037362c33322e3635362d31322e34352c36352e32382d31322e34352c336101408201527f322e3631392c302c35392e3733382c352e3337342c36352e32382c31322e34356101608201527f2e3638312e3836372c312e3033352c312e3736322c312e3033352c322e3637366101808201527f5a222066696c6c3d2275726c282353616e64546f7029222f3e000000000000006101a082015299612192565b6146cf9198506146bb615850565b906020815191012090602081519101201490565b9638611d3a565b905093610d61565b905094610a32565b60d09461072c565b614710915060203d602011614716575b61470881836148df565b810190614929565b38610517565b503d6146fe565b614736915060203d6020116147165761470881836148df565b386104c1565b634e487b7160e01b600052601260045260246000fd5b614774915060203d60201161477a575b61476c81836148df565b810190614901565b3861023f565b503d614762565b506020813d6020116147b6575b8161479b602093836148df565b810103126142f8575160058110156142f8576101e5906101db565b3d915061478e565b6147d7915060203d60201161477a5761476c81836148df565b38610181565b90506020813d60201161481e575b816147f8602093836148df565b810103126142f857516001600160a01b03811681036142f8576001600160a01b03610100565b3d91506147eb565b60005b8381106148395750506000910152565b8181015183820152602001614829565b9060209161486281518092818552858086019101614826565b601f01601f1916010190565b610140810190811067ffffffffffffffff82111761431157604052565b6020810190811067ffffffffffffffff82111761431157604052565b6060810190811067ffffffffffffffff82111761431157604052565b6040810190811067ffffffffffffffff82111761431157604052565b90601f8019910116810190811067ffffffffffffffff82111761431157604052565b908160209103126142f857516fffffffffffffffffffffffffffffffff811681036142f85790565b908160209103126142f8575164ffffffffff811681036142f85790565b67ffffffffffffffff811161431157601f01601f191660200190565b9061496c82614946565b61497960405191826148df565b828152809261498a601f1991614946565b0190602036910137565b805115614af4576040516149a7816148a7565b604081527f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208201527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f60408201528151600292838201809211614ade5760038092047f3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81168103614ade57614a41908594951b614962565b936020850193829183518401925b838110614a8d5750505050510680600114614a7a57600214614a6f575090565b603d90600019015390565b50603d9081600019820153600119015390565b85600491979293949701918251600190603f9082828260121c16880101518453828282600c1c16880101518385015382828260061c1688010151888501531685010151878201530195929190614a4f565b634e487b7160e01b600052601160045260246000fd5b50604051614b018161488b565b6000815290565b806000917a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000080821015614c4a575b506d04ee2d6d415b85acef810000000080831015614c3b575b50662386f26fc1000080831015614c2c575b506305f5e10080831015614c1d575b5061271080831015614c0e575b506064821015614bfe575b600a80921015614bf4575b600190816021614b9f828701614962565b95860101905b614bb1575b5050505090565b600019019083907f30313233343536373839616263646566000000000000000000000000000000008282061a835304918215614bef57919082614ba5565b614baa565b9160010191614b8e565b9190606460029104910191614b83565b60049193920491019138614b78565b60089193920491019138614b6b565b60109193920491019138614b5c565b60209193920491019138614b4a565b604093508104915038614b31565b6001600160a01b031660405190614c6e826148a7565b602a8252602082016040368237825115614d8657603090538151600190811015614d8657607860218401536029905b808211614d0b575050614cad5790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602060248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b9091600f81166010811015614d71577f3031323334353637383961626364656600000000000000000000000000000000901a614d478486614d9c565b5360041c918015614d5c576000190190614c9d565b60246000634e487b7160e01b81526011600452fd5b60246000634e487b7160e01b81526032600452fd5b634e487b7160e01b600052603260045260246000fd5b908151811015614d86570160200190565b60405190614dba826148c3565b600482527f2667743b000000000000000000000000000000000000000000000000000000006020830152565b60405190614df3826148c3565b600482527f266c743b000000000000000000000000000000000000000000000000000000006020830152565b90614e87929493604051958692602094614e4181518092888089019101614826565b8401614e5582518093888085019101614826565b01614e6882518093878085019101614826565b01614e7b82518093868085019101614826565b010380855201836148df565b565b801561519a5760009180615175575090505b6001908082811015614f0857505050614eb2614de6565b614f05602260405183614ecf829551809260208086019101614826565b81017f203100000000000000000000000000000000000000000000000000000000000060208201520360028101845201826148df565b90565b66038d7ea4c6800011156151185760409081519060a0820182811067ffffffffffffffff82111761431157808452614f3f8161488b565b600081528252825190614f51826148c3565b8482526020917f4b0000000000000000000000000000000000000000000000000000000000000083820152828401528351614f8b816148c3565b8581527f4d0000000000000000000000000000000000000000000000000000000000000083820152848401528351614fc2816148c3565b8581527f42000000000000000000000000000000000000000000000000000000000000008382015260608401528351614ffa816148c3565b8581527f54000000000000000000000000000000000000000000000000000000000000008382015260808401526000918583965b6150ec575b50845194615040866148c3565b6007908187527f2623383830353b0000000000000000000000000000000000000000000000000083880152519560005b8281106150d957505050506150ba6150c0917f20000000000000000000000000000000000000000000000000000000000000006027870152600886526150b5866148c3565b614b08565b91615744565b916005851015614d8657614f059460051b015192614e1f565b8181018401518882018501528301615070565b9591926103e89081851061510f57508680916064600a870406950493019661502e565b93929650615033565b5050615122614dad565b614f0560286040518361513f829551809260208086019101614826565b81017f203939392e39395400000000000000000000000000000000000000000000000060208201520360088101845201826148df565b600a0a918215615186575004614e9b565b80634e487b7160e01b602492526012600452fd5b50506040516151a8816148c3565b600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b620151809103048061523d57506151ea614de6565b614f05602660405183615207829551809260208086019101614826565b81017f203120446179000000000000000000000000000000000000000000000000000060208201520360068101845201826148df565b61270f811161530c57600181036152c957614f056020615291604051615262816148c3565b600481527f20446179000000000000000000000000000000000000000000000000000000008382015293614b08565b60405193816152a98693518092868087019101614826565b82016152bd82518093868085019101614826565b010380845201826148df565b614f0560206152916040516152dd816148c3565b600581527f20446179730000000000000000000000000000000000000000000000000000008382015293614b08565b50615315614dad565b614f05602a60405183615332829551809260208086019101614826565b81017f2039393939204461797300000000000000000000000000000000000000000000602082015203600a8101845201826148df565b6020818303126142f85780519067ffffffffffffffff82116142f8570181601f820112156142f857805161539b81614946565b926153a960405194856148df565b818452602082840101116142f857614f059160208085019101614826565b6001600160a01b031660409081516395d89b4160e01b8152600081600481855afa9081156155a157600091615580575b5061545c8351615406816148c3565b601181527f5341422d56322d4c4f434b55502d4c494e0000000000000000000000000000006020918201528251908301207fc66b376a19264d832c1bc254000c18944ca5aa57ed50f4ea637c4da424d4c3bb1490565b1561549a5750505161546d816148c3565b600d81527f4c6f636b7570204c696e65617200000000000000000000000000000000000000602082015290565b6154fe83516154a8816148c3565b601181527f5341422d56322d4c4f434b55502d44594e0000000000000000000000000000006020918201528251908301207f6ab655856fa5352de8c05542b1937ac63c59342da992602767c02734cc5391651490565b1561553c5750505161550f816148c3565b600e81527f4c6f636b75702044796e616d6963000000000000000000000000000000000000602082015290565b61557c9083519384937f814a8a2e000000000000000000000000000000000000000000000000000000008552600485015260248401526044830190614849565b0390fd5b61559b913d8091833e61559381836148df565b810190615368565b386153f7565b83513d6000823e3d90fd5b3d156155d7573d906155bd82614946565b916155cb60405193846148df565b82523d6000602084013e565b606090565b60405160208101907f313ce56700000000000000000000000000000000000000000000000000000000825260048152615614816148c3565b6000928392839251915afa6156276155ac565b908061565e575b1561565a5760208180518101031261565657602001519060ff82168203615653575090565b80fd5b5080fd5b5090565b50602081511461562e565b6000809160405160208101906395d89b4160e01b82526004815261568c816148c3565b51915afa6156986155ac565b90158015615738575b6156fe57806020806156b893518301019101615368565b601e815111600014614f0557506040516156d1816148c3565b600b81527f4c6f6e672053796d626f6c000000000000000000000000000000000000000000602082015290565b5060405161570b816148c3565b600581527f4552433230000000000000000000000000000000000000000000000000000000602082015290565b506040815111156156a1565b806157565750604051614b018161488b565b600a8110156157bb5761576890614b08565b614f05602260405180937f2e3000000000000000000000000000000000000000000000000000000000000060208301526157ab8151809260208686019101614826565b81010360028101845201826148df565b6157c490614b08565b614f05602160405180937f2e0000000000000000000000000000000000000000000000000000000000000060208301526158078151809260208686019101614826565b81010360018101845201826148df565b60405190615824826148c3565b600782527f536574746c6564000000000000000000000000000000000000000000000000006020830152565b6040519061585d826148c3565b600882527f4465706c657465640000000000000000000000000000000000000000000000006020830152565b600581101561596f57600481036158a35750614f05615850565b600381036158e557506040516158b8816148c3565b600881527f43616e63656c6564000000000000000000000000000000000000000000000000602082015290565b6001810361592757506040516158fa816148c3565b600981527f53747265616d696e670000000000000000000000000000000000000000000000602082015290565b60020361593657614f05615817565b604051615942816148c3565b600781527f50656e64696e6700000000000000000000000000000000000000000000000000602082015290565b634e487b7160e01b600052602160045260246000fd5b6030614e879193929360405194816159a7879351809260208087019101614826565b820164010714051160dd1b60208201526a029b0b13634b2b9102b19160ad1b60258201526159de8251809360208785019101614826565b010360108101855201836148df565b6025614e87919392936040519481615a0f879351809260208087019101614826565b820164010714051160dd1b6020820152615a328251809360208785019101614826565b010360058101855201836148df565b60405190615a4e826148c3565b601082527f68736c283233302c3231252c31312529000000000000000000000000000000006020830152565b8015615cac57615a88615a41565b90612710908103908111614ade57614f0591615aa661013692614b08565b6040519485927f3c672066696c6c3d226e6f6e65223e000000000000000000000000000000000060208501527f3c636972636c652063783d22313636222063793d2235302220723d2232322220602f8501527f7374726f6b653d22000000000000000000000000000000000000000000000000604f850152615b32815180926020605788019101614826565b83017f22207374726f6b652d77696474683d223130222f3e000000000000000000000060578201527f3c636972636c652063783d22313636222063793d2235302220706174684c656e606c8201527f6774683d2231303030302220723d22323222207374726f6b653d220000000000608c820152615bba82518093602060a785019101614826565b017f22207374726f6b652d6461736861727261793d22313030303022207374726f6b60a78201527f652d646173686f66667365743d2200000000000000000000000000000000000060c7820152615c1b82518093602060d585019101614826565b017f22207374726f6b652d6c696e656361703d22726f756e6422207374726f6b652d60d58201527f77696474683d223522207472616e73666f726d3d22726f74617465282d39302960f58201527f22207472616e73666f726d2d6f726967696e3d22313636203530222f3e000000610115820152631e17b39f60e11b610132820152036101168101845201826148df565b5050604051614b018161488b565b60009080518015615d2f579060009182915b818310615cde57505050600d02900390565b909193603b60f81b7fff00000000000000000000000000000000000000000000000000000000000000615d118785614d9c565b511614615d27575b600d01936001019190615ccc565b849350615d19565b505050600090565b60009080518015615d2f579060009182915b818310615d5b5750505060041b900390565b909193603b60f81b7fff00000000000000000000000000000000000000000000000000000000000000615d8e8785614d9c565b511614615da4575b601001936001019190615d49565b849350615d9656"; + hex"6080806040523461001757615db990816200001d8239f35b600080fdfe6080604052600436101561001257600080fd5b60003560e01c63e9dc63751461002757600080fd5b346142f85760403660031901126142f8576001600160a01b0360043516600435036142f857610056608061486e565b60006080819052606060a081905260c082905260e0819052610120819052610140819052610160819052610180919091526101a0526004356001600160a01b03166101008190526100a690614c58565b61012052610100516040517feac8f5b80000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa908115614305576000916147dd575b506001600160a01b03610117911680608052615669565b60a052610100516040517fa80fc0710000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa8015614305576fffffffffffffffffffffffffffffffff916000916147be575b501660c052610100516040517fad35efd40000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa801561430557600090614781575b6101e59150615889565b61014052610100516040517f4869e12d0000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa90811561430557600091614752575b5060c0516fffffffffffffffffffffffffffffffff16801561473c576fffffffffffffffffffffffffffffffff612710819302160416610100608001526102876004356153c7565b610120608001526040514660208201526bffffffffffffffffffffffff1960043560601b16604082015260243560548201526054815280608081011067ffffffffffffffff60808301111761431157608081016040526020815191012061041a602963ffffffff61032e6103078261016861ffff8860101c160616614b08565b91601e604660ff6103248460146050848d60081c16060116614b08565b9816060116614b08565b6040519485927f68736c2800000000000000000000000000000000000000000000000000000000602085015261036e815180926020602488019101614826565b83017f2c0000000000000000000000000000000000000000000000000000000000000060248201526103aa825180936020602585019101614826565b017f252c00000000000000000000000000000000000000000000000000000000000060258201526103e5825180936020602785019101614826565b017f252900000000000000000000000000000000000000000000000000000000000060278201520360098101845201826148df565b6104526fffffffffffffffffffffffffffffffff6040608001511660ff61044b6001600160a01b03608051166155dc565b1690614e89565b6104666001600160a01b0360805116614c58565b60a051610100516040517fbc2be1be0000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa80156143055760249160009161471d575b5060206001600160a01b03608080015116604051938480927f9067b677000000000000000000000000000000000000000000000000000000008252823560048301525afa801561430557610528926000916146ee575b5064ffffffffff80911691166151d5565b61012051610180519092916105b2602161054f6064610548818706615744565b9504614b08565b6040519481610568879351809260208087019101614826565b820161057d8251809360208085019101614826565b017f250000000000000000000000000000000000000000000000000000000000000060208201520360018101855201836148df565b610100608001519260c060800151956101206080015197604051996105d68b61486e565b8a5260208a015260408901526060880152608087015260a086015260c085015260e0840152610100830152610120820152604051806101c081011067ffffffffffffffff6101c083011117614311576101c0810160405260608152600060208201526000604082015260608082015260006080820152606060a0820152600060c0820152600060e08201526060610100820152600061012082015260006101408201526060610160820152600061018082015260006101a082015260a08201516106a660c0840151845190615a7a565b906109b361015c604051926106ba846148c3565b600884527f50726f677265737300000000000000000000000000000000000000000000000060208501526107236040516106f38161488b565b60009052855160208701207fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4701490565b156146e6576090945b61073586614b08565b916040519586938493661e339034b21e9160c91b60208601526109818351958692610767846027840160208901614826565b6d11103334b6361e9111b33333111f60911b602785840101526c1e3932b1ba103bb4b23a341e9160991b603585840101526107ae8551809660206042888701019101614826565b7f22206865696768743d22313030222066696c6c2d6f7061636974793d222e3033828501860160428101919091527f222072783d223135222072793d22313522207374726f6b653d2223666666222060628201527f7374726f6b652d6f7061636974793d222e3122207374726f6b652d77696474686082820152651e911a11179f60d11b60a28201527f3c7465787420783d2232302220793d2233342220666f6e742d66616d696c793d60a88201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f7370616365222060c8820152703337b73a16b9b4bd329e911919383c111f60791b60e88201528651966108b491889160f990910190602001614826565b661e17ba32bc3a1f60c91b8285018601870160f98101919091527f3c7465787420783d2232302220793d2237322220666f6e742d66616d696c793d6101008201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f73706163652220610120820152703337b73a16b9b4bd329e91191b383c111f60791b61014082015287519761094f91899161015190910190602001614826565b661e17ba32bc3a1f60c91b6101518888888887010101010152602061015888888885519c8d9701010101019101614826565b631e17b39f60e11b90860190910190910190910190910161015881019190915281900361013c810190915201826148df565b6101008301526101208201526028610100830151604051906109d48261488b565b60008252610c7a61015c604051926109eb846148c3565b600684527f53746174757300000000000000000000000000000000000000000000000000006020850152610a1e84615cba565b610a2782615d37565b808211156146de5750945b610a3d878701614b08565b91604051958693661e339034b21e9160c91b60208601528151610a67816027880160208601614826565b85016d11103334b6361e9111b33333111f60911b60278201526c1e3932b1ba103bb4b23a341e9160991b6035820152610aaa825180936020604285019101614826565b017f22206865696768743d22313030222066696c6c2d6f7061636974793d222e303360428201527f222072783d223135222072793d22313522207374726f6b653d2223666666222060628201527f7374726f6b652d6f7061636974793d222e3122207374726f6b652d77696474686082820152651e911a11179f60d11b60a28201527f3c7465787420783d2232302220793d2233342220666f6e742d66616d696c793d60a88201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f7370616365222060c8820152703337b73a16b9b4bd329e911919383c111f60791b60e8820152610ba682518093602060f985019101614826565b01661e17ba32bc3a1f60c91b60f98201527f3c7465787420783d2232302220793d2237322220666f6e742d66616d696c793d6101008201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f73706163652220610120820152703337b73a16b9b4bd329e91191b383c111f60791b610140820152610c3582518093602061015185019101614826565b01661e17ba32bc3a1f60c91b610151820152610c5c82518093602061015885019101614826565b01631e17b39f60e11b6101588201520361013c8101845201826148df565b610160840152016101808201526028602083015160405190610c9b8261488b565b60008252610ce561015c60405192610cb2846148c3565b600684527f416d6f756e7400000000000000000000000000000000000000000000000000006020850152610a1e84615cba565b835201602082015261102060808301516030604051610d038161488b565b60008152610faa61015c60405194610d1a866148c3565b600886527f4475726174696f6e0000000000000000000000000000000000000000000000006020870152610d4d86615cba565b610d5682615d37565b808211156146d65750935b610d6d60288601614b08565b91604051978893661e339034b21e9160c91b60208601528151610d97816027880160208601614826565b85016d11103334b6361e9111b33333111f60911b60278201526c1e3932b1ba103bb4b23a341e9160991b6035820152610dda825180936020604285019101614826565b017f22206865696768743d22313030222066696c6c2d6f7061636974793d222e303360428201527f222072783d223135222072793d22313522207374726f6b653d2223666666222060628201527f7374726f6b652d6f7061636974793d222e3122207374726f6b652d77696474686082820152651e911a11179f60d11b60a28201527f3c7465787420783d2232302220793d2233342220666f6e742d66616d696c793d60a88201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f7370616365222060c8820152703337b73a16b9b4bd329e911919383c111f60791b60e8820152610ed682518093602060f985019101614826565b01661e17ba32bc3a1f60c91b60f98201527f3c7465787420783d2232302220793d2237322220666f6e742d66616d696c793d6101008201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f73706163652220610120820152703337b73a16b9b4bd329e91191b383c111f60791b610140820152610f6582518093602061015185019101614826565b01661e17ba32bc3a1f60c91b610151820152610f8c82518093602061015885019101614826565b01631e17b39f60e11b6101588201520361013c8101865201846148df565b8260a08601526028810160c0860152602085015190610120860151809161018088015192839185010101605881016080890152605719906103e8030160011c8061014089015201601081016101a088015201602081016040870152010160e0840152610100830151610160840151845191614e1f565b6060820152604051908161010081011067ffffffffffffffff6101008401111761431157610100820160405260c782527f3c726563742077696474683d223130302522206865696768743d22313030252260208301527f2066696c7465723d2275726c28234e6f69736529222f3e3c7265637420783d2260408301527f37302220793d223730222077696474683d2238363022206865696768743d223860608301527f3630222066696c6c3d2223666666222066696c6c2d6f7061636974793d222e3060808301527f33222072783d223435222072793d22343522207374726f6b653d22236666662260a08301527f207374726f6b652d6f7061636974793d222e3122207374726f6b652d7769647460c08301527f683d2234222f3e0000000000000000000000000000000000000000000000000060e083015282519161010084015191606081015194604051611176816148a7565b603381527f3c636972636c652069643d22476c6f772220723d22353030222066696c6c3d2260208201527f75726c282352616469616c476c6f7729222f3e000000000000000000000000006040820152604051966111d38861486e565b61011c88527f3c66696c7465722069643d224e6f697365223e3c6665466c6f6f6420783d223060208901527f2220793d2230222077696474683d223130302522206865696768743d2231303060408901527f252220666c6f6f642d636f6c6f723d2268736c283233302c3231252c3131252960608901527f2220666c6f6f642d6f7061636974793d22312220726573756c743d22666c6f6f60808901527f6446696c6c222f3e3c666554757262756c656e6365206261736546726571756560a08901527f6e63793d222e3422206e756d4f6374617665733d22332220726573756c743d2260c08901527f4e6f6973652220747970653d226672616374616c4e6f697365222f3e3c66654260e08901527f6c656e6420696e3d224e6f6973652220696e323d22666c6f6f6446696c6c22206101008901527f6d6f64653d22736f66742d6c69676874222f3e3c2f66696c7465723e0000000061012089015260405197886103a081011067ffffffffffffffff6103a08b011117614311576103a0890160405261037b89527f3c706174682069643d224c6f676f222066696c6c3d2223666666222066696c6c60208a01527f2d6f7061636974793d222e312220643d226d3133332e3535392c3132342e303360408a01527f34632d2e3031332c322e3431322d312e3035392c342e3834382d322e3932332c60608a01527f362e3430322d322e3535382c312e3831392d352e3136382c332e3433392d372e60808a01527f3838382c342e3939362d31342e34342c382e3236322d33312e3034372c31322e60a08a01527f3536352d34372e3637342c31322e3536392d382e3835382e3033362d31372e3860c08a01527f33382d312e3237322d32362e3332382d332e3636332d392e3830362d322e373660e08a01527f362d31392e3038372d372e3131332d32372e3536322d31322e3737382d31332e6101008a01527f3834322d382e3032352c392e3436382d32382e3630362c31362e3135332d33356101208a01527f2e323635683063322e3033352d312e3833382c342e3235322d332e3534362c366101408a01527f2e3436332d352e323234683063362e3432392d352e3635352c31362e3231382d6101608a01527f322e3833352c32302e3335382c342e31372c342e3134332c352e3035372c382e6101808a01527f3831362c392e3634392c31332e39322c31332e373334682e30333763352e37336101a08a01527f362c362e3436312c31352e3335372d322e3235332c392e33382d382e34382c306101c08a01527f2c302d332e3531352d332e3531352d332e3531352d332e3531352d31312e34396101e08a01527f2d31312e3437382d35322e3635362d35322e3636342d36342e3833372d36342e6102008a01527f3833376c2e3034392d2e303337632d312e3732352d312e3630362d322e3731396102208a01527f2d332e3834372d322e3735312d362e3230346830632d2e3034362d322e3337356102408a01527f2c312e3036322d342e3538322c322e3732362d362e32323968306c2e3138352d6102608a01527f2e3134386830632e3039392d2e3036322c2e3232322d2e3134382c2e33372d2e6102808a01527f323539683063322e30362d312e3336322c332e3935312d322e3632312c362e306102a08a01527f34342d332e3834324335372e3736332d332e3437332c39372e37362d322e33346102c08a01527f312c3132382e3633372c31382e3333326331362e3637312c392e3934362d32366102e08a01527f2e3334342c35342e3831332d33382e3635312c34302e3139392d362e3239392d6103008a01527f362e3039362d31382e3036332d31372e3734332d31392e3636382d31382e38316103208a01527f312d362e3031362d342e3034372d31332e3036312c342e3737362d372e3735326103408a01527f2c392e3735316c36382e3235342c36382e33373163312e3732342c312e3630316103608a01527f2c322e3731342c332e38342c322e3733382c362e3139325a222f3e00000000006103808a0152604051978860a081011067ffffffffffffffff60a08b01111761431157611cb1611d129160a08b0160405260758b527f3c706174682069643d22466c6f6174696e6754657874222066696c6c3d226e6f60208c01527f6e652220643d224d31323520343568373530733830203020383020383076373560408c01527f307330203830202d3830203830682d373530732d38302030202d3830202d383060608c01527f762d3735307330202d3830203830202d3830222f3e000000000000000000000060808c0152611868615a41565b906040517f3c72616469616c4772616469656e742069643d2252616469616c476c6f77223e6020820152611d0d60d87f3c73746f70206f66667365743d223025222073746f702d636f6c6f723d22000093846040850152805161199a60b88660208501936118da81605e840187614826565b8101997f222073746f702d6f7061636974793d222e36222f3e0000000000000000000000605e8c01527f3c73746f70206f66667365743d2231303025222073746f702d636f6c6f723d229a8b607382015261193f825180936020609385019101614826565b017f222073746f702d6f7061636974793d2230222f3e00000000000000000000000060938201527f3c2f72616469616c4772616469656e743e00000000000000000000000000000060a78201520360988101885201866148df565b6119a2615a41565b90604051967f3c6c696e6561724772616469656e742069643d2253616e64546f70222078313d60208901527f223025222079313d223025223e000000000000000000000000000000000000006040890152604d8801528251611a0881606b8a0184614826565b8701917f222f3e00000000000000000000000000000000000000000000000000000000009283606b82015289606e820152611a4d825180936020608e85019101614826565b019082608e830152611a9160a2897f3c2f6c696e6561724772616469656e743e0000000000000000000000000000009485609182015203608281018b5201896148df565b611bd7610108611a9f615a41565b6040519b8c917f3c6c696e6561724772616469656e742069643d2253616e64426f74746f6d222060208401527f78313d2231303025222079313d2231303025223e00000000000000000000000060408401527f3c73746f70206f66667365743d22313025222073746f702d636f6c6f723d22006054840152611b2b815180926020607387019101614826565b8201908760738301526076820152875190611b4a826096830188614826565b018660968201527f3c616e696d617465206174747269627574654e616d653d22783122206475723d60998201527f2236732220726570656174436f756e743d22696e646566696e6974652220766160b98201527f6c7565733d223330253b3630253b313230253b3630253b3330253b222f3e000060d98201528560f78201520360e881018c52018a6148df565b611bdf615a41565b906040519a8b957f3c6c696e6561724772616469656e742069643d22486f7572676c61737353747260208801527f6f6b6522206772616469656e745472616e73666f726d3d22726f74617465283960408801527f302922206772616469656e74556e6974733d227573657253706163654f6e557360608801527f65223e000000000000000000000000000000000000000000000000000000000060808801527f3c73746f70206f66667365743d22353025222073746f702d636f6c6f723d2200608388015251809260a2880190614826565b84018360a28201527f3c73746f70206f66667365743d22383025222073746f702d636f6c6f723d220060a5820152611cf382518093602060c485019101614826565b019160c483015260c78201520360b88101875201856148df565b614e1f565b92611d32611d1e615817565b896020815191012090602081519101201490565b9788156146ad575b506040518060c081011067ffffffffffffffff60c0830111176143115760c08101604052609081527f3c7061746820643d224d2035302c3336302061203330302c333030203020312c60208201527f31203630302c302061203330302c333030203020312c31202d3630302c30222060408201527f66696c6c3d2223666666222066696c6c2d6f7061636974793d222e303222207360608201527f74726f6b653d2275726c2823486f7572676c6173735374726f6b65292220737460808201527f726f6b652d77696474683d2234222f3e0000000000000000000000000000000060a082015260405193846102c081011067ffffffffffffffff6102c087011117614311576102c0850160405261029885527f3c7061746820643d226d3536362c3136312e323031762d35332e39323463302d60208601527f31392e3338322d32322e3531332d33372e3536332d36332e3339382d35312e3160408601527f39382d34302e3735362d31332e3539322d39342e3934362d32312e3037392d3160608601527f35322e3538372d32312e303739732d3131312e3833382c372e3438372d31353260808601527f2e3630322c32312e303739632d34302e3839332c31332e3633362d36332e343160a08601527f332c33312e3831362d36332e3431332c35312e3139387635332e39323463302c60c08601527f31372e3138312c31372e3730342c33332e3432372c35302e3232332c34362e3360e08601527f3934763238342e383039632d33322e3531392c31322e39362d35302e3232332c6101008601527f32392e3230362d35302e3232332c34362e3339347635332e39323463302c31396101208601527f2e3338322c32322e35322c33372e3536332c36332e3431332c35312e3139382c6101408601527f34302e3736332c31332e3539322c39342e3935342c32312e3037392c3135322e6101608601527f3630322c32312e303739733131312e3833312d372e3438372c3135322e3538376101808601527f2d32312e3037396334302e3838362d31332e3633362c36332e3339382d33312e6101a08601527f3831362c36332e3339382d35312e313938762d35332e39323463302d31372e316101c08601527f39362d31372e3730342d33332e3433352d35302e3232332d34362e34303156326101e08601527f30372e3630336333322e3531392d31322e3936372c35302e3232332d32392e326102008601527f30362c35302e3232332d34362e3430315a6d2d3334372e3436322c35372e37396102208601527f336c3133302e3935392c3133312e3032372d3133302e3935392c3133312e30316102408601527f33563231382e3939345a6d3236322e3932342e303232763236322e3031386c2d6102608601527f3133302e3933372d3133312e3030362c3133302e3933372d3133312e3031335a6102808601527f222066696c6c3d2223313631383232223e3c2f706174683e00000000000000006102a0860152896000146144885760405161218c8161488b565b60008152995b1561432757604051806101e081011067ffffffffffffffff6101e083011117614311576101e081016040526101b181527f3c7061746820643d226d3438312e34362c3438312e35347638312e3031632d3260208201527f2e33352e37372d342e38322c312e35312d372e33392c322e32332d33302e332c60408201527f382e35342d37342e36352c31332e39322d3132342e30362c31332e39322d353360608201527f2e362c302d3130312e32342d362e33332d3133312e34372d31362e3136762d3860808201527f316c34362e332d34362e3331683137302e33336c34362e32392c34362e33315a60a08201527f222066696c6c3d2275726c282353616e64426f74746f6d29222f3e3c7061746860c08201527f20643d226d3433352e31372c3433352e323363302c312e31372d2e34362c322e60e08201527f33322d312e33332c332e34342d372e31312c392e30382d34312e39332c31352e6101008201527f39382d38332e38312c31352e3938732d37362e372d362e392d38332e38322d316101208201527f352e3938632d2e38372d312e31322d312e33332d322e32372d312e33332d332e6101408201527f3434762d2e30346c382e33342d382e33352e30312d2e30316331332e37322d366101608201527f2e35312c34322e39352d31312e30322c37362e382d31312e30327336322e39376101808201527f2c342e34392c37362e37322c31316c382e34322c382e34325a222066696c6c3d6101a08201527f2275726c282353616e64546f7029222f3e0000000000000000000000000000006101c0820152995b60405196876107e081011067ffffffffffffffff6107e08a01111761431157613b9f9c612e5a6036602d9960819f97631e17b39f60e11b8d7f3c2f646566733e000000000000000000000000000000000000000000000000009a612f2b9f6107e0016040526107a782527f3c672066696c6c3d226e6f6e6522207374726f6b653d2275726c2823486f757260208301527f676c6173735374726f6b652922207374726f6b652d6c696e656361703d22726f60408301527f756e6422207374726f6b652d6d697465726c696d69743d22313022207374726f60608301527f6b652d77696474683d2234223e3c7061746820643d226d3536352e3634312c3160808301527f30372e323863302c392e3533372d352e35362c31382e3632392d31352e36373660a08301527f2c32362e393733682d2e303233632d392e3230342c372e3539362d32322e313960c08301527f342c31342e3536322d33382e3139372c32302e3539322d33392e3530342c313460e08301527f2e3933362d39372e3332352c32342e3335352d3136312e3733332c32342e33356101008301527f352d39302e34382c302d3136372e3934382d31382e3538322d3139392e3935336101208301527f2d34342e393438682d2e303233632d31302e3131352d382e3334342d31352e366101408301527f37362d31372e3433372d31352e3637362d32362e3937332c302d33392e3733356101608301527f2c39362e3535342d37312e3932312c3231352e3635322d37312e3932317332316101808301527f352e3632392c33322e3138352c3231352e3632392c37312e3932315a222f3e3c6101a08301527f7061746820643d226d3133342e33362c3136312e32303363302c33392e3733356101c08301527f2c39362e3535342c37312e3932312c3231352e3635322c37312e3932317332316101e08301527f352e3632392d33322e3138362c3231352e3632392d37312e393231222f3e3c6c6102008301527f696e652078313d223133342e3336222079313d223136312e323033222078323d6102208301527f223133342e3336222079323d223130372e3238222f3e3c6c696e652078313d226102408301527f3536352e3634222079313d223136312e323033222078323d223536352e3634226102608301527f2079323d223130372e3238222f3e3c6c696e652078313d223138342e353834226102808301527f2079313d223230362e383233222078323d223138342e353835222079323d22356102a08301527f33372e353739222f3e3c6c696e652078313d223231382e313831222079313d226102c08301527f3231382e313138222078323d223231382e313831222079323d223536322e35336102e08301527f37222f3e3c6c696e652078313d223438312e383138222079313d223231382e316103008301527f3432222078323d223438312e383139222079323d223536322e343238222f3e3c6103208301527f6c696e652078313d223531352e343135222079313d223230372e3335322220786103408301527f323d223531352e343136222079323d223533372e353739222f3e3c70617468206103608301527f643d226d3138342e35382c3533372e353863302c352e34352c342e32372c31306103808301527f2e36352c31322e30332c31352e3432682e303263352e35312c332e33392c31326103a08301527f2e37392c362e35352c32312e35352c392e34322c33302e32312c392e392c37386103c08301527f2e30322c31362e32382c3133312e38332c31362e32382c34392e34312c302c396103e08301527f332e37362d352e33382c3132342e30362d31332e39322c322e372d2e37362c356104008301527f2e32392d312e35342c372e37352d322e33352c382e37372d322e38372c31362e6104208301527f30352d362e30342c32312e35362d392e3433683063372e37362d342e37372c316104408301527f322e30342d392e39372c31322e30342d31352e3432222f3e3c7061746820643d6104608301527f226d3138342e3538322c3439322e363536632d33312e3335342c31322e3438356104808301527f2d35302e3232332c32382e35382d35302e3232332c34362e3134322c302c392e6104a08301527f3533362c352e3536342c31382e3632372c31352e3637372c32362e393639682e6104c08301527f30323263382e3530332c372e3030352c32302e3231332c31332e3436332c33346104e08301527f2e3532342c31392e3135392c392e3939392c332e3939312c32312e3236392c376105008301527f2e3630392c33332e3539372c31302e3738382c33362e34352c392e3430372c386105208301527f322e3138312c31352e3030322c3133312e3833352c31352e3030327339352e336105408301527f36332d352e3539352c3133312e3830372d31352e3030326331302e3834372d326105608301527f2e37392c32302e3836372d352e3932362c32392e3932342d392e3334392c312e6105808301527f3234342d2e3436372c322e3437332d2e3934322c332e3637332d312e3432342c6105a08301527f31342e3332362d352e3639362c32362e3033352d31322e3136312c33342e35326105c08301527f342d31392e313733682e3032326331302e3131342d382e3334322c31352e36376105e08301527f372d31372e3433332c31352e3637372d32362e3936392c302d31372e3536322d6106008301527f31382e3836392d33332e3636352d35302e3232332d34362e3135222f3e3c70616106208301527f746820643d226d3133342e33362c3539322e373263302c33392e3733352c39366106408301527f2e3535342c37312e3932312c3231352e3635322c37312e393231733231352e366106608301527f32392d33322e3138362c3231352e3632392d37312e393231222f3e3c6c696e656106808301527f2078313d223133342e3336222079313d223539322e3732222078323d223133346106a08301527f2e3336222079323d223533382e373937222f3e3c6c696e652078313d223536356106c08301527f2e3634222079313d223539322e3732222078323d223536352e3634222079323d6106e08301527f223533382e373937222f3e3c706f6c796c696e6520706f696e74733d223438316107008301527f2e383232203438312e393031203438312e373938203438312e383737203438316107208301527f2e373735203438312e383534203335302e303135203335302e303236203231386107408301527f2e313835203231382e313239222f3e3c706f6c796c696e6520706f696e74733d6107608301527f223231382e313835203438312e393031203231382e323331203438312e3835346107808301527f203335302e303135203335302e303236203438312e383232203231382e3135326107a08301527f222f3e3c2f673e000000000000000000000000000000000000000000000000006107c0830152604051998a957f3c672069643d22486f7572676c617373223e00000000000000000000000000006020880152603295612df68151809260208a8c019101614826565b8701612e0b8251809360208a85019101614826565b01612e1f8251809360208985019101614826565b01612e338251809360208885019101614826565b01612e478251809360208785019101614826565b01918201520360168101865201846148df565b6040519e8f9788977f3c646566733e000000000000000000000000000000000000000000000000000060208a0152612e9f6026998260208c9451948593019101614826565b8901612eb48251809360208c85019101614826565b01612ec88251809360208b85019101614826565b01612edc8251809360208a85019101614826565b01612ef08251809360208985019101614826565b01612f048251809360208885019101614826565b01612f188251809360208785019101614826565b019182015203600d8101895201876148df565b6137be604c60e08301516101208401519361351a61314d6060604084015193015196612f578186615985565b9461314861012b604051612f6a816148c3565b600581527f2d3130302500000000000000000000000000000000000000000000000000000060208201526040519889917f3c74657874506174682073746172744f66667365743d220000000000000000006020840152612fd4815180926020603787019101614826565b7f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666683820160378101919091527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e00000000000000000061010982015282519261311891849161012090910190602001614826565b6a1e17ba32bc3a2830ba341f60a91b90830190910161012081019190915281900361010b810190915201876148df565b615985565b9561332c61012b604051613160816148c3565b600281527f30250000000000000000000000000000000000000000000000000000000000006020820152604051998a917f3c74657874506174682073746172744f66667365743d2200000000000000000060208401526131ca815180926020603787019101614826565b82017f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666660378201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e00000000000000000061010982015261330782518093602061012085019101614826565b016a1e17ba32bc3a2830ba341f60a91b6101208201520361010b81018a5201886148df565b61333681846159ed565b9261351561012b604051613349816148c3565b600481527f2d3530250000000000000000000000000000000000000000000000000000000060208201526040519687917f3c74657874506174682073746172744f66667365743d2200000000000000000060208401526133b3815180926020603787019101614826565b82017f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666660378201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e0000000000000000006101098201526134f082518093602061012085019101614826565b016a1e17ba32bc3a2830ba341f60a91b6101208201520361010b8101875201856148df565b6159ed565b906136f961012b60405161352d816148c3565b600381527f353025000000000000000000000000000000000000000000000000000000000060208201526040519485917f3c74657874506174682073746172744f66667365743d220000000000000000006020840152613597815180926020603787019101614826565b82017f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666660378201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e0000000000000000006101098201526136d482518093602061012085019101614826565b016a1e17ba32bc3a2830ba341f60a91b6101208201520361010b8101855201836148df565b6040519586937f3c7465787420746578742d72656e646572696e673d226f7074696d697a65537060208601527f656564223e000000000000000000000000000000000000000000000000000000604086015261375f815180926020604589019101614826565b8401613775825180936020604585019101614826565b0161378a825180936020604585019101614826565b0161379f825180936020604585019101614826565b01661e17ba32bc3a1f60c91b604582015203602c8101845201826148df565b613a9e61019a6101408401516101a0850151906137ff6137f96137f36137ed60e060408b01519a015194614b08565b94614b08565b97614b08565b91614b08565b956040519687937f3c75736520687265663d2223476c6f77222066696c6c2d6f7061636974793d2260208601527f2e39222f3e00000000000000000000000000000000000000000000000000000060408601527f3c75736520687265663d2223476c6f772220783d22313030302220793d22313060458601527f3030222066696c6c2d6f7061636974793d222e39222f3e00000000000000000060658601527f3c75736520687265663d22234c6f676f2220783d223137302220793d22313730607c8601527f22207472616e73666f726d3d227363616c65282e3629222f3e3c757365206872609c8601527f65663d2223486f7572676c6173732220783d223135302220793d22393022207460bc8601527f72616e73666f726d3d22726f746174652831302922207472616e73666f726d2d60dc8601527f6f726967696e3d2235303020353030222f3e000000000000000000000000000060fc8601527f3c75736520687265663d222350726f67726573732220783d220000000000000061010e8601526101279061399a815180926020858a019101614826565b8501937f2220793d22373930222f3e00000000000000000000000000000000000000000080948180948801527f3c75736520687265663d22235374617475732220783d2200000000000000000061013288015261014996613a048251809360208b85019101614826565b01958601527f3c75736520687265663d2223416d6f756e742220783d2200000000000000000061015486015261016b94613a478251809360208985019101614826565b01938401527f3c75736520687265663d22234475726174696f6e2220783d220000000000000061017684015261018f92613a8a8251809360208785019101614826565b01918201520361017a8101855201836148df565b6040519586937f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323060208601527f30302f737667222077696474683d223130303022206865696768743d2231303060408601527f30222076696577426f783d2230203020313030302031303030223e00000000006060860152613b2a815180926020607b89019101614826565b8401613b40825180936020607b85019101614826565b01613b55825180936020607b85019101614826565b01613b6a825180936020607b85019101614826565b017f3c2f7376673e0000000000000000000000000000000000000000000000000000607b8201520360618101845201826148df565b6101605260a051610100516040517fb971302a0000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa908115614305576000916142ba575b6142b661424f614154614245609487613d3b6089613c198a614c58565b9260c0608001516040519485927f5b7b2274726169745f74797065223a224173736574222c2276616c7565223a226020850152613c60815180926020604088019101614826565b8301907f227d2c7b2274726169745f74797065223a2253656e646572222c2276616c756560408301527f223a22000000000000000000000000000000000000000000000000000000000091826060820152613cc5825180936020606385019101614826565b01907f227d2c7b2274726169745f74797065223a22537461747573222c2276616c756560638301526083820152613d06825180936020608685019101614826565b017f227d5d000000000000000000000000000000000000000000000000000000000060868201520360698101845201826148df565b6101a05160a05161403e61017e613d53602435614b08565b9360a060800151613d6e6001600160a01b0360805116614c58565b90604051968793613f2b60208601987f54686973204e465420726570726573656e74732061207061796d656e742073748a527f7265616d20696e2061205361626c696572205632200000000000000000000000604088015282516020840190613ddb8160558b0184614826565b8801947f20636f6e74726163742e20546865206f776e6572206f662074686973204e465460558701527f2063616e207769746864726177207468652073747265616d656420617373657460758701527f732c207768696368206172652064656e6f6d696e6174656420696e2000000000609587015282516020840196613e658260b183018a614826565b017f2e5c6e5c6e2d2053747265616d2049443a20000000000000000000000000000060b1820152613ea082518093602060c385019101614826565b01613ed97f5c6e2d2000000000000000000000000000000000000000000000000000000000958660c384015251809360c7840190614826565b01947f20416464726573733a2000000000000000000000000000000000000000000000958660c7820152613f1782518093602060d185019101614826565b019260d184015251809360d5840190614826565b019060d5820152613f4682518093602060df85019101614826565b017f5c6e5c6e0000000000000000000000000000000000000000000000000000000060df8201527fe29aa0efb88f205741524e494e473a205472616e7366657272696e672074686560e38201527f204e4654206d616b657320746865206e6577206f776e657220746865207265636101038201527f697069656e74206f66207468652073747265616d2e205468652066756e6473206101238201527f617265206e6f74206175746f6d61746963616c6c792077697468647261776e206101438201527f666f72207468652070726576696f757320726563697069656e742e00000000006101638201520361015e8101855201836148df565b6101a051906141af614051602435614b08565b916140d0602d604051809560208201976a029b0b13634b2b9102b19160ad1b8952614086815180926020602b87019101614826565b82017f2023000000000000000000000000000000000000000000000000000000000000602b8201526140c18251809360208785019101614826565b0103600d8101865201846148df565b610160516140dd90614994565b94604051998a977f7b2261747472696275746573223a00000000000000000000000000000000000060208a015261411e815180926020602e8d019101614826565b8801917f2c226465736372697074696f6e223a2200000000000000000000000000000000602e840152518093603e840190614826565b01917f222c2265787465726e616c5f75726c223a2268747470733a2f2f7361626c6965603e8401527f722e636f6d222c226e616d65223a220000000000000000000000000000000000605e840152518093606d840190614826565b017f222c22696d616765223a22646174613a696d6167652f7376672b786d6c3b6261606d8201527f736536342c000000000000000000000000000000000000000000000000000000608d820152614210825180936020609285019101614826565b017f227d00000000000000000000000000000000000000000000000000000000000060928201520360748101845201826148df565b60e0819052614994565b6142a2603d60405180937f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000060208301526142928151809260208686019101614826565b810103601d8101845201826148df565b604051918291602083526020830190614849565b0390f35b90506020813d6020116142fd575b816142d5602093836148df565b810103126142f85751906001600160a01b03821682036142f85790614154613bfc565b600080fd5b3d91506142c8565b6040513d6000823e3d90fd5b634e487b7160e01b600052604160045260246000fd5b6040518061012081011067ffffffffffffffff6101208301111761431157610120810160405260f881527f3c7061746820643d226d3438312e34362c3530342e3130317635382e3434396360208201527f2d322e33352e37372d342e38322c312e35312d372e33392c322e32332d33302e60408201527f332c382e35342d37342e36352c31332e39322d3132342e30362c31332e39322d60608201527f35332e362c302d3130312e32342d362e33332d3133312e34372d31362e31367660808201527f2d35382e343339683236322e39325a222066696c6c3d2275726c282353616e6460a08201527f426f74746f6d29222f3e3c656c6c697073652063783d22333530222063793d2260c08201527f3530342e313031222072783d223133312e343632222072793d2232382e31303860e08201527f222066696c6c3d2275726c282353616e64546f7029222f3e0000000000000000610100820152996123df565b604051806101c081011067ffffffffffffffff6101c083011117614311576101c0810160405261019981527f3c706f6c79676f6e20706f696e74733d22333530203335302e3032362034313560208201527f2e3033203238342e39373820323835203238342e39373820333530203335302e60408201527f303236222066696c6c3d2275726c282353616e64426f74746f6d29222f3e3c7060608201527f61746820643d226d3431362e3334312c3238312e39373563302c2e3931342d2e60808201527f3335342c312e3830392d312e3033352c322e36382d352e3534322c372e30373660a08201527f2d33322e3636312c31322e34352d36352e32382c31322e34352d33322e36323460c08201527f2c302d35392e3733382d352e3337342d36352e32382d31322e34352d2e36383160e08201527f2d2e3837322d312e3033352d312e3736372d312e3033352d322e36382c302d2e6101008201527f3931342e3335342d312e3830382c312e3033352d322e3637362c352e3534322d6101208201527f372e3037362c33322e3635362d31322e34352c36352e32382d31322e34352c336101408201527f322e3631392c302c35392e3733382c352e3337342c36352e32382c31322e34356101608201527f2e3638312e3836372c312e3033352c312e3736322c312e3033352c322e3637366101808201527f5a222066696c6c3d2275726c282353616e64546f7029222f3e000000000000006101a082015299612192565b6146cf9198506146bb615850565b906020815191012090602081519101201490565b9638611d3a565b905093610d61565b905094610a32565b60d09461072c565b614710915060203d602011614716575b61470881836148df565b810190614929565b38610517565b503d6146fe565b614736915060203d6020116147165761470881836148df565b386104c1565b634e487b7160e01b600052601260045260246000fd5b614774915060203d60201161477a575b61476c81836148df565b810190614901565b3861023f565b503d614762565b506020813d6020116147b6575b8161479b602093836148df565b810103126142f8575160058110156142f8576101e5906101db565b3d915061478e565b6147d7915060203d60201161477a5761476c81836148df565b38610181565b90506020813d60201161481e575b816147f8602093836148df565b810103126142f857516001600160a01b03811681036142f8576001600160a01b03610100565b3d91506147eb565b60005b8381106148395750506000910152565b8181015183820152602001614829565b9060209161486281518092818552858086019101614826565b601f01601f1916010190565b610140810190811067ffffffffffffffff82111761431157604052565b6020810190811067ffffffffffffffff82111761431157604052565b6060810190811067ffffffffffffffff82111761431157604052565b6040810190811067ffffffffffffffff82111761431157604052565b90601f8019910116810190811067ffffffffffffffff82111761431157604052565b908160209103126142f857516fffffffffffffffffffffffffffffffff811681036142f85790565b908160209103126142f8575164ffffffffff811681036142f85790565b67ffffffffffffffff811161431157601f01601f191660200190565b9061496c82614946565b61497960405191826148df565b828152809261498a601f1991614946565b0190602036910137565b805115614af4576040516149a7816148a7565b604081527f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208201527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f60408201528151600292838201809211614ade5760038092047f3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81168103614ade57614a41908594951b614962565b936020850193829183518401925b838110614a8d5750505050510680600114614a7a57600214614a6f575090565b603d90600019015390565b50603d9081600019820153600119015390565b85600491979293949701918251600190603f9082828260121c16880101518453828282600c1c16880101518385015382828260061c1688010151888501531685010151878201530195929190614a4f565b634e487b7160e01b600052601160045260246000fd5b50604051614b018161488b565b6000815290565b806000917a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000080821015614c4a575b506d04ee2d6d415b85acef810000000080831015614c3b575b50662386f26fc1000080831015614c2c575b506305f5e10080831015614c1d575b5061271080831015614c0e575b506064821015614bfe575b600a80921015614bf4575b600190816021614b9f828701614962565b95860101905b614bb1575b5050505090565b600019019083907f30313233343536373839616263646566000000000000000000000000000000008282061a835304918215614bef57919082614ba5565b614baa565b9160010191614b8e565b9190606460029104910191614b83565b60049193920491019138614b78565b60089193920491019138614b6b565b60109193920491019138614b5c565b60209193920491019138614b4a565b604093508104915038614b31565b6001600160a01b031660405190614c6e826148a7565b602a8252602082016040368237825115614d8657603090538151600190811015614d8657607860218401536029905b808211614d0b575050614cad5790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602060248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b9091600f81166010811015614d71577f3031323334353637383961626364656600000000000000000000000000000000901a614d478486614d9c565b5360041c918015614d5c576000190190614c9d565b60246000634e487b7160e01b81526011600452fd5b60246000634e487b7160e01b81526032600452fd5b634e487b7160e01b600052603260045260246000fd5b908151811015614d86570160200190565b60405190614dba826148c3565b600482527f2667743b000000000000000000000000000000000000000000000000000000006020830152565b60405190614df3826148c3565b600482527f266c743b000000000000000000000000000000000000000000000000000000006020830152565b90614e87929493604051958692602094614e4181518092888089019101614826565b8401614e5582518093888085019101614826565b01614e6882518093878085019101614826565b01614e7b82518093868085019101614826565b010380855201836148df565b565b801561519a5760009180615175575090505b6001908082811015614f0857505050614eb2614de6565b614f05602260405183614ecf829551809260208086019101614826565b81017f203100000000000000000000000000000000000000000000000000000000000060208201520360028101845201826148df565b90565b66038d7ea4c6800011156151185760409081519060a0820182811067ffffffffffffffff82111761431157808452614f3f8161488b565b600081528252825190614f51826148c3565b8482526020917f4b0000000000000000000000000000000000000000000000000000000000000083820152828401528351614f8b816148c3565b8581527f4d0000000000000000000000000000000000000000000000000000000000000083820152848401528351614fc2816148c3565b8581527f42000000000000000000000000000000000000000000000000000000000000008382015260608401528351614ffa816148c3565b8581527f54000000000000000000000000000000000000000000000000000000000000008382015260808401526000918583965b6150ec575b50845194615040866148c3565b6007908187527f2623383830353b0000000000000000000000000000000000000000000000000083880152519560005b8281106150d957505050506150ba6150c0917f20000000000000000000000000000000000000000000000000000000000000006027870152600886526150b5866148c3565b614b08565b91615744565b916005851015614d8657614f059460051b015192614e1f565b8181018401518882018501528301615070565b9591926103e89081851061510f57508680916064600a870406950493019661502e565b93929650615033565b5050615122614dad565b614f0560286040518361513f829551809260208086019101614826565b81017f203939392e39395400000000000000000000000000000000000000000000000060208201520360088101845201826148df565b600a0a918215615186575004614e9b565b80634e487b7160e01b602492526012600452fd5b50506040516151a8816148c3565b600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b620151809103048061523d57506151ea614de6565b614f05602660405183615207829551809260208086019101614826565b81017f203120446179000000000000000000000000000000000000000000000000000060208201520360068101845201826148df565b61270f811161530c57600181036152c957614f056020615291604051615262816148c3565b600481527f20446179000000000000000000000000000000000000000000000000000000008382015293614b08565b60405193816152a98693518092868087019101614826565b82016152bd82518093868085019101614826565b010380845201826148df565b614f0560206152916040516152dd816148c3565b600581527f20446179730000000000000000000000000000000000000000000000000000008382015293614b08565b50615315614dad565b614f05602a60405183615332829551809260208086019101614826565b81017f2039393939204461797300000000000000000000000000000000000000000000602082015203600a8101845201826148df565b6020818303126142f85780519067ffffffffffffffff82116142f8570181601f820112156142f857805161539b81614946565b926153a960405194856148df565b818452602082840101116142f857614f059160208085019101614826565b6001600160a01b031660409081516395d89b4160e01b8152600081600481855afa9081156155a157600091615580575b5061545c8351615406816148c3565b601181527f5341422d56322d4c4f434b55502d4c494e0000000000000000000000000000006020918201528251908301207fc66b376a19264d832c1bc254000c18944ca5aa57ed50f4ea637c4da424d4c3bb1490565b1561549a5750505161546d816148c3565b600d81527f4c6f636b7570204c696e65617200000000000000000000000000000000000000602082015290565b6154fe83516154a8816148c3565b601181527f5341422d56322d4c4f434b55502d44594e0000000000000000000000000000006020918201528251908301207f6ab655856fa5352de8c05542b1937ac63c59342da992602767c02734cc5391651490565b1561553c5750505161550f816148c3565b600e81527f4c6f636b75702044796e616d6963000000000000000000000000000000000000602082015290565b61557c9083519384937f814a8a2e000000000000000000000000000000000000000000000000000000008552600485015260248401526044830190614849565b0390fd5b61559b913d8091833e61559381836148df565b810190615368565b386153f7565b83513d6000823e3d90fd5b3d156155d7573d906155bd82614946565b916155cb60405193846148df565b82523d6000602084013e565b606090565b60405160208101907f313ce56700000000000000000000000000000000000000000000000000000000825260048152615614816148c3565b6000928392839251915afa6156276155ac565b908061565e575b1561565a5760208180518101031261565657602001519060ff82168203615653575090565b80fd5b5080fd5b5090565b50602081511461562e565b6000809160405160208101906395d89b4160e01b82526004815261568c816148c3565b51915afa6156986155ac565b90158015615738575b6156fe57806020806156b893518301019101615368565b601e815111600014614f0557506040516156d1816148c3565b600b81527f4c6f6e672053796d626f6c000000000000000000000000000000000000000000602082015290565b5060405161570b816148c3565b600581527f4552433230000000000000000000000000000000000000000000000000000000602082015290565b506040815111156156a1565b806157565750604051614b018161488b565b600a8110156157bb5761576890614b08565b614f05602260405180937f2e3000000000000000000000000000000000000000000000000000000000000060208301526157ab8151809260208686019101614826565b81010360028101845201826148df565b6157c490614b08565b614f05602160405180937f2e0000000000000000000000000000000000000000000000000000000000000060208301526158078151809260208686019101614826565b81010360018101845201826148df565b60405190615824826148c3565b600782527f536574746c6564000000000000000000000000000000000000000000000000006020830152565b6040519061585d826148c3565b600882527f4465706c657465640000000000000000000000000000000000000000000000006020830152565b600581101561596f57600481036158a35750614f05615850565b600381036158e557506040516158b8816148c3565b600881527f43616e63656c6564000000000000000000000000000000000000000000000000602082015290565b6001810361592757506040516158fa816148c3565b600981527f53747265616d696e670000000000000000000000000000000000000000000000602082015290565b60020361593657614f05615817565b604051615942816148c3565b600781527f50656e64696e6700000000000000000000000000000000000000000000000000602082015290565b634e487b7160e01b600052602160045260246000fd5b6030614e879193929360405194816159a7879351809260208087019101614826565b820164010714051160dd1b60208201526a029b0b13634b2b9102b19160ad1b60258201526159de8251809360208785019101614826565b010360108101855201836148df565b6025614e87919392936040519481615a0f879351809260208087019101614826565b820164010714051160dd1b6020820152615a328251809360208785019101614826565b010360058101855201836148df565b60405190615a4e826148c3565b601082527f68736c283233302c3231252c31312529000000000000000000000000000000006020830152565b8015615cac57615a88615a41565b90612710908103908111614ade57614f0591615aa661013692614b08565b6040519485927f3c672066696c6c3d226e6f6e65223e000000000000000000000000000000000060208501527f3c636972636c652063783d22313636222063793d2235302220723d2232322220602f8501527f7374726f6b653d22000000000000000000000000000000000000000000000000604f850152615b32815180926020605788019101614826565b83017f22207374726f6b652d77696474683d223130222f3e000000000000000000000060578201527f3c636972636c652063783d22313636222063793d2235302220706174684c656e606c8201527f6774683d2231303030302220723d22323222207374726f6b653d220000000000608c820152615bba82518093602060a785019101614826565b017f22207374726f6b652d6461736861727261793d22313030303022207374726f6b60a78201527f652d646173686f66667365743d2200000000000000000000000000000000000060c7820152615c1b82518093602060d585019101614826565b017f22207374726f6b652d6c696e656361703d22726f756e6422207374726f6b652d60d58201527f77696474683d223522207472616e73666f726d3d22726f74617465282d39302960f58201527f22207472616e73666f726d2d6f726967696e3d22313636203530222f3e000000610115820152631e17b39f60e11b610132820152036101168101845201826148df565b5050604051614b018161488b565b60009080518015615d2f579060009182915b818310615cde57505050600d02900390565b909193603b60f81b7fff00000000000000000000000000000000000000000000000000000000000000615d118785614d9c565b511614615d27575b600d01936001019190615ccc565b849350615d19565b505050600090565b60009080518015615d2f579060009182915b818310615d5b5750505060041b900390565b909193603b60f81b7fff00000000000000000000000000000000000000000000000000000000000000615d8e8785614d9c565b511614615da4575b601001936001019190615d49565b849350615d9656fea164736f6c6343000815000a"; /*////////////////////////////////////////////////////////////////////////// DEPLOYERS From d784a306837120243f5e579c7e2592dac5362d89 Mon Sep 17 00:00:00 2001 From: Paul Razvan Berg Date: Fri, 15 Dec 2023 17:00:54 +0200 Subject: [PATCH 46/47] chore: update config key for arbitrum --- foundry.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/foundry.toml b/foundry.toml index 0e809433c..5eed6d8ed 100644 --- a/foundry.toml +++ b/foundry.toml @@ -80,7 +80,7 @@ repository = "https://github.com/sablier-labs/v2-core" [etherscan] - arbitrum_one = { key = "${API_KEY_ARBISCAN}" } + arbitrum = { key = "${API_KEY_ARBISCAN}" } avalanche = { key = "${API_KEY_SNOWTRACE" } bnb_smart_chain = { key = "${API_KEY_BSCSCAN}" } gnosis_chain = { key = "${API_KEY_GNOSISSCAN}" } @@ -100,7 +100,7 @@ wrap_comments = true [rpc_endpoints] - arbitrum_one = "https://arbitrum-mainnet.infura.io/v3/${API_KEY_INFURA}" + arbitrum = "https://arbitrum-mainnet.infura.io/v3/${API_KEY_INFURA}" avalanche = "https://avalanche-mainnet.infura.io/v3/${API_KEY_INFURA}" bnb_smart_chain = "https://bsc-dataseed.binance.org" gnosis_chain = "https://rpc.gnosischain.com" From ea638be9f60bb8b3451a2e4fafcb95b96d39c103 Mon Sep 17 00:00:00 2001 From: andreivladbrg Date: Fri, 15 Dec 2023 17:11:50 +0200 Subject: [PATCH 47/47] test: update Precompiles bytecode --- test/utils/Precompiles.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/utils/Precompiles.sol b/test/utils/Precompiles.sol index 53593d15b..f04592286 100644 --- a/test/utils/Precompiles.sol +++ b/test/utils/Precompiles.sol @@ -27,9 +27,9 @@ contract Precompiles { bytes public constant BYTECODE_COMPTROLLER = hex"60803461009857601f6104b338819003918201601f19168301916001600160401b0383118484101761009d5780849260209460405283398101031261009857516001600160a01b0381169081900361009857600080546001600160a01b0319168217815560405191907fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a36103ff90816100b48239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe608060408181526004918236101561001657600080fd5b600092833560e01c9182634d81e51d1461039d5750816375829def146102e5578163907a267b14610253578163b5b3ca2c146101ab578163cb01e30e146100f957508063dcf844a7146100c3578063e07df5b4146100a55763f851a4401461007d57600080fd5b346100a157816003193601126100a1576001600160a01b0360209254169051908152f35b5080fd5b50346100a157816003193601126100a1576020906001549051908152f35b50346100a15760203660031901126100a157806020926001600160a01b036100e96103d7565b1681526003845220549051908152f35b9050346101a75760203660031901126101a7576101146103d7565b6001600160a01b03918285541633810361017a575050169081835260026020528083209081549160ff8316159260ff84169060ff1916179055519081527f8cd3a7bc46b26a3b0c07a05a47af78abcaa647626f631d92ea64f8867b23bbec60203392a380f35b84516331b339a960e21b81526001600160a01b039091169181019182523360208301529081906040010390fd5b8280fd5b9050346101a757816003193601126101a7576101c56103d7565b90602435916001600160a01b039182865416338103610226575050907f371789a3d97098f3070492613273a065a7e8a19e009fd1ae92a4b4d4c71ed62d9116928385526003602052808520928084549455815193845260208401523392a380f35b85516331b339a960e21b81526001600160a01b039091169181019182523360208301529081906040010390fd5b919050346101a75760203660031901126101a7578135916001600160a01b038454163381036102b85750507fc059ba3e07a1c4d1fa8845bdb2af2dd85e844684e0a59e6073499e4338788465906001549280600155815193845260208401523392a280f35b82516331b339a960e21b81526001600160a01b039091169181019182523360208301529081906040010390fd5b919050346101a75760203660031901126101a7578135916001600160a01b03918284168094036103995784549283169033820361036d575050507fffffffffffffffffffffffff00000000000000000000000000000000000000001681178255337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808380a380f35b516331b339a960e21b81526001600160a01b039091169181019182523360208301529081906040010390fd5b8480fd5b849084346101a75760203660031901126101a75760ff906020936001600160a01b036103c76103d7565b1681526002855220541615158152f35b600435906001600160a01b03821682036103ed57565b600080fdfea164736f6c6343000815000a"; bytes public constant BYTECODE_LOCKUP_DYNAMIC = - hex"60c0346200046e57601f62005ca638819003918201601f19168301916001600160401b038311848410176200032b578084926080946040528339810103126200046e5780516001600160a01b038082169290918390036200046e5760208101518281168091036200046e5760408201519183831683036200046e5760600151936200008962000473565b90601d82527f5361626c696572205632204c6f636b75702044796e616d6963204e46540000006020830152620000be62000473565b601181527029a0a116ab1916a627a1a5aaa816a22ca760791b602082015230608052600080546001600160a01b03199081168417825560018054909116909517909455927fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a38051906001600160401b0382116200032b5760035490600182811c9216801562000463575b60208310146200044d5781601f849311620003d8575b50602090601f83116001146200034d5760009262000341575b50508160011b916000199060031b1c1916176003555b80516001600160401b0381116200032b576004918254600181811c9116801562000320575b60208210146200030b579081601f849311620002b3575b50602090601f831160011462000248576000926200023c575b50508160011b916000199060031b1c19161790555b1660018060a01b0319600a541617600a5560a052600160095560405161581290816200049482396080518161526e015260a05181818161120e01526147ce0152f35b015190503880620001e5565b6000858152602081209350601f198516905b8181106200029a575090846001959493921062000280575b505050811b019055620001fa565b015160001960f88460031b161c1916905538808062000272565b929360206001819287860151815501950193016200025a565b909150836000526020600020601f840160051c8101916020851062000300575b90601f859493920160051c01905b818110620002f05750620001cc565b60008155849350600101620002e1565b9091508190620002d3565b602284634e487b7160e01b6000525260246000fd5b90607f1690620001b5565b634e487b7160e01b600052604160045260246000fd5b0151905038806200017a565b600360009081527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b9350601f198516905b818110620003bf5750908460019594939210620003a5575b505050811b0160035562000190565b015160001960f88460031b161c1916905538808062000396565b929360206001819287860151815501950193016200037e565b60036000529091507fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f840160051c8101916020851062000442575b90601f859493920160051c01905b81811062000432575062000161565b6000815584935060010162000423565b909150819062000415565b634e487b7160e01b600052602260045260246000fd5b91607f16916200014b565b600080fd5b60408051919082016001600160401b038111838210176200032b5760405256fe608080604052600436101561001357600080fd5b60003560e01c90816301ffc9a7146128d25750806306fdde031461280f578063081812fc146127f1578063095ea7b31461265d5780631400ecec146125b8578063168444561461233d5780631c1cdd4c146122d75780631e99d569146122b957806323b872dd1461229057806339a73c031461224d57806340e58ee514612014578063425d30dd14611ff657806342842e0e14611fa657806342966c6814611e285780634857501f14611db25780634869e12d14611d765780635fe3b56714611d4f5780636352211e14611d205780636d0cee7514611cc857806370a0823114611c1e57806375829def14611b8c5780637cad6cd114611aba5780637de6b1db146118ce5780638659c270146115f0578063894e9a0d146113835780638bad38dd146113075780638f69b993146112845780639067b677146112315780639188ec84146111f657806395d89b41146110e8578063a22cb46514611017578063a2ffb89714610f1e578063a6202bf214610e1e578063a80fc07114610dc9578063ad35efd414610d66578063b256456914610d48578063b637b86514610ce8578063b88d4fde14610c5f578063b8a3be6614610c28578063b971302a14610bd6578063bc063e1a14610bb3578063bc2be1be14610b60578063c156a11d14610aac578063c33cd35e14610997578063c87b56dd14610864578063cc364f48146107ca578063d4dbd20b14610775578063d511609f14610726578063d975dfed146106d9578063e985e9c514610682578063ea5ead1914610652578063eac8f5b8146105e6578063f590c176146105be578063f851a440146105975763fdd46d601461027c57600080fd5b34610480576060366003190112610480576004356102986129ff565b604435916001600160801b039182841693848103610480576102b8615264565b6102c1836132ed565b61057f576102e583600052600b6020526001600160a01b0360406000205416331490565b9182158061056f575b6105505783600052602094600586526001600160a01b039081604060002054169480610544575b61051e5781831693841561050d5788156104f55761033287615326565b8281168a116104c1575091889161038e6103626103cb958a600052600b8c5260026040600020015460801c615622565b89600052600b8b52600260406000200190836001600160801b031983549260801b169116178155613282565b906103aa818b8401511692826040818351169201511690613324565b16111561048f575b86600052600b88526001604060002001541692836152c0565b81847f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d876040518a8152a48133141580610485575b61041f575b6000805160206157e68339815191528484604051908152a1005b813b15610480576000805160206157e68339815191529460846000928360405195869485936313375c3b60e01b8552896004860152336024860152604485015260648401525af1610471575b80610405565b61047a90612b72565b3861046b565b600080fd5b50813b1515610400565b86600052600b8852604060002060018101600160a01b60ff60a01b1982541617905560ff60f01b1981541690556103b2565b60405163287ecaef60e21b8152600481018990526001600160801b03928316602482015291166044820152606490fd5b0390fd5b6024876040519063d2aabcd960e01b82526004820152fd5b600460405163630d074f60e11b8152fd5b606486838560405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b50848284161415610315565b60405163216caf0d60e01b815260048101859052336024820152604490fd5b506105798461563d565b156102ee565b60248360405190634a5541ef60e01b82526004820152fd5b346104805760003660031901126104805760206001600160a01b0360005416604051908152f35b346104805760203660031901126104805760206105dc60043561333d565b6040519015158152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260206001600160a01b0360016040600020015416604051908152f35b6024906040519062b8e7e760e51b82526004820152fd5b34610480576040366003190112610480576106806004356106716129ff565b61067a82615326565b9161535e565b005b346104805760403660031901126104805761069b6129e9565b6106a36129ff565b906001600160a01b03809116600052600860205260406000209116600052602052602060ff604060002054166040519015158152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57610715602091615326565b6001600160801b0360405191168152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b602052602060026040600020015460801c604051908152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260206001600160801b0360036040600020015416604051908152f35b3461048057602036600319011261048057600435600060206040516107ee81612b39565b828152015280600052600b60205260ff60016040600020015460a81c161561063b57600052600b6020526040806000205464ffffffffff82519161083183612b39565b818160a01c16835260c81c166020820152610862825180926020908164ffffffffff91828151168552015116910152565bf35b346104805760208060031936011261048057600435906108a261089d8360005260056020526001600160a01b0360406000205416151590565b612bd8565b60006001600160a01b03600a5416926044604051809581937fe9dc637500000000000000000000000000000000000000000000000000000000835230600484015260248301525afa91821561098b57600092610912575b5061090e6040519282849384528301906129c4565b0390f35b9091503d806000833e6109258183612b86565b81019082818303126104805780519067ffffffffffffffff8211610480570181601f8201121561048057805161095a81612ba8565b926109686040519485612b86565b81845284828401011161048057610984918480850191016129a1565b90826108f9565b6040513d6000823e3d90fd5b3461048057600319602036820112610480576004359067ffffffffffffffff9081831161048057610140908336030112610480576109d3615264565b604051916109e083612b1c565b6109ec81600401612a15565b83526109fa6024820161336e565b6020840152610a0b60448201612af3565b6040840152610a1c60648201612af3565b6060840152610a2d60848201612a15565b6080840152610a3e60a48201612bc4565b60a0840152610a4f60c48201612a15565b60c0840152610a613660e48301613454565b60e084015261012481013591821161048057013660238201121561048057602091610a99610aa4923690602460048201359101613380565b610100820152614720565b604051908152f35b3461048057604036600319011261048057600435610ac86129ff565b90610ad1615264565b80600052600b60205260ff60016040600020015460a81c161561063b578060005260056020526001600160a01b036040600020541691823303610b415761068092610b1b83615326565b6001600160801b038116610b30575b50612e6b565b610b3b90828561535e565b84610b2a565b60405163216caf0d60e01b815260048101839052336024820152604490fd5b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b602052602064ffffffffff60406000205460a01c16604051908152f35b3461048057600036600319011261048057602060405167016345785d8a00008152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260206001600160a01b0360406000205416604051908152f35b3461048057602036600319011261048057600435600052600b602052602060ff60016040600020015460a81c166040519015158152f35b3461048057608036600319011261048057610c786129e9565b610c806129ff565b6064359167ffffffffffffffff8311610480573660238401121561048057826004013591610cad83612ba8565b92610cbb6040519485612b86565b80845236602482870101116104805760208160009260246106809801838801378501015260443591612cf6565b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205261090e610d3460046040600020016131d5565b604051918291602083526020830190612a8f565b346104805760203660031901126104805760206105dc6004356132b6565b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57610da090614624565b6040516005821015610db3576020918152f35b634e487b7160e01b600052602160045260246000fd5b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260206001600160801b0360026040600020015416604051908152f35b3461048057602036600319011261048057610e376129e9565b6001600160a01b038060005416338103610ef557508116908160005260026020526001600160801b0360406000205416908115610ec45781610e969184600052600260205260406000206001600160801b0319815416905533906152c0565b6040519081527fca7a4a65a94ed2f37538814e00e1cd4c41a78261561e3f3794592f11409cf5af60203392a3005b602483604051907f8410168c0000000000000000000000000000000000000000000000000000000082526004820152fd5b6040516331b339a960e21b81526001600160a01b03919091166004820152336024820152604490fd5b346104805760603660031901126104805767ffffffffffffffff60043581811161048057610f50903690600401612a5e565b610f586129ff565b9260443590811161048057610f71903690600401612a5e565b9190610f7b615264565b828203610fe05760005b828110610f8e57005b806000805160206157e68339815191526020610fad600194878a61534e565b35610fd3610fc4610fbf868b8a61534e565b613440565b610fcc615264565b8b8361538b565b604051908152a101610f85565b50604491604051917faec9344000000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b34610480576040366003190112610480576110306129e9565b60243590811515809203610480576001600160a01b0316908133146110a457336000526008602052604060002082600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a3005b606460405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152fd5b3461048057600036600319011261048057604051600060045490600182811c918184169182156111ec575b60209485851084146111d65785879486865291826000146111b6575050600114611159575b5061114592500383612b86565b61090e6040519282849384528301906129c4565b84915060046000527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b906000915b85831061119e575050611145935082010185611138565b80548389018501528794508693909201918101611187565b60ff19168582015261114595151560051b85010192508791506111389050565b634e487b7160e01b600052602260045260246000fd5b92607f1692611113565b346104805760003660031901126104805760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b602052602064ffffffffff60406000205460c81c16604051908152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b576112be90614624565b600581101580610db357600282149081156112fa575b81156112e8575b6020826040519015158152f35b9050610db357600460209114826112db565b50506003811460006112d4565b34610480576020366003190112610480576004356001600160a01b0390818116809103610480578160005416338103610ef5575060015491816001600160a01b03198416176001556040519216825260208201527fdcb09aef4bf01068924ccce937981cbe59d25ba08380cf941aaaea4e4bd3960d60403392a2005b346104805760203660031901126104805760606101406040516113a581612b55565b60008152600060208201526000604082015260008382015260006080820152600060a0820152600060c0820152600060e082015260006101008201526113e9613263565b6101208201520152600435600052600b60205260ff60016040600020015460a81c16156115d857600435600052600b60205260406000206114cc60046040519261143284612b55565b80546001600160a01b038116855264ffffffffff8160a01c16602086015264ffffffffff8160c81c16604086015260ff8160f01c161515606086015260f81c1515608085015260ff60018201546001600160a01b03811660a0870152818160a01c16151560c0870152818160a81c16151560e087015260b01c1615156101008501526114c060028201613282565b610120850152016131d5565b6101408201526114dd600435614624565b906005821015610db357600261014092146115cc575b61090e604051928392602084526001600160a01b03815116602085015264ffffffffff602082015116604085015264ffffffffff60408201511660608501526060810151151560808501526080810151151560a08501526001600160a01b0360a08201511660c085015260c0810151151560e085015260e0810151151561010085015261010081015115156101208501526115b861012082015183860190604090816001600160801b0391828151168552826020820151166020860152015116910152565b01516101a0808401526101c0830190612a8f565b600060608201526114f3565b602460405162b8e7e760e51b81526004356004820152fd5b34610480576020806003193601126104805760043567ffffffffffffffff811161048057611622903690600401612a5e565b9061162b615264565b6000915b80831061163857005b61164383828461534e565b359261164d615264565b611656846132ed565b156116735760248460405190634a5541ef60e01b82526004820152fd5b61167f8492939461333d565b6118b6576116a382600052600b6020526001600160a01b0360406000205416331490565b15610b41576116b182613483565b82600052600b8087526116ca6002604060002001613282565b906001600160801b039283835116848216101561189e578560005281895260ff60406000205460f01c1615611886579061173882858b61172e7f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa509683895116613324565b9601511690613324565b9580600052818a526040600020938a855498600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8b16178755600388821697881561186c575b0197831697886001600160801b03198254161790556001600160a01b03809a16958691600584528b604060002054169687945260019b8c6040600020015416946117cb8b85886152c0565b604080518881526001600160801b0392831660208201529290911690820152606090a46000805160206157e68339815191528a604051838152a1813b611819575b505050505001919061162f565b813b15610480576000608492819560405197889687956372eba20360e01b875260048701526024860152604485015260648401525af161185d575b8080808061180c565b61186690612b72565b85611854565b60018101600160a01b60ff60a01b19825416179055611780565b602486604051906339c6dc7360e21b82526004820152fd5b602486604051906322cad1af60e11b82526004820152fd5b6024826040519063fe19f19f60e01b82526004820152fd5b346104805760208060031936011261048057600435906118ec615264565b81600052600b815260ff60016040600020015460a81c1615611aa35761191182614624565b6005811015610db3576004810361193a5760248360405190634a5541ef60e01b82526004820152fd5b6003810361195a576024836040519063fe19f19f60e01b82526004820152fd5b600214611a8b5761198182600052600b6020526001600160a01b0360406000205416331490565b15610b415781600052600b815260ff60406000205460f01c1615611a735781600052600b8152604060002060ff60f01b19815416905560405191807f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f600080a2600582526001600160a01b036040600020541692833b611a16575b6000805160206157e68339815191528383604051908152a1005b833b1561048057600081602481836000805160206157e6833981519152987f341a0bd90000000000000000000000000000000000000000000000000000000083528760048401525af1156119fc57611a6d90612b72565b836119fc565b602482604051906339c6dc7360e21b82526004820152fd5b602482604051906322cad1af60e11b82526004820152fd5b6024826040519062b8e7e760e51b82526004820152fd5b34610480576020366003190112610480576004356001600160a01b0390818116809103610480578160005416338103610ef55750600a5491816001600160a01b0319841617600a556040519216825260208201527fa2548bd4b805e907c1558a47b5858324fe8bb4a2e1ddfca647eecbf65610eebc60403392a26009546000198101908111611b765760407f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c91815190600182526020820152a1005b634e487b7160e01b600052601160045260246000fd5b3461048057602036600319011261048057611ba56129e9565b6000546001600160a01b0380821692338403611bf7576001600160a01b03199350169182911617600055337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf80600080a3005b6040516331b339a960e21b81526001600160a01b0385166004820152336024820152604490fd5b34610480576020366003190112610480576001600160a01b03611c3f6129e9565b168015611c5e5760005260066020526020604060002054604051908152f35b608460405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e657200000000000000000000000000000000000000000000006064820152fd5b3461048057602036600319011261048057600435611cff61089d8260005260056020526001600160a01b0360406000205416151590565b600052600560205260206001600160a01b0360406000205416604051908152f35b34610480576020366003190112610480576020611d3e600435612c23565b6001600160a01b0360405191168152f35b346104805760003660031901126104805760206001600160a01b0360015416604051908152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b576107156020916146a5565b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b576000611dee82614624565b6005811015610db357600203611e0c575b6020906040519015158152f35b50600052600b602052602060ff60406000205460f01c16611dff565b3461048057602036600319011261048057600435611e44615264565b611e4d816132ed565b15611f7557611e5b8161563d565b15611f5557611e6981612c23565b611e72826132b6565b159081611f4c575b81611f39575b50611f2157602081611ea06000805160206157e683398151915293612c23565b9080600052600783526001600160a01b036040600020926001600160a01b031993848154169055169182600052600684526040600020600019815401905581600052600584526040600020908154169055806000604051937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a48152a1005b60249060405190630da9b01360e01b82526004820152fd5b6001600160a01b03915016151582611e80565b60009150611e7a565b60405163216caf0d60e01b81526004810191909152336024820152604490fd5b602490604051907f817cd6390000000000000000000000000000000000000000000000000000000082526004820152fd5b3461048057611fb436612a29565b60405191602083019383851067ffffffffffffffff861117611fe0576106809460405260008452612cf6565b634e487b7160e01b600052604160045260246000fd5b346104805760203660031901126104805760206105dc6004356132ed565b34610480576020806003193601126104805760043590612032615264565b61203b826132ed565b156120585760248260405190634a5541ef60e01b82526004820152fd5b6120618261333d565b6118b65761208582600052600b6020526001600160a01b0360406000205416331490565b15610b415761209382613483565b9180600052600b82526120ac6002604060002001613282565b906001600160801b0393848351168582161015611a8b5781600052600b845260ff60406000205460f01c1615611a73578085856120ef6120f99483885116613324565b9501511690613324565b9080600052600b84526000805160206157e6833981519152604060002094855494600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff87161787556003888616978815612233575b0197811697886001600160801b03198254161790556001600160a01b038096169560058352867f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa508260406000205416978893600b875260016040600020015416946121bc8d85886152c0565b604080518a81526001600160801b0392831660208201529290911690820152606090a4604051838152a1813b6121ee57005b813b15610480576000608492819560405197889687956372eba20360e01b875260048701526024860152604485015260648401525af161222a57005b61068090612b72565b60018101600160a01b60ff60a01b19825416179055612150565b34610480576020366003190112610480576001600160a01b0361226e6129e9565b16600052600260205260206001600160801b0360406000205416604051908152f35b34610480576106806122a136612a29565b916122b46122af8433612d8c565b612c85565b612e6b565b34610480576000366003190112610480576020600954604051908152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b5761231190614624565b6005811015610db3578060209115908115612332575b506040519015158152f35b600191501482612327565b346104805760206003198181360112610480576004359067ffffffffffffffff9081831161048057610120833603918201126104805761237b615264565b6101048301359060221901811215610480578201600481013590828211610480576024016060820236038113610480576123b6913691613380565b918251906123c3826131bd565b916123d16040519384612b86565b808352601f196123e0826131bd565b018660005b8281106125a25750505064ffffffffff90814216946001600160801b03968761240d826134ee565b515116828a61241b846134ee565b510151168580604061242c866134ee565b510151168a0116906040519261244184612b00565b83528b8301526040820152612455876134ee565b5261245f866134ee565b5060019386855b8a8c87831061252157908b846001600160a01b038c60a48101358281169081900361048057610aa4956124e195612511946124a36024860161341f565b6124af6044870161341f565b6124bb6064880161342c565b916124c88860040161342c565b94846124d660848b01613440565b966040519d8e612b1c565b168c528d8c0152151560408b0152151560608a01521660808801521660a086015260c085015260c4369101613454565b60e0830152610100820152614720565b8893858060406125558b866125458a8e9a61253c828d613511565b5151169a613511565b5101511694600019890190613511565b51015116816040612566888c613511565b510151160116916040519361257a85612b00565b8452830152604082015261258e828b613511565b52612599818a613511565b50018790612466565b6125aa613263565b8282880101520187906123e5565b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b5760209060009080600052600b8352604060002060ff815460f01c168061264b575b612622575b50506001600160801b0360405191168152f35b61264492506001600160801b03600261263e9201541691613483565b90613324565b828061260f565b5060ff600182015460a01c161561260a565b34610480576040366003190112610480576126766129e9565b602435906001600160a01b03808061268d85612c23565b1692169180831461278757803314908115612762575b50156126f8578260005260076020526040600020826001600160a01b03198254161790556126d083612c23565b167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b608460405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152fd5b9050600052600860205260406000203360005260205260ff60406000205416846126a3565b608460405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152fd5b34610480576020366003190112610480576020611d3e600435612c48565b3461048057600036600319011261048057604051600060035490600182811c918184169182156128c8575b60209485851084146111d65785879486865291826000146111b657505060011461286b575061114592500383612b86565b84915060036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b906000915b8583106128b0575050611145935082010185611138565b80548389018501528794508693909201918101612899565b92607f169261283a565b3461048057602036600319011261048057600435907fffffffff00000000000000000000000000000000000000000000000000000000821680920361048057817f80ac58cd0000000000000000000000000000000000000000000000000000000060209314908115612977575b811561294d575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501483612946565b7f5b5e139f000000000000000000000000000000000000000000000000000000008114915061293f565b60005b8381106129b45750506000910152565b81810151838201526020016129a4565b906020916129dd815180928185528580860191016129a1565b601f01601f1916010190565b600435906001600160a01b038216820361048057565b602435906001600160a01b038216820361048057565b35906001600160a01b038216820361048057565b6060906003190112610480576001600160a01b0390600435828116810361048057916024359081168103610480579060443590565b9181601f840112156104805782359167ffffffffffffffff8311610480576020808501948460051b01011161048057565b90815180825260208080930193019160005b828110612aaf575050505090565b835180516001600160801b031686528083015167ffffffffffffffff168684015260409081015164ffffffffff169086015260609094019392810192600101612aa1565b3590811515820361048057565b6060810190811067ffffffffffffffff821117611fe057604052565b610120810190811067ffffffffffffffff821117611fe057604052565b6040810190811067ffffffffffffffff821117611fe057604052565b610160810190811067ffffffffffffffff821117611fe057604052565b67ffffffffffffffff8111611fe057604052565b90601f8019910116810190811067ffffffffffffffff821117611fe057604052565b67ffffffffffffffff8111611fe057601f01601f191660200190565b35906001600160801b038216820361048057565b15612bdf57565b606460405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152fd5b60005260056020526001600160a01b0360406000205416612c45811515612bd8565b90565b612c6b61089d8260005260056020526001600160a01b0360406000205416151590565b60005260076020526001600160a01b036040600020541690565b15612c8c57565b608460405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f766564000000000000000000000000000000000000006064820152fd5b90612d1a939291612d0a6122af8433612d8c565b612d15838383612e6b565b613024565b15612d2157565b60405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b906001600160a01b038080612da084612c23565b16931691838314938415612dd3575b508315612dbd575b50505090565b612dc991929350612c48565b1614388080612db7565b909350600052600860205260406000208260005260205260ff604060002054169238612daf565b15612e0157565b608460405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152fd5b90612e949291612e7a83612c23565b916001600160a01b03948593848094169687911614612dfa565b1690811580612f8b57612ea6846132b6565b159081612f82575b5080612f79575b612f615791808492612ee36000805160206157e683398151915296602096612edc85612c23565b1614612dfa565b60009382855260078652604085206001600160a01b031990818154169055818652600687526040862060001981540190558286526040862060018154019055838652600587528260408720918254161790557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6040519580a48152a1565b60248360405190630da9b01360e01b82526004820152fd5b50831515612eb5565b90501538612eae565b608460405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152fd5b3d1561301f573d9061300582612ba8565b916130136040519384612b86565b82523d6000602084013e565b606090565b9290803b156131b45761308e916020916001600160a01b0394604051809581948293897f150b7a02000000000000000000000000000000000000000000000000000000009b8c865233600487015216602485015260448401526080606484015260848301906129c4565b03916000968791165af19082908261314d575b5050613127576130af612ff4565b805190816131225760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000161490565b909192506020813d82116131ac575b8161316960209383612b86565b810103126131a85751907fffffffff00000000000000000000000000000000000000000000000000000000821682036131a557509038806130a1565b80fd5b5080fd5b3d915061315c565b50505050600190565b67ffffffffffffffff8111611fe05760051b60200190565b9081546131e1816131bd565b926040936131f185519182612b86565b828152809460208092019260005281600020906000935b85851061321757505050505050565b6001848192845161322781612b00565b64ffffffffff87546001600160801b038116835267ffffffffffffffff8160801c168584015260c01c1686820152815201930194019391613208565b6040519061327082612b00565b60006040838281528260208201520152565b9060405161328f81612b00565b6040819360018154916001600160801b0392838116865260801c6020860152015416910152565b80600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260ff60016040600020015460b01c1690565b80600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260ff60016040600020015460a01c1690565b6001600160801b039182169082160391908211611b7657565b80600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260406000205460f81c90565b359064ffffffffff8216820361048057565b92919261338c826131bd565b60409461339b86519283612b86565b8195848352602080930191606080960285019481861161048057925b8584106133c75750505050505050565b8684830312610480578251906133dc82612b00565b6133e585612bc4565b8252858501359067ffffffffffffffff8216820361048057828792838b95015261341086880161336e565b868201528152019301926133b7565b3580151581036104805790565b356001600160a01b03811681036104805790565b356001600160801b03811681036104805790565b91908260409103126104805760405161346c81612b39565b602080829461347a81612a15565b84520135910152565b64ffffffffff80421682600052600b602052604060002091825482828260a01c1610156134e45760c81c1611156134d25760040154600110156134c957612c4590613525565b612c4590614555565b6001600160801b039150600201541690565b5050505050600090565b8051156134fb5760200190565b634e487b7160e01b600052603260045260246000fd5b80518210156134fb5760209160051b010190565b64ffffffffff90814216906000908152600b60205260409081812082519361354c85612b55565b8154956001600160a01b039182881687526020870197828160a01c168952828160c81c168789015260ff8160f01c161515606089015260f81c1515608088015260ff6001938486015490811660a08a0152818160a01c16151560c08a0152818160a81c16151560e08a015260b01c1615156101008801526101406135e660046135d760028801613282565b966101208b01978852016131d5565b97019187835280876135f8889a6134ee565b5101511693828288965b16106136dc57509161368c6136919284888161369698976001600160801b039e8f61362e8b8a51613511565b5151169d8a8f9b602061364b67ffffffffffffffff928d51613511565b5101511699848361365d848451613511565b51015116965081156136d05761367b92935051906000190190613511565b5101511680925b0316920316613750565b613abf565b613922565b9283136136af5750506136a98391613714565b16011690565b5160200151929392831692841683101591506136cb9050575090565b905090565b50505051168092613682565b8094986001600160801b0390816136f48c8851613511565b51511601169801938282808a61370b898951613511565b51015116613602565b6000811261371f5790565b602490604051907f2463f3d50000000000000000000000000000000000000000000000000000000082526004820152fd5b90600160ff1b808314908115613838575b5061380e5760008212156138055761378a826000035b60008312156137fe578260000390613842565b917f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83116137c857600091600019911813156137c4575090565b0390565b604491604051917fd49c26b300000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b8290613842565b61378a82613777565b60046040517f9fe2b450000000000000000000000000000000000000000000000000000000008152fd5b9050811438613761565b670de0b6b3a76400009160001983830992808302928380861095039480860395146138fe57828510156138c257908291096001821901821680920460028082600302188083028203028083028203028083028203028083028203028083028203028092029003029360018380600003040190848311900302920304170290565b82606492604051927f63a05778000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b50508092501561390c570490565b634e487b7160e01b600052601260045260246000fd5b90600160ff1b808314908115613a06575b506139dc5760008212156139d35761395c826000035b60008312156139cc578260000390613a10565b917f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831161399657600091600019911813156137c4575090565b604491604051917f120b5b4300000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b8290613a10565b61395c82613949565b60046040517fa6070c25000000000000000000000000000000000000000000000000000000008152fd5b9050811438613933565b90919060001983820983820291828083109203918083039214613aae57670de0b6b3a76400009081831015613a7757947faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066994950990828211900360ee1b910360121c170290565b60449086604051917f5173648d00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050670de0b6b3a764000090049150565b80613ad95750600090612c455750670de0b6b3a764000090565b90670de0b6b3a7640000808314613b26575080613afe575050670de0b6b3a764000090565b670de0b6b3a76400008114613b2257613b1d90613691612c4593614400565b613b46565b5090565b91505090565b801561390c576ec097ce7bc90715b34b9f10000000000590565b6000811215613b7b5768033dd1780914b97114198112613b7557613b6c90600003613b46565b612c4590613b2c565b50600090565b680a688906bd8affffff81136143cf57670de0b6b3a764000080604092831b05907780000000000000000000000000000000000000000000000067ff0000000000000083166142b2575b66ff00000000000083166141aa575b65ff000000000083166140aa575b64ff000000008316613fb2575b63ff0000008316613ec2575b62ff00008316613dda575b61ff008316613cfa575b60ff8316613c23575b02911c60bf031c90565b60808316613ce8575b838316613cd6575b60208316613cc4575b60108316613cb2575b60088316613ca0575b60048316613c8e575b60028316613c7c575b6001831615613c19576801000000000000000102831c613c19565b6801000000000000000102831c613c61565b6801000000000000000302831c613c58565b6801000000000000000602831c613c4f565b6801000000000000000b02831c613c46565b6801000000000000001602831c613c3d565b6801000000000000002c02831c613c34565b6801000000000000005902831c613c2c565b6180008316613dc8575b6140008316613db6575b6120008316613da4575b6110008316613d92575b6108008316613d80575b6104008316613d6e575b6102008316613d5c575b610100831615613c1057680100000000000000b102831c613c10565b6801000000000000016302831c613d40565b680100000000000002c602831c613d36565b6801000000000000058c02831c613d2c565b68010000000000000b1702831c613d22565b6801000000000000162e02831c613d18565b68010000000000002c5d02831c613d0e565b680100000000000058b902831c613d04565b628000008316613eb0575b624000008316613e9e575b622000008316613e8c575b621000008316613e7a575b620800008316613e68575b620400008316613e56575b620200008316613e44575b62010000831615613c06576801000000000000b17202831c613c06565b680100000000000162e402831c613e27565b6801000000000002c5c802831c613e1c565b68010000000000058b9102831c613e11565b680100000000000b172102831c613e06565b68010000000000162e4302831c613dfb565b680100000000002c5c8602831c613df0565b6801000000000058b90c02831c613de5565b63800000008316613fa0575b63400000008316613f8e575b63200000008316613f7c575b63100000008316613f6a575b63080000008316613f58575b63040000008316613f46575b63020000008316613f34575b6301000000831615613bfb5768010000000000b1721802831c613bfb565b6801000000000162e43002831c613f16565b68010000000002c5c86002831c613f0a565b680100000000058b90c002831c613efe565b6801000000000b17217f02831c613ef2565b680100000000162e42ff02831c613ee6565b6801000000002c5c85fe02831c613eda565b68010000000058b90bfc02831c613ece565b6480000000008316614098575b6440000000008316614086575b6420000000008316614074575b6410000000008316614062575b6408000000008316614050575b640400000000831661403e575b640200000000831661402c575b640100000000831615613bef57680100000000b17217f802831c613bef565b68010000000162e42ff102831c61400d565b680100000002c5c85fe302831c614000565b6801000000058b90bfce02831c613ff3565b68010000000b17217fbb02831c613fe6565b6801000000162e42fff002831c613fd9565b68010000002c5c8601cc02831c613fcc565b680100000058b90c0b4902831c613fbf565b658000000000008316614198575b654000000000008316614186575b652000000000008316614174575b651000000000008316614162575b650800000000008316614150575b65040000000000831661413e575b65020000000000831661412c575b65010000000000831615613be2576801000000b17218355102831c613be2565b680100000162e430e5a202831c61410c565b6801000002c5c863b73f02831c6140fe565b68010000058b90cf1e6e02831c6140f0565b680100000b1721bcfc9a02831c6140e2565b68010000162e43f4f83102831c6140d4565b680100002c5c89d5ec6d02831c6140c6565b6801000058b91b5bc9ae02831c6140b8565b668000000000000083166142a0575b6640000000000000831661428e575b6620000000000000831661427c575b6610000000000000831661426a575b66080000000000008316614258575b66040000000000008316614246575b66020000000000008316614234575b6601000000000000831615613bd45768010000b17255775c0402831c613bd4565b6801000162e525ee054702831c614213565b68010002c5cc37da949202831c614204565b680100058ba01fb9f96d02831c6141f5565b6801000b175effdc76ba02831c6141e6565b680100162f3904051fa102831c6141d7565b6801002c605e2e8cec5002831c6141c8565b68010058c86da1c09ea202831c6141b9565b67800000000000000083166143b0575b674000000000000000831661439e575b672000000000000000831661438c575b671000000000000000831661437a575b6708000000000000008316614368575b6704000000000000008316614356575b6702000000000000008316614344575b670100000000000000831615613bc557680100b1afa5abcbed6102831c613bc5565b68010163da9fb33356d802831c614322565b680102c9a3e778060ee702831c614312565b6801059b0d31585743ae02831c614302565b68010b5586cf9890f62a02831c6142f2565b6801172b83c7d517adce02831c6142e2565b6801306fe0a31b7152df02831c6142d2565b5077b504f333f9de6484800000000000000000000000000000006142c2565b602490604051907f0360d0280000000000000000000000000000000000000000000000000000000082526004820152fd5b8060008083131561452457670de0b6b3a7640000928381126144ed57506001925b808305906001600160801b03821160071b91821c9167ffffffffffffffff831160061b92831c63ffffffff811160051b90811c61ffff811160041b90811c60ff811160031b90811c91600f831160021b92831c936001978860038711811b96871c11961717171717171781810294811d908282146144e157506706f05b59d3b20000905b8482136144b55750505050500290565b808391020590671bc16d674ec800008212156144d4575b831d906144a5565b8091950194831d906144cc565b93505093925050020290565b6000199392508015614510576ec097ce7bc90715b34b9f10000000000591614421565b602482634e487b7160e01b81526012600452fd5b602483604051907f059b101b0000000000000000000000000000000000000000000000000000000082526004820152fd5b64ffffffffff61458a600091838352600b60205280806040852054818160a01c1693849160c81c160316918142160316613750565b91808252600b602052600460408320018054156146105790829167ffffffffffffffff93526145e26020832054828452600b6020526136916001600160801b03968760026040882001541696879360801c1690613abf565b9283136145f85750506145f490613714565b1690565b60029350604092508152600b60205220015460801c90565b602483634e487b7160e01b81526032600452fd5b80600052600b602052604060002060ff600182015460a01c1660001461464b575050600490565b805460f81c61469e575460a01c64ffffffffff164210613b755761466e81613483565b90600052600b6020526001600160801b03806002604060002001541691161060001461469957600190565b600290565b5050600390565b80600052600b6020526146be6002604060002001613282565b81600052600b602052604060002060ff600182015460a01c166000146146f157506001600160801b039150602001511690565b5460f81c6147035750612c4590613483565b612c4591506001600160801b036040818351169201511690613324565b906001600160a01b036001541660206001600160a01b0360c0850151166024604051809481937fdcf844a700000000000000000000000000000000000000000000000000000000835260048301525afa801561098b57600090614fd3575b6147a191506001600160801b0360a08501511690602060e08601510151916156a6565b6001600160801b0381511661010084015164ffffffffff6020860151168215614fa95781518015614f7f577f00000000000000000000000000000000000000000000000000000000000000008111614f4e575064ffffffffff6040614805846134ee565b51015116811015614ef75750600090819082815184905b808210614e64575050505064ffffffffff421664ffffffffff8216811015614e245750506001600160801b0316808203614ded5750506009549283600052600b6020526040600020916001600160801b0381511660028401906001600160801b03198254161790556001600160a01b0360c083015116600184015490750100000000000000000000000000000000000000000060408501511515928654927fffffffffffffffffff0000ff000000000000000000000000000000000000000076ff000000000000000000000000000000000000000000006060890151151560b01b16921617171760018601556001600160a01b038451169161010085015192604061492e855195600019870190613511565b510151927fff000000000000000000000000000000000000000000000000000000000000007eff0000000000000000000000000000000000000000000000000000000000007dffffffffff0000000000000000000000000000000000000000000000000078ffffffffff000000000000000000000000000000000000000060208b015160a01b169660c81b169460f01b16911617171717845560005b818110614d1d575050600185016009556001600160a01b0360c08301511660005260026020526001600160801b0380604060002054168160208401511601166001600160a01b0360c0840151166000526040600020906001600160801b03198254161790556001600160a01b036080830151168015614cd957614a6c614a668760005260056020526001600160a01b0360406000205416151590565b15615181565b614a75866132b6565b1580614cd0575b80614cc8575b614cb05760206000805160206157e683398151915291614abb614a668960005260056020526001600160a01b0360406000205416151590565b806000526006825260406000206001815401905587600052600582526040600020816001600160a01b0319825416179055876040519160007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4878152a1614b4b6001600160a01b0360c0840151166001600160801b03808451168160208601511601169030903390615007565b6001600160801b0360408201511680614c81575b507fef3d668acee46576ad5d407c42ab4d0cde13f3cd70b28f09a0fb9e3bf5bf09cb614c3e6001600160a01b03845116926001600160a01b03608086015116946001600160a01b0360c08201511696614c76614c5660408401511515928c606086015115156001600160a01b0360e061010089015194549864ffffffffff6040519a614bea8c612b39565b818160a01c168c5260c81c1660208b01520151511695604051998a99610160948b523360208c015260408b0190604090816001600160801b0391828151168552826020820151166020860152015116910152565b60a089015260c08801528060e0880152860190612a8f565b926101008501906020908164ffffffffff91828151168552015116910152565b6101408301520390a4565b614caa906001600160a01b0360c0850151166001600160a01b0360e08601515116903390615007565b38614b5f565b60248660405190630da9b01360e01b82526004820152fd5b506000614a82565b50801515614a7c565b606460405162461bcd60e51b815260206004820152602060248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152fd5b614d2c81610100860151613511565b519060048601549168010000000000000000831015611fe057600183018060048901558310156134fb5760019260048801600052602060002001906001600160801b03815116908254917fffffff00000000000000000000000000000000000000000000000000000000007cffffffffff000000000000000000000000000000000000000000000000604077ffffffffffffffff00000000000000000000000000000000602086015160801b1694015160c01b1693161717179055016149ca565b60449250604051917fd90b7e3900000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b6040517f210aec0e00000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b9193509193614e88906001600160801b03614e7f8588613511565b51511690615622565b9364ffffffffff806040614e9c8685613511565b51015116941680851115614eba57506001849301919291909261481c565b8385606492604051927f7b0bada8000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b64ffffffffff6040614f08846134ee565b5101516040517fb4c9e52c00000000000000000000000000000000000000000000000000000000815264ffffffffff938416600482015291169091166024820152604490fd5b602490604051907f4757689b0000000000000000000000000000000000000000000000000000000082526004820152fd5b60046040517f3952c64e000000000000000000000000000000000000000000000000000000008152fd5b60046040517f6095d3bc000000000000000000000000000000000000000000000000000000008152fd5b6020823d602011614fff575b81614fec60209383612b86565b810103126131a557506147a1905161477e565b3d9150614fdf565b9290604051927f23b872dd0000000000000000000000000000000000000000000000000000000060208501526001600160a01b03809216602485015216604483015260648201526064815260a081019181831067ffffffffffffffff841117611fe05761507692604052615078565b565b6001600160a01b0316906150d860405161509181612b39565b6020938482527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564858301526000808587829751910182855af16150d2612ff4565b916151cc565b80519182159184831561515d575b5050509050156150f35750565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b9193818094500103126131a8578201519081151582036131a55750803880846150e6565b1561518857565b606460405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152fd5b9192901561522d57508151156151e0575090565b3b156151e95790565b606460405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b8251909150156152405750805190602001fd5b6104f19060405191829162461bcd60e51b83526020600484015260248301906129c4565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361529657565b60046040517fa1c0d6e5000000000000000000000000000000000000000000000000000000008152fd5b916001600160a01b03604051927fa9059cbb000000000000000000000000000000000000000000000000000000006020850152166024830152604482015260448152608081019181831067ffffffffffffffff841117611fe05761507692604052615078565b612c4590615333816146a5565b90600052600b60205260026040600020015460801c90613324565b91908110156134fb5760051b0190565b6153826000805160206157e68339815191529360209361537c615264565b8361538b565b604051908152a1565b90615395826132ed565b61560a576153b982600052600b6020526001600160a01b0360406000205416331490565b918215806155fa575b611f55576000928184526020600581526001600160a01b039360409185838820541693806155ee575b6155c9578582169586156155b9576001600160801b03808a16998a156155a25761541488615326565b8281168c116155735750926154c88b89946001898e7f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d978f9a61546a615493918c8552600b8b526002868620015460801c615622565b8b8452600b8a5260028585200190836001600160801b031983549260801b169116178155613282565b906154ae818a84015116928286818351169201511690613324565b161115615545575b888152600b87522001541696876152c0565b85518b8152a4813314158061553b575b6154e5575b505050505050565b813b15615537576084929185915196879586946313375c3b60e01b86526004860152336024860152604485015260648401525af1615528575b80808080806154dd565b61553190612b72565b3861551e565b8480fd5b50813b15156154d8565b888152600b8752818120838101600160a01b60ff60a01b1982541617905560ff60f01b1981541690556154b6565b865163287ecaef60e21b8152600481018a90526001600160801b03928316602482015291166044820152606490fd5b60248887519063d2aabcd960e01b82526004820152fd5b6004845163630d074f60e11b8152fd5b6064858784865192632dcbf6b960e11b84526004840152336024840152166044820152fd5b508386831614156153eb565b506156048161563d565b156153c2565b60248260405190634a5541ef60e01b82526004820152fd5b9190916001600160801b0380809416911601918211611b7657565b60009080825260056020526001600160a01b038060408420541692833314938415615682575b5050821561567057505090565b90915061567d3392612c48565b161490565b60ff9294509060409181526008602052818120338252602052205416913880615663565b9092916156b1613263565b936001600160801b03928381169182156157bd5767016345785d8a00008082116157865780851161574f57506156fb856156ec819386613a10565b16946020890195865284613a10565b169184615712604089019480865282875116615622565b1610156157395761572b84918261573495511690613324565b91511690613324565b168252565b634e487b7160e01b600052600160045260246000fd5b84604491604051917f4fea5c1a00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b60449250604051917f47152d6700000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b505050505090506040516157d081612b00565b6000815260006020820152600060408201529056fef8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7a164736f6c6343000815000a"; + hex"60c0346200046e57601f62005ca638819003918201601f19168301916001600160401b038311848410176200032b578084926080946040528339810103126200046e5780516001600160a01b038082169290918390036200046e5760208101518281168091036200046e5760408201519183831683036200046e5760600151936200008962000473565b90601d82527f5361626c696572205632204c6f636b75702044796e616d6963204e46540000006020830152620000be62000473565b601181527029a0a116ab1916a627a1a5aaa816a22ca760791b602082015230608052600080546001600160a01b03199081168417825560018054909116909517909455927fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a38051906001600160401b0382116200032b5760035490600182811c9216801562000463575b60208310146200044d5781601f849311620003d8575b50602090601f83116001146200034d5760009262000341575b50508160011b916000199060031b1c1916176003555b80516001600160401b0381116200032b576004918254600181811c9116801562000320575b60208210146200030b579081601f849311620002b3575b50602090601f831160011462000248576000926200023c575b50508160011b916000199060031b1c19161790555b1660018060a01b0319600a541617600a5560a052600160095560405161581290816200049482396080518161439b015260a05181818161120e01526139930152f35b015190503880620001e5565b6000858152602081209350601f198516905b8181106200029a575090846001959493921062000280575b505050811b019055620001fa565b015160001960f88460031b161c1916905538808062000272565b929360206001819287860151815501950193016200025a565b909150836000526020600020601f840160051c8101916020851062000300575b90601f859493920160051c01905b818110620002f05750620001cc565b60008155849350600101620002e1565b9091508190620002d3565b602284634e487b7160e01b6000525260246000fd5b90607f1690620001b5565b634e487b7160e01b600052604160045260246000fd5b0151905038806200017a565b600360009081527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b9350601f198516905b818110620003bf5750908460019594939210620003a5575b505050811b0160035562000190565b015160001960f88460031b161c1916905538808062000396565b929360206001819287860151815501950193016200037e565b60036000529091507fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f840160051c8101916020851062000442575b90601f859493920160051c01905b81811062000432575062000161565b6000815584935060010162000423565b909150819062000415565b634e487b7160e01b600052602260045260246000fd5b91607f16916200014b565b600080fd5b60408051919082016001600160401b038111838210176200032b5760405256fe608080604052600436101561001357600080fd5b60003560e01c90816301ffc9a7146128d25750806306fdde031461280f578063081812fc146127f1578063095ea7b31461265d5780631400ecec146125b8578063168444561461233d5780631c1cdd4c146122d75780631e99d569146122b957806323b872dd1461229057806339a73c031461224d57806340e58ee514612014578063425d30dd14611ff657806342842e0e14611fa657806342966c6814611e285780634857501f14611db25780634869e12d14611d765780635fe3b56714611d4f5780636352211e14611d205780636d0cee7514611cc857806370a0823114611c1e57806375829def14611b8c5780637cad6cd114611aba5780637de6b1db146118ce5780638659c270146115f0578063894e9a0d146113835780638bad38dd146113075780638f69b993146112845780639067b677146112315780639188ec84146111f657806395d89b41146110e8578063a22cb46514611017578063a2ffb89714610f1e578063a6202bf214610e1e578063a80fc07114610dc9578063ad35efd414610d66578063b256456914610d48578063b637b86514610ce8578063b88d4fde14610c5f578063b8a3be6614610c28578063b971302a14610bd6578063bc063e1a14610bb3578063bc2be1be14610b60578063c156a11d14610aac578063c33cd35e14610997578063c87b56dd14610864578063cc364f48146107ca578063d4dbd20b14610775578063d511609f14610726578063d975dfed146106d9578063e985e9c514610682578063ea5ead1914610652578063eac8f5b8146105e6578063f590c176146105be578063f851a440146105975763fdd46d601461027c57600080fd5b34610480576060366003190112610480576004356102986129ff565b604435916001600160801b039182841693848103610480576102b8614391565b6102c1836132ed565b61057f576102e583600052600b6020526001600160a01b0360406000205416331490565b9182158061056f575b6105505783600052602094600586526001600160a01b039081604060002054169480610544575b61051e5781831693841561050d5788156104f55761033287614453565b8281168a116104c1575091889161038e6103626103cb958a600052600b8c5260026040600020015460801c61474f565b89600052600b8b52600260406000200190836001600160801b031983549260801b169116178155613282565b906103aa818b8401511692826040818351169201511690613324565b16111561048f575b86600052600b88526001604060002001541692836143ed565b81847f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d876040518a8152a48133141580610485575b61041f575b6000805160206157e68339815191528484604051908152a1005b813b15610480576000805160206157e68339815191529460846000928360405195869485936313375c3b60e01b8552896004860152336024860152604485015260648401525af1610471575b80610405565b61047a90612b72565b3861046b565b600080fd5b50813b1515610400565b86600052600b8852604060002060018101600160a01b60ff60a01b1982541617905560ff60f01b1981541690556103b2565b60405163287ecaef60e21b8152600481018990526001600160801b03928316602482015291166044820152606490fd5b0390fd5b6024876040519063d2aabcd960e01b82526004820152fd5b600460405163630d074f60e11b8152fd5b606486838560405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b50848284161415610315565b60405163216caf0d60e01b815260048101859052336024820152604490fd5b506105798461476a565b156102ee565b60248360405190634a5541ef60e01b82526004820152fd5b346104805760003660031901126104805760206001600160a01b0360005416604051908152f35b346104805760203660031901126104805760206105dc60043561333d565b6040519015158152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260206001600160a01b0360016040600020015416604051908152f35b6024906040519062b8e7e760e51b82526004820152fd5b34610480576040366003190112610480576106806004356106716129ff565b61067a82614453565b9161448b565b005b346104805760403660031901126104805761069b6129e9565b6106a36129ff565b906001600160a01b03809116600052600860205260406000209116600052602052602060ff604060002054166040519015158152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57610715602091614453565b6001600160801b0360405191168152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b602052602060026040600020015460801c604051908152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260206001600160801b0360036040600020015416604051908152f35b3461048057602036600319011261048057600435600060206040516107ee81612b39565b828152015280600052600b60205260ff60016040600020015460a81c161561063b57600052600b6020526040806000205464ffffffffff82519161083183612b39565b818160a01c16835260c81c166020820152610862825180926020908164ffffffffff91828151168552015116910152565bf35b346104805760208060031936011261048057600435906108a261089d8360005260056020526001600160a01b0360406000205416151590565b612bd8565b60006001600160a01b03600a5416926044604051809581937fe9dc637500000000000000000000000000000000000000000000000000000000835230600484015260248301525afa91821561098b57600092610912575b5061090e6040519282849384528301906129c4565b0390f35b9091503d806000833e6109258183612b86565b81019082818303126104805780519067ffffffffffffffff8211610480570181601f8201121561048057805161095a81612ba8565b926109686040519485612b86565b81845284828401011161048057610984918480850191016129a1565b90826108f9565b6040513d6000823e3d90fd5b3461048057600319602036820112610480576004359067ffffffffffffffff9081831161048057610140908336030112610480576109d3614391565b604051916109e083612b1c565b6109ec81600401612a15565b83526109fa6024820161336e565b6020840152610a0b60448201612af3565b6040840152610a1c60648201612af3565b6060840152610a2d60848201612a15565b6080840152610a3e60a48201612bc4565b60a0840152610a4f60c48201612a15565b60c0840152610a613660e48301613454565b60e084015261012481013591821161048057013660238201121561048057602091610a99610aa4923690602460048201359101613380565b6101008201526138e5565b604051908152f35b3461048057604036600319011261048057600435610ac86129ff565b90610ad1614391565b80600052600b60205260ff60016040600020015460a81c161561063b578060005260056020526001600160a01b036040600020541691823303610b415761068092610b1b83614453565b6001600160801b038116610b30575b50612e6b565b610b3b90828561448b565b84610b2a565b60405163216caf0d60e01b815260048101839052336024820152604490fd5b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b602052602064ffffffffff60406000205460a01c16604051908152f35b3461048057600036600319011261048057602060405167016345785d8a00008152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260206001600160a01b0360406000205416604051908152f35b3461048057602036600319011261048057600435600052600b602052602060ff60016040600020015460a81c166040519015158152f35b3461048057608036600319011261048057610c786129e9565b610c806129ff565b6064359167ffffffffffffffff8311610480573660238401121561048057826004013591610cad83612ba8565b92610cbb6040519485612b86565b80845236602482870101116104805760208160009260246106809801838801378501015260443591612cf6565b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205261090e610d3460046040600020016131d5565b604051918291602083526020830190612a8f565b346104805760203660031901126104805760206105dc6004356132b6565b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57610da0906137e3565b6040516005821015610db3576020918152f35b634e487b7160e01b600052602160045260246000fd5b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260206001600160801b0360026040600020015416604051908152f35b3461048057602036600319011261048057610e376129e9565b6001600160a01b038060005416338103610ef557508116908160005260026020526001600160801b0360406000205416908115610ec45781610e969184600052600260205260406000206001600160801b0319815416905533906143ed565b6040519081527fca7a4a65a94ed2f37538814e00e1cd4c41a78261561e3f3794592f11409cf5af60203392a3005b602483604051907f8410168c0000000000000000000000000000000000000000000000000000000082526004820152fd5b6040516331b339a960e21b81526001600160a01b03919091166004820152336024820152604490fd5b346104805760603660031901126104805767ffffffffffffffff60043581811161048057610f50903690600401612a5e565b610f586129ff565b9260443590811161048057610f71903690600401612a5e565b9190610f7b614391565b828203610fe05760005b828110610f8e57005b806000805160206157e68339815191526020610fad600194878a61447b565b35610fd3610fc4610fbf868b8a61447b565b613440565b610fcc614391565b8b836144b8565b604051908152a101610f85565b50604491604051917faec9344000000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b34610480576040366003190112610480576110306129e9565b60243590811515809203610480576001600160a01b0316908133146110a457336000526008602052604060002082600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a3005b606460405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152fd5b3461048057600036600319011261048057604051600060045490600182811c918184169182156111ec575b60209485851084146111d65785879486865291826000146111b6575050600114611159575b5061114592500383612b86565b61090e6040519282849384528301906129c4565b84915060046000527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b906000915b85831061119e575050611145935082010185611138565b80548389018501528794508693909201918101611187565b60ff19168582015261114595151560051b85010192508791506111389050565b634e487b7160e01b600052602260045260246000fd5b92607f1692611113565b346104805760003660031901126104805760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57600052600b602052602064ffffffffff60406000205460c81c16604051908152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b576112be906137e3565b600581101580610db357600282149081156112fa575b81156112e8575b6020826040519015158152f35b9050610db357600460209114826112db565b50506003811460006112d4565b34610480576020366003190112610480576004356001600160a01b0390818116809103610480578160005416338103610ef5575060015491816001600160a01b03198416176001556040519216825260208201527fdcb09aef4bf01068924ccce937981cbe59d25ba08380cf941aaaea4e4bd3960d60403392a2005b346104805760203660031901126104805760606101406040516113a581612b55565b60008152600060208201526000604082015260008382015260006080820152600060a0820152600060c0820152600060e082015260006101008201526113e9613263565b6101208201520152600435600052600b60205260ff60016040600020015460a81c16156115d857600435600052600b60205260406000206114cc60046040519261143284612b55565b80546001600160a01b038116855264ffffffffff8160a01c16602086015264ffffffffff8160c81c16604086015260ff8160f01c161515606086015260f81c1515608085015260ff60018201546001600160a01b03811660a0870152818160a01c16151560c0870152818160a81c16151560e087015260b01c1615156101008501526114c060028201613282565b610120850152016131d5565b6101408201526114dd6004356137e3565b906005821015610db357600261014092146115cc575b61090e604051928392602084526001600160a01b03815116602085015264ffffffffff602082015116604085015264ffffffffff60408201511660608501526060810151151560808501526080810151151560a08501526001600160a01b0360a08201511660c085015260c0810151151560e085015260e0810151151561010085015261010081015115156101208501526115b861012082015183860190604090816001600160801b0391828151168552826020820151166020860152015116910152565b01516101a0808401526101c0830190612a8f565b600060608201526114f3565b602460405162b8e7e760e51b81526004356004820152fd5b34610480576020806003193601126104805760043567ffffffffffffffff811161048057611622903690600401612a5e565b9061162b614391565b6000915b80831061163857005b61164383828461447b565b359261164d614391565b611656846132ed565b156116735760248460405190634a5541ef60e01b82526004820152fd5b61167f8492939461333d565b6118b6576116a382600052600b6020526001600160a01b0360406000205416331490565b15610b41576116b182613483565b82600052600b8087526116ca6002604060002001613282565b906001600160801b039283835116848216101561189e578560005281895260ff60406000205460f01c1615611886579061173882858b61172e7f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa509683895116613324565b9601511690613324565b9580600052818a526040600020938a855498600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8b16178755600388821697881561186c575b0197831697886001600160801b03198254161790556001600160a01b03809a16958691600584528b604060002054169687945260019b8c6040600020015416946117cb8b85886143ed565b604080518881526001600160801b0392831660208201529290911690820152606090a46000805160206157e68339815191528a604051838152a1813b611819575b505050505001919061162f565b813b15610480576000608492819560405197889687956372eba20360e01b875260048701526024860152604485015260648401525af161185d575b8080808061180c565b61186690612b72565b85611854565b60018101600160a01b60ff60a01b19825416179055611780565b602486604051906339c6dc7360e21b82526004820152fd5b602486604051906322cad1af60e11b82526004820152fd5b6024826040519063fe19f19f60e01b82526004820152fd5b346104805760208060031936011261048057600435906118ec614391565b81600052600b815260ff60016040600020015460a81c1615611aa357611911826137e3565b6005811015610db3576004810361193a5760248360405190634a5541ef60e01b82526004820152fd5b6003810361195a576024836040519063fe19f19f60e01b82526004820152fd5b600214611a8b5761198182600052600b6020526001600160a01b0360406000205416331490565b15610b415781600052600b815260ff60406000205460f01c1615611a735781600052600b8152604060002060ff60f01b19815416905560405191807f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f600080a2600582526001600160a01b036040600020541692833b611a16575b6000805160206157e68339815191528383604051908152a1005b833b1561048057600081602481836000805160206157e6833981519152987f341a0bd90000000000000000000000000000000000000000000000000000000083528760048401525af1156119fc57611a6d90612b72565b836119fc565b602482604051906339c6dc7360e21b82526004820152fd5b602482604051906322cad1af60e11b82526004820152fd5b6024826040519062b8e7e760e51b82526004820152fd5b34610480576020366003190112610480576004356001600160a01b0390818116809103610480578160005416338103610ef55750600a5491816001600160a01b0319841617600a556040519216825260208201527fa2548bd4b805e907c1558a47b5858324fe8bb4a2e1ddfca647eecbf65610eebc60403392a26009546000198101908111611b765760407f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c91815190600182526020820152a1005b634e487b7160e01b600052601160045260246000fd5b3461048057602036600319011261048057611ba56129e9565b6000546001600160a01b0380821692338403611bf7576001600160a01b03199350169182911617600055337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf80600080a3005b6040516331b339a960e21b81526001600160a01b0385166004820152336024820152604490fd5b34610480576020366003190112610480576001600160a01b03611c3f6129e9565b168015611c5e5760005260066020526020604060002054604051908152f35b608460405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e657200000000000000000000000000000000000000000000006064820152fd5b3461048057602036600319011261048057600435611cff61089d8260005260056020526001600160a01b0360406000205416151590565b600052600560205260206001600160a01b0360406000205416604051908152f35b34610480576020366003190112610480576020611d3e600435612c23565b6001600160a01b0360405191168152f35b346104805760003660031901126104805760206001600160a01b0360015416604051908152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b5761071560209161386a565b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b576000611dee826137e3565b6005811015610db357600203611e0c575b6020906040519015158152f35b50600052600b602052602060ff60406000205460f01c16611dff565b3461048057602036600319011261048057600435611e44614391565b611e4d816132ed565b15611f7557611e5b8161476a565b15611f5557611e6981612c23565b611e72826132b6565b159081611f4c575b81611f39575b50611f2157602081611ea06000805160206157e683398151915293612c23565b9080600052600783526001600160a01b036040600020926001600160a01b031993848154169055169182600052600684526040600020600019815401905581600052600584526040600020908154169055806000604051937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a48152a1005b60249060405190630da9b01360e01b82526004820152fd5b6001600160a01b03915016151582611e80565b60009150611e7a565b60405163216caf0d60e01b81526004810191909152336024820152604490fd5b602490604051907f817cd6390000000000000000000000000000000000000000000000000000000082526004820152fd5b3461048057611fb436612a29565b60405191602083019383851067ffffffffffffffff861117611fe0576106809460405260008452612cf6565b634e487b7160e01b600052604160045260246000fd5b346104805760203660031901126104805760206105dc6004356132ed565b34610480576020806003193601126104805760043590612032614391565b61203b826132ed565b156120585760248260405190634a5541ef60e01b82526004820152fd5b6120618261333d565b6118b65761208582600052600b6020526001600160a01b0360406000205416331490565b15610b415761209382613483565b9180600052600b82526120ac6002604060002001613282565b906001600160801b0393848351168582161015611a8b5781600052600b845260ff60406000205460f01c1615611a73578085856120ef6120f99483885116613324565b9501511690613324565b9080600052600b84526000805160206157e6833981519152604060002094855494600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff87161787556003888616978815612233575b0197811697886001600160801b03198254161790556001600160a01b038096169560058352867f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa508260406000205416978893600b875260016040600020015416946121bc8d85886143ed565b604080518a81526001600160801b0392831660208201529290911690820152606090a4604051838152a1813b6121ee57005b813b15610480576000608492819560405197889687956372eba20360e01b875260048701526024860152604485015260648401525af161222a57005b61068090612b72565b60018101600160a01b60ff60a01b19825416179055612150565b34610480576020366003190112610480576001600160a01b0361226e6129e9565b16600052600260205260206001600160801b0360406000205416604051908152f35b34610480576106806122a136612a29565b916122b46122af8433612d8c565b612c85565b612e6b565b34610480576000366003190112610480576020600954604051908152f35b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b57612311906137e3565b6005811015610db3578060209115908115612332575b506040519015158152f35b600191501482612327565b346104805760206003198181360112610480576004359067ffffffffffffffff9081831161048057610120833603918201126104805761237b614391565b6101048301359060221901811215610480578201600481013590828211610480576024016060820236038113610480576123b6913691613380565b918251906123c3826131bd565b916123d16040519384612b86565b808352601f196123e0826131bd565b018660005b8281106125a25750505064ffffffffff90814216946001600160801b03968761240d826134ee565b515116828a61241b846134ee565b510151168580604061242c866134ee565b510151168a0116906040519261244184612b00565b83528b8301526040820152612455876134ee565b5261245f866134ee565b5060019386855b8a8c87831061252157908b846001600160a01b038c60a48101358281169081900361048057610aa4956124e195612511946124a36024860161341f565b6124af6044870161341f565b6124bb6064880161342c565b916124c88860040161342c565b94846124d660848b01613440565b966040519d8e612b1c565b168c528d8c0152151560408b0152151560608a01521660808801521660a086015260c085015260c4369101613454565b60e08301526101008201526138e5565b8893858060406125558b866125458a8e9a61253c828d613511565b5151169a613511565b5101511694600019890190613511565b51015116816040612566888c613511565b510151160116916040519361257a85612b00565b8452830152604082015261258e828b613511565b52612599818a613511565b50018790612466565b6125aa613263565b8282880101520187906123e5565b346104805760203660031901126104805760043580600052600b60205260ff60016040600020015460a81c161561063b5760209060009080600052600b8352604060002060ff815460f01c168061264b575b612622575b50506001600160801b0360405191168152f35b61264492506001600160801b03600261263e9201541691613483565b90613324565b828061260f565b5060ff600182015460a01c161561260a565b34610480576040366003190112610480576126766129e9565b602435906001600160a01b03808061268d85612c23565b1692169180831461278757803314908115612762575b50156126f8578260005260076020526040600020826001600160a01b03198254161790556126d083612c23565b167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b608460405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152fd5b9050600052600860205260406000203360005260205260ff60406000205416846126a3565b608460405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152fd5b34610480576020366003190112610480576020611d3e600435612c48565b3461048057600036600319011261048057604051600060035490600182811c918184169182156128c8575b60209485851084146111d65785879486865291826000146111b657505060011461286b575061114592500383612b86565b84915060036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b906000915b8583106128b0575050611145935082010185611138565b80548389018501528794508693909201918101612899565b92607f169261283a565b3461048057602036600319011261048057600435907fffffffff00000000000000000000000000000000000000000000000000000000821680920361048057817f80ac58cd0000000000000000000000000000000000000000000000000000000060209314908115612977575b811561294d575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501483612946565b7f5b5e139f000000000000000000000000000000000000000000000000000000008114915061293f565b60005b8381106129b45750506000910152565b81810151838201526020016129a4565b906020916129dd815180928185528580860191016129a1565b601f01601f1916010190565b600435906001600160a01b038216820361048057565b602435906001600160a01b038216820361048057565b35906001600160a01b038216820361048057565b6060906003190112610480576001600160a01b0390600435828116810361048057916024359081168103610480579060443590565b9181601f840112156104805782359167ffffffffffffffff8311610480576020808501948460051b01011161048057565b90815180825260208080930193019160005b828110612aaf575050505090565b835180516001600160801b031686528083015167ffffffffffffffff168684015260409081015164ffffffffff169086015260609094019392810192600101612aa1565b3590811515820361048057565b6060810190811067ffffffffffffffff821117611fe057604052565b610120810190811067ffffffffffffffff821117611fe057604052565b6040810190811067ffffffffffffffff821117611fe057604052565b610160810190811067ffffffffffffffff821117611fe057604052565b67ffffffffffffffff8111611fe057604052565b90601f8019910116810190811067ffffffffffffffff821117611fe057604052565b67ffffffffffffffff8111611fe057601f01601f191660200190565b35906001600160801b038216820361048057565b15612bdf57565b606460405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152fd5b60005260056020526001600160a01b0360406000205416612c45811515612bd8565b90565b612c6b61089d8260005260056020526001600160a01b0360406000205416151590565b60005260076020526001600160a01b036040600020541690565b15612c8c57565b608460405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f766564000000000000000000000000000000000000006064820152fd5b90612d1a939291612d0a6122af8433612d8c565b612d15838383612e6b565b613024565b15612d2157565b60405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b906001600160a01b038080612da084612c23565b16931691838314938415612dd3575b508315612dbd575b50505090565b612dc991929350612c48565b1614388080612db7565b909350600052600860205260406000208260005260205260ff604060002054169238612daf565b15612e0157565b608460405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152fd5b90612e949291612e7a83612c23565b916001600160a01b03948593848094169687911614612dfa565b1690811580612f8b57612ea6846132b6565b159081612f82575b5080612f79575b612f615791808492612ee36000805160206157e683398151915296602096612edc85612c23565b1614612dfa565b60009382855260078652604085206001600160a01b031990818154169055818652600687526040862060001981540190558286526040862060018154019055838652600587528260408720918254161790557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6040519580a48152a1565b60248360405190630da9b01360e01b82526004820152fd5b50831515612eb5565b90501538612eae565b608460405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152fd5b3d1561301f573d9061300582612ba8565b916130136040519384612b86565b82523d6000602084013e565b606090565b9290803b156131b45761308e916020916001600160a01b0394604051809581948293897f150b7a02000000000000000000000000000000000000000000000000000000009b8c865233600487015216602485015260448401526080606484015260848301906129c4565b03916000968791165af19082908261314d575b5050613127576130af612ff4565b805190816131225760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000161490565b909192506020813d82116131ac575b8161316960209383612b86565b810103126131a85751907fffffffff00000000000000000000000000000000000000000000000000000000821682036131a557509038806130a1565b80fd5b5080fd5b3d915061315c565b50505050600190565b67ffffffffffffffff8111611fe05760051b60200190565b9081546131e1816131bd565b926040936131f185519182612b86565b828152809460208092019260005281600020906000935b85851061321757505050505050565b6001848192845161322781612b00565b64ffffffffff87546001600160801b038116835267ffffffffffffffff8160801c168584015260c01c1686820152815201930194019391613208565b6040519061327082612b00565b60006040838281528260208201520152565b9060405161328f81612b00565b6040819360018154916001600160801b0392838116865260801c6020860152015416910152565b80600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260ff60016040600020015460b01c1690565b80600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260ff60016040600020015460a01c1690565b6001600160801b039182169082160391908211611b7657565b80600052600b60205260ff60016040600020015460a81c161561063b57600052600b60205260406000205460f81c90565b359064ffffffffff8216820361048057565b92919261338c826131bd565b60409461339b86519283612b86565b8195848352602080930191606080960285019481861161048057925b8584106133c75750505050505050565b8684830312610480578251906133dc82612b00565b6133e585612bc4565b8252858501359067ffffffffffffffff8216820361048057828792838b95015261341086880161336e565b868201528152019301926133b7565b3580151581036104805790565b356001600160a01b03811681036104805790565b356001600160801b03811681036104805790565b91908260409103126104805760405161346c81612b39565b602080829461347a81612a15565b84520135910152565b64ffffffffff80421682600052600b602052604060002091825482828260a01c1610156134e45760c81c1611156134d25760040154600110156134c957612c4590613525565b612c4590613714565b6001600160801b039150600201541690565b5050505050600090565b8051156134fb5760200190565b634e487b7160e01b600052603260045260246000fd5b80518210156134fb5760209160051b010190565b64ffffffffff90814216906000908152600b60205260409081812082519361354c85612b55565b8154956001600160a01b039182881687526020870197828160a01c168952828160c81c168789015260ff8160f01c161515606089015260f81c1515608088015260ff6001938486015490811660a08a0152818160a01c16151560c08a0152818160a81c16151560e08a015260b01c1615156101008801526101406135e660046135d760028801613282565b966101208b01978852016131d5565b97019187835280876135f8889a6134ee565b5101511693828288965b16106136dc57509161368c6136919284888161369698976001600160801b039e8f61362e8b8a51613511565b5151169d8a8f9b602061364b67ffffffffffffffff928d51613511565b5101511699848361365d848451613511565b51015116965081156136d05761367b92935051906000190190613511565b5101511680925b03169203166149e6565b614bc6565b614ad8565b9283136136af5750506136a983916149aa565b16011690565b5160200151929392831692841683101591506136cb9050575090565b905090565b50505051168092613682565b8094986001600160801b0390816136f48c8851613511565b51511601169801938282808a61370b898951613511565b51015116613602565b64ffffffffff613749600091838352600b60205280806040852054818160a01c1693849160c81c1603169181421603166149e6565b91808252600b602052600460408320018054156137cf5790829167ffffffffffffffff93526137a16020832054828452600b6020526136916001600160801b03968760026040882001541696879360801c1690614bc6565b9283136137b75750506137b3906149aa565b1690565b60029350604092508152600b60205220015460801c90565b602483634e487b7160e01b81526032600452fd5b80600052600b602052604060002060ff600182015460a01c1660001461380a575050600490565b805460f81c613863575460a01c64ffffffffff16421061385d5761382d81613483565b90600052600b6020526001600160801b03806002604060002001541691161060001461385857600190565b600290565b50600090565b5050600390565b80600052600b6020526138836002604060002001613282565b81600052600b602052604060002060ff600182015460a01c166000146138b657506001600160801b039150602001511690565b5460f81c6138c85750612c4590613483565b612c4591506001600160801b036040818351169201511690613324565b906001600160a01b036001541660206001600160a01b0360c0850151166024604051809481937fdcf844a700000000000000000000000000000000000000000000000000000000835260048301525afa801561098b57600090614198575b61396691506001600160801b0360a08501511690602060e08601510151916147d3565b6001600160801b0381511661010084015164ffffffffff602086015116821561416e5781518015614144577f00000000000000000000000000000000000000000000000000000000000000008111614113575064ffffffffff60406139ca846134ee565b510151168110156140bc5750600090819082815184905b808210614029575050505064ffffffffff421664ffffffffff8216811015613fe95750506001600160801b0316808203613fb25750506009549283600052600b6020526040600020916001600160801b0381511660028401906001600160801b03198254161790556001600160a01b0360c083015116600184015490750100000000000000000000000000000000000000000060408501511515928654927fffffffffffffffffff0000ff000000000000000000000000000000000000000076ff000000000000000000000000000000000000000000006060890151151560b01b16921617171760018601556001600160a01b0384511691610100850151926040613af3855195600019870190613511565b510151927fff000000000000000000000000000000000000000000000000000000000000007eff0000000000000000000000000000000000000000000000000000000000007dffffffffff0000000000000000000000000000000000000000000000000078ffffffffff000000000000000000000000000000000000000060208b015160a01b169660c81b169460f01b16911617171717845560005b818110613ee2575050600185016009556001600160a01b0360c08301511660005260026020526001600160801b0380604060002054168160208401511601166001600160a01b0360c0840151166000526040600020906001600160801b03198254161790556001600160a01b036080830151168015613e9e57613c31613c2b8760005260056020526001600160a01b0360406000205416151590565b15614346565b613c3a866132b6565b1580613e95575b80613e8d575b613e755760206000805160206157e683398151915291613c80613c2b8960005260056020526001600160a01b0360406000205416151590565b806000526006825260406000206001815401905587600052600582526040600020816001600160a01b0319825416179055876040519160007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4878152a1613d106001600160a01b0360c0840151166001600160801b038084511681602086015116011690309033906141cc565b6001600160801b0360408201511680613e46575b507fef3d668acee46576ad5d407c42ab4d0cde13f3cd70b28f09a0fb9e3bf5bf09cb613e036001600160a01b03845116926001600160a01b03608086015116946001600160a01b0360c08201511696613e3b613e1b60408401511515928c606086015115156001600160a01b0360e061010089015194549864ffffffffff6040519a613daf8c612b39565b818160a01c168c5260c81c1660208b01520151511695604051998a99610160948b523360208c015260408b0190604090816001600160801b0391828151168552826020820151166020860152015116910152565b60a089015260c08801528060e0880152860190612a8f565b926101008501906020908164ffffffffff91828151168552015116910152565b6101408301520390a4565b613e6f906001600160a01b0360c0850151166001600160a01b0360e086015151169033906141cc565b38613d24565b60248660405190630da9b01360e01b82526004820152fd5b506000613c47565b50801515613c41565b606460405162461bcd60e51b815260206004820152602060248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152fd5b613ef181610100860151613511565b519060048601549168010000000000000000831015611fe057600183018060048901558310156134fb5760019260048801600052602060002001906001600160801b03815116908254917fffffff00000000000000000000000000000000000000000000000000000000007cffffffffff000000000000000000000000000000000000000000000000604077ffffffffffffffff00000000000000000000000000000000602086015160801b1694015160c01b169316171717905501613b8f565b60449250604051917fd90b7e3900000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b6040517f210aec0e00000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b919350919361404d906001600160801b036140448588613511565b5151169061474f565b9364ffffffffff8060406140618685613511565b5101511694168085111561407f5750600184930191929190926139e1565b8385606492604051927f7b0bada8000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b64ffffffffff60406140cd846134ee565b5101516040517fb4c9e52c00000000000000000000000000000000000000000000000000000000815264ffffffffff938416600482015291169091166024820152604490fd5b602490604051907f4757689b0000000000000000000000000000000000000000000000000000000082526004820152fd5b60046040517f3952c64e000000000000000000000000000000000000000000000000000000008152fd5b60046040517f6095d3bc000000000000000000000000000000000000000000000000000000008152fd5b6020823d6020116141c4575b816141b160209383612b86565b810103126131a557506139669051613943565b3d91506141a4565b9290604051927f23b872dd0000000000000000000000000000000000000000000000000000000060208501526001600160a01b03809216602485015216604483015260648201526064815260a081019181831067ffffffffffffffff841117611fe05761423b9260405261423d565b565b6001600160a01b03169061429d60405161425681612b39565b6020938482527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564858301526000808587829751910182855af1614297612ff4565b91614912565b805191821591848315614322575b5050509050156142b85750565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b9193818094500103126131a8578201519081151582036131a55750803880846142ab565b1561434d57565b606460405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152fd5b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036143c357565b60046040517fa1c0d6e5000000000000000000000000000000000000000000000000000000008152fd5b916001600160a01b03604051927fa9059cbb000000000000000000000000000000000000000000000000000000006020850152166024830152604482015260448152608081019181831067ffffffffffffffff841117611fe05761423b9260405261423d565b612c45906144608161386a565b90600052600b60205260026040600020015460801c90613324565b91908110156134fb5760051b0190565b6144af6000805160206157e6833981519152936020936144a9614391565b836144b8565b604051908152a1565b906144c2826132ed565b614737576144e682600052600b6020526001600160a01b0360406000205416331490565b91821580614727575b611f55576000928184526020600581526001600160a01b0393604091858388205416938061471b575b6146f6578582169586156146e6576001600160801b03808a16998a156146cf5761454188614453565b8281168c116146a05750926145f58b89946001898e7f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d978f9a6145976145c0918c8552600b8b526002868620015460801c61474f565b8b8452600b8a5260028585200190836001600160801b031983549260801b169116178155613282565b906145db818a84015116928286818351169201511690613324565b161115614672575b888152600b87522001541696876143ed565b85518b8152a48133141580614668575b614612575b505050505050565b813b15614664576084929185915196879586946313375c3b60e01b86526004860152336024860152604485015260648401525af1614655575b808080808061460a565b61465e90612b72565b3861464b565b8480fd5b50813b1515614605565b888152600b8752818120838101600160a01b60ff60a01b1982541617905560ff60f01b1981541690556145e3565b865163287ecaef60e21b8152600481018a90526001600160801b03928316602482015291166044820152606490fd5b60248887519063d2aabcd960e01b82526004820152fd5b6004845163630d074f60e11b8152fd5b6064858784865192632dcbf6b960e11b84526004840152336024840152166044820152fd5b50838683161415614518565b506147318161476a565b156144ef565b60248260405190634a5541ef60e01b82526004820152fd5b9190916001600160801b0380809416911601918211611b7657565b60009080825260056020526001600160a01b0380604084205416928333149384156147af575b5050821561479d57505090565b9091506147aa3392612c48565b161490565b60ff9294509060409181526008602052818120338252602052205416913880614790565b9092916147de613263565b936001600160801b03928381169182156148ea5767016345785d8a00008082116148b35780851161487c575061482885614819819386615736565b16946020890195865284615736565b16918461483f60408901948086528287511661474f565b1610156148665761485884918261486195511690613324565b91511690613324565b168252565b634e487b7160e01b600052600160045260246000fd5b84604491604051917f4fea5c1a00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b60449250604051917f47152d6700000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b505050505090506040516148fd81612b00565b60008152600060208201526000604082015290565b919290156149735750815115614926575090565b3b1561492f5790565b606460405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b8251909150156149865750805190602001fd5b6104f19060405191829162461bcd60e51b83526020600484015260248301906129c4565b600081126149b55790565b602490604051907f2463f3d50000000000000000000000000000000000000000000000000000000082526004820152fd5b90600160ff1b808314908115614ace575b50614aa4576000821215614a9b57614a20826000035b6000831215614a9457826000039061566c565b917f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311614a5e5760009160001991181315614a5a575090565b0390565b604491604051917fd49c26b300000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b829061566c565b614a2082614a0d565b60046040517f9fe2b450000000000000000000000000000000000000000000000000000000008152fd5b90508114386149f7565b90600160ff1b808314908115614bbc575b50614b92576000821215614b8957614b12826000035b6000831215614b82578260000390615736565b917f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311614b4c5760009160001991181315614a5a575090565b604491604051917f120b5b4300000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b8290615736565b614b1282614aff565b60046040517fa6070c25000000000000000000000000000000000000000000000000000000008152fd5b9050811438614ae9565b80614be05750600090612c455750670de0b6b3a764000090565b90670de0b6b3a7640000808314614c2d575080614c05575050670de0b6b3a764000090565b670de0b6b3a76400008114614c2957614c2490613691612c4593615517565b614c63565b5090565b91505090565b8015614c4d576ec097ce7bc90715b34b9f10000000000590565b634e487b7160e01b600052601260045260246000fd5b6000811215614c925768033dd1780914b9711419811261385d57614c8990600003614c63565b612c4590614c33565b680a688906bd8affffff81136154e657670de0b6b3a764000080604092831b05907780000000000000000000000000000000000000000000000067ff0000000000000083166153c9575b66ff00000000000083166152c1575b65ff000000000083166151c1575b64ff0000000083166150c9575b63ff0000008316614fd9575b62ff00008316614ef1575b61ff008316614e11575b60ff8316614d3a575b02911c60bf031c90565b60808316614dff575b838316614ded575b60208316614ddb575b60108316614dc9575b60088316614db7575b60048316614da5575b60028316614d93575b6001831615614d30576801000000000000000102831c614d30565b6801000000000000000102831c614d78565b6801000000000000000302831c614d6f565b6801000000000000000602831c614d66565b6801000000000000000b02831c614d5d565b6801000000000000001602831c614d54565b6801000000000000002c02831c614d4b565b6801000000000000005902831c614d43565b6180008316614edf575b6140008316614ecd575b6120008316614ebb575b6110008316614ea9575b6108008316614e97575b6104008316614e85575b6102008316614e73575b610100831615614d2757680100000000000000b102831c614d27565b6801000000000000016302831c614e57565b680100000000000002c602831c614e4d565b6801000000000000058c02831c614e43565b68010000000000000b1702831c614e39565b6801000000000000162e02831c614e2f565b68010000000000002c5d02831c614e25565b680100000000000058b902831c614e1b565b628000008316614fc7575b624000008316614fb5575b622000008316614fa3575b621000008316614f91575b620800008316614f7f575b620400008316614f6d575b620200008316614f5b575b62010000831615614d1d576801000000000000b17202831c614d1d565b680100000000000162e402831c614f3e565b6801000000000002c5c802831c614f33565b68010000000000058b9102831c614f28565b680100000000000b172102831c614f1d565b68010000000000162e4302831c614f12565b680100000000002c5c8602831c614f07565b6801000000000058b90c02831c614efc565b638000000083166150b7575b634000000083166150a5575b63200000008316615093575b63100000008316615081575b6308000000831661506f575b6304000000831661505d575b6302000000831661504b575b6301000000831615614d125768010000000000b1721802831c614d12565b6801000000000162e43002831c61502d565b68010000000002c5c86002831c615021565b680100000000058b90c002831c615015565b6801000000000b17217f02831c615009565b680100000000162e42ff02831c614ffd565b6801000000002c5c85fe02831c614ff1565b68010000000058b90bfc02831c614fe5565b64800000000083166151af575b644000000000831661519d575b642000000000831661518b575b6410000000008316615179575b6408000000008316615167575b6404000000008316615155575b6402000000008316615143575b640100000000831615614d0657680100000000b17217f802831c614d06565b68010000000162e42ff102831c615124565b680100000002c5c85fe302831c615117565b6801000000058b90bfce02831c61510a565b68010000000b17217fbb02831c6150fd565b6801000000162e42fff002831c6150f0565b68010000002c5c8601cc02831c6150e3565b680100000058b90c0b4902831c6150d6565b6580000000000083166152af575b65400000000000831661529d575b65200000000000831661528b575b651000000000008316615279575b650800000000008316615267575b650400000000008316615255575b650200000000008316615243575b65010000000000831615614cf9576801000000b17218355102831c614cf9565b680100000162e430e5a202831c615223565b6801000002c5c863b73f02831c615215565b68010000058b90cf1e6e02831c615207565b680100000b1721bcfc9a02831c6151f9565b68010000162e43f4f83102831c6151eb565b680100002c5c89d5ec6d02831c6151dd565b6801000058b91b5bc9ae02831c6151cf565b668000000000000083166153b7575b664000000000000083166153a5575b66200000000000008316615393575b66100000000000008316615381575b6608000000000000831661536f575b6604000000000000831661535d575b6602000000000000831661534b575b6601000000000000831615614ceb5768010000b17255775c0402831c614ceb565b6801000162e525ee054702831c61532a565b68010002c5cc37da949202831c61531b565b680100058ba01fb9f96d02831c61530c565b6801000b175effdc76ba02831c6152fd565b680100162f3904051fa102831c6152ee565b6801002c605e2e8cec5002831c6152df565b68010058c86da1c09ea202831c6152d0565b67800000000000000083166154c7575b67400000000000000083166154b5575b67200000000000000083166154a3575b6710000000000000008316615491575b670800000000000000831661547f575b670400000000000000831661546d575b670200000000000000831661545b575b670100000000000000831615614cdc57680100b1afa5abcbed6102831c614cdc565b68010163da9fb33356d802831c615439565b680102c9a3e778060ee702831c615429565b6801059b0d31585743ae02831c615419565b68010b5586cf9890f62a02831c615409565b6801172b83c7d517adce02831c6153f9565b6801306fe0a31b7152df02831c6153e9565b5077b504f333f9de6484800000000000000000000000000000006153d9565b602490604051907f0360d0280000000000000000000000000000000000000000000000000000000082526004820152fd5b8060008083131561563b57670de0b6b3a76400009283811261560457506001925b808305906001600160801b03821160071b91821c9167ffffffffffffffff831160061b92831c63ffffffff811160051b90811c61ffff811160041b90811c60ff811160031b90811c91600f831160021b92831c936001978860038711811b96871c11961717171717171781810294811d908282146155f857506706f05b59d3b20000905b8482136155cc5750505050500290565b808391020590671bc16d674ec800008212156155eb575b831d906155bc565b8091950194831d906155e3565b93505093925050020290565b6000199392508015615627576ec097ce7bc90715b34b9f10000000000591615538565b602482634e487b7160e01b81526012600452fd5b602483604051907f059b101b0000000000000000000000000000000000000000000000000000000082526004820152fd5b670de0b6b3a764000091600019838309928083029283808610950394808603951461572857828510156156ec57908291096001821901821680920460028082600302188083028203028083028203028083028203028083028203028083028203028092029003029360018380600003040190848311900302920304170290565b82606492604051927f63a05778000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b505080925015614c4d570490565b909190600019838209838202918280831092039180830392146157d457670de0b6b3a7640000908183101561579d57947faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066994950990828211900360ee1b910360121c170290565b60449086604051917f5173648d00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050670de0b6b3a76400009004915056fef8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7a164736f6c6343000815000a"; bytes public constant BYTECODE_LOCKUP_LINEAR = - hex"60a034620003e757601f196001600160401b03601f62004c523881900382810185168601919084831187841017620003ec57808792606094604052833981010312620003e75783516001600160a01b03928382169291839003620003e7576020918287015196858816809803620003e75760400151948516809503620003e7576200008962000402565b90601c82527f5361626c696572205632204c6f636b7570204c696e656172204e46540000000084830152620000bd62000402565b601181527029a0a116ab1916a627a1a5aaa816a624a760791b8582015230608052600080546001600160a01b031990811688178255600180548216909b178b5596817fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a38351858111620003d35760039485548c81811c91168015620003c8575b89821014620003b45790818684931162000361575b508890868311600114620002f8578492620002ec575b505060001982871b1c1916908b1b1784555b8151948511620002d8576004958654998b8b811c9b168015620002cd575b828c1014620002ba57848b1162000271575b869798999a50819487116001146200020a57505093620001fe575b505082871b92600019911b1c19161790555b600a541617600a5560095560405161482f9081620004238239608051816145590152f35b015191503880620001c8565b8883528183208c9890969594939116915b8282106200025757505085116200023c575b50505050811b019055620001da565b01519060f884600019921b161c19169055388080806200022d565b8484015187558c989096019593840193908101906200021b565b87835281832085880160051c81019b838910620002af575b860160051c019a8c905b8c8110620002a3575050620001ad565b848155018c9062000293565b909b508b9062000289565b634e487b7160e01b835260228852602483fd5b9a607f169a6200019b565b634e487b7160e01b81526041600452602490fd5b0151905038806200016b565b908c8e9416918886528a862092865b8c82821062000341575050841162000328575b505050811b0184556200017d565b015160001983891b60f8161c191690553880806200031a565b91929395968291958786015181550195019301908f959493929162000307565b9091508684528884208680850160051c8201928b8610620003aa575b918f91869594930160051c01915b8281106200039b57505062000155565b8681558594508f91016200038b565b925081926200037d565b634e487b7160e01b84526022600452602484fd5b90607f169062000140565b634e487b7160e01b82526041600452602482fd5b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620003ec5760405256fe608080604052600436101561001357600080fd5b600090813560e01c90816301ffc9a714612dd45750806306fdde0314612d12578063081812fc14612cf3578063095ea7b314612b645780631400ecec14612ac45780631c1cdd4c14612a5f5780631e99d56914612a4157806323b872dd14612a1757806339a73c03146129d657806340e58ee514612738578063425d30dd1461271957806342842e0e146126c957806342966c681461253f5780634857501f146124b55780634869e12d1461247a5780635fe3b567146124535780636352211e146124235780636d0cee75146123cd57806370a082311461232457806375829def14612291578063780a82c8146122415780637cad6cd1146121705780637de6b1db14611f905780638659c27014611c6f578063894e9a0d14611a1b5780638bad38dd1461199e5780638f69b993146119025780639067b677146118af57806395d89b41146117a257806396ce143114611683578063a22cb465146115b2578063a2ffb897146111c5578063a6202bf2146110c8578063a80fc07114611076578063ab167ccc14610f3d578063ad35efd414610edb578063b256456914610ebc578063b88d4fde14610e32578063b8a3be6614610dfd578063b971302a14610dae578063bc063e1a14610d8b578063bc2be1be14610d3b578063c156a11d146109c1578063c87b56dd14610887578063cc364f48146107d9578063d4dbd20b14610787578063d511609f1461073b578063d975dfed146106ef578063e985e9c51461069a578063ea5ead1914610674578063eac8f5b81461060b578063f590c176146105e2578063f851a440146105bc5763fdd46d601461027357600080fd5b346105b95760603660031901126105b95760043561028f612f03565b610297613043565b906102a061454f565b6102a9836136d3565b6105a1576102cd83600052600b6020526001600160a01b0360406000205416331490565b90811580610591575b61057257838552602092600584526001600160a01b0391826040882054169380610566575b61054057828116928315610516576001600160801b038084169384156104fe5761032489614611565b82811686116104ca5750938093926103ca9261038f6103578d9a99988d8c52600b8d52600260408d20015460801c61465f565b8c8b52600b8c5261038a600260408d20019182906001600160801b036001600160801b031983549260801b169116179055565b613668565b906103ab818c840151169282604081835116920151169061370a565b16111561049a575b898852600b895260016040892001541692836145ab565b82877f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d88604051868152a48233141580610490575b610432575b837ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce78688604051908152a180f35b823b1561048c57608484928360405195869485936313375c3b60e01b85528b6004860152336024860152604485015260648401525af1610474575b8080610404565b61047d90612f7f565b61048857823861046d565b8280fd5b8380fd5b50823b15156103ff565b898852600b89526040882060018101600160c81b60ff60c81b1982541617905560ff60f01b1981541690556103b3565b60405163287ecaef60e21b8152600481018b90526001600160801b03928316602482015291166044820152606490fd5b0390fd5b6024896040519063d2aabcd960e01b82526004820152fd5b60046040517fc61a0e9e000000000000000000000000000000000000000000000000000000008152fd5b858360649260405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b508383821614156102fb565b60405163216caf0d60e01b815260048101859052336024820152604490fd5b5061059b8461467a565b156102d6565b60248360405190634a5541ef60e01b82526004820152fd5b80fd5b50346105b957806003193601126105b9576001600160a01b036020915416604051908152f35b50346105b95760203660031901126105b9576020610601600435613739565b6040519015158152f35b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d5760016040836001600160a01b039360209552600b855220015416604051908152f35b6024906040519062b8e7e760e51b82526004820152fd5b50346105b95760403660031901126105b957600435610691612f03565b61029782614611565b50346105b95760403660031901126105b9576106b4612eed565b60406106be612f03565b926001600160a01b0380931681526008602052209116600052602052602060ff604060002054166040519015158152f35b50346105b95760203660031901126105b95760ff6001604060043593848152600b60205220015460d01c161561065d5761072a602091614611565b6001600160801b0360405191168152f35b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d5760408260029260209452600b845220015460801c604051908152f35b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d5760036040836001600160801b039360209552600b855220015416604051908152f35b50346105b95760203660031901126105b9576004356107f6613649565b50808252600b60205260ff600160408420015460d01c161561065d578160409160609352600b60205220600181549164ffffffffff918291015460a01c16906040519261084284612fcd565b818160a01c16845260c81c166020830152604082015261088560405180926040908164ffffffffff91828151168552826020820151166020860152015116910152565bf35b50346105b9576020806003193601126109b1576004356108c56108c08260005260056020526001600160a01b0360406000205416151590565b613059565b826001600160a01b03600a5416916044604051809481937fe9dc637500000000000000000000000000000000000000000000000000000000835230600484015260248301525afa9283156109b5578093610934575b5050610930604051928284938452830190612ec8565b0390f35b909192503d8082843e6109478184613005565b82019183818403126109b15780519067ffffffffffffffff8211610488570182601f820112156109b15780519161097d83613027565b9361098b6040519586613005565b8385528584840101116105b95750906109a991848085019101612ea5565b90388061091a565b5080fd5b604051903d90823e3d90fd5b50346105b95760403660031901126105b9576004356109de612f03565b906109e761454f565b808352602091600b835260ff600160408620015460d01c1615610d2457818452600583526001600160a01b03806040862054169081330361057257610a2b84614611565b906001600160801b0390818316918215938415610a52575b89610a4f8989896132ec565b80f35b610a5a61454f565b610a63886136d3565b610d0c57610a8788600052600b6020526001600160a01b0360406000205416331490565b94851580610cfc575b610cdd57888b5260058a528360408c2054169580610cd3575b610caf57861561051657610c9757610ac088614611565b8281168511610c67575090610b20610aed8b969594938a8852600b8c52600260408920015460801c61465f565b898752600b8b5261038a600260408920019182906001600160801b036001600160801b031983549260801b169116179055565b90610b3c818b840151169282604081835116920151169061370a565b161115610c37575b868452600b8852600160408520015416610b5f8286836145ab565b84877f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d8a604051868152a48133141580610c2d575b610bd2575b5050507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7610a4f94604051858152a13880808080610a43565b813b156104885782916084839260405194859384926313375c3b60e01b84528b600485015233602485015289604485015260648401525af1610c15575b80610b99565b610c1e90612f7f565b610c29578438610c0f565b8480fd5b50813b1515610b94565b868452600b88526040842060018101600160c81b60ff60c81b1982541617905560ff60f01b198154169055610b44565b60405163287ecaef60e21b8152600481018a90526001600160801b03928316602482015291166044820152606490fd5b6024886040519063d2aabcd960e01b82526004820152fd5b6064898860405191632dcbf6b960e11b835260048301523360248301526044820152fd5b5085871415610aa9565b60405163216caf0d60e01b8152600481018a9052336024820152604490fd5b50610d068961467a565b15610a90565b60248860405190634a5541ef60e01b82526004820152fd5b6024826040519062b8e7e760e51b82526004820152fd5b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d5760408264ffffffffff9260209452600b8452205460a01c16604051908152f35b50346105b957806003193601126105b957602060405167016345785d8a00008152f35b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d576040826001600160a01b039260209452600b8452205416604051908152f35b50346105b95760203660031901126105b95760ff600160406020936004358152600b855220015460d01c166040519015158152f35b50346105b95760803660031901126105b957610e4c612eed565b610e54612f03565b906064359067ffffffffffffffff821161048c573660238301121561048c5781600401359284610e8385613027565b93610e916040519586613005565b85855236602487830101116109b15785610a4f96602460209301838801378501015260443591613177565b50346105b95760203660031901126105b957602061060160043561369c565b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d57610f14906139af565b604051906005811015610f2957602092508152f35b602483634e487b7160e01b81526021600452fd5b50346105b9576101403660031901126105b957610f5861454f565b610f60613649565b9064ffffffffff80421680845260c43582811681036110715781018216602085015260e4359081831682036110715701166040830152606435916001600160a01b03918284168094036105b957506084358015158091036110715760a435908115158092036110715760243594848616809603611071576004359585871680970361107157604435906001600160801b038216809203611071576040519761100789612fb0565b8852602088015260408701526060860152608085015260a084015260c0830152604061010319360112611071576040519161104183612fe9565b61010435918216820361107157826110699260209452610124358482015260e0820152613ab1565b604051908152f35b600080fd5b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d5760026040836001600160801b039360209552600b855220015416604051908152f35b50346105b95760203660031901126105b9576110e2612eed565b6001600160a01b038083541633810361119c575081169081835260026020526001600160801b0360408420541690811561116b578161113c918486526002602052604086206001600160801b0319815416905533906145ab565b6040519081527fca7a4a65a94ed2f37538814e00e1cd4c41a78261561e3f3794592f11409cf5af60203392a380f35b602483604051907f8410168c0000000000000000000000000000000000000000000000000000000082526004820152fd5b6040516331b339a960e21b81526001600160a01b03919091166004820152336024820152604490fd5b50346105b95760603660031901126105b95767ffffffffffffffff600435818111610488576111f8903690600401612f4e565b90611201612f03565b92604435908111610c295761121a903690600401612f4e565b61122594919461454f565b80840361157b5791926001600160a01b038216159290865b818110611248578780f35b611253818388614639565b359061126081858a614639565b356001600160801b03811681036110715761127961454f565b611282836136d3565b6105a1576112a683600052600b6020526001600160a01b0360406000205416331490565b80158061156b575b61057257838b5260056020526001600160a01b0360408c2054169080611558575b61152b5787610516576001600160801b03821615611513576112f084614611565b6001600160801b0381166001600160801b038416116114e15750908a91848352600b80602052611360600261038a611331868360408a20015460801c61465f565b918988528460205260408820019182906001600160801b036001600160801b031983549260801b169116179055565b6001600160801b03611384816020840151169282604081835116920151169061370a565b1611156114b1575b8584526020526001600160a01b036001604085200154166113b76001600160801b0384168a836145ab565b6040516001600160801b0384168152867f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d60206001600160a01b038d1693a480331415806114a7575b61143b575b5050507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce76020600193604051908152a10161123d565b803b15610488576001600160a01b036084898580946001600160801b0360405197889687956313375c3b60e01b87528d60048801523360248801521660448601521660648401525af161148f575b80611405565b61149890612f7f565b6114a3578838611489565b8880fd5b50803b1515611400565b858452806020526040842060018101600160c81b60ff60c81b1982541617905560ff60f01b19815416905561138c565b60405163287ecaef60e21b8152600481018690526001600160801b038481166024830152919091166044820152606490fd5b6024846040519063d2aabcd960e01b82526004820152fd5b6064846001600160a01b038960405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b50806001600160a01b03881614156112cf565b506115758461467a565b156112ae565b83604491604051917faec9344000000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b50346105b95760403660031901126105b9576115cc612eed565b60243590811515809203611071576001600160a01b03169081331461163f5733835260086020526040832082600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a380f35b606460405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152fd5b50346105b9576101603660031901126105b95761169e61454f565b604051906116ab82612fb0565b6116b3612eed565b82526116bd612f03565b60208301526116ca613043565b60408301526001600160a01b03906064358281168103611071576060840152608435801515810361107157608084015260a43580151581036110715760a084015260603660c31901126105b9575060405161172481612fcd565b64ffffffffff60c435818116810361107157825260e435818116810361107157602083015261010435908116810361107157604082015260c0830152604061012319360112611071576040519161177a83612fe9565b61012435918216820361107157826110699260209452610144358482015260e0820152613ab1565b50346105b957806003193601126105b957604051908060045491600183811c928185169485156118a5575b60209586861081146118915785885287949392918790821561186f575050600114611815575b505061180192500383613005565b610930604051928284938452830190612ec8565b90859250600482527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5b858310611857575050611801935082010138806117f3565b8054838901850152879450869390920191810161183f565b925093505061180194915060ff191682840152151560051b82010138806117f3565b602483634e487b7160e01b81526022600452fd5b93607f16936117cd565b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d57600160408364ffffffffff9360209552600b855220015460a01c16604051908152f35b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d5761193b906139af565b906005821015908161197c5760028314918215611990575b8215611967575b6020836040519015158152f35b90915061197c5750600460209114388061195a565b80634e487b7160e01b602492526021600452fd5b506003831491506000611953565b50346105b95760203660031901126105b9576004356001600160a01b0390818116809103610488578183541633810361119c575060015491816001600160a01b03198416176001556040519216825260208201527fdcb09aef4bf01068924ccce937981cbe59d25ba08380cf941aaaea4e4bd3960d60403392a280f35b50346105b95760203660031901126105b957604051611a3981612f93565b8181528160208201528160408201528160608201528160808201528160a08201528160c08201528160e08201528161010082015281610120820152610140611a7f613649565b9101526004358152600b60205260ff600160408320015460d01c1615611c57576004358152600b60205260408120611b58600260405192611abf84612f93565b80546001600160a01b038116855264ffffffffff8160a01c16602086015264ffffffffff8160c81c16604086015260ff8160f01c161515606086015260f81c1515608085015260ff60018201546001600160a01b03811660a087015264ffffffffff8160a01c1660c0870152818160c81c16151560e0870152818160d01c16151561010087015260d81c16151561012085015201613668565b610140820152611b696004356139af565b6005811015610f29579160026101a09314611c4c575b50610885610140604051926001600160a01b03815116845264ffffffffff602082015116602085015264ffffffffff60408201511660408501526060810151151560608501526080810151151560808501526001600160a01b0360a08201511660a085015264ffffffffff60c08201511660c085015260e0810151151560e0850152610100810151151561010085015261012081015115156101208501520151610140830190604090816001600160801b0391828151168552826020820151166020860152015116910152565b606082015238611b7f565b602460405162b8e7e760e51b81526004356004820152fd5b50346105b957602090816003193601126105b95760043567ffffffffffffffff81116109b157611ca483913690600401612f4e565b9190611cae61454f565b83925b808410611cbc578480f35b611ccb84828497959697614639565b3594611cd561454f565b611cde866136d3565b15611cfb5760248660405190634a5541ef60e01b82526004820152fd5b611d0486613739565b611f7857611d2886600052600b6020526001600160a01b0360406000205416331490565b15611f5957611d368661376a565b95808552600b90818752611d4f60026040882001613668565b906001600160801b039283835116848b161015611f415781885280895260ff604089205460f01c1615611f2957611d9f8a858b611d9560409a9b9c9d9e8389511661370a565b960151169061370a565b92828a52818b52868a20908b8b7f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa50845497600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8a1617865560038a8216968715611f0f575b01998516998a6001600160801b03198254161790556001600160a01b0380991698899360058652818e822054169889965260019d8e912001541694611e4c8b85886145ab565b604080518a81526001600160801b0392831660208201529290911690820152606090a47ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce78b604051858152a1813b611eb0575b505050505001919093919293611cb1565b813b15611f0b57899493919285809460849360405197889687956372eba20360e01b875260048701526024860152604485015260648401525af1611ef7575b808080611e9f565b611f0090612f7f565b610c29578487611eef565b8980fd5b60018101600160c81b60ff60c81b19825416179055611e06565b602482604051906339c6dc7360e21b82526004820152fd5b602482604051906322cad1af60e11b82526004820152fd5b60405163216caf0d60e01b815260048101879052336024820152604490fd5b6024866040519063fe19f19f60e01b82526004820152fd5b50346105b9576020806003193601126109b15760043590611faf61454f565b818352600b815260ff600160408520015460d01c1615610d2457611fd2826139af565b600581101561215c5760048103611ffb5760248360405190634a5541ef60e01b82526004820152fd5b6003810361201b576024836040519063fe19f19f60e01b82526004820152fd5b600214611f415761204282600052600b6020526001600160a01b0360406000205416331490565b1561213d57818352600b815260ff604084205460f01c1615611f2957818352600b81526040832060ff60f01b19815416905582604051837f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f8380a2600583526001600160a01b03604083205416803b6120e5575b5050507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce791604051908152a180f35b803b1561048857816024818580947f341a0bd90000000000000000000000000000000000000000000000000000000083528960048401525af1612129575b806120b6565b61213290612f7f565b610488578238612123565b60405163216caf0d60e01b815260048101839052336024820152604490fd5b602484634e487b7160e01b81526021600452fd5b50346105b95760203660031901126105b9576004356001600160a01b0390818116809103610488578183541633810361119c5750600a5491816001600160a01b0319841617600a556040519216825260208201527fa2548bd4b805e907c1558a47b5858324fe8bb4a2e1ddfca647eecbf65610eebc60403392a2600954600019810190811161222d5760407f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c91815190600182526020820152a180f35b602482634e487b7160e01b81526011600452fd5b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d5760408264ffffffffff9260209452600b8452205460c81c16604051908152f35b50346105b95760203660031901126105b9576122ab612eed565b9080546001600160a01b03808216933385036122fd576001600160a01b03199394501691829116178255337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808380a380f35b6040516331b339a960e21b81526001600160a01b0386166004820152336024820152604490fd5b50346105b95760203660031901126105b9576001600160a01b03612346612eed565b168015612363578160409160209352600683522054604051908152f35b608460405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e657200000000000000000000000000000000000000000000006064820152fd5b50346105b95760203660031901126105b9576001600160a01b0360406020926004356124126108c08260005260056020526001600160a01b0360406000205416151590565b815260058452205416604051908152f35b50346105b95760203660031901126105b95760206124426004356130a4565b6001600160a01b0360405191168152f35b50346105b957806003193601126105b95760206001600160a01b0360015416604051908152f35b50346105b95760203660031901126105b95760ff6001604060043593848152600b60205220015460d01c161561065d5761072a602091613a36565b50346105b95760203660031901126105b95760043590818152600b60205260ff600160408320015460d01c1615610d2457806124f0836139af565b92600584101561252b57600260209403612511575b50506040519015158152f35b8152600b8352604090205460f01c60ff1690503880612505565b602482634e487b7160e01b81526021600452fd5b50346105b95760203660031901126105b95760043561255c61454f565b612565816136d3565b15612698576125738161467a565b1561267857612581816130a4565b61258a8261369c565b159081612670575b8161265d575b50612645576020816125ca7ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7936130a4565b90808552600783526001600160a01b0360408620926001600160a01b03199384815416905516918286526006845260408620600019815401905581865260058452604086209081541690558085604051937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a48152a180f35b60249060405190630da9b01360e01b82526004820152fd5b6001600160a01b03915016151538612598565b839150612592565b60405163216caf0d60e01b81526004810191909152336024820152604490fd5b602490604051907f817cd6390000000000000000000000000000000000000000000000000000000082526004820152fd5b50346105b9576126d836612f19565b60405191602083019383851067ffffffffffffffff86111761270357610a4f94604052858452613177565b634e487b7160e01b600052604160045260246000fd5b50346105b95760203660031901126105b95760206106016004356136d3565b50346105b9576020806003193601126109b1576004359061275761454f565b612760826136d3565b1561277d5760248260405190634a5541ef60e01b82526004820152fd5b9061278781613739565b6129be576127ab81600052600b6020526001600160a01b0360406000205416331490565b15612678576127b98161376a565b818452600b83526127cf60026040862001613668565b926001600160801b03918285511683821610156129a657838652600b825260ff604087205460f01c161561298e5792827ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce783612844878460409761283a8d9b6128ef9b8e511661370a565b9b0151169061370a565b92848852600b825287868120947f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa50865491600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84161788556003858216988915612974575b01948d169c858e6001600160801b0319819854161790556001600160a01b038094169b8c94600589526001818e892054169d8e98600b8c52200154169685886145ab565b604080518b81526001600160801b0392831660208201529290911690820152606090a4604051848152a1823b612923578480f35b823b15610c2957608492859160405197889687956372eba20360e01b875260048701526024860152604485015260648401525af1612965575b81818080808480f35b61296e90612f7f565b3861295c565b60018101600160c81b60ff60c81b198254161790556128ab565b602484604051906339c6dc7360e21b82526004820152fd5b602484604051906322cad1af60e11b82526004820152fd5b6024906040519063fe19f19f60e01b82526004820152fd5b50346105b95760203660031901126105b9576001600160801b0360406020926001600160a01b03612a05612eed565b16815260028452205416604051908152f35b50346105b957610a4f612a2936612f19565b91612a3c612a37843361320d565b613106565b6132ec565b50346105b957806003193601126105b9576020600954604051908152f35b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d57612a98906139af565b90600582101561197c5760208215838115612ab9575b506040519015158152f35b600191501482612aae565b50346105b95760203660031901126105b95760043590818152600b60205260ff600160408320015460d01c1615610d2457602091604082828152600b85522060ff815460f01c1680612b52575b612b29575b50506001600160801b0360405191168152f35b612b4b92506001600160801b036002612b45920154169161376a565b9061370a565b3880612b16565b5060ff600182015460c81c1615612b11565b50346105b95760403660031901126105b957612b7e612eed565b602435906001600160a01b038080612b95856130a4565b16921691808314612c8957803314908115612c68575b5015612bfe57828452600760205260408420826001600160a01b0319825416179055612bd6836130a4565b167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258480a480f35b608460405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152fd5b9050845260086020526040842033855260205260ff60408520541638612bab565b608460405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152fd5b50346105b95760203660031901126105b95760206124426004356130c9565b50346105b957806003193601126105b957604051908060035491600183811c92818516948515612dca575b60209586861081146118915785885287949392918790821561186f575050600114612d7057505061180192500383613005565b90859250600382527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b858310612db2575050611801935082010138806117f3565b80548389018501528794508693909201918101612d9a565b93607f1693612d3d565b9050346109b15760203660031901126109b1576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361048857602092507f80ac58cd000000000000000000000000000000000000000000000000000000008114908115612e7b575b8115612e51575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501438612e4a565b7f5b5e139f0000000000000000000000000000000000000000000000000000000081149150612e43565b60005b838110612eb85750506000910152565b8181015183820152602001612ea8565b90602091612ee181518092818552858086019101612ea5565b601f01601f1916010190565b600435906001600160a01b038216820361107157565b602435906001600160a01b038216820361107157565b6060906003190112611071576001600160a01b0390600435828116810361107157916024359081168103611071579060443590565b9181601f840112156110715782359167ffffffffffffffff8311611071576020808501948460051b01011161107157565b67ffffffffffffffff811161270357604052565b610160810190811067ffffffffffffffff82111761270357604052565b610100810190811067ffffffffffffffff82111761270357604052565b6060810190811067ffffffffffffffff82111761270357604052565b6040810190811067ffffffffffffffff82111761270357604052565b90601f8019910116810190811067ffffffffffffffff82111761270357604052565b67ffffffffffffffff811161270357601f01601f191660200190565b604435906001600160801b038216820361107157565b1561306057565b606460405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152fd5b60005260056020526001600160a01b03604060002054166130c6811515613059565b90565b6130ec6108c08260005260056020526001600160a01b0360406000205416151590565b60005260076020526001600160a01b036040600020541690565b1561310d57565b608460405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f766564000000000000000000000000000000000000006064820152fd5b9061319b93929161318b612a37843361320d565b6131968383836132ec565b6134b7565b156131a257565b60405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b906001600160a01b038080613221846130a4565b16931691838314938415613254575b50831561323e575b50505090565b61324a919293506130c9565b1614388080613238565b909350600052600860205260406000208260005260205260ff604060002054169238613230565b1561328257565b608460405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152fd5b9061331592916132fb836130a4565b916001600160a01b0394859384809416968791161461327b565b169081158061341e576133278461369c565b159081613415575b508061340c575b6133f457918084926133767ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce79660209661336f856130a4565b161461327b565b60009382855260078652604085206001600160a01b031990818154169055818652600687526040862060001981540190558286526040862060018154019055838652600587528260408720918254161790557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6040519580a48152a1565b60248360405190630da9b01360e01b82526004820152fd5b50831515613336565b9050153861332f565b608460405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152fd5b3d156134b2573d9061349882613027565b916134a66040519384613005565b82523d6000602084013e565b606090565b9290803b1561364057613521916020916001600160a01b0394604051809581948293897f150b7a02000000000000000000000000000000000000000000000000000000009b8c86523360048701521660248501526044840152608060648401526084830190612ec8565b03916000968791165af1908290826135e0575b50506135ba57613542613487565b805190816135b55760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000161490565b909192506020813d8211613638575b816135fc60209383613005565b810103126109b15751907fffffffff00000000000000000000000000000000000000000000000000000000821682036105b95750903880613534565b3d91506135ef565b50505050600190565b6040519061365682612fcd565b60006040838281528260208201520152565b9060405161367581612fcd565b6040819360018154916001600160801b0392838116865260801c6020860152015416910152565b80600052600b60205260ff60016040600020015460d01c161561065d57600052600b60205260ff60016040600020015460d81c1690565b80600052600b60205260ff60016040600020015460d01c161561065d57600052600b60205260ff60016040600020015460c81c1690565b6001600160801b03918216908216039190821161372357565b634e487b7160e01b600052601160045260246000fd5b80600052600b60205260ff60016040600020015460d01c161561065d57600052600b60205260406000205460f81c90565b600090808252600b6020526040822091825464ffffffffff42818360c81c16116138185780600186015460a01c169182421015613802576137b79394955060a01c16809103904203613820565b90828152600b6020526001600160801b03926137dd846002604085200154168094613900565b9283116137ea5750501690565b60029350604092508152600b60205220015460801c90565b505050505060026001600160801b039101541690565b505091505090565b670de0b6b3a76400009160001983830992808302928380861095039480860395146138dc57828510156138a057908291096001821901821680920460028082600302188083028203028083028203028083028203028083028203028083028203028092029003029360018380600003040190848311900302920304170290565b82606492604051927f63a05778000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b5050809250156138ea570490565b634e487b7160e01b600052601260045260246000fd5b9091906000198382098382029182808310920391808303921461399e57670de0b6b3a7640000908183101561396757947faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066994950990828211900360ee1b910360121c170290565b60449086604051917f5173648d00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050670de0b6b3a764000090049150565b80600052600b602052604060002060ff600182015460c81c166000146139d6575050600490565b805460f81c613a2f575460a01c64ffffffffff164210613a29576139f98161376a565b90600052600b6020526001600160801b038060026040600020015416911610600014613a2457600190565b600290565b50600090565b5050600390565b80600052600b602052613a4f6002604060002001613668565b81600052600b602052604060002060ff600182015460c81c16600014613a8257506001600160801b039150602001511690565b5460f81c613a9457506130c69061376a565b6130c691506001600160801b03604081835116920151169061370a565b906001600160a01b036001541660206001600160a01b036060850151166024604051809481937fdcf844a700000000000000000000000000000000000000000000000000000000835260048301525afa80156142e6576000906142b2575b613b3291506001600160801b0360408501511690602060e08601510151916146e3565b916001600160801b0383511660c082015190156142885764ffffffffff815116602082019064ffffffffff8251169081811161424857505064ffffffffff604091511691019064ffffffffff825116908181101561420857505064ffffffffff80421691511690818110156141c8575050600954926001600160801b0381511660405190613bbf82612fcd565b815260006020820152600060408201526001600160a01b036060840151169060c08401519164ffffffffff6020840151169064ffffffffff604085015116906080870151151560a088015115159364ffffffffff6001600160a01b038a511697511660405197613c2e89612f93565b88526020880152604087015260608601526000608086015260a085015260c0840152600060e0840152600161010084015261012083015261014082015284600052600b60205260406000206001600160a01b038251166001600160a01b0319825416178155613cc564ffffffffff602084015116829064ffffffffff60a01b1964ffffffffff60a01b83549260a01b169116179055565b604082015181547eff0000000000000000000000000000000000000000000000000000000000006060850151151560f01b169078ffffffffffffffffffffffffffffffffffffffffffffffffff7dffffffffff000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000006080880151151560f81b169460c81b1691161717178155600181016001600160a01b0360a0840151166001600160a01b0319825416178155613dbc64ffffffffff60c085015116829064ffffffffff60a01b1964ffffffffff60a01b83549260a01b169116179055565b60e083015181546101008501516101208601517fffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff90921692151560c81b79ff00000000000000000000000000000000000000000000000000169290921791151560d01b7aff0000000000000000000000000000000000000000000000000000169190911790151560d81b7bff00000000000000000000000000000000000000000000000000000016179055610140909101518051602082015160801b6001600160801b03199081166001600160801b03928316176002850155926040906003019201511682825416179055600185016009556001600160a01b0360608401511660005260026020526001600160801b0380604060002054168160208501511601166001600160a01b036060850151166000526040600020918254161790556001600160a01b03602083015116801561418457613f37613f318660005260056020526001600160a01b0360406000205416151590565b1561446c565b613f408561369c565b158061417b575b80614173575b61415b5760207ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce791613f98613f318860005260056020526001600160a01b0360406000205416151590565b806000526006825260406000206001815401905586600052600582526040600020816001600160a01b0319825416179055866040519160007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4868152a16140286001600160a01b036060840151166001600160801b038084511681602086015116011690309033906142f2565b6001600160801b036040820151168061412c575b506001600160a01b038251167f075861cbceafeb777e8f15f357121b08f6f3adba387d599bb7b5278ca6192df5610160866001600160a01b03602087015116946141236001600160a01b03606089015116976080810151151560a08201511515906140ed6001600160a01b0360e060c08601519501515116956040519788523360208901526040880190604090816001600160801b0391828151168552826020820151166020860152015116910152565b60a086015260c0850152805164ffffffffff90811660e08601526020820151811661010086015260409091015116610120840152565b610140820152a4565b614155906001600160a01b036060850151166001600160a01b0360e086015151169033906142f2565b3861403c565b60248560405190630da9b01360e01b82526004820152fd5b506000613f4d565b50801515613f47565b606460405162461bcd60e51b815260206004820152602060248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152fd5b6040517f210aec0e00000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b6040517f9fee269100000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b6040517f4c23297000000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b60046040517f6095d3bc000000000000000000000000000000000000000000000000000000008152fd5b6020823d6020116142de575b816142cb60209383613005565b810103126105b95750613b329051613b0f565b3d91506142be565b6040513d6000823e3d90fd5b9290604051927f23b872dd0000000000000000000000000000000000000000000000000000000060208501526001600160a01b03809216602485015216604483015260648201526064815260a081019181831067ffffffffffffffff8411176127035761436192604052614363565b565b6001600160a01b0316906143c360405161437c81612fe9565b6020938482527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564858301526000808587829751910182855af16143bd613487565b916144b7565b805191821591848315614448575b5050509050156143de5750565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b9193818094500103126109b1578201519081151582036105b95750803880846143d1565b1561447357565b606460405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152fd5b9192901561451857508151156144cb575090565b3b156144d45790565b606460405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b82519091501561452b5750805190602001fd5b6104fa9060405191829162461bcd60e51b8352602060048401526024830190612ec8565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361458157565b60046040517fa1c0d6e5000000000000000000000000000000000000000000000000000000008152fd5b916001600160a01b03604051927fa9059cbb000000000000000000000000000000000000000000000000000000006020850152166024830152604482015260448152608081019181831067ffffffffffffffff8411176127035761436192604052614363565b6130c69061461e81613a36565b90600052600b60205260026040600020015460801c9061370a565b91908110156146495760051b0190565b634e487b7160e01b600052603260045260246000fd5b9190916001600160801b038080941691160191821161372357565b60009080825260056020526001600160a01b0380604084205416928333149384156146bf575b505082156146ad57505090565b9091506146ba33926130c9565b161490565b60ff92945090604091815260086020528181203382526020522054169138806146a0565b9092916146ee613649565b936001600160801b03928381169182156147fa5767016345785d8a00008082116147c35780851161478c575061473885614729819386613900565b16946020890195865284613900565b16918461474f60408901948086528287511661465f565b161015614776576147688491826147719551169061370a565b9151169061370a565b168252565b634e487b7160e01b600052600160045260246000fd5b84604491604051917f4fea5c1a00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b60449250604051917f47152d6700000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050505050905060405161480d81612fcd565b6000815260006020820152600060408201529056fea164736f6c6343000815000a"; + hex"60a034620003e757601f196001600160401b03601f62004c523881900382810185168601919084831187841017620003ec57808792606094604052833981010312620003e75783516001600160a01b03928382169291839003620003e7576020918287015196858816809803620003e75760400151948516809503620003e7576200008962000402565b90601c82527f5361626c696572205632204c6f636b7570204c696e656172204e46540000000084830152620000bd62000402565b601181527029a0a116ab1916a627a1a5aaa816a624a760791b8582015230608052600080546001600160a01b031990811688178255600180548216909b178b5596817fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a38351858111620003d35760039485548c81811c91168015620003c8575b89821014620003b45790818684931162000361575b508890868311600114620002f8578492620002ec575b505060001982871b1c1916908b1b1784555b8151948511620002d8576004958654998b8b811c9b168015620002cd575b828c1014620002ba57848b1162000271575b869798999a50819487116001146200020a57505093620001fe575b505082871b92600019911b1c19161790555b600a541617600a5560095560405161482f9081620004238239608051816143320152f35b015191503880620001c8565b8883528183208c9890969594939116915b8282106200025757505085116200023c575b50505050811b019055620001da565b01519060f884600019921b161c19169055388080806200022d565b8484015187558c989096019593840193908101906200021b565b87835281832085880160051c81019b838910620002af575b860160051c019a8c905b8c8110620002a3575050620001ad565b848155018c9062000293565b909b508b9062000289565b634e487b7160e01b835260228852602483fd5b9a607f169a6200019b565b634e487b7160e01b81526041600452602490fd5b0151905038806200016b565b908c8e9416918886528a862092865b8c82821062000341575050841162000328575b505050811b0184556200017d565b015160001983891b60f8161c191690553880806200031a565b91929395968291958786015181550195019301908f959493929162000307565b9091508684528884208680850160051c8201928b8610620003aa575b918f91869594930160051c01915b8281106200039b57505062000155565b8681558594508f91016200038b565b925081926200037d565b634e487b7160e01b84526022600452602484fd5b90607f169062000140565b634e487b7160e01b82526041600452602482fd5b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620003ec5760405256fe608080604052600436101561001357600080fd5b600090813560e01c90816301ffc9a714612dd45750806306fdde0314612d12578063081812fc14612cf3578063095ea7b314612b645780631400ecec14612ac45780631c1cdd4c14612a5f5780631e99d56914612a4157806323b872dd14612a1757806339a73c03146129d657806340e58ee514612738578063425d30dd1461271957806342842e0e146126c957806342966c681461253f5780634857501f146124b55780634869e12d1461247a5780635fe3b567146124535780636352211e146124235780636d0cee75146123cd57806370a082311461232457806375829def14612291578063780a82c8146122415780637cad6cd1146121705780637de6b1db14611f905780638659c27014611c6f578063894e9a0d14611a1b5780638bad38dd1461199e5780638f69b993146119025780639067b677146118af57806395d89b41146117a257806396ce143114611683578063a22cb465146115b2578063a2ffb897146111c5578063a6202bf2146110c8578063a80fc07114611076578063ab167ccc14610f3d578063ad35efd414610edb578063b256456914610ebc578063b88d4fde14610e32578063b8a3be6614610dfd578063b971302a14610dae578063bc063e1a14610d8b578063bc2be1be14610d3b578063c156a11d146109c1578063c87b56dd14610887578063cc364f48146107d9578063d4dbd20b14610787578063d511609f1461073b578063d975dfed146106ef578063e985e9c51461069a578063ea5ead1914610674578063eac8f5b81461060b578063f590c176146105e2578063f851a440146105bc5763fdd46d601461027357600080fd5b346105b95760603660031901126105b95760043561028f612f03565b610297613043565b906102a0614328565b6102a9836136d3565b6105a1576102cd83600052600b6020526001600160a01b0360406000205416331490565b90811580610591575b61057257838552602092600584526001600160a01b0391826040882054169380610566575b61054057828116928315610516576001600160801b038084169384156104fe57610324896143ea565b82811686116104ca5750938093926103ca9261038f6103578d9a99988d8c52600b8d52600260408d20015460801c614438565b8c8b52600b8c5261038a600260408d20019182906001600160801b036001600160801b031983549260801b169116179055565b613668565b906103ab818c840151169282604081835116920151169061370a565b16111561049a575b898852600b89526001604089200154169283614384565b82877f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d88604051868152a48233141580610490575b610432575b837ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce78688604051908152a180f35b823b1561048c57608484928360405195869485936313375c3b60e01b85528b6004860152336024860152604485015260648401525af1610474575b8080610404565b61047d90612f7f565b61048857823861046d565b8280fd5b8380fd5b50823b15156103ff565b898852600b89526040882060018101600160c81b60ff60c81b1982541617905560ff60f01b1981541690556103b3565b60405163287ecaef60e21b8152600481018b90526001600160801b03928316602482015291166044820152606490fd5b0390fd5b6024896040519063d2aabcd960e01b82526004820152fd5b60046040517fc61a0e9e000000000000000000000000000000000000000000000000000000008152fd5b858360649260405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b508383821614156102fb565b60405163216caf0d60e01b815260048101859052336024820152604490fd5b5061059b84614453565b156102d6565b60248360405190634a5541ef60e01b82526004820152fd5b80fd5b50346105b957806003193601126105b9576001600160a01b036020915416604051908152f35b50346105b95760203660031901126105b9576020610601600435613739565b6040519015158152f35b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d5760016040836001600160a01b039360209552600b855220015416604051908152f35b6024906040519062b8e7e760e51b82526004820152fd5b50346105b95760403660031901126105b957600435610691612f03565b610297826143ea565b50346105b95760403660031901126105b9576106b4612eed565b60406106be612f03565b926001600160a01b0380931681526008602052209116600052602052602060ff604060002054166040519015158152f35b50346105b95760203660031901126105b95760ff6001604060043593848152600b60205220015460d01c161561065d5761072a6020916143ea565b6001600160801b0360405191168152f35b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d5760408260029260209452600b845220015460801c604051908152f35b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d5760036040836001600160801b039360209552600b855220015416604051908152f35b50346105b95760203660031901126105b9576004356107f6613649565b50808252600b60205260ff600160408420015460d01c161561065d578160409160609352600b60205220600181549164ffffffffff918291015460a01c16906040519261084284612fcd565b818160a01c16845260c81c166020830152604082015261088560405180926040908164ffffffffff91828151168552826020820151166020860152015116910152565bf35b50346105b9576020806003193601126109b1576004356108c56108c08260005260056020526001600160a01b0360406000205416151590565b613059565b826001600160a01b03600a5416916044604051809481937fe9dc637500000000000000000000000000000000000000000000000000000000835230600484015260248301525afa9283156109b5578093610934575b5050610930604051928284938452830190612ec8565b0390f35b909192503d8082843e6109478184613005565b82019183818403126109b15780519067ffffffffffffffff8211610488570182601f820112156109b15780519161097d83613027565b9361098b6040519586613005565b8385528584840101116105b95750906109a991848085019101612ea5565b90388061091a565b5080fd5b604051903d90823e3d90fd5b50346105b95760403660031901126105b9576004356109de612f03565b906109e7614328565b808352602091600b835260ff600160408620015460d01c1615610d2457818452600583526001600160a01b03806040862054169081330361057257610a2b846143ea565b906001600160801b0390818316918215938415610a52575b89610a4f8989896132ec565b80f35b610a5a614328565b610a63886136d3565b610d0c57610a8788600052600b6020526001600160a01b0360406000205416331490565b94851580610cfc575b610cdd57888b5260058a528360408c2054169580610cd3575b610caf57861561051657610c9757610ac0886143ea565b8281168511610c67575090610b20610aed8b969594938a8852600b8c52600260408920015460801c614438565b898752600b8b5261038a600260408920019182906001600160801b036001600160801b031983549260801b169116179055565b90610b3c818b840151169282604081835116920151169061370a565b161115610c37575b868452600b8852600160408520015416610b5f828683614384565b84877f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d8a604051868152a48133141580610c2d575b610bd2575b5050507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7610a4f94604051858152a13880808080610a43565b813b156104885782916084839260405194859384926313375c3b60e01b84528b600485015233602485015289604485015260648401525af1610c15575b80610b99565b610c1e90612f7f565b610c29578438610c0f565b8480fd5b50813b1515610b94565b868452600b88526040842060018101600160c81b60ff60c81b1982541617905560ff60f01b198154169055610b44565b60405163287ecaef60e21b8152600481018a90526001600160801b03928316602482015291166044820152606490fd5b6024886040519063d2aabcd960e01b82526004820152fd5b6064898860405191632dcbf6b960e11b835260048301523360248301526044820152fd5b5085871415610aa9565b60405163216caf0d60e01b8152600481018a9052336024820152604490fd5b50610d0689614453565b15610a90565b60248860405190634a5541ef60e01b82526004820152fd5b6024826040519062b8e7e760e51b82526004820152fd5b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d5760408264ffffffffff9260209452600b8452205460a01c16604051908152f35b50346105b957806003193601126105b957602060405167016345785d8a00008152f35b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d576040826001600160a01b039260209452600b8452205416604051908152f35b50346105b95760203660031901126105b95760ff600160406020936004358152600b855220015460d01c166040519015158152f35b50346105b95760803660031901126105b957610e4c612eed565b610e54612f03565b906064359067ffffffffffffffff821161048c573660238301121561048c5781600401359284610e8385613027565b93610e916040519586613005565b85855236602487830101116109b15785610a4f96602460209301838801378501015260443591613177565b50346105b95760203660031901126105b957602061060160043561369c565b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d57610f1490613820565b604051906005811015610f2957602092508152f35b602483634e487b7160e01b81526021600452fd5b50346105b9576101403660031901126105b957610f58614328565b610f60613649565b9064ffffffffff80421680845260c43582811681036110715781018216602085015260e4359081831682036110715701166040830152606435916001600160a01b03918284168094036105b957506084358015158091036110715760a435908115158092036110715760243594848616809603611071576004359585871680970361107157604435906001600160801b038216809203611071576040519761100789612fb0565b8852602088015260408701526060860152608085015260a084015260c0830152604061010319360112611071576040519161104183612fe9565b61010435918216820361107157826110699260209452610124358482015260e0820152613922565b604051908152f35b600080fd5b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d5760026040836001600160801b039360209552600b855220015416604051908152f35b50346105b95760203660031901126105b9576110e2612eed565b6001600160a01b038083541633810361119c575081169081835260026020526001600160801b0360408420541690811561116b578161113c918486526002602052604086206001600160801b031981541690553390614384565b6040519081527fca7a4a65a94ed2f37538814e00e1cd4c41a78261561e3f3794592f11409cf5af60203392a380f35b602483604051907f8410168c0000000000000000000000000000000000000000000000000000000082526004820152fd5b6040516331b339a960e21b81526001600160a01b03919091166004820152336024820152604490fd5b50346105b95760603660031901126105b95767ffffffffffffffff600435818111610488576111f8903690600401612f4e565b90611201612f03565b92604435908111610c295761121a903690600401612f4e565b611225949194614328565b80840361157b5791926001600160a01b038216159290865b818110611248578780f35b611253818388614412565b359061126081858a614412565b356001600160801b038116810361107157611279614328565b611282836136d3565b6105a1576112a683600052600b6020526001600160a01b0360406000205416331490565b80158061156b575b61057257838b5260056020526001600160a01b0360408c2054169080611558575b61152b5787610516576001600160801b03821615611513576112f0846143ea565b6001600160801b0381166001600160801b038416116114e15750908a91848352600b80602052611360600261038a611331868360408a20015460801c614438565b918988528460205260408820019182906001600160801b036001600160801b031983549260801b169116179055565b6001600160801b03611384816020840151169282604081835116920151169061370a565b1611156114b1575b8584526020526001600160a01b036001604085200154166113b76001600160801b0384168a83614384565b6040516001600160801b0384168152867f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d60206001600160a01b038d1693a480331415806114a7575b61143b575b5050507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce76020600193604051908152a10161123d565b803b15610488576001600160a01b036084898580946001600160801b0360405197889687956313375c3b60e01b87528d60048801523360248801521660448601521660648401525af161148f575b80611405565b61149890612f7f565b6114a3578838611489565b8880fd5b50803b1515611400565b858452806020526040842060018101600160c81b60ff60c81b1982541617905560ff60f01b19815416905561138c565b60405163287ecaef60e21b8152600481018690526001600160801b038481166024830152919091166044820152606490fd5b6024846040519063d2aabcd960e01b82526004820152fd5b6064846001600160a01b038960405192632dcbf6b960e11b84526004840152336024840152166044820152fd5b50806001600160a01b03881614156112cf565b5061157584614453565b156112ae565b83604491604051917faec9344000000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b50346105b95760403660031901126105b9576115cc612eed565b60243590811515809203611071576001600160a01b03169081331461163f5733835260086020526040832082600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a380f35b606460405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152fd5b50346105b9576101603660031901126105b95761169e614328565b604051906116ab82612fb0565b6116b3612eed565b82526116bd612f03565b60208301526116ca613043565b60408301526001600160a01b03906064358281168103611071576060840152608435801515810361107157608084015260a43580151581036110715760a084015260603660c31901126105b9575060405161172481612fcd565b64ffffffffff60c435818116810361107157825260e435818116810361107157602083015261010435908116810361107157604082015260c0830152604061012319360112611071576040519161177a83612fe9565b61012435918216820361107157826110699260209452610144358482015260e0820152613922565b50346105b957806003193601126105b957604051908060045491600183811c928185169485156118a5575b60209586861081146118915785885287949392918790821561186f575050600114611815575b505061180192500383613005565b610930604051928284938452830190612ec8565b90859250600482527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5b858310611857575050611801935082010138806117f3565b8054838901850152879450869390920191810161183f565b925093505061180194915060ff191682840152151560051b82010138806117f3565b602483634e487b7160e01b81526022600452fd5b93607f16936117cd565b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d57600160408364ffffffffff9360209552600b855220015460a01c16604051908152f35b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d5761193b90613820565b906005821015908161197c5760028314918215611990575b8215611967575b6020836040519015158152f35b90915061197c5750600460209114388061195a565b80634e487b7160e01b602492526021600452fd5b506003831491506000611953565b50346105b95760203660031901126105b9576004356001600160a01b0390818116809103610488578183541633810361119c575060015491816001600160a01b03198416176001556040519216825260208201527fdcb09aef4bf01068924ccce937981cbe59d25ba08380cf941aaaea4e4bd3960d60403392a280f35b50346105b95760203660031901126105b957604051611a3981612f93565b8181528160208201528160408201528160608201528160808201528160a08201528160c08201528160e08201528161010082015281610120820152610140611a7f613649565b9101526004358152600b60205260ff600160408320015460d01c1615611c57576004358152600b60205260408120611b58600260405192611abf84612f93565b80546001600160a01b038116855264ffffffffff8160a01c16602086015264ffffffffff8160c81c16604086015260ff8160f01c161515606086015260f81c1515608085015260ff60018201546001600160a01b03811660a087015264ffffffffff8160a01c1660c0870152818160c81c16151560e0870152818160d01c16151561010087015260d81c16151561012085015201613668565b610140820152611b69600435613820565b6005811015610f29579160026101a09314611c4c575b50610885610140604051926001600160a01b03815116845264ffffffffff602082015116602085015264ffffffffff60408201511660408501526060810151151560608501526080810151151560808501526001600160a01b0360a08201511660a085015264ffffffffff60c08201511660c085015260e0810151151560e0850152610100810151151561010085015261012081015115156101208501520151610140830190604090816001600160801b0391828151168552826020820151166020860152015116910152565b606082015238611b7f565b602460405162b8e7e760e51b81526004356004820152fd5b50346105b957602090816003193601126105b95760043567ffffffffffffffff81116109b157611ca483913690600401612f4e565b9190611cae614328565b83925b808410611cbc578480f35b611ccb84828497959697614412565b3594611cd5614328565b611cde866136d3565b15611cfb5760248660405190634a5541ef60e01b82526004820152fd5b611d0486613739565b611f7857611d2886600052600b6020526001600160a01b0360406000205416331490565b15611f5957611d368661376a565b95808552600b90818752611d4f60026040882001613668565b906001600160801b039283835116848b161015611f415781885280895260ff604089205460f01c1615611f2957611d9f8a858b611d9560409a9b9c9d9e8389511661370a565b960151169061370a565b92828a52818b52868a20908b8b7f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa50845497600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8a1617865560038a8216968715611f0f575b01998516998a6001600160801b03198254161790556001600160a01b0380991698899360058652818e822054169889965260019d8e912001541694611e4c8b8588614384565b604080518a81526001600160801b0392831660208201529290911690820152606090a47ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce78b604051858152a1813b611eb0575b505050505001919093919293611cb1565b813b15611f0b57899493919285809460849360405197889687956372eba20360e01b875260048701526024860152604485015260648401525af1611ef7575b808080611e9f565b611f0090612f7f565b610c29578487611eef565b8980fd5b60018101600160c81b60ff60c81b19825416179055611e06565b602482604051906339c6dc7360e21b82526004820152fd5b602482604051906322cad1af60e11b82526004820152fd5b60405163216caf0d60e01b815260048101879052336024820152604490fd5b6024866040519063fe19f19f60e01b82526004820152fd5b50346105b9576020806003193601126109b15760043590611faf614328565b818352600b815260ff600160408520015460d01c1615610d2457611fd282613820565b600581101561215c5760048103611ffb5760248360405190634a5541ef60e01b82526004820152fd5b6003810361201b576024836040519063fe19f19f60e01b82526004820152fd5b600214611f415761204282600052600b6020526001600160a01b0360406000205416331490565b1561213d57818352600b815260ff604084205460f01c1615611f2957818352600b81526040832060ff60f01b19815416905582604051837f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f8380a2600583526001600160a01b03604083205416803b6120e5575b5050507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce791604051908152a180f35b803b1561048857816024818580947f341a0bd90000000000000000000000000000000000000000000000000000000083528960048401525af1612129575b806120b6565b61213290612f7f565b610488578238612123565b60405163216caf0d60e01b815260048101839052336024820152604490fd5b602484634e487b7160e01b81526021600452fd5b50346105b95760203660031901126105b9576004356001600160a01b0390818116809103610488578183541633810361119c5750600a5491816001600160a01b0319841617600a556040519216825260208201527fa2548bd4b805e907c1558a47b5858324fe8bb4a2e1ddfca647eecbf65610eebc60403392a2600954600019810190811161222d5760407f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c91815190600182526020820152a180f35b602482634e487b7160e01b81526011600452fd5b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d5760408264ffffffffff9260209452600b8452205460c81c16604051908152f35b50346105b95760203660031901126105b9576122ab612eed565b9080546001600160a01b03808216933385036122fd576001600160a01b03199394501691829116178255337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808380a380f35b6040516331b339a960e21b81526001600160a01b0386166004820152336024820152604490fd5b50346105b95760203660031901126105b9576001600160a01b03612346612eed565b168015612363578160409160209352600683522054604051908152f35b608460405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e657200000000000000000000000000000000000000000000006064820152fd5b50346105b95760203660031901126105b9576001600160a01b0360406020926004356124126108c08260005260056020526001600160a01b0360406000205416151590565b815260058452205416604051908152f35b50346105b95760203660031901126105b95760206124426004356130a4565b6001600160a01b0360405191168152f35b50346105b957806003193601126105b95760206001600160a01b0360015416604051908152f35b50346105b95760203660031901126105b95760ff6001604060043593848152600b60205220015460d01c161561065d5761072a6020916138a7565b50346105b95760203660031901126105b95760043590818152600b60205260ff600160408320015460d01c1615610d2457806124f083613820565b92600584101561252b57600260209403612511575b50506040519015158152f35b8152600b8352604090205460f01c60ff1690503880612505565b602482634e487b7160e01b81526021600452fd5b50346105b95760203660031901126105b95760043561255c614328565b612565816136d3565b156126985761257381614453565b1561267857612581816130a4565b61258a8261369c565b159081612670575b8161265d575b50612645576020816125ca7ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7936130a4565b90808552600783526001600160a01b0360408620926001600160a01b03199384815416905516918286526006845260408620600019815401905581865260058452604086209081541690558085604051937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a48152a180f35b60249060405190630da9b01360e01b82526004820152fd5b6001600160a01b03915016151538612598565b839150612592565b60405163216caf0d60e01b81526004810191909152336024820152604490fd5b602490604051907f817cd6390000000000000000000000000000000000000000000000000000000082526004820152fd5b50346105b9576126d836612f19565b60405191602083019383851067ffffffffffffffff86111761270357610a4f94604052858452613177565b634e487b7160e01b600052604160045260246000fd5b50346105b95760203660031901126105b95760206106016004356136d3565b50346105b9576020806003193601126109b15760043590612757614328565b612760826136d3565b1561277d5760248260405190634a5541ef60e01b82526004820152fd5b9061278781613739565b6129be576127ab81600052600b6020526001600160a01b0360406000205416331490565b15612678576127b98161376a565b818452600b83526127cf60026040862001613668565b926001600160801b03918285511683821610156129a657838652600b825260ff604087205460f01c161561298e5792827ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce783612844878460409761283a8d9b6128ef9b8e511661370a565b9b0151169061370a565b92848852600b825287868120947f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa50865491600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84161788556003858216988915612974575b01948d169c858e6001600160801b0319819854161790556001600160a01b038094169b8c94600589526001818e892054169d8e98600b8c5220015416968588614384565b604080518b81526001600160801b0392831660208201529290911690820152606090a4604051848152a1823b612923578480f35b823b15610c2957608492859160405197889687956372eba20360e01b875260048701526024860152604485015260648401525af1612965575b81818080808480f35b61296e90612f7f565b3861295c565b60018101600160c81b60ff60c81b198254161790556128ab565b602484604051906339c6dc7360e21b82526004820152fd5b602484604051906322cad1af60e11b82526004820152fd5b6024906040519063fe19f19f60e01b82526004820152fd5b50346105b95760203660031901126105b9576001600160801b0360406020926001600160a01b03612a05612eed565b16815260028452205416604051908152f35b50346105b957610a4f612a2936612f19565b91612a3c612a37843361320d565b613106565b6132ec565b50346105b957806003193601126105b9576020600954604051908152f35b50346105b95760203660031901126105b957600435808252600b60205260ff600160408420015460d01c161561065d57612a9890613820565b90600582101561197c5760208215838115612ab9575b506040519015158152f35b600191501482612aae565b50346105b95760203660031901126105b95760043590818152600b60205260ff600160408320015460d01c1615610d2457602091604082828152600b85522060ff815460f01c1680612b52575b612b29575b50506001600160801b0360405191168152f35b612b4b92506001600160801b036002612b45920154169161376a565b9061370a565b3880612b16565b5060ff600182015460c81c1615612b11565b50346105b95760403660031901126105b957612b7e612eed565b602435906001600160a01b038080612b95856130a4565b16921691808314612c8957803314908115612c68575b5015612bfe57828452600760205260408420826001600160a01b0319825416179055612bd6836130a4565b167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258480a480f35b608460405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152fd5b9050845260086020526040842033855260205260ff60408520541638612bab565b608460405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152fd5b50346105b95760203660031901126105b95760206124426004356130c9565b50346105b957806003193601126105b957604051908060035491600183811c92818516948515612dca575b60209586861081146118915785885287949392918790821561186f575050600114612d7057505061180192500383613005565b90859250600382527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b858310612db2575050611801935082010138806117f3565b80548389018501528794508693909201918101612d9a565b93607f1693612d3d565b9050346109b15760203660031901126109b1576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361048857602092507f80ac58cd000000000000000000000000000000000000000000000000000000008114908115612e7b575b8115612e51575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501438612e4a565b7f5b5e139f0000000000000000000000000000000000000000000000000000000081149150612e43565b60005b838110612eb85750506000910152565b8181015183820152602001612ea8565b90602091612ee181518092818552858086019101612ea5565b601f01601f1916010190565b600435906001600160a01b038216820361107157565b602435906001600160a01b038216820361107157565b6060906003190112611071576001600160a01b0390600435828116810361107157916024359081168103611071579060443590565b9181601f840112156110715782359167ffffffffffffffff8311611071576020808501948460051b01011161107157565b67ffffffffffffffff811161270357604052565b610160810190811067ffffffffffffffff82111761270357604052565b610100810190811067ffffffffffffffff82111761270357604052565b6060810190811067ffffffffffffffff82111761270357604052565b6040810190811067ffffffffffffffff82111761270357604052565b90601f8019910116810190811067ffffffffffffffff82111761270357604052565b67ffffffffffffffff811161270357601f01601f191660200190565b604435906001600160801b038216820361107157565b1561306057565b606460405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152fd5b60005260056020526001600160a01b03604060002054166130c6811515613059565b90565b6130ec6108c08260005260056020526001600160a01b0360406000205416151590565b60005260076020526001600160a01b036040600020541690565b1561310d57565b608460405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f766564000000000000000000000000000000000000006064820152fd5b9061319b93929161318b612a37843361320d565b6131968383836132ec565b6134b7565b156131a257565b60405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b906001600160a01b038080613221846130a4565b16931691838314938415613254575b50831561323e575b50505090565b61324a919293506130c9565b1614388080613238565b909350600052600860205260406000208260005260205260ff604060002054169238613230565b1561328257565b608460405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152fd5b9061331592916132fb836130a4565b916001600160a01b0394859384809416968791161461327b565b169081158061341e576133278461369c565b159081613415575b508061340c575b6133f457918084926133767ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce79660209661336f856130a4565b161461327b565b60009382855260078652604085206001600160a01b031990818154169055818652600687526040862060001981540190558286526040862060018154019055838652600587528260408720918254161790557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6040519580a48152a1565b60248360405190630da9b01360e01b82526004820152fd5b50831515613336565b9050153861332f565b608460405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152fd5b3d156134b2573d9061349882613027565b916134a66040519384613005565b82523d6000602084013e565b606090565b9290803b1561364057613521916020916001600160a01b0394604051809581948293897f150b7a02000000000000000000000000000000000000000000000000000000009b8c86523360048701521660248501526044840152608060648401526084830190612ec8565b03916000968791165af1908290826135e0575b50506135ba57613542613487565b805190816135b55760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000161490565b909192506020813d8211613638575b816135fc60209383613005565b810103126109b15751907fffffffff00000000000000000000000000000000000000000000000000000000821682036105b95750903880613534565b3d91506135ef565b50505050600190565b6040519061365682612fcd565b60006040838281528260208201520152565b9060405161367581612fcd565b6040819360018154916001600160801b0392838116865260801c6020860152015416910152565b80600052600b60205260ff60016040600020015460d01c161561065d57600052600b60205260ff60016040600020015460d81c1690565b80600052600b60205260ff60016040600020015460d01c161561065d57600052600b60205260ff60016040600020015460c81c1690565b6001600160801b03918216908216039190821161372357565b634e487b7160e01b600052601160045260246000fd5b80600052600b60205260ff60016040600020015460d01c161561065d57600052600b60205260406000205460f81c90565b600090808252600b6020526040822091825464ffffffffff42818360c81c16116138185780600186015460a01c169182421015613802576137b79394955060a01c16809103904203614693565b90828152600b6020526001600160801b03926137dd846002604085200154168094614773565b9283116137ea5750501690565b60029350604092508152600b60205220015460801c90565b505050505060026001600160801b039101541690565b505091505090565b80600052600b602052604060002060ff600182015460c81c16600014613847575050600490565b805460f81c6138a0575460a01c64ffffffffff16421061389a5761386a8161376a565b90600052600b6020526001600160801b03806002604060002001541691161060001461389557600190565b600290565b50600090565b5050600390565b80600052600b6020526138c06002604060002001613668565b81600052600b602052604060002060ff600182015460c81c166000146138f357506001600160801b039150602001511690565b5460f81c61390557506130c69061376a565b6130c691506001600160801b03604081835116920151169061370a565b906001600160a01b036001541660206001600160a01b036060850151166024604051809481937fdcf844a700000000000000000000000000000000000000000000000000000000835260048301525afa801561415757600090614123575b6139a391506001600160801b0360408501511690602060e08601510151916144bc565b916001600160801b0383511660c082015190156140f95764ffffffffff815116602082019064ffffffffff825116908181116140b957505064ffffffffff604091511691019064ffffffffff825116908181101561407957505064ffffffffff8042169151169081811015614039575050600954926001600160801b0381511660405190613a3082612fcd565b815260006020820152600060408201526001600160a01b036060840151169060c08401519164ffffffffff6020840151169064ffffffffff604085015116906080870151151560a088015115159364ffffffffff6001600160a01b038a511697511660405197613a9f89612f93565b88526020880152604087015260608601526000608086015260a085015260c0840152600060e0840152600161010084015261012083015261014082015284600052600b60205260406000206001600160a01b038251166001600160a01b0319825416178155613b3664ffffffffff602084015116829064ffffffffff60a01b1964ffffffffff60a01b83549260a01b169116179055565b604082015181547eff0000000000000000000000000000000000000000000000000000000000006060850151151560f01b169078ffffffffffffffffffffffffffffffffffffffffffffffffff7dffffffffff000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000006080880151151560f81b169460c81b1691161717178155600181016001600160a01b0360a0840151166001600160a01b0319825416178155613c2d64ffffffffff60c085015116829064ffffffffff60a01b1964ffffffffff60a01b83549260a01b169116179055565b60e083015181546101008501516101208601517fffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff90921692151560c81b79ff00000000000000000000000000000000000000000000000000169290921791151560d01b7aff0000000000000000000000000000000000000000000000000000169190911790151560d81b7bff00000000000000000000000000000000000000000000000000000016179055610140909101518051602082015160801b6001600160801b03199081166001600160801b03928316176002850155926040906003019201511682825416179055600185016009556001600160a01b0360608401511660005260026020526001600160801b0380604060002054168160208501511601166001600160a01b036060850151166000526040600020918254161790556001600160a01b036020830151168015613ff557613da8613da28660005260056020526001600160a01b0360406000205416151590565b156142dd565b613db18561369c565b1580613fec575b80613fe4575b613fcc5760207ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce791613e09613da28860005260056020526001600160a01b0360406000205416151590565b806000526006825260406000206001815401905586600052600582526040600020816001600160a01b0319825416179055866040519160007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4868152a1613e996001600160a01b036060840151166001600160801b03808451168160208601511601169030903390614163565b6001600160801b0360408201511680613f9d575b506001600160a01b038251167f075861cbceafeb777e8f15f357121b08f6f3adba387d599bb7b5278ca6192df5610160866001600160a01b0360208701511694613f946001600160a01b03606089015116976080810151151560a0820151151590613f5e6001600160a01b0360e060c08601519501515116956040519788523360208901526040880190604090816001600160801b0391828151168552826020820151166020860152015116910152565b60a086015260c0850152805164ffffffffff90811660e08601526020820151811661010086015260409091015116610120840152565b610140820152a4565b613fc6906001600160a01b036060850151166001600160a01b0360e08601515116903390614163565b38613ead565b60248560405190630da9b01360e01b82526004820152fd5b506000613dbe565b50801515613db8565b606460405162461bcd60e51b815260206004820152602060248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152fd5b6040517f210aec0e00000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b6040517f9fee269100000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b6040517f4c23297000000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b60046040517f6095d3bc000000000000000000000000000000000000000000000000000000008152fd5b6020823d60201161414f575b8161413c60209383613005565b810103126105b957506139a39051613980565b3d915061412f565b6040513d6000823e3d90fd5b9290604051927f23b872dd0000000000000000000000000000000000000000000000000000000060208501526001600160a01b03809216602485015216604483015260648201526064815260a081019181831067ffffffffffffffff841117612703576141d2926040526141d4565b565b6001600160a01b0316906142346040516141ed81612fe9565b6020938482527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564858301526000808587829751910182855af161422e613487565b916145fb565b8051918215918483156142b9575b50505090501561424f5750565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b9193818094500103126109b1578201519081151582036105b9575080388084614242565b156142e457565b606460405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152fd5b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361435a57565b60046040517fa1c0d6e5000000000000000000000000000000000000000000000000000000008152fd5b916001600160a01b03604051927fa9059cbb000000000000000000000000000000000000000000000000000000006020850152166024830152604482015260448152608081019181831067ffffffffffffffff841117612703576141d2926040526141d4565b6130c6906143f7816138a7565b90600052600b60205260026040600020015460801c9061370a565b91908110156144225760051b0190565b634e487b7160e01b600052603260045260246000fd5b9190916001600160801b038080941691160191821161372357565b60009080825260056020526001600160a01b038060408420541692833314938415614498575b5050821561448657505090565b90915061449333926130c9565b161490565b60ff9294509060409181526008602052818120338252602052205416913880614479565b9092916144c7613649565b936001600160801b03928381169182156145d35767016345785d8a000080821161459c57808511614565575061451185614502819386614773565b16946020890195865284614773565b169184614528604089019480865282875116614438565b16101561454f5761454184918261454a9551169061370a565b9151169061370a565b168252565b634e487b7160e01b600052600160045260246000fd5b84604491604051917f4fea5c1a00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b60449250604051917f47152d6700000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b505050505090506040516145e681612fcd565b60008152600060208201526000604082015290565b9192901561465c575081511561460f575090565b3b156146185790565b606460405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b82519091501561466f5750805190602001fd5b6104fa9060405191829162461bcd60e51b8352602060048401526024830190612ec8565b670de0b6b3a764000091600019838309928083029283808610950394808603951461474f578285101561471357908291096001821901821680920460028082600302188083028203028083028203028083028203028083028203028083028203028092029003029360018380600003040190848311900302920304170290565b82606492604051927f63a05778000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b50508092501561475d570490565b634e487b7160e01b600052601260045260246000fd5b9091906000198382098382029182808310920391808303921461481157670de0b6b3a764000090818310156147da57947faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066994950990828211900360ee1b910360121c170290565b60449086604051917f5173648d00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050670de0b6b3a76400009004915056fea164736f6c6343000815000a"; bytes public constant BYTECODE_NFT_DESCRIPTOR = hex"6080806040523461001757615db990816200001d8239f35b600080fdfe6080604052600436101561001257600080fd5b60003560e01c63e9dc63751461002757600080fd5b346142f85760403660031901126142f8576001600160a01b0360043516600435036142f857610056608061486e565b60006080819052606060a081905260c082905260e0819052610120819052610140819052610160819052610180919091526101a0526004356001600160a01b03166101008190526100a690614c58565b61012052610100516040517feac8f5b80000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa908115614305576000916147dd575b506001600160a01b03610117911680608052615669565b60a052610100516040517fa80fc0710000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa8015614305576fffffffffffffffffffffffffffffffff916000916147be575b501660c052610100516040517fad35efd40000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa801561430557600090614781575b6101e59150615889565b61014052610100516040517f4869e12d0000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa90811561430557600091614752575b5060c0516fffffffffffffffffffffffffffffffff16801561473c576fffffffffffffffffffffffffffffffff612710819302160416610100608001526102876004356153c7565b610120608001526040514660208201526bffffffffffffffffffffffff1960043560601b16604082015260243560548201526054815280608081011067ffffffffffffffff60808301111761431157608081016040526020815191012061041a602963ffffffff61032e6103078261016861ffff8860101c160616614b08565b91601e604660ff6103248460146050848d60081c16060116614b08565b9816060116614b08565b6040519485927f68736c2800000000000000000000000000000000000000000000000000000000602085015261036e815180926020602488019101614826565b83017f2c0000000000000000000000000000000000000000000000000000000000000060248201526103aa825180936020602585019101614826565b017f252c00000000000000000000000000000000000000000000000000000000000060258201526103e5825180936020602785019101614826565b017f252900000000000000000000000000000000000000000000000000000000000060278201520360098101845201826148df565b6104526fffffffffffffffffffffffffffffffff6040608001511660ff61044b6001600160a01b03608051166155dc565b1690614e89565b6104666001600160a01b0360805116614c58565b60a051610100516040517fbc2be1be0000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa80156143055760249160009161471d575b5060206001600160a01b03608080015116604051938480927f9067b677000000000000000000000000000000000000000000000000000000008252823560048301525afa801561430557610528926000916146ee575b5064ffffffffff80911691166151d5565b61012051610180519092916105b2602161054f6064610548818706615744565b9504614b08565b6040519481610568879351809260208087019101614826565b820161057d8251809360208085019101614826565b017f250000000000000000000000000000000000000000000000000000000000000060208201520360018101855201836148df565b610100608001519260c060800151956101206080015197604051996105d68b61486e565b8a5260208a015260408901526060880152608087015260a086015260c085015260e0840152610100830152610120820152604051806101c081011067ffffffffffffffff6101c083011117614311576101c0810160405260608152600060208201526000604082015260608082015260006080820152606060a0820152600060c0820152600060e08201526060610100820152600061012082015260006101408201526060610160820152600061018082015260006101a082015260a08201516106a660c0840151845190615a7a565b906109b361015c604051926106ba846148c3565b600884527f50726f677265737300000000000000000000000000000000000000000000000060208501526107236040516106f38161488b565b60009052855160208701207fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4701490565b156146e6576090945b61073586614b08565b916040519586938493661e339034b21e9160c91b60208601526109818351958692610767846027840160208901614826565b6d11103334b6361e9111b33333111f60911b602785840101526c1e3932b1ba103bb4b23a341e9160991b603585840101526107ae8551809660206042888701019101614826565b7f22206865696768743d22313030222066696c6c2d6f7061636974793d222e3033828501860160428101919091527f222072783d223135222072793d22313522207374726f6b653d2223666666222060628201527f7374726f6b652d6f7061636974793d222e3122207374726f6b652d77696474686082820152651e911a11179f60d11b60a28201527f3c7465787420783d2232302220793d2233342220666f6e742d66616d696c793d60a88201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f7370616365222060c8820152703337b73a16b9b4bd329e911919383c111f60791b60e88201528651966108b491889160f990910190602001614826565b661e17ba32bc3a1f60c91b8285018601870160f98101919091527f3c7465787420783d2232302220793d2237322220666f6e742d66616d696c793d6101008201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f73706163652220610120820152703337b73a16b9b4bd329e91191b383c111f60791b61014082015287519761094f91899161015190910190602001614826565b661e17ba32bc3a1f60c91b6101518888888887010101010152602061015888888885519c8d9701010101019101614826565b631e17b39f60e11b90860190910190910190910190910161015881019190915281900361013c810190915201826148df565b6101008301526101208201526028610100830151604051906109d48261488b565b60008252610c7a61015c604051926109eb846148c3565b600684527f53746174757300000000000000000000000000000000000000000000000000006020850152610a1e84615cba565b610a2782615d37565b808211156146de5750945b610a3d878701614b08565b91604051958693661e339034b21e9160c91b60208601528151610a67816027880160208601614826565b85016d11103334b6361e9111b33333111f60911b60278201526c1e3932b1ba103bb4b23a341e9160991b6035820152610aaa825180936020604285019101614826565b017f22206865696768743d22313030222066696c6c2d6f7061636974793d222e303360428201527f222072783d223135222072793d22313522207374726f6b653d2223666666222060628201527f7374726f6b652d6f7061636974793d222e3122207374726f6b652d77696474686082820152651e911a11179f60d11b60a28201527f3c7465787420783d2232302220793d2233342220666f6e742d66616d696c793d60a88201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f7370616365222060c8820152703337b73a16b9b4bd329e911919383c111f60791b60e8820152610ba682518093602060f985019101614826565b01661e17ba32bc3a1f60c91b60f98201527f3c7465787420783d2232302220793d2237322220666f6e742d66616d696c793d6101008201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f73706163652220610120820152703337b73a16b9b4bd329e91191b383c111f60791b610140820152610c3582518093602061015185019101614826565b01661e17ba32bc3a1f60c91b610151820152610c5c82518093602061015885019101614826565b01631e17b39f60e11b6101588201520361013c8101845201826148df565b610160840152016101808201526028602083015160405190610c9b8261488b565b60008252610ce561015c60405192610cb2846148c3565b600684527f416d6f756e7400000000000000000000000000000000000000000000000000006020850152610a1e84615cba565b835201602082015261102060808301516030604051610d038161488b565b60008152610faa61015c60405194610d1a866148c3565b600886527f4475726174696f6e0000000000000000000000000000000000000000000000006020870152610d4d86615cba565b610d5682615d37565b808211156146d65750935b610d6d60288601614b08565b91604051978893661e339034b21e9160c91b60208601528151610d97816027880160208601614826565b85016d11103334b6361e9111b33333111f60911b60278201526c1e3932b1ba103bb4b23a341e9160991b6035820152610dda825180936020604285019101614826565b017f22206865696768743d22313030222066696c6c2d6f7061636974793d222e303360428201527f222072783d223135222072793d22313522207374726f6b653d2223666666222060628201527f7374726f6b652d6f7061636974793d222e3122207374726f6b652d77696474686082820152651e911a11179f60d11b60a28201527f3c7465787420783d2232302220793d2233342220666f6e742d66616d696c793d60a88201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f7370616365222060c8820152703337b73a16b9b4bd329e911919383c111f60791b60e8820152610ed682518093602060f985019101614826565b01661e17ba32bc3a1f60c91b60f98201527f3c7465787420783d2232302220793d2237322220666f6e742d66616d696c793d6101008201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f73706163652220610120820152703337b73a16b9b4bd329e91191b383c111f60791b610140820152610f6582518093602061015185019101614826565b01661e17ba32bc3a1f60c91b610151820152610f8c82518093602061015885019101614826565b01631e17b39f60e11b6101588201520361013c8101865201846148df565b8260a08601526028810160c0860152602085015190610120860151809161018088015192839185010101605881016080890152605719906103e8030160011c8061014089015201601081016101a088015201602081016040870152010160e0840152610100830151610160840151845191614e1f565b6060820152604051908161010081011067ffffffffffffffff6101008401111761431157610100820160405260c782527f3c726563742077696474683d223130302522206865696768743d22313030252260208301527f2066696c7465723d2275726c28234e6f69736529222f3e3c7265637420783d2260408301527f37302220793d223730222077696474683d2238363022206865696768743d223860608301527f3630222066696c6c3d2223666666222066696c6c2d6f7061636974793d222e3060808301527f33222072783d223435222072793d22343522207374726f6b653d22236666662260a08301527f207374726f6b652d6f7061636974793d222e3122207374726f6b652d7769647460c08301527f683d2234222f3e0000000000000000000000000000000000000000000000000060e083015282519161010084015191606081015194604051611176816148a7565b603381527f3c636972636c652069643d22476c6f772220723d22353030222066696c6c3d2260208201527f75726c282352616469616c476c6f7729222f3e000000000000000000000000006040820152604051966111d38861486e565b61011c88527f3c66696c7465722069643d224e6f697365223e3c6665466c6f6f6420783d223060208901527f2220793d2230222077696474683d223130302522206865696768743d2231303060408901527f252220666c6f6f642d636f6c6f723d2268736c283233302c3231252c3131252960608901527f2220666c6f6f642d6f7061636974793d22312220726573756c743d22666c6f6f60808901527f6446696c6c222f3e3c666554757262756c656e6365206261736546726571756560a08901527f6e63793d222e3422206e756d4f6374617665733d22332220726573756c743d2260c08901527f4e6f6973652220747970653d226672616374616c4e6f697365222f3e3c66654260e08901527f6c656e6420696e3d224e6f6973652220696e323d22666c6f6f6446696c6c22206101008901527f6d6f64653d22736f66742d6c69676874222f3e3c2f66696c7465723e0000000061012089015260405197886103a081011067ffffffffffffffff6103a08b011117614311576103a0890160405261037b89527f3c706174682069643d224c6f676f222066696c6c3d2223666666222066696c6c60208a01527f2d6f7061636974793d222e312220643d226d3133332e3535392c3132342e303360408a01527f34632d2e3031332c322e3431322d312e3035392c342e3834382d322e3932332c60608a01527f362e3430322d322e3535382c312e3831392d352e3136382c332e3433392d372e60808a01527f3838382c342e3939362d31342e34342c382e3236322d33312e3034372c31322e60a08a01527f3536352d34372e3637342c31322e3536392d382e3835382e3033362d31372e3860c08a01527f33382d312e3237322d32362e3332382d332e3636332d392e3830362d322e373660e08a01527f362d31392e3038372d372e3131332d32372e3536322d31322e3737382d31332e6101008a01527f3834322d382e3032352c392e3436382d32382e3630362c31362e3135332d33356101208a01527f2e323635683063322e3033352d312e3833382c342e3235322d332e3534362c366101408a01527f2e3436332d352e323234683063362e3432392d352e3635352c31362e3231382d6101608a01527f322e3833352c32302e3335382c342e31372c342e3134332c352e3035372c382e6101808a01527f3831362c392e3634392c31332e39322c31332e373334682e30333763352e37336101a08a01527f362c362e3436312c31352e3335372d322e3235332c392e33382d382e34382c306101c08a01527f2c302d332e3531352d332e3531352d332e3531352d332e3531352d31312e34396101e08a01527f2d31312e3437382d35322e3635362d35322e3636342d36342e3833372d36342e6102008a01527f3833376c2e3034392d2e303337632d312e3732352d312e3630362d322e3731396102208a01527f2d332e3834372d322e3735312d362e3230346830632d2e3034362d322e3337356102408a01527f2c312e3036322d342e3538322c322e3732362d362e32323968306c2e3138352d6102608a01527f2e3134386830632e3039392d2e3036322c2e3232322d2e3134382c2e33372d2e6102808a01527f323539683063322e30362d312e3336322c332e3935312d322e3632312c362e306102a08a01527f34342d332e3834324335372e3736332d332e3437332c39372e37362d322e33346102c08a01527f312c3132382e3633372c31382e3333326331362e3637312c392e3934362d32366102e08a01527f2e3334342c35342e3831332d33382e3635312c34302e3139392d362e3239392d6103008a01527f362e3039362d31382e3036332d31372e3734332d31392e3636382d31382e38316103208a01527f312d362e3031362d342e3034372d31332e3036312c342e3737362d372e3735326103408a01527f2c392e3735316c36382e3235342c36382e33373163312e3732342c312e3630316103608a01527f2c322e3731342c332e38342c322e3733382c362e3139325a222f3e00000000006103808a0152604051978860a081011067ffffffffffffffff60a08b01111761431157611cb1611d129160a08b0160405260758b527f3c706174682069643d22466c6f6174696e6754657874222066696c6c3d226e6f60208c01527f6e652220643d224d31323520343568373530733830203020383020383076373560408c01527f307330203830202d3830203830682d373530732d38302030202d3830202d383060608c01527f762d3735307330202d3830203830202d3830222f3e000000000000000000000060808c0152611868615a41565b906040517f3c72616469616c4772616469656e742069643d2252616469616c476c6f77223e6020820152611d0d60d87f3c73746f70206f66667365743d223025222073746f702d636f6c6f723d22000093846040850152805161199a60b88660208501936118da81605e840187614826565b8101997f222073746f702d6f7061636974793d222e36222f3e0000000000000000000000605e8c01527f3c73746f70206f66667365743d2231303025222073746f702d636f6c6f723d229a8b607382015261193f825180936020609385019101614826565b017f222073746f702d6f7061636974793d2230222f3e00000000000000000000000060938201527f3c2f72616469616c4772616469656e743e00000000000000000000000000000060a78201520360988101885201866148df565b6119a2615a41565b90604051967f3c6c696e6561724772616469656e742069643d2253616e64546f70222078313d60208901527f223025222079313d223025223e000000000000000000000000000000000000006040890152604d8801528251611a0881606b8a0184614826565b8701917f222f3e00000000000000000000000000000000000000000000000000000000009283606b82015289606e820152611a4d825180936020608e85019101614826565b019082608e830152611a9160a2897f3c2f6c696e6561724772616469656e743e0000000000000000000000000000009485609182015203608281018b5201896148df565b611bd7610108611a9f615a41565b6040519b8c917f3c6c696e6561724772616469656e742069643d2253616e64426f74746f6d222060208401527f78313d2231303025222079313d2231303025223e00000000000000000000000060408401527f3c73746f70206f66667365743d22313025222073746f702d636f6c6f723d22006054840152611b2b815180926020607387019101614826565b8201908760738301526076820152875190611b4a826096830188614826565b018660968201527f3c616e696d617465206174747269627574654e616d653d22783122206475723d60998201527f2236732220726570656174436f756e743d22696e646566696e6974652220766160b98201527f6c7565733d223330253b3630253b313230253b3630253b3330253b222f3e000060d98201528560f78201520360e881018c52018a6148df565b611bdf615a41565b906040519a8b957f3c6c696e6561724772616469656e742069643d22486f7572676c61737353747260208801527f6f6b6522206772616469656e745472616e73666f726d3d22726f74617465283960408801527f302922206772616469656e74556e6974733d227573657253706163654f6e557360608801527f65223e000000000000000000000000000000000000000000000000000000000060808801527f3c73746f70206f66667365743d22353025222073746f702d636f6c6f723d2200608388015251809260a2880190614826565b84018360a28201527f3c73746f70206f66667365743d22383025222073746f702d636f6c6f723d220060a5820152611cf382518093602060c485019101614826565b019160c483015260c78201520360b88101875201856148df565b614e1f565b92611d32611d1e615817565b896020815191012090602081519101201490565b9788156146ad575b506040518060c081011067ffffffffffffffff60c0830111176143115760c08101604052609081527f3c7061746820643d224d2035302c3336302061203330302c333030203020312c60208201527f31203630302c302061203330302c333030203020312c31202d3630302c30222060408201527f66696c6c3d2223666666222066696c6c2d6f7061636974793d222e303222207360608201527f74726f6b653d2275726c2823486f7572676c6173735374726f6b65292220737460808201527f726f6b652d77696474683d2234222f3e0000000000000000000000000000000060a082015260405193846102c081011067ffffffffffffffff6102c087011117614311576102c0850160405261029885527f3c7061746820643d226d3536362c3136312e323031762d35332e39323463302d60208601527f31392e3338322d32322e3531332d33372e3536332d36332e3339382d35312e3160408601527f39382d34302e3735362d31332e3539322d39342e3934362d32312e3037392d3160608601527f35322e3538372d32312e303739732d3131312e3833382c372e3438372d31353260808601527f2e3630322c32312e303739632d34302e3839332c31332e3633362d36332e343160a08601527f332c33312e3831362d36332e3431332c35312e3139387635332e39323463302c60c08601527f31372e3138312c31372e3730342c33332e3432372c35302e3232332c34362e3360e08601527f3934763238342e383039632d33322e3531392c31322e39362d35302e3232332c6101008601527f32392e3230362d35302e3232332c34362e3339347635332e39323463302c31396101208601527f2e3338322c32322e35322c33372e3536332c36332e3431332c35312e3139382c6101408601527f34302e3736332c31332e3539322c39342e3935342c32312e3037392c3135322e6101608601527f3630322c32312e303739733131312e3833312d372e3438372c3135322e3538376101808601527f2d32312e3037396334302e3838362d31332e3633362c36332e3339382d33312e6101a08601527f3831362c36332e3339382d35312e313938762d35332e39323463302d31372e316101c08601527f39362d31372e3730342d33332e3433352d35302e3232332d34362e34303156326101e08601527f30372e3630336333322e3531392d31322e3936372c35302e3232332d32392e326102008601527f30362c35302e3232332d34362e3430315a6d2d3334372e3436322c35372e37396102208601527f336c3133302e3935392c3133312e3032372d3133302e3935392c3133312e30316102408601527f33563231382e3939345a6d3236322e3932342e303232763236322e3031386c2d6102608601527f3133302e3933372d3133312e3030362c3133302e3933372d3133312e3031335a6102808601527f222066696c6c3d2223313631383232223e3c2f706174683e00000000000000006102a0860152896000146144885760405161218c8161488b565b60008152995b1561432757604051806101e081011067ffffffffffffffff6101e083011117614311576101e081016040526101b181527f3c7061746820643d226d3438312e34362c3438312e35347638312e3031632d3260208201527f2e33352e37372d342e38322c312e35312d372e33392c322e32332d33302e332c60408201527f382e35342d37342e36352c31332e39322d3132342e30362c31332e39322d353360608201527f2e362c302d3130312e32342d362e33332d3133312e34372d31362e3136762d3860808201527f316c34362e332d34362e3331683137302e33336c34362e32392c34362e33315a60a08201527f222066696c6c3d2275726c282353616e64426f74746f6d29222f3e3c7061746860c08201527f20643d226d3433352e31372c3433352e323363302c312e31372d2e34362c322e60e08201527f33322d312e33332c332e34342d372e31312c392e30382d34312e39332c31352e6101008201527f39382d38332e38312c31352e3938732d37362e372d362e392d38332e38322d316101208201527f352e3938632d2e38372d312e31322d312e33332d322e32372d312e33332d332e6101408201527f3434762d2e30346c382e33342d382e33352e30312d2e30316331332e37322d366101608201527f2e35312c34322e39352d31312e30322c37362e382d31312e30327336322e39376101808201527f2c342e34392c37362e37322c31316c382e34322c382e34325a222066696c6c3d6101a08201527f2275726c282353616e64546f7029222f3e0000000000000000000000000000006101c0820152995b60405196876107e081011067ffffffffffffffff6107e08a01111761431157613b9f9c612e5a6036602d9960819f97631e17b39f60e11b8d7f3c2f646566733e000000000000000000000000000000000000000000000000009a612f2b9f6107e0016040526107a782527f3c672066696c6c3d226e6f6e6522207374726f6b653d2275726c2823486f757260208301527f676c6173735374726f6b652922207374726f6b652d6c696e656361703d22726f60408301527f756e6422207374726f6b652d6d697465726c696d69743d22313022207374726f60608301527f6b652d77696474683d2234223e3c7061746820643d226d3536352e3634312c3160808301527f30372e323863302c392e3533372d352e35362c31382e3632392d31352e36373660a08301527f2c32362e393733682d2e303233632d392e3230342c372e3539362d32322e313960c08301527f342c31342e3536322d33382e3139372c32302e3539322d33392e3530342c313460e08301527f2e3933362d39372e3332352c32342e3335352d3136312e3733332c32342e33356101008301527f352d39302e34382c302d3136372e3934382d31382e3538322d3139392e3935336101208301527f2d34342e393438682d2e303233632d31302e3131352d382e3334342d31352e366101408301527f37362d31372e3433372d31352e3637362d32362e3937332c302d33392e3733356101608301527f2c39362e3535342d37312e3932312c3231352e3635322d37312e3932317332316101808301527f352e3632392c33322e3138352c3231352e3632392c37312e3932315a222f3e3c6101a08301527f7061746820643d226d3133342e33362c3136312e32303363302c33392e3733356101c08301527f2c39362e3535342c37312e3932312c3231352e3635322c37312e3932317332316101e08301527f352e3632392d33322e3138362c3231352e3632392d37312e393231222f3e3c6c6102008301527f696e652078313d223133342e3336222079313d223136312e323033222078323d6102208301527f223133342e3336222079323d223130372e3238222f3e3c6c696e652078313d226102408301527f3536352e3634222079313d223136312e323033222078323d223536352e3634226102608301527f2079323d223130372e3238222f3e3c6c696e652078313d223138342e353834226102808301527f2079313d223230362e383233222078323d223138342e353835222079323d22356102a08301527f33372e353739222f3e3c6c696e652078313d223231382e313831222079313d226102c08301527f3231382e313138222078323d223231382e313831222079323d223536322e35336102e08301527f37222f3e3c6c696e652078313d223438312e383138222079313d223231382e316103008301527f3432222078323d223438312e383139222079323d223536322e343238222f3e3c6103208301527f6c696e652078313d223531352e343135222079313d223230372e3335322220786103408301527f323d223531352e343136222079323d223533372e353739222f3e3c70617468206103608301527f643d226d3138342e35382c3533372e353863302c352e34352c342e32372c31306103808301527f2e36352c31322e30332c31352e3432682e303263352e35312c332e33392c31326103a08301527f2e37392c362e35352c32312e35352c392e34322c33302e32312c392e392c37386103c08301527f2e30322c31362e32382c3133312e38332c31362e32382c34392e34312c302c396103e08301527f332e37362d352e33382c3132342e30362d31332e39322c322e372d2e37362c356104008301527f2e32392d312e35342c372e37352d322e33352c382e37372d322e38372c31362e6104208301527f30352d362e30342c32312e35362d392e3433683063372e37362d342e37372c316104408301527f322e30342d392e39372c31322e30342d31352e3432222f3e3c7061746820643d6104608301527f226d3138342e3538322c3439322e363536632d33312e3335342c31322e3438356104808301527f2d35302e3232332c32382e35382d35302e3232332c34362e3134322c302c392e6104a08301527f3533362c352e3536342c31382e3632372c31352e3637372c32362e393639682e6104c08301527f30323263382e3530332c372e3030352c32302e3231332c31332e3436332c33346104e08301527f2e3532342c31392e3135392c392e3939392c332e3939312c32312e3236392c376105008301527f2e3630392c33332e3539372c31302e3738382c33362e34352c392e3430372c386105208301527f322e3138312c31352e3030322c3133312e3833352c31352e3030327339352e336105408301527f36332d352e3539352c3133312e3830372d31352e3030326331302e3834372d326105608301527f2e37392c32302e3836372d352e3932362c32392e3932342d392e3334392c312e6105808301527f3234342d2e3436372c322e3437332d2e3934322c332e3637332d312e3432342c6105a08301527f31342e3332362d352e3639362c32362e3033352d31322e3136312c33342e35326105c08301527f342d31392e313733682e3032326331302e3131342d382e3334322c31352e36376105e08301527f372d31372e3433332c31352e3637372d32362e3936392c302d31372e3536322d6106008301527f31382e3836392d33332e3636352d35302e3232332d34362e3135222f3e3c70616106208301527f746820643d226d3133342e33362c3539322e373263302c33392e3733352c39366106408301527f2e3535342c37312e3932312c3231352e3635322c37312e393231733231352e366106608301527f32392d33322e3138362c3231352e3632392d37312e393231222f3e3c6c696e656106808301527f2078313d223133342e3336222079313d223539322e3732222078323d223133346106a08301527f2e3336222079323d223533382e373937222f3e3c6c696e652078313d223536356106c08301527f2e3634222079313d223539322e3732222078323d223536352e3634222079323d6106e08301527f223533382e373937222f3e3c706f6c796c696e6520706f696e74733d223438316107008301527f2e383232203438312e393031203438312e373938203438312e383737203438316107208301527f2e373735203438312e383534203335302e303135203335302e303236203231386107408301527f2e313835203231382e313239222f3e3c706f6c796c696e6520706f696e74733d6107608301527f223231382e313835203438312e393031203231382e323331203438312e3835346107808301527f203335302e303135203335302e303236203438312e383232203231382e3135326107a08301527f222f3e3c2f673e000000000000000000000000000000000000000000000000006107c0830152604051998a957f3c672069643d22486f7572676c617373223e00000000000000000000000000006020880152603295612df68151809260208a8c019101614826565b8701612e0b8251809360208a85019101614826565b01612e1f8251809360208985019101614826565b01612e338251809360208885019101614826565b01612e478251809360208785019101614826565b01918201520360168101865201846148df565b6040519e8f9788977f3c646566733e000000000000000000000000000000000000000000000000000060208a0152612e9f6026998260208c9451948593019101614826565b8901612eb48251809360208c85019101614826565b01612ec88251809360208b85019101614826565b01612edc8251809360208a85019101614826565b01612ef08251809360208985019101614826565b01612f048251809360208885019101614826565b01612f188251809360208785019101614826565b019182015203600d8101895201876148df565b6137be604c60e08301516101208401519361351a61314d6060604084015193015196612f578186615985565b9461314861012b604051612f6a816148c3565b600581527f2d3130302500000000000000000000000000000000000000000000000000000060208201526040519889917f3c74657874506174682073746172744f66667365743d220000000000000000006020840152612fd4815180926020603787019101614826565b7f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666683820160378101919091527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e00000000000000000061010982015282519261311891849161012090910190602001614826565b6a1e17ba32bc3a2830ba341f60a91b90830190910161012081019190915281900361010b810190915201876148df565b615985565b9561332c61012b604051613160816148c3565b600281527f30250000000000000000000000000000000000000000000000000000000000006020820152604051998a917f3c74657874506174682073746172744f66667365743d2200000000000000000060208401526131ca815180926020603787019101614826565b82017f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666660378201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e00000000000000000061010982015261330782518093602061012085019101614826565b016a1e17ba32bc3a2830ba341f60a91b6101208201520361010b81018a5201886148df565b61333681846159ed565b9261351561012b604051613349816148c3565b600481527f2d3530250000000000000000000000000000000000000000000000000000000060208201526040519687917f3c74657874506174682073746172744f66667365743d2200000000000000000060208401526133b3815180926020603787019101614826565b82017f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666660378201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e0000000000000000006101098201526134f082518093602061012085019101614826565b016a1e17ba32bc3a2830ba341f60a91b6101208201520361010b8101875201856148df565b6159ed565b906136f961012b60405161352d816148c3565b600381527f353025000000000000000000000000000000000000000000000000000000000060208201526040519485917f3c74657874506174682073746172744f66667365743d220000000000000000006020840152613597815180926020603787019101614826565b82017f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666660378201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e0000000000000000006101098201526136d482518093602061012085019101614826565b016a1e17ba32bc3a2830ba341f60a91b6101208201520361010b8101855201836148df565b6040519586937f3c7465787420746578742d72656e646572696e673d226f7074696d697a65537060208601527f656564223e000000000000000000000000000000000000000000000000000000604086015261375f815180926020604589019101614826565b8401613775825180936020604585019101614826565b0161378a825180936020604585019101614826565b0161379f825180936020604585019101614826565b01661e17ba32bc3a1f60c91b604582015203602c8101845201826148df565b613a9e61019a6101408401516101a0850151906137ff6137f96137f36137ed60e060408b01519a015194614b08565b94614b08565b97614b08565b91614b08565b956040519687937f3c75736520687265663d2223476c6f77222066696c6c2d6f7061636974793d2260208601527f2e39222f3e00000000000000000000000000000000000000000000000000000060408601527f3c75736520687265663d2223476c6f772220783d22313030302220793d22313060458601527f3030222066696c6c2d6f7061636974793d222e39222f3e00000000000000000060658601527f3c75736520687265663d22234c6f676f2220783d223137302220793d22313730607c8601527f22207472616e73666f726d3d227363616c65282e3629222f3e3c757365206872609c8601527f65663d2223486f7572676c6173732220783d223135302220793d22393022207460bc8601527f72616e73666f726d3d22726f746174652831302922207472616e73666f726d2d60dc8601527f6f726967696e3d2235303020353030222f3e000000000000000000000000000060fc8601527f3c75736520687265663d222350726f67726573732220783d220000000000000061010e8601526101279061399a815180926020858a019101614826565b8501937f2220793d22373930222f3e00000000000000000000000000000000000000000080948180948801527f3c75736520687265663d22235374617475732220783d2200000000000000000061013288015261014996613a048251809360208b85019101614826565b01958601527f3c75736520687265663d2223416d6f756e742220783d2200000000000000000061015486015261016b94613a478251809360208985019101614826565b01938401527f3c75736520687265663d22234475726174696f6e2220783d220000000000000061017684015261018f92613a8a8251809360208785019101614826565b01918201520361017a8101855201836148df565b6040519586937f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323060208601527f30302f737667222077696474683d223130303022206865696768743d2231303060408601527f30222076696577426f783d2230203020313030302031303030223e00000000006060860152613b2a815180926020607b89019101614826565b8401613b40825180936020607b85019101614826565b01613b55825180936020607b85019101614826565b01613b6a825180936020607b85019101614826565b017f3c2f7376673e0000000000000000000000000000000000000000000000000000607b8201520360618101845201826148df565b6101605260a051610100516040517fb971302a0000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa908115614305576000916142ba575b6142b661424f614154614245609487613d3b6089613c198a614c58565b9260c0608001516040519485927f5b7b2274726169745f74797065223a224173736574222c2276616c7565223a226020850152613c60815180926020604088019101614826565b8301907f227d2c7b2274726169745f74797065223a2253656e646572222c2276616c756560408301527f223a22000000000000000000000000000000000000000000000000000000000091826060820152613cc5825180936020606385019101614826565b01907f227d2c7b2274726169745f74797065223a22537461747573222c2276616c756560638301526083820152613d06825180936020608685019101614826565b017f227d5d000000000000000000000000000000000000000000000000000000000060868201520360698101845201826148df565b6101a05160a05161403e61017e613d53602435614b08565b9360a060800151613d6e6001600160a01b0360805116614c58565b90604051968793613f2b60208601987f54686973204e465420726570726573656e74732061207061796d656e742073748a527f7265616d20696e2061205361626c696572205632200000000000000000000000604088015282516020840190613ddb8160558b0184614826565b8801947f20636f6e74726163742e20546865206f776e6572206f662074686973204e465460558701527f2063616e207769746864726177207468652073747265616d656420617373657460758701527f732c207768696368206172652064656e6f6d696e6174656420696e2000000000609587015282516020840196613e658260b183018a614826565b017f2e5c6e5c6e2d2053747265616d2049443a20000000000000000000000000000060b1820152613ea082518093602060c385019101614826565b01613ed97f5c6e2d2000000000000000000000000000000000000000000000000000000000958660c384015251809360c7840190614826565b01947f20416464726573733a2000000000000000000000000000000000000000000000958660c7820152613f1782518093602060d185019101614826565b019260d184015251809360d5840190614826565b019060d5820152613f4682518093602060df85019101614826565b017f5c6e5c6e0000000000000000000000000000000000000000000000000000000060df8201527fe29aa0efb88f205741524e494e473a205472616e7366657272696e672074686560e38201527f204e4654206d616b657320746865206e6577206f776e657220746865207265636101038201527f697069656e74206f66207468652073747265616d2e205468652066756e6473206101238201527f617265206e6f74206175746f6d61746963616c6c792077697468647261776e206101438201527f666f72207468652070726576696f757320726563697069656e742e00000000006101638201520361015e8101855201836148df565b6101a051906141af614051602435614b08565b916140d0602d604051809560208201976a029b0b13634b2b9102b19160ad1b8952614086815180926020602b87019101614826565b82017f2023000000000000000000000000000000000000000000000000000000000000602b8201526140c18251809360208785019101614826565b0103600d8101865201846148df565b610160516140dd90614994565b94604051998a977f7b2261747472696275746573223a00000000000000000000000000000000000060208a015261411e815180926020602e8d019101614826565b8801917f2c226465736372697074696f6e223a2200000000000000000000000000000000602e840152518093603e840190614826565b01917f222c2265787465726e616c5f75726c223a2268747470733a2f2f7361626c6965603e8401527f722e636f6d222c226e616d65223a220000000000000000000000000000000000605e840152518093606d840190614826565b017f222c22696d616765223a22646174613a696d6167652f7376672b786d6c3b6261606d8201527f736536342c000000000000000000000000000000000000000000000000000000608d820152614210825180936020609285019101614826565b017f227d00000000000000000000000000000000000000000000000000000000000060928201520360748101845201826148df565b60e0819052614994565b6142a2603d60405180937f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000060208301526142928151809260208686019101614826565b810103601d8101845201826148df565b604051918291602083526020830190614849565b0390f35b90506020813d6020116142fd575b816142d5602093836148df565b810103126142f85751906001600160a01b03821682036142f85790614154613bfc565b600080fd5b3d91506142c8565b6040513d6000823e3d90fd5b634e487b7160e01b600052604160045260246000fd5b6040518061012081011067ffffffffffffffff6101208301111761431157610120810160405260f881527f3c7061746820643d226d3438312e34362c3530342e3130317635382e3434396360208201527f2d322e33352e37372d342e38322c312e35312d372e33392c322e32332d33302e60408201527f332c382e35342d37342e36352c31332e39322d3132342e30362c31332e39322d60608201527f35332e362c302d3130312e32342d362e33332d3133312e34372d31362e31367660808201527f2d35382e343339683236322e39325a222066696c6c3d2275726c282353616e6460a08201527f426f74746f6d29222f3e3c656c6c697073652063783d22333530222063793d2260c08201527f3530342e313031222072783d223133312e343632222072793d2232382e31303860e08201527f222066696c6c3d2275726c282353616e64546f7029222f3e0000000000000000610100820152996123df565b604051806101c081011067ffffffffffffffff6101c083011117614311576101c0810160405261019981527f3c706f6c79676f6e20706f696e74733d22333530203335302e3032362034313560208201527f2e3033203238342e39373820323835203238342e39373820333530203335302e60408201527f303236222066696c6c3d2275726c282353616e64426f74746f6d29222f3e3c7060608201527f61746820643d226d3431362e3334312c3238312e39373563302c2e3931342d2e60808201527f3335342c312e3830392d312e3033352c322e36382d352e3534322c372e30373660a08201527f2d33322e3636312c31322e34352d36352e32382c31322e34352d33322e36323460c08201527f2c302d35392e3733382d352e3337342d36352e32382d31322e34352d2e36383160e08201527f2d2e3837322d312e3033352d312e3736372d312e3033352d322e36382c302d2e6101008201527f3931342e3335342d312e3830382c312e3033352d322e3637362c352e3534322d6101208201527f372e3037362c33322e3635362d31322e34352c36352e32382d31322e34352c336101408201527f322e3631392c302c35392e3733382c352e3337342c36352e32382c31322e34356101608201527f2e3638312e3836372c312e3033352c312e3736322c312e3033352c322e3637366101808201527f5a222066696c6c3d2275726c282353616e64546f7029222f3e000000000000006101a082015299612192565b6146cf9198506146bb615850565b906020815191012090602081519101201490565b9638611d3a565b905093610d61565b905094610a32565b60d09461072c565b614710915060203d602011614716575b61470881836148df565b810190614929565b38610517565b503d6146fe565b614736915060203d6020116147165761470881836148df565b386104c1565b634e487b7160e01b600052601260045260246000fd5b614774915060203d60201161477a575b61476c81836148df565b810190614901565b3861023f565b503d614762565b506020813d6020116147b6575b8161479b602093836148df565b810103126142f8575160058110156142f8576101e5906101db565b3d915061478e565b6147d7915060203d60201161477a5761476c81836148df565b38610181565b90506020813d60201161481e575b816147f8602093836148df565b810103126142f857516001600160a01b03811681036142f8576001600160a01b03610100565b3d91506147eb565b60005b8381106148395750506000910152565b8181015183820152602001614829565b9060209161486281518092818552858086019101614826565b601f01601f1916010190565b610140810190811067ffffffffffffffff82111761431157604052565b6020810190811067ffffffffffffffff82111761431157604052565b6060810190811067ffffffffffffffff82111761431157604052565b6040810190811067ffffffffffffffff82111761431157604052565b90601f8019910116810190811067ffffffffffffffff82111761431157604052565b908160209103126142f857516fffffffffffffffffffffffffffffffff811681036142f85790565b908160209103126142f8575164ffffffffff811681036142f85790565b67ffffffffffffffff811161431157601f01601f191660200190565b9061496c82614946565b61497960405191826148df565b828152809261498a601f1991614946565b0190602036910137565b805115614af4576040516149a7816148a7565b604081527f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208201527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f60408201528151600292838201809211614ade5760038092047f3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81168103614ade57614a41908594951b614962565b936020850193829183518401925b838110614a8d5750505050510680600114614a7a57600214614a6f575090565b603d90600019015390565b50603d9081600019820153600119015390565b85600491979293949701918251600190603f9082828260121c16880101518453828282600c1c16880101518385015382828260061c1688010151888501531685010151878201530195929190614a4f565b634e487b7160e01b600052601160045260246000fd5b50604051614b018161488b565b6000815290565b806000917a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000080821015614c4a575b506d04ee2d6d415b85acef810000000080831015614c3b575b50662386f26fc1000080831015614c2c575b506305f5e10080831015614c1d575b5061271080831015614c0e575b506064821015614bfe575b600a80921015614bf4575b600190816021614b9f828701614962565b95860101905b614bb1575b5050505090565b600019019083907f30313233343536373839616263646566000000000000000000000000000000008282061a835304918215614bef57919082614ba5565b614baa565b9160010191614b8e565b9190606460029104910191614b83565b60049193920491019138614b78565b60089193920491019138614b6b565b60109193920491019138614b5c565b60209193920491019138614b4a565b604093508104915038614b31565b6001600160a01b031660405190614c6e826148a7565b602a8252602082016040368237825115614d8657603090538151600190811015614d8657607860218401536029905b808211614d0b575050614cad5790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602060248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b9091600f81166010811015614d71577f3031323334353637383961626364656600000000000000000000000000000000901a614d478486614d9c565b5360041c918015614d5c576000190190614c9d565b60246000634e487b7160e01b81526011600452fd5b60246000634e487b7160e01b81526032600452fd5b634e487b7160e01b600052603260045260246000fd5b908151811015614d86570160200190565b60405190614dba826148c3565b600482527f2667743b000000000000000000000000000000000000000000000000000000006020830152565b60405190614df3826148c3565b600482527f266c743b000000000000000000000000000000000000000000000000000000006020830152565b90614e87929493604051958692602094614e4181518092888089019101614826565b8401614e5582518093888085019101614826565b01614e6882518093878085019101614826565b01614e7b82518093868085019101614826565b010380855201836148df565b565b801561519a5760009180615175575090505b6001908082811015614f0857505050614eb2614de6565b614f05602260405183614ecf829551809260208086019101614826565b81017f203100000000000000000000000000000000000000000000000000000000000060208201520360028101845201826148df565b90565b66038d7ea4c6800011156151185760409081519060a0820182811067ffffffffffffffff82111761431157808452614f3f8161488b565b600081528252825190614f51826148c3565b8482526020917f4b0000000000000000000000000000000000000000000000000000000000000083820152828401528351614f8b816148c3565b8581527f4d0000000000000000000000000000000000000000000000000000000000000083820152848401528351614fc2816148c3565b8581527f42000000000000000000000000000000000000000000000000000000000000008382015260608401528351614ffa816148c3565b8581527f54000000000000000000000000000000000000000000000000000000000000008382015260808401526000918583965b6150ec575b50845194615040866148c3565b6007908187527f2623383830353b0000000000000000000000000000000000000000000000000083880152519560005b8281106150d957505050506150ba6150c0917f20000000000000000000000000000000000000000000000000000000000000006027870152600886526150b5866148c3565b614b08565b91615744565b916005851015614d8657614f059460051b015192614e1f565b8181018401518882018501528301615070565b9591926103e89081851061510f57508680916064600a870406950493019661502e565b93929650615033565b5050615122614dad565b614f0560286040518361513f829551809260208086019101614826565b81017f203939392e39395400000000000000000000000000000000000000000000000060208201520360088101845201826148df565b600a0a918215615186575004614e9b565b80634e487b7160e01b602492526012600452fd5b50506040516151a8816148c3565b600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b620151809103048061523d57506151ea614de6565b614f05602660405183615207829551809260208086019101614826565b81017f203120446179000000000000000000000000000000000000000000000000000060208201520360068101845201826148df565b61270f811161530c57600181036152c957614f056020615291604051615262816148c3565b600481527f20446179000000000000000000000000000000000000000000000000000000008382015293614b08565b60405193816152a98693518092868087019101614826565b82016152bd82518093868085019101614826565b010380845201826148df565b614f0560206152916040516152dd816148c3565b600581527f20446179730000000000000000000000000000000000000000000000000000008382015293614b08565b50615315614dad565b614f05602a60405183615332829551809260208086019101614826565b81017f2039393939204461797300000000000000000000000000000000000000000000602082015203600a8101845201826148df565b6020818303126142f85780519067ffffffffffffffff82116142f8570181601f820112156142f857805161539b81614946565b926153a960405194856148df565b818452602082840101116142f857614f059160208085019101614826565b6001600160a01b031660409081516395d89b4160e01b8152600081600481855afa9081156155a157600091615580575b5061545c8351615406816148c3565b601181527f5341422d56322d4c4f434b55502d4c494e0000000000000000000000000000006020918201528251908301207fc66b376a19264d832c1bc254000c18944ca5aa57ed50f4ea637c4da424d4c3bb1490565b1561549a5750505161546d816148c3565b600d81527f4c6f636b7570204c696e65617200000000000000000000000000000000000000602082015290565b6154fe83516154a8816148c3565b601181527f5341422d56322d4c4f434b55502d44594e0000000000000000000000000000006020918201528251908301207f6ab655856fa5352de8c05542b1937ac63c59342da992602767c02734cc5391651490565b1561553c5750505161550f816148c3565b600e81527f4c6f636b75702044796e616d6963000000000000000000000000000000000000602082015290565b61557c9083519384937f814a8a2e000000000000000000000000000000000000000000000000000000008552600485015260248401526044830190614849565b0390fd5b61559b913d8091833e61559381836148df565b810190615368565b386153f7565b83513d6000823e3d90fd5b3d156155d7573d906155bd82614946565b916155cb60405193846148df565b82523d6000602084013e565b606090565b60405160208101907f313ce56700000000000000000000000000000000000000000000000000000000825260048152615614816148c3565b6000928392839251915afa6156276155ac565b908061565e575b1561565a5760208180518101031261565657602001519060ff82168203615653575090565b80fd5b5080fd5b5090565b50602081511461562e565b6000809160405160208101906395d89b4160e01b82526004815261568c816148c3565b51915afa6156986155ac565b90158015615738575b6156fe57806020806156b893518301019101615368565b601e815111600014614f0557506040516156d1816148c3565b600b81527f4c6f6e672053796d626f6c000000000000000000000000000000000000000000602082015290565b5060405161570b816148c3565b600581527f4552433230000000000000000000000000000000000000000000000000000000602082015290565b506040815111156156a1565b806157565750604051614b018161488b565b600a8110156157bb5761576890614b08565b614f05602260405180937f2e3000000000000000000000000000000000000000000000000000000000000060208301526157ab8151809260208686019101614826565b81010360028101845201826148df565b6157c490614b08565b614f05602160405180937f2e0000000000000000000000000000000000000000000000000000000000000060208301526158078151809260208686019101614826565b81010360018101845201826148df565b60405190615824826148c3565b600782527f536574746c6564000000000000000000000000000000000000000000000000006020830152565b6040519061585d826148c3565b600882527f4465706c657465640000000000000000000000000000000000000000000000006020830152565b600581101561596f57600481036158a35750614f05615850565b600381036158e557506040516158b8816148c3565b600881527f43616e63656c6564000000000000000000000000000000000000000000000000602082015290565b6001810361592757506040516158fa816148c3565b600981527f53747265616d696e670000000000000000000000000000000000000000000000602082015290565b60020361593657614f05615817565b604051615942816148c3565b600781527f50656e64696e6700000000000000000000000000000000000000000000000000602082015290565b634e487b7160e01b600052602160045260246000fd5b6030614e879193929360405194816159a7879351809260208087019101614826565b820164010714051160dd1b60208201526a029b0b13634b2b9102b19160ad1b60258201526159de8251809360208785019101614826565b010360108101855201836148df565b6025614e87919392936040519481615a0f879351809260208087019101614826565b820164010714051160dd1b6020820152615a328251809360208785019101614826565b010360058101855201836148df565b60405190615a4e826148c3565b601082527f68736c283233302c3231252c31312529000000000000000000000000000000006020830152565b8015615cac57615a88615a41565b90612710908103908111614ade57614f0591615aa661013692614b08565b6040519485927f3c672066696c6c3d226e6f6e65223e000000000000000000000000000000000060208501527f3c636972636c652063783d22313636222063793d2235302220723d2232322220602f8501527f7374726f6b653d22000000000000000000000000000000000000000000000000604f850152615b32815180926020605788019101614826565b83017f22207374726f6b652d77696474683d223130222f3e000000000000000000000060578201527f3c636972636c652063783d22313636222063793d2235302220706174684c656e606c8201527f6774683d2231303030302220723d22323222207374726f6b653d220000000000608c820152615bba82518093602060a785019101614826565b017f22207374726f6b652d6461736861727261793d22313030303022207374726f6b60a78201527f652d646173686f66667365743d2200000000000000000000000000000000000060c7820152615c1b82518093602060d585019101614826565b017f22207374726f6b652d6c696e656361703d22726f756e6422207374726f6b652d60d58201527f77696474683d223522207472616e73666f726d3d22726f74617465282d39302960f58201527f22207472616e73666f726d2d6f726967696e3d22313636203530222f3e000000610115820152631e17b39f60e11b610132820152036101168101845201826148df565b5050604051614b018161488b565b60009080518015615d2f579060009182915b818310615cde57505050600d02900390565b909193603b60f81b7fff00000000000000000000000000000000000000000000000000000000000000615d118785614d9c565b511614615d27575b600d01936001019190615ccc565b849350615d19565b505050600090565b60009080518015615d2f579060009182915b818310615d5b5750505060041b900390565b909193603b60f81b7fff00000000000000000000000000000000000000000000000000000000000000615d8e8785614d9c565b511614615da4575b601001936001019190615d49565b849350615d9656fea164736f6c6343000815000a";