Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 12245710 | 1197 days ago | IN | 0 ETH | 0.4072466 |
Loading...
Loading
Contract Name:
FarmMain
Compiler Version
v0.7.6+commit.7338295f
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
- No Contract Security Audit Submitted- Submit Audit Here
[{"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"}]
Contract Creation Code
60806040523480156200001157600080fd5b50620000246301ffc9a760e01b6200003c565b62000036630271189760e51b6200003c565b620000ce565b6001600160e01b03198082161415620000725760405162461bcd60e51b8152600401620000699062000097565b60405180910390fd5b6001600160e01b0319166000908152602081905260409020805460ff19166001179055565b6020808252601c908201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604082015260600190565b615f1c80620000de6000396000f3fe6080604052600436106101a05760003560e01c80636b41674c116100ec578063c5cc6b6a1161008a578063e6ec9ea711610064578063e6ec9ea714610482578063f23a6e61146104a2578063f7a95a9e146104c2578063fb46caba146104ef576101a7565b8063c5cc6b6a1461043a578063c8df9d311461044f578063d8ff139a14610462576101a7565b8063a9e86c1f116100c6578063a9e86c1f146103aa578063ab2c3f15146103d8578063bc197c81146103f8578063bfaa8cca14610425576101a7565b80636b41674c146103575780638d2c2fb41461036a578063a9015c5c1461038a576101a7565b806340f1f4af116101595780634f39d1f5116101335780634f39d1f5146102c8578063523a3f08146102f557806354c1fc32146103155780635c4b406414610337576101a7565b806340f1f4af146102705780634313b9e51461028557806349fd034a146102b3576101a7565b806301ffc9a7146101ac57806305c85b40146101e2578063207c6efa14610204578063397d321c146102315780633ae1dd9d14610246578063403be1ff1461025b576101a7565b366101a757005b600080fd5b3480156101b857600080fd5b506101cc6101c736600461501b565b61050f565b6040516101d991906154eb565b60405180910390f35b3480156101ee57600080fd5b506101f7610532565b6040516101d991906153f2565b34801561021057600080fd5b5061022461021f3660046151d7565b610541565b6040516101d99190615dbc565b61024461023f3660046152c3565b610553565b005b34801561025257600080fd5b506101f761072a565b34801561026757600080fd5b506101f7610739565b34801561027c57600080fd5b50610224610748565b34801561029157600080fd5b506102a56102a03660046151d7565b61074e565b6040516101d9929190615bfd565b3480156102bf57600080fd5b5061022461096e565b3480156102d457600080fd5b506102e86102e3366004614b6d565b610974565b6040516101d9919061550b565b34801561030157600080fd5b506102446103103660046151d7565b610c3f565b34801561032157600080fd5b5061032a6110d1565b6040516101d9919061549c565b34801561034357600080fd5b5061022461035236600461529f565b6111ca565b61024461036536600461529f565b61136d565b34801561037657600080fd5b50610244610385366004614bef565b611596565b34801561039657600080fd5b506102446103a53660046152ef565b6118a5565b3480156103b657600080fd5b506103ca6103c53660046152ef565b611c23565b6040516101d9929190615e22565b3480156103e457600080fd5b506102246103f33660046151d7565b611e4d565b34801561040457600080fd5b506104186104133660046149fd565b611e5f565b6040516101d991906154f6565b34801561043157600080fd5b50610224611e9e565b34801561044657600080fd5b506101f7611eaa565b61022461045d3660046150ac565b611eb9565b34801561046e57600080fd5b5061024461047d3660046151d7565b6121f6565b34801561048e57600080fd5b5061022461049d3660046151d7565b612272565b3480156104ae57600080fd5b506104186104bd366004614aa6565b612284565b3480156104ce57600080fd5b506104e26104dd3660046151d7565b6122c3565b6040516101d99190615bab565b3480156104fb57600080fd5b5061024461050a366004614c5c565b612337565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b6003546001600160a01b031681565b600f6020526000908152604090205481565b805160008181526007602052604090206001015460ff1661058f5760405162461bcd60e51b815260040161058690615aa8565b60405180910390fd5b60008181526007602052604090206002015443108015906105c0575060008181526007602052604090206003015443105b6105dc5760405162461bcd60e51b81526004016105869061565b565b60008381526009602052604090205483906001600160a01b031633148015610614575060008181526009602052604090206002015415155b6106305760405162461bcd60e51b8152600401610586906156fe565b6000848152600960209081526040808320600181015484526007835281842080548552600590935292205460ff1661067a5760405162461bcd60e51b815260040161058690615b01565b600061068a8360010154876123e1565b509050816007015482600601548360040154430302670de0b6b3a764000002816106b057fe5b60018501546000908152600a6020526040812080549390920490920190556106d99088906111ca565b600584015560018301546000908152600a6020908152604080832054998352600b82529091209790975590950151600390910180548201905543600486015560079094018054909401909355505050565b6002546001600160a01b031681565b6004546001600160a01b031681565b60065481565b610756614654565b61075e61469b565b6007600084815260200190815260200160002060056000600760008781526020019081526020016000206000015481526020019081526020016000208160405180610100016040529081600082015481526020016001820160009054906101000a900460ff161515151581526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481525050915080604051806101e00160405290816000820160009054906101000a900460ff161515151581526020016001820154815260200160028201548152602001600382015481526020016004820154815260200160058201548152602001600682015481526020016007820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016008820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016009820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001600a820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001600a820160149054906101000a900460ff16151515158152602001600b8201548152602001600c8201548152602001600d82015481525050905091509150915091565b60085481565b6001546060906001600160a01b0316156109a05760405162461bcd60e51b815260040161058690615a44565b600280546001600160a01b0319166001600160a01b0388169081179091556109da5760405162461bcd60e51b8152600401610586906159d1565b600180546001600160a01b03199081163317909155600380546001600160a01b0386169216821790556040517fd9078653fc0ab56789d31bc2c38fcaecf28034549baf737c02b719513837563b90600090a2845160208601207fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47014610a7257600254610a6f906001600160a01b0316866126bd565b90505b836001600160a01b03166382cefdde60018060009054906101000a90046001600160a01b03166001600160a01b0316636733b93c6040518163ffffffff1660e01b815260040160006040518083038186803b158015610ad057600080fd5b505afa158015610ae4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b0c919081019061505f565b30604051602401610b1f93929190615721565b60408051601f198184030181529181526020820180516001600160e01b0316636d0d57f560e11b1790525160e083901b6001600160e01b0319168152610b68919060040161551e565b600060405180830381600087803b158015610b8257600080fd5b505af1158015610b96573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610bbe9190810190614b0c565b50600480546001600160a01b0319166001600160a01b0392909216919091179055815115610c3657600082806020019051810190610bfc9190614e3f565b905060005b8151811015610c3357610c2b828281518110610c1957fe5b602002602001015160016000806126ff565b600101610c01565b50505b95945050505050565b60008181526009602052604090205481906001600160a01b031633148015610c77575060008181526009602052604090206002015415155b610c935760405162461bcd60e51b8152600401610586906156fe565b600082815260096020908152604080832060058082015460018301548652600785528386205486529352922054439060ff16610d60576000836005015411610ced5760405162461bcd60e51b8152600401610586906158ac565b610cfb600080600188611c23565b506005840154909250821115610d235760405162461bcd60e51b81526004016105869061584f565b6001830154600090815260076020526040902060030154811015610d4d5781836005015403610d50565b60005b6005840155436002840155610e3d565b60018301546000908152600760205260409020600301548111610d835780610d9b565b60018301546000908152600760205260409020600301545b6001840154600090815260076020819052604090912090810154600682015460049092015492935091830302670de0b6b3a76400000281610dd857fe5b60018501546000908152600a602052604081208054939092049092019055610e019086906111ca565b6001840180546000908152600a60209081526040808320548a8452600b8352818420556005880183905592548252600790522060040182905591505b8115610f11576003546001600160a01b031615610e75576003548354610e70916001600160a01b03908116911684612f4d565b610ef7565b82546040516000916001600160a01b0316908490610e92906153ef565b60006040518083038185875af1925050503d8060008114610ecf576040519150601f19603f3d011682016040523d82523d6000602084013e610ed4565b606091505b5050905080610ef55760405162461bcd60e51b815260040161058690615ad2565b505b600183015460009081526010602052604090208054830190555b6001830154600090815260076020526040902060030154431061108d576001808401546000908152600760205260409020015460ff1615610f5957610f598360010154612fe2565b60018301546000908152600760209081526040808320548352600590915290205460ff16611088576001830180546000908152600e60205260408082208054600019019055915481522054158015610fc757506001808401546000908152600760205260409020015460ff16155b15611044576001830154600090815260106020908152604080832054600f90925290912054610ff7919003613380565b60018084015460009081526007602081905260408220828155928301805460ff19169055600283018290556003830182905560048301829055600583018290556006830182905591909101555b600085815260096020526040812080546001600160a01b03191681556001810182905560028101829055600381018290556004810182905560058101829055600601555b6110ca565b60018301546000908152600760209081526040808320548352600590915290205460ff166110ca576000858152600c602052604090208054830190555b5050505050565b606060006008546001600160401b03811180156110ed57600080fd5b5060405190808252806020026020018201604052801561112757816020015b611114614654565b81526020019060019003908161110c5790505b50905060005b6008548110156111c45760008181526007602081815260409283902083516101008101855281548152600182015460ff161515928101929092526002810154938201939093526003830154606082015260048301546080820152600583015460a0820152600683015460c082015291015460e082015282518390839081106111b157fe5b602090810291909101015260010161112d565b50905090565b6000828152600960209081526040808320815160e08101835281546001600160a01b03168152600182015481850190815260028301548285015260038301546060830181905260048401546080840152600584015460a084015260069093015460c0830152878652600b85528386205490518652600a909452918420549192670de0b6b3a764000092030204915082156113625760208082015160009081526007909152604081206003015443106112995760208083015160009081526007909152604090206003015461129b565b435b6020808401805160009081526007909252604080832060020154915183528220600401549293509091106112e6576020808401516000908152600790915260409020600401546112ff565b6020808401516000908152600790915260409020600201545b6020848101805160009081526007928390526040808220909301549151815291822060060154929350909183850302670de0b6b3a7640000028161133f57fe5b049050670de0b6b3a7640000846060015182028161135957fe5b04850194505050505b60a001510192915050565b60008281526009602052604090205482906001600160a01b0316331480156113a5575060008181526009602052604090206002015415155b6113c15760405162461bcd60e51b8152600401610586906156fe565b6000838152600960209081526040808320600181015484526007835281842054845260059092529091205460ff161580156114115750600181015460009081526007602052604090206003015443105b61142d5760405162461bcd60e51b8152600401610586906159f4565b6000848152600c602090815260408083205460018501548452600783528184205484526005909252909120600b0154156114a7576001820154600090815260076020908152604080832054835260059091529020600b0154670de0b6b3a7640000908190810204836005015402816114a157fe5b046114aa565b60005b0180156114d2576003546114c9906001600160a01b031633308461347e565b6114d281613380565b60048201546001830180546000908152600760208190526040808320909101805494909403909355905481522060050154600383015461151291906134de565b61152885836001015486856003015460016135ac565b506003818101546001928301546000908152600e60209081526040808320805494909403600019019093559681526009909652852080546001600160a01b03191681559182018590556002820185905581018490556004810184905560058101849055600601929092555050565b60008181526009602052604090205481906001600160a01b0316331480156115ce575060008181526009602052604090206002015415155b6115ea5760405162461bcd60e51b8152600401610586906156fe565b600082815260096020908152604091829020825160e08101845281546001600160a01b0390811682526001830154938201939093526002820154938101939093526003810154606084015260048101546080840152600581015460a08401526006015460c08301528416158015906116655750604081015115155b6116815760405162461bcd60e51b815260040161058690615543565b6020808201516000908152600782526040808220548252600590925290812054859060ff166116b057436116b3565b60005b6020808501516040516116c89493920161547b565b60408051601f19818403018152918152815160209283012060008181526009909352912060020154909150156117105760405162461bcd60e51b8152600401610586906155e5565b816040516020016117219190615bab565b60405160208183030381529060405280602001905181019061174391906150c7565b6009600083815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c08201518160060155905050846009600083815260200190815260200160002060000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060096000858152602001908152602001600020600080820160006101000a8154906001600160a01b0302191690556001820160009055600282016000905560038201600090556004820160009055600582016000905560068201600090555050846001600160a01b0316336001600160a01b0316827f0a429aba3d89849a2db0153e4534d95c46a1d83c8109d73893f55ebc44010ff460405160405180910390a45050505050565b600084815260096020908152604091829020825160e08101845281546001600160a01b0316815260018201549281018390526002820154938101939093526003810154606084015260048101546080840152600581015460a08401526006015460c083015284158015906119a2575060048054604051630c0f6b7160e01b81526000926001600160a01b0390921691630c0f6b7191611946918a9101615dbc565b60206040518083038186803b15801561195e57600080fd5b505afa158015611972573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119969190615043565b6001600160a01b031614155b156119b857506000848152600d60205260409020545b85158015906119c5575084155b806119f4575084158015906119d8575085155b80156119f4575060008181526007602052604090206005015485145b611a105760405162461bcd60e51b815260040161058690615543565b60208083015160009081526007825260408082205482526005909252205460ff168015611a405750604082015115155b8015611a50575081606001518311155b8015611a65575081516001600160a01b031633145b80611b0b575060048054604051627eeac760e11b815285926001600160a01b039092169162fdd58e91611a9c9133918b910161543e565b60206040518083038186803b158015611ab457600080fd5b505afa158015611ac8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aec91906151ef565b10158015611b0b57506000818152600760205260409020600301544310155b611b275760405162461bcd60e51b8152600401610586906156d4565b85611b3b57611b3685846134de565b611b62565b611b4486610c3f565b60208083015160009081526007918290526040902001805484900390555b611b708682868660006135ac565b85611c1b576000818152600e60205260409020805484900390819055158015611bab575060008181526007602052604090206001015460ff16155b15611c1b57600081815260106020908152604080832054600f90925290912054611bd6919003613380565b6000818152600760208190526040822082815560018101805460ff19169055600281018390556003810183905560048101839055600581018390556006810183905501555b505050505050565b6000808315611cdd576000838152600960209081526040808320815160e08101835281546001600160a01b031681526001820154818501819052600283015482850152600380840154606084015260048401546080840152600584015460a084015260069093015460c0830152855260079093529083200154909190431015611cac5743611cc5565b6020808301516000908152600790915260409020600301545b90508160c00151826040015182030293505050611e44565b60008681526007602081815260408084208151610100810183528154808252600183015460ff16151582860152600283015482850152600383015460608301526004830154608083015260058084015460a0840152600684015460c0840152929095015460e082018190529486529281905293209092015403861115611d755760405162461bcd60e51b815260040161058690615b54565b60008160600151431015611d8f5743826060015103611d92565b60005b905060008111611db45760405162461bcd60e51b8152600401610586906156a8565b6000818360c001510211611dda5760405162461bcd60e51b815260040161058690615b30565b60008881526007602090815260408083205483526005918290529091200154670de0b6b3a76400009088820281611e0d57fe5b048360c001510281611e1b57fe5b04925060008311611e3e5760405162461bcd60e51b81526004016105869061591f565b82029250505b94509492505050565b60106020526000908152604090205481565b6004546000906001600160a01b03163314611e8c5760405162461bcd60e51b815260040161058690615804565b5063bc197c8160e01b95945050505050565b670de0b6b3a764000081565b6001546001600160a01b031681565b805160008181526007602052604081206001015490919060ff16611eef5760405162461bcd60e51b815260040161058690615aa8565b6000818152600760205260409020600201544310801590611f20575060008181526007602052604090206003015443105b611f3c5760405162461bcd60e51b81526004016105869061565b565b8251600090815260076020526040812060608501519091906001600160a01b0316611f675733611f6d565b84606001515b8254600090815260056020526040902054909150819060ff16611f905743611f93565b60005b8651604051611fa79392919060200161547b565b60408051601f1981840301815291815281516020928301206000818152600990935291206002015490945015611fef5760405162461bcd60e51b815260040161058690615886565b6000806120008760000151886123e1565b855460009081526005602052604081205492945090925090819060ff166120885788516120309084600080611c23565b909250905081158015906120445750600081115b6120605760405162461bcd60e51b8152600401610586906155ae565b6007860180548401905543600487015560208401518951612082918791613a4f565b5061209d565b61209d896000015185602001518a6000613d4a565b6040518060e00160405280866001600160a01b031681526020018a6000015181526020014381526020018560200151815260200184815260200183815260200182815250600960008a815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c08201518160060155905050600560008760000154815260200190815260200160002060000160009054906101000a900460ff16612196578360200151612199565b60005b89516000908152600e6020526040808220805490930160010190925590516001600160a01b03871691908a907f0a429aba3d89849a2db0153e4534d95c46a1d83c8109d73893f55ebc44010ff4908390a450505050505050919050565b6000818152600560205260409020600601541580159061223857506000818152600560209081526040808320600d01548352600790915290206001015460ff16155b6122545760405162461bcd60e51b815260040161058690615944565b6000818152600560205260409020600d015461226f90612fe2565b50565b600c6020526000908152604090205481565b6004546000906001600160a01b031633146122b15760405162461bcd60e51b815260040161058690615804565b5063f23a6e6160e01b95945050505050565b6122cb614739565b50600090815260096020908152604091829020825160e08101845281546001600160a01b031681526001820154928101929092526002810154928201929092526003820154606082015260048201546080820152600582015460a082015260069091015460c082015290565b6002546001600160a01b031633146123615760405162461bcd60e51b815260040161058690615635565b60005b81518110156123dd576123d582828151811061237c57fe5b60200260200101516060015183838151811061239457fe5b6020026020010151600001518484815181106123ac57fe5b6020026020010151602001518585815181106123c457fe5b6020026020010151604001516126ff565b600101612364565b5050565b6123e961477f565b600083815260076020818152604080842081516101008101835281548152600182015460ff161515938101939093526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c08301529091015460e08201528190819081906124659087613eb1565b6040805160c08101825260008c8152600760209081528382205482526005815290839020600801546001600160a01b03168252918b01519497509295509093509091908201906124b557826124b7565b835b8152600089815260076020908152604080832054808452600580845282852060098101546001600160a01b0316858801528d8401511515938701939093529352919052600a0154600160a01b900460ff161515606080830191909152306080909201919091528101519095509093508390806125595750600087815260076020908152604080832054835260059091529020600a0154600160a01b900460ff16155b1561257c57341561257c5760405162461bcd60e51b8152600401610586906157da565b84606001511561258e575050506126b6565b8460800151156126285760405163d2283c0960e01b81526001600160a01b0384169063d2283c099034906125c6908990600401615d6b565b6000604051808303818588803b1580156125df57600080fd5b505af11580156125f3573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f1916820160405261261c9190810190615236565b505060208601526126b2565b60405163d2283c0960e01b81526001600160a01b0384169063d2283c0990612654908890600401615d6b565b600060405180830381600087803b15801561266e57600080fd5b505af1158015612682573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526126aa9190810190615236565b505060208601525b5050505b9250929050565b60606000808351602085016000875af13d604051925080835260208301816000823e8082016040528280156126f1576126f5565b8282fd5b5050505092915050565b83838061270a575082155b1561272d5760c0810180516001019081905261272d5760c0810180516000190190525b8315612cb85760e08101516001600160a01b03161580159061275c57506101008101516001600160a01b031615155b801561276c575060008160600151115b80156127845750805180612784575060008160a00151115b6127a05760405162461bcd60e51b81526004016105869061596d565b60e0810151610100820151604051634467d1db60e01b81526000926001600160a01b031691634467d1db916127d891906004016153f2565b60006040518083038186803b1580156127f057600080fd5b505afa158015612804573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261282c9190810190615236565b60006101408601526101608501519093501591506128cd9050578160e001516001600160a01b03166373d4a13a6040518163ffffffff1660e01b815260040160606040518083038186803b15801561288357600080fd5b505afa158015612897573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128bb9190614c1a565b50506001600160a01b03166101408301525b60008060005b83518110156129e5578461012001516001600160a01b03168482815181106128f757fe5b60200260200101516001600160a01b0316141561294e57600192508461014001516001600160a01b031684828151811061292d57fe5b60200260200101516001600160a01b0316141561294957600191505b6129dd565b83818151811061295a57fe5b60200260200101516001600160a01b03168561012001516001600160a01b03167fceb0f4ddf364ffb007b08eed9029e1e7e711b894ed4ae9309f30527d3611668960405160405180910390a38461014001516001600160a01b03168482815181106129c157fe5b60200260200101516001600160a01b031614156129dd57600191505b6001016128d3565b5081612a035760405162461bcd60e51b8152600401610586906158f8565b8361016001511580612a125750805b612a2e5760405162461bcd60e51b81526004016105869061560f565b6000846101a00181815250508360056000600654815260200190815260200160002060008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e08201518160070160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506101008201518160080160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506101208201518160090160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555061014082015181600a0160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555061016082015181600a0160146101000a81548160ff02191690831515021790555061018082015181600b01556101a082015181600c01556101c082015181600d01559050506040518061010001604052806006548152602001600015158152602001600081526020016000815260200160008152602001600081526020018560600151815260200160008152506007600060085481526020019081526020016000206000820151816000015560208201518160010160006101000a81548160ff02191690831515021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e08201518160070155905050600854600560006006548152602001908152602001600020600d01819055506001600660008282540192505081905550600160086000828254019250508190555050505050612f47565b5060008181526007602081815260408084208054855260058084529482902082516101e081018452815460ff9081161515825260018301549582019590955260028201549381019390935260038101546060840152600481015460808401529485015460a0830152600685015460c0830152928401546001600160a01b0390811660e08301526008850154811661010083015260098501548116610120830152600a850154908116610140830152600160a01b90049091161515610160820152600b830154610180820152600c8301546101a0820152600d909201546101c08301528315612dd457600181015460ff16612dc45760405162461bcd60e51b815260040161058690615682565b612dcd83612fe2565b5050612f47565b60c086018051600019019052600181015460ff168015612e0f57506000838152600760209081526040808320548352600590915290205460ff165b15612efc575060008281526007602052604090206003810154431015612ed75760008260600151876060015110612e50578260600151876060015103612e5c565b86606001518360600151035b60038301549091504390038082028015612ed357846060015189606001511115612eba57612e89816142b2565b612ea55760405162461bcd60e51b81526004016105869061556d565b6000868152600f602052604090208054820190555b612ec8866000806000613d4a565b606089015160068501555b5050505b6060860151600084815260076020908152604080832054835260059091529020600301555b6000838152600760209081526040808320548352600590915290206006015415611c1b5760c08601516000848152600760209081526040808320548352600590915290206006015550505b50505050565b6000612fa58463a9059cbb60e01b8585604051602401612f6e92919061543e565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526126bd565b9050805160001480612fc6575080806020019051810190612fc69190614fff565b612f475760405162461bcd60e51b8152600401610586906158cf565b60008181526007602090815260408083208054845260059092529091206002015443116130215760405162461bcd60e51b815260040161058690615a71565b600181015460ff168015613039575080600301544310155b801561305657508054600090815260056020526040902060060154155b1561306b57600101805460ff1916905561226f565b806002015443101580156130825750806003015443105b80156130925750600181015460ff165b156131145760018101805460ff1916905580546000908152600560205260408082206006908101839055830154600384018054439182905585548552929093205492909103029060ff16156130ef576130ef836000806000613d4a565b6000838152600f602052604090208054829003905561310d81613380565b505061226f565b6001808201548254600090815260056020526040902090910154600683015460ff9092169161314391026142b2565b60018301805460ff1916911515919091179081905560ff1680156131645750805b156132da57815460009081526005602090815260408083206001015460068601546008548552600f845293829020930290925590516131a591849101615d04565b6040516020818303038152906040528060200190518101906131c79190615148565b60088054600090815260076020818152604080842086518155868301516001808301805492151560ff199384161790558884015160028085019190915560608a015160038086019190915560808b0151600486015560a08b015160058087019190915560c08c015160068088019190915560e0909c0151958901959095558d8952858920830180549094169093558b54885283865284882090990180546000190190558a548752838720600c0180548201905587548b548852848820600d018190558752858552838720439901899055875487528387208054885283865284882082015495879052949098019301929092558454845280842090910183905583548352822001558054909101905561337b565b600182015460ff1680156132ec575080155b1561335b57600083815260076020818152604080842080548552600580845282862060019081015460068a8101548c8a52600f8852868a20920290915543600285018190558454895292909552928620928301540160038201559092019290925501805460001901905561337b565b600083815260076020908152604080832054835260059091528120600601555b505050565b8061338a5761226f565b6003546001600160a01b0316613403576002546040516302b492b560e11b81526001600160a01b0390911690630569256a9083906133cc908290600401615dbc565b6000604051808303818588803b1580156133e557600080fd5b505af11580156133f9573d6000803e3d6000fd5b505050505061226f565b600354600254613420916001600160a01b03908116911683614479565b6002546040516302b492b560e11b81526001600160a01b0390911690630569256a90613450908490600401615dbc565b600060405180830381600087803b15801561346a57600080fd5b505af11580156110ca573d6000803e3d6000fd5b60006134a1856323b872dd60e01b868686604051602401612f6e93929190615457565b90508051600014806134c25750808060200190518101906134c29190614fff565b6110ca5760405162461bcd60e51b8152600401610586906157ad565b60048054604051637921219560e11b81526001600160a01b0390911691829163f242432a9161351591339130918991899101615406565b600060405180830381600087803b15801561352f57600080fd5b505af1158015613543573d6000803e3d6000fd5b505060405163b390c0ab60e01b81526001600160a01b038416925063b390c0ab91506135759086908690600401615e22565b600060405180830381600087803b15801561358f57600080fd5b505af11580156135a3573d6000803e3d6000fd5b50505050505050565b6000848152600760208181526040808420548452600580835281852082516101e081018452815460ff9081161515825260018084015483880152600284015483870152600384015460608085019190915260048501546080808601919091529585015460a080860191909152600686015460c080870191909152998601546001600160a01b0390811660e087015260088701548116610100870190815260098089015483166101208901908152600a8a01548085166101408b0152600160a01b900490971615156101608901908152600b8a01546101808a0152600c8a01546101a08a0152600d909901546101c08901528a519c8d018b52905182168c528b8b018f90529451168a89015290890191909152925115159387019390935233918601919091528a86529252832081519193909180156136ed5750600282015415155b80156136f857508815155b15613707578582600301540390505b60015460408051631f9de8b560e21b8152815160009384936001600160a01b0390911692637e77a2d49260048083019392829003018186803b15801561374c57600080fd5b505afa158015613760573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137849190615207565b909250905081156137cc576000670de0b6b3a76400008084810204876020015102816137ac57fe5b0490506137bf8761010001518383612f4d565b6020860180519190910390525b8815613877576137e985600001518760e001518760200151614479565b8560e001516001600160a01b031663592182d6866040518263ffffffff1660e01b81526004016138199190615d6b565b600060405180830381600087803b15801561383357600080fd5b505af1158015613847573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261386f9190810190615236565b50505061388e565b61388e85600001518660a001518760200151612f4d565b85511580156138ae575060008a81526007602052604090206001015460ff165b80156138b8575086155b156138cb576138c68a612fe2565b613a42565b855180156138d857508a15155b15613a42576001808501546000908152600760205260409020015460ff168015613918575060018401546000908152600760205260409020600301544310155b1561392a5761392a8460010154612fe2565b82613a3a576001840180546000908152600e6020526040808220805460001901905591548152205415801561397557506001808501546000908152600760205260409020015460ff16155b156139f2576001840154600090815260106020908152604080832054600f909252909120546139a5919003613380565b60018085015460009081526007602081905260408220828155928301805460ff19169055600283018290556003830182905560048301829055600583018290556006830182905591909101555b60008b815260096020526040812080546001600160a01b0319168155600181018290556002810182905560038101829055600481018290556005810182905560060155613a42565b600384018390555b5050505050505050505050565b600081815260076020526040812060050154613c5557600454600083815260076020908152604080832054835260059091529020600801546001600160a01b039182169163534d4027918691613aa591166144d7565b604051602001613ab591906153bc565b60408051601f1981840301815282825260015463fabc053b60e01b8452915190926001600160a01b039092169163fabc053b916004808301926000929190829003018186803b158015613b0757600080fd5b505afa158015613b1b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613b43919081019061505f565b60016040518563ffffffff1660e01b8152600401613b649493929190615dc5565b6040805180830381600087803b158015613b7d57600080fd5b505af1158015613b91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bb59190615207565b506000838152600760208181526040808420805485526005835281852060080154948890529290915260039091015490519293506001600160a01b039091169183917ffacc589216d4ed0bbc51eb76ba233e13e3e9faeb7ac1089cbb380797ae908fe691613c24918791615e22565b60405180910390a36000818152600d6020908152604080832085905584835260079091529020600501819055613ccb565b6004805460008481526007602052604090819020600501549051630d9778e560e11b81526001600160a01b0390921692631b2ef1ca92613c989291889101615e22565b600060405180830381600087803b158015613cb257600080fd5b505af1158015613cc6573d6000803e3d6000fd5b505050505b6004805460008481526007602052604090819020600501549051637921219560e11b81526001600160a01b039092169263f242432a92613d119230928a928a9101615406565b600060405180830381600087803b158015613d2b57600080fd5b505af1158015613d3f573d6000803e3d6000fd5b505050509392505050565b6000848152600760205260408120600301544310613d7957600085815260076020526040902060030154613d7b565b435b6000868152600760208190526040909120015490915015613e2d576000858152600760205260408120600281015460049091015410613dcb57600086815260076020526040902060040154613dde565b6000868152600760205260409020600201545b6000878152600760208190526040909120908101546006909101549192509082840302670de0b6b3a76400000281613e1257fe5b6000888152600a602052604090208054929091049091019055505b60008581526007602052604090206004018190558215613e66576000858152600a6020908152604080832054868452600b909252909120555b83156110ca5781613e90576000858152600760208190526040909120018054850190819055611c1b565b50505060009182526007602081905260409092209091018054919091039055565b600080600080846020015111613ed95760405162461bcd60e51b81526004016105869061582c565b84516000908152600560205260409081902060070154908501516001600160a01b039091169350613f0b576000613f11565b83602001515b91508360400151613f26578360200151613f29565b60005b9050606080856040015115614004578651600090815260056020526040902060080154613f61906001600160a01b031633308761347e565b86516000908152600560205260409081902060080154905163684943b160e01b81526001600160a01b038781169263684943b192613fa79290911690889060040161543e565b60006040518083038186803b158015613fbf57600080fd5b505afa158015613fd3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613ffb9190810190614fa9565b925090506140b4565b86516000908152600560205260408082206008015489518352918190206009015490516379d16e0d60e01b81526001600160a01b03808916936379d16e0d93614057939183169216908890600401615457565b60006040518083038186803b15801561406f57600080fd5b505afa158015614083573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526140ab9190810190615236565b91955090925090505b60005b82518110156142a857875160009081526005602052604090206009015483516001600160a01b03909116908490839081106140ee57fe5b60200260200101516001600160a01b031614156141645781818151811061411157fe5b602002602001015193506005600089600001518152602001908152602001600020600401548410156141555760405162461bcd60e51b815260040161058690615b7f565b866040015115614164576142a8565b866040015115614173576142a0565b87516000908152600560205260409020600a0154600160a01b900460ff1680156141d457508281815181106141a457fe5b6020908102919091018101518951600090815260059092526040909120600a01546001600160a01b039081169116145b15614210578181815181106141e557fe5b6020026020010151341461420b5760405162461bcd60e51b8152600401610586906159a4565b6142a0565b61424283828151811061421f57fe5b6020026020010151333085858151811061423557fe5b602002602001015161347e565b6142a083828151811061425157fe5b6020026020010151600560008b60000151815260200190815260200160002060070160009054906101000a90046001600160a01b031684848151811061429357fe5b6020026020010151614479565b6001016140b7565b5050509250925092565b60035460009081906001600160a01b03161561434d576003546040516370a0823160e01b81526001600160a01b03909116906370a08231906142f89030906004016153f2565b60206040518083038186803b15801561431057600080fd5b505afa158015614324573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061434891906151ef565b61434f565b475b60025460405163ba0f49b760e01b8152919250848301916001600160a01b039091169063ba0f49b790614386908790600401615dbc565b600060405180830381600087803b1580156143a057600080fd5b505af19250505080156143b1575060015b506003546000906001600160a01b03161561444b576003546040516370a0823160e01b81526001600160a01b03909116906370a08231906143f69030906004016153f2565b60206040518083038186803b15801561440e57600080fd5b505afa158015614422573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061444691906151ef565b61444d565b475b905081811415614463576001935050505061052d565b61446e838203613380565b506000949350505050565b600061449a8463095ea7b360e01b8585604051602401612f6e92919061543e565b90508051600014806144bb5750808060200190518101906144bb9190614fff565b612f475760405162461bcd60e51b815260040161058690615a1c565b604080518082018252601081526f181899199a1a9b1b9c1cb0b131b232b360811b60208201528151602a80825260608281019094526001600160a01b0385169291600091602082018180368337019050509050600360fc1b8160008151811061453c57fe5b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061456557fe5b60200101906001600160f81b031916908160001a90535060005b601481101561464b578260048583600c016020811061459a57fe5b1a60f81b6001600160f81b031916901c60f81c60ff16815181106145ba57fe5b602001015160f81c60f81b8282600202600201815181106145d757fe5b60200101906001600160f81b031916908160001a905350828482600c01602081106145fe57fe5b825191901a600f1690811061460f57fe5b602001015160f81c60f81b82826002026003018151811061462c57fe5b60200101906001600160f81b031916908160001a90535060010161457f565b50949350505050565b604051806101000160405280600081526020016000151581526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b604051806101e0016040528060001515815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b031681526020016000151581526020016000815260200160008152602001600081525090565b6040518060e0016040528060006001600160a01b031681526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b60006147c76147c284615e70565b615e30565b90508281528383830111156147db57600080fd5b6147e9836020830184615e91565b9392505050565b803561052d81615ec3565b805161052d81615ec3565b600082601f830112614816578081fd5b815160206148266147c283615e53565b8281528181019085830183850287018401881015614842578586fd5b855b8581101561486957815161485781615ec3565b84529284019290840190600101614844565b5090979650505050505050565b600082601f830112614886578081fd5b813560206148966147c283615e53565b82815281810190858301838502870184018810156148b2578586fd5b855b85811015614869578135845292840192908401906001016148b4565b600082601f8301126148e0578081fd5b815160206148f06147c283615e53565b828152818101908583018385028701840188101561490c578586fd5b855b858110156148695781518452928401929084019060010161490e565b803561052d81615ed8565b805161052d81615ed8565b600082601f830112614950578081fd5b813561495e6147c282615e70565b818152846020838601011115614972578283fd5b816020850160208301379081016020019190915292915050565b60006080828403121561499d578081fd5b604051608081018181106001600160401b03821117156149b957fe5b8060405250809150823581526020830135602082015260408301356149dd81615ed8565b604082015260608301356149f081615ec3565b6060919091015292915050565b600080600080600060a08688031215614a14578081fd5b8535614a1f81615ec3565b94506020860135614a2f81615ec3565b935060408601356001600160401b0380821115614a4a578283fd5b614a5689838a01614876565b94506060880135915080821115614a6b578283fd5b614a7789838a01614876565b93506080880135915080821115614a8c578283fd5b50614a9988828901614940565b9150509295509295909350565b600080600080600060a08688031215614abd578283fd5b8535614ac881615ec3565b94506020860135614ad881615ec3565b9350604086013592506060860135915060808601356001600160401b03811115614b00578182fd5b614a9988828901614940565b60008060408385031215614b1e578182fd5b8251614b2981615ec3565b60208401519092506001600160401b03811115614b44578182fd5b8301601f81018513614b54578182fd5b614b63858251602084016147b4565b9150509250929050565b600080600080600060a08688031215614b84578283fd5b8535614b8f81615ec3565b945060208601356001600160401b0380821115614baa578485fd5b614bb689838a01614940565b955060408801359150614bc882615ec3565b909350606087013590614bda82615ec3565b90925060808701359080821115614a8c578283fd5b60008060408385031215614c01578182fd5b8235614c0c81615ec3565b946020939093013593505050565b600080600060608486031215614c2e578081fd5b8351614c3981615ec3565b602085015160408601519194509250614c5181615ed8565b809150509250925092565b60006020808385031215614c6e578182fd5b82356001600160401b0380821115614c84578384fd5b818501915085601f830112614c97578384fd5b8135614ca56147c282615e53565b81815284810190848601610240808502870188018b1015614cc4578889fd5b8896505b84871015614e3057818b0381811215614cdf57898afd5b6040805160808082018281108b82111715614cf657fe5b83528535614d0381615ed8565b8252858c0135614d1281615ed8565b828d0152858301358383015260606101e0605f198601811315614d33578e8ffd5b614d3c81615e30565b9550614d4982890161492a565b8652828801358e87015260a0808901358688015260c09550858901358388015260e0808a0135858901526101009450848a0135828901526101209150818a0135878901526101409650614d9d878b016147f0565b90880152610160614daf8a82016147f0565b858901526101809450614dc3858b016147f0565b828901526101a09150614dd7828b016147f0565b878901526101c09650614deb878b0161492a565b81890152508189013584880152610200890135818801525050610220870135848601528481840152505080875250505087840193508082019150600187019650614cc8565b50909998505050505050505050565b60006020808385031215614e51578182fd5b82516001600160401b03811115614e66578283fd5b8301601f81018513614e76578283fd5b8051614e846147c282615e53565b818152838101908385016101e0808502860187018a1015614ea3578788fd5b8795505b84861015614f9b5780828b031215614ebd578788fd5b614ec681615e30565b614ecf83614935565b8152828801518882015260408084015190820152606080840151908201526080808401519082015260a0808401519082015260c0808401519082015260e0614f188185016147fb565b90820152610100614f2a8482016147fb565b90820152610120614f3c8482016147fb565b90820152610140614f4e8482016147fb565b90820152610160614f60848201614935565b9082015261018083810151908201526101a080840151908201526101c080840151908201528452600195909501949286019290810190614ea7565b509098975050505050505050565b60008060408385031215614fbb578182fd5b82516001600160401b0380821115614fd1578384fd5b614fdd868387016148d0565b93506020850151915080821115614ff2578283fd5b50614b6385828601614806565b600060208284031215615010578081fd5b81516147e981615ed8565b60006020828403121561502c578081fd5b81356001600160e01b0319811681146147e9578182fd5b600060208284031215615054578081fd5b81516147e981615ec3565b600060208284031215615070578081fd5b81516001600160401b03811115615085578182fd5b8201601f81018413615095578182fd5b6150a4848251602084016147b4565b949350505050565b6000608082840312156150bd578081fd5b6147e9838361498c565b600060e082840312156150d8578081fd5b60405160e081018181106001600160401b03821117156150f457fe5b604052615100836147fb565b81526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a082015260c083015160c08201528091505092915050565b600061010080838503121561515b578182fd5b604051908101906001600160401b038211818310171561517757fe5b816040528351815261518b60208501614935565b602082015260408401516040820152606084015160608201526080840151608082015260a084015160a082015260c084015160c082015260e084015160e0820152809250505092915050565b6000602082840312156151e8578081fd5b5035919050565b600060208284031215615200578081fd5b5051919050565b60008060408385031215615219578182fd5b82519150602083015161522b81615ec3565b809150509250929050565b60008060006060848603121561524a578081fd5b8351925060208401516001600160401b0380821115615267578283fd5b615273878388016148d0565b93506040860151915080821115615288578283fd5b5061529586828701614806565b9150509250925092565b600080604083850312156152b1578182fd5b82359150602083013561522b81615ed8565b60008060a083850312156152d5578182fd5b823591506152e6846020850161498c565b90509250929050565b60008060008060808587031215615304578182fd5b8435935060208501359250604085013561531d81615ed8565b9396929550929360600135925050565b6001600160a01b03169052565b15159052565b60008151808452615358816020860160208601615e91565b601f01601f19169290920160200192915050565b8051825260208101511515602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e08301525050565b60006a02330b936b4b733902628160ad1b825282516153e281600b850160208701615e91565b91909101600b0192915050565b90565b6001600160a01b0391909116815260200190565b6001600160a01b0394851681529290931660208301526040820152606081019190915260a06080820181905260009082015260c00190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b039390931683526020830191909152604082015260600190565b6020808252825182820181905260009190848201906040850190845b818110156154df576154cb83855161536c565b9284019261010092909201916001016154b8565b50909695505050505050565b901515815260200190565b6001600160e01b031991909116815260200190565b6000602082526147e96020830184615340565b6000604082526155316040830184615340565b82810360209384015290815201919050565b60208082526010908201526f24b73b30b634b2103837b9b4ba34b7b760811b604082015260600190565b60208082526021908201527f496e73756666696369656e742072657761726420696e20657874656e73696f6e6040820152601760f91b606082015260800190565b6020808252601a908201527f496e73756666696369656e74207374616b656420616d6f756e74000000000000604082015260600190565b60208082526010908201526f24b73b30b634b2103a3930b739b332b960811b604082015260600190565b6020808252600c908201526b27379022aa24103a37b5b2b760a11b604082015260600190565b6020808252600c908201526b155b985d5d1a1bdc9a5e995960a21b604082015260600190565b6020808252600d908201526c0496e76616c696420736574757609c1b604082015260600190565b6020808252600c908201526b4e6f7420706f737369626c6560a01b604082015260600190565b60208082526012908201527111985c9b5a5b99d4d95d1d5c08195b99195960721b604082015260600190565b60208082526010908201526f496e76616c696420776974686472617760801b604082015260600190565b602080825260099082015268139bdd081bdddb995960ba1b604082015260600190565b600060c08252601160c083015270436f76656e616e7473204661726d696e6760781b60e08301526101008060208401526005818401525064634641524d60d81b610120830152610140851515604084015280606084015261578481840186615340565b6001600160a01b039490941660808401525081830360a090920191909152815260200192915050565b6020808252601390820152721514905394d19154919493d357d19052531151606a1b604082015260600190565b60208082526010908201526f115512081b9bdd081a5b9d9bdb1d995960821b604082015260600190565b6020808252600e908201526d24b73b30b634b21039b2b73232b960911b604082015260600190565b602080825260099082015268139bc8185b5bdd5b9d60ba1b604082015260600190565b6020808252601e908201527f52657761726420697320626967676572207468616e2065787065637465640000604082015260600190565b6020808252600c908201526b24b73b30b634b21037b832b760a11b604082015260600190565b602080825260099082015268139bc81c995dd85c9960ba1b604082015260600190565b6020808252600f908201526e1514905394d1915497d19052531151608a1b604082015260600190565b6020808252600d908201526c27379036b0b4b7103a37b5b2b760991b604082015260600190565b6020808252600b908201526a24b73b30b634b21039383160a91b604082015260600190565b6020808252600f908201526e24b73b30b634b2103a37b3b3b6329760891b604082015260600190565b6020808252601b908201527f496e76616c696420736574757020636f6e66696775726174696f6e0000000000604082015260600190565b602080825260139082015272496e636f7272656374206574682076616c756560681b604082015260600190565b60208082526009908201526832bc3a32b739b4b7b760b91b604082015260600190565b6020808252600e908201526d496e76616c696420756e6c6f636b60901b604082015260600190565b6020808252600e908201526d1054141493d59157d1905253115160921b604082015260600190565b602080825260139082015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604082015260600190565b60208082526018908201527f546f6f206561726c7920666f7220746869732073657475700000000000000000604082015260600190565b60208082526010908201526f5365747570206e6f742061637469766560801b604082015260600190565b60208082526015908201527424b73b30b634b21022aa24103a3930b739b332b91760591b604082015260600190565b602080825260159082015274496e76616c696420616464206c697175696469747960581b604082015260600190565b6020808252600a90820152694e6f207265776172647360b01b604082015260600190565b602080825260119082015270496e76616c6964206c697175696469747960781b604082015260600190565b60208082526012908201527124b73b30b634b2103634b8bab4b234ba3c9760711b604082015260600190565b81516001600160a01b031681526020808301519082015260408083015190820152606080830151908201526080808301519082015260a0828101519082015260c0918201519181019190915260e00190565b6102e08101615c0c828561536c565b610100615c1c818401855161533a565b6020840151610120818186015260408601519150610140828187015260608701519250610160838188015260808801519350610180848189015260a089015194506101a085818a015260c08a015195506101c086818b015260e08b01519650615c896101e08b018861532d565b968a015196615c9c6102008b018961532d565b858b01519750615cb06102208b018961532d565b848b01519750615cc46102408b018961532d565b838b01519750615cd86102608b018961533a565b918a01516102808a01528901516102a0890152909701516102c090960195909552509195945050505050565b815481526001820154610100820190615d1c90615ebd565b615d29602084018261533a565b50600283015460408301526003830154606083015260048301546080830152600583015460a0830152600683015460c083015260079092015460e09091015290565b81516001600160a01b0390811682526020808401519083015260408084015182169083015260608084015115159083015260808084015115159083015260a092830151169181019190915260c00190565b90815260200190565b600085825260a06020830152615dde60a0830186615340565b82810380604085015260038252620664c560ec1b602083015260408101606085015250615e0e6040820186615340565b915050821515608083015295945050505050565b918252602082015260400190565b6040518181016001600160401b0381118282101715615e4b57fe5b604052919050565b60006001600160401b03821115615e6657fe5b5060209081020190565b60006001600160401b03821115615e8357fe5b50601f01601f191660200190565b60005b83811015615eac578181015183820152602001615e94565b83811115612f475750506000910152565b60ff1690565b6001600160a01b038116811461226f57600080fd5b801515811461226f57600080fdfea2646970667358221220c7bac8e6386b7d47a3737d2e3f3670cf7feb8f9a74fb787a15319dad6c02fb3564736f6c63430007060033
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
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ 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.