Advertisement
ssccsscc

[TPT] Layering Helper Remastered

Mar 18th, 2018
266
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 18.64 KB | None | 0 0
  1.  
  2. local addComponent = {}
  3. local interface_s = {
  4.     Components = {}
  5. }
  6.  
  7. interface_s.Components.Window = {}
  8. interface_s.Components.Button = {}
  9. interface_s.Components.Selection = {}
  10. interface_s.Components.SelectionMover = {}
  11. local windows = {}
  12.  
  13. local step = nil
  14. local click = nil
  15. local key = nil
  16.  
  17. --=================================================================--
  18. --                       THEME START                               --
  19. --=================================================================--
  20. local DefaultTheme = {
  21.   Window = {},
  22.   Button = {},
  23.   Selection = {}
  24. }
  25. DefaultTheme.Window = {}
  26. DefaultTheme.Window.BackColor = gfx.getHexColor(0,0,0,255)
  27. DefaultTheme.Window.UnfocusedBackColor = gfx.getHexColor(0,0,0,255)
  28. DefaultTheme.Window.BorderColor = gfx.getHexColor(255,255,255,255)
  29. DefaultTheme.Window.UnfocusedBorderColor = gfx.getHexColor(150,150,150,255)
  30. DefaultTheme.Window.HeaderColor = gfx.getHexColor(150,150,255,255)
  31. DefaultTheme.Window.UnfocusedHeaderColor = gfx.getHexColor(32,32,55,255)
  32.  
  33. DefaultTheme.Button.BackColor = gfx.getHexColor(0,0,0,0)
  34. DefaultTheme.Button.UnfocusedBackColor = gfx.getHexColor(0,0,0,0)
  35. DefaultTheme.Button.PressedBackColor = gfx.getHexColor(240,240,240,255)
  36. DefaultTheme.Button.BorderColor = gfx.getHexColor(255,255,255,255)
  37. DefaultTheme.Button.UnfocusedBorderColor = gfx.getHexColor(150,150,150,255)
  38. DefaultTheme.Button.MouseOverColor = gfx.getHexColor(255,255,255,128)
  39. DefaultTheme.Button.UnfocusedMouseOverColor = gfx.getHexColor(150,150,150,128)
  40. DefaultTheme.Button.TextColor = gfx.getHexColor(255,255,255,255)
  41. DefaultTheme.Button.UnfocusedTextColor = gfx.getHexColor(150,150,150,255)
  42. DefaultTheme.Button.PressedTextColor = gfx.getHexColor(0,0,0,255)
  43.  
  44. DefaultTheme.Selection.BackColor = gfx.getHexColor(140,140,200,100)
  45. DefaultTheme.Selection.BorderColor = gfx.getHexColor(140,140,200,255)
  46. --=================================================================--
  47. --                         THEME END                               --
  48. --=================================================================--
  49.  
  50. function interface_s.Components.Window:new(x, y, Width, Height, Movable, theme)
  51.   local obj= {}
  52.   obj.X = x
  53.   obj.Y = y
  54.   obj.Width = Width
  55.   obj.Height = Height
  56.   obj.Focused=false
  57.   obj.Items = {}
  58.   obj.MoveStartX = -1
  59.   obj.MoveStartY = -1
  60.   obj.IsMoving = false
  61.   obj.Theme = theme
  62.   obj.IsShowing = true
  63.   obj.IsMovable = Movable
  64.   function obj:Draw(IsFocused,mx,my)
  65.     self.Focused=IsFocused
  66.     if IsFocused == true then
  67.       gfx.fillRect(self.X, self.Y, self.Width,self.Height, gfx.getColors(self.Theme.Window.BackColor))
  68.       gfx.drawRect(self.X, self.Y, self.Width,self.Height, gfx.getColors(self.Theme.Window.BorderColor))
  69.       if self.IsMovable then
  70.         gfx.fillRect(self.X, self.Y, self.Width,8, gfx.getColors(self.Theme.Window.HeaderColor))
  71.       end
  72.     else
  73.       gfx.fillRect(self.X, self.Y, self.Width,self.Height, gfx.getColors(self.Theme.Window.UnfocusedBackColor))
  74.       gfx.drawRect(self.X, self.Y, self.Width,self.Height, gfx.getColors(self.Theme.Window.UnfocusedBorderColor))
  75.       if self.IsMovable then
  76.         gfx.fillRect(self.X, self.Y, self.Width,8, gfx.getColors(self.Theme.Window.UnfocusedHeaderColor))
  77.       end
  78.     end
  79.     for i=0,#self.Items do
  80.       if (self.Items[i]~=nil) and (self.Items[i].IsShowing==true) then
  81.         self.Items[i]:Draw(IsFocused,self.X,self.Y,mx-self.X,my-self.Y)
  82.       end
  83.     end
  84.   end
  85.   function obj:Show()
  86.     self.IsShowing = true
  87.   end
  88.   function obj:Hide()
  89.     self.IsShowing = false
  90.   end
  91.   function obj:AddComponent(component)
  92.     self.Items[#self.Items+1] = component
  93.   end
  94.   function obj:Click(x,y,e,b)
  95.     if (self.IsMovable) and (e==3) and (self.IsMoving) then
  96.       self.X = self.X - self.MoveStartX + x
  97.       self.Y = self.Y - self.MoveStartY + y
  98.       self.MoveStartX = x
  99.       self.MoveStartY = y
  100.     else
  101.       if (self.IsMovable) and (e==2) and (self.IsMoving) then
  102.         self.IsMoving = false
  103.       end
  104.     end
  105.     if (x>self.X) and (x<self.X+self.Width) and (y>self.Y) and (y<self.Y+self.Height) then
  106.       if self.Focused then
  107.         if (self.IsMovable) and (y>self.Y) and (y<self.Y+8) and (e==1) then
  108.           self.MoveStartX = x
  109.           self.MoveStartY = y
  110.           self.IsMoving = true
  111.         end
  112.         for i=0,#self.Items do
  113.           if (self.Items[i]~=nil) and (self.Items[i].IsShowing==true) then
  114.             if self.Items[i]:Click(x-self.X,y-self.Y,e,b) then
  115.               break
  116.             end
  117.           end
  118.         end
  119.         return true
  120.       else
  121.         if e==1 then
  122.           return true
  123.         end
  124.       end
  125.     else
  126.       if (self.IsMovable) and (e==3) and (self.IsMoving) and (self.IsMoving) then
  127.         self.X = self.X - self.MoveStartX + x
  128.         self.Y = self.Y - self.MoveStartY + y
  129.         self.MoveStartX = x
  130.         self.MoveStartY = y
  131.         return true
  132.       end
  133.       return false
  134.     end
  135.   end
  136.   setmetatable(obj, self)
  137.   self.__index = self;
  138.   return obj
  139. end
  140.  
  141. function interface_s.Components.Button:new(x, y, Width, Height, text, theme)
  142.   local obj= {}
  143.   obj.X = x
  144.   obj.Y = y
  145.   obj.Width = Width
  146.   obj.Height = Height
  147.   obj.Focused=false
  148.   obj.Theme = theme
  149.   obj.IsShowing = true
  150.   obj.Text = text
  151.   obj.TextW,obj.TextH = gfx.textSize(obj.Text)
  152.   obj.IsPressed = false
  153.   obj.Pressed = false
  154.   obj.OnPressed = nil
  155.   function obj:Draw(IsFocused, baseX, baseY,x,y)
  156.     self.Focused=IsFocused
  157.     if IsFocused == true then
  158.       if (x>self.X) and (x<self.X+self.Width) and (y>self.Y) and (y<self.Y+self.Height) then
  159.         if self.IsPressed then
  160.           gfx.fillRect(self.X+baseX, self.Y+baseY, self.Width,self.Height, gfx.getColors(self.Theme.Button.PressedBackColor))
  161.           gfx.drawText(self.X+baseX+(self.Width-self.TextW)/2, self.Y+baseY + (self.Height-5)/2, self.Text, gfx.getColors(self.Theme.Button.PressedTextColor))
  162.         else
  163.           gfx.fillRect(self.X+baseX, self.Y+baseY, self.Width,self.Height, gfx.getColors(self.Theme.Button.MouseOverColor))
  164.           gfx.drawText(self.X+baseX+(self.Width-self.TextW)/2, self.Y+baseY + (self.Height-5)/2, self.Text, gfx.getColors(self.Theme.Button.TextColor))
  165.         end
  166.       else
  167.         gfx.fillRect(self.X+baseX, self.Y+baseY, self.Width,self.Height, gfx.getColors(self.Theme.Button.BackColor))
  168.         gfx.drawText(self.X+baseX+(self.Width-self.TextW)/2, self.Y+baseY + (self.Height-5)/2, self.Text, gfx.getColors(self.Theme.Button.TextColor))
  169.       end
  170.       gfx.drawRect(self.X+baseX, self.Y+baseY, self.Width,self.Height, gfx.getColors(self.Theme.Button.BorderColor))
  171.     else
  172.       if (x>self.X) and (x<self.X+self.Width) and (y>self.Y) and (y<self.Y+self.Height) then
  173.         if self.IsPressed then
  174.           gfx.fillRect(self.X+baseX, self.Y+baseY, self.Width,self.Height, gfx.getColors(self.Theme.Button.PressedBackColor))
  175.           gfx.drawText(self.X+baseX+(self.Width-self.TextW)/2, self.Y+baseY + (self.Height-5)/2, self.Text, gfx.getColors(self.Theme.Button.PressedTextColor))
  176.         else
  177.           gfx.fillRect(self.X+baseX, self.Y+baseY, self.Width,self.Height, gfx.getColors(self.Theme.Button.UnfocusedMouseOverColor))
  178.           gfx.drawText(self.X+baseX+(self.Width-self.TextW)/2, self.Y+baseY + (self.Height-5)/2, self.Text, gfx.getColors(self.Theme.Button.UnfocusedTextColor))
  179.         end
  180.       else
  181.         gfx.fillRect(self.X+baseX, self.Y+baseY, self.Width,self.Height, gfx.getColors(self.Theme.Button.UnfocusedBackColor))
  182.         gfx.drawText(self.X+baseX+(self.Width-self.TextW)/2, self.Y+baseY + (self.Height-5)/2, self.Text, gfx.getColors(self.Theme.Button.UnfocusedTextColor))
  183.       end
  184.       gfx.drawRect(self.X+baseX, self.Y+baseY, self.Width,self.Height, gfx.getColors(self.Theme.Button.UnfocusedBorderColor))
  185.     end
  186.     if (x>self.X) and (x<self.X+self.Width) and (y>self.Y) and (y<self.Y+self.Height) then
  187.     else
  188.       self.Pressed = false
  189.       self.IsPressed = false
  190.     end
  191.   end
  192.   function obj:Show()
  193.     self.IsShowing = true
  194.   end
  195.   function obj:Hide()
  196.     self.IsShowing = false
  197.   end
  198.   function obj:Click(x,y,e,b)
  199.     if (x>self.X) and (x<self.X+self.Width) and (y>self.Y) and (y<self.Y+self.Height) and (self.IsPressed) and (self.Pressed) and (e==2) then
  200.       if self.OnPressed~=nil then
  201.         self.OnPressed()
  202.       end
  203.       self.IsPressed = false
  204.       self.Pressed = false
  205.     end
  206.     if (x>self.X) and (x<self.X+self.Width) and (y>self.Y) and (y<self.Y+self.Height) and (self.Pressed) and (e==3) then
  207.       self.IsPressed = true
  208.     end
  209.     if (x>self.X) and (x<self.X+self.Width) and (y>self.Y) and (y<self.Y+self.Height) and (e==1) then
  210.       self.Pressed = true
  211.       return true
  212.     else
  213.       return false
  214.     end
  215.   end
  216.   setmetatable(obj, self)
  217.   self.__index = self;
  218.   return obj
  219. end
  220.  
  221. function interface_s.Components.Selection:new(x, y, theme)
  222.   local obj= {}
  223.   obj.X = x
  224.   obj.Y = y
  225.   obj.Focused=false
  226.   obj.Theme = theme
  227.   obj.IsShowing = true
  228.   obj.IsPointSet = false
  229.   obj.FirstPointX = -1
  230.   obj.FirstPointY = -1
  231.   obj.IsFinished = false
  232.   obj.EndPointX = -1
  233.   obj.EndPointY = -1
  234.   obj.OnSelectionStart = nil
  235.   obj.OnSelected = nil
  236.   obj.OnSelectionAborted = nil
  237.   obj.V2EndWidth = -1
  238.   obj.V2EndHeight = -1
  239.   obj.V2StartX = -1
  240.   obj.V2StartY = -1
  241.   function obj:Draw(IsFocused,x,y)
  242.     self.Focused = IsFocused
  243.     if IsFocused then
  244.       if (self.IsPointSet) and (self.IsFinished==false) then
  245.         local arg11 = -1
  246.         local arg12 = -1
  247.         local arg21 = -1
  248.         local arg22 = -1
  249.         if self.FirstPointX-x>=0 then
  250.           arg11 = x
  251.           arg12 = self.FirstPointX-x
  252.         else
  253.           arg11 = self.FirstPointX
  254.           arg12 = x-self.FirstPointX
  255.         end
  256.         if self.FirstPointY - y>=0 then
  257.           arg21 = y
  258.           arg22 = self.FirstPointY - y
  259.         else
  260.           arg21 = self.FirstPointY
  261.           arg22 = y-self.FirstPointY
  262.         end
  263.         if (self.IsFinished==false) and (self.IsPointSet==true)  then
  264.           self.V2EndWidth = arg12
  265.           self.V2EndHeight = arg22
  266.           self.V2StartX = arg11
  267.           self.V2StartY = arg21
  268.         end
  269.         gfx.fillRect(arg11, arg21, arg12,arg22, gfx.getColors(self.Theme.Selection.BackColor))
  270.         gfx.drawRect(arg11, arg21, arg12,arg22, gfx.getColors(self.Theme.Selection.BorderColor))
  271.       end
  272.     else
  273.       self.IsPointSet = false
  274.     end
  275.   end
  276.   function obj:Show()
  277.     self.IsShowing = true
  278.   end
  279.   function obj:Hide()
  280.     self.IsShowing = false
  281.   end
  282.   function obj:Click(x,y,e,b)
  283.     if (e==1) and (self.IsPointSet==false) and (b==1) then
  284.       self.IsPointSet = true
  285.       self.FirstPointX = x
  286.       self.FirstPointY = y
  287.       if self.OnSelectionStart ~= nil then
  288.         self.OnSelectionStart(self.FirstPointX,self.FirstPointY)
  289.       end
  290.       return true
  291.     else if (e==2) and (self.IsPointSet==true) and (b==1) and (self.IsFinished == false) then
  292.       self.IsFinished = true
  293.       self.EndPointX = x
  294.       self.EndPointY = y
  295.       if self.OnSelected ~= nil then
  296.         self.OnSelected(self.FirstPointX,self.FirstPointY,self.EndPointX,self.EndPointY, self.V2StartX, self.V2StartY, self.V2EndWidth,self.V2EndHeight)
  297.       end
  298.       return true
  299.       end
  300.       if (self.IsPointSet==true) and (b~=1) and (self.IsFinished==false) then
  301.         self.IsPointSet=false
  302.         if self.OnSelectionAborted ~= nil then
  303.           self.OnSelectionAborted()
  304.         end
  305.       end
  306.     end
  307.   end
  308.   setmetatable(obj, self)
  309.   self.__index = self;
  310.   return obj
  311. end
  312.  
  313. function interface_s.Components.SelectionMover:new(x, y,w,h, theme)
  314.   local obj= {}
  315.   obj.X = x
  316.   obj.Y = y
  317.   obj.Focused=false
  318.   obj.Theme = theme
  319.   obj.IsShowing = true
  320.   obj.Width = w
  321.   obj.Height = h
  322.   obj.OnMovement = nil
  323.   obj.OnAbort = nil
  324.   obj.OnDone = nil
  325.   obj.MoveStartX = -1
  326.   obj.MoveStartY = -1
  327.   obj.NewPosX = -1
  328.   obj.NewPosY = -1
  329.   obj.IsMoving = false
  330.   obj.SumDX = 0
  331.   obj.SumDY = 0
  332.   obj.IsMoved = false
  333.   function obj:Draw(IsFocused,x,y)
  334.     self.Focused = IsFocused
  335.     if IsFocused then
  336.       gfx.fillRect(self.X, self.Y, self.Width,self.Height, gfx.getColors(self.Theme.Selection.BackColor))
  337.       gfx.drawRect(self.X, self.Y, self.Width,self.Height, gfx.getColors(self.Theme.Selection.BorderColor))
  338.     else
  339.       gfx.fillRect(self.X, self.Y, self.Width,self.Height, gfx.getColors(self.Theme.Selection.BackColor))
  340.       gfx.drawRect(self.X, self.Y, self.Width,self.Height, gfx.getColors(self.Theme.Selection.BorderColor))
  341.     end
  342.   end
  343.   function obj:Show()
  344.     self.IsShowing = true
  345.   end
  346.   function obj:Hide()
  347.     self.IsShowing = false
  348.   end
  349.   function obj:Click(x,y,e,b)
  350.     if (e==1) and (b==4) then
  351.       if self.OnAbort ~= nil then
  352.         self.OnAbort(self.SumDX,self.SumDY)
  353.       end
  354.     end
  355.     if (e==3) and (self.IsMoving) then
  356.       if self.OnMovement ~= nil then
  357.         self.OnMovement(-self.MoveStartX + x,- self.MoveStartY + y)
  358.       end
  359.       if (-self.MoveStartX + x ~= 0) and (- self.MoveStartY + y ~= 0) then
  360.         self.IsMoved = true
  361.       end
  362.       self.SumDX = self.SumDX - self.MoveStartX + x
  363.       self.SumDY = self.SumDY - self.MoveStartY + y
  364.       self.X = self.X - self.MoveStartX + x
  365.       self.Y = self.Y - self.MoveStartY + y
  366.       self.MoveStartX = x
  367.       self.MoveStartY = y
  368.  
  369.     else
  370.       if (e==2) and (self.IsMoving) then
  371.         if self.IsMoved == false then
  372.           if self.OnDone ~= nil then
  373.             self.OnDone(self.SumDX,self.SumDY)
  374.           end
  375.         end
  376.         self.IsMoving = false
  377.       end
  378.     end
  379.     if (x>self.X) and (x<self.X+self.Width) and (y>self.Y) and (y<self.Y+self.Height) then
  380.       if self.Focused then
  381.         if (y>self.Y) and (y<self.Y+self.Height) and (e==1) then
  382.           self.MoveStartX = x
  383.           self.MoveStartY = y
  384.           self.IsMoving = true
  385.         end
  386.         if (e==1) and (b==1) then
  387.           self.IsMoved = false
  388.         end
  389.         return true
  390.       end
  391.     else
  392.       return true
  393.     end
  394.   end
  395.   setmetatable(obj, self)
  396.   self.__index = self;
  397.   return obj
  398. end
  399.  
  400.  
  401. local function addLeft(obj)
  402.   for i=#windows+1,1,-1 do
  403.     windows[i]=windows[i-1]
  404.   end
  405.   windows[0]=obj
  406. end
  407.  
  408. local function addComponent(obj)
  409.   addLeft(obj)
  410. end
  411.  
  412. local function GetComponentIndex(obj)
  413.   for i=0, #windows do
  414.     if windows[i] == obj then
  415.       return i
  416.     end
  417.   end
  418.   return -1
  419. end
  420.  
  421. local function RemoveComponent(obj)
  422.   local index = GetComponentIndex(obj)
  423.   if index~=-1 then
  424.     for i=index, #windows-1 do
  425.       windows[i]=windows[i+1]
  426.     end
  427.     windows[#windows] = nil
  428.   end
  429. end
  430.  
  431. local function focusComponent(index)
  432.   local temp= windows[index]
  433.   for i=index, 1,-1 do
  434.     windows[i] = windows[i-1]
  435.   end
  436.   windows[0] = temp
  437. end
  438.  
  439. --=================================================================--
  440. --                    CODE IS BELOW THIS LINE                      --
  441. --=================================================================--
  442. function layer()
  443.   Layer()
  444. end
  445. function Layer()
  446.   tpt.log("Press \"Select\" to start.")
  447.   tpt.register_step(step)
  448.   tpt.register_mouseclick(click)
  449.   tpt.register_keypress(key)
  450.   local pause = false
  451.   if tpt.set_pause() == 1 then
  452.     pause = true
  453.   else
  454.     pause = false
  455.   end
  456.   tpt.set_pause(1)
  457.  
  458.   local test = interface_s.Components.Window:new(10, 10, 60, 60,true, DefaultTheme)
  459.   addComponent(test)
  460.  
  461.   local testButton = interface_s.Components.Button:new(5, 10, 50, 15,"Select", DefaultTheme)
  462.   local Exit = interface_s.Components.Button:new(5, 40, 50, 15,"Exit", DefaultTheme)
  463.  
  464.   local selectionMover = nil
  465.   local selection = nil
  466.  
  467.   Exit.OnPressed = (function()
  468.     RemoveComponent(test)
  469.     RemoveComponent(selectionMover)
  470.     RemoveComponent(selection)
  471.     tpt.unregister_step(step)
  472.     tpt.unregister_mouseclick(click)
  473.     tpt.unregister_keypress(key)
  474.     if pause == true then
  475.       tpt.set_pause(1)
  476.     else
  477.       tpt.set_pause(0)
  478.     end
  479.   end)
  480.  
  481.   testButton.OnPressed = (function()
  482.       tpt.log("Select area that you need to layer.")
  483.       if selectionMover ~= nil then
  484.         RemoveComponent(selectionMover)
  485.       end
  486.       selection = interface_s.Components.Selection:new(50, 50, DefaultTheme)
  487.       selection.OnSelected = function(x,y,x2,y2,v2x,v2y,v2w,v2h)
  488.         tpt.log("Now move the selection on the other particles. Press RMB to cancel. Press LMB to finish")
  489.         RemoveComponent(selection)
  490.  
  491.         local particlesIndexes = {}
  492.         for i in sim.parts() do
  493.           local cx,cy = sim.partPosition(i)
  494.           if (cx>v2x) and (cx<v2x+v2w) and (cy>v2y) and (cy<v2y+v2h) then
  495.             particlesIndexes[#particlesIndexes+1]=i
  496.           end
  497.         end
  498.  
  499.         local selectionMover = interface_s.Components.SelectionMover:new(v2x,v2y,v2w,v2h, DefaultTheme)
  500.         selectionMover.OnDone = (function()
  501.           RemoveComponent(selectionMover)
  502.         end)
  503.         selectionMover.OnAbort = (function(tdx,tdy)
  504.           for i=0, #particlesIndexes do
  505.             if particlesIndexes[i]~=nil then
  506.               local cx,cy = sim.partPosition(particlesIndexes[i])
  507.               sim.partPosition(particlesIndexes[i],cx-tdx,cy-tdy)
  508.             end
  509.           end
  510.           RemoveComponent(selectionMover)
  511.         end)
  512.         selectionMover.OnMovement = (function(xd,yd)
  513.             for i=0, #particlesIndexes do
  514.               if particlesIndexes[i]~=nil then
  515.                 local cx,cy = sim.partPosition(particlesIndexes[i])
  516.                 sim.partPosition(particlesIndexes[i],cx+xd,cy+yd)
  517.               end
  518.             end
  519.           end)
  520.         addComponent(selectionMover)
  521.       end
  522.       selection.OnSelectionAborted = function()
  523.         RemoveComponent(selection)
  524.       end
  525.       addComponent(selection)
  526.       end)
  527.   test:AddComponent(testButton)
  528.   test:AddComponent(Exit)
  529. end
  530. --=================================================================--
  531. --                    CODE IS ABOVE THIS LINE                      --
  532. --=================================================================--
  533.  
  534. step = function()
  535.   for i=#windows, 0,-1 do
  536.     if (windows[i] ~= nil) and (windows[i].IsShowing==true) then
  537.       if i==0 then
  538.         windows[i]:Draw(true,tpt.mousex,tpt.mousey)
  539.       else
  540.         windows[i]:Draw(false,tpt.mousex,tpt.mousey)
  541.       end
  542.     end
  543.   end
  544. end
  545.  
  546.  
  547. click = function(mousex, mousey, button, event)
  548.   for i=0,#windows do
  549.     if windows[i] == nil then
  550.       RemoveComponent(windows[i])
  551.       break
  552.     end
  553.     if (windows ~= nil) then
  554.       if windows[i]:Click(mousex , mousey , event, button)then
  555.         if (windows[i]~=nil) and (windows[i].IsShowing~=nil) and (windows[i].IsShowing==true) then
  556.           focusComponent(i)
  557.           break
  558.         end
  559.       end
  560.     end
  561.   end
  562.   return false
  563. end
  564.  
  565.  
  566. key = function()
  567.   return false
  568. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement