ETH Price: $3,117.33 (+1.52%)
Gas: 4 Gwei

Contract

0xb84d838584B7A7F924ed422e7d256c80E03D92cf
 

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
Withdraw Liquidi...131339122021-08-31 14:44:321043 days ago1630421072IN
0xb84d8385...0E03D92cf
0 ETH0.03818847105.03719142
Withdraw Liquidi...131338602021-08-31 14:33:331043 days ago1630420413IN
0xb84d8385...0E03D92cf
0 ETH0.0585045150
Withdraw Liquidi...131338292021-08-31 14:24:371043 days ago1630419877IN
0xb84d8385...0E03D92cf
0 ETH0.0310355686.90393155
Withdraw Liquidi...131330042021-08-31 11:25:181043 days ago1630409118IN
0xb84d8385...0E03D92cf
0 ETH0.0311858183.19499989
Withdraw Liquidi...131329082021-08-31 11:02:081043 days ago1630407728IN
0xb84d8385...0E03D92cf
0 ETH0.0370591693.16029269
Withdraw Liquidi...131328922021-08-31 10:57:001043 days ago1630407420IN
0xb84d8385...0E03D92cf
0 ETH0.0366966797.27390373
Withdraw Liquidi...130935702021-08-25 8:47:521049 days ago1629881272IN
0xb84d8385...0E03D92cf
0 ETH0.0300924682.76915514
Withdraw Liquidi...128768472021-07-22 14:49:291083 days ago1626965369IN
0xb84d8385...0E03D92cf
0 ETH0.0048768717
Withdraw Liquidi...128768372021-07-22 14:46:151083 days ago1626965175IN
0xb84d8385...0E03D92cf
0 ETH0.004570917
Withdraw Liquidi...127476742021-07-02 10:34:441103 days ago1625222084IN
0xb84d8385...0E03D92cf
0 ETH0.0047451216
Withdraw Liquidi...127429992021-07-01 16:56:341104 days ago1625158594IN
0xb84d8385...0E03D92cf
0 ETH0.006051420
Withdraw Liquidi...127425542021-07-01 15:19:531104 days ago1625152793IN
0xb84d8385...0E03D92cf
0 ETH0.0067072824
Withdraw Liquidi...127353582021-06-30 12:32:261105 days ago1625056346IN
0xb84d8385...0E03D92cf
0 ETH0.0031456810
Withdraw Liquidi...127333402021-06-30 4:54:041106 days ago1625028844IN
0xb84d8385...0E03D92cf
0 ETH0.003450111
Withdraw Liquidi...127162972021-06-27 13:23:451108 days ago1624800225IN
0xb84d8385...0E03D92cf
0 ETH0.001189874
Withdraw Liquidi...127045692021-06-25 17:32:111110 days ago1624642331IN
0xb84d8385...0E03D92cf
0 ETH0.0088943726.4
Withdraw Liquidi...126982452021-06-24 17:47:191111 days ago1624556839IN
0xb84d8385...0E03D92cf
0 ETH0.0059882718
Withdraw Liquidi...126978442021-06-24 16:15:081111 days ago1624551308IN
0xb84d8385...0E03D92cf
0 ETH0.006186417
Withdraw Liquidi...126969452021-06-24 12:53:551111 days ago1624539235IN
0xb84d8385...0E03D92cf
0 ETH0.003247210.00000145
Withdraw Reward126828902021-06-22 8:11:531113 days ago1624349513IN
0xb84d8385...0E03D92cf
0 ETH0.0033184526
Add Liquidity126719842021-06-20 15:29:201115 days ago1624202960IN
0xb84d8385...0E03D92cf
0 ETH0.0016333510.00000156
Withdraw Liquidi...126422642021-06-16 0:17:491120 days ago1623802669IN
0xb84d8385...0E03D92cf
0 ETH0.0038802613
Open Position126383132021-06-15 9:45:421120 days ago1623750342IN
0xb84d8385...0E03D92cf
0 ETH0.0067516514
Withdraw Liquidi...126376922021-06-15 7:22:301120 days ago1623741750IN
0xb84d8385...0E03D92cf
0 ETH0.0032440811
Withdraw Reward126375832021-06-15 6:57:591120 days ago1623740279IN
0xb84d8385...0E03D92cf
0 ETH0.0011384810.3
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To Value
126454762021-06-16 12:24:401119 days ago1623846280
0xb84d8385...0E03D92cf
0.24849964 ETH
126454762021-06-16 12:24:401119 days ago1623846280
0xb84d8385...0E03D92cf
0.24849964 ETH
126454392021-06-16 12:16:321119 days ago1623845792
0xb84d8385...0E03D92cf
0.25056551 ETH
126454352021-06-16 12:15:421119 days ago1623845742
0xb84d8385...0E03D92cf
0.24924824 ETH
126454352021-06-16 12:15:421119 days ago1623845742
0xb84d8385...0E03D92cf
0.24924824 ETH
126453632021-06-16 11:58:251119 days ago1623844705
0xb84d8385...0E03D92cf
0.84869725 ETH
126453632021-06-16 11:58:251119 days ago1623844705
0xb84d8385...0E03D92cf
0.84869725 ETH
126383192021-06-15 9:47:391120 days ago1623750459
0xb84d8385...0E03D92cf
0.00498492 ETH
126383192021-06-15 9:47:391120 days ago1623750459
0xb84d8385...0E03D92cf
0.00498492 ETH
126383152021-06-15 9:45:531120 days ago1623750353
0xb84d8385...0E03D92cf
0.00498499 ETH
126383152021-06-15 9:45:531120 days ago1623750353
0xb84d8385...0E03D92cf
0.00498499 ETH
126382912021-06-15 9:40:321120 days ago1623750032
0xb84d8385...0E03D92cf
0.00498499 ETH
126382912021-06-15 9:40:321120 days ago1623750032
0xb84d8385...0E03D92cf
0.00498499 ETH
126382872021-06-15 9:39:311120 days ago1623749971
0xb84d8385...0E03D92cf
0.00498497 ETH
126382872021-06-15 9:39:311120 days ago1623749971
0xb84d8385...0E03D92cf
0.00498497 ETH
126141432021-06-11 15:49:551124 days ago1623426595
0xb84d8385...0E03D92cf
0.15563972 ETH
126072082021-06-10 14:04:501125 days ago1623333890
0xb84d8385...0E03D92cf
0.39999999 ETH
126064372021-06-10 11:16:121125 days ago1623323772
0xb84d8385...0E03D92cf
0.04016248 ETH
126059492021-06-10 9:21:161125 days ago1623316876
0xb84d8385...0E03D92cf
0.48999999 ETH
126027772021-06-09 21:40:541126 days ago1623274854
0xb84d8385...0E03D92cf
0.47999999 ETH
126002772021-06-09 12:16:061126 days ago1623240966
0xb84d8385...0E03D92cf
0.04970357 ETH
126002772021-06-09 12:16:061126 days ago1623240966
0xb84d8385...0E03D92cf
0.04970357 ETH
125933902021-06-08 10:38:521127 days ago1623148732
0xb84d8385...0E03D92cf
0.04499801 ETH
125676722021-06-04 11:24:271131 days ago1622805867
0xb84d8385...0E03D92cf
0.1246519 ETH
125575392021-06-02 21:30:041133 days ago1622669404
0xb84d8385...0E03D92cf
0.19508255 ETH
View All Internal Transactions
Loading...
Loading

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0x1787D0ff...A778A64FE
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
FarmMain

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-04-15
*/

// File: contracts\amm-aggregator\common\AMMData.sol

//SPDX-License-Identifier: MIT
pragma solidity ^0.7.6;

struct LiquidityPoolData {
    address liquidityPoolAddress;
    uint256 amount;
    address tokenAddress;
    bool amountIsLiquidityPool;
    bool involvingETH;
    address receiver;
}

struct SwapData {
    bool enterInETH;
    bool exitInETH;
    address[] liquidityPoolAddresses;
    address[] path;
    address inputToken;
    uint256 amount;
    address receiver;
}

// File: contracts\amm-aggregator\common\IAMM.sol

//SPDX_License_Identifier: MIT
pragma solidity ^0.7.6;
pragma abicoder v2;


interface IAMM {

    event NewLiquidityPoolAddress(address indexed);

    function info() external view returns(string memory name, uint256 version);

    function data() external view returns(address ethereumAddress, uint256 maxTokensPerLiquidityPool, bool hasUniqueLiquidityPools);

    function balanceOf(address liquidityPoolAddress, address owner) external view returns(uint256, uint256[] memory, address[] memory);

    function byLiquidityPool(address liquidityPoolAddress) external view returns(uint256, uint256[] memory, address[] memory);

    function byTokens(address[] calldata liquidityPoolTokens) external view returns(uint256, uint256[] memory, address, address[] memory);

    function byPercentage(address liquidityPoolAddress, uint256 numerator, uint256 denominator) external view returns (uint256, uint256[] memory, address[] memory);

    function byLiquidityPoolAmount(address liquidityPoolAddress, uint256 liquidityPoolAmount) external view returns(uint256[] memory, address[] memory);

    function byTokenAmount(address liquidityPoolAddress, address tokenAddress, uint256 tokenAmount) external view returns(uint256, uint256[] memory, address[] memory);

    function createLiquidityPoolAndAddLiquidity(address[] calldata tokenAddresses, uint256[] calldata amounts, bool involvingETH, address receiver) external payable returns(uint256, uint256[] memory, address, address[] memory);

    function addLiquidity(LiquidityPoolData calldata data) external payable returns(uint256, uint256[] memory, address[] memory);
    function addLiquidityBatch(LiquidityPoolData[] calldata data) external payable returns(uint256[] memory, uint256[][] memory, address[][] memory);

    function removeLiquidity(LiquidityPoolData calldata data) external returns(uint256, uint256[] memory, address[] memory);
    function removeLiquidityBatch(LiquidityPoolData[] calldata data) external returns(uint256[] memory, uint256[][] memory, address[][] memory);

    function getSwapOutput(address tokenAddress, uint256 tokenAmount, address[] calldata, address[] calldata path) view external returns(uint256[] memory);

    function swapLiquidity(SwapData calldata data) external payable returns(uint256);
    function swapLiquidityBatch(SwapData[] calldata data) external payable returns(uint256[] memory);
}

// File: contracts\farming\FarmData.sol

//SPDX_License_Identifier: MIT
pragma solidity ^0.7.6;

struct FarmingPositionRequest {
    uint256 setupIndex; // index of the chosen setup.
    uint256 amount; // amount of main token or liquidity pool token.
    bool amountIsLiquidityPool; //true if user wants to directly share the liquidity pool token amount, false to add liquidity to AMM
    address positionOwner; // position extension or address(0) [msg.sender].
}

struct FarmingSetupConfiguration {
    bool add; // true if we're adding a new setup, false we're updating it.
    bool disable;
    uint256 index; // index of the setup we're updating.
    FarmingSetupInfo info; // data of the new or updated setup
}

struct FarmingSetupInfo {
    bool free; // if the setup is a free farming setup or a locked one.
    uint256 blockDuration; // duration of setup
    uint256 startBlock; // optional start block used for the delayed activation of the first setup
    uint256 originalRewardPerBlock;
    uint256 minStakeable; // minimum amount of staking tokens.
    uint256 maxStakeable; // maximum amount stakeable in the setup (used only if free is false).
    uint256 renewTimes; // if the setup is renewable or if it's one time.
    address ammPlugin; // amm plugin address used for this setup (eg. uniswap amm plugin address).
    address liquidityPoolTokenAddress; // address of the liquidity pool token
    address mainTokenAddress; // eg. buidl address.
    address ethereumAddress;
    bool involvingETH; // if the setup involves ETH or not.
    uint256 penaltyFee; // fee paid when the user exits a still active locked farming setup (used only if free is false).
    uint256 setupsCount; // number of setups created by this info.
    uint256 lastSetupIndex; // index of last setup;
}

struct FarmingSetup {
    uint256 infoIndex; // setup info
    bool active; // if the setup is active or not.
    uint256 startBlock; // farming setup start block.
    uint256 endBlock; // farming setup end block.
    uint256 lastUpdateBlock; // number of the block where an update was triggered.
    uint256 objectId; // items object id for the liquidity pool token (used only if free is false).
    uint256 rewardPerBlock; // farming setup reward per single block.
    uint256 totalSupply; // If free it's the LP amount, if locked is currentlyStaked.
}

struct FarmingPosition {
    address uniqueOwner; // address representing the owner of the position.
    uint256 setupIndex; // the setup index related to this position.
    uint256 creationBlock; // block when this position was created.
    uint256 liquidityPoolTokenAmount; // amount of liquidity pool token in the position.
    uint256 mainTokenAmount; // amount of main token in the position (used only if free is false).
    uint256 reward; // position reward (used only if free is false).
    uint256 lockedRewardPerBlock; // position locked reward per block (used only if free is false).
}

// File: contracts\farming\IFarmMain.sol

//SPDX_License_Identifier: MIT
pragma solidity ^0.7.6;
//pragma abicoder v2;


interface IFarmMain {

    function ONE_HUNDRED() external view returns(uint256);
    function _rewardTokenAddress() external view returns(address);
    function position(uint256 positionId) external view returns (FarmingPosition memory);
    function setups() external view returns (FarmingSetup[] memory);
    function setup(uint256 setupIndex) external view returns (FarmingSetup memory, FarmingSetupInfo memory);
    function setFarmingSetups(FarmingSetupConfiguration[] memory farmingSetups) external;
    function openPosition(FarmingPositionRequest calldata request) external payable returns(uint256 positionId);
    function addLiquidity(uint256 positionId, FarmingPositionRequest calldata request) external payable;
}

// File: contracts\farming\IFarmExtension.sol

//SPDX_License_Identifier: MIT
pragma solidity ^0.7.6;
//pragma abicoder v2;


interface IFarmExtension {

    function init(bool byMint, address host, address treasury) external;

    function setHost(address host) external;
    function setTreasury(address treasury) external;

    function data() external view returns(address farmMainContract, bool byMint, address host, address treasury, address rewardTokenAddress);

    function transferTo(uint256 amount) external;
    function backToYou(uint256 amount) external payable;

    function setFarmingSetups(FarmingSetupConfiguration[] memory farmingSetups) external;

}

// File: contracts\farming\IFarmFactory.sol

//SPDX_License_Identifier: MIT
pragma solidity ^0.7.6;

interface IFarmFactory {

    event ExtensionCloned(address indexed);

    function feePercentageInfo() external view returns (uint256, address);
    function farmDefaultExtension() external view returns(address);
    function cloneFarmDefaultExtension() external returns(address);
    function getFarmTokenCollectionURI() external view returns (string memory);
    function getFarmTokenURI() external view returns (string memory);
}

// File: contracts\farming\util\ERC1155Receiver.sol

// File: contracts/usd-v2/util/ERC1155Receiver.sol

// SPDX_License_Identifier: MIT

pragma solidity ^0.7.6;

abstract contract ERC1155Receiver {
    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;

    mapping(bytes4 => bool) private _supportedInterfaces;

    constructor() {
        _registerInterface(_INTERFACE_ID_ERC165);
        _registerInterface(
            ERC1155Receiver(0).onERC1155Received.selector ^
            ERC1155Receiver(0).onERC1155BatchReceived.selector
        );
    }

    function supportsInterface(bytes4 interfaceId) public view returns (bool) {
        return _supportedInterfaces[interfaceId];
    }

    function _registerInterface(bytes4 interfaceId) internal virtual {
        require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
        _supportedInterfaces[interfaceId] = true;
    }

    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    )
        external
        virtual
        returns(bytes4);

    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    )
        external
        virtual
        returns(bytes4);
}

// File: contracts\farming\util\IERC20.sol

// SPDX_License_Identifier: MIT

pragma solidity ^0.7.6;

interface IERC20 {

    function totalSupply() external view returns (uint256);

    function balanceOf(address account) external view returns (uint256);

    function transfer(address recipient, uint256 amount) external returns (bool);

    function allowance(address owner, address spender) external view returns (uint256);

    function approve(address spender, uint256 amount) external returns (bool);

    function safeApprove(address spender, uint256 amount) external;

    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    function decimals() external view returns (uint8);
}

// File: contracts\farming\util\IEthItemOrchestrator.sol

//SPDX_License_Identifier: MIT

pragma solidity ^0.7.6;

interface IEthItemOrchestrator {
    function createNative(bytes calldata modelInitPayload, string calldata ens)
        external
        returns (address newNativeAddress, bytes memory modelInitCallResponse);
}

// File: contracts\farming\util\IERC1155.sol

// SPDX_License_Identifier: MIT

pragma solidity ^0.7.6;

interface IERC1155 {

    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values);

    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    event URI(string value, uint256 indexed id);

    function balanceOf(address account, uint256 id) external view returns (uint256);

    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory);

    function setApprovalForAll(address operator, bool approved) external;

    function isApprovedForAll(address account, address operator) external view returns (bool);

    function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes calldata data) external;

    function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data) external;
}

// File: contracts\farming\util\IEthItemInteroperableInterface.sol

// SPDX_License_Identifier: MIT

pragma solidity ^0.7.6;


interface IEthItemInteroperableInterface is IERC20 {

    function mainInterface() external view returns (address);

    function objectId() external view returns (uint256);

    function mint(address owner, uint256 amount) external;

    function burn(address owner, uint256 amount) external;

    function permitNonce(address sender) external view returns(uint256);

    function permit(address owner, address spender, uint value, uint8 v, bytes32 r, bytes32 s) external;

    function interoperableInterfaceVersion() external pure returns(uint256 ethItemInteroperableInterfaceVersion);
}

// File: contracts\farming\util\IEthItem.sol

// SPDX_License_Identifier: MIT

pragma solidity ^0.7.6;



interface IEthItem is IERC1155 {

    function name() external view returns (string memory);

    function symbol() external view returns (string memory);

    function totalSupply(uint256 objectId) external view returns (uint256);

    function name(uint256 objectId) external view returns (string memory);

    function symbol(uint256 objectId) external view returns (string memory);

    function decimals(uint256 objectId) external view returns (uint256);

    function uri(uint256 objectId) external view returns (string memory);

    function mainInterfaceVersion() external pure returns(uint256 ethItemInteroperableVersion);

    function toInteroperableInterfaceAmount(uint256 objectId, uint256 ethItemAmount) external view returns (uint256 interoperableInterfaceAmount);

    function toMainInterfaceAmount(uint256 objectId, uint256 erc20WrapperAmount) external view returns (uint256 mainInterfaceAmount);

    function interoperableInterfaceModel() external view returns (address, uint256);

    function asInteroperable(uint256 objectId) external view returns (IEthItemInteroperableInterface);

    function emitTransferSingleEvent(address sender, address from, address to, uint256 objectId, uint256 amount) external;

    function mint(uint256 amount, string calldata partialUri)
        external
        returns (uint256, address);

    function burn(
        uint256 objectId,
        uint256 amount
    ) external;

    function burnBatch(
        uint256[] calldata objectIds,
        uint256[] calldata amounts
    ) external;
}

// File: contracts\farming\util\INativeV1.sol

//SPDX_License_Identifier: MIT

pragma solidity ^0.7.6;


interface INativeV1 is IEthItem {

    function init(string calldata name, string calldata symbol, bool hasDecimals, string calldata collectionUri, address extensionAddress, bytes calldata extensionInitPayload) external returns(bytes memory extensionInitCallResponse);
    function extension() external view returns (address extensionAddress);
    function canMint(address operator) external view returns (bool result);
    function isEditable(uint256 objectId) external view returns (bool result);
    function releaseExtension() external;
    function uri() external view returns (string memory);
    function decimals() external view returns (uint256);
    function mint(uint256 amount, string calldata tokenName, string calldata tokenSymbol, string calldata objectUri, bool editable) external returns (uint256 objectId, address tokenAddress);
    function mint(uint256 amount, string calldata tokenName, string calldata tokenSymbol, string calldata objectUri) external returns (uint256 objectId, address tokenAddress);
    function mint(uint256 objectId, uint256 amount) external;
    function makeReadOnly(uint256 objectId) external;
    function setUri(string calldata newUri) external;
    function setUri(uint256 objectId, string calldata newUri) external;
}

// File: contracts\farming\FarmMain.sol

//SPDX_License_Identifier: MIT
pragma solidity ^0.7.6;
//pragma abicoder v2;









