Advertisement
Guest User

Untitled

a guest
May 4th, 2016
302
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 17.57 KB | None | 0 0
  1. var MARKET_REPORT_TEMPLATE_FILE_NAME = "M Template";
  2. var FRONT_DESK_EMAIL_ADDRESS = "posteremail@gmail.cm";
  3. var NEWSLETTER_REACH = "810,000";
  4. var INIT_DATA_COL = 3;
  5.  
  6. var FONT_FAMILY = "trebuchet ms";
  7. var TRP_RED = "#dd2329";
  8. var TRP_BLUE = "#002b55";
  9. var GREEN = "#7c9e13";
  10. var ORANGE = "orange";
  11. var GREY = "#B2B2B2";
  12.  
  13. var FONT_FORMAT = "style='font-family:" + FONT_FAMILY + "';";
  14. var REPORT_INDENT_FORMAT = "style='padding-left:50px;'";
  15. var TITLE_FORMAT = "style='font-size:24px;font-weight:bold;' cellpadding='0', cellspacing='0'";
  16. var TITLE_SUB_FORMAT_BLUE = "style='color:" + TRP_BLUE + "';";
  17. var TITLE_SUB_FORMAT_RED = "style='color:" + TRP_RED + "';";
  18. var SUB_TITLE_FORMAT = "style='color:" + GREEN + ";font-size:14px;';";
  19. var SECTION_TITLE_FORMAT = "style='color:" + TRP_BLUE + ";font-size:20px;';";
  20. var BULLET_HEADER_FORMAT = "style='color:" + GREEN + ";font-size:12px;font-style:italic;';";
  21. var BULLET_FORMAT = "style='color:" + TRP_BLUE + ";font-size:16px;';";
  22. var BULLET_APOINTMENT_FORMAT = "style='color:" + TRP_RED + ";font-size:25px;';";
  23. var DASHED_LINE_FORMAT = "style='border-top-style:dashed; border-top-color:" + ORANGE + "; border-top-width:1px; width:400px;'";
  24. var FEEDBACK_LINE_FORMAT = "style='border-left-style:solid; border-left-color:" + GREY + "; border-left-width:1px; color:" + TRP_BLUE + ";font-size:16px; padding-left:4px;'";
  25. var FEEDBACK_TIMESTAMP_FORMAT = BULLET_HEADER_FORMAT;
  26. var FEEDBACK_DISCLAIMER_FORMAT = "style='font-size:12px;font-style:italic;';";
  27. var LINK_LARGE_FORMAT = BULLET_FORMAT;
  28. var LINK_SMALL_FORMAT = "style='color:" + TRP_BLUE + ";font-size:12px;';";
  29.  
  30. var AGENT_NAME_ROW = 2;
  31. var AGENT_EMAIL_ADDRESS_ROW = 3;
  32. var SELLERS_ADDRESS_ROW = 4;
  33. var SELLERS_NAME_ROW = 5;
  34. var SELLERS_EMAIL_ADDRESS_1_ROW = 6;
  35. var SELLERS_EMAIL_ADDRESS_2_ROW = 7;
  36. var SELLERS_EMAIL_ADDRESS_3_ROW = 8;
  37. var SELLERS_EMAIL_ADDRESS_4_ROW = 9;
  38. var DO_SOCIAL_ROW = 10;
  39. var FB_FREQ_ROW = 11;
  40. var FB_REACH_ROW = 12;
  41. var FB_LINK_ROW = 13;
  42. var TWITTER_FREQ_ROW = 14;
  43. var TWITTER_REACH_ROW = 15;
  44. var TWITTER_LINK_ROW = 16;
  45. var BLOG_VIEWS_ROW = 17;
  46. var BLOG_LINK_ROW = 18;
  47. var NEWSLETTER_MENTIONS_ROW = 19;
  48. var NEWSLETTER_LINK_ROW = 20;
  49. var CRAIGSLIST_FREQ_ROW = 21;
  50. var CRAIGSLIST_LINK_ROW = 22;
  51. var KIJIJI_FREQ_ROW = 23;
  52. var KIJIJI_VIEWS_ROW = 24;
  53. var KIJIJI_LINK_ROW = 25;
  54. var YOUTUBE_VIEWS_ROW = 26;
  55. var YOUTUBE_LINK_ROW = 27;
  56. var NUM_APPOINTMENTS_ROW = 28;
  57. var NUM_CANCELLED_ROW = 29;
  58. var NUM_UPCOMING_ROW = 30;
  59. var MLS_COMPARABLES_LINK_ROW = 31;
  60. var FEEDBACK_ROW = 32;
  61.  
  62. var TWITTER_LINK = "https://twitter.com/thetwitteraccounthere";
  63.  
  64.  
  65. function MAIN_createBatchMarketReports () {
  66. var marketReportDataSheet = getdataSheet(MARKET_REPORT_TEMPLATE_FILE_NAME);
  67. var currentDataColumn = INIT_DATA_COL;
  68. //ERROR OCCURS HERE: Method Range.getValue is heavily used by the script. File: Code Line: 69
  69. while (marketReportDataSheet.getRange(AGENT_NAME_ROW, currentDataColumn).getValue() != "") {
  70. createMarketReport(marketReportDataSheet, currentDataColumn);
  71. currentDataColumn += 1;
  72. }
  73. }
  74.  
  75. function createMarketReport (dataSheet, dataColumn) {
  76. var htmlBody = "<div " + FONT_FORMAT + ">";
  77.  
  78. if (dataSheet != null) {
  79. // introduction
  80. htmlBody += "Hello " + dataSheet.getRange(SELLERS_NAME_ROW, dataColumn).getValue() + ",<br><br>";
  81. htmlBody += "Here's your <b>weekly</b> metric with , " + dataSheet.getRange(AGENT_NAME_ROW, dataColumn).getValue() + ".<br><br><br>";
  82.  
  83. htmlBody += "<div " + REPORT_INDENT_FORMAT + ">";
  84.  
  85. // title
  86. htmlBody += "<table " + TITLE_FORMAT + "><tr>"
  87. + "<td " + TITLE_SUB_FORMAT_BLUE + ">B</td>"
  88. + "<td " + TITLE_SUB_FORMAT_RED + ">4</td>"
  89. + "<td " + TITLE_SUB_FORMAT_BLUE + ">5 UPDATES</td>"
  90. + "</tr></table>";
  91.  
  92. // address
  93. htmlBody += "<div " + SUB_TITLE_FORMAT + ">"
  94. + "<b>" + dataSheet.getRange(SELLERS_ADDRESS_ROW, dataColumn).getValue() + "</b>"
  95. + "</div>";
  96. htmlBody += "<br><br>";
  97.  
  98. // social media ad metrics
  99. if (dataSheet.getRange(DO_SOCIAL_ROW, dataColumn).getValue().toLowerCase() == "yes"
  100. || dataSheet.getRange(DO_SOCIAL_ROW, dataColumn).getValue().toLowerCase() == "y") {
  101. htmlBody += getSocialHTML(dataSheet, dataColumn);
  102. }
  103.  
  104. // property viewing metrics
  105. htmlBody += getPropertyViewingHTML(dataSheet, dataColumn);
  106.  
  107. // close the 2 "main" divs created at beginning of fuciton
  108. htmlBody += "</div></div>";
  109.  
  110. // for debugging purposes
  111. // Logger.log(htmlBody);
  112.  
  113. MailApp.sendEmail( {
  114. to: getSellersEmailAddresses(dataSheet, dataColumn),
  115. subject: "TheRedPin CHECK-UP",
  116. htmlBody: htmlBody,
  117. cc: dataSheet.getRange(AGENT_EMAIL_ADDRESS_ROW, dataColumn).getValue(),
  118. bcc: FRONT_DESK_EMAIL_ADDRESS
  119. } );
  120. } else {
  121. htmlBody += "There was an error retrieving the Market Report Data Sheet";
  122. htmlBody += "</div>";
  123. }
  124. }
  125.  
  126. function getSellersEmailAddresses(dataSheet, dataColumn) {
  127. var sellersEmail1 = dataSheet.getRange(SELLERS_EMAIL_ADDRESS_1_ROW, dataColumn).getValue();
  128. var sellersEmail2 = dataSheet.getRange(SELLERS_EMAIL_ADDRESS_2_ROW, dataColumn).getValue();
  129. var sellersEmail3 = dataSheet.getRange(SELLERS_EMAIL_ADDRESS_3_ROW, dataColumn).getValue();
  130. var sellersEmail4 = dataSheet.getRange(SELLERS_EMAIL_ADDRESS_4_ROW, dataColumn).getValue();
  131.  
  132. return sellersEmail1 + ", " + sellersEmail2 + ", " + sellersEmail3 + ", " + sellersEmail4;
  133. }
  134.  
  135. function getdataSheet(filename) {
  136. var files = DriveApp.getFilesByType(MimeType.GOOGLE_SHEETS);
  137. var file = null;
  138. var spreadsheet = null;
  139. var sheet = null;
  140.  
  141. while (files.hasNext()) {
  142. file = files.next();
  143.  
  144. if (file.getName() == filename) {
  145. spreadsheet = SpreadsheetApp.openById(file.getId());
  146. sheet = spreadsheet.getActiveSheet();
  147.  
  148. return sheet;
  149. }
  150. }
  151.  
  152. return null;
  153. }
  154.  
  155.  
  156. function getPropertyViewingHTML (dataSheet, dataColumn) {
  157. var htmlBody = "";
  158.  
  159. // section title
  160. htmlBody += "<div " + SECTION_TITLE_FORMAT + ">Metrics: </div><br>";
  161.  
  162. // total appointments
  163. htmlBody += "<div " + BULLET_HEADER_FORMAT + ">Total Number oa's" + "</div>";
  164. htmlBody += "<div " + BULLET_APOINTMENT_FORMAT + ">"
  165. + addLeadingZero(dataSheet.getRange(NUM_APPOINTMENTS_ROW, dataColumn).getValue())
  166. + "</div><br>";
  167.  
  168. // number cancelled appointments
  169. htmlBody += "<div " + BULLET_HEADER_FORMAT + ">Number of Cancelled" + "</div>";
  170. htmlBody += "<div " + BULLET_APOINTMENT_FORMAT + ">"
  171. + addLeadingZero(dataSheet.getRange(NUM_CANCELLED_ROW, dataColumn).getValue())
  172. + "</div><br>";
  173.  
  174. // upcoming appointments
  175. htmlBody += "<div " + BULLET_HEADER_FORMAT + ">Total Number of Upcoming " + "</div>";
  176. htmlBody += "<div " + BULLET_APOINTMENT_FORMAT + ">"
  177. + addLeadingZero(dataSheet.getRange(NUM_UPCOMING_ROW, dataColumn).getValue())
  178. + "</div><br>";
  179.  
  180. // MLS comparables link
  181. htmlBody += "<div " + BULLET_HEADER_FORMAT + ">MLS Comparables" + "</div>";
  182. htmlBody += "<div " + BULLET_FORMAT + ">"
  183. + "<a href='" + dataSheet.getRange(MLS_COMPARABLES_LINK_ROW, dataColumn).getValue() + "'>Click this link to view properties in your neighbourhood</a>"
  184. + "</div><br><br>";
  185.  
  186. // Feedback
  187. htmlBody += getFeedbackHTML(dataSheet, dataColumn, FEEDBACK_ROW);
  188.  
  189. // dashed line
  190. htmlBody += "<br><div " + DASHED_LINE_FORMAT + "></div><br><br>";
  191.  
  192. return htmlBody;
  193. }
  194.  
  195.  
  196. function getSocialHTML (dataSheet, dataColumn) {
  197. var htmlBody = "";
  198.  
  199. // section title
  200. htmlBody += "<div " + SECTION_TITLE_FORMAT + ">Social Media Metrics:</div><br>";
  201.  
  202. // facebook
  203. htmlBody += getFacebookHTML(dataSheet, dataColumn);
  204.  
  205. // twitter frequency
  206. htmlBody += getTwitterHTML(dataSheet, dataColumn);
  207.  
  208. // blog views
  209. htmlBody += getBlogHTML(dataSheet, dataColumn);
  210.  
  211. // newsletter mentions
  212. htmlBody += getNewsletterMentionsHTML(dataSheet, dataColumn);
  213.  
  214. // kijiji ad frerquency
  215. htmlBody += getKiijiHTML(dataSheet, dataColumn);
  216.  
  217. // craigslist ad frerquency
  218. htmlBody += getCraigslistHTML(dataSheet, dataColumn);
  219.  
  220. // youtube views
  221. htmlBody += getYouTubeHTML(dataSheet, dataColumn);
  222.  
  223. // dashed line
  224. htmlBody += "<br><div " + DASHED_LINE_FORMAT + "></div><br><br>";
  225.  
  226. return htmlBody;
  227. }
  228.  
  229.  
  230. function getNewsletterMentionsHTML (dataSheet, dataColumn) {
  231. var newsletterMentions = dataSheet.getRange(NEWSLETTER_MENTIONS_ROW, dataColumn).getValue();
  232. var linkToAd = dataSheet.getRange(NEWSLETTER_LINK_ROW, dataColumn).getValue();
  233. var newsletterMentionsText = "";
  234. var htmlBody = "";
  235.  
  236. if (newsletterMentions > 0) {
  237. if (newsletterMentions == 1) {
  238. newsletterMentionsText = "appearance";
  239. } else if (newsletterMentions > 1) {
  240. newsletterMentionsText = "appearances";
  241. }
  242.  
  243. htmlBody += "<div " + BULLET_HEADER_FORMAT + ">Newsletter Mentions</div>";
  244. htmlBody += "<div " + BULLET_FORMAT + ">"
  245. + "<b>" + newsletterMentions + "</b>"
  246. + " newsletter " + newsletterMentionsText + " sent out to <b>" + NEWSLETTER_REACH + "</b> subscribers";
  247.  
  248. if (linkToAd != "") {
  249. htmlBody += " - "
  250. + "<span " + LINK_SMALL_FORMAT + ">"
  251. + "<a href='" + linkToAd + "'>View newsletter</a>"
  252. + "</span>";
  253. }
  254.  
  255. htmlBody += "</div><br>";
  256. }
  257.  
  258. return htmlBody;
  259. }
  260.  
  261. function getKiijiHTML (dataSheet, dataColumn) {
  262. var kijijiFreq = dataSheet.getRange(KIJIJI_FREQ_ROW, dataColumn).getValue();
  263. var linkToAd = dataSheet.getRange(KIJIJI_LINK_ROW, dataColumn).getValue();
  264. var numKijijiViewed = dataSheet.getRange(KIJIJI_VIEWS_ROW, dataColumn).getValue();
  265. var kijijiFreqText = "";
  266. var htmlBody = "";
  267.  
  268. if (kijijiFreq > 0) {
  269. if (kijijiFreq == 1) {
  270. kijijiFreqText = "ad";
  271. } else if (kijijiFreq > 1) {
  272. kijijiFreqText = "ads";
  273. }
  274.  
  275. htmlBody += "<div " + BULLET_HEADER_FORMAT + ">Kijiji Views</div>";
  276. htmlBody += "<div " + BULLET_FORMAT + ">"
  277. + "Produced "
  278. + "<b>" + kijijiFreq + "</b>"
  279. + " " + kijijiFreqText + " with paid promotion";
  280.  
  281. if (numKijijiViewed > 1) {
  282. htmlBody += " viewed "
  283. + "<b>" + numKijijiViewed + "</b>"
  284. + " times"
  285. }
  286.  
  287. if (linkToAd != "") {
  288. htmlBody += " - "
  289. + "<span " + LINK_SMALL_FORMAT + ">"
  290. + "<a href='" + linkToAd + "'>View ad</a>"
  291. + "</span>";
  292. }
  293.  
  294. htmlBody += "</div><br>";
  295. }
  296.  
  297. return htmlBody;
  298. }
  299.  
  300. function getCraigslistHTML (dataSheet, dataColumn) {
  301. var CraigslistFreq = dataSheet.getRange(CRAIGSLIST_FREQ_ROW, dataColumn).getValue();
  302. var linkToAd = dataSheet.getRange(CRAIGSLIST_LINK_ROW, dataColumn).getValue();
  303. var CraigslistFreqText = "";
  304. var htmlBody = "";
  305.  
  306. if (CraigslistFreq > 0) {
  307. if (CraigslistFreq == 1) {
  308. CraigslistFreqText = "ad";
  309. } else if (CraigslistFreq > 1) {
  310. CraigslistFreqText = "ads";
  311. }
  312.  
  313. htmlBody +="<div " + BULLET_HEADER_FORMAT + ">Craigslist Ads Frequency</div>";
  314. htmlBody += "<div " + BULLET_FORMAT + ">"
  315. + "Produced "
  316. + "<b>" + CraigslistFreq + "</b>"
  317. + " " + CraigslistFreqText;
  318.  
  319. if (linkToAd != "") {
  320. htmlBody += " - "
  321. + "<span " + LINK_SMALL_FORMAT + ">"
  322. + "<a href='" + linkToAd + "'>View ad</a>"
  323. + "</span>";
  324. }
  325.  
  326. htmlBody += "</div><br>";
  327. }
  328.  
  329. return htmlBody;
  330. }
  331.  
  332. function getYouTubeHTML (dataSheet, dataColumn) {
  333. var numYoutubeViewed = dataSheet.getRange(YOUTUBE_VIEWS_ROW, dataColumn).getValue();
  334. var linkToAd = TWITTER_LINK;
  335. var htmlBody = "";
  336.  
  337. var numYoutubeViewed = dataSheet.getRange(YOUTUBE_VIEWS_ROW, dataColumn).getValue();
  338.  
  339. if (numYoutubeViewed > 1) {
  340. htmlBody += "<div " + BULLET_HEADER_FORMAT + ">YouTube Views</div>";
  341. htmlBody += "<div " + BULLET_FORMAT + ">"
  342. + "<b>" + numYoutubeViewed + "</b>"
  343. + " video views";
  344.  
  345. if (linkToAd != "") {
  346. htmlBody += " - "
  347. + "<span " + LINK_SMALL_FORMAT + ">"
  348. + "<a href='" + linkToAd + "'>View video</a>"
  349. + "</span>";
  350. }
  351.  
  352. htmlBody += "</div><br>";
  353. }
  354.  
  355. return htmlBody;
  356. }
  357.  
  358. function getFacebookHTML (dataSheet, dataColumn) {
  359. var numRreached = dataSheet.getRange(FB_REACH_ROW, dataColumn).getValue();
  360. var numAds = dataSheet.getRange(FB_FREQ_ROW, dataColumn).getValue();
  361. var linkToAd = dataSheet.getRange(FB_LINK_ROW, dataColumn).getValue();
  362. var fbText = "";
  363. var htmlBody = "";
  364.  
  365. if (numAds > 0) {
  366. if (numAds == 1) {
  367. fbText = "post";
  368. } else {
  369. fbText = "posts";
  370. }
  371.  
  372. htmlBody += "<div " + BULLET_HEADER_FORMAT + ">Facebook Reach</div>";
  373. htmlBody += "<div " + BULLET_FORMAT + ">"
  374. + "Created "
  375. + "<b>" + numAds + "</b>"
  376. + " " + fbText;
  377.  
  378. if (numRreached > 1) {
  379. htmlBody += " viewed by "
  380. + "<b>" + addThousandsComma(numRreached) + "</b>"
  381. + " unique people";
  382. }
  383.  
  384. if (linkToAd != "") {
  385. htmlBody += " - "
  386. + "<span " + LINK_SMALL_FORMAT + ">"
  387. + "<a href='" + linkToAd + "'>View post</a>"
  388. + "</span>";
  389. }
  390.  
  391. htmlBody += "</div><br>";
  392. }
  393.  
  394. return htmlBody;
  395. }
  396.  
  397. function getTwitterHTML (dataSheet, dataColumn) {
  398. var twitterFreq = dataSheet.getRange(TWITTER_FREQ_ROW, dataColumn).getValue();
  399. var numTwitterReached = dataSheet.getRange(TWITTER_REACH_ROW, dataColumn).getValue();
  400. var twitterLink = dataSheet.getRange(TWITTER_LINK_ROW, dataColumn).getValue();
  401. var tweetsText = "";
  402. var htmlBody = "";
  403.  
  404. if (twitterFreq > 0) {
  405. if (twitterFreq == 1) {
  406. tweetsText = "tweet";
  407. } else {
  408. tweetsText = "tweets";
  409. }
  410.  
  411. htmlBody += "<div " + BULLET_HEADER_FORMAT + ">Twitter Reach</div>";
  412. htmlBody += "<div " + BULLET_FORMAT + ">"
  413. + "Generated "
  414. + "<b>" + twitterFreq + "</b>"
  415. + " " + tweetsText
  416.  
  417. if (numTwitterReached > 1) {
  418. htmlBody += " viewed by "
  419. + "<b>" + addThousandsComma(numTwitterReached) + "</b>"
  420. + " unique people";
  421. }
  422.  
  423. if (twitterLink != "") {
  424. htmlBody += " - "
  425. + "<span " + LINK_SMALL_FORMAT + ">"
  426. + "<a href='" + twitterLink + "'>View " + tweetsText + "</a>"
  427. + "</span>";
  428. }
  429.  
  430. htmlBody += "</div><br>";
  431. }
  432.  
  433. return htmlBody;
  434. }
  435.  
  436.  
  437. function getFeedbackHTML(dataSheet, dataColumn, firstDataRow) {
  438. var htmlBody = "<div " + BULLET_HEADER_FORMAT + ">Feedback from BA :" + "</div><br>";
  439.  
  440. var feedbackItem = dataSheet.getRange(firstDataRow, dataColumn).getValue();
  441.  
  442. if (feedbackItem == "") {
  443. htmlBody += "<div " + BULLET_FORMAT + ">"
  444. + "There is no new feedback this week."
  445. + "</div><br>";
  446. } else {
  447. while (feedbackItem != "") {
  448.  
  449. var dateIndex = feedbackItem.indexOf("^^^");
  450.  
  451. if (dateIndex > 0) {
  452. htmlBody += "<div " + FEEDBACK_LINE_FORMAT + ">"
  453. + "'" + feedbackItem.substring(0, dateIndex) + "'"
  454. + "<span " + FEEDBACK_TIMESTAMP_FORMAT + ">"
  455. + " - " + feedbackItem.substring(dateIndex + 3, feedbackItem.length)
  456. + "</span>"
  457. + "</div>"
  458. + "<br>";
  459. } else {
  460. htmlBody += "<div " + FEEDBACK_LINE_FORMAT + ">"
  461. + "'" + feedbackItem + "'"
  462. + "</div><br>";
  463. }
  464.  
  465. firstDataRow += 1;
  466. feedbackItem = dataSheet.getRange(firstDataRow, dataColumn).getValue();
  467. }
  468. }
  469.  
  470. htmlBody += "<br>";
  471. htmlBody += "<div " + FEEDBACK_DISCLAIMER_FORMAT + ">*Feedback is provided on a voluntary basis.</div>";
  472.  
  473. return htmlBody;
  474. }
  475.  
  476.  
  477. function getBlogHTML (dataSheet, dataColumn) {
  478. var numBlogViewed = dataSheet.getRange(BLOG_VIEWS_ROW, dataColumn).getValue();
  479. var blogLink = dataSheet.getRange(BLOG_LINK_ROW, dataColumn).getValue();
  480. var htmlBody = "";
  481.  
  482. if (numBlogViewed > 1) {
  483. htmlBody += "<div " + BULLET_HEADER_FORMAT + ">Blog Views</div>";
  484. htmlBody += "<div " + BULLET_FORMAT + ">"
  485. + "<b>" + numBlogViewed + "</b>"
  486. + " page views";
  487.  
  488. if (blogLink != "") {
  489. htmlBody += " - "
  490. + "<span " + LINK_SMALL_FORMAT + ">"
  491. + "<a href='" + blogLink + "'>View blog</a>"
  492. + "</span>";
  493. }
  494.  
  495. htmlBody += "</div><br>";
  496. }
  497.  
  498. return htmlBody;
  499. }
  500.  
  501.  
  502. function addLeadingZero (number) {
  503. if (number < 10) {
  504. return "0" + number;
  505. }
  506.  
  507. return number;
  508. }
  509.  
  510. function addThousandsComma (number) {
  511. number += "";
  512.  
  513. var length = number.length;
  514. var leadingDigits = number.length % 3;
  515. var numberWithCommas = number.substring(0, leadingDigits);
  516. var index = leadingDigits;
  517.  
  518. while (index < length) {
  519. if (leadingDigits == 0
  520. && index == 0) {
  521. numberWithCommas += number.substring(index, index + 3 );
  522. } else {
  523. numberWithCommas += "," + number.substring(index, index + 3 );
  524. }
  525.  
  526. index += 3;
  527. }
  528.  
  529. return numberWithCommas;
  530. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement