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:
FillOrder
Compiler Version
v0.5.15+commit.6a57276f
Contract Source Code (Solidity Standard Json-Input format)
pragma experimental ABIEncoderV2; pragma solidity 0.5.15; contract IAugur { function createChildUniverse(bytes32 _parentPayoutDistributionHash, uint256[] memory _parentPayoutNumerators) public returns (IUniverse); function isKnownUniverse(IUniverse _universe) public view returns (bool); function trustedCashTransfer(address _from, address _to, uint256 _amount) public returns (bool); function isTrustedSender(address _address) public returns (bool); function onCategoricalMarketCreated(uint256 _endTime, string memory _extraInfo, IMarket _market, address _marketCreator, address _designatedReporter, uint256 _feePerCashInAttoCash, bytes32[] memory _outcomes) public returns (bool); function onYesNoMarketCreated(uint256 _endTime, string memory _extraInfo, IMarket _market, address _marketCreator, address _designatedReporter, uint256 _feePerCashInAttoCash) public returns (bool); function onScalarMarketCreated(uint256 _endTime, string memory _extraInfo, IMarket _market, address _marketCreator, address _designatedReporter, uint256 _feePerCashInAttoCash, int256[] memory _prices, uint256 _numTicks) public returns (bool); function logInitialReportSubmitted(IUniverse _universe, address _reporter, address _market, address _initialReporter, uint256 _amountStaked, bool _isDesignatedReporter, uint256[] memory _payoutNumerators, string memory _description, uint256 _nextWindowStartTime, uint256 _nextWindowEndTime) public returns (bool); function disputeCrowdsourcerCreated(IUniverse _universe, address _market, address _disputeCrowdsourcer, uint256[] memory _payoutNumerators, uint256 _size, uint256 _disputeRound) public returns (bool); function logDisputeCrowdsourcerContribution(IUniverse _universe, address _reporter, address _market, address _disputeCrowdsourcer, uint256 _amountStaked, string memory description, uint256[] memory _payoutNumerators, uint256 _currentStake, uint256 _stakeRemaining, uint256 _disputeRound) public returns (bool); function logDisputeCrowdsourcerCompleted(IUniverse _universe, address _market, address _disputeCrowdsourcer, uint256[] memory _payoutNumerators, uint256 _nextWindowStartTime, uint256 _nextWindowEndTime, bool _pacingOn, uint256 _totalRepStakedInPayout, uint256 _totalRepStakedInMarket, uint256 _disputeRound) public returns (bool); function logInitialReporterRedeemed(IUniverse _universe, address _reporter, address _market, uint256 _amountRedeemed, uint256 _repReceived, uint256[] memory _payoutNumerators) public returns (bool); function logDisputeCrowdsourcerRedeemed(IUniverse _universe, address _reporter, address _market, uint256 _amountRedeemed, uint256 _repReceived, uint256[] memory _payoutNumerators) public returns (bool); function logMarketFinalized(IUniverse _universe, uint256[] memory _winningPayoutNumerators) public returns (bool); function logMarketMigrated(IMarket _market, IUniverse _originalUniverse) public returns (bool); function logReportingParticipantDisavowed(IUniverse _universe, IMarket _market) public returns (bool); function logMarketParticipantsDisavowed(IUniverse _universe) public returns (bool); function logCompleteSetsPurchased(IUniverse _universe, IMarket _market, address _account, uint256 _numCompleteSets) public returns (bool); function logCompleteSetsSold(IUniverse _universe, IMarket _market, address _account, uint256 _numCompleteSets, uint256 _fees) public returns (bool); function logMarketOIChanged(IUniverse _universe, IMarket _market) public returns (bool); function logTradingProceedsClaimed(IUniverse _universe, address _sender, address _market, uint256 _outcome, uint256 _numShares, uint256 _numPayoutTokens, uint256 _fees) public returns (bool); function logUniverseForked(IMarket _forkingMarket) public returns (bool); function logReputationTokensTransferred(IUniverse _universe, address _from, address _to, uint256 _value, uint256 _fromBalance, uint256 _toBalance) public returns (bool); function logReputationTokensBurned(IUniverse _universe, address _target, uint256 _amount, uint256 _totalSupply, uint256 _balance) public returns (bool); function logReputationTokensMinted(IUniverse _universe, address _target, uint256 _amount, uint256 _totalSupply, uint256 _balance) public returns (bool); function logShareTokensBalanceChanged(address _account, IMarket _market, uint256 _outcome, uint256 _balance) public returns (bool); function logDisputeCrowdsourcerTokensTransferred(IUniverse _universe, address _from, address _to, uint256 _value, uint256 _fromBalance, uint256 _toBalance) public returns (bool); function logDisputeCrowdsourcerTokensBurned(IUniverse _universe, address _target, uint256 _amount, uint256 _totalSupply, uint256 _balance) public returns (bool); function logDisputeCrowdsourcerTokensMinted(IUniverse _universe, address _target, uint256 _amount, uint256 _totalSupply, uint256 _balance) public returns (bool); function logDisputeWindowCreated(IDisputeWindow _disputeWindow, uint256 _id, bool _initial) public returns (bool); function logParticipationTokensRedeemed(IUniverse universe, address _sender, uint256 _attoParticipationTokens, uint256 _feePayoutShare) public returns (bool); function logTimestampSet(uint256 _newTimestamp) public returns (bool); function logInitialReporterTransferred(IUniverse _universe, IMarket _market, address _from, address _to) public returns (bool); function logMarketTransferred(IUniverse _universe, address _from, address _to) public returns (bool); function logParticipationTokensTransferred(IUniverse _universe, address _from, address _to, uint256 _value, uint256 _fromBalance, uint256 _toBalance) public returns (bool); function logParticipationTokensBurned(IUniverse _universe, address _target, uint256 _amount, uint256 _totalSupply, uint256 _balance) public returns (bool); function logParticipationTokensMinted(IUniverse _universe, address _target, uint256 _amount, uint256 _totalSupply, uint256 _balance) public returns (bool); function logMarketRepBondTransferred(address _universe, address _from, address _to) public returns (bool); function logWarpSyncDataUpdated(address _universe, uint256 _warpSyncHash, uint256 _marketEndTime) public returns (bool); function isKnownFeeSender(address _feeSender) public view returns (bool); function lookup(bytes32 _key) public view returns (address); function getTimestamp() public view returns (uint256); function getMaximumMarketEndDate() public returns (uint256); function isKnownMarket(IMarket _market) public view returns (bool); function derivePayoutDistributionHash(uint256[] memory _payoutNumerators, uint256 _numTicks, uint256 numOutcomes) public view returns (bytes32); function logValidityBondChanged(uint256 _validityBond) public returns (bool); function logDesignatedReportStakeChanged(uint256 _designatedReportStake) public returns (bool); function logNoShowBondChanged(uint256 _noShowBond) public returns (bool); function logReportingFeeChanged(uint256 _reportingFee) public returns (bool); function getUniverseForkIndex(IUniverse _universe) public view returns (uint256); } contract IOwnable { function getOwner() public view returns (address); function transferOwnership(address _newOwner) public returns (bool); } contract ITyped { function getTypeName() public view returns (bytes32); } contract Initializable { bool private initialized = false; modifier beforeInitialized { require(!initialized); _; } function endInitialization() internal beforeInitialized { initialized = true; } function getInitialized() public view returns (bool) { return initialized; } } contract ReentrancyGuard { /** * @dev We use a single lock for the whole contract. */ bool private rentrancyLock = false; /** * @dev Prevents a contract from calling itself, directly or indirectly. * @notice If you mark a function `nonReentrant`, you should also mark it `external`. Calling one nonReentrant function from another is not supported. Instead, you can implement a `private` function doing the actual work, and a `external` wrapper marked as `nonReentrant`. */ modifier nonReentrant() { require(!rentrancyLock); rentrancyLock = true; _; rentrancyLock = false; } } library TokenId { function getTokenId(IMarket _market, uint256 _outcome) internal pure returns (uint256 _tokenId) { bytes memory _tokenIdBytes = abi.encodePacked(_market, uint8(_outcome)); assembly { _tokenId := mload(add(_tokenIdBytes, add(0x20, 0))) } } function getTokenIds(IMarket _market, uint256[] memory _outcomes) internal pure returns (uint256[] memory _tokenIds) { _tokenIds = new uint256[](_outcomes.length); for (uint256 _i = 0; _i < _outcomes.length; _i++) { _tokenIds[_i] = getTokenId(_market, _outcomes[_i]); } } function unpackTokenId(uint256 _tokenId) internal pure returns (address _market, uint256 _outcome) { assembly { _market := shr(96, and(_tokenId, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000)) _outcome := shr(88, and(_tokenId, 0x0000000000000000000000000000000000000000FF0000000000000000000000)) } } } library SafeMathUint256 { 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-solidity/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { // assert(b > 0); // Solidity automatically throws when dividing by 0 uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a); return a - b; } function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a); return c; } function min(uint256 a, uint256 b) internal pure returns (uint256) { if (a <= b) { return a; } else { return b; } } function max(uint256 a, uint256 b) internal pure returns (uint256) { if (a >= b) { return a; } else { return b; } } function sqrt(uint256 y) internal pure returns (uint256 z) { if (y > 3) { uint256 x = (y + 1) / 2; z = y; while (x < z) { z = x; x = (y / x + x) / 2; } } else if (y != 0) { z = 1; } } function getUint256Min() internal pure returns (uint256) { return 0; } function getUint256Max() internal pure returns (uint256) { // 2 ** 256 - 1 return 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff; } function isMultipleOf(uint256 a, uint256 b) internal pure returns (bool) { return a % b == 0; } // Float [fixed point] Operations function fxpMul(uint256 a, uint256 b, uint256 base) internal pure returns (uint256) { return div(mul(a, b), base); } function fxpDiv(uint256 a, uint256 b, uint256 base) internal pure returns (uint256) { return div(mul(a, base), b); } } interface IERC1155 { /// @dev Either TransferSingle or TransferBatch MUST emit when tokens are transferred, /// including zero value transfers as well as minting or burning. /// Operator will always be msg.sender. /// Either event from address `0x0` signifies a minting operation. /// An event to address `0x0` signifies a burning or melting operation. /// The total value transferred from address 0x0 minus the total value transferred to 0x0 may /// be used by clients and exchanges to be added to the "circulating supply" for a given token ID. /// To define a token ID with no initial balance, the contract SHOULD emit the TransferSingle event /// from `0x0` to `0x0`, with the token creator as `_operator`. event TransferSingle( address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value ); /// @dev Either TransferSingle or TransferBatch MUST emit when tokens are transferred, /// including zero value transfers as well as minting or burning. ///Operator will always be msg.sender. /// Either event from address `0x0` signifies a minting operation. /// An event to address `0x0` signifies a burning or melting operation. /// The total value transferred from address 0x0 minus the total value transferred to 0x0 may /// be used by clients and exchanges to be added to the "circulating supply" for a given token ID. /// To define multiple token IDs with no initial balance, this SHOULD emit the TransferBatch event /// from `0x0` to `0x0`, with the token creator as `_operator`. event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /// @dev MUST emit when an approval is updated. event ApprovalForAll( address indexed owner, address indexed operator, bool approved ); /// @dev MUST emit when the URI is updated for a token ID. /// URIs are defined in RFC 3986. /// The URI MUST point a JSON file that conforms to the "ERC-1155 Metadata JSON Schema". event URI( string value, uint256 indexed id ); /// @notice Transfers value amount of an _id from the _from address to the _to address specified. /// @dev MUST emit TransferSingle event on success. /// Caller must be approved to manage the _from account's tokens (see isApprovedForAll). /// MUST throw if `_to` is the zero address. /// MUST throw if balance of sender for token `_id` is lower than the `_value` sent. /// MUST throw on any other error. /// When transfer is complete, this function MUST check if `_to` is a smart contract (code size > 0). /// If so, it MUST call `onERC1155Received` on `_to` and revert if the return value /// is not `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`. /// @param from Source address /// @param to Target address /// @param id ID of the token type /// @param value Transfer amount /// @param data Additional data with no specified format, sent in call to `_to` function safeTransferFrom( address from, address to, uint256 id, uint256 value, bytes calldata data ) external; /// @notice Send multiple types of Tokens from a 3rd party in one transfer (with safety call). /// @dev MUST emit TransferBatch event on success. /// Caller must be approved to manage the _from account's tokens (see isApprovedForAll). /// MUST throw if `_to` is the zero address. /// MUST throw if length of `_ids` is not the same as length of `_values`. /// MUST throw if any of the balance of sender for token `_ids` is lower than the respective `_values` sent. /// MUST throw on any other error. /// When transfer is complete, this function MUST check if `_to` is a smart contract (code size > 0). /// If so, it MUST call `onERC1155BatchReceived` on `_to` and revert if the return value /// is not `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`. /// @param from Source addresses /// @param to Target addresses /// @param ids IDs of each token type /// @param values Transfer amounts per token type /// @param data Additional data with no specified format, sent in call to `_to` function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external; /// @notice Enable or disable approval for a third party ("operator") to manage all of the caller's tokens. /// @dev MUST emit the ApprovalForAll event on success. /// @param operator Address to add to the set of authorized operators /// @param approved True if the operator is approved, false to revoke approval function setApprovalForAll(address operator, bool approved) external; /// @notice Queries the approval status of an operator for a given owner. /// @param owner The owner of the Tokens /// @param operator Address of authorized operator /// @return True if the operator is approved, false if not function isApprovedForAll(address owner, address operator) external view returns (bool); /// @notice Get the balance of an account's Tokens. /// @param owner The address of the token holder /// @param id ID of the Token /// @return The _owner's balance of the Token type requested function balanceOf(address owner, uint256 id) external view returns (uint256); /// @notice Get the total supply of a Token. /// @param id ID of the Token /// @return The total supply of the Token type requested function totalSupply(uint256 id) external view returns (uint256); /// @notice Get the balance of multiple account/token pairs /// @param owners The addresses of the token holders /// @param ids ID of the Tokens /// @return The _owner's balance of the Token types requested function balanceOfBatch( address[] calldata owners, uint256[] calldata ids ) external view returns (uint256[] memory balances_); } contract IERC20 { function totalSupply() external view returns (uint256); function balanceOf(address owner) public view returns (uint256); function transfer(address to, uint256 amount) public returns (bool); function transferFrom(address from, address to, uint256 amount) public returns (bool); function approve(address spender, uint256 amount) public returns (bool); function allowance(address owner, address spender) public view returns (uint256); // solhint-disable-next-line no-simple-event-func-name event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); } contract ICash is IERC20 { } contract IAffiliateValidator { function validateReference(address _account, address _referrer) external view returns (bool); } contract IDisputeWindow is ITyped, IERC20 { function invalidMarketsTotal() external view returns (uint256); function validityBondTotal() external view returns (uint256); function incorrectDesignatedReportTotal() external view returns (uint256); function initialReportBondTotal() external view returns (uint256); function designatedReportNoShowsTotal() external view returns (uint256); function designatedReporterNoShowBondTotal() external view returns (uint256); function initialize(IAugur _augur, IUniverse _universe, uint256 _disputeWindowId, bool _participationTokensEnabled, uint256 _duration, uint256 _startTime) public; function trustedBuy(address _buyer, uint256 _attotokens) public returns (bool); function getUniverse() public view returns (IUniverse); function getReputationToken() public view returns (IReputationToken); function getStartTime() public view returns (uint256); function getEndTime() public view returns (uint256); function getWindowId() public view returns (uint256); function isActive() public view returns (bool); function isOver() public view returns (bool); function onMarketFinalized() public; function redeem(address _account) public returns (bool); } contract IMarket is IOwnable { enum MarketType { YES_NO, CATEGORICAL, SCALAR } function initialize(IAugur _augur, IUniverse _universe, uint256 _endTime, uint256 _feePerCashInAttoCash, IAffiliateValidator _affiliateValidator, uint256 _affiliateFeeDivisor, address _designatedReporterAddress, address _creator, uint256 _numOutcomes, uint256 _numTicks) public; function derivePayoutDistributionHash(uint256[] memory _payoutNumerators) public view returns (bytes32); function doInitialReport(uint256[] memory _payoutNumerators, string memory _description, uint256 _additionalStake) public returns (bool); function getUniverse() public view returns (IUniverse); function getDisputeWindow() public view returns (IDisputeWindow); function getNumberOfOutcomes() public view returns (uint256); function getNumTicks() public view returns (uint256); function getMarketCreatorSettlementFeeDivisor() public view returns (uint256); function getForkingMarket() public view returns (IMarket _market); function getEndTime() public view returns (uint256); function getWinningPayoutDistributionHash() public view returns (bytes32); function getWinningPayoutNumerator(uint256 _outcome) public view returns (uint256); function getWinningReportingParticipant() public view returns (IReportingParticipant); function getReputationToken() public view returns (IV2ReputationToken); function getFinalizationTime() public view returns (uint256); function getInitialReporter() public view returns (IInitialReporter); function getDesignatedReportingEndTime() public view returns (uint256); function getValidityBondAttoCash() public view returns (uint256); function affiliateFeeDivisor() external view returns (uint256); function getNumParticipants() public view returns (uint256); function getDisputePacingOn() public view returns (bool); function deriveMarketCreatorFeeAmount(uint256 _amount) public view returns (uint256); function recordMarketCreatorFees(uint256 _marketCreatorFees, address _sourceAccount, bytes32 _fingerprint) public returns (bool); function isContainerForReportingParticipant(IReportingParticipant _reportingParticipant) public view returns (bool); function isFinalizedAsInvalid() public view returns (bool); function finalize() public returns (bool); function isFinalized() public view returns (bool); function getOpenInterest() public view returns (uint256); } contract IReportingParticipant { function getStake() public view returns (uint256); function getPayoutDistributionHash() public view returns (bytes32); function liquidateLosing() public; function redeem(address _redeemer) public returns (bool); function isDisavowed() public view returns (bool); function getPayoutNumerator(uint256 _outcome) public view returns (uint256); function getPayoutNumerators() public view returns (uint256[] memory); function getMarket() public view returns (IMarket); function getSize() public view returns (uint256); } contract IInitialReporter is IReportingParticipant, IOwnable { function initialize(IAugur _augur, IMarket _market, address _designatedReporter) public; function report(address _reporter, bytes32 _payoutDistributionHash, uint256[] memory _payoutNumerators, uint256 _initialReportStake) public; function designatedReporterShowed() public view returns (bool); function initialReporterWasCorrect() public view returns (bool); function getDesignatedReporter() public view returns (address); function getReportTimestamp() public view returns (uint256); function migrateToNewUniverse(address _designatedReporter) public; function returnRepFromDisavow() public; } contract IReputationToken is IERC20 { function migrateOutByPayout(uint256[] memory _payoutNumerators, uint256 _attotokens) public returns (bool); function migrateIn(address _reporter, uint256 _attotokens) public returns (bool); function trustedReportingParticipantTransfer(address _source, address _destination, uint256 _attotokens) public returns (bool); function trustedMarketTransfer(address _source, address _destination, uint256 _attotokens) public returns (bool); function trustedUniverseTransfer(address _source, address _destination, uint256 _attotokens) public returns (bool); function trustedDisputeWindowTransfer(address _source, address _destination, uint256 _attotokens) public returns (bool); function getUniverse() public view returns (IUniverse); function getTotalMigrated() public view returns (uint256); function getTotalTheoreticalSupply() public view returns (uint256); function mintForReportingParticipant(uint256 _amountMigrated) public returns (bool); } contract IShareToken is ITyped, IERC1155 { function initialize(IAugur _augur) external; function initializeMarket(IMarket _market, uint256 _numOutcomes, uint256 _numTicks) public; function unsafeTransferFrom(address _from, address _to, uint256 _id, uint256 _value) public; function unsafeBatchTransferFrom(address _from, address _to, uint256[] memory _ids, uint256[] memory _values) public; function claimTradingProceeds(IMarket _market, address _shareHolder, bytes32 _fingerprint) external returns (uint256[] memory _outcomeFees); function getMarket(uint256 _tokenId) external view returns (IMarket); function getOutcome(uint256 _tokenId) external view returns (uint256); function getTokenId(IMarket _market, uint256 _outcome) public pure returns (uint256 _tokenId); function getTokenIds(IMarket _market, uint256[] memory _outcomes) public pure returns (uint256[] memory _tokenIds); function buyCompleteSets(IMarket _market, address _account, uint256 _amount) external returns (bool); function buyCompleteSetsForTrade(IMarket _market, uint256 _amount, uint256 _longOutcome, address _longRecipient, address _shortRecipient) external returns (bool); function sellCompleteSets(IMarket _market, address _holder, address _recipient, uint256 _amount, bytes32 _fingerprint) external returns (uint256 _creatorFee, uint256 _reportingFee); function sellCompleteSetsForTrade(IMarket _market, uint256 _outcome, uint256 _amount, address _shortParticipant, address _longParticipant, address _shortRecipient, address _longRecipient, uint256 _price, address _sourceAccount, bytes32 _fingerprint) external returns (uint256 _creatorFee, uint256 _reportingFee); function totalSupplyForMarketOutcome(IMarket _market, uint256 _outcome) public view returns (uint256); function balanceOfMarketOutcome(IMarket _market, uint256 _outcome, address _account) public view returns (uint256); function lowestBalanceOfMarketOutcomes(IMarket _market, uint256[] memory _outcomes, address _account) public view returns (uint256); } contract IUniverse { function creationTime() external view returns (uint256); function marketBalance(address) external view returns (uint256); function fork() public returns (bool); function updateForkValues() public returns (bool); function getParentUniverse() public view returns (IUniverse); function createChildUniverse(uint256[] memory _parentPayoutNumerators) public returns (IUniverse); function getChildUniverse(bytes32 _parentPayoutDistributionHash) public view returns (IUniverse); function getReputationToken() public view returns (IV2ReputationToken); function getForkingMarket() public view returns (IMarket); function getForkEndTime() public view returns (uint256); function getForkReputationGoal() public view returns (uint256); function getParentPayoutDistributionHash() public view returns (bytes32); function getDisputeRoundDurationInSeconds(bool _initial) public view returns (uint256); function getOrCreateDisputeWindowByTimestamp(uint256 _timestamp, bool _initial) public returns (IDisputeWindow); function getOrCreateCurrentDisputeWindow(bool _initial) public returns (IDisputeWindow); function getOrCreateNextDisputeWindow(bool _initial) public returns (IDisputeWindow); function getOrCreatePreviousDisputeWindow(bool _initial) public returns (IDisputeWindow); function getOpenInterestInAttoCash() public view returns (uint256); function getTargetRepMarketCapInAttoCash() public view returns (uint256); function getOrCacheValidityBond() public returns (uint256); function getOrCacheDesignatedReportStake() public returns (uint256); function getOrCacheDesignatedReportNoShowBond() public returns (uint256); function getOrCacheMarketRepBond() public returns (uint256); function getOrCacheReportingFeeDivisor() public returns (uint256); function getDisputeThresholdForFork() public view returns (uint256); function getDisputeThresholdForDisputePacing() public view returns (uint256); function getInitialReportMinValue() public view returns (uint256); function getPayoutNumerators() public view returns (uint256[] memory); function getReportingFeeDivisor() public view returns (uint256); function getPayoutNumerator(uint256 _outcome) public view returns (uint256); function getWinningChildPayoutNumerator(uint256 _outcome) public view returns (uint256); function isOpenInterestCash(address) public view returns (bool); function isForkingMarket() public view returns (bool); function getCurrentDisputeWindow(bool _initial) public view returns (IDisputeWindow); function getDisputeWindowStartTimeAndDuration(uint256 _timestamp, bool _initial) public view returns (uint256, uint256); function isParentOf(IUniverse _shadyChild) public view returns (bool); function updateTentativeWinningChildUniverse(bytes32 _parentPayoutDistributionHash) public returns (bool); function isContainerForDisputeWindow(IDisputeWindow _shadyTarget) public view returns (bool); function isContainerForMarket(IMarket _shadyTarget) public view returns (bool); function isContainerForReportingParticipant(IReportingParticipant _reportingParticipant) public view returns (bool); function migrateMarketOut(IUniverse _destinationUniverse) public returns (bool); function migrateMarketIn(IMarket _market, uint256 _cashBalance, uint256 _marketOI) public returns (bool); function decrementOpenInterest(uint256 _amount) public returns (bool); function decrementOpenInterestFromMarket(IMarket _market) public returns (bool); function incrementOpenInterest(uint256 _amount) public returns (bool); function getWinningChildUniverse() public view returns (IUniverse); function isForking() public view returns (bool); function deposit(address _sender, uint256 _amount, address _market) public returns (bool); function withdraw(address _recipient, uint256 _amount, address _market) public returns (bool); function createScalarMarket(uint256 _endTime, uint256 _feePerCashInAttoCash, IAffiliateValidator _affiliateValidator, uint256 _affiliateFeeDivisor, address _designatedReporterAddress, int256[] memory _prices, uint256 _numTicks, string memory _extraInfo) public returns (IMarket _newMarket); } contract IV2ReputationToken is IReputationToken { function parentUniverse() external returns (IUniverse); function burnForMarket(uint256 _amountToBurn) public returns (bool); function mintForWarpSync(uint256 _amountToMint, address _target) public returns (bool); } contract IAugurTrading { function lookup(bytes32 _key) public view returns (address); function logProfitLossChanged(IMarket _market, address _account, uint256 _outcome, int256 _netPosition, uint256 _avgPrice, int256 _realizedProfit, int256 _frozenFunds, int256 _realizedCost) public returns (bool); function logOrderCreated(IUniverse _universe, bytes32 _orderId, bytes32 _tradeGroupId) public returns (bool); function logOrderCanceled(IUniverse _universe, IMarket _market, address _creator, uint256 _tokenRefund, uint256 _sharesRefund, bytes32 _orderId) public returns (bool); function logOrderFilled(IUniverse _universe, address _creator, address _filler, uint256 _price, uint256 _fees, uint256 _amountFilled, bytes32 _orderId, bytes32 _tradeGroupId) public returns (bool); function logMarketVolumeChanged(IUniverse _universe, address _market, uint256 _volume, uint256[] memory _outcomeVolumes, uint256 _totalTrades) public returns (bool); function logZeroXOrderFilled(IUniverse _universe, IMarket _market, bytes32 _orderHash, bytes32 _tradeGroupId, uint8 _orderType, address[] memory _addressData, uint256[] memory _uint256Data) public returns (bool); function logZeroXOrderCanceled(address _universe, address _market, address _account, uint256 _outcome, uint256 _price, uint256 _amount, uint8 _type, bytes32 _orderHash) public; } contract IFillOrder { function publicFillOrder(bytes32 _orderId, uint256 _amountFillerWants, bytes32 _tradeGroupId, bytes32 _fingerprint) external returns (uint256); function fillOrder(address _filler, bytes32 _orderId, uint256 _amountFillerWants, bytes32 tradeGroupId, bytes32 _fingerprint) external returns (uint256); function fillZeroXOrder(IMarket _market, uint256 _outcome, uint256 _price, Order.Types _orderType, address _creator, uint256 _amount, bytes32 _fingerprint, bytes32 _tradeGroupId, address _filler) external returns (uint256, uint256); function getMarketOutcomeValues(IMarket _market) public view returns (uint256[] memory); function getMarketVolume(IMarket _market) public view returns (uint256); } contract IOrders { function saveOrder(uint256[] calldata _uints, bytes32[] calldata _bytes32s, Order.Types _type, IMarket _market, address _sender) external returns (bytes32 _orderId); function removeOrder(bytes32 _orderId) external returns (bool); function getMarket(bytes32 _orderId) public view returns (IMarket); function getOrderType(bytes32 _orderId) public view returns (Order.Types); function getOutcome(bytes32 _orderId) public view returns (uint256); function getAmount(bytes32 _orderId) public view returns (uint256); function getPrice(bytes32 _orderId) public view returns (uint256); function getOrderCreator(bytes32 _orderId) public view returns (address); function getOrderSharesEscrowed(bytes32 _orderId) public view returns (uint256); function getOrderMoneyEscrowed(bytes32 _orderId) public view returns (uint256); function getOrderDataForCancel(bytes32 _orderId) public view returns (uint256, uint256, Order.Types, IMarket, uint256, address); function getOrderDataForLogs(bytes32 _orderId) public view returns (Order.Types, address[] memory _addressData, uint256[] memory _uint256Data); function getBetterOrderId(bytes32 _orderId) public view returns (bytes32); function getWorseOrderId(bytes32 _orderId) public view returns (bytes32); function getBestOrderId(Order.Types _type, IMarket _market, uint256 _outcome) public view returns (bytes32); function getWorstOrderId(Order.Types _type, IMarket _market, uint256 _outcome) public view returns (bytes32); function getLastOutcomePrice(IMarket _market, uint256 _outcome) public view returns (uint256); function getOrderId(Order.Types _type, IMarket _market, uint256 _amount, uint256 _price, address _sender, uint256 _blockNumber, uint256 _outcome, uint256 _moneyEscrowed, uint256 _sharesEscrowed) public pure returns (bytes32); function getTotalEscrowed(IMarket _market) public view returns (uint256); function isBetterPrice(Order.Types _type, uint256 _price, bytes32 _orderId) public view returns (bool); function isWorsePrice(Order.Types _type, uint256 _price, bytes32 _orderId) public view returns (bool); function assertIsNotBetterPrice(Order.Types _type, uint256 _price, bytes32 _betterOrderId) public view returns (bool); function assertIsNotWorsePrice(Order.Types _type, uint256 _price, bytes32 _worseOrderId) public returns (bool); function recordFillOrder(bytes32 _orderId, uint256 _sharesFilled, uint256 _tokensFilled, uint256 _fill) external returns (bool); function setPrice(IMarket _market, uint256 _outcome, uint256 _price) external returns (bool); } contract IProfitLoss { function initialize(IAugur _augur) public; function recordFrozenFundChange(IUniverse _universe, IMarket _market, address _account, uint256 _outcome, int256 _frozenFundDelta) public returns (bool); function adjustTraderProfitForFees(IMarket _market, address _trader, uint256 _outcome, uint256 _fees) public returns (bool); function recordTrade(IUniverse _universe, IMarket _market, address _longAddress, address _shortAddress, uint256 _outcome, int256 _amount, int256 _price, uint256 _numLongTokens, uint256 _numShortTokens, uint256 _numLongShares, uint256 _numShortShares) public returns (bool); function recordClaim(IMarket _market, address _account, uint256[] memory _outcomeFees) public returns (bool); } library Order { using SafeMathUint256 for uint256; enum Types { Bid, Ask } enum TradeDirections { Long, Short } struct Data { // Contracts IMarket market; IAugur augur; IAugurTrading augurTrading; IShareToken shareToken; ICash cash; // Order bytes32 id; address creator; uint256 outcome; Order.Types orderType; uint256 amount; uint256 price; uint256 sharesEscrowed; uint256 moneyEscrowed; bytes32 betterOrderId; bytes32 worseOrderId; } function create(IAugur _augur, IAugurTrading _augurTrading, address _creator, uint256 _outcome, Order.Types _type, uint256 _attoshares, uint256 _price, IMarket _market, bytes32 _betterOrderId, bytes32 _worseOrderId) internal view returns (Data memory) { require(_outcome < _market.getNumberOfOutcomes(), "Order.create: Outcome is not within market range"); require(_price != 0, "Order.create: Price may not be 0"); require(_price < _market.getNumTicks(), "Order.create: Price is outside of market range"); require(_attoshares > 0, "Order.create: Cannot use amount of 0"); require(_creator != address(0), "Order.create: Creator is 0x0"); IShareToken _shareToken = IShareToken(_augur.lookup("ShareToken")); return Data({ market: _market, augur: _augur, augurTrading: _augurTrading, shareToken: _shareToken, cash: ICash(_augur.lookup("Cash")), id: 0, creator: _creator, outcome: _outcome, orderType: _type, amount: _attoshares, price: _price, sharesEscrowed: 0, moneyEscrowed: 0, betterOrderId: _betterOrderId, worseOrderId: _worseOrderId }); } // // "public" functions // function getOrderId(Order.Data memory _orderData, IOrders _orders) internal view returns (bytes32) { if (_orderData.id == bytes32(0)) { bytes32 _orderId = calculateOrderId(_orderData.orderType, _orderData.market, _orderData.amount, _orderData.price, _orderData.creator, block.number, _orderData.outcome, _orderData.moneyEscrowed, _orderData.sharesEscrowed); require(_orders.getAmount(_orderId) == 0, "Order.getOrderId: New order had amount. This should not be possible"); _orderData.id = _orderId; } return _orderData.id; } function calculateOrderId(Order.Types _type, IMarket _market, uint256 _amount, uint256 _price, address _sender, uint256 _blockNumber, uint256 _outcome, uint256 _moneyEscrowed, uint256 _sharesEscrowed) internal pure returns (bytes32) { return sha256(abi.encodePacked(_type, _market, _amount, _price, _sender, _blockNumber, _outcome, _moneyEscrowed, _sharesEscrowed)); } function getOrderTradingTypeFromMakerDirection(Order.TradeDirections _creatorDirection) internal pure returns (Order.Types) { return (_creatorDirection == Order.TradeDirections.Long) ? Order.Types.Bid : Order.Types.Ask; } function getOrderTradingTypeFromFillerDirection(Order.TradeDirections _fillerDirection) internal pure returns (Order.Types) { return (_fillerDirection == Order.TradeDirections.Long) ? Order.Types.Ask : Order.Types.Bid; } function saveOrder(Order.Data memory _orderData, bytes32 _tradeGroupId, IOrders _orders) internal returns (bytes32) { getOrderId(_orderData, _orders); uint256[] memory _uints = new uint256[](5); _uints[0] = _orderData.amount; _uints[1] = _orderData.price; _uints[2] = _orderData.outcome; _uints[3] = _orderData.moneyEscrowed; _uints[4] = _orderData.sharesEscrowed; bytes32[] memory _bytes32s = new bytes32[](4); _bytes32s[0] = _orderData.betterOrderId; _bytes32s[1] = _orderData.worseOrderId; _bytes32s[2] = _tradeGroupId; _bytes32s[3] = _orderData.id; return _orders.saveOrder(_uints, _bytes32s, _orderData.orderType, _orderData.market, _orderData.creator); } } interface IUniswapV2Pair { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; event Mint(address indexed sender, uint amount0, uint amount1); event Burn(address indexed sender, uint amount0, uint amount1, address indexed to); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint); function price1CumulativeLast() external view returns (uint); function kLast() external view returns (uint); function mint(address to) external returns (uint liquidity); function burn(address to) external returns (uint amount0, uint amount1); function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } library Trade { using SafeMathUint256 for uint256; enum Direction { Long, Short } struct StoredContracts { IAugur augur; IAugurTrading augurTrading; IOrders orders; ICash denominationToken; IProfitLoss profitLoss; IShareToken shareToken; } struct Contracts { IOrders orders; IMarket market; ICash denominationToken; IShareToken shareToken; IAugur augur; IUniverse universe; IProfitLoss profitLoss; IAugurTrading augurTrading; } struct FilledOrder { bytes32 orderId; uint256 outcome; uint256 sharePriceRange; uint256 sharePriceLong; uint256 sharePriceShort; } struct Participant { address participantAddress; Direction direction; uint256 startingSharesToSell; uint256 startingSharesToBuy; uint256 sharesToSell; uint256 sharesToBuy; } struct Data { Contracts contracts; FilledOrder order; Participant creator; Participant filler; uint256 longOutcome; uint256[] shortOutcomes; address longFundsAccount; address shortFundsAccount; bytes32 fingerprint; } struct OrderData { IMarket market; uint256 outcome; uint256 price; Order.Types orderType; uint256 sharesEscrowed; uint256 amount; address creator; bytes32 orderId; } // // Constructor // function create(StoredContracts memory _storedContracts, bytes32 _orderId, address _fillerAddress, uint256 _fillerSize, bytes32 _fingerprint) internal view returns (Data memory) { OrderData memory _orderData = createOrderDataWithOrderId(_storedContracts, _orderId); return createWithData(_storedContracts, _orderData, _fillerAddress, _fillerSize, _fingerprint); } function createWithData(StoredContracts memory _storedContracts, OrderData memory _orderData, address _fillerAddress, uint256 _fillerSize, bytes32 _fingerprint) internal view returns (Data memory) { Contracts memory _contracts = getContracts(_storedContracts, _orderData.market, _orderData.outcome); FilledOrder memory _order = getOrder(_contracts, _orderData.outcome, _orderData.price, _orderData.orderId); Participant memory _creator = getMaker(_orderData.sharesEscrowed, _orderData.amount, _orderData.creator, _orderData.orderType); uint256[] memory _shortOutcomes = getShortOutcomes(_contracts.market, _orderData.outcome); Participant memory _filler = getFiller(_contracts, _orderData.outcome, _shortOutcomes, _orderData.orderType, _fillerAddress, _fillerSize); // Signed orders which have no order id get their funds from the signed order "creator" whereas on chain orders have funds escrowed in Augur Trading. address _creatorFundsSource = _orderData.orderId == bytes32(0) ? _creator.participantAddress : address(_contracts.augurTrading); return Data({ contracts: _contracts, order: _order, creator: _creator, filler: _filler, longOutcome: _orderData.outcome, shortOutcomes: _shortOutcomes, longFundsAccount: _creator.direction == Direction.Long ? _creatorFundsSource : _filler.participantAddress, shortFundsAccount: _creator.direction == Direction.Short ? _creatorFundsSource : _filler.participantAddress, fingerprint: _fingerprint }); } function createOrderDataWithOrderId(StoredContracts memory _storedContracts, bytes32 _orderId) internal view returns (OrderData memory) { IOrders _orders = _storedContracts.orders; return OrderData({ market: _orders.getMarket(_orderId), outcome: _orders.getOutcome(_orderId), price: _orders.getPrice(_orderId), orderType: _orders.getOrderType(_orderId), sharesEscrowed: _orders.getOrderSharesEscrowed(_orderId), amount: _orders.getAmount(_orderId), creator: _orders.getOrderCreator(_orderId), orderId: _orderId }); } function createOrderData(IShareToken _shareToken, IMarket _market, uint256 _outcome, uint256 _price, Order.Types _orderType, uint256 _amount, address _creator) internal view returns (OrderData memory) { uint256 _sharesAvailable = getSharesAvailable(_shareToken, _market, _orderType, _outcome, _amount, _creator); return OrderData({ market: _market, outcome: _outcome, price: _price, orderType: _orderType, sharesEscrowed: _sharesAvailable, amount: _amount, creator: _creator, orderId: bytes32(0) }); } function getSharesAvailable(IShareToken _shareToken, IMarket _market, Order.Types _orderType, uint256 _outcome, uint256 _amount, address _creator) private view returns (uint256) { // Figure out how many almost-complete-sets (just missing `outcome` share) the creator has uint256 _numberOfOutcomes = _market.getNumberOfOutcomes(); if (_orderType == Order.Types.Bid) { return _shareToken.lowestBalanceOfMarketOutcomes(_market, getShortOutcomes(_market, _outcome), _creator).min(_amount); } return _shareToken.balanceOfMarketOutcome(_market, _outcome, _creator).min(_amount); } function getShortOutcomes(IMarket _market, uint256 _outcome) private view returns (uint256[] memory) { uint256 _numberOfOutcomes = _market.getNumberOfOutcomes(); uint256[] memory _shortOutcomes = new uint256[](_numberOfOutcomes - 1); uint256 _indexOutcome = 0; for (uint256 _i = 0; _i < _numberOfOutcomes - 1; _i++) { if (_i == _outcome) { _indexOutcome++; } _shortOutcomes[_i] = _indexOutcome; _indexOutcome++; } return _shortOutcomes; } // // "public" functions // function tradeMakerSharesForFillerShares(Data memory _data) internal returns (uint256 _marketCreatorFees, uint256 _reporterFees) { uint256 _numberOfCompleteSets = _data.creator.sharesToSell.min(_data.filler.sharesToSell); if (_numberOfCompleteSets == 0) { return (0, 0); } // transfer shares and sell complete sets distributing payouts based on the price // Sell both account shares (_marketCreatorFees, _reporterFees) = _data.contracts.shareToken.sellCompleteSetsForTrade(_data.contracts.market, _data.longOutcome, _numberOfCompleteSets, _data.shortFundsAccount, _data.longFundsAccount, getShortShareSellerDestination(_data), getLongShareSellerDestination(_data), _data.order.sharePriceLong, _data.filler.participantAddress, _data.fingerprint); // update available shares for creator and filler _data.creator.sharesToSell -= _numberOfCompleteSets; _data.filler.sharesToSell -= _numberOfCompleteSets; return (_marketCreatorFees, _reporterFees); } function tradeMakerSharesForFillerTokens(Data memory _data) internal returns (bool) { uint256 _numberOfSharesToTrade = _data.creator.sharesToSell.min(_data.filler.sharesToBuy); if (_numberOfSharesToTrade == 0) { return true; } // transfer shares from creator (escrowed in market) to filler if (_data.creator.direction == Direction.Short) { _data.contracts.shareToken.unsafeTransferFrom(_data.shortFundsAccount, _data.filler.participantAddress, TokenId.getTokenId(_data.contracts.market, _data.longOutcome), _numberOfSharesToTrade); } else { uint256[] memory _values = new uint256[](_data.shortOutcomes.length); for (uint256 _i = 0; _i < _data.shortOutcomes.length; _i++) { _values[_i] = _numberOfSharesToTrade; } _data.contracts.shareToken.unsafeBatchTransferFrom(_data.longFundsAccount, _data.filler.participantAddress, TokenId.getTokenIds(_data.contracts.market, _data.shortOutcomes), _values); } uint256 _tokensToCover = getTokensToCover(_data, _data.filler.direction, _numberOfSharesToTrade); _data.contracts.denominationToken.transferFrom(_data.filler.participantAddress, _data.creator.participantAddress, _tokensToCover); // update available assets for creator and filler _data.creator.sharesToSell -= _numberOfSharesToTrade; _data.filler.sharesToBuy -= _numberOfSharesToTrade; return true; } function tradeMakerTokensForFillerShares(Data memory _data) internal returns (bool) { uint256 _numberOfSharesToTrade = _data.filler.sharesToSell.min(_data.creator.sharesToBuy); if (_numberOfSharesToTrade == 0) { return true; } // transfer shares from filler to creator if (_data.filler.direction == Direction.Short) { _data.contracts.shareToken.unsafeTransferFrom(_data.filler.participantAddress, _data.creator.participantAddress, TokenId.getTokenId(_data.contracts.market, _data.longOutcome), _numberOfSharesToTrade); } else { uint256[] memory _values = new uint256[](_data.shortOutcomes.length); for (uint256 _i = 0; _i < _data.shortOutcomes.length; _i++) { _values[_i] = _numberOfSharesToTrade; } _data.contracts.shareToken.unsafeBatchTransferFrom(_data.filler.participantAddress, _data.creator.participantAddress, TokenId.getTokenIds(_data.contracts.market, _data.shortOutcomes), _values); } // transfer tokens from creator (taken from the signer for signed orders, escrowed in Augur Trading for on chain orders) to filler uint256 _tokensToCover = getTokensToCover(_data, _data.creator.direction, _numberOfSharesToTrade); if (_data.order.orderId == bytes32(0)) { // No order Id indicates this is a signed order _data.contracts.denominationToken.transferFrom(_data.creator.participantAddress, _data.filler.participantAddress, _tokensToCover); } else { _data.contracts.denominationToken.transferFrom(address(_data.contracts.augurTrading), _data.filler.participantAddress, _tokensToCover); } // update available assets for creator and filler _data.creator.sharesToBuy -= _numberOfSharesToTrade; _data.filler.sharesToSell -= _numberOfSharesToTrade; return true; } function tradeMakerTokensForFillerTokens(Data memory _data) internal returns (uint256) { uint256 _numberOfCompleteSets = _data.creator.sharesToBuy.min(_data.filler.sharesToBuy); if (_numberOfCompleteSets == 0) { return 0; } // If someone is filling their own order with CASH both ways we just return the CASH if (_data.creator.participantAddress == _data.filler.participantAddress) { uint256 _creatorTokensToCover = getTokensToCover(_data, _data.creator.direction, _numberOfCompleteSets); uint256 _fillerTokensToCover = getTokensToCover(_data, _data.filler.direction, _numberOfCompleteSets); _data.contracts.denominationToken.transferFrom(address(_data.contracts.augurTrading), _data.creator.participantAddress, _creatorTokensToCover); _data.creator.sharesToBuy -= _numberOfCompleteSets; _data.filler.sharesToBuy -= _numberOfCompleteSets; return _creatorTokensToCover.add(_fillerTokensToCover); } // buy complete sets and distribute shares to participants uint256 _longCost = _numberOfCompleteSets.mul(_data.order.sharePriceLong); uint256 _shortCost = _numberOfCompleteSets.mul(_data.order.sharePriceShort); IUniverse _universe = _data.contracts.market.getUniverse(); // Bring in cash from both parties if (_data.longFundsAccount == address(_data.contracts.market)) { _data.contracts.denominationToken.transferFrom(address(_data.contracts.augurTrading), address(this), _longCost); } else { _data.contracts.denominationToken.transferFrom(_data.longFundsAccount, address(this), _longCost); } if (_data.shortFundsAccount == address(_data.contracts.market)) { _data.contracts.denominationToken.transferFrom(address(_data.contracts.augurTrading), address(this), _shortCost); } else { _data.contracts.denominationToken.transferFrom(_data.shortFundsAccount, address(this), _shortCost); } // Buy and distribute complete sets address _longRecipient = getLongShareBuyerDestination(_data); address _shortRecipient = getShortShareBuyerDestination(_data); _data.contracts.shareToken.buyCompleteSetsForTrade(_data.contracts.market, _numberOfCompleteSets, _data.order.outcome, _longRecipient, _shortRecipient); _data.creator.sharesToBuy -= _numberOfCompleteSets; _data.filler.sharesToBuy -= _numberOfCompleteSets; return 0; } // // Helpers // function getLongShareBuyerDestination(Data memory _data) internal pure returns (address) { return (_data.creator.direction == Direction.Long) ? _data.creator.participantAddress : _data.filler.participantAddress; } function getShortShareBuyerDestination(Data memory _data) internal pure returns (address) { return (_data.creator.direction == Direction.Short) ? _data.creator.participantAddress : _data.filler.participantAddress; } function getLongShareSellerSource(Data memory _data) internal pure returns (address) { return (_data.creator.direction == Direction.Short) ? address(_data.contracts.market) : _data.filler.participantAddress; } function getShortShareSellerSource(Data memory _data) internal pure returns (address) { return (_data.creator.direction == Direction.Long) ? address(_data.contracts.market) : _data.filler.participantAddress; } function getLongShareSellerDestination(Data memory _data) internal pure returns (address) { return (_data.creator.direction == Direction.Short) ? _data.creator.participantAddress : _data.filler.participantAddress; } function getShortShareSellerDestination(Data memory _data) internal pure returns (address) { return (_data.creator.direction == Direction.Long) ? _data.creator.participantAddress : _data.filler.participantAddress; } function getMakerSharesDepleted(Data memory _data) internal pure returns (uint256) { return _data.creator.startingSharesToSell.sub(_data.creator.sharesToSell); } function getFillerSharesDepleted(Data memory _data) internal pure returns (uint256) { return _data.filler.startingSharesToSell.sub(_data.filler.sharesToSell); } function getMakerTokensDepleted(Data memory _data) internal pure returns (uint256) { return getTokensDepleted(_data, _data.creator.direction, _data.creator.startingSharesToBuy, _data.creator.sharesToBuy); } function getFillerTokensDepleted(Data memory _data) internal pure returns (uint256) { return getTokensDepleted(_data, _data.filler.direction, _data.filler.startingSharesToBuy, _data.filler.sharesToBuy); } function getTokensDepleted(Data memory _data, Direction _direction, uint256 _startingSharesToBuy, uint256 _endingSharesToBuy) internal pure returns (uint256) { return _startingSharesToBuy .sub(_endingSharesToBuy) .mul((_direction == Direction.Long) ? _data.order.sharePriceLong : _data.order.sharePriceShort); } function getTokensToCover(Data memory _data, Direction _direction, uint256 _numShares) internal pure returns (uint256) { return getTokensToCover(_direction, _data.order.sharePriceLong, _data.order.sharePriceShort, _numShares); } // // Construction helpers // function getContracts(StoredContracts memory _storedContracts, IMarket _market, uint256 _outcome) private view returns (Contracts memory) { return Contracts({ orders: _storedContracts.orders, market: _market, denominationToken: _storedContracts.denominationToken, augur: _storedContracts.augur, augurTrading: _storedContracts.augurTrading, universe: _market.getUniverse(), profitLoss: _storedContracts.profitLoss, shareToken: _storedContracts.shareToken }); } function getOrder(Contracts memory _contracts, uint256 _outcome, uint256 _price, bytes32 _orderId) private view returns (FilledOrder memory) { uint256 _sharePriceRange; uint256 _sharePriceLong; uint256 _sharePriceShort; (_sharePriceRange, _sharePriceLong, _sharePriceShort) = getSharePriceDetails(_contracts.market, _price); return FilledOrder({ orderId: _orderId, outcome: _outcome, sharePriceRange: _sharePriceRange, sharePriceLong: _sharePriceLong, sharePriceShort: _sharePriceShort }); } function getMaker(uint256 _sharesEscrowed, uint256 _amount, address _creator, Order.Types _orderOrderType) private pure returns (Participant memory) { Direction _direction = (_orderOrderType == Order.Types.Bid) ? Direction.Long : Direction.Short; uint256 _sharesToBuy = _amount.sub(_sharesEscrowed); return Participant({ participantAddress: _creator, direction: _direction, startingSharesToSell: _sharesEscrowed, startingSharesToBuy: _sharesToBuy, sharesToSell: _sharesEscrowed, sharesToBuy: _sharesToBuy }); } function getFiller(Contracts memory _contracts, uint256 _longOutcome, uint256[] memory _shortOutcomes, Order.Types _orderOrderType, address _address, uint256 _size) private view returns (Participant memory) { Direction _direction = (_orderOrderType == Order.Types.Bid) ? Direction.Short : Direction.Long; uint256 _sharesToSell = 0; _sharesToSell = getFillerSharesToSell(_contracts, _longOutcome, _shortOutcomes, _address, _direction, _size); uint256 _sharesToBuy = _size.sub(_sharesToSell); return Participant({ participantAddress: _address, direction: _direction, startingSharesToSell: _sharesToSell, startingSharesToBuy: _sharesToBuy, sharesToSell: _sharesToSell, sharesToBuy: _sharesToBuy }); } function getTokensToCover(Direction _direction, uint256 _sharePriceLong, uint256 _sharePriceShort, uint256 _numShares) internal pure returns (uint256) { return _numShares.mul((_direction == Direction.Long) ? _sharePriceLong : _sharePriceShort); } function getSharePriceDetails(IMarket _market, uint256 _price) private view returns (uint256 _sharePriceRange, uint256 _sharePriceLong, uint256 _sharePriceShort) { uint256 _numTicks = _market.getNumTicks(); _sharePriceShort = uint256(_numTicks.sub(_price)); return (_numTicks, _price, _sharePriceShort); } function getFillerSharesToSell(Contracts memory _contracts, uint256 _longOutcome, uint256[] memory _shortOutcomes, address _filler, Direction _fillerDirection, uint256 _fillerSize) private view returns (uint256) { if (_fillerDirection == Direction.Short) { return _contracts.shareToken.balanceOfMarketOutcome(_contracts.market, _longOutcome, _filler).min(_fillerSize); } return _contracts.shareToken.lowestBalanceOfMarketOutcomes(_contracts.market, _shortOutcomes, _filler).min(_fillerSize); } } contract FillOrder is Initializable, ReentrancyGuard, IFillOrder { using SafeMathUint256 for uint256; using Trade for Trade.Data; IAugur public augur; IAugurTrading public augurTrading; address public zeroXTrade; address public trade; Trade.StoredContracts private storedContracts; mapping (address => uint256[]) public marketOutcomeVolumes; mapping (address => uint256) public marketTotalTrades; uint256 private constant MAX_APPROVAL_AMOUNT = 2 ** 256 - 1; function initialize(IAugur _augur, IAugurTrading _augurTrading) public beforeInitialized { endInitialization(); augur = _augur; augurTrading = _augurTrading; ICash _cash = ICash(augur.lookup("Cash")); storedContracts = Trade.StoredContracts({ augur: _augur, augurTrading: _augurTrading, orders: IOrders(_augurTrading.lookup("Orders")), denominationToken: _cash, profitLoss: IProfitLoss(_augurTrading.lookup("ProfitLoss")), shareToken: IShareToken(_augur.lookup("ShareToken")) }); require(storedContracts.orders != IOrders(0)); require(storedContracts.profitLoss != IProfitLoss(0)); require(storedContracts.shareToken != IShareToken(0)); trade = _augurTrading.lookup("Trade"); require(trade != address(0)); zeroXTrade = _augurTrading.lookup("ZeroXTrade"); require(zeroXTrade != address(0)); _cash.approve(address(_augur), MAX_APPROVAL_AMOUNT); } /** * @notice Fill an order * @param _orderId The id of the order to fill * @param _amountFillerWants The number of attoShares desired * @param _tradeGroupId A Bytes32 value used when attempting to associate multiple orderbook actions with a single TX * @param _fingerprint Fingerprint of the filler used to naively restrict affiliate fee dispursement * @return The amount remaining the filler wants */ function publicFillOrder(bytes32 _orderId, uint256 _amountFillerWants, bytes32 _tradeGroupId, bytes32 _fingerprint) external returns (uint256) { address _filler = msg.sender; Trade.Data memory _tradeData = Trade.create(storedContracts, _orderId, _filler, _amountFillerWants, _fingerprint); (uint256 _amountRemaining, uint256 _fees) = fillOrderInternal(_filler, _tradeData, _amountFillerWants, _tradeGroupId); return _amountRemaining; } function fillOrder(address _filler, bytes32 _orderId, uint256 _amountFillerWants, bytes32 _tradeGroupId, bytes32 _fingerprint) external returns (uint256) { require(msg.sender == trade); Trade.Data memory _tradeData = Trade.create(storedContracts, _orderId, _filler, _amountFillerWants, _fingerprint); (uint256 _amountRemaining, uint256 _fees) = fillOrderInternal(_filler, _tradeData, _amountFillerWants, _tradeGroupId); return _amountRemaining; } function fillZeroXOrder(IMarket _market, uint256 _outcome, uint256 _price, Order.Types _orderType, address _creator, uint256 _amount, bytes32 _fingerprint, bytes32 _tradeGroupId, address _filler) external returns (uint256 _amountRemaining, uint256 _fees) { require(msg.sender == zeroXTrade); require(augur.isKnownMarket(_market)); Trade.OrderData memory _orderData = Trade.createOrderData(storedContracts.shareToken, _market, _outcome, _price, _orderType, _amount, _creator); Trade.Data memory _tradeData = Trade.createWithData(storedContracts, _orderData, _filler, _amount, _fingerprint); return fillOrderInternal(_filler, _tradeData, _amount, _tradeGroupId); } function fillOrderInternal(address _filler, Trade.Data memory _tradeData, uint256 _amountFillerWants, bytes32 _tradeGroupId) internal nonReentrant returns (uint256 _amountRemainingFillerWants, uint256 _totalFees) { uint256 _marketCreatorFees; uint256 _reporterFees; (_marketCreatorFees, _reporterFees) = _tradeData.tradeMakerSharesForFillerShares(); _tradeData.tradeMakerTokensForFillerShares(); _tradeData.tradeMakerSharesForFillerTokens(); uint256 _tokensRefunded = _tradeData.tradeMakerTokensForFillerTokens(); sellCompleteSets(_tradeData); uint256 _amountRemainingFillerWants = _tradeData.filler.sharesToSell.add(_tradeData.filler.sharesToBuy); uint256 _amountFilled = _amountFillerWants.sub(_amountRemainingFillerWants); if (_tradeData.order.orderId != bytes32(0)) { _tradeData.contracts.orders.recordFillOrder(_tradeData.order.orderId, _tradeData.getMakerSharesDepleted(), _tradeData.getMakerTokensDepleted(), _amountFilled); } _totalFees = _marketCreatorFees.add(_reporterFees); if (_tradeData.order.orderId != bytes32(0)) { logOrderFilled(_tradeData, _tradeData.order.sharePriceLong, _totalFees, _amountFilled, _tradeGroupId); } logAndUpdateVolume(_tradeData); if (_totalFees > 0) { uint256 _longFees = _totalFees.mul(_tradeData.order.sharePriceLong).div(_tradeData.contracts.market.getNumTicks()); uint256 _shortFees = _totalFees.sub(_longFees); _tradeData.contracts.profitLoss.adjustTraderProfitForFees(_tradeData.contracts.market, _tradeData.getLongShareBuyerDestination(), _tradeData.order.outcome, _longFees); _tradeData.contracts.profitLoss.adjustTraderProfitForFees(_tradeData.contracts.market, _tradeData.getShortShareBuyerDestination(), _tradeData.order.outcome, _shortFees); } updateProfitLoss(_tradeData, _amountFilled); if (_tradeData.creator.participantAddress == _tradeData.filler.participantAddress) { _tradeData.contracts.profitLoss.recordFrozenFundChange(_tradeData.contracts.universe, _tradeData.contracts.market, _tradeData.creator.participantAddress, _tradeData.order.outcome, -int256(_tokensRefunded)); } return (_amountRemainingFillerWants, _totalFees); } function sellCompleteSets(Trade.Data memory _tradeData) internal returns (bool) { address _filler = _tradeData.filler.participantAddress; address _creator = _tradeData.creator.participantAddress; IMarket _market = _tradeData.contracts.market; uint256 _numOutcomes = _market.getNumberOfOutcomes(); uint256[] memory _outcomes = new uint256[](_numOutcomes); for (uint256 _i = 0; _i < _numOutcomes; _i++) { _outcomes[_i] = _i; } uint256 _fillerCompleteSets = _tradeData.contracts.shareToken.lowestBalanceOfMarketOutcomes(_market, _outcomes, _filler); uint256 _creatorCompleteSets = _tradeData.contracts.shareToken.lowestBalanceOfMarketOutcomes(_market, _outcomes, _creator); if (_fillerCompleteSets > 0) { _tradeData.contracts.shareToken.sellCompleteSets(_market, _filler, _filler, _fillerCompleteSets, _tradeData.fingerprint); } if (_creatorCompleteSets > 0) { _tradeData.contracts.shareToken.sellCompleteSets(_market, _creator, _creator, _creatorCompleteSets, _tradeData.fingerprint); } return true; } function logOrderFilled(Trade.Data memory _tradeData, uint256 _price, uint256 _fees, uint256 _amountFilled, bytes32 _tradeGroupId) private returns (bool) { _tradeData.contracts.augurTrading.logOrderFilled(_tradeData.contracts.universe, _tradeData.creator.participantAddress, _tradeData.filler.participantAddress, _price, _fees, _amountFilled, _tradeData.order.orderId, _tradeGroupId); return true; } function logAndUpdateVolume(Trade.Data memory _tradeData) private { IMarket _market = _tradeData.contracts.market; uint256 _makerSharesDepleted = _tradeData.getMakerSharesDepleted(); uint256 _fillerSharesDepleted = _tradeData.getFillerSharesDepleted(); uint256 _makerTokensDepleted = _tradeData.getMakerTokensDepleted(); uint256 _fillerTokensDepleted = _tradeData.getFillerTokensDepleted(); uint256 _completeSetTokens = _makerSharesDepleted.min(_fillerSharesDepleted).mul(_market.getNumTicks()); if (marketOutcomeVolumes[address(_market)].length == 0) { marketOutcomeVolumes[address(_market)].length = _tradeData.shortOutcomes.length + 1; } marketOutcomeVolumes[address(_market)][_tradeData.order.outcome] = marketOutcomeVolumes[address(_market)][_tradeData.order.outcome].add(_makerTokensDepleted).add(_fillerTokensDepleted).add(_completeSetTokens); uint256[] memory tmpMarketOutcomeVolumes = marketOutcomeVolumes[address(_market)]; uint256 _volume; for (uint256 i = 0; i < tmpMarketOutcomeVolumes.length; i++) { _volume += tmpMarketOutcomeVolumes[i]; } uint256 _totalTrades = marketTotalTrades[address(_market)].add(1); marketTotalTrades[address(_market)] = _totalTrades; _tradeData.contracts.augurTrading.logMarketVolumeChanged(_tradeData.contracts.universe, address(_market), _volume, tmpMarketOutcomeVolumes, _totalTrades); } function updateProfitLoss(Trade.Data memory _tradeData, uint256 _amountFilled) private returns (bool) { uint256 makerTokensDepleted = _tradeData.order.orderId != bytes32(0) ? 0 : _tradeData.getMakerTokensDepleted(); uint256 _numLongTokens = _tradeData.creator.direction == Trade.Direction.Long ? makerTokensDepleted : _tradeData.getFillerTokensDepleted(); uint256 _numShortTokens = _tradeData.creator.direction == Trade.Direction.Short ? makerTokensDepleted : _tradeData.getFillerTokensDepleted(); uint256 _numLongShares = _tradeData.creator.direction == Trade.Direction.Long ? _tradeData.getMakerSharesDepleted() : _tradeData.getFillerSharesDepleted(); uint256 _numShortShares = _tradeData.creator.direction == Trade.Direction.Short ? _tradeData.getMakerSharesDepleted() : _tradeData.getFillerSharesDepleted(); _tradeData.contracts.profitLoss.recordTrade(_tradeData.contracts.universe, _tradeData.contracts.market, _tradeData.getLongShareBuyerDestination(), _tradeData.getShortShareBuyerDestination(), _tradeData.order.outcome, int256(_amountFilled), int256(_tradeData.order.sharePriceLong), _numLongTokens, _numShortTokens, _numLongShares, _numShortShares); return true; } function getMarketOutcomeValues(IMarket _market) public view returns (uint256[] memory) { return marketOutcomeVolumes[address(_market)]; } function getMarketVolume(IMarket _market) public view returns (uint256) { uint256[] memory tmpMarketOutcomeVolumes = marketOutcomeVolumes[address(_market)]; uint256 _volume; for (uint256 i = 0; i < tmpMarketOutcomeVolumes.length; i++) { _volume += tmpMarketOutcomeVolumes[i]; } return _volume; } }
{ "remappings": [ "ROOT=/home/achapman/augur/packages/augur-core/src/contracts//" ], "optimizer": { "enabled": true, "runs": 200, "details": { "yul": true, "deduplicate": true, "cse": true, "constantOptimizer": true } }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":true,"inputs":[],"name":"augur","outputs":[{"internalType":"contract IAugur","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"augurTrading","outputs":[{"internalType":"contract IAugurTrading","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_filler","type":"address"},{"internalType":"bytes32","name":"_orderId","type":"bytes32"},{"internalType":"uint256","name":"_amountFillerWants","type":"uint256"},{"internalType":"bytes32","name":"_tradeGroupId","type":"bytes32"},{"internalType":"bytes32","name":"_fingerprint","type":"bytes32"}],"name":"fillOrder","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract IMarket","name":"_market","type":"address"},{"internalType":"uint256","name":"_outcome","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"enum Order.Types","name":"_orderType","type":"uint8"},{"internalType":"address","name":"_creator","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes32","name":"_fingerprint","type":"bytes32"},{"internalType":"bytes32","name":"_tradeGroupId","type":"bytes32"},{"internalType":"address","name":"_filler","type":"address"}],"name":"fillZeroXOrder","outputs":[{"internalType":"uint256","name":"_amountRemaining","type":"uint256"},{"internalType":"uint256","name":"_fees","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getInitialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"contract IMarket","name":"_market","type":"address"}],"name":"getMarketOutcomeValues","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"contract IMarket","name":"_market","type":"address"}],"name":"getMarketVolume","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"contract IAugur","name":"_augur","type":"address"},{"internalType":"contract IAugurTrading","name":"_augurTrading","type":"address"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"marketOutcomeVolumes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"marketTotalTrades","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"_orderId","type":"bytes32"},{"internalType":"uint256","name":"_amountFillerWants","type":"uint256"},{"internalType":"bytes32","name":"_tradeGroupId","type":"bytes32"},{"internalType":"bytes32","name":"_fingerprint","type":"bytes32"}],"name":"publicFillOrder","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"trade","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"zeroXTrade","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040526000805461ffff1916905534801561001b57600080fd5b50613bfa8061002b6000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c80638e1bfa731161008c578063ca46d4eb11610066578063ca46d4eb14610185578063e09bb55614610198578063ee89dab4146101ab578063f5df1f24146101c0576100cf565b80638e1bfa731461014a578063a0f515ea14610152578063a3ef2c1314610165576100cf565b80631a505b76146100d45780631f0ba6c9146100f2578063485cc955146100fa57806362c9c6a61461010f57806363a50c2a1461012f5780637a0d8f8a14610142575b600080fd5b6100dc6101e1565b6040516100e9919061380f565b60405180910390f35b6100dc6101f0565b61010d610108366004613688565b6101ff565b005b61012261011d366004613657565b61071b565b6040516100e991906138e5565b61012261013d3660046135c9565b6107a1565b6100dc610830565b6100dc610845565b610122610160366004613591565b610854565b610178610173366004613591565b610866565b6040516100e991906138c7565b61012261019336600461360c565b6108d3565b6101226101a6366004613591565b610901565b6101b36109a4565b6040516100e991906138da565b6101d36101ce3660046136c0565b6109ae565b6040516100e9929190613b84565b6002546001600160a01b031681565b6003546001600160a01b031681565b60005460ff161561020f57600080fd5b610217610b03565b6000805462010000600160b01b031916620100006001600160a01b03858116820292909217808455600180546001600160a01b03191686851617905560405163f39ec1f760e01b81529190049091169063f39ec1f79061027990600401613b0f565b60206040518083038186803b15801561029157600080fd5b505afa1580156102a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506102c991908101906135ad565b90506040518060c00160405280846001600160a01b03168152602001836001600160a01b03168152602001836001600160a01b031663f39ec1f76040518163ffffffff1660e01b815260040161031e90613b46565b60206040518083038186803b15801561033657600080fd5b505afa15801561034a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061036e91908101906135ad565b6001600160a01b03168152602001826001600160a01b03168152602001836001600160a01b031663f39ec1f76040518163ffffffff1660e01b81526004016103b590613b6e565b60206040518083038186803b1580156103cd57600080fd5b505afa1580156103e1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061040591908101906135ad565b6001600160a01b03168152602001846001600160a01b031663f39ec1f76040518163ffffffff1660e01b815260040161043d90613b30565b60206040518083038186803b15801561045557600080fd5b505afa158015610469573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061048d91908101906135ad565b6001600160a01b039081169091528151600480546001600160a01b03199081169284169290921790556020830151600580548316918416919091179055604083015160068054831691841691909117908190556060840151600780548416918516919091179055608084015160088054841691851691909117905560a090930151600980549092169083161790551661052557600080fd5b6008546001600160a01b031661053a57600080fd5b6009546001600160a01b031661054f57600080fd5b60405163f39ec1f760e01b81526001600160a01b0383169063f39ec1f79061057990600401613b1f565b60206040518083038186803b15801561059157600080fd5b505afa1580156105a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506105c991908101906135ad565b600380546001600160a01b0319166001600160a01b039283161790819055166105f157600080fd5b60405163f39ec1f760e01b81526001600160a01b0383169063f39ec1f79061061b90600401613b58565b60206040518083038186803b15801561063357600080fd5b505afa158015610647573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061066b91908101906135ad565b600280546001600160a01b0319166001600160a01b0392831617908190551661069357600080fd5b60405163095ea7b360e01b81526001600160a01b0382169063095ea7b3906106c3908690600019906004016138ae565b602060405180830381600087803b1580156106dd57600080fd5b505af11580156106f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506107159190810190613637565b50505050565b6000336107266133f4565b6040805160c0810182526004546001600160a01b03908116825260055481166020830152600654811692820192909252600754821660608201526008548216608082015260095490911660a08201526107829088848988610b22565b905060008061079384848a8a610b56565b509998505050505050505050565b6003546000906001600160a01b031633146107bb57600080fd5b6107c36133f4565b6040805160c0810182526004546001600160a01b03908116825260055481166020830152600654811692820192909252600754821660608201526008548216608082015260095490911660a082015261081f9087898887610b22565b905060008061079389848989610b56565b6000546201000090046001600160a01b031681565b6001546001600160a01b031681565b600b6020526000908152604090205481565b6001600160a01b0381166000908152600a60209081526040918290208054835181840281018401909452808452606093928301828280156108c657602002820191906000526020600020905b8154815260200190600101908083116108b2575b505050505090505b919050565b600a60205281600052604060002081815481106108ec57fe5b90600052602060002001600091509150505481565b6001600160a01b0381166000908152600a60209081526040808320805482518185028101850190935280835260609383018282801561095f57602002820191906000526020600020905b81548152602001906001019080831161094b575b50505050509050600080600090505b825181101561099c5782818151811061098357fe5b602002602001015182019150808060010191505061096e565b509392505050565b60005460ff165b90565b60025460009081906001600160a01b031633146109ca57600080fd5b60005460405163e62b888960e01b8152620100009091046001600160a01b03169063e62b8889906109ff908e9060040161380f565b60206040518083038186803b158015610a1757600080fd5b505afa158015610a2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610a4f9190810190613637565b610a5857600080fd5b610a60613458565b600954610a7b906001600160a01b03168d8d8d8d8c8e610fe0565b9050610a856133f4565b6040805160c0810182526004546001600160a01b03908116825260055481166020830152600654811692820192909252600754821660608201526008548216608082015260095490911660a0820152610ae19083878b8b611061565b9050610aef85828a89610b56565b935093505050995099975050505050505050565b60005460ff1615610b1357600080fd5b6000805460ff19166001179055565b610b2a6133f4565b610b32613458565b610b3c87876111d0565b9050610b4b8782878787611061565b979650505050505050565b600080548190610100900460ff1615610b6e57600080fd5b6000805461ff00191661010017815580610b8787611598565b9092509050610b95876116ce565b50610b9f87611a27565b506000610bab88611cd3565b9050610bb68861225a565b50606088015160a0810151608090910151600091610bda919063ffffffff61259f16565b90506000610bee898363ffffffff6125b816565b60208b01515190915015610c9d5789515160208b0151516001600160a01b0390911690634a1a2d5a90610c208d6125cd565b610c298e6125ee565b856040518563ffffffff1660e01b8152600401610c4994939291906138ee565b602060405180830381600087803b158015610c6357600080fd5b505af1158015610c77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610c9b9190810190613637565b505b610cad858563ffffffff61259f16565b60208b01515190965015610cd257610cd08a8b602001516060015188848c612614565b505b610cdb8a6126cb565b8515610ee8576000610d858b60000151602001516001600160a01b031663bad84c9e6040518163ffffffff1660e01b815260040160206040518083038186803b158015610d2757600080fd5b505afa158015610d3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610d5f919081019061376a565b60208d015160600151610d79908a9063ffffffff612a0616565b9063ffffffff612a2d16565b90506000610d99888363ffffffff6125b816565b90508b6000015160c001516001600160a01b0316635310dd318d6000015160200151610dc48f612a42565b8f6020015160200151866040518563ffffffff1660e01b8152600401610ded9493929190613885565b602060405180830381600087803b158015610e0757600080fd5b505af1158015610e1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610e3f9190810190613637565b508b6000015160c001516001600160a01b0316635310dd318d6000015160200151610e698f612a73565b8f6020015160200151856040518563ffffffff1660e01b8152600401610e929493929190613885565b602060405180830381600087803b158015610eac57600080fd5b505af1158015610ec0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610ee49190810190613637565b5050505b610ef28a82612a7c565b5060608a01515160408b0151516001600160a01b0390811691161415610fc557896000015160c001516001600160a01b0316632e57cab78b6000015160a001518c60000151602001518d60400151600001518e6020015160200151886000036040518663ffffffff1660e01b8152600401610f71959493929190613909565b602060405180830381600087803b158015610f8b57600080fd5b505af1158015610f9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610fc39190810190613637565b505b506000805461ff001916905599939850929650505050505050565b610fe8613458565b6000610ff88989878a8888612c2b565b9050604051806101000160405280896001600160a01b0316815260200188815260200187815260200186600181111561102d57fe5b8152602081019290925260408201949094526001600160a01b03909216606083015250600060809091015295945050505050565b6110696133f4565b61107161349d565b6110848787600001518860200151612d98565b905061108e6134e1565b6110a682886020015189604001518a60e00151612eb3565b90506110b0613513565b6110cc88608001518960a001518a60c001518b60600151612f01565b905060606110e284602001518a60200151612f8a565b90506110ec613513565b611102858b60200151848d606001518d8d613080565b60e08b01519091506000901561111c578560e0015161111f565b83515b90506040518061012001604052808781526020018681526020018581526020018381526020018c6020015181526020018481526020016000600181111561116257fe5b8660200151600181111561117257fe5b1461117e578351611180565b825b6001600160a01b031681526020016001866020015160018111156111a057fe5b146111ac5783516111ae565b825b6001600160a01b03168152602001899052965050505050505095945050505050565b6111d8613458565b604080840151815161010081019283905263c3c95c7b60e01b90925290806001600160a01b03831663c3c95c7b6112138761010485016138e5565b60206040518083038186803b15801561122b57600080fd5b505afa15801561123f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061126391908101906135ad565b6001600160a01b03168152602001826001600160a01b0316635d1a3b82866040518263ffffffff1660e01b815260040161129d91906138e5565b60206040518083038186803b1580156112b557600080fd5b505afa1580156112c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506112ed919081019061376a565b8152602001826001600160a01b03166331d98b3f866040518263ffffffff1660e01b815260040161131e91906138e5565b60206040518083038186803b15801561133657600080fd5b505afa15801561134a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061136e919081019061376a565b8152602001826001600160a01b031663cf357364866040518263ffffffff1660e01b815260040161139f91906138e5565b60206040518083038186803b1580156113b757600080fd5b505afa1580156113cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506113ef919081019061374e565b60018111156113fa57fe5b8152602001826001600160a01b031663ebead05f866040518263ffffffff1660e01b815260040161142b91906138e5565b60206040518083038186803b15801561144357600080fd5b505afa158015611457573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061147b919081019061376a565b8152602001826001600160a01b0316630e0a0d74866040518263ffffffff1660e01b81526004016114ac91906138e5565b60206040518083038186803b1580156114c457600080fd5b505afa1580156114d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506114fc919081019061376a565b8152602001826001600160a01b031663e7d80c70866040518263ffffffff1660e01b815260040161152d91906138e5565b60206040518083038186803b15801561154557600080fd5b505afa158015611559573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061157d91908101906135ad565b6001600160a01b031681526020018490529150505b92915050565b60008060006115c084606001516080015185604001516080015161311e90919063ffffffff16565b9050806115d45750600091508190506116c9565b8360000151606001516001600160a01b03166353b7a7128560000151602001518660800151848860e001518960c0015161160d8b612a42565b6116168c612a73565b8c60200151606001518d60600151600001518e61010001516040518b63ffffffff1660e01b81526004016116539a999897969594939291906139c7565b6040805180830381600087803b15801561166c57600080fd5b505af1158015611680573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506116a49190810190613782565b6040860151608090810180518590039052606087015101805193909303909252925090505b915091565b6000806116f4836040015160a0015184606001516080015161311e90919063ffffffff16565b9050806117055760019150506108ce565b6001836060015160200151600181111561171b57fe5b14156117b7578260000151606001516001600160a01b031663fbc37ca98460600151600001518560400151600001516117608760000151602001518860800151613135565b856040518563ffffffff1660e01b81526004016117809493929190613885565b600060405180830381600087803b15801561179a57600080fd5b505af11580156117ae573d6000803e3d6000fd5b505050506118af565b60608360a00151516040519080825280602002602001820160405280156117e8578160200160208202803883390190505b50905060005b8460a001515181101561181b578282828151811061180857fe5b60209081029190910101526001016117ee565b508360000151606001516001600160a01b0316634028e8ea85606001516000015186604001516000015161185b8860000151602001518960a00151613168565b856040518563ffffffff1660e01b815260040161187b9493929190613823565b600060405180830381600087803b15801561189557600080fd5b505af11580156118a9573d6000803e3d6000fd5b50505050505b60006118c484856040015160200151846131e7565b60208501515190915061196a578351604090810151818601515160608701515192516323b872dd60e01b81526001600160a01b03909216926323b872dd926119129291908690600401613861565b602060405180830381600087803b15801561192c57600080fd5b505af1158015611940573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506119649190810190613637565b506119ff565b835160408082015160e09092015160608701515191516323b872dd60e01b81526001600160a01b03909316926323b872dd926119ab92918690600401613861565b602060405180830381600087803b1580156119c557600080fd5b505af11580156119d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506119fd9190810190613637565b505b50604083015160a0018051829003905260608301516080018051919091039052506001919050565b600080611a4d836060015160a0015184604001516080015161311e90919063ffffffff16565b905080611a5e5760019150506108ce565b60018360400151602001516001811115611a7457fe5b1415611b0c578260000151606001516001600160a01b031663fbc37ca98460e00151856060015160000151611ab58760000151602001518860800151613135565b856040518563ffffffff1660e01b8152600401611ad59493929190613885565b600060405180830381600087803b158015611aef57600080fd5b505af1158015611b03573d6000803e3d6000fd5b50505050611c00565b60608360a0015151604051908082528060200260200182016040528015611b3d578160200160208202803883390190505b50905060005b8460a0015151811015611b705782828281518110611b5d57fe5b6020908102919091010152600101611b43565b508360000151606001516001600160a01b0316634028e8ea8560c00151866060015160000151611bac8860000151602001518960a00151613168565b856040518563ffffffff1660e01b8152600401611bcc9493929190613823565b600060405180830381600087803b158015611be657600080fd5b505af1158015611bfa573d6000803e3d6000fd5b50505050505b6000611c1584856060015160200151846131e7565b8451604090810151606087015151828801515192516323b872dd60e01b81529394506001600160a01b03909116926323b872dd92611c5892918690600401613861565b602060405180830381600087803b158015611c7257600080fd5b505af1158015611c86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611caa9190810190613637565b5050604083015160800180518290039052606083015160a0018051919091039052506001919050565b600080611cf9836060015160a00151846040015160a0015161311e90919063ffffffff16565b905080611d0a5760009150506108ce565b6060830151516040840151516001600160a01b0390811691161415611e24576000611d3e84856040015160200151846131e7565b90506000611d5585866060015160200151856131e7565b855160408082015160e090920151818901515191516323b872dd60e01b81529394506001600160a01b03909216926323b872dd92611d999290918790600401613861565b602060405180830381600087803b158015611db357600080fd5b505af1158015611dc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611deb9190810190613637565b50604085015160a09081018051859003905260608601510180518490039052611e1a828263ffffffff61259f16565b93505050506108ce565b6000611e4184602001516060015183612a0690919063ffffffff16565b90506000611e6085602001516080015184612a0690919063ffffffff16565b905060008560000151602001516001600160a01b031663870c426d6040518163ffffffff1660e01b815260040160206040518083038186803b158015611ea557600080fd5b505afa158015611eb9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611edd91908101906135ad565b90508560000151602001516001600160a01b03168660c001516001600160a01b03161415611f9957855160408082015160e09092015190516323b872dd60e01b81526001600160a01b03909216916323b872dd91611f419130908890600401613861565b602060405180830381600087803b158015611f5b57600080fd5b505af1158015611f6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611f939190810190613637565b50612029565b8560000151604001516001600160a01b03166323b872dd8760c0015130866040518463ffffffff1660e01b8152600401611fd593929190613861565b602060405180830381600087803b158015611fef57600080fd5b505af1158015612003573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506120279190810190613637565b505b8560000151602001516001600160a01b03168660e001516001600160a01b031614156120e357855160408082015160e09092015190516323b872dd60e01b81526001600160a01b03909216916323b872dd9161208b9130908790600401613861565b602060405180830381600087803b1580156120a557600080fd5b505af11580156120b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506120dd9190810190613637565b50612173565b8560000151604001516001600160a01b03166323b872dd8760e0015130856040518463ffffffff1660e01b815260040161211f93929190613861565b602060405180830381600087803b15801561213957600080fd5b505af115801561214d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506121719190810190613637565b505b600061217e87612a42565b9050600061218b88612a73565b90508760000151606001516001600160a01b031663431e8878896000015160200151888b602001516020015186866040518663ffffffff1660e01b81526004016121d9959493929190613995565b602060405180830381600087803b1580156121f357600080fd5b505af1158015612207573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061222b9190810190613637565b505050604086015160a09081018051869003905260608701510180519490940390935250600092505050919050565b60608101515160408083015151835160209081015183516309f396e360e21b8152935160009594919286926001600160a01b038516926327ce5b8c92600480840193919291829003018186803b1580156122b357600080fd5b505afa1580156122c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506122eb919081019061376a565b9050606081604051908082528060200260200182016040528015612319578160200160208202803883390190505b50905060005b82811015612347578082828151811061233457fe5b602090810291909101015260010161231f565b5086516060015160405163f8a2167b60e01b81526000916001600160a01b03169063f8a2167b9061238090879086908b9060040161393d565b60206040518083038186803b15801561239857600080fd5b505afa1580156123ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506123d0919081019061376a565b905060008860000151606001516001600160a01b031663f8a2167b8685896040518463ffffffff1660e01b815260040161240c9392919061393d565b60206040518083038186803b15801561242457600080fd5b505afa158015612438573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061245c919081019061376a565b905081156124f7578851606001516101008a0151604051632cc87f5360e11b81526001600160a01b0390921691635990fea6916124a39189918c9182918991600401613909565b6040805180830381600087803b1580156124bc57600080fd5b505af11580156124d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506124f49190810190613782565b50505b8015612590578851606001516101008a0151604051632cc87f5360e11b81526001600160a01b0390921691635990fea69161253c9189918b9182918891600401613909565b6040805180830381600087803b15801561255557600080fd5b505af1158015612569573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061258d9190810190613782565b50505b50600198975050505050505050565b6000828201838110156125b157600080fd5b9392505050565b6000828211156125c757600080fd5b50900390565b6040808201516080810151910151600091611592919063ffffffff6125b816565b600061159282836040015160200151846040015160600151856040015160a0015161320d565b845160e081015160a0909101516040808801515160608901515160208a0151519251635ae5c8e760e01b81526000956001600160a01b031694635ae5c8e79461266c94919391928c918c918c91908c90600401613a21565b602060405180830381600087803b15801561268657600080fd5b505af115801561269a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506126be9190810190613637565b5060019695505050505050565b80516020015160006126dc836125cd565b905060006126e984613255565b905060006126f6856125ee565b9050600061270386613278565b90506000612797866001600160a01b031663bad84c9e6040518163ffffffff1660e01b815260040160206040518083038186803b15801561274357600080fd5b505afa158015612757573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061277b919081019061376a565b61278b878763ffffffff61311e16565b9063ffffffff612a0616565b6001600160a01b0387166000908152600a60205260409020549091506127e75760a0870151516001600160a01b0387166000908152600a602052604090206001909101906127e5908261354a565b505b612850816128448461284487600a60008d6001600160a01b03166001600160a01b031681526020019081526020016000208d60200151602001518154811061282b57fe5b906000526020600020015461259f90919063ffffffff16565b9063ffffffff61259f16565b6001600160a01b0387166000908152600a6020908152604090912089820151909101518154811061287d57fe5b60009182526020808320909101929092556001600160a01b0388168152600a825260409081902080548251818502810185019093528083526060938301828280156128e757602002820191906000526020600020905b8154815260200190600101908083116128d3575b50505050509050600080600090505b82518110156129245782818151811061290b57fe5b60200260200101518201915080806001019150506128f6565b506001600160a01b0388166000908152600b602052604081205461294f90600163ffffffff61259f16565b6001600160a01b03808b166000908152600b6020526040908190208390558c5160e081015160a0909101519151639ae36ee560e01b815293945090911691639ae36ee5916129a7918d90879089908890600401613a68565b602060405180830381600087803b1580156129c157600080fd5b505af11580156129d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506129f99190810190613637565b5050505050505050505050565b600082612a1557506000611592565b82820282848281612a2257fe5b04146125b157600080fd5b600080828481612a3957fe5b04949350505050565b6000805b8260400151602001516001811115612a5a57fe5b14612a6a57606082015151611592565b50604001515190565b60006001612a46565b6020820151516000908190612a9957612a94846125ee565b612a9c565b60005b90506000808560400151602001516001811115612ab557fe5b14612ac857612ac385613278565b612aca565b815b9050600060018660400151602001516001811115612ae457fe5b14612af757612af286613278565b612af9565b825b90506000808760400151602001516001811115612b1257fe5b14612b2557612b2087613255565b612b2e565b612b2e876125cd565b9050600060018860400151602001516001811115612b4857fe5b14612b5b57612b5688613255565b612b64565b612b64886125cd565b885160c081015160a08201516020909201519293506001600160a01b0316916312922c949190612b938c612a42565b612b9c8d612a73565b8d60200151602001518d8f60200151606001518c8c8c8c6040518c63ffffffff1660e01b8152600401612bd99b9a99989796959493929190613aad565b602060405180830381600087803b158015612bf357600080fd5b505af1158015612c07573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506125909190810190613637565b600080866001600160a01b03166327ce5b8c6040518163ffffffff1660e01b815260040160206040518083038186803b158015612c6757600080fd5b505afa158015612c7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612c9f919081019061376a565b90506000866001811115612caf57fe5b1415612d5657612d4e84896001600160a01b031663f8a2167b8a612cd38c8b612f8a565b886040518463ffffffff1660e01b8152600401612cf29392919061393d565b60206040518083038186803b158015612d0a57600080fd5b505afa158015612d1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612d42919081019061376a565b9063ffffffff61311e16565b915050612d8e565b612d8a84896001600160a01b031663d64c62f38a89886040518463ffffffff1660e01b8152600401612cf293929190613972565b9150505b9695505050505050565b612da061349d565b60405180610100016040528085604001516001600160a01b03168152602001846001600160a01b0316815260200185606001516001600160a01b031681526020018560a001516001600160a01b0316815260200185600001516001600160a01b03168152602001846001600160a01b031663870c426d6040518163ffffffff1660e01b815260040160206040518083038186803b158015612e4057600080fd5b505afa158015612e54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612e7891908101906135ad565b6001600160a01b0316815260200185608001516001600160a01b0316815260200185602001516001600160a01b031681525090509392505050565b612ebb6134e1565b6000806000612ece88602001518761329e565b6040805160a081018252988952602089019a909a5298870191909152606086015250505050608081019290925250919050565b612f09613513565b600080836001811115612f1857fe5b14612f24576001612f27565b60005b90506000612f3b868863ffffffff6125b816565b90506040518060c00160405280866001600160a01b03168152602001836001811115612f6357fe5b81526020018881526020018281526020018881526020018281525092505050949350505050565b60606000836001600160a01b03166327ce5b8c6040518163ffffffff1660e01b815260040160206040518083038186803b158015612fc757600080fd5b505afa158015612fdb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612fff919081019061376a565b9050606060018203604051908082528060200260200182016040528015613030578160200160208202803883390190505b5090506000805b600184038110156130755785811415613051576001909101905b8183828151811061305e57fe5b602090810291909101015260019182019101613037565b509095945050505050565b613088613513565b60008085600181111561309757fe5b146130a35760006130a6565b60015b905060006130b8898989888689613333565b905060006130cc858363ffffffff6125b816565b90506040518060c00160405280876001600160a01b031681526020018460018111156130f457fe5b81526020018381526020018281526020018381526020018281525093505050509695505050505050565b600081831161312e575081611592565b5080611592565b60006060838360405160200161314c9291906137e0565b60408051601f1981840301815291905260200151949350505050565b60608151604051908082528060200260200182016040528015613195578160200160208202803883390190505b50905060005b82518110156131e0576131c1848483815181106131b457fe5b6020026020010151613135565b8282815181106131cd57fe5b602090810291909101015260010161319b565b5092915050565b600061320583856020015160600151866020015160800151856133c8565b949350505050565b600061324c8185600181111561321f57fe5b146132325785602001516080015161323c565b8560200151606001515b61278b858563ffffffff6125b816565b95945050505050565b60608101516080810151604090910151600091611592919063ffffffff6125b816565b600061159282836060015160200151846060015160600151856060015160a0015161320d565b600080600080856001600160a01b031663bad84c9e6040518163ffffffff1660e01b815260040160206040518083038186803b1580156132dd57600080fd5b505afa1580156132f1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613315919081019061376a565b9050613327818663ffffffff6125b816565b90969495509392505050565b6000600183600181111561334357fe5b141561338c576133858288606001516001600160a01b031663d64c62f38a602001518a896040518463ffffffff1660e01b8152600401612cf293929190613972565b9050612d8e565b610b4b8288606001516001600160a01b031663f8a2167b8a6020015189896040518463ffffffff1660e01b8152600401612cf29392919061393d565b600061324c818660018111156133da57fe5b146133e557836133e7565b845b839063ffffffff612a0616565b60405180610120016040528061340861349d565b81526020016134156134e1565b8152602001613422613513565b815260200161342f613513565b815260006020820181905260606040830181905282018190526080820181905260a09091015290565b60408051610100810182526000808252602082018190529181018290529060608201908152600060208201819052604082018190526060820181905260809091015290565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081019190915290565b6040518060a0016040528060008019168152602001600081526020016000815260200160008152602001600081525090565b6040805160c08101909152600080825260208201908152602001600081526020016000815260200160008152602001600081525090565b81548183558181111561356e5760008381526020902061356e918101908301613573565b505050565b6109ab91905b8082111561358d5760008155600101613579565b5090565b6000602082840312156135a2578081fd5b81356125b181613b92565b6000602082840312156135be578081fd5b81516125b181613b92565b600080600080600060a086880312156135e0578081fd5b85356135eb81613b92565b97602087013597506040870135966060810135965060800135945092505050565b6000806040838503121561361e578182fd5b823561362981613b92565b946020939093013593505050565b600060208284031215613648578081fd5b815180151581146125b1578182fd5b6000806000806080858703121561366c578384fd5b5050823594602084013594506040840135936060013592509050565b6000806040838503121561369a578182fd5b82356136a581613b92565b915060208301356136b581613b92565b809150509250929050565b60008060008060008060008060006101208a8c0312156136de578384fd5b89356136e981613b92565b985060208a0135975060408a0135965060608a013561370781613baa565b955060808a013561371781613b92565b945060a08a0135935060c08a0135925060e08a013591506101008a013561373d81613b92565b809150509295985092959850929598565b60006020828403121561375f578081fd5b81516125b181613baa565b60006020828403121561377b578081fd5b5051919050565b60008060408385031215613794578182fd5b505080516020909101519092909150565b6000815180845260208401935060208301825b828110156137d65781518652602095860195909101906001016137b8565b5093949350505050565b60609290921b6bffffffffffffffffffffffff1916825260f81b6001600160f81b031916601482015260150190565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260806040820181905260009061384f908301856137a5565b8281036060840152610b4b81856137a5565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0394851681529290931660208301526040820152606081019190915260800190565b6001600160a01b03929092168252602082015260400190565b6000602082526125b160208301846137a5565b901515815260200190565b90815260200190565b93845260208401929092526040830152606082015260800190565b6001600160a01b03958616815293851660208501529190931660408301526060820192909252608081019190915260a00190565b600060018060a01b0380861683526060602084015261395f60608401866137a5565b9150808416604084015250949350505050565b6001600160a01b0393841681526020810192909252909116604082015260600190565b6001600160a01b0395861681526020810194909452604084019290925283166060830152909116608082015260a00190565b6001600160a01b039a8b168152602081019990995260408901979097529488166060880152928716608087015290861660a0860152851660c085015260e08401529092166101008201526101208101919091526101400190565b6001600160a01b03988916815296881660208801529490961660408601526060850192909252608084015260a083015260c082019290925260e08101919091526101000190565b6001600160a01b038681168252851660208201526040810184905260a060608201819052600090613a9b908301856137a5565b90508260808301529695505050505050565b6001600160a01b039b8c168152998b1660208b0152978a1660408a0152959098166060880152608087019390935260a086019190915260c085015260e08401526101008301939093526101208201929092526101408101919091526101600190565b63086c2e6d60e31b815260200190565b64547261646560d81b815260200190565b6929b430b932aa37b5b2b760b11b815260200190565b654f726465727360d01b815260200190565b695a65726f58547261646560b01b815260200190565b6950726f6669744c6f737360b01b815260200190565b918252602082015260400190565b6001600160a01b0381168114613ba757600080fd5b50565b60028110613ba757600080fdfea365627a7a72315820f4dfa63ff74df0d5a9b11dc6aa91bec695862264948b671d106890b812e6aae36c6578706572696d656e74616cf564736f6c634300050f0040
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100cf5760003560e01c80638e1bfa731161008c578063ca46d4eb11610066578063ca46d4eb14610185578063e09bb55614610198578063ee89dab4146101ab578063f5df1f24146101c0576100cf565b80638e1bfa731461014a578063a0f515ea14610152578063a3ef2c1314610165576100cf565b80631a505b76146100d45780631f0ba6c9146100f2578063485cc955146100fa57806362c9c6a61461010f57806363a50c2a1461012f5780637a0d8f8a14610142575b600080fd5b6100dc6101e1565b6040516100e9919061380f565b60405180910390f35b6100dc6101f0565b61010d610108366004613688565b6101ff565b005b61012261011d366004613657565b61071b565b6040516100e991906138e5565b61012261013d3660046135c9565b6107a1565b6100dc610830565b6100dc610845565b610122610160366004613591565b610854565b610178610173366004613591565b610866565b6040516100e991906138c7565b61012261019336600461360c565b6108d3565b6101226101a6366004613591565b610901565b6101b36109a4565b6040516100e991906138da565b6101d36101ce3660046136c0565b6109ae565b6040516100e9929190613b84565b6002546001600160a01b031681565b6003546001600160a01b031681565b60005460ff161561020f57600080fd5b610217610b03565b6000805462010000600160b01b031916620100006001600160a01b03858116820292909217808455600180546001600160a01b03191686851617905560405163f39ec1f760e01b81529190049091169063f39ec1f79061027990600401613b0f565b60206040518083038186803b15801561029157600080fd5b505afa1580156102a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506102c991908101906135ad565b90506040518060c00160405280846001600160a01b03168152602001836001600160a01b03168152602001836001600160a01b031663f39ec1f76040518163ffffffff1660e01b815260040161031e90613b46565b60206040518083038186803b15801561033657600080fd5b505afa15801561034a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061036e91908101906135ad565b6001600160a01b03168152602001826001600160a01b03168152602001836001600160a01b031663f39ec1f76040518163ffffffff1660e01b81526004016103b590613b6e565b60206040518083038186803b1580156103cd57600080fd5b505afa1580156103e1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061040591908101906135ad565b6001600160a01b03168152602001846001600160a01b031663f39ec1f76040518163ffffffff1660e01b815260040161043d90613b30565b60206040518083038186803b15801561045557600080fd5b505afa158015610469573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061048d91908101906135ad565b6001600160a01b039081169091528151600480546001600160a01b03199081169284169290921790556020830151600580548316918416919091179055604083015160068054831691841691909117908190556060840151600780548416918516919091179055608084015160088054841691851691909117905560a090930151600980549092169083161790551661052557600080fd5b6008546001600160a01b031661053a57600080fd5b6009546001600160a01b031661054f57600080fd5b60405163f39ec1f760e01b81526001600160a01b0383169063f39ec1f79061057990600401613b1f565b60206040518083038186803b15801561059157600080fd5b505afa1580156105a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506105c991908101906135ad565b600380546001600160a01b0319166001600160a01b039283161790819055166105f157600080fd5b60405163f39ec1f760e01b81526001600160a01b0383169063f39ec1f79061061b90600401613b58565b60206040518083038186803b15801561063357600080fd5b505afa158015610647573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061066b91908101906135ad565b600280546001600160a01b0319166001600160a01b0392831617908190551661069357600080fd5b60405163095ea7b360e01b81526001600160a01b0382169063095ea7b3906106c3908690600019906004016138ae565b602060405180830381600087803b1580156106dd57600080fd5b505af11580156106f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506107159190810190613637565b50505050565b6000336107266133f4565b6040805160c0810182526004546001600160a01b03908116825260055481166020830152600654811692820192909252600754821660608201526008548216608082015260095490911660a08201526107829088848988610b22565b905060008061079384848a8a610b56565b509998505050505050505050565b6003546000906001600160a01b031633146107bb57600080fd5b6107c36133f4565b6040805160c0810182526004546001600160a01b03908116825260055481166020830152600654811692820192909252600754821660608201526008548216608082015260095490911660a082015261081f9087898887610b22565b905060008061079389848989610b56565b6000546201000090046001600160a01b031681565b6001546001600160a01b031681565b600b6020526000908152604090205481565b6001600160a01b0381166000908152600a60209081526040918290208054835181840281018401909452808452606093928301828280156108c657602002820191906000526020600020905b8154815260200190600101908083116108b2575b505050505090505b919050565b600a60205281600052604060002081815481106108ec57fe5b90600052602060002001600091509150505481565b6001600160a01b0381166000908152600a60209081526040808320805482518185028101850190935280835260609383018282801561095f57602002820191906000526020600020905b81548152602001906001019080831161094b575b50505050509050600080600090505b825181101561099c5782818151811061098357fe5b602002602001015182019150808060010191505061096e565b509392505050565b60005460ff165b90565b60025460009081906001600160a01b031633146109ca57600080fd5b60005460405163e62b888960e01b8152620100009091046001600160a01b03169063e62b8889906109ff908e9060040161380f565b60206040518083038186803b158015610a1757600080fd5b505afa158015610a2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610a4f9190810190613637565b610a5857600080fd5b610a60613458565b600954610a7b906001600160a01b03168d8d8d8d8c8e610fe0565b9050610a856133f4565b6040805160c0810182526004546001600160a01b03908116825260055481166020830152600654811692820192909252600754821660608201526008548216608082015260095490911660a0820152610ae19083878b8b611061565b9050610aef85828a89610b56565b935093505050995099975050505050505050565b60005460ff1615610b1357600080fd5b6000805460ff19166001179055565b610b2a6133f4565b610b32613458565b610b3c87876111d0565b9050610b4b8782878787611061565b979650505050505050565b600080548190610100900460ff1615610b6e57600080fd5b6000805461ff00191661010017815580610b8787611598565b9092509050610b95876116ce565b50610b9f87611a27565b506000610bab88611cd3565b9050610bb68861225a565b50606088015160a0810151608090910151600091610bda919063ffffffff61259f16565b90506000610bee898363ffffffff6125b816565b60208b01515190915015610c9d5789515160208b0151516001600160a01b0390911690634a1a2d5a90610c208d6125cd565b610c298e6125ee565b856040518563ffffffff1660e01b8152600401610c4994939291906138ee565b602060405180830381600087803b158015610c6357600080fd5b505af1158015610c77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610c9b9190810190613637565b505b610cad858563ffffffff61259f16565b60208b01515190965015610cd257610cd08a8b602001516060015188848c612614565b505b610cdb8a6126cb565b8515610ee8576000610d858b60000151602001516001600160a01b031663bad84c9e6040518163ffffffff1660e01b815260040160206040518083038186803b158015610d2757600080fd5b505afa158015610d3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610d5f919081019061376a565b60208d015160600151610d79908a9063ffffffff612a0616565b9063ffffffff612a2d16565b90506000610d99888363ffffffff6125b816565b90508b6000015160c001516001600160a01b0316635310dd318d6000015160200151610dc48f612a42565b8f6020015160200151866040518563ffffffff1660e01b8152600401610ded9493929190613885565b602060405180830381600087803b158015610e0757600080fd5b505af1158015610e1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610e3f9190810190613637565b508b6000015160c001516001600160a01b0316635310dd318d6000015160200151610e698f612a73565b8f6020015160200151856040518563ffffffff1660e01b8152600401610e929493929190613885565b602060405180830381600087803b158015610eac57600080fd5b505af1158015610ec0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610ee49190810190613637565b5050505b610ef28a82612a7c565b5060608a01515160408b0151516001600160a01b0390811691161415610fc557896000015160c001516001600160a01b0316632e57cab78b6000015160a001518c60000151602001518d60400151600001518e6020015160200151886000036040518663ffffffff1660e01b8152600401610f71959493929190613909565b602060405180830381600087803b158015610f8b57600080fd5b505af1158015610f9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610fc39190810190613637565b505b506000805461ff001916905599939850929650505050505050565b610fe8613458565b6000610ff88989878a8888612c2b565b9050604051806101000160405280896001600160a01b0316815260200188815260200187815260200186600181111561102d57fe5b8152602081019290925260408201949094526001600160a01b03909216606083015250600060809091015295945050505050565b6110696133f4565b61107161349d565b6110848787600001518860200151612d98565b905061108e6134e1565b6110a682886020015189604001518a60e00151612eb3565b90506110b0613513565b6110cc88608001518960a001518a60c001518b60600151612f01565b905060606110e284602001518a60200151612f8a565b90506110ec613513565b611102858b60200151848d606001518d8d613080565b60e08b01519091506000901561111c578560e0015161111f565b83515b90506040518061012001604052808781526020018681526020018581526020018381526020018c6020015181526020018481526020016000600181111561116257fe5b8660200151600181111561117257fe5b1461117e578351611180565b825b6001600160a01b031681526020016001866020015160018111156111a057fe5b146111ac5783516111ae565b825b6001600160a01b03168152602001899052965050505050505095945050505050565b6111d8613458565b604080840151815161010081019283905263c3c95c7b60e01b90925290806001600160a01b03831663c3c95c7b6112138761010485016138e5565b60206040518083038186803b15801561122b57600080fd5b505afa15801561123f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061126391908101906135ad565b6001600160a01b03168152602001826001600160a01b0316635d1a3b82866040518263ffffffff1660e01b815260040161129d91906138e5565b60206040518083038186803b1580156112b557600080fd5b505afa1580156112c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506112ed919081019061376a565b8152602001826001600160a01b03166331d98b3f866040518263ffffffff1660e01b815260040161131e91906138e5565b60206040518083038186803b15801561133657600080fd5b505afa15801561134a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061136e919081019061376a565b8152602001826001600160a01b031663cf357364866040518263ffffffff1660e01b815260040161139f91906138e5565b60206040518083038186803b1580156113b757600080fd5b505afa1580156113cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506113ef919081019061374e565b60018111156113fa57fe5b8152602001826001600160a01b031663ebead05f866040518263ffffffff1660e01b815260040161142b91906138e5565b60206040518083038186803b15801561144357600080fd5b505afa158015611457573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061147b919081019061376a565b8152602001826001600160a01b0316630e0a0d74866040518263ffffffff1660e01b81526004016114ac91906138e5565b60206040518083038186803b1580156114c457600080fd5b505afa1580156114d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506114fc919081019061376a565b8152602001826001600160a01b031663e7d80c70866040518263ffffffff1660e01b815260040161152d91906138e5565b60206040518083038186803b15801561154557600080fd5b505afa158015611559573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061157d91908101906135ad565b6001600160a01b031681526020018490529150505b92915050565b60008060006115c084606001516080015185604001516080015161311e90919063ffffffff16565b9050806115d45750600091508190506116c9565b8360000151606001516001600160a01b03166353b7a7128560000151602001518660800151848860e001518960c0015161160d8b612a42565b6116168c612a73565b8c60200151606001518d60600151600001518e61010001516040518b63ffffffff1660e01b81526004016116539a999897969594939291906139c7565b6040805180830381600087803b15801561166c57600080fd5b505af1158015611680573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506116a49190810190613782565b6040860151608090810180518590039052606087015101805193909303909252925090505b915091565b6000806116f4836040015160a0015184606001516080015161311e90919063ffffffff16565b9050806117055760019150506108ce565b6001836060015160200151600181111561171b57fe5b14156117b7578260000151606001516001600160a01b031663fbc37ca98460600151600001518560400151600001516117608760000151602001518860800151613135565b856040518563ffffffff1660e01b81526004016117809493929190613885565b600060405180830381600087803b15801561179a57600080fd5b505af11580156117ae573d6000803e3d6000fd5b505050506118af565b60608360a00151516040519080825280602002602001820160405280156117e8578160200160208202803883390190505b50905060005b8460a001515181101561181b578282828151811061180857fe5b60209081029190910101526001016117ee565b508360000151606001516001600160a01b0316634028e8ea85606001516000015186604001516000015161185b8860000151602001518960a00151613168565b856040518563ffffffff1660e01b815260040161187b9493929190613823565b600060405180830381600087803b15801561189557600080fd5b505af11580156118a9573d6000803e3d6000fd5b50505050505b60006118c484856040015160200151846131e7565b60208501515190915061196a578351604090810151818601515160608701515192516323b872dd60e01b81526001600160a01b03909216926323b872dd926119129291908690600401613861565b602060405180830381600087803b15801561192c57600080fd5b505af1158015611940573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506119649190810190613637565b506119ff565b835160408082015160e09092015160608701515191516323b872dd60e01b81526001600160a01b03909316926323b872dd926119ab92918690600401613861565b602060405180830381600087803b1580156119c557600080fd5b505af11580156119d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506119fd9190810190613637565b505b50604083015160a0018051829003905260608301516080018051919091039052506001919050565b600080611a4d836060015160a0015184604001516080015161311e90919063ffffffff16565b905080611a5e5760019150506108ce565b60018360400151602001516001811115611a7457fe5b1415611b0c578260000151606001516001600160a01b031663fbc37ca98460e00151856060015160000151611ab58760000151602001518860800151613135565b856040518563ffffffff1660e01b8152600401611ad59493929190613885565b600060405180830381600087803b158015611aef57600080fd5b505af1158015611b03573d6000803e3d6000fd5b50505050611c00565b60608360a0015151604051908082528060200260200182016040528015611b3d578160200160208202803883390190505b50905060005b8460a0015151811015611b705782828281518110611b5d57fe5b6020908102919091010152600101611b43565b508360000151606001516001600160a01b0316634028e8ea8560c00151866060015160000151611bac8860000151602001518960a00151613168565b856040518563ffffffff1660e01b8152600401611bcc9493929190613823565b600060405180830381600087803b158015611be657600080fd5b505af1158015611bfa573d6000803e3d6000fd5b50505050505b6000611c1584856060015160200151846131e7565b8451604090810151606087015151828801515192516323b872dd60e01b81529394506001600160a01b03909116926323b872dd92611c5892918690600401613861565b602060405180830381600087803b158015611c7257600080fd5b505af1158015611c86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611caa9190810190613637565b5050604083015160800180518290039052606083015160a0018051919091039052506001919050565b600080611cf9836060015160a00151846040015160a0015161311e90919063ffffffff16565b905080611d0a5760009150506108ce565b6060830151516040840151516001600160a01b0390811691161415611e24576000611d3e84856040015160200151846131e7565b90506000611d5585866060015160200151856131e7565b855160408082015160e090920151818901515191516323b872dd60e01b81529394506001600160a01b03909216926323b872dd92611d999290918790600401613861565b602060405180830381600087803b158015611db357600080fd5b505af1158015611dc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611deb9190810190613637565b50604085015160a09081018051859003905260608601510180518490039052611e1a828263ffffffff61259f16565b93505050506108ce565b6000611e4184602001516060015183612a0690919063ffffffff16565b90506000611e6085602001516080015184612a0690919063ffffffff16565b905060008560000151602001516001600160a01b031663870c426d6040518163ffffffff1660e01b815260040160206040518083038186803b158015611ea557600080fd5b505afa158015611eb9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611edd91908101906135ad565b90508560000151602001516001600160a01b03168660c001516001600160a01b03161415611f9957855160408082015160e09092015190516323b872dd60e01b81526001600160a01b03909216916323b872dd91611f419130908890600401613861565b602060405180830381600087803b158015611f5b57600080fd5b505af1158015611f6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611f939190810190613637565b50612029565b8560000151604001516001600160a01b03166323b872dd8760c0015130866040518463ffffffff1660e01b8152600401611fd593929190613861565b602060405180830381600087803b158015611fef57600080fd5b505af1158015612003573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506120279190810190613637565b505b8560000151602001516001600160a01b03168660e001516001600160a01b031614156120e357855160408082015160e09092015190516323b872dd60e01b81526001600160a01b03909216916323b872dd9161208b9130908790600401613861565b602060405180830381600087803b1580156120a557600080fd5b505af11580156120b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506120dd9190810190613637565b50612173565b8560000151604001516001600160a01b03166323b872dd8760e0015130856040518463ffffffff1660e01b815260040161211f93929190613861565b602060405180830381600087803b15801561213957600080fd5b505af115801561214d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506121719190810190613637565b505b600061217e87612a42565b9050600061218b88612a73565b90508760000151606001516001600160a01b031663431e8878896000015160200151888b602001516020015186866040518663ffffffff1660e01b81526004016121d9959493929190613995565b602060405180830381600087803b1580156121f357600080fd5b505af1158015612207573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061222b9190810190613637565b505050604086015160a09081018051869003905260608701510180519490940390935250600092505050919050565b60608101515160408083015151835160209081015183516309f396e360e21b8152935160009594919286926001600160a01b038516926327ce5b8c92600480840193919291829003018186803b1580156122b357600080fd5b505afa1580156122c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506122eb919081019061376a565b9050606081604051908082528060200260200182016040528015612319578160200160208202803883390190505b50905060005b82811015612347578082828151811061233457fe5b602090810291909101015260010161231f565b5086516060015160405163f8a2167b60e01b81526000916001600160a01b03169063f8a2167b9061238090879086908b9060040161393d565b60206040518083038186803b15801561239857600080fd5b505afa1580156123ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506123d0919081019061376a565b905060008860000151606001516001600160a01b031663f8a2167b8685896040518463ffffffff1660e01b815260040161240c9392919061393d565b60206040518083038186803b15801561242457600080fd5b505afa158015612438573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061245c919081019061376a565b905081156124f7578851606001516101008a0151604051632cc87f5360e11b81526001600160a01b0390921691635990fea6916124a39189918c9182918991600401613909565b6040805180830381600087803b1580156124bc57600080fd5b505af11580156124d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506124f49190810190613782565b50505b8015612590578851606001516101008a0151604051632cc87f5360e11b81526001600160a01b0390921691635990fea69161253c9189918b9182918891600401613909565b6040805180830381600087803b15801561255557600080fd5b505af1158015612569573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061258d9190810190613782565b50505b50600198975050505050505050565b6000828201838110156125b157600080fd5b9392505050565b6000828211156125c757600080fd5b50900390565b6040808201516080810151910151600091611592919063ffffffff6125b816565b600061159282836040015160200151846040015160600151856040015160a0015161320d565b845160e081015160a0909101516040808801515160608901515160208a0151519251635ae5c8e760e01b81526000956001600160a01b031694635ae5c8e79461266c94919391928c918c918c91908c90600401613a21565b602060405180830381600087803b15801561268657600080fd5b505af115801561269a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506126be9190810190613637565b5060019695505050505050565b80516020015160006126dc836125cd565b905060006126e984613255565b905060006126f6856125ee565b9050600061270386613278565b90506000612797866001600160a01b031663bad84c9e6040518163ffffffff1660e01b815260040160206040518083038186803b15801561274357600080fd5b505afa158015612757573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061277b919081019061376a565b61278b878763ffffffff61311e16565b9063ffffffff612a0616565b6001600160a01b0387166000908152600a60205260409020549091506127e75760a0870151516001600160a01b0387166000908152600a602052604090206001909101906127e5908261354a565b505b612850816128448461284487600a60008d6001600160a01b03166001600160a01b031681526020019081526020016000208d60200151602001518154811061282b57fe5b906000526020600020015461259f90919063ffffffff16565b9063ffffffff61259f16565b6001600160a01b0387166000908152600a6020908152604090912089820151909101518154811061287d57fe5b60009182526020808320909101929092556001600160a01b0388168152600a825260409081902080548251818502810185019093528083526060938301828280156128e757602002820191906000526020600020905b8154815260200190600101908083116128d3575b50505050509050600080600090505b82518110156129245782818151811061290b57fe5b60200260200101518201915080806001019150506128f6565b506001600160a01b0388166000908152600b602052604081205461294f90600163ffffffff61259f16565b6001600160a01b03808b166000908152600b6020526040908190208390558c5160e081015160a0909101519151639ae36ee560e01b815293945090911691639ae36ee5916129a7918d90879089908890600401613a68565b602060405180830381600087803b1580156129c157600080fd5b505af11580156129d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506129f99190810190613637565b5050505050505050505050565b600082612a1557506000611592565b82820282848281612a2257fe5b04146125b157600080fd5b600080828481612a3957fe5b04949350505050565b6000805b8260400151602001516001811115612a5a57fe5b14612a6a57606082015151611592565b50604001515190565b60006001612a46565b6020820151516000908190612a9957612a94846125ee565b612a9c565b60005b90506000808560400151602001516001811115612ab557fe5b14612ac857612ac385613278565b612aca565b815b9050600060018660400151602001516001811115612ae457fe5b14612af757612af286613278565b612af9565b825b90506000808760400151602001516001811115612b1257fe5b14612b2557612b2087613255565b612b2e565b612b2e876125cd565b9050600060018860400151602001516001811115612b4857fe5b14612b5b57612b5688613255565b612b64565b612b64886125cd565b885160c081015160a08201516020909201519293506001600160a01b0316916312922c949190612b938c612a42565b612b9c8d612a73565b8d60200151602001518d8f60200151606001518c8c8c8c6040518c63ffffffff1660e01b8152600401612bd99b9a99989796959493929190613aad565b602060405180830381600087803b158015612bf357600080fd5b505af1158015612c07573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506125909190810190613637565b600080866001600160a01b03166327ce5b8c6040518163ffffffff1660e01b815260040160206040518083038186803b158015612c6757600080fd5b505afa158015612c7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612c9f919081019061376a565b90506000866001811115612caf57fe5b1415612d5657612d4e84896001600160a01b031663f8a2167b8a612cd38c8b612f8a565b886040518463ffffffff1660e01b8152600401612cf29392919061393d565b60206040518083038186803b158015612d0a57600080fd5b505afa158015612d1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612d42919081019061376a565b9063ffffffff61311e16565b915050612d8e565b612d8a84896001600160a01b031663d64c62f38a89886040518463ffffffff1660e01b8152600401612cf293929190613972565b9150505b9695505050505050565b612da061349d565b60405180610100016040528085604001516001600160a01b03168152602001846001600160a01b0316815260200185606001516001600160a01b031681526020018560a001516001600160a01b0316815260200185600001516001600160a01b03168152602001846001600160a01b031663870c426d6040518163ffffffff1660e01b815260040160206040518083038186803b158015612e4057600080fd5b505afa158015612e54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612e7891908101906135ad565b6001600160a01b0316815260200185608001516001600160a01b0316815260200185602001516001600160a01b031681525090509392505050565b612ebb6134e1565b6000806000612ece88602001518761329e565b6040805160a081018252988952602089019a909a5298870191909152606086015250505050608081019290925250919050565b612f09613513565b600080836001811115612f1857fe5b14612f24576001612f27565b60005b90506000612f3b868863ffffffff6125b816565b90506040518060c00160405280866001600160a01b03168152602001836001811115612f6357fe5b81526020018881526020018281526020018881526020018281525092505050949350505050565b60606000836001600160a01b03166327ce5b8c6040518163ffffffff1660e01b815260040160206040518083038186803b158015612fc757600080fd5b505afa158015612fdb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612fff919081019061376a565b9050606060018203604051908082528060200260200182016040528015613030578160200160208202803883390190505b5090506000805b600184038110156130755785811415613051576001909101905b8183828151811061305e57fe5b602090810291909101015260019182019101613037565b509095945050505050565b613088613513565b60008085600181111561309757fe5b146130a35760006130a6565b60015b905060006130b8898989888689613333565b905060006130cc858363ffffffff6125b816565b90506040518060c00160405280876001600160a01b031681526020018460018111156130f457fe5b81526020018381526020018281526020018381526020018281525093505050509695505050505050565b600081831161312e575081611592565b5080611592565b60006060838360405160200161314c9291906137e0565b60408051601f1981840301815291905260200151949350505050565b60608151604051908082528060200260200182016040528015613195578160200160208202803883390190505b50905060005b82518110156131e0576131c1848483815181106131b457fe5b6020026020010151613135565b8282815181106131cd57fe5b602090810291909101015260010161319b565b5092915050565b600061320583856020015160600151866020015160800151856133c8565b949350505050565b600061324c8185600181111561321f57fe5b146132325785602001516080015161323c565b8560200151606001515b61278b858563ffffffff6125b816565b95945050505050565b60608101516080810151604090910151600091611592919063ffffffff6125b816565b600061159282836060015160200151846060015160600151856060015160a0015161320d565b600080600080856001600160a01b031663bad84c9e6040518163ffffffff1660e01b815260040160206040518083038186803b1580156132dd57600080fd5b505afa1580156132f1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613315919081019061376a565b9050613327818663ffffffff6125b816565b90969495509392505050565b6000600183600181111561334357fe5b141561338c576133858288606001516001600160a01b031663d64c62f38a602001518a896040518463ffffffff1660e01b8152600401612cf293929190613972565b9050612d8e565b610b4b8288606001516001600160a01b031663f8a2167b8a6020015189896040518463ffffffff1660e01b8152600401612cf29392919061393d565b600061324c818660018111156133da57fe5b146133e557836133e7565b845b839063ffffffff612a0616565b60405180610120016040528061340861349d565b81526020016134156134e1565b8152602001613422613513565b815260200161342f613513565b815260006020820181905260606040830181905282018190526080820181905260a09091015290565b60408051610100810182526000808252602082018190529181018290529060608201908152600060208201819052604082018190526060820181905260809091015290565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081019190915290565b6040518060a0016040528060008019168152602001600081526020016000815260200160008152602001600081525090565b6040805160c08101909152600080825260208201908152602001600081526020016000815260200160008152602001600081525090565b81548183558181111561356e5760008381526020902061356e918101908301613573565b505050565b6109ab91905b8082111561358d5760008155600101613579565b5090565b6000602082840312156135a2578081fd5b81356125b181613b92565b6000602082840312156135be578081fd5b81516125b181613b92565b600080600080600060a086880312156135e0578081fd5b85356135eb81613b92565b97602087013597506040870135966060810135965060800135945092505050565b6000806040838503121561361e578182fd5b823561362981613b92565b946020939093013593505050565b600060208284031215613648578081fd5b815180151581146125b1578182fd5b6000806000806080858703121561366c578384fd5b5050823594602084013594506040840135936060013592509050565b6000806040838503121561369a578182fd5b82356136a581613b92565b915060208301356136b581613b92565b809150509250929050565b60008060008060008060008060006101208a8c0312156136de578384fd5b89356136e981613b92565b985060208a0135975060408a0135965060608a013561370781613baa565b955060808a013561371781613b92565b945060a08a0135935060c08a0135925060e08a013591506101008a013561373d81613b92565b809150509295985092959850929598565b60006020828403121561375f578081fd5b81516125b181613baa565b60006020828403121561377b578081fd5b5051919050565b60008060408385031215613794578182fd5b505080516020909101519092909150565b6000815180845260208401935060208301825b828110156137d65781518652602095860195909101906001016137b8565b5093949350505050565b60609290921b6bffffffffffffffffffffffff1916825260f81b6001600160f81b031916601482015260150190565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260806040820181905260009061384f908301856137a5565b8281036060840152610b4b81856137a5565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0394851681529290931660208301526040820152606081019190915260800190565b6001600160a01b03929092168252602082015260400190565b6000602082526125b160208301846137a5565b901515815260200190565b90815260200190565b93845260208401929092526040830152606082015260800190565b6001600160a01b03958616815293851660208501529190931660408301526060820192909252608081019190915260a00190565b600060018060a01b0380861683526060602084015261395f60608401866137a5565b9150808416604084015250949350505050565b6001600160a01b0393841681526020810192909252909116604082015260600190565b6001600160a01b0395861681526020810194909452604084019290925283166060830152909116608082015260a00190565b6001600160a01b039a8b168152602081019990995260408901979097529488166060880152928716608087015290861660a0860152851660c085015260e08401529092166101008201526101208101919091526101400190565b6001600160a01b03988916815296881660208801529490961660408601526060850192909252608084015260a083015260c082019290925260e08101919091526101000190565b6001600160a01b038681168252851660208201526040810184905260a060608201819052600090613a9b908301856137a5565b90508260808301529695505050505050565b6001600160a01b039b8c168152998b1660208b0152978a1660408a0152959098166060880152608087019390935260a086019190915260c085015260e08401526101008301939093526101208201929092526101408101919091526101600190565b63086c2e6d60e31b815260200190565b64547261646560d81b815260200190565b6929b430b932aa37b5b2b760b11b815260200190565b654f726465727360d01b815260200190565b695a65726f58547261646560b01b815260200190565b6950726f6669744c6f737360b01b815260200190565b918252602082015260400190565b6001600160a01b0381168114613ba757600080fd5b50565b60028110613ba757600080fdfea365627a7a72315820f4dfa63ff74df0d5a9b11dc6aa91bec695862264948b671d106890b812e6aae36c6578706572696d656e74616cf564736f6c634300050f0040
Deployed Bytecode Sourcemap
63559:10847:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;63559:10847:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63766:25;;;:::i;:::-;;;;;;;;;;;;;;;;63797:20;;;:::i;64066:1032::-;;;;;;;;;:::i;:::-;;65546:471;;;;;;;;;:::i;:::-;;;;;;;;66023:482;;;;;;;;;:::i;63702:19::-;;;:::i;63727:33::-;;;:::i;63940:53::-;;;;;;;;;:::i;73897:150::-;;;;;;;;;:::i;:::-;;;;;;;;63876:58;;;;;;;;;:::i;74053:351::-;;;;;;;;;:::i;7677:88::-;;;:::i;:::-;;;;;;;;66511:706;;;;;;;;;:::i;:::-;;;;;;;;;63766:25;;;-1:-1:-1;;;;;63766:25:0;;:::o;63797:20::-;;;-1:-1:-1;;;;;63797:20:0;;:::o;64066:1032::-;7544:11;;;;7543:12;7535:21;;;;;;64165:19;:17;:19::i;:::-;64194:5;:14;;-1:-1:-1;;;;;;64194:14:0;;-1:-1:-1;;;;;64194:14:0;;;;;;;;;;;;-1:-1:-1;64218:28:0;;-1:-1:-1;;;;;;64218:28:0;;;;;;;64276:20;;-1:-1:-1;;;64276:20:0;;:5;;;;;;;:12;;:20;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;64276:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;64276:20:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;64276:20:0;;;;;;;;;64256:41;;64325:339;;;;;;;;64368:6;-1:-1:-1;;;;;64325:339:0;;;;;64402:13;-1:-1:-1;;;;;64325:339:0;;;;;64445:13;-1:-1:-1;;;;;64445:20:0;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;64445:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;64445:30:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;64445:30:0;;;;;;;;;-1:-1:-1;;;;;64325:339:0;;;;;64509:5;-1:-1:-1;;;;;64325:339:0;;;;;64552:13;-1:-1:-1;;;;;64552:20:0;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;64552:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;64552:34:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;64552:34:0;;;;;;;;;-1:-1:-1;;;;;64325:339:0;;;;;64625:6;-1:-1:-1;;;;;64625:13:0;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;64625:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;64625:27:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;64625:27:0;;;;;;;;;-1:-1:-1;;;;;64325:339:0;;;;;;64307:357;;:15;:357;;-1:-1:-1;;;;;;64307:357:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64682:22;64674:45;;;;;;64737:26;;-1:-1:-1;;;;;64737:26:0;64729:53;;;;;;64800:26;;-1:-1:-1;;;;;64800:26:0;64792:53;;;;;;64863:29;;-1:-1:-1;;;64863:29:0;;-1:-1:-1;;;;;64863:20:0;;;;;:29;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;64863:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;64863:29:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;64863:29:0;;;;;;;;;64855:5;:37;;-1:-1:-1;;;;;;64855:37:0;-1:-1:-1;;;;;64855:37:0;;;;;;;;64910:5;64902:28;;;;;;64953:34;;-1:-1:-1;;;64953:34:0;;-1:-1:-1;;;;;64953:20:0;;;;;:34;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;64953:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;64953:34:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;64953:34:0;;;;;;;;;64940:10;:47;;-1:-1:-1;;;;;;64940:47:0;-1:-1:-1;;;;;64940:47:0;;;;;;;;65005:10;64997:33;;;;;;65040:51;;-1:-1:-1;;;65040:51:0;;-1:-1:-1;;;;;65040:13:0;;;;;:51;;65062:6;;-1:-1:-1;;64047:12:0;65040:51;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;65040:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;65040:51:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;65040:51:0;;;;;;;;;;7566:1;64066:1032;;:::o;65546:471::-;65680:7;65717:10;65737:28;;:::i;:::-;65768:82;;;;;;;;65781:15;65768:82;-1:-1:-1;;;;;65768:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65798:8;65808:7;65817:18;65837:12;65768;:82::i;:::-;65737:113;;65861:24;65887:13;65904:73;65922:7;65931:10;65943:18;65963:13;65904:17;:73::i;:::-;-1:-1:-1;65860:117:0;65546:471;-1:-1:-1;;;;;;;;;65546:471:0:o;66023:482::-;66209:5;;66168:7;;-1:-1:-1;;;;;66209:5:0;66195:10;:19;66187:28;;;;;;66225;;:::i;:::-;66256:82;;;;;;;;66269:15;66256:82;-1:-1:-1;;;;;66256:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66286:8;66296:7;66305:18;66325:12;66256;:82::i;:::-;66225:113;;66349:24;66375:13;66392:73;66410:7;66419:10;66431:18;66451:13;66392:17;:73::i;63702:19::-;;;;;;-1:-1:-1;;;;;63702:19:0;;:::o;63727:33::-;;;-1:-1:-1;;;;;63727:33:0;;:::o;63940:53::-;;;;;;;;;;;;;:::o;73897:150::-;-1:-1:-1;;;;;74002:38:0;;;;;;:20;:38;;;;;;;;;73995:45;;;;;;;;;;;;;;;;;73967:16;;73995:45;;;74002:38;73995:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73897:150;;;;:::o;63876:58::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;74053:351::-;-1:-1:-1;;;;;74178:38:0;;74116:7;74178:38;;;:20;:38;;;;;;;;74135:81;;;;;;;;;;;;;;;;;:40;;:81;;74178:38;74135:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74226:15;74256:9;74268:1;74256:13;;74251:123;74275:23;:30;74271:1;:34;74251:123;;;74337:23;74361:1;74337:26;;;;;;;;;;;;;;74326:37;;;;74307:3;;;;;;;74251:123;;;-1:-1:-1;74390:7:0;74053:351;-1:-1:-1;;;74053:351:0:o;7677:88::-;7724:4;7747:11;;;7677:88;;:::o;66511:706::-;66798:10;;66725:24;;;;-1:-1:-1;;;;;66798:10:0;66784;:24;66776:33;;;;;;66827:5;;:28;;-1:-1:-1;;;66827:28:0;;:5;;;;-1:-1:-1;;;;;66827:5:0;;:19;;:28;;66847:7;;66827:28;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;66827:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;66827:28:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;66827:28:0;;;;;;;;;66819:37;;;;;;66866:33;;:::i;:::-;66924:26;;66902:107;;-1:-1:-1;;;;;66924:26:0;66952:7;66961:8;66971:6;66979:10;66991:7;67000:8;66902:21;:107::i;:::-;66866:143;;67019:28;;:::i;:::-;67050:81;;;;;;;;67071:15;67050:81;-1:-1:-1;;;;;67050:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67088:10;67100:7;67109;67118:12;67050:20;:81::i;:::-;67019:112;;67148:62;67166:7;67175:10;67187:7;67196:13;67148:17;:62::i;:::-;67141:69;;;;;;66511:706;;;;;;;;;;;;:::o;7580:91::-;7544:11;;;;7543:12;7535:21;;;;;;7646:11;:18;;-1:-1:-1;;7646:18:0;7660:4;7646:18;;;7580:91::o;45344:384::-;45509:11;;:::i;:::-;45532:27;;:::i;:::-;45562:54;45589:16;45607:8;45562:26;:54::i;:::-;45532:84;;45634:87;45649:16;45667:10;45679:14;45695:11;45708:12;45634:14;:87::i;:::-;45627:94;45344:384;-1:-1:-1;;;;;;;45344:384:0:o;67224:2345::-;67380:35;8327:13;;67380:35;;8327:13;;;;;8326:14;8318:23;;;;;;8351:13;:20;;-1:-1:-1;;8351:20:0;;;;;:13;67553:44;:10;:42;:44::i;:::-;67515:82;;-1:-1:-1;67515:82:0;-1:-1:-1;67607:44:0;:10;:42;:44::i;:::-;;67661;:10;:42;:44::i;:::-;;67715:23;67741:44;:10;:42;:44::i;:::-;67715:70;;67796:28;67813:10;67796:16;:28::i;:::-;-1:-1:-1;67908:17:0;;;;:29;;;;67873:30;;;;;67835:35;;67873:65;;:30;:65;:34;:65;:::i;:::-;67835:103;-1:-1:-1;67948:21:0;67972:51;:18;67835:103;67972:51;:22;:51;:::i;:::-;68037:16;;;;:24;67948:75;;-1:-1:-1;68037:38:0;68033:227;;68091:20;;:27;68135:16;;;;:24;-1:-1:-1;;;;;68091:43:0;;;;;;68161:35;68091:10;68161:33;:35::i;:::-;68198;:10;:33;:35::i;:::-;68235:13;68091:158;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;68091:158:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;68091:158:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;68091:158:0;;;;;;;;;;68033:227;68282:37;:18;68305:13;68282:37;:22;:37;:::i;:::-;68333:16;;;;:24;68269:50;;-1:-1:-1;68333:38:0;68329:170;;68387:101;68402:10;68414;:16;;;:31;;;68447:10;68459:13;68474;68387:14;:101::i;:::-;;68329:170;68508:30;68527:10;68508:18;:30::i;:::-;68552:14;;68548:581;;68582:17;68602:94;68654:10;:20;;;:27;;;-1:-1:-1;;;;;68654:39:0;;:41;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;68654:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;68654:41:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;68654:41:0;;;;;;;;;68617:16;;;;:31;;;68602:47;;:10;;:47;:14;:47;:::i;:::-;:51;:94;:51;:94;:::i;:::-;68582:114;-1:-1:-1;68710:18:0;68731:25;:10;68582:114;68731:25;:14;:25;:::i;:::-;68710:46;;68770:10;:20;;;:31;;;-1:-1:-1;;;;;68770:57:0;;68828:10;:20;;;:27;;;68857:41;:10;:39;:41::i;:::-;68900:10;:16;;;:24;;;68926:9;68770:166;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;68770:166:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;68770:166:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;68770:166:0;;;;;;;;;;68950:10;:20;;;:31;;;-1:-1:-1;;;;;68950:57:0;;69008:10;:20;;;:27;;;69037:42;:10;:40;:42::i;:::-;69081:10;:16;;;:24;;;69107:10;68950:168;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;68950:168:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;68950:168:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;68950:168:0;;;;;;;;;;68548:581;;;69138:43;69155:10;69167:13;69138:16;:43::i;:::-;-1:-1:-1;69236:17:0;;;;:36;69195:18;;;;:37;-1:-1:-1;;;;;69195:77:0;;;;;;69191:313;;;69288:10;:20;;;:31;;;-1:-1:-1;;;;;69288:54:0;;69343:10;:20;;;:29;;;69374:10;:20;;;:27;;;69403:10;:18;;;:37;;;69442:10;:16;;;:24;;;69476:15;69468:24;;69288:205;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;69288:205:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;69288:205:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;69288:205:0;;;;;;;;;;69191:313;-1:-1:-1;8408:5:0;8392:21;;-1:-1:-1;;8392:21:0;;;69522:27;67224:2345;;-1:-1:-1;67224:2345:0;;-1:-1:-1;;;;;;;67224:2345:0:o;48017:626::-;48200:16;;:::i;:::-;48228:24;48255:81;48274:11;48287:7;48296:10;48308:8;48318:7;48327:8;48255:18;:81::i;:::-;48228:108;;48354:282;;;;;;;;48386:7;-1:-1:-1;;;;;48354:282:0;;;;;48416:8;48354:282;;;;48445:6;48354:282;;;;48476:10;48354:282;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;48354:282:0;;;;;;;-1:-1:-1;;48354:282:0;;;;;48347:289;48017:626;-1:-1:-1;;;;;48017:626:0:o;45734:1630::-;45918:11;;:::i;:::-;45941:27;;:::i;:::-;45971:69;45984:16;46002:10;:17;;;46021:10;:18;;;45971:12;:69::i;:::-;45941:99;;46050:25;;:::i;:::-;46078:78;46087:10;46099;:18;;;46119:10;:16;;;46137:10;:18;;;46078:8;:78::i;:::-;46050:106;;46166:27;;:::i;:::-;46196:96;46205:10;:25;;;46232:10;:17;;;46251:10;:18;;;46271:10;:20;;;46196:8;:96::i;:::-;46166:126;;46302:31;46336:55;46353:10;:17;;;46372:10;:18;;;46336:16;:55::i;:::-;46302:89;;46401:26;;:::i;:::-;46430:108;46440:10;46452;:18;;;46472:14;46488:10;:20;;;46510:14;46526:11;46430:9;:108::i;:::-;46737:18;;;;46401:137;;-1:-1:-1;46707:27:0;;46737:32;:97;;46810:10;:23;;;46737:97;;;46772:27;;46737:97;46707:127;;46852:505;;;;;;;;46882:10;46852:505;;;;46913:6;46852:505;;;;46942:8;46852:505;;;;46972:7;46852:505;;;;47006:10;:18;;;46852:505;;;;47053:14;46852:505;;;;47121:14;47099:36;;;;;;;;:8;:18;;;:36;;;;;;;;;:87;;47160:26;;47099:87;;;47138:19;47099:87;-1:-1:-1;;;;;46852:505:0;;;;;47241:15;47219:8;:18;;;:37;;;;;;;;;:88;;47281:26;;47219:88;;;47259:19;47219:88;-1:-1:-1;;;;;46852:505:0;;;;;;;;46845:512;-1:-1:-1;;;;;;;45734:1630:0;;;;;;;:::o;47370:641::-;47488:16;;:::i;:::-;47534:23;;;;;47575:429;;;;;;;;;-1:-1:-1;;;47607:27:0;;;47534:23;47575:429;-1:-1:-1;;;;;47607:17:0;;;:27;47625:8;47607:27;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47607:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47607:27:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;47607:27:0;;;;;;;;;-1:-1:-1;;;;;47575:429:0;;;;;47657:7;-1:-1:-1;;;;;47657:18:0;;47676:8;47657:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47657:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47657:28:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;47657:28:0;;;;;;;;;47575:429;;;;47706:7;-1:-1:-1;;;;;47706:16:0;;47723:8;47706:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47706:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47706:26:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;47706:26:0;;;;;;;;;47575:429;;;;47757:7;-1:-1:-1;;;;;47757:20:0;;47778:8;47757:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47757:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47757:30:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;47757:30:0;;;;;;;;;47575:429;;;;;;;;;;;;47817:7;-1:-1:-1;;;;;47817:30:0;;47848:8;47817:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47817:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47817:40:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;47817:40:0;;;;;;;;;47575:429;;;;47879:7;-1:-1:-1;;;;;47879:17:0;;47897:8;47879:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47879:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47879:27:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;47879:27:0;;;;;;;;;47575:429;;;;47929:7;-1:-1:-1;;;;;47929:23:0;;47953:8;47929:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47929:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47929:33:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;47929:33:0;;;;;;;;;-1:-1:-1;;;;;47575:429:0;;;;;;;;47568:436;-1:-1:-1;;47370:641:0;;;;;:::o;49886:1045::-;49964:26;49992:21;50025:29;50057:57;50088:5;:12;;;:25;;;50057:5;:13;;;:26;;;:30;;:57;;;;:::i;:::-;50025:89;-1:-1:-1;50128:26:0;50124:70;;-1:-1:-1;50178:1:0;;-1:-1:-1;50178:1:0;;-1:-1:-1;50170:13:0;;50124:70;50369:5;:15;;;:26;;;-1:-1:-1;;;;;50369:51:0;;50421:5;:15;;;:22;;;50445:5;:17;;;50464:21;50487:5;:23;;;50512:5;:22;;;50536:37;50567:5;50536:30;:37::i;:::-;50575:36;50605:5;50575:29;:36::i;:::-;50613:5;:11;;;:26;;;50641:5;:12;;;:31;;;50674:5;:17;;;50369:323;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;50369:323:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50369:323:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;50369:323:0;;;;;;;;;50761:13;;;;:26;;;;:51;;;;;;;50822:12;;;;:25;:50;;;;;;;;;50331:361;-1:-1:-1;50331:361:0;-1:-1:-1;49886:1045:0;;;;:::o;52440:1922::-;52518:4;52534:30;52567:56;52597:5;:13;;;:25;;;52567:5;:12;;;:25;;;:29;;:56;;;;:::i;:::-;52534:89;-1:-1:-1;52637:27:0;52633:69;;52687:4;52680:11;;;;;52633:69;52792:15;52766:5;:12;;;:22;;;:41;;;;;;;;;52762:718;;;52823:5;:15;;;:26;;;-1:-1:-1;;;;;52823:45:0;;52869:5;:12;;;:31;;;52902:5;:13;;;:32;;;52936:61;52955:5;:15;;;:22;;;52979:5;:17;;;52936:18;:61::i;:::-;52999:22;52823:199;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52823:199:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52823:199:0;;;;52762:718;;;53053:24;53094:5;:19;;;:26;53080:41;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;53080:41:0;-1:-1:-1;53053:68:0;-1:-1:-1;53140:10:0;53135:129;53161:5;:19;;;:26;53156:2;:31;53135:129;;;53227:22;53213:7;53221:2;53213:11;;;;;;;;;;;;;;;;;:36;53189:4;;53135:129;;;;53277:5;:15;;;:26;;;-1:-1:-1;;;;;53277:50:0;;53328:5;:12;;;:31;;;53361:5;:13;;;:32;;;53395:64;53415:5;:15;;;:22;;;53439:5;:19;;;53395;:64::i;:::-;53461:7;53277:192;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53277:192:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53277:192:0;;;;52762:718;;53629:22;53654:72;53671:5;53678;:13;;;:23;;;53703:22;53654:16;:72::i;:::-;53740:11;;;;:19;53629:97;;-1:-1:-1;53736:418:0;;53849:15;;:33;;;;;53896:13;;;;:32;53930:12;;;;:31;53849:129;;-1:-1:-1;;;53849:129:0;;-1:-1:-1;;;;;53849:46:0;;;;;;:129;;53896:32;53930:31;53963:14;;53849:129;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53849:129:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53849:129:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;53849:129:0;;;;;;;;;;53736:418;;;54009:15;;:33;;;;;54064:28;;;;;54095:12;;;;:31;54009:134;;-1:-1:-1;;;54009:134:0;;-1:-1:-1;;;;;54009:46:0;;;;;;:134;;54064:28;54128:14;;54009:134;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54009:134:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54009:134:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;54009:134:0;;;;;;;;;;53736:418;-1:-1:-1;54222:13:0;;;;:25;;:51;;;;;;;54283:12;;;;:25;;:51;;;;;;;;-1:-1:-1;54351:4:0;52440:1922;;;:::o;50937:1497::-;51015:4;51031:30;51064:56;51095:5;:12;;;:24;;;51064:5;:13;;;:26;;;:30;;:56;;;;:::i;:::-;51031:89;-1:-1:-1;51134:27:0;51130:69;;51184:4;51177:11;;;;;51130:69;51311:15;51284:5;:13;;;:23;;;:42;;;;;;;;;51280:700;;;51342:5;:15;;;:26;;;-1:-1:-1;;;;;51342:45:0;;51388:5;:23;;;51413:5;:12;;;:31;;;51446:61;51465:5;:15;;;:22;;;51489:5;:17;;;51446:18;:61::i;:::-;51509:22;51342:190;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51342:190:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51342:190:0;;;;51280:700;;;51563:24;51604:5;:19;;;:26;51590:41;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;51590:41:0;-1:-1:-1;51563:68:0;-1:-1:-1;51650:10:0;51645:129;51671:5;:19;;;:26;51666:2;:31;51645:129;;;51737:22;51723:7;51731:2;51723:11;;;;;;;;;;;;;;;;;:36;51699:4;;51645:129;;;;51787:5;:15;;;:26;;;-1:-1:-1;;;;;51787:50:0;;51838:5;:22;;;51862:5;:12;;;:31;;;51895:64;51915:5;:15;;;:22;;;51939:5;:19;;;51895;:64::i;:::-;51961:7;51787:182;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51787:182:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51787:182:0;;;;51280:700;;51990:22;52015:71;52032:5;52039;:12;;;:22;;;52063;52015:16;:71::i;:::-;52096:15;;:33;;;;;52143:12;;;;:31;52176:13;;;;:32;52096:129;;-1:-1:-1;;;52096:129:0;;51990:96;;-1:-1:-1;;;;;;52096:46:0;;;;;;:129;;52143:31;51990:96;;52096:129;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52096:129:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52096:129:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;52096:129:0;;;;;;;;;-1:-1:-1;;52294:13:0;;;;:26;;:52;;;;;;;52356:12;;;;:24;;:50;;;;;;;;-1:-1:-1;52423:4:0;50937:1497;;;:::o;54368:2545::-;54446:7;54465:29;54497:55;54527:5;:12;;;:24;;;54497:5;:13;;;:25;;;:29;;:55;;;;:::i;:::-;54465:87;-1:-1:-1;54566:26:0;54562:65;;54615:1;54608:8;;;;;54562:65;54770:12;;;;:31;54734:13;;;;:32;-1:-1:-1;;;;;54734:67:0;;;;;;54730:668;;;54817:29;54849:71;54866:5;54873;:13;;;:23;;;54898:21;54849:16;:71::i;:::-;54817:103;;54934:28;54965:70;54982:5;54989;:12;;;:22;;;55013:21;54965:16;:70::i;:::-;55049:15;;:33;;;;;55104:28;;;;;55135:13;;;;:32;55049:142;;-1:-1:-1;;;55049:142:0;;54934:101;;-1:-1:-1;;;;;;55049:46:0;;;;;;:142;;55104:28;;55169:21;;55049:142;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55049:142:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55049:142:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;55049:142:0;;;;;;;;;-1:-1:-1;55206:13:0;;;;:25;;;;:50;;;;;;;55270:12;;;;:24;:49;;;;;;;55340:47;:21;55366:20;55340:47;:25;:47;:::i;:::-;55333:54;;;;;;;54730:668;55475:17;55495:53;55521:5;:11;;;:26;;;55495:21;:25;;:53;;;;:::i;:::-;55475:73;;55558:18;55579:54;55605:5;:11;;;:27;;;55579:21;:25;;:54;;;;:::i;:::-;55558:75;;55643:19;55665:5;:15;;;:22;;;-1:-1:-1;;;;;55665:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55665:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55665:36:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;55665:36:0;;;;;;;;;55643:58;;55793:5;:15;;;:22;;;-1:-1:-1;;;;;55759:57:0;:5;:22;;;-1:-1:-1;;;;;55759:57:0;;55755:326;;;55832:15;;:33;;;;;55887:28;;;;;55832:111;;-1:-1:-1;;;55832:111:0;;-1:-1:-1;;;;;55832:46:0;;;;;;:111;;55926:4;;55933:9;;55832:111;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55832:111:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55832:111:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;55832:111:0;;;;;;;;;;55755:326;;;55974:5;:15;;;:33;;;-1:-1:-1;;;;;55974:46:0;;56021:5;:22;;;56053:4;56060:9;55974:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55974:96:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55974:96:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;55974:96:0;;;;;;;;;;55755:326;56130:5;:15;;;:22;;;-1:-1:-1;;;;;56095:58:0;:5;:23;;;-1:-1:-1;;;;;56095:58:0;;56091:330;;;56169:15;;:33;;;;;56224:28;;;;;56169:112;;-1:-1:-1;;;56169:112:0;;-1:-1:-1;;;;;56169:46:0;;;;;;:112;;56263:4;;56270:10;;56169:112;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;56169:112:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56169:112:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;56169:112:0;;;;;;;;;;56091:330;;;56312:5;:15;;;:33;;;-1:-1:-1;;;;;56312:46:0;;56359:5;:23;;;56392:4;56399:10;56312:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;56312:98:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56312:98:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;56312:98:0;;;;;;;;;;56091:330;56475:22;56500:35;56529:5;56500:28;:35::i;:::-;56475:60;;56545:23;56571:36;56601:5;56571:29;:36::i;:::-;56545:62;;56617:5;:15;;;:26;;;-1:-1:-1;;;;;56617:50:0;;56668:5;:15;;;:22;;;56692:21;56715:5;:11;;;:19;;;56736:14;56752:15;56617:151;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;56617:151:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56617:151:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;56617:151:0;;;;;;;;;-1:-1:-1;;;56779:13:0;;;;:25;;;;:50;;;;;;;56839:12;;;;:24;:49;;;;;;;;;-1:-1:-1;;;;;;54368:2545:0;;;:::o;69575:1155::-;69683:17;;;;:36;69748:18;;;;;:37;69813:20;;:27;;;;;69873:29;;-1:-1:-1;;;69873:29:0;;;;69649:4;;69683:36;69813:27;;69649:4;;-1:-1:-1;;;;;69873:27:0;;;;;:29;;;;;69813:27;;69873:29;;;;;;:27;:29;;;5:2:-1;;;;30:1;27;20:12;5:2;69873:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;69873:29:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;69873:29:0;;;;;;;;;69850:52;;69913:26;69956:12;69942:27;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;69942:27:0;-1:-1:-1;69913:56:0;-1:-1:-1;69984:10:0;69979:89;70005:12;70000:2;:17;69979:89;;;70055:2;70039:9;70049:2;70039:13;;;;;;;;;;;;;;;;;:18;70019:4;;69979:89;;;-1:-1:-1;70107:20:0;;:31;;;:90;;-1:-1:-1;;;70107:90:0;;70077:27;;-1:-1:-1;;;;;70107:61:0;;;;:90;;70169:7;;70178:9;;70189:7;;70107:90;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;70107:90:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;70107:90:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;70107:90:0;;;;;;;;;70077:120;;70207:28;70238:10;:20;;;:31;;;-1:-1:-1;;;;;70238:61:0;;70300:7;70309:9;70320:8;70238:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;70238:91:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;70238:91:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;70238:91:0;;;;;;;;;70207:122;-1:-1:-1;70344:23:0;;70340:174;;70383:20;;:31;;;70480:22;;;;70383:120;;-1:-1:-1;;;70383:120:0;;-1:-1:-1;;;;;70383:48:0;;;;;;:120;;70432:7;;70441;;;;70459:19;;70383:120;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;70383:120:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;70383:120:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;70383:120:0;;;;;;;;;;;70340:174;70528:24;;70524:178;;70568:20;;:31;;;70668:22;;;;70568:123;;-1:-1:-1;;;70568:123:0;;-1:-1:-1;;;;;70568:48:0;;;;;;:123;;70617:7;;70626:8;;;;70646:20;;70568:123;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;70568:123:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;70568:123:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;70568:123:0;;;;;;;;;;;70524:178;-1:-1:-1;70719:4:0;;69575:1155;-1:-1:-1;;;;;;;;69575:1155:0:o;10289:144::-;10347:7;10378:5;;;10401:6;;;;10393:15;;;;;;10425:1;10289:144;-1:-1:-1;;;10289:144:0:o;10162:121::-;10220:7;10252:1;10247;:6;;10239:15;;;;;;-1:-1:-1;10271:5:0;;;10162:121::o;58333:173::-;58472:13;;;;;:26;;;;58433:34;;;58407:7;;58433:66;;:34;:66;:38;:66;:::i;58690:218::-;58764:7;58790:111;58808:5;58815;:13;;;:23;;;58840:5;:13;;;:33;;;58875:5;:13;;;:25;;;58790:17;:111::i;70736:419::-;70900:20;;:33;;;;70949:29;;;;;70980:18;;;;;:37;71019:17;;;;:36;71087:16;;;;:24;70900:227;;-1:-1:-1;;;70900:227:0;;70884:4;;-1:-1:-1;;;;;70900:48:0;;;;:227;;70949:29;;70980:37;;71057:6;;71065:5;;71072:13;;71087:24;71113:13;;70900:227;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;70900:227:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;70900:227:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;70900:227:0;;;;;;;;;-1:-1:-1;71144:4:0;;70736:419;-1:-1:-1;;;;;;70736:419:0:o;71161:1490::-;71255:20;;:27;;;71237:15;71323:35;71255:10;71323:33;:35::i;:::-;71292:66;;71368:29;71400:36;:10;:34;:36::i;:::-;71368:68;;71446:28;71477:35;:10;:33;:35::i;:::-;71446:66;;71522:29;71554:36;:10;:34;:36::i;:::-;71522:68;;71600:26;71629:74;71681:7;-1:-1:-1;;;;;71681:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;71681:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;71681:21:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;71681:21:0;;;;;;;;;71629:47;:20;71654:21;71629:47;:24;:47;:::i;:::-;:51;:74;:51;:74;:::i;:::-;-1:-1:-1;;;;;71717:38:0;;;;;;:20;:38;;;;;:45;71600:103;;-1:-1:-1;71713:164:0;;71831:24;;;;:31;-1:-1:-1;;;;;71783:38:0;;;;;;:20;:38;;;;;71865:1;71831:35;;;;71783:83;;71831:35;71783:83;:::i;:::-;;71713:164;71953:141;72075:18;71953:117;72048:21;71953:90;72022:20;71953;:38;71982:7;-1:-1:-1;;;;;71953:38:0;-1:-1:-1;;;;;71953:38:0;;;;;;;;;;;;71992:10;:16;;;:24;;;71953:64;;;;;;;;;;;;;;;;:68;;:90;;;;:::i;:::-;:94;:117;:94;:117;:::i;:141::-;-1:-1:-1;;;;;71886:38:0;;;;;;:20;:38;;;;;;;;71925:16;;;;:24;;;;71886:64;;;;;;;;;;;;;;;;;;;:208;;;;-1:-1:-1;;;;;72148:38:0;;;;:20;:38;;;;;;;72105:81;;;;;;;;;;;;;;;;;:40;;:81;;72148:38;72105:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72196:15;72226:9;72238:1;72226:13;;72221:123;72245:23;:30;72241:1;:34;72221:123;;;72307:23;72331:1;72307:26;;;;;;;;;;;;;;72296:37;;;;72277:3;;;;;;;72221:123;;;-1:-1:-1;;;;;;72377:35:0;;72354:20;72377:35;;;:17;:35;;;;;;:42;;72417:1;72377:42;:39;:42;:::i;:::-;-1:-1:-1;;;;;72430:35:0;;;;;;;:17;:35;;;;;;;:50;;;72491:20;;:33;;;;72548:29;;;;;72491:153;;-1:-1:-1;;;72491:153:0;;72354:65;;-1:-1:-1;72491:56:0;;;;;;:153;;72456:7;;72597;;72606:23;;72354:65;;72491:153;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;72491:153:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;72491:153:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;72491:153:0;;;;;;;;;;71161:1490;;;;;;;;;;:::o;9446:421::-;9504:7;9744:6;9740:45;;-1:-1:-1;9773:1:0;9766:8;;9740:45;9807:5;;;9811:1;9807;:5;:1;9830:5;;;;;:10;9822:19;;;;;9873:283;9931:7;10028:9;10044:1;10040;:5;;;;;;;9873:283;-1:-1:-1;;;;9873:283:0:o;56949:225::-;57029:7;;57056:41;:5;:13;;;:23;;;:41;;;;;;;;;57055:112;;57136:12;;;;:31;57055:112;;;-1:-1:-1;57101:13:0;;;:32;;56949:225::o;57180:227::-;57261:7;57315:15;57288:42;;72657:1234;72799:16;;;;:24;72753:4;;;;72799:80;;72844:35;:10;:33;:35::i;:::-;72799:80;;;72840:1;72799:80;72769:110;-1:-1:-1;72889:22:0;;72914:10;:18;;;:28;;;:52;;;;;;;;;:113;;72991:36;:10;:34;:36::i;:::-;72914:113;;;72969:19;72914:113;72889:138;-1:-1:-1;73037:23:0;73095:21;73063:10;:18;;;:28;;;:53;;;;;;;;;:114;;73141:36;:10;:34;:36::i;:::-;73063:114;;;73119:19;73063:114;73037:140;-1:-1:-1;73187:22:0;;73212:10;:18;;;:28;;;:52;;;;;;;;;:129;;73305:36;:10;:34;:36::i;:::-;73212:129;;;73267:35;:10;:33;:35::i;:::-;73187:154;-1:-1:-1;73351:23:0;73409:21;73377:10;:18;;;:28;;;:53;;;;;;;;;:130;;73471:36;:10;:34;:36::i;:::-;73377:130;;;73433:35;:10;:33;:35::i;:::-;73517:20;;:31;;;;73561:29;;;;73592:27;;;;;73351:156;;-1:-1:-1;;;;;;73517:43:0;;;;73561:29;73621:41;73517:10;73621:39;:41::i;:::-;73664:42;:10;:40;:42::i;:::-;73708:10;:16;;;:24;;;73741:13;73764:10;:16;;;:31;;;73798:14;73814:15;73831:14;73847:15;73517:346;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;73517:346:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;73517:346:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;73517:346:0;;;;;;;;48649:630;48818:7;48936:25;48964:7;-1:-1:-1;;;;;48964:27:0;;:29;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48964:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48964:29:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;48964:29:0;;;;;;;;;48936:57;-1:-1:-1;49021:15:0;49007:10;:29;;;;;;;;;49003:177;;;49059:110;49161:7;49059:11;-1:-1:-1;;;;;49059:41:0;;49101:7;49110:35;49127:7;49136:8;49110:16;:35::i;:::-;49147:8;49059:97;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;49059:97:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;49059:97:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;49059:97:0;;;;;;;;;:101;:110;:101;:110;:::i;:::-;49052:117;;;;;49003:177;49196:76;49264:7;49196:11;-1:-1:-1;;;;;49196:34:0;;49231:7;49240:8;49250;49196:63;;;;;;;;;;;;;;;;;;:76;49189:83;;;48649:630;;;;;;;;;:::o;59778:575::-;59898:16;;:::i;:::-;59933:413;;;;;;;;59965:16;:23;;;-1:-1:-1;;;;;59933:413:0;;;;;60010:7;-1:-1:-1;;;;;59933:413:0;;;;;60050:16;:34;;;-1:-1:-1;;;;;59933:413:0;;;;;60308:16;:27;;;-1:-1:-1;;;;;59933:413:0;;;;;60105:16;:22;;;-1:-1:-1;;;;;59933:413:0;;;;;60208:7;-1:-1:-1;;;;;60208:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;60208:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;60208:21:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;60208:21:0;;;;;;;;;-1:-1:-1;;;;;59933:413:0;;;;;60255:16;:27;;;-1:-1:-1;;;;;59933:413:0;;;;;60155:16;:29;;;-1:-1:-1;;;;;59933:413:0;;;;59926:420;;59778:575;;;;;:::o;60359:603::-;60480:18;;:::i;:::-;60510:24;60544:23;60577:24;60667:47;60688:10;:17;;;60707:6;60667:20;:47::i;:::-;60731:224;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;60731:224:0;;;;;;;-1:-1:-1;60731:224:0;60359:603;-1:-1:-1;60359:603:0:o;60968:618::-;61097:18;;:::i;:::-;61127:20;;61151:15;:34;;;;;;;;;61150:71;;61206:15;61150:71;;;61189:14;61150:71;61127:94;-1:-1:-1;61231:20:0;61254:28;:7;61266:15;61254:28;:11;:28;:::i;:::-;61231:51;;61299:280;;;;;;;;61345:8;-1:-1:-1;;;;;61299:280:0;;;;;61378:10;61299:280;;;;;;;;;;;;61424:15;61299:280;;;;61474:12;61299:280;;;;61514:15;61299:280;;;;61556:12;61299:280;;;61292:287;;;;60968:618;;;;;;:::o;49285:554::-;49368:16;49396:25;49424:7;-1:-1:-1;;;;;49424:27:0;;:29;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;49424:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;49424:29:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;49424:29:0;;;;;;;;;49396:57;;49463:31;49531:1;49511:17;:21;49497:36;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;49497:36:0;-1:-1:-1;49463:70:0;-1:-1:-1;49543:21:0;;49578:224;49624:1;49604:17;:21;49599:2;:26;49578:224;;;49657:8;49651:2;:14;49647:68;;;49685:15;;;;;49647:68;49749:13;49728:14;49743:2;49728:18;;;;;;;;;;;;;;;;;:34;49776:15;;;;;49627:4;49578:224;;;-1:-1:-1;49818:14:0;;49285:554;-1:-1:-1;;;;;49285:554:0:o;61592:821::-;61779:18;;:::i;:::-;61809:20;;61833:15;:34;;;;;;;;;61832:71;;61889:14;61832:71;;;61871:15;61832:71;61809:94;-1:-1:-1;61913:21:0;61964:92;61986:10;61998:12;62012:14;62028:8;61809:94;62050:5;61964:21;:92::i;:::-;61948:108;-1:-1:-1;62066:20:0;62089:24;:5;61948:108;62089:24;:9;:24;:::i;:::-;62066:47;;62130:276;;;;;;;;62176:8;-1:-1:-1;;;;;62130:276:0;;;;;62209:10;62130:276;;;;;;;;;;;;62255:13;62130:276;;;;62303:12;62130:276;;;;62343:13;62130:276;;;;62383:12;62130:276;;;62123:283;;;;;61592:821;;;;;;;;:::o;10439:167::-;10497:7;10525:1;10520;:6;10516:84;;-1:-1:-1;10549:1:0;10542:8;;10516:84;-1:-1:-1;10588:1:0;10581:8;;8447:277;8525:16;8553:26;8599:7;8614:8;8582:42;;;;;;;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;8582:42:0;;;49:4:-1;8675:32:0;8669:39;;8643:75;-1:-1:-1;;;;8643:75:0:o;8730:311::-;8819:26;8883:9;:16;8869:31;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;8869:31:0;-1:-1:-1;8857:43:0;-1:-1:-1;8915:10:0;8910:125;8936:9;:16;8931:2;:21;8910:125;;;8990:34;9001:7;9010:9;9020:2;9010:13;;;;;;;;;;;;;;8990:10;:34::i;:::-;8974:9;8984:2;8974:13;;;;;;;;;;;;;;;;;:50;8954:4;;8910:125;;;;8730:311;;;;:::o;59489:240::-;59599:7;59625:97;59642:10;59654:5;:11;;;:26;;;59682:5;:11;;;:27;;;59711:10;59625:16;:97::i;:::-;59618:104;59489:240;-1:-1:-1;;;;59489:240:0:o;59136:347::-;59285:7;59311:165;59285:7;59387:10;:28;;;;;;;;;59386:89;;59448:5;:11;;;:27;;;59386:89;;;59419:5;:11;;;:26;;;59386:89;59311:57;:20;59349:18;59311:57;:37;:57;:::i;:165::-;59304:172;59136:347;-1:-1:-1;;;;;59136:347:0:o;58512:172::-;58651:12;;;;:25;;;;58613:33;;;;;58587:7;;58613:64;;:33;:64;:37;:64;:::i;58914:216::-;58989:7;59015:108;59033:5;59040;:12;;;:22;;;59064:5;:12;;;:32;;;59098:5;:12;;;:24;;;59015:17;:108::i;62683:333::-;62768:24;62794:23;62819:24;62855:17;62875:7;-1:-1:-1;;;;;62875:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;62875:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;62875:21:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;62875:21:0;;;;;;;;;62855:41;-1:-1:-1;62933:21:0;62855:41;62947:6;62933:21;:13;:21;:::i;:::-;62973:9;;62984:6;;-1:-1:-1;62973:9:0;62683:333;-1:-1:-1;;;62683:333:0:o;63022:533::-;63225:7;63268:15;63248:16;:35;;;;;;;;;63244:176;;;63306:103;63397:11;63306:10;:21;;;-1:-1:-1;;;;;63306:44:0;;63351:10;:17;;;63370:12;63384:7;63306:86;;;;;;;;;;;;;;;;;;:103;63299:110;;;;63244:176;63436:112;63536:11;63436:10;:21;;;-1:-1:-1;;;;;63436:51:0;;63488:10;:17;;;63507:14;63523:7;63436:95;;;;;;;;;;;;;;;;;;62419:258;62561:7;62587:83;62561:7;62603:10;:28;;;;;;;;;62602:67;;62653:16;62602:67;;;62635:15;62602:67;62587:10;;:83;:14;:83;:::i;63559:10847::-;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;-1:-1:-1;63559:10847:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;-1:-1:-1;63559:10847:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;-1:-1:-1;63559:10847:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;2016:241:-1;;2120:2;2108:9;2099:7;2095:23;2091:32;2088:2;;;-1:-1;;2126:12;2088:2;85:6;72:20;97:33;124:5;97:33;;2264:263;;2379:2;2367:9;2358:7;2354:23;2350:32;2347:2;;;-1:-1;;2385:12;2347:2;226:6;220:13;238:33;265:5;238:33;;2534:743;;;;;;2706:3;2694:9;2685:7;2681:23;2677:33;2674:2;;;-1:-1;;2713:12;2674:2;85:6;72:20;97:33;124:5;97:33;;;2765:63;2865:2;2904:22;;485:20;;-1:-1;2973:2;3012:22;;1805:20;;3081:2;3120:22;;485:20;;-1:-1;3189:3;3229:22;485:20;;-1:-1;2668:609;-1:-1;;;2668:609;3284:366;;;3405:2;3393:9;3384:7;3380:23;3376:32;3373:2;;;-1:-1;;3411:12;3373:2;85:6;72:20;97:33;124:5;97:33;;;3463:63;3563:2;3602:22;;;;1805:20;;-1:-1;;;3367:283;3657:257;;3769:2;3757:9;3748:7;3744:23;3740:32;3737:2;;;-1:-1;;3775:12;3737:2;364:6;358:13;31326:5;28500:13;28493:21;31304:5;31301:32;31291:2;;-1:-1;;31337:12;3921:617;;;;;4076:3;4064:9;4055:7;4051:23;4047:33;4044:2;;;-1:-1;;4083:12;4044:2;-1:-1;;485:20;;;4235:2;4274:22;;1805:20;;-1:-1;4343:2;4382:22;;485:20;;4451:2;4490:22;485:20;;-1:-1;4038:500;-1:-1;4038:500;4545:438;;;4702:2;4690:9;4681:7;4677:23;4673:32;4670:2;;;-1:-1;;4708:12;4670:2;830:6;817:20;842:47;883:5;842:47;;;4760:77;-1:-1;4874:2;4935:22;;644:20;669:55;644:20;669:55;;;4882:85;;;;4664:319;;;;;;5572:1299;;;;;;;;;;5838:3;5826:9;5817:7;5813:23;5809:33;5806:2;;;-1:-1;;5845:12;5806:2;997:6;984:20;1009:49;1052:5;1009:49;;;5897:79;-1:-1;6013:2;6052:22;;1805:20;;-1:-1;6121:2;6160:22;;1805:20;;-1:-1;6229:2;6278:22;;1497:20;1522:43;1497:20;1522:43;;;6237:73;-1:-1;6347:3;6387:22;;72:20;97:33;72:20;97:33;;;6356:63;-1:-1;6456:3;6496:22;;1805:20;;-1:-1;6565:3;6605:22;;485:20;;-1:-1;6674:3;6714:22;;485:20;;-1:-1;6783:3;6823:22;;72:20;97:33;72:20;97:33;;;6792:63;;;;5800:1071;;;;;;;;;;;;7184:283;;7309:2;7297:9;7288:7;7284:23;7280:32;7277:2;;;-1:-1;;7315:12;7277:2;1671:6;1665:13;1683:43;1720:5;1683:43;;7474:263;;7589:2;7577:9;7568:7;7564:23;7560:32;7557:2;;;-1:-1;;7595:12;7557:2;-1:-1;1953:13;;7551:186;-1:-1;7551:186;7744:399;;;7876:2;7864:9;7855:7;7851:23;7847:32;7844:2;;;-1:-1;;7882:12;7844:2;-1:-1;;1953:13;;8045:2;8095:22;;;1953:13;;;;;-1:-1;7838:305;8483:690;;8676:5;27993:12;28280:6;28275:3;28268:19;28317:4;28312:3;28308:14;8688:93;;28317:4;8852:5;27847:14;-1:-1;8891:260;8916:6;8913:1;8910:13;8891:260;;;8977:13;;9363:37;;28317:4;8304:14;;;;28123;;;;8938:1;8931:9;8891:260;;;-1:-1;9157:10;;8607:566;-1:-1;;;;8607:566;11827:406;31093:2;31089:14;;;;-1:-1;;31089:14;10020:87;;30986:15;;-1:-1;;;;;;30986:15;12099:2;12090:12;;11761:54;12197:11;;;11974:259;12240:213;-1:-1;;;;;29207:54;;;;8403:37;;12358:2;12343:18;;12329:124;12460:843;-1:-1;;;;;29207:54;;;8403:37;;29207:54;;12927:2;12912:18;;8403:37;12762:3;12964:2;12949:18;;12942:48;;;12460:843;;13004:108;;12747:19;;13098:6;13004:108;;;13160:9;13154:4;13150:20;13145:2;13134:9;13130:18;13123:48;13185:108;13288:4;13279:6;13185:108;;13310:435;-1:-1;;;;;29207:54;;;8403:37;;29207:54;;;;13648:2;13633:18;;8403:37;13731:2;13716:18;;9363:37;;;;13484:2;13469:18;;13455:290;13752:547;-1:-1;;;;;29207:54;;;8403:37;;29207:54;;;;14119:2;14104:18;;8403:37;14202:2;14187:18;;9363:37;14285:2;14270:18;;9363:37;;;;13954:3;13939:19;;13925:374;14306:324;-1:-1;;;;;29207:54;;;;8403:37;;14616:2;14601:18;;9363:37;14452:2;14437:18;;14423:207;14637:361;;14805:2;14826:17;14819:47;14880:108;14805:2;14794:9;14790:18;14974:6;14880:108;;15005:201;28500:13;;28493:21;9246:34;;15117:2;15102:18;;15088:118;15213:213;9363:37;;;15331:2;15316:18;;15302:124;15433:547;9363:37;;;15800:2;15785:18;;9363:37;;;;15883:2;15868:18;;9363:37;15966:2;15951:18;;9363:37;15635:3;15620:19;;15606:374;16751:691;-1:-1;;;;;29207:54;;;9505:72;;29207:54;;;17178:2;17163:18;;8403:37;29207:54;;;;17261:2;17246:18;;8403:37;17344:2;17329:18;;9363:37;;;;17427:3;17412:19;;9363:37;;;;16997:3;16982:19;;16968:474;18035:615;;31089:14;;;;;29218:42;28416:5;29207:54;9512:3;9505:72;18275:2;18409;18398:9;18394:18;18387:48;18449:108;18275:2;18264:9;18260:18;18543:6;18449:108;;;18441:116;;29218:42;28416:5;29207:54;18636:2;18625:9;18621:18;8403:37;;18246:404;;;;;;;18657:467;-1:-1;;;;;29207:54;;;9505:72;;19027:2;19012:18;;9363:37;;;;29207:54;;;19110:2;19095:18;;8403:37;18847:2;18832:18;;18818:306;19131:691;-1:-1;;;;;29207:54;;;9505:72;;19558:2;19543:18;;9363:37;;;;19641:2;19626:18;;9363:37;;;;29207:54;;19724:2;19709:18;;8403:37;29207:54;;;19807:3;19792:19;;8403:37;19377:3;19362:19;;19348:474;19829:1251;-1:-1;;;;;29207:54;;;9505:72;;20396:2;20381:18;;9363:37;;;;20479:2;20464:18;;9363:37;;;;29207:54;;;20562:2;20547:18;;8403:37;29207:54;;;20645:3;20630:19;;8403:37;29207:54;;;31089:14;20714:19;;8403:37;29207:54;;20813:3;20798:19;;8403:37;20897:3;20882:19;;9363:37;29207:54;;;20981:3;20966:19;;8403:37;21065:3;21050:19;;9363:37;;;;20215:3;20200:19;;20186:894;21087:1031;-1:-1;;;;;29207:54;;;9505:72;;29207:54;;;21602:2;21587:18;;8403:37;29207:54;;;;21685:2;21670:18;;8403:37;21768:2;21753:18;;9363:37;;;;21851:3;21836:19;;9363:37;31089:14;21920:19;;9363:37;22019:3;22004:19;;9363:37;;;;22103:3;22088:19;;9363:37;;;;21419:3;21404:19;;21390:728;22125:843;-1:-1;;;;;29207:54;;;9505:72;;29207:54;;22606:2;22591:18;;8403:37;22689:2;22674:18;;9363:37;;;31089:14;22726:2;22711:18;;22704:48;;;22125:843;;22766:108;;22408:19;;22860:6;22766:108;;;22758:116;;9393:5;22953:3;22942:9;22938:19;9363:37;22394:574;;;;;;;;;22975:1393;-1:-1;;;;;29207:54;;;9505:72;;29207:54;;;23603:2;23588:18;;9505:72;29207:54;;;23686:2;23671:18;;8403:37;29207:54;;;;23769:2;23754:18;;8403:37;23852:3;23837:19;;9363:37;;;;31089:14;23919:19;;9363:37;;;;24016:3;24001:19;;9363:37;24100:3;24085:19;;9363:37;24184:3;24169:19;;9363:37;;;;24268:3;24253:19;;9363:37;;;;24353:3;24338:19;;9363:37;;;;23404:3;23389:19;;23375:993;25105:339;-1:-1;;;10542:19;;25286:2;25271:18;;25257:187;25451:339;-1:-1;;;10712:20;;25632:2;25617:18;;25603:187;25797:339;-1:-1;;;10883:25;;25978:2;25963:18;;25949:187;26143:339;-1:-1;;;11059:21;;26324:2;26309:18;;26295:187;26489:339;-1:-1;;;11231:25;;26670:2;26655:18;;26641:187;26835:339;-1:-1;;;11407:25;;27016:2;27001:18;;26987:187;27401:324;9363:37;;;27711:2;27696:18;;9363:37;27547:2;27532:18;;27518:207;31121:117;-1:-1;;;;;29207:54;;31180:35;;31170:2;;31229:1;;31219:12;31170:2;31164:74;;32123:104;32202:1;32195:5;32192:12;32182:2;;32218:1;;32208:12
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.