contract FarmMain is IFarmMain, ERC1155Receiver {

    // percentage
    uint256 public override constant ONE_HUNDRED = 1e18;
    // event that tracks contracts deployed for the given reward token
    event RewardToken(address indexed rewardTokenAddress);
    // new or transferred farming position event
    event Transfer(uint256 indexed positionId, address indexed from, address indexed to);
    // event that tracks involved tokens for this contract
    event SetupToken(address indexed mainToken, address indexed involvedToken);
    // event that tracks farm tokens
    event FarmToken(uint256 indexed objectId, address indexed liquidityPoolToken, uint256 setupIndex, uint256 endBlock);
    // factory address that will create clones of this contract
    address public _factory;
    // address of the extension of this contract
    address public _extension;
    // address of the reward token
    address public override _rewardTokenAddress;
     // farm token collection
    address public _farmTokenCollection;
    // mapping containing all the currently available farming setups info
    mapping(uint256 => FarmingSetupInfo) private _setupsInfo;
    // counter for the farming setup info
    uint256 public _farmingSetupsInfoCount;
    // mapping containing all the currently available farming setups
    mapping(uint256 => FarmingSetup) private _setups;
    // counter for the farming setups
    uint256 public _farmingSetupsCount;
    // mapping containing all the positions
    mapping(uint256 => FarmingPosition) private _positions;
    // mapping containing the reward per token per setup per block
    mapping(uint256 => uint256) private _rewardPerTokenPerSetup;
    // mapping containing the reward per token paid per position
    mapping(uint256 => uint256) private _rewardPerTokenPaid;
    // mapping containing whether a farming position has been partially reedemed or not
    mapping(uint256 => uint256) public _partiallyRedeemed;
    // mapping containing object id to setup index
    mapping(uint256 => uint256) private _objectIdSetup;
    // mapping containing all the number of opened positions for each setups
    mapping(uint256 => uint256) private _setupPositionsCount;
    // mapping containing all the reward received/paid per setup
    mapping(uint256 => uint256) public _rewardReceived;
    mapping(uint256 => uint256) public _rewardPaid;

    /** Modifiers. */

    /** @dev byExtension modifier used to check for unauthorized changes. */
    modifier byExtension() {
        require(msg.sender == _extension, "Unauthorized");
        _;
    }

    /** @dev byPositionOwner modifier used to check for unauthorized accesses. */
    modifier byPositionOwner(uint256 positionId) {
        require(_positions[positionId].uniqueOwner == msg.sender && _positions[positionId].creationBlock != 0, "Not owned");
        _;
    }

    /** @dev activeSetupOnly modifier used to check for function calls only if the setup is active. */
    modifier activeSetupOnly(uint256 setupIndex) {
        require(_setups[setupIndex].active, "Setup not active");
        require(_setups[setupIndex].startBlock <= block.number && _setups[setupIndex].endBlock > block.number, "Invalid setup");
        _;
    }

    receive() external payable {}

    /** Extension methods */

    /** @dev initializes the farming contract.
      * @param extension extension address.
      * @param extensionInitData lm extension init payload.
      * @param orchestrator address of the eth item orchestrator.
      * @param rewardTokenAddress address of the reward token.
      * @return extensionReturnCall result of the extension initialization function, if it was called.  
     */
    function init(address extension, bytes memory extensionInitData, address orchestrator, address rewardTokenAddress, bytes memory farmingSetupInfosBytes) public returns(bytes memory extensionReturnCall) {
        require(_factory == address(0), "Already initialized");
        require((_extension = extension) != address(0), "extension");
        _factory = msg.sender;
        emit RewardToken(_rewardTokenAddress = rewardTokenAddress);
        if (keccak256(extensionInitData) != keccak256("")) {
            extensionReturnCall = _call(_extension, extensionInitData);
        }
        (_farmTokenCollection,) = IEthItemOrchestrator(orchestrator).createNative(abi.encodeWithSignature("init(string,string,bool,string,address,bytes)", "Covenants Farming", "cFARM", true, IFarmFactory(_factory).getFarmTokenCollectionURI(), address(this), ""), "");
        if(farmingSetupInfosBytes.length > 0) {
            FarmingSetupInfo[] memory farmingSetupInfos = abi.decode(farmingSetupInfosBytes, (FarmingSetupInfo[]));
            for(uint256 i = 0; i < farmingSetupInfos.length; i++) {
                _setOrAddFarmingSetupInfo(farmingSetupInfos[i], true, false, 0);
            }
        }
    }

    function setFarmingSetups(FarmingSetupConfiguration[] memory farmingSetups) public override byExtension {
        for (uint256 i = 0; i < farmingSetups.length; i++) {
            _setOrAddFarmingSetupInfo(farmingSetups[i].info, farmingSetups[i].add, farmingSetups[i].disable, farmingSetups[i].index);
        }
    }

    /** Public methods */

    /** @dev returns the position with the given id.
      * @param positionId id of the position.
      * @return farming position with the given id.
     */
    function position(uint256 positionId) public override view returns (FarmingPosition memory) {
        return _positions[positionId];
    }

    function setup(uint256 setupIndex) public override view returns (FarmingSetup memory, FarmingSetupInfo memory) {
        return (_setups[setupIndex], _setupsInfo[_setups[setupIndex].infoIndex]);
    }

    function setups() public override view returns (FarmingSetup[] memory) {
        FarmingSetup[] memory farmingSetups = new FarmingSetup[](_farmingSetupsCount);
        for (uint256 i = 0; i < _farmingSetupsCount; i++) {
            farmingSetups[i] = _setups[i];
        }
        return farmingSetups;
    }

    function activateSetup(uint256 setupInfoIndex) public {
        require(_setupsInfo[setupInfoIndex].renewTimes > 0 && !_setups[_setupsInfo[setupInfoIndex].lastSetupIndex].active, "Invalid toggle.");
        _toggleSetup(_setupsInfo[setupInfoIndex].lastSetupIndex);
    }

    function transferPosition(address to, uint256 positionId) public byPositionOwner(positionId) {
        // retrieve liquidity mining position
        FarmingPosition memory pos = _positions[positionId];
        require(
            to != address(0) &&
            pos.creationBlock != 0,
            "Invalid position"
        );
        // pos.uniqueOwner = to;
        uint256 newPositionId = uint256(keccak256(abi.encode(to, _setupsInfo[_setups[pos.setupIndex].infoIndex].free ? 0 : block.number, pos.setupIndex)));
        require(_positions[newPositionId].creationBlock == 0, "Invalid transfer");
        _positions[newPositionId] = abi.decode(abi.encode(pos), (FarmingPosition));
        _positions[newPositionId].uniqueOwner = to;
        delete _positions[positionId];
        emit Transfer(newPositionId, msg.sender, to);
    }

    function openPosition(FarmingPositionRequest memory request) public override payable activeSetupOnly(request.setupIndex) returns(uint256 positionId) {
        // retrieve the setup
        FarmingSetup storage chosenSetup = _setups[request.setupIndex];
        // retrieve the unique owner
        address uniqueOwner = (request.positionOwner != address(0)) ? request.positionOwner : msg.sender;
        // create the position id
        positionId = uint256(keccak256(abi.encode(uniqueOwner, _setupsInfo[chosenSetup.infoIndex].free ? 0 : block.number, request.setupIndex)));
        require(_positions[positionId].creationBlock == 0, "Invalid open");
        // create the lp data for the amm
        (LiquidityPoolData memory liquidityPoolData, uint256 mainTokenAmount) = _addLiquidity(request.setupIndex, request);
        // calculate the reward
        uint256 reward;
        uint256 lockedRewardPerBlock;
        if (!_setupsInfo[chosenSetup.infoIndex].free) {
            (reward, lockedRewardPerBlock) = calculateLockedFarmingReward(request.setupIndex, mainTokenAmount, false, 0);
            require(reward > 0 && lockedRewardPerBlock > 0, "Insufficient staked amount");
            chosenSetup.totalSupply = chosenSetup.totalSupply + mainTokenAmount;
            chosenSetup.lastUpdateBlock = block.number;
            _mintFarmTokenAmount(uniqueOwner, liquidityPoolData.amount, request.setupIndex);
        } else {
            _updateFreeSetup(request.setupIndex, liquidityPoolData.amount, positionId, false);
        }
        _positions[positionId] = FarmingPosition({
            uniqueOwner: uniqueOwner,
            setupIndex : request.setupIndex,
            liquidityPoolTokenAmount: liquidityPoolData.amount,
            mainTokenAmount: mainTokenAmount,
            reward: reward,
            lockedRewardPerBlock: lockedRewardPerBlock,
            creationBlock: block.number
        });
        _setupPositionsCount[request.setupIndex] += (1 + (_setupsInfo[chosenSetup.infoIndex].free ? 0 : liquidityPoolData.amount));
        emit Transfer(positionId, address(0), uniqueOwner);
    }

    function addLiquidity(uint256 positionId, FarmingPositionRequest memory request) public override payable activeSetupOnly(request.setupIndex) byPositionOwner(positionId) {
        // retrieve farming position
        FarmingPosition storage farmingPosition = _positions[positionId];
        FarmingSetup storage chosenSetup = _setups[farmingPosition.setupIndex];
        // check if farmoing position is valid
        require(_setupsInfo[chosenSetup.infoIndex].free, "Invalid add liquidity");
        // create the lp data for the amm
        (LiquidityPoolData memory liquidityPoolData,) = _addLiquidity(farmingPosition.setupIndex, request);
        // rebalance the reward per token
        _rewardPerTokenPerSetup[farmingPosition.setupIndex] += (((block.number - chosenSetup.lastUpdateBlock) * chosenSetup.rewardPerBlock) * 1e18) / chosenSetup.totalSupply;
        farmingPosition.reward = calculateFreeFarmingReward(positionId, false);
        _rewardPerTokenPaid[positionId] = _rewardPerTokenPerSetup[farmingPosition.setupIndex];
        farmingPosition.liquidityPoolTokenAmount += liquidityPoolData.amount;
        // update the last block update variablex
        chosenSetup.lastUpdateBlock = block.number;
        chosenSetup.totalSupply += liquidityPoolData.amount;
    }


    /** @dev this function allows a user to withdraw the reward.
      * @param positionId farming position id.
     */
    function withdrawReward(uint256 positionId) public byPositionOwner(positionId) {
        // retrieve farming position
        FarmingPosition storage farmingPosition = _positions[positionId];
        uint256 reward = farmingPosition.reward;
        uint256 currentBlock = block.number;
        if (!_setupsInfo[_setups[farmingPosition.setupIndex].infoIndex].free) {
            // check if reward is available
            require(farmingPosition.reward > 0, "No reward");
            // check if it's a partial reward or not
            // if (_setups[farmingPosition.setupIndex].endBlock > block.number) {
            // calculate the reward from the farming position creation block to the current block multiplied by the reward per block
            (reward,) = calculateLockedFarmingReward(0, 0, true, positionId);
            //}
            require(reward <= farmingPosition.reward, "Reward is bigger than expected");
            // remove the partial reward from the liquidity mining position total reward
            farmingPosition.reward = currentBlock >= _setups[farmingPosition.setupIndex].endBlock ? 0 : farmingPosition.reward - reward;
            farmingPosition.creationBlock = block.number;
        } else {
            // rebalance setup
            currentBlock = currentBlock > _setups[farmingPosition.setupIndex].endBlock ? _setups[farmingPosition.setupIndex].endBlock : currentBlock;
            _rewardPerTokenPerSetup[farmingPosition.setupIndex] += (((currentBlock - _setups[farmingPosition.setupIndex].lastUpdateBlock) * _setups[farmingPosition.setupIndex].rewardPerBlock) * 1e18) / _setups[farmingPosition.setupIndex].totalSupply;
            reward = calculateFreeFarmingReward(positionId, false);
            _rewardPerTokenPaid[positionId] = _rewardPerTokenPerSetup[farmingPosition.setupIndex];
            farmingPosition.reward = 0;
            // update the last block update variable
            _setups[farmingPosition.setupIndex].lastUpdateBlock = currentBlock;
        }
        if (reward > 0) {
            // transfer the reward
            if (_rewardTokenAddress != address(0)) {
                _safeTransfer(_rewardTokenAddress, farmingPosition.uniqueOwner, reward);
            } else {
                (bool result,) = farmingPosition.uniqueOwner.call{value:reward}("");
                require(result, "Invalid ETH transfer.");
            }
            _rewardPaid[farmingPosition.setupIndex] += reward;
        }
        if (_setups[farmingPosition.setupIndex].endBlock <= block.number) {
            if (_setups[farmingPosition.setupIndex].active) {
                _toggleSetup(farmingPosition.setupIndex);
            }
            // close the locked position after withdrawing all the reward
            if (!_setupsInfo[_setups[farmingPosition.setupIndex].infoIndex].free) {
                _setupPositionsCount[farmingPosition.setupIndex] -= 1;
                if (_setupPositionsCount[farmingPosition.setupIndex] == 0 && !_setups[farmingPosition.setupIndex].active) {
                    _giveBack(_rewardReceived[farmingPosition.setupIndex] - _rewardPaid[farmingPosition.setupIndex]);
                    delete _setups[farmingPosition.setupIndex];
                }
                delete _positions[positionId];
            }
        } else if (!_setupsInfo[_setups[farmingPosition.setupIndex].infoIndex].free) {
            // set the partially redeemed amount
            _partiallyRedeemed[positionId] += reward;
        }
    }

    function withdrawLiquidity(uint256 positionId, uint256 objectId, bool unwrapPair, uint256 removedLiquidity) public {
        // retrieve farming position
        FarmingPosition memory farmingPosition = _positions[positionId];
        uint256 setupIndex = farmingPosition.setupIndex;
        if (objectId != 0 && address(INativeV1(_farmTokenCollection).asInteroperable(objectId)) != address(0)) {
            setupIndex = _objectIdSetup[objectId];
        }
        require((positionId != 0 && objectId == 0) || (objectId != 0 && positionId == 0 && _setups[setupIndex].objectId == objectId), "Invalid position");
        // current owned liquidity
        require(
            (
                _setupsInfo[_setups[farmingPosition.setupIndex].infoIndex].free && 
                farmingPosition.creationBlock != 0 &&
                removedLiquidity <= farmingPosition.liquidityPoolTokenAmount &&
                farmingPosition.uniqueOwner == msg.sender
            ) || (INativeV1(_farmTokenCollection).balanceOf(msg.sender, objectId) >= removedLiquidity && (_setups[setupIndex].endBlock <= block.number)), "Invalid withdraw");
        // burn the liquidity in the locked setup
        if (positionId == 0) {
            _burnFarmTokenAmount(objectId, removedLiquidity);
        } else {
            withdrawReward(positionId);
            _setups[farmingPosition.setupIndex].totalSupply -= removedLiquidity;
        }
        _removeLiquidity(positionId, setupIndex, unwrapPair, removedLiquidity, false);
        if (positionId == 0) {
            _setupPositionsCount[setupIndex] -= removedLiquidity;
            if (_setupPositionsCount[setupIndex] == 0 && !_setups[setupIndex].active) {
                _giveBack(_rewardReceived[setupIndex] - _rewardPaid[setupIndex]);
                delete _setups[setupIndex];
            }
        }
    }

    function unlock(uint256 positionId, bool unwrapPair) public payable byPositionOwner(positionId) {
        // retrieve liquidity mining position
        FarmingPosition storage farmingPosition = _positions[positionId];
        require(!_setupsInfo[_setups[farmingPosition.setupIndex].infoIndex].free && _setups[farmingPosition.setupIndex].endBlock > block.number, "Invalid unlock");
        uint256 rewardToGiveBack = _partiallyRedeemed[positionId];
        // must pay a penalty fee
        rewardToGiveBack += _setupsInfo[_setups[farmingPosition.setupIndex].infoIndex].penaltyFee == 0 ? 0 : (farmingPosition.reward * ((_setupsInfo[_setups[farmingPosition.setupIndex].infoIndex].penaltyFee * 1e18) / ONE_HUNDRED) / 1e18);
        // add all the unissued reward
        if (rewardToGiveBack > 0) {
            _safeTransferFrom(_rewardTokenAddress, msg.sender, address(this), rewardToGiveBack);
            _giveBack(rewardToGiveBack);
        } 
        _setups[farmingPosition.setupIndex].totalSupply -= farmingPosition.mainTokenAmount;
        _burnFarmTokenAmount(_setups[farmingPosition.setupIndex].objectId, farmingPosition.liquidityPoolTokenAmount);
        _removeLiquidity(positionId, farmingPosition.setupIndex, unwrapPair, farmingPosition.liquidityPoolTokenAmount, true);
        _setupPositionsCount[farmingPosition.setupIndex] -= 1 + farmingPosition.liquidityPoolTokenAmount;
        delete _positions[positionId];
    }

    function calculateLockedFarmingReward(uint256 setupIndex, uint256 mainTokenAmount, bool isPartial, uint256 positionId) public view returns(uint256 reward, uint256 relativeRewardPerBlock) {
        if (isPartial) {
            // retrieve the position
            FarmingPosition memory farmingPosition = _positions[positionId];
            // calculate the reward
            uint256 currentBlock = block.number >= _setups[farmingPosition.setupIndex].endBlock ? _setups[farmingPosition.setupIndex].endBlock : block.number;
            reward = ((currentBlock - farmingPosition.creationBlock) * farmingPosition.lockedRewardPerBlock);
        } else {
            FarmingSetup memory setup = _setups[setupIndex];
            // check if main token amount is less than the stakeable liquidity
            require(mainTokenAmount <= _setupsInfo[_setups[setupIndex].infoIndex].maxStakeable - setup.totalSupply, "Invalid liquidity");
            uint256 remainingBlocks = block.number >= setup.endBlock ? 0 : setup.endBlock - block.number;
            // get amount of remaining blocks
            require(remainingBlocks > 0, "FarmingSetup ended");
            // get total reward still available (= 0 if rewardPerBlock = 0)
            require(setup.rewardPerBlock * remainingBlocks > 0, "No rewards");
            // calculate relativeRewardPerBlock
            relativeRewardPerBlock = (setup.rewardPerBlock * ((mainTokenAmount * 1e18) / _setupsInfo[_setups[setupIndex].infoIndex].maxStakeable)) / 1e18;
            // check if rewardPerBlock is greater than 0
            require(relativeRewardPerBlock > 0, "Invalid rpb");
            // calculate reward by multiplying relative reward per block and the remaining blocks
            reward = relativeRewardPerBlock * remainingBlocks;
        }
    }

    function calculateFreeFarmingReward(uint256 positionId, bool isExt) public view returns(uint256 reward) {
        FarmingPosition memory farmingPosition = _positions[positionId];
        reward = ((_rewardPerTokenPerSetup[farmingPosition.setupIndex] - _rewardPerTokenPaid[positionId]) * farmingPosition.liquidityPoolTokenAmount) / 1e18;
        if (isExt) {
            uint256 currentBlock = block.number < _setups[farmingPosition.setupIndex].endBlock ? block.number : _setups[farmingPosition.setupIndex].endBlock;
            uint256 lastUpdateBlock = _setups[farmingPosition.setupIndex].lastUpdateBlock < _setups[farmingPosition.setupIndex].startBlock ? _setups[farmingPosition.setupIndex].startBlock : _setups[farmingPosition.setupIndex].lastUpdateBlock;
            uint256 rpt = (((currentBlock - lastUpdateBlock) * _setups[farmingPosition.setupIndex].rewardPerBlock) * 1e18) / _setups[farmingPosition.setupIndex].totalSupply;
            reward += (rpt * farmingPosition.liquidityPoolTokenAmount) / 1e18;
        }
        reward += farmingPosition.reward;
    }

    function onERC1155BatchReceived(address, address, uint256[] memory, uint256[] memory, bytes memory) public view override returns(bytes4) {
        require(_farmTokenCollection == msg.sender, "Invalid sender");
        return this.onERC1155BatchReceived.selector;
    }

    function onERC1155Received(address, address, uint256, uint256, bytes memory) public view override returns(bytes4) {
        require(_farmTokenCollection == msg.sender, "Invalid sender");
        return this.onERC1155Received.selector;
    }

    /** Private methods */

    function _setOrAddFarmingSetupInfo(FarmingSetupInfo memory info, bool add, bool disable, uint256 setupIndex) private {
        FarmingSetupInfo memory farmingSetupInfo = info;

        if(add || !disable) {
            farmingSetupInfo.renewTimes = farmingSetupInfo.renewTimes + 1;
            if(farmingSetupInfo.renewTimes == 0) {
                farmingSetupInfo.renewTimes = farmingSetupInfo.renewTimes - 1;
            }
        }

        if (add) {
            require(
                farmingSetupInfo.ammPlugin != address(0) &&
                farmingSetupInfo.liquidityPoolTokenAddress != address(0) &&
                farmingSetupInfo.originalRewardPerBlock > 0 &&
                (farmingSetupInfo.free || farmingSetupInfo.maxStakeable > 0),
                "Invalid setup configuration"
            );

            (,,address[] memory tokenAddresses) = IAMM(farmingSetupInfo.ammPlugin).byLiquidityPool(farmingSetupInfo.liquidityPoolTokenAddress);
            farmingSetupInfo.ethereumAddress = address(0);
            if (farmingSetupInfo.involvingETH) {
                (farmingSetupInfo.ethereumAddress,,) = IAMM(farmingSetupInfo.ammPlugin).data();
            }
            bool mainTokenFound = false;
            bool ethTokenFound = false;
            for(uint256 z = 0; z < tokenAddresses.length; z++) {
                if(tokenAddresses[z] == farmingSetupInfo.mainTokenAddress) {
                    mainTokenFound = true;
                    if(tokenAddresses[z] == farmingSetupInfo.ethereumAddress) {
                        ethTokenFound = true;
                    }
                } else {
                    emit SetupToken(farmingSetupInfo.mainTokenAddress, tokenAddresses[z]);
                    if(tokenAddresses[z] == farmingSetupInfo.ethereumAddress) {
                        ethTokenFound = true;
                    }
                }
            }
            require(mainTokenFound, "No main token");
            require(!farmingSetupInfo.involvingETH || ethTokenFound, "No ETH token");
            farmingSetupInfo.setupsCount = 0;
            _setupsInfo[_farmingSetupsInfoCount] = farmingSetupInfo;
            _setups[_farmingSetupsCount] = FarmingSetup(_farmingSetupsInfoCount, false, 0, 0, 0, 0, farmingSetupInfo.originalRewardPerBlock, 0);
            _setupsInfo[_farmingSetupsInfoCount].lastSetupIndex = _farmingSetupsCount;
            _farmingSetupsInfoCount += 1;
            _farmingSetupsCount += 1;
            return;
        }

        FarmingSetup storage setup = _setups[setupIndex];
        farmingSetupInfo = _setupsInfo[_setups[setupIndex].infoIndex];

        if(disable) {
            require(setup.active, "Not possible");
            _toggleSetup(setupIndex);
            return;
        }

        info.renewTimes -= 1;

        if (setup.active && _setupsInfo[_setups[setupIndex].infoIndex].free) {
            setup = _setups[setupIndex];
            if(block.number < setup.endBlock) {
                uint256 difference = info.originalRewardPerBlock < farmingSetupInfo.originalRewardPerBlock ? farmingSetupInfo.originalRewardPerBlock - info.originalRewardPerBlock : info.originalRewardPerBlock - farmingSetupInfo.originalRewardPerBlock;
                uint256 duration = setup.endBlock - block.number;
                uint256 amount = difference * duration;
                if (amount > 0) {
                    if (info.originalRewardPerBlock > farmingSetupInfo.originalRewardPerBlock) {
                        require(_ensureTransfer(amount), "Insufficient reward in extension.");
                        _rewardReceived[setupIndex] += amount;
                    }
                    _updateFreeSetup(setupIndex, 0, 0, false);
                    setup.rewardPerBlock = info.originalRewardPerBlock;
                }
            }
            _setupsInfo[_setups[setupIndex].infoIndex].originalRewardPerBlock = info.originalRewardPerBlock;
        }
        if(_setupsInfo[_setups[setupIndex].infoIndex].renewTimes > 0) {
            _setupsInfo[_setups[setupIndex].infoIndex].renewTimes = info.renewTimes;
        }
    }

    function _transferToMeAndCheckAllowance(FarmingSetup memory setup, FarmingPositionRequest memory request) private returns(IAMM amm, uint256 liquidityPoolAmount, uint256 mainTokenAmount) {
        require(request.amount > 0, "No amount");
        // retrieve the values
        amm = IAMM(_setupsInfo[setup.infoIndex].ammPlugin);
        liquidityPoolAmount = request.amountIsLiquidityPool ? request.amount : 0;
        mainTokenAmount = request.amountIsLiquidityPool ? 0 : request.amount;
        address[] memory tokens;
        uint256[] memory tokenAmounts;
        // if liquidity pool token amount is provided, the position is opened by liquidity pool token amount
        if(request.amountIsLiquidityPool) {
            _safeTransferFrom(_setupsInfo[setup.infoIndex].liquidityPoolTokenAddress, msg.sender, address(this), liquidityPoolAmount);
            (tokenAmounts, tokens) = amm.byLiquidityPoolAmount(_setupsInfo[setup.infoIndex].liquidityPoolTokenAddress, liquidityPoolAmount);
        } else {
            // else it is opened by the tokens amounts
            (liquidityPoolAmount, tokenAmounts, tokens) = amm.byTokenAmount(_setupsInfo[setup.infoIndex].liquidityPoolTokenAddress, _setupsInfo[setup.infoIndex].mainTokenAddress, mainTokenAmount);
        }

        // iterate the tokens and perform the transferFrom and the approve
        for(uint256 i = 0; i < tokens.length; i++) {
            if(tokens[i] == _setupsInfo[setup.infoIndex].mainTokenAddress) {
                mainTokenAmount = tokenAmounts[i];
                require(mainTokenAmount >= _setupsInfo[setup.infoIndex].minStakeable, "Invalid liquidity.");
                if(request.amountIsLiquidityPool) {
                    break;
                }
            }
            if(request.amountIsLiquidityPool) {
                continue;
            }
            if(_setupsInfo[setup.infoIndex].involvingETH && _setupsInfo[setup.infoIndex].ethereumAddress == tokens[i]) {
                require(msg.value == tokenAmounts[i], "Incorrect eth value");
            } else {
                _safeTransferFrom(tokens[i], msg.sender, address(this), tokenAmounts[i]);
                _safeApprove(tokens[i], _setupsInfo[setup.infoIndex].ammPlugin, tokenAmounts[i]);
            }
        }
    }

    function _addLiquidity(uint256 setupIndex, FarmingPositionRequest memory request) private returns(LiquidityPoolData memory liquidityPoolData, uint256 tokenAmount) {
        (IAMM amm, uint256 liquidityPoolAmount, uint256 mainTokenAmount) = _transferToMeAndCheckAllowance(_setups[setupIndex], request);
        // liquidity pool data struct for the AMM
        liquidityPoolData = LiquidityPoolData(
            _setupsInfo[_setups[setupIndex].infoIndex].liquidityPoolTokenAddress,
            request.amountIsLiquidityPool ? liquidityPoolAmount : mainTokenAmount,
            _setupsInfo[_setups[setupIndex].infoIndex].mainTokenAddress,
            request.amountIsLiquidityPool,
            _setupsInfo[_setups[setupIndex].infoIndex].involvingETH,
            address(this)
        );
        tokenAmount = mainTokenAmount;
        // amount is lp check
        if (liquidityPoolData.amountIsLiquidityPool || !_setupsInfo[_setups[setupIndex].infoIndex].involvingETH) {
            require(msg.value == 0, "ETH not involved");
        }
        if (liquidityPoolData.amountIsLiquidityPool) {
            return(liquidityPoolData, tokenAmount);
        }
        // retrieve the poolTokenAmount from the amm
        if(liquidityPoolData.involvingETH) {
            (liquidityPoolData.amount,,) = amm.addLiquidity{value : msg.value}(liquidityPoolData);
        } else {
            (liquidityPoolData.amount,,) = amm.addLiquidity(liquidityPoolData);
        }
    }

    /** @dev helper function used to remove liquidity from a free position or to burn item farm tokens and retrieve their content.
      * @param positionId id of the position.
      * @param setupIndex index of the setup related to the item farm tokens.
      * @param unwrapPair whether to unwrap the liquidity pool tokens or not.
      * @param isUnlock if we're removing liquidity from an unlock method or not.
     */
    function _removeLiquidity(uint256 positionId, uint256 setupIndex, bool unwrapPair, uint256 removedLiquidity, bool isUnlock) private {
        FarmingSetupInfo memory setupInfo = _setupsInfo[_setups[setupIndex].infoIndex];
        // create liquidity pool data struct for the AMM
        LiquidityPoolData memory lpData = LiquidityPoolData(
            setupInfo.liquidityPoolTokenAddress,
            removedLiquidity,
            setupInfo.mainTokenAddress,
            true,
            setupInfo.involvingETH,
            msg.sender
        );
        // retrieve the position
        FarmingPosition storage farmingPosition = _positions[positionId];
        // remaining liquidity
        uint256 remainingLiquidity;
        // we are removing liquidity using the setup items
        if (setupInfo.free && farmingPosition.creationBlock != 0 && positionId != 0) {
            // update the remaining liquidity
            remainingLiquidity = farmingPosition.liquidityPoolTokenAmount - removedLiquidity;
        }
        // retrieve fee stuff
        (uint256 exitFeePercentage, address exitFeeWallet) = IFarmFactory(_factory).feePercentageInfo();
        // pay the fees!
        if (exitFeePercentage > 0) {
            uint256 fee = (lpData.amount * ((exitFeePercentage * 1e18) / ONE_HUNDRED)) / 1e18;
            _safeTransfer(setupInfo.liquidityPoolTokenAddress, exitFeeWallet, fee);
            lpData.amount = lpData.amount - fee;
        }
        // check if the user wants to unwrap its pair or not
        if (unwrapPair) {
            // remove liquidity using AMM
            _safeApprove(lpData.liquidityPoolAddress, setupInfo.ammPlugin, lpData.amount);
            IAMM(setupInfo.ammPlugin).removeLiquidity(lpData);
        } else {
            // send back the liquidity pool token amount without the fee
            _safeTransfer(lpData.liquidityPoolAddress, lpData.receiver, lpData.amount);
        }
        if (!setupInfo.free && _setups[setupIndex].active && !isUnlock) {
            _toggleSetup(setupIndex);
        } else if (setupInfo.free && positionId != 0) {
            if (_setups[farmingPosition.setupIndex].active && _setups[farmingPosition.setupIndex].endBlock <= block.number) {
                _toggleSetup(farmingPosition.setupIndex);
            }
            // delete the farming position after the withdraw
            if (remainingLiquidity == 0) {
                _setupPositionsCount[farmingPosition.setupIndex] -= 1;
                if (_setupPositionsCount[farmingPosition.setupIndex] == 0 && !_setups[farmingPosition.setupIndex].active) {
                    _giveBack(_rewardReceived[farmingPosition.setupIndex] - _rewardPaid[farmingPosition.setupIndex]);
                    delete _setups[farmingPosition.setupIndex];
                }
                delete _positions[positionId];
            } else {
                // update the creation block and amount
                farmingPosition.liquidityPoolTokenAmount = remainingLiquidity;
            }
        }
    }

    /** @dev updates the free setup with the given index.
      * @param setupIndex index of the setup that we're updating.
      * @param amount amount of liquidity that we're adding/removeing.
      * @param positionId position id.
      * @param fromExit if it's from an exit or not.
     */
    function _updateFreeSetup(uint256 setupIndex, uint256 amount, uint256 positionId, bool fromExit) private {
        uint256 currentBlock = block.number < _setups[setupIndex].endBlock ? block.number : _setups[setupIndex].endBlock;
        if (_setups[setupIndex].totalSupply != 0) {
            uint256 lastUpdateBlock = _setups[setupIndex].lastUpdateBlock < _setups[setupIndex].startBlock ? _setups[setupIndex].startBlock : _setups[setupIndex].lastUpdateBlock;
            _rewardPerTokenPerSetup[setupIndex] += (((currentBlock - lastUpdateBlock) * _setups[setupIndex].rewardPerBlock) * 1e18) / _setups[setupIndex].totalSupply;
        }
        // update the last block update variable
        _setups[setupIndex].lastUpdateBlock = currentBlock;
        if (positionId != 0) {
            _rewardPerTokenPaid[positionId] = _rewardPerTokenPerSetup[setupIndex];
        }
        if (amount > 0) {
            fromExit ? _setups[setupIndex].totalSupply -= amount : _setups[setupIndex].totalSupply += amount;
        }
    }

    function _toggleSetup(uint256 setupIndex) private {
        FarmingSetup storage setup = _setups[setupIndex];
        // require(!setup.active || block.number >= setup.endBlock, "Not valid activation");

        require(block.number > _setupsInfo[setup.infoIndex].startBlock, "Too early for this setup");

        if (setup.active && block.number >= setup.endBlock && _setupsInfo[setup.infoIndex].renewTimes == 0) {
            setup.active = false;
            return;
        } else if (block.number >= setup.startBlock && block.number < setup.endBlock && setup.active) {
            setup.active = false;
            _setupsInfo[setup.infoIndex].renewTimes = 0;
            uint256 amount = (setup.endBlock - block.number) * setup.rewardPerBlock;
            setup.endBlock = block.number;
            if (_setupsInfo[setup.infoIndex].free) {
                _updateFreeSetup(setupIndex, 0, 0, false);
            }
            _rewardReceived[setupIndex] -= amount;
            _giveBack(amount);
            return;
        }

        bool wasActive = setup.active;
        setup.active = _ensureTransfer(setup.rewardPerBlock * _setupsInfo[setup.infoIndex].blockDuration);

        if (setup.active && wasActive) {
            _rewardReceived[_farmingSetupsCount] = setup.rewardPerBlock * _setupsInfo[setup.infoIndex].blockDuration;
            // set new setup
            _setups[_farmingSetupsCount] = abi.decode(abi.encode(setup), (FarmingSetup));
            // update old setup
            _setups[setupIndex].active = false;
            // update new setup
            _setupsInfo[setup.infoIndex].renewTimes -= 1;
            _setupsInfo[setup.infoIndex].setupsCount += 1;
            _setupsInfo[setup.infoIndex].lastSetupIndex = _farmingSetupsCount;
            _setups[_farmingSetupsCount].startBlock = block.number;
            _setups[_farmingSetupsCount].endBlock = block.number + _setupsInfo[_setups[_farmingSetupsCount].infoIndex].blockDuration;
            _setups[_farmingSetupsCount].objectId = 0;
            _setups[_farmingSetupsCount].totalSupply = 0;
            _farmingSetupsCount += 1;
        } else if (setup.active && !wasActive) {
            _rewardReceived[setupIndex] = setup.rewardPerBlock * _setupsInfo[_setups[setupIndex].infoIndex].blockDuration;
            // update new setup
            _setups[setupIndex].startBlock = block.number;
            _setups[setupIndex].endBlock = block.number + _setupsInfo[_setups[setupIndex].infoIndex].blockDuration;
            _setups[setupIndex].totalSupply = 0;
            _setupsInfo[_setups[setupIndex].infoIndex].renewTimes -= 1;
        } else {
            _setupsInfo[_setups[setupIndex].infoIndex].renewTimes = 0;
        }
    }

    /** @dev mints a new FarmToken inside the collection for the given position.
      * @param uniqueOwner farming position owner.
      * @param amount amount of to mint for a farm token.
      * @param setupIndex index of the setup.
      * @return objectId new farm token object id.
     */
    function _mintFarmTokenAmount(address uniqueOwner, uint256 amount, uint256 setupIndex) private returns(uint256 objectId) {
        if (_setups[setupIndex].objectId == 0) {
            (objectId,) = INativeV1(_farmTokenCollection).mint(amount, string(abi.encodePacked("Farming LP ", _toString(_setupsInfo[_setups[setupIndex].infoIndex].liquidityPoolTokenAddress))), "fLP", IFarmFactory(_factory).getFarmTokenURI(), true);
            emit FarmToken(objectId, _setupsInfo[_setups[setupIndex].infoIndex].liquidityPoolTokenAddress, setupIndex, _setups[setupIndex].endBlock);
            _objectIdSetup[objectId] = setupIndex;
            _setups[setupIndex].objectId = objectId;
        } else {
            INativeV1(_farmTokenCollection).mint(_setups[setupIndex].objectId, amount);
        }
        INativeV1(_farmTokenCollection).safeTransferFrom(address(this), uniqueOwner, _setups[setupIndex].objectId, amount, "");
    }

    /** @dev burns a farm token from the collection.
      * @param objectId object id where to burn liquidity.
      * @param amount amount of liquidity to burn.
      */
    function _burnFarmTokenAmount(uint256 objectId, uint256 amount) private {
        INativeV1 tokenCollection = INativeV1(_farmTokenCollection);
        // transfer the farm token to this contract
        tokenCollection.safeTransferFrom(msg.sender, address(this), objectId, amount, "");
        // burn the farm token
        tokenCollection.burn(objectId, amount);
    }

    /** @dev function used to safely approve ERC20 transfers.
      * @param erc20TokenAddress address of the token to approve.
      * @param to receiver of the approval.
      * @param value amount to approve for.
     */
    function _safeApprove(address erc20TokenAddress, address to, uint256 value) internal virtual {
        bytes memory returnData = _call(erc20TokenAddress, abi.encodeWithSelector(IERC20(erc20TokenAddress).approve.selector, to, value));
        require(returnData.length == 0 || abi.decode(returnData, (bool)), 'APPROVE_FAILED');
    }

    /** @dev function used to safe transfer ERC20 tokens.
      * @param erc20TokenAddress address of the token to transfer.
      * @param to receiver of the tokens.
      * @param value amount of tokens to transfer.
     */
    function _safeTransfer(address erc20TokenAddress, address to, uint256 value) internal virtual {
        bytes memory returnData = _call(erc20TokenAddress, abi.encodeWithSelector(IERC20(erc20TokenAddress).transfer.selector, to, value));
        require(returnData.length == 0 || abi.decode(returnData, (bool)), 'TRANSFER_FAILED');
    }

    /** @dev this function safely transfers the given ERC20 value from an address to another.
      * @param erc20TokenAddress erc20 token address.
      * @param from address from.
      * @param to address to.
      * @param value amount to transfer.
     */
    function _safeTransferFrom(address erc20TokenAddress, address from, address to, uint256 value) private {
        bytes memory returnData = _call(erc20TokenAddress, abi.encodeWithSelector(IERC20(erc20TokenAddress).transferFrom.selector, from, to, value));
        require(returnData.length == 0 || abi.decode(returnData, (bool)), 'TRANSFERFROM_FAILED');
    }

    /** @dev calls the contract at the given location using the given payload and returns the returnData.
      * @param location location to call.
      * @param payload call payload.
      * @return returnData call return data.
     */
    function _call(address location, bytes memory payload) private returns(bytes memory returnData) {
        assembly {
            let result := call(gas(), location, 0, add(payload, 0x20), mload(payload), 0, 0)
            let size := returndatasize()
            returnData := mload(0x40)
            mstore(returnData, size)
            let returnDataPayloadStart := add(returnData, 0x20)
            returndatacopy(returnDataPayloadStart, 0, size)
            mstore(0x40, add(returnDataPayloadStart, size))
            switch result case 0 {revert(returnDataPayloadStart, size)}
        }
    }

    /** @dev returns the input address to string.
      * @param _addr address to convert as string.
      * @return address as string.
     */
    function _toString(address _addr) internal pure returns(string memory) {
        bytes32 value = bytes32(uint256(_addr));
        bytes memory alphabet = "0123456789abcdef";

        bytes memory str = new bytes(42);
        str[0] = '0';
        str[1] = 'x';
        for (uint i = 0; i < 20; i++) {
            str[2+i*2] = alphabet[uint(uint8(value[i + 12] >> 4))];
            str[3+i*2] = alphabet[uint(uint8(value[i + 12] & 0x0f))];
        }
        return string(str);
    }

    /** @dev gives back the reward to the extension.
      * @param amount to give back.
     */
    function _giveBack(uint256 amount) private {
        if(amount == 0) {
            return;
        }
        if (_rewardTokenAddress == address(0)) {
            IFarmExtension(_extension).backToYou{value : amount}(amount);
        } else {
            _safeApprove(_rewardTokenAddress, _extension, amount);
            IFarmExtension(_extension).backToYou(amount);
        }
    }

    /** @dev ensures the transfer from the contract to the extension.
      * @param amount amount to transfer.
     */
    function _ensureTransfer(uint256 amount) private returns(bool) {
        uint256 initialBalance = _rewardTokenAddress == address(0) ? address(this).balance : IERC20(_rewardTokenAddress).balanceOf(address(this));
        uint256 expectedBalance = initialBalance + amount;
        try IFarmExtension(_extension).transferTo(amount) {} catch {}
        uint256 actualBalance = _rewardTokenAddress == address(0) ? address(this).balance : IERC20(_rewardTokenAddress).balanceOf(address(this));
        if(actualBalance == expectedBalance) {
            return true;
        }
        _giveBack(actualBalance - initialBalance);
        return false;
    }
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"objectId","type":"uint256"},{"indexed":true,"internalType":"address","name":"liquidityPoolToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"setupIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endBlock","type":"uint256"}],"name":"FarmToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rewardTokenAddress","type":"address"}],"name":"RewardToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"mainToken","type":"address"},{"indexed":true,"internalType":"address","name":"involvedToken","type":"address"}],"name":"SetupToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"positionId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"ONE_HUNDRED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_extension","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_farmTokenCollection","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_farmingSetupsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_farmingSetupsInfoCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_partiallyRedeemed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_rewardPaid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_rewardReceived","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_rewardTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"setupInfoIndex","type":"uint256"}],"name":"activateSetup","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"positionId","type":"uint256"},{"components":[{"internalType":"uint256","name":"setupIndex","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"amountIsLiquidityPool","type":"bool"},{"internalType":"address","name":"positionOwner","type":"address"}],"internalType":"struct FarmingPositionRequest","name":"request","type":"tuple"}],"name":"addLiquidity","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"positionId","type":"uint256"},{"internalType":"bool","name":"isExt","type":"bool"}],"name":"calculateFreeFarmingReward","outputs":[{"internalType":"uint256","name":"reward","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"setupIndex","type":"uint256"},{"internalType":"uint256","name":"mainTokenAmount","type":"uint256"},{"internalType":"bool","name":"isPartial","type":"bool"},{"internalType":"uint256","name":"positionId","type":"uint256"}],"name":"calculateLockedFarmingReward","outputs":[{"internalType":"uint256","name":"reward","type":"uint256"},{"internalType":"uint256","name":"relativeRewardPerBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"extension","type":"address"},{"internalType":"bytes","name":"extensionInitData","type":"bytes"},{"internalType":"address","name":"orchestrator","type":"address"},{"internalType":"address","name":"rewardTokenAddress","type":"address"},{"internalType":"bytes","name":"farmingSetupInfosBytes","type":"bytes"}],"name":"init","outputs":[{"internalType":"bytes","name":"extensionReturnCall","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"setupIndex","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"amountIsLiquidityPool","type":"bool"},{"internalType":"address","name":"positionOwner","type":"address"}],"internalType":"struct FarmingPositionRequest","name":"request","type":"tuple"}],"name":"openPosition","outputs":[{"internalType":"uint256","name":"positionId","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"positionId","type":"uint256"}],"name":"position","outputs":[{"components":[{"internalType":"address","name":"uniqueOwner","type":"address"},{"internalType":"uint256","name":"setupIndex","type":"uint256"},{"internalType":"uint256","name":"creationBlock","type":"uint256"},{"internalType":"uint256","name":"liquidityPoolTokenAmount","type":"uint256"},{"internalType":"uint256","name":"mainTokenAmount","type":"uint256"},{"internalType":"uint256","name":"reward","type":"uint256"},{"internalType":"uint256","name":"lockedRewardPerBlock","type":"uint256"}],"internalType":"struct FarmingPosition","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bool","name":"add","type":"bool"},{"internalType":"bool","name":"disable","type":"bool"},{"internalType":"uint256","name":"index","type":"uint256"},{"components":[{"internalType":"bool","name":"free","type":"bool"},{"internalType":"uint256","name":"blockDuration","type":"uint256"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"originalRewardPerBlock","type":"uint256"},{"internalType":"uint256","name":"minStakeable","type":"uint256"},{"internalType":"uint256","name":"maxStakeable","type":"uint256"},{"internalType":"uint256","name":"renewTimes","type":"uint256"},{"internalType":"address","name":"ammPlugin","type":"address"},{"internalType":"address","name":"liquidityPoolTokenAddress","type":"address"},{"internalType":"address","name":"mainTokenAddress","type":"address"},{"internalType":"address","name":"ethereumAddress","type":"address"},{"internalType":"bool","name":"involvingETH","type":"bool"},{"internalType":"uint256","name":"penaltyFee","type":"uint256"},{"internalType":"uint256","name":"setupsCount","type":"uint256"},{"internalType":"uint256","name":"lastSetupIndex","type":"uint256"}],"internalType":"struct FarmingSetupInfo","name":"info","type":"tuple"}],"internalType":"struct FarmingSetupConfiguration[]","name":"farmingSetups","type":"tuple[]"}],"name":"setFarmingSetups","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"setupIndex","type":"uint256"}],"name":"setup","outputs":[{"components":[{"internalType":"uint256","name":"infoIndex","type":"uint256"},{"internalType":"bool","name":"active","type":"bool"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"endBlock","type":"uint256"},{"internalType":"uint256","name":"lastUpdateBlock","type":"uint256"},{"internalType":"uint256","name":"objectId","type":"uint256"},{"internalType":"uint256","name":"rewardPerBlock","type":"uint256"},{"internalType":"uint256","name":"totalSupply","type":"uint256"}],"internalType":"struct FarmingSetup","name":"","type":"tuple"},{"components":[{"internalType":"bool","name":"free","type":"bool"},{"internalType":"uint256","name":"blockDuration","type":"uint256"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"originalRewardPerBlock","type":"uint256"},{"internalType":"uint256","name":"minStakeable","type":"uint256"},{"internalType":"uint256","name":"maxStakeable","type":"uint256"},{"internalType":"uint256","name":"renewTimes","type":"uint256"},{"internalType":"address","name":"ammPlugin","type":"address"},{"internalType":"address","name":"liquidityPoolTokenAddress","type":"address"},{"internalType":"address","name":"mainTokenAddress","type":"address"},{"internalType":"address","name":"ethereumAddress","type":"address"},{"internalType":"bool","name":"involvingETH","type":"bool"},{"internalType":"uint256","name":"penaltyFee","type":"uint256"},{"internalType":"uint256","name":"setupsCount","type":"uint256"},{"internalType":"uint256","name":"lastSetupIndex","type":"uint256"}],"internalType":"struct FarmingSetupInfo","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"setups","outputs":[{"components":[{"internalType":"uint256","name":"infoIndex","type":"uint256"},{"internalType":"bool","name":"active","type":"bool"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"endBlock","type":"uint256"},{"internalType":"uint256","name":"lastUpdateBlock","type":"uint256"},{"internalType":"uint256","name":"objectId","type":"uint256"},{"internalType":"uint256","name":"rewardPerBlock","type":"uint256"},{"internalType":"uint256","name":"totalSupply","type":"uint256"}],"internalType":"struct FarmingSetup[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"positionId","type":"uint256"}],"name":"transferPosition","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"positionId","type":"uint256"},{"internalType":"bool","name":"unwrapPair","type":"bool"}],"name":"unlock","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"positionId","type":"uint256"},{"internalType":"uint256","name":"objectId","type":"uint256"},{"internalType":"bool","name":"unwrapPair","type":"bool"},{"internalType":"uint256","name":"removedLiquidity","type":"uint256"}],"name":"withdrawLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"positionId","type":"uint256"}],"name":"withdrawReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

