Advertisement
q1nner

УГАДЫВАЕТ ЛУЧШЕ ЦВЕТ.

May 30th, 2016
446
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 22.09 KB | None | 0 0
  1. var CASEW = 1125;
  2. var LAST_BET = 0;
  3. var MAX_BET = 0;
  4. var USER = "";
  5. var RANK = 0;
  6. var ROUND = 0;
  7. var HOST = "ws://www.csgodouble.com:8080";
  8. var WS = null;
  9. var showbets = true;
  10. function todongers(x)
  11. {
  12. if ($("#settings_dongers").is(":checked")) {
  13. return (x / 1000)
  14. }
  15. return x
  16. }
  17. function todongersb(x)
  18. {
  19. if ($("#settings_dongers").is(":checked")) {
  20. return (x / 1000).toFixed(3)
  21. }
  22. return x
  23. }
  24. var snapX = 0;
  25. var R = 0.999;
  26. var S = 0.01;
  27. var tf = 0;
  28. var vi = 0;
  29. var animStart = 0;
  30. var isMoving = false;
  31. var LOGR = Math.log(R);
  32. var $CASE = null;
  33. var $BANNER = null;
  34. var $CHATAREA = null;
  35. var SCROLL = true;
  36. var LANG = 1;
  37. var IGNORE = [];
  38. var sounds_rolling = new Audio('sounds/rolling.wav');
  39. sounds_rolling.volume = 0.5;
  40. var sounds_tone = new Audio('sounds/tone.wav');
  41. sounds_tone.volume = 0.75;
  42. function play_sound(x)
  43. {
  44. var conf = $("#settings_sounds").is(":checked");
  45. if (conf) {
  46. if (x == "roll") {
  47. sounds_rolling.play()
  48. }
  49. else if (x == "finish") {
  50. sounds_tone.play()
  51. }
  52. }
  53. }
  54. function snapRender(x, wobble)
  55. {
  56. CASEW = $("#case").width();
  57. if (isMoving) {
  58. return
  59. }
  60. else if (typeof x === 'undefined') {
  61. view(snapX)
  62. }
  63. else
  64. {
  65. var order = [1, 14, 2, 13, 3, 12, 4, 0, 11, 5, 10, 6, 9, 7, 8];
  66. var index = 0;
  67. for (var i = 0; i < order.length; i++) {
  68. if (x == order[i]) {
  69. index = i;
  70. break
  71. }
  72. }
  73. var max = 34;
  74. var min =- 34;
  75. var w = Math.floor(wobble * (max - min + 1) + min);
  76. var dist = index * 75 + 36 + w;
  77. dist += 1125 * 5;
  78. snapX = dist;
  79. view(snapX)
  80. }
  81. }
  82. function spin(m)
  83. {
  84. var x = m.roll;
  85. play_sound("roll");
  86. var order = [1, 14, 2, 13, 3, 12, 4, 0, 11, 5, 10, 6, 9, 7, 8];
  87. var index = 0;
  88. for (var i = 0; i < order.length; i++) {
  89. if (x == order[i]) {
  90. index = i;
  91. break
  92. }
  93. }
  94. var max = 34;
  95. var min =- 34;
  96. var w = Math.floor(m.wobble * (max - min + 1) + min);
  97. var dist = index * 75 + 36 + w;
  98. dist += 1125 * 5;
  99. animStart = new Date().getTime();
  100. vi = getVi(dist);
  101. tf = getTf(vi);
  102. isMoving = true;
  103. setTimeout(function ()
  104. {
  105. finishRoll(m, tf)
  106. }, tf);
  107. render()
  108. }
  109. function d_mod(vi, t)
  110. {
  111. return vi * (Math.pow(R, t) - 1) / LOGR
  112. }
  113. function getTf(vi)
  114. {
  115. return (Math.log(S) - Math.log(vi)) / LOGR
  116. }
  117. function getVi(df)
  118. {
  119. return S - df * LOGR
  120. }
  121. function v(vi, t)
  122. {
  123. return vi * Math.pow(R, t)
  124. }
  125. function render()
  126. {
  127. var t = new Date().getTime() - animStart;
  128. if (t > tf) {
  129. t = tf;
  130. }
  131. var deg = d_mod(vi, t);
  132. view(deg);
  133. if (t < tf) {
  134. requestAnimationFrame(render)
  135. }
  136. else {
  137. snapX = deg;
  138. isMoving = false;
  139. }
  140. }
  141. function view(offset)
  142. {
  143. offset =- ((offset + 1125 - CASEW / 2) % 1125);
  144. $CASE.css("background-position", offset + "px 0px")
  145. }
  146. jQuery.fn.extend(
  147. {
  148. countTo : function (x, opts)
  149. {
  150. opts = opts || {};
  151. var dpf = "";
  152. var dolls = $("#settings_dongers").is(":checked");
  153. if (dolls) {
  154. dpf = "$";
  155. x = x / 1000
  156. }
  157. var $this = $(this);
  158. var start = parseFloat($this.html());
  159. var delta = x - start;
  160. if (opts.color)
  161. {
  162. if (delta > 0) {
  163. $this.addClass("text-success")
  164. }
  165. else if (delta < 0) {
  166. $this.addClass("text-danger")
  167. }
  168. }
  169. var prefix = "";
  170. if (opts.keep && delta > 0) {
  171. prefix = "+"
  172. }
  173. var durd = delta;
  174. if (dolls) {
  175. durd *= 1000
  176. }
  177. var dur = Math.min(400, Math.round(Math.abs(durd) / 500 * 400));
  178. $({
  179. count : start
  180. }).animate({
  181. count : x
  182. },
  183.  
  184. {
  185. duration : dur,
  186. step : function (val)
  187. {
  188. var vts = 0;
  189. if (dolls) {
  190. vts = val.toFixed(3)
  191. }
  192. else {
  193. vts = Math.floor(val)
  194. }
  195. $this.html("" + prefix + (vts));
  196. },
  197. complete : function ()
  198. {
  199. if (!opts.keep) {
  200. $this.removeClass("text-success text-danger")
  201. }
  202. if (opts.callback) {
  203. opts.callback()
  204. }
  205. }
  206. })
  207. }
  208. });
  209. function cd(ms, cb)
  210. {
  211. $("#counter").finish().css("width", "100%");
  212. $("#counter").animate({
  213. width : "0%"
  214. },
  215.  
  216. {
  217. "duration" : ms * 1000, "easing" : "linear",
  218. progress : function (a, p, r)
  219. {
  220. var c = (r / 1000).toFixed(2);
  221. $BANNER.html("Rolling in " + c + "...")
  222. },
  223. complete : cb
  224. })
  225. }
  226. function send(msg)
  227. {
  228. if (typeof msg != "string") {
  229. msg = JSON.stringify(msg)
  230. }
  231. if (WS && WS.readyState == 1) {
  232. WS.send(msg)
  233. }
  234. }
  235. function finishRoll(m, tf)
  236. {
  237. addHist(m.roll, m.rollid);
  238. play_sound("finish");
  239. for (var i = 0; i < m.nets.length; i++)
  240. {
  241. $("#panel" + m.nets[i].lower + "-" + m.nets[i].upper).find(".total").countTo(m.nets[i].swon > 0 ? m.nets[i].swon :- m.nets[i].samount,
  242. {
  243. "color" : true, "keep" : true
  244. })
  245. }
  246. var cats = [[0, 0], [1, 7], [8, 14]];
  247. for (var i = 0; i < cats.length; i++)
  248. {
  249. var $mytotal = $("#panel" + cats[i][0] + "-" + cats[i][1]).find(".mytotal");
  250. if (m.roll >= cats[i][0] && m.roll <= cats[i][1]) {
  251. $mytotal.countTo(m.won, {
  252. "color" : true, "keep" : true
  253. })
  254. }
  255. else
  256. {
  257. var curr = parseFloat($mytotal.html());
  258. if ($("#settings_dongers").is(":checked")) {
  259. curr *= 1000
  260. }
  261. $mytotal.countTo(-curr, {
  262. "color" : true, "keep" : true
  263. })
  264. }
  265. }
  266. if (m.balance != null) {
  267. $("#balance").countTo(m.balance, {
  268. "color" : true
  269. })
  270. }
  271. setTimeout(function ()
  272. {
  273. cd(m.count);
  274. $(".total,.mytotal").removeClass("text-success text-danger").html(0);
  275. $(".betlist li").remove();
  276. snapRender();
  277. $(".betButton").prop("disabled", false);
  278. showbets = true;
  279. },
  280. m.wait * 1000 - tf)
  281. }
  282. function addHist(roll, rollid)
  283. {
  284. var count = $("#past .ball").length;
  285. if (count >= 10) {
  286. $("#past .ball").first().remove()
  287. }
  288. if (roll == 0)
  289. {
  290. $("#past").append("<div data-rollid='" + rollid + "'class='ball ball-0'>" + roll + "</div>")
  291. }
  292. else if (roll <= 7)
  293. {
  294. $("#past").append("<div data-rollid='" + rollid + "'class='ball ball-1'>" + roll + "</div>")
  295. }
  296. else
  297. {
  298. $("#past").append("<div data-rollid='" + rollid + "'class='ball ball-8'>" + roll + "</div>")
  299. }
  300. }
  301. function onMessage(msg)
  302. {
  303. try
  304. {
  305. var m = JSON.parse(msg.data);
  306. if (m.type == "preroll")
  307. {
  308. $("#counter").finish();
  309. $("#banner").html("Confirming " + m.totalbets + "/" + (m.totalbets + m.inprog) + " total bets...");
  310. $("#panel0-0 .total").countTo(m.sums[0]);
  311. $("#panel1-7 .total").countTo(m.sums[1]);
  312. $("#panel8-14 .total").countTo(m.sums[2]);
  313. try {
  314. tinysort("#panel1-7 .betlist>li", {
  315. data : "amount", order : "desc"
  316. })
  317. }
  318. catch (e) {}
  319. try {
  320. tinysort("#panel8-14 .betlist>li", {
  321. data : "amount", order : "desc"
  322. })
  323. }
  324. catch (e) {}
  325. try {
  326. tinysort("#panel0-0 .betlist>li", {
  327. data : "amount", order : "desc"
  328. })
  329. }
  330. catch (e) {}
  331. }
  332. else if (m.type == "roll")
  333. {
  334. $(".betButton").prop("disabled", true);
  335. $("#counter").finish();
  336. $("#banner").html("Predicted number is " + m.roll + "!");
  337. ROUND = m.rollid;
  338. showbets = false;
  339. spin(m)
  340. }
  341. else if (m.type == "chat") {
  342. chat("player", m.msg, m.name, m.icon, m.user, m.rank, m.lang)
  343. }
  344. else if (m.type == "hello")
  345. {
  346. cd(m.count);
  347. USER = m.user;
  348. RANK = m.rank;
  349. $("#balance").countTo(m.balance);
  350. var last = 0;
  351. for (var i = 0; i < m.rolls.length; i++)
  352. {
  353. addHist(m.rolls[i].roll, m.rolls[i].rollid);
  354. last = m.rolls[i].roll;
  355. ROUND = m.rolls[i].rollid
  356. }
  357. snapRender(last, m.last_wobble);
  358. MAX_BET = m.maxbet;
  359.  
  360. }
  361. else if (m.type == "bet")
  362. {
  363. if (showbets)
  364. {
  365. addBet(m.bet);
  366. $("#panel0-0 .total").countTo(m.sums[0]);
  367. $("#panel1-7 .total").countTo(m.sums[1]);
  368. $("#panel8-14 .total").countTo(m.sums[2])
  369. }
  370. }
  371. else if (m.type == "betconfirm")
  372. {
  373. $("#panel" + m.bet.lower + "-" + m.bet.upper + " .mytotal").countTo(m.bet.amount);
  374. $("#balance").countTo(m.balance, {
  375. "color" : true
  376. });
  377. $(".betButton").prop("disabled", false);
  378. chat("alert", "Bet #" + m.bet.betid + " confirmed " + m.mybr + "/" + m.br + " (" + (m.exec / 1000) + " sec) ")
  379. }
  380. else if (m.type == "error") {
  381. chat("error", m.error);
  382. if (m.enable) {
  383. $(".betButton").prop("disabled", false)
  384. }
  385. }
  386. else if (m.type == "alert")
  387. {
  388. chat("alert", m.alert);
  389. if (m.maxbet) {
  390. MAX_BET = m.maxbet
  391. }
  392. if (!isNaN(m.balance))
  393. {
  394. console.log("setting balance = %s", m.balance);
  395. $("#balance").countTo(m.balance, {
  396. "color" : true
  397. })
  398. }
  399. }
  400. else if (m.type == "logins") {
  401. $("#isonline").html(m.count)
  402. }
  403. else if (m.type == "balance") {
  404. $("#balance").fadeOut(100).html(todongersb(m.balance)).fadeIn(100)
  405. }
  406. }
  407. catch (e) {
  408. console.log("Error: " + msg.data + " " + e)
  409. }
  410. }
  411. function addBet(bet)
  412. {
  413. var betid = bet.user + "-" + bet.lower;
  414. var pid = "#panel" + bet.lower + "-" + bet.upper;
  415. var $panel = $(pid);
  416. $panel.find("#" + betid).remove();
  417. var link = "http://steamcommunity.com/profiles/" + bet.user;
  418. var f = "<li class='list-group-item' id='{0}' data-amount='{1}'>";
  419. f += "<div style='overflow: hidden;line-height:32px'>";
  420. f += "<div class='pull-left'><img class='rounded' src='https://steamcdn-a.akamaihd.net/steamcommunity/public/images/avatars{2}'><a style='color: black;' href='" + link + "' target='_blank'><b>{3}</b></a></div>";
  421. f += "<div class='amount pull-right'>{4}</div>";
  422. f += "</div></li>";
  423. var $li = $(f.format(betid, bet.amount, bet.icon, bet.name, todongersb(bet.amount)));
  424. $li.hide().prependTo($panel.find(".betlist")).slideDown("fast", function ()
  425. {
  426. snapRender()
  427. })
  428. }
  429. function connect()
  430. {
  431. if (!WS)
  432. {
  433. $.ajax(
  434. {
  435. url : "/scripts/getToken.php",
  436. success : function (data)
  437. {
  438. if (data)
  439. {
  440. if (data == "nologin") {}
  441. else if (data == "banned") {}
  442. else
  443. {
  444. WS = new WebSocket(HOST + "/" + data);
  445. WS.onclose = function (event)
  446. {
  447. WS = null;
  448. };
  449. WS.onmessage = onMessage;
  450. }
  451. }
  452. else{}
  453. },
  454. error : function (err) {}
  455. })
  456. }
  457. else{}
  458. }
  459.  
  460.  
  461. function chat(x, msg, name, icon, steamid, rank, lang)
  462. {
  463. if (IGNORE.indexOf(String(steamid)) > -1) {
  464. console.log("ignored:" + msg);
  465. return
  466. }
  467. if (lang == LANG || x == "italic" || x == "error" || x == "alert")
  468. {
  469. var ele = document.getElementById("chatArea");
  470. msg = msg.replace(/(<|>)/g, '');
  471. msg = emotes(msg);
  472. var toChat = "";
  473. if (x == "italic") {
  474. toChat = "<div><i>" + msg + "</i></div>"
  475. }
  476. else if (x == "error") {
  477. toChat = "<div><b class='text-danger'>" + msg + "</b></div>"
  478. }
  479. else if (x == "alert") {
  480. toChat = "<div><b class='text-success'>" + msg + "</b></div>"
  481. }
  482. else if (x == "player")
  483. {
  484. var aclass = "chat-link";
  485. if (rank == 100) {
  486. aclass = "chat-link-mod";
  487. name = "[Owner] " + name
  488. }
  489. else if (rank == 1) {
  490. aclass = "chat-link-pmod";
  491. name = "[Mod] " + name
  492. }
  493. else if (rank ==- 1) {
  494. aclass = "chat-link-streamer";
  495. name = "[Streamer] " + name
  496. }
  497. else if (rank ==- 2) {
  498. aclass = "chat-link-vet";
  499. name = "[Veteran] " + name
  500. }
  501. else if (rank ==- 3) {
  502. aclass = "chat-link-pro";
  503. name = "[Pro] " + name
  504. }
  505. var link = "http://steamcommunity.com/profiles/" + steamid;
  506. toChat = "<div><img class='chat-img rounded' data-steamid='" + steamid + "' data-name='" + name + "' src='https://steamcdn-a.akamaihd.net/steamcommunity/public/images/avatars" + icon + "'><a class='" + aclass + "' href='" + link + "' target='_blank'><b>" + name + "</b></a>: " + msg + "</div>"
  507. }
  508. $CHATAREA.append(toChat);
  509. if (SCROLL)
  510. {
  511. var curr = $CHATAREA.children().length;
  512. if (curr > 75) {
  513. var rem = curr - 75;
  514. $CHATAREA.children().slice(0, rem).remove()
  515. }
  516. $CHATAREA.scrollTop($CHATAREA[0].scrollHeight)
  517. }
  518. if (SCROLL && !$(".side-icon[data-tab='1']").hasClass("active")) {
  519. var curr = parseInt($("#newMsg").html()) || 0;
  520. $("#newMsg").html(curr + 1)
  521. }
  522. }
  523. }
  524. $(document).ready(function ()
  525. {
  526. $CASE = $("#case");
  527. $BANNER = $("#banner");
  528. $CHATAREA = $("#chatArea");
  529. connect();
  530. if ($("#settings_dongers").is(":checked")) {
  531. $("#dongers").html("$")
  532. }
  533. $("#lang").on("change", function ()
  534. {
  535. LANG = $(this).val();
  536. chat("alert", "## Switched to room: " + $(this).find("option:selected").text())
  537. });
  538. $("#scroll").on("change", function ()
  539. {
  540. SCROLL = !$(this).is(":checked")
  541. });
  542. $(window).resize(function ()
  543. {
  544. snapRender()
  545. });
  546. $("#chatForm").on("submit", function ()
  547. {
  548. var msg = $("#chatMessage").val();
  549. if (msg)
  550. {
  551. var res = null;
  552. if (res = /^\/send ([0-9]*) ([0-9]*)/.exec(msg))
  553. {
  554. bootbox.confirm("You are about to send " + res[2] + " coins to steamid " + res[1] + " - are you sure?",
  555. function (result)
  556. {
  557. if (result) {
  558. send({
  559. "type" : "chat", "msg" : msg, "lang" : LANG
  560. });
  561. $("#chatMessage").val("")
  562. }
  563. })
  564. }
  565. else {
  566. send({
  567. "type" : "chat", "msg" : msg, "lang" : LANG
  568. });
  569. $("#chatMessage").val("")
  570. }
  571. }
  572. return false;
  573. });
  574. $(document).on("click", ".ball", function ()
  575. {
  576. var rollid = $(this).data("rollid")
  577. });
  578. $(".betButton").on("click", function ()
  579. {
  580. var lower = $(this).data("lower");
  581. var upper = $(this).data("upper");
  582. var amount = str2int($("#betAmount").val());
  583. if ($("#settings_dongers").is(":checked")) {
  584. amount = amount * 1000
  585. }
  586. amount = Math.floor(amount);
  587. var conf = $("#settings_confirm").is(":checked");
  588. if (conf && amount > 10000)
  589. {
  590. var pressed = false;
  591. bootbox.confirm("Are you sure you wish to bet " + formatNum(amount) + " coins?<br><br><i>You may disable this confirmation under the settings menu.</i>",
  592. function (result)
  593. {
  594. if (result && !pressed)
  595. {
  596. pressed = true;
  597. send({
  598. "type" : "bet", "amount" : amount, "lower" : lower, "upper" : upper, "round" : ROUND
  599. });
  600. LAST_BET = amount;
  601. $(this).prop("disabled", true)
  602. }
  603. })
  604. }
  605. else
  606. {
  607. send({
  608. "type" : "bet", "amount" : amount, "lower" : lower, "upper" : upper, "round" : ROUND
  609. });
  610. LAST_BET = amount;
  611. $(this).prop("disabled", true)
  612. }
  613. return false;
  614. });
  615. $(document).on("click", ".betshort", function ()
  616. {
  617. var bet_amount = str2int($("#betAmount").val());
  618. var action = $(this).data("action");
  619. if (action == "clear") {
  620. bet_amount = 0
  621. }
  622. else if (action == "double") {
  623. bet_amount *= 2
  624. }
  625. else if (action == "half") {
  626. bet_amount /= 2
  627. }
  628. else if (action == "max")
  629. {
  630. var MX = MAX_BET;
  631. if ($("#settings_dongers").is(":checked")) {
  632. MX = MAX_BET / 1000
  633. }
  634. bet_amount = Math.min(str2int($("#balance").html()), MX)
  635. }
  636. else if (action == "last") {
  637. bet_amount = LAST_BET
  638. }
  639. else {
  640. bet_amount += parseInt(action)
  641. }
  642. $("#betAmount").val(bet_amount)
  643. });
  644. $("#getbal").on("click", function ()
  645. {
  646. send({
  647. "type" : "balance"
  648. })
  649. });
  650. $("button.close").on("click", function ()
  651. {
  652. $(this).parent().addClass("hidden")
  653. });
  654. $(document).on("contextmenu", ".chat-img", function (e)
  655. {
  656. if (e.ctrlKey) {
  657. return;
  658. }
  659. $("#contextMenu [data-act=1]").hide();
  660. $("#contextMenu [data-act=2]").hide();
  661. if (RANK == 100) {
  662. $("#contextMenu [data-act=1]").show();
  663. $("#contextMenu [data-act=2]").show()
  664. }
  665. else if (RANK == 1) {
  666. $("#contextMenu [data-act=1]").show()
  667. }
  668. e.preventDefault();
  669. var steamid = $(this).data("steamid");
  670. var name = $(this).data("name");
  671. $("#contextMenu [data-act=0]").html(name);
  672. var $menu = $("#contextMenu");
  673. $menu.show().css(
  674. {
  675. position : "absolute", left : getMenuPosition(e.clientX, 'width', 'scrollLeft'), top : getMenuPosition(e.clientY,
  676. 'height', 'scrollTop')
  677. }).off("click").on("click", "a", function (e)
  678. {
  679. var act = $(this).data("act");
  680. e.preventDefault();
  681. $menu.hide();
  682. if (act == 0) {
  683. var curr = $("#chatMessage").val(steamid)
  684. }
  685. else if (act == 1) {
  686. var curr = $("#chatMessage").val("/mute " + steamid + " ")
  687. }
  688. else if (act == 2) {
  689. var curr = $("#chatMessage").val("/kick " + steamid + " ")
  690. }
  691. else if (act == 3) {
  692. var curr = $("#chatMessage").val("/send " + steamid + " ")
  693. }
  694. else if (act == 4) {
  695. IGNORE.push(String(steamid));
  696. chat("alert", steamid + " has been filtered.")
  697. }
  698. $("#chatMessage").focus()
  699. })
  700. });
  701. $(document).on("click", function ()
  702. {
  703. $("#contextMenu").hide()
  704. });
  705. $(".side-icon").on("click", function (e)
  706. {
  707. e.preventDefault();
  708. var tab = $(this).data("tab");
  709. if ($(this).hasClass("active"))
  710. {
  711. $(".side-icon").removeClass("active");
  712. $(".tab-group").addClass("hidden");
  713. $("#mainpage").css("margin-left", "50px");
  714. $("#pullout").addClass("hidden")
  715. }
  716. else
  717. {
  718. $(".side-icon").removeClass("active");
  719. $(".tab-group").addClass("hidden");
  720. $(this).addClass("active");
  721. $("#tab" + tab).removeClass("hidden");
  722. $("#mainpage").css("margin-left", "450px");
  723. $("#pullout").removeClass("hidden");
  724. if (tab == 1) {
  725. $("#newMsg").html("")
  726. }
  727. }
  728. snapRender();
  729. return false;
  730. });
  731. $(".side-icon[data-tab='1']").trigger("click")
  732. });
  733. function getMenuPosition(mouse, direction, scrollDir)
  734. {
  735. var win = $(window)[direction](), scroll = $(window)[scrollDir](), menu = $("#contextMenu")[direction](),
  736. position = mouse + scroll;
  737. if (mouse + menu > win && menu < mouse) {
  738. position -= menu;
  739. }
  740. return position
  741. }
  742. function str2int(s)
  743. {
  744. s = s.replace(/,/g, "");
  745. s = s.toLowerCase();
  746. var i = parseFloat(s);
  747. if (isNaN(i)) {
  748. return 0
  749. }
  750. else if (s.charAt(s.length - 1) == "k") {
  751. i *= 1000
  752. }
  753. else if (s.charAt(s.length - 1) == "m") {
  754. i *= 1000000
  755. }
  756. else if (s.charAt(s.length - 1) == "b") {
  757. i *= 1000000000
  758. }
  759. return i
  760. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement