import Prelude hiding (log, length, readFile, getContents)
import Control.Concurrent (forkIO, killThread)
import Prelude hiding (log, length, readFile, getContents)
import Control.Concurrent (forkIO, killThread)
import Data.ByteString.Char8 (ByteString, getContents, readFile)
import qualified FuncTorrent.FileSystem as FS (createMsgChannel, pieceMapFromFile, run)
import FuncTorrent.Logger (initLogger, logMessage, logStop)
import Data.ByteString.Char8 (ByteString, getContents, readFile)
import qualified FuncTorrent.FileSystem as FS (createMsgChannel, pieceMapFromFile, run)
import FuncTorrent.Logger (initLogger, logMessage, logStop)
import FuncTorrent.Metainfo (Info(..), Metainfo(..), torrentToMetainfo)
import FuncTorrent.Peer (handlePeerMsgs)
import FuncTorrent.PieceManager (initPieceMap)
import qualified FuncTorrent.Server as Server
import FuncTorrent.Tracker (runTracker, getConnectedPeers, newTracker)
import Network (PortID (PortNumber))
import FuncTorrent.Metainfo (Info(..), Metainfo(..), torrentToMetainfo)
import FuncTorrent.Peer (handlePeerMsgs)
import FuncTorrent.PieceManager (initPieceMap)
import qualified FuncTorrent.Server as Server
import FuncTorrent.Tracker (runTracker, getConnectedPeers, newTracker)
import Network (PortID (PortNumber))
import System.Directory (doesFileExist)
import System.Environment (getArgs)
import System.Exit (exitSuccess)
import System.Directory (doesFileExist)
import System.Environment (getArgs)
import System.Exit (exitSuccess)
import System.Random (getStdGen, randomRs)
logError :: String -> (String -> IO ()) -> IO ()
import System.Random (getStdGen, randomRs)
logError :: String -> (String -> IO ()) -> IO ()