Deployed Bytecode

0x6080604052600436106101a05760003560e01c80636b41674c116100ec578063c5cc6b6a1161008a578063e6ec9ea711610064578063e6ec9ea714610482578063f23a6e61146104a2578063f7a95a9e146104c2578063fb46caba146104ef576101a7565b8063c5cc6b6a1461043a578063c8df9d311461044f578063d8ff139a14610462576101a7565b8063a9e86c1f116100c6578063a9e86c1f146103aa578063ab2c3f15146103d8578063bc197c81146103f8578063bfaa8cca14610425576101a7565b80636b41674c146103575780638d2c2fb41461036a578063a9015c5c1461038a576101a7565b806340f1f4af116101595780634f39d1f5116101335780634f39d1f5146102c8578063523a3f08146102f557806354c1fc32146103155780635c4b406414610337576101a7565b806340f1f4af146102705780634313b9e51461028557806349fd034a146102b3576101a7565b806301ffc9a7146101ac57806305c85b40146101e2578063207c6efa14610204578063397d321c146102315780633ae1dd9d14610246578063403be1ff1461025b576101a7565b366101a757005b600080fd5b3480156101b857600080fd5b506101cc6101c736600461501b565b61050f565b6040516101d991906154eb565b60405180910390f35b3480156101ee57600080fd5b506101f7610532565b6040516101d991906153f2565b34801561021057600080fd5b5061022461021f3660046151d7565b610541565b6040516101d99190615dbc565b61024461023f3660046152c3565b610553565b005b34801561025257600080fd5b506101f761072a565b34801561026757600080fd5b506101f7610739565b34801561027c57600080fd5b50610224610748565b34801561029157600080fd5b506102a56102a03660046151d7565b61074e565b6040516101d9929190615bfd565b3480156102bf57600080fd5b5061022461096e565b3480156102d457600080fd5b506102e86102e3366004614b6d565b610974565b6040516101d9919061550b565b34801561030157600080fd5b506102446103103660046151d7565b610c3f565b34801561032157600080fd5b5061032a6110d1565b6040516101d9919061549c565b34801561034357600080fd5b5061022461035236600461529f565b6111ca565b61024461036536600461529f565b61136d565b34801561037657600080fd5b50610244610385366004614bef565b611596565b34801561039657600080fd5b506102446103a53660046152ef565b6118a5565b3480156103b657600080fd5b506103ca6103c53660046152ef565b611c23565b6040516101d9929190615e22565b3480156103e457600080fd5b506102246103f33660046151d7565b611e4d565b34801561040457600080fd5b506104186104133660046149fd565b611e5f565b6040516101d991906154f6565b34801561043157600080fd5b50610224611e9e565b34801561044657600080fd5b506101f7611eaa565b61022461045d3660046150ac565b611eb9565b34801561046e57600080fd5b5061024461047d3660046151d7565b6121f6565b34801561048e57600080fd5b5061022461049d3660046151d7565b612272565b3480156104ae57600080fd5b506104186104bd366004614aa6565b612284565b3480156104ce57600080fd5b506104e26104dd3660046151d7565b6122c3565b6040516101d99190615bab565b3480156104fb57600080fd5b5061024461050a366004614c5c565b612337565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b6003546001600160a01b031681565b600f6020526000908152604090205481565b805160008181526007602052604090206001015460ff1661058f5760405162461bcd60e51b815260040161058690615aa8565b60405180910390fd5b60008181526007602052604090206002015443108015906105c0575060008181526007602052604090206003015443105b6105dc5760405162461bcd60e51b81526004016105869061565b565b60008381526009602052604090205483906001600160a01b031633148015610614575060008181526009602052604090206002015415155b6106305760405162461bcd60e51b8152600401610586906156fe565b6000848152600960209081526040808320600181015484526007835281842080548552600590935292205460ff1661067a5760405162461bcd60e51b815260040161058690615b01565b600061068a8360010154876123e1565b509050816007015482600601548360040154430302670de0b6b3a764000002816106b057fe5b60018501546000908152600a6020526040812080549390920490920190556106d99088906111ca565b600584015560018301546000908152600a6020908152604080832054998352600b82529091209790975590950151600390910180548201905543600486015560079094018054909401909355505050565b6002546001600160a01b031681565b6004546001600160a01b031681565b60065481565b610756614654565b61075e61469b565b6007600084815260200190815260200160002060056000600760008781526020019081526020016000206000015481526020019081526020016000208160405180610100016040529081600082015481526020016001820160009054906101000a900460ff161515151581526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481525050915080604051806101e00160405290816000820160009054906101000a900460ff161515151581526020016001820154815260200160028201548152602001600382015481526020016004820154815260200160058201548152602001600682015481526020016007820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016008820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016009820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001600a820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001600a820160149054906101000a900460ff16151515158152602001600b8201548152602001600c8201548152602001600d82015481525050905091509150915091565b60085481565b6001546060906001600160a01b0316156109a05760405162461bcd60e51b815260040161058690615a44565b600280546001600160a01b0319166001600160a01b0388169081179091556109da5760405162461bcd60e51b8152600401610586906159d1565b600180546001600160a01b03199081163317909155600380546001600160a01b0386169216821790556040517fd9078653fc0ab56789d31bc2c38fcaecf28034549baf737c02b719513837563b90600090a2845160208601207fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47014610a7257600254610a6f906001600160a01b0316866126bd565b90505b836001600160a01b03166382cefdde60018060009054906101000a90046001600160a01b03166001600160a01b0316636733b93c6040518163ffffffff1660e01b815260040160006040518083038186803b158015610ad057600080fd5b505afa158015610ae4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b0c919081019061505f565b30604051602401610b1f93929190615721565b60408051601f198184030181529181526020820180516001600160e01b0316636d0d57f560e11b1790525160e083901b6001600160e01b0319168152610b68919060040161551e565b600060405180830381600087803b158015610b8257600080fd5b505af1158015610b96573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610bbe9190810190614b0c565b50600480546001600160a01b0319166001600160a01b0392909216919091179055815115610c3657600082806020019051810190610bfc9190614e3f565b905060005b8151811015610c3357610c2b828281518110610c1957fe5b602002602001015160016000806126ff565b600101610c01565b50505b95945050505050565b60008181526009602052604090205481906001600160a01b031633148015610c77575060008181526009602052604090206002015415155b610c935760405162461bcd60e51b8152600401610586906156fe565b600082815260096020908152604080832060058082015460018301548652600785528386205486529352922054439060ff16610d60576000836005015411610ced5760405162461bcd60e51b8152600401610586906158ac565b610cfb600080600188611c23565b506005840154909250821115610d235760405162461bcd60e51b81526004016105869061584f565b6001830154600090815260076020526040902060030154811015610d4d5781836005015403610d50565b60005b6005840155436002840155610e3d565b60018301546000908152600760205260409020600301548111610d835780610d9b565b60018301546000908152600760205260409020600301545b6001840154600090815260076020819052604090912090810154600682015460049092015492935091830302670de0b6b3a76400000281610dd857fe5b60018501546000908152600a602052604081208054939092049092019055610e019086906111ca565b6001840180546000908152600a60209081526040808320548a8452600b8352818420556005880183905592548252600790522060040182905591505b8115610f11576003546001600160a01b031615610e75576003548354610e70916001600160a01b03908116911684612f4d565b610ef7565b82546040516000916001600160a01b0316908490610e92906153ef565b60006040518083038185875af1925050503d8060008114610ecf576040519150601f19603f3d011682016040523d82523d6000602084013e610ed4565b606091505b5050905080610ef55760405162461bcd60e51b815260040161058690615ad2565b505b600183015460009081526010602052604090208054830190555b6001830154600090815260076020526040902060030154431061108d576001808401546000908152600760205260409020015460ff1615610f5957610f598360010154612fe2565b60018301546000908152600760209081526040808320548352600590915290205460ff16611088576001830180546000908152600e60205260408082208054600019019055915481522054158015610fc757506001808401546000908152600760205260409020015460ff16155b15611044576001830154600090815260106020908152604080832054600f90925290912054610ff7919003613380565b60018084015460009081526007602081905260408220828155928301805460ff19169055600283018290556003830182905560048301829055600583018290556006830182905591909101555b600085815260096020526040812080546001600160a01b03191681556001810182905560028101829055600381018290556004810182905560058101829055600601555b6110ca565b60018301546000908152600760209081526040808320548352600590915290205460ff166110ca576000858152600c602052604090208054830190555b5050505050565b606060006008546001600160401b03811180156110ed57600080fd5b5060405190808252806020026020018201604052801561112757816020015b611114614654565b81526020019060019003908161110c5790505b50905060005b6008548110156111c45760008181526007602081815260409283902083516101008101855281548152600182015460ff161515928101929092526002810154938201939093526003830154606082015260048301546080820152600583015460a0820152600683015460c082015291015460e082015282518390839081106111b157fe5b602090810291909101015260010161112d565b50905090565b6000828152600960209081526040808320815160e08101835281546001600160a01b03168152600182015481850190815260028301548285015260038301546060830181905260048401546080840152600584015460a084015260069093015460c0830152878652600b85528386205490518652600a909452918420549192670de0b6b3a764000092030204915082156113625760208082015160009081526007909152604081206003015443106112995760208083015160009081526007909152604090206003015461129b565b435b6020808401805160009081526007909252604080832060020154915183528220600401549293509091106112e6576020808401516000908152600790915260409020600401546112ff565b6020808401516000908152600790915260409020600201545b6020848101805160009081526007928390526040808220909301549151815291822060060154929350909183850302670de0b6b3a7640000028161133f57fe5b049050670de0b6b3a7640000846060015182028161135957fe5b04850194505050505b60a001510192915050565b60008281526009602052604090205482906001600160a01b0316331480156113a5575060008181526009602052604090206002015415155b6113c15760405162461bcd60e51b8152600401610586906156fe565b6000838152600960209081526040808320600181015484526007835281842054845260059092529091205460ff161580156114115750600181015460009081526007602052604090206003015443105b61142d5760405162461bcd60e51b8152600401610586906159f4565b6000848152600c602090815260408083205460018501548452600783528184205484526005909252909120600b0154156114a7576001820154600090815260076020908152604080832054835260059091529020600b0154670de0b6b3a7640000908190810204836005015402816114a157fe5b046114aa565b60005b0180156114d2576003546114c9906001600160a01b031633308461347e565b6114d281613380565b60048201546001830180546000908152600760208190526040808320909101805494909403909355905481522060050154600383015461151291906134de565b61152885836001015486856003015460016135ac565b506003818101546001928301546000908152600e60209081526040808320805494909403600019019093559681526009909652852080546001600160a01b03191681559182018590556002820185905581018490556004810184905560058101849055600601929092555050565b60008181526009602052604090205481906001600160a01b0316331480156115ce575060008181526009602052604090206002015415155b6115ea5760405162461bcd60e51b8152600401610586906156fe565b600082815260096020908152604091829020825160e08101845281546001600160a01b0390811682526001830154938201939093526002820154938101939093526003810154606084015260048101546080840152600581015460a08401526006015460c08301528416158015906116655750604081015115155b6116815760405162461bcd60e51b815260040161058690615543565b6020808201516000908152600782526040808220548252600590925290812054859060ff166116b057436116b3565b60005b6020808501516040516116c89493920161547b565b60408051601f19818403018152918152815160209283012060008181526009909352912060020154909150156117105760405162461bcd60e51b8152600401610586906155e5565b816040516020016117219190615bab565b60405160208183030381529060405280602001905181019061174391906150c7565b6009600083815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c08201518160060155905050846009600083815260200190815260200160002060000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060096000858152602001908152602001600020600080820160006101000a8154906001600160a01b0302191690556001820160009055600282016000905560038201600090556004820160009055600582016000905560068201600090555050846001600160a01b0316336001600160a01b0316827f0a429aba3d89849a2db0153e4534d95c46a1d83c8109d73893f55ebc44010ff460405160405180910390a45050505050565b600084815260096020908152604091829020825160e08101845281546001600160a01b0316815260018201549281018390526002820154938101939093526003810154606084015260048101546080840152600581015460a08401526006015460c083015284158015906119a2575060048054604051630c0f6b7160e01b81526000926001600160a01b0390921691630c0f6b7191611946918a9101615dbc565b60206040518083038186803b15801561195e57600080fd5b505afa158015611972573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119969190615043565b6001600160a01b031614155b156119b857506000848152600d60205260409020545b85158015906119c5575084155b806119f4575084158015906119d8575085155b80156119f4575060008181526007602052604090206005015485145b611a105760405162461bcd60e51b815260040161058690615543565b60208083015160009081526007825260408082205482526005909252205460ff168015611a405750604082015115155b8015611a50575081606001518311155b8015611a65575081516001600160a01b031633145b80611b0b575060048054604051627eeac760e11b815285926001600160a01b039092169162fdd58e91611a9c9133918b910161543e565b60206040518083038186803b158015611ab457600080fd5b505afa158015611ac8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aec91906151ef565b10158015611b0b57506000818152600760205260409020600301544310155b611b275760405162461bcd60e51b8152600401610586906156d4565b85611b3b57611b3685846134de565b611b62565b611b4486610c3f565b60208083015160009081526007918290526040902001805484900390555b611b708682868660006135ac565b85611c1b576000818152600e60205260409020805484900390819055158015611bab575060008181526007602052604090206001015460ff16155b15611c1b57600081815260106020908152604080832054600f90925290912054611bd6919003613380565b6000818152600760208190526040822082815560018101805460ff19169055600281018390556003810183905560048101839055600581018390556006810183905501555b505050505050565b6000808315611cdd576000838152600960209081526040808320815160e08101835281546001600160a01b031681526001820154818501819052600283015482850152600380840154606084015260048401546080840152600584015460a084015260069093015460c0830152855260079093529083200154909190431015611cac5743611cc5565b6020808301516000908152600790915260409020600301545b90508160c00151826040015182030293505050611e44565b60008681526007602081815260408084208151610100810183528154808252600183015460ff16151582860152600283015482850152600383015460608301526004830154608083015260058084015460a0840152600684015460c0840152929095015460e082018190529486529281905293209092015403861115611d755760405162461bcd60e51b815260040161058690615b54565b60008160600151431015611d8f5743826060015103611d92565b60005b905060008111611db45760405162461bcd60e51b8152600401610586906156a8565b6000818360c001510211611dda5760405162461bcd60e51b815260040161058690615b30565b60008881526007602090815260408083205483526005918290529091200154670de0b6b3a76400009088820281611e0d57fe5b048360c001510281611e1b57fe5b04925060008311611e3e5760405162461bcd60e51b81526004016105869061591f565b82029250505b94509492505050565b60106020526000908152604090205481565b6004546000906001600160a01b03163314611e8c5760405162461bcd60e51b815260040161058690615804565b5063bc197c8160e01b95945050505050565b670de0b6b3a764000081565b6001546001600160a01b031681565b805160008181526007602052604081206001015490919060ff16611eef5760405162461bcd60e51b815260040161058690615aa8565b6000818152600760205260409020600201544310801590611f20575060008181526007602052604090206003015443105b611f3c5760405162461bcd60e51b81526004016105869061565b565b8251600090815260076020526040812060608501519091906001600160a01b0316611f675733611f6d565b84606001515b8254600090815260056020526040902054909150819060ff16611f905743611f93565b60005b8651604051611fa79392919060200161547b565b60408051601f1981840301815291815281516020928301206000818152600990935291206002015490945015611fef5760405162461bcd60e51b815260040161058690615886565b6000806120008760000151886123e1565b855460009081526005602052604081205492945090925090819060ff166120885788516120309084600080611c23565b909250905081158015906120445750600081115b6120605760405162461bcd60e51b8152600401610586906155ae565b6007860180548401905543600487015560208401518951612082918791613a4f565b5061209d565b61209d896000015185602001518a6000613d4a565b6040518060e00160405280866001600160a01b031681526020018a6000015181526020014381526020018560200151815260200184815260200183815260200182815250600960008a815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c08201518160060155905050600560008760000154815260200190815260200160002060000160009054906101000a900460ff16612196578360200151612199565b60005b89516000908152600e6020526040808220805490930160010190925590516001600160a01b03871691908a907f0a429aba3d89849a2db0153e4534d95c46a1d83c8109d73893f55ebc44010ff4908390a450505050505050919050565b6000818152600560205260409020600601541580159061223857506000818152600560209081526040808320600d01548352600790915290206001015460ff16155b6122545760405162461bcd60e51b815260040161058690615944565b6000818152600560205260409020600d015461226f90612fe2565b50565b600c6020526000908152604090205481565b6004546000906001600160a01b031633146122b15760405162461bcd60e51b815260040161058690615804565b5063f23a6e6160e01b95945050505050565b6122cb614739565b50600090815260096020908152604091829020825160e08101845281546001600160a01b031681526001820154928101929092526002810154928201929092526003820154606082015260048201546080820152600582015460a082015260069091015460c082015290565b6002546001600160a01b031633146123615760405162461bcd60e51b815260040161058690615635565b60005b81518110156123dd576123d582828151811061237c57fe5b60200260200101516060015183838151811061239457fe5b6020026020010151600001518484815181106123ac57fe5b6020026020010151602001518585815181106123c457fe5b6020026020010151604001516126ff565b600101612364565b5050565b6123e961477f565b600083815260076020818152604080842081516101008101835281548152600182015460ff161515938101939093526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c08301529091015460e08201528190819081906124659087613eb1565b6040805160c08101825260008c8152600760209081528382205482526005815290839020600801546001600160a01b03168252918b01519497509295509093509091908201906124b557826124b7565b835b8152600089815260076020908152604080832054808452600580845282852060098101546001600160a01b0316858801528d8401511515938701939093529352919052600a0154600160a01b900460ff161515606080830191909152306080909201919091528101519095509093508390806125595750600087815260076020908152604080832054835260059091529020600a0154600160a01b900460ff16155b1561257c57341561257c5760405162461bcd60e51b8152600401610586906157da565b84606001511561258e575050506126b6565b8460800151156126285760405163d2283c0960e01b81526001600160a01b0384169063d2283c099034906125c6908990600401615d6b565b6000604051808303818588803b1580156125df57600080fd5b505af11580156125f3573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f1916820160405261261c9190810190615236565b505060208601526126b2565b60405163d2283c0960e01b81526001600160a01b0384169063d2283c0990612654908890600401615d6b565b600060405180830381600087803b15801561266e57600080fd5b505af1158015612682573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526126aa9190810190615236565b505060208601525b5050505b9250929050565b60606000808351602085016000875af13d604051925080835260208301816000823e8082016040528280156126f1576126f5565b8282fd5b5050505092915050565b83838061270a575082155b1561272d5760c0810180516001019081905261272d5760c0810180516000190190525b8315612cb85760e08101516001600160a01b03161580159061275c57506101008101516001600160a01b031615155b801561276c575060008160600151115b80156127845750805180612784575060008160a00151115b6127a05760405162461bcd60e51b81526004016105869061596d565b60e0810151610100820151604051634467d1db60e01b81526000926001600160a01b031691634467d1db916127d891906004016153f2565b60006040518083038186803b1580156127f057600080fd5b505afa158015612804573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261282c9190810190615236565b60006101408601526101608501519093501591506128cd9050578160e001516001600160a01b03166373d4a13a6040518163ffffffff1660e01b815260040160606040518083038186803b15801561288357600080fd5b505afa158015612897573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128bb9190614c1a565b50506001600160a01b03166101408301525b60008060005b83518110156129e5578461012001516001600160a01b03168482815181106128f757fe5b60200260200101516001600160a01b0316141561294e57600192508461014001516001600160a01b031684828151811061292d57fe5b60200260200101516001600160a01b0316141561294957600191505b6129dd565b83818151811061295a57fe5b60200260200101516001600160a01b03168561012001516001600160a01b03167fceb0f4ddf364ffb007b08eed9029e1e7e711b894ed4ae9309f30527d3611668960405160405180910390a38461014001516001600160a01b03168482815181106129c157fe5b60200260200101516001600160a01b031614156129dd57600191505b6001016128d3565b5081612a035760405162461bcd60e51b8152600401610586906158f8565b8361016001511580612a125750805b612a2e5760405162461bcd60e51b81526004016105869061560f565b6000846101a00181815250508360056000600654815260200190815260200160002060008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e08201518160070160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506101008201518160080160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506101208201518160090160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555061014082015181600a0160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555061016082015181600a0160146101000a81548160ff02191690831515021790555061018082015181600b01556101a082015181600c01556101c082015181600d01559050506040518061010001604052806006548152602001600015158152602001600081526020016000815260200160008152602001600081526020018560600151815260200160008152506007600060085481526020019081526020016000206000820151816000015560208201518160010160006101000a81548160ff02191690831515021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e08201518160070155905050600854600560006006548152602001908152602001600020600d01819055506001600660008282540192505081905550600160086000828254019250508190555050505050612f47565b5060008181526007602081815260408084208054855260058084529482902082516101e081018452815460ff9081161515825260018301549582019590955260028201549381019390935260038101546060840152600481015460808401529485015460a0830152600685015460c0830152928401546001600160a01b0390811660e08301526008850154811661010083015260098501548116610120830152600a850154908116610140830152600160a01b90049091161515610160820152600b830154610180820152600c8301546101a0820152600d909201546101c08301528315612dd457600181015460ff16612dc45760405162461bcd60e51b815260040161058690615682565b612dcd83612fe2565b5050612f47565b60c086018051600019019052600181015460ff168015612e0f57506000838152600760209081526040808320548352600590915290205460ff165b15612efc575060008281526007602052604090206003810154431015612ed75760008260600151876060015110612e50578260600151876060015103612e5c565b86606001518360600151035b60038301549091504390038082028015612ed357846060015189606001511115612eba57612e89816142b2565b612ea55760405162461bcd60e51b81526004016105869061556d565b6000868152600f602052604090208054820190555b612ec8866000806000613d4a565b606089015160068501555b5050505b6060860151600084815260076020908152604080832054835260059091529020600301555b6000838152600760209081526040808320548352600590915290206006015415611c1b5760c08601516000848152600760209081526040808320548352600590915290206006015550505b50505050565b6000612fa58463a9059cbb60e01b8585604051602401612f6e92919061543e565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526126bd565b9050805160001480612fc6575080806020019051810190612fc69190614fff565b612f475760405162461bcd60e51b8152600401610586906158cf565b60008181526007602090815260408083208054845260059092529091206002015443116130215760405162461bcd60e51b815260040161058690615a71565b600181015460ff168015613039575080600301544310155b801561305657508054600090815260056020526040902060060154155b1561306b57600101805460ff1916905561226f565b806002015443101580156130825750806003015443105b80156130925750600181015460ff165b156131145760018101805460ff1916905580546000908152600560205260408082206006908101839055830154600384018054439182905585548552929093205492909103029060ff16156130ef576130ef836000806000613d4a565b6000838152600f602052604090208054829003905561310d81613380565b505061226f565b6001808201548254600090815260056020526040902090910154600683015460ff9092169161314391026142b2565b60018301805460ff1916911515919091179081905560ff1680156131645750805b156132da57815460009081526005602090815260408083206001015460068601546008548552600f845293829020930290925590516131a591849101615d04565b6040516020818303038152906040528060200190518101906131c79190615148565b60088054600090815260076020818152604080842086518155868301516001808301805492151560ff199384161790558884015160028085019190915560608a015160038086019190915560808b0151600486015560a08b015160058087019190915560c08c015160068088019190915560e0909c0151958901959095558d8952858920830180549094169093558b54885283865284882090990180546000190190558a548752838720600c0180548201905587548b548852848820600d018190558752858552838720439901899055875487528387208054885283865284882082015495879052949098019301929092558454845280842090910183905583548352822001558054909101905561337b565b600182015460ff1680156132ec575080155b1561335b57600083815260076020818152604080842080548552600580845282862060019081015460068a8101548c8a52600f8852868a20920290915543600285018190558454895292909552928620928301540160038201559092019290925501805460001901905561337b565b600083815260076020908152604080832054835260059091528120600601555b505050565b8061338a5761226f565b6003546001600160a01b0316613403576002546040516302b492b560e11b81526001600160a01b0390911690630569256a9083906133cc908290600401615dbc565b6000604051808303818588803b1580156133e557600080fd5b505af11580156133f9573d6000803e3d6000fd5b505050505061226f565b600354600254613420916001600160a01b03908116911683614479565b6002546040516302b492b560e11b81526001600160a01b0390911690630569256a90613450908490600401615dbc565b600060405180830381600087803b15801561346a57600080fd5b505af11580156110ca573d6000803e3d6000fd5b60006134a1856323b872dd60e01b868686604051602401612f6e93929190615457565b90508051600014806134c25750808060200190518101906134c29190614fff565b6110ca5760405162461bcd60e51b8152600401610586906157ad565b60048054604051637921219560e11b81526001600160a01b0390911691829163f242432a9161351591339130918991899101615406565b600060405180830381600087803b15801561352f57600080fd5b505af1158015613543573d6000803e3d6000fd5b505060405163b390c0ab60e01b81526001600160a01b038416925063b390c0ab91506135759086908690600401615e22565b600060405180830381600087803b15801561358f57600080fd5b505af11580156135a3573d6000803e3d6000fd5b50505050505050565b6000848152600760208181526040808420548452600580835281852082516101e081018452815460ff9081161515825260018084015483880152600284015483870152600384015460608085019190915260048501546080808601919091529585015460a080860191909152600686015460c080870191909152998601546001600160a01b0390811660e087015260088701548116610100870190815260098089015483166101208901908152600a8a01548085166101408b0152600160a01b900490971615156101608901908152600b8a01546101808a0152600c8a01546101a08a0152600d909901546101c08901528a519c8d018b52905182168c528b8b018f90529451168a89015290890191909152925115159387019390935233918601919091528a86529252832081519193909180156136ed5750600282015415155b80156136f857508815155b15613707578582600301540390505b60015460408051631f9de8b560e21b8152815160009384936001600160a01b0390911692637e77a2d49260048083019392829003018186803b15801561374c57600080fd5b505afa158015613760573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137849190615207565b909250905081156137cc576000670de0b6b3a76400008084810204876020015102816137ac57fe5b0490506137bf8761010001518383612f4d565b6020860180519190910390525b8815613877576137e985600001518760e001518760200151614479565b8560e001516001600160a01b031663592182d6866040518263ffffffff1660e01b81526004016138199190615d6b565b600060405180830381600087803b15801561383357600080fd5b505af1158015613847573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261386f9190810190615236565b50505061388e565b61388e85600001518660a001518760200151612f4d565b85511580156138ae575060008a81526007602052604090206001015460ff165b80156138b8575086155b156138cb576138c68a612fe2565b613a42565b855180156138d857508a15155b15613a42576001808501546000908152600760205260409020015460ff168015613918575060018401546000908152600760205260409020600301544310155b1561392a5761392a8460010154612fe2565b82613a3a576001840180546000908152600e6020526040808220805460001901905591548152205415801561397557506001808501546000908152600760205260409020015460ff16155b156139f2576001840154600090815260106020908152604080832054600f909252909120546139a5919003613380565b60018085015460009081526007602081905260408220828155928301805460ff19169055600283018290556003830182905560048301829055600583018290556006830182905591909101555b60008b815260096020526040812080546001600160a01b0319168155600181018290556002810182905560038101829055600481018290556005810182905560060155613a42565b600384018390555b5050505050505050505050565b600081815260076020526040812060050154613c5557600454600083815260076020908152604080832054835260059091529020600801546001600160a01b039182169163534d4027918691613aa591166144d7565b604051602001613ab591906153bc565b60408051601f1981840301815282825260015463fabc053b60e01b8452915190926001600160a01b039092169163fabc053b916004808301926000929190829003018186803b158015613b0757600080fd5b505afa158015613b1b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613b43919081019061505f565b60016040518563ffffffff1660e01b8152600401613b649493929190615dc5565b6040805180830381600087803b158015613b7d57600080fd5b505af1158015613b91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bb59190615207565b506000838152600760208181526040808420805485526005835281852060080154948890529290915260039091015490519293506001600160a01b039091169183917ffacc589216d4ed0bbc51eb76ba233e13e3e9faeb7ac1089cbb380797ae908fe691613c24918791615e22565b60405180910390a36000818152600d6020908152604080832085905584835260079091529020600501819055613ccb565b6004805460008481526007602052604090819020600501549051630d9778e560e11b81526001600160a01b0390921692631b2ef1ca92613c989291889101615e22565b600060405180830381600087803b158015613cb257600080fd5b505af1158015613cc6573d6000803e3d6000fd5b505050505b6004805460008481526007602052604090819020600501549051637921219560e11b81526001600160a01b039092169263f242432a92613d119230928a928a9101615406565b600060405180830381600087803b158015613d2b57600080fd5b505af1158015613d3f573d6000803e3d6000fd5b505050509392505050565b6000848152600760205260408120600301544310613d7957600085815260076020526040902060030154613d7b565b435b6000868152600760208190526040909120015490915015613e2d576000858152600760205260408120600281015460049091015410613dcb57600086815260076020526040902060040154613dde565b6000868152600760205260409020600201545b6000878152600760208190526040909120908101546006909101549192509082840302670de0b6b3a76400000281613e1257fe5b6000888152600a602052604090208054929091049091019055505b60008581526007602052604090206004018190558215613e66576000858152600a6020908152604080832054868452600b909252909120555b83156110ca5781613e90576000858152600760208190526040909120018054850190819055611c1b565b50505060009182526007602081905260409092209091018054919091039055565b600080600080846020015111613ed95760405162461bcd60e51b81526004016105869061582c565b84516000908152600560205260409081902060070154908501516001600160a01b039091169350613f0b576000613f11565b83602001515b91508360400151613f26578360200151613f29565b60005b9050606080856040015115614004578651600090815260056020526040902060080154613f61906001600160a01b031633308761347e565b86516000908152600560205260409081902060080154905163684943b160e01b81526001600160a01b038781169263684943b192613fa79290911690889060040161543e565b60006040518083038186803b158015613fbf57600080fd5b505afa158015613fd3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613ffb9190810190614fa9565b925090506140b4565b86516000908152600560205260408082206008015489518352918190206009015490516379d16e0d60e01b81526001600160a01b03808916936379d16e0d93614057939183169216908890600401615457565b60006040518083038186803b15801561406f57600080fd5b505afa158015614083573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526140ab9190810190615236565b91955090925090505b60005b82518110156142a857875160009081526005602052604090206009015483516001600160a01b03909116908490839081106140ee57fe5b60200260200101516001600160a01b031614156141645781818151811061411157fe5b602002602001015193506005600089600001518152602001908152602001600020600401548410156141555760405162461bcd60e51b815260040161058690615b7f565b866040015115614164576142a8565b866040015115614173576142a0565b87516000908152600560205260409020600a0154600160a01b900460ff1680156141d457508281815181106141a457fe5b6020908102919091018101518951600090815260059092526040909120600a01546001600160a01b039081169116145b15614210578181815181106141e557fe5b6020026020010151341461420b5760405162461bcd60e51b8152600401610586906159a4565b6142a0565b61424283828151811061421f57fe5b6020026020010151333085858151811061423557fe5b602002602001015161347e565b6142a083828151811061425157fe5b6020026020010151600560008b60000151815260200190815260200160002060070160009054906101000a90046001600160a01b031684848151811061429357fe5b6020026020010151614479565b6001016140b7565b5050509250925092565b60035460009081906001600160a01b03161561434d576003546040516370a0823160e01b81526001600160a01b03909116906370a08231906142f89030906004016153f2565b60206040518083038186803b15801561431057600080fd5b505afa158015614324573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061434891906151ef565b61434f565b475b60025460405163ba0f49b760e01b8152919250848301916001600160a01b039091169063ba0f49b790614386908790600401615dbc565b600060405180830381600087803b1580156143a057600080fd5b505af19250505080156143b1575060015b506003546000906001600160a01b03161561444b576003546040516370a0823160e01b81526001600160a01b03909116906370a08231906143f69030906004016153f2565b60206040518083038186803b15801561440e57600080fd5b505afa158015614422573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061444691906151ef565b61444d565b475b905081811415614463576001935050505061052d565b61446e838203613380565b506000949350505050565b600061449a8463095ea7b360e01b8585604051602401612f6e92919061543e565b90508051600014806144bb5750808060200190518101906144bb9190614fff565b612f475760405162461bcd60e51b815260040161058690615a1c565b604080518082018252601081526f181899199a1a9b1b9c1cb0b131b232b360811b60208201528151602a80825260608281019094526001600160a01b0385169291600091602082018180368337019050509050600360fc1b8160008151811061453c57fe5b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061456557fe5b60200101906001600160f81b031916908160001a90535060005b601481101561464b578260048583600c016020811061459a57fe5b1a60f81b6001600160f81b031916901c60f81c60ff16815181106145ba57fe5b602001015160f81c60f81b8282600202600201815181106145d757fe5b60200101906001600160f81b031916908160001a905350828482600c01602081106145fe57fe5b825191901a600f1690811061460f57fe5b602001015160f81c60f81b82826002026003018151811061462c57fe5b60200101906001600160f81b031916908160001a90535060010161457f565b50949350505050565b604051806101000160405280600081526020016000151581526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b604051806101e0016040528060001515815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b031681526020016000151581526020016000815260200160008152602001600081525090565b6040518060e0016040528060006001600160a01b031681526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b60006147c76147c284615e70565b615e30565b90508281528383830111156147db57600080fd5b6147e9836020830184615e91565b9392505050565b803561052d81615ec3565b805161052d81615ec3565b600082601f830112614816578081fd5b815160206148266147c283615e53565b8281528181019085830183850287018401881015614842578586fd5b855b8581101561486957815161485781615ec3565b84529284019290840190600101614844565b5090979650505050505050565b600082601f830112614886578081fd5b813560206148966147c283615e53565b82815281810190858301838502870184018810156148b2578586fd5b855b85811015614869578135845292840192908401906001016148b4565b600082601f8301126148e0578081fd5b815160206148f06147c283615e53565b828152818101908583018385028701840188101561490c578586fd5b855b858110156148695781518452928401929084019060010161490e565b803561052d81615ed8565b805161052d81615ed8565b600082601f830112614950578081fd5b813561495e6147c282615e70565b818152846020838601011115614972578283fd5b816020850160208301379081016020019190915292915050565b60006080828403121561499d578081fd5b604051608081018181106001600160401b03821117156149b957fe5b8060405250809150823581526020830135602082015260408301356149dd81615ed8565b604082015260608301356149f081615ec3565b6060919091015292915050565b600080600080600060a08688031215614a14578081fd5b8535614a1f81615ec3565b94506020860135614a2f81615ec3565b935060408601356001600160401b0380821115614a4a578283fd5b614a5689838a01614876565b94506060880135915080821115614a6b578283fd5b614a7789838a01614876565b93506080880135915080821115614a8c578283fd5b50614a9988828901614940565b9150509295509295909350565b600080600080600060a08688031215614abd578283fd5b8535614ac881615ec3565b94506020860135614ad881615ec3565b9350604086013592506060860135915060808601356001600160401b03811115614b00578182fd5b614a9988828901614940565b60008060408385031215614b1e578182fd5b8251614b2981615ec3565b60208401519092506001600160401b03811115614b44578182fd5b8301601f81018513614b54578182fd5b614b63858251602084016147b4565b9150509250929050565b600080600080600060a08688031215614b84578283fd5b8535614b8f81615ec3565b945060208601356001600160401b0380821115614baa578485fd5b614bb689838a01614940565b955060408801359150614bc882615ec3565b909350606087013590614bda82615ec3565b90925060808701359080821115614a8c578283fd5b60008060408385031215614c01578182fd5b8235614c0c81615ec3565b946020939093013593505050565b600080600060608486031215614c2e578081fd5b8351614c3981615ec3565b602085015160408601519194509250614c5181615ed8565b809150509250925092565b60006020808385031215614c6e578182fd5b82356001600160401b0380821115614c84578384fd5b818501915085601f830112614c97578384fd5b8135614ca56147c282615e53565b81815284810190848601610240808502870188018b1015614cc4578889fd5b8896505b84871015614e3057818b0381811215614cdf57898afd5b6040805160808082018281108b82111715614cf657fe5b83528535614d0381615ed8565b8252858c0135614d1281615ed8565b828d0152858301358383015260606101e0605f198601811315614d33578e8ffd5b614d3c81615e30565b9550614d4982890161492a565b8652828801358e87015260a0808901358688015260c09550858901358388015260e0808a0135858901526101009450848a0135828901526101209150818a0135878901526101409650614d9d878b016147f0565b90880152610160614daf8a82016147f0565b858901526101809450614dc3858b016147f0565b828901526101a09150614dd7828b016147f0565b878901526101c09650614deb878b0161492a565b81890152508189013584880152610200890135818801525050610220870135848601528481840152505080875250505087840193508082019150600187019650614cc8565b50909998505050505050505050565b60006020808385031215614e51578182fd5b82516001600160401b03811115614e66578283fd5b8301601f81018513614e76578283fd5b8051614e846147c282615e53565b818152838101908385016101e0808502860187018a1015614ea3578788fd5b8795505b84861015614f9b5780828b031215614ebd578788fd5b614ec681615e30565b614ecf83614935565b8152828801518882015260408084015190820152606080840151908201526080808401519082015260a0808401519082015260c0808401519082015260e0614f188185016147fb565b90820152610100614f2a8482016147fb565b90820152610120614f3c8482016147fb565b90820152610140614f4e8482016147fb565b90820152610160614f60848201614935565b9082015261018083810151908201526101a080840151908201526101c080840151908201528452600195909501949286019290810190614ea7565b509098975050505050505050565b60008060408385031215614fbb578182fd5b82516001600160401b0380821115614fd1578384fd5b614fdd868387016148d0565b93506020850151915080821115614ff2578283fd5b50614b6385828601614806565b600060208284031215615010578081fd5b81516147e981615ed8565b60006020828403121561502c578081fd5b81356001600160e01b0319811681146147e9578182fd5b600060208284031215615054578081fd5b81516147e981615ec3565b600060208284031215615070578081fd5b81516001600160401b03811115615085578182fd5b8201601f81018413615095578182fd5b6150a4848251602084016147b4565b949350505050565b6000608082840312156150bd578081fd5b6147e9838361498c565b600060e082840312156150d8578081fd5b60405160e081018181106001600160401b03821117156150f457fe5b604052615100836147fb565b81526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a082015260c083015160c08201528091505092915050565b600061010080838503121561515b578182fd5b604051908101906001600160401b038211818310171561517757fe5b816040528351815261518b60208501614935565b602082015260408401516040820152606084015160608201526080840151608082015260a084015160a082015260c084015160c082015260e084015160e0820152809250505092915050565b6000602082840312156151e8578081fd5b5035919050565b600060208284031215615200578081fd5b5051919050565b60008060408385031215615219578182fd5b82519150602083015161522b81615ec3565b809150509250929050565b60008060006060848603121561524a578081fd5b8351925060208401516001600160401b0380821115615267578283fd5b615273878388016148d0565b93506040860151915080821115615288578283fd5b5061529586828701614806565b9150509250925092565b600080604083850312156152b1578182fd5b82359150602083013561522b81615ed8565b60008060a083850312156152d5578182fd5b823591506152e6846020850161498c565b90509250929050565b60008060008060808587031215615304578182fd5b8435935060208501359250604085013561531d81615ed8565b9396929550929360600135925050565b6001600160a01b03169052565b15159052565b60008151808452615358816020860160208601615e91565b601f01601f19169290920160200192915050565b8051825260208101511515602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e08301525050565b60006a02330b936b4b733902628160ad1b825282516153e281600b850160208701615e91565b91909101600b0192915050565b90565b6001600160a01b0391909116815260200190565b6001600160a01b0394851681529290931660208301526040820152606081019190915260a06080820181905260009082015260c00190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b039390931683526020830191909152604082015260600190565b6020808252825182820181905260009190848201906040850190845b818110156154df576154cb83855161536c565b9284019261010092909201916001016154b8565b50909695505050505050565b901515815260200190565b6001600160e01b031991909116815260200190565b6000602082526147e96020830184615340565b6000604082526155316040830184615340565b82810360209384015290815201919050565b60208082526010908201526f24b73b30b634b2103837b9b4ba34b7b760811b604082015260600190565b60208082526021908201527f496e73756666696369656e742072657761726420696e20657874656e73696f6e6040820152601760f91b606082015260800190565b6020808252601a908201527f496e73756666696369656e74207374616b656420616d6f756e74000000000000604082015260600190565b60208082526010908201526f24b73b30b634b2103a3930b739b332b960811b604082015260600190565b6020808252600c908201526b27379022aa24103a37b5b2b760a11b604082015260600190565b6020808252600c908201526b155b985d5d1a1bdc9a5e995960a21b604082015260600190565b6020808252600d908201526c0496e76616c696420736574757609c1b604082015260600190565b6020808252600c908201526b4e6f7420706f737369626c6560a01b604082015260600190565b60208082526012908201527111985c9b5a5b99d4d95d1d5c08195b99195960721b604082015260600190565b60208082526010908201526f496e76616c696420776974686472617760801b604082015260600190565b602080825260099082015268139bdd081bdddb995960ba1b604082015260600190565b600060c08252601160c083015270436f76656e616e7473204661726d696e6760781b60e08301526101008060208401526005818401525064634641524d60d81b610120830152610140851515604084015280606084015261578481840186615340565b6001600160a01b039490941660808401525081830360a090920191909152815260200192915050565b6020808252601390820152721514905394d19154919493d357d19052531151606a1b604082015260600190565b60208082526010908201526f115512081b9bdd081a5b9d9bdb1d995960821b604082015260600190565b6020808252600e908201526d24b73b30b634b21039b2b73232b960911b604082015260600190565b602080825260099082015268139bc8185b5bdd5b9d60ba1b604082015260600190565b6020808252601e908201527f52657761726420697320626967676572207468616e2065787065637465640000604082015260600190565b6020808252600c908201526b24b73b30b634b21037b832b760a11b604082015260600190565b602080825260099082015268139bc81c995dd85c9960ba1b604082015260600190565b6020808252600f908201526e1514905394d1915497d19052531151608a1b604082015260600190565b6020808252600d908201526c27379036b0b4b7103a37b5b2b760991b604082015260600190565b6020808252600b908201526a24b73b30b634b21039383160a91b604082015260600190565b6020808252600f908201526e24b73b30b634b2103a37b3b3b6329760891b604082015260600190565b6020808252601b908201527f496e76616c696420736574757020636f6e66696775726174696f6e0000000000604082015260600190565b602080825260139082015272496e636f7272656374206574682076616c756560681b604082015260600190565b60208082526009908201526832bc3a32b739b4b7b760b91b604082015260600190565b6020808252600e908201526d496e76616c696420756e6c6f636b60901b604082015260600190565b6020808252600e908201526d1054141493d59157d1905253115160921b604082015260600190565b602080825260139082015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604082015260600190565b60208082526018908201527f546f6f206561726c7920666f7220746869732073657475700000000000000000604082015260600190565b60208082526010908201526f5365747570206e6f742061637469766560801b604082015260600190565b60208082526015908201527424b73b30b634b21022aa24103a3930b739b332b91760591b604082015260600190565b602080825260159082015274496e76616c696420616464206c697175696469747960581b604082015260600190565b6020808252600a90820152694e6f207265776172647360b01b604082015260600190565b602080825260119082015270496e76616c6964206c697175696469747960781b604082015260600190565b60208082526012908201527124b73b30b634b2103634b8bab4b234ba3c9760711b604082015260600190565b81516001600160a01b031681526020808301519082015260408083015190820152606080830151908201526080808301519082015260a0828101519082015260c0918201519181019190915260e00190565b6102e08101615c0c828561536c565b610100615c1c818401855161533a565b6020840151610120818186015260408601519150610140828187015260608701519250610160838188015260808801519350610180848189015260a089015194506101a085818a015260c08a015195506101c086818b015260e08b01519650615c896101e08b018861532d565b968a015196615c9c6102008b018961532d565b858b01519750615cb06102208b018961532d565b848b01519750615cc46102408b018961532d565b838b01519750615cd86102608b018961533a565b918a01516102808a01528901516102a0890152909701516102c090960195909552509195945050505050565b815481526001820154610100820190615d1c90615ebd565b615d29602084018261533a565b50600283015460408301526003830154606083015260048301546080830152600583015460a0830152600683015460c083015260079092015460e09091015290565b81516001600160a01b0390811682526020808401519083015260408084015182169083015260608084015115159083015260808084015115159083015260a092830151169181019190915260c00190565b90815260200190565b600085825260a06020830152615dde60a0830186615340565b82810380604085015260038252620664c560ec1b602083015260408101606085015250615e0e6040820186615340565b915050821515608083015295945050505050565b918252602082015260400190565b6040518181016001600160401b0381118282101715615e4b57fe5b604052919050565b60006001600160401b03821115615e6657fe5b5060209081020190565b60006001600160401b03821115615e8357fe5b50601f01601f191660200190565b60005b83811015615eac578181015183820152602001615e94565b83811115612f475750506000910152565b60ff1690565b6001600160a01b038116811461226f57600080fd5b801515811461226f57600080fdfea2646970667358221220c7bac8e6386b7d47a3737d2e3f3670cf7feb8f9a74fb787a15319dad6c02fb3564736f6c63430007060033

