Advertisement
Guest User

Untitled

a guest
Feb 1st, 2016
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 16.73 KB | None | 0 0
  1. #!/bin/bash
  2. ############################################
  3. ## WARNING! WARNING! WARNING! WARNING! ##
  4. ## ##
  5. ## DON'T USE NOTEPAD TO CHANGE THIS FILE ##
  6. ## INSTEAD USE SOME DECENT TEXT EDITOR. ##
  7. ## NEWLINE CHARACTERS DIFFER BETWEEN DOS/ ##
  8. ## WINDOWS AND UNIX. ##
  9. ## ##
  10. ## USING NOTEPAD TO SAVE THIS FILE WILL ##
  11. ## LEAVE IT IN A BROKEN STATE!!! ##
  12. ############################################
  13. ## Writen by DrLecter ##
  14. ## License: GNU GPL ##
  15. ## Based on Tiago Tagliaferri's script ##
  16. ## E-mail: tiago_tagliaferri@msn.com ##
  17. ## From "L2J-DataPack" ##
  18. ## Bug reports: http://l2jdp.com/trac ##
  19. ############################################
  20. trap finish 2
  21.  
  22. configure() {
  23. echo "#############################################"
  24. echo "# You entered script configuration area #"
  25. echo "# No change will be performed in your DB #"
  26. echo "# I will just ask you some questions about #"
  27. echo "# your hosts and DB. #"
  28. echo "#############################################"
  29. MYSQLDUMPPATH=`which mysqldump 2>/dev/null`
  30. MYSQLPATH=`which mysql 2>/dev/null`
  31. if [ $? -ne 0 ]; then
  32. echo "We were unable to find MySQL binaries on your path"
  33. while :
  34. do
  35. echo -ne "\nPlease enter MySQL binaries directory (no trailing slash): "
  36. read MYSQLBINPATH
  37. if [ -e "$MYSQLBINPATH" ] && [ -d "$MYSQLBINPATH" ] && [ -e "$MYSQLBINPATH/mysqldump" ] && [ -e "$MYSQLBINPATH/mysql" ]; then
  38. MYSQLDUMPPATH="$MYSQLBINPATH/mysqldump"
  39. MYSQLPATH="$MYSQLBINPATH/mysql"
  40. break
  41. else
  42. echo "The data you entered is invalid. Please verify and try again."
  43. exit 1
  44. fi
  45. done
  46. fi
  47. #LS
  48. echo -ne "\nPlease enter MySQL Login Server hostname (default localhost): "
  49. read LSDBHOST
  50. if [ -z "$LSDBHOST" ]; then
  51. LSDBHOST="localhost"
  52. fi
  53. echo -ne "\nPlease enter MySQL Login Server database name (default l2jdb): "
  54. read LSDB
  55. if [ -z "$LSDB" ]; then
  56. LSDB="l2jdb"
  57. fi
  58. echo -ne "\nPlease enter MySQL Login Server user (default root): "
  59. read LSUSER
  60. if [ -z "$LSUSER" ]; then
  61. LSUSER="root"
  62. fi
  63. echo -ne "\nPlease enter MySQL Login Server $LSUSER's password (won't be displayed) :"
  64. stty -echo
  65. read LSPASS
  66. stty echo
  67. echo ""
  68. if [ -z "$LSPASS" ]; then
  69. echo "Hum.. I'll let it be but don't be stupid and avoid empty passwords"
  70. elif [ "$LSUSER" == "$LSPASS" ]; then
  71. echo "You're not too brilliant choosing passwords huh?"
  72. fi
  73. #GS
  74. echo -ne "\nPlease enter MySQL Game Server hostname (default $LSDBHOST): "
  75. read GSDBHOST
  76. if [ -z "$GSDBHOST" ]; then
  77. GSDBHOST="$LSDBHOST"
  78. fi
  79. echo -ne "\nPlease enter MySQL Game Server database name (default $LSDB): "
  80. read GSDB
  81. if [ -z "$GSDB" ]; then
  82. GSDB="$LSDB"
  83. fi
  84. echo -ne "\nPlease enter MySQL Game Server user (default $LSUSER): "
  85. read GSUSER
  86. if [ -z "$GSUSER" ]; then
  87. GSUSER="$LSUSER"
  88. fi
  89. echo -ne "\nPlease enter MySQL Game Server $GSUSER's password (won't be displayed): "
  90. stty -echo
  91. read GSPASS
  92. stty echo
  93. echo ""
  94. if [ -z "$GSPASS" ]; then
  95. echo "Hum.. I'll let it be but don't be stupid and avoid empty passwords"
  96. elif [ "$GSUSER" == "$GSPASS" ]; then
  97. echo "You're not too brilliant choosing passwords huh?"
  98. fi
  99. save_config $1
  100. }
  101.  
  102. save_config() {
  103. if [ -n "$1" ]; then
  104. CONF="$1"
  105. else
  106. CONF="database_installer.rc"
  107. fi
  108. echo ""
  109. echo "With these data I can generate a configuration file which can be read"
  110. echo "on future updates. WARNING: this file will contain clear text passwords!"
  111. echo -ne "Shall I generate config file $CONF? (Y/n):"
  112. read SAVE
  113. if [ "$SAVE" == "y" -o "$SAVE" == "Y" -o "$SAVE" == "" ];then
  114. cat <<EOF>$CONF
  115. #Configuration settings for L2J-Datapack database installer script
  116. MYSQLDUMPPATH=$MYSQLDUMPPATH
  117. MYSQLPATH=$MYSQLPATH
  118. LSDBHOST=$LSDBHOST
  119. LSDB=$LSDB
  120. LSUSER=$LSUSER
  121. LSPASS=$LSPASS
  122. GSDBHOST=$GSDBHOST
  123. GSDB=$GSDB
  124. GSUSER=$GSUSER
  125. GSPASS=$GSPASS
  126. EOF
  127. chmod 600 $CONF
  128. echo "Configuration saved as $CONF"
  129. echo "Permissions changed to 600 (rw- --- ---)"
  130. elif [ "$SAVE" != "n" -a "$SAVE" != "N" ]; then
  131. save_config
  132. fi
  133. }
  134.  
  135. load_config() {
  136. if [ -n "$1" ]; then
  137. CONF="$1"
  138. else
  139. CONF="database_installer.rc"
  140. fi
  141. if [ -e "$CONF" ] && [ -f "$CONF" ]; then
  142. . $CONF
  143. else
  144. echo "Settings file not found: $CONF"
  145. echo "You can specify an alternate settings filename:"
  146. echo $0 config_filename
  147. echo ""
  148. echo "If file doesn't exist it can be created"
  149. echo "If nothing is specified script will try to work with ./database_installer.rc"
  150. echo ""
  151. configure $CONF
  152. fi
  153. }
  154.  
  155. asklogin(){
  156. echo "#############################################"
  157. echo "# WARNING: This section of the script CAN #"
  158. echo "# destroy your characters and accounts #"
  159. echo "# information. Read questions carefully #"
  160. echo "# before you reply. #"
  161. echo "#############################################"
  162. echo ""
  163. echo "Choose full (f) if you don't have and 'accounts' table or would"
  164. echo "prefer to erase the existing accounts information."
  165. echo "Choose skip (s) to skip loginserver DB installation and go to"
  166. echo "gameserver DB installation/upgrade."
  167. echo -ne "LOGINSERVER DB install type: (f) full, (s) skip or (q) quit? "
  168. read LOGINPROMPT
  169. case "$LOGINPROMPT" in
  170. "f"|"F") logininstall; loginupgrade; gsbackup; asktype;;
  171. "s"|"S") gsbackup; asktype;;
  172. "q"|"Q") finish;;
  173. *) asklogin;;
  174. esac
  175. }
  176.  
  177. logininstall(){
  178. echo "Deleting loginserver tables for new content."
  179. #$MYL < login_install.sql &> /dev/null
  180. $MYSQLDUMPPATH --add-drop-table -h $LSDBHOST -u $LSUSER --password=$LSPASS $LSDB --no-data | grep ^DROP | $MYL
  181.  
  182. }
  183.  
  184. loginupgrade(){
  185. echo "Installling new loginserver content."
  186. $MYL < ../sql/accounts.sql &> /dev/null
  187. $MYL < ../sql/gameservers.sql &> /dev/null
  188. $MYL < ../sql/account_data.sql &> /dev/null
  189. }
  190.  
  191. gsbackup(){
  192. while :
  193. do
  194. echo ""
  195. echo -ne "Do you want to make a backup copy of your GSDB? (y/n): "
  196. read LSB
  197. if [ "$LSB" == "Y" -o "$LSB" == "y" ]; then
  198. echo "Making a backup of the original gameserver database."
  199. $MYSQLDUMPPATH --add-drop-table -h $GSDBHOST -u $GSUSER --password=$GSPASS $GSDB > gameserver_backup.sql
  200. if [ $? -ne 0 ];then
  201. echo ""
  202. echo "There was a problem accesing your GS database, either it wasnt created or authentication data is incorrect."
  203. exit 1
  204. fi
  205. break
  206. elif [ "$LSB" == "n" -o "$LSB" == "N" ]; then
  207. break
  208. fi
  209. done
  210. }
  211.  
  212. lsbackup(){
  213. while :
  214. do
  215. echo ""
  216. echo -ne "Do you want to make a backup copy of your LSDB? (y/n): "
  217. read LSB
  218. if [ "$LSB" == "Y" -o "$LSB" == "y" ]; then
  219. echo "Making a backup of the original loginserver database."
  220. $MYSQLDUMPPATH --add-drop-table -h $LSDBHOST -u $LSUSER --password=$LSPASS $LSDB > loginserver_backup.sql
  221. if [ $? -ne 0 ];then
  222. echo ""
  223. echo "There was a problem accesing your LS database, either it wasnt created or authentication data is incorrect."
  224. exit 1
  225. fi
  226. break
  227. elif [ "$LSB" == "n" -o "$LSB" == "N" ]; then
  228. break
  229. fi
  230. done
  231. }
  232.  
  233. asktype(){
  234. echo ""
  235. echo ""
  236. echo "WARNING: A full install (f) will destroy all existing character data."
  237. echo -ne "GAMESERVER DB install type: (f) full install, (u) upgrade, (s) skip or (q) quit? "
  238. read INSTALLTYPE
  239. case "$INSTALLTYPE" in
  240. "f"|"F") fullinstall; upgradeinstall I; custom;;
  241. "u"|"U") upgradeinstall U; custom;;
  242. "s"|"S") custom;;
  243. "q"|"Q") finish;;
  244. *) asktype;;
  245. esac
  246. }
  247.  
  248. fullinstall(){
  249. echo "Deleting all gameserver tables for new content."
  250. #$MYG < full_install.sql &> /dev/null
  251. $MYSQLDUMPPATH --add-drop-table -h $GSDBHOST -u $GSUSER --password=$GSPASS $GSDB --no-data | grep ^DROP | $MYG
  252.  
  253. }
  254.  
  255. upgradeinstall(){
  256. if [ "$1" == "I" ]; then
  257. echo "Installling new gameserver content."
  258. else
  259. echo "Upgrading gameserver content"
  260. fi
  261. #if [ "$1" == "I" ]; then
  262. $MYG < ../sql/access_levels.sql &> /dev/null
  263. $MYG < ../sql/admin_command_access_rights.sql &> /dev/null
  264. #fi
  265. $MYG < ../sql/armor.sql &> /dev/null
  266. $MYG < ../sql/armorsets.sql &> /dev/null
  267. $MYG < ../sql/auction.sql &> /dev/null
  268. $MYG < ../sql/auction_bid.sql &> /dev/null
  269. $MYG < ../sql/auction_watch.sql &> /dev/null
  270. $MYG < ../sql/augmentations.sql &> /dev/null
  271. $MYG < ../sql/auto_announcements.sql &> /dev/null
  272. $MYG < ../sql/auto_chat.sql &> /dev/null
  273. $MYG < ../sql/auto_chat_text.sql &> /dev/null
  274. $MYG < ../sql/boxaccess.sql &> /dev/null
  275. $MYG < ../sql/boxes.sql &> /dev/null
  276. $MYG < ../sql/buff_templates.sql &> /dev/null
  277. $MYG < ../sql/castle.sql &> /dev/null
  278. $MYG < ../sql/castle_door.sql &> /dev/null
  279. $MYG < ../sql/castle_doorupgrade.sql &> /dev/null
  280. $MYG < ../sql/castle_manor_procure.sql &> /dev/null
  281. $MYG < ../sql/castle_manor_production.sql &> /dev/null
  282. $MYG < ../sql/castle_siege_guards.sql &> /dev/null
  283. $MYG < ../sql/char_templates.sql &> /dev/null
  284. $MYG < ../sql/character_raid_points.sql &> /dev/null
  285. $MYG < ../sql/character_friends.sql &> /dev/null
  286. $MYG < ../sql/character_hennas.sql &> /dev/null
  287. $MYG < ../sql/character_macroses.sql &> /dev/null
  288. $MYG < ../sql/character_offline_trade.sql &> /dev/null
  289. $MYG < ../sql/character_quests.sql &> /dev/null
  290. $MYG < ../sql/character_recipebook.sql &> /dev/null
  291. $MYG < ../sql/character_recommends.sql &> /dev/null
  292. $MYG < ../sql/character_shortcuts.sql &> /dev/null
  293. $MYG < ../sql/character_skills.sql &> /dev/null
  294. $MYG < ../sql/character_skills_save.sql &> /dev/null
  295. $MYG < ../sql/character_subclasses.sql &> /dev/null
  296. $MYG < ../sql/characters.sql &> /dev/null
  297. $MYG < ../sql/characters_custom_data.sql &> /dev/null
  298. $MYG < ../sql/clan_data.sql &> /dev/null
  299. $MYG < ../sql/clan_privs.sql &> /dev/null
  300. $MYG < ../sql/clan_skills.sql &> /dev/null
  301. $MYG < ../sql/clan_subpledges.sql &> /dev/null
  302. $MYG < ../sql/clan_wars.sql &> /dev/null
  303. $MYG < ../sql/clan_notices.sql &> /dev/null
  304. $MYG < ../sql/clanhall.sql &> /dev/null
  305. $MYG < ../sql/clanhall_functions.sql &> /dev/null
  306. $MYG < ../sql/class_list.sql &> /dev/null
  307. $MYG < ../sql/cursed_weapons.sql &> /dev/null
  308. $MYG < ../sql/custom_armor.sql &> /dev/null
  309. $MYG < ../sql/custom_armorsets.sql &> /dev/null
  310. $MYG < ../sql/custom_droplist.sql &> /dev/null
  311. $MYG < ../sql/custom_etcitem.sql &> /dev/null
  312. $MYG < ../sql/custom_merchant_buylists.sql &> /dev/null
  313. $MYG < ../sql/custom_merchant_shopids.sql &> /dev/null
  314. $MYG < ../sql/custom_npc.sql &> /dev/null
  315. $MYG < ../sql/custom_teleport.sql&> /dev/null
  316. $MYG < ../sql/custom_weapon.sql &> /dev/null
  317. $MYG < ../sql/custom_notspawned.sql &> /dev/null
  318. $MYG < ../sql/dimensional_rift.sql &> /dev/null
  319. $MYG < ../sql/droplist.sql &> /dev/null
  320. $MYG < ../sql/enchant_skill_trees.sql &> /dev/null
  321. $MYG < ../sql/engrave.sql &> /dev/null
  322. $MYG < ../sql/etcitem.sql &> /dev/null
  323. $MYG < ../sql/fish.sql &> /dev/null
  324. $MYG < ../sql/fishing_skill_trees.sql &> /dev/null
  325. $MYG < ../sql/forums.sql &> /dev/null
  326. $MYG < ../sql/games.sql &> /dev/null
  327. $MYG < ../sql/global_tasks.sql &> /dev/null
  328. $MYG < ../sql/helper_buff_list.sql &> /dev/null
  329. $MYG < ../sql/henna_trees.sql &> /dev/null
  330. $MYG < ../sql/heroes.sql &> /dev/null
  331. $MYG < ../sql/items.sql &> /dev/null
  332. $MYG < ../sql/itemsonground.sql &> /dev/null
  333. $MYG < ../sql/locations.sql &> /dev/null
  334. $MYG < ../sql/lvlupgain.sql &> /dev/null
  335. $MYG < ../sql/merchant_areas_list.sql &> /dev/null
  336. $MYG < ../sql/merchant_buylists.sql &> /dev/null
  337. $MYG < ../sql/merchant_lease.sql &> /dev/null
  338. $MYG < ../sql/merchant_shopids.sql &> /dev/null
  339. $MYG < ../sql/merchants.sql &> /dev/null
  340. $MYG < ../sql/minions.sql &> /dev/null
  341. $MYG < ../sql/mods_wedding.sql &> /dev/null
  342. $MYG < ../sql/mods_buffer.sql &> /dev/null
  343. $MYG < ../sql/npc.sql &> /dev/null
  344. $MYG < ../sql/npcskills.sql &> /dev/null
  345. $MYG < ../sql/olympiad_nobles.sql&> /dev/null
  346. $MYG < ../sql/pets.sql &> /dev/null
  347. $MYG < ../sql/pets_stats.sql &> /dev/null
  348. $MYG < ../sql/pkkills.sql &> /dev/null
  349. $MYG < ../sql/pledge_skill_trees.sql &> /dev/null
  350. $MYG < ../sql/posts.sql &> /dev/null
  351. $MYG < ../sql/quest_global_data.sql &> /dev/null
  352. $MYG < ../sql/raidboss_spawnlist.sql &> /dev/null
  353. $MYG < ../sql/random_spawn.sql &> /dev/null
  354. $MYG < ../sql/random_spawn_loc.sql &> /dev/null
  355. $MYG < ../sql/rebirth_manager.sql &> /dev/null
  356. $MYG < ../sql/seven_signs.sql &> /dev/null
  357. $MYG < ../sql/seven_signs_status.sql &> /dev/null
  358. $MYG < ../sql/siege_clans.sql &> /dev/null
  359. $MYG < ../sql/skill_learn.sql &> /dev/null
  360. $MYG < ../sql/skill_spellbooks.sql &> /dev/null
  361. $MYG < ../sql/skill_trees.sql &> /dev/null
  362. $MYG < ../sql/spawnlist.sql &> /dev/null
  363. $MYG < ../sql/teleport.sql &> /dev/null
  364. $MYG < ../sql/topic.sql &> /dev/null
  365. $MYG < ../sql/tvt.sql &> /dev/null
  366. $MYG < ../sql/tvt_teams.sql &> /dev/null
  367. $MYG < ../sql/weapon.sql &> /dev/null
  368. $MYG < ../sql/zone_vertices.sql &> /dev/null
  369. $MYG < ../sql/custom_contestable_clanhalls.sql &> /dev/null
  370. $MYG < ../sql/remove_unneeded_spawns.sql &> /dev/null
  371. $MYG < ../sql/seven_signs_festival.sql &> /dev/null
  372. $MYG < ../sql/grandboss_data.sql &> /dev/null
  373. $MYG < ../sql/grandboss_list.sql &> /dev/null
  374. $MYG < ../sql/fort_door.sql &> /dev/null
  375. $MYG < ../sql/fort_doorupgrade.sql &> /dev/null
  376. $MYG < ../sql/fort_siege_guards.sql &> /dev/null
  377. $MYG < ../sql/fort.sql &> /dev/null
  378. $MYG < ../sql/fortsiege_clans.sql &> /dev/null
  379. $MYG < ../sql/custom_spawnlist.sql &> /dev/null
  380. $MYG < ../sql/four_sepulchers_spawnlist.sql &> /dev/null
  381. $MYG < ../sql/vanhalter_spawnlist.sql &> /dev/null
  382. $MYG < ../sql/clanhall_siege.sql &> /dev/null
  383. $MYG < ../sql/npc_to_pc_polymorph.sql &> /dev/null
  384. $MYG < ../sql/vip.sql &> /dev/null
  385. $MYG < ../sql/ctf.sql &> /dev/null
  386. $MYG < ../sql/ctf_teams.sql &> /dev/null
  387. $MYG < ../sql/dm.sql &> /dev/null
  388. newbie_helper
  389. }
  390.  
  391. custom(){
  392. echo ""
  393. echo ""
  394. echo -ne "Install custom gameserver DB tables: (i) custom Items, (n) custom NPCs, (s) custom NPCs Spawns, (f) full customs, (q) Quit"
  395. read ASKCS
  396. case "$ASKCS" in
  397. "i"|"I") citemsinstall;;
  398. "n"|"N") cnpcsinstall;;
  399. "s"|"S") cspawnsinstall;;
  400. "f"|"F") cstinstall;;
  401. "q"|"Q") finish;;
  402. *) custom;;
  403. esac
  404. finish
  405. }
  406.  
  407. citemsinstall(){
  408. echo "Put in database custom Items..."
  409. $MYG < ../sql/customs/added_custom_etcitem.sql &> /dev/null
  410. $MYG < ../sql/customs/DynastyArmor_SQL_OK.sql &> /dev/null
  411. $MYG < ../sql/customs/Epic_MaskAndShield_SQL_OK.sql &> /dev/null
  412. $MYG < ../sql/customs/Gold_Bar_Item_OK.sql &> /dev/null
  413. $MYG < ../sql/customs/Mordor_Weapons_SQL_OK.sql &> /dev/null
  414. $MYG < ../sql/customs/Wings_SQL_OK.sql &> /dev/null
  415. echo "custom Items loaded with no-error. Greet!!!"
  416. custom
  417. }
  418.  
  419. cnpcsinstall(){
  420. echo "Put in database custom NPCs..."
  421. $MYG < ../sql/customs/added_custom_merchant_buylist.sql &> /dev/null
  422. $MYG < ../sql/customs/added_custom_npc.sql &> /dev/null
  423. $MYG < ../sql/customs/added_custom_teleport.sql &> /dev/null
  424. echo "custom NPCs loaded with no-error. Greet!!!"
  425. custom
  426. }
  427.  
  428. cspawnsinstall(){
  429. echo "Put in database custom NPCs spawns..."
  430. $MYG < ../sql/customs/added_custom_spawnlist.sql &> /dev/null
  431. echo "custom NPCs spawns loaded with no-error. Greet!!!"
  432. custom
  433. }
  434.  
  435. cstinstall(){
  436. while :
  437. do
  438. echo ""
  439. echo -ne "If you're not that skilled applying changes within 'custom' folder, i can try to do it for you (y). If you wish to do it on your own, choose (n). Should i parse updates files? (Y/n)"
  440. read NOB
  441. if [ "$NOB" == "Y" -o "$NOB" == "y" -o "$NOB" == "" ]; then
  442. echo ""
  443. echo "There we go, it may take some time..."
  444. echo "custom parser results. Last run: "`date` >database_installer.log
  445. for file in $(ls ../sql/customs/*sql);do
  446. echo $file|cut -d/ -f4 >> database_installer.log
  447. $MYG < $file 2>> database_installer.log
  448. if [ $? -eq 0 ];then
  449. echo "no errors">> database_installer.log
  450. fi
  451. done
  452. echo ""
  453. echo "Log available at $(pwd)/database_installer.log"
  454. echo ""
  455. break
  456. elif [ "$NOB" == "n" -o "$NOB" == "N" ]; then
  457. break
  458. fi
  459. done
  460. finish
  461. }
  462.  
  463. finish(){
  464. echo ""
  465. echo "Script execution finished."
  466. exit 0
  467. }
  468.  
  469. newbie_helper(){
  470. while :
  471. do
  472. echo ""
  473. echo -ne "If you're not that skilled applying changes within 'updates' folder, i can try to do it for you (y). If you wish to do it on your own, choose (n). Should i parse updates files? (Y/n)"
  474. read NOB
  475. if [ "$NOB" == "Y" -o "$NOB" == "y" -o "$NOB" == "" ]; then
  476. echo ""
  477. echo "There we go, it may take some time..."
  478. echo "updates parser results. Last run: "`date` >database_installer.log
  479. for file in $(ls ../sql/updates/*sql);do
  480. echo $file|cut -d/ -f4 >> database_installer.log
  481. $MYG < $file 2>> database_installer.log
  482. if [ $? -eq 0 ];then
  483. echo "no errors">> database_installer.log
  484. fi
  485. done
  486. echo ""
  487. echo "Log available at $(pwd)/database_installer.log"
  488. echo ""
  489. break
  490. elif [ "$NOB" == "n" -o "$NOB" == "N" ]; then
  491. break
  492. fi
  493. done
  494. }
  495.  
  496. clear
  497. load_config $1
  498. MYL="$MYSQLPATH -h $LSDBHOST -u $LSUSER --password=$LSPASS -D $LSDB"
  499. MYG="$MYSQLPATH -h $GSDBHOST -u $GSUSER --password=$GSPASS -D $GSDB"
  500. lsbackup
  501. asklogin
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement