Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- TwoBearsBotsHelp
- Optimization enabled
- false
- Compiler version
- v0.8.16+commit.07a7930e
- EVM Version
- default
- Verified at
- 2024-09-26T15:35:08.125554Z
Contract source code
// All rights reserved. // SPDX-License-Identifier: No License (None) pragma solidity ^0.8.16; interface IContractDeposits { function getTokenMinValue(address _token) external view returns (uint256); function getTokenPriority(address _token) external view returns (uint256); function getTypeAndValue(address _token_in, address _token_out, uint _value, uint _price) external view returns (uint8, uint256); function getWrappedAndPricelimit() external view returns (address, uint256, uint256); } interface IERC20 { function balanceOf(address account) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); } contract TwoBearsBotsHelp { struct Variables { // структура переменных (обходим ошибку глубину стека) uint _min_in; uint _min_out; uint _value2; uint8 _bot_type; uint8 _code_err; } address public constant contractDeposits = 0x5cec09F125f4839656164A5109BC076DAAbD6Ed6; // Контракт с депозитами function checkTokensOnDex(address _token_in, address _token_out) public view returns (uint8, uint256, uint256) { // проверка залистинных токенов для бота распродажи/закупа // Возвращаемые значения: код_ошибки, минимально_допустимое_количество_входящего_токена, минимально_допустимое_количество_выходящего_токена if(_token_in == _token_out) return (1, 0, 0); // торговые токены одинаковы uint256 min_in = IContractDeposits(contractDeposits).getTokenMinValue(_token_in); // возвращает допустимый минимум для торговли if(min_in == 0) return (2, 0, 0); // Входящий токен не существует на бирже uint256 min_out = IContractDeposits(contractDeposits).getTokenMinValue(_token_out); // возвращает допустимый минимум для торговли if(min_out == 0) return (3, 0, 0); // Выходящий токен не существует на бирже return (0, min_in, min_out); } function checkTokensOnDexType3(address _token_in, address _token_out) public view returns (uint8, uint256, uint256) { // проверка залистинных токенов для сеточного бота // Возвращаемые значения: код_ошибки, нужен_ли_реверс_токенов, минимально_допустимое_количество_токена_с_максимальным_приоритетом if(_token_in == _token_out) return (1, 0, 0); // торговые токены одинаковы uint256 _token_in_priority = IContractDeposits(contractDeposits).getTokenPriority(_token_in); // возвращаем приоритет входящего токена if(_token_in_priority == 0) return (2, 0, 0); // Входящий токен не существует на бирже uint256 _token_out_priority = IContractDeposits(contractDeposits).getTokenPriority(_token_out); // возвращаем приоритет выходящего токена if(_token_out_priority == 0) return (3, 0, 0); // Выходящий токен не существует на бирже uint256 _revers; uint256 _min; if(_token_in_priority < _token_out_priority){ // _revers = 0; _min = IContractDeposits(contractDeposits).getTokenMinValue(_token_out); } else{ _revers = 1; _min = IContractDeposits(contractDeposits).getTokenMinValue(_token_in); } return (0, _revers, _min); } function checkGasOwner(address _owner) public view returns (uint8) { // проверка доступности газа у владельца бота (address _token_native, uint _gas_price, uint _gas_limit) = IContractDeposits(contractDeposits).getWrappedAndPricelimit(); // вернем адрес обернутой нативной монеты, цену газа и максимальный лимит газа uint _value_native = _gas_price * _gas_limit; // количество обернутой нативной монеты uint256 res; res = IERC20(_token_native).allowance(_owner, contractDeposits); if(_value_native > res) return (14); // у контракта депозитов нет доступа на списания обернутой нативной монеты с адреса владельца бота res = IERC20(_token_native).balanceOf(_owner); if(_value_native > res) return (15); // на адресе владельца бота недостаточно обернутой нативной монеты return (0); } function checkApproveAndBalance(address _owner, address _token_in, uint _value_in, uint _value_inc_balance) public view returns (uint8) { // проверка апрува и баланса у владельца бота // функция так же проверяет что у владельца бота есть необходимое количество нативного токена для оплаты работы бота // Проверяем что у владельца есть нативный токен хотя бы для одной перестановки ордеров по схеме бота // _value_inc_balance - на сколько увеличится баланс владельца по данному токену в этой транзакции // Возвращаемые значения: код_ошибки. 0 - если ошибок нет uint256 res; // function getWrappedAndPricelimit() external view returns (address, uint256, uint256); (address _token_native, uint _gas_price, uint _gas_limit) = IContractDeposits(contractDeposits).getWrappedAndPricelimit(); // вернем адрес обернутой нативной монеты, цену газа и максимальный лимит газа uint _value_native = _gas_price * _gas_limit; // количество нативной монеты if(_token_in == _token_native){ // если это ордер на обмен нативного токена, то нужно учесть комиссию за работу бота _value_in += _value_native; } else{ // иначе комиссию за работу бота надо проверить отдельно res = IERC20(_token_native).allowance(_owner, contractDeposits); if(_value_native > res) return (14); // у контракта депозитов нет доступа на списания обернутой нативной монеты с адреса владельца бота res = IERC20(_token_native).balanceOf(_owner); if(_value_native > res) return (15); // на адресе владельца бота недостаточно обернутой нативной монеты } res = IERC20(_token_in).allowance(_owner, contractDeposits); if(_value_in > res) return (11); // у контракта депозитов нет доступа на списания необходимой суммы с адреса владельца бота res = IERC20(_token_in).balanceOf(_owner); res += _value_inc_balance; if(_value_in > res) return (12); // на адресе владельца бота недостаточно средств return (0); } /* Возвращаемые коды ошибок 200 - бот полностью завершил схему 100 - ошибок нет 101 - ошибок нет (но входящий и выходящий токены будут поменяны местами). Данный код используется только для сеточной торговли. После того как токены поменяются местами, статус измениться на 100 1 - торговые токены одинаковы 2 - входящий токен не существует на бирже 3 - выходящий токен не существует на бирже 4 - цена равна нулю 5 - количество входящего или выходящего токена равно нулю 6 - не соответствие минималке (пылевой ордер) 7 - слишком большой шаг, может вызвать переполнение переменной с ценой 8 - ценовой предел ниже стартовой цены 9 - ценовой шаг больше установленного предела (может вызвать переполнение переменной) 10 - ценовой предел выше стартовой цены 11 - у контракта депозитов нет доступа на списания необходимой суммы с адреса владельца бота 12 - на адресе владельца бота недостаточно средств 13 - слишком большое увеличение ставки (приводит к переполнению переменной с количеством токена) 14 - у контракта депозитов нет доступа на списания обернутой нативной монеты с адреса владельца бота 15 - на адресе владельца бота недостаточно обернутой нативной монеты 16 - количество продаваемого токена равно 0 (сеточная торговля) 17 - количество покупаемого токена равно 0 (сеточная торговля) 18 - самый последний ордер в боте закупок не соответствие минималке (пылевой ордер) 19 - ценовой шаг установлен 0 (сеточная торговля) 20 - цена выше верхнего ценового предела (сеточная торговля) 21 - цена ниже нижнего ценового предела (сеточная торговля) 22 - нижний ценовой предел меньше шага (сеточная торговля) 23 - разница между максимальным значением переменной и верхним пределом меньше шага (может вызвать переполнение переменной) 24 - объем токена с максимальным приоритетом ниже минималки (пылевой ордер) в ордере продажи по минимально допустимой цене 25 - объем токена с максимальным приоритетом ниже минималки (пылевой ордер) в ордере покупки по минимально допустимой цене 26 - ордер покупки и ордер продажи не попадают в рабочий диапазон (сеточная торговля). Нужно чтобы хотя бы 1 ордер попадал в рабочий диапазон */ function checkCreateBotSellBuy(address _owner, address _token_in, address _token_out, uint _value, uint _value_inc, uint _price, uint _price_step, uint _price_limit) public view returns (uint8, uint8, uint256, uint256) { // проверка создания бота распродажи / закупа // _owner - адрес владельца, который создает бота // _value - объем токена с наименьшим приоритетом // _price - цена в токене с максимальным приоритетом // Возвращаемые значения: код_ошибки, тип_бота, количество_входящего_токена, количество_выходящего_токена if(_price == 0) return (4, 0, 0, 0); // цена должна быть больше 0 if(_value == 0) return (5, 0, 0, 0); // количество токена должно быть больше 0 if((uint(int(-1)) - _value_inc) < _value) return (13, 0, 0, 0); Variables memory variable; (variable._code_err, variable._min_in, variable._min_out) = checkTokensOnDex(_token_in, _token_out); // проверяем торговую пару и возвращаем минималки по токенам if(variable._code_err > 0) return (variable._code_err, 0, 0, 0); // Ошибка торговой пары (variable._bot_type, variable._value2) = IContractDeposits(contractDeposits).getTypeAndValue(_token_in, _token_out, _value, _price); if(variable._value2 == 0) return (5, 0, 0, 0); // количество второго токена должно быть больше 0 // проверяем что количество токена в ордере соответствуем минимально-допустимому значению if(variable._bot_type == 1){ // если это бот распродажи // _value - это объем _token_in, variable._value2 - это объем _token_out if(variable._value2 < variable._min_out) return (6, 0, 0, 0); // проверяем ценовой шаг и предел (цена растет) if((uint(int(-1)) - _price_limit) < _price_step) return (7, 0, 0, 0); if(_price_limit < _price) return (8, 0, 0, 0); } else{ // если это бот закупки (_value, variable._value2) = (variable._value2, _value); // _value - это объем _token_in, variable._value2 - это объем _token_out if(_value < variable._min_in) return (6, 0, 0, 0); // проверяем ценовой шаг и предел (цена падает) if(_price_limit < _price_step) return (9, 0, 0, 0); if(_price < _price_limit) return (10, 0, 0, 0); // проверим что последний ордер в схеме закупки соответствует допустимому минимуму uint _frame = (_price - _price_limit) / _price_step; // количество ордеров что будет выполнено в схеме uint _val_temp = _value_inc * _frame + variable._value2; // найдем объем последнего ордера в схеме //uint _price_temp = _price - (_price_step * _frame); // найдем цену последнего ордера в схеме (, _val_temp) = IContractDeposits(contractDeposits).getTypeAndValue(_token_in, _token_out, _val_temp, (_price - (_price_step * _frame))); if(_val_temp < variable._min_in) return (18, 0, 0, 0); } // проверяем что пользователь дал разрешение контракту депозитов и имеет достаточный баланс на своем кошельке variable._code_err = checkApproveAndBalance(_owner, _token_in, _value, 0); if(variable._code_err > 0) return (variable._code_err, 0, 0, 0); // Нет апрува или баланса return (100, variable._bot_type, _value, variable._value2); } function checkCreateBotNetTrade(address _owner, address _token_in, address _token_out, uint _value_sell, uint _value_buy, uint _price, uint _price_step, uint _price_up_limit, uint _price_down_limit) public view returns (uint8, uint256, uint256) { // создание бота сеточной торговли // _owner - адрес владельца, который создает бота // _value_sell и _value_buy - объем токена с наименьшим приоритетом // _price - цена в токене с максимальным приоритетом // _token_in - будет установлен токен с минимальным приоритетом (сперва идет ордер продажи, а затем ордер покупки) // Возвращаемые значения: код_ошибки, получаем токена с макс. приоритером при продаже, отдаем токен с макс. приоритером при покупке if(_value_sell == 0) return (16, 0, 0); // количество продаваемого токена должно быть больше 0 if(_value_buy == 0) return (17, 0, 0); // количество покупаемого токена должно быть больше 0 uint[] memory _variable = new uint[](5); /* индексы массива _variable: 0 - получаем токена с макс. приоритером при продаже 1 - отдаем токен с макс. приоритером при покупке 2 - если = 1, то поменять входящий и выходящий токены местами, в противном случае 0 3 - минимально допустимое количество токена с максимальным приоритетом 4 - код ошибки (uint8) */ // проверяем торговую пару. Возвращаем нужно ли сделать реверс токенов, а так же минимальное количество токена с максимальным приоритетом (_variable[4], _variable[2], _variable[3]) = checkTokensOnDexType3(_token_in, _token_out); if(_variable[4] > 0) return (uint8(_variable[4]), 0, 0); // Ошибка торговой пары if(_variable[2] == 1){ (_token_in, _token_out) = (_token_out, _token_in); // меняем входящие токены местами. Теперь в _token_in находится токен с минимальным приоритетом } // проверяем цену, шаг и ценовые пределы if(_price_step == 0) return (19, 0, 0); // ценовой шаг должен быть больше 0 if(_price > _price_up_limit) return (20, 0, 0); // цена должна быть меньше, либо равна верхнему ценовому пределу if(_price < _price_down_limit) return (21, 0, 0); // цена должна быть выше, либо равна нижнему ценовому пределу if(_price_down_limit < _price_step) return (22, 0, 0); // нижний ценовой предел должен быть больше или равен шагу if((uint(int(-1)) - _price_up_limit) < _price_step) return (23, 0, 0); // разница между максимальным значением переменной и верхним ценовым пределом должна быть больше или равена шагу // проверяем объемы ордеров при самой низкой цене (они не должны быть пылью) _variable[4] = getValueWithMaxPriority(_token_in, _token_out, _value_sell, (_price_down_limit + _price_step)); // вернем объем самого нижнего ордера продажи if(_variable[4] < _variable[3]) return (24, 0, 0); // объем токена с максимальным приоритетом ниже минималки (пылевой ордер) _variable[4] = getValueWithMaxPriority(_token_out, _token_in, _value_buy, _price_down_limit); // вернем объем самого нижнего ордера покупки if(_variable[4] < _variable[3]) return (25, 0, 0); // объем токена с максимальным приоритетом ниже минималки (пылевой ордер) // проверяем что пользователь дал разрешение контракту депозитов и имеет достаточный баланс на своем кошельке if((_price + _price_step) <= _price_up_limit){ // ордер продажи будет выставлен при создании бота _variable[0] = getValueWithMaxPriority(_token_in, _token_out, _value_sell, (_price + _price_step)); // получаем при продаже // проверяем объем токена, который пользователь отдает _variable[4] = checkApproveAndBalance(_owner, _token_in, _value_sell, 0); if(_variable[4] > 0) return (uint8(_variable[4]), 0, 0); // Нет апрува или баланса } if((_price - _price_step) >= _price_down_limit){ // ордер покупки будет выставлен при создании бота _variable[1] = getValueWithMaxPriority(_token_out, _token_in, _value_buy, (_price - _price_step)); // отдаем при покупке // проверяем объем токена, который пользователь отдает _variable[4] = checkApproveAndBalance(_owner, _token_out, _variable[1], 0); if(_variable[4] > 0) return (uint8(_variable[4]), 0, 0); // Нет апрува или баланса } // Если ни один ордер не попадает в рабочий диапазон, то функцию завершаем с ошибкой if((_variable[0] == 0) && ((_variable[1] == 0))) return (26, 0, 0); // Ни один ордер не попадает в рабочий диапазон if(_variable[2] == 1){ // Если входящий и выходящий токен нужно поменять местами return (101, _variable[0], _variable[1]); } else{ return (100, _variable[0], _variable[1]); } } function checkSchemeBotSellBuy(address _owner, address _token_in, address _token_out, uint _value, uint _price, uint _price_limit) public view returns (uint8, uint256, uint256) { // Проверка схемы бота распродажи / закупа // Возвращаемые значения: код_ошибки, количество_входящего_токена, количество_выходящего_токена uint256 _value_max_priority; // объем токена с максимальным приоритетом uint8 _order_type; // тип ордера uint8 _code_err; _code_err = checkGasOwner(_owner); // проверка доступности газа у владельца бота if(_code_err > 0) return (_code_err, 0, 0); // Нет апрува или баланса (_order_type, _value_max_priority) = IContractDeposits(contractDeposits).getTypeAndValue(_token_in, _token_out, _value, _price); if(_order_type == 1){ // продажа if(_price > _price_limit) return (200, 0, 0); // цена вышла за установленный предел. Бот полностью завершил схему } else{ // покупка if(_price < _price_limit) return (200, 0, 0); // цена вышла за установленный предел. Бот полностью завершил схему (_value, _value_max_priority) = (_value_max_priority, _value); } // _value - количество входящего токена. _value_max_priority - количество выходящего токена // у владельца есть газ, схема бота еще активна. // проверяем что пользователь дал разрешение контракту депозитов и имеет достаточный баланс на своем кошельке _code_err = checkApproveAndBalance(_owner, _token_in, _value, 0); if(_code_err > 0) return (_code_err, 0, 0); // Нет апрува или баланса return (100, _value, _value_max_priority); } function checkSchemeBotNetTrade(address _owner, address _token_in, address _token_out, uint[] memory _param, uint[] memory _order_data, uint[] memory _order_data_2) public view returns (uint8, uint[] memory) { // Проверка схемы бота сеточной торговли // _param - [количество_продажи, количество_покупки, цена, шаг, верхний_предел_цены, нижний_предел_цены] // _order_data - данные отработавщего ордера - [статус, тип_ордера, осталось_отдать, осталось_получить, отдал, получил] // _order_data_2 - данные второго ордера из схемы - [статус, тип_ордера, осталось_отдать, осталось_получить, отдал, получил] uint8 _code_err; uint[] memory _result = new uint[](4); // [отдаем, получаем, отдаем, получаем] - первые 2 параметра это ордер продажи, вторые 2 параметра это ордер покупки uint _value_sell; // сколько по факту продавать в токене с наименьшим приоритетом uint _value_buy; // сколько по факту покупать в токене с наименьшим приоритетом uint _add_balance_token_in; // сколько поступит на баланс _token_in uint _add_balance_token_out; // сколько поступит на баланс _token_out if(_order_data[1] == 1){ // если тип исполненого ордера продажа _value_sell = _param[0]; // продавать полный объем _value_buy = _order_data_2[3]; // покупать надо необмененый остаток второго ордера if(_value_buy == 0) _value_buy = _param[1]; // если противоположный ордер со статусом 7 или 0, тогда следующая покупка в полном объеме _add_balance_token_out = _order_data[5] + _order_data_2[2]; // количество выходящего получаемого токена _add_balance_token_in = _order_data_2[5]; // количество входящего получаемого токена } else{ // иначе это была покупка _value_buy = _param[1]; // покупать полный объем _value_sell = _order_data_2[2]; // продавать надо необмененый остаток второго ордера if(_value_sell == 0) _value_sell = _param[0]; // если противоположный ордер со статусом 7 или 0, тогда следующая продажа в полном объеме _add_balance_token_in = _order_data[5] + _order_data_2[2]; // количество выходящего получаемого токена _add_balance_token_out = _order_data_2[5]; // количество входящего получаемого токена } // проверяем что пользователь дал разрешение контракту депозитов и имеет достаточный баланс на своем кошельке if((_param[2] + _param[3]) <= _param[4]){ // ордер продажи будет выставлен _result[0] = _value_sell; _result[1] = getValueWithMaxPriority(_token_in, _token_out, _value_sell, (_param[2] + _param[3])); // получаем при продаже // проверяем объем токена, который пользователь отдает _code_err = checkApproveAndBalance(_owner, _token_in, _value_sell, _add_balance_token_in); if(_code_err > 0) return (_code_err, _result); // Нет апрува или баланса } if((_param[2] - _param[3]) >= _param[5]){ // ордер покупки будет выставлен _result[2] = getValueWithMaxPriority(_token_out, _token_in, _value_buy, (_param[2] - _param[3])); // отдаем при покупке _result[3] = _value_buy; // проверяем объем токена, который пользователь отдает _code_err = checkApproveAndBalance(_owner, _token_out, _result[2], _add_balance_token_out); if(_code_err > 0) return (_code_err, _result); // Нет апрува или баланса } return (0, _result); // все проверки успешно пройдены } function getValueWithMaxPriority(address _token_in, address _token_out, uint _value, uint _price) public view returns (uint) { // функция возвращает объем токена с максимальным приоритетом // _value - объем токена с минимальным приоритетом uint _value_max_priority; // объем токена с максимальным приоритетом (, _value_max_priority) = IContractDeposits(contractDeposits).getTypeAndValue(_token_in, _token_out, _value, _price); return (_value_max_priority); } }
Contract ABI
[{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"checkApproveAndBalance","inputs":[{"type":"address","name":"_owner","internalType":"address"},{"type":"address","name":"_token_in","internalType":"address"},{"type":"uint256","name":"_value_in","internalType":"uint256"},{"type":"uint256","name":"_value_inc_balance","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"}],"name":"checkCreateBotNetTrade","inputs":[{"type":"address","name":"_owner","internalType":"address"},{"type":"address","name":"_token_in","internalType":"address"},{"type":"address","name":"_token_out","internalType":"address"},{"type":"uint256","name":"_value_sell","internalType":"uint256"},{"type":"uint256","name":"_value_buy","internalType":"uint256"},{"type":"uint256","name":"_price","internalType":"uint256"},{"type":"uint256","name":"_price_step","internalType":"uint256"},{"type":"uint256","name":"_price_up_limit","internalType":"uint256"},{"type":"uint256","name":"_price_down_limit","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"},{"type":"uint8","name":"","internalType":"uint8"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"}],"name":"checkCreateBotSellBuy","inputs":[{"type":"address","name":"_owner","internalType":"address"},{"type":"address","name":"_token_in","internalType":"address"},{"type":"address","name":"_token_out","internalType":"address"},{"type":"uint256","name":"_value","internalType":"uint256"},{"type":"uint256","name":"_value_inc","internalType":"uint256"},{"type":"uint256","name":"_price","internalType":"uint256"},{"type":"uint256","name":"_price_step","internalType":"uint256"},{"type":"uint256","name":"_price_limit","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"checkGasOwner","inputs":[{"type":"address","name":"_owner","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"},{"type":"uint256[]","name":"","internalType":"uint256[]"}],"name":"checkSchemeBotNetTrade","inputs":[{"type":"address","name":"_owner","internalType":"address"},{"type":"address","name":"_token_in","internalType":"address"},{"type":"address","name":"_token_out","internalType":"address"},{"type":"uint256[]","name":"_param","internalType":"uint256[]"},{"type":"uint256[]","name":"_order_data","internalType":"uint256[]"},{"type":"uint256[]","name":"_order_data_2","internalType":"uint256[]"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"}],"name":"checkSchemeBotSellBuy","inputs":[{"type":"address","name":"_owner","internalType":"address"},{"type":"address","name":"_token_in","internalType":"address"},{"type":"address","name":"_token_out","internalType":"address"},{"type":"uint256","name":"_value","internalType":"uint256"},{"type":"uint256","name":"_price","internalType":"uint256"},{"type":"uint256","name":"_price_limit","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"}],"name":"checkTokensOnDex","inputs":[{"type":"address","name":"_token_in","internalType":"address"},{"type":"address","name":"_token_out","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"}],"name":"checkTokensOnDexType3","inputs":[{"type":"address","name":"_token_in","internalType":"address"},{"type":"address","name":"_token_out","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"contractDeposits","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getValueWithMaxPriority","inputs":[{"type":"address","name":"_token_in","internalType":"address"},{"type":"address","name":"_token_out","internalType":"address"},{"type":"uint256","name":"_value","internalType":"uint256"},{"type":"uint256","name":"_price","internalType":"uint256"}]}]
Contract Creation Code
0x608060405234801561001057600080fd5b50612854806100206000396000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c8063acbfa21d11610066578063acbfa21d14610185578063ad148af4146101b8578063b1055734146101e8578063de14efc414610219578063fe908a9c1461024b5761009e565b80630c40aaf3146100a3578063127e1197146100d557806320903720146100f35780637d25728a1461012357806390b5ef7714610153575b600080fd5b6100bd60048036038101906100b89190611dd4565b61027d565b6040516100cc93929190611e49565b60405180910390f35b6100dd610567565b6040516100ea9190611e8f565b60405180910390f35b61010d60048036038101906101089190611eaa565b61057f565b60405161011a9190611ed7565b60405180910390f35b61013d60048036038101906101389190611f1e565b610769565b60405161014a9190611f85565b60405180910390f35b61016d60048036038101906101689190611fa0565b610811565b60405161017c93929190611e49565b60405180910390f35b61019f600480360381019061019a919061206a565b610dec565b6040516101af9493929190612120565b60405180910390f35b6101d260048036038101906101cd9190611f1e565b61121f565b6040516101df9190611ed7565b60405180910390f35b61020260048036038101906101fd91906122be565b61159b565b60405161021092919061245d565b60405180910390f35b610233600480360381019061022e9190611dd4565b611a15565b60405161024293929190611e49565b60405180910390f35b6102656004803603810190610260919061248d565b611bc8565b60405161027493929190611e49565b60405180910390f35b60008060008373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036102c5576001600080925092509250610560565b6000735cec09f125f4839656164a5109bc076daabd6ed673ffffffffffffffffffffffffffffffffffffffff1663f3f9d41a876040518263ffffffff1660e01b81526004016103149190611e8f565b602060405180830381865afa158015610331573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610355919061252f565b90506000810361037057600260008093509350935050610560565b6000735cec09f125f4839656164a5109bc076daabd6ed673ffffffffffffffffffffffffffffffffffffffff1663f3f9d41a876040518263ffffffff1660e01b81526004016103bf9190611e8f565b602060405180830381865afa1580156103dc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610400919061252f565b90506000810361041c5760036000809450945094505050610560565b600080828410156104bc57735cec09f125f4839656164a5109bc076daabd6ed673ffffffffffffffffffffffffffffffffffffffff1663f41a710d896040518263ffffffff1660e01b81526004016104749190611e8f565b602060405180830381865afa158015610491573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104b5919061252f565b9050610551565b60019150735cec09f125f4839656164a5109bc076daabd6ed673ffffffffffffffffffffffffffffffffffffffff1663f41a710d8a6040518263ffffffff1660e01b815260040161050d9190611e8f565b602060405180830381865afa15801561052a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061054e919061252f565b90505b60008282965096509650505050505b9250925092565b735cec09f125f4839656164a5109bc076daabd6ed681565b600080600080735cec09f125f4839656164a5109bc076daabd6ed673ffffffffffffffffffffffffffffffffffffffff16634b4265a36040518163ffffffff1660e01b8152600401606060405180830381865afa1580156105e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106089190612571565b9250925092506000818361061c91906125f3565b905060008473ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e88735cec09f125f4839656164a5109bc076daabd6ed66040518363ffffffff1660e01b815260040161066f92919061264d565b602060405180830381865afa15801561068c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106b0919061252f565b9050808211156106c857600e95505050505050610764565b8473ffffffffffffffffffffffffffffffffffffffff166370a08231886040518263ffffffff1660e01b81526004016107019190611e8f565b602060405180830381865afa15801561071e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610742919061252f565b90508082111561075a57600f95505050505050610764565b6000955050505050505b919050565b600080735cec09f125f4839656164a5109bc076daabd6ed673ffffffffffffffffffffffffffffffffffffffff166365593d7b878787876040518563ffffffff1660e01b81526004016107bf9493929190612676565b6040805180830381865afa1580156107db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ff91906126e7565b90508091505080915050949350505050565b600080600080890361082d576010600080925092509250610ddd565b60008803610845576011600080925092509250610ddd565b6000600567ffffffffffffffff8111156108625761086161217b565b5b6040519080825280602002602001820160405280156108905781602001602082028036833780820191505090505b50905061089d8c8c61027d565b8260ff169250836004815181106108b7576108b6612727565b5b60200260200101846002815181106108d2576108d1612727565b5b60200260200101856003815181106108ed576108ec612727565b5b6020026020010183815250838152508381525050505060008160048151811061091957610918612727565b5b60200260200101511115610952578060048151811061093b5761093a612727565b5b602002602001015160008093509350935050610ddd565b60018160028151811061096857610967612727565b5b602002602001015103610980578a8c809c50819d5050505b6000870361099957601360008093509350935050610ddd565b858811156109b257601460008093509350935050610ddd565b848810156109cb57601560008093509350935050610ddd565b868510156109e457601660008093509350935050610ddd565b86867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610a119190612756565b1015610a2857601760008093509350935050610ddd565b610a3f8c8c8c8a89610a3a919061278a565b610769565b81600481518110610a5357610a52612727565b5b60200260200101818152505080600381518110610a7357610a72612727565b5b602002602001015181600481518110610a8f57610a8e612727565b5b60200260200101511015610aae57601860008093509350935050610ddd565b610aba8b8d8b88610769565b81600481518110610ace57610acd612727565b5b60200260200101818152505080600381518110610aee57610aed612727565b5b602002602001015181600481518110610b0a57610b09612727565b5b60200260200101511015610b2957601960008093509350935050610ddd565b858789610b36919061278a565b11610bf257610b528c8c8c8a8c610b4d919061278a565b610769565b81600081518110610b6657610b65612727565b5b602002602001018181525050610b7f8d8d8c600061121f565b60ff1681600481518110610b9657610b95612727565b5b602002602001018181525050600081600481518110610bb857610bb7612727565b5b60200260200101511115610bf15780600481518110610bda57610bd9612727565b5b602002602001015160008093509350935050610ddd565b5b848789610bff9190612756565b10610cd657610c1b8b8d8b8a8c610c169190612756565b610769565b81600181518110610c2f57610c2e612727565b5b602002602001018181525050610c638d8c83600181518110610c5457610c53612727565b5b6020026020010151600061121f565b60ff1681600481518110610c7a57610c79612727565b5b602002602001018181525050600081600481518110610c9c57610c9b612727565b5b60200260200101511115610cd55780600481518110610cbe57610cbd612727565b5b602002602001015160008093509350935050610ddd565b5b600081600081518110610cec57610ceb612727565b5b6020026020010151148015610d1c5750600081600181518110610d1257610d11612727565b5b6020026020010151145b15610d3257601a60008093509350935050610ddd565b600181600281518110610d4857610d47612727565b5b602002602001015103610d9b57606581600081518110610d6b57610d6a612727565b5b602002602001015182600181518110610d8757610d86612727565b5b602002602001015193509350935050610ddd565b606481600081518110610db157610db0612727565b5b602002602001015182600181518110610dcd57610dcc612727565b5b6020026020010151935093509350505b99509950999650505050505050565b60008060008060008703610e0e57600460008060009350935093509350611210565b60008903610e2a57600560008060009350935093509350611210565b88887fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610e579190612756565b1015610e7157600d60008060009350935093509350611210565b610e79611d2d565b610e838c8c611a15565b83608001846000018560200183815250838152508360ff1660ff168152505050506000816080015160ff161115610ecc5780608001516000806000945094509450945050611210565b735cec09f125f4839656164a5109bc076daabd6ed673ffffffffffffffffffffffffffffffffffffffff166365593d7b8d8d8d8c6040518563ffffffff1660e01b8152600401610f1f9493929190612676565b6040805180830381865afa158015610f3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5f91906126e7565b8260600183604001828152508260ff1660ff1681525050506000816040015103610f985760056000806000945094509450945050611210565b6001816060015160ff160361103657806020015181604001511015610fcc5760066000806000945094509450945050611210565b86867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610ff99190612756565b10156110145760076000806000945094509450945050611210565b878610156110315760086000806000945094509450945050611210565b6111b3565b80604001518a8260400181815250819b50505080600001518a101561106a5760066000806000945094509450945050611210565b868610156110875760096000806000945094509450945050611210565b858810156110a457600a6000806000945094509450945050611210565b600087878a6110b39190612756565b6110bd91906127ed565b905060008260400151828c6110d291906125f3565b6110dc919061278a565b9050735cec09f125f4839656164a5109bc076daabd6ed673ffffffffffffffffffffffffffffffffffffffff166365593d7b8f8f84868e61111d91906125f3565b8f6111289190612756565b6040518563ffffffff1660e01b81526004016111479493929190612676565b6040805180830381865afa158015611163573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061118791906126e7565b90508091505082600001518110156111b057601260008060009650965096509650505050611210565b50505b6111c08d8d8c600061121f565b816080019060ff16908160ff16815250506000816080015160ff1611156111f95780608001516000806000945094509450945050611210565b606481606001518b83604001519450945094509450505b98509850985098945050505050565b6000806000806000735cec09f125f4839656164a5109bc076daabd6ed673ffffffffffffffffffffffffffffffffffffffff16634b4265a36040518163ffffffff1660e01b8152600401606060405180830381865afa158015611286573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112aa9190612571565b925092509250600081836112be91906125f3565b90508373ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff16036113065780886112ff919061278a565b9750611441565b8373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e8b735cec09f125f4839656164a5109bc076daabd6ed66040518363ffffffff1660e01b815260040161135592919061264d565b602060405180830381865afa158015611372573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611396919061252f565b9450848111156113ae57600e95505050505050611593565b8373ffffffffffffffffffffffffffffffffffffffff166370a082318b6040518263ffffffff1660e01b81526004016113e79190611e8f565b602060405180830381865afa158015611404573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611428919061252f565b94508481111561144057600f95505050505050611593565b5b8873ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e8b735cec09f125f4839656164a5109bc076daabd6ed66040518363ffffffff1660e01b815260040161149092919061264d565b602060405180830381865afa1580156114ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d1919061252f565b9450848811156114e957600b95505050505050611593565b8873ffffffffffffffffffffffffffffffffffffffff166370a082318b6040518263ffffffff1660e01b81526004016115229190611e8f565b602060405180830381865afa15801561153f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611563919061252f565b94508685611571919061278a565b94508488111561158957600c95505050505050611593565b6000955050505050505b949350505050565b60006060600080600467ffffffffffffffff8111156115bd576115bc61217b565b5b6040519080825280602002602001820160405280156115eb5781602001602082028036833780820191505090505b50905060008060008060018a60018151811061160a57611609612727565b5b6020026020010151036116e1578a60008151811061162b5761162a612727565b5b602002602001015193508860038151811061164957611648612727565b5b602002602001015192506000830361167a578a60018151811061166f5761166e612727565b5b602002602001015192505b8860028151811061168e5761168d612727565b5b60200260200101518a6005815181106116aa576116a9612727565b5b60200260200101516116bc919061278a565b9050886005815181106116d2576116d1612727565b5b602002602001015191506117a7565b8a6001815181106116f5576116f4612727565b5b602002602001015192508860028151811061171357611712612727565b5b6020026020010151935060008403611744578a60008151811061173957611738612727565b5b602002602001015193505b8860028151811061175857611757612727565b5b60200260200101518a60058151811061177457611773612727565b5b6020026020010151611786919061278a565b91508860058151811061179c5761179b612727565b5b602002602001015190505b8a6004815181106117bb576117ba612727565b5b60200260200101518b6003815181106117d7576117d6612727565b5b60200260200101518c6002815181106117f3576117f2612727565b5b6020026020010151611805919061278a565b116118c457838560008151811061181f5761181e612727565b5b6020026020010181815250506118788d8d868e60038151811061184557611844612727565b5b60200260200101518f60028151811061186157611860612727565b5b6020026020010151611873919061278a565b610769565b8560018151811061188c5761188b612727565b5b6020026020010181815250506118a48e8e868561121f565b955060008660ff1611156118c357858597509750505050505050611a0a565b5b8a6005815181106118d8576118d7612727565b5b60200260200101518b6003815181106118f4576118f3612727565b5b60200260200101518c6002815181106119105761190f612727565b5b60200260200101516119229190612756565b106119fc576119748c8e858e60038151811061194157611940612727565b5b60200260200101518f60028151811061195d5761195c612727565b5b602002602001015161196f9190612756565b610769565b8560028151811061198857611987612727565b5b60200260200101818152505082856003815181106119a9576119a8612727565b5b6020026020010181815250506119dc8e8d876002815181106119ce576119cd612727565b5b60200260200101518461121f565b955060008660ff1611156119fb57858597509750505050505050611a0a565b5b600085975097505050505050505b965096945050505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611a5d576001600080925092509250611bc1565b6000735cec09f125f4839656164a5109bc076daabd6ed673ffffffffffffffffffffffffffffffffffffffff1663f41a710d876040518263ffffffff1660e01b8152600401611aac9190611e8f565b602060405180830381865afa158015611ac9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aed919061252f565b905060008103611b0857600260008093509350935050611bc1565b6000735cec09f125f4839656164a5109bc076daabd6ed673ffffffffffffffffffffffffffffffffffffffff1663f41a710d876040518263ffffffff1660e01b8152600401611b579190611e8f565b602060405180830381865afa158015611b74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b98919061252f565b905060008103611bb45760036000809450945094505050611bc1565b6000828294509450945050505b9250925092565b600080600080600080611bda8c61057f565b905060008160ff161115611bfa5780600080955095509550505050611d21565b735cec09f125f4839656164a5109bc076daabd6ed673ffffffffffffffffffffffffffffffffffffffff166365593d7b8c8c8c8c6040518563ffffffff1660e01b8152600401611c4d9493929190612676565b6040805180830381865afa158015611c69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c8d91906126e7565b809450819350505060018260ff1603611cc05786881115611cbb5760c8600080955095509550505050611d21565b611ce6565b86881015611cdb5760c8600080955095509550505050611d21565b8289809450819a5050505b611cf38c8c8b600061121f565b905060008160ff161115611d135780600080955095509550505050611d21565b606489849550955095505050505b96509650969350505050565b6040518060a00160405280600081526020016000815260200160008152602001600060ff168152602001600060ff1681525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611da182611d76565b9050919050565b611db181611d96565b8114611dbc57600080fd5b50565b600081359050611dce81611da8565b92915050565b60008060408385031215611deb57611dea611d6c565b5b6000611df985828601611dbf565b9250506020611e0a85828601611dbf565b9150509250929050565b600060ff82169050919050565b611e2a81611e14565b82525050565b6000819050919050565b611e4381611e30565b82525050565b6000606082019050611e5e6000830186611e21565b611e6b6020830185611e3a565b611e786040830184611e3a565b949350505050565b611e8981611d96565b82525050565b6000602082019050611ea46000830184611e80565b92915050565b600060208284031215611ec057611ebf611d6c565b5b6000611ece84828501611dbf565b91505092915050565b6000602082019050611eec6000830184611e21565b92915050565b611efb81611e30565b8114611f0657600080fd5b50565b600081359050611f1881611ef2565b92915050565b60008060008060808587031215611f3857611f37611d6c565b5b6000611f4687828801611dbf565b9450506020611f5787828801611dbf565b9350506040611f6887828801611f09565b9250506060611f7987828801611f09565b91505092959194509250565b6000602082019050611f9a6000830184611e3a565b92915050565b60008060008060008060008060006101208a8c031215611fc357611fc2611d6c565b5b6000611fd18c828d01611dbf565b9950506020611fe28c828d01611dbf565b9850506040611ff38c828d01611dbf565b97505060606120048c828d01611f09565b96505060806120158c828d01611f09565b95505060a06120268c828d01611f09565b94505060c06120378c828d01611f09565b93505060e06120488c828d01611f09565b92505061010061205a8c828d01611f09565b9150509295985092959850929598565b600080600080600080600080610100898b03121561208b5761208a611d6c565b5b60006120998b828c01611dbf565b98505060206120aa8b828c01611dbf565b97505060406120bb8b828c01611dbf565b96505060606120cc8b828c01611f09565b95505060806120dd8b828c01611f09565b94505060a06120ee8b828c01611f09565b93505060c06120ff8b828c01611f09565b92505060e06121108b828c01611f09565b9150509295985092959890939650565b60006080820190506121356000830187611e21565b6121426020830186611e21565b61214f6040830185611e3a565b61215c6060830184611e3a565b95945050505050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6121b38261216a565b810181811067ffffffffffffffff821117156121d2576121d161217b565b5b80604052505050565b60006121e5611d62565b90506121f182826121aa565b919050565b600067ffffffffffffffff8211156122115761221061217b565b5b602082029050602081019050919050565b600080fd5b600061223a612235846121f6565b6121db565b9050808382526020820190506020840283018581111561225d5761225c612222565b5b835b8181101561228657806122728882611f09565b84526020840193505060208101905061225f565b5050509392505050565b600082601f8301126122a5576122a4612165565b5b81356122b5848260208601612227565b91505092915050565b60008060008060008060c087890312156122db576122da611d6c565b5b60006122e989828a01611dbf565b96505060206122fa89828a01611dbf565b955050604061230b89828a01611dbf565b945050606087013567ffffffffffffffff81111561232c5761232b611d71565b5b61233889828a01612290565b935050608087013567ffffffffffffffff81111561235957612358611d71565b5b61236589828a01612290565b92505060a087013567ffffffffffffffff81111561238657612385611d71565b5b61239289828a01612290565b9150509295509295509295565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6123d481611e30565b82525050565b60006123e683836123cb565b60208301905092915050565b6000602082019050919050565b600061240a8261239f565b61241481856123aa565b935061241f836123bb565b8060005b8381101561245057815161243788826123da565b9750612442836123f2565b925050600181019050612423565b5085935050505092915050565b60006040820190506124726000830185611e21565b818103602083015261248481846123ff565b90509392505050565b60008060008060008060c087890312156124aa576124a9611d6c565b5b60006124b889828a01611dbf565b96505060206124c989828a01611dbf565b95505060406124da89828a01611dbf565b94505060606124eb89828a01611f09565b93505060806124fc89828a01611f09565b92505060a061250d89828a01611f09565b9150509295509295509295565b60008151905061252981611ef2565b92915050565b60006020828403121561254557612544611d6c565b5b60006125538482850161251a565b91505092915050565b60008151905061256b81611da8565b92915050565b60008060006060848603121561258a57612589611d6c565b5b60006125988682870161255c565b93505060206125a98682870161251a565b92505060406125ba8682870161251a565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006125fe82611e30565b915061260983611e30565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612642576126416125c4565b5b828202905092915050565b60006040820190506126626000830185611e80565b61266f6020830184611e80565b9392505050565b600060808201905061268b6000830187611e80565b6126986020830186611e80565b6126a56040830185611e3a565b6126b26060830184611e3a565b95945050505050565b6126c481611e14565b81146126cf57600080fd5b50565b6000815190506126e1816126bb565b92915050565b600080604083850312156126fe576126fd611d6c565b5b600061270c858286016126d2565b925050602061271d8582860161251a565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061276182611e30565b915061276c83611e30565b9250828203905081811115612784576127836125c4565b5b92915050565b600061279582611e30565b91506127a083611e30565b92508282019050808211156127b8576127b76125c4565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006127f882611e30565b915061280383611e30565b925082612813576128126127be565b5b82820490509291505056fea2646970667358221220ed6252715487b26854ef689c95ab3f1e03e13a7ce3392cfeff9f4bcce0f8ca8a64736f6c63430008100033
Deployed ByteCode
0x608060405234801561001057600080fd5b506004361061009e5760003560e01c8063acbfa21d11610066578063acbfa21d14610185578063ad148af4146101b8578063b1055734146101e8578063de14efc414610219578063fe908a9c1461024b5761009e565b80630c40aaf3146100a3578063127e1197146100d557806320903720146100f35780637d25728a1461012357806390b5ef7714610153575b600080fd5b6100bd60048036038101906100b89190611dd4565b61027d565b6040516100cc93929190611e49565b60405180910390f35b6100dd610567565b6040516100ea9190611e8f565b60405180910390f35b61010d60048036038101906101089190611eaa565b61057f565b60405161011a9190611ed7565b60405180910390f35b61013d60048036038101906101389190611f1e565b610769565b60405161014a9190611f85565b60405180910390f35b61016d60048036038101906101689190611fa0565b610811565b60405161017c93929190611e49565b60405180910390f35b61019f600480360381019061019a919061206a565b610dec565b6040516101af9493929190612120565b60405180910390f35b6101d260048036038101906101cd9190611f1e565b61121f565b6040516101df9190611ed7565b60405180910390f35b61020260048036038101906101fd91906122be565b61159b565b60405161021092919061245d565b60405180910390f35b610233600480360381019061022e9190611dd4565b611a15565b60405161024293929190611e49565b60405180910390f35b6102656004803603810190610260919061248d565b611bc8565b60405161027493929190611e49565b60405180910390f35b60008060008373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036102c5576001600080925092509250610560565b6000735cec09f125f4839656164a5109bc076daabd6ed673ffffffffffffffffffffffffffffffffffffffff1663f3f9d41a876040518263ffffffff1660e01b81526004016103149190611e8f565b602060405180830381865afa158015610331573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610355919061252f565b90506000810361037057600260008093509350935050610560565b6000735cec09f125f4839656164a5109bc076daabd6ed673ffffffffffffffffffffffffffffffffffffffff1663f3f9d41a876040518263ffffffff1660e01b81526004016103bf9190611e8f565b602060405180830381865afa1580156103dc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610400919061252f565b90506000810361041c5760036000809450945094505050610560565b600080828410156104bc57735cec09f125f4839656164a5109bc076daabd6ed673ffffffffffffffffffffffffffffffffffffffff1663f41a710d896040518263ffffffff1660e01b81526004016104749190611e8f565b602060405180830381865afa158015610491573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104b5919061252f565b9050610551565b60019150735cec09f125f4839656164a5109bc076daabd6ed673ffffffffffffffffffffffffffffffffffffffff1663f41a710d8a6040518263ffffffff1660e01b815260040161050d9190611e8f565b602060405180830381865afa15801561052a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061054e919061252f565b90505b60008282965096509650505050505b9250925092565b735cec09f125f4839656164a5109bc076daabd6ed681565b600080600080735cec09f125f4839656164a5109bc076daabd6ed673ffffffffffffffffffffffffffffffffffffffff16634b4265a36040518163ffffffff1660e01b8152600401606060405180830381865afa1580156105e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106089190612571565b9250925092506000818361061c91906125f3565b905060008473ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e88735cec09f125f4839656164a5109bc076daabd6ed66040518363ffffffff1660e01b815260040161066f92919061264d565b602060405180830381865afa15801561068c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106b0919061252f565b9050808211156106c857600e95505050505050610764565b8473ffffffffffffffffffffffffffffffffffffffff166370a08231886040518263ffffffff1660e01b81526004016107019190611e8f565b602060405180830381865afa15801561071e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610742919061252f565b90508082111561075a57600f95505050505050610764565b6000955050505050505b919050565b600080735cec09f125f4839656164a5109bc076daabd6ed673ffffffffffffffffffffffffffffffffffffffff166365593d7b878787876040518563ffffffff1660e01b81526004016107bf9493929190612676565b6040805180830381865afa1580156107db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ff91906126e7565b90508091505080915050949350505050565b600080600080890361082d576010600080925092509250610ddd565b60008803610845576011600080925092509250610ddd565b6000600567ffffffffffffffff8111156108625761086161217b565b5b6040519080825280602002602001820160405280156108905781602001602082028036833780820191505090505b50905061089d8c8c61027d565b8260ff169250836004815181106108b7576108b6612727565b5b60200260200101846002815181106108d2576108d1612727565b5b60200260200101856003815181106108ed576108ec612727565b5b6020026020010183815250838152508381525050505060008160048151811061091957610918612727565b5b60200260200101511115610952578060048151811061093b5761093a612727565b5b602002602001015160008093509350935050610ddd565b60018160028151811061096857610967612727565b5b602002602001015103610980578a8c809c50819d5050505b6000870361099957601360008093509350935050610ddd565b858811156109b257601460008093509350935050610ddd565b848810156109cb57601560008093509350935050610ddd565b868510156109e457601660008093509350935050610ddd565b86867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610a119190612756565b1015610a2857601760008093509350935050610ddd565b610a3f8c8c8c8a89610a3a919061278a565b610769565b81600481518110610a5357610a52612727565b5b60200260200101818152505080600381518110610a7357610a72612727565b5b602002602001015181600481518110610a8f57610a8e612727565b5b60200260200101511015610aae57601860008093509350935050610ddd565b610aba8b8d8b88610769565b81600481518110610ace57610acd612727565b5b60200260200101818152505080600381518110610aee57610aed612727565b5b602002602001015181600481518110610b0a57610b09612727565b5b60200260200101511015610b2957601960008093509350935050610ddd565b858789610b36919061278a565b11610bf257610b528c8c8c8a8c610b4d919061278a565b610769565b81600081518110610b6657610b65612727565b5b602002602001018181525050610b7f8d8d8c600061121f565b60ff1681600481518110610b9657610b95612727565b5b602002602001018181525050600081600481518110610bb857610bb7612727565b5b60200260200101511115610bf15780600481518110610bda57610bd9612727565b5b602002602001015160008093509350935050610ddd565b5b848789610bff9190612756565b10610cd657610c1b8b8d8b8a8c610c169190612756565b610769565b81600181518110610c2f57610c2e612727565b5b602002602001018181525050610c638d8c83600181518110610c5457610c53612727565b5b6020026020010151600061121f565b60ff1681600481518110610c7a57610c79612727565b5b602002602001018181525050600081600481518110610c9c57610c9b612727565b5b60200260200101511115610cd55780600481518110610cbe57610cbd612727565b5b602002602001015160008093509350935050610ddd565b5b600081600081518110610cec57610ceb612727565b5b6020026020010151148015610d1c5750600081600181518110610d1257610d11612727565b5b6020026020010151145b15610d3257601a60008093509350935050610ddd565b600181600281518110610d4857610d47612727565b5b602002602001015103610d9b57606581600081518110610d6b57610d6a612727565b5b602002602001015182600181518110610d8757610d86612727565b5b602002602001015193509350935050610ddd565b606481600081518110610db157610db0612727565b5b602002602001015182600181518110610dcd57610dcc612727565b5b6020026020010151935093509350505b99509950999650505050505050565b60008060008060008703610e0e57600460008060009350935093509350611210565b60008903610e2a57600560008060009350935093509350611210565b88887fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610e579190612756565b1015610e7157600d60008060009350935093509350611210565b610e79611d2d565b610e838c8c611a15565b83608001846000018560200183815250838152508360ff1660ff168152505050506000816080015160ff161115610ecc5780608001516000806000945094509450945050611210565b735cec09f125f4839656164a5109bc076daabd6ed673ffffffffffffffffffffffffffffffffffffffff166365593d7b8d8d8d8c6040518563ffffffff1660e01b8152600401610f1f9493929190612676565b6040805180830381865afa158015610f3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5f91906126e7565b8260600183604001828152508260ff1660ff1681525050506000816040015103610f985760056000806000945094509450945050611210565b6001816060015160ff160361103657806020015181604001511015610fcc5760066000806000945094509450945050611210565b86867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610ff99190612756565b10156110145760076000806000945094509450945050611210565b878610156110315760086000806000945094509450945050611210565b6111b3565b80604001518a8260400181815250819b50505080600001518a101561106a5760066000806000945094509450945050611210565b868610156110875760096000806000945094509450945050611210565b858810156110a457600a6000806000945094509450945050611210565b600087878a6110b39190612756565b6110bd91906127ed565b905060008260400151828c6110d291906125f3565b6110dc919061278a565b9050735cec09f125f4839656164a5109bc076daabd6ed673ffffffffffffffffffffffffffffffffffffffff166365593d7b8f8f84868e61111d91906125f3565b8f6111289190612756565b6040518563ffffffff1660e01b81526004016111479493929190612676565b6040805180830381865afa158015611163573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061118791906126e7565b90508091505082600001518110156111b057601260008060009650965096509650505050611210565b50505b6111c08d8d8c600061121f565b816080019060ff16908160ff16815250506000816080015160ff1611156111f95780608001516000806000945094509450945050611210565b606481606001518b83604001519450945094509450505b98509850985098945050505050565b6000806000806000735cec09f125f4839656164a5109bc076daabd6ed673ffffffffffffffffffffffffffffffffffffffff16634b4265a36040518163ffffffff1660e01b8152600401606060405180830381865afa158015611286573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112aa9190612571565b925092509250600081836112be91906125f3565b90508373ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff16036113065780886112ff919061278a565b9750611441565b8373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e8b735cec09f125f4839656164a5109bc076daabd6ed66040518363ffffffff1660e01b815260040161135592919061264d565b602060405180830381865afa158015611372573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611396919061252f565b9450848111156113ae57600e95505050505050611593565b8373ffffffffffffffffffffffffffffffffffffffff166370a082318b6040518263ffffffff1660e01b81526004016113e79190611e8f565b602060405180830381865afa158015611404573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611428919061252f565b94508481111561144057600f95505050505050611593565b5b8873ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e8b735cec09f125f4839656164a5109bc076daabd6ed66040518363ffffffff1660e01b815260040161149092919061264d565b602060405180830381865afa1580156114ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d1919061252f565b9450848811156114e957600b95505050505050611593565b8873ffffffffffffffffffffffffffffffffffffffff166370a082318b6040518263ffffffff1660e01b81526004016115229190611e8f565b602060405180830381865afa15801561153f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611563919061252f565b94508685611571919061278a565b94508488111561158957600c95505050505050611593565b6000955050505050505b949350505050565b60006060600080600467ffffffffffffffff8111156115bd576115bc61217b565b5b6040519080825280602002602001820160405280156115eb5781602001602082028036833780820191505090505b50905060008060008060018a60018151811061160a57611609612727565b5b6020026020010151036116e1578a60008151811061162b5761162a612727565b5b602002602001015193508860038151811061164957611648612727565b5b602002602001015192506000830361167a578a60018151811061166f5761166e612727565b5b602002602001015192505b8860028151811061168e5761168d612727565b5b60200260200101518a6005815181106116aa576116a9612727565b5b60200260200101516116bc919061278a565b9050886005815181106116d2576116d1612727565b5b602002602001015191506117a7565b8a6001815181106116f5576116f4612727565b5b602002602001015192508860028151811061171357611712612727565b5b6020026020010151935060008403611744578a60008151811061173957611738612727565b5b602002602001015193505b8860028151811061175857611757612727565b5b60200260200101518a60058151811061177457611773612727565b5b6020026020010151611786919061278a565b91508860058151811061179c5761179b612727565b5b602002602001015190505b8a6004815181106117bb576117ba612727565b5b60200260200101518b6003815181106117d7576117d6612727565b5b60200260200101518c6002815181106117f3576117f2612727565b5b6020026020010151611805919061278a565b116118c457838560008151811061181f5761181e612727565b5b6020026020010181815250506118788d8d868e60038151811061184557611844612727565b5b60200260200101518f60028151811061186157611860612727565b5b6020026020010151611873919061278a565b610769565b8560018151811061188c5761188b612727565b5b6020026020010181815250506118a48e8e868561121f565b955060008660ff1611156118c357858597509750505050505050611a0a565b5b8a6005815181106118d8576118d7612727565b5b60200260200101518b6003815181106118f4576118f3612727565b5b60200260200101518c6002815181106119105761190f612727565b5b60200260200101516119229190612756565b106119fc576119748c8e858e60038151811061194157611940612727565b5b60200260200101518f60028151811061195d5761195c612727565b5b602002602001015161196f9190612756565b610769565b8560028151811061198857611987612727565b5b60200260200101818152505082856003815181106119a9576119a8612727565b5b6020026020010181815250506119dc8e8d876002815181106119ce576119cd612727565b5b60200260200101518461121f565b955060008660ff1611156119fb57858597509750505050505050611a0a565b5b600085975097505050505050505b965096945050505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611a5d576001600080925092509250611bc1565b6000735cec09f125f4839656164a5109bc076daabd6ed673ffffffffffffffffffffffffffffffffffffffff1663f41a710d876040518263ffffffff1660e01b8152600401611aac9190611e8f565b602060405180830381865afa158015611ac9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aed919061252f565b905060008103611b0857600260008093509350935050611bc1565b6000735cec09f125f4839656164a5109bc076daabd6ed673ffffffffffffffffffffffffffffffffffffffff1663f41a710d876040518263ffffffff1660e01b8152600401611b579190611e8f565b602060405180830381865afa158015611b74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b98919061252f565b905060008103611bb45760036000809450945094505050611bc1565b6000828294509450945050505b9250925092565b600080600080600080611bda8c61057f565b905060008160ff161115611bfa5780600080955095509550505050611d21565b735cec09f125f4839656164a5109bc076daabd6ed673ffffffffffffffffffffffffffffffffffffffff166365593d7b8c8c8c8c6040518563ffffffff1660e01b8152600401611c4d9493929190612676565b6040805180830381865afa158015611c69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c8d91906126e7565b809450819350505060018260ff1603611cc05786881115611cbb5760c8600080955095509550505050611d21565b611ce6565b86881015611cdb5760c8600080955095509550505050611d21565b8289809450819a5050505b611cf38c8c8b600061121f565b905060008160ff161115611d135780600080955095509550505050611d21565b606489849550955095505050505b96509650969350505050565b6040518060a00160405280600081526020016000815260200160008152602001600060ff168152602001600060ff1681525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611da182611d76565b9050919050565b611db181611d96565b8114611dbc57600080fd5b50565b600081359050611dce81611da8565b92915050565b60008060408385031215611deb57611dea611d6c565b5b6000611df985828601611dbf565b9250506020611e0a85828601611dbf565b9150509250929050565b600060ff82169050919050565b611e2a81611e14565b82525050565b6000819050919050565b611e4381611e30565b82525050565b6000606082019050611e5e6000830186611e21565b611e6b6020830185611e3a565b611e786040830184611e3a565b949350505050565b611e8981611d96565b82525050565b6000602082019050611ea46000830184611e80565b92915050565b600060208284031215611ec057611ebf611d6c565b5b6000611ece84828501611dbf565b91505092915050565b6000602082019050611eec6000830184611e21565b92915050565b611efb81611e30565b8114611f0657600080fd5b50565b600081359050611f1881611ef2565b92915050565b60008060008060808587031215611f3857611f37611d6c565b5b6000611f4687828801611dbf565b9450506020611f5787828801611dbf565b9350506040611f6887828801611f09565b9250506060611f7987828801611f09565b91505092959194509250565b6000602082019050611f9a6000830184611e3a565b92915050565b60008060008060008060008060006101208a8c031215611fc357611fc2611d6c565b5b6000611fd18c828d01611dbf565b9950506020611fe28c828d01611dbf565b9850506040611ff38c828d01611dbf565b97505060606120048c828d01611f09565b96505060806120158c828d01611f09565b95505060a06120268c828d01611f09565b94505060c06120378c828d01611f09565b93505060e06120488c828d01611f09565b92505061010061205a8c828d01611f09565b9150509295985092959850929598565b600080600080600080600080610100898b03121561208b5761208a611d6c565b5b60006120998b828c01611dbf565b98505060206120aa8b828c01611dbf565b97505060406120bb8b828c01611dbf565b96505060606120cc8b828c01611f09565b95505060806120dd8b828c01611f09565b94505060a06120ee8b828c01611f09565b93505060c06120ff8b828c01611f09565b92505060e06121108b828c01611f09565b9150509295985092959890939650565b60006080820190506121356000830187611e21565b6121426020830186611e21565b61214f6040830185611e3a565b61215c6060830184611e3a565b95945050505050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6121b38261216a565b810181811067ffffffffffffffff821117156121d2576121d161217b565b5b80604052505050565b60006121e5611d62565b90506121f182826121aa565b919050565b600067ffffffffffffffff8211156122115761221061217b565b5b602082029050602081019050919050565b600080fd5b600061223a612235846121f6565b6121db565b9050808382526020820190506020840283018581111561225d5761225c612222565b5b835b8181101561228657806122728882611f09565b84526020840193505060208101905061225f565b5050509392505050565b600082601f8301126122a5576122a4612165565b5b81356122b5848260208601612227565b91505092915050565b60008060008060008060c087890312156122db576122da611d6c565b5b60006122e989828a01611dbf565b96505060206122fa89828a01611dbf565b955050604061230b89828a01611dbf565b945050606087013567ffffffffffffffff81111561232c5761232b611d71565b5b61233889828a01612290565b935050608087013567ffffffffffffffff81111561235957612358611d71565b5b61236589828a01612290565b92505060a087013567ffffffffffffffff81111561238657612385611d71565b5b61239289828a01612290565b9150509295509295509295565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6123d481611e30565b82525050565b60006123e683836123cb565b60208301905092915050565b6000602082019050919050565b600061240a8261239f565b61241481856123aa565b935061241f836123bb565b8060005b8381101561245057815161243788826123da565b9750612442836123f2565b925050600181019050612423565b5085935050505092915050565b60006040820190506124726000830185611e21565b818103602083015261248481846123ff565b90509392505050565b60008060008060008060c087890312156124aa576124a9611d6c565b5b60006124b889828a01611dbf565b96505060206124c989828a01611dbf565b95505060406124da89828a01611dbf565b94505060606124eb89828a01611f09565b93505060806124fc89828a01611f09565b92505060a061250d89828a01611f09565b9150509295509295509295565b60008151905061252981611ef2565b92915050565b60006020828403121561254557612544611d6c565b5b60006125538482850161251a565b91505092915050565b60008151905061256b81611da8565b92915050565b60008060006060848603121561258a57612589611d6c565b5b60006125988682870161255c565b93505060206125a98682870161251a565b92505060406125ba8682870161251a565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006125fe82611e30565b915061260983611e30565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612642576126416125c4565b5b828202905092915050565b60006040820190506126626000830185611e80565b61266f6020830184611e80565b9392505050565b600060808201905061268b6000830187611e80565b6126986020830186611e80565b6126a56040830185611e3a565b6126b26060830184611e3a565b95945050505050565b6126c481611e14565b81146126cf57600080fd5b50565b6000815190506126e1816126bb565b92915050565b600080604083850312156126fe576126fd611d6c565b5b600061270c858286016126d2565b925050602061271d8582860161251a565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061276182611e30565b915061276c83611e30565b9250828203905081811115612784576127836125c4565b5b92915050565b600061279582611e30565b91506127a083611e30565b92508282019050808211156127b8576127b76125c4565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006127f882611e30565b915061280383611e30565b925082612813576128126127be565b5b82820490509291505056fea2646970667358221220ed6252715487b26854ef689c95ab3f1e03e13a7ce3392cfeff9f4bcce0f8ca8a64736f6c63430008100033