Deployed Bytecode Sourcemap

15805:43276:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8693:133;;;;;;;;;;-1:-1:-1;8693:133:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16726:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;18113:50::-;;;;;;;;;;-1:-1:-1;18113:50:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;25265:1296::-;;;;;;:::i;:::-;;:::i;:::-;;16658:25;;;;;;;;;;;;;:::i;16807:35::-;;;;;;;;;;;;;:::i;17030:38::-;;;;;;;;;;;;;:::i;21443:202::-;;;;;;;;;;-1:-1:-1;21443:202:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;17239:34::-;;;;;;;;;;;;;:::i;19563:1204::-;;;;;;;;;;-1:-1:-1;19563:1204:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;26694:3543::-;;;;;;;;;;-1:-1:-1;26694:3543:0;;;;;:::i;:::-;;:::i;21653:314::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;35419:1079::-;;;;;;;;;;-1:-1:-1;35419:1079:0;;;;;:::i;:::-;;:::i;32132:1449::-;;;;;;:::i;:::-;;:::i;22256:850::-;;;;;;;;;;-1:-1:-1;22256:850:0;;;;;:::i;:::-;;:::i;30245:1879::-;;;;;;;;;;-1:-1:-1;30245:1879:0;;;;;:::i;:::-;;:::i;33589:1822::-;;;;;;;;;;-1:-1:-1;33589:1822:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;18170:46::-;;;;;;;;;;-1:-1:-1;18170:46:0;;;;;:::i;:::-;;:::i;36506:271::-;;;;;;;;;;-1:-1:-1;36506:271:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;15881:51::-;;;;;;;;;;;;;:::i;16578:23::-;;;;;;;;;;;;;:::i;23114:2143::-;;;;;;:::i;:::-;;:::i;21975:273::-;;;;;;;;;;-1:-1:-1;21975:273:0;;;;;:::i;:::-;;:::i;17737:53::-;;;;;;;;;;-1:-1:-1;17737:53:0;;;;;:::i;:::-;;:::i;36785:243::-;;;;;;;;;;-1:-1:-1;36785:243:0;;;;;:::i;:::-;;:::i;21295:140::-;;;;;;;;;;-1:-1:-1;21295:140:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;20775:320::-;;;;;;;;;;-1:-1:-1;20775:320:0;;;;;:::i;:::-;;:::i;8693:133::-;-1:-1:-1;;;;;;8785:33:0;;8761:4;8785:33;;;;;;;;;;;;;8693:133;;;;:::o;16726:43::-;;;-1:-1:-1;;;;;16726:43:0;;:::o;18113:50::-;;;;;;;;;;;;;:::o;25265:1296::-;25386:18;;;18889:19;;;:7;:19;;;;;:26;;;;;18881:55;;;;-1:-1:-1;;;18881:55:0;;;;;;;:::i;:::-;;;;;;;;;18955:19;;;;:7;:19;;;;;:30;;;18989:12;-1:-1:-1;18955:46:0;;;:93;;-1:-1:-1;19005:19:0;;;;:7;:19;;;;;:28;;;19036:12;-1:-1:-1;18955:93:0;18947:119;;;;-1:-1:-1;;;18947:119:0;;;;;;;:::i;:::-;18586:22:::1;::::0;;;:10:::1;:22;::::0;;;;:34;25422:10;;-1:-1:-1;;;;;18586:34:0::1;18624:10;18586:48;:93:::0;::::1;;;-1:-1:-1::0;18638:22:0::1;::::0;;;:10:::1;:22;::::0;;;;:36:::1;;::::0;:41;::::1;18586:93;18578:115;;;;-1:-1:-1::0;;;18578:115:0::1;;;;;;;:::i;:::-;25483:39:::2;25525:22:::0;;;:10:::2;:22;::::0;;;;;;;25601:26:::2;::::0;::::2;::::0;25593:35;;:7:::2;:35:::0;;;;;25707:21;;25695:34;;:11:::2;:34:::0;;;;;:39;::::2;;25687:73;;;;-1:-1:-1::0;;;25687:73:0::2;;;;;;;:::i;:::-;25815:42;25862:50;25876:15;:26;;;25904:7;25862:13;:50::i;:::-;25814:98;;;26108:11;:23;;;26070:11;:26;;;26039:11;:27;;;26024:12;:42;26023:73;26100:4;26022:82;26021:110;;;;;25990:26;::::0;::::2;::::0;25966:51:::2;::::0;;;:23:::2;:51;::::0;;;;:165;;26021:110;;;::::2;25966:165:::0;;::::2;::::0;;26167:45:::2;::::0;26194:10;;26167:26:::2;:45::i;:::-;26142:22;::::0;::::2;:70:::0;26281:26:::2;::::0;::::2;::::0;26257:51:::2;::::0;;;:23:::2;:51;::::0;;;;;;;;26223:31;;;:19:::2;:31:::0;;;;;:85;;;;26363:24;;::::2;::::0;26319:40:::2;::::0;;::::2;:68:::0;;;::::2;::::0;;26479:12:::2;26449:27;::::0;::::2;:42:::0;26502:23:::2;::::0;;::::2;:51:::0;;;;::::2;::::0;;;-1:-1:-1;;;25265:1296:0:o;16658:25::-;;;-1:-1:-1;;;;;16658:25:0;;:::o;16807:35::-;;;-1:-1:-1;;;;;16807:35:0;;:::o;17030:38::-;;;;:::o;21443:202::-;21508:19;;:::i;:::-;21529:23;;:::i;:::-;21573:7;:19;21581:10;21573:19;;;;;;;;;;;21594:11;:42;21606:7;:19;21614:10;21606:19;;;;;;;;;;;:29;;;21594:42;;;;;;;;;;;21565:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21565:72:0;-1:-1:-1;;;;;21565:72:0;-1:-1:-1;;;;;21565:72:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21565:72:0;-1:-1:-1;;;;;21565:72:0;-1:-1:-1;;;;;21565:72:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21565:72:0;-1:-1:-1;;;;;21565:72:0;-1:-1:-1;;;;;21565:72:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21565:72:0;-1:-1:-1;;;;;21565:72:0;-1:-1:-1;;;;;21565:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21443:202;;;:::o;17239:34::-;;;;:::o;19563:1204::-;19783:8;;19730:32;;-1:-1:-1;;;;;19783:8:0;:22;19775:54;;;;-1:-1:-1;;;19775:54:0;;;;;;;:::i;:::-;19849:10;:22;;-1:-1:-1;;;;;;19849:22:0;-1:-1:-1;;;;;19849:22:0;;;;;;;;19840:60;;;;-1:-1:-1;;;19840:60:0;;;;;;;:::i;:::-;19911:8;:21;;-1:-1:-1;;;;;;19911:21:0;;;19922:10;19911:21;;;;19960:19;:40;;-1:-1:-1;;;;;19960:40:0;;;;;;;;19948:53;;;;19911:8;;19948:53;20016:28;;;;;;20048:13;20016:45;20012:136;;20106:10;;20100:36;;-1:-1:-1;;;;;20106:10:0;20118:17;20100:5;:36::i;:::-;20078:58;;20012:136;20205:12;-1:-1:-1;;;;;20184:47:0;;20335:4;20354:8;;;;;;;;;-1:-1:-1;;;;;20354:8:0;-1:-1:-1;;;;;20341:48:0;;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;20341:50:0;;;;;;;;;;;;:::i;:::-;20401:4;20232:179;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;20232:179:0;;;;;;;;;;;;;;-1:-1:-1;;;;;20232:179:0;-1:-1:-1;;;20232:179:0;;;20184:232;;;;;-1:-1:-1;;;;;;20184:232:0;;;;;20232:179;20184:232;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;20184:232:0;;;;;;;;;;;;:::i;:::-;-1:-1:-1;20159:20:0;20158:258;;-1:-1:-1;;;;;;20158:258:0;-1:-1:-1;;;;;20158:258:0;;;;;;;;;;20430:29;;:33;20427:333;;20480:43;20537:22;20526:56;;;;;;;;;;;;:::i;:::-;20480:102;;20601:9;20597:152;20620:17;:24;20616:1;:28;20597:152;;;20670:63;20696:17;20714:1;20696:20;;;;;;;;;;;;;;20718:4;20724:5;20731:1;20670:25;:63::i;:::-;20646:3;;20597:152;;;;20427:333;;19563:1204;;;;;;;:::o;26694:3543::-;18586:22;;;;:10;:22;;;;;:34;26761:10;;-1:-1:-1;;;;;18586:34:0;18624:10;18586:48;:93;;;;-1:-1:-1;18638:22:0;;;;:10;:22;;;;;:36;;;:41;;18586:93;18578:115;;;;-1:-1:-1;;;18578:115:0;;;;;;;:::i;:::-;26822:39:::1;26864:22:::0;;;:10:::1;:22;::::0;;;;;;;26914::::1;::::0;;::::1;::::0;27018:26:::1;::::0;::::1;::::0;27010:35;;:7:::1;:35:::0;;;;;:45;26998:58;;;;;;:63;26970:12:::1;::::0;26998:63:::1;;26993:1732;;27156:1;27131:15;:22;;;:26;27123:48;;;;-1:-1:-1::0;;;27123:48:0::1;;;;;;;:::i;:::-;27469:52;27498:1;27501::::0;27504:4:::1;27510:10;27469:28;:52::i;:::-;-1:-1:-1::0;27571:22:0::1;::::0;::::1;::::0;27457:64;;-1:-1:-1;27561:32:0;::::1;;27553:75;;;;-1:-1:-1::0;;;27553:75:0::1;;;;;;;:::i;:::-;27782:26;::::0;::::1;::::0;27774:35:::1;::::0;;;:7:::1;:35;::::0;;;;:44:::1;;::::0;27758:60;::::1;;:98;;27850:6;27825:15;:22;;;:31;27758:98;;;27821:1;27758:98;27733:22;::::0;::::1;:123:::0;27903:12:::1;27871:29;::::0;::::1;:44:::0;26993:1732:::1;;;28018:26;::::0;::::1;::::0;28010:35:::1;::::0;;;:7:::1;:35;::::0;;;;:44:::1;;::::0;27995:59;::::1;:121;;28104:12;27995:121;;;28065:26;::::0;::::1;::::0;28057:35:::1;::::0;;;:7:::1;:35;::::0;;;;:44:::1;;::::0;27995:121:::1;28329:26;::::0;::::1;::::0;28321:35:::1;::::0;;;:7:::1;:35;::::0;;;;;;;:47;;::::1;::::0;28259:50:::1;::::0;::::1;::::0;28204:51:::1;::::0;;::::1;::::0;27980:136;;-1:-1:-1;28321:47:0;28189:66;::::1;28188:121;28313:4;28187:130;28321:47:::0;28186:182:::1;;;;28155:26;::::0;::::1;::::0;28131:51:::1;::::0;;;:23:::1;:51;::::0;;;;:237;;28186:182;;;::::1;28131:237:::0;;::::1;::::0;;28392:45:::1;::::0;28419:10;;28392:26:::1;:45::i;:::-;28510:26;::::0;::::1;::::0;;28486:51:::1;::::0;;;:23:::1;:51;::::0;;;;;;;;28452:31;;;:19:::1;:31:::0;;;;;:85;28552:22:::1;::::0;::::1;:26:::0;;;28655;;28647:35;;:7:::1;:35:::0;;;:51:::1;;:66:::0;;;28383:54;-1:-1:-1;26993:1732:0::1;28739:10:::0;;28735:454:::1;;28806:19;::::0;-1:-1:-1;;;;;28806:19:0::1;:33:::0;28802:312:::1;;28874:19;::::0;28895:27;;28860:71:::1;::::0;-1:-1:-1;;;;;28874:19:0;;::::1;::::0;28895:27:::1;28924:6:::0;28860:13:::1;:71::i;:::-;28802:312;;;28989:27:::0;;:50:::1;::::0;28973:11:::1;::::0;-1:-1:-1;;;;;28989:27:0::1;::::0;29028:6;;28989:50:::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28972:67;;;29066:6;29058:40;;;;-1:-1:-1::0;;;29058:40:0::1;;;;;;;:::i;:::-;28802:312;;29140:26;::::0;::::1;::::0;29128:39:::1;::::0;;;:11:::1;:39;::::0;;;;:49;;;::::1;::::0;;28735:454:::1;29211:26;::::0;::::1;::::0;29203:35:::1;::::0;;;:7:::1;:35;::::0;;;;:44:::1;;::::0;29251:12:::1;-1:-1:-1::0;29199:1031:0::1;;29292:26;::::0;;::::1;::::0;29284:35:::1;::::0;;;:7:::1;:35;::::0;;;;:42:::1;::::0;::::1;;29280:123;;;29347:40;29360:15;:26;;;29347:12;:40::i;:::-;29517:26;::::0;::::1;::::0;29497:58:::1;29509:35:::0;;;:7:::1;:35;::::0;;;;;;;:45;29497:58;;:11:::1;:58:::0;;;;;:63;::::1;;29492:534;;29633:1;29602:26:::0;::::1;::::0;;29581:48:::1;::::0;;;:20:::1;:48;::::0;;;;;:53;;-1:-1:-1;;29581:53:0;;;29678:26;;29657:48;;;;:53;:100;::::1;;;-1:-1:-1::0;29723:26:0::1;::::0;;::::1;::::0;29715:35:::1;::::0;;;:7:::1;:35;::::0;;;;:42:::1;::::0;::::1;;29714:43;29657:100;29653:310;;;29850:26;::::0;::::1;::::0;29838:39:::1;::::0;;;:11:::1;:39;::::0;;;;;;;;29792:15:::1;:43:::0;;;;;;;29782:96:::1;::::0;29792:85;::::1;29782:9;:96::i;:::-;29916:26;::::0;;::::1;::::0;29908:35:::1;::::0;;;:7:::1;:35;::::0;;;;;;29901:42;;;;;::::1;::::0;;-1:-1:-1;;29901:42:0::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;29653:310:::1;29988:22;::::0;;;:10:::1;:22;::::0;;;;29981:29;;-1:-1:-1;;;;;;29981:29:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;;::::0;29492:534:::1;29199:1031;;;30068:26;::::0;::::1;::::0;30048:58:::1;30060:35:::0;;;:7:::1;:35;::::0;;;;;;;:45;30048:58;;:11:::1;:58:::0;;;;;:63;::::1;;30043:187;;30178:30;::::0;;;:18:::1;:30;::::0;;;;:40;;;::::1;::::0;;30043:187:::1;18704:1;;;26694:3543:::0;;:::o;21653:314::-;21701:21;21735:35;21792:19;;-1:-1:-1;;;;;21773:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;21735:77;;21828:9;21823:106;21847:19;;21843:1;:23;21823:106;;;21907:10;;;;:7;:10;;;;;;;;;21888:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:16;;:13;;21915:1;;21888:16;;;;;;;;;;;;;;;:29;21868:3;;21823:106;;;-1:-1:-1;21946:13:0;-1:-1:-1;21653:314:0;:::o;35419:1079::-;35507:14;35575:22;;;:10;:22;;;;;;;;35534:63;;;;;;;;;-1:-1:-1;;;;;35534:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35673:31;;;:19;:31;;;;;;35643:26;;35619:51;;:23;:51;;;;;;;35534:63;;35752:4;;35619:85;35618:130;35617:139;35608:148;;35771:5;35767:681;;;35839:26;;;;;35793:20;35831:35;;;:7;:35;;;;;;:44;;;35816:12;:59;:121;;35901:26;;;;;35893:35;;;;:7;:35;;;;;;:44;;;35816:121;;;35878:12;35816:121;36040:26;;;;;;35952:23;36032:35;;;:7;:35;;;;;;;:46;;;35986:26;;35978:35;;;;:51;;;35793:144;;-1:-1:-1;35952:23:0;;35978:100;:203;;36138:26;;;;;36130:35;;;;:7;:35;;;;;;:51;;;35978:203;;;36089:26;;;;;36081:35;;;;:7;:35;;;;;;:46;;;35978:203;36317:26;;;;;;36196:11;36309:35;;;:7;:35;;;;;;;;:47;;;;36255:26;;36247:35;;;;;:50;;;35952:229;;-1:-1:-1;36196:11:0;;36213:30;;;36212:85;36301:4;36211:94;36309:47;36210:146;;;;;36196:160;;36432:4;36388:15;:40;;;36382:3;:46;36381:55;;;;;;36371:65;;;;35767:681;;;;36468:22;;;36458:32;;35419:1079;-1:-1:-1;;35419:1079:0:o;32132:1449::-;18586:22;;;;:10;:22;;;;;:34;32216:10;;-1:-1:-1;;;;;18586:34:0;18624:10;18586:48;:93;;;;-1:-1:-1;18638:22:0;;;;:10;:22;;;;;:36;;;:41;;18586:93;18578:115;;;;-1:-1:-1;;;18578:115:0;;;;;;;:::i;:::-;32286:39:::1;32328:22:::0;;;:10:::1;:22;::::0;;;;;;;32390:26:::1;::::0;::::1;::::0;32382:35;;:7:::1;:35:::0;;;;;:45;32370:58;;:11:::1;:58:::0;;;;;;:63;::::1;;32369:64;:127:::0;::::1;;;-1:-1:-1::0;32445:26:0::1;::::0;::::1;::::0;32437:35:::1;::::0;;;:7:::1;:35;::::0;;;;:44:::1;;::::0;32484:12:::1;-1:-1:-1::0;32369:127:0::1;32361:154;;;;-1:-1:-1::0;;;32361:154:0::1;;;;;;;:::i;:::-;32526:24;32553:30:::0;;;:18:::1;:30;::::0;;;;;;;;32669:26:::1;::::0;::::1;::::0;32661:35;;:7:::1;:35:::0;;;;;:45;32649:58;;:11:::1;:58:::0;;;;;;:69:::1;;::::0;:74;:209:::1;;32778:26;::::0;::::1;::::0;32758:58:::1;32770:35:::0;;;:7:::1;:35;::::0;;;;;;;:45;32758:58;;:11:::1;:58:::0;;;;;:69:::1;;::::0;32853:4:::1;::::0;;;32758:76;::::1;32757:92;32731:15;:22;;;:119;:126;;;;;;32649:209;;;32726:1;32649:209;32629:229;32913:20:::0;;32909:178:::1;;32968:19;::::0;32950:83:::1;::::0;-1:-1:-1;;;;;32968:19:0::1;32989:10;33009:4;33016:16:::0;32950:17:::1;:83::i;:::-;33048:27;33058:16;33048:9;:27::i;:::-;33149:31;::::0;::::1;::::0;33106:26:::1;::::0;::::1;::::0;;33098:35:::1;::::0;;;:7:::1;:35;::::0;;;;;;;:47;;::::1;:82:::0;;;;;::::1;::::0;;;33220:26;;33212:35;;;:44:::1;;::::0;33258:40:::1;::::0;::::1;::::0;33191:108:::1;::::0;33212:44;33191:20:::1;:108::i;:::-;33310:116;33327:10;33339:15;:26;;;33367:10;33379:15;:40;;;33421:4;33310:16;:116::i;:::-;-1:-1:-1::0;33493:40:0::1;::::0;;::::1;::::0;33489:1:::1;33458:26:::0;;::::1;::::0;33437:48:::1;::::0;;;:20:::1;:48;::::0;;;;;;;:96;;;;;;-1:-1:-1;;33437:96:0;;;;33551:22;;;:10:::1;:22:::0;;;;;33544:29;;-1:-1:-1;;;;;;33544:29:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;;::::0;;;;-1:-1:-1;;32132:1449:0:o;22256:850::-;18586:22;;;;:10;:22;;;;;:34;22337:10;;-1:-1:-1;;;;;18586:34:0;18624:10;18586:48;:93;;;;-1:-1:-1;18638:22:0;;;;:10;:22;;;;;:36;;;:41;;18586:93;18578:115;;;;-1:-1:-1;;;18578:115:0;;;;;;;:::i;:::-;22407:26:::1;22436:22:::0;;;:10:::1;:22;::::0;;;;;;;;22407:51;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;22407:51:0;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;;::::0;;;;;22491:16;::::1;::::0;;::::1;::::0;:55:::1;;-1:-1:-1::0;22524:17:0::1;::::0;::::1;::::0;:22;::::1;22491:55;22469:121;;;;-1:-1:-1::0;;;22469:121:0::1;;;;;;;:::i;:::-;22712:14;::::0;;::::1;::::0;22635:21:::1;22704:23:::0;;;:7:::1;:23:::0;;;;;;:33;22692:46;;:11:::1;:46:::0;;;;;;:51;22688:2;;22692:51:::1;;:70;;22750:12;22692:70;;;22746:1;22692:70;22764:14;::::0;;::::1;::::0;22677:102:::1;::::0;::::1;::::0;;;::::1;;:::i;:::-;;::::0;;-1:-1:-1;;22677:102:0;;::::1;::::0;;;;;;22667:113;;22677:102:::1;22667:113:::0;;::::1;::::0;22659:122:::1;22800:25:::0;;;:10:::1;:25:::0;;;;;:39:::1;;::::0;22667:113;;-1:-1:-1;22800:44:0;22792:73:::1;;;;-1:-1:-1::0;;;22792:73:0::1;;;;;;;:::i;:::-;22926:3;22915:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;22904:46;;;;;;;;;;;;:::i;:::-;22876:10;:25;22887:13;22876:25;;;;;;;;;;;:74;;;;;;;;;;;;;-1:-1:-1::0;;;;;22876:74:0::1;;;;;-1:-1:-1::0;;;;;22876:74:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23001:2;22961:10;:25;22972:13;22961:25;;;;;;;;;;;:37;;;:42;;;;;-1:-1:-1::0;;;;;22961:42:0::1;;;;;-1:-1:-1::0;;;;;22961:42:0::1;;;;;;23021:10;:22;23032:10;23021:22;;;;;;;;;;;;23014:29:::0;::::1;;;;;;;;-1:-1:-1::0;;;;;23014:29:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23095:2;-1:-1:-1::0;;;;;23059:39:0::1;23083:10;-1:-1:-1::0;;;;;23059:39:0::1;23068:13;23059:39;;;;;;;;;;18704:1;;22256:850:::0;;;:::o;30245:1879::-;30409:38;30450:22;;;:10;:22;;;;;;;;;30409:63;;;;;;;;;-1:-1:-1;;;;;30409:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30545:13;;;;;:97;;-1:-1:-1;30580:20:0;;;30570:57;;-1:-1:-1;;;30570:57:0;;30640:1;;-1:-1:-1;;;;;30580:20:0;;;;30570:47;;:57;;30618:8;;30570:57;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;30562:80:0;;;30545:97;30541:167;;;-1:-1:-1;30672:24:0;;;;:14;:24;;;;;;30541:167;30727:15;;;;;:32;;-1:-1:-1;30746:13:0;;30727:32;30726:116;;;-1:-1:-1;30765:13:0;;;;;:32;;-1:-1:-1;30782:15:0;;30765:32;:76;;;;-1:-1:-1;30801:19:0;;;;:7;:19;;;;;:28;;;:40;;30765:76;30718:145;;;;-1:-1:-1;;;30718:145:0;;;;;;;:::i;:::-;30971:26;;;;;30951:58;30963:35;;;:7;:35;;;;;;:45;30951:58;;:11;:58;;;;:63;;;:119;;;;-1:-1:-1;31036:29:0;;;;:34;;30951:119;:200;;;;;31111:15;:40;;;31091:16;:60;;30951:200;:262;;;;-1:-1:-1;31172:27:0;;-1:-1:-1;;;;;31172:41:0;31203:10;31172:41;30951:262;30932:435;;;-1:-1:-1;31243:20:0;;;31233:63;;-1:-1:-1;;;31233:63:0;;31300:16;;-1:-1:-1;;;;;31243:20:0;;;;31233:41;;:63;;31275:10;;31287:8;;31233:63;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:83;;:133;;;;-1:-1:-1;31321:19:0;;;;:7;:19;;;;;:28;;;31353:12;-1:-1:-1;31321:44:0;31233:133;30910:478;;;;-1:-1:-1;;;30910:478:0;;;;;;;:::i;:::-;31454:15;31450:237;;31486:48;31507:8;31517:16;31486:20;:48::i;:::-;31450:237;;;31567:26;31582:10;31567:14;:26::i;:::-;31616;;;;;31608:35;;;;:7;:35;;;;;;;:47;:67;;;;;;;31450:237;31697:77;31714:10;31726;31738;31750:16;31768:5;31697:16;:77::i;:::-;31789:15;31785:332;;31821:32;;;;:20;:32;;;;;:52;;;;;;;;;31892:37;:68;;;;-1:-1:-1;31934:19:0;;;;:7;:19;;;;;:26;;;;;31933:27;31892:68;31888:218;;;32021:23;;;;:11;:23;;;;;;;;;31991:15;:27;;;;;;;31981:64;;31991:53;;31981:9;:64::i;:::-;32071:19;;;;:7;:19;;;;;;;32064:26;;;;;;;;-1:-1:-1;;32064:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31888:218;30245:1879;;;;;;:::o;33589:1822::-;33728:14;33744:30;33791:9;33787:1617;;;33855:38;33896:22;;;:10;:22;;;;;;;;33855:63;;;;;;;;;-1:-1:-1;;;;;33855:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34009:35;;:7;:35;;;;;;:44;;33855:63;;:38;33993:12;:60;;:122;;34103:12;33993:122;;;34064:26;;;;;34056:35;;;;:7;:35;;;;;;:44;;;33993:122;33970:145;;34189:15;:36;;;34156:15;:29;;;34141:12;:44;34140:85;34130:96;;33787:1617;;;;;34259:25;34287:19;;;:7;:19;;;;;;;;34259:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34428:42;;;;;;;;;:55;;;;:75;34409:94;;;34401:124;;;;-1:-1:-1;;;34401:124:0;;;;;;;:::i;:::-;34540:23;34582:5;:14;;;34566:12;:30;;:66;;34620:12;34603:5;:14;;;:29;34566:66;;;34599:1;34566:66;34540:92;;34720:1;34702:15;:19;34694:50;;;;-1:-1:-1;;;34694:50:0;;;;;;;:::i;:::-;34885:1;34867:15;34844:5;:20;;;:38;:42;34836:65;;;;-1:-1:-1;;;34836:65:0;;;;;;;:::i;:::-;35042:42;35054:19;;;:7;:19;;;;;;;;:29;35042:42;;:11;:42;;;;;;;:55;;35102:4;;35016:22;;;35042:55;35015:82;;;;;34991:5;:20;;;:107;34990:116;;;;;;34965:141;;35212:1;35187:22;:26;35179:50;;;;-1:-1:-1;;;35179:50:0;;;;;;;:::i;:::-;35352:40;;;-1:-1:-1;;33787:1617:0;33589:1822;;;;;;;:::o;18170:46::-;;;;;;;;;;;;;:::o;36506:271::-;36662:20;;36635:6;;-1:-1:-1;;;;;36662:20:0;36686:10;36662:34;36654:61;;;;-1:-1:-1;;;36654:61:0;;;;;;;:::i;:::-;-1:-1:-1;;;;36506:271:0;;;;;;;:::o;15881:51::-;15928:4;15881:51;:::o;16578:23::-;;;-1:-1:-1;;;;;16578:23:0;;:::o;23114:2143::-;23215:18;;23243;18889:19;;;:7;:19;;;;;:26;;;23243:18;;23215;18889:26;;18881:55;;;;-1:-1:-1;;;18881:55:0;;;;;;;:::i;:::-;18955:19;;;;:7;:19;;;;;:30;;;18989:12;-1:-1:-1;18955:46:0;;;:93;;-1:-1:-1;19005:19:0;;;;:7;:19;;;;;:28;;;19036:12;-1:-1:-1;18955:93:0;18947:119;;;;-1:-1:-1;;;18947:119:0;;;;;;;:::i;:::-;23348:18;;23305:32:::1;23340:27:::0;;;:7:::1;:27;::::0;;;;23439:21:::1;::::0;::::1;::::0;23340:27;;23305:32;-1:-1:-1;;;;;23439:35:0::1;23438:74;;23502:10;23438:74;;;23478:7;:21;;;23438:74;23625:21:::0;;23613:34:::1;::::0;;;:11:::1;:34;::::0;;;;:39;23416:96;;-1:-1:-1;23416:96:0;;23613:39:::1;;:58;;23659:12;23613:58;;;23655:1;23613:58;23673:18:::0;;23589:103:::1;::::0;::::1;::::0;;;23673:18;23589:103:::1;;;:::i;:::-;;::::0;;-1:-1:-1;;23589:103:0;;::::1;::::0;;;;;;23579:114;;23589:103:::1;23579:114:::0;;::::1;::::0;23571:123:::1;23713:22:::0;;;:10:::1;:22:::0;;;;;:36:::1;;::::0;23579:114;;-1:-1:-1;23713:41:0;23705:66:::1;;;;-1:-1:-1::0;;;23705:66:0::1;;;;;;;:::i;:::-;23826:42;23870:23:::0;23897:42:::1;23911:7;:18;;;23931:7;23897:13;:42::i;:::-;24064:21:::0;;23983:14:::1;24052:34:::0;;;:11:::1;:34;::::0;;;;:39;23825:114;;-1:-1:-1;23825:114:0;;-1:-1:-1;23983:14:0;;;24052:39:::1;;24047:620;;24170:18:::0;;24141:75:::1;::::0;24190:15;24170:18:::1;::::0;24141:28:::1;:75::i;:::-;24108:108:::0;;-1:-1:-1;24108:108:0;-1:-1:-1;24239:10:0;;;;;:38:::1;;;24276:1;24253:20;:24;24239:38;24231:77;;;;-1:-1:-1::0;;;24231:77:0::1;;;;;;;:::i;:::-;24349:23;::::0;::::1;::::0;;:41;::::1;24323:67:::0;;24435:12:::1;24405:27;::::0;::::1;:42:::0;24496:24:::1;::::0;::::1;::::0;24522:18;;24462:79:::1;::::0;24483:11;;24462:20:::1;:79::i;:::-;;24047:620;;;24574:81;24591:7;:18;;;24611:17;:24;;;24637:10;24649:5;24574:16;:81::i;:::-;24702:353;;;;;;;;24746:11;-1:-1:-1::0;;;;;24702:353:0::1;;;;;24785:7;:18;;;24702:353;;;;25031:12;24702:353;;;;24844:17;:24;;;24702:353;;;;24900:15;24702:353;;;;24938:6;24702:353;;;;24981:20;24702:353;;::::0;24677:10:::1;:22;24688:10;24677:22;;;;;;;;;;;:378;;;;;;;;;;;;;-1:-1:-1::0;;;;;24677:378:0::1;;;;;-1:-1:-1::0;;;;;24677:378:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25116:11;:34;25128:11;:21;;;25116:34;;;;;;;;;;;:39;;;;;;;;;;;;:70;;25162:17;:24;;;25116:70;;;25158:1;25116:70;25087:18:::0;;25066:40:::1;::::0;;;:20:::1;:40;::::0;;;;;:122;;;;;25111:1:::1;25066:122:::0;;;;25204:45;;-1:-1:-1;;;;;25204:45:0;::::1;::::0;25066:40;25213:10;;25204:45:::1;::::0;25066:40;;25204:45:::1;19077:1;;;;;;23114:2143:::0;;;;:::o;21975:273::-;22089:1;22048:27;;;:11;:27;;;;;:38;;;:42;;;;:105;;-1:-1:-1;22095:51:0;22103:27;;;:11;:27;;;;;;;;:42;;;22095:51;;:7;:51;;;;;:58;;;;;22094:59;22048:105;22040:133;;;;-1:-1:-1;;;22040:133:0;;;;;;;:::i;:::-;22197:27;;;;:11;:27;;;;;:42;;;22184:56;;:12;:56::i;:::-;21975:273;:::o;17737:53::-;;;;;;;;;;;;;:::o;36785:243::-;36918:20;;36891:6;;-1:-1:-1;;;;;36918:20:0;36942:10;36918:34;36910:61;;;;-1:-1:-1;;;36910:61:0;;;;;;;:::i;:::-;-1:-1:-1;;;;36785:243:0;;;;;;;:::o;21295:140::-;21363:22;;:::i;:::-;-1:-1:-1;21405:22:0;;;;:10;:22;;;;;;;;;21398:29;;;;;;;;;-1:-1:-1;;;;;21398:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21295:140::o;20775:320::-;18384:10;;-1:-1:-1;;;;;18384:10:0;18370;:24;18362:49;;;;-1:-1:-1;;;18362:49:0;;;;;;;:::i;:::-;20895:9:::1;20890:198;20914:13;:20;20910:1;:24;20890:198;;;20956:120;20982:13;20996:1;20982:16;;;;;;;;;;;;;;:21;;;21005:13;21019:1;21005:16;;;;;;;;;;;;;;:20;;;21027:13;21041:1;21027:16;;;;;;;;;;;;;;:24;;;21053:13;21067:1;21053:16;;;;;;;;;;;;;;:22;;;20956:25;:120::i;:::-;20936:3;;20890:198;;;;20775:320:::0;:::o;43570:1488::-;43668:42;;:::i;:::-;43712:19;43842;;;:7;:19;;;;;;;;43811:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43712:19;;;;;;43811:60;;43863:7;43811:30;:60::i;:::-;43953:411;;;;;;;;-1:-1:-1;43997:19:0;;;:7;:19;;;;;;;:29;43985:42;;:11;:42;;;;;;:68;;;-1:-1:-1;;;;;43985:68:0;43953:411;;44068:29;;;;43744:127;;-1:-1:-1;43744:127:0;;-1:-1:-1;43744:127:0;;-1:-1:-1;43953:411:0;;;;;;44068:69;;44122:15;44068:69;;;44100:19;44068:69;43953:411;;44152:42;44164:19;;;:7;43953:411;44164:19;;;;;;;:29;44152:42;;;:11;:42;;;;;;:59;;;;-1:-1:-1;;;;;44152:59:0;43953:411;;;;44226:29;;;;43953:411;;;;;;;;;44270:42;;;;;:55;;;-1:-1:-1;;;44270:55:0;;;;43953:411;;;;;;;;;;44348:4;43953:411;;;;;;;;44450:39;;;;;-1:-1:-1;44389:15:0;;-1:-1:-1;44389:15:0;;44450:39;:99;;-1:-1:-1;44494:42:0;44506:19;;;:7;:19;;;;;;;;:29;44494:42;;:11;:42;;;;;:55;;;-1:-1:-1;;;44494:55:0;;;;44493:56;44450:99;44446:175;;;44574:9;:14;44566:43;;;;-1:-1:-1;;;44566:43:0;;;;;;;:::i;:::-;44635:17;:39;;;44631:110;;;44691:38;;;;;44631:110;44808:17;:30;;;44805:246;;;44886:54;;-1:-1:-1;;;44886:54:0;;-1:-1:-1;;;;;44886:16:0;;;;;44911:9;;44886:54;;44922:17;;44886:54;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;44886:54:0;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;44856:24:0;;;44855:85;44805:246;;;45004:35;;-1:-1:-1;;;45004:35:0;;-1:-1:-1;;;;;45004:16:0;;;;;:35;;45021:17;;45004:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;45004:35:0;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;44974:24:0;;;44973:66;44805:246;43570:1488;;;;;;;;;:::o;56533:608::-;56604:23;56742:1;56739;56729:7;56723:14;56716:4;56707:7;56703:18;56700:1;56690:8;56683:5;56678:66;56770:16;56820:4;56814:11;56800:25;;56858:4;56846:10;56839:24;56923:4;56911:10;56907:21;56984:4;56981:1;56957:22;56942:47;57016:33;;;57010:4;57003:47;57071:6;57078:45;;;;57064:59;;57078:45;57117:4;57093:22;57086:36;57064:59;;;;;56649:485;;;;:::o;37066:4181::-;37237:4;37257:3;;:15;;;37265:7;37264:8;37257:15;37254:255;;;37319:27;;;;;37349:1;37319:31;37289:61;;;;37365:133;;37451:27;;;;;-1:-1:-1;;37451:31:0;37421:61;;37365:133;37525:3;37521:2077;;;37571:26;;;;-1:-1:-1;;;;;37571:40:0;;;;;:117;;-1:-1:-1;37632:42:0;;;;-1:-1:-1;;;;;37632:56:0;;;37571:117;:181;;;;;37751:1;37709:16;:39;;;:43;37571:181;:262;;;;-1:-1:-1;37774:21:0;;;:58;;;37831:1;37799:16;:29;;;:33;37774:58;37545:351;;;;-1:-1:-1;;;37545:351:0;;;;;;;:::i;:::-;37956:26;;;;38000:42;;;;37951:92;;-1:-1:-1;;;37951:92:0;;37916:31;;-1:-1:-1;;;;;37951:48:0;;;;:92;;38000:42;37951:92;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;37951:92:0;;;;;;;;;;;;:::i;:::-;38101:1;38058:32;;;:45;38122:29;;;;37913:130;;-1:-1:-1;38118:148:0;;-1:-1:-1;38118:148:0;;-1:-1:-1;38118:148:0;38216:16;:26;;;-1:-1:-1;;;;;38211:37:0;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;;38172:78:0;38173:32;;;38172:78;38118:148;38280:19;38322:18;38367:9;38363:628;38386:14;:21;38382:1;:25;38363:628;;;38457:16;:33;;;-1:-1:-1;;;;;38436:54:0;:14;38451:1;38436:17;;;;;;;;;;;;;;-1:-1:-1;;;;;38436:54:0;;38433:543;;;38532:4;38515:21;;38583:16;:32;;;-1:-1:-1;;;;;38562:53:0;:14;38577:1;38562:17;;;;;;;;;;;;;;-1:-1:-1;;;;;38562:53:0;;38559:129;;;38660:4;38644:20;;38559:129;38433:543;;;38787:14;38802:1;38787:17;;;;;;;;;;;;;;-1:-1:-1;;;;;38741:64:0;38752:16;:33;;;-1:-1:-1;;;;;38741:64:0;;;;;;;;;;;38852:16;:32;;;-1:-1:-1;;;;;38831:53:0;:14;38846:1;38831:17;;;;;;;;;;;;;;-1:-1:-1;;;;;38831:53:0;;38828:129;;;38929:4;38913:20;;38828:129;38409:3;;38363:628;;;;39013:14;39005:40;;;;-1:-1:-1;;;39005:40:0;;;;;;;:::i;:::-;39069:16;:29;;;39068:30;:47;;;;39102:13;39068:47;39060:72;;;;-1:-1:-1;;;39060:72:0;;;;;;;:::i;:::-;39178:1;39147:16;:28;;:32;;;;;39233:16;39194:11;:36;39206:23;;39194:36;;;;;;;;;;;:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39194:55:0;;;;;-1:-1:-1;;;;;39194:55:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39194:55:0;;;;;-1:-1:-1;;;;;39194:55:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39194:55:0;;;;;-1:-1:-1;;;;;39194:55:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39194:55:0;;;;;-1:-1:-1;;;;;39194:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39295:100;;;;;;;;39308:23;;39295:100;;;;39333:5;39295:100;;;;;;39340:1;39295:100;;;;39343:1;39295:100;;;;39346:1;39295:100;;;;39349:1;39295:100;;;;39352:16;:39;;;39295:100;;;;39393:1;39295:100;;;39264:7;:28;39272:19;;39264:28;;;;;;;;;;;:131;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39464:19;;39410:11;:36;39422:23;;39410:36;;;;;;;;;;;:51;;:73;;;;39525:1;39498:23;;:28;;;;;;;;;;;39564:1;39541:19;;:24;;;;;;;;;;;39580:7;;;;;;37521:2077;-1:-1:-1;39610:26:0;39639:19;;;:7;:19;;;;;;;;39700:29;;39688:42;;:11;:42;;;;;;;39669:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39669:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;39669:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39743:136;;;;39778:12;;;;;;39770:37;;;;-1:-1:-1;;;39770:37:0;;;;;;;:::i;:::-;39822:24;39835:10;39822:12;:24::i;:::-;39861:7;;;;39743:136;39891:15;;;:20;;-1:-1:-1;;39891:20:0;;;39910:1;39928:12;;;;;:63;;;;-1:-1:-1;39944:42:0;39956:19;;;:7;:19;;;;;;;;:29;39944:42;;:11;:42;;;;;:47;;;39928:63;39924:1146;;;-1:-1:-1;40016:19:0;;;;:7;:19;;;;;40068:14;;;;40053:12;:29;40050:899;;;40103:18;40154:16;:39;;;40124:4;:27;;;:69;:213;;40298:16;:39;;;40268:4;:27;;;:69;40124:213;;;40238:4;:27;;;40196:16;:39;;;:69;40124:213;40375:14;;;;40103:234;;-1:-1:-1;40392:12:0;40375:29;;40440:21;;;40484:10;;40480:454;;40553:16;:39;;;40523:4;:27;;;:69;40519:259;;;40629:23;40645:6;40629:15;:23::i;:::-;40621:69;;;;-1:-1:-1;;;40621:69:0;;;;;;;:::i;:::-;40717:27;;;;:15;:27;;;;;:37;;;;;;40519:259;40800:41;40817:10;40829:1;40832;40835:5;40800:16;:41::i;:::-;40887:27;;;;40864:20;;;:50;40480:454;40050:899;;;;41031:27;;;;40963:42;40975:19;;;:7;:19;;;;;;;;:29;40963:42;;:11;:42;;;;;:65;;:95;39924:1146;41139:1;41095:19;;;:7;:19;;;;;;;;:29;41083:42;;:11;:42;;;;;:53;;;:57;41080:160;;41213:15;;;;41157:42;41169:19;;;:7;:19;;;;;;;;:29;41157:42;;:11;:42;;;;;:53;;:71;37066:4181;;;;;;;:::o;55308:338::-;55413:23;55439:104;55445:17;55487:43;;;55532:2;55536:5;55464:78;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;55464:78:0;;;;;;;;;;;;;;-1:-1:-1;;;;;55464:78:0;-1:-1:-1;;;;;;55464:78:0;;;;;;;;;;55439:5;:104::i;:::-;55413:130;;55562:10;:17;55583:1;55562:22;:56;;;;55599:10;55588:30;;;;;;;;;;;;:::i;:::-;55554:84;;;;-1:-1:-1;;;55554:84:0;;;;;;;:::i;49924:2771::-;49985:26;50014:19;;;:7;:19;;;;;;;;50175:15;;50163:28;;:11;:28;;;;;;:39;;;50148:12;:54;50140:91;;;;-1:-1:-1;;;50140:91:0;;;;;;;:::i;:::-;50248:12;;;;;;:46;;;;;50280:5;:14;;;50264:12;:30;;50248:46;:94;;;;-1:-1:-1;50310:15:0;;50298:28;;;;:11;:28;;;;;:39;;;:44;50248:94;50244:730;;;50359:12;;:20;;-1:-1:-1;;50359:20:0;;;50394:7;;50244:730;50438:5;:16;;;50422:12;:32;;:65;;;;;50473:5;:14;;;50458:12;:29;50422:65;:81;;;;-1:-1:-1;50491:12:0;;;;;;50422:81;50418:556;;;50520:12;;;:20;;-1:-1:-1;;50520:20:0;;;50567:15;;50535:5;50555:28;;;:11;:28;;;;;;:39;;;;:43;;;50664:20;;;50631:14;;;;;50648:12;50699:29;;;;50759:15;;50747:28;;;;;;:33;50631:29;;;;50630:54;;50520:20;50747:33;50743:115;;;50801:41;50818:10;50830:1;50833;50836:5;50801:16;:41::i;:::-;50872:27;;;;:15;:27;;;;;:37;;;;;;;50924:17;50903:6;50924:9;:17::i;:::-;50956:7;;;;50418:556;51003:12;;;;;51092:15;;50986:14;51080:28;;;:11;:28;;;;;:42;;;;51057:20;;;;51003:12;;;;;51041:82;;51057:65;51041:15;:82::i;:::-;51026:12;;;:97;;-1:-1:-1;;51026:97:0;;;;;;;;;;;;;51140:12;:25;;;;;51156:9;51140:25;51136:1552;;;51256:15;;51244:28;;;;:11;:28;;;;;;;;:42;;;51221:20;;;;51198:19;;51182:36;;:15;:36;;;;;;51221:65;;51182:104;;;51373:17;;;;51256:5;;51373:17;;:::i;:::-;;;;;;;;;;;;;51362:45;;;;;;;;;;;;:::i;:::-;51339:19;;;51331:28;;;;:7;:28;;;;;;;;:76;;;;;;;;;;;;;;;;;-1:-1:-1;;51331:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51455:19;;;;;;:26;;:34;;;;;;;;51549:15;;51537:28;;;;;;;;:39;;;:44;;-1:-1:-1;;51537:44:0;;;51608:15;;51596:28;;;;;:40;;:45;;;;;;51702:19;;51668:15;;51656:28;;;;;:43;;:65;;;51736:28;;;;;;;;51778:12;51736:39;;:54;;;51880:19;;51872:28;;;;;:38;;51860:51;;;;;;;;:65;;;51805:28;;;;51845:80;;;;51805:37;;:120;;;;51948:19;;51940:28;;;;;:37;;;:41;;;52004:19;;51996:28;;;;:40;:44;52055:24;;;;;;;51136:1552;;;52101:12;;;;;;:26;;;;;52118:9;52117:10;52101:26;52097:591;;;52197:42;52209:19;;;:7;:19;;;;;;;;:29;;52197:42;;:11;:42;;;;;;:56;;;;;52174:20;;;;;52144:27;;;:15;:27;;;;;52174:79;;52144:109;;;52334:12;52301:30;;;:45;;;52419:29;;52407:42;;;;;;;;;:56;;;;52392:71;52361:28;;;:102;52478:31;;;:35;;;;52528:53;:58;;-1:-1:-1;;52528:58:0;;;52097:591;;;52675:1;52631:19;;;:7;:19;;;;;;;;:29;52619:42;;:11;:42;;;;;:53;;:57;52097:591;49924:2771;;;:::o;57899:391::-;57956:11;57953:49;;57984:7;;57953:49;58016:19;;-1:-1:-1;;;;;58016:19:0;58012:271;;58081:10;;58066:60;;-1:-1:-1;;;58066:60:0;;-1:-1:-1;;;;;58081:10:0;;;;58066:36;;58111:6;;58066:60;;58111:6;;58066:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58012:271;;;58172:19;;58193:10;;58159:53;;-1:-1:-1;;;;;58172:19:0;;;;58193:10;58205:6;58159:12;:53::i;:::-;58242:10;;58227:44;;-1:-1:-1;;;58227:44:0;;-1:-1:-1;;;;;58242:10:0;;;;58227:36;;:44;;58264:6;;58227:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55921:361;56035:23;56061:114;56067:17;56109:47;;;56158:4;56164:2;56168:5;56086:88;;;;;;;;;;:::i;56061:114::-;56035:140;;56194:10;:17;56215:1;56194:22;:56;;;;56231:10;56220:30;;;;;;;;;;;;:::i;:::-;56186:88;;;;-1:-1:-1;;;56186:88:0;;;;;;;:::i;54121:376::-;54242:20;;;54327:81;;-1:-1:-1;;;54327:81:0;;-1:-1:-1;;;;;54242:20:0;;;;;;54327:32;;:81;;54360:10;;54380:4;;54387:8;;54397:6;;54327:81;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;54451:38:0;;-1:-1:-1;;;54451:38:0;;-1:-1:-1;;;;;54451:20:0;;;-1:-1:-1;54451:20:0;;-1:-1:-1;54451:38:0;;54472:8;;54482:6;;54451:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54121:376;;;:::o;45495:3077::-;45638:33;45686:19;;;:7;:19;;;;;;;;:29;45674:42;;:11;:42;;;;;;45638:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;45638:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;45638:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45819:231;;;;;;;45851:35;;45819:231;;;;;;;;;;45932:26;;45819:231;;;;;;;;;;;;45992:22;;45819:231;;;;;;;;;46029:10;45819:231;;;;;;;46137:22;;;;;;;46303:14;;45638:78;;46137:22;;46303:52;;;;-1:-1:-1;46321:29:0;;;;:34;;46303:52;:71;;;;-1:-1:-1;46359:15:0;;;46303:71;46299:231;;;46502:16;46459:15;:40;;;:59;46438:80;;46299:231;46637:8;;46624:42;;;-1:-1:-1;;;46624:42:0;;;;46572:25;;;;-1:-1:-1;;;;;46637:8:0;;;;46624:40;;:42;;;;;;;;;;;46637:8;46624:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46571:95;;-1:-1:-1;46571:95:0;-1:-1:-1;46707:21:0;;46703:270;;46745:11;46822:4;;46778:24;;;46777:40;46760:6;:13;;;:58;46759:67;;;;;;46745:81;;46841:70;46855:9;:35;;;46892:13;46907:3;46841:13;:70::i;:::-;46942:13;;;;;:19;;;;46926:35;;46703:270;47049:10;47045:408;;;47119:77;47132:6;:27;;;47161:9;:19;;;47182:6;:13;;;47119:12;:77::i;:::-;47216:9;:19;;;-1:-1:-1;;;;;47211:41:0;;47253:6;47211:49;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;47211:49:0;;;;;;;;;;;;:::i;:::-;;;;47045:408;;;47367:74;47381:6;:27;;;47410:6;:15;;;47427:6;:13;;;47367;:74::i;:::-;47468:14;;47467:15;:45;;;;-1:-1:-1;47486:19:0;;;;:7;:19;;;;;:26;;;;;47467:45;:58;;;;;47517:8;47516:9;47467:58;47463:1102;;;47542:24;47555:10;47542:12;:24::i;:::-;47463:1102;;;47588:14;;:33;;;;-1:-1:-1;47606:15:0;;;47588:33;47584:981;;;47650:26;;;;;47642:35;;;;:7;:35;;;;;:42;;;;:106;;;;-1:-1:-1;47696:26:0;;;;47688:35;;;;:7;:35;;;;;:44;;;47736:12;-1:-1:-1;47688:60:0;47642:106;47638:187;;;47769:40;47782:15;:26;;;47769:12;:40::i;:::-;47906:23;47902:652;;48002:1;47971:26;;;;47950:48;;;;:20;:48;;;;;;:53;;-1:-1:-1;;47950:53:0;;;48047:26;;48026:48;;;;:53;:100;;;;-1:-1:-1;48092:26:0;;;;;48084:35;;;;:7;:35;;;;;:42;;;;48083:43;48026:100;48022:310;;;48219:26;;;;48207:39;;;;:11;:39;;;;;;;;;48161:15;:43;;;;;;;48151:96;;48161:85;;48151:9;:96::i;:::-;48285:26;;;;;48277:35;;;;:7;:35;;;;;;;48270:42;;;;;;;;-1:-1:-1;;48270:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48022:310;48357:22;;;;:10;:22;;;;;48350:29;;-1:-1:-1;;;;;;48350:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47902:652;;;48477:40;;;:61;;;47902:652;45495:3077;;;;;;;;;;;:::o;53004:933::-;53107:16;53140:19;;;:7;:19;;;;;:28;;;53136:665;;53214:20;;;53310:19;;;:7;:19;;;;;;;;:29;53298:42;;:11;:42;;;;;:68;;;-1:-1:-1;;;;;53214:20:0;;;;53204:36;;53241:6;;53288:79;;53298:68;53288:9;:79::i;:::-;53256:112;;;;;;;;:::i;:::-;;;;-1:-1:-1;;53256:112:0;;;;;;;;;53391:8;;-1:-1:-1;;;53378:40:0;;;;53256:112;;-1:-1:-1;;;;;53391:8:0;;;;53378:38;;:40;;;;;53391:8;;53378:40;;;;;;;53391:8;53378:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;53378:40:0;;;;;;;;;;;;:::i;:::-;53420:4;53204:221;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;53465:42:0;53477:19;;;:7;:19;;;;;;;;:29;;53465:42;;:11;:42;;;;;:68;;;53547:19;;;;;;;;:28;;;;;53445:131;;53190:235;;-1:-1:-1;;;;;;53465:68:0;;;;53190:235;;53445:131;;;;53485:10;;53445:131;:::i;:::-;;;;;;;;53591:24;;;;:14;:24;;;;;;;;:37;;;53643:19;;;:7;:19;;;;;:28;;:39;;;53136:665;;;53725:20;;;;53752:19;;;:7;:19;;;;;;;:28;;;53715:74;;-1:-1:-1;;;53715:74:0;;-1:-1:-1;;;;;53725:20:0;;;;53715:36;;:74;;53752:28;53782:6;;53715:74;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53136:665;53821:20;;;;53888:19;;;:7;:19;;;;;;;:28;;;53811:118;;-1:-1:-1;;;53811:118:0;;-1:-1:-1;;;;;53821:20:0;;;;53811:48;;:118;;53868:4;;53875:11;;53918:6;;53811:118;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53004:933;;;;;:::o;48881:1035::-;48997:20;49035:19;;;:7;:19;;;;;:28;;;49020:12;:43;:89;;49081:19;;;;:7;:19;;;;;:28;;;49020:89;;;49066:12;49020:89;49124:19;;;;:7;:19;;;;;;;;:31;;48997:112;;-1:-1:-1;49124:36:0;49120:402;;49177:23;49241:19;;;:7;:19;;;;;:30;;;;49203:35;;;;;:68;:139;;49307:19;;;;:7;:19;;;;;:35;;;49203:139;;;49274:19;;;;:7;:19;;;;;:30;;;49203:139;49479:19;;;;:7;:19;;;;;;;;:31;;;;49433:34;;;;;49177:165;;-1:-1:-1;49479:31:0;49399:30;;;49398:69;49471:4;49397:78;49479:31;49396:114;;;;49357:35;;;;:23;:35;;;;;:153;;49396:114;;;;49357:153;;;;;-1:-1:-1;49120:402:0;49582:19;;;;:7;:19;;;;;:35;;:50;;;49647:15;;49643:117;;49713:35;;;;:23;:35;;;;;;;;;49679:31;;;:19;:31;;;;;;:69;49643:117;49774:10;;49770:139;;49801:8;:96;;49856:19;;;;:7;:19;;;;;;;;:31;:41;;;;;;;;49801:96;;;-1:-1:-1;;;49812:19:0;;;;:7;:19;;;;;;;;:31;;;:41;;;;;;;;48881:1035::o;41255:2307::-;41377:8;41387:27;41416:23;41477:1;41460:7;:14;;;:18;41452:40;;;;-1:-1:-1;;;41452:40:0;;;;;;;:::i;:::-;41558:15;;41546:28;;;;:11;:28;;;;;;;:38;;;41618:29;;;;-1:-1:-1;;;;;41546:38:0;;;;-1:-1:-1;41618:50:0;;41667:1;41618:50;;;41650:7;:14;;;41618:50;41596:72;;41697:7;:29;;;:50;;41733:7;:14;;;41697:50;;;41729:1;41697:50;41679:68;;41758:23;41792:29;41945:7;:29;;;41942:596;;;42021:15;;42009:28;;;;:11;:28;;;;;:54;;;41991:121;;-1:-1:-1;;;;;42009:54:0;42065:10;42085:4;42092:19;41991:17;:121::i;:::-;42190:15;;42178:28;;;;:11;:28;;;;;;;:54;;;42152:102;;-1:-1:-1;;;42152:102:0;;-1:-1:-1;;;;;42152:25:0;;;;;;:102;;42178:54;;;;42234:19;;42152:102;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;42152:102:0;;;;;;;;;;;;:::i;:::-;42127:127;-1:-1:-1;42127:127:0;-1:-1:-1;41942:596:0;;;42419:15;;42407:28;;;;:11;:28;;;;;;:54;;;42475:15;;42463:28;;;;;;:45;;;42389:137;;-1:-1:-1;;;42389:137:0;;-1:-1:-1;;;;;42389:17:0;;;;;;:137;;42407:54;;;;42463:45;;42510:15;;42389:137;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;42389:137:0;;;;;;;;;;;;:::i;:::-;42343:183;;-1:-1:-1;42343:183:0;;-1:-1:-1;42343:183:0;-1:-1:-1;41942:596:0;42630:9;42626:929;42649:6;:13;42645:1;:17;42626:929;;;42712:15;;42700:28;;;;:11;:28;;;;;:45;;;42687:9;;-1:-1:-1;;;;;42700:45:0;;;;42687:6;;42694:1;;42687:9;;;;;;;;;;;;-1:-1:-1;;;;;42687:58:0;;42684:341;;;42784:12;42797:1;42784:15;;;;;;;;;;;;;;42766:33;;42845:11;:28;42857:5;:15;;;42845:28;;;;;;;;;;;:41;;;42826:15;:60;;42818:91;;;;-1:-1:-1;;;42818:91:0;;;;;;;:::i;:::-;42931:7;:29;;;42928:82;;;42985:5;;42928:82;43042:7;:29;;;43039:77;;;43092:8;;43039:77;43145:15;;43133:28;;;;:11;:28;;;;;:41;;;-1:-1:-1;;;43133:41:0;;;;:102;;;;;43226:6;43233:1;43226:9;;;;;;;;;;;;;;;;;;;43190:15;;43178:28;;;;:11;:28;;;;;;;:44;;;-1:-1:-1;;;;;43178:44:0;;;:57;;;43133:102;43130:414;;;43277:12;43290:1;43277:15;;;;;;;;;;;;;;43264:9;:28;43256:60;;;;-1:-1:-1;;;43256:60:0;;;;;;;:::i;:::-;43130:414;;;43357:72;43375:6;43382:1;43375:9;;;;;;;;;;;;;;43386:10;43406:4;43413:12;43426:1;43413:15;;;;;;;;;;;;;;43357:17;:72::i;:::-;43448:80;43461:6;43468:1;43461:9;;;;;;;;;;;;;;43472:11;:28;43484:5;:15;;;43472:28;;;;;;;;;;;:38;;;;;;;;;;-1:-1:-1;;;;;43472:38:0;43512:12;43525:1;43512:15;;;;;;;;;;;;;;43448:12;:80::i;:::-;42664:3;;42626:929;;;;41255:2307;;;;;;;:::o;58421:657::-;58520:19;;58478:4;;;;-1:-1:-1;;;;;58520:19:0;:33;:112;;58587:19;;58580:52;;-1:-1:-1;;;58580:52:0;;-1:-1:-1;;;;;58587:19:0;;;;58580:37;;:52;;58626:4;;58580:52;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58520:112;;;58556:21;58520:112;58722:10;;58707:45;;-1:-1:-1;;;58707:45:0;;58495:137;;-1:-1:-1;58669:23:0;;;;-1:-1:-1;;;;;58722:10:0;;;;58707:37;;:45;;58686:6;;58707:45;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58703:61;58798:19;;58774:21;;-1:-1:-1;;;;;58798:19:0;:33;:112;;58865:19;;58858:52;;-1:-1:-1;;;58858:52:0;;-1:-1:-1;;;;;58865:19:0;;;;58858:37;;:52;;58904:4;;58858:52;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58798:112;;;58834:21;58798:112;58774:136;;58941:15;58924:13;:32;58921:75;;;58980:4;58973:11;;;;;;;58921:75;59006:41;59032:14;59016:13;:30;59006:9;:41::i;:::-;-1:-1:-1;59065:5:0;;58421:657;-1:-1:-1;;;;58421:657:0:o;54734:335::-;54838:23;54864:103;54870:17;54912:42;;;54956:2;54960:5;54889:77;;;;;;;;;:::i;54864:103::-;54838:129;;54986:10;:17;55007:1;54986:22;:56;;;;55023:10;55012:30;;;;;;;;;;;;:::i;:::-;54978:83;;;;-1:-1:-1;;;54978:83:0;;;;;;;:::i;57297:494::-;57429:42;;;;;;;;;;;-1:-1:-1;;;57429:42:0;;;;57503:13;;57513:2;57503:13;;;57353;57503;;;;;;-1:-1:-1;;;;;57403:14:0;;;57429:42;-1:-1:-1;;57503:13:0;;;;;;;;;;-1:-1:-1;57503:13:0;57484:32;;-1:-1:-1;;;57527:3:0;57531:1;57527:6;;;;;;;;;;;:12;-1:-1:-1;;;;;57527:12:0;;;;;;;;;-1:-1:-1;;;57550:3:0;57554:1;57550:6;;;;;;;;;;;:12;-1:-1:-1;;;;;57550:12:0;;;;;;;;;57578:6;57573:182;57594:2;57590:1;:6;57573:182;;;57631:8;57668:1;57651:5;57657:1;57661:2;57657:6;57651:13;;;;;;;;;;-1:-1:-1;;;;;57651:18:0;;;;57645:25;;57640:31;;57631:41;;;;;;;;;;;;;;;;57618:3;57624:1;57626;57624:3;57622:1;:5;57618:10;;;;;;;;;;;:54;-1:-1:-1;;;;;57618:54:0;;;;;;;;;57700:8;57720:5;57726:1;57730:2;57726:6;57720:13;;;;;;;57700:43;;57720:13;;;57736:4;57714:27;;57700:43;;;;;;;;;;;;;;57687:3;57693:1;57695;57693:3;57691:1;:5;57687:10;;;;;;;;;;;:56;-1:-1:-1;;;;;57687:56:0;;;;;;;;-1:-1:-1;57598:3:0;;57573:182;;;-1:-1:-1;57779:3:0;57297:494;-1:-1:-1;;;;57297:494:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:310:1:-;;120:53;135:37;165:6;135:37;:::i;:::-;120:53;:::i;:::-;111:62;;196:6;189:5;182:21;236:3;227:6;222:3;218:16;215:25;212:2;;;253:1;250;243:12;212:2;266:52;311:6;304:4;297:5;293:16;288:3;266:52;:::i;:::-;101:223;;;;;:::o;329:138::-;399:20;;428:33;399:20;428:33;:::i;472:142::-;553:13;;575:33;553:13;575:33;:::i;619:779::-;;743:3;736:4;728:6;724:17;720:27;710:2;;765:5;758;751:20;710:2;798:6;792:13;824:4;848:65;863:49;909:2;863:49;:::i;848:65::-;947:15;;;978:12;;;;1010:15;;;1056:11;;;1044:24;;1040:33;;1037:42;-1:-1:-1;1034:2:1;;;1096:5;1089;1082:20;1034:2;1122:5;1136:233;1150:2;1147:1;1144:9;1136:233;;;1214:3;1208:10;1231:33;1258:5;1231:33;:::i;:::-;1277:18;;1315:12;;;;1347;;;;1168:1;1161:9;1136:233;;;-1:-1:-1;1387:5:1;;700:698;-1:-1:-1;;;;;;;700:698:1:o;1403:705::-;;1516:3;1509:4;1501:6;1497:17;1493:27;1483:2;;1538:5;1531;1524:20;1483:2;1578:6;1565:20;1604:4;1628:65;1643:49;1689:2;1643:49;:::i;1628:65::-;1727:15;;;1758:12;;;;1790:15;;;1836:11;;;1824:24;;1820:33;;1817:42;-1:-1:-1;1814:2:1;;;1876:5;1869;1862:20;1814:2;1902:5;1916:163;1930:2;1927:1;1924:9;1916:163;;;1987:17;;1975:30;;2025:12;;;;2057;;;;1948:1;1941:9;1916:163;;2113:702;;2237:3;2230:4;2222:6;2218:17;2214:27;2204:2;;2259:5;2252;2245:20;2204:2;2292:6;2286:13;2318:4;2342:65;2357:49;2403:2;2357:49;:::i;2342:65::-;2441:15;;;2472:12;;;;2504:15;;;2550:11;;;2538:24;;2534:33;;2531:42;-1:-1:-1;2528:2:1;;;2590:5;2583;2576:20;2528:2;2616:5;2630:156;2644:2;2641:1;2638:9;2630:156;;;2701:10;;2689:23;;2732:12;;;;2764;;;;2662:1;2655:9;2630:156;;2820:132;2887:20;;2916:30;2887:20;2916:30;:::i;2957:136::-;3035:13;;3057:30;3035:13;3057:30;:::i;3098:485::-;;3195:3;3188:4;3180:6;3176:17;3172:27;3162:2;;3217:5;3210;3203:20;3162:2;3257:6;3244:20;3288:49;3303:33;3333:2;3303:33;:::i;3288:49::-;3362:2;3353:7;3346:19;3408:3;3401:4;3396:2;3388:6;3384:15;3380:26;3377:35;3374:2;;;3429:5;3422;3415:20;3374:2;3498;3491:4;3483:6;3479:17;3472:4;3463:7;3459:18;3446:55;3521:16;;;3539:4;3517:27;3510:42;;;;3525:7;3152:431;-1:-1:-1;;3152:431:1:o;3588:768::-;;3708:4;3696:9;3691:3;3687:19;3683:30;3680:2;;;3730:5;3723;3716:20;3680:2;3767;3761:9;3809:4;3801:6;3797:17;3880:6;3868:10;3865:22;-1:-1:-1;;;;;3832:10:1;3829:34;3826:62;3823:2;;;3891:9;3823:2;3922:10;3918:2;3911:22;;3951:6;3942:15;;3994:9;3981:23;3973:6;3966:39;4066:2;4055:9;4051:18;4038:32;4033:2;4025:6;4021:15;4014:57;4123:2;4112:9;4108:18;4095:32;4136;4160:7;4136:32;:::i;:::-;4196:2;4184:15;;4177:32;4261:2;4246:18;;4233:32;4274:35;4233:32;4274:35;:::i;:::-;4337:2;4325:15;;;;4318:32;3670:686;;-1:-1:-1;;3670:686:1:o;4361:1129::-;;;;;;4600:3;4588:9;4579:7;4575:23;4571:33;4568:2;;;4622:6;4614;4607:22;4568:2;4666:9;4653:23;4685:33;4712:5;4685:33;:::i;:::-;4737:5;-1:-1:-1;4794:2:1;4779:18;;4766:32;4807:35;4766:32;4807:35;:::i;:::-;4861:7;-1:-1:-1;4919:2:1;4904:18;;4891:32;-1:-1:-1;;;;;4972:14:1;;;4969:2;;;5004:6;4996;4989:22;4969:2;5032:67;5091:7;5082:6;5071:9;5067:22;5032:67;:::i;:::-;5022:77;;5152:2;5141:9;5137:18;5124:32;5108:48;;5181:2;5171:8;5168:16;5165:2;;;5202:6;5194;5187:22;5165:2;5230:69;5291:7;5280:8;5269:9;5265:24;5230:69;:::i;:::-;5220:79;;5352:3;5341:9;5337:19;5324:33;5308:49;;5382:2;5372:8;5369:16;5366:2;;;5403:6;5395;5388:22;5366:2;;5431:53;5476:7;5465:8;5454:9;5450:24;5431:53;:::i;:::-;5421:63;;;4558:932;;;;;;;;:::o;5495:760::-;;;;;;5684:3;5672:9;5663:7;5659:23;5655:33;5652:2;;;5706:6;5698;5691:22;5652:2;5750:9;5737:23;5769:33;5796:5;5769:33;:::i;:::-;5821:5;-1:-1:-1;5878:2:1;5863:18;;5850:32;5891:35;5850:32;5891:35;:::i;:::-;5945:7;-1:-1:-1;5999:2:1;5984:18;;5971:32;;-1:-1:-1;6050:2:1;6035:18;;6022:32;;-1:-1:-1;6105:3:1;6090:19;;6077:33;-1:-1:-1;;;;;6122:30:1;;6119:2;;;6170:6;6162;6155:22;6119:2;6198:51;6241:7;6232:6;6221:9;6217:22;6198:51;:::i;6260:619::-;;;6409:2;6397:9;6388:7;6384:23;6380:32;6377:2;;;6430:6;6422;6415:22;6377:2;6467:9;6461:16;6486:33;6513:5;6486:33;:::i;:::-;6587:2;6572:18;;6566:25;6538:5;;-1:-1:-1;;;;;;6603:30:1;;6600:2;;;6651:6;6643;6636:22;6600:2;6679:22;;6732:4;6724:13;;6720:27;-1:-1:-1;6710:2:1;;6766:6;6758;6751:22;6710:2;6794:79;6865:7;6860:2;6854:9;6849:2;6845;6841:11;6794:79;:::i;:::-;6784:89;;;6367:512;;;;;:::o;6884:998::-;;;;;;7082:3;7070:9;7061:7;7057:23;7053:33;7050:2;;;7104:6;7096;7089:22;7050:2;7148:9;7135:23;7167:33;7194:5;7167:33;:::i;:::-;7219:5;-1:-1:-1;7275:2:1;7260:18;;7247:32;-1:-1:-1;;;;;7328:14:1;;;7325:2;;;7360:6;7352;7345:22;7325:2;7388:51;7431:7;7422:6;7411:9;7407:22;7388:51;:::i;:::-;7378:61;;7491:2;7480:9;7476:18;7463:32;7448:47;;7504:35;7531:7;7504:35;:::i;:::-;7558:7;;-1:-1:-1;7617:2:1;7602:18;;7589:32;;7630:35;7589:32;7630:35;:::i;:::-;7684:7;;-1:-1:-1;7744:3:1;7729:19;;7716:33;;7761:16;;;7758:2;;;7795:6;7787;7780:22;7887:327;;;8016:2;8004:9;7995:7;7991:23;7987:32;7984:2;;;8037:6;8029;8022:22;7984:2;8081:9;8068:23;8100:33;8127:5;8100:33;:::i;:::-;8152:5;8204:2;8189:18;;;;8176:32;;-1:-1:-1;;;7974:240:1:o;8219:454::-;;;;8373:2;8361:9;8352:7;8348:23;8344:32;8341:2;;;8394:6;8386;8379:22;8341:2;8431:9;8425:16;8450:33;8477:5;8450:33;:::i;:::-;8547:2;8532:18;;8526:25;8596:2;8581:18;;8575:25;8502:5;;-1:-1:-1;8526:25:1;-1:-1:-1;8609:32:1;8575:25;8609:32;:::i;:::-;8660:7;8650:17;;;8331:342;;;;;:::o;8678:3214::-;;8835:2;8878;8866:9;8857:7;8853:23;8849:32;8846:2;;;8899:6;8891;8884:22;8846:2;8944:9;8931:23;-1:-1:-1;;;;;9014:2:1;9006:6;9003:14;9000:2;;;9035:6;9027;9020:22;9000:2;9078:6;9067:9;9063:22;9053:32;;9123:7;9116:4;9112:2;9108:13;9104:27;9094:2;;9150:6;9142;9135:22;9094:2;9191;9178:16;9214:65;9229:49;9275:2;9229:49;:::i;9214:65::-;9313:15;;;9344:12;;;;9376:11;;;9406:6;9439:11;;;9431:20;;9427:29;;9424:42;-1:-1:-1;9421:2:1;;;9484:6;9476;9469:22;9421:2;9511:6;9502:15;;9526:2336;9540:2;9537:1;9534:9;9526:2336;;;9608:3;9599:7;9595:17;9636:2;9632;9628:11;9625:2;;;9657:6;9649;9642:22;9625:2;9689;9724;9718:9;9750:4;9797:2;9789:6;9785:15;9854:6;9842:10;9839:22;9834:2;9822:10;9819:18;9816:46;9813:2;;;9865:9;9813:2;9889:22;;9937:17;;9967:30;9937:17;9967:30;:::i;:::-;10010:21;;10072:12;;;10059:26;10098:32;10059:26;10098:32;:::i;:::-;10150:15;;;10143:32;10225:12;;;10212:26;10195:15;;;10188:51;10262:2;10288:6;-1:-1:-1;;10314:16:1;;10310:26;-1:-1:-1;10307:2:1;;;10354:6;10346;10339:22;10307:2;10391:19;10406:3;10391:19;:::i;:::-;10376:34;;10439:31;10466:2;10461:3;10457:12;10439:31;:::i;:::-;10430:7;10423:48;10531:2;10526:3;10522:12;10509:26;10504:2;10495:7;10491:16;10484:52;10560:3;10623;10618;10614:13;10601:27;10596:2;10587:7;10583:16;10576:53;10653:3;10642:14;;10716:3;10711;10707:13;10694:27;10689:2;10680:7;10676:16;10669:53;10746:3;10809;10804;10800:13;10787:27;10782:2;10773:7;10769:16;10762:53;10839:3;10828:14;;10903:3;10898;10894:13;10881:27;10875:3;10866:7;10862:17;10855:54;10933:3;10922:14;;10997:3;10992;10988:13;10975:27;10969:3;10960:7;10956:17;10949:54;11027:3;11016:14;;11069:35;11099:3;11094;11090:13;11069:35;:::i;:::-;11050:17;;;11043:62;11129:3;11171:35;11192:13;;;11171:35;:::i;:::-;11165:3;11156:7;11152:17;11145:62;11231:3;11220:14;;11273:35;11303:3;11298;11294:13;11273:35;:::i;:::-;11267:3;11258:7;11254:17;11247:62;11333:3;11322:14;;11375:35;11405:3;11400;11396:13;11375:35;:::i;:::-;11369:3;11360:7;11356:17;11349:62;11435:3;11424:14;;11477:32;11504:3;11499;11495:13;11477:32;:::i;:::-;11471:3;11462:7;11458:17;11451:59;;11571:3;11566;11562:13;11549:27;11543:3;11534:7;11530:17;11523:54;11638:3;11633;11629:13;11616:27;11610:3;11601:7;11597:17;11590:54;;;11705:3;11700;11696:13;11683:27;11677:3;11668:7;11664:17;11657:54;11748:7;11743:2;11735:6;11731:15;11724:32;;;11781:6;11776:3;11769:19;;;;11817:2;11812:3;11808:12;11801:19;;11849:2;11844:3;11840:12;11833:19;;9558:1;9555;9551:9;9546:14;;9526:2336;;;-1:-1:-1;11881:5:1;;8815:3077;-1:-1:-1;;;;;;;;;8815:3077:1:o;11897:2441::-;;12056:2;12099;12087:9;12078:7;12074:23;12070:32;12067:2;;;12120:6;12112;12105:22;12067:2;12158:9;12152:16;-1:-1:-1;;;;;12183:6:1;12180:30;12177:2;;;12228:6;12220;12213:22;12177:2;12256:22;;12309:4;12301:13;;12297:27;-1:-1:-1;12287:2:1;;12343:6;12335;12328:22;12287:2;12377;12371:9;12400:65;12415:49;12461:2;12415:49;:::i;12400:65::-;12499:15;;;12530:12;;;;12562:11;;;12592:6;12625:11;;;12617:20;;12613:29;;12610:42;-1:-1:-1;12607:2:1;;;12670:6;12662;12655:22;12607:2;12697:6;12688:15;;12712:1596;12726:2;12723:1;12720:9;12712:1596;;;12797:2;12791:3;12782:7;12778:17;12774:26;12771:2;;;12818:6;12810;12803:22;12771:2;12853:18;12868:2;12853:18;:::i;:::-;12898:33;12927:3;12898:33;:::i;:::-;12884:48;;12974:12;;;12968:19;12952:14;;;12945:43;13011:2;13055:12;;;13049:19;13033:14;;;13026:43;13092:2;13136:12;;;13130:19;13114:14;;;13107:43;13173:3;13218:12;;;13212:19;13196:14;;;13189:43;13255:3;13300:12;;;13294:19;13278:14;;;13271:43;13337:3;13382:12;;;13376:19;13360:14;;;13353:43;13420:3;13460:46;13492:13;;;13460:46;:::i;:::-;13443:15;;;13436:71;13531:3;13571:46;13603:13;;;13571:46;:::i;:::-;13554:15;;;13547:71;13642:3;13682:46;13714:13;;;13682:46;:::i;:::-;13665:15;;;13658:71;13753:3;13793:46;13825:13;;;13793:46;:::i;:::-;13776:15;;;13769:71;13864:3;13904:43;13933:13;;;13904:43;:::i;:::-;13887:15;;;13880:68;13972:3;14018:13;;;14012:20;13995:15;;;13988:45;14057:3;14103:13;;;14097:20;14080:15;;;14073:45;14142:3;14188:13;;;14182:20;14165:15;;;14158:45;14216:18;;12744:1;12737:9;;;;;14254:12;;;;14286;;;;12712:1596;;;-1:-1:-1;14327:5:1;;12036:2302;-1:-1:-1;;;;;;;;12036:2302:1:o;14343:656::-;;;14533:2;14521:9;14512:7;14508:23;14504:32;14501:2;;;14554:6;14546;14539:22;14501:2;14592:9;14586:16;-1:-1:-1;;;;;14662:2:1;14654:6;14651:14;14648:2;;;14683:6;14675;14668:22;14648:2;14711:78;14781:7;14772:6;14761:9;14757:22;14711:78;:::i;:::-;14701:88;;14835:2;14824:9;14820:18;14814:25;14798:41;;14864:2;14854:8;14851:16;14848:2;;;14885:6;14877;14870:22;14848:2;;14913:80;14985:7;14974:8;14963:9;14959:24;14913:80;:::i;15004:257::-;;15124:2;15112:9;15103:7;15099:23;15095:32;15092:2;;;15145:6;15137;15130:22;15092:2;15182:9;15176:16;15201:30;15225:5;15201:30;:::i;15266:306::-;;15377:2;15365:9;15356:7;15352:23;15348:32;15345:2;;;15398:6;15390;15383:22;15345:2;15429:23;;-1:-1:-1;;;;;;15481:32:1;;15471:43;;15461:2;;15533:6;15525;15518:22;15577:301;;15738:2;15726:9;15717:7;15713:23;15709:32;15706:2;;;15759:6;15751;15744:22;15706:2;15796:9;15790:16;15815:33;15842:5;15815:33;:::i;15883:490::-;;16016:2;16004:9;15995:7;15991:23;15987:32;15984:2;;;16037:6;16029;16022:22;15984:2;16075:9;16069:16;-1:-1:-1;;;;;16100:6:1;16097:30;16094:2;;;16145:6;16137;16130:22;16094:2;16173:22;;16226:4;16218:13;;16214:27;-1:-1:-1;16204:2:1;;16260:6;16252;16245:22;16204:2;16288:79;16359:7;16354:2;16348:9;16343:2;16339;16335:11;16288:79;:::i;:::-;16278:89;15974:399;-1:-1:-1;;;;15974:399:1:o;16378:270::-;;16529:3;16517:9;16508:7;16504:23;16500:33;16497:2;;;16551:6;16543;16536:22;16497:2;16579:63;16634:7;16623:9;16579:63;:::i;16653:838::-;;16808:3;16796:9;16787:7;16783:23;16779:33;16776:2;;;16830:6;16822;16815:22;16776:2;16868;16862:9;16910:3;16902:6;16898:16;16980:6;16968:10;16965:22;-1:-1:-1;;;;;16932:10:1;16929:34;16926:62;16923:2;;;16991:9;16923:2;17018;17011:22;17057:42;17089:9;17057:42;:::i;:::-;17049:6;17042:58;17154:2;17143:9;17139:18;17133:25;17128:2;17120:6;17116:15;17109:50;17213:2;17202:9;17198:18;17192:25;17187:2;17179:6;17175:15;17168:50;17272:2;17261:9;17257:18;17251:25;17246:2;17238:6;17234:15;17227:50;17332:3;17321:9;17317:19;17311:26;17305:3;17297:6;17293:16;17286:52;17393:3;17382:9;17378:19;17372:26;17366:3;17358:6;17354:16;17347:52;17454:3;17443:9;17439:19;17433:26;17427:3;17419:6;17415:16;17408:52;17479:6;17469:16;;;16766:725;;;;:::o;17496:913::-;;17626:3;17670:2;17658:9;17649:7;17645:23;17641:32;17638:2;;;17691:6;17683;17676:22;17638:2;17729;17723:9;17759:15;;;;-1:-1:-1;;;;;17789:34:1;;17825:22;;;17786:62;17783:2;;;17851:9;17783:2;17882:10;17878:2;17871:22;17923:9;17917:16;17909:6;17902:32;17967:48;18011:2;18000:9;17996:18;17967:48;:::i;:::-;17962:2;17954:6;17950:15;17943:73;18070:2;18059:9;18055:18;18049:25;18044:2;18036:6;18032:15;18025:50;18129:2;18118:9;18114:18;18108:25;18103:2;18095:6;18091:15;18084:50;18189:3;18178:9;18174:19;18168:26;18162:3;18154:6;18150:16;18143:52;18250:3;18239:9;18235:19;18229:26;18223:3;18215:6;18211:16;18204:52;18311:3;18300:9;18296:19;18290:26;18284:3;18276:6;18272:16;18265:52;18372:3;18361:9;18357:19;18351:26;18345:3;18337:6;18333:16;18326:52;18397:6;18387:16;;;;17606:803;;;;:::o;18414:190::-;;18526:2;18514:9;18505:7;18501:23;18497:32;18494:2;;;18547:6;18539;18532:22;18494:2;-1:-1:-1;18575:23:1;;18484:120;-1:-1:-1;18484:120:1:o;18609:194::-;;18732:2;18720:9;18711:7;18707:23;18703:32;18700:2;;;18753:6;18745;18738:22;18700:2;-1:-1:-1;18781:16:1;;18690:113;-1:-1:-1;18690:113:1:o;18808:324::-;;;18948:2;18936:9;18927:7;18923:23;18919:32;18916:2;;;18969:6;18961;18954:22;18916:2;19003:9;18997:16;18987:26;;19056:2;19045:9;19041:18;19035:25;19069:33;19096:5;19069:33;:::i;:::-;19121:5;19111:15;;;18906:226;;;;;:::o;19137:717::-;;;;19344:2;19332:9;19323:7;19319:23;19315:32;19312:2;;;19365:6;19357;19350:22;19312:2;19399:9;19393:16;19383:26;;19453:2;19442:9;19438:18;19432:25;-1:-1:-1;;;;;19517:2:1;19509:6;19506:14;19503:2;;;19538:6;19530;19523:22;19503:2;19566:78;19636:7;19627:6;19616:9;19612:22;19566:78;:::i;:::-;19556:88;;19690:2;19679:9;19675:18;19669:25;19653:41;;19719:2;19709:8;19706:16;19703:2;;;19740:6;19732;19725:22;19703:2;;19768:80;19840:7;19829:8;19818:9;19814:24;19768:80;:::i;:::-;19758:90;;;19302:552;;;;;:::o;19859:321::-;;;19985:2;19973:9;19964:7;19960:23;19956:32;19953:2;;;20006:6;19998;19991:22;19953:2;20047:9;20034:23;20024:33;;20107:2;20096:9;20092:18;20079:32;20120:30;20144:5;20120:30;:::i;20185:338::-;;;20353:3;20341:9;20332:7;20328:23;20324:33;20321:2;;;20375:6;20367;20360:22;20321:2;20416:9;20403:23;20393:33;;20445:72;20509:7;20504:2;20493:9;20489:18;20445:72;:::i;:::-;20435:82;;20311:212;;;;;:::o;20528:458::-;;;;;20688:3;20676:9;20667:7;20663:23;20659:33;20656:2;;;20710:6;20702;20695:22;20656:2;20751:9;20738:23;20728:33;;20808:2;20797:9;20793:18;20780:32;20770:42;;20862:2;20851:9;20847:18;20834:32;20875:30;20899:5;20875:30;:::i;:::-;20646:340;;;;-1:-1:-1;20924:5:1;;20976:2;20961:18;20948:32;;-1:-1:-1;;20646:340:1:o;20991:114::-;-1:-1:-1;;;;;21067:31:1;21055:44;;21045:60::o;21110:93::-;21182:13;21175:21;21163:34;;21153:50::o;21208:259::-;;21289:5;21283:12;21316:6;21311:3;21304:19;21332:63;21388:6;21381:4;21376:3;21372:14;21365:4;21358:5;21354:16;21332:63;:::i;:::-;21449:2;21428:15;-1:-1:-1;;21424:29:1;21415:39;;;;21456:4;21411:50;;21259:208;-1:-1:-1;;21259:208:1:o;21472:508::-;21559:5;21553:12;21548:3;21541:25;21629:4;21622:5;21618:16;21612:23;21605:31;21598:39;21591:4;21586:3;21582:14;21575:63;21687:4;21680:5;21676:16;21670:23;21663:4;21658:3;21654:14;21647:47;21743:4;21736:5;21732:16;21726:23;21719:4;21714:3;21710:14;21703:47;21799:4;21792:5;21788:16;21782:23;21775:4;21770:3;21766:14;21759:47;21855:4;21848:5;21844:16;21838:23;21831:4;21826:3;21822:14;21815:47;21911:4;21904:5;21900:16;21894:23;21887:4;21882:3;21878:14;21871:47;21967:4;21960:5;21956:16;21950:23;21943:4;21938:3;21934:14;21927:47;21531:449;;:::o;21985:430::-;;-1:-1:-1;;;22242:3:1;22235:26;22290:6;22284:13;22306:62;22361:6;22356:2;22351:3;22347:12;22340:4;22332:6;22328:17;22306:62;:::i;:::-;22388:16;;;;22406:2;22384:25;;22225:190;-1:-1:-1;;22225:190:1:o;22420:205::-;22620:3;22611:14::o;22630:203::-;-1:-1:-1;;;;;22794:32:1;;;;22776:51;;22764:2;22749:18;;22731:102::o;23054:646::-;-1:-1:-1;;;;;23421:15:1;;;23403:34;;23473:15;;;;23468:2;23453:18;;23446:43;23520:2;23505:18;;23498:34;23563:2;23548:18;;23541:34;;;;23383:3;23606;23591:19;;23584:32;;;23054:646;23632:19;;;23625:33;23690:3;23675:19;;23355:345::o;24348:282::-;-1:-1:-1;;;;;24548:32:1;;;;24530:51;;24612:2;24597:18;;24590:34;24518:2;24503:18;;24485:145::o;24635:375::-;-1:-1:-1;;;;;24893:15:1;;;24875:34;;24945:15;;;;24940:2;24925:18;;24918:43;24992:2;24977:18;;24970:34;;;;24825:2;24810:18;;24792:218::o;25294:345::-;-1:-1:-1;;;;;25514:32:1;;;;25496:51;;25578:2;25563:18;;25556:34;;;;25621:2;25606:18;;25599:34;25484:2;25469:18;;25451:188::o;25644:724::-;25873:2;25925:21;;;25995:13;;25898:18;;;26017:22;;;25644:724;;25873:2;26096:15;;;;26070:2;26055:18;;;25644:724;26142:200;26156:6;26153:1;26150:13;26142:200;;;26205:53;26254:3;26245:6;26239:13;26205:53;:::i;:::-;26317:15;;;;26287:6;26278:16;;;;;26178:1;26171:9;26142:200;;;-1:-1:-1;26359:3:1;;25853:515;-1:-1:-1;;;;;;25853:515:1:o;26373:187::-;26538:14;;26531:22;26513:41;;26501:2;26486:18;;26468:92::o;26565:202::-;-1:-1:-1;;;;;;26727:33:1;;;;26709:52;;26697:2;26682:18;;26664:103::o;26772:219::-;;26919:2;26908:9;26901:21;26939:46;26981:2;26970:9;26966:18;26958:6;26939:46;:::i;26996:446::-;;27244:2;27233:9;27226:21;27270:46;27312:2;27301:9;27297:18;27289:6;27270:46;:::i;:::-;27352:22;;;27347:2;27332:18;;;27325:50;27384:20;;;27421:15;;27216:226;-1:-1:-1;27216:226:1:o;27447:340::-;27649:2;27631:21;;;27688:2;27668:18;;;27661:30;-1:-1:-1;;;27722:2:1;27707:18;;27700:46;27778:2;27763:18;;27621:166::o;27792:397::-;27994:2;27976:21;;;28033:2;28013:18;;;28006:30;28072:34;28067:2;28052:18;;28045:62;-1:-1:-1;;;28138:2:1;28123:18;;28116:31;28179:3;28164:19;;27966:223::o;28194:350::-;28396:2;28378:21;;;28435:2;28415:18;;;28408:30;28474:28;28469:2;28454:18;;28447:56;28535:2;28520:18;;28368:176::o;28549:340::-;28751:2;28733:21;;;28790:2;28770:18;;;28763:30;-1:-1:-1;;;28824:2:1;28809:18;;28802:46;28880:2;28865:18;;28723:166::o;28894:336::-;29096:2;29078:21;;;29135:2;29115:18;;;29108:30;-1:-1:-1;;;29169:2:1;29154:18;;29147:42;29221:2;29206:18;;29068:162::o;29235:336::-;29437:2;29419:21;;;29476:2;29456:18;;;29449:30;-1:-1:-1;;;29510:2:1;29495:18;;29488:42;29562:2;29547:18;;29409:162::o;29576:337::-;29778:2;29760:21;;;29817:2;29797:18;;;29790:30;-1:-1:-1;;;29851:2:1;29836:18;;29829:43;29904:2;29889:18;;29750:163::o;29918:336::-;30120:2;30102:21;;;30159:2;30139:18;;;30132:30;-1:-1:-1;;;30193:2:1;30178:18;;30171:42;30245:2;30230:18;;30092:162::o;30259:342::-;30461:2;30443:21;;;30500:2;30480:18;;;30473:30;-1:-1:-1;;;30534:2:1;30519:18;;30512:48;30592:2;30577:18;;30433:168::o;30606:340::-;30808:2;30790:21;;;30847:2;30827:18;;;30820:30;-1:-1:-1;;;30881:2:1;30866:18;;30859:46;30937:2;30922:18;;30780:166::o;30951:332::-;31153:2;31135:21;;;31192:1;31172:18;;;31165:29;-1:-1:-1;;;31225:2:1;31210:18;;31203:39;31274:2;31259:18;;31125:158::o;31288:1153::-;;31806:3;31795:9;31788:22;31847:2;31841:3;31830:9;31826:19;31819:31;-1:-1:-1;;;31881:3:1;31870:9;31866:19;31859:48;31926:3;31967:2;31960:4;31949:9;31945:20;31938:32;32006:1;32001:2;31990:9;31986:18;31979:29;;-1:-1:-1;;;32039:3:1;32028:9;32024:19;32017:36;32072:3;32125:6;32118:14;32111:22;32106:2;32095:9;32091:18;32084:50;32170:2;32165;32154:9;32150:18;32143:30;32196:46;32238:2;32227:9;32223:18;32215:6;32196:46;:::i;:::-;-1:-1:-1;;;;;32279:32:1;;;;32273:3;32258:19;;32251:61;-1:-1:-1;32349:22:1;;;32299:3;32328:19;;;32321:51;;;;32381:20;;32430:4;32418:17;;;-1:-1:-1;;31778:663:1:o;32446:343::-;32648:2;32630:21;;;32687:2;32667:18;;;32660:30;-1:-1:-1;;;32721:2:1;32706:18;;32699:49;32780:2;32765:18;;32620:169::o;32794:340::-;32996:2;32978:21;;;33035:2;33015:18;;;33008:30;-1:-1:-1;;;33069:2:1;33054:18;;33047:46;33125:2;33110:18;;32968:166::o;33139:338::-;33341:2;33323:21;;;33380:2;33360:18;;;33353:30;-1:-1:-1;;;33414:2:1;33399:18;;33392:44;33468:2;33453:18;;33313:164::o;33482:332::-;33684:2;33666:21;;;33723:1;33703:18;;;33696:29;-1:-1:-1;;;33756:2:1;33741:18;;33734:39;33805:2;33790:18;;33656:158::o;33819:354::-;34021:2;34003:21;;;34060:2;34040:18;;;34033:30;34099:32;34094:2;34079:18;;34072:60;34164:2;34149:18;;33993:180::o;34178:336::-;34380:2;34362:21;;;34419:2;34399:18;;;34392:30;-1:-1:-1;;;34453:2:1;34438:18;;34431:42;34505:2;34490:18;;34352:162::o;34519:332::-;34721:2;34703:21;;;34760:1;34740:18;;;34733:29;-1:-1:-1;;;34793:2:1;34778:18;;34771:39;34842:2;34827:18;;34693:158::o;34856:339::-;35058:2;35040:21;;;35097:2;35077:18;;;35070:30;-1:-1:-1;;;35131:2:1;35116:18;;35109:45;35186:2;35171:18;;35030:165::o;35200:337::-;35402:2;35384:21;;;35441:2;35421:18;;;35414:30;-1:-1:-1;;;35475:2:1;35460:18;;35453:43;35528:2;35513:18;;35374:163::o;35542:335::-;35744:2;35726:21;;;35783:2;35763:18;;;35756:30;-1:-1:-1;;;35817:2:1;35802:18;;35795:41;35868:2;35853:18;;35716:161::o;35882:339::-;36084:2;36066:21;;;36123:2;36103:18;;;36096:30;-1:-1:-1;;;36157:2:1;36142:18;;36135:45;36212:2;36197:18;;36056:165::o;36226:351::-;36428:2;36410:21;;;36467:2;36447:18;;;36440:30;36506:29;36501:2;36486:18;;36479:57;36568:2;36553:18;;36400:177::o;36582:343::-;36784:2;36766:21;;;36823:2;36803:18;;;36796:30;-1:-1:-1;;;36857:2:1;36842:18;;36835:49;36916:2;36901:18;;36756:169::o;36930:332::-;37132:2;37114:21;;;37171:1;37151:18;;;37144:29;-1:-1:-1;;;37204:2:1;37189:18;;37182:39;37253:2;37238:18;;37104:158::o;37267:338::-;37469:2;37451:21;;;37508:2;37488:18;;;37481:30;-1:-1:-1;;;37542:2:1;37527:18;;37520:44;37596:2;37581:18;;37441:164::o;37610:338::-;37812:2;37794:21;;;37851:2;37831:18;;;37824:30;-1:-1:-1;;;37885:2:1;37870:18;;37863:44;37939:2;37924:18;;37784:164::o;37953:343::-;38155:2;38137:21;;;38194:2;38174:18;;;38167:30;-1:-1:-1;;;38228:2:1;38213:18;;38206:49;38287:2;38272:18;;38127:169::o;38301:348::-;38503:2;38485:21;;;38542:2;38522:18;;;38515:30;38581:26;38576:2;38561:18;;38554:54;38640:2;38625:18;;38475:174::o;38654:340::-;38856:2;38838:21;;;38895:2;38875:18;;;38868:30;-1:-1:-1;;;38929:2:1;38914:18;;38907:46;38985:2;38970:18;;38828:166::o;38999:345::-;39201:2;39183:21;;;39240:2;39220:18;;;39213:30;-1:-1:-1;;;39274:2:1;39259:18;;39252:51;39335:2;39320:18;;39173:171::o;39349:345::-;39551:2;39533:21;;;39590:2;39570:18;;;39563:30;-1:-1:-1;;;39624:2:1;39609:18;;39602:51;39685:2;39670:18;;39523:171::o;39699:334::-;39901:2;39883:21;;;39940:2;39920:18;;;39913:30;-1:-1:-1;;;39974:2:1;39959:18;;39952:40;40024:2;40009:18;;39873:160::o;40038:341::-;40240:2;40222:21;;;40279:2;40259:18;;;40252:30;-1:-1:-1;;;40313:2:1;40298:18;;40291:47;40370:2;40355:18;;40212:167::o;40384:342::-;40586:2;40568:21;;;40625:2;40605:18;;;40598:30;-1:-1:-1;;;40659:2:1;40644:18;;40637:48;40717:2;40702:18;;40558:168::o;40731:653::-;40964:13;;-1:-1:-1;;;;;40960:39:1;40942:58;;41056:4;41044:17;;;41038:24;41016:20;;;41009:54;41119:4;41107:17;;;41101:24;41079:20;;;41072:54;41182:4;41170:17;;;41164:24;41142:20;;;41135:54;41245:4;41233:17;;;41227:24;41205:20;;;41198:54;40987:3;41296:17;;;41290:24;41268:20;;;41261:54;41371:4;41359:17;;;41353:24;41331:20;;;41324:54;;;;40929:3;40914:19;;40896:488::o;41389:1876::-;41675:3;41660:19;;41688:52;41664:9;41722:6;41688:52;:::i;:::-;41759:3;41771:52;41819:2;41808:9;41804:18;41795:6;41789:13;41771:52;:::i;:::-;41860:4;41852:6;41848:17;41842:24;41885:3;41924:2;41919;41908:9;41904:18;41897:30;41964:4;41956:6;41952:17;41946:24;41936:34;;41989:3;42028:2;42023;42012:9;42008:18;42001:30;42068:4;42060:6;42056:17;42050:24;42040:34;;42093:3;42132:2;42127;42116:9;42112:18;42105:30;42172:4;42164:6;42160:17;42154:24;42144:34;;42197:3;42236:2;42231;42220:9;42216:18;42209:30;42277:4;42269:6;42265:17;42259:24;42248:35;;42303:3;42343;42337;42326:9;42322:19;42315:32;42385:4;42377:6;42373:17;42367:24;42356:35;;42411:3;42451;42445;42434:9;42430:19;42423:32;42502:4;42494:6;42490:17;42484:24;42464:44;;42517:63;42575:3;42564:9;42560:19;42546:12;42517:63;:::i;:::-;42617:15;;;42611:22;;42642:65;42702:3;42687:19;;42611:22;42642:65;:::i;:::-;42756:2;42748:6;42744:15;42738:22;42716:44;;42769:65;42829:3;42818:9;42814:19;42798:14;42769:65;:::i;:::-;42883:2;42875:6;42871:15;42865:22;42843:44;;42896:65;42956:3;42945:9;42941:19;42925:14;42896:65;:::i;:::-;43010:2;43002:6;42998:15;42992:22;42970:44;;43023:54;43072:3;43061:9;43057:19;43041:14;43023:54;:::i;:::-;43120:15;;;43114:22;43108:3;43093:19;;43086:51;43180:16;;43174:23;43168:3;43153:19;;43146:52;43241:16;;;43235:23;43229:3;43214:19;;;43207:52;;;;-1:-1:-1;41642:1623:1;;;-1:-1:-1;;;;;41642:1623:1:o;43270:780::-;43494:13;;43476:32;;43597:4;43585:17;;43579:24;43463:3;43448:19;;;43537:67;;;:::i;:::-;43613:53;43660:4;43649:9;43645:20;43631:12;43613:53;:::i;:::-;-1:-1:-1;43722:4:1;43710:17;;43704:24;43697:4;43682:20;;43675:54;43785:4;43773:17;;43767:24;43760:4;43745:20;;43738:54;43848:4;43836:17;;43830:24;43823:4;43808:20;;43801:54;43911:4;43899:17;;43893:24;43886:4;43871:20;;43864:54;43974:4;43962:17;;43956:24;43949:4;43934:20;;43927:54;44037:4;44025:17;;;44019:24;44012:4;43997:20;;;43990:54;43430:620;:::o;44055:663::-;44328:13;;-1:-1:-1;;;;;44324:22:1;;;44306:41;;44403:4;44391:17;;;44385:24;44363:20;;;44356:54;44470:4;44458:17;;;44452:24;44448:33;;44426:20;;;44419:63;44552:4;44540:17;;;44534:24;44527:32;44520:40;44498:20;;;44491:70;44631:4;44619:17;;;44613:24;44606:32;44599:40;44577:20;;;44570:70;44286:3;44688:17;;;44682:24;44678:33;44656:20;;;44649:63;;;;44255:3;44240:19;;44222:496::o;44723:177::-;44869:25;;;44857:2;44842:18;;44824:76::o;44905:784::-;;45253:6;45242:9;45235:25;45296:3;45291:2;45280:9;45276:18;45269:31;45323:47;45365:3;45354:9;45350:19;45342:6;45323:47;:::i;:::-;45401:9;45393:6;45389:22;45447:2;45442;45431:9;45427:18;45420:30;45474:1;45466:6;45459:17;-1:-1:-1;;;45504:2:1;45496:6;45492:15;45485:30;45559:2;45555;45551:11;45546:2;45535:9;45531:18;45524:39;;45580:43;45619:2;45611:6;45607:15;45599:6;45580:43;:::i;:::-;45572:51;;;45674:6;45667:14;45660:22;45654:3;45643:9;45639:19;45632:51;45225:464;;;;;;;:::o;45694:248::-;45868:25;;;45924:2;45909:18;;45902:34;45856:2;45841:18;;45823:119::o;45947:242::-;46017:2;46011:9;46047:17;;;-1:-1:-1;;;;;46079:34:1;;46115:22;;;46076:62;46073:2;;;46141:9;46073:2;46168;46161:22;45991:198;;-1:-1:-1;45991:198:1:o;46194:183::-;;-1:-1:-1;;;;;46285:6:1;46282:30;46279:2;;;46315:9;46279:2;-1:-1:-1;46366:4:1;46347:17;;;46343:28;;46269:108::o;46382:181::-;;-1:-1:-1;;;;;46457:6:1;46454:30;46451:2;;;46487:9;46451:2;-1:-1:-1;46546:2:1;46523:17;-1:-1:-1;;46519:31:1;46552:4;46515:42;;46441:122::o;46568:258::-;46640:1;46650:113;46664:6;46661:1;46658:13;46650:113;;;46740:11;;;46734:18;46721:11;;;46714:39;46686:2;46679:10;46650:113;;;46781:6;46778:1;46775:13;46772:2;;;-1:-1:-1;;46816:1:1;46798:16;;46791:27;46621:205::o;46831:122::-;46942:4;46926:21;;46907:46::o;46958:133::-;-1:-1:-1;;;;;47035:31:1;;47025:42;;47015:2;;47081:1;47078;47071:12;47096:120;47184:5;47177:13;47170:21;47163:5;47160:32;47150:2;;47206:1;47203;47196:12

Swarm Source

ipfs://c7bac8e6386b7d47a3737d2e3f3670cf7feb8f9a74fb787a15319dad6c02fb35

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.