Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- DaoApprovedResources
- Optimization enabled
- false
- Compiler version
- v0.8.16+commit.07a7930e
- EVM Version
- default
- Verified at
- 2024-11-21T09:09:37.208496Z
Contract source code
// SPDX-License-Identifier: GPL-3.0-only // Author: Upaut (CallistoDAO) pragma solidity ^0.8.16; interface IContractGraphLib { function getIcon(bytes32 _hash) external view returns (string memory); } contract DaoApprovedResources { struct Group{ // структура описывающая группу uint64 id; // идентификатор группы uint64 elem; // количество медиаресурсов в группе uint64 next; // указатель на следующую группу uint64 prev; // указатель на предыдущую группу string name; // название группы (имена групп и медиаресурсов должны быть уникальны) string icon; // хэш иконки в контракте графической библиотеки } struct Resource{ // структура описывающая медиаресурс uint64 id; // идентификатор медиаресурса uint64 parent; // ID родительской группы uint64 next; // указатель на следующий медиаресурс uint64 prev; // указатель на предыдущий медиаресурс string name; // название медиаресурса (имена групп и медиаресурсов должны быть уникальны) string link; // ссылка на медиаресурс string metadata; // описание ресурса string icon; // хэш иконки в контракте графической библиотеки } uint64 id; // хранит последний порядковый номер ID выделяемый для новых групп и медиаресурсов (увеличивается на 1 каждый раз когда добавляются новые группы и медиаресурсы) address public GovernanceDAO = 0x810059e1406dEDAFd1BdCa4E0137CbA306c0Ce36; // Адрес голосования DAO address public constant contractGraphLib = 0xFe2bbc3D86C3e4666D3E352f68B2a224cAC28238; // Контракт графической библитотеки mapping(bytes32 => uint64) private ids; // сопоставление хешей уникальных имен с id mapping(uint64 => Group) private groups; // двухсвязный список всех групп mapping(uint64 => mapping(uint64 => Resource)) private resources; // двухсвязные списки ресурсов закрепленные за группами modifier onlyDAO() { require(msg.sender == GovernanceDAO, "Only DAO can call this"); _; } // Создание новой группы function createGroup(string memory _name, bytes32 _icon) external onlyDAO { require(bytes(_name).length != 0); // Имя новой группы не должно быть пустой строкой require(_getID(_name) == 0); // Имя новой группы должно быть свободно id++; // уникальный идентификатор новой группы ids[_getHash(_name)] = id; // сопоставление хеша имени группы с id groups[id] = Group(id, 0, 0, groups[0].prev, _name, string(abi.encodePacked(_icon))); // инициализация новой группы с добавлением ее в список групп groups[groups[0].prev].next = id; // последний элемент списка ссылается на созданную группу groups[0].prev = id; // замыкаем двухсвязный список групп в круг groups[0].elem++; // увеличиваем общее количество групп } // Изменение имени группы + замена иконки группы function renameGroup(string memory _name, string memory _new_name, bytes32 _new_icon) external onlyDAO { uint64 _id = _getID(_name); require(groups[_id].id > 0); // группа которая подлежит переименованию должна существовать require(bytes(_new_name).length != 0); // Имя новой группы не должно быть пустой строкой require(_getID(_new_name) == 0); // Имя новой группы должно быть свободно ids[_getHash(_new_name)] = _id; // сопоставление хеша имени группы с id groups[_id].name = _new_name; groups[_id].icon = string(abi.encodePacked(_new_icon)); delete ids[_getHash(_name)]; // убираем сопоставление хеша старого имени группы с id } // Перемещения группы в позицию после группы указаной в _after_name function moveGroup(string memory _name, string memory _after_name) external onlyDAO { uint64 _id = _getID(_name); // id перемещаемой группы uint64 _after_id = _getID(_after_name); // id группы, после которой будет расположена перемещаемая группа require(_id != _after_id); // группы должны быть разными require((groups[_id].id > 0) && (groups[_after_id].id > 0)); // группы должны существовать groups[groups[_id].prev].next = groups[_id].next; groups[groups[_id].next].prev = groups[_id].prev; groups[_id].next = groups[_after_id].next; groups[_id].prev = _after_id; groups[_after_id].next = _id; groups[groups[_id].next].prev = _id; } // Удаление группы (группа удаляется со всеми ее медиа ресурсами) function deleteGroup(string memory _name) external onlyDAO { uint64 _id = _getID(_name); require(groups[_id].id > 0); // группа которая подлежит удалению должна существовать ids[_getHash(_name)] = 0; // удаляем сопоставление хеша имени группы с id // убираем группу из списка групп groups[groups[_id].prev].next = groups[_id].next; groups[groups[_id].next].prev = groups[_id].prev; // удаляем все связанные с группой ресурсы uint64 _id_res = resources[_id][0].next; // получаем id первого ресурса группы delete resources[_id][0]; for(uint i; i < groups[_id].elem; i++){ uint64 _id_next = resources[_id][_id_res].next; ids[_getHash(resources[_id][_id_res].name)] = 0; // удаляем сопоставление хеша имени медиаресурса с id delete resources[_id][_id_res]; _id_res = _id_next; } groups[0].elem--; // уменьшаем общее количество групп delete groups[_id]; // удаляем группу } // Создание нового медиаресурса function createResource(string memory _group, string memory _name, string memory _link, string memory _metadata, bytes32 _icon) external onlyDAO { uint64 _id_group = _getID(_group); require(groups[_id_group].id > 0); // группа в которой создается ресурс должна существовать require(bytes(_name).length != 0); // Имя нового медиаресурса не должно быть пустой строкой require(_getID(_name) == 0); // Имя создаваемого ресурса должно быть свободно require(bytes(_link).length != 0); // ссылка на медиаресурс не должна быть пустой строкой id++; // уникальный идентификатор нового медиаресурса ids[_getHash(_name)] = id; // сопоставление хеша имени медиаресурса с id resources[_id_group][id] = Resource(id, _id_group, 0, resources[_id_group][0].prev, _name, _link, _metadata, string(abi.encodePacked(_icon))); resources[_id_group][resources[_id_group][0].prev].next = id; resources[_id_group][0].prev = id; groups[_id_group].elem++; // увеличиваем общее количество медиаресурсов входящих в группу } // Перемещение медиаресурса в указанную группу с указанием позиции вставки. // Новая позиция вставки будет после медиаресурса указанного в _after_name function moveResource(string memory _from_group, string memory _name, string memory _in_group, string memory _after_name) external onlyDAO { uint64 _fromGroupID = _getID(_from_group); // получаем ID группы с перемещаемым медиаресурсом uint64 _id = _getID(_name); // id перемещаемого медиаресурса uint64 _inGroupID = _getID(_in_group); // получаем ID группы куда будет перемещен медиаресурс uint64 _after_id = _getID(_after_name); // id медиаресурса, после которого будет расположен перемещаемаемый медиаресурс require(_id != _after_id); // медиаресурсы должны быть разными require((resources[_fromGroupID][_id].id > 0) && (resources[_inGroupID][_after_id].id > 0)); // медиаресурсы в указанных группах должны существовать // отвязываем медиаресурс в исходной группе resources[_fromGroupID][resources[_fromGroupID][_id].prev].next = resources[_fromGroupID][_id].next; resources[_fromGroupID][resources[_fromGroupID][_id].next].prev = resources[_fromGroupID][_id].prev; if(_fromGroupID != _inGroupID){ // если медиаресурс перемещается между разными группами resources[_inGroupID][_id] = resources[_fromGroupID][_id]; // копируем медиаресурс в принимающую группу resources[_inGroupID][_id].parent = _inGroupID; // меняем ID родительской группы groups[_fromGroupID].elem--; // уменьшаем количество медиаресурсов в исходящей группе groups[_inGroupID].elem++; // увеличиваем количество медиаресурсов в принимающей группе delete resources[_fromGroupID][_id]; // удаляем медиаресурс из исходящей группы } // привязываем медиаресурс в принимающей группе resources[_inGroupID][_id].next = resources[_inGroupID][_after_id].next; resources[_inGroupID][_id].prev = _after_id; resources[_inGroupID][_after_id].next = _id; resources[_inGroupID][resources[_inGroupID][_id].next].prev = _id; } // Удаление медиаресурса в группе function deleteResource(string memory _from_group, string memory _name) external onlyDAO { uint64 _fromGroupID = _getID(_from_group); // получаем ID группы uint64 _id = _getID(_name); // id медиаресурса require(resources[_fromGroupID][_id].id > 0); // медиаресурс в группе должен существовать ids[_getHash(_name)] = 0; // удаляем сопоставление хеша имени медиаресурса с id // отвязываем медиаресурс в группе resources[_fromGroupID][resources[_fromGroupID][_id].prev].next = resources[_fromGroupID][_id].next; resources[_fromGroupID][resources[_fromGroupID][_id].next].prev = resources[_fromGroupID][_id].prev; groups[_fromGroupID].elem--; // уменьшаем количество медиаресурсов в группе delete resources[_fromGroupID][_id]; // удаляем медиаресурс из группы } // Возвращаем количество созданных групп function totalGroups() public view returns (uint64){ return (groups[0].elem); } // Возвращаем группу по ее имени function getGroup(string memory _name) public view returns (Group memory){ Group memory result = groups[_getID(_name)]; result.icon = IContractGraphLib(contractGraphLib).getIcon(bytes32(bytes(result.icon))); return (result); } // Возвращаем медиаресурс по его имени и имени группы где он расположен function getResource(string memory _group_name, string memory _resource_name) public view returns (Resource memory){ Resource memory result = resources[_getID(_group_name)][_getID(_resource_name)]; result.icon = IContractGraphLib(contractGraphLib).getIcon(bytes32(bytes(result.icon))); return (result); } // Возвращаем массив с запрашиваемым количеством групп, начиная со следующего ID после запрошенного в _id_start // Для возврата списка групп с самого начала укажите _id_start = 0 // Функция создана для удобных порционных запросов из Frontend function getGroups(uint64 _id_start, uint64 _amount) public view returns (Group[] memory){ _id_start = groups[_id_start].next; // получаем ID следующей группы if(_id_start == 0) return (new Group[](1)); // если стартовый ID не существует или он последний элемент списка Group[] memory result = new Group[](_amount); for(uint64 i; i < _amount; i++){ if(_id_start == 0) break; result[i] = groups[_id_start]; result[i].icon = IContractGraphLib(contractGraphLib).getIcon(bytes32(bytes(result[i].icon))); _id_start = groups[_id_start].next; } return (result); // возвращаем массив с группами } // Возвращаем массив с запрашиваемым количеством медиаресурсов, начиная с группы указаной в _id_group_start и медиаресорсом указанным после _id_resource_start // Для возврата списка медиаресурсов с самого начала укажите _id_group_start = 0 и _id_resource_start = 0 // Функция создана для удобных порционных запросов из Frontend function getResources(uint64 _id_group_start, uint64 _id_resource_start, uint64 _amount) public view returns (Resource[] memory){ _id_group_start = _id_group_start > 0 ? _id_group_start : groups[_id_group_start].next; // определяем стартовую группу _id_resource_start = resources[_id_group_start][_id_resource_start].next; if(_id_resource_start == 0){ // если ID медиаресурса не существует или список был закончен _id_group_start = groups[_id_group_start].next; // переходим к следующей группе _id_resource_start = resources[_id_group_start][0].next; // переходим к первому ресурсу в группе if((_id_group_start == 0) && (_id_resource_start == 0)) return (new Resource[](1)); } Resource[] memory result = new Resource[](_amount); uint64 _index; while((_id_group_start > 0) && (_index < _amount)){ // перебираем все медиаресурсы пока имеются родительские группы и не набрано запрошенное количество медиаресурсов if(_id_resource_start == 0){ // если в текущей группе больше нет медиаресурсов _id_group_start = groups[_id_group_start].next; // переходим к следующей группе _id_resource_start = resources[_id_group_start][0].next; // переходим к первому ресурсу в группе continue; } result[_index] = resources[_id_group_start][_id_resource_start]; result[_index].icon = IContractGraphLib(contractGraphLib).getIcon(bytes32(bytes(result[_index].icon))); _index++; _id_resource_start = resources[_id_group_start][_id_resource_start].next; // переходим к первому ресурсу в группе } return (result); // возвращаем массив с медиаресурсами } // Назначить нового владельца (замена адреса ДАО) function setNewOwner(address _newOwner) external onlyDAO { GovernanceDAO = _newOwner; } function _getHash(string memory _name) private pure returns (bytes32){ // возвращает хеш уникального имени return (keccak256(abi.encodePacked(_name))); } function _getID(string memory _name) private view returns (uint64){ // возвращает ID присвоенное уникальному имени return (ids[_getHash(_name)]); } }
Contract ABI
[{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"GovernanceDAO","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"contractGraphLib","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"createGroup","inputs":[{"type":"string","name":"_name","internalType":"string"},{"type":"bytes32","name":"_icon","internalType":"bytes32"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"createResource","inputs":[{"type":"string","name":"_group","internalType":"string"},{"type":"string","name":"_name","internalType":"string"},{"type":"string","name":"_link","internalType":"string"},{"type":"string","name":"_metadata","internalType":"string"},{"type":"bytes32","name":"_icon","internalType":"bytes32"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"deleteGroup","inputs":[{"type":"string","name":"_name","internalType":"string"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"deleteResource","inputs":[{"type":"string","name":"_from_group","internalType":"string"},{"type":"string","name":"_name","internalType":"string"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"","internalType":"struct DaoApprovedResources.Group","components":[{"type":"uint64","name":"id","internalType":"uint64"},{"type":"uint64","name":"elem","internalType":"uint64"},{"type":"uint64","name":"next","internalType":"uint64"},{"type":"uint64","name":"prev","internalType":"uint64"},{"type":"string","name":"name","internalType":"string"},{"type":"string","name":"icon","internalType":"string"}]}],"name":"getGroup","inputs":[{"type":"string","name":"_name","internalType":"string"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple[]","name":"","internalType":"struct DaoApprovedResources.Group[]","components":[{"type":"uint64","name":"id","internalType":"uint64"},{"type":"uint64","name":"elem","internalType":"uint64"},{"type":"uint64","name":"next","internalType":"uint64"},{"type":"uint64","name":"prev","internalType":"uint64"},{"type":"string","name":"name","internalType":"string"},{"type":"string","name":"icon","internalType":"string"}]}],"name":"getGroups","inputs":[{"type":"uint64","name":"_id_start","internalType":"uint64"},{"type":"uint64","name":"_amount","internalType":"uint64"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"","internalType":"struct DaoApprovedResources.Resource","components":[{"type":"uint64","name":"id","internalType":"uint64"},{"type":"uint64","name":"parent","internalType":"uint64"},{"type":"uint64","name":"next","internalType":"uint64"},{"type":"uint64","name":"prev","internalType":"uint64"},{"type":"string","name":"name","internalType":"string"},{"type":"string","name":"link","internalType":"string"},{"type":"string","name":"metadata","internalType":"string"},{"type":"string","name":"icon","internalType":"string"}]}],"name":"getResource","inputs":[{"type":"string","name":"_group_name","internalType":"string"},{"type":"string","name":"_resource_name","internalType":"string"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple[]","name":"","internalType":"struct DaoApprovedResources.Resource[]","components":[{"type":"uint64","name":"id","internalType":"uint64"},{"type":"uint64","name":"parent","internalType":"uint64"},{"type":"uint64","name":"next","internalType":"uint64"},{"type":"uint64","name":"prev","internalType":"uint64"},{"type":"string","name":"name","internalType":"string"},{"type":"string","name":"link","internalType":"string"},{"type":"string","name":"metadata","internalType":"string"},{"type":"string","name":"icon","internalType":"string"}]}],"name":"getResources","inputs":[{"type":"uint64","name":"_id_group_start","internalType":"uint64"},{"type":"uint64","name":"_id_resource_start","internalType":"uint64"},{"type":"uint64","name":"_amount","internalType":"uint64"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"moveGroup","inputs":[{"type":"string","name":"_name","internalType":"string"},{"type":"string","name":"_after_name","internalType":"string"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"moveResource","inputs":[{"type":"string","name":"_from_group","internalType":"string"},{"type":"string","name":"_name","internalType":"string"},{"type":"string","name":"_in_group","internalType":"string"},{"type":"string","name":"_after_name","internalType":"string"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renameGroup","inputs":[{"type":"string","name":"_name","internalType":"string"},{"type":"string","name":"_new_name","internalType":"string"},{"type":"bytes32","name":"_new_icon","internalType":"bytes32"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setNewOwner","inputs":[{"type":"address","name":"_newOwner","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint64","name":"","internalType":"uint64"}],"name":"totalGroups","inputs":[]}]
Contract Creation Code
0x608060405273810059e1406dedafd1bdca4e0137cba306c0ce36600060086101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555034801561006557600080fd5b5061584280620000766000396000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c8063894a823d11610097578063c5b42c2211610066578063c5b42c2214610280578063c75f28931461029e578063e08a3afd146102bc578063f5a1f5b4146102d8576100f5565b8063894a823d146101e65780639ca85bf014610216578063a046ae1314610234578063abef281e14610250576100f5565b80632e8b92a9116100d35780632e8b92a9146101625780635140dcf31461017e5780636158623e146101ae5780638651dd7a146101ca576100f5565b8063034cbb22146100fa578063188850811461011657806319d0cc8414610146575b600080fd5b610114600480360381019061010f9190614641565b6102f4565b005b610130600480360381019061012b919061470c565b61051c565b60405161013d9190614974565b60405180910390f35b610160600480360381019061015b9190614996565b610d64565b005b61017c60048036038101906101779190614a0e565b6112b9565b005b61019860048036038101906101939190614a57565b611ae5565b6040516101a59190614be9565b60405180910390f35b6101c860048036038101906101c39190614996565b611fc0565b005b6101e460048036038101906101df9190614c0b565b612493565b005b61020060048036038101906101fb9190614996565b61293a565b60405161020d9190614d2c565b60405180910390f35b61021e612d70565b60405161022b9190614d8f565b60405180910390f35b61024e60048036038101906102499190614daa565b612d96565b005b61026a60048036038101906102659190614a0e565b6138ff565b6040516102779190614f11565b60405180910390f35b610288613be2565b6040516102959190614d8f565b60405180910390f35b6102a6613bfa565b6040516102b39190614f42565b60405180910390f35b6102d660048036038101906102d19190614f5d565b613c36565b005b6102f260048036038101906102ed9190615074565b61424c565b005b600060089054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610384576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161037b906150fe565b60405180910390fd5b600061038f84614320565b90506000600260008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff16116103e657600080fd5b60008351036103f457600080fd5b60006103ff84614320565b67ffffffffffffffff161461041357600080fd5b806001600061042186614359565b815260200190815260200160002060006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555082600260008367ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600101908161048c9190615334565b508160405160200161049e9190615427565b604051602081830303815290604052600260008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020190816104e39190615334565b50600160006104f186614359565b815260200190815260200160002060006101000a81549067ffffffffffffffff021916905550505050565b606060008467ffffffffffffffff161161057457600260008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff16610576565b835b9350600360008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff16925060008367ffffffffffffffff160361071357600260008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff169350600360008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008067ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff16925060008467ffffffffffffffff161480156106b1575060008367ffffffffffffffff16145b1561071257600167ffffffffffffffff8111156106d1576106d06144e0565b5b60405190808252806020026020018201604052801561070a57816020015b6106f7614389565b8152602001906001900390816106ef5790505b509050610d5d565b5b60008267ffffffffffffffff1667ffffffffffffffff811115610739576107386144e0565b5b60405190808252806020026020018201604052801561077257816020015b61075f614389565b8152602001906001900390816107575790505b50905060005b60008667ffffffffffffffff161180156107a557508367ffffffffffffffff168167ffffffffffffffff16105b15610d575760008567ffffffffffffffff160361085e57600260008767ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff169550600360008767ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008067ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff169450610778565b600360008767ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008667ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020604051806101000160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160018201805461098e9061514d565b80601f01602080910402602001604051908101604052809291908181526020018280546109ba9061514d565b8015610a075780601f106109dc57610100808354040283529160200191610a07565b820191906000526020600020905b8154815290600101906020018083116109ea57829003601f168201915b50505050508152602001600282018054610a209061514d565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4c9061514d565b8015610a995780601f10610a6e57610100808354040283529160200191610a99565b820191906000526020600020905b815481529060010190602001808311610a7c57829003601f168201915b50505050508152602001600382018054610ab29061514d565b80601f0160208091040260200160405190810160405280929190818152602001828054610ade9061514d565b8015610b2b5780601f10610b0057610100808354040283529160200191610b2b565b820191906000526020600020905b815481529060010190602001808311610b0e57829003601f168201915b50505050508152602001600482018054610b449061514d565b80601f0160208091040260200160405190810160405280929190818152602001828054610b709061514d565b8015610bbd5780601f10610b9257610100808354040283529160200191610bbd565b820191906000526020600020905b815481529060010190602001808311610ba057829003601f168201915b505050505081525050828267ffffffffffffffff1681518110610be357610be2615442565b5b602002602001018190525073fe2bbc3d86c3e4666d3e352f68b2a224cac2823873ffffffffffffffffffffffffffffffffffffffff1663bac6dd6d838367ffffffffffffffff1681518110610c3b57610c3a615442565b5b602002602001015160e00151610c50906154a1565b6040518263ffffffff1660e01b8152600401610c6c9190615517565b600060405180830381865afa158015610c89573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610cb291906155a2565b828267ffffffffffffffff1681518110610ccf57610cce615442565b5b602002602001015160e001819052508080610ce99061561a565b915050600360008767ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff169450610778565b81925050505b9392505050565b600060089054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610df4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610deb906150fe565b60405180910390fd5b6000610dff83614320565b90506000610e0c83614320565b90506000600360008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1611610e8857600080fd5b600060016000610e9786614359565b815260200190815260200160002060006101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600360008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008267ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff16600360008467ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206000600360008667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600360008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008267ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160189054906101000a900467ffffffffffffffff16600360008467ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206000600360008667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600260008367ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600001600881819054906101000a900467ffffffffffffffff16809291906111919061564a565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050600360008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008267ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600080820160006101000a81549067ffffffffffffffff02191690556000820160086101000a81549067ffffffffffffffff02191690556000820160106101000a81549067ffffffffffffffff02191690556000820160186101000a81549067ffffffffffffffff021916905560018201600061128191906143f6565b60028201600061129191906143f6565b6003820160006112a191906143f6565b6004820160006112b191906143f6565b505050505050565b600060089054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611349576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611340906150fe565b60405180910390fd5b600061135482614320565b90506000600260008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff16116113ab57600080fd5b6000600160006113ba85614359565b815260200190815260200160002060006101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600260008267ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff1660026000600260008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600260008267ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160189054906101000a900467ffffffffffffffff1660026000600260008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600360008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008067ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff169050600360008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008067ffffffffffffffff168152602001908152602001600020600080820160006101000a81549067ffffffffffffffff02191690556000820160086101000a81549067ffffffffffffffff02191690556000820160106101000a81549067ffffffffffffffff02191690556000820160186101000a81549067ffffffffffffffff02191690556001820160006116a591906143f6565b6002820160006116b591906143f6565b6003820160006116c591906143f6565b6004820160006116d591906143f6565b505060005b600260008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff168110156119be576000600360008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff169050600060016000611878600360008967ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008867ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060010180546117f59061514d565b80601f01602080910402602001604051908101604052809291908181526020018280546118219061514d565b801561186e5780601f106118435761010080835404028352916020019161186e565b820191906000526020600020905b81548152906001019060200180831161185157829003601f168201915b5050505050614359565b815260200190815260200160002060006101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600360008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008467ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600080820160006101000a81549067ffffffffffffffff02191690556000820160086101000a81549067ffffffffffffffff02191690556000820160106101000a81549067ffffffffffffffff02191690556000820160186101000a81549067ffffffffffffffff021916905560018201600061197591906143f6565b60028201600061198591906143f6565b60038201600061199591906143f6565b6004820160006119a591906143f6565b50508092505080806119b690615673565b9150506116da565b50600260008067ffffffffffffffff168152602001908152602001600020600001600881819054906101000a900467ffffffffffffffff1680929190611a039061564a565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050600260008367ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600080820160006101000a81549067ffffffffffffffff02191690556000820160086101000a81549067ffffffffffffffff02191690556000820160106101000a81549067ffffffffffffffff02191690556000820160186101000a81549067ffffffffffffffff0219169055600182016000611ace91906143f6565b600282016000611ade91906143f6565b5050505050565b6060600260008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff16925060008367ffffffffffffffff1603611b9657600167ffffffffffffffff811115611b5557611b546144e0565b5b604051908082528060200260200182016040528015611b8e57816020015b611b7b614436565b815260200190600190039081611b735790505b509050611fba565b60008267ffffffffffffffff1667ffffffffffffffff811115611bbc57611bbb6144e0565b5b604051908082528060200260200182016040528015611bf557816020015b611be2614436565b815260200190600190039081611bda5790505b50905060005b8367ffffffffffffffff168167ffffffffffffffff161015611fb45760008567ffffffffffffffff160315611fb457600260008667ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206040518060c00160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152602001600182018054611d349061514d565b80601f0160208091040260200160405190810160405280929190818152602001828054611d609061514d565b8015611dad5780601f10611d8257610100808354040283529160200191611dad565b820191906000526020600020905b815481529060010190602001808311611d9057829003601f168201915b50505050508152602001600282018054611dc69061514d565b80601f0160208091040260200160405190810160405280929190818152602001828054611df29061514d565b8015611e3f5780601f10611e1457610100808354040283529160200191611e3f565b820191906000526020600020905b815481529060010190602001808311611e2257829003601f168201915b505050505081525050828267ffffffffffffffff1681518110611e6557611e64615442565b5b602002602001018190525073fe2bbc3d86c3e4666d3e352f68b2a224cac2823873ffffffffffffffffffffffffffffffffffffffff1663bac6dd6d838367ffffffffffffffff1681518110611ebd57611ebc615442565b5b602002602001015160a00151611ed2906154a1565b6040518263ffffffff1660e01b8152600401611eee9190615517565b600060405180830381865afa158015611f0b573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611f3491906155a2565b828267ffffffffffffffff1681518110611f5157611f50615442565b5b602002602001015160a00181905250600260008667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff1694508080611fac9061561a565b915050611bfb565b50809150505b92915050565b600060089054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612050576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612047906150fe565b60405180910390fd5b600061205b83614320565b9050600061206883614320565b90508067ffffffffffffffff168267ffffffffffffffff160361208a57600080fd5b6000600260008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1611801561212a57506000600260008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff16115b61213357600080fd5b600260008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff1660026000600260008667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600260008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160189054906101000a900467ffffffffffffffff1660026000600260008667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600260008267ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff16600260008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555080600260008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555081600260008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508160026000600260008667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050505050565b600060089054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612523576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251a906150fe565b60405180910390fd5b600082510361253157600080fd5b600061253c83614320565b67ffffffffffffffff161461255057600080fd5b60008081819054906101000a900467ffffffffffffffff16809291906125759061561a565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505060008054906101000a900467ffffffffffffffff16600160006125be85614359565b815260200190815260200160002060006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506040518060c0016040528060008054906101000a900467ffffffffffffffff1667ffffffffffffffff168152602001600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001600260008067ffffffffffffffff16815260200190815260200160002060000160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1681526020018381526020018260405160200161269e9190615427565b604051602081830303815290604052815250600260008060009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060208201518160000160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060808201518160010190816127bd9190615334565b5060a08201518160020190816127d39190615334565b5090505060008054906101000a900467ffffffffffffffff1660026000600260008067ffffffffffffffff16815260200190815260200160002060000160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008054906101000a900467ffffffffffffffff16600260008067ffffffffffffffff16815260200190815260200160002060000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600260008067ffffffffffffffff168152602001908152602001600020600001600881819054906101000a900467ffffffffffffffff168092919061290f9061561a565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505050565b612942614389565b60006003600061295186614320565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600061297e85614320565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020604051806101000160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152602001600182018054612a849061514d565b80601f0160208091040260200160405190810160405280929190818152602001828054612ab09061514d565b8015612afd5780601f10612ad257610100808354040283529160200191612afd565b820191906000526020600020905b815481529060010190602001808311612ae057829003601f168201915b50505050508152602001600282018054612b169061514d565b80601f0160208091040260200160405190810160405280929190818152602001828054612b429061514d565b8015612b8f5780601f10612b6457610100808354040283529160200191612b8f565b820191906000526020600020905b815481529060010190602001808311612b7257829003601f168201915b50505050508152602001600382018054612ba89061514d565b80601f0160208091040260200160405190810160405280929190818152602001828054612bd49061514d565b8015612c215780601f10612bf657610100808354040283529160200191612c21565b820191906000526020600020905b815481529060010190602001808311612c0457829003601f168201915b50505050508152602001600482018054612c3a9061514d565b80601f0160208091040260200160405190810160405280929190818152602001828054612c669061514d565b8015612cb35780601f10612c8857610100808354040283529160200191612cb3565b820191906000526020600020905b815481529060010190602001808311612c9657829003601f168201915b505050505081525050905073fe2bbc3d86c3e4666d3e352f68b2a224cac2823873ffffffffffffffffffffffffffffffffffffffff1663bac6dd6d8260e00151612cfc906154a1565b6040518263ffffffff1660e01b8152600401612d189190615517565b600060405180830381865afa158015612d35573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190612d5e91906155a2565b8160e001819052508091505092915050565b600060089054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060089054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612e26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1d906150fe565b60405180910390fd5b6000612e3185614320565b90506000612e3e85614320565b90506000612e4b85614320565b90506000612e5885614320565b90508067ffffffffffffffff168367ffffffffffffffff1603612e7a57600080fd5b6000600360008667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff16118015612f6457506000600360008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff16115b612f6d57600080fd5b600360008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff16600360008667ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206000600360008867ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008767ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600360008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160189054906101000a900467ffffffffffffffff16600360008667ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206000600360008867ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008767ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508167ffffffffffffffff168467ffffffffffffffff161461365757600360008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008467ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600360008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008567ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206000820160009054906101000a900467ffffffffffffffff168160000160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000820160089054906101000a900467ffffffffffffffff168160000160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000820160109054906101000a900467ffffffffffffffff168160000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000820160189054906101000a900467ffffffffffffffff168160000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600182018160010190816133b891906156d1565b50600282018160020190816133cd91906156d1565b50600382018160030190816133e291906156d1565b50600482018160040190816133f791906156d1565b5090505081600360008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600260008567ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600001600881819054906101000a900467ffffffffffffffff16809291906134bf9061564a565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050600260008367ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600001600881819054906101000a900467ffffffffffffffff16809291906135349061561a565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050600360008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008467ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600080820160006101000a81549067ffffffffffffffff02191690556000820160086101000a81549067ffffffffffffffff02191690556000820160106101000a81549067ffffffffffffffff02191690556000820160186101000a81549067ffffffffffffffff021916905560018201600061362491906143f6565b60028201600061363491906143f6565b60038201600061364491906143f6565b60048201600061365491906143f6565b50505b600360008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008267ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff16600360008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555080600360008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555082600360008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555082600360008467ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206000600360008667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008767ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505050505050505050565b613907614436565b60006002600061391685614320565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206040518060c00160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152602001600182018054613a1b9061514d565b80601f0160208091040260200160405190810160405280929190818152602001828054613a479061514d565b8015613a945780601f10613a6957610100808354040283529160200191613a94565b820191906000526020600020905b815481529060010190602001808311613a7757829003601f168201915b50505050508152602001600282018054613aad9061514d565b80601f0160208091040260200160405190810160405280929190818152602001828054613ad99061514d565b8015613b265780601f10613afb57610100808354040283529160200191613b26565b820191906000526020600020905b815481529060010190602001808311613b0957829003601f168201915b505050505081525050905073fe2bbc3d86c3e4666d3e352f68b2a224cac2823873ffffffffffffffffffffffffffffffffffffffff1663bac6dd6d8260a00151613b6f906154a1565b6040518263ffffffff1660e01b8152600401613b8b9190615517565b600060405180830381865afa158015613ba8573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190613bd191906155a2565b8160a0018190525080915050919050565b73fe2bbc3d86c3e4666d3e352f68b2a224cac2823881565b6000600260008067ffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff16905090565b600060089054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614613cc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613cbd906150fe565b60405180910390fd5b6000613cd186614320565b90506000600260008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1611613d2857600080fd5b6000855103613d3657600080fd5b6000613d4186614320565b67ffffffffffffffff1614613d5557600080fd5b6000845103613d6357600080fd5b60008081819054906101000a900467ffffffffffffffff1680929190613d889061561a565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505060008054906101000a900467ffffffffffffffff1660016000613dd188614359565b815260200190815260200160002060006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060405180610100016040528060008054906101000a900467ffffffffffffffff1667ffffffffffffffff1681526020018267ffffffffffffffff168152602001600067ffffffffffffffff168152602001600360008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008067ffffffffffffffff16815260200190815260200160002060000160189054906101000a900467ffffffffffffffff1667ffffffffffffffff16815260200186815260200185815260200184815260200183604051602001613ee29190615427565b604051602081830303815290604052815250600360008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008060009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060208201518160000160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060808201518160010190816140269190615334565b5060a082015181600201908161403c9190615334565b5060c08201518160030190816140529190615334565b5060e08201518160040190816140689190615334565b5090505060008054906101000a900467ffffffffffffffff16600360008367ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206000600360008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008067ffffffffffffffff16815260200190815260200160002060000160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008054906101000a900467ffffffffffffffff16600360008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008067ffffffffffffffff16815260200190815260200160002060000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600260008267ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600001600881819054906101000a900467ffffffffffffffff168092919061421d9061561a565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050505050505050565b600060089054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146142dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016142d3906150fe565b60405180910390fd5b80600060086101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006001600061432f84614359565b815260200190815260200160002060009054906101000a900467ffffffffffffffff169050919050565b60008160405160200161436c91906157f5565b604051602081830303815290604052805190602001209050919050565b604051806101000160405280600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001606081526020016060815260200160608152602001606081525090565b5080546144029061514d565b6000825580601f106144145750614433565b601f0160209004906000526020600020908101906144329190614494565b5b50565b6040518060c00160405280600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001600067ffffffffffffffff16815260200160608152602001606081525090565b5b808211156144ad576000816000905550600101614495565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614518826144cf565b810181811067ffffffffffffffff82111715614537576145366144e0565b5b80604052505050565b600061454a6144b1565b9050614556828261450f565b919050565b600067ffffffffffffffff821115614576576145756144e0565b5b61457f826144cf565b9050602081019050919050565b82818337600083830152505050565b60006145ae6145a98461455b565b614540565b9050828152602081018484840111156145ca576145c96144ca565b5b6145d584828561458c565b509392505050565b600082601f8301126145f2576145f16144c5565b5b813561460284826020860161459b565b91505092915050565b6000819050919050565b61461e8161460b565b811461462957600080fd5b50565b60008135905061463b81614615565b92915050565b60008060006060848603121561465a576146596144bb565b5b600084013567ffffffffffffffff811115614678576146776144c0565b5b614684868287016145dd565b935050602084013567ffffffffffffffff8111156146a5576146a46144c0565b5b6146b1868287016145dd565b92505060406146c28682870161462c565b9150509250925092565b600067ffffffffffffffff82169050919050565b6146e9816146cc565b81146146f457600080fd5b50565b600081359050614706816146e0565b92915050565b600080600060608486031215614725576147246144bb565b5b6000614733868287016146f7565b9350506020614744868287016146f7565b9250506040614755868287016146f7565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614794816146cc565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b838110156147d45780820151818401526020810190506147b9565b60008484015250505050565b60006147eb8261479a565b6147f581856147a5565b93506148058185602086016147b6565b61480e816144cf565b840191505092915050565b600061010083016000830151614832600086018261478b565b506020830151614845602086018261478b565b506040830151614858604086018261478b565b50606083015161486b606086018261478b565b506080830151848203608086015261488382826147e0565b91505060a083015184820360a086015261489d82826147e0565b91505060c083015184820360c08601526148b782826147e0565b91505060e083015184820360e08601526148d182826147e0565b9150508091505092915050565b60006148ea8383614819565b905092915050565b6000602082019050919050565b600061490a8261475f565b614914818561476a565b9350836020820285016149268561477b565b8060005b85811015614962578484038952815161494385826148de565b945061494e836148f2565b925060208a0199505060018101905061492a565b50829750879550505050505092915050565b6000602082019050818103600083015261498e81846148ff565b905092915050565b600080604083850312156149ad576149ac6144bb565b5b600083013567ffffffffffffffff8111156149cb576149ca6144c0565b5b6149d7858286016145dd565b925050602083013567ffffffffffffffff8111156149f8576149f76144c0565b5b614a04858286016145dd565b9150509250929050565b600060208284031215614a2457614a236144bb565b5b600082013567ffffffffffffffff811115614a4257614a416144c0565b5b614a4e848285016145dd565b91505092915050565b60008060408385031215614a6e57614a6d6144bb565b5b6000614a7c858286016146f7565b9250506020614a8d858286016146f7565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600060c083016000830151614adb600086018261478b565b506020830151614aee602086018261478b565b506040830151614b01604086018261478b565b506060830151614b14606086018261478b565b5060808301518482036080860152614b2c82826147e0565b91505060a083015184820360a0860152614b4682826147e0565b9150508091505092915050565b6000614b5f8383614ac3565b905092915050565b6000602082019050919050565b6000614b7f82614a97565b614b898185614aa2565b935083602082028501614b9b85614ab3565b8060005b85811015614bd75784840389528151614bb88582614b53565b9450614bc383614b67565b925060208a01995050600181019050614b9f565b50829750879550505050505092915050565b60006020820190508181036000830152614c038184614b74565b905092915050565b60008060408385031215614c2257614c216144bb565b5b600083013567ffffffffffffffff811115614c4057614c3f6144c0565b5b614c4c858286016145dd565b9250506020614c5d8582860161462c565b9150509250929050565b600061010083016000830151614c80600086018261478b565b506020830151614c93602086018261478b565b506040830151614ca6604086018261478b565b506060830151614cb9606086018261478b565b5060808301518482036080860152614cd182826147e0565b91505060a083015184820360a0860152614ceb82826147e0565b91505060c083015184820360c0860152614d0582826147e0565b91505060e083015184820360e0860152614d1f82826147e0565b9150508091505092915050565b60006020820190508181036000830152614d468184614c67565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614d7982614d4e565b9050919050565b614d8981614d6e565b82525050565b6000602082019050614da46000830184614d80565b92915050565b60008060008060808587031215614dc457614dc36144bb565b5b600085013567ffffffffffffffff811115614de257614de16144c0565b5b614dee878288016145dd565b945050602085013567ffffffffffffffff811115614e0f57614e0e6144c0565b5b614e1b878288016145dd565b935050604085013567ffffffffffffffff811115614e3c57614e3b6144c0565b5b614e48878288016145dd565b925050606085013567ffffffffffffffff811115614e6957614e686144c0565b5b614e75878288016145dd565b91505092959194509250565b600060c083016000830151614e99600086018261478b565b506020830151614eac602086018261478b565b506040830151614ebf604086018261478b565b506060830151614ed2606086018261478b565b5060808301518482036080860152614eea82826147e0565b91505060a083015184820360a0860152614f0482826147e0565b9150508091505092915050565b60006020820190508181036000830152614f2b8184614e81565b905092915050565b614f3c816146cc565b82525050565b6000602082019050614f576000830184614f33565b92915050565b600080600080600060a08688031215614f7957614f786144bb565b5b600086013567ffffffffffffffff811115614f9757614f966144c0565b5b614fa3888289016145dd565b955050602086013567ffffffffffffffff811115614fc457614fc36144c0565b5b614fd0888289016145dd565b945050604086013567ffffffffffffffff811115614ff157614ff06144c0565b5b614ffd888289016145dd565b935050606086013567ffffffffffffffff81111561501e5761501d6144c0565b5b61502a888289016145dd565b925050608061503b8882890161462c565b9150509295509295909350565b61505181614d6e565b811461505c57600080fd5b50565b60008135905061506e81615048565b92915050565b60006020828403121561508a576150896144bb565b5b60006150988482850161505f565b91505092915050565b600082825260208201905092915050565b7f4f6e6c792044414f2063616e2063616c6c207468697300000000000000000000600082015250565b60006150e86016836150a1565b91506150f3826150b2565b602082019050919050565b60006020820190508181036000830152615117816150db565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061516557607f821691505b6020821081036151785761517761511e565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026151e07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826151a3565b6151ea86836151a3565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600061523161522c61522784615202565b61520c565b615202565b9050919050565b6000819050919050565b61524b83615216565b61525f61525782615238565b8484546151b0565b825550505050565b600090565b615274615267565b61527f818484615242565b505050565b5b818110156152a35761529860008261526c565b600181019050615285565b5050565b601f8211156152e8576152b98161517e565b6152c284615193565b810160208510156152d1578190505b6152e56152dd85615193565b830182615284565b50505b505050565b600082821c905092915050565b600061530b600019846008026152ed565b1980831691505092915050565b600061532483836152fa565b9150826002028217905092915050565b61533d8261479a565b67ffffffffffffffff811115615356576153556144e0565b5b615360825461514d565b61536b8282856152a7565b600060209050601f83116001811461539e576000841561538c578287015190505b6153968582615318565b8655506153fe565b601f1984166153ac8661517e565b60005b828110156153d4578489015182556001820191506020850194506020810190506153af565b868310156153f157848901516153ed601f8916826152fa565b8355505b6001600288020188555050505b505050505050565b6000819050919050565b61542161541c8261460b565b615406565b82525050565b60006154338284615410565b60208201915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b6000819050602082019050919050565b6000615498825161460b565b80915050919050565b60006154ac82615471565b826154b68461547c565b90506154c18161548c565b92506020821015615501576154fc7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff836020036008026151a3565b831692505b5050919050565b6155118161460b565b82525050565b600060208201905061552c6000830184615508565b92915050565b60006155456155408461455b565b614540565b905082815260208101848484011115615561576155606144ca565b5b61556c8482856147b6565b509392505050565b600082601f830112615589576155886144c5565b5b8151615599848260208601615532565b91505092915050565b6000602082840312156155b8576155b76144bb565b5b600082015167ffffffffffffffff8111156155d6576155d56144c0565b5b6155e284828501615574565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000615625826146cc565b915067ffffffffffffffff820361563f5761563e6155eb565b5b600182019050919050565b6000615655826146cc565b915060008203615668576156676155eb565b5b600182039050919050565b600061567e82615202565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036156b0576156af6155eb565b5b600182019050919050565b6000815490506156ca8161514d565b9050919050565b8181036156df5750506157b7565b6156e8826156bb565b67ffffffffffffffff811115615701576157006144e0565b5b61570b825461514d565b6157168282856152a7565b6000601f8311600181146157455760008415615733578287015490505b61573d8582615318565b8655506157b0565b601f1984166157538761517e565b965061575e8661517e565b60005b8281101561578657848901548255600182019150600185019450602081019050615761565b868310156157a3578489015461579f601f8916826152fa565b8355505b6001600288020188555050505b5050505050505b565b600081905092915050565b60006157cf8261479a565b6157d981856157b9565b93506157e98185602086016147b6565b80840191505092915050565b600061580182846157c4565b91508190509291505056fea2646970667358221220cf6774db3553a381bd42a45ffbe9c096e19f4267223cad7c398e403dabe29efc64736f6c63430008100033
Deployed ByteCode
0x608060405234801561001057600080fd5b50600436106100f55760003560e01c8063894a823d11610097578063c5b42c2211610066578063c5b42c2214610280578063c75f28931461029e578063e08a3afd146102bc578063f5a1f5b4146102d8576100f5565b8063894a823d146101e65780639ca85bf014610216578063a046ae1314610234578063abef281e14610250576100f5565b80632e8b92a9116100d35780632e8b92a9146101625780635140dcf31461017e5780636158623e146101ae5780638651dd7a146101ca576100f5565b8063034cbb22146100fa578063188850811461011657806319d0cc8414610146575b600080fd5b610114600480360381019061010f9190614641565b6102f4565b005b610130600480360381019061012b919061470c565b61051c565b60405161013d9190614974565b60405180910390f35b610160600480360381019061015b9190614996565b610d64565b005b61017c60048036038101906101779190614a0e565b6112b9565b005b61019860048036038101906101939190614a57565b611ae5565b6040516101a59190614be9565b60405180910390f35b6101c860048036038101906101c39190614996565b611fc0565b005b6101e460048036038101906101df9190614c0b565b612493565b005b61020060048036038101906101fb9190614996565b61293a565b60405161020d9190614d2c565b60405180910390f35b61021e612d70565b60405161022b9190614d8f565b60405180910390f35b61024e60048036038101906102499190614daa565b612d96565b005b61026a60048036038101906102659190614a0e565b6138ff565b6040516102779190614f11565b60405180910390f35b610288613be2565b6040516102959190614d8f565b60405180910390f35b6102a6613bfa565b6040516102b39190614f42565b60405180910390f35b6102d660048036038101906102d19190614f5d565b613c36565b005b6102f260048036038101906102ed9190615074565b61424c565b005b600060089054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610384576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161037b906150fe565b60405180910390fd5b600061038f84614320565b90506000600260008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff16116103e657600080fd5b60008351036103f457600080fd5b60006103ff84614320565b67ffffffffffffffff161461041357600080fd5b806001600061042186614359565b815260200190815260200160002060006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555082600260008367ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600101908161048c9190615334565b508160405160200161049e9190615427565b604051602081830303815290604052600260008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020190816104e39190615334565b50600160006104f186614359565b815260200190815260200160002060006101000a81549067ffffffffffffffff021916905550505050565b606060008467ffffffffffffffff161161057457600260008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff16610576565b835b9350600360008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff16925060008367ffffffffffffffff160361071357600260008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff169350600360008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008067ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff16925060008467ffffffffffffffff161480156106b1575060008367ffffffffffffffff16145b1561071257600167ffffffffffffffff8111156106d1576106d06144e0565b5b60405190808252806020026020018201604052801561070a57816020015b6106f7614389565b8152602001906001900390816106ef5790505b509050610d5d565b5b60008267ffffffffffffffff1667ffffffffffffffff811115610739576107386144e0565b5b60405190808252806020026020018201604052801561077257816020015b61075f614389565b8152602001906001900390816107575790505b50905060005b60008667ffffffffffffffff161180156107a557508367ffffffffffffffff168167ffffffffffffffff16105b15610d575760008567ffffffffffffffff160361085e57600260008767ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff169550600360008767ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008067ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff169450610778565b600360008767ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008667ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020604051806101000160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160018201805461098e9061514d565b80601f01602080910402602001604051908101604052809291908181526020018280546109ba9061514d565b8015610a075780601f106109dc57610100808354040283529160200191610a07565b820191906000526020600020905b8154815290600101906020018083116109ea57829003601f168201915b50505050508152602001600282018054610a209061514d565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4c9061514d565b8015610a995780601f10610a6e57610100808354040283529160200191610a99565b820191906000526020600020905b815481529060010190602001808311610a7c57829003601f168201915b50505050508152602001600382018054610ab29061514d565b80601f0160208091040260200160405190810160405280929190818152602001828054610ade9061514d565b8015610b2b5780601f10610b0057610100808354040283529160200191610b2b565b820191906000526020600020905b815481529060010190602001808311610b0e57829003601f168201915b50505050508152602001600482018054610b449061514d565b80601f0160208091040260200160405190810160405280929190818152602001828054610b709061514d565b8015610bbd5780601f10610b9257610100808354040283529160200191610bbd565b820191906000526020600020905b815481529060010190602001808311610ba057829003601f168201915b505050505081525050828267ffffffffffffffff1681518110610be357610be2615442565b5b602002602001018190525073fe2bbc3d86c3e4666d3e352f68b2a224cac2823873ffffffffffffffffffffffffffffffffffffffff1663bac6dd6d838367ffffffffffffffff1681518110610c3b57610c3a615442565b5b602002602001015160e00151610c50906154a1565b6040518263ffffffff1660e01b8152600401610c6c9190615517565b600060405180830381865afa158015610c89573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610cb291906155a2565b828267ffffffffffffffff1681518110610ccf57610cce615442565b5b602002602001015160e001819052508080610ce99061561a565b915050600360008767ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff169450610778565b81925050505b9392505050565b600060089054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610df4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610deb906150fe565b60405180910390fd5b6000610dff83614320565b90506000610e0c83614320565b90506000600360008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1611610e8857600080fd5b600060016000610e9786614359565b815260200190815260200160002060006101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600360008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008267ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff16600360008467ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206000600360008667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600360008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008267ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160189054906101000a900467ffffffffffffffff16600360008467ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206000600360008667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600260008367ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600001600881819054906101000a900467ffffffffffffffff16809291906111919061564a565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050600360008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008267ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600080820160006101000a81549067ffffffffffffffff02191690556000820160086101000a81549067ffffffffffffffff02191690556000820160106101000a81549067ffffffffffffffff02191690556000820160186101000a81549067ffffffffffffffff021916905560018201600061128191906143f6565b60028201600061129191906143f6565b6003820160006112a191906143f6565b6004820160006112b191906143f6565b505050505050565b600060089054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611349576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611340906150fe565b60405180910390fd5b600061135482614320565b90506000600260008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff16116113ab57600080fd5b6000600160006113ba85614359565b815260200190815260200160002060006101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600260008267ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff1660026000600260008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600260008267ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160189054906101000a900467ffffffffffffffff1660026000600260008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600360008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008067ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff169050600360008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008067ffffffffffffffff168152602001908152602001600020600080820160006101000a81549067ffffffffffffffff02191690556000820160086101000a81549067ffffffffffffffff02191690556000820160106101000a81549067ffffffffffffffff02191690556000820160186101000a81549067ffffffffffffffff02191690556001820160006116a591906143f6565b6002820160006116b591906143f6565b6003820160006116c591906143f6565b6004820160006116d591906143f6565b505060005b600260008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff168110156119be576000600360008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff169050600060016000611878600360008967ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008867ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060010180546117f59061514d565b80601f01602080910402602001604051908101604052809291908181526020018280546118219061514d565b801561186e5780601f106118435761010080835404028352916020019161186e565b820191906000526020600020905b81548152906001019060200180831161185157829003601f168201915b5050505050614359565b815260200190815260200160002060006101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600360008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008467ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600080820160006101000a81549067ffffffffffffffff02191690556000820160086101000a81549067ffffffffffffffff02191690556000820160106101000a81549067ffffffffffffffff02191690556000820160186101000a81549067ffffffffffffffff021916905560018201600061197591906143f6565b60028201600061198591906143f6565b60038201600061199591906143f6565b6004820160006119a591906143f6565b50508092505080806119b690615673565b9150506116da565b50600260008067ffffffffffffffff168152602001908152602001600020600001600881819054906101000a900467ffffffffffffffff1680929190611a039061564a565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050600260008367ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600080820160006101000a81549067ffffffffffffffff02191690556000820160086101000a81549067ffffffffffffffff02191690556000820160106101000a81549067ffffffffffffffff02191690556000820160186101000a81549067ffffffffffffffff0219169055600182016000611ace91906143f6565b600282016000611ade91906143f6565b5050505050565b6060600260008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff16925060008367ffffffffffffffff1603611b9657600167ffffffffffffffff811115611b5557611b546144e0565b5b604051908082528060200260200182016040528015611b8e57816020015b611b7b614436565b815260200190600190039081611b735790505b509050611fba565b60008267ffffffffffffffff1667ffffffffffffffff811115611bbc57611bbb6144e0565b5b604051908082528060200260200182016040528015611bf557816020015b611be2614436565b815260200190600190039081611bda5790505b50905060005b8367ffffffffffffffff168167ffffffffffffffff161015611fb45760008567ffffffffffffffff160315611fb457600260008667ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206040518060c00160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152602001600182018054611d349061514d565b80601f0160208091040260200160405190810160405280929190818152602001828054611d609061514d565b8015611dad5780601f10611d8257610100808354040283529160200191611dad565b820191906000526020600020905b815481529060010190602001808311611d9057829003601f168201915b50505050508152602001600282018054611dc69061514d565b80601f0160208091040260200160405190810160405280929190818152602001828054611df29061514d565b8015611e3f5780601f10611e1457610100808354040283529160200191611e3f565b820191906000526020600020905b815481529060010190602001808311611e2257829003601f168201915b505050505081525050828267ffffffffffffffff1681518110611e6557611e64615442565b5b602002602001018190525073fe2bbc3d86c3e4666d3e352f68b2a224cac2823873ffffffffffffffffffffffffffffffffffffffff1663bac6dd6d838367ffffffffffffffff1681518110611ebd57611ebc615442565b5b602002602001015160a00151611ed2906154a1565b6040518263ffffffff1660e01b8152600401611eee9190615517565b600060405180830381865afa158015611f0b573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611f3491906155a2565b828267ffffffffffffffff1681518110611f5157611f50615442565b5b602002602001015160a00181905250600260008667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff1694508080611fac9061561a565b915050611bfb565b50809150505b92915050565b600060089054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612050576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612047906150fe565b60405180910390fd5b600061205b83614320565b9050600061206883614320565b90508067ffffffffffffffff168267ffffffffffffffff160361208a57600080fd5b6000600260008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1611801561212a57506000600260008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff16115b61213357600080fd5b600260008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff1660026000600260008667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600260008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160189054906101000a900467ffffffffffffffff1660026000600260008667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600260008267ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff16600260008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555080600260008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555081600260008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508160026000600260008667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050505050565b600060089054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612523576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251a906150fe565b60405180910390fd5b600082510361253157600080fd5b600061253c83614320565b67ffffffffffffffff161461255057600080fd5b60008081819054906101000a900467ffffffffffffffff16809291906125759061561a565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505060008054906101000a900467ffffffffffffffff16600160006125be85614359565b815260200190815260200160002060006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506040518060c0016040528060008054906101000a900467ffffffffffffffff1667ffffffffffffffff168152602001600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001600260008067ffffffffffffffff16815260200190815260200160002060000160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1681526020018381526020018260405160200161269e9190615427565b604051602081830303815290604052815250600260008060009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060208201518160000160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060808201518160010190816127bd9190615334565b5060a08201518160020190816127d39190615334565b5090505060008054906101000a900467ffffffffffffffff1660026000600260008067ffffffffffffffff16815260200190815260200160002060000160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008054906101000a900467ffffffffffffffff16600260008067ffffffffffffffff16815260200190815260200160002060000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600260008067ffffffffffffffff168152602001908152602001600020600001600881819054906101000a900467ffffffffffffffff168092919061290f9061561a565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505050565b612942614389565b60006003600061295186614320565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600061297e85614320565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020604051806101000160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152602001600182018054612a849061514d565b80601f0160208091040260200160405190810160405280929190818152602001828054612ab09061514d565b8015612afd5780601f10612ad257610100808354040283529160200191612afd565b820191906000526020600020905b815481529060010190602001808311612ae057829003601f168201915b50505050508152602001600282018054612b169061514d565b80601f0160208091040260200160405190810160405280929190818152602001828054612b429061514d565b8015612b8f5780601f10612b6457610100808354040283529160200191612b8f565b820191906000526020600020905b815481529060010190602001808311612b7257829003601f168201915b50505050508152602001600382018054612ba89061514d565b80601f0160208091040260200160405190810160405280929190818152602001828054612bd49061514d565b8015612c215780601f10612bf657610100808354040283529160200191612c21565b820191906000526020600020905b815481529060010190602001808311612c0457829003601f168201915b50505050508152602001600482018054612c3a9061514d565b80601f0160208091040260200160405190810160405280929190818152602001828054612c669061514d565b8015612cb35780601f10612c8857610100808354040283529160200191612cb3565b820191906000526020600020905b815481529060010190602001808311612c9657829003601f168201915b505050505081525050905073fe2bbc3d86c3e4666d3e352f68b2a224cac2823873ffffffffffffffffffffffffffffffffffffffff1663bac6dd6d8260e00151612cfc906154a1565b6040518263ffffffff1660e01b8152600401612d189190615517565b600060405180830381865afa158015612d35573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190612d5e91906155a2565b8160e001819052508091505092915050565b600060089054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060089054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612e26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1d906150fe565b60405180910390fd5b6000612e3185614320565b90506000612e3e85614320565b90506000612e4b85614320565b90506000612e5885614320565b90508067ffffffffffffffff168367ffffffffffffffff1603612e7a57600080fd5b6000600360008667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff16118015612f6457506000600360008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff16115b612f6d57600080fd5b600360008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff16600360008667ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206000600360008867ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008767ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600360008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160189054906101000a900467ffffffffffffffff16600360008667ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206000600360008867ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008767ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508167ffffffffffffffff168467ffffffffffffffff161461365757600360008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008467ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600360008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008567ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206000820160009054906101000a900467ffffffffffffffff168160000160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000820160089054906101000a900467ffffffffffffffff168160000160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000820160109054906101000a900467ffffffffffffffff168160000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000820160189054906101000a900467ffffffffffffffff168160000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600182018160010190816133b891906156d1565b50600282018160020190816133cd91906156d1565b50600382018160030190816133e291906156d1565b50600482018160040190816133f791906156d1565b5090505081600360008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600260008567ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600001600881819054906101000a900467ffffffffffffffff16809291906134bf9061564a565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050600260008367ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600001600881819054906101000a900467ffffffffffffffff16809291906135349061561a565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050600360008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008467ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600080820160006101000a81549067ffffffffffffffff02191690556000820160086101000a81549067ffffffffffffffff02191690556000820160106101000a81549067ffffffffffffffff02191690556000820160186101000a81549067ffffffffffffffff021916905560018201600061362491906143f6565b60028201600061363491906143f6565b60038201600061364491906143f6565b60048201600061365491906143f6565b50505b600360008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008267ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff16600360008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555080600360008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555082600360008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555082600360008467ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206000600360008667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008767ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505050505050505050565b613907614436565b60006002600061391685614320565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206040518060c00160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152602001600182018054613a1b9061514d565b80601f0160208091040260200160405190810160405280929190818152602001828054613a479061514d565b8015613a945780601f10613a6957610100808354040283529160200191613a94565b820191906000526020600020905b815481529060010190602001808311613a7757829003601f168201915b50505050508152602001600282018054613aad9061514d565b80601f0160208091040260200160405190810160405280929190818152602001828054613ad99061514d565b8015613b265780601f10613afb57610100808354040283529160200191613b26565b820191906000526020600020905b815481529060010190602001808311613b0957829003601f168201915b505050505081525050905073fe2bbc3d86c3e4666d3e352f68b2a224cac2823873ffffffffffffffffffffffffffffffffffffffff1663bac6dd6d8260a00151613b6f906154a1565b6040518263ffffffff1660e01b8152600401613b8b9190615517565b600060405180830381865afa158015613ba8573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190613bd191906155a2565b8160a0018190525080915050919050565b73fe2bbc3d86c3e4666d3e352f68b2a224cac2823881565b6000600260008067ffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff16905090565b600060089054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614613cc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613cbd906150fe565b60405180910390fd5b6000613cd186614320565b90506000600260008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1611613d2857600080fd5b6000855103613d3657600080fd5b6000613d4186614320565b67ffffffffffffffff1614613d5557600080fd5b6000845103613d6357600080fd5b60008081819054906101000a900467ffffffffffffffff1680929190613d889061561a565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505060008054906101000a900467ffffffffffffffff1660016000613dd188614359565b815260200190815260200160002060006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060405180610100016040528060008054906101000a900467ffffffffffffffff1667ffffffffffffffff1681526020018267ffffffffffffffff168152602001600067ffffffffffffffff168152602001600360008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008067ffffffffffffffff16815260200190815260200160002060000160189054906101000a900467ffffffffffffffff1667ffffffffffffffff16815260200186815260200185815260200184815260200183604051602001613ee29190615427565b604051602081830303815290604052815250600360008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008060009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060208201518160000160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060808201518160010190816140269190615334565b5060a082015181600201908161403c9190615334565b5060c08201518160030190816140529190615334565b5060e08201518160040190816140689190615334565b5090505060008054906101000a900467ffffffffffffffff16600360008367ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206000600360008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008067ffffffffffffffff16815260200190815260200160002060000160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008054906101000a900467ffffffffffffffff16600360008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008067ffffffffffffffff16815260200190815260200160002060000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600260008267ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600001600881819054906101000a900467ffffffffffffffff168092919061421d9061561a565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050505050505050565b600060089054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146142dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016142d3906150fe565b60405180910390fd5b80600060086101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006001600061432f84614359565b815260200190815260200160002060009054906101000a900467ffffffffffffffff169050919050565b60008160405160200161436c91906157f5565b604051602081830303815290604052805190602001209050919050565b604051806101000160405280600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001606081526020016060815260200160608152602001606081525090565b5080546144029061514d565b6000825580601f106144145750614433565b601f0160209004906000526020600020908101906144329190614494565b5b50565b6040518060c00160405280600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001600067ffffffffffffffff16815260200160608152602001606081525090565b5b808211156144ad576000816000905550600101614495565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614518826144cf565b810181811067ffffffffffffffff82111715614537576145366144e0565b5b80604052505050565b600061454a6144b1565b9050614556828261450f565b919050565b600067ffffffffffffffff821115614576576145756144e0565b5b61457f826144cf565b9050602081019050919050565b82818337600083830152505050565b60006145ae6145a98461455b565b614540565b9050828152602081018484840111156145ca576145c96144ca565b5b6145d584828561458c565b509392505050565b600082601f8301126145f2576145f16144c5565b5b813561460284826020860161459b565b91505092915050565b6000819050919050565b61461e8161460b565b811461462957600080fd5b50565b60008135905061463b81614615565b92915050565b60008060006060848603121561465a576146596144bb565b5b600084013567ffffffffffffffff811115614678576146776144c0565b5b614684868287016145dd565b935050602084013567ffffffffffffffff8111156146a5576146a46144c0565b5b6146b1868287016145dd565b92505060406146c28682870161462c565b9150509250925092565b600067ffffffffffffffff82169050919050565b6146e9816146cc565b81146146f457600080fd5b50565b600081359050614706816146e0565b92915050565b600080600060608486031215614725576147246144bb565b5b6000614733868287016146f7565b9350506020614744868287016146f7565b9250506040614755868287016146f7565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614794816146cc565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b838110156147d45780820151818401526020810190506147b9565b60008484015250505050565b60006147eb8261479a565b6147f581856147a5565b93506148058185602086016147b6565b61480e816144cf565b840191505092915050565b600061010083016000830151614832600086018261478b565b506020830151614845602086018261478b565b506040830151614858604086018261478b565b50606083015161486b606086018261478b565b506080830151848203608086015261488382826147e0565b91505060a083015184820360a086015261489d82826147e0565b91505060c083015184820360c08601526148b782826147e0565b91505060e083015184820360e08601526148d182826147e0565b9150508091505092915050565b60006148ea8383614819565b905092915050565b6000602082019050919050565b600061490a8261475f565b614914818561476a565b9350836020820285016149268561477b565b8060005b85811015614962578484038952815161494385826148de565b945061494e836148f2565b925060208a0199505060018101905061492a565b50829750879550505050505092915050565b6000602082019050818103600083015261498e81846148ff565b905092915050565b600080604083850312156149ad576149ac6144bb565b5b600083013567ffffffffffffffff8111156149cb576149ca6144c0565b5b6149d7858286016145dd565b925050602083013567ffffffffffffffff8111156149f8576149f76144c0565b5b614a04858286016145dd565b9150509250929050565b600060208284031215614a2457614a236144bb565b5b600082013567ffffffffffffffff811115614a4257614a416144c0565b5b614a4e848285016145dd565b91505092915050565b60008060408385031215614a6e57614a6d6144bb565b5b6000614a7c858286016146f7565b9250506020614a8d858286016146f7565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600060c083016000830151614adb600086018261478b565b506020830151614aee602086018261478b565b506040830151614b01604086018261478b565b506060830151614b14606086018261478b565b5060808301518482036080860152614b2c82826147e0565b91505060a083015184820360a0860152614b4682826147e0565b9150508091505092915050565b6000614b5f8383614ac3565b905092915050565b6000602082019050919050565b6000614b7f82614a97565b614b898185614aa2565b935083602082028501614b9b85614ab3565b8060005b85811015614bd75784840389528151614bb88582614b53565b9450614bc383614b67565b925060208a01995050600181019050614b9f565b50829750879550505050505092915050565b60006020820190508181036000830152614c038184614b74565b905092915050565b60008060408385031215614c2257614c216144bb565b5b600083013567ffffffffffffffff811115614c4057614c3f6144c0565b5b614c4c858286016145dd565b9250506020614c5d8582860161462c565b9150509250929050565b600061010083016000830151614c80600086018261478b565b506020830151614c93602086018261478b565b506040830151614ca6604086018261478b565b506060830151614cb9606086018261478b565b5060808301518482036080860152614cd182826147e0565b91505060a083015184820360a0860152614ceb82826147e0565b91505060c083015184820360c0860152614d0582826147e0565b91505060e083015184820360e0860152614d1f82826147e0565b9150508091505092915050565b60006020820190508181036000830152614d468184614c67565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614d7982614d4e565b9050919050565b614d8981614d6e565b82525050565b6000602082019050614da46000830184614d80565b92915050565b60008060008060808587031215614dc457614dc36144bb565b5b600085013567ffffffffffffffff811115614de257614de16144c0565b5b614dee878288016145dd565b945050602085013567ffffffffffffffff811115614e0f57614e0e6144c0565b5b614e1b878288016145dd565b935050604085013567ffffffffffffffff811115614e3c57614e3b6144c0565b5b614e48878288016145dd565b925050606085013567ffffffffffffffff811115614e6957614e686144c0565b5b614e75878288016145dd565b91505092959194509250565b600060c083016000830151614e99600086018261478b565b506020830151614eac602086018261478b565b506040830151614ebf604086018261478b565b506060830151614ed2606086018261478b565b5060808301518482036080860152614eea82826147e0565b91505060a083015184820360a0860152614f0482826147e0565b9150508091505092915050565b60006020820190508181036000830152614f2b8184614e81565b905092915050565b614f3c816146cc565b82525050565b6000602082019050614f576000830184614f33565b92915050565b600080600080600060a08688031215614f7957614f786144bb565b5b600086013567ffffffffffffffff811115614f9757614f966144c0565b5b614fa3888289016145dd565b955050602086013567ffffffffffffffff811115614fc457614fc36144c0565b5b614fd0888289016145dd565b945050604086013567ffffffffffffffff811115614ff157614ff06144c0565b5b614ffd888289016145dd565b935050606086013567ffffffffffffffff81111561501e5761501d6144c0565b5b61502a888289016145dd565b925050608061503b8882890161462c565b9150509295509295909350565b61505181614d6e565b811461505c57600080fd5b50565b60008135905061506e81615048565b92915050565b60006020828403121561508a576150896144bb565b5b60006150988482850161505f565b91505092915050565b600082825260208201905092915050565b7f4f6e6c792044414f2063616e2063616c6c207468697300000000000000000000600082015250565b60006150e86016836150a1565b91506150f3826150b2565b602082019050919050565b60006020820190508181036000830152615117816150db565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061516557607f821691505b6020821081036151785761517761511e565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026151e07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826151a3565b6151ea86836151a3565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600061523161522c61522784615202565b61520c565b615202565b9050919050565b6000819050919050565b61524b83615216565b61525f61525782615238565b8484546151b0565b825550505050565b600090565b615274615267565b61527f818484615242565b505050565b5b818110156152a35761529860008261526c565b600181019050615285565b5050565b601f8211156152e8576152b98161517e565b6152c284615193565b810160208510156152d1578190505b6152e56152dd85615193565b830182615284565b50505b505050565b600082821c905092915050565b600061530b600019846008026152ed565b1980831691505092915050565b600061532483836152fa565b9150826002028217905092915050565b61533d8261479a565b67ffffffffffffffff811115615356576153556144e0565b5b615360825461514d565b61536b8282856152a7565b600060209050601f83116001811461539e576000841561538c578287015190505b6153968582615318565b8655506153fe565b601f1984166153ac8661517e565b60005b828110156153d4578489015182556001820191506020850194506020810190506153af565b868310156153f157848901516153ed601f8916826152fa565b8355505b6001600288020188555050505b505050505050565b6000819050919050565b61542161541c8261460b565b615406565b82525050565b60006154338284615410565b60208201915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b6000819050602082019050919050565b6000615498825161460b565b80915050919050565b60006154ac82615471565b826154b68461547c565b90506154c18161548c565b92506020821015615501576154fc7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff836020036008026151a3565b831692505b5050919050565b6155118161460b565b82525050565b600060208201905061552c6000830184615508565b92915050565b60006155456155408461455b565b614540565b905082815260208101848484011115615561576155606144ca565b5b61556c8482856147b6565b509392505050565b600082601f830112615589576155886144c5565b5b8151615599848260208601615532565b91505092915050565b6000602082840312156155b8576155b76144bb565b5b600082015167ffffffffffffffff8111156155d6576155d56144c0565b5b6155e284828501615574565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000615625826146cc565b915067ffffffffffffffff820361563f5761563e6155eb565b5b600182019050919050565b6000615655826146cc565b915060008203615668576156676155eb565b5b600182039050919050565b600061567e82615202565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036156b0576156af6155eb565b5b600182019050919050565b6000815490506156ca8161514d565b9050919050565b8181036156df5750506157b7565b6156e8826156bb565b67ffffffffffffffff811115615701576157006144e0565b5b61570b825461514d565b6157168282856152a7565b6000601f8311600181146157455760008415615733578287015490505b61573d8582615318565b8655506157b0565b601f1984166157538761517e565b965061575e8661517e565b60005b8281101561578657848901548255600182019150600185019450602081019050615761565b868310156157a3578489015461579f601f8916826152fa565b8355505b6001600288020188555050505b5050505050505b565b600081905092915050565b60006157cf8261479a565b6157d981856157b9565b93506157e98185602086016147b6565b80840191505092915050565b600061580182846157c4565b91508190509291505056fea2646970667358221220cf6774db3553a381bd42a45ffbe9c096e19f4267223cad7c398e403dabe29efc64736f6c63430008100033