Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
RacingArena
Compiler Version
v0.5.8+commit.23d335f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-05-16 */ pragma solidity ^0.5.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ contract Context { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. constructor () internal { } // solhint-disable-previous-line no-empty-blocks function _msgSender() internal view returns (address payable) { return msg.sender; } function _msgData() internal view returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } /** * @title Roles * @dev Library for managing addresses assigned to a Role. */ library Roles { struct Role { mapping (address => bool) bearer; } /** * @dev Give an account access to this role. */ function add(Role storage role, address account) internal { require(!has(role, account), "Roles: account already has role"); role.bearer[account] = true; } /** * @dev Remove an account's access to this role. */ function remove(Role storage role, address account) internal { require(has(role, account), "Roles: account does not have role"); role.bearer[account] = false; } /** * @dev Check if an account has this role. * @return bool */ function has(Role storage role, address account) internal view returns (bool) { require(account != address(0), "Roles: account is the zero address"); return role.bearer[account]; } } contract PauserRole is Context { using Roles for Roles.Role; event PauserAdded(address indexed account); event PauserRemoved(address indexed account); Roles.Role private _pausers; constructor () internal { _addPauser(_msgSender()); } modifier onlyPauser() { require(isPauser(_msgSender()), "PauserRole: caller does not have the Pauser role"); _; } function isPauser(address account) public view returns (bool) { return _pausers.has(account); } function addPauser(address account) public onlyPauser { _addPauser(account); } function renouncePauser() public { _removePauser(_msgSender()); } function _addPauser(address account) internal { _pausers.add(account); emit PauserAdded(account); } function _removePauser(address account) internal { _pausers.remove(account); emit PauserRemoved(account); } } /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ contract Pausable is Context, PauserRole { /** * @dev Emitted when the pause is triggered by a pauser (`account`). */ event Paused(address account); /** * @dev Emitted when the pause is lifted by a pauser (`account`). */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. Assigns the Pauser role * to the deployer. */ constructor () internal { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. */ modifier whenNotPaused() { require(!_paused, "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. */ modifier whenPaused() { require(_paused, "Pausable: not paused"); _; } /** * @dev Called by a pauser to pause, triggers stopped state. */ function pause() public onlyPauser whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Called by a pauser to unpause, returns to normal state. */ function unpause() public onlyPauser whenPaused { _paused = false; emit Unpaused(_msgSender()); } } /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. * * _Available since v2.4.0._ */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. */ contract ReentrancyGuard { // counter to allow mutex lock with only one SSTORE operation uint256 private _guardCounter; constructor () internal { // The counter starts at one to prevent changing it from zero to a non-zero // value, which is a more expensive operation. _guardCounter = 1; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { _guardCounter += 1; uint256 localCounter = _guardCounter; _; require(localCounter == _guardCounter, "ReentrancyGuard: reentrant call"); } } contract RacingAdmins is Context { using Roles for Roles.Role; event AdminAdded(address indexed account); event AdminRemoved(address indexed account); Roles.Role private _admins; constructor () internal { _addAdmin(_msgSender()); } modifier onlyAdmin() { require(isAdmin(_msgSender()), "AdminRole: caller does not have the Admin role"); _; } function isAdmin(address account) public view returns (bool) { return _admins.has(account); } function addAdmin(address account) public onlyAdmin { _addAdmin(account); } function renounceAdmin(address account) public onlyAdmin { _removeAdmin(account); } function _addAdmin(address account) internal { _admins.add(account); emit AdminAdded(account); } function _removeAdmin(address account) internal { _admins.remove(account); emit AdminRemoved(account); } } contract RacingFeeReceiver is RacingAdmins { address payable private _feeWallet; event FeeWalletTransferred(address indexed previousFeeWallet, address indexed newFeeWallet); /** * @dev Returns the address of the current fee receiver. */ function feeWallet() public view returns (address payable) { return _feeWallet; } /** * @dev Throws if called by any account other than the fee receiver wallet. */ modifier onlyFeeWallet() { require(isFeeWallet(), "Ownable: caller is not the owner"); _; } /** * @dev Returns true if the caller is the current fee receiver wallet. */ function isFeeWallet() public view returns (bool) { return _msgSender() == _feeWallet; } /** * @dev Leaves the contract without fee receiver wallet. * * NOTE: Renouncing will leave the contract without an fee receiver wallet. * It means that fee will be transferred to the zero address. */ function renounceFeeWallet() public onlyAdmin { emit FeeWalletTransferred(_feeWallet, address(0)); _feeWallet = address(0); } /** * @dev Transfers address of the fee receiver to a new address (`newFeeWallet`). * Can only be called by admins. */ function transferFeeWalletOwnership(address payable newFeeWallet) public onlyAdmin { _transferFeeWalletOwnership(newFeeWallet); } /** * @dev Transfers address of the fee receiver to a new address (`newFeeWallet`). */ function _transferFeeWalletOwnership(address payable newFeeWallet) internal { require(newFeeWallet != address(0), "Ownable: new owner is the zero address"); emit FeeWalletTransferred(_feeWallet, newFeeWallet); _feeWallet = newFeeWallet; } } contract RacingStorage is RacingFeeReceiver, ReentrancyGuard { // -- // Permanent Storage Variables // -- mapping(bytes32 => Race) public Races; // The race mapping structure. mapping(uint256 => address) public Owner_Horse; // Owner of the Horse ID. mapping(uint256 => uint256) public Horse_Active_Races; // Number of races the horse is registered for. mapping(bytes32 => bool) public ID_Saved; // Returns whether or not the race ID is present on storage already. mapping(uint256 => uint256) public Position_To_Payment; // Returns the percentage of the payment depending on horse's position in a race. mapping(address => bool) public Is_Authorized; // Returns whether an address is authorized or not. mapping(bytes32 => string) public Cancelled_Races; // Returns a cancelled race and its reason to be cancelled. mapping(bytes32 => bool) public Has_Zed_Claimed; // Returns whether or not winnings for a race have been claimed for Zed. address BB; // Blockchain Brain address Core; // Core contract. struct Race { string Track_Name; // Name of the track or event. bytes32 Race_ID; // Key provided for Race ID. uint256 Length; // Length of the track (m). uint256 Horses_Registered; // Current number of horses registered. uint256 Unix_Start; // Timestamp the race starts. uint256 Entrance_Fee; // Entrance fee for a particular race (10^18). uint256 Prize_Pool; // Total bets in the prize pool (10^18). uint256 Horses_Allowed; // Total number of horses allowed for a race. uint256[] Horses; // List of Horse IDs on Race. State Race_State; // Current state of the race. mapping(uint256 => Horse) Lineup; // Mapping of the Horse ID => Horse struct. mapping(uint256 => uint256) Gate_To_ID; // Mapping of the Gate # => Horse ID. mapping(uint256 => bool) Is_Gate_Taken; // Whether or not a gate number has been taken. } struct Horse { uint256 Gate; // Gate this horse is currently at. uint256 Total_Bet; // Total amount bet on this horse. uint256 Final_Position; // Final position of the horse (1 to Horses allowed in race). mapping(address => uint256) Bet_Placed; // Amount a specific address bet on this horse. mapping(address => bool) Bet_Claimed; // Whether or not that specific address claimed their bet. } enum State {Null, Registration, Betting, Final, Fail_Safe} } contract RacingArena is RacingStorage, Pausable { using SafeMath for uint256; // -- // Events // -- event BetPlaced( bytes32 indexed _raceId, address indexed _bettor, uint256 _betAmount, uint256 indexed _horseID ); event PrizeClaimed( bytes32 indexed _raceId, address indexed _bettor, uint256 _claimAmount, uint256 indexed _horseID ); event HorseRegistered( bytes32 indexed _raceId, address indexed _horseOwner, uint256 indexed _horseID, uint256 _gateNumber ); event HorseTransferredIn(address indexed _horseOwner, uint256[] _horseIDs); event HorseTransferredOut(address indexed _horseOwner, uint256[] _horseIDs); event RaceCreated( bytes32 indexed _raceId, string _name, uint256 _length, uint256 _registrationFee ); event RaceScheduled( bytes32 indexed _raceId, uint256 _unixStart, string _name ); event RaceFull(bytes32 indexed _raceId); event ResultsPosted( bytes32 indexed _raceId, uint256 _firstPlaceHorseID, uint256 _secondPlaceHorseID, uint256 _thirdPlaceHorseID ); event RaceCancelled( bytes32 indexed _raceId, string _reason, address _canceller ); // -- // Admin Functions // -- // Admin creates upcoming races, specifying the track name, the track length, and the entrance fee. function createRace( bytes32 _raceId, string memory _name, uint256 _horsesAllowed, uint256 _entranceFee, uint256 _length ) public onlyAdmin() nonReentrant() whenNotPaused() { // Pre-check and struct inialization. require(_entranceFee > 0, "Entrance fee lower than zero"); require(!ID_Saved[_raceId], "Race ID exists"); Race memory race; race.Race_ID = _raceId; race.Track_Name = _name; race.Horses_Allowed = _horsesAllowed; race.Entrance_Fee = _entranceFee; race.Length = _length; race.Race_State = State.Registration; Races[_raceId] = race; ID_Saved[_raceId] = true; // Event trigger. emit RaceCreated(_raceId, _name, _length, _entranceFee); } // Admin can schedule a race when it's full (12 horses). function scheduleRace(bytes32 _raceId, uint256 _startTime) public onlyAdmin() nonReentrant() { // Prechecks. Race storage race = Races[_raceId]; require( race.Horses_Registered == race.Horses_Allowed, "Not enough horses registered" ); require( race.Race_State == State.Registration, "Race is not in registration state" ); require( _startTime > now + 5 minutes, "Start time doesnt meet criteria" ); // State changes. race.Unix_Start = _startTime; race.Race_State = State.Betting; // State transition from Registration -> Betting. emit RaceScheduled(_raceId, _startTime, race.Track_Name); } function initSetup(address _core, address _bb) public onlyAdmin() { Position_To_Payment[1] = 60; Position_To_Payment[2] = 20; Position_To_Payment[3] = 10; BB = _bb; Core = _core; } function setBbAddress(address _bb) public onlyAdmin() { BB = _bb; } // Admin posts the result of the race, enabling bettors to claim their winnings. /* @dev Receives results for a given race, removes 1 active race from the given horses. Transitions race state and sends funds to one of the owner addresses as well. @param _raceId Race ID we're going to post the results to. @param _results List of of horse IDs that participated on the race in position order. */ function postResults(bytes32 _raceId, uint256[12] memory _results) public onlyAdmin() nonReentrant() { Race storage race = Races[_raceId]; // Pre-checks require( race.Race_State == State.Betting, "Race is not on betting state" ); require(race.Unix_Start <= now + 1 minutes, "Mismatch on unix start"); race.Race_State = State.Final; // State transition from Betting -> Final. for (uint256 k = 0; k < race.Horses_Allowed; k++) { require(race.Lineup[_results[k]].Gate != 0, "ID not registered"); } // Update the Race struct. Active race reduced. for (uint256 j = 0; j < race.Horses_Allowed; j++) { race.Lineup[_results[j]].Final_Position = j + 1; Horse_Active_Races[_results[j]]--; } // Duplication post-check. for (uint256 i = 0; i < race.Horses_Allowed; i++) { require( race.Lineup[_results[i]].Final_Position == i + 1, "ID not submitted properly" ); } // Sends funds to one of Zed's accounts. feeWallet().transfer(race.Prize_Pool.mul(10).div(100)); emit ResultsPosted(_raceId, _results[0], _results[1], _results[2]); } function cancelRace(bytes32 _raceId, string memory _reason) public onlyAdmin() nonReentrant() { Race storage race = Races[_raceId]; // Pre-checks. require( race.Race_State == State.Registration || race.Race_State == State.Betting, "Race not on regs or betting state" ); race.Race_State = State.Fail_Safe; Cancelled_Races[_raceId] = _reason; // Loops through the IDs on a race by index and removes them out of an active race. for (uint256 i = 0; i < race.Horses_Registered; i++) { Horse_Active_Races[race.Horses[i]]--; } emit RaceCancelled(_raceId, _reason, msg.sender); } // -- // Public Functions // -- // Bulk transfers horses into race contract. // Limit of 15. function bulkTransferIn(uint256[] memory _horseIDs) public nonReentrant() { require(_horseIDs.length < 16, "Only 15 horses allowed per transfer"); for (uint8 i = 0; i < _horseIDs.length; i++) { Owner_Horse[_horseIDs[i]] = msg.sender; ERC721(Core).safeTransferFrom( msg.sender, address(this), _horseIDs[i] ); } emit HorseTransferredIn(msg.sender, _horseIDs); } // Bulk transfers horses out of race contract. // Limit of 15. function bulkTransferOut(uint256[] memory _horseIDs) public nonReentrant() { require(_horseIDs.length < 16, "Only 15 horses allowed per transfer"); for (uint8 i = 0; i < _horseIDs.length; i++) { require( Owner_Horse[_horseIDs[i]] == msg.sender, "Caller is not the owner." ); require( Horse_Active_Races[_horseIDs[i]] == 0, "Horse currently active in a race." ); Owner_Horse[_horseIDs[i]] = address(0); ERC721(Core).safeTransferFrom( address(this), msg.sender, _horseIDs[i] ); } emit HorseTransferredOut(msg.sender, _horseIDs); } // Registers a horse for the selected race. Enacts transfer of the entrance fee, and transfer of the ERC-721 horse. function registerHorse( bytes32 _raceId, uint256 _horseID, uint256 _gateNumber ) public payable nonReentrant() whenNotPaused() { Race storage race = Races[_raceId]; // Pre-checks. require(msg.value >= race.Entrance_Fee, "Entrance fee not met"); require( race.Race_State == State.Registration, "Race not accepting registrations" ); require( race.Horses_Registered < race.Horses_Allowed, "Max number of horses for race" ); require(_gateNumber >= 1, "Gate number lower than 1."); require( _gateNumber <= race.Horses_Allowed, "Gate number greater than max" ); require(!race.Is_Gate_Taken[_gateNumber], "Gate number already taken"); require( Horse_Active_Races[_horseID] < 3, "Horse currently active in 3 races" ); require( race.Lineup[_horseID].Gate == 0, "Horse already registered for this race" ); require( ERC721(Core).ownerOf(_horseID) == address(this), "Racing contract not owner of horse." ); // Insert a new Horse struct with the appropriate information. Horse_Active_Races[_horseID]++; race.Horses_Registered++; race.Lineup[_horseID] = Horse(_gateNumber, 0, 0); race.Gate_To_ID[_gateNumber] = _horseID; // Mark gate number as taken. race.Is_Gate_Taken[_gateNumber] = true; // Handle accounting of the registration fee as a bet on their horse. race.Prize_Pool += race.Entrance_Fee; race.Lineup[_horseID].Total_Bet += race.Entrance_Fee; race.Lineup[_horseID].Bet_Placed[msg.sender] += race.Entrance_Fee; race.Horses.push(_horseID); if (race.Horses_Registered == race.Horses_Allowed) { emit RaceFull(_raceId); } emit HorseRegistered(_raceId, msg.sender, _horseID, _gateNumber); emit BetPlaced(_raceId, msg.sender, race.Entrance_Fee, _horseID); } // function placeBet(bytes32 _raceId, uint _horseID, uint _amount) public nonReentrant() { // Race storage race = Races[_raceId]; // // Pre-checks. // require(race.Race_State == State.Betting, "Bets are not allowed"); // require(race.Unix_Start > now - 5 minutes, "The betting period has ended."); // require(race.Lineup[_horseID].Gate != 0, "Horse not registered for this race."); // require(_amount % 1 ether == 0, "Bet should have no remainder"); // // Transfer bet and update Race struct. // require(ERC20(DAI).transferFrom(msg.sender, address(this), _amount), "Caller lacks funds, or contract lacks approval for the bet."); // race.Prize_Pool += _amount; // race.Lineup[_horseID].Total_Bet += _amount; // race.Lineup[_horseID].Bet_Placed[msg.sender] += _amount; // emit BetPlaced(_raceId, msg.sender, _amount, _horseID); // } /** * @dev Method validates, calculates and transfer funds to winner address, * regarding to provided _raceId and _horseID results. */ function claimWinningsHelper(bytes32 _raceId, uint256 _horseID) external nonReentrant() { _claimRaceWinnings(_raceId, _horseID, _msgSender()); } /** * @dev The same meaning as `claimWinningsHelper()` method, * but its intended for many races and horses of winner with one transaction. * It use 'for-loop' method, and to be protected from 'Out of Gas' issue the sender should limit the length of provided arrays. */ function claimAllWinningsHelper(bytes32[] calldata _raceIds, uint256[] calldata _horseIDs) external nonReentrant() { require(_raceIds.length > 0, "claimAllWinningsHelper: raceId array should not be empty."); require(_raceIds.length < 125, "claimAllWinningsHelper: raceId array length is bigger than provided limit."); require(_raceIds.length == _horseIDs.length, "claimAllWinningsHelper: lengths of raceids and horseids arrays should be equal."); for (uint256 i = 0; i < _raceIds.length; i++) { _claimRaceWinnings(_raceIds[i], _horseIDs[i], _msgSender()); } } // -- // Private Functions // -- function _claimRaceWinnings(bytes32 _raceId, uint256 _horseID, address payable _winner) private { Race storage race = Races[_raceId]; address horseOwner = Owner_Horse[_horseID]; // Pre-checks. // For now only the owner is able to claim the winnings for a horse. require(_winner == horseOwner, "Not horse owner"); require(race.Race_State == State.Final, "Race still running"); require( !race.Lineup[_horseID].Bet_Claimed[horseOwner], "Winnings have already been claimed" ); race.Lineup[_horseID].Bet_Claimed[horseOwner] = true; uint256 horsePosition = race.Lineup[_horseID].Final_Position; // Limit is race's prize pool. uint256 toTransfer = race .Prize_Pool .mul(Position_To_Payment[horsePosition]) .div(100); _winner.transfer(toTransfer); emit PrizeClaimed(_raceId, horseOwner, toTransfer, _horseID); } // function reclaimBetHelper(bytes32 _raceId, uint _horseID, address payable _bettor) public nonReentrant() { // Race storage race = Races[_raceId]; // // Pre-checks. // require(race.Race_State == State.Fail_Safe, "Contract not in fail safe mode"); // require(!race.Lineup[_horseID].Bet_Claimed[_bettor], "Bet already reclaimed"); // race.Lineup[_horseID].Bet_Claimed[_bettor] = true; // // Reclaim bet. // uint bet = race.Lineup[_horseID].Bet_Placed[_bettor]; // _bettor.transfer(bet); // // ? Add an event. // } function onERC721Received(address, address, uint256, bytes calldata) external pure returns (bytes4) { return bytes4( keccak256("onERC721Received(address,address,uint256,bytes)") ); } // Small helper function for retreieving the Horse ID based off Gate # (1 - 12, no 0 element). function getHorseID(bytes32 _raceId, uint256 _gate) public view returns (uint256) { return Races[_raceId].Gate_To_ID[_gate]; } // Small helper function for retreieving more detailed information about a horse (for Retrieval purposes) based off Gate # (1 - 12, no 0 element). function getHorseInfo(bytes32 _raceId, uint256 _gate) public view returns (uint256, uint256) { Race storage race = Races[_raceId]; return ( race.Gate_To_ID[_gate], race.Lineup[race.Gate_To_ID[_gate]].Final_Position ); } // Small helper function for personal bet information based off Gate # (1 - 12, no 0 element). function getBetInfo(bytes32 _raceId, uint256 _gate, address _bettor) public view returns (uint256, uint256, uint256, bool, uint256) { Race storage race = Races[_raceId]; return ( race.Prize_Pool, race.Lineup[race.Gate_To_ID[_gate]].Total_Bet, race.Lineup[race.Gate_To_ID[_gate]].Bet_Placed[_bettor], race.Lineup[race.Gate_To_ID[_gate]].Bet_Claimed[_bettor], race.Lineup[race.Gate_To_ID[_gate]].Final_Position ); } function getHorsesInRace(bytes32 _raceId) public view returns (uint256[] memory) { Race storage race = Races[_raceId]; return race.Horses; } function getCoreAddress() public view returns (address) { return Core; } function getBBAddress() public view returns (address) { return BB; } /* RESTRICTED */ function changePaymentAllocation(uint256 _position, uint256 _percentage) public onlyAdmin() { Position_To_Payment[_position] = _percentage; } function() external payable {} } interface ERC721 { event Transfer( address indexed _from, address indexed _to, uint256 indexed _tokenId ); event Approval( address indexed _owner, address indexed _approved, uint256 indexed _tokenId ); function balanceOf(address _owner) external view returns (uint256); function ownerOf(uint256 _tokenId) external view returns (address); function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable; function transferFrom(address _from, address _to, uint256 _tokenId) external payable; function approve(address _approved, uint256 _tokenId) external payable; function getApproved(uint256 _tokenId) external view returns (address); function setApprovalForAll(address _to, bool _approved) external; } /** * Utility library of inline functions on addresses */ library Address { /** * Returns whether the target address is a contract * @dev This function will return false if invoked during the constructor of a contract, * as the code is not actually created until after the constructor finishes. * @param account address of the account to check * @return whether the target address is a contract */ function isContract(address account) internal view returns (bool) { uint256 size; // XXX Currently there is no better way to check if there is a contract in an address // than to check the size of the code at that address. // See https://ethereum.stackexchange.com/a/14016/36603 // for more details about how this works. // TODO Check this again before the Serenity release, because all addresses will be // contracts then. // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } } /** * @title Proxy * @dev Implements delegation of calls to other contracts, with proper * forwarding of return values and bubbling of failures. * It defines a fallback function that delegates all calls to the address * returned by the abstract _implementation() internal function. */ contract Proxy is RacingStorage { /** * @dev Fallback function. * Implemented entirely in `_fallback`. */ function () payable external { _fallback(); } /** * @dev fallback implementation. * Extracted to enable manual triggering. */ function _fallback() internal { _willFallback(); _delegate(_implementation()); } /** * @dev Function that is run as the first thing in the fallback function. * Can be redefined in derived contracts to add functionality. * Redefinitions must call super._willFallback(). */ function _willFallback() internal {} /** * @dev Delegates execution to an implementation contract. * This is a low level function that doesn't return to its internal call site. * It will return to the external caller whatever the implementation returns. * @param implementation Address to delegate. */ function _delegate(address implementation) internal { assembly { // Copy msg.data. We take full control of memory in this inline assembly // block because it will not return to Solidity code. We overwrite the // Solidity scratch pad at memory position 0. calldatacopy(0, 0, calldatasize) // Call the implementation. // out and outsize are 0 because we don't know the size yet. let result := delegatecall(gas, implementation, 0, calldatasize, 0, 0) // Copy the returned data. returndatacopy(0, 0, returndatasize) switch result // delegatecall returns 0 on error. case 0 { revert(0, returndatasize) } default { return(0, returndatasize) } } } /** * @return The Address of the implementation. */ function _implementation() internal view returns (address); } /** * @title BaseUpgradeabilityProxy * @dev This contract implements a proxy that allows to change the * implementation address to which it will delegate. * Such a change is called an implementation upgrade. */ contract BaseUpgradeabilityProxy is Proxy { using Address for address; /** * @dev The version of current(active) logic contract */ string internal _version; /** * @dev Storage slot with the address of the current implementation. * This is the keccak-256 hash of "org.zeppelinos.proxy.implementation", and is * validated in the constructor. */ bytes32 internal constant IMPLEMENTATION_SLOT = 0x7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c3; /** * @dev Emitted when the implementation is upgraded. * @param implementation Address of the new implementation. */ event Upgraded(address indexed implementation); /** * @dev Returns the current implementation. * @return Address of the current implementation */ function _implementation() internal view returns (address impl) { bytes32 slot = IMPLEMENTATION_SLOT; assembly { impl := sload(slot) } } /** * @dev Upgrades the proxy to a new implementation. * @param newImplementation Address of the new implementation. * @param newVersion of proxied contract. */ function _upgradeProxyTo(address newImplementation, string memory newVersion) internal { _setProxyImplementation(newImplementation, newVersion); emit Upgraded(newImplementation); } /** * @dev Sets the implementation address of the proxy. * @param newImplementation Address of the new implementation. * @param newVersion of proxied contract. */ function _setProxyImplementation(address newImplementation, string memory newVersion) internal { require(newImplementation.isContract(), "Cannot set a proxy implementation to a non-contract address"); _version = newVersion; bytes32 slot = IMPLEMENTATION_SLOT; assembly { sstore(slot, newImplementation) } } } /** * @title UpgradeabilityProxy * @dev Extends BaseUpgradeabilityProxy with a constructor for initializing * implementation and init data. */ contract UpgradeabilityProxy is BaseUpgradeabilityProxy { /** * @dev Contract constructor. * @param _logic Address of the initial implementation. */ constructor(address _logic) public payable { assert(IMPLEMENTATION_SLOT == keccak256("org.zeppelinos.proxy.implementation")); _setProxyImplementation(_logic, "1.0.0"); } } /** * @title BaseAdminUpgradeabilityProxy * @dev This contract combines an upgradeability proxy with an authorization * mechanism for administrative tasks. * All external functions in this contract must be guarded by the * `ifProxyAdmin` modifier. See ethereum/solidity#3864 for a Solidity * feature proposal that would enable this to be done automatically. */ contract BaseAdminUpgradeabilityProxy is BaseUpgradeabilityProxy { /** * @dev Emitted when the administration has been transferred. * @param previousAdmin Address of the previous admin. * @param newProxyAdmin Address of the new admin. */ event ProxyAdminChanged(address previousAdmin, address newProxyAdmin); /** * @dev Storage slot with the admin of the contract. * This is the keccak-256 hash of "org.zeppelinos.proxy.admin", and is * validated in the constructor. */ bytes32 internal constant ADMIN_SLOT = 0x10d6a54a4754c8869d6886b5f5d7fbfa5b4522237ea5c60d11bc4e7a1ff9390b; /** * @dev Modifier to check whether the `msg.sender` is the admin. * If it is, it will run the function. Otherwise, it will delegate the call * to the implementation. */ modifier ifProxyAdmin() { if (msg.sender == _proxyAdmin()) { _; } else { _fallback(); } } /** * @return The address of the proxy admin. */ function proxyAdmin() external view returns (address) { return _proxyAdmin(); } /** * @return The version of logic contract */ function proxyVersion() external view returns (string memory) { return _version; } /** * @return The address of the implementation. */ function proxyImplementation() external view returns (address) { return _implementation(); } /** * @dev Changes the admin of the proxy. * Only the current admin can call this function. * @param newProxyAdmin Address to transfer proxy administration to. */ function changeProxyAdmin(address newProxyAdmin) external ifProxyAdmin { require(newProxyAdmin != address(0), "Cannot change the admin of a proxy to the zero address"); emit ProxyAdminChanged(_proxyAdmin(), newProxyAdmin); _setProxyAdmin(newProxyAdmin); } /** * @dev Upgrade the backing implementation of the proxy. * Only the admin can call this function. * @param newImplementation Address of the new implementation. * @param newVersion of proxied contract. */ function upgradeProxyTo(address newImplementation, string calldata newVersion) external ifProxyAdmin { _upgradeProxyTo(newImplementation, newVersion); } /** * @dev Upgrade the backing implementation of the proxy and call a function * on the new implementation. * This is useful to initialize the proxied contract. * @param newImplementation Address of the new implementation. * @param newVersion of proxied contract. * @param data Data to send as msg.data in the low level call. * It should include the signature and the parameters of the function to be called, as described in * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding. */ function upgradeProxyToAndCall(address newImplementation, string calldata newVersion, bytes calldata data) payable external ifProxyAdmin { _upgradeProxyTo(newImplementation, newVersion); (bool success,) = newImplementation.delegatecall(data); require(success); } /** * @return The admin slot. */ function _proxyAdmin() internal view returns (address adm) { bytes32 slot = ADMIN_SLOT; assembly { adm := sload(slot) } } /** * @dev Sets the address of the proxy admin. * @param newProxyAdmin Address of the new proxy admin. */ function _setProxyAdmin(address newProxyAdmin) internal { bytes32 slot = ADMIN_SLOT; assembly { sstore(slot, newProxyAdmin) } } /** * @dev Only fall back when the sender is not the admin. */ function _willFallback() internal { require(msg.sender != _proxyAdmin(), "Cannot call fallback function from the proxy admin"); super._willFallback(); } } /** * @title RacingProxy * @dev Extends from BaseAdminUpgradeabilityProxy with a constructor for * initializing the implementation, admin, and init data. */ contract RacingProxy is BaseAdminUpgradeabilityProxy, UpgradeabilityProxy { /** * Contract constructor. * @param _logic address of the initial implementation. * @param _admin Address of the proxy administrator. */ constructor(address _logic, address _admin) UpgradeabilityProxy(_logic) public payable { assert(ADMIN_SLOT == keccak256("org.zeppelinos.proxy.admin")); _setProxyAdmin(_admin); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":true,"inputs":[{"name":"_raceId","type":"bytes32"},{"name":"_gate","type":"uint256"}],"name":"getHorseID","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_horseIDs","type":"uint256[]"}],"name":"bulkTransferOut","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"address"},{"name":"","type":"uint256"},{"name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"name":"","type":"bytes4"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"_raceId","type":"bytes32"},{"name":"_name","type":"string"},{"name":"_horsesAllowed","type":"uint256"},{"name":"_entranceFee","type":"uint256"},{"name":"_length","type":"uint256"}],"name":"createRace","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_raceId","type":"bytes32"}],"name":"getHorsesInRace","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"Cancelled_Races","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getCoreAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isAdmin","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"ID_Saved","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_bb","type":"address"}],"name":"setBbAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isPauser","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_horseIDs","type":"uint256[]"}],"name":"bulkTransferIn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_raceId","type":"bytes32"},{"name":"_startTime","type":"uint256"}],"name":"scheduleRace","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"renounceAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renouncePauser","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_raceId","type":"bytes32"},{"name":"_results","type":"uint256[12]"}],"name":"postResults","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_position","type":"uint256"},{"name":"_percentage","type":"uint256"}],"name":"changePaymentAllocation","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"addAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceFeeWallet","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"Is_Authorized","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"addPauser","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"Races","outputs":[{"name":"Track_Name","type":"string"},{"name":"Race_ID","type":"bytes32"},{"name":"Length","type":"uint256"},{"name":"Horses_Registered","type":"uint256"},{"name":"Unix_Start","type":"uint256"},{"name":"Entrance_Fee","type":"uint256"},{"name":"Prize_Pool","type":"uint256"},{"name":"Horses_Allowed","type":"uint256"},{"name":"Race_State","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_raceIds","type":"bytes32[]"},{"name":"_horseIDs","type":"uint256[]"}],"name":"claimAllWinningsHelper","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_raceId","type":"bytes32"},{"name":"_horseID","type":"uint256"},{"name":"_gateNumber","type":"uint256"}],"name":"registerHorse","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"isFeeWallet","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_raceId","type":"bytes32"},{"name":"_gate","type":"uint256"}],"name":"getHorseInfo","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"Owner_Horse","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getBBAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newFeeWallet","type":"address"}],"name":"transferFeeWalletOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_raceId","type":"bytes32"},{"name":"_reason","type":"string"}],"name":"cancelRace","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_core","type":"address"},{"name":"_bb","type":"address"}],"name":"initSetup","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_raceId","type":"bytes32"},{"name":"_gate","type":"uint256"},{"name":"_bettor","type":"address"}],"name":"getBetInfo","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"bool"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"Horse_Active_Races","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"feeWallet","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"Position_To_Payment","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"Has_Zed_Claimed","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_raceId","type":"bytes32"},{"name":"_horseID","type":"uint256"}],"name":"claimWinningsHelper","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_raceId","type":"bytes32"},{"indexed":true,"name":"_bettor","type":"address"},{"indexed":false,"name":"_betAmount","type":"uint256"},{"indexed":true,"name":"_horseID","type":"uint256"}],"name":"BetPlaced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_raceId","type":"bytes32"},{"indexed":true,"name":"_bettor","type":"address"},{"indexed":false,"name":"_claimAmount","type":"uint256"},{"indexed":true,"name":"_horseID","type":"uint256"}],"name":"PrizeClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_raceId","type":"bytes32"},{"indexed":true,"name":"_horseOwner","type":"address"},{"indexed":true,"name":"_horseID","type":"uint256"},{"indexed":false,"name":"_gateNumber","type":"uint256"}],"name":"HorseRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_horseOwner","type":"address"},{"indexed":false,"name":"_horseIDs","type":"uint256[]"}],"name":"HorseTransferredIn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_horseOwner","type":"address"},{"indexed":false,"name":"_horseIDs","type":"uint256[]"}],"name":"HorseTransferredOut","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_raceId","type":"bytes32"},{"indexed":false,"name":"_name","type":"string"},{"indexed":false,"name":"_length","type":"uint256"},{"indexed":false,"name":"_registrationFee","type":"uint256"}],"name":"RaceCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_raceId","type":"bytes32"},{"indexed":false,"name":"_unixStart","type":"uint256"},{"indexed":false,"name":"_name","type":"string"}],"name":"RaceScheduled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_raceId","type":"bytes32"}],"name":"RaceFull","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_raceId","type":"bytes32"},{"indexed":false,"name":"_firstPlaceHorseID","type":"uint256"},{"indexed":false,"name":"_secondPlaceHorseID","type":"uint256"},{"indexed":false,"name":"_thirdPlaceHorseID","type":"uint256"}],"name":"ResultsPosted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_raceId","type":"bytes32"},{"indexed":false,"name":"_reason","type":"string"},{"indexed":false,"name":"_canceller","type":"address"}],"name":"RaceCancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"PauserAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"PauserRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousFeeWallet","type":"address"},{"indexed":true,"name":"newFeeWallet","type":"address"}],"name":"FeeWalletTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"AdminAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"AdminRemoved","type":"event"}]
Contract Creation Code
608060405262000024620000186200006d60201b60201c565b6200007560201b60201c565b60016002819055506200004c620000406200006d60201b60201c565b620000d660201b60201c565b6000600e60006101000a81548160ff021916908315150217905550620002fb565b600033905090565b620000908160006200013760201b62004f121790919060201c565b8073ffffffffffffffffffffffffffffffffffffffff167f44d6d25963f097ad14f29f06854a01f575648a1ef82f30e562ccd3889717e33960405160405180910390a250565b620000f181600d6200013760201b62004f121790919060201c565b8073ffffffffffffffffffffffffffffffffffffffff167f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f860405160405180910390a250565b6200014982826200021b60201b60201c565b15620001bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f526f6c65733a206163636f756e7420616c72656164792068617320726f6c650081525060200191505060405180910390fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620002a4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180620057f26022913960400191505060405180910390fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6154e7806200030b6000396000f3fe60806040526004361061023b5760003560e01c806370a34c7c1161012e578063d1db212c116100ab578063f2136f231161006f578063f2136f23146111d7578063f25f4b5614611226578063f9114c931461127d578063fb80f303146112cc578063fd643a7b1461131f5761023b565b8063d1db212c14610f53578063d23587d714610faa578063e4e8210514610ffb578063eadeeab1146110cd578063ef1f46611461113e5761023b565b8063951d52f9116100f2578063951d52f914610d2c578063a2b0c86114610e07578063aeab1c6814610e49578063b0a0c2e714610e78578063c548e08214610ed85761023b565b806370a34c7c14610b4a57806380c965a514610b6157806382dc1ec414610bca5780638456cb5914610c1b5780638467536014610c325761023b565b80633f4ba83a116101bc5780635e1fab0f116101805780635e1fab0f146109ce5780636ef8d66d14610a1f5780636f00f0d714610a365780636fdebbef14610ab45780637048027514610af95761023b565b80633f4ba83a1461081557806346fbf68e1461082c5780634f942b8c1461089557806359c5f27b1461095a5780635c975abb1461099f5761023b565b80631e27daf0116102035780631e27daf0146105fd5780632096b768146106b157806324d7806c1461070857806325c719d6146107715780633992429b146107c45761023b565b80630aa407561461023d578063114ee35114610296578063150b7a021461035b57806315468f1e1461047d578063181cb85c1461056d575b005b34801561024957600080fd5b506102806004803603604081101561026057600080fd5b810190808035906020019092919080359060200190929190505050611364565b6040518082815260200191505060405180910390f35b3480156102a257600080fd5b50610359600480360360208110156102b957600080fd5b81019080803590602001906401000000008111156102d657600080fd5b8201836020820111156102e857600080fd5b8035906020019184602083028401116401000000008311171561030a57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290505050611396565b005b34801561036757600080fd5b506104296004803603608081101561037e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156103e557600080fd5b8201836020820111156103f757600080fd5b8035906020019184600183028401116401000000008311171561041957600080fd5b9091929391929390505050611812565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b34801561048957600080fd5b5061056b600480360360a08110156104a057600080fd5b8101908080359060200190929190803590602001906401000000008111156104c757600080fd5b8201836020820111156104d957600080fd5b803590602001918460018302840111640100000000831117156104fb57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001909291908035906020019092919080359060200190929190505050611838565b005b34801561057957600080fd5b506105a66004803603602081101561059057600080fd5b8101908080359060200190929190505050611cba565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156105e95780820151818401526020810190506105ce565b505050509050019250505060405180910390f35b34801561060957600080fd5b506106366004803603602081101561062057600080fd5b8101908080359060200190929190505050611d2e565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561067657808201518184015260208101905061065b565b50505050905090810190601f1680156106a35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156106bd57600080fd5b506106c6611dde565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561071457600080fd5b506107576004803603602081101561072b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611e08565b604051808215151515815260200191505060405180910390f35b34801561077d57600080fd5b506107aa6004803603602081101561079457600080fd5b8101908080359060200190929190505050611e25565b604051808215151515815260200191505060405180910390f35b3480156107d057600080fd5b50610813600480360360208110156107e757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611e45565b005b34801561082157600080fd5b5061082a611eee565b005b34801561083857600080fd5b5061087b6004803603602081101561084f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061205c565b604051808215151515815260200191505060405180910390f35b3480156108a157600080fd5b50610958600480360360208110156108b857600080fd5b81019080803590602001906401000000008111156108d557600080fd5b8201836020820111156108e757600080fd5b8035906020019184602083028401116401000000008311171561090957600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290505050612079565b005b34801561096657600080fd5b5061099d6004803603604081101561097d57600080fd5b810190808035906020019092919080359060200190929190505050612388565b005b3480156109ab57600080fd5b506109b4612703565b604051808215151515815260200191505060405180910390f35b3480156109da57600080fd5b50610a1d600480360360208110156109f157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061271a565b005b348015610a2b57600080fd5b50610a3461278b565b005b348015610a4257600080fd5b50610ab260048036036101a0811015610a5a57600080fd5b8101908080359060200190929190806101800190600c806020026040519081016040528092919082600c60200280828437600081840152601f19601f820116905080830192505050505050919291929050505061279d565b005b348015610ac057600080fd5b50610af760048036036040811015610ad757600080fd5b810190808035906020019092919080359060200190929190505050612ce4565b005b348015610b0557600080fd5b50610b4860048036036020811015610b1c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612d65565b005b348015610b5657600080fd5b50610b5f612dd6565b005b348015610b6d57600080fd5b50610bb060048036036020811015610b8457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612efc565b604051808215151515815260200191505060405180910390f35b348015610bd657600080fd5b50610c1960048036036020811015610bed57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612f1c565b005b348015610c2757600080fd5b50610c30612f8d565b005b348015610c3e57600080fd5b50610c6b60048036036020811015610c5557600080fd5b81019080803590602001909291905050506130fc565b60405180806020018a8152602001898152602001888152602001878152602001868152602001858152602001848152602001836004811115610ca957fe5b60ff16815260200182810382528b818151815260200191508051906020019080838360005b83811015610ce9578082015181840152602081019050610cce565b50505050905090810190601f168015610d165780820380516001836020036101000a031916815260200191505b509a505050505050505050505060405180910390f35b348015610d3857600080fd5b50610e0560048036036040811015610d4f57600080fd5b8101908080359060200190640100000000811115610d6c57600080fd5b820183602082011115610d7e57600080fd5b80359060200191846020830284011164010000000083111715610da057600080fd5b909192939192939080359060200190640100000000811115610dc157600080fd5b820183602082011115610dd357600080fd5b80359060200191846020830284011164010000000083111715610df557600080fd5b90919293919293905050506131ef565b005b610e4760048036036060811015610e1d57600080fd5b810190808035906020019092919080359060200190929190803590602001909291905050506133f0565b005b348015610e5557600080fd5b50610e5e613cd2565b604051808215151515815260200191505060405180910390f35b348015610e8457600080fd5b50610ebb60048036036040811015610e9b57600080fd5b810190808035906020019092919080359060200190929190505050613d31565b604051808381526020018281526020019250505060405180910390f35b348015610ee457600080fd5b50610f1160048036036020811015610efb57600080fd5b8101908080359060200190929190505050613d9b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610f5f57600080fd5b50610f68613dce565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610fb657600080fd5b50610ff960048036036020811015610fcd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613df8565b005b34801561100757600080fd5b506110cb6004803603604081101561101e57600080fd5b81019080803590602001909291908035906020019064010000000081111561104557600080fd5b82018360208201111561105757600080fd5b8035906020019184600183028401116401000000008311171561107957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050613e69565b005b3480156110d957600080fd5b5061113c600480360360408110156110f057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506141a8565b005b34801561114a57600080fd5b506111a16004803603606081101561116157600080fd5b810190808035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506142e1565b60405180868152602001858152602001848152602001831515151581526020018281526020019550505050505060405180910390f35b3480156111e357600080fd5b50611210600480360360208110156111fa57600080fd5b8101908080359060200190929190505050614459565b6040518082815260200191505060405180910390f35b34801561123257600080fd5b5061123b614471565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561128957600080fd5b506112b6600480360360208110156112a057600080fd5b810190808035906020019092919050505061449b565b6040518082815260200191505060405180910390f35b3480156112d857600080fd5b50611305600480360360208110156112ef57600080fd5b81019080803590602001909291905050506144b3565b604051808215151515815260200191505060405180910390f35b34801561132b57600080fd5b506113626004803603604081101561134257600080fd5b8101908080359060200190929190803590602001909291905050506144d3565b005b600060036000848152602001908152602001600020600b01600083815260200190815260200160002054905092915050565b6001600260008282540192505081905550600060025490506010825110611408576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806152446023913960400191505060405180910390fd5b60008090505b82518160ff161015611707573373ffffffffffffffffffffffffffffffffffffffff1660046000858460ff168151811061144457fe5b6020026020010151815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611504576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f43616c6c6572206973206e6f7420746865206f776e65722e000000000000000081525060200191505060405180910390fd5b600060056000858460ff168151811061151957fe5b602002602001015181526020019081526020016000205414611586576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806153a06021913960400191505060405180910390fd5b600060046000858460ff168151811061159b57fe5b6020026020010151815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e3033868560ff168151811061163e57fe5b60200260200101516040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1580156116e257600080fd5b505af11580156116f6573d6000803e3d6000fd5b50505050808060010191505061140e565b503373ffffffffffffffffffffffffffffffffffffffff167f3d3dec951aa841e2a58e264722acb6b140278cf0bd892255283d364ce3862f45836040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015611784578082015181840152602081019050611769565b505050509050019250505060405180910390a2600254811461180e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b5050565b60006040518080615267602f9139602f0190506040518091039020905095945050505050565b611848611843614579565b611e08565b61189d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615404602e913960400191505060405180910390fd5b600160026000828254019250508190555060006002549050600e60009054906101000a900460ff1615611938576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b600083116119ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f456e7472616e636520666565206c6f776572207468616e207a65726f0000000081525060200191505060405180910390fd5b6006600087815260200190815260200160002060009054906101000a900460ff1615611a42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f526163652049442065786973747300000000000000000000000000000000000081525060200191505060405180910390fd5b611a4a614fed565b86816020018181525050858160000181905250848160e0018181525050838160a00181815250508281604001818152505060018161012001906004811115611a8e57fe5b90816004811115611a9b57fe5b8152505080600360008981526020019081526020016000206000820151816000019080519060200190611acf92919061504e565b506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e08201518160070155610100820151816008019080519060200190611b339291906150ce565b506101208201518160090160006101000a81548160ff02191690836004811115611b5957fe5b021790555090505060016006600089815260200190815260200160002060006101000a81548160ff021916908315150217905550867f90e52d31327868049927e468ffc978cc0f845f271e577f2d2566536cd6836dc68785876040518080602001848152602001838152602001828103825285818151815260200191508051906020019080838360005b83811015611bfe578082015181840152602081019050611be3565b50505050905090810190601f168015611c2b5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a2506002548114611cb2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b505050505050565b6060600060036000848152602001908152602001600020905080600801805480602002602001604051908101604052809291908181526020018280548015611d2157602002820191906000526020600020905b815481526020019060010190808311611d0d575b5050505050915050919050565b60096020528060005260406000206000915090508054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611dd65780601f10611dab57610100808354040283529160200191611dd6565b820191906000526020600020905b815481529060010190602001808311611db957829003601f168201915b505050505081565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000611e1e82600061458190919063ffffffff16565b9050919050565b60066020528060005260406000206000915054906101000a900460ff1681565b611e55611e50614579565b611e08565b611eaa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615404602e913960400191505060405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611efe611ef9614579565b61205c565b611f53576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806152966030913960400191505060405180910390fd5b600e60009054906101000a900460ff16611fd5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5061757361626c653a206e6f742070617573656400000000000000000000000081525060200191505060405180910390fd5b6000600e60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612019614579565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b600061207282600d61458190919063ffffffff16565b9050919050565b60016002600082825401925050819055506000600254905060108251106120eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806152446023913960400191505060405180910390fd5b60008090505b82518160ff16101561227d573360046000858460ff168151811061211157fe5b6020026020010151815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e3330868560ff16815181106121b457fe5b60200260200101516040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b15801561225857600080fd5b505af115801561226c573d6000803e3d6000fd5b5050505080806001019150506120f1565b503373ffffffffffffffffffffffffffffffffffffffff167f3dcf5b35d176866ac652249eab93a0572716225202eb5ab57935766fbe59eab0836040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156122fa5780820151818401526020810190506122df565b505050509050019250505060405180910390a26002548114612384576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b5050565b612398612393614579565b611e08565b6123ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615404602e913960400191505060405180910390fd5b60016002600082825401925050819055506000600254905060006003600085815260200190815260200160002090508060070154816003015414612499576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4e6f7420656e6f75676820686f7273657320726567697374657265640000000081525060200191505060405180910390fd5b600160048111156124a657fe5b8160090160009054906101000a900460ff1660048111156124c357fe5b14612519576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061549b6021913960400191505060405180910390fd5b61012c42018311612592576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f53746172742074696d6520646f65736e74206d6565742063726974657269610081525060200191505060405180910390fd5b82816004018190555060028160090160006101000a81548160ff021916908360048111156125bc57fe5b0217905550837fef3df935b4473f7535b7036b7355247b10ecc7d6182af68e7a0578c8adfc5ee9848360000160405180838152602001806020018281038252838181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156126775780601f1061264c57610100808354040283529160200191612677565b820191906000526020600020905b81548152906001019060200180831161265a57829003601f168201915b5050935050505060405180910390a25060025481146126fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b505050565b6000600e60009054906101000a900460ff16905090565b61272a612725614579565b611e08565b61277f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615404602e913960400191505060405180910390fd5b6127888161465f565b50565b61279b612796614579565b6146b9565b565b6127ad6127a8614579565b611e08565b612802576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615404602e913960400191505060405180910390fd5b60016002600082825401925050819055506000600254905060006003600085815260200190815260200160002090506002600481111561283e57fe5b8160090160009054906101000a900460ff16600481111561285b57fe5b146128ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f52616365206973206e6f74206f6e2062657474696e672073746174650000000081525060200191505060405180910390fd5b603c42018160040154111561294b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f4d69736d61746368206f6e20756e69782073746172740000000000000000000081525060200191505060405180910390fd5b60038160090160006101000a81548160ff0219169083600481111561296c57fe5b021790555060008090505b8160070154811015612a2f57600082600a0160008684600c811061299757fe5b60200201518152602001908152602001600020600001541415612a22576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f4944206e6f74207265676973746572656400000000000000000000000000000081525060200191505060405180910390fd5b8080600101915050612977565b5060008090505b8160070154811015612ab3576001810182600a0160008684600c8110612a5857fe5b6020020151815260200190815260200160002060020181905550600560008583600c8110612a8257fe5b6020020151815260200190815260200160002060008154809291906001900391905055508080600101915050612a36565b5060008090505b8160070154811015612b73576001810182600a0160008684600c8110612adc57fe5b602002015181526020019081526020016000206002015414612b66576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4944206e6f74207375626d69747465642070726f7065726c790000000000000081525060200191505060405180910390fd5b8080600101915050612aba565b50612b7c614471565b73ffffffffffffffffffffffffffffffffffffffff166108fc612bc06064612bb2600a866006015461471390919063ffffffff16565b61479990919063ffffffff16565b9081150290604051600060405180830381858888f19350505050158015612beb573d6000803e3d6000fd5b50837fd1f7e3b7d720f0eef8ee86bf688d0bfdfcd66ac0e224b423e7dfc1761999727a846000600c8110612c1b57fe5b6020020151856001600c8110612c2d57fe5b6020020151866002600c8110612c3f57fe5b602002015160405180848152602001838152602001828152602001935050505060405180910390a2506002548114612cdf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b505050565b612cf4612cef614579565b611e08565b612d49576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615404602e913960400191505060405180910390fd5b8060076000848152602001908152602001600020819055505050565b612d75612d70614579565b611e08565b612dca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615404602e913960400191505060405180910390fd5b612dd3816147e3565b50565b612de6612de1614579565b611e08565b612e3b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615404602e913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f84c9efad00ae50fa2cbd9c51134e8a8454b889ed600dc5e5833df6ecdcc80d4f60405160405180910390a36000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60086020528060005260406000206000915054906101000a900460ff1681565b612f2c612f27614579565b61205c565b612f81576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806152966030913960400191505060405180910390fd5b612f8a8161483d565b50565b612f9d612f98614579565b61205c565b612ff2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806152966030913960400191505060405180910390fd5b600e60009054906101000a900460ff1615613075576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6001600e60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586130b9614579565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b6003602052806000526040600020600091509050806000018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156131a85780601f1061317d576101008083540402835291602001916131a8565b820191906000526020600020905b81548152906001019060200180831161318b57829003601f168201915b5050505050908060010154908060020154908060030154908060040154908060050154908060060154908060070154908060090160009054906101000a900460ff16905089565b60016002600082825401925050819055506000600254905060008585905011613263576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260398152602001806151c16039913960400191505060405180910390fd5b607d85859050106132bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604a8152602001806151fa604a913960600191505060405180910390fd5b82829050858590501461331d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604f815260200180615351604f913960600191505060405180910390fd5b60008090505b858590508110156133715761336486868381811061333d57fe5b9050602002013585858481811061335057fe5b9050602002013561335f614579565b614897565b8080600101915050613323565b5060025481146133e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b5050505050565b600160026000828254019250508190555060006002549050600e60009054906101000a900460ff161561348b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6000600360008681526020019081526020016000209050806005015434101561351c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f456e7472616e636520666565206e6f74206d657400000000000000000000000081525060200191505060405180910390fd5b6001600481111561352957fe5b8160090160009054906101000a900460ff16600481111561354657fe5b146135b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f52616365206e6f7420616363657074696e6720726567697374726174696f6e7381525060200191505060405180910390fd5b8060070154816003015410613636576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4d6178206e756d626572206f6620686f7273657320666f72207261636500000081525060200191505060405180910390fd5b60018310156136ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f47617465206e756d626572206c6f776572207468616e20312e0000000000000081525060200191505060405180910390fd5b8060070154831115613727576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f47617465206e756d6265722067726561746572207468616e206d61780000000081525060200191505060405180910390fd5b80600c01600084815260200190815260200160002060009054906101000a900460ff16156137bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f47617465206e756d62657220616c72656164792074616b656e0000000000000081525060200191505060405180910390fd5b6003600560008681526020019081526020016000205410613829576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806154546021913960400191505060405180910390fd5b600081600a016000868152602001908152602001600020600001541461389a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806154756026913960400191505060405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e866040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561392457600080fd5b505afa158015613938573d6000803e3d6000fd5b505050506040513d602081101561394e57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16146139cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806152ec6023913960400191505060405180910390fd5b60056000858152602001908152602001600020600081548092919060010191905055508060030160008154809291906001019190505550604051806060016040528084815260200160008152602001600081525081600a0160008681526020019081526020016000206000820151816000015560208201518160010155604082015181600201559050508381600b01600085815260200190815260200160002081905550600181600c01600085815260200190815260200160002060006101000a81548160ff02191690831515021790555080600501548160060160008282540192505081905550806005015481600a01600086815260200190815260200160002060010160008282540192505081905550806005015481600a01600086815260200190815260200160002060030160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555080600801849080600181540180825580915050906001820390600052602060002001600090919290919091505550806007015481600301541415613bb057847f62473fbb9326dcad400e9fd91026768dbcf6dad189f4b397db633765489b380260405160405180910390a25b833373ffffffffffffffffffffffffffffffffffffffff16867ff658eab36be8f9e91803a03670bd82fe4dc102503be52a6d901f6b044db50dc5866040518082815260200191505060405180910390a4833373ffffffffffffffffffffffffffffffffffffffff16867fc9621b1db612fa52c8213099eb7c450b407922963a8c63ee6bfe963404f4599784600501546040518082815260200191505060405180910390a4506002548114613ccc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b50505050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613d15614579565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b600080600060036000868152602001908152602001600020905080600b0160008581526020019081526020016000205481600a01600083600b0160008881526020019081526020016000205481526020019081526020016000206002015492509250509250929050565b60046020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b613e08613e03614579565b611e08565b613e5d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615404602e913960400191505060405180910390fd5b613e6681614c49565b50565b613e79613e74614579565b611e08565b613ece576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615404602e913960400191505060405180910390fd5b600160026000828254019250508190555060006002549050600060036000858152602001908152602001600020905060016004811115613f0a57fe5b8160090160009054906101000a900460ff166004811115613f2757fe5b1480613f5a575060026004811115613f3b57fe5b8160090160009054906101000a900460ff166004811115613f5857fe5b145b613faf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806153306021913960400191505060405180910390fd5b60048160090160006101000a81548160ff02191690836004811115613fd057fe5b021790555082600960008681526020019081526020016000209080519060200190613ffc92919061511b565b5060008090505b8160030154811015614059576005600083600801838154811061402257fe5b9060005260206000200154815260200190815260200160002060008154809291906001900391905055508080600101915050614003565b50837fa6facd5724e022e7a663091abdf8d4f70d89f969fab200adedea42a41fcebaa8843360405180806020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828103825284818151815260200191508051906020019080838360005b838110156140f05780820151818401526020810190506140d5565b50505050905090810190601f16801561411d5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a25060025481146141a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b505050565b6141b86141b3614579565b611e08565b61420d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615404602e913960400191505060405180910390fd5b603c6007600060018152602001908152602001600020819055506014600760006002815260200190815260200160002081905550600a60076000600381526020019081526020016000208190555080600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b600080600080600080600360008a81526020019081526020016000209050806006015481600a01600083600b0160008c81526020019081526020016000205481526020019081526020016000206001015482600a01600084600b0160008d815260200190815260200160002054815260200190815260200160002060030160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483600a01600085600b0160008e815260200190815260200160002054815260200190815260200160002060040160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1684600a01600086600b0160008f8152602001908152602001600020548152602001908152602001600020600201549550955095509550955050939792965093509350565b60056020528060005260406000206000915090505481565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60076020528060005260406000206000915090505481565b600a6020528060005260406000206000915054906101000a900460ff1681565b6001600260008282540192505081905550600060025490506144fd83836144f8614579565b614897565b6002548114614574576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b505050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415614608576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806153e26022913960400191505060405180910390fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b614673816000614d8f90919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167fa3b62bc36326052d97ea62d63c3d60308ed4c3ea8ac079dd8499f1e9c4f80c0f60405160405180910390a250565b6146cd81600d614d8f90919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167fcd265ebaf09df2871cc7bd4133404a235ba12eff2041bb89d9c714a2621c7c7e60405160405180910390a250565b6000808314156147265760009050614793565b600082840290508284828161473757fe5b041461478e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806153c16021913960400191505060405180910390fd5b809150505b92915050565b60006147db83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614e4c565b905092915050565b6147f7816000614f1290919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f44d6d25963f097ad14f29f06854a01f575648a1ef82f30e562ccd3889717e33960405160405180910390a250565b61485181600d614f1290919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f860405160405180910390a250565b600060036000858152602001908152602001600020905060006004600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614614987576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f4e6f7420686f727365206f776e6572000000000000000000000000000000000081525060200191505060405180910390fd5b6003600481111561499457fe5b8260090160009054906101000a900460ff1660048111156149b157fe5b14614a24576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f52616365207374696c6c2072756e6e696e67000000000000000000000000000081525060200191505060405180910390fd5b81600a01600085815260200190815260200160002060040160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615614add576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806154326022913960400191505060405180910390fd5b600182600a01600086815260200190815260200160002060040160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600082600a0160008681526020019081526020016000206002015490506000614ba76064614b996007600086815260200190815260200160002054876006015461471390919063ffffffff16565b61479990919063ffffffff16565b90508473ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015614bef573d6000803e3d6000fd5b50858373ffffffffffffffffffffffffffffffffffffffff16887fa3dd4a1386669cfcc372819ceaee69df2c1c14eb82976d79bd15c856666cb650846040518082815260200191505060405180910390a450505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415614ccf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806152c66026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f84c9efad00ae50fa2cbd9c51134e8a8454b889ed600dc5e5833df6ecdcc80d4f60405160405180910390a380600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b614d998282614581565b614dee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061530f6021913960400191505060405180910390fd5b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60008083118290614ef8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614ebd578082015181840152602081019050614ea2565b50505050905090810190601f168015614eea5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581614f0457fe5b049050809150509392505050565b614f1c8282614581565b15614f8f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f526f6c65733a206163636f756e7420616c72656164792068617320726f6c650081525060200191505060405180910390fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6040518061014001604052806060815260200160008019168152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001606081526020016000600481111561504857fe5b81525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061508f57805160ff19168380011785556150bd565b828001600101855582156150bd579182015b828111156150bc5782518255916020019190600101906150a1565b5b5090506150ca919061519b565b5090565b82805482825590600052602060002090810192821561510a579160200282015b828111156151095782518255916020019190600101906150ee565b5b509050615117919061519b565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061515c57805160ff191683800117855561518a565b8280016001018555821561518a579182015b8281111561518957825182559160200191906001019061516e565b5b509050615197919061519b565b5090565b6151bd91905b808211156151b95760008160009055506001016151a1565b5090565b9056fe636c61696d416c6c57696e6e696e677348656c7065723a207261636549642061727261792073686f756c64206e6f7420626520656d7074792e636c61696d416c6c57696e6e696e677348656c7065723a20726163654964206172726179206c656e67746820697320626967676572207468616e2070726f7669646564206c696d69742e4f6e6c7920313520686f7273657320616c6c6f77656420706572207472616e736665726f6e455243373231526563656976656428616464726573732c616464726573732c75696e743235362c627974657329506175736572526f6c653a2063616c6c657220646f6573206e6f742068617665207468652050617573657220726f6c654f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373526163696e6720636f6e7472616374206e6f74206f776e6572206f6620686f7273652e526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c6552616365206e6f74206f6e2072656773206f722062657474696e67207374617465636c61696d416c6c57696e6e696e677348656c7065723a206c656e67746873206f66207261636569647320616e6420686f727365696473206172726179732073686f756c6420626520657175616c2e486f7273652063757272656e746c792061637469766520696e206120726163652e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77526f6c65733a206163636f756e7420697320746865207a65726f206164647265737341646d696e526f6c653a2063616c6c657220646f6573206e6f742068617665207468652041646d696e20726f6c6557696e6e696e6773206861766520616c7265616479206265656e20636c61696d6564486f7273652063757272656e746c792061637469766520696e2033207261636573486f72736520616c7265616479207265676973746572656420666f722074686973207261636552616365206973206e6f7420696e20726567697374726174696f6e207374617465a165627a7a723058206bf9b18135615c64d28842945084edc2ef3d9fe787080f9cbfdbf0f22a688a6d0029526f6c65733a206163636f756e7420697320746865207a65726f2061646472657373
Deployed Bytecode
0x60806040526004361061023b5760003560e01c806370a34c7c1161012e578063d1db212c116100ab578063f2136f231161006f578063f2136f23146111d7578063f25f4b5614611226578063f9114c931461127d578063fb80f303146112cc578063fd643a7b1461131f5761023b565b8063d1db212c14610f53578063d23587d714610faa578063e4e8210514610ffb578063eadeeab1146110cd578063ef1f46611461113e5761023b565b8063951d52f9116100f2578063951d52f914610d2c578063a2b0c86114610e07578063aeab1c6814610e49578063b0a0c2e714610e78578063c548e08214610ed85761023b565b806370a34c7c14610b4a57806380c965a514610b6157806382dc1ec414610bca5780638456cb5914610c1b5780638467536014610c325761023b565b80633f4ba83a116101bc5780635e1fab0f116101805780635e1fab0f146109ce5780636ef8d66d14610a1f5780636f00f0d714610a365780636fdebbef14610ab45780637048027514610af95761023b565b80633f4ba83a1461081557806346fbf68e1461082c5780634f942b8c1461089557806359c5f27b1461095a5780635c975abb1461099f5761023b565b80631e27daf0116102035780631e27daf0146105fd5780632096b768146106b157806324d7806c1461070857806325c719d6146107715780633992429b146107c45761023b565b80630aa407561461023d578063114ee35114610296578063150b7a021461035b57806315468f1e1461047d578063181cb85c1461056d575b005b34801561024957600080fd5b506102806004803603604081101561026057600080fd5b810190808035906020019092919080359060200190929190505050611364565b6040518082815260200191505060405180910390f35b3480156102a257600080fd5b50610359600480360360208110156102b957600080fd5b81019080803590602001906401000000008111156102d657600080fd5b8201836020820111156102e857600080fd5b8035906020019184602083028401116401000000008311171561030a57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290505050611396565b005b34801561036757600080fd5b506104296004803603608081101561037e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156103e557600080fd5b8201836020820111156103f757600080fd5b8035906020019184600183028401116401000000008311171561041957600080fd5b9091929391929390505050611812565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b34801561048957600080fd5b5061056b600480360360a08110156104a057600080fd5b8101908080359060200190929190803590602001906401000000008111156104c757600080fd5b8201836020820111156104d957600080fd5b803590602001918460018302840111640100000000831117156104fb57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001909291908035906020019092919080359060200190929190505050611838565b005b34801561057957600080fd5b506105a66004803603602081101561059057600080fd5b8101908080359060200190929190505050611cba565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156105e95780820151818401526020810190506105ce565b505050509050019250505060405180910390f35b34801561060957600080fd5b506106366004803603602081101561062057600080fd5b8101908080359060200190929190505050611d2e565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561067657808201518184015260208101905061065b565b50505050905090810190601f1680156106a35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156106bd57600080fd5b506106c6611dde565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561071457600080fd5b506107576004803603602081101561072b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611e08565b604051808215151515815260200191505060405180910390f35b34801561077d57600080fd5b506107aa6004803603602081101561079457600080fd5b8101908080359060200190929190505050611e25565b604051808215151515815260200191505060405180910390f35b3480156107d057600080fd5b50610813600480360360208110156107e757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611e45565b005b34801561082157600080fd5b5061082a611eee565b005b34801561083857600080fd5b5061087b6004803603602081101561084f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061205c565b604051808215151515815260200191505060405180910390f35b3480156108a157600080fd5b50610958600480360360208110156108b857600080fd5b81019080803590602001906401000000008111156108d557600080fd5b8201836020820111156108e757600080fd5b8035906020019184602083028401116401000000008311171561090957600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290505050612079565b005b34801561096657600080fd5b5061099d6004803603604081101561097d57600080fd5b810190808035906020019092919080359060200190929190505050612388565b005b3480156109ab57600080fd5b506109b4612703565b604051808215151515815260200191505060405180910390f35b3480156109da57600080fd5b50610a1d600480360360208110156109f157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061271a565b005b348015610a2b57600080fd5b50610a3461278b565b005b348015610a4257600080fd5b50610ab260048036036101a0811015610a5a57600080fd5b8101908080359060200190929190806101800190600c806020026040519081016040528092919082600c60200280828437600081840152601f19601f820116905080830192505050505050919291929050505061279d565b005b348015610ac057600080fd5b50610af760048036036040811015610ad757600080fd5b810190808035906020019092919080359060200190929190505050612ce4565b005b348015610b0557600080fd5b50610b4860048036036020811015610b1c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612d65565b005b348015610b5657600080fd5b50610b5f612dd6565b005b348015610b6d57600080fd5b50610bb060048036036020811015610b8457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612efc565b604051808215151515815260200191505060405180910390f35b348015610bd657600080fd5b50610c1960048036036020811015610bed57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612f1c565b005b348015610c2757600080fd5b50610c30612f8d565b005b348015610c3e57600080fd5b50610c6b60048036036020811015610c5557600080fd5b81019080803590602001909291905050506130fc565b60405180806020018a8152602001898152602001888152602001878152602001868152602001858152602001848152602001836004811115610ca957fe5b60ff16815260200182810382528b818151815260200191508051906020019080838360005b83811015610ce9578082015181840152602081019050610cce565b50505050905090810190601f168015610d165780820380516001836020036101000a031916815260200191505b509a505050505050505050505060405180910390f35b348015610d3857600080fd5b50610e0560048036036040811015610d4f57600080fd5b8101908080359060200190640100000000811115610d6c57600080fd5b820183602082011115610d7e57600080fd5b80359060200191846020830284011164010000000083111715610da057600080fd5b909192939192939080359060200190640100000000811115610dc157600080fd5b820183602082011115610dd357600080fd5b80359060200191846020830284011164010000000083111715610df557600080fd5b90919293919293905050506131ef565b005b610e4760048036036060811015610e1d57600080fd5b810190808035906020019092919080359060200190929190803590602001909291905050506133f0565b005b348015610e5557600080fd5b50610e5e613cd2565b604051808215151515815260200191505060405180910390f35b348015610e8457600080fd5b50610ebb60048036036040811015610e9b57600080fd5b810190808035906020019092919080359060200190929190505050613d31565b604051808381526020018281526020019250505060405180910390f35b348015610ee457600080fd5b50610f1160048036036020811015610efb57600080fd5b8101908080359060200190929190505050613d9b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610f5f57600080fd5b50610f68613dce565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610fb657600080fd5b50610ff960048036036020811015610fcd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613df8565b005b34801561100757600080fd5b506110cb6004803603604081101561101e57600080fd5b81019080803590602001909291908035906020019064010000000081111561104557600080fd5b82018360208201111561105757600080fd5b8035906020019184600183028401116401000000008311171561107957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050613e69565b005b3480156110d957600080fd5b5061113c600480360360408110156110f057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506141a8565b005b34801561114a57600080fd5b506111a16004803603606081101561116157600080fd5b810190808035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506142e1565b60405180868152602001858152602001848152602001831515151581526020018281526020019550505050505060405180910390f35b3480156111e357600080fd5b50611210600480360360208110156111fa57600080fd5b8101908080359060200190929190505050614459565b6040518082815260200191505060405180910390f35b34801561123257600080fd5b5061123b614471565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561128957600080fd5b506112b6600480360360208110156112a057600080fd5b810190808035906020019092919050505061449b565b6040518082815260200191505060405180910390f35b3480156112d857600080fd5b50611305600480360360208110156112ef57600080fd5b81019080803590602001909291905050506144b3565b604051808215151515815260200191505060405180910390f35b34801561132b57600080fd5b506113626004803603604081101561134257600080fd5b8101908080359060200190929190803590602001909291905050506144d3565b005b600060036000848152602001908152602001600020600b01600083815260200190815260200160002054905092915050565b6001600260008282540192505081905550600060025490506010825110611408576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806152446023913960400191505060405180910390fd5b60008090505b82518160ff161015611707573373ffffffffffffffffffffffffffffffffffffffff1660046000858460ff168151811061144457fe5b6020026020010151815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611504576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f43616c6c6572206973206e6f7420746865206f776e65722e000000000000000081525060200191505060405180910390fd5b600060056000858460ff168151811061151957fe5b602002602001015181526020019081526020016000205414611586576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806153a06021913960400191505060405180910390fd5b600060046000858460ff168151811061159b57fe5b6020026020010151815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e3033868560ff168151811061163e57fe5b60200260200101516040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1580156116e257600080fd5b505af11580156116f6573d6000803e3d6000fd5b50505050808060010191505061140e565b503373ffffffffffffffffffffffffffffffffffffffff167f3d3dec951aa841e2a58e264722acb6b140278cf0bd892255283d364ce3862f45836040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015611784578082015181840152602081019050611769565b505050509050019250505060405180910390a2600254811461180e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b5050565b60006040518080615267602f9139602f0190506040518091039020905095945050505050565b611848611843614579565b611e08565b61189d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615404602e913960400191505060405180910390fd5b600160026000828254019250508190555060006002549050600e60009054906101000a900460ff1615611938576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b600083116119ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f456e7472616e636520666565206c6f776572207468616e207a65726f0000000081525060200191505060405180910390fd5b6006600087815260200190815260200160002060009054906101000a900460ff1615611a42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f526163652049442065786973747300000000000000000000000000000000000081525060200191505060405180910390fd5b611a4a614fed565b86816020018181525050858160000181905250848160e0018181525050838160a00181815250508281604001818152505060018161012001906004811115611a8e57fe5b90816004811115611a9b57fe5b8152505080600360008981526020019081526020016000206000820151816000019080519060200190611acf92919061504e565b506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e08201518160070155610100820151816008019080519060200190611b339291906150ce565b506101208201518160090160006101000a81548160ff02191690836004811115611b5957fe5b021790555090505060016006600089815260200190815260200160002060006101000a81548160ff021916908315150217905550867f90e52d31327868049927e468ffc978cc0f845f271e577f2d2566536cd6836dc68785876040518080602001848152602001838152602001828103825285818151815260200191508051906020019080838360005b83811015611bfe578082015181840152602081019050611be3565b50505050905090810190601f168015611c2b5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a2506002548114611cb2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b505050505050565b6060600060036000848152602001908152602001600020905080600801805480602002602001604051908101604052809291908181526020018280548015611d2157602002820191906000526020600020905b815481526020019060010190808311611d0d575b5050505050915050919050565b60096020528060005260406000206000915090508054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611dd65780601f10611dab57610100808354040283529160200191611dd6565b820191906000526020600020905b815481529060010190602001808311611db957829003601f168201915b505050505081565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000611e1e82600061458190919063ffffffff16565b9050919050565b60066020528060005260406000206000915054906101000a900460ff1681565b611e55611e50614579565b611e08565b611eaa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615404602e913960400191505060405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611efe611ef9614579565b61205c565b611f53576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806152966030913960400191505060405180910390fd5b600e60009054906101000a900460ff16611fd5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5061757361626c653a206e6f742070617573656400000000000000000000000081525060200191505060405180910390fd5b6000600e60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612019614579565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b600061207282600d61458190919063ffffffff16565b9050919050565b60016002600082825401925050819055506000600254905060108251106120eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806152446023913960400191505060405180910390fd5b60008090505b82518160ff16101561227d573360046000858460ff168151811061211157fe5b6020026020010151815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e3330868560ff16815181106121b457fe5b60200260200101516040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b15801561225857600080fd5b505af115801561226c573d6000803e3d6000fd5b5050505080806001019150506120f1565b503373ffffffffffffffffffffffffffffffffffffffff167f3dcf5b35d176866ac652249eab93a0572716225202eb5ab57935766fbe59eab0836040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156122fa5780820151818401526020810190506122df565b505050509050019250505060405180910390a26002548114612384576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b5050565b612398612393614579565b611e08565b6123ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615404602e913960400191505060405180910390fd5b60016002600082825401925050819055506000600254905060006003600085815260200190815260200160002090508060070154816003015414612499576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4e6f7420656e6f75676820686f7273657320726567697374657265640000000081525060200191505060405180910390fd5b600160048111156124a657fe5b8160090160009054906101000a900460ff1660048111156124c357fe5b14612519576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061549b6021913960400191505060405180910390fd5b61012c42018311612592576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f53746172742074696d6520646f65736e74206d6565742063726974657269610081525060200191505060405180910390fd5b82816004018190555060028160090160006101000a81548160ff021916908360048111156125bc57fe5b0217905550837fef3df935b4473f7535b7036b7355247b10ecc7d6182af68e7a0578c8adfc5ee9848360000160405180838152602001806020018281038252838181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156126775780601f1061264c57610100808354040283529160200191612677565b820191906000526020600020905b81548152906001019060200180831161265a57829003601f168201915b5050935050505060405180910390a25060025481146126fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b505050565b6000600e60009054906101000a900460ff16905090565b61272a612725614579565b611e08565b61277f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615404602e913960400191505060405180910390fd5b6127888161465f565b50565b61279b612796614579565b6146b9565b565b6127ad6127a8614579565b611e08565b612802576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615404602e913960400191505060405180910390fd5b60016002600082825401925050819055506000600254905060006003600085815260200190815260200160002090506002600481111561283e57fe5b8160090160009054906101000a900460ff16600481111561285b57fe5b146128ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f52616365206973206e6f74206f6e2062657474696e672073746174650000000081525060200191505060405180910390fd5b603c42018160040154111561294b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f4d69736d61746368206f6e20756e69782073746172740000000000000000000081525060200191505060405180910390fd5b60038160090160006101000a81548160ff0219169083600481111561296c57fe5b021790555060008090505b8160070154811015612a2f57600082600a0160008684600c811061299757fe5b60200201518152602001908152602001600020600001541415612a22576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f4944206e6f74207265676973746572656400000000000000000000000000000081525060200191505060405180910390fd5b8080600101915050612977565b5060008090505b8160070154811015612ab3576001810182600a0160008684600c8110612a5857fe5b6020020151815260200190815260200160002060020181905550600560008583600c8110612a8257fe5b6020020151815260200190815260200160002060008154809291906001900391905055508080600101915050612a36565b5060008090505b8160070154811015612b73576001810182600a0160008684600c8110612adc57fe5b602002015181526020019081526020016000206002015414612b66576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4944206e6f74207375626d69747465642070726f7065726c790000000000000081525060200191505060405180910390fd5b8080600101915050612aba565b50612b7c614471565b73ffffffffffffffffffffffffffffffffffffffff166108fc612bc06064612bb2600a866006015461471390919063ffffffff16565b61479990919063ffffffff16565b9081150290604051600060405180830381858888f19350505050158015612beb573d6000803e3d6000fd5b50837fd1f7e3b7d720f0eef8ee86bf688d0bfdfcd66ac0e224b423e7dfc1761999727a846000600c8110612c1b57fe5b6020020151856001600c8110612c2d57fe5b6020020151866002600c8110612c3f57fe5b602002015160405180848152602001838152602001828152602001935050505060405180910390a2506002548114612cdf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b505050565b612cf4612cef614579565b611e08565b612d49576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615404602e913960400191505060405180910390fd5b8060076000848152602001908152602001600020819055505050565b612d75612d70614579565b611e08565b612dca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615404602e913960400191505060405180910390fd5b612dd3816147e3565b50565b612de6612de1614579565b611e08565b612e3b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615404602e913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f84c9efad00ae50fa2cbd9c51134e8a8454b889ed600dc5e5833df6ecdcc80d4f60405160405180910390a36000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60086020528060005260406000206000915054906101000a900460ff1681565b612f2c612f27614579565b61205c565b612f81576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806152966030913960400191505060405180910390fd5b612f8a8161483d565b50565b612f9d612f98614579565b61205c565b612ff2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806152966030913960400191505060405180910390fd5b600e60009054906101000a900460ff1615613075576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6001600e60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586130b9614579565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b6003602052806000526040600020600091509050806000018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156131a85780601f1061317d576101008083540402835291602001916131a8565b820191906000526020600020905b81548152906001019060200180831161318b57829003601f168201915b5050505050908060010154908060020154908060030154908060040154908060050154908060060154908060070154908060090160009054906101000a900460ff16905089565b60016002600082825401925050819055506000600254905060008585905011613263576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260398152602001806151c16039913960400191505060405180910390fd5b607d85859050106132bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604a8152602001806151fa604a913960600191505060405180910390fd5b82829050858590501461331d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604f815260200180615351604f913960600191505060405180910390fd5b60008090505b858590508110156133715761336486868381811061333d57fe5b9050602002013585858481811061335057fe5b9050602002013561335f614579565b614897565b8080600101915050613323565b5060025481146133e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b5050505050565b600160026000828254019250508190555060006002549050600e60009054906101000a900460ff161561348b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6000600360008681526020019081526020016000209050806005015434101561351c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f456e7472616e636520666565206e6f74206d657400000000000000000000000081525060200191505060405180910390fd5b6001600481111561352957fe5b8160090160009054906101000a900460ff16600481111561354657fe5b146135b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f52616365206e6f7420616363657074696e6720726567697374726174696f6e7381525060200191505060405180910390fd5b8060070154816003015410613636576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4d6178206e756d626572206f6620686f7273657320666f72207261636500000081525060200191505060405180910390fd5b60018310156136ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f47617465206e756d626572206c6f776572207468616e20312e0000000000000081525060200191505060405180910390fd5b8060070154831115613727576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f47617465206e756d6265722067726561746572207468616e206d61780000000081525060200191505060405180910390fd5b80600c01600084815260200190815260200160002060009054906101000a900460ff16156137bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f47617465206e756d62657220616c72656164792074616b656e0000000000000081525060200191505060405180910390fd5b6003600560008681526020019081526020016000205410613829576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806154546021913960400191505060405180910390fd5b600081600a016000868152602001908152602001600020600001541461389a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806154756026913960400191505060405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e866040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561392457600080fd5b505afa158015613938573d6000803e3d6000fd5b505050506040513d602081101561394e57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16146139cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806152ec6023913960400191505060405180910390fd5b60056000858152602001908152602001600020600081548092919060010191905055508060030160008154809291906001019190505550604051806060016040528084815260200160008152602001600081525081600a0160008681526020019081526020016000206000820151816000015560208201518160010155604082015181600201559050508381600b01600085815260200190815260200160002081905550600181600c01600085815260200190815260200160002060006101000a81548160ff02191690831515021790555080600501548160060160008282540192505081905550806005015481600a01600086815260200190815260200160002060010160008282540192505081905550806005015481600a01600086815260200190815260200160002060030160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555080600801849080600181540180825580915050906001820390600052602060002001600090919290919091505550806007015481600301541415613bb057847f62473fbb9326dcad400e9fd91026768dbcf6dad189f4b397db633765489b380260405160405180910390a25b833373ffffffffffffffffffffffffffffffffffffffff16867ff658eab36be8f9e91803a03670bd82fe4dc102503be52a6d901f6b044db50dc5866040518082815260200191505060405180910390a4833373ffffffffffffffffffffffffffffffffffffffff16867fc9621b1db612fa52c8213099eb7c450b407922963a8c63ee6bfe963404f4599784600501546040518082815260200191505060405180910390a4506002548114613ccc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b50505050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613d15614579565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b600080600060036000868152602001908152602001600020905080600b0160008581526020019081526020016000205481600a01600083600b0160008881526020019081526020016000205481526020019081526020016000206002015492509250509250929050565b60046020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b613e08613e03614579565b611e08565b613e5d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615404602e913960400191505060405180910390fd5b613e6681614c49565b50565b613e79613e74614579565b611e08565b613ece576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615404602e913960400191505060405180910390fd5b600160026000828254019250508190555060006002549050600060036000858152602001908152602001600020905060016004811115613f0a57fe5b8160090160009054906101000a900460ff166004811115613f2757fe5b1480613f5a575060026004811115613f3b57fe5b8160090160009054906101000a900460ff166004811115613f5857fe5b145b613faf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806153306021913960400191505060405180910390fd5b60048160090160006101000a81548160ff02191690836004811115613fd057fe5b021790555082600960008681526020019081526020016000209080519060200190613ffc92919061511b565b5060008090505b8160030154811015614059576005600083600801838154811061402257fe5b9060005260206000200154815260200190815260200160002060008154809291906001900391905055508080600101915050614003565b50837fa6facd5724e022e7a663091abdf8d4f70d89f969fab200adedea42a41fcebaa8843360405180806020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828103825284818151815260200191508051906020019080838360005b838110156140f05780820151818401526020810190506140d5565b50505050905090810190601f16801561411d5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a25060025481146141a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b505050565b6141b86141b3614579565b611e08565b61420d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615404602e913960400191505060405180910390fd5b603c6007600060018152602001908152602001600020819055506014600760006002815260200190815260200160002081905550600a60076000600381526020019081526020016000208190555080600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b600080600080600080600360008a81526020019081526020016000209050806006015481600a01600083600b0160008c81526020019081526020016000205481526020019081526020016000206001015482600a01600084600b0160008d815260200190815260200160002054815260200190815260200160002060030160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483600a01600085600b0160008e815260200190815260200160002054815260200190815260200160002060040160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1684600a01600086600b0160008f8152602001908152602001600020548152602001908152602001600020600201549550955095509550955050939792965093509350565b60056020528060005260406000206000915090505481565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60076020528060005260406000206000915090505481565b600a6020528060005260406000206000915054906101000a900460ff1681565b6001600260008282540192505081905550600060025490506144fd83836144f8614579565b614897565b6002548114614574576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b505050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415614608576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806153e26022913960400191505060405180910390fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b614673816000614d8f90919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167fa3b62bc36326052d97ea62d63c3d60308ed4c3ea8ac079dd8499f1e9c4f80c0f60405160405180910390a250565b6146cd81600d614d8f90919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167fcd265ebaf09df2871cc7bd4133404a235ba12eff2041bb89d9c714a2621c7c7e60405160405180910390a250565b6000808314156147265760009050614793565b600082840290508284828161473757fe5b041461478e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806153c16021913960400191505060405180910390fd5b809150505b92915050565b60006147db83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614e4c565b905092915050565b6147f7816000614f1290919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f44d6d25963f097ad14f29f06854a01f575648a1ef82f30e562ccd3889717e33960405160405180910390a250565b61485181600d614f1290919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f860405160405180910390a250565b600060036000858152602001908152602001600020905060006004600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614614987576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f4e6f7420686f727365206f776e6572000000000000000000000000000000000081525060200191505060405180910390fd5b6003600481111561499457fe5b8260090160009054906101000a900460ff1660048111156149b157fe5b14614a24576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f52616365207374696c6c2072756e6e696e67000000000000000000000000000081525060200191505060405180910390fd5b81600a01600085815260200190815260200160002060040160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615614add576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806154326022913960400191505060405180910390fd5b600182600a01600086815260200190815260200160002060040160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600082600a0160008681526020019081526020016000206002015490506000614ba76064614b996007600086815260200190815260200160002054876006015461471390919063ffffffff16565b61479990919063ffffffff16565b90508473ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015614bef573d6000803e3d6000fd5b50858373ffffffffffffffffffffffffffffffffffffffff16887fa3dd4a1386669cfcc372819ceaee69df2c1c14eb82976d79bd15c856666cb650846040518082815260200191505060405180910390a450505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415614ccf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806152c66026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f84c9efad00ae50fa2cbd9c51134e8a8454b889ed600dc5e5833df6ecdcc80d4f60405160405180910390a380600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b614d998282614581565b614dee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061530f6021913960400191505060405180910390fd5b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60008083118290614ef8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614ebd578082015181840152602081019050614ea2565b50505050905090810190601f168015614eea5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581614f0457fe5b049050809150509392505050565b614f1c8282614581565b15614f8f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f526f6c65733a206163636f756e7420616c72656164792068617320726f6c650081525060200191505060405180910390fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6040518061014001604052806060815260200160008019168152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001606081526020016000600481111561504857fe5b81525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061508f57805160ff19168380011785556150bd565b828001600101855582156150bd579182015b828111156150bc5782518255916020019190600101906150a1565b5b5090506150ca919061519b565b5090565b82805482825590600052602060002090810192821561510a579160200282015b828111156151095782518255916020019190600101906150ee565b5b509050615117919061519b565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061515c57805160ff191683800117855561518a565b8280016001018555821561518a579182015b8281111561518957825182559160200191906001019061516e565b5b509050615197919061519b565b5090565b6151bd91905b808211156151b95760008160009055506001016151a1565b5090565b9056fe636c61696d416c6c57696e6e696e677348656c7065723a207261636549642061727261792073686f756c64206e6f7420626520656d7074792e636c61696d416c6c57696e6e696e677348656c7065723a20726163654964206172726179206c656e67746820697320626967676572207468616e2070726f7669646564206c696d69742e4f6e6c7920313520686f7273657320616c6c6f77656420706572207472616e736665726f6e455243373231526563656976656428616464726573732c616464726573732c75696e743235362c627974657329506175736572526f6c653a2063616c6c657220646f6573206e6f742068617665207468652050617573657220726f6c654f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373526163696e6720636f6e7472616374206e6f74206f776e6572206f6620686f7273652e526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c6552616365206e6f74206f6e2072656773206f722062657474696e67207374617465636c61696d416c6c57696e6e696e677348656c7065723a206c656e67746873206f66207261636569647320616e6420686f727365696473206172726179732073686f756c6420626520657175616c2e486f7273652063757272656e746c792061637469766520696e206120726163652e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77526f6c65733a206163636f756e7420697320746865207a65726f206164647265737341646d696e526f6c653a2063616c6c657220646f6573206e6f742068617665207468652041646d696e20726f6c6557696e6e696e6773206861766520616c7265616479206265656e20636c61696d6564486f7273652063757272656e746c792061637469766520696e2033207261636573486f72736520616c7265616479207265676973746572656420666f722074686973207261636552616365206973206e6f7420696e20726567697374726174696f6e207374617465a165627a7a723058206bf9b18135615c64d28842945084edc2ef3d9fe787080f9cbfdbf0f22a688a6d0029
Deployed Bytecode Sourcemap
17430:16356:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31787:172;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31787:172:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;31787:172:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;24361:787;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24361:787:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;24361:787:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;24361:787:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;24361:787:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;24361:787:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;24361:787:0;;;;;;;;;;;;;;;:::i;:::-;;31408:271;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31408:271:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;31408:271:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;31408:271:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;31408:271:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;31408:271:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;19008:831;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19008:831:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;19008:831:0;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;19008:831:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;19008:831:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;19008:831:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;19008:831:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;33090:197;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33090:197:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;33090:197:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;33090:197:0;;;;;;;;;;;;;;;;;15653:49;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15653:49:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;15653:49:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;15653:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33295:118;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33295:118:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;12455:107;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12455:107:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12455:107:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;15290:40;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15290:40:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;15290:40:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;20997:104;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20997:104:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;20997:104:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;4998:120;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4998:120:0;;;:::i;:::-;;2567:109;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2567:109:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2567:109:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;23786:494;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23786:494:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;23786:494:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;23786:494:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;23786:494:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;23786:494:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;23786:494:0;;;;;;;;;;;;;;;:::i;:::-;;19909:817;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19909:817:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19909:817:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;4205:78;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4205:78:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;12667:97;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12667:97:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12667:97:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;2784:79;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2784:79:0;;;:::i;:::-;;21539:1347;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21539:1347:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;21539:1347:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;21539:1347:0;;;;;;;;;;;;;;:::i;:::-;;33567:178;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33567:178:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;33567:178:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;12570:89;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12570:89:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12570:89:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;14070:148;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14070:148:0;;;:::i;:::-;;15549:45;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15549:45:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;15549:45:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;2684:92;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2684:92:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2684:92:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;4785:118;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4785:118:0;;;:::i;:::-;;15028:37;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15028:37:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;15028:37:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;15028:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29053:647;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29053:647:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;29053:647:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;29053:647:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;29053:647:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;29053:647:0;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;29053:647:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;29053:647:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;29053:647:0;;;;;;;;;;;;:::i;:::-;;25277:2161;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;25277:2161:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;13724:102;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13724:102:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;32119:311;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32119:311:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;32119:311:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;15103:46;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15103:46:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;15103:46:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;33421:114;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33421:114:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;14368:143;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14368:143:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;14368:143:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;22894:764;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22894:764:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;22894:764:0;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;22894:764:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;22894:764:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;22894:764:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;22894:764:0;;;;;;;;;;;;;;;:::i;:::-;;20734:255;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20734:255:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;20734:255:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;32538:544;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32538:544:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;32538:544:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15182:53;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15182:53:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;15182:53:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;13306:95;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13306:95:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;15406:54;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15406:54:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;15406:54:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;15769:47;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15769:47:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;15769:47:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;28563:181;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28563:181:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;28563:181:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;31787:172;31887:7;31919:5;:14;31925:7;31919:14;;;;;;;;;;;:25;;:32;31945:5;31919:32;;;;;;;;;;;;31912:39;;31787:172;;;;:::o;24361:787::-;11872:1;11855:13;;:18;;;;;;;;;;;11884:20;11907:13;;11884:36;;24474:2;24455:9;:16;:21;24447:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24534:7;24544:1;24534:11;;24529:552;24551:9;:16;24547:1;:20;;;24529:552;;;24644:10;24615:39;;:11;:25;24627:9;24637:1;24627:12;;;;;;;;;;;;;;;;24615:25;;;;;;;;;;;;;;;;;;;;;:39;;;24589:125;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24791:1;24755:18;:32;24774:9;24784:1;24774:12;;;;;;;;;;;;;;;;24755:32;;;;;;;;;;;;:37;24729:132;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24914:1;24878:11;:25;24890:9;24900:1;24890:12;;;;;;;;;;;;;;;;24878:25;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;24940:4;;;;;;;;;;;24933:29;;;24989:4;25013:10;25042:9;25052:1;25042:12;;;;;;;;;;;;;;;;24933:136;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24933:136:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24933:136:0;;;;24569:3;;;;;;;24529:552;;;;25118:10;25098:42;;;25130:9;25098:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;25098:42:0;;;;;;;;;;;;;;;;;11967:13;;11951:12;:29;11943:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24361:787;;:::o;31408:271::-;31527:6;31596:60;;;;;;;;;;;;;;;;;;;31551:120;;31408:271;;;;;;;:::o;19008:831::-;12355:21;12363:12;:10;:12::i;:::-;12355:7;:21::i;:::-;12347:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11872:1;11855:13;;:18;;;;;;;;;;;11884:20;11907:13;;11884:36;;4442:7;;;;;;;;;;;4441:8;4433:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19312:1;19297:12;:16;19289:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19366:8;:17;19375:7;19366:17;;;;;;;;;;;;;;;;;;;;;19365:18;19357:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19415:16;;:::i;:::-;19457:7;19442:4;:12;;:22;;;;;19493:5;19475:4;:15;;:23;;;;19531:14;19509:4;:19;;:36;;;;;19576:12;19556:4;:17;;:32;;;;;19613:7;19599:4;:11;;:21;;;;;19649:18;19631:4;:15;;:36;;;;;;;;;;;;;;;;;;;;;;;19697:4;19680:5;:14;19686:7;19680:14;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19732:4;19712:8;:17;19721:7;19712:17;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;19793:7;19781:50;19802:5;19809:7;19818:12;19781:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;19781:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4481:1;11967:13;;11951:12;:29;11943:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12438:1;19008:831;;;;;:::o;33090:197::-;33180:16;33214:17;33234:5;:14;33240:7;33234:14;;;;;;;;;;;33214:34;;33268:4;:11;;33261:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33090:197;;;:::o;15653:49::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;33295:118::-;33369:7;33401:4;;;;;;;;;;;33394:11;;33295:118;:::o;12455:107::-;12510:4;12534:20;12546:7;12534;:11;;:20;;;;:::i;:::-;12527:27;;12455:107;;;:::o;15290:40::-;;;;;;;;;;;;;;;;;;;;;;:::o;20997:104::-;12355:21;12363:12;:10;:12::i;:::-;12355:7;:21::i;:::-;12347:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21090:3;21085:2;;:8;;;;;;;;;;;;;;;;;;20997:104;:::o;4998:120::-;2464:22;2473:12;:10;:12::i;:::-;2464:8;:22::i;:::-;2456:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4641:7;;;;;;;;;;;4633:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5067:5;5057:7;;:15;;;;;;;;;;;;;;;;;;5088:22;5097:12;:10;:12::i;:::-;5088:22;;;;;;;;;;;;;;;;;;;;;;4998:120::o;2567:109::-;2623:4;2647:21;2660:7;2647:8;:12;;:21;;;;:::i;:::-;2640:28;;2567:109;;;:::o;23786:494::-;11872:1;11855:13;;:18;;;;;;;;;;;11884:20;11907:13;;11884:36;;23898:2;23879:9;:16;:21;23871:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23958:7;23968:1;23958:11;;23953:261;23975:9;:16;23971:1;:20;;;23953:261;;;24041:10;24013:11;:25;24025:9;24035:1;24025:12;;;;;;;;;;;;;;;;24013:25;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;24073:4;;;;;;;;;;;24066:29;;;24114:10;24151:4;24175:9;24185:1;24175:12;;;;;;;;;;;;;;;;24066:136;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24066:136:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24066:136:0;;;;23993:3;;;;;;;23953:261;;;;24250:10;24231:41;;;24262:9;24231:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;24231:41:0;;;;;;;;;;;;;;;;;11967:13;;11951:12;:29;11943:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23786:494;;:::o;19909:817::-;12355:21;12363:12;:10;:12::i;:::-;12355:7;:21::i;:::-;12347:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11872:1;11855:13;;:18;;;;;;;;;;;11884:20;11907:13;;11884:36;;20068:17;20088:5;:14;20094:7;20088:14;;;;;;;;;;;20068:34;;20163:4;:19;;;20137:4;:22;;;:45;20115:123;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20290:18;20271:37;;;;;;;;:4;:15;;;;;;;;;;;;:37;;;;;;;;;20249:120;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20421:9;20415:3;:15;20402:10;:28;20380:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20547:10;20529:4;:15;;:28;;;;20586:13;20568:4;:15;;;:31;;;;;;;;;;;;;;;;;;;;;;;;20681:7;20667:51;20690:10;20702:4;:15;;20667:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11931:1;11967:13;;11951:12;:29;11943:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12438:1;19909:817;;:::o;4205:78::-;4244:4;4268:7;;;;;;;;;;;4261:14;;4205:78;:::o;12667:97::-;12355:21;12363:12;:10;:12::i;:::-;12355:7;:21::i;:::-;12347:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12735:21;12748:7;12735:12;:21::i;:::-;12667:97;:::o;2784:79::-;2828:27;2842:12;:10;:12::i;:::-;2828:13;:27::i;:::-;2784:79::o;21539:1347::-;12355:21;12363:12;:10;:12::i;:::-;12355:7;:21::i;:::-;12347:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11872:1;11855:13;;:18;;;;;;;;;;;11884:20;11907:13;;11884:36;;21683:17;21703:5;:14;21709:7;21703:14;;;;;;;;;;;21683:34;;21794:13;21775:32;;;;;;;;:4;:15;;;;;;;;;;;;:32;;;;;;;;;21753:110;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21907:9;21901:3;:15;21882:4;:15;;;:34;;21874:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21974:11;21956:4;:15;;;:29;;;;;;;;;;;;;;;;;;;;;;;;22046:9;22058:1;22046:13;;22041:141;22065:4;:19;;;22061:1;:23;22041:141;;;22147:1;22114:4;:11;;:24;22126:8;22135:1;22126:11;;;;;;;;;;;22114:24;;;;;;;;;;;:29;;;:34;;22106:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22086:3;;;;;;;22041:141;;;;22256:9;22268:1;22256:13;;22251:172;22275:4;:19;;;22271:1;:23;22251:172;;;22362:1;22358;:5;22316:4;:11;;:24;22328:8;22337:1;22328:11;;;;;;;;;;;22316:24;;;;;;;;;;;:39;;:47;;;;22378:18;:31;22397:8;22406:1;22397:11;;;;;;;;;;;22378:31;;;;;;;;;;;;:33;;;;;;;;;;;;;;22296:3;;;;;;;22251:172;;;;22476:9;22488:1;22476:13;;22471:212;22495:4;:19;;;22491:1;:23;22471:212;;;22609:1;22605;:5;22562:4;:11;;:24;22574:8;22583:1;22574:11;;;;;;;;;;;22562:24;;;;;;;;;;;:39;;;:48;22536:135;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22516:3;;;;;;;22471:212;;;;22745:11;:9;:11::i;:::-;:20;;:54;22766:32;22794:3;22766:23;22786:2;22766:4;:15;;;:19;;:23;;;;:::i;:::-;:27;;:32;;;;:::i;:::-;22745:54;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22745:54:0;22831:7;22817:61;22840:8;22849:1;22840:11;;;;;;;;;;;22853:8;22862:1;22853:11;;;;;;;;;;;22866:8;22875:1;22866:11;;;;;;;;;;;22817:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11931:1;11967:13;;11951:12;:29;11943:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12438:1;21539:1347;;:::o;33567:178::-;12355:21;12363:12;:10;:12::i;:::-;12355:7;:21::i;:::-;12347:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33726:11;33693:19;:30;33713:9;33693:30;;;;;;;;;;;:44;;;;33567:178;;:::o;12570:89::-;12355:21;12363:12;:10;:12::i;:::-;12355:7;:21::i;:::-;12347:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12633:18;12643:7;12633:9;:18::i;:::-;12570:89;:::o;14070:148::-;12355:21;12363:12;:10;:12::i;:::-;12355:7;:21::i;:::-;12347:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14173:1;14132:44;;14153:10;;;;;;;;;;;14132:44;;;;;;;;;;;;14208:1;14187:10;;:23;;;;;;;;;;;;;;;;;;14070:148::o;15549:45::-;;;;;;;;;;;;;;;;;;;;;;:::o;2684:92::-;2464:22;2473:12;:10;:12::i;:::-;2464:8;:22::i;:::-;2456:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2749:19;2760:7;2749:10;:19::i;:::-;2684:92;:::o;4785:118::-;2464:22;2473:12;:10;:12::i;:::-;2464:8;:22::i;:::-;2456:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4442:7;;;;;;;;;;;4441:8;4433:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4855:4;4845:7;;:14;;;;;;;;;;;;;;;;;;4875:20;4882:12;:10;:12::i;:::-;4875:20;;;;;;;;;;;;;;;;;;;;;;4785:118::o;15028:37::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;29053:647::-;11872:1;11855:13;;:18;;;;;;;;;;;11884:20;11907:13;;11884:36;;29228:1;29210:8;;:15;;:19;29202:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29328:3;29310:8;;:15;;:21;29302:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29448:9;;:16;;29429:8;;:15;;:35;29421:127;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29566:9;29578:1;29566:13;;29561:132;29585:8;;:15;;29581:1;:19;29561:132;;;29622:59;29641:8;;29650:1;29641:11;;;;;;;;;;;;;29654:9;;29664:1;29654:12;;;;;;;;;;;;;29668;:10;:12::i;:::-;29622:18;:59::i;:::-;29602:3;;;;;;;29561:132;;;;11967:13;;11951:12;:29;11943:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29053:647;;;;;:::o;25277:2161::-;11872:1;11855:13;;:18;;;;;;;;;;;11884:20;11907:13;;11884:36;;4442:7;;;;;;;;;;;4441:8;4433:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25447:17;25467:5;:14;25473:7;25467:14;;;;;;;;;;;25447:34;;25539:4;:17;;;25526:9;:30;;25518:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25633:18;25614:37;;;;;;;;:4;:15;;;;;;;;;;;;:37;;;;;;;;;25592:119;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25769:4;:19;;;25744:4;:22;;;:44;25722:123;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25879:1;25864:11;:16;;25856:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25958:4;:19;;;25943:11;:34;;25921:112;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26053:4;:18;;:31;26072:11;26053:31;;;;;;;;;;;;;;;;;;;;;26052:32;26044:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26178:1;26147:18;:28;26166:8;26147:28;;;;;;;;;;;;:32;26125:115;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26303:1;26273:4;:11;;:21;26285:8;26273:21;;;;;;;;;;;:26;;;:31;26251:119;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26445:4;26403:47;;26410:4;;;;;;;;;;;26403:20;;;26424:8;26403:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26403:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26403:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;26403:30:0;;;;;;;;;;;;;;;;:47;;;26381:132;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26598:18;:28;26617:8;26598:28;;;;;;;;;;;;:30;;;;;;;;;;;;;26639:4;:22;;;:24;;;;;;;;;;;;;26698;;;;;;;;26704:11;26698:24;;;;26717:1;26698:24;;;;26720:1;26698:24;;;26674:4;:11;;:21;26686:8;26674:21;;;;;;;;;;;:48;;;;;;;;;;;;;;;;;;;;;;;;;;;26764:8;26733:4;:15;;:28;26749:11;26733:28;;;;;;;;;;;:39;;;;26858:4;26824;:18;;:31;26843:11;26824:31;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;26973:4;:17;;;26954:4;:15;;;:36;;;;;;;;;;;27036:4;:17;;;27001:4;:11;;:21;27013:8;27001:21;;;;;;;;;;;:31;;;:52;;;;;;;;;;;27112:4;:17;;;27064:4;:11;;:21;27076:8;27064:21;;;;;;;;;;;:32;;:44;27097:10;27064:44;;;;;;;;;;;;;;;;:65;;;;;;;;;;;27140:4;:11;;27157:8;27140:26;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;27140:26:0;;;;;;;;;;;;;;;;;;;;;;27209:4;:19;;;27183:4;:22;;;:45;27179:100;;;27259:7;27250:17;;;;;;;;;;27179:100;27333:8;27321:10;27296:59;;27312:7;27296:59;27343:11;27296:59;;;;;;;;;;;;;;;;;;27421:8;27390:10;27371:59;;27381:7;27371:59;27402:4;:17;;;27371:59;;;;;;;;;;;;;;;;;;4481:1;11967:13;;11951:12;:29;11943:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25277:2161;;;;:::o;13724:102::-;13768:4;13808:10;;;;;;;;;;;13792:26;;:12;:10;:12::i;:::-;:26;;;13785:33;;13724:102;:::o;32119:311::-;32221:7;32230;32255:17;32275:5;:14;32281:7;32275:14;;;;;;;;;;;32255:34;;32324:4;:15;;:22;32340:5;32324:22;;;;;;;;;;;;32361:4;:11;;:35;32373:4;:15;;:22;32389:5;32373:22;;;;;;;;;;;;32361:35;;;;;;;;;;;:50;;;32302:120;;;;;32119:311;;;;;:::o;15103:46::-;;;;;;;;;;;;;;;;;;;;;;:::o;33421:114::-;33493:7;33525:2;;;;;;;;;;;33518:9;;33421:114;:::o;14368:143::-;12355:21;12363:12;:10;:12::i;:::-;12355:7;:21::i;:::-;12347:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14462:41;14490:12;14462:27;:41::i;:::-;14368:143;:::o;22894:764::-;12355:21;12363:12;:10;:12::i;:::-;12355:7;:21::i;:::-;12347:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11872:1;11855:13;;:18;;;;;;;;;;;11884:20;11907:13;;11884:36;;23031:17;23051:5;:14;23057:7;23051:14;;;;;;;;;;;23031:34;;23143:18;23124:37;;;;;;;;:4;:15;;;;;;;;;;;;:37;;;;;;;;;:90;;;;23201:13;23182:32;;;;;;;;:4;:15;;;;;;;;;;;;:32;;;;;;;;;23124:90;23102:173;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23306:15;23288:4;:15;;;:33;;;;;;;;;;;;;;;;;;;;;;;;23361:7;23334:15;:24;23350:7;23334:24;;;;;;;;;;;:34;;;;;;;;;;;;:::i;:::-;;23479:9;23491:1;23479:13;;23474:116;23498:4;:22;;;23494:1;:26;23474:116;;;23542:18;:34;23561:4;:11;;23573:1;23561:14;;;;;;;;;;;;;;;;23542:34;;;;;;;;;;;;:36;;;;;;;;;;;;;;23522:3;;;;;;;23474:116;;;;23621:7;23607:43;23630:7;23639:10;23607:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;23607:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11931:1;11967:13;;11951:12;:29;11943:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12438:1;22894:764;;:::o;20734:255::-;12355:21;12363:12;:10;:12::i;:::-;12355:7;:21::i;:::-;12347:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20859:2;20834:19;:22;20854:1;20834:22;;;;;;;;;;;:27;;;;20897:2;20872:19;:22;20892:1;20872:22;;;;;;;;;;;:27;;;;20935:2;20910:19;:22;20930:1;20910:22;;;;;;;;;;;:27;;;;20955:3;20950:2;;:8;;;;;;;;;;;;;;;;;;20976:5;20969:4;;:12;;;;;;;;;;;;;;;;;;20734:255;;:::o;32538:544::-;32655:7;32664;32673;32682:4;32688:7;32713:17;32733:5;:14;32739:7;32733:14;;;;;;;;;;;32713:34;;32782:4;:15;;;32812:4;:11;;:35;32824:4;:15;;:22;32840:5;32824:22;;;;;;;;;;;;32812:35;;;;;;;;;;;:45;;;32872:4;:11;;:35;32884:4;:15;;:22;32900:5;32884:22;;;;;;;;;;;;32872:35;;;;;;;;;;;:46;;:55;32919:7;32872:55;;;;;;;;;;;;;;;;32942:4;:11;;:35;32954:4;:15;;:22;32970:5;32954:22;;;;;;;;;;;;32942:35;;;;;;;;;;;:47;;:56;32990:7;32942:56;;;;;;;;;;;;;;;;;;;;;;;;;33013:4;:11;;:35;33025:4;:15;;:22;33041:5;33025:22;;;;;;;;;;;;33013:35;;;;;;;;;;;:50;;;32760:314;;;;;;;;;;;32538:544;;;;;;;;;:::o;15182:53::-;;;;;;;;;;;;;;;;;:::o;13306:95::-;13348:15;13383:10;;;;;;;;;;;13376:17;;13306:95;:::o;15406:54::-;;;;;;;;;;;;;;;;;:::o;15769:47::-;;;;;;;;;;;;;;;;;;;;;;:::o;28563:181::-;11872:1;11855:13;;:18;;;;;;;;;;;11884:20;11907:13;;11884:36;;28685:51;28704:7;28713:8;28723:12;:10;:12::i;:::-;28685:18;:51::i;:::-;11967:13;;11951:12;:29;11943:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28563:181;;;:::o;806:98::-;851:15;886:10;879:17;;806:98;:::o;1927:203::-;1999:4;2043:1;2024:21;;:7;:21;;;;2016:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2102:4;:11;;:20;2114:7;2102:20;;;;;;;;;;;;;;;;;;;;;;;;;2095:27;;1927:203;;;;:::o;12899:127::-;12958:23;12973:7;12958;:14;;:23;;;;:::i;:::-;13010:7;12997:21;;;;;;;;;;;;12899:127;:::o;3001:130::-;3061:24;3077:7;3061:8;:15;;:24;;;;:::i;:::-;3115:7;3101:22;;;;;;;;;;;;3001:130;:::o;7329:471::-;7387:7;7637:1;7632;:6;7628:47;;;7662:1;7655:8;;;;7628:47;7687:9;7703:1;7699;:5;7687:17;;7732:1;7727;7723;:5;;;;;;:10;7715:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7791:1;7784:8;;;7329:471;;;;;:::o;8268:132::-;8326:7;8353:39;8357:1;8360;8353:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;8346:46;;8268:132;;;;:::o;12772:119::-;12828:20;12840:7;12828;:11;;:20;;;;:::i;:::-;12875:7;12864:19;;;;;;;;;;;;12772:119;:::o;2871:122::-;2928:21;2941:7;2928:8;:12;;:21;;;;:::i;:::-;2977:7;2965:20;;;;;;;;;;;;2871:122;:::o;29760:1025::-;29881:17;29901:5;:14;29907:7;29901:14;;;;;;;;;;;29881:34;;29926:18;29947:11;:21;29959:8;29947:21;;;;;;;;;;;;;;;;;;;;;29926:42;;30102:10;30091:21;;:7;:21;;;30083:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30170:11;30151:30;;;;;;;;:4;:15;;;;;;;;;;;;:30;;;;;;;;;30143:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30238:4;:11;;:21;30250:8;30238:21;;;;;;;;;;;:33;;:45;30272:10;30238:45;;;;;;;;;;;;;;;;;;;;;;;;;30237:46;30215:130;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30406:4;30358;:11;;:21;30370:8;30358:21;;;;;;;;;;;:33;;:45;30392:10;30358:45;;;;;;;;;;;;;;;;:52;;;;;;;;;;;;;;;;;;30423:21;30447:4;:11;;:21;30459:8;30447:21;;;;;;;;;;;:36;;;30423:60;;30536:18;30557:106;30659:3;30557:83;30605:19;:34;30625:13;30605:34;;;;;;;;;;;;30557:4;:29;;;:47;;:83;;;;:::i;:::-;:101;;:106;;;;:::i;:::-;30536:127;;30676:7;:16;;:28;30693:10;30676:28;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30676:28:0;30768:8;30744:10;30722:55;;30735:7;30722:55;30756:10;30722:55;;;;;;;;;;;;;;;;;;29760:1025;;;;;;;:::o;14623:270::-;14742:1;14718:26;;:12;:26;;;;14710:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14836:12;14803:46;;14824:10;;;;;;;;;;;14803:46;;;;;;;;;;;;14873:12;14860:10;;:25;;;;;;;;;;;;;;;;;;14623:270;:::o;1649:183::-;1729:18;1733:4;1739:7;1729:3;:18::i;:::-;1721:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1819:5;1796:4;:11;;:20;1808:7;1796:20;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;1649:183;;:::o;8930:345::-;9016:7;9115:1;9111;:5;9118:12;9103:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;9103:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9142:9;9158:1;9154;:5;;;;;;9142:17;;9266:1;9259:8;;;8930:345;;;;;:::o;1391:178::-;1469:18;1473:4;1479:7;1469:3;:18::i;:::-;1468:19;1460:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1557:4;1534;:11;;:20;1546:7;1534:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;1391:178;;:::o;17430:16356::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
bzzr://6bf9b18135615c64d28842945084edc2ef3d9fe787080f9cbfdbf0f22a688a6d
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.