Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- TwoBearsBalances
- Optimization enabled
- false
- Compiler version
- v0.8.16+commit.07a7930e
- EVM Version
- default
- Verified at
- 2024-09-26T15:34:59.565881Z
Contract source code
// All rights reserved. // SPDX-License-Identifier: No License (None) pragma solidity ^0.8.16; interface IContractOrders { function createOrder(address _owner, address _token_in, uint _value_in, address _token_out, uint _value_out, uint8 _order_type, uint _price, uint _order_position, uint _dex_fee, uint _dex_num_exec_ord) external returns (uint256); } interface IERC20 { function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address to, uint256 value) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 value) external returns (bool); function transferFrom(address from, address to, uint256 value) external returns (bool); } interface IWCLO { function deposit() external payable; function withdraw(uint wad) external; } contract TwoBearsBalances { struct Tokens { uint256 minValue; // 32 байта - минимальное количество токена, доступное для торговли (ограничивает создание пылевых ордеров) uint8 standart; // 1 байта - стандарт токена uint8 decimal; // 1 байт - количество десятичных знаков uint16 priority; // 2 байта - приоритет токена для определения ценообразования (цена - отношение к токену с максимальным приоритетом) bytes8 symb; // 8 байт - аббревиатура токена address next; // 20 байт - адрес следующего токена (последний токен указывает на нулевой адрес) } uint256 commission = 4 * 1e17; // комиссионный процент взымаемый с каждого выполняемого ордера (оплачивается получаемым токеном, в процессе исполнения ордера). Кроме обмена между стеблкоинами. uint256 commissionStable = 2 * 1e16; // комиссионный процент взымаемый с каждого выполняемого ордера за обмены между стеблкоинами uint256 numExecutedOrders = 30; // максимальное количество ордеров которое можно выполнить за 1 транзакцию uint256 gasPrice = 1002 * 1e9; // максимальная цена газа для оплаты оракула (Gwei) uint256 gaslimit = 15000000; // максимальный лимит газа для оракула uint256 gasAdd = 95000; // добавочный газ который не может быть расчитан (вызов функции + вызов transferFrom в котором происходит оплата оракула). Так же этот газ должен оплатить владелец бота за разблокировку заблокированного бота mapping(address => Tokens) private tokens; // Односвязный список всех токенов на бирже address public owner = 0xeBE894814554c8382EA6a24CcDdf1527407A24f6; // Владелец address public constant contractOrders = 0xF9875BaDA6eD22c9d9f2926d9cC47dFb007633C7; // Контракт с книгами ордеров address public constant contractCommission = 0x469A2f6604b456110b486dA4950D032958FDE447; // Контракт куда поступают комиссии address public constant contractBots = 0x548b35327c2ECC6F8121fD9033306cA6E2DD787d; // Контракт ботов //address private constant firstToken = 0xbd2D3BCe975FD72E44A73cC8e834aD1B8441BdDa; // первый адрес в списке токенов это WCLO address private constant firstToken = 0xF5AD6F6EDeC824C7fD54A66d241a227F6503aD3a; // первый адрес в списке токенов это WCLO address private endToken = firstToken; // всегда указывает на последний токен в списке токенов modifier onlyOwner() { require(msg.sender == owner, "Only owner can call this"); _; } modifier onlyContractOrders() { require(msg.sender == contractOrders, "Only contract orders can call"); _; } constructor() { tokens[firstToken] = Tokens(1000 * 1e18, 223, 18, 50000, "WCLO", address(0x00)); IERC20(firstToken).approve(address(this), uint(int(-1))); //Даем разрешение нашему контракту тратить токен на своем балансе через TransferFrom } // Функции обработки поступающих средств (создание ордеров) receive() external payable { // принимаем нативную монету только от контракта, который ее оборачивал require(msg.sender == firstToken); } function createOrderNative(address _token_out, uint _value_out, uint _order_position) external payable { // создаем ордер через нативную монету IWCLO(firstToken).deposit{value: msg.value}(); // оборачиваем нативную монету от пользователя createOrderUser(msg.sender, firstToken, msg.value, _token_out, _value_out, _order_position); } function createOrderERC20(address _token_in, uint _value_in, address _token_out, uint _value_out, uint _order_position) external { //require(tokens[_token_in].standart > 0); // токен должен присутствовать в списке токенов IERC20(_token_in).transferFrom(msg.sender, address(this), _value_in); // контракт принимает входящий токен от пользователя createOrderUser(msg.sender, _token_in, _value_in, _token_out, _value_out, _order_position); } function tokenReceived(address _from, uint _value, bytes memory _data) public returns (bytes4) { // новый ERC223 //require(tokens[msg.sender].standart == 223); // токен должен присутствовать в списке токенов (address _token_out, uint _value_out, uint _order_position) = abi.decode(_data, (address, uint, uint)); createOrderUser(_from, msg.sender, _value, _token_out, _value_out, _order_position); return this.tokenReceived.selector; // возвращаем селектор этой функции } function createOrderUser(address _owner, address _token_in, uint _value_in, address _token_out, uint _value_out, uint _order_position) private returns (uint256){ // создание ордера от имени пользователя require((tokens[_token_in].standart > 0) && (tokens[_token_out].standart > 0)); // токены должны присутствовать в списке токенов require((_value_in > 0) && (_value_out > 0)); // количество входящего и получаемого токена должно быть больше 0 require(_token_in != _token_out); // токены не должны быть одинаковыми if(tokens[_token_in].priority < tokens[_token_out].priority){ // делаем проверку что ордера не пылевые - соответствуют минимальному значению по токену с максимальным приоритетом require(_value_out >= tokens[_token_out].minValue); } else{ require(_value_in >= tokens[_token_in].minValue); } (uint8 _order_type, uint256 _price) = getTypeAndPriceOrder(_token_in, _value_in, _token_out, _value_out); // Определяем тип ордера и его цену require(_price > 0); // запрещено ордеру иметь нулевую цену // определяемся с биржевой комиссией. Если происходит обмен между стеблкоинами, то комиссия берется commissionStable, в противном случае commission uint _commission = ((tokens[_token_in].priority > 59999) && (tokens[_token_out].priority > 59999)) ? commissionStable : commission; uint _id = IContractOrders(contractOrders).createOrder(_owner, _token_in, _value_in, _token_out, _value_out, _order_type, _price, _order_position, _commission, numExecutedOrders); return _id; } function withdraw(address _token, address _owner, uint _value) external onlyContractOrders // Выплата токена указанному владельцу { uint256 _size; assembly { _size := extcodesize(_owner) } // проверяем является ли адрес получателя контрактом if(_size > 0){ // если получатель это контракт, то выплачиваем токенами (нативная монета не разворачивается) if(_owner == contractBots){ IERC20(_token).transfer(_owner, _value); } else{ IERC20(_token).transferFrom(address(this), _owner, _value); } } else{ // пользователи (EOA) ордеров нативную монету получают в развернутом виде if(_token == firstToken){ // вывод нативного CLO IWCLO(_token).withdraw(_value); payable(_owner).transfer(_value); } else{ // вывод токена //IERC20(_token).transferFrom(address(this), _owner, _value); IERC20(_token).transfer(_owner, _value); } } } function withdrawFee(address _token, uint _value) external onlyContractOrders // Выплата комиссии за исполнение ордера { //IERC20(_token).approve(address(this), _value); //Даем разрешение нашему контракту тратить токен на своем балансе через TransferFrom //IERC20(_token).transferFrom(address(this), contractCommission, _value); IERC20(_token).transfer(contractCommission, _value); } // ФУНКЦИИ ВЛАДЕЛЬЦА function setFeesExchange(uint256 _newCommission, uint256 _newCommissionStable) external onlyOwner // установить новые проценты биржи { commission = _newCommission; // Установить общий процент биржи commissionStable = _newCommissionStable; // Установить процент биржи на обмен между стеблкоинами (приоритеты обоих токенов >= 60000) } function setNumExecutedOrders(uint256 _numExecutedOrders) external onlyOwner // установить максимальное количество исполняемых ордеров в пределах 1 транзакции { numExecutedOrders = _numExecutedOrders; } function setGasPriceGasLimitGasAdd(uint256 _gasPrice, uint256 _gaslimit, uint256 _gasAdd) external onlyOwner // установить новую цену газа, максимальный лимит газа и добавочный газ (для оракула) { gasPrice = _gasPrice; gaslimit = _gaslimit; gasAdd = _gasAdd; } function approveToken(address _token) external onlyOwner // Дать безлимитное разрешение нашему контракту тратить токен на своем балансе через TransferFrom { require(tokens[_token].standart > 0); IERC20(_token).approve(address(this), uint(int(-1))); // Даем разрешение нашему контракту тратить токен на своем балансе через TransferFrom } function addToken(address _newToken, uint8 _standart, uint16 _priority, uint256 _minValue) external onlyOwner // Добавление нового токена на dex { require(tokens[_newToken].standart == 0, "err: token exists"); // токен должен отсутствовать в списке токенов bytes8 _newSymb; string memory str = IERC20(_newToken).symbol(); assembly { _newSymb := mload(add(str, 32)) } tokens[_newToken] = Tokens(_minValue, _standart, IERC20(_newToken).decimals(), _priority, _newSymb, address(0x00)); tokens[endToken].next = _newToken; // связываем последний токен с новым токеном endToken = _newToken; // новый токен становится последним IERC20(_newToken).approve(address(this), uint(int(-1))); //Даем разрешение нашему контракту тратить токен на своем балансе через TransferFrom } function changeTokenMinValue(address _token, uint256 _minValue) external onlyOwner // Изменить минимальное количество токена, доступное для торговли { require(tokens[_token].standart > 0); // токен должен присутствовать в списке токенов tokens[_token].minValue = _minValue; } function delToken(address _delToken, address _prevToken) external onlyOwner // Делистинг токена { // _delToken - удаляемый токен, _prevToken - токен в списке перед удаляемым токеном require((_delToken != address(0)) && (_delToken != firstToken)); // Удаляемый токен не может быть нулевым адресом и WCLO require(tokens[_prevToken].next == _delToken); // предыдущий токен в списке должен указывать на удаляемый токен require(IERC20(_delToken).balanceOf(address(this)) == 0); // контракт не должен иметь баланс в удаляемом токене if(_delToken == endToken) endToken = _prevToken; // если удаляется последний токен в списке tokens[_prevToken].next = tokens[_delToken].next; // исключаем удаляемый токен из списка delete tokens[_delToken]; // чистим память, данная операция поощрается EVM и будет возвращено часть газа } function getTokensInfo(address _startToken, uint _elem) public view returns (Tokens[] memory) // Возвращаем _elem токенов на бирже от указанного адреса { Tokens[] memory result = new Tokens[](_elem); _startToken = tokens[_startToken].standart > 0 ? _startToken : firstToken; // определяем стартовую позицию address _nextToken; for(uint i; i < _elem; i++){ _nextToken = tokens[_startToken].next; result[i] = Tokens(tokens[_startToken].minValue, tokens[_startToken].standart, tokens[_startToken].decimal, tokens[_startToken].priority, tokens[_startToken].symb, tokens[_startToken].next); if(_nextToken == address(0x00)){ break; // достигли конца списка } else { _startToken = _nextToken; } } return (result); // возвращаем массив с инфой по токенам } function getTokenMinValue(address _token) public view returns (uint256) // вернуть минимальное количество токена, доступное для торговли { return (tokens[_token].minValue); } function getTokenPriority(address _token) public view returns (uint256) // вернуть приоритет токена { return (tokens[_token].priority); } function getBalancesByTokens(address[] calldata _tokens, address _owner) public view returns (uint [] memory) // вернуть баланс всех токенов из массива и в конец массива добавить баланс нативной монеты { uint[] memory result = new uint[](_tokens.length + 1); // Добавочный элемент для хранения баланса нативной монеты for(uint i; i < _tokens.length; i++){ result[i] = IERC20(_tokens[i]).balanceOf(_owner); } result[_tokens.length] = _owner.balance; // получаем баланс адреса в нативной монете return (result); } function getFeesAndNumExecOrd() public view returns (uint256, uint256, uint256) // вернуть процент биржи, процент биржи при обмене между стеблами и максимальное количество исполняемых ордеров за 1 транзакцию { return (commission, commissionStable, numExecutedOrders); } function getTypeAndPriceOrder(address _token_in, uint _value_in, address _token_out, uint _value_out) public view returns (uint8, uint256) // вернуть тип ордера и цену ордера { uint8 _order_type = tokens[_token_in].priority < tokens[_token_out].priority ? 1 : 2; // тип ордера (1 - продажа, 2 - покупка) uint256 res = _order_type == 1 ? _value_out * (10**tokens[_token_in].decimal) / _value_in : _value_in * (10**tokens[_token_out].decimal) / _value_out; // расчет цены ордера return (_order_type, res); } // ФУНКЦИИ БОТОВ function getTypeAndValue(address _token_in, address _token_out, uint _value, uint _price) public view returns (uint8, uint256) // вернуть тип ордера и объем токена с наивысшим приоритетом { // _value - объем токена с наименьшим приоритетом // _price - цена в токене с максимальным приоритетом uint8 _order_type = tokens[_token_in].priority < tokens[_token_out].priority ? 1 : 2; // тип ордера (1 - продажа, 2 - покупка) uint256 res = _order_type == 1 ? _price * _value / (10**tokens[_token_in].decimal) : _price * _value / (10**tokens[_token_out].decimal); // расчет входящего / выходящего объема return (_order_type, res); } function getWrappedAndPricelimit() public view returns (address, uint256, uint256) // функция возвращает адрес обернутой нативной монеты, цену газа и лимит газа (максималка для оракула) { return (firstToken, gasPrice, gaslimit); } function getPriceAndGasAdd() public view returns (uint256, uint256) // функция возвращает цену газа и добавочный газ (это газ за создание транзакции + выплата оракулу). Также столько газа надо передать оракулу за разблокировку бота { return (gasPrice, gasAdd); } function payTheOracle(address _owner, address _oracle, uint _gasUsed) external returns (uint256){ // оплатить работу оракула. Возвращает количество нативной монеты что была выплачена оракулу require(msg.sender == contractBots); // Только контракт ботов имеет право вызывать эту функцию uint _value; // оплата работы бота if(_owner != _oracle){ // Владелец бота должен оплатить газ создателю транзакции (оплата обернутой нативной монетой) _value = (_gasUsed + gasAdd) * gasPrice; // (газ затраченый оракулом + добавочный газ) * цену газа IERC20(firstToken).transferFrom(_owner, _oracle, _value); } return _value; // возвращаем сколько обернутой нативной монеты выплачено оракулу } function createOrderBot(address _owner, address _token_in, uint _value_in, address _token_out, uint _value_out, uint _order_position) external returns (uint256){ // создание ордера от имени бота require(msg.sender == contractBots); // Только контракт ботов имеет право на создание ордеров IERC20(_token_in).transferFrom(_owner, address(this), _value_in); // контракт принимает входящий токен от владельца бота (uint8 _order_type, uint256 _price) = getTypeAndPriceOrder(_token_in, _value_in, _token_out, _value_out); // Определяем тип ордера и его цену // определяемся с биржевой комиссией. Если происходит обмен между стеблкоинами, то комиссия берется commissionStable, в противном случае commission uint _commission = ((tokens[_token_in].priority > 59999) && (tokens[_token_out].priority > 59999)) ? commissionStable : commission; uint _id = IContractOrders(contractOrders).createOrder(msg.sender, _token_in, _value_in, _token_out, _value_out, _order_type, _price, _order_position, _commission, numExecutedOrders); return _id; } }
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addToken","inputs":[{"type":"address","name":"_newToken","internalType":"address"},{"type":"uint8","name":"_standart","internalType":"uint8"},{"type":"uint16","name":"_priority","internalType":"uint16"},{"type":"uint256","name":"_minValue","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"approveToken","inputs":[{"type":"address","name":"_token","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"changeTokenMinValue","inputs":[{"type":"address","name":"_token","internalType":"address"},{"type":"uint256","name":"_minValue","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"contractBots","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"contractCommission","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"contractOrders","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"createOrderBot","inputs":[{"type":"address","name":"_owner","internalType":"address"},{"type":"address","name":"_token_in","internalType":"address"},{"type":"uint256","name":"_value_in","internalType":"uint256"},{"type":"address","name":"_token_out","internalType":"address"},{"type":"uint256","name":"_value_out","internalType":"uint256"},{"type":"uint256","name":"_order_position","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"createOrderERC20","inputs":[{"type":"address","name":"_token_in","internalType":"address"},{"type":"uint256","name":"_value_in","internalType":"uint256"},{"type":"address","name":"_token_out","internalType":"address"},{"type":"uint256","name":"_value_out","internalType":"uint256"},{"type":"uint256","name":"_order_position","internalType":"uint256"}]},{"type":"function","stateMutability":"payable","outputs":[],"name":"createOrderNative","inputs":[{"type":"address","name":"_token_out","internalType":"address"},{"type":"uint256","name":"_value_out","internalType":"uint256"},{"type":"uint256","name":"_order_position","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"delToken","inputs":[{"type":"address","name":"_delToken","internalType":"address"},{"type":"address","name":"_prevToken","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256[]","name":"","internalType":"uint256[]"}],"name":"getBalancesByTokens","inputs":[{"type":"address[]","name":"_tokens","internalType":"address[]"},{"type":"address","name":"_owner","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"}],"name":"getFeesAndNumExecOrd","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"}],"name":"getPriceAndGasAdd","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getTokenMinValue","inputs":[{"type":"address","name":"_token","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getTokenPriority","inputs":[{"type":"address","name":"_token","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple[]","name":"","internalType":"struct TwoBearsBalances.Tokens[]","components":[{"type":"uint256","name":"minValue","internalType":"uint256"},{"type":"uint8","name":"standart","internalType":"uint8"},{"type":"uint8","name":"decimal","internalType":"uint8"},{"type":"uint16","name":"priority","internalType":"uint16"},{"type":"bytes8","name":"symb","internalType":"bytes8"},{"type":"address","name":"next","internalType":"address"}]}],"name":"getTokensInfo","inputs":[{"type":"address","name":"_startToken","internalType":"address"},{"type":"uint256","name":"_elem","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"},{"type":"uint256","name":"","internalType":"uint256"}],"name":"getTypeAndPriceOrder","inputs":[{"type":"address","name":"_token_in","internalType":"address"},{"type":"uint256","name":"_value_in","internalType":"uint256"},{"type":"address","name":"_token_out","internalType":"address"},{"type":"uint256","name":"_value_out","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"},{"type":"uint256","name":"","internalType":"uint256"}],"name":"getTypeAndValue","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"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"}],"name":"getWrappedAndPricelimit","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"payTheOracle","inputs":[{"type":"address","name":"_owner","internalType":"address"},{"type":"address","name":"_oracle","internalType":"address"},{"type":"uint256","name":"_gasUsed","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setFeesExchange","inputs":[{"type":"uint256","name":"_newCommission","internalType":"uint256"},{"type":"uint256","name":"_newCommissionStable","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setGasPriceGasLimitGasAdd","inputs":[{"type":"uint256","name":"_gasPrice","internalType":"uint256"},{"type":"uint256","name":"_gaslimit","internalType":"uint256"},{"type":"uint256","name":"_gasAdd","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setNumExecutedOrders","inputs":[{"type":"uint256","name":"_numExecutedOrders","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bytes4","name":"","internalType":"bytes4"}],"name":"tokenReceived","inputs":[{"type":"address","name":"_from","internalType":"address"},{"type":"uint256","name":"_value","internalType":"uint256"},{"type":"bytes","name":"_data","internalType":"bytes"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdraw","inputs":[{"type":"address","name":"_token","internalType":"address"},{"type":"address","name":"_owner","internalType":"address"},{"type":"uint256","name":"_value","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdrawFee","inputs":[{"type":"address","name":"_token","internalType":"address"},{"type":"uint256","name":"_value","internalType":"uint256"}]},{"type":"receive","stateMutability":"payable"}]
Contract Creation Code
0x608060405267058d15e17628000060005566470de4df820000600155601e60025564e94bdaa40060035562e4e1c06004556201731860055573ebe894814554c8382ea6a24ccddf1527407a24f6600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073f5ad6f6edec824c7fd54a66d241a227f6503ad3a600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000ee57600080fd5b506040518060c00160405280683635c9adc5dea00000815260200160df60ff168152602001601260ff16815260200161c35061ffff1681526020017f57434c4f0000000000000000000000000000000000000000000000000000000077ffffffffffffffffffffffffffffffffffffffffffffffff19168152602001600073ffffffffffffffffffffffffffffffffffffffff168152506006600073f5ad6f6edec824c7fd54a66d241a227f6503ad3a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010160006101000a81548160ff021916908360ff16021790555060408201518160010160016101000a81548160ff021916908360ff16021790555060608201518160010160026101000a81548161ffff021916908361ffff16021790555060808201518160010160046101000a81548167ffffffffffffffff021916908360c01c021790555060a082015181600101600c6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555090505073f5ad6f6edec824c7fd54a66d241a227f6503ad3a73ffffffffffffffffffffffffffffffffffffffff1663095ea7b3307fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016200032a929190620003d7565b6020604051808303816000875af11580156200034a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000370919062000446565b5062000478565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620003a48262000377565b9050919050565b620003b68162000397565b82525050565b6000819050919050565b620003d181620003bc565b82525050565b6000604082019050620003ee6000830185620003ab565b620003fd6020830184620003c6565b9392505050565b600080fd5b60008115159050919050565b620004208162000409565b81146200042c57600080fd5b50565b600081519050620004408162000415565b92915050565b6000602082840312156200045f576200045e62000404565b5b60006200046f848285016200042f565b91505092915050565b61421380620004886000396000f3fe6080604052600436106101a05760003560e01c80637c0b052a116100ec57806399c2067c1161008a578063e06b440011610064578063e06b440014610639578063f3f9d41a14610664578063f41a710d146106a1578063fd9be522146106de576101f3565b806399c2067c146105be578063bfdf0bd7146105e7578063d9caed1214610610576101f3565b80638943ec02116100c65780638943ec02146105115780638b43f4451461054e5780638da5cb5b1461056a578063944d44ab14610595576101f3565b80637c0b052a1461048257806380b2edd8146104bf57806381e1c10b146104e8576101f3565b80632709275e11610159578063508784051161013357806350878405146103ad578063624ff298146103da57806365593d7b146104065780636655580414610444576101f3565b80632709275e1461032a5780634b4265a3146103555780634c1129bc14610382576101f3565b80631a180bb6146101f85780631f2bff681461022157806322fe7c6f1461025e57806323c5036b1461029b57806324bd3e8f146102c457806326c28edf146102ed576101f3565b366101f35773f5ad6f6edec824c7fd54a66d241a227f6503ad3a73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146101f157600080fd5b005b600080fd5b34801561020457600080fd5b5061021f600480360381019061021a9190612ea7565b610707565b005b34801561022d57600080fd5b5061024860048036038101906102439190612ea7565b610841565b60405161025591906130a3565b60405180910390f35b34801561026a57600080fd5b50610285600480360381019061028091906130c5565b610c42565b6040516102929190613161565b60405180910390f35b3480156102a757600080fd5b506102c260048036038101906102bd919061317c565b610eab565b005b3480156102d057600080fd5b506102eb60048036038101906102e691906131f7565b610f42565b005b3480156102f957600080fd5b50610314600480360381019061030f9190613289565b610fdc565b6040516103219190613398565b60405180910390f35b34801561033657600080fd5b5061033f611161565b60405161034c91906133c9565b60405180910390f35b34801561036157600080fd5b5061036a611179565b604051610379939291906133e4565b60405180910390f35b34801561038e57600080fd5b506103976111a4565b6040516103a491906133c9565b60405180910390f35b3480156103b957600080fd5b506103c26111bc565b6040516103d19392919061341b565b60405180910390f35b3480156103e657600080fd5b506103ef6111d4565b6040516103fd929190613452565b60405180910390f35b34801561041257600080fd5b5061042d6004803603810190610428919061347b565b6111e5565b60405161043b9291906134f1565b60405180910390f35b34801561045057600080fd5b5061046b6004803603810190610466919061351a565b6113af565b6040516104799291906134f1565b60405180910390f35b34801561048e57600080fd5b506104a960048036038101906104a49190613581565b611579565b6040516104b69190613161565b60405180910390f35b3480156104cb57600080fd5b506104e660048036038101906104e191906135d4565b6116ba565b005b3480156104f457600080fd5b5061050f600480360381019061050a9190613601565b61184b565b005b34801561051d57600080fd5b5061053860048036038101906105339190613782565b611cc8565b604051610545919061382c565b60405180910390f35b61056860048036038101906105639190613847565b611d0b565b005b34801561057657600080fd5b5061057f611da8565b60405161058c91906133c9565b60405180910390f35b3480156105a157600080fd5b506105bc60048036038101906105b7919061389a565b611dce565b005b3480156105ca57600080fd5b506105e560048036038101906105e091906138ed565b611e78565b005b3480156105f357600080fd5b5061060e60048036038101906106099190613985565b611f1a565b005b34801561061c57600080fd5b5061063760048036038101906106329190613581565b612441565b005b34801561064557600080fd5b5061064e6127a9565b60405161065b91906133c9565b60405180910390f35b34801561067057600080fd5b5061068b600480360381019061068691906135d4565b6127c1565b6040516106989190613161565b60405180910390f35b3480156106ad57600080fd5b506106c860048036038101906106c391906135d4565b61281f565b6040516106d59190613161565b60405180910390f35b3480156106ea57600080fd5b5061070560048036038101906107009190612ea7565b61286b565b005b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610797576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078e90613a49565b60405180910390fd5b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff1660ff16116107f657600080fd5b80600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055505050565b606060008267ffffffffffffffff81111561085f5761085e613657565b5b60405190808252806020026020018201604052801561089857816020015b610885612d8e565b81526020019060019003908161087d5790505b5090506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff1660ff161161090f5773f5ad6f6edec824c7fd54a66d241a227f6503ad3a610911565b835b93506000805b84811015610c3657600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506040518060c00160405280600660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001548152602001600660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff1660ff168152602001600660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160019054906101000a900460ff1660ff168152602001600660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160029054906101000a900461ffff1661ffff168152602001600660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160049054906101000a900460c01b77ffffffffffffffffffffffffffffffffffffffffffffffff19168152602001600660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250838281518110610be057610bdf613a69565b5b6020026020010181905250600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160315610c36578195508080610c2e90613ac7565b915050610917565b50819250505092915050565b600073548b35327c2ecc6f8121fd9033306ca6e2dd787d73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c9057600080fd5b8573ffffffffffffffffffffffffffffffffffffffff166323b872dd8830886040518463ffffffff1660e01b8152600401610ccd93929190613b0f565b6020604051808303816000875af1158015610cec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d109190613b7e565b50600080610d20888888886113af565b91509150600061ea5f600660008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160029054906101000a900461ffff1661ffff16118015610de0575061ea5f600660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160029054906101000a900461ffff1661ffff16115b610dec57600054610df0565b6001545b9050600073f9875bada6ed22c9d9f2926d9cc47dfb007633c773ffffffffffffffffffffffffffffffffffffffff166347402bea338c8c8c8c8a8a8e8b6002546040518b63ffffffff1660e01b8152600401610e559a99989796959493929190613bab565b6020604051808303816000875af1158015610e74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e989190613c5c565b9050809450505050509695505050505050565b8473ffffffffffffffffffffffffffffffffffffffff166323b872dd3330876040518463ffffffff1660e01b8152600401610ee893929190613b0f565b6020604051808303816000875af1158015610f07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2b9190613b7e565b50610f3a338686868686612984565b505050505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610fd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc990613a49565b60405180910390fd5b8060028190555050565b60606000600185859050610ff09190613c89565b67ffffffffffffffff81111561100957611008613657565b5b6040519080825280602002602001820160405280156110375781602001602082028036833780820191505090505b50905060005b8585905081101561111b5785858281811061105b5761105a613a69565b5b905060200201602081019061107091906135d4565b73ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b81526004016110a891906133c9565b602060405180830381865afa1580156110c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110e99190613c5c565b8282815181106110fc576110fb613a69565b5b602002602001018181525050808061111390613ac7565b91505061103d565b508273ffffffffffffffffffffffffffffffffffffffff163181868690508151811061114a57611149613a69565b5b602002602001018181525050809150509392505050565b73469a2f6604b456110b486da4950d032958fde44781565b600080600073f5ad6f6edec824c7fd54a66d241a227f6503ad3a600354600454925092509250909192565b73548b35327c2ecc6f8121fd9033306ca6e2dd787d81565b60008060008054600154600254925092509250909192565b600080600354600554915091509091565b6000806000600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160029054906101000a900461ffff1661ffff16600660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160029054906101000a900461ffff1661ffff16106112a05760026112a3565b60015b9050600060018260ff161461132957600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160019054906101000a900460ff16600a61130e9190613df0565b868661131a9190613e3b565b6113249190613ec4565b61139c565b600660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160019054906101000a900460ff16600a6113859190613df0565b86866113919190613e3b565b61139b9190613ec4565b5b9050818193509350505094509492505050565b6000806000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160029054906101000a900461ffff1661ffff16600660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160029054906101000a900461ffff1661ffff161061146a57600261146d565b60015b9050600060018260ff16146114f35784600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160019054906101000a900460ff16600a6114d99190613df0565b886114e49190613e3b565b6114ee9190613ec4565b611566565b86600660008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160019054906101000a900460ff16600a6115509190613df0565b8661155b9190613e3b565b6115659190613ec4565b5b9050818193509350505094509492505050565b600073548b35327c2ecc6f8121fd9033306ca6e2dd787d73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115c757600080fd5b60008373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146116af576003546005548461160d9190613c89565b6116179190613e3b565b905073f5ad6f6edec824c7fd54a66d241a227f6503ad3a73ffffffffffffffffffffffffffffffffffffffff166323b872dd8686846040518463ffffffff1660e01b815260040161166a93929190613b0f565b6020604051808303816000875af1158015611689573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ad9190613b7e565b505b809150509392505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461174a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174190613a49565b60405180910390fd5b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff1660ff16116117a957600080fd5b8073ffffffffffffffffffffffffffffffffffffffff1663095ea7b3307fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401611804929190613ef5565b6020604051808303816000875af1158015611823573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118479190613b7e565b5050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146118db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d290613a49565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015611958575073f5ad6f6edec824c7fd54a66d241a227f6503ad3a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b61196157600080fd5b8173ffffffffffffffffffffffffffffffffffffffff16600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146119fb57600080fd5b60008273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611a3691906133c9565b602060405180830381865afa158015611a53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a779190613c5c565b14611a8157600080fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611b185780600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101600c6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000808201600090556001820160006101000a81549060ff02191690556001820160016101000a81549060ff02191690556001820160026101000a81549061ffff02191690556001820160046101000a81549067ffffffffffffffff021916905560018201600c6101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550505050565b60008060008084806020019051810190611ce29190613f5c565b925092509250611cf6873388868686612984565b50638943ec0260e01b93505050509392505050565b73f5ad6f6edec824c7fd54a66d241a227f6503ad3a73ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015611d6757600080fd5b505af1158015611d7b573d6000803e3d6000fd5b5050505050611da23373f5ad6f6edec824c7fd54a66d241a227f6503ad3a34868686612984565b50505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611e5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5590613a49565b60405180910390fd5b826003819055508160048190555080600581905550505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eff90613a49565b60405180910390fd5b81600081905550806001819055505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611faa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa190613a49565b60405180910390fd5b6000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff1660ff161461203f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203690613ffb565b60405180910390fd5b6000808573ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa15801561208d573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906120b691906140e6565b9050602081015191506040518060c001604052808481526020018660ff1681526020018773ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612124573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121489190614144565b60ff1681526020018561ffff1681526020018377ffffffffffffffffffffffffffffffffffffffffffffffff19168152602001600073ffffffffffffffffffffffffffffffffffffffff16815250600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010160006101000a81548160ff021916908360ff16021790555060408201518160010160016101000a81548160ff021916908360ff16021790555060608201518160010160026101000a81548161ffff021916908361ffff16021790555060808201518160010160046101000a81548167ffffffffffffffff021916908360c01c021790555060a082015181600101600c6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050508560066000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101600c6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508573ffffffffffffffffffffffffffffffffffffffff1663095ea7b3307fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016123f5929190613ef5565b6020604051808303816000875af1158015612414573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124389190613b7e565b50505050505050565b73f9875bada6ed22c9d9f2926d9cc47dfb007633c773ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146124c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ba906141bd565b60405180910390fd5b6000823b905060008111156126245773548b35327c2ecc6f8121fd9033306ca6e2dd787d73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361259d578373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84846040518363ffffffff1660e01b8152600401612554929190613ef5565b6020604051808303816000875af1158015612573573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125979190613b7e565b5061261f565b8373ffffffffffffffffffffffffffffffffffffffff166323b872dd3085856040518463ffffffff1660e01b81526004016125da93929190613b0f565b6020604051808303816000875af11580156125f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061261d9190613b7e565b505b6127a3565b73f5ad6f6edec824c7fd54a66d241a227f6503ad3a73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612722578373ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b81526004016126a49190613161565b600060405180830381600087803b1580156126be57600080fd5b505af11580156126d2573d6000803e3d6000fd5b505050508273ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f1935050505015801561271c573d6000803e3d6000fd5b506127a2565b8373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84846040518363ffffffff1660e01b815260040161275d929190613ef5565b6020604051808303816000875af115801561277c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127a09190613b7e565b505b5b50505050565b73f9875bada6ed22c9d9f2926d9cc47dfb007633c781565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160029054906101000a900461ffff1661ffff169050919050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050919050565b73f9875bada6ed22c9d9f2926d9cc47dfb007633c773ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146128ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e4906141bd565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb73469a2f6604b456110b486da4950d032958fde447836040518363ffffffff1660e01b815260040161293c929190613ef5565b6020604051808303816000875af115801561295b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061297f9190613b7e565b505050565b600080600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff1660ff16118015612a3957506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff1660ff16115b612a4257600080fd5b600085118015612a525750600083115b612a5b57600080fd5b8373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1603612a9357600080fd5b600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160029054906101000a900461ffff1661ffff16600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160029054906101000a900461ffff1661ffff161015612b9757600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154831015612b9257600080fd5b612be7565b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154851015612be657600080fd5b5b600080612bf6888888886113af565b9150915060008111612c0757600080fd5b600061ea5f600660008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160029054906101000a900461ffff1661ffff16118015612cc3575061ea5f600660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160029054906101000a900461ffff1661ffff16115b612ccf57600054612cd3565b6001545b9050600073f9875bada6ed22c9d9f2926d9cc47dfb007633c773ffffffffffffffffffffffffffffffffffffffff166347402bea8c8c8c8c8c8a8a8e8b6002546040518b63ffffffff1660e01b8152600401612d389a99989796959493929190613bab565b6020604051808303816000875af1158015612d57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d7b9190613c5c565b9050809450505050509695505050505050565b6040518060c0016040528060008152602001600060ff168152602001600060ff168152602001600061ffff168152602001600077ffffffffffffffffffffffffffffffffffffffffffffffff19168152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612e3e82612e13565b9050919050565b612e4e81612e33565b8114612e5957600080fd5b50565b600081359050612e6b81612e45565b92915050565b6000819050919050565b612e8481612e71565b8114612e8f57600080fd5b50565b600081359050612ea181612e7b565b92915050565b60008060408385031215612ebe57612ebd612e09565b5b6000612ecc85828601612e5c565b9250506020612edd85828601612e92565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612f1c81612e71565b82525050565b600060ff82169050919050565b612f3881612f22565b82525050565b600061ffff82169050919050565b612f5581612f3e565b82525050565b60007fffffffffffffffff00000000000000000000000000000000000000000000000082169050919050565b612f9081612f5b565b82525050565b612f9f81612e33565b82525050565b60c082016000820151612fbb6000850182612f13565b506020820151612fce6020850182612f2f565b506040820151612fe16040850182612f2f565b506060820151612ff46060850182612f4c565b5060808201516130076080850182612f87565b5060a082015161301a60a0850182612f96565b50505050565b600061302c8383612fa5565b60c08301905092915050565b6000602082019050919050565b600061305082612ee7565b61305a8185612ef2565b935061306583612f03565b8060005b8381101561309657815161307d8882613020565b975061308883613038565b925050600181019050613069565b5085935050505092915050565b600060208201905081810360008301526130bd8184613045565b905092915050565b60008060008060008060c087890312156130e2576130e1612e09565b5b60006130f089828a01612e5c565b965050602061310189828a01612e5c565b955050604061311289828a01612e92565b945050606061312389828a01612e5c565b935050608061313489828a01612e92565b92505060a061314589828a01612e92565b9150509295509295509295565b61315b81612e71565b82525050565b60006020820190506131766000830184613152565b92915050565b600080600080600060a0868803121561319857613197612e09565b5b60006131a688828901612e5c565b95505060206131b788828901612e92565b94505060406131c888828901612e5c565b93505060606131d988828901612e92565b92505060806131ea88828901612e92565b9150509295509295909350565b60006020828403121561320d5761320c612e09565b5b600061321b84828501612e92565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261324957613248613224565b5b8235905067ffffffffffffffff81111561326657613265613229565b5b6020830191508360208202830111156132825761328161322e565b5b9250929050565b6000806000604084860312156132a2576132a1612e09565b5b600084013567ffffffffffffffff8111156132c0576132bf612e0e565b5b6132cc86828701613233565b935093505060206132df86828701612e5c565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60006133218383612f13565b60208301905092915050565b6000602082019050919050565b6000613345826132e9565b61334f81856132f4565b935061335a83613305565b8060005b8381101561338b5781516133728882613315565b975061337d8361332d565b92505060018101905061335e565b5085935050505092915050565b600060208201905081810360008301526133b2818461333a565b905092915050565b6133c381612e33565b82525050565b60006020820190506133de60008301846133ba565b92915050565b60006060820190506133f960008301866133ba565b6134066020830185613152565b6134136040830184613152565b949350505050565b60006060820190506134306000830186613152565b61343d6020830185613152565b61344a6040830184613152565b949350505050565b60006040820190506134676000830185613152565b6134746020830184613152565b9392505050565b6000806000806080858703121561349557613494612e09565b5b60006134a387828801612e5c565b94505060206134b487828801612e5c565b93505060406134c587828801612e92565b92505060606134d687828801612e92565b91505092959194509250565b6134eb81612f22565b82525050565b600060408201905061350660008301856134e2565b6135136020830184613152565b9392505050565b6000806000806080858703121561353457613533612e09565b5b600061354287828801612e5c565b945050602061355387828801612e92565b935050604061356487828801612e5c565b925050606061357587828801612e92565b91505092959194509250565b60008060006060848603121561359a57613599612e09565b5b60006135a886828701612e5c565b93505060206135b986828701612e5c565b92505060406135ca86828701612e92565b9150509250925092565b6000602082840312156135ea576135e9612e09565b5b60006135f884828501612e5c565b91505092915050565b6000806040838503121561361857613617612e09565b5b600061362685828601612e5c565b925050602061363785828601612e5c565b9150509250929050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61368f82613646565b810181811067ffffffffffffffff821117156136ae576136ad613657565b5b80604052505050565b60006136c1612dff565b90506136cd8282613686565b919050565b600067ffffffffffffffff8211156136ed576136ec613657565b5b6136f682613646565b9050602081019050919050565b82818337600083830152505050565b6000613725613720846136d2565b6136b7565b90508281526020810184848401111561374157613740613641565b5b61374c848285613703565b509392505050565b600082601f83011261376957613768613224565b5b8135613779848260208601613712565b91505092915050565b60008060006060848603121561379b5761379a612e09565b5b60006137a986828701612e5c565b93505060206137ba86828701612e92565b925050604084013567ffffffffffffffff8111156137db576137da612e0e565b5b6137e786828701613754565b9150509250925092565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613826816137f1565b82525050565b6000602082019050613841600083018461381d565b92915050565b6000806000606084860312156138605761385f612e09565b5b600061386e86828701612e5c565b935050602061387f86828701612e92565b925050604061389086828701612e92565b9150509250925092565b6000806000606084860312156138b3576138b2612e09565b5b60006138c186828701612e92565b93505060206138d286828701612e92565b92505060406138e386828701612e92565b9150509250925092565b6000806040838503121561390457613903612e09565b5b600061391285828601612e92565b925050602061392385828601612e92565b9150509250929050565b61393681612f22565b811461394157600080fd5b50565b6000813590506139538161392d565b92915050565b61396281612f3e565b811461396d57600080fd5b50565b60008135905061397f81613959565b92915050565b6000806000806080858703121561399f5761399e612e09565b5b60006139ad87828801612e5c565b94505060206139be87828801613944565b93505060406139cf87828801613970565b92505060606139e087828801612e92565b91505092959194509250565b600082825260208201905092915050565b7f4f6e6c79206f776e65722063616e2063616c6c20746869730000000000000000600082015250565b6000613a336018836139ec565b9150613a3e826139fd565b602082019050919050565b60006020820190508181036000830152613a6281613a26565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613ad282612e71565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613b0457613b03613a98565b5b600182019050919050565b6000606082019050613b2460008301866133ba565b613b3160208301856133ba565b613b3e6040830184613152565b949350505050565b60008115159050919050565b613b5b81613b46565b8114613b6657600080fd5b50565b600081519050613b7881613b52565b92915050565b600060208284031215613b9457613b93612e09565b5b6000613ba284828501613b69565b91505092915050565b600061014082019050613bc1600083018d6133ba565b613bce602083018c6133ba565b613bdb604083018b613152565b613be8606083018a6133ba565b613bf56080830189613152565b613c0260a08301886134e2565b613c0f60c0830187613152565b613c1c60e0830186613152565b613c2a610100830185613152565b613c38610120830184613152565b9b9a5050505050505050505050565b600081519050613c5681612e7b565b92915050565b600060208284031215613c7257613c71612e09565b5b6000613c8084828501613c47565b91505092915050565b6000613c9482612e71565b9150613c9f83612e71565b9250828201905080821115613cb757613cb6613a98565b5b92915050565b60008160011c9050919050565b6000808291508390505b6001851115613d1457808604811115613cf057613cef613a98565b5b6001851615613cff5780820291505b8081029050613d0d85613cbd565b9450613cd4565b94509492505050565b600082613d2d5760019050613de9565b81613d3b5760009050613de9565b8160018114613d515760028114613d5b57613d8a565b6001915050613de9565b60ff841115613d6d57613d6c613a98565b5b8360020a915084821115613d8457613d83613a98565b5b50613de9565b5060208310610133831016604e8410600b8410161715613dbf5782820a905083811115613dba57613db9613a98565b5b613de9565b613dcc8484846001613cca565b92509050818404811115613de357613de2613a98565b5b81810290505b9392505050565b6000613dfb82612e71565b9150613e0683612f22565b9250613e337fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484613d1d565b905092915050565b6000613e4682612e71565b9150613e5183612e71565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e8a57613e89613a98565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613ecf82612e71565b9150613eda83612e71565b925082613eea57613ee9613e95565b5b828204905092915050565b6000604082019050613f0a60008301856133ba565b613f176020830184613152565b9392505050565b6000613f2982612e13565b9050919050565b613f3981613f1e565b8114613f4457600080fd5b50565b600081519050613f5681613f30565b92915050565b600080600060608486031215613f7557613f74612e09565b5b6000613f8386828701613f47565b9350506020613f9486828701613c47565b9250506040613fa586828701613c47565b9150509250925092565b7f6572723a20746f6b656e20657869737473000000000000000000000000000000600082015250565b6000613fe56011836139ec565b9150613ff082613faf565b602082019050919050565b6000602082019050818103600083015261401481613fd8565b9050919050565b600067ffffffffffffffff82111561403657614035613657565b5b61403f82613646565b9050602081019050919050565b60005b8381101561406a57808201518184015260208101905061404f565b60008484015250505050565b60006140896140848461401b565b6136b7565b9050828152602081018484840111156140a5576140a4613641565b5b6140b084828561404c565b509392505050565b600082601f8301126140cd576140cc613224565b5b81516140dd848260208601614076565b91505092915050565b6000602082840312156140fc576140fb612e09565b5b600082015167ffffffffffffffff81111561411a57614119612e0e565b5b614126848285016140b8565b91505092915050565b60008151905061413e8161392d565b92915050565b60006020828403121561415a57614159612e09565b5b60006141688482850161412f565b91505092915050565b7f4f6e6c7920636f6e7472616374206f72646572732063616e2063616c6c000000600082015250565b60006141a7601d836139ec565b91506141b282614171565b602082019050919050565b600060208201905081810360008301526141d68161419a565b905091905056fea2646970667358221220c7195dd46638a1887d60787e42068a1f0c74599e4e933b3c980b0fa2727ba4b564736f6c63430008100033
Deployed ByteCode
0x6080604052600436106101a05760003560e01c80637c0b052a116100ec57806399c2067c1161008a578063e06b440011610064578063e06b440014610639578063f3f9d41a14610664578063f41a710d146106a1578063fd9be522146106de576101f3565b806399c2067c146105be578063bfdf0bd7146105e7578063d9caed1214610610576101f3565b80638943ec02116100c65780638943ec02146105115780638b43f4451461054e5780638da5cb5b1461056a578063944d44ab14610595576101f3565b80637c0b052a1461048257806380b2edd8146104bf57806381e1c10b146104e8576101f3565b80632709275e11610159578063508784051161013357806350878405146103ad578063624ff298146103da57806365593d7b146104065780636655580414610444576101f3565b80632709275e1461032a5780634b4265a3146103555780634c1129bc14610382576101f3565b80631a180bb6146101f85780631f2bff681461022157806322fe7c6f1461025e57806323c5036b1461029b57806324bd3e8f146102c457806326c28edf146102ed576101f3565b366101f35773f5ad6f6edec824c7fd54a66d241a227f6503ad3a73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146101f157600080fd5b005b600080fd5b34801561020457600080fd5b5061021f600480360381019061021a9190612ea7565b610707565b005b34801561022d57600080fd5b5061024860048036038101906102439190612ea7565b610841565b60405161025591906130a3565b60405180910390f35b34801561026a57600080fd5b50610285600480360381019061028091906130c5565b610c42565b6040516102929190613161565b60405180910390f35b3480156102a757600080fd5b506102c260048036038101906102bd919061317c565b610eab565b005b3480156102d057600080fd5b506102eb60048036038101906102e691906131f7565b610f42565b005b3480156102f957600080fd5b50610314600480360381019061030f9190613289565b610fdc565b6040516103219190613398565b60405180910390f35b34801561033657600080fd5b5061033f611161565b60405161034c91906133c9565b60405180910390f35b34801561036157600080fd5b5061036a611179565b604051610379939291906133e4565b60405180910390f35b34801561038e57600080fd5b506103976111a4565b6040516103a491906133c9565b60405180910390f35b3480156103b957600080fd5b506103c26111bc565b6040516103d19392919061341b565b60405180910390f35b3480156103e657600080fd5b506103ef6111d4565b6040516103fd929190613452565b60405180910390f35b34801561041257600080fd5b5061042d6004803603810190610428919061347b565b6111e5565b60405161043b9291906134f1565b60405180910390f35b34801561045057600080fd5b5061046b6004803603810190610466919061351a565b6113af565b6040516104799291906134f1565b60405180910390f35b34801561048e57600080fd5b506104a960048036038101906104a49190613581565b611579565b6040516104b69190613161565b60405180910390f35b3480156104cb57600080fd5b506104e660048036038101906104e191906135d4565b6116ba565b005b3480156104f457600080fd5b5061050f600480360381019061050a9190613601565b61184b565b005b34801561051d57600080fd5b5061053860048036038101906105339190613782565b611cc8565b604051610545919061382c565b60405180910390f35b61056860048036038101906105639190613847565b611d0b565b005b34801561057657600080fd5b5061057f611da8565b60405161058c91906133c9565b60405180910390f35b3480156105a157600080fd5b506105bc60048036038101906105b7919061389a565b611dce565b005b3480156105ca57600080fd5b506105e560048036038101906105e091906138ed565b611e78565b005b3480156105f357600080fd5b5061060e60048036038101906106099190613985565b611f1a565b005b34801561061c57600080fd5b5061063760048036038101906106329190613581565b612441565b005b34801561064557600080fd5b5061064e6127a9565b60405161065b91906133c9565b60405180910390f35b34801561067057600080fd5b5061068b600480360381019061068691906135d4565b6127c1565b6040516106989190613161565b60405180910390f35b3480156106ad57600080fd5b506106c860048036038101906106c391906135d4565b61281f565b6040516106d59190613161565b60405180910390f35b3480156106ea57600080fd5b5061070560048036038101906107009190612ea7565b61286b565b005b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610797576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078e90613a49565b60405180910390fd5b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff1660ff16116107f657600080fd5b80600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055505050565b606060008267ffffffffffffffff81111561085f5761085e613657565b5b60405190808252806020026020018201604052801561089857816020015b610885612d8e565b81526020019060019003908161087d5790505b5090506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff1660ff161161090f5773f5ad6f6edec824c7fd54a66d241a227f6503ad3a610911565b835b93506000805b84811015610c3657600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506040518060c00160405280600660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001548152602001600660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff1660ff168152602001600660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160019054906101000a900460ff1660ff168152602001600660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160029054906101000a900461ffff1661ffff168152602001600660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160049054906101000a900460c01b77ffffffffffffffffffffffffffffffffffffffffffffffff19168152602001600660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250838281518110610be057610bdf613a69565b5b6020026020010181905250600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160315610c36578195508080610c2e90613ac7565b915050610917565b50819250505092915050565b600073548b35327c2ecc6f8121fd9033306ca6e2dd787d73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c9057600080fd5b8573ffffffffffffffffffffffffffffffffffffffff166323b872dd8830886040518463ffffffff1660e01b8152600401610ccd93929190613b0f565b6020604051808303816000875af1158015610cec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d109190613b7e565b50600080610d20888888886113af565b91509150600061ea5f600660008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160029054906101000a900461ffff1661ffff16118015610de0575061ea5f600660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160029054906101000a900461ffff1661ffff16115b610dec57600054610df0565b6001545b9050600073f9875bada6ed22c9d9f2926d9cc47dfb007633c773ffffffffffffffffffffffffffffffffffffffff166347402bea338c8c8c8c8a8a8e8b6002546040518b63ffffffff1660e01b8152600401610e559a99989796959493929190613bab565b6020604051808303816000875af1158015610e74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e989190613c5c565b9050809450505050509695505050505050565b8473ffffffffffffffffffffffffffffffffffffffff166323b872dd3330876040518463ffffffff1660e01b8152600401610ee893929190613b0f565b6020604051808303816000875af1158015610f07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2b9190613b7e565b50610f3a338686868686612984565b505050505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610fd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc990613a49565b60405180910390fd5b8060028190555050565b60606000600185859050610ff09190613c89565b67ffffffffffffffff81111561100957611008613657565b5b6040519080825280602002602001820160405280156110375781602001602082028036833780820191505090505b50905060005b8585905081101561111b5785858281811061105b5761105a613a69565b5b905060200201602081019061107091906135d4565b73ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b81526004016110a891906133c9565b602060405180830381865afa1580156110c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110e99190613c5c565b8282815181106110fc576110fb613a69565b5b602002602001018181525050808061111390613ac7565b91505061103d565b508273ffffffffffffffffffffffffffffffffffffffff163181868690508151811061114a57611149613a69565b5b602002602001018181525050809150509392505050565b73469a2f6604b456110b486da4950d032958fde44781565b600080600073f5ad6f6edec824c7fd54a66d241a227f6503ad3a600354600454925092509250909192565b73548b35327c2ecc6f8121fd9033306ca6e2dd787d81565b60008060008054600154600254925092509250909192565b600080600354600554915091509091565b6000806000600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160029054906101000a900461ffff1661ffff16600660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160029054906101000a900461ffff1661ffff16106112a05760026112a3565b60015b9050600060018260ff161461132957600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160019054906101000a900460ff16600a61130e9190613df0565b868661131a9190613e3b565b6113249190613ec4565b61139c565b600660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160019054906101000a900460ff16600a6113859190613df0565b86866113919190613e3b565b61139b9190613ec4565b5b9050818193509350505094509492505050565b6000806000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160029054906101000a900461ffff1661ffff16600660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160029054906101000a900461ffff1661ffff161061146a57600261146d565b60015b9050600060018260ff16146114f35784600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160019054906101000a900460ff16600a6114d99190613df0565b886114e49190613e3b565b6114ee9190613ec4565b611566565b86600660008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160019054906101000a900460ff16600a6115509190613df0565b8661155b9190613e3b565b6115659190613ec4565b5b9050818193509350505094509492505050565b600073548b35327c2ecc6f8121fd9033306ca6e2dd787d73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115c757600080fd5b60008373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146116af576003546005548461160d9190613c89565b6116179190613e3b565b905073f5ad6f6edec824c7fd54a66d241a227f6503ad3a73ffffffffffffffffffffffffffffffffffffffff166323b872dd8686846040518463ffffffff1660e01b815260040161166a93929190613b0f565b6020604051808303816000875af1158015611689573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ad9190613b7e565b505b809150509392505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461174a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174190613a49565b60405180910390fd5b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff1660ff16116117a957600080fd5b8073ffffffffffffffffffffffffffffffffffffffff1663095ea7b3307fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401611804929190613ef5565b6020604051808303816000875af1158015611823573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118479190613b7e565b5050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146118db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d290613a49565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015611958575073f5ad6f6edec824c7fd54a66d241a227f6503ad3a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b61196157600080fd5b8173ffffffffffffffffffffffffffffffffffffffff16600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146119fb57600080fd5b60008273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611a3691906133c9565b602060405180830381865afa158015611a53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a779190613c5c565b14611a8157600080fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611b185780600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101600c6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000808201600090556001820160006101000a81549060ff02191690556001820160016101000a81549060ff02191690556001820160026101000a81549061ffff02191690556001820160046101000a81549067ffffffffffffffff021916905560018201600c6101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550505050565b60008060008084806020019051810190611ce29190613f5c565b925092509250611cf6873388868686612984565b50638943ec0260e01b93505050509392505050565b73f5ad6f6edec824c7fd54a66d241a227f6503ad3a73ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015611d6757600080fd5b505af1158015611d7b573d6000803e3d6000fd5b5050505050611da23373f5ad6f6edec824c7fd54a66d241a227f6503ad3a34868686612984565b50505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611e5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5590613a49565b60405180910390fd5b826003819055508160048190555080600581905550505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eff90613a49565b60405180910390fd5b81600081905550806001819055505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611faa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa190613a49565b60405180910390fd5b6000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff1660ff161461203f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203690613ffb565b60405180910390fd5b6000808573ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa15801561208d573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906120b691906140e6565b9050602081015191506040518060c001604052808481526020018660ff1681526020018773ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612124573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121489190614144565b60ff1681526020018561ffff1681526020018377ffffffffffffffffffffffffffffffffffffffffffffffff19168152602001600073ffffffffffffffffffffffffffffffffffffffff16815250600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010160006101000a81548160ff021916908360ff16021790555060408201518160010160016101000a81548160ff021916908360ff16021790555060608201518160010160026101000a81548161ffff021916908361ffff16021790555060808201518160010160046101000a81548167ffffffffffffffff021916908360c01c021790555060a082015181600101600c6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050508560066000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101600c6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508573ffffffffffffffffffffffffffffffffffffffff1663095ea7b3307fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016123f5929190613ef5565b6020604051808303816000875af1158015612414573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124389190613b7e565b50505050505050565b73f9875bada6ed22c9d9f2926d9cc47dfb007633c773ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146124c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ba906141bd565b60405180910390fd5b6000823b905060008111156126245773548b35327c2ecc6f8121fd9033306ca6e2dd787d73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361259d578373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84846040518363ffffffff1660e01b8152600401612554929190613ef5565b6020604051808303816000875af1158015612573573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125979190613b7e565b5061261f565b8373ffffffffffffffffffffffffffffffffffffffff166323b872dd3085856040518463ffffffff1660e01b81526004016125da93929190613b0f565b6020604051808303816000875af11580156125f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061261d9190613b7e565b505b6127a3565b73f5ad6f6edec824c7fd54a66d241a227f6503ad3a73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612722578373ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b81526004016126a49190613161565b600060405180830381600087803b1580156126be57600080fd5b505af11580156126d2573d6000803e3d6000fd5b505050508273ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f1935050505015801561271c573d6000803e3d6000fd5b506127a2565b8373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84846040518363ffffffff1660e01b815260040161275d929190613ef5565b6020604051808303816000875af115801561277c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127a09190613b7e565b505b5b50505050565b73f9875bada6ed22c9d9f2926d9cc47dfb007633c781565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160029054906101000a900461ffff1661ffff169050919050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050919050565b73f9875bada6ed22c9d9f2926d9cc47dfb007633c773ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146128ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e4906141bd565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb73469a2f6604b456110b486da4950d032958fde447836040518363ffffffff1660e01b815260040161293c929190613ef5565b6020604051808303816000875af115801561295b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061297f9190613b7e565b505050565b600080600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff1660ff16118015612a3957506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff1660ff16115b612a4257600080fd5b600085118015612a525750600083115b612a5b57600080fd5b8373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1603612a9357600080fd5b600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160029054906101000a900461ffff1661ffff16600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160029054906101000a900461ffff1661ffff161015612b9757600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154831015612b9257600080fd5b612be7565b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154851015612be657600080fd5b5b600080612bf6888888886113af565b9150915060008111612c0757600080fd5b600061ea5f600660008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160029054906101000a900461ffff1661ffff16118015612cc3575061ea5f600660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160029054906101000a900461ffff1661ffff16115b612ccf57600054612cd3565b6001545b9050600073f9875bada6ed22c9d9f2926d9cc47dfb007633c773ffffffffffffffffffffffffffffffffffffffff166347402bea8c8c8c8c8c8a8a8e8b6002546040518b63ffffffff1660e01b8152600401612d389a99989796959493929190613bab565b6020604051808303816000875af1158015612d57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d7b9190613c5c565b9050809450505050509695505050505050565b6040518060c0016040528060008152602001600060ff168152602001600060ff168152602001600061ffff168152602001600077ffffffffffffffffffffffffffffffffffffffffffffffff19168152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612e3e82612e13565b9050919050565b612e4e81612e33565b8114612e5957600080fd5b50565b600081359050612e6b81612e45565b92915050565b6000819050919050565b612e8481612e71565b8114612e8f57600080fd5b50565b600081359050612ea181612e7b565b92915050565b60008060408385031215612ebe57612ebd612e09565b5b6000612ecc85828601612e5c565b9250506020612edd85828601612e92565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612f1c81612e71565b82525050565b600060ff82169050919050565b612f3881612f22565b82525050565b600061ffff82169050919050565b612f5581612f3e565b82525050565b60007fffffffffffffffff00000000000000000000000000000000000000000000000082169050919050565b612f9081612f5b565b82525050565b612f9f81612e33565b82525050565b60c082016000820151612fbb6000850182612f13565b506020820151612fce6020850182612f2f565b506040820151612fe16040850182612f2f565b506060820151612ff46060850182612f4c565b5060808201516130076080850182612f87565b5060a082015161301a60a0850182612f96565b50505050565b600061302c8383612fa5565b60c08301905092915050565b6000602082019050919050565b600061305082612ee7565b61305a8185612ef2565b935061306583612f03565b8060005b8381101561309657815161307d8882613020565b975061308883613038565b925050600181019050613069565b5085935050505092915050565b600060208201905081810360008301526130bd8184613045565b905092915050565b60008060008060008060c087890312156130e2576130e1612e09565b5b60006130f089828a01612e5c565b965050602061310189828a01612e5c565b955050604061311289828a01612e92565b945050606061312389828a01612e5c565b935050608061313489828a01612e92565b92505060a061314589828a01612e92565b9150509295509295509295565b61315b81612e71565b82525050565b60006020820190506131766000830184613152565b92915050565b600080600080600060a0868803121561319857613197612e09565b5b60006131a688828901612e5c565b95505060206131b788828901612e92565b94505060406131c888828901612e5c565b93505060606131d988828901612e92565b92505060806131ea88828901612e92565b9150509295509295909350565b60006020828403121561320d5761320c612e09565b5b600061321b84828501612e92565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261324957613248613224565b5b8235905067ffffffffffffffff81111561326657613265613229565b5b6020830191508360208202830111156132825761328161322e565b5b9250929050565b6000806000604084860312156132a2576132a1612e09565b5b600084013567ffffffffffffffff8111156132c0576132bf612e0e565b5b6132cc86828701613233565b935093505060206132df86828701612e5c565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60006133218383612f13565b60208301905092915050565b6000602082019050919050565b6000613345826132e9565b61334f81856132f4565b935061335a83613305565b8060005b8381101561338b5781516133728882613315565b975061337d8361332d565b92505060018101905061335e565b5085935050505092915050565b600060208201905081810360008301526133b2818461333a565b905092915050565b6133c381612e33565b82525050565b60006020820190506133de60008301846133ba565b92915050565b60006060820190506133f960008301866133ba565b6134066020830185613152565b6134136040830184613152565b949350505050565b60006060820190506134306000830186613152565b61343d6020830185613152565b61344a6040830184613152565b949350505050565b60006040820190506134676000830185613152565b6134746020830184613152565b9392505050565b6000806000806080858703121561349557613494612e09565b5b60006134a387828801612e5c565b94505060206134b487828801612e5c565b93505060406134c587828801612e92565b92505060606134d687828801612e92565b91505092959194509250565b6134eb81612f22565b82525050565b600060408201905061350660008301856134e2565b6135136020830184613152565b9392505050565b6000806000806080858703121561353457613533612e09565b5b600061354287828801612e5c565b945050602061355387828801612e92565b935050604061356487828801612e5c565b925050606061357587828801612e92565b91505092959194509250565b60008060006060848603121561359a57613599612e09565b5b60006135a886828701612e5c565b93505060206135b986828701612e5c565b92505060406135ca86828701612e92565b9150509250925092565b6000602082840312156135ea576135e9612e09565b5b60006135f884828501612e5c565b91505092915050565b6000806040838503121561361857613617612e09565b5b600061362685828601612e5c565b925050602061363785828601612e5c565b9150509250929050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61368f82613646565b810181811067ffffffffffffffff821117156136ae576136ad613657565b5b80604052505050565b60006136c1612dff565b90506136cd8282613686565b919050565b600067ffffffffffffffff8211156136ed576136ec613657565b5b6136f682613646565b9050602081019050919050565b82818337600083830152505050565b6000613725613720846136d2565b6136b7565b90508281526020810184848401111561374157613740613641565b5b61374c848285613703565b509392505050565b600082601f83011261376957613768613224565b5b8135613779848260208601613712565b91505092915050565b60008060006060848603121561379b5761379a612e09565b5b60006137a986828701612e5c565b93505060206137ba86828701612e92565b925050604084013567ffffffffffffffff8111156137db576137da612e0e565b5b6137e786828701613754565b9150509250925092565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613826816137f1565b82525050565b6000602082019050613841600083018461381d565b92915050565b6000806000606084860312156138605761385f612e09565b5b600061386e86828701612e5c565b935050602061387f86828701612e92565b925050604061389086828701612e92565b9150509250925092565b6000806000606084860312156138b3576138b2612e09565b5b60006138c186828701612e92565b93505060206138d286828701612e92565b92505060406138e386828701612e92565b9150509250925092565b6000806040838503121561390457613903612e09565b5b600061391285828601612e92565b925050602061392385828601612e92565b9150509250929050565b61393681612f22565b811461394157600080fd5b50565b6000813590506139538161392d565b92915050565b61396281612f3e565b811461396d57600080fd5b50565b60008135905061397f81613959565b92915050565b6000806000806080858703121561399f5761399e612e09565b5b60006139ad87828801612e5c565b94505060206139be87828801613944565b93505060406139cf87828801613970565b92505060606139e087828801612e92565b91505092959194509250565b600082825260208201905092915050565b7f4f6e6c79206f776e65722063616e2063616c6c20746869730000000000000000600082015250565b6000613a336018836139ec565b9150613a3e826139fd565b602082019050919050565b60006020820190508181036000830152613a6281613a26565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613ad282612e71565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613b0457613b03613a98565b5b600182019050919050565b6000606082019050613b2460008301866133ba565b613b3160208301856133ba565b613b3e6040830184613152565b949350505050565b60008115159050919050565b613b5b81613b46565b8114613b6657600080fd5b50565b600081519050613b7881613b52565b92915050565b600060208284031215613b9457613b93612e09565b5b6000613ba284828501613b69565b91505092915050565b600061014082019050613bc1600083018d6133ba565b613bce602083018c6133ba565b613bdb604083018b613152565b613be8606083018a6133ba565b613bf56080830189613152565b613c0260a08301886134e2565b613c0f60c0830187613152565b613c1c60e0830186613152565b613c2a610100830185613152565b613c38610120830184613152565b9b9a5050505050505050505050565b600081519050613c5681612e7b565b92915050565b600060208284031215613c7257613c71612e09565b5b6000613c8084828501613c47565b91505092915050565b6000613c9482612e71565b9150613c9f83612e71565b9250828201905080821115613cb757613cb6613a98565b5b92915050565b60008160011c9050919050565b6000808291508390505b6001851115613d1457808604811115613cf057613cef613a98565b5b6001851615613cff5780820291505b8081029050613d0d85613cbd565b9450613cd4565b94509492505050565b600082613d2d5760019050613de9565b81613d3b5760009050613de9565b8160018114613d515760028114613d5b57613d8a565b6001915050613de9565b60ff841115613d6d57613d6c613a98565b5b8360020a915084821115613d8457613d83613a98565b5b50613de9565b5060208310610133831016604e8410600b8410161715613dbf5782820a905083811115613dba57613db9613a98565b5b613de9565b613dcc8484846001613cca565b92509050818404811115613de357613de2613a98565b5b81810290505b9392505050565b6000613dfb82612e71565b9150613e0683612f22565b9250613e337fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484613d1d565b905092915050565b6000613e4682612e71565b9150613e5183612e71565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e8a57613e89613a98565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613ecf82612e71565b9150613eda83612e71565b925082613eea57613ee9613e95565b5b828204905092915050565b6000604082019050613f0a60008301856133ba565b613f176020830184613152565b9392505050565b6000613f2982612e13565b9050919050565b613f3981613f1e565b8114613f4457600080fd5b50565b600081519050613f5681613f30565b92915050565b600080600060608486031215613f7557613f74612e09565b5b6000613f8386828701613f47565b9350506020613f9486828701613c47565b9250506040613fa586828701613c47565b9150509250925092565b7f6572723a20746f6b656e20657869737473000000000000000000000000000000600082015250565b6000613fe56011836139ec565b9150613ff082613faf565b602082019050919050565b6000602082019050818103600083015261401481613fd8565b9050919050565b600067ffffffffffffffff82111561403657614035613657565b5b61403f82613646565b9050602081019050919050565b60005b8381101561406a57808201518184015260208101905061404f565b60008484015250505050565b60006140896140848461401b565b6136b7565b9050828152602081018484840111156140a5576140a4613641565b5b6140b084828561404c565b509392505050565b600082601f8301126140cd576140cc613224565b5b81516140dd848260208601614076565b91505092915050565b6000602082840312156140fc576140fb612e09565b5b600082015167ffffffffffffffff81111561411a57614119612e0e565b5b614126848285016140b8565b91505092915050565b60008151905061413e8161392d565b92915050565b60006020828403121561415a57614159612e09565b5b60006141688482850161412f565b91505092915050565b7f4f6e6c7920636f6e7472616374206f72646572732063616e2063616c6c000000600082015250565b60006141a7601d836139ec565b91506141b282614171565b602082019050919050565b600060208201905081810360008301526141d68161419a565b905091905056fea2646970667358221220c7195dd46638a1887d60787e42068a1f0c74599e4e933b3c980b0fa2727ba4b564736f6c63430008100033