Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --ComputerCraft BigReactors Client by Teki 0.1
- local debugTerm = term.current()
- local oldTerm = term.current()
- local elapsed = os.clock() -- Debug
- local function Debug(str)
- debugTerm.write(str)
- local X,Y = debugTerm.getCursorPos()
- local sX,sY = debugTerm.getSize()
- if X < sX then
- debugTerm.setCursorPos(1, Y+1)
- else
- debugTerm.scroll(1)
- end
- end
- function drawBar(startX, endX, posY, colorFull, colorEmpty, maxSize, currentSize, label)
- -- label = label .. " " .. currentSize .. "/" .. maxSize
- -- label = label .. " " .. currentSize .. "/" .. maxSize
- while ((endX - startX+1) - #label)/2 >= 1 do
- label = " " .. label .. " "
- end
- length = (endX - startX + 1)*(currentSize/maxSize)
- for i=startX, endX do
- monitor.setCursorPos(i, posY)
- if i-startX+1 <= length then
- monitor.setBackgroundColor(colorFull)
- monitor.setTextColor(colorEmpty)
- else
- monitor.setBackgroundColor(colorEmpty)
- monitor.setTextColor(colorFull)
- end
- if #label < i-startX+1 then
- monitor.write(" ")
- else
- monitor.write(label:sub(i-startX+1, i))
- end
- end
- monitor.setBackgroundColour(colors.gray)
- monitor.setTextColor(colors.white)
- end
- local eventType = "mouse_click"
- if peripheral.find("monitor") == nil then
- monitor = term.current()
- else
- monitor = peripheral.find("monitor")
- monitor.setTextScale(1)
- local sizeX,sizeY = monitor.getSize()
- if sizeX < 20 or sizeY < 18 then
- monitor.setTextScale(0.5)
- end
- eventType = "monitor_touch"
- end
- local sizeX,sizeY = monitor.getSize()
- if peripheral.find("modem") == nil then
- return 0
- else
- local side
- local sides = peripheral.getNames()
- for i=1, #sides do
- if peripheral.getType(sides[i]) == "modem" then
- side = sides[i]
- end
- end
- rednet.open(side)
- -- sleep(0)
- end
- -- Reactor data
- local getActive = "ACTIVE"
- local isActivelyCooled = false
- local getHotFluidAmount = 0
- local getHotFluidAmountMax = 0
- local getEnergyProducedLastTick = 0
- local getEnergyStored = 0
- local getEnergyCapacity = 0
- local getFuelAmount = 0
- local getFuelAmountMax = 0
- local getFuelConsumedLastTick = 0
- local getFuelTemperature = 0
- local getFuelReactivity = 0
- local getWasteAmount = 0
- local getCasingTemperature = 0
- local getNumberOfControlRods = 0
- local rodsLevels = {0,0,0,0,0,0}
- local rodsNames = {"","","","","",""}
- local fuelEnergyRatio = 0
- -- Turbine data
- local getActiveT = true
- local getEnergyStoredT = 0
- local getEnergyCapacityT = 0
- local getRotorSpeedT = 0
- local getInputAmountT = 0
- local getInputTypeT = ""
- local getOutputAmountT = 0
- local getOutputTypeT = ""
- local getFluidAmountMaxT = 0
- local getFluidFlowRateT = 0
- local getFluidFlowRateMaxT = 0
- local getFluidFlowRateMaxMaxT = 0
- local getEnergyProducedLastTickT = 0
- local getBladeEfficiencyT = 0
- local getRotorMassT = 0
- local getInductorEngagedT = true
- local eventFired = false
- local id, msg = nil
- local name = 0
- local autoStart = true
- local masterTab = 0
- local tab = 0
- local mult = 0
- local reactorID = nil
- local turbineID = nil
- -- Find Reactor
- rednet.broadcast("getConnected", "CCBRClient")
- reactorID, msg = rednet.receive("CCBRServeur", 1)
- -- Find Turbine
- rednet.broadcast("getConnected", "CCBTClient")
- turbineID, msg = rednet.receive("CCBTServeur", 1)
- if turbineID ~= nil then
- masterTab = 1
- end
- local function roundTo(num, n)
- mult = 10^(n or 0)
- return math.floor(num * mult + 0.5) / mult
- end
- function catchDataR()
- -- Querry All ?
- rednet.send(reactorID, "getAll", "CCBRClient")
- id, msg = rednet.receive("CCBRServeur", 1)
- if msg ~= false and msg ~= true and msg ~= nil then
- --[[
- -- Is Active ?
- getActive = msg[2]
- -- is AutoStart enabled ?
- autoStart = msg[22]
- -- Actively Cooled ?
- isActivelyCooled = msg[18]
- -- Hot Fluid Amount ?
- getHotFluidAmount = msg[21]
- -- Hot Fluid Amount Max?
- getHotFluidAmountMax = msg[15]
- -- Energy Production ?
- getEnergyProducedLastTick = roundTo(msg[11], 2)
- -- Energy Stored ?
- getEnergyStored = msg[4]
- -- Energy Capacity ?
- getEnergyCapacity = msg[5]
- -- Fuel Stored ?
- getFuelAmount = msg[8]
- getFuelAmountMax = msg[10]
- -- Fuel Usage ?
- -- getFuelConsumedLastTick = roundTo((msg[16]*72), 2)
- getFuelConsumedLastTick = msg[17]
- -- Fuel Temperature ?
- getFuelTemperature = roundTo(msg[6], 2)
- -- Fuel Reactivity ?
- getFuelReactivity = roundTo(msg[16], 2)
- -- Waste ?
- getWasteAmount = msg[9]
- -- Casing Temperature ?
- getCasingTemperature = roundTo(msg[7], 2)
- -- How Many rods ?
- getNumberOfControlRods = msg[3]
- -- rods array
- for i = 0,getNumberOfControlRods-1 do
- -- Get rod level
- -- sleep(0)
- -- rednet.send(reactorID, "getControlRodLevel " .. i, "CCBRClient")
- -- id, msg = rednet.receive("CCBRServeur", 10)
- -- if msg ~= nil then
- -- rodsLevels[i] = msg
- rodsLevels[i] = msg[23+i]
- -- end
- -- Get rod Name
- -- sleep(0)
- -- rednet.send(reactorID, "getControlRodName " .. i, "CCBRClient")
- -- id, msg = rednet.receive("CCBRServeur", 10)
- -- if msg ~= nil then
- -- rodsNames[i] = msg
- rodsNames[i] = msg[23+getNumberOfControlRods+i]
- -- end
- end
- ]]--
- -- Is Active ?
- getActive = msg.getActive
- -- is AutoStart enabled ?
- autoStart = msg.autoStart
- -- Actively Cooled ?
- isActivelyCooled = msg.isActivelyCooled
- -- Hot Fluid Amount ?
- getHotFluidAmount = msg.getHotFluidAmount
- -- Hot Fluid Amount Max?
- getHotFluidAmountMax = msg.getHotFluidAmountMax
- -- Energy Production ?
- getEnergyProducedLastTick = roundTo(msg.getEnergyProducedLastTick, 2)
- -- Energy Stored ?
- getEnergyStored = msg.getEnergyStored
- -- Energy Capacity ?
- getEnergyCapacity = msg.getEnergyCapacity
- -- Fuel Stored ?
- getFuelAmount = msg.getFuelAmount
- getFuelAmountMax = msg.getFuelAmountMax
- -- Fuel Usage ?
- -- getFuelConsumedLastTick = roundTo((msg[16]*72), 2)
- getFuelConsumedLastTick = msg.getFuelConsumedLastTick
- -- Fuel Temperature ?
- getFuelTemperature = roundTo(msg.getFuelTemperature, 2)
- -- Fuel Reactivity ?
- getFuelReactivity = roundTo(msg.getFuelReactivity, 2)
- -- Waste ?
- getWasteAmount = msg.getWasteAmount
- -- Casing Temperature ?
- getCasingTemperature = roundTo(msg.getCasingTemperature, 2)
- -- How Many rods ?
- getNumberOfControlRods = msg.getNumberOfControlRods
- -- rods array
- for i = 0,getNumberOfControlRods-1 do
- rodsLevels[i] = msg[i]
- rodsNames[i] = msg[getNumberOfControlRods + i]
- end
- fuelEnergyRatio = 0
- if getFuelConsumedLastTick > 0 then
- fuelEnergyRatio = getEnergyProducedLastTick/getFuelConsumedLastTick
- end
- end
- end
- function drawDataR()
- -- MONITORING SCREEN
- monitor.clear()
- monitor.setCursorPos(1,1)
- if getActive == true then
- paintutils.drawBox(1, 1, sizeX, sizeY, colors.green)
- else
- paintutils.drawBox(1, 1, sizeX, sizeY, colors.orange)
- end
- monitor.setBackgroundColour(colors.gray)
- monitor.setCursorPos(3,3)
- monitor.write("STATUS : ")
- if getActive == true then
- monitor.setTextColor(colors.green)
- monitor.write("ACTIVE")
- else
- monitor.setTextColor(colors.orange)
- monitor.write("NOT ACTIVE")
- end
- monitor.setTextColor(colors.white)
- monitor.setCursorPos(3,5)
- if isActivelyCooled then
- monitor.write("Steam Rate: " .. getEnergyProducedLastTick .. " mB/t")
- monitor.setCursorPos(3,6)
- monitor.write("Steam Tank: " .. getHotFluidAmount .. "/" .. getHotFluidAmountMax .." mB")
- drawBar(3, sizeX-2, 7, colors.green, colors.red, getHotFluidAmountMax, getHotFluidAmount, roundTo(getHotFluidAmountMax/getHotFluidAmount*100) .. "%")
- else
- monitor.write("Energy Rate : " .. getEnergyProducedLastTick .. " RF/t")
- monitor.setCursorPos(3,6)
- monitor.write("RF Stored : " .. getEnergyStored .. " RF")
- if getEnergyCapacity ~= nil then
- drawBar(3, sizeX-2, 7, colors.green, colors.red, getEnergyCapacity, getEnergyStored, roundTo(100/(getEnergyCapacity/getEnergyStored), 3) .. "%")
- end
- end
- monitor.setCursorPos(3,8)
- monitor.write("Fuel : " .. getFuelAmount .. "/" .. getFuelAmountMax .. " mB")
- monitor.setCursorPos(3,9)
- monitor.write("Waste : " .. getWasteAmount .. " mB")
- monitor.setCursorPos(3,11)
- monitor.write("Fuel Usage : " .. roundTo(getFuelConsumedLastTick, 4) .. " mB/t")
- monitor.setCursorPos(3,12)
- monitor.write("Fuel Temp : " .. getFuelTemperature .. " C")
- monitor.setCursorPos(3,13)
- monitor.write("Fuel Reactivity : " .. getFuelReactivity .. " %")
- monitor.setCursorPos(3,14)
- monitor.write("RF/mB : " .. roundTo(fuelEnergyRatio, 2) .. " RF/mB")
- monitor.setCursorPos(3,15)
- monitor.write("Casing Temp : " .. getCasingTemperature .. " C")
- end
- function drawMenuR()
- -- COMMANDS SCREEN
- monitor.clear()
- monitor.setCursorPos(1,1)
- if getActive == true then
- paintutils.drawBox(1, 1, sizeX, sizeY, colors.green)
- else
- paintutils.drawBox(1, 1, sizeX, sizeY, colors.orange)
- end
- monitor.setBackgroundColour(colors.gray)
- monitor.setCursorPos(3,3)
- if getActive == true then
- monitor.setTextColor(colors.red)
- monitor.write("DEACTIVATE")
- else
- monitor.setTextColor(colors.green)
- monitor.write("ACTIVATE")
- end
- monitor.setCursorPos(21,3)
- if autoStart then
- monitor.setTextColor(colors.green)
- monitor.write(" AUTO")
- else
- monitor.setTextColor(colors.red)
- monitor.write("MANUAL")
- end
- monitor.setTextColor(colors.white)
- for i = 0,getNumberOfControlRods-1 do
- monitor.setCursorPos(3,5+i)
- monitor.write("Rod" .. i .. " : " .. rodsLevels[i] .. " %")
- monitor.setCursorPos(17,5+i)
- monitor.write("<< < > >>")
- end
- monitor.setCursorPos(3,5+getNumberOfControlRods)
- monitor.write("ALL" .. " : " .. rodsLevels[0] .. " %")
- monitor.setCursorPos(17,5+getNumberOfControlRods)
- monitor.write("<< < > >>")
- end
- function catchDataT()
- -- Querry All ?
- sleep(0)
- rednet.send(turbineID, "getAll", "CCBTClient")
- id, msg = rednet.receive("CCBTServeur", 1)
- if msg ~= false and msg ~= true and msg ~= nil then
- -- Is Active ?
- -- getActiveT = msg[2]
- -- getEnergyStoredT = roundTo(msg[3], 0)
- -- getRotorSpeedT = roundTo(msg[4], 2)
- -- getInputAmountT = msg[5]
- -- getInputTypeT = msg[6]
- -- getOutputAmountT = msg[7]
- -- getOutputTypeT = msg[8]
- -- getFluidAmountMaxT = msg[9]
- -- getFluidFlowRateT = roundTo(msg[10], 2)
- -- getFluidFlowRateMaxT = roundTo(msg[11], 0)
- -- getFluidFlowRateMaxMaxT = roundTo(msg[12], 0)
- -- getEnergyProducedLastTickT = roundTo(msg[13], 2)
- -- getBladeEfficiencyT = msg[15]
- -- getRotorMassT = msg[16]
- -- getInductorEngagedT = msg[17]
- -- autoStart = msg[20]
- getActiveT = msg.getActive
- getEnergyStoredT = roundTo(msg.getEnergyStored, 0)
- getEnergyCapacityT = roundTo(msg.getEnergyCapacity, 0)
- getRotorSpeedT = roundTo(msg.getRotorSpeed, 2)
- getInputAmountT = msg.getInputAmount
- getInputTypeT = msg.getInputType
- getOutputAmountT = msg.getOutputAmount
- getOutputTypeT = msg.getOutputType
- getFluidAmountMaxT = msg.getFluidAmountMax
- getFluidFlowRateT = roundTo(msg.getFluidFlowRate, 2)
- getFluidFlowRateMaxT = roundTo(msg.getFluidFlowRateMax, 0)
- getFluidFlowRateMaxMaxT = roundTo(msg.getFluidFlowRateMaxMax, 0)
- getEnergyProducedLastTickT = roundTo(msg.getEnergyProducedLastTick, 2)
- getBladeEfficiencyT = msg.getBladeEfficiency
- getRotorMassT = msg.getRotorMass
- getInductorEngagedT = msg.getInductorEngaged
- autoStart = msg.autoStart
- end
- end
- function drawDataT()
- -- MONITORING SCREEN
- monitor.clear()
- monitor.setCursorPos(1,1)
- if getActiveT == true then
- paintutils.drawBox(1, 1, sizeX, sizeY, colors.green)
- else
- paintutils.drawBox(1, 1, sizeX, sizeY, colors.orange)
- end
- monitor.setBackgroundColour(colors.gray)
- monitor.setCursorPos(3,3)
- monitor.write("STATUS : ")
- if getActiveT == true then
- monitor.setTextColor(colors.green)
- monitor.write("ACTIVE")
- else
- monitor.setTextColor(colors.orange)
- monitor.write("NOT ACTIVE")
- end
- monitor.setTextColor(colors.white)
- monitor.setCursorPos(3,4)
- monitor.write("COILS : ")
- if getInductorEngagedT == true then
- monitor.setTextColor(colors.green)
- monitor.write("Engaged")
- else
- monitor.setTextColor(colors.orange)
- monitor.write("Disengaged")
- end
- monitor.setTextColor(colors.white)
- monitor.setCursorPos(3,6)
- monitor.write("RF rate : " .. getEnergyProducedLastTickT .. " RF/t")
- monitor.setCursorPos(3,7)
- monitor.write("RF stored : " .. getEnergyStoredT .. " RF")
- drawBar(3, sizeX-2, 8, colors.green, colors.red, getEnergyCapacityT, getEnergyStoredT, roundTo(100/(getEnergyCapacityT/getEnergyStoredT), 3) .. "%")
- monitor.setCursorPos(3,9)
- monitor.write("Rotor speed : " .. getRotorSpeedT .. " RPM")
- monitor.setCursorPos(3,10)
- monitor.write("Blade efficiency : " .. getBladeEfficiencyT .. " %")
- monitor.setCursorPos(3,12)
- monitor.write("Input amount : " .. getInputAmountT .. " mB")
- monitor.setCursorPos(3,13)
- monitor.write("Output amount : " .. getOutputAmountT .. " mB")
- end
- function drawMenuT()
- -- COMMANDS SCREEN
- monitor.clear()
- monitor.setCursorPos(1,1)
- if getActiveT == true then
- paintutils.drawBox(1, 1, sizeX, sizeY, colors.green)
- else
- paintutils.drawBox(1, 1, sizeX, sizeY, colors.orange)
- end
- monitor.setBackgroundColour(colors.gray)
- monitor.setCursorPos(3,3)
- if getActiveT == true then
- monitor.setTextColor(colors.red)
- monitor.write("DEACTIVATE")
- else
- monitor.setTextColor(colors.green)
- monitor.write("ACTIVATE")
- end
- monitor.setCursorPos(3,4)
- if getInductorEngagedT == true then
- monitor.setTextColor(colors.red)
- monitor.write("DISENGAGE COILS")
- else
- monitor.setTextColor(colors.green)
- monitor.write("ENGAGE COILS")
- end
- monitor.setCursorPos(21,3)
- if autoStart then
- monitor.setTextColor(colors.green)
- monitor.write(" AUTO")
- else
- monitor.setTextColor(colors.red)
- monitor.write("MANUAL")
- end
- monitor.setTextColor(colors.white)
- monitor.setCursorPos(3,6)
- monitor.write("Flow rate : ")
- monitor.setCursorPos(15,6)
- monitor.write(tonumber(getFluidFlowRateMaxT) .. " mb/T")
- monitor.setCursorPos(6,7)
- monitor.write("<<< << < > >> >>>")
- end
- function drawTabs()
- if masterTab == 0 then
- monitor.setCursorPos(3, sizeY-1)
- monitor.write("Reactor")
- elseif masterTab == 1 then
- monitor.setCursorPos(3, sizeY-1)
- monitor.write("Turbine")
- end
- if tab == 0 then
- monitor.setBackgroundColour(colors.lightGray)
- else
- monitor.setBackgroundColour(colors.gray)
- end
- monitor.setCursorPos(sizeX-14, sizeY-1)
- monitor.write("Info")
- if tab == 1 then
- monitor.setBackgroundColour(colors.lightGray)
- else
- monitor.setBackgroundColour(colors.gray)
- end
- monitor.setCursorPos(sizeX-9, sizeY-1)
- monitor.write("Controls")
- monitor.setBackgroundColour(colors.gray)
- end
- function catchEvents()
- -- EVENTS
- local event, side, xPos, yPos = os.pullEvent(eventType)
- -- eventFired = true
- -- while eventFired do
- -- sleep(0)
- -- end
- if turbineID ~= nil and (xPos >= 3 and xPos <= 9 and yPos == sizeY-1) then
- if masterTab == 0 then
- masterTab = 1
- else
- masterTab = 0
- end
- elseif (xPos >= sizeX-14 and xPos <= sizeX-10 and yPos == sizeY-1) then
- tab = 0
- elseif (xPos >= sizeX-9 and xPos <= sizeX-2 and yPos == sizeY-1) then
- tab = 1
- elseif tab == 1 and masterTab == 0 then
- if (xPos >= 3 and xPos <= 11) and (yPos == 3) then
- if getActive == true then
- sleep(0)
- rednet.send(reactorID,"setActive false", "CCBRClient")
- else
- sleep(0)
- rednet.send(reactorID,"setActive true", "CCBRClient")
- end
- elseif (xPos >= 21 and xPos <= 27) and (yPos == 3) then
- if autoStart == true then
- sleep(0)
- rednet.send(reactorID,"setAutoStart false", "CCBRClient")
- else
- sleep(0)
- rednet.send(reactorID,"setAutoStart true", "CCBRClient")
- end
- else
- local touched = false
- local touchedId = 0
- local touchedAction = 0
- for i=0,getNumberOfControlRods do
- name = i
- if i == getNumberOfControlRods then
- name = "ALL"
- end
- if (xPos >= 16 and xPos <= 18 and yPos == 5+i) then
- touched = true
- touchedId = i
- touchedAction = -10
- elseif (xPos >= 19 and xPos <= 21 and yPos == 5+i) then
- touched = true
- touchedId = i
- touchedAction = -1
- elseif (xPos >= 22 and xPos <= 24 and yPos == 5+i) then
- touched = true
- touchedId = i
- touchedAction = 1
- elseif (xPos >= 25 and xPos <= 27 and yPos == 5+i) then
- touched = true
- touchedId = i
- touchedAction = 10
- end
- end
- if (touched) then
- if (touchedId == getNumberOfControlRods) then
- sleep(0)
- rednet.send(reactorID,"setAllControlRodLevels " .. rodsLevels[0] + touchedAction, "CCBRClient")
- else
- sleep(0)
- rednet.send(reactorID,"setControlRodLevel " .. touchedId .. " " .. rodsLevels[touchedId] + touchedAction, "CCBRClient")
- end
- end
- end
- elseif tab == 1 and masterTab == 1 then
- if (xPos >= 3 and xPos <= 11) and (yPos == 3) then
- if getActiveT == true then
- sleep(0)
- rednet.send(turbineID,"setActive false", "CCBTClient")
- else
- sleep(0)
- rednet.send(turbineID,"setActive true", "CCBTClient")
- end
- elseif (xPos >= 3 and xPos <= 15) and (yPos == 4) then
- if getInductorEngagedT == true then
- sleep(0)
- rednet.send(turbineID,"setInductorEngaged false", "CCBTClient")
- else
- sleep(0)
- rednet.send(turbineID,"setInductorEngaged true", "CCBTClient")
- end
- elseif (xPos >= 21 and xPos <= 27) and (yPos == 3) then
- if autoStart == true then
- sleep(0)
- rednet.send(turbineID,"setAutoStart false", "CCBTClient")
- else
- sleep(0)
- rednet.send(turbineID,"setAutoStart true", "CCBTClient")
- end
- else
- local touched = false
- local touchedAction = 0
- if (xPos >= 6 and xPos <= 8 and yPos == 7) then
- touched = true
- touchedAction = -100
- elseif (xPos >= 10 and xPos <= 11 and yPos == 7) then
- touched = true
- touchedAction = -10
- elseif (xPos >= 13 and xPos <= 13 and yPos == 7) then
- touched = true
- touchedAction = -1
- elseif (xPos >= 16 and xPos <= 16 and yPos == 7) then
- touched = true
- touchedAction = 1
- elseif (xPos >= 18 and xPos <= 19 and yPos == 7) then
- touched = true
- touchedAction = 10
- elseif (xPos >= 21 and xPos <= 23 and yPos == 7) then
- touched = true
- touchedAction = 100
- end
- if (touched) then
- sleep(0)
- rednet.send(turbineID,"setFluidFlowRateMax " .. getFluidFlowRateMaxT + touchedAction, "CCBTClient")
- end
- end
- end
- eventFired = true
- end
- function drawAll()
- while not eventFired do
- term.redirect(monitor)
- if masterTab == 0 then
- -- catchDataR()
- if tab == 0 then
- drawDataR()
- elseif tab == 1 then
- drawMenuR()
- end
- elseif masterTab == 1 then
- -- catchDataT()
- if tab == 0 then
- drawDataT()
- elseif tab == 1 then
- drawMenuT()
- end
- end
- drawTabs()
- term.redirect(oldTerm)
- -- Debug
- -- monitor.setBackgroundColor(colors.white)
- -- monitor.setTextColor(colors.black)
- local elapsedTime = "" .. roundTo((os.clock()- elapsed)/0.05, 1)
- monitor.setCursorPos(sizeX-#elapsedTime, 2)
- monitor.write(elapsedTime)
- elapsed = os.clock()
- -- while (os.clock()- elapsed)/0.05 < 1.05 do
- while os.clock()- elapsed <= 0.051 do
- sleep(0)
- end
- -- End Debug
- -- sleep(0)
- -- sleep(0.1)
- end
- -- eventFired = false
- end
- function updateLoop()
- while not eventFired do
- if masterTab == 0 then
- catchDataR()
- elseif masterTab == 1 then
- catchDataT()
- end
- sleep(0)
- end
- -- eventFired = false
- end
- while true do
- -- parallel.waitForAny(function() parallel.waitForAll(catchEvents, drawAll) end, function() sleep(5) end)
- -- parallel.waitForAll(catchEvents, drawAll)
- parallel.waitForAll(updateLoop, function() parallel.waitForAll(catchEvents, drawAll) end)
- eventFired = false
- -- sleep(0)
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement