Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
Market
Compiler Version
v0.5.7+commit.6da8b019
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-10-29 */ // File: contracts/external/openzeppelin-solidity/math/SafeMath.sol pragma solidity ^0.5.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); uint256 c = a - b; return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. * * _Available since v2.4.0._ */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, "SafeMath: division by zero"); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b != 0, "SafeMath: modulo by zero"); return a % b; } } library SafeMath64 { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint64 a, uint64 b) internal pure returns (uint64) { uint64 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint64 a, uint64 b) internal pure returns (uint64) { require(b <= a, "SafeMath: subtraction overflow"); uint64 c = a - b; return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. * * _Available since v2.4.0._ */ function sub(uint64 a, uint64 b, string memory errorMessage) internal pure returns (uint64) { require(b <= a, errorMessage); uint64 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint64 a, uint64 b) internal pure returns (uint64) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint64 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint64 a, uint64 b) internal pure returns (uint64) { // Solidity only automatically asserts when dividing by 0 require(b > 0, "SafeMath: division by zero"); uint64 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint64 a, uint64 b) internal pure returns (uint64) { require(b != 0, "SafeMath: modulo by zero"); return a % b; } } // File: contracts/external/proxy/Proxy.sol pragma solidity 0.5.7; /** * @title Proxy * @dev Gives the possibility to delegate any call to a foreign implementation. */ contract Proxy { /** * @dev Fallback function allowing to perform a delegatecall to the given implementation. * This function will return whatever the implementation call returns */ function () external payable { address _impl = implementation(); require(_impl != address(0)); assembly { let ptr := mload(0x40) calldatacopy(ptr, 0, calldatasize) let result := delegatecall(gas, _impl, ptr, calldatasize, 0, 0) let size := returndatasize returndatacopy(ptr, 0, size) switch result case 0 { revert(ptr, size) } default { return(ptr, size) } } } /** * @dev Tells the address of the implementation where every call will be delegated. * @return address of the implementation to which it will be delegated */ function implementation() public view returns (address); } // File: contracts/external/proxy/UpgradeabilityProxy.sol pragma solidity 0.5.7; /** * @title UpgradeabilityProxy * @dev This contract represents a proxy where the implementation address to which it will delegate can be upgraded */ contract UpgradeabilityProxy is Proxy { /** * @dev This event will be emitted every time the implementation gets upgraded * @param implementation representing the address of the upgraded implementation */ event Upgraded(address indexed implementation); // Storage position of the address of the current implementation bytes32 private constant IMPLEMENTATION_POSITION = keccak256("org.govblocks.proxy.implementation"); /** * @dev Constructor function */ constructor() public {} /** * @dev Tells the address of the current implementation * @return address of the current implementation */ function implementation() public view returns (address impl) { bytes32 position = IMPLEMENTATION_POSITION; assembly { impl := sload(position) } } /** * @dev Sets the address of the current implementation * @param _newImplementation address representing the new implementation to be set */ function _setImplementation(address _newImplementation) internal { bytes32 position = IMPLEMENTATION_POSITION; assembly { sstore(position, _newImplementation) } } /** * @dev Upgrades the implementation address * @param _newImplementation representing the address of the new implementation to be set */ function _upgradeTo(address _newImplementation) internal { address currentImplementation = implementation(); require(currentImplementation != _newImplementation); _setImplementation(_newImplementation); emit Upgraded(_newImplementation); } } // File: contracts/external/proxy/OwnedUpgradeabilityProxy.sol pragma solidity 0.5.7; /** * @title OwnedUpgradeabilityProxy * @dev This contract combines an upgradeability proxy with basic authorization control functionalities */ contract OwnedUpgradeabilityProxy is UpgradeabilityProxy { /** * @dev Event to show ownership has been transferred * @param previousOwner representing the address of the previous owner * @param newOwner representing the address of the new owner */ event ProxyOwnershipTransferred(address previousOwner, address newOwner); // Storage position of the owner of the contract bytes32 private constant PROXY_OWNER_POSITION = keccak256("org.govblocks.proxy.owner"); /** * @dev the constructor sets the original owner of the contract to the sender account. */ constructor(address _implementation) public { _setUpgradeabilityOwner(msg.sender); _upgradeTo(_implementation); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyProxyOwner() { require(msg.sender == proxyOwner()); _; } /** * @dev Tells the address of the owner * @return the address of the owner */ function proxyOwner() public view returns (address owner) { bytes32 position = PROXY_OWNER_POSITION; assembly { owner := sload(position) } } /** * @dev Allows the current owner to transfer control of the contract to a newOwner. * @param _newOwner The address to transfer ownership to. */ function transferProxyOwnership(address _newOwner) public onlyProxyOwner { require(_newOwner != address(0)); _setUpgradeabilityOwner(_newOwner); emit ProxyOwnershipTransferred(proxyOwner(), _newOwner); } /** * @dev Allows the proxy owner to upgrade the current version of the proxy. * @param _implementation representing the address of the new implementation to be set. */ function upgradeTo(address _implementation) public onlyProxyOwner { _upgradeTo(_implementation); } /** * @dev Sets the address of the owner */ function _setUpgradeabilityOwner(address _newProxyOwner) internal { bytes32 position = PROXY_OWNER_POSITION; assembly { sstore(position, _newProxyOwner) } } } // File: contracts/interfaces/IMarketUtility.sol pragma solidity 0.5.7; contract IMarketUtility { function initialize(address payable[] calldata _addressParams, address _initiater) external; /** * @dev to Set authorized address to update parameters */ function setAuthorizedAddres() public; /** * @dev to update uint parameters in Market Config */ function updateUintParameters(bytes8 code, uint256 value) external; /** * @dev to Update address parameters in Market Config */ function updateAddressParameters(bytes8 code, address payable value) external; /** * @dev Get Parameters required to initiate market * @return Addresses of tokens to be distributed as incentives * @return Cool down time for market * @return Rate * @return Commission percent for predictions with ETH * @return Commission percent for predictions with PLOT **/ function getMarketInitialParams() public view returns(address[] memory, uint , uint, uint, uint); function getAssetPriceUSD(address _currencyAddress) external view returns(uint latestAnswer); function getPriceFeedDecimals(address _priceFeed) public view returns(uint8); function getValueAndMultiplierParameters(address _asset, uint256 _amount) public view returns (uint256, uint256); function update() external; function calculatePredictionValue(uint[] memory params, address asset, address user, address marketFeedAddress, bool _checkMultiplier) public view returns(uint _predictionValue, bool _multiplierApplied); /** * @dev Get basic market details * @return Minimum amount required to predict in market * @return Percentage of users leveraged amount to deduct when placed in wrong prediction * @return Decimal points for prediction positions **/ function getBasicMarketDetails() public view returns ( uint256, uint256, uint256, uint256 ); function getDisputeResolutionParams() public view returns (uint256); function calculateOptionPrice(uint[] memory params, address marketFeedAddress) public view returns(uint _optionPrice); /** * @dev Get price of provided feed address * @param _currencyFeedAddress Feed Address of currency on which market options are based on * @return Current price of the market currency **/ function getSettlemetPrice( address _currencyFeedAddress, uint256 _settleTime ) public view returns (uint256 latestAnswer, uint256 roundId); /** * @dev Get value of provided currency address in ETH * @param _currencyAddress Address of currency * @param _amount Amount of provided currency * @return Value of provided amount in ETH **/ function getAssetValueETH(address _currencyAddress, uint256 _amount) public view returns (uint256 tokenEthValue); } // File: contracts/interfaces/IToken.sol pragma solidity 0.5.7; contract IToken { function decimals() external view returns(uint8); /** * @dev Total number of tokens in existence */ function totalSupply() external view returns (uint256); /** * @dev Gets the balance of the specified address. * @param account The address to query the balance of. * @return An uint256 representing the amount owned by the passed address. */ function balanceOf(address account) external view returns (uint256); /** * @dev Transfer token for a specified address * @param recipient The address to transfer to. * @param amount The amount to be transferred. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev function that mints an amount of the token and assigns it to * an account. * @param account The account that will receive the created tokens. * @param amount The amount that will be created. */ function mint(address account, uint256 amount) external returns (bool); /** * @dev burns an amount of the tokens of the message sender * account. * @param amount The amount that will be burnt. */ function burn(uint256 amount) external; /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * Returns a boolean value indicating whether the operation succeeded. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Transfer tokens from one address to another * @param sender address The address which you want to send tokens from * @param recipient address The address which you want to transfer to * @param amount uint256 the amount of tokens to be transferred */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); } // File: contracts/interfaces/ITokenController.sol pragma solidity 0.5.7; contract ITokenController { address public token; address public bLOTToken; /** * @dev Swap BLOT token. * account. * @param amount The amount that will be swapped. */ function swapBLOT(address _of, address _to, uint256 amount) public; function totalBalanceOf(address _of) public view returns (uint256 amount); function transferFrom(address _token, address _of, address _to, uint256 amount) public; /** * @dev Returns tokens locked for a specified address for a * specified reason at a specific time * @param _of The address whose tokens are locked * @param _reason The reason to query the lock tokens for * @param _time The timestamp to query the lock tokens for */ function tokensLockedAtTime(address _of, bytes32 _reason, uint256 _time) public view returns (uint256 amount); /** * @dev burns an amount of the tokens of the message sender * account. * @param amount The amount that will be burnt. */ function burnCommissionTokens(uint256 amount) external returns(bool); function initiateVesting(address _vesting) external; function lockForGovernanceVote(address _of, uint _days) public; function totalSupply() public view returns (uint256); function mint(address _member, uint _amount) public; } // File: contracts/interfaces/IMarketRegistry.sol pragma solidity 0.5.7; contract IMarketRegistry { enum MarketType { HourlyMarket, DailyMarket, WeeklyMarket } address public owner; address public tokenController; address public marketUtility; bool public marketCreationPaused; mapping(address => bool) public isMarket; function() external payable{} function marketDisputeStatus(address _marketAddress) public view returns(uint _status); function burnDisputedProposalTokens(uint _proposaId) external; function isWhitelistedSponsor(address _address) public view returns(bool); function transferAssets(address _asset, address _to, uint _amount) external; /** * @dev Initialize the PlotX. * @param _marketConfig The address of market config. * @param _plotToken The address of PLOT token. */ function initiate(address _defaultAddress, address _marketConfig, address _plotToken, address payable[] memory _configParams) public; /** * @dev Create proposal if user wants to raise the dispute. * @param proposalTitle The title of proposal created by user. * @param description The description of dispute. * @param solutionHash The ipfs solution hash. * @param actionHash The action hash for solution. * @param stakeForDispute The token staked to raise the diospute. * @param user The address who raises the dispute. */ function createGovernanceProposal(string memory proposalTitle, string memory description, string memory solutionHash, bytes memory actionHash, uint256 stakeForDispute, address user, uint256 ethSentToPool, uint256 tokenSentToPool, uint256 proposedValue) public { } /** * @dev Emits the PlacePrediction event and sets user data. * @param _user The address who placed prediction. * @param _value The amount of ether user staked. * @param _predictionPoints The positions user will get. * @param _predictionAsset The prediction assets user will get. * @param _prediction The option range on which user placed prediction. * @param _leverage The leverage selected by user at the time of place prediction. */ function setUserGlobalPredictionData(address _user,uint _value, uint _predictionPoints, address _predictionAsset, uint _prediction,uint _leverage) public{ } /** * @dev Emits the claimed event. * @param _user The address who claim their reward. * @param _reward The reward which is claimed by user. * @param incentives The incentives of user. * @param incentiveToken The incentive tokens of user. */ function callClaimedEvent(address _user , uint[] memory _reward, address[] memory predictionAssets, uint incentives, address incentiveToken) public { } /** * @dev Emits the MarketResult event. * @param _totalReward The amount of reward to be distribute. * @param _winningOption The winning option of the market. * @param _closeValue The closing value of the market currency. */ function callMarketResultEvent(uint[] memory _totalReward, uint _winningOption, uint _closeValue, uint roundId) public { } } // File: contracts/Market.sol /* Copyright (C) 2020 PlotX.io This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/ */ pragma solidity 0.5.7; contract Market { using SafeMath for *; enum PredictionStatus { Live, InSettlement, Cooling, InDispute, Settled } struct option { uint predictionPoints; mapping(address => uint256) assetStaked; mapping(address => uint256) assetLeveraged; } struct MarketSettleData { uint64 WinningOption; uint64 settleTime; } address constant ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; address constant marketFeedAddress = 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419; address constant plotToken = 0x72F020f8f3E8fd9382705723Cd26380f8D0c66Bb; IMarketRegistry constant marketRegistry = IMarketRegistry(0xE210330d6768030e816d223836335079C7A0c851); ITokenController constant tokenController = ITokenController(0x12d7053Efc680Ba6671F8Cb96d1421D906ce3dE2); IMarketUtility constant marketUtility = IMarketUtility(0x2330058D49fA61D5C5405fA8B17fcD823c59F7Bb); uint8 constant roundOfToNearest = 1; uint constant totalOptions = 3; uint constant MAX_LEVERAGE = 5; uint constant ethCommissionPerc = 10; //with 2 decimals uint constant plotCommissionPerc = 5; //with 2 decimals bytes32 public constant marketCurrency = "ETH/USD"; bool internal lockedForDispute; address internal incentiveToken; uint internal ethAmountToPool; uint internal ethCommissionAmount; uint internal plotCommissionAmount; uint internal tokenAmountToPool; uint internal incentiveToDistribute; uint[] internal rewardToDistribute; PredictionStatus internal predictionStatus; struct UserData { bool claimedReward; bool predictedWithBlot; bool multiplierApplied; mapping(uint => uint) predictionPoints; mapping(address => mapping(uint => uint)) assetStaked; mapping(address => mapping(uint => uint)) LeverageAsset; } struct MarketData { uint64 startTime; uint64 predictionTime; uint64 neutralMinValue; uint64 neutralMaxValue; } MarketData public marketData; MarketSettleData public marketSettleData; mapping(address => UserData) internal userData; mapping(uint=>option) public optionsAvailable; /** * @dev Initialize the market. * @param _startTime The time at which market will create. * @param _predictionTime The time duration of market. * @param _minValue The minimum value of neutral option range. * @param _maxValue The maximum value of neutral option range. */ function initiate(uint64 _startTime, uint64 _predictionTime, uint64 _minValue, uint64 _maxValue) public payable { OwnedUpgradeabilityProxy proxy = OwnedUpgradeabilityProxy(address(uint160(address(this)))); require(msg.sender == proxy.proxyOwner(),"Sender is not proxy owner."); require(marketData.startTime == 0, "Already initialized"); require(_startTime.add(_predictionTime) > now); marketData.startTime = _startTime; marketData.predictionTime = _predictionTime; marketData.neutralMinValue = _minValue; marketData.neutralMaxValue = _maxValue; } /** * @dev Place prediction on the available options of the market. * @param _asset The asset used by user during prediction whether it is plotToken address or in ether. * @param _predictionStake The amount staked by user at the time of prediction. * @param _prediction The option on which user placed prediction. * @param _leverage The leverage opted by user at the time of prediction. */ function placePrediction(address _asset, uint256 _predictionStake, uint256 _prediction,uint256 _leverage) public payable { require(!marketRegistry.marketCreationPaused() && _prediction <= totalOptions && _leverage <= MAX_LEVERAGE); require(now >= marketData.startTime && now <= marketExpireTime()); uint256 _commissionStake; if(_asset == ETH_ADDRESS) { require(_predictionStake == msg.value); _commissionStake = _calculatePercentage(ethCommissionPerc, _predictionStake, 10000); ethCommissionAmount = ethCommissionAmount.add(_commissionStake); } else { require(msg.value == 0); if (_asset == plotToken){ tokenController.transferFrom(plotToken, msg.sender, address(this), _predictionStake); } else { require(_asset == tokenController.bLOTToken()); require(_leverage == MAX_LEVERAGE); require(!userData[msg.sender].predictedWithBlot); userData[msg.sender].predictedWithBlot = true; tokenController.swapBLOT(msg.sender, address(this), _predictionStake); _asset = plotToken; } _commissionStake = _calculatePercentage(plotCommissionPerc, _predictionStake, 10000); plotCommissionAmount = plotCommissionAmount.add(_commissionStake); } _commissionStake = _predictionStake.sub(_commissionStake); (uint predictionPoints, bool isMultiplierApplied) = calculatePredictionValue(_prediction, _commissionStake, _leverage, _asset); if(isMultiplierApplied) { userData[msg.sender].multiplierApplied = true; } require(predictionPoints > 0); _storePredictionData(_prediction, _commissionStake, _asset, _leverage, predictionPoints); marketRegistry.setUserGlobalPredictionData(msg.sender,_predictionStake, predictionPoints, _asset, _prediction, _leverage); } function calculatePredictionValue(uint _prediction, uint _predictionStake, uint _leverage, address _asset) internal view returns(uint predictionPoints, bool isMultiplierApplied) { uint[] memory params = new uint[](11); params[0] = _prediction; params[1] = marketData.neutralMinValue; params[2] = marketData.neutralMaxValue; params[3] = marketData.startTime; params[4] = marketExpireTime(); (params[5], params[6]) = getTotalAssetsStaked(); params[7] = optionsAvailable[_prediction].assetStaked[ETH_ADDRESS]; params[8] = optionsAvailable[_prediction].assetStaked[plotToken]; params[9] = _predictionStake; params[10] = _leverage; bool checkMultiplier; if(!userData[msg.sender].multiplierApplied) { checkMultiplier = true; } (predictionPoints, isMultiplierApplied) = marketUtility.calculatePredictionValue(params, _asset, msg.sender, marketFeedAddress, checkMultiplier); } function getTotalAssetsStaked() public view returns(uint256 ethStaked, uint256 plotStaked) { for(uint256 i = 1; i<= totalOptions;i++) { ethStaked = ethStaked.add(optionsAvailable[i].assetStaked[ETH_ADDRESS]); plotStaked = plotStaked.add(optionsAvailable[i].assetStaked[plotToken]); } } function getTotalStakedValueInPLOT() public view returns(uint256) { (uint256 ethStaked, uint256 plotStaked) = getTotalAssetsStaked(); (, ethStaked) = marketUtility.getValueAndMultiplierParameters(ETH_ADDRESS, ethStaked); return plotStaked.add(ethStaked); } /** * @dev Stores the prediction data. * @param _prediction The option on which user place prediction. * @param _predictionStake The amount staked by user at the time of prediction. * @param _asset The asset used by user during prediction. * @param _leverage The leverage opted by user during prediction. * @param predictionPoints The positions user got during prediction. */ function _storePredictionData(uint _prediction, uint _predictionStake, address _asset, uint _leverage, uint predictionPoints) internal { userData[msg.sender].predictionPoints[_prediction] = userData[msg.sender].predictionPoints[_prediction].add(predictionPoints); userData[msg.sender].assetStaked[_asset][_prediction] = userData[msg.sender].assetStaked[_asset][_prediction].add(_predictionStake); userData[msg.sender].LeverageAsset[_asset][_prediction] = userData[msg.sender].LeverageAsset[_asset][_prediction].add(_predictionStake.mul(_leverage)); optionsAvailable[_prediction].predictionPoints = optionsAvailable[_prediction].predictionPoints.add(predictionPoints); optionsAvailable[_prediction].assetStaked[_asset] = optionsAvailable[_prediction].assetStaked[_asset].add(_predictionStake); optionsAvailable[_prediction].assetLeveraged[_asset] = optionsAvailable[_prediction].assetLeveraged[_asset].add(_predictionStake.mul(_leverage)); } /** * @dev Settle the market, setting the winning option */ function settleMarket() external { (uint256 _value, uint256 _roundId) = marketUtility.getSettlemetPrice(marketFeedAddress, uint256(marketSettleTime())); if(marketStatus() == PredictionStatus.InSettlement) { _postResult(_value, _roundId); } } /** * @dev Calculate the result of market. * @param _value The current price of market currency. */ function _postResult(uint256 _value, uint256 _roundId) internal { require(now >= marketSettleTime(),"Time not reached"); require(_value > 0,"value should be greater than 0"); uint riskPercentage; ( , riskPercentage, , ) = marketUtility.getBasicMarketDetails(); if(predictionStatus != PredictionStatus.InDispute) { marketSettleData.settleTime = uint64(now); } else { delete marketSettleData.settleTime; } predictionStatus = PredictionStatus.Settled; if(_value < marketData.neutralMinValue) { marketSettleData.WinningOption = 1; } else if(_value > marketData.neutralMaxValue) { marketSettleData.WinningOption = 3; } else { marketSettleData.WinningOption = 2; } uint[] memory totalReward = new uint256[](2); if(optionsAvailable[marketSettleData.WinningOption].assetStaked[ETH_ADDRESS] > 0 || optionsAvailable[marketSettleData.WinningOption].assetStaked[plotToken] > 0 ){ for(uint i=1;i <= totalOptions;i++){ if(i!=marketSettleData.WinningOption) { uint256 leveragedAsset = _calculatePercentage(riskPercentage, optionsAvailable[i].assetLeveraged[plotToken], 100); totalReward[0] = totalReward[0].add(leveragedAsset); leveragedAsset = _calculatePercentage(riskPercentage, optionsAvailable[i].assetLeveraged[ETH_ADDRESS], 100); totalReward[1] = totalReward[1].add(leveragedAsset); } } rewardToDistribute = totalReward; } else { for(uint i=1;i <= totalOptions;i++){ uint256 leveragedAsset = _calculatePercentage(riskPercentage, optionsAvailable[i].assetLeveraged[plotToken], 100); tokenAmountToPool = tokenAmountToPool.add(leveragedAsset); leveragedAsset = _calculatePercentage(riskPercentage, optionsAvailable[i].assetLeveraged[ETH_ADDRESS], 100); ethAmountToPool = ethAmountToPool.add(leveragedAsset); } } _transferAsset(ETH_ADDRESS, address(marketRegistry), ethAmountToPool.add(ethCommissionAmount)); _transferAsset(plotToken, address(marketRegistry), tokenAmountToPool.add(plotCommissionAmount)); delete ethCommissionAmount; delete plotCommissionAmount; marketRegistry.callMarketResultEvent(rewardToDistribute, marketSettleData.WinningOption, _value, _roundId); } function _calculatePercentage(uint256 _percent, uint256 _value, uint256 _divisor) internal pure returns(uint256) { return _percent.mul(_value).div(_divisor); } /** * @dev Raise the dispute if wrong value passed at the time of market result declaration. * @param proposedValue The proposed value of market currency. * @param proposalTitle The title of proposal created by user. * @param description The description of dispute. * @param solutionHash The ipfs solution hash. */ function raiseDispute(uint256 proposedValue, string memory proposalTitle, string memory description, string memory solutionHash) public { require(getTotalStakedValueInPLOT() > 0, "No participation"); require(marketStatus() == PredictionStatus.Cooling); uint _stakeForDispute = marketUtility.getDisputeResolutionParams(); tokenController.transferFrom(plotToken, msg.sender, address(marketRegistry), _stakeForDispute); lockedForDispute = true; marketRegistry.createGovernanceProposal(proposalTitle, description, solutionHash, abi.encode(address(this), proposedValue), _stakeForDispute, msg.sender, ethAmountToPool, tokenAmountToPool, proposedValue); delete ethAmountToPool; delete tokenAmountToPool; predictionStatus = PredictionStatus.InDispute; } /** * @dev Resolve the dispute * @param accepted Flag mentioning if dispute is accepted or not * @param finalResult The final correct value of market currency. */ function resolveDispute(bool accepted, uint256 finalResult) external payable { require(msg.sender == address(marketRegistry) && marketStatus() == PredictionStatus.InDispute); if(accepted) { _postResult(finalResult, 0); } lockedForDispute = false; predictionStatus = PredictionStatus.Settled; } function sponsorIncentives(address _token, uint256 _value) external { require(marketRegistry.isWhitelistedSponsor(msg.sender)); require(marketStatus() <= PredictionStatus.InSettlement); require(incentiveToken == address(0), "Already sponsored"); incentiveToken = _token; incentiveToDistribute = _value; tokenController.transferFrom(_token, msg.sender, address(this), _value); } /** * @dev Claim the return amount of the specified address. * @param _user The address to query the claim return amount of. * @return Flag, if 0:cannot claim, 1: Already Claimed, 2: Claimed */ function claimReturn(address payable _user) public returns(uint256) { if(lockedForDispute || marketStatus() != PredictionStatus.Settled || marketRegistry.marketCreationPaused()) { return 0; } if(userData[_user].claimedReward) { return 1; } userData[_user].claimedReward = true; (uint[] memory _returnAmount, address[] memory _predictionAssets, uint _incentive, ) = getReturn(_user); _transferAsset(plotToken, _user, _returnAmount[0]); _transferAsset(ETH_ADDRESS, _user, _returnAmount[1]); _transferAsset(incentiveToken, _user, _incentive); marketRegistry.callClaimedEvent(_user, _returnAmount, _predictionAssets, _incentive, incentiveToken); return 2; } /** * @dev Transfer the assets to specified address. * @param _asset The asset transfer to the specific address. * @param _recipient The address to transfer the asset of * @param _amount The amount which is transfer. */ function _transferAsset(address _asset, address payable _recipient, uint256 _amount) internal { if(_amount > 0) { if(_asset == ETH_ADDRESS) { _recipient.transfer(_amount); } else { require(IToken(_asset).transfer(_recipient, _amount)); } } } /** * @dev Get market settle time * @return the time at which the market result will be declared */ function marketSettleTime() public view returns(uint64) { if(marketSettleData.settleTime > 0) { return marketSettleData.settleTime; } return uint64(marketData.startTime.add(marketData.predictionTime.mul(2))); } /** * @dev Get market expire time * @return the time upto which user can place predictions in market */ function marketExpireTime() internal view returns(uint256) { return marketData.startTime.add(marketData.predictionTime); } /** * @dev Get market cooldown time * @return the time upto which user can raise the dispute after the market is settled */ function marketCoolDownTime() public view returns(uint256) { return marketSettleData.settleTime.add(marketData.predictionTime.div(4)); } /** * @dev Get market Feed data * @return market currency name * @return market currency feed address */ function getMarketFeedData() public view returns(uint8, bytes32, address) { return (roundOfToNearest, marketCurrency, marketFeedAddress); } /** * @dev Get estimated amount of prediction points for given inputs. * @param _prediction The option on which user place prediction. * @param _stakeValueInEth The amount staked by user. * @param _leverage The leverage opted by user at the time of prediction. * @return uint256 representing the prediction points. */ function estimatePredictionValue(uint _prediction, uint _stakeValueInEth, uint _leverage) public view returns(uint _predictionValue){ (_predictionValue, ) = calculatePredictionValue(_prediction, _stakeValueInEth, _leverage, ETH_ADDRESS); } /** * @dev Gets the price of specific option. * @param _prediction The option number to query the balance of. * @return Price of the option. */ function getOptionPrice(uint _prediction) public view returns(uint) { uint[] memory params = new uint[](9); params[0] = _prediction; params[1] = marketData.neutralMinValue; params[2] = marketData.neutralMaxValue; params[3] = marketData.startTime; params[4] = marketExpireTime(); (params[5], params[6]) = getTotalAssetsStaked(); params[7] = optionsAvailable[_prediction].assetStaked[ETH_ADDRESS]; params[8] = optionsAvailable[_prediction].assetStaked[plotToken]; return marketUtility.calculateOptionPrice(params, marketFeedAddress); } /** * @dev Gets number of positions user got in prediction * @param _user Address of user * @param _option Option Id */ function getUserPredictionPoints(address _user, uint256 _option) external view returns(uint256) { return userData[_user].predictionPoints[_option]; } /** * @dev Gets the market data. * @return _marketCurrency bytes32 representing the currency or stock name of the market. * @return minvalue uint[] memory representing the minimum range of all the options of the market. * @return maxvalue uint[] memory representing the maximum range of all the options of the market. * @return _optionPrice uint[] memory representing the option price of each option ranges of the market. * @return _ethStaked uint[] memory representing the ether staked on each option ranges of the market. * @return _plotStaked uint[] memory representing the plot staked on each option ranges of the market. * @return _predictionTime uint representing the type of market. * @return _expireTime uint representing the time at which market closes for prediction * @return _predictionStatus uint representing the status of the market. */ function getData() public view returns (bytes32 _marketCurrency,uint[] memory minvalue,uint[] memory maxvalue, uint[] memory _optionPrice, uint[] memory _ethStaked, uint[] memory _plotStaked,uint _predictionTime,uint _expireTime, uint _predictionStatus){ _marketCurrency = marketCurrency; _predictionTime = marketData.predictionTime; _expireTime =marketExpireTime(); _predictionStatus = uint(marketStatus()); minvalue = new uint[](totalOptions); minvalue[1] = marketData.neutralMinValue; minvalue[2] = marketData.neutralMaxValue.add(1); maxvalue = new uint[](totalOptions); maxvalue[0] = marketData.neutralMinValue.sub(1); maxvalue[1] = marketData.neutralMaxValue; maxvalue[2] = ~uint256(0); _optionPrice = new uint[](totalOptions); _ethStaked = new uint[](totalOptions); _plotStaked = new uint[](totalOptions); for (uint i = 0; i < totalOptions; i++) { _ethStaked[i] = optionsAvailable[i+1].assetStaked[ETH_ADDRESS]; _plotStaked[i] = optionsAvailable[i+1].assetStaked[plotToken]; _optionPrice[i] = getOptionPrice(i+1); } } /** * @dev Gets the result of the market. * @return uint256 representing the winning option of the market. * @return uint256 Value of market currently at the time closing market. * @return uint256 representing the positions of the winning option. * @return uint[] memory representing the reward to be distributed. * @return uint256 representing the Eth staked on winning option. * @return uint256 representing the PLOT staked on winning option. */ function getMarketResults() public view returns(uint256, uint256, uint256[] memory, uint256, uint256) { return (marketSettleData.WinningOption, optionsAvailable[marketSettleData.WinningOption].predictionPoints, rewardToDistribute, optionsAvailable[marketSettleData.WinningOption].assetStaked[ETH_ADDRESS], optionsAvailable[marketSettleData.WinningOption].assetStaked[plotToken]); } /** * @dev Gets the return amount of the specified address. * @param _user The address to specify the return of * @return returnAmount uint[] memory representing the return amount. * @return incentive uint[] memory representing the amount incentive. * @return _incentiveTokens address[] memory representing the incentive tokens. */ function getReturn(address _user)public view returns (uint[] memory returnAmount, address[] memory _predictionAssets, uint incentive, address _incentiveToken){ (uint256 ethStaked, uint256 plotStaked) = getTotalAssetsStaked(); if(marketStatus() != PredictionStatus.Settled || ethStaked.add(plotStaked) ==0) { return (returnAmount, _predictionAssets, incentive, incentiveToken); } _predictionAssets = new address[](2); _predictionAssets[0] = plotToken; _predictionAssets[1] = ETH_ADDRESS; uint256 _totalUserPredictionPoints = 0; uint256 _totalPredictionPoints = 0; (returnAmount, _totalUserPredictionPoints, _totalPredictionPoints) = _calculateUserReturn(_user); incentive = _calculateIncentives(_totalUserPredictionPoints, _totalPredictionPoints); if(userData[_user].predictionPoints[marketSettleData.WinningOption] > 0) { returnAmount = _addUserReward(_user, returnAmount); } return (returnAmount, _predictionAssets, incentive, incentiveToken); } /** * @dev Get flags set for user * @param _user User address * @return Flag defining if user had availed multiplier * @return Flag defining if user had predicted with bPLOT */ function getUserFlags(address _user) external view returns(bool, bool) { return (userData[_user].multiplierApplied, userData[_user].predictedWithBlot); } /** * @dev Adds the reward in the total return of the specified address. * @param _user The address to specify the return of. * @param returnAmount The return amount. * @return uint[] memory representing the return amount after adding reward. */ function _addUserReward(address _user, uint[] memory returnAmount) internal view returns(uint[] memory){ uint reward; for(uint j = 0; j< returnAmount.length; j++) { reward = userData[_user].predictionPoints[marketSettleData.WinningOption].mul(rewardToDistribute[j]).div(optionsAvailable[marketSettleData.WinningOption].predictionPoints); returnAmount[j] = returnAmount[j].add(reward); } return returnAmount; } /** * @dev Calculate the return of the specified address. * @param _user The address to query the return of. * @return _return uint[] memory representing the return amount owned by the passed address. * @return _totalUserPredictionPoints uint representing the positions owned by the passed address. * @return _totalPredictionPoints uint representing the total positions of winners. */ function _calculateUserReturn(address _user) internal view returns(uint[] memory _return, uint _totalUserPredictionPoints, uint _totalPredictionPoints){ ( , uint riskPercentage, , ) = marketUtility.getBasicMarketDetails(); _return = new uint256[](2); for(uint i=1;i<=totalOptions;i++){ _totalUserPredictionPoints = _totalUserPredictionPoints.add(userData[_user].predictionPoints[i]); _totalPredictionPoints = _totalPredictionPoints.add(optionsAvailable[i].predictionPoints); _return[0] = _callReturn(_return[0], _user, i, riskPercentage, plotToken); _return[1] = _callReturn(_return[1], _user, i, riskPercentage, ETH_ADDRESS); } } /** * @dev Calculates the incentives. * @param _totalUserPredictionPoints The positions of user. * @param _totalPredictionPoints The total positions of winners. * @return incentive the calculated incentive. */ function _calculateIncentives(uint256 _totalUserPredictionPoints, uint256 _totalPredictionPoints) internal view returns(uint256 incentive){ incentive = _totalUserPredictionPoints.mul(incentiveToDistribute.div(_totalPredictionPoints)); } // /** // * @dev Gets the pending return. // * @param _user The address to specify the return of. // * @return uint representing the pending return amount. // */ // function getPendingReturn(address _user) external view returns(uint[] memory returnAmount, address[] memory _predictionAssets, uint[] memory incentive, address[] memory _incentiveTokens){ // if(userClaimedReward[_user]) return (0,0); // return getReturn(_user); // } /** * @dev Calls the total return amount internally. */ function _callReturn(uint _return,address _user,uint i,uint riskPercentage, address _asset)internal view returns(uint){ if(i == marketSettleData.WinningOption) { riskPercentage = 0; } uint256 leveragedAsset = _calculatePercentage(riskPercentage, userData[_user].LeverageAsset[_asset][i], 100); return _return.add(userData[_user].assetStaked[_asset][i].sub(leveragedAsset)); } /** * @dev Gets the status of market. * @return PredictionStatus representing the status of market. */ function marketStatus() internal view returns(PredictionStatus){ if(predictionStatus == PredictionStatus.Live && now >= marketExpireTime()) { return PredictionStatus.InSettlement; } else if(predictionStatus == PredictionStatus.Settled && now <= marketCoolDownTime()) { return PredictionStatus.Cooling; } return predictionStatus; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":true,"inputs":[{"name":"_user","type":"address"}],"name":"getReturn","outputs":[{"name":"returnAmount","type":"uint256[]"},{"name":"_predictionAssets","type":"address[]"},{"name":"incentive","type":"uint256"},{"name":"_incentiveToken","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"},{"name":"_value","type":"uint256"}],"name":"sponsorIncentives","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"marketCoolDownTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_user","type":"address"}],"name":"claimReturn","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getMarketFeedData","outputs":[{"name":"","type":"uint8"},{"name":"","type":"bytes32"},{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getData","outputs":[{"name":"_marketCurrency","type":"bytes32"},{"name":"minvalue","type":"uint256[]"},{"name":"maxvalue","type":"uint256[]"},{"name":"_optionPrice","type":"uint256[]"},{"name":"_ethStaked","type":"uint256[]"},{"name":"_plotStaked","type":"uint256[]"},{"name":"_predictionTime","type":"uint256"},{"name":"_expireTime","type":"uint256"},{"name":"_predictionStatus","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTotalStakedValueInPLOT","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_prediction","type":"uint256"}],"name":"getOptionPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_startTime","type":"uint64"},{"name":"_predictionTime","type":"uint64"},{"name":"_minValue","type":"uint64"},{"name":"_maxValue","type":"uint64"}],"name":"initiate","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"proposedValue","type":"uint256"},{"name":"proposalTitle","type":"string"},{"name":"description","type":"string"},{"name":"solutionHash","type":"string"}],"name":"raiseDispute","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"accepted","type":"bool"},{"name":"finalResult","type":"uint256"}],"name":"resolveDispute","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"marketSettleData","outputs":[{"name":"WinningOption","type":"uint64"},{"name":"settleTime","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_user","type":"address"}],"name":"getUserFlags","outputs":[{"name":"","type":"bool"},{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_prediction","type":"uint256"},{"name":"_stakeValueInEth","type":"uint256"},{"name":"_leverage","type":"uint256"}],"name":"estimatePredictionValue","outputs":[{"name":"_predictionValue","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getMarketResults","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256[]"},{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"settleMarket","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"marketSettleTime","outputs":[{"name":"","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_asset","type":"address"},{"name":"_predictionStake","type":"uint256"},{"name":"_prediction","type":"uint256"},{"name":"_leverage","type":"uint256"}],"name":"placePrediction","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"marketData","outputs":[{"name":"startTime","type":"uint64"},{"name":"predictionTime","type":"uint64"},{"name":"neutralMinValue","type":"uint64"},{"name":"neutralMaxValue","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTotalAssetsStaked","outputs":[{"name":"ethStaked","type":"uint256"},{"name":"plotStaked","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"marketCurrency","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"optionsAvailable","outputs":[{"name":"predictionPoints","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_user","type":"address"},{"name":"_option","type":"uint256"}],"name":"getUserPredictionPoints","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50613784806100206000396000f3fe6080604052600436106101405760003560e01c80637852d19d116100b6578063ae1ff39b1161006f578063ae1ff39b1461086e578063b945b527146108a6578063ca032274146108ef578063ddf8389b1461091d578063e217eb9d14610932578063ff0fd72a1461095c57610140565b80637852d19d146106fd5780637cb464eb146107385780637dafb4c014610786578063853b8447146107bc57806385970c6614610828578063a12a50991461083d57610140565b80633bc5de30116101085780633bc5de30146102fa57806343da750f1461049357806368a4b271146104a85780636b592cf6146104d257806374bd0d021461051057806377c24577146106d857610140565b80630cc9a606146101455780630fe5aca4146102255780630ff2f99f146102605780631ec0fd501461028757806324569133146102ba575b600080fd5b34801561015157600080fd5b506101786004803603602081101561016857600080fd5b50356001600160a01b0316610995565b604080519081018390526001600160a01b038216606082015260808082528551908201528451819060208083019160a0840191898101910280838360005b838110156101ce5781810151838201526020016101b6565b50505050905001838103825286818151815260200191508051906020019060200280838360005b8381101561020d5781810151838201526020016101f5565b50505050905001965050505050505060405180910390f35b34801561023157600080fd5b5061025e6004803603604081101561024857600080fd5b506001600160a01b038135169060200135610b0c565b005b34801561026c57600080fd5b50610275610cc6565b60408051918252519081900360200190f35b34801561029357600080fd5b50610275600480360360208110156102aa57600080fd5b50356001600160a01b0316610d0a565b3480156102c657600080fd5b506102cf610fda565b6040805160ff909416845260208401929092526001600160a01b031682820152519081900360600190f35b34801561030657600080fd5b5061030f611004565b604051808a8152602001806020018060200180602001806020018060200189815260200188815260200187815260200186810386528e818151815260200191508051906020019060200280838360005b8381101561037757818101518382015260200161035f565b5050505090500186810385528d818151815260200191508051906020019060200280838360005b838110156103b657818101518382015260200161039e565b5050505090500186810384528c818151815260200191508051906020019060200280838360005b838110156103f55781810151838201526020016103dd565b5050505090500186810383528b818151815260200191508051906020019060200280838360005b8381101561043457818101518382015260200161041c565b5050505090500186810382528a818151815260200191508051906020019060200280838360005b8381101561047357818101518382015260200161045b565b505050509050019e50505050505050505050505050505060405180910390f35b34801561049f57600080fd5b506102756112b7565b3480156104b457600080fd5b50610275600480360360208110156104cb57600080fd5b5035611378565b61025e600480360360808110156104e857600080fd5b506001600160401b038135811691602081013582169160408201358116916060013516611608565b34801561051c57600080fd5b5061025e6004803603608081101561053357600080fd5b8135919081019060408101602082013564010000000081111561055557600080fd5b82018360208201111561056757600080fd5b8035906020019184600183028401116401000000008311171561058957600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092959493602081019350359150506401000000008111156105dc57600080fd5b8201836020820111156105ee57600080fd5b8035906020019184600183028401116401000000008311171561061057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929594936020810193503591505064010000000081111561066357600080fd5b82018360208201111561067557600080fd5b8035906020019184600183028401116401000000008311171561069757600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506117de945050505050565b61025e600480360360408110156106ee57600080fd5b50803515159060200135611c35565b34801561070957600080fd5b50610712611ca1565b604080516001600160401b03938416815291909216602082015281519081900390910190f35b34801561074457600080fd5b5061076b6004803603602081101561075b57600080fd5b50356001600160a01b0316611cbb565b60408051921515835290151560208301528051918290030190f35b34801561079257600080fd5b50610275600480360360608110156107a957600080fd5b5080359060208101359060400135611ce8565b3480156107c857600080fd5b506107d1611d0d565b6040518086815260200185815260200180602001848152602001838152602001828103825285818151815260200191508051906020019060200280838360008381101561020d5781810151838201526020016101f5565b34801561083457600080fd5b5061025e611dcc565b34801561084957600080fd5b50610852611ebc565b604080516001600160401b039092168252519081900360200190f35b61025e6004803603608081101561088457600080fd5b506001600160a01b038135169060208101359060408101359060600135611f2a565b3480156108b257600080fd5b506108bb612399565b604080516001600160401b039586168152938516602085015291841683830152909216606082015290519081900360800190f35b3480156108fb57600080fd5b506109046123c7565b6040805192835260208301919091528051918290030190f35b34801561092957600080fd5b5061027561245f565b34801561093e57600080fd5b506102756004803603602081101561095557600080fd5b5035612470565b34801561096857600080fd5b506102756004803603604081101561097f57600080fd5b506001600160a01b038135169060200135612482565b6060806000806000806109a66123c7565b909250905060046109b56124b0565b60048111156109c057fe5b1415806109da57506109d8828263ffffffff61252316565b155b156109f957505060005461010090046001600160a01b03169050610b05565b60408051600280825260608201835290916020830190803883390190505094506000805160206136f883398151915285600081518110610a3557fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060008051602061373983398151915285600181518110610a7157fe5b6001600160a01b0390921660209283029190910190910152600080610a9589612587565b91995092509050610aa68282612734565b6001600160a01b038a166000908152600a602090815260408083206009546001600160401b0316845260010190915290205490965015610aed57610aea898961275b565b97505b505060005461010090046001600160a01b0316925050505b9193509193565b60408051600160e11b630721fa67028152336004820152905173e210330d6768030e816d223836335079c7a0c85191630e43f4ce916024808301926020929190829003018186803b158015610b6057600080fd5b505afa158015610b74573d6000803e3d6000fd5b505050506040513d6020811015610b8a57600080fd5b5051610b9557600080fd5b6001610b9f6124b0565b6004811115610baa57fe5b1115610bb557600080fd5b60005461010090046001600160a01b031615610c1b5760408051600160e51b62461bcd02815260206004820152601160248201527f416c72656164792073706f6e736f726564000000000000000000000000000000604482015290519081900360640190fd5b60008054610100600160a81b0319166101006001600160a01b038516908102919091178255600583905560408051600160e11b630aed65f5028152600481019290925233602483015230604483015260648201849052517312d7053efc680ba6671f8cb96d1421d906ce3de2926315dacbea926084808201939182900301818387803b158015610caa57600080fd5b505af1158015610cbe573d6000803e3d6000fd5b505050505050565b600854600090610d0490610ceb90600160401b90046001600160401b0316600461283e565b600954600160401b90046001600160401b031690612523565b90505b90565b6000805460ff1680610d2f57506004610d216124b0565b6004811115610d2c57fe5b14155b80610daf575073e210330d6768030e816d223836335079c7a0c8516001600160a01b03166335f628ee6040518163ffffffff1660e01b815260040160206040518083038186803b158015610d8257600080fd5b505afa158015610d96573d6000803e3d6000fd5b505050506040513d6020811015610dac57600080fd5b50515b15610dbc57506000610fd5565b6001600160a01b0382166000908152600a602052604090205460ff1615610de557506001610fd5565b6001600160a01b0382166000908152600a60205260408120805460ff191660011790556060908190610e1685610995565b50925092509250610e4a6000805160206136f88339815191528685600081518110610e3d57fe5b60200260200101516128ab565b610e6a6000805160206137398339815191528685600181518110610e3d57fe5b600054610e869061010090046001600160a01b031686836128ab565b73e210330d6768030e816d223836335079c7a0c8516001600160a01b031663c819b5f286858585600060019054906101000a90046001600160a01b03166040518663ffffffff1660e01b815260040180866001600160a01b03166001600160a01b031681526020018060200180602001858152602001846001600160a01b03166001600160a01b03168152602001838103835287818151815260200191508051906020019060200280838360005b83811015610f4c578181015183820152602001610f34565b50505050905001838103825286818151815260200191508051906020019060200280838360005b83811015610f8b578181015183820152602001610f73565b50505050905001975050505050505050600060405180830381600087803b158015610fb557600080fd5b505af1158015610fc9573d6000803e3d6000fd5b50505050600293505050505b919050565b6001600160ca1b661155120bd554d102735f4ec3df9cbd43714fe2740f5e3616155c5b8419909192565b600854600160ca1b661155120bd554d102906060908190819081908190600160401b90046001600160401b031660008061103c6129a6565b91506110466124b0565b600481111561105157fe5b604080516003808252608082019092529192506020820160608038833950506008548251929a50600160801b90046001600160401b0316918a9150600190811061109757fe5b60209081029190910101526008546110c090600160c01b90046001600160401b03166001612523565b886002815181106110cd57fe5b60209081029190910101526040805160038082526080820190925290816020016020820280388339505060085491985061111a91600160801b90046001600160401b0316905060016129cf565b8760008151811061112757fe5b60209081029190910101526008548751600160c01b9091046001600160401b0316908890600190811061115657fe5b6020026020010181815250506000198760028151811061117257fe5b6020908102919091010152604080516003808252608082019092529081602001602082028038833950506040805160038082526080820190925292985090506020820160608038833950506040805160038082526080820190925292975090506020820160608038833901905050935060005b60038110156112ab5760018082016000908152600b60209081526040808320600080516020613739833981519152845290930190522054865187908390811061122a57fe5b60209081029190910181019190915260018083016000908152600b835260408082206000805160206136f88339815191528352909201909252902054855186908390811061127457fe5b60200260200101818152505061128c81600101611378565b87828151811061129857fe5b60209081029190910101526001016111e5565b50909192939495969798565b60008060006112c46123c7565b60408051600160e11b63569669330281526000805160206137398339815191526004820152602481018490528151939550919350732330058d49fa61d5c5405fa8b17fcd823c59f7bb9263ad2cd266926044808201939291829003018186803b15801561133057600080fd5b505afa158015611344573d6000803e3d6000fd5b505050506040513d604081101561135a57600080fd5b50602001519150611371818363ffffffff61252316565b9250505090565b604080516009808252610140820190925260009160609190602082016101208038833901905050905082816000815181106113af57fe5b60209081029190910101526008548151600160801b9091046001600160401b031690829060019081106113de57fe5b60209081029190910101526008548151600160c01b9091046001600160401b0316908290600290811061140d57fe5b602090810291909101015260085481516001600160401b03909116908290600390811061143657fe5b60200260200101818152505061144a6129a6565b8160048151811061145757fe5b60200260200101818152505061146b6123c7565b8260058151811061147857fe5b602002602001018360068151811061148c57fe5b602090810291909101810192909252919091526000848152600b82526040808220600080516020613739833981519152835260010190925220548151829060079081106114d557fe5b6020908102919091018101919091526000848152600b825260408082206000805160206136f88339815191528352600101909252205481518290600890811061151a57fe5b60209081029190910181019190915260408051600160e01b63504e8751028152735f4ec3df9cbd43714fe2740f5e3616155c5b84196024820181905260048201928352845160448301528451732330058d49fa61d5c5405fa8b17fcd823c59f7bb9463504e875194879490928392606490920191868101910280838360005b838110156115b1578181015183820152602001611599565b50505050905001935050505060206040518083038186803b1580156115d557600080fd5b505afa1580156115e9573d6000803e3d6000fd5b505050506040513d60208110156115ff57600080fd5b50519392505050565b6000309050806001600160a01b031663025313a26040518163ffffffff1660e01b815260040160206040518083038186803b15801561164657600080fd5b505afa15801561165a573d6000803e3d6000fd5b505050506040513d602081101561167057600080fd5b50516001600160a01b031633146116d15760408051600160e51b62461bcd02815260206004820152601a60248201527f53656e646572206973206e6f742070726f7879206f776e65722e000000000000604482015290519081900360640190fd5b6008546001600160401b0316156117325760408051600160e51b62461bcd02815260206004820152601360248201527f416c726561647920696e697469616c697a656400000000000000000000000000604482015290519081900360640190fd5b4261174f6001600160401b0387811690871663ffffffff61252316565b1161175957600080fd5b506008805467ffffffffffffffff19166001600160401b03958616176fffffffffffffffff00000000000000001916600160401b948616949094029390931777ffffffffffffffff000000000000000000000000000000001916600160801b92851692909202919091176001600160c01b0316600160c01b9190931602919091179055565b60006117e86112b7565b1161183d5760408051600160e51b62461bcd02815260206004820152601060248201527f4e6f2070617274696369706174696f6e00000000000000000000000000000000604482015290519081900360640190fd5b60026118476124b0565b600481111561185257fe5b1461185c57600080fd5b6000732330058d49fa61d5c5405fa8b17fcd823c59f7bb6001600160a01b031663094f81f86040518163ffffffff1660e01b815260040160206040518083038186803b1580156118ab57600080fd5b505afa1580156118bf573d6000803e3d6000fd5b505050506040513d60208110156118d557600080fd5b505160408051600160e11b630aed65f50281526000805160206136f8833981519152600482015233602482015273e210330d6768030e816d223836335079c7a0c85160448201526064810183905290519192507312d7053efc680ba6671f8cb96d1421d906ce3de2916315dacbea9160848082019260009290919082900301818387803b15801561196557600080fd5b505af1158015611979573d6000803e3d6000fd5b5050505060016000806101000a81548160ff02191690831515021790555073e210330d6768030e816d223836335079c7a0c8516001600160a01b031663e99a8de0858585308a60405160200180836001600160a01b03166001600160a01b031681526020018281526020019250505060405160208183030381529060405286336001546004548e6040518a63ffffffff1660e01b815260040180806020018060200180602001806020018a8152602001896001600160a01b03166001600160a01b0316815260200188815260200187815260200186815260200185810385528e818151815260200191508051906020019080838360005b83811015611a88578181015183820152602001611a70565b50505050905090810190601f168015611ab55780820380516001836020036101000a031916815260200191505b5085810384528d5181528d516020918201918f019080838360005b83811015611ae8578181015183820152602001611ad0565b50505050905090810190601f168015611b155780820380516001836020036101000a031916815260200191505b5085810383528c5181528c516020918201918e019080838360005b83811015611b48578181015183820152602001611b30565b50505050905090810190601f168015611b755780820380516001836020036101000a031916815260200191505b5085810382528b5181528b516020918201918d019080838360005b83811015611ba8578181015183820152602001611b90565b50505050905090810190601f168015611bd55780820380516001836020036101000a031916815260200191505b509d5050505050505050505050505050600060405180830381600087803b158015611bff57600080fd5b505af1158015611c13573d6000803e3d6000fd5b50506000600181905560045550506007805460ff191660031790555050505050565b3373e210330d6768030e816d223836335079c7a0c851148015611c6a57506003611c5d6124b0565b6004811115611c6857fe5b145b611c7357600080fd5b8115611c8457611c84816000612a2f565b50506000805460ff19908116909155600780549091166004179055565b6009546001600160401b0380821691600160401b90041682565b6001600160a01b03166000908152600a602052604090205460ff6201000082048116926101009092041690565b6000611d04848484600080516020613739833981519152613025565b50949350505050565b6009546001600160401b03166000818152600b602090815260408083208054600080516020613739833981519152855260019091018352818420546000805160206136f883398151915285528285205460068054855181880281018801909652808652969788976060978997889793969395929091859190830182828015611db457602002820191906000526020600020905b815481526020019060010190808311611da0575b50505050509250945094509450945094509091929394565b600080732330058d49fa61d5c5405fa8b17fcd823c59f7bb63f0a5702f735f4ec3df9cbd43714fe2740f5e3616155c5b8419611e06611ebc565b6001600160401b03166040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050604080518083038186803b158015611e5b57600080fd5b505afa158015611e6f573d6000803e3d6000fd5b505050506040513d6040811015611e8557600080fd5b50805160209091015190925090506001611e9d6124b0565b6004811115611ea857fe5b1415611eb857611eb88282612a2f565b5050565b600954600090600160401b90046001600160401b031615611ef05750600954600160401b90046001600160401b0316610d07565b600854610d0490611f1290600160401b90046001600160401b03166002613343565b6008546001600160401b03169063ffffffff61252316565b73e210330d6768030e816d223836335079c7a0c8516001600160a01b03166335f628ee6040518163ffffffff1660e01b815260040160206040518083038186803b158015611f7757600080fd5b505afa158015611f8b573d6000803e3d6000fd5b505050506040513d6020811015611fa157600080fd5b5051158015611fb1575060038211155b8015611fbe575060058111155b611fc757600080fd5b6008546001600160401b03164210801590611fe95750611fe56129a6565b4211155b611ff257600080fd5b60006001600160a01b038516600080516020613739833981519152141561204b5734841461201f57600080fd5b61202d600a8561271061339f565b600254909150612043908263ffffffff61252316565b600255612294565b341561205657600080fd5b6001600160a01b0385166000805160206136f883398151915214156121085760408051600160e11b630aed65f50281526000805160206136f883398151915260048201523360248201523060448201526064810186905290517312d7053efc680ba6671f8cb96d1421d906ce3de2916315dacbea91608480830192600092919082900301818387803b1580156120eb57600080fd5b505af11580156120ff573d6000803e3d6000fd5b5050505061226c565b7312d7053efc680ba6671f8cb96d1421d906ce3de26001600160a01b0316634a5245b46040518163ffffffff1660e01b815260040160206040518083038186803b15801561215557600080fd5b505afa158015612169573d6000803e3d6000fd5b505050506040513d602081101561217f57600080fd5b50516001600160a01b0386811691161461219857600080fd5b600582146121a557600080fd5b336000908152600a6020526040902054610100900460ff16156121c757600080fd5b336000818152600a6020526040808220805461ff0019166101001790558051600160e01b631371b2bd028152600481019390935230602484015260448301879052517312d7053efc680ba6671f8cb96d1421d906ce3de292631371b2bd92606480830193919282900301818387803b15801561224257600080fd5b505af1158015612256573d6000803e3d6000fd5b505050506000805160206136f883398151915294505b61227a60058561271061339f565b600354909150612290908263ffffffff61252316565b6003555b6122a4848263ffffffff6129cf16565b90506000806122b58584868a613025565b9150915080156122de57336000908152600a60205260409020805462ff00001916620100001790555b600082116122eb57600080fd5b6122f885848987866133bd565b60408051600160e11b6348d979c702815233600482015260248101889052604481018490526001600160a01b03891660648201526084810187905260a48101869052905173e210330d6768030e816d223836335079c7a0c851916391b2f38e9160c480830192600092919082900301818387803b15801561237857600080fd5b505af115801561238c573d6000803e3d6000fd5b5050505050505050505050565b6008546001600160401b0380821691600160401b8104821691600160801b8204811691600160c01b90041684565b60008060015b6003811161245a576000818152600b60209081526040808320600080516020613739833981519152845260010190915290205461241190849063ffffffff61252316565b6000828152600b602090815260408083206000805160206136f8833981519152845260010190915290205490935061245090839063ffffffff61252316565b91506001016123cd565b509091565b600160ca1b661155120bd554d10281565b600b6020526000908152604090205481565b6001600160a01b0382166000908152600a602090815260408083208484526001019091529020545b92915050565b60008060075460ff1660048111156124c457fe5b1480156124d857506124d46129a6565b4210155b156124e557506001610d07565b600460075460ff1660048111156124f857fe5b14801561250c5750612508610cc6565b4211155b1561251957506002610d07565b5060075460ff1690565b6000828201838110156125805760408051600160e51b62461bcd02815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b60606000806000732330058d49fa61d5c5405fa8b17fcd823c59f7bb6001600160a01b031663bfed95b86040518163ffffffff1660e01b815260040160806040518083038186803b1580156125db57600080fd5b505afa1580156125ef573d6000803e3d6000fd5b505050506040513d608081101561260557600080fd5b50602090810151604080516002808252606082018352929450928301908038833901905050935060015b6003811161272b576001600160a01b0386166000908152600a6020908152604080832084845260010190915290205461266f90859063ffffffff61252316565b6000828152600b602052604090205490945061269290849063ffffffff61252316565b92506126c3856000815181106126a457fe5b60200260200101518783856000805160206136f88339815191526135d5565b856000815181106126d057fe5b60200260200101818152505061270b856001815181106126ec57fe5b60200260200101518783856000805160206137398339815191526135d5565b8560018151811061271857fe5b602090810291909101015260010161262f565b50509193909250565b600061258061274e8360055461283e90919063ffffffff16565b849063ffffffff61334316565b60606000805b8351811015612835576009546001600160401b03166000908152600b6020526040902054600680546127ee92916127e2918590811061279c57fe5b60009182526020808320909101546001600160a01b038b168352600a825260408084206009546001600160401b031685526001019092529120549063ffffffff61334316565b9063ffffffff61283e16565b91506128168285838151811061280057fe5b602002602001015161252390919063ffffffff16565b84828151811061282257fe5b6020908102919091010152600101612761565b50919392505050565b60008082116128975760408051600160e51b62461bcd02815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b60008284816128a257fe5b04949350505050565b80156129a1576001600160a01b038316600080516020613739833981519152141561290c576040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015612906573d6000803e3d6000fd5b506129a1565b826001600160a01b031663a9059cbb83836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561296c57600080fd5b505af1158015612980573d6000803e3d6000fd5b505050506040513d602081101561299657600080fd5b50516129a157600080fd5b505050565b600854600090610d04906001600160401b0380821691600160401b90041663ffffffff61252316565b600082821115612a295760408051600160e51b62461bcd02815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b612a37611ebc565b6001600160401b0316421015612a975760408051600160e51b62461bcd02815260206004820152601060248201527f54696d65206e6f74207265616368656400000000000000000000000000000000604482015290519081900360640190fd5b60008211612aef5760408051600160e51b62461bcd02815260206004820152601e60248201527f76616c75652073686f756c642062652067726561746572207468616e20300000604482015290519081900360640190fd5b6000732330058d49fa61d5c5405fa8b17fcd823c59f7bb6001600160a01b031663bfed95b86040518163ffffffff1660e01b815260040160806040518083038186803b158015612b3e57600080fd5b505afa158015612b52573d6000803e3d6000fd5b505050506040513d6080811015612b6857600080fd5b50602001519050600360075460ff166004811115612b8257fe5b14612bb657600980546fffffffffffffffff00000000000000001916600160401b426001600160401b031602179055612bd0565b600980546fffffffffffffffff0000000000000000191690555b6007805460ff191660041790556008546001600160401b03600160801b90910416831015612c11576009805467ffffffffffffffff19166001179055612c59565b600854600160c01b90046001600160401b0316831115612c44576009805467ffffffffffffffff19166003179055612c59565b6009805467ffffffffffffffff191660021790555b604080516002808252606080830184529260208301908038833950506009546001600160401b03166000908152600b60209081526040808320600080516020613739833981519152845260010190915290205491925050151580612cf257506009546001600160401b03166000908152600b602090815260408083206000805160206136f8833981519152845260010190915290205415155b15612dff5760015b60038111612de5576009546001600160401b03168114612ddd576000818152600b602090815260408083206000805160206136f88339815191528452600201909152812054612d4c908590606461339f565b9050612d5f818460008151811061280057fe5b83600081518110612d6c57fe5b6020908102919091018101919091526000838152600b8252604080822060008051602061373983398151915283526002019092522054612daf908590606461339f565b9050612dc2818460018151811061280057fe5b83600181518110612dcf57fe5b602002602001018181525050505b600101612cfa565b508051612df9906006906020840190613692565b50612ebb565b60015b60038111612eb9576000818152600b602090815260408083206000805160206136f88339815191528452600201909152812054612e42908590606461339f565b600454909150612e58908263ffffffff61252316565b6004556000828152600b602090815260408083206000805160206137398339815191528452600201909152902054612e93908590606461339f565b600154909150612ea9908263ffffffff61252316565b6001908155919091019050612e02565b505b612efe60008051602061373983398151915273e210330d6768030e816d223836335079c7a0c851612ef960025460015461252390919063ffffffff16565b6128ab565b612f3c6000805160206136f883398151915273e210330d6768030e816d223836335079c7a0c851612ef960035460045461252390919063ffffffff16565b60006002819055600355600954604051600160e01b63a99f50dd0281526001600160401b03909116602482018190526044820186905260648201859052608060048301908152600680546084850181905273e210330d6768030e816d223836335079c7a0c8519463a99f50dd9492938a928a92829160a49091019087908015612fe457602002820191906000526020600020905b815481526020019060010190808311612fd0575b505095505050505050600060405180830381600087803b15801561300757600080fd5b505af115801561301b573d6000803e3d6000fd5b5050505050505050565b60408051600b808252610180820190925260009182916060916020820161016080388339019050509050868160008151811061305d57fe5b60209081029190910101526008548151600160801b9091046001600160401b0316908290600190811061308c57fe5b60209081029190910101526008548151600160c01b9091046001600160401b031690829060029081106130bb57fe5b602090810291909101015260085481516001600160401b0390911690829060039081106130e457fe5b6020026020010181815250506130f86129a6565b8160048151811061310557fe5b6020026020010181815250506131196123c7565b8260058151811061312657fe5b602002602001018360068151811061313a57fe5b602090810291909101810192909252919091526000888152600b825260408082206000805160206137398339815191528352600101909252205481518290600790811061318357fe5b6020908102919091018101919091526000888152600b825260408082206000805160206136f8833981519152835260010190925220548151829060089081106131c857fe5b60200260200101818152505085816009815181106131e257fe5b6020026020010181815250508481600a815181106131fc57fe5b602090810291909101810191909152336000908152600a909152604081205462010000900460ff1661322c575060015b604051600160e01b6398d57d210281526001600160a01b03861660248201523360448201819052735f4ec3df9cbd43714fe2740f5e3616155c5b841960648301819052831515608484015260a060048401908152855160a48501528551732330058d49fa61d5c5405fa8b17fcd823c59f7bb946398d57d219488948c9491939092899291829160c401906020808a01910280838360005b838110156132db5781810151838201526020016132c3565b505050509050019650505050505050604080518083038186803b15801561330157600080fd5b505afa158015613315573d6000803e3d6000fd5b505050506040513d604081101561332b57600080fd5b50805160209091015190999098509650505050505050565b600082613352575060006124aa565b8282028284828161335f57fe5b041461258057604051600160e51b62461bcd0281526004018080602001828103825260218152602001806137186021913960400191505060405180910390fd5b60006133b5826127e2868663ffffffff61334316565b949350505050565b336000908152600a602090815260408083208884526001019091529020546133eb908263ffffffff61252316565b336000908152600a60209081526040808320898452600181018352818420949094556001600160a01b0387168352600290930181528282208883529052205461343a908563ffffffff61252316565b336000908152600a602090815260408083206001600160a01b038816845260020182528083208984529091529020556134b761347c858463ffffffff61334316565b336000908152600a602090815260408083206001600160a01b038916845260030182528083208a84529091529020549063ffffffff61252316565b336000908152600a602090815260408083206001600160a01b03881684526003018252808320898452825280832093909355600b905220546134ff908263ffffffff61252316565b6000868152600b602090815260408083209384556001600160a01b0387168352600190930190522054613538908563ffffffff61252316565b6000868152600b602090815260408083206001600160a01b03881684526001019091529020556135a3613571858463ffffffff61334316565b6000878152600b602090815260408083206001600160a01b03891684526002019091529020549063ffffffff61252316565b6000958652600b602090815260408088206001600160a01b039096168852600290950190529290942091909155505050565b6009546000906001600160401b03168414156135f057600092505b6001600160a01b038086166000908152600a60209081526040808320938616835260039093018152828220878352905290812054613631908590606461339f565b6001600160a01b038088166000908152600a60209081526040808320938816835260029093018152828220898352905220549091506136879061367a908363ffffffff6129cf16565b889063ffffffff61252316565b979650505050505050565b8280548282559060005260206000209081019282156136cd579160200282015b828111156136cd5782518255916020019190600101906136b2565b506136d99291506136dd565b5090565b610d0791905b808211156136d957600081556001016136e356fe00000000000000000000000072f020f8f3e8fd9382705723cd26380f8d0c66bb536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeea165627a7a7230582098b1283931390455f5ca6bbff29e5ac85cfb8e6742ea874b10dd55d8636d9e4c0029
Deployed Bytecode
0x6080604052600436106101405760003560e01c80637852d19d116100b6578063ae1ff39b1161006f578063ae1ff39b1461086e578063b945b527146108a6578063ca032274146108ef578063ddf8389b1461091d578063e217eb9d14610932578063ff0fd72a1461095c57610140565b80637852d19d146106fd5780637cb464eb146107385780637dafb4c014610786578063853b8447146107bc57806385970c6614610828578063a12a50991461083d57610140565b80633bc5de30116101085780633bc5de30146102fa57806343da750f1461049357806368a4b271146104a85780636b592cf6146104d257806374bd0d021461051057806377c24577146106d857610140565b80630cc9a606146101455780630fe5aca4146102255780630ff2f99f146102605780631ec0fd501461028757806324569133146102ba575b600080fd5b34801561015157600080fd5b506101786004803603602081101561016857600080fd5b50356001600160a01b0316610995565b604080519081018390526001600160a01b038216606082015260808082528551908201528451819060208083019160a0840191898101910280838360005b838110156101ce5781810151838201526020016101b6565b50505050905001838103825286818151815260200191508051906020019060200280838360005b8381101561020d5781810151838201526020016101f5565b50505050905001965050505050505060405180910390f35b34801561023157600080fd5b5061025e6004803603604081101561024857600080fd5b506001600160a01b038135169060200135610b0c565b005b34801561026c57600080fd5b50610275610cc6565b60408051918252519081900360200190f35b34801561029357600080fd5b50610275600480360360208110156102aa57600080fd5b50356001600160a01b0316610d0a565b3480156102c657600080fd5b506102cf610fda565b6040805160ff909416845260208401929092526001600160a01b031682820152519081900360600190f35b34801561030657600080fd5b5061030f611004565b604051808a8152602001806020018060200180602001806020018060200189815260200188815260200187815260200186810386528e818151815260200191508051906020019060200280838360005b8381101561037757818101518382015260200161035f565b5050505090500186810385528d818151815260200191508051906020019060200280838360005b838110156103b657818101518382015260200161039e565b5050505090500186810384528c818151815260200191508051906020019060200280838360005b838110156103f55781810151838201526020016103dd565b5050505090500186810383528b818151815260200191508051906020019060200280838360005b8381101561043457818101518382015260200161041c565b5050505090500186810382528a818151815260200191508051906020019060200280838360005b8381101561047357818101518382015260200161045b565b505050509050019e50505050505050505050505050505060405180910390f35b34801561049f57600080fd5b506102756112b7565b3480156104b457600080fd5b50610275600480360360208110156104cb57600080fd5b5035611378565b61025e600480360360808110156104e857600080fd5b506001600160401b038135811691602081013582169160408201358116916060013516611608565b34801561051c57600080fd5b5061025e6004803603608081101561053357600080fd5b8135919081019060408101602082013564010000000081111561055557600080fd5b82018360208201111561056757600080fd5b8035906020019184600183028401116401000000008311171561058957600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092959493602081019350359150506401000000008111156105dc57600080fd5b8201836020820111156105ee57600080fd5b8035906020019184600183028401116401000000008311171561061057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929594936020810193503591505064010000000081111561066357600080fd5b82018360208201111561067557600080fd5b8035906020019184600183028401116401000000008311171561069757600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506117de945050505050565b61025e600480360360408110156106ee57600080fd5b50803515159060200135611c35565b34801561070957600080fd5b50610712611ca1565b604080516001600160401b03938416815291909216602082015281519081900390910190f35b34801561074457600080fd5b5061076b6004803603602081101561075b57600080fd5b50356001600160a01b0316611cbb565b60408051921515835290151560208301528051918290030190f35b34801561079257600080fd5b50610275600480360360608110156107a957600080fd5b5080359060208101359060400135611ce8565b3480156107c857600080fd5b506107d1611d0d565b6040518086815260200185815260200180602001848152602001838152602001828103825285818151815260200191508051906020019060200280838360008381101561020d5781810151838201526020016101f5565b34801561083457600080fd5b5061025e611dcc565b34801561084957600080fd5b50610852611ebc565b604080516001600160401b039092168252519081900360200190f35b61025e6004803603608081101561088457600080fd5b506001600160a01b038135169060208101359060408101359060600135611f2a565b3480156108b257600080fd5b506108bb612399565b604080516001600160401b039586168152938516602085015291841683830152909216606082015290519081900360800190f35b3480156108fb57600080fd5b506109046123c7565b6040805192835260208301919091528051918290030190f35b34801561092957600080fd5b5061027561245f565b34801561093e57600080fd5b506102756004803603602081101561095557600080fd5b5035612470565b34801561096857600080fd5b506102756004803603604081101561097f57600080fd5b506001600160a01b038135169060200135612482565b6060806000806000806109a66123c7565b909250905060046109b56124b0565b60048111156109c057fe5b1415806109da57506109d8828263ffffffff61252316565b155b156109f957505060005461010090046001600160a01b03169050610b05565b60408051600280825260608201835290916020830190803883390190505094506000805160206136f883398151915285600081518110610a3557fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060008051602061373983398151915285600181518110610a7157fe5b6001600160a01b0390921660209283029190910190910152600080610a9589612587565b91995092509050610aa68282612734565b6001600160a01b038a166000908152600a602090815260408083206009546001600160401b0316845260010190915290205490965015610aed57610aea898961275b565b97505b505060005461010090046001600160a01b0316925050505b9193509193565b60408051600160e11b630721fa67028152336004820152905173e210330d6768030e816d223836335079c7a0c85191630e43f4ce916024808301926020929190829003018186803b158015610b6057600080fd5b505afa158015610b74573d6000803e3d6000fd5b505050506040513d6020811015610b8a57600080fd5b5051610b9557600080fd5b6001610b9f6124b0565b6004811115610baa57fe5b1115610bb557600080fd5b60005461010090046001600160a01b031615610c1b5760408051600160e51b62461bcd02815260206004820152601160248201527f416c72656164792073706f6e736f726564000000000000000000000000000000604482015290519081900360640190fd5b60008054610100600160a81b0319166101006001600160a01b038516908102919091178255600583905560408051600160e11b630aed65f5028152600481019290925233602483015230604483015260648201849052517312d7053efc680ba6671f8cb96d1421d906ce3de2926315dacbea926084808201939182900301818387803b158015610caa57600080fd5b505af1158015610cbe573d6000803e3d6000fd5b505050505050565b600854600090610d0490610ceb90600160401b90046001600160401b0316600461283e565b600954600160401b90046001600160401b031690612523565b90505b90565b6000805460ff1680610d2f57506004610d216124b0565b6004811115610d2c57fe5b14155b80610daf575073e210330d6768030e816d223836335079c7a0c8516001600160a01b03166335f628ee6040518163ffffffff1660e01b815260040160206040518083038186803b158015610d8257600080fd5b505afa158015610d96573d6000803e3d6000fd5b505050506040513d6020811015610dac57600080fd5b50515b15610dbc57506000610fd5565b6001600160a01b0382166000908152600a602052604090205460ff1615610de557506001610fd5565b6001600160a01b0382166000908152600a60205260408120805460ff191660011790556060908190610e1685610995565b50925092509250610e4a6000805160206136f88339815191528685600081518110610e3d57fe5b60200260200101516128ab565b610e6a6000805160206137398339815191528685600181518110610e3d57fe5b600054610e869061010090046001600160a01b031686836128ab565b73e210330d6768030e816d223836335079c7a0c8516001600160a01b031663c819b5f286858585600060019054906101000a90046001600160a01b03166040518663ffffffff1660e01b815260040180866001600160a01b03166001600160a01b031681526020018060200180602001858152602001846001600160a01b03166001600160a01b03168152602001838103835287818151815260200191508051906020019060200280838360005b83811015610f4c578181015183820152602001610f34565b50505050905001838103825286818151815260200191508051906020019060200280838360005b83811015610f8b578181015183820152602001610f73565b50505050905001975050505050505050600060405180830381600087803b158015610fb557600080fd5b505af1158015610fc9573d6000803e3d6000fd5b50505050600293505050505b919050565b6001600160ca1b661155120bd554d102735f4ec3df9cbd43714fe2740f5e3616155c5b8419909192565b600854600160ca1b661155120bd554d102906060908190819081908190600160401b90046001600160401b031660008061103c6129a6565b91506110466124b0565b600481111561105157fe5b604080516003808252608082019092529192506020820160608038833950506008548251929a50600160801b90046001600160401b0316918a9150600190811061109757fe5b60209081029190910101526008546110c090600160c01b90046001600160401b03166001612523565b886002815181106110cd57fe5b60209081029190910101526040805160038082526080820190925290816020016020820280388339505060085491985061111a91600160801b90046001600160401b0316905060016129cf565b8760008151811061112757fe5b60209081029190910101526008548751600160c01b9091046001600160401b0316908890600190811061115657fe5b6020026020010181815250506000198760028151811061117257fe5b6020908102919091010152604080516003808252608082019092529081602001602082028038833950506040805160038082526080820190925292985090506020820160608038833950506040805160038082526080820190925292975090506020820160608038833901905050935060005b60038110156112ab5760018082016000908152600b60209081526040808320600080516020613739833981519152845290930190522054865187908390811061122a57fe5b60209081029190910181019190915260018083016000908152600b835260408082206000805160206136f88339815191528352909201909252902054855186908390811061127457fe5b60200260200101818152505061128c81600101611378565b87828151811061129857fe5b60209081029190910101526001016111e5565b50909192939495969798565b60008060006112c46123c7565b60408051600160e11b63569669330281526000805160206137398339815191526004820152602481018490528151939550919350732330058d49fa61d5c5405fa8b17fcd823c59f7bb9263ad2cd266926044808201939291829003018186803b15801561133057600080fd5b505afa158015611344573d6000803e3d6000fd5b505050506040513d604081101561135a57600080fd5b50602001519150611371818363ffffffff61252316565b9250505090565b604080516009808252610140820190925260009160609190602082016101208038833901905050905082816000815181106113af57fe5b60209081029190910101526008548151600160801b9091046001600160401b031690829060019081106113de57fe5b60209081029190910101526008548151600160c01b9091046001600160401b0316908290600290811061140d57fe5b602090810291909101015260085481516001600160401b03909116908290600390811061143657fe5b60200260200101818152505061144a6129a6565b8160048151811061145757fe5b60200260200101818152505061146b6123c7565b8260058151811061147857fe5b602002602001018360068151811061148c57fe5b602090810291909101810192909252919091526000848152600b82526040808220600080516020613739833981519152835260010190925220548151829060079081106114d557fe5b6020908102919091018101919091526000848152600b825260408082206000805160206136f88339815191528352600101909252205481518290600890811061151a57fe5b60209081029190910181019190915260408051600160e01b63504e8751028152735f4ec3df9cbd43714fe2740f5e3616155c5b84196024820181905260048201928352845160448301528451732330058d49fa61d5c5405fa8b17fcd823c59f7bb9463504e875194879490928392606490920191868101910280838360005b838110156115b1578181015183820152602001611599565b50505050905001935050505060206040518083038186803b1580156115d557600080fd5b505afa1580156115e9573d6000803e3d6000fd5b505050506040513d60208110156115ff57600080fd5b50519392505050565b6000309050806001600160a01b031663025313a26040518163ffffffff1660e01b815260040160206040518083038186803b15801561164657600080fd5b505afa15801561165a573d6000803e3d6000fd5b505050506040513d602081101561167057600080fd5b50516001600160a01b031633146116d15760408051600160e51b62461bcd02815260206004820152601a60248201527f53656e646572206973206e6f742070726f7879206f776e65722e000000000000604482015290519081900360640190fd5b6008546001600160401b0316156117325760408051600160e51b62461bcd02815260206004820152601360248201527f416c726561647920696e697469616c697a656400000000000000000000000000604482015290519081900360640190fd5b4261174f6001600160401b0387811690871663ffffffff61252316565b1161175957600080fd5b506008805467ffffffffffffffff19166001600160401b03958616176fffffffffffffffff00000000000000001916600160401b948616949094029390931777ffffffffffffffff000000000000000000000000000000001916600160801b92851692909202919091176001600160c01b0316600160c01b9190931602919091179055565b60006117e86112b7565b1161183d5760408051600160e51b62461bcd02815260206004820152601060248201527f4e6f2070617274696369706174696f6e00000000000000000000000000000000604482015290519081900360640190fd5b60026118476124b0565b600481111561185257fe5b1461185c57600080fd5b6000732330058d49fa61d5c5405fa8b17fcd823c59f7bb6001600160a01b031663094f81f86040518163ffffffff1660e01b815260040160206040518083038186803b1580156118ab57600080fd5b505afa1580156118bf573d6000803e3d6000fd5b505050506040513d60208110156118d557600080fd5b505160408051600160e11b630aed65f50281526000805160206136f8833981519152600482015233602482015273e210330d6768030e816d223836335079c7a0c85160448201526064810183905290519192507312d7053efc680ba6671f8cb96d1421d906ce3de2916315dacbea9160848082019260009290919082900301818387803b15801561196557600080fd5b505af1158015611979573d6000803e3d6000fd5b5050505060016000806101000a81548160ff02191690831515021790555073e210330d6768030e816d223836335079c7a0c8516001600160a01b031663e99a8de0858585308a60405160200180836001600160a01b03166001600160a01b031681526020018281526020019250505060405160208183030381529060405286336001546004548e6040518a63ffffffff1660e01b815260040180806020018060200180602001806020018a8152602001896001600160a01b03166001600160a01b0316815260200188815260200187815260200186815260200185810385528e818151815260200191508051906020019080838360005b83811015611a88578181015183820152602001611a70565b50505050905090810190601f168015611ab55780820380516001836020036101000a031916815260200191505b5085810384528d5181528d516020918201918f019080838360005b83811015611ae8578181015183820152602001611ad0565b50505050905090810190601f168015611b155780820380516001836020036101000a031916815260200191505b5085810383528c5181528c516020918201918e019080838360005b83811015611b48578181015183820152602001611b30565b50505050905090810190601f168015611b755780820380516001836020036101000a031916815260200191505b5085810382528b5181528b516020918201918d019080838360005b83811015611ba8578181015183820152602001611b90565b50505050905090810190601f168015611bd55780820380516001836020036101000a031916815260200191505b509d5050505050505050505050505050600060405180830381600087803b158015611bff57600080fd5b505af1158015611c13573d6000803e3d6000fd5b50506000600181905560045550506007805460ff191660031790555050505050565b3373e210330d6768030e816d223836335079c7a0c851148015611c6a57506003611c5d6124b0565b6004811115611c6857fe5b145b611c7357600080fd5b8115611c8457611c84816000612a2f565b50506000805460ff19908116909155600780549091166004179055565b6009546001600160401b0380821691600160401b90041682565b6001600160a01b03166000908152600a602052604090205460ff6201000082048116926101009092041690565b6000611d04848484600080516020613739833981519152613025565b50949350505050565b6009546001600160401b03166000818152600b602090815260408083208054600080516020613739833981519152855260019091018352818420546000805160206136f883398151915285528285205460068054855181880281018801909652808652969788976060978997889793969395929091859190830182828015611db457602002820191906000526020600020905b815481526020019060010190808311611da0575b50505050509250945094509450945094509091929394565b600080732330058d49fa61d5c5405fa8b17fcd823c59f7bb63f0a5702f735f4ec3df9cbd43714fe2740f5e3616155c5b8419611e06611ebc565b6001600160401b03166040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050604080518083038186803b158015611e5b57600080fd5b505afa158015611e6f573d6000803e3d6000fd5b505050506040513d6040811015611e8557600080fd5b50805160209091015190925090506001611e9d6124b0565b6004811115611ea857fe5b1415611eb857611eb88282612a2f565b5050565b600954600090600160401b90046001600160401b031615611ef05750600954600160401b90046001600160401b0316610d07565b600854610d0490611f1290600160401b90046001600160401b03166002613343565b6008546001600160401b03169063ffffffff61252316565b73e210330d6768030e816d223836335079c7a0c8516001600160a01b03166335f628ee6040518163ffffffff1660e01b815260040160206040518083038186803b158015611f7757600080fd5b505afa158015611f8b573d6000803e3d6000fd5b505050506040513d6020811015611fa157600080fd5b5051158015611fb1575060038211155b8015611fbe575060058111155b611fc757600080fd5b6008546001600160401b03164210801590611fe95750611fe56129a6565b4211155b611ff257600080fd5b60006001600160a01b038516600080516020613739833981519152141561204b5734841461201f57600080fd5b61202d600a8561271061339f565b600254909150612043908263ffffffff61252316565b600255612294565b341561205657600080fd5b6001600160a01b0385166000805160206136f883398151915214156121085760408051600160e11b630aed65f50281526000805160206136f883398151915260048201523360248201523060448201526064810186905290517312d7053efc680ba6671f8cb96d1421d906ce3de2916315dacbea91608480830192600092919082900301818387803b1580156120eb57600080fd5b505af11580156120ff573d6000803e3d6000fd5b5050505061226c565b7312d7053efc680ba6671f8cb96d1421d906ce3de26001600160a01b0316634a5245b46040518163ffffffff1660e01b815260040160206040518083038186803b15801561215557600080fd5b505afa158015612169573d6000803e3d6000fd5b505050506040513d602081101561217f57600080fd5b50516001600160a01b0386811691161461219857600080fd5b600582146121a557600080fd5b336000908152600a6020526040902054610100900460ff16156121c757600080fd5b336000818152600a6020526040808220805461ff0019166101001790558051600160e01b631371b2bd028152600481019390935230602484015260448301879052517312d7053efc680ba6671f8cb96d1421d906ce3de292631371b2bd92606480830193919282900301818387803b15801561224257600080fd5b505af1158015612256573d6000803e3d6000fd5b505050506000805160206136f883398151915294505b61227a60058561271061339f565b600354909150612290908263ffffffff61252316565b6003555b6122a4848263ffffffff6129cf16565b90506000806122b58584868a613025565b9150915080156122de57336000908152600a60205260409020805462ff00001916620100001790555b600082116122eb57600080fd5b6122f885848987866133bd565b60408051600160e11b6348d979c702815233600482015260248101889052604481018490526001600160a01b03891660648201526084810187905260a48101869052905173e210330d6768030e816d223836335079c7a0c851916391b2f38e9160c480830192600092919082900301818387803b15801561237857600080fd5b505af115801561238c573d6000803e3d6000fd5b5050505050505050505050565b6008546001600160401b0380821691600160401b8104821691600160801b8204811691600160c01b90041684565b60008060015b6003811161245a576000818152600b60209081526040808320600080516020613739833981519152845260010190915290205461241190849063ffffffff61252316565b6000828152600b602090815260408083206000805160206136f8833981519152845260010190915290205490935061245090839063ffffffff61252316565b91506001016123cd565b509091565b600160ca1b661155120bd554d10281565b600b6020526000908152604090205481565b6001600160a01b0382166000908152600a602090815260408083208484526001019091529020545b92915050565b60008060075460ff1660048111156124c457fe5b1480156124d857506124d46129a6565b4210155b156124e557506001610d07565b600460075460ff1660048111156124f857fe5b14801561250c5750612508610cc6565b4211155b1561251957506002610d07565b5060075460ff1690565b6000828201838110156125805760408051600160e51b62461bcd02815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b60606000806000732330058d49fa61d5c5405fa8b17fcd823c59f7bb6001600160a01b031663bfed95b86040518163ffffffff1660e01b815260040160806040518083038186803b1580156125db57600080fd5b505afa1580156125ef573d6000803e3d6000fd5b505050506040513d608081101561260557600080fd5b50602090810151604080516002808252606082018352929450928301908038833901905050935060015b6003811161272b576001600160a01b0386166000908152600a6020908152604080832084845260010190915290205461266f90859063ffffffff61252316565b6000828152600b602052604090205490945061269290849063ffffffff61252316565b92506126c3856000815181106126a457fe5b60200260200101518783856000805160206136f88339815191526135d5565b856000815181106126d057fe5b60200260200101818152505061270b856001815181106126ec57fe5b60200260200101518783856000805160206137398339815191526135d5565b8560018151811061271857fe5b602090810291909101015260010161262f565b50509193909250565b600061258061274e8360055461283e90919063ffffffff16565b849063ffffffff61334316565b60606000805b8351811015612835576009546001600160401b03166000908152600b6020526040902054600680546127ee92916127e2918590811061279c57fe5b60009182526020808320909101546001600160a01b038b168352600a825260408084206009546001600160401b031685526001019092529120549063ffffffff61334316565b9063ffffffff61283e16565b91506128168285838151811061280057fe5b602002602001015161252390919063ffffffff16565b84828151811061282257fe5b6020908102919091010152600101612761565b50919392505050565b60008082116128975760408051600160e51b62461bcd02815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b60008284816128a257fe5b04949350505050565b80156129a1576001600160a01b038316600080516020613739833981519152141561290c576040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015612906573d6000803e3d6000fd5b506129a1565b826001600160a01b031663a9059cbb83836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561296c57600080fd5b505af1158015612980573d6000803e3d6000fd5b505050506040513d602081101561299657600080fd5b50516129a157600080fd5b505050565b600854600090610d04906001600160401b0380821691600160401b90041663ffffffff61252316565b600082821115612a295760408051600160e51b62461bcd02815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b612a37611ebc565b6001600160401b0316421015612a975760408051600160e51b62461bcd02815260206004820152601060248201527f54696d65206e6f74207265616368656400000000000000000000000000000000604482015290519081900360640190fd5b60008211612aef5760408051600160e51b62461bcd02815260206004820152601e60248201527f76616c75652073686f756c642062652067726561746572207468616e20300000604482015290519081900360640190fd5b6000732330058d49fa61d5c5405fa8b17fcd823c59f7bb6001600160a01b031663bfed95b86040518163ffffffff1660e01b815260040160806040518083038186803b158015612b3e57600080fd5b505afa158015612b52573d6000803e3d6000fd5b505050506040513d6080811015612b6857600080fd5b50602001519050600360075460ff166004811115612b8257fe5b14612bb657600980546fffffffffffffffff00000000000000001916600160401b426001600160401b031602179055612bd0565b600980546fffffffffffffffff0000000000000000191690555b6007805460ff191660041790556008546001600160401b03600160801b90910416831015612c11576009805467ffffffffffffffff19166001179055612c59565b600854600160c01b90046001600160401b0316831115612c44576009805467ffffffffffffffff19166003179055612c59565b6009805467ffffffffffffffff191660021790555b604080516002808252606080830184529260208301908038833950506009546001600160401b03166000908152600b60209081526040808320600080516020613739833981519152845260010190915290205491925050151580612cf257506009546001600160401b03166000908152600b602090815260408083206000805160206136f8833981519152845260010190915290205415155b15612dff5760015b60038111612de5576009546001600160401b03168114612ddd576000818152600b602090815260408083206000805160206136f88339815191528452600201909152812054612d4c908590606461339f565b9050612d5f818460008151811061280057fe5b83600081518110612d6c57fe5b6020908102919091018101919091526000838152600b8252604080822060008051602061373983398151915283526002019092522054612daf908590606461339f565b9050612dc2818460018151811061280057fe5b83600181518110612dcf57fe5b602002602001018181525050505b600101612cfa565b508051612df9906006906020840190613692565b50612ebb565b60015b60038111612eb9576000818152600b602090815260408083206000805160206136f88339815191528452600201909152812054612e42908590606461339f565b600454909150612e58908263ffffffff61252316565b6004556000828152600b602090815260408083206000805160206137398339815191528452600201909152902054612e93908590606461339f565b600154909150612ea9908263ffffffff61252316565b6001908155919091019050612e02565b505b612efe60008051602061373983398151915273e210330d6768030e816d223836335079c7a0c851612ef960025460015461252390919063ffffffff16565b6128ab565b612f3c6000805160206136f883398151915273e210330d6768030e816d223836335079c7a0c851612ef960035460045461252390919063ffffffff16565b60006002819055600355600954604051600160e01b63a99f50dd0281526001600160401b03909116602482018190526044820186905260648201859052608060048301908152600680546084850181905273e210330d6768030e816d223836335079c7a0c8519463a99f50dd9492938a928a92829160a49091019087908015612fe457602002820191906000526020600020905b815481526020019060010190808311612fd0575b505095505050505050600060405180830381600087803b15801561300757600080fd5b505af115801561301b573d6000803e3d6000fd5b5050505050505050565b60408051600b808252610180820190925260009182916060916020820161016080388339019050509050868160008151811061305d57fe5b60209081029190910101526008548151600160801b9091046001600160401b0316908290600190811061308c57fe5b60209081029190910101526008548151600160c01b9091046001600160401b031690829060029081106130bb57fe5b602090810291909101015260085481516001600160401b0390911690829060039081106130e457fe5b6020026020010181815250506130f86129a6565b8160048151811061310557fe5b6020026020010181815250506131196123c7565b8260058151811061312657fe5b602002602001018360068151811061313a57fe5b602090810291909101810192909252919091526000888152600b825260408082206000805160206137398339815191528352600101909252205481518290600790811061318357fe5b6020908102919091018101919091526000888152600b825260408082206000805160206136f8833981519152835260010190925220548151829060089081106131c857fe5b60200260200101818152505085816009815181106131e257fe5b6020026020010181815250508481600a815181106131fc57fe5b602090810291909101810191909152336000908152600a909152604081205462010000900460ff1661322c575060015b604051600160e01b6398d57d210281526001600160a01b03861660248201523360448201819052735f4ec3df9cbd43714fe2740f5e3616155c5b841960648301819052831515608484015260a060048401908152855160a48501528551732330058d49fa61d5c5405fa8b17fcd823c59f7bb946398d57d219488948c9491939092899291829160c401906020808a01910280838360005b838110156132db5781810151838201526020016132c3565b505050509050019650505050505050604080518083038186803b15801561330157600080fd5b505afa158015613315573d6000803e3d6000fd5b505050506040513d604081101561332b57600080fd5b50805160209091015190999098509650505050505050565b600082613352575060006124aa565b8282028284828161335f57fe5b041461258057604051600160e51b62461bcd0281526004018080602001828103825260218152602001806137186021913960400191505060405180910390fd5b60006133b5826127e2868663ffffffff61334316565b949350505050565b336000908152600a602090815260408083208884526001019091529020546133eb908263ffffffff61252316565b336000908152600a60209081526040808320898452600181018352818420949094556001600160a01b0387168352600290930181528282208883529052205461343a908563ffffffff61252316565b336000908152600a602090815260408083206001600160a01b038816845260020182528083208984529091529020556134b761347c858463ffffffff61334316565b336000908152600a602090815260408083206001600160a01b038916845260030182528083208a84529091529020549063ffffffff61252316565b336000908152600a602090815260408083206001600160a01b03881684526003018252808320898452825280832093909355600b905220546134ff908263ffffffff61252316565b6000868152600b602090815260408083209384556001600160a01b0387168352600190930190522054613538908563ffffffff61252316565b6000868152600b602090815260408083206001600160a01b03881684526001019091529020556135a3613571858463ffffffff61334316565b6000878152600b602090815260408083206001600160a01b03891684526002019091529020549063ffffffff61252316565b6000958652600b602090815260408088206001600160a01b039096168852600290950190529290942091909155505050565b6009546000906001600160401b03168414156135f057600092505b6001600160a01b038086166000908152600a60209081526040808320938616835260039093018152828220878352905290812054613631908590606461339f565b6001600160a01b038088166000908152600a60209081526040808320938816835260029093018152828220898352905220549091506136879061367a908363ffffffff6129cf16565b889063ffffffff61252316565b979650505050505050565b8280548282559060005260206000209081019282156136cd579160200282015b828111156136cd5782518255916020019190600101906136b2565b506136d99291506136dd565b5090565b610d0791905b808211156136d957600081556001016136e356fe00000000000000000000000072f020f8f3e8fd9382705723cd26380f8d0c66bb536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeea165627a7a7230582098b1283931390455f5ca6bbff29e5ac85cfb8e6742ea874b10dd55d8636d9e4c0029
Deployed Bytecode Sourcemap
24313:27077:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46077:1061;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46077:1061:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46077:1061:0;-1:-1:-1;;;;;46077:1061:0;;:::i;:::-;;;;;;;;;;-1:-1:-1;;;;;46077:1061:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;46077:1061:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;46077:1061:0;;;;;;;;;;;;;;;;;;;;;37748:424;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37748:424:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;37748:424:0;;;;;;;;:::i;:::-;;40515:148;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40515:148:0;;;:::i;:::-;;;;;;;;;;;;;;;;38401:755;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38401:755:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38401:755:0;-1:-1:-1;;;;;38401:755:0;;:::i;40801:151::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40801:151:0;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40801:151:0;;;;;;;;;;;;;;43582:1225;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43582:1225:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;43582:1225:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;43582:1225:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;43582:1225:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;43582:1225:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;43582:1225:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31234:282;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31234:282:0;;;:::i;41740:608::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41740:608:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41740:608:0;;:::i;26938:616::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;26938:616:0;;;;;;;;;;;;;;;;;;;;;;;;:::i;36387:815::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36387:815:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;36387:815:0;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;36387:815:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;36387:815:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;36387:815:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;36387:815:0;;;;;;;;-1:-1:-1;36387:815:0;;-1:-1:-1;;21:11;5:28;;2:2;;;46:1;43;36:12;2:2;36387:815:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;36387:815:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;36387:815:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;36387:815:0;;;;;;;;-1:-1:-1;36387:815:0;;-1:-1:-1;;21:11;5:28;;2:2;;;46:1;43;36:12;2:2;36387:815:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;36387:815:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;36387:815:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;36387:815:0;;-1:-1:-1;36387:815:0;;-1:-1:-1;;;;;36387:815:0:i;37398:342::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37398:342:0;;;;;;;;;:::i;26472:40::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26472:40:0;;;:::i;:::-;;;;-1:-1:-1;;;;;26472:40:0;;;;;;;;;;;;;;;;;;;;;;;;47353:165;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47353:165:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47353:165:0;-1:-1:-1;;;;;47353:165:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;41312:251;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41312:251:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41312:251:0;;;;;;;;;;;;:::i;45307:393::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45307:393:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;33010:276:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33010:276:0;;;:::i;39852:245::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39852:245:0;;;:::i;:::-;;;;-1:-1:-1;;;;;39852:245:0;;;;;;;;;;;;;;27987:1906;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;27987:1906:0;;;;;;;;;;;;;;;;;;:::i;26437:28::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26437:28:0;;;:::i;:::-;;;;-1:-1:-1;;;;;26437:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30904:322;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30904:322:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;25559:50;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25559:50:0;;;:::i;26576:45::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26576:45:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26576:45:0;;:::i;42501:161::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42501:161:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;42501:161:0;;;;;;;;:::i;46077:1061::-;46131:26;46159:34;46195:14;46211:23;46245:17;46264:18;46286:22;:20;:22::i;:::-;46244:64;;-1:-1:-1;46244:64:0;-1:-1:-1;46338:24:0;46320:14;:12;:14::i;:::-;:42;;;;;;;;;;:75;;;-1:-1:-1;46366:25:0;:9;46380:10;46366:25;:13;:25;:::i;:::-;:29;46320:75;46317:167;;;-1:-1:-1;;46459:14:0;;;;;-1:-1:-1;;;;;46459:14:0;;-1:-1:-1;46407:67:0;;46317:167;46512:16;;;46526:1;46512:16;;;;;;;;;;;;;;;105:10:-1;46512:16:0;88:34:-1;136:17;;-1:-1;46512:16:0;46492:36;;-1:-1:-1;;;;;;;;;;;46537:17:0;46555:1;46537:20;;;;;;;;;;;;;:32;-1:-1:-1;;;;;46537:32:0;;;-1:-1:-1;;;;;46537:32:0;;;;;-1:-1:-1;;;;;;;;;;;46578:17:0;46596:1;46578:20;;;;;;;;-1:-1:-1;;;;;46578:34:0;;;:20;;;;;;;;;;;:34;46623;;46782:27;46803:5;46782:20;:27::i;:::-;46713:96;;-1:-1:-1;46713:96:0;-1:-1:-1;46713:96:0;-1:-1:-1;46830:72:0;46713:96;;46830:20;:72::i;:::-;-1:-1:-1;;;;;46914:15:0;;46981:1;46914:15;;;:8;:15;;;;;;;;46947:16;:30;-1:-1:-1;;;;;46947:30:0;46914:64;;:32;;:64;;;;;;46818:84;;-1:-1:-1;46914:68:0;46911:144;;47010:35;47025:5;47032:12;47010:14;:35::i;:::-;46995:50;;46911:144;-1:-1:-1;;47115:14:0;;;;;-1:-1:-1;;;;;47115:14:0;;-1:-1:-1;;;46077:1061:0;;;;;;:::o;37748:424::-;37833:47;;;-1:-1:-1;;;;;37833:47:0;;37869:10;37833:47;;;;;;25053:42;;37833:35;;:47;;;;;;;;;;;;;;25053:42;37833:47;;;5:2:-1;;;;30:1;27;20:12;5:2;37833:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37833:47:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37833:47:0;37825:56;;;;;;37916:29;37898:14;:12;:14::i;:::-;:47;;;;;;;;;;37890:56;;;;;;37989:1;37963:14;;;;-1:-1:-1;;;;;37963:14:0;:28;37955:58;;;;;-1:-1:-1;;;;;37955:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;38022:14;:23;;-1:-1:-1;;;;;;38022:23:0;;-1:-1:-1;;;;;38022:23:0;;;;;;;;;;;38054:21;:30;;;38093:71;;;-1:-1:-1;;;;;38093:71:0;;;;;;;;;38130:10;38093:71;;;;38150:4;38093:71;;;;;;;;;;;25164:42;;38093:28;;:71;;;;;;;;;;;38022:14;25164:42;38093:71;;;5:2:-1;;;;30:1;27;20:12;5:2;38093:71:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38093:71:0;;;;37748:424;;:::o;40515:148::-;40622:10;:25;40565:7;;40590:65;;40622:32;;-1:-1:-1;;;40622:25:0;;-1:-1:-1;;;;;40622:25:0;40652:1;40622:29;:32::i;:::-;40590:16;:27;-1:-1:-1;;;40590:27:0;;-1:-1:-1;;;;;40590:27:0;;:31;:65::i;:::-;40583:72;;40515:148;;:::o;38401:755::-;38460:7;38483:16;;;;;:62;;-1:-1:-1;38521:24:0;38503:14;:12;:14::i;:::-;:42;;;;;;;;;;38483:62;:103;;;;25053:42;-1:-1:-1;;;;;38549:35:0;;:37;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38549:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38549:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38549:37:0;38483:103;38480:137;;;-1:-1:-1;38606:1:0;38599:8;;38480:137;-1:-1:-1;;;;;38628:15:0;;;;;;:8;:15;;;;;:29;;;38625:63;;;-1:-1:-1;38677:1:0;38670:8;;38625:63;-1:-1:-1;;;;;38696:15:0;;;;;;:8;:15;;;;;:36;;-1:-1:-1;;38696:36:0;38728:4;38696:36;;;38742:27;;;;38828:16;38705:5;38828:9;:16::i;:::-;38741:103;;;;;;;38853:50;-1:-1:-1;;;;;;;;;;;38879:5:0;38886:13;38900:1;38886:16;;;;;;;;;;;;;;38853:14;:50::i;:::-;38912:52;-1:-1:-1;;;;;;;;;;;38940:5:0;38947:13;38961:1;38947:16;;;;;;;38912:52;38988:14;;38973:49;;38988:14;;;-1:-1:-1;;;;;38988:14:0;39004:5;39011:10;38973:14;:49::i;:::-;25053:42;-1:-1:-1;;;;;39031:31:0;;39063:5;39070:13;39085:17;39104:10;39116:14;;;;;;;;;-1:-1:-1;;;;;39116:14:0;39031:100;;;;;;;;;;;;;-1:-1:-1;;;;;39031:100:0;-1:-1:-1;;;;;39031:100:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39031:100:0;-1:-1:-1;;;;;39031:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;39031:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;39031:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39031:100:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39031:100:0;;;;39147:1;39140:8;;;;;38401:755;;;;:::o;40801:151::-;25355:1;-1:-1:-1;;;;;24866:42:0;40801:151;;;:::o;43582:1225::-;43924:10;:25;-1:-1:-1;;;;;43881:14:0;43654:22;;;;;;;;;;-1:-1:-1;;;43924:25:0;;-1:-1:-1;;;;;43924:25:0;43630:23;;43973:18;:16;:18::i;:::-;43960:31;;44027:14;:12;:14::i;:::-;44022:20;;;;;;;;44064:24;;;25392:1;44064:24;;;;;;;;;44002:40;;-1:-1:-1;44064:24:0;;;17:15:-1;;105:10;44064:24:0;88:34:-1;-1:-1;;44113:10:0;:26;44099:11;;;;-1:-1:-1;;;;44113:26:0;;-1:-1:-1;;;;;44113:26:0;;44099:11;;-1:-1:-1;44108:1:0;;44099:11;;;;;;;;;;;;;;;:40;44164:10;:26;:33;;-1:-1:-1;;;44164:26:0;;-1:-1:-1;;;;;44164:26:0;44195:1;44164:30;:33::i;:::-;44150:8;44159:1;44150:11;;;;;;;;;;;;;;;;;:47;44219:24;;;25392:1;44219:24;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;-1:-1;;44268:10:0;:26;44208:35;;-1:-1:-1;44268:33:0;;-1:-1:-1;;;44268:26:0;;-1:-1:-1;;;;;44268:26:0;;-1:-1:-1;44299:1:0;44268:30;:33::i;:::-;44254:8;44263:1;44254:11;;;;;;;;;;;;;;;;;:47;44326:10;:26;44312:11;;-1:-1:-1;;;44326:26:0;;;-1:-1:-1;;;;;44326:26:0;;44312:11;;44321:1;;44312:11;;;;;;;;;;;:40;;;;;44386:1;44377:11;44363:8;44372:1;44363:11;;;;;;;;;;;;;;;;;:25;44424:24;;;25392:1;44424:24;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;-1:-1;;44472:24:0;;;25392:1;44472:24;;;;;;;;;44409:39;;-1:-1:-1;25392:1:0;-1:-1:-1;44472:24:0;;;17:15:-1;;105:10;44472:24:0;88:34:-1;-1:-1;;44521:24:0;;;25392:1;44521:24;;;;;;;;;44459:37;;-1:-1:-1;25392:1:0;-1:-1:-1;44521:24:0;;;17:15:-1;;105:10;44521:24:0;88:34:-1;136:17;;-1:-1;;44507:38:0;-1:-1:-1;44561:6:0;44556:244;25392:1;44573;:16;44556:244;;;44642:1;44640:3;;;44623:21;;;;:16;:21;;;;;;;;-1:-1:-1;;;;;;;;;;;44623:46:0;;:33;;;:46;;;;44607:13;;:10;;44640:1;;44607:13;;;;;;;;;;;;;;;;:62;;;;44716:1;44714:3;;;44697:21;;;;:16;:21;;;;;;-1:-1:-1;;;;;;;;;;;44697:44:0;;:33;;;:44;;;;;;44680:14;;:11;;44714:1;;44680:14;;;;;;;;;;;:61;;;;;44770:19;44785:1;44787;44785:3;44770:14;:19::i;:::-;44752:12;44765:1;44752:15;;;;;;;;;;;;;;;;;:37;44591:3;;44556:244;;;;43582:1225;;;;;;;;;:::o;31234:282::-;31291:7;31310:17;31329:18;31351:22;:20;:22::i;:::-;31398:69;;;-1:-1:-1;;;;;31398:69:0;;-1:-1:-1;;;;;;;;;;;31398:69:0;;;;;;;;;;;;31309:64;;-1:-1:-1;31309:64:0;;-1:-1:-1;25269:42:0;;31398:45;;:69;;;;;;;;;;;;25269:42;31398:69;;;5:2:-1;;;;30:1;27;20:12;5:2;31398:69:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31398:69:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31398:69:0;;;;-1:-1:-1;31483:25:0;:10;31398:69;31483:25;:14;:25;:::i;:::-;31476:32;;;;31234:282;:::o;41740:608::-;41840:13;;;41851:1;41840:13;;;;;;;;;41802:4;;41817:20;;41840:13;;;;17:15:-1;;105:10;41840:13:0;88:34:-1;136:17;;-1:-1;41840:13:0;41817:36;;41874:11;41862:6;41869:1;41862:9;;;;;;;;;;;;;;;;;:23;41906:10;:26;41894:9;;-1:-1:-1;;;41906:26:0;;;-1:-1:-1;;;;;41906:26:0;;41894:9;;41901:1;;41894:9;;;;;;;;;;;;;;;:38;41953:10;:26;41941:9;;-1:-1:-1;;;41953:26:0;;;-1:-1:-1;;;;;41953:26:0;;41941:9;;41948:1;;41941:9;;;;;;;;;;;;;;;:38;42000:10;:20;41988:9;;-1:-1:-1;;;;;42000:20:0;;;;41988:6;;41995:1;;41988:9;;;;;;;;;;;:32;;;;;42041:18;:16;:18::i;:::-;42029:6;42036:1;42029:9;;;;;;;;;;;;;:30;;;;;42093:22;:20;:22::i;:::-;42069:6;42076:1;42069:9;;;;;;;;;;;;;42080:6;42087:1;42080:9;;;;;;;;;;;;;;;;;;42068:47;;;;;;;;42136:29;;;;:16;:29;;;;;;-1:-1:-1;;;;;;;;;;;42136:54:0;;:41;;:54;;;;;42124:9;;:6;;42131:1;;42124:9;;;;;;;;;;;;;;;;:66;;;;42211:29;;;;:16;:29;;;;;;-1:-1:-1;;;;;;;;;;;42211:52:0;;:41;;:52;;;;;42199:9;;:6;;42206:1;;42199:9;;;;;;;;;;;;;;;;:64;;;;42279:61;;;-1:-1:-1;;;;;42279:61:0;;24866:42;42279:61;;;;;;;;;;;;;;;;;;;;25269:42;;42279:34;;42314:6;;42279:61;;;;;;;;;;;;;;;;;-1:-1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;42279:61:0;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42279:61:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42279:61:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42279:61:0;;41740:608;-1:-1:-1;;;41740:608:0:o;26938:616::-;27059:30;27142:4;27059:91;;27181:5;-1:-1:-1;;;;;27181:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27181:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27181:18:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27181:18:0;-1:-1:-1;;;;;27167:32:0;:10;:32;27159:70;;;;;-1:-1:-1;;;;;27159:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;27246:10;:20;-1:-1:-1;;;;;27246:20:0;:25;27238:57;;;;;-1:-1:-1;;;;;27238:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;27346:3;27312:31;-1:-1:-1;;;;;27312:14:0;;;;:31;;;:14;:31;:::i;:::-;:37;27304:46;;;;;;-1:-1:-1;27359:10:0;:33;;-1:-1:-1;;27359:33:0;-1:-1:-1;;;;;27359:33:0;;;;-1:-1:-1;;27401:43:0;-1:-1:-1;;;27401:43:0;;;;;;;;;;;-1:-1:-1;;27461:38:0;-1:-1:-1;;;27461:38:0;;;;;;;;;;;-1:-1:-1;;;;;27508:38:0;-1:-1:-1;;;27508:38:0;;;;;;;;;;;26938:616::o;36387:815::-;36570:1;36540:27;:25;:27::i;:::-;:31;36532:60;;;;;-1:-1:-1;;;;;36532:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;36627:24;36609:14;:12;:14::i;:::-;:42;;;;;;;;;36601:51;;;;;;36661:21;25269:42;-1:-1:-1;;;;;36686:40:0;;:42;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36686:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36686:42:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36686:42:0;36737:94;;;-1:-1:-1;;;;;36737:94:0;;-1:-1:-1;;;;;;;;;;;36737:94:0;;;;36777:10;36737:94;;;;25053:42;36737:94;;;;;;;;;;;;36686:42;;-1:-1:-1;25164:42:0;;36737:28;;:94;;;;;-1:-1:-1;;36737:94:0;;;;;;;;-1:-1:-1;25164:42:0;36737:94;;;5:2:-1;;;;30:1;27;20:12;5:2;36737:94:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36737:94:0;;;;36859:4;36840:16;;:23;;;;;;;;;;;;;;;;;;25053:42;-1:-1:-1;;;;;36872:39:0;;36912:13;36927:11;36940:12;36973:4;36980:13;36954:40;;;;;;-1:-1:-1;;;;;36954:40:0;-1:-1:-1;;;;;36954:40:0;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;36954:40:0;;;36996:16;37014:10;37026:15;;37043:17;;37062:13;36872:204;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36872:204:0;-1:-1:-1;;;;;36872:204:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;36872:204:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36872:204:0;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;36872:204:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36872:204:0;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;36872:204:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36872:204:0;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;36872:204:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36872:204:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;37085:22:0;37092:15;37085:22;;;37123:17;37116:24;-1:-1:-1;;37149:16:0;:45;;-1:-1:-1;;37149:45:0;37168:26;37149:45;;;-1:-1:-1;;;;;36387:815:0:o;37398:342::-;37492:10;25053:42;37492:37;:85;;;;-1:-1:-1;37551:26:0;37533:14;:12;:14::i;:::-;:44;;;;;;;;;37492:85;37484:94;;;;;;37590:8;37587:61;;;37611:27;37623:11;37636:1;37611:11;:27::i;:::-;-1:-1:-1;;37675:5:0;37656:24;;-1:-1:-1;;37656:24:0;;;;;;37689:16;:43;;;;;37708:24;37689:43;;;37398:342::o;26472:40::-;;;-1:-1:-1;;;;;26472:40:0;;;;-1:-1:-1;;;26472:40:0;;;;:::o;47353:165::-;-1:-1:-1;;;;;47441:15:0;47412:4;47441:15;;;:8;:15;;;;;:33;;;;;;;;;47476;;;;;47353:165::o;41312:251::-;41422:21;41476:79;41501:11;41514:16;41532:9;-1:-1:-1;;;;;;;;;;;41476:24:0;:79::i;:::-;-1:-1:-1;41453:102:0;41312:251;-1:-1:-1;;;;41312:251:0:o;45307:393::-;45426:16;:30;-1:-1:-1;;;;;45426:30:0;45355:7;45458:48;;;:16;:48;;;;;;;;:65;;-1:-1:-1;;;;;;;;;;;45545:73:0;;45426:30;45545:60;;;:73;;;;;;-1:-1:-1;;;;;;;;;;;45620:71:0;;;;;;45525:18;45418:274;;;;;;;;;;;;;;;;;45355:7;;;;45373:16;;45355:7;;;;45426:30;;45458:65;;45620:71;45418:274;;45525:18;;45418:274;;;45525:18;45418:274;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45307:393;;;;;:::o;33010:276::-;33053:14;;25269:42;33089:31;24866:42;33148:18;:16;:18::i;:::-;-1:-1:-1;;;;;33140:27:0;33089:79;;;;;;;;;;;;;-1:-1:-1;;;;;33089:79:0;-1:-1:-1;;;;;33089:79:0;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33089:79:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33089:79:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33089:79:0;;;;;;;;;-1:-1:-1;33089:79:0;-1:-1:-1;33198:29:0;33180:14;:12;:14::i;:::-;:47;;;;;;;;;33177:102;;;33240:29;33252:6;33260:8;33240:11;:29::i;:::-;33010:276;;:::o;39852:245::-;39920:16;:27;39900:6;;-1:-1:-1;;;39920:27:0;;-1:-1:-1;;;;;39920:27:0;:31;39917:91;;-1:-1:-1;39971:16:0;:27;-1:-1:-1;;;39971:27:0;;-1:-1:-1;;;;;39971:27:0;39964:34;;39917:91;40055:10;:25;40030:58;;40055:32;;-1:-1:-1;;;40055:25:0;;-1:-1:-1;;;;;40055:25:0;40085:1;40055:29;:32::i;:::-;40030:10;:20;-1:-1:-1;;;;;40030:20:0;;:58;:24;:58;:::i;27987:1906::-;25053:42;-1:-1:-1;;;;;28126:35:0;;:37;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28126:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28126:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28126:37:0;28125:38;:69;;;;;25392:1;28167:11;:27;;28125:69;:98;;;;;25429:1;28198:9;:25;;28125:98;28117:107;;;;;;28248:10;:20;-1:-1:-1;;;;;28248:20:0;28241:3;:27;;;;:56;;;28279:18;:16;:18::i;:::-;28272:3;:25;;28241:56;28233:65;;;;;;28309:24;-1:-1:-1;;;;;28345:21:0;;-1:-1:-1;;;;;;;;;;;28345:21:0;28342:973;;;28407:9;28387:16;:29;28379:38;;;;;;28447:64;25471:2;28487:16;28505:5;28447:20;:64::i;:::-;28544:19;;28428:83;;-1:-1:-1;28544:41:0;;28428:83;28544:41;:23;:41;:::i;:::-;28522:19;:63;28342:973;;;28620:9;:14;28612:23;;;;;;-1:-1:-1;;;;;28650:19:0;;-1:-1:-1;;;;;;;;;;;28650:19:0;28646:489;;;28683:84;;;-1:-1:-1;;;;;28683:84:0;;-1:-1:-1;;;;;;;;;;;28683:84:0;;;;28723:10;28683:84;;;;28743:4;28683:84;;;;;;;;;;;;25164:42;;28683:28;;:84;;;;;-1:-1:-1;;28683:84:0;;;;;;;-1:-1:-1;25164:42:0;28683:84;;;5:2:-1;;;;30:1;27;20:12;5:2;28683:84:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28683:84:0;;;;28646:489;;;25164:42;-1:-1:-1;;;;;28816:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28816:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28816:27:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28816:27:0;-1:-1:-1;;;;;28806:37:0;;;;;;28798:46;;;;;;25429:1;28865:9;:25;28857:34;;;;;;28922:10;28913:20;;;;:8;:20;;;;;:38;;;;;;28912:39;28904:48;;;;;;28974:10;28965:20;;;;:8;:20;;;;;;:45;;-1:-1:-1;;28965:45:0;;;;;29023:69;;-1:-1:-1;;;;;29023:69:0;;;;;;;;;29068:4;29023:69;;;;;;;;;;;25164:42;;29023:24;;:69;;;;;28965:20;;29023:69;;;;;28965:20;25164:42;29023:69;;;5:2:-1;;;;30:1;27;20:12;5:2;29023:69:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29023:69:0;;;;-1:-1:-1;;;;;;;;;;;29105:18:0;;28646:489;29164:65;25533:1;29205:16;29223:5;29164:20;:65::i;:::-;29263:20;;29145:84;;-1:-1:-1;29263:42:0;;29145:84;29263:42;:24;:42;:::i;:::-;29240:20;:65;28342:973;29342:38;:16;29363;29342:38;:20;:38;:::i;:::-;29323:57;;29394:21;29417:24;29445:74;29470:11;29483:16;29501:9;29512:6;29445:24;:74::i;:::-;29393:126;;;;29531:19;29528:91;;;29572:10;29563:20;;;;:8;:20;;;;;:45;;-1:-1:-1;;29563:45:0;;;;;29528:91;29654:1;29635:16;:20;29627:29;;;;;;29667:88;29688:11;29701:16;29719:6;29727:9;29738:16;29667:20;:88::i;:::-;29764:121;;;-1:-1:-1;;;;;29764:121:0;;29807:10;29764:121;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29764:121:0;;;;;;;;;;;;;;;;;;;;25053:42;;29764;;:121;;;;;-1:-1:-1;;29764:121:0;;;;;;;-1:-1:-1;25053:42:0;29764:121;;;5:2:-1;;;;30:1;27;20:12;5:2;29764:121:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29764:121:0;;;;27987:1906;;;;;;;:::o;26437:28::-;;;-1:-1:-1;;;;;26437:28:0;;;;-1:-1:-1;;;26437:28:0;;;;;-1:-1:-1;;;26437:28:0;;;;;-1:-1:-1;;;26437:28:0;;;;:::o;30904:322::-;30956:17;;31020:1;31004:215;25392:1;31023;:16;31004:215;;31082:19;;;;:16;:19;;;;;;;;-1:-1:-1;;;;;;;;;;;31082:44:0;;:31;;:44;;;;;;31068:59;;:9;;:59;:13;:59;:::i;:::-;31166:19;;;;:16;:19;;;;;;;;-1:-1:-1;;;;;;;;;;;31166:42:0;;:31;;:42;;;;;;31056:71;;-1:-1:-1;31151:58:0;;:10;;:58;:14;:58;:::i;:::-;31138:71;-1:-1:-1;31040:3:0;;31004:215;;;;30904:322;;:::o;25559:50::-;-1:-1:-1;;;;;25559:50:0;:::o;26576:45::-;;;;;;;;;;;;;:::o;42501:161::-;-1:-1:-1;;;;;42613:15:0;;42588:7;42613:15;;;:8;:15;;;;;;;;:41;;;:32;;:41;;;;;;42501:161;;;;;:::o;51004:381::-;51050:16;;51079;;;;:41;;;;;;;;;:70;;;;;51131:18;:16;:18::i;:::-;51124:3;:25;;51079:70;51076:270;;;-1:-1:-1;51169:29:0;51162:36;;51076:270;51237:24;51217:16;;;;:44;;;;;;;;;:75;;;;;51272:20;:18;:20::i;:::-;51265:3;:27;;51217:75;51214:132;;;-1:-1:-1;51312:24:0;51305:31;;51214:132;-1:-1:-1;51361:16:0;;;;51004:381;:::o;930:181::-;988:7;1020:5;;;1044:6;;;;1036:46;;;;;-1:-1:-1;;;;;1036:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;1102:1;930:181;-1:-1:-1;;;930:181:0:o;48690:702::-;48757:21;48780:31;48813:27;48854:19;25269:42;-1:-1:-1;;;;;48881:35:0;;:37;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48881:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48881:37:0;;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;48881:37:0;;;;;;48937:16;;48951:1;48937:16;;;48881:37;48937:16;;;;48881:37;;-1:-1:-1;48937:16:0;;;;48881:37;105:10:-1;48937:16:0;88:34:-1;136:17;;-1:-1;;48927:26:0;-1:-1:-1;48974:1:0;48962:423;25392:1;48976;:15;48962:423;;-1:-1:-1;;;;;49067:15:0;;;;;;:8;:15;;;;;;;;:35;;;:32;;:35;;;;;;49036:67;;:26;;:67;:30;:67;:::i;:::-;49166:19;;;;:16;:19;;;;;:36;49007:96;;-1:-1:-1;49139:64:0;;:22;;:64;:26;:64;:::i;:::-;49114:89;;49228:60;49240:7;49248:1;49240:10;;;;;;;;;;;;;;49252:5;49259:1;49262:14;-1:-1:-1;;;;;;;;;;;49228:11:0;:60::i;:::-;49214:7;49222:1;49214:10;;;;;;;;;;;;;:74;;;;;49313:62;49325:7;49333:1;49325:10;;;;;;;;;;;;;;49337:5;49344:1;49347:14;-1:-1:-1;;;;;;;;;;;49313:11:0;:62::i;:::-;49299:7;49307:1;49299:10;;;;;;;;;;;;;;;;;:76;48992:3;;48962:423;;;;48690:702;;;;;;:::o;49640:248::-;49760:17;49799:81;49830:49;49856:22;49830:21;;:25;;:49;;;;:::i;:::-;49799:26;;:81;:30;:81;:::i;47802:460::-;47891:13;47914:11;;47934:293;47953:12;:19;47950:1;:22;47934:293;;;48112:16;:30;-1:-1:-1;;;;;48112:30:0;48095:48;;;;:16;:48;;;;;:65;48068:18;:21;;47999:162;;48095:65;47999:91;;48087:1;;48068:21;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47999:15:0;;;;:8;:15;;;;;;48032:16;:30;-1:-1:-1;;;;;48032:30:0;47999:64;;:32;;:64;;;;;;;:91;:68;:91;:::i;:::-;:95;:162;:95;:162;:::i;:::-;47990:171;;48190:27;48210:6;48190:12;48203:1;48190:15;;;;;;;;;;;;;;:19;;:27;;;;:::i;:::-;48172:12;48185:1;48172:15;;;;;;;;;;;;;;;;;:45;47974:3;;47934:293;;;-1:-1:-1;48242:12:0;;47802:460;-1:-1:-1;;;47802:460:0:o;3289:333::-;3347:7;3446:1;3442;:5;3434:44;;;;;-1:-1:-1;;;;;3434:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;3489:9;3505:1;3501;:5;;;;;;;3289:333;-1:-1:-1;;;;3289:333:0:o;39414:310::-;39520:11;;39517:200;;-1:-1:-1;;;;;39548:21:0;;-1:-1:-1;;;;;;;;;;;39548:21:0;39545:163;;;39584:28;;-1:-1:-1;;;;;39584:19:0;;;:28;;;;;39604:7;;39584:28;;;;39604:7;39584:19;:28;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39584:28:0;39545:163;;;39658:6;-1:-1:-1;;;;;39651:23:0;;39675:10;39687:7;39651:44;;;;;;;;;;;;;-1:-1:-1;;;;;39651:44:0;-1:-1:-1;;;;;39651:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39651:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39651:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39651:44:0;39643:53;;;;;;39414:310;;;:::o;40229:134::-;40329:10;:25;40279:7;;40304:51;;-1:-1:-1;;;;;40304:20:0;;;;-1:-1:-1;;;40329:25:0;;;40304:51;:24;:51;:::i;1386:184::-;1444:7;1477:1;1472;:6;;1464:49;;;;;-1:-1:-1;;;;;1464:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1536:5:0;;;1386:184::o;33414:2436::-;33502:18;:16;:18::i;:::-;-1:-1:-1;;;;;33495:25:0;:3;:25;;33487:53;;;;;-1:-1:-1;;;;;33487:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;33566:1;33557:6;:10;33549:52;;;;;-1:-1:-1;;;;;33549:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;33610:19;25269:42;-1:-1:-1;;;;;33664:35:0;;:37;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33664:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33664:37:0;;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;33664:37:0;;;;-1:-1:-1;33733:26:0;33713:16;;;;:46;;;;;;;;;33710:174;;33772:16;:41;;-1:-1:-1;;33772:41:0;-1:-1:-1;;;33809:3:0;-1:-1:-1;;;;;33772:41:0;;;;;33710:174;;;33847:16;33840:34;;-1:-1:-1;;33840:34:0;;;33710:174;33892:16;:43;;-1:-1:-1;;33892:43:0;33911:24;33892:43;;;33956:10;:26;-1:-1:-1;;;;;;;;33956:26:0;;;;33947:35;;33944:257;;;33995:16;:34;;-1:-1:-1;;33995:34:0;34028:1;33995:34;;;33944:257;;;34057:10;:26;-1:-1:-1;;;34057:26:0;;-1:-1:-1;;;;;34057:26:0;34048:35;;34045:156;;;34096:16;:34;;-1:-1:-1;;34096:34:0;34129:1;34096:34;;;34045:156;;;34157:16;:34;;-1:-1:-1;;34157:34:0;34190:1;34157:34;;;34045:156;34237:16;;;34251:1;34237:16;;;34209:25;34237:16;;;;;34209:25;34237:16;;;;;105:10:-1;34237:16:0;88:34:-1;-1:-1;;34282:16:0;:30;-1:-1:-1;;;;;34282:30:0;34341:1;34265:48;;;:16;:48;;;;;;;;-1:-1:-1;;;;;;;;;;;34265:73:0;;34282:30;34265:60;:73;;;;;;34209:44;;-1:-1:-1;;34265:77:0;;;:165;;-1:-1:-1;34372:16:0;:30;-1:-1:-1;;;;;34372:30:0;34429:1;34355:48;;;:16;:48;;;;;;;;-1:-1:-1;;;;;;;;;;;34355:71:0;;34372:30;34355:60;:71;;;;;;:75;;34265:165;34262:1188;;;34461:1;34450:493;25392:1;34463;:17;34450:493;;34504:16;:30;-1:-1:-1;;;;;34504:30:0;34501:33;;34498:434;;34551:22;34613:19;;;:16;:19;;;;;;;;-1:-1:-1;;;;;;;;;;;34613:45:0;;:34;;:45;;;;;;34576:88;;34597:14;;34660:3;34576:20;:88::i;:::-;34551:113;;34696:34;34715:14;34696:11;34708:1;34696:14;;;;;;;:34;34679:11;34691:1;34679:14;;;;;;;;;;;;;;;;;;:51;;;;34799:19;;;;:16;:19;;;;;;-1:-1:-1;;;;;;;;;;;34799:47:0;;:34;;:47;;;;;34762:90;;34783:14;;34848:3;34762:20;:90::i;:::-;34745:107;;34884:34;34903:14;34884:11;34896:1;34884:14;;;;;;;:34;34867:11;34879:1;34867:14;;;;;;;;;;;;;:51;;;;;34498:434;;34481:3;;34450:493;;;-1:-1:-1;34953:32:0;;;;:18;;:32;;;;;:::i;:::-;;34262:1188;;;35023:1;35012:429;25392:1;35025;:17;35012:429;;35060:22;35122:19;;;:16;:19;;;;;;;;-1:-1:-1;;;;;;;;;;;35122:45:0;;:34;;:45;;;;;;35085:88;;35106:14;;35169:3;35085:20;:88::i;:::-;35206:17;;35060:113;;-1:-1:-1;35206:37:0;;35060:113;35206:37;:21;:37;:::i;:::-;35186:17;:57;35310:19;;;;:16;:19;;;;;;;;-1:-1:-1;;;;;;;;;;;35310:47:0;;:34;;:47;;;;;;35273:90;;35294:14;;35359:3;35273:20;:90::i;:::-;35394:15;;35256:107;;-1:-1:-1;35394:35:0;;35256:107;35394:35;:19;:35;:::i;:::-;35376:15;:53;;;35043:3;;;;;-1:-1:-1;35012:429:0;;;;34262:1188;35458:94;-1:-1:-1;;;;;;;;;;;25053:42:0;35511:40;35531:19;;35511:15;;:19;;:40;;;;:::i;:::-;35458:14;:94::i;:::-;35561:95;-1:-1:-1;;;;;;;;;;;25053:42:0;35612:43;35634:20;;35612:17;;:21;;:43;;;;:::i;35561:95::-;35665:26;35672:19;35665:26;;;35707:20;35700:27;35793:16;:30;35736:106;;-1:-1:-1;;;;;35736:106:0;;-1:-1:-1;;;;;35793:30:0;;;35736:106;;;;;;;;;;;;;;;;;;;;;;;;;35773:18;35736:106;;;;;;;;25053:42;;35736:36;;35773:18;;35825:6;;35833:8;;35736:106;;;;;;;35773:18;;35736:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35736:106:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35736:106:0;;;;33414:2436;;;;:::o;29901:995::-;30111:14;;;30122:2;30111:14;;;;;;;;;30030:21;;;;30088:20;;30111:14;;;17:15:-1;;105:10;30111:14:0;88:34:-1;136:17;;-1:-1;30111:14:0;30088:37;;30146:11;30134:6;30141:1;30134:9;;;;;;;;;;;;;;;;;:23;30178:10;:26;30166:9;;-1:-1:-1;;;30178:26:0;;;-1:-1:-1;;;;;30178:26:0;;30166:9;;30173:1;;30166:9;;;;;;;;;;;;;;;:38;30225:10;:26;30213:9;;-1:-1:-1;;;30225:26:0;;;-1:-1:-1;;;;;30225:26:0;;30213:9;;30220:1;;30213:9;;;;;;;;;;;;;;;:38;30272:10;:20;30260:9;;-1:-1:-1;;;;;30272:20:0;;;;30260:6;;30267:1;;30260:9;;;;;;;;;;;:32;;;;;30313:18;:16;:18::i;:::-;30301:6;30308:1;30301:9;;;;;;;;;;;;;:30;;;;;30365:22;:20;:22::i;:::-;30341:6;30348:1;30341:9;;;;;;;;;;;;;30352:6;30359:1;30352:9;;;;;;;;;;;;;;;;;;30340:47;;;;;;;;30408:29;;;;:16;:29;;;;;;-1:-1:-1;;;;;;;;;;;30408:54:0;;:41;;:54;;;;;30396:9;;:6;;30403:1;;30396:9;;;;;;;;;;;;;;;;:66;;;;30483:29;;;;:16;:29;;;;;;-1:-1:-1;;;;;;;;;;;30483:52:0;;:41;;:52;;;;;30471:9;;:6;;30478:1;;30471:9;;;;;;;;;;;:64;;;;;30556:16;30544:6;30551:1;30544:9;;;;;;;;;;;;;:28;;;;;30594:9;30581:6;30588:2;30581:10;;;;;;;;;;;;;;;;;;:22;;;;30654:10;30612:20;30645;;;:8;:20;;;;;;:38;;;;;;30641:87;;-1:-1:-1;30714:4:0;30641:87;30778:102;;-1:-1:-1;;;;;30778:102:0;;-1:-1:-1;;;;;30778:102:0;;;;;;30833:10;30778:102;;;;;;24866:42;30778:102;;;;;;;;;;;;;;;;;;;;;;;;;;;;25269:42;;30778:38;;30817:6;;30825;;30833:10;;24866:42;;30864:15;;30778:102;;;;;;;;;;;;;;;-1:-1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;30778:102:0;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30778:102:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30778:102:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30778:102:0;;;;;;;;;;;-1:-1:-1;29901:995:0;-1:-1:-1;;;;;;;29901:995:0:o;2350:471::-;2408:7;2653:6;2649:47;;-1:-1:-1;2683:1:0;2676:8;;2649:47;2720:5;;;2724:1;2720;:5;:1;2744:5;;;;;:10;2736:56;;;;-1:-1:-1;;;;;2736:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35858:171;35962:7;35987:34;36012:8;35987:20;:8;36000:6;35987:20;:12;:20;:::i;:34::-;35980:41;35858:171;-1:-1:-1;;;;35858:171:0:o;31940:987::-;32146:10;32137:20;;;;:8;:20;;;;;;;;:50;;;:37;;:50;;;;;;:72;;32192:16;32137:72;:54;:72;:::i;:::-;32093:10;32084:20;;;;:8;:20;;;;;;;;:50;;;:37;;;:50;;;;;:125;;;;-1:-1:-1;;;;;32274:40:0;;;;:32;;;;:40;;;;;:53;;;;;;;:75;;32332:16;32274:75;:57;:75;:::i;:::-;32227:10;32218:20;;;;:8;:20;;;;;;;;-1:-1:-1;;;;;32218:40:0;;;;:32;;:40;;;;;:53;;;;;;;;:131;32416:92;32476:31;:16;32497:9;32476:31;:20;:31;:::i;:::-;32425:10;32416:20;;;;:8;:20;;;;;;;;-1:-1:-1;;;;;32416:42:0;;;;:34;;:42;;;;;:55;;;;;;;;;;:92;:59;:92;:::i;:::-;32367:10;32358:20;;;;:8;:20;;;;;;;;-1:-1:-1;;;;;32358:42:0;;;;:34;;:42;;;;;:55;;;;;;;;:150;;;;32566:16;:29;;;:46;:68;;32617:16;32566:68;:50;:68;:::i;:::-;32517:29;;;;:16;:29;;;;;;;;:117;;;-1:-1:-1;;;;;32695:49:0;;;;:41;;;;:49;;;;:71;;32749:16;32695:71;:53;:71;:::i;:::-;32643:29;;;;:16;:29;;;;;;;;-1:-1:-1;;;;;32643:49:0;;;;:41;;:49;;;;;:123;32830:89;32887:31;:16;32908:9;32887:31;:20;:31;:::i;:::-;32830:29;;;;:16;:29;;;;;;;;-1:-1:-1;;;;;32830:52:0;;;;:44;;:52;;;;;;;:89;:56;:89;:::i;:::-;32775:29;;;;:16;:29;;;;;;;;-1:-1:-1;;;;;32775:52:0;;;;;:44;;;;:52;;;;;;:144;;;;-1:-1:-1;;;31940:987:0:o;50454:417::-;50589:16;:30;50567:4;;-1:-1:-1;;;;;50589:30:0;50584:35;;50581:79;;;50649:1;50632:18;;50581:79;-1:-1:-1;;;;;50730:15:0;;;50668:22;50730:15;;;:8;:15;;;;;;;;:37;;;;;:29;;;;:37;;;;;:40;;;;;;;;;50693:83;;50714:14;;50772:3;50693:20;:83::i;:::-;-1:-1:-1;;;;;50804:15:0;;;;;;;:8;:15;;;;;;;;:35;;;;;:27;;;;:35;;;;;:38;;;;;;;50668:108;;-1:-1:-1;50792:71:0;;50804:58;;50668:108;50804:58;:42;:58;:::i;:::-;50792:7;;:71;:11;:71;:::i;:::-;50785:78;50454:417;-1:-1:-1;;;;;;;50454:417:0:o;24313:27077::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24313:27077:0;;;-1:-1:-1;24313:27077:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;
Swarm Source
bzzr://98b1283931390455f5ca6bbff29e5ac85cfb8e6742ea874b10dd55d8636d9e4c
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
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.