Advertisement
Guest User

SPAsterisk

a guest
Mar 14th, 2019
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 16.58 KB | None | 0 0
  1. SalesPlatform Vtiger CRM 7.1.0-201803
  2. FreePBX 14.0.5.25
  3. Asterisk 13
  4. SPAsteriskConnector 1.4.2
  5.  
  6. manager.conf :
  7. ======================================================================================================
  8. ;
  9. ; AMI - Asterisk Manager interface - Generated at 2019-02-14T09:24:07+00:00
  10. ;
  11. ; FreePBX needs this to be enabled. Note that if you enable it on a different IP, you need
  12. ; to assure that this can't be reached from un-authorized hosts with the ACL settings (permit/deny).
  13. ; Also, remember to configure non-default port or IP-addresses in amportal.conf.
  14. ;
  15. ; The AMI connection is used both by the portal and the operator's panel in FreePBX.
  16. ;
  17. ; FreePBX assumes an AMI connection to localhost:5038 by default.
  18. ;
  19. [general]
  20. enabled = yes
  21. port = 5038
  22. bindaddr = 0.0.0.0
  23. displayconnects=no ;only effects 1.6+
  24.  
  25. [admin]
  26. secret = 5dIR0ZVcu3Uv
  27. deny=0.0.0.0/0.0.0.0
  28. permit=127.0.0.1/255.255.255.0
  29. permit=192.168.0.0/255.255.255.0
  30. read = system,call,log,verbose,command,agent,user,config,command,dtmf,reporting,cdr,dialplan,originate,message,all
  31. write = system,call,log,verbose,command,agent,user,config,command,dtmf,reporting,cdr,dialplan,originate,message,all
  32. writetimeout = 5000
  33.  
  34. #include manager_additional.conf
  35. #include manager_custom.conf
  36. ======================================================================================================
  37.  
  38.  
  39.  
  40. cdr_manager.conf :
  41. ======================================================================================================
  42. [general]
  43. enabled = yes
  44.  
  45. [mappings]
  46. recordingpath => recordingpath
  47. ======================================================================================================
  48.  
  49.  
  50.  
  51. extensions_override_freepbx.conf :
  52. ======================================================================================================
  53. [macro-parked-call]
  54. include => macro-parked-call-custom
  55. exten => s,1,Macro(user-callerid,)
  56. exten => s,n,Gosub(sub-record-check,s,1(parking,${AMPUSER},${AMPUSER}))
  57. exten => s,n,Noop(PARKRETURNTO: ${SHARED(PARKRETURNTO,${CHANNEL})})
  58. exten => s,n,GotoIf($[${LEN(${SHARED(PARKRETURNTO,${CHANNEL})})} > 0]?backtosender)
  59. exten => s,n,GotoIf($[${LEN(${BLINDTRANSFER})} > 0 | ${LEN(${ATTENDEDTRANSFER})} > 0]?attemptpark)
  60. exten => s,n,AGI(parkfetch.agi,${ARG1},${ARG2})
  61. exten => s,n,GotoIf($["${REC_STATUS}" != "RECORDING"]?next)
  62. exten => s,n,Set(AUDIOHOOK_INHERIT(MixMonitor)=yes)
  63. exten => s,n,Set(CDR(recordingfile)=${CALLFILENAME}.${MON_FMT})
  64. exten => s,n,Set(CDR(recordingpath)=${ASTSPOOLDIR}/monitor/${MIXMON_DIR}${YEAR}/${MONTH}/${DAY}/${CALLFILENAME}.${MON_FMT}) ;SalesPlatform override
  65. exten => s,n(next),Set(CCSS_SETUP=TRUE)
  66. exten => s,n,GotoIf($["${PARKIE}" != ""]?pcall)
  67. exten => s,n,ResetCDR()
  68. exten => s,n,Set(CDR_PROP(disable)=true)
  69. exten => s,n,Wait(1)
  70. exten => s,n,Playback(pbx-invalidpark)
  71. exten => s,n,Wait(1)
  72. exten => s,n,Hangup
  73. exten => s,n(pcall),Noop(User: ${CALLERID(all)} attempting to pick up Parked Call Slot ${ARG1})
  74. exten => s,n,Noop(PARKIE: ${PARKIE})
  75. exten => s,n,Set(SHARED(PARKRETURNTO,${PARKIE})=)
  76. exten => s,n,Set(PARKOWNER=1)
  77. exten => s,n,ParkedCall(${ARG2},${ARG1})
  78. exten => s,n,Hangup
  79. exten => s,n(attemptpark),Noop(User: ${CALLERID(all)} attempting to Park into slot ${ARG1})
  80. exten => s,n,Noop(Blind Transfer: ${BLINDTRANSFER}, Attended Transfer: ${ATTENDEDTRANSFER})
  81. exten => s,n,Noop($[${LEN(${PARKOWNER})} = 0])
  82. exten => s,n,GotoIf($[${LEN(${PARKOWNER})} = 0]?parkit)
  83. exten => s,n,Macro(hangupcall,)
  84. exten => s,n(parkit),Set(PARKINGEXTEN=${ARG1})
  85. exten => s,n,ExecIf($[${LEN(${BLINDTRANSFER})} > 0]?Set(SHARED(PARKRETURNTO,${CHANNEL})=${CUT(BLINDTRANSFER,-,1)}):Set(SHARED(PARKRETURNTO,${CHANNEL})=${CUT(ATTENDEDTRANSFER,-,1)}))
  86. exten => s,n,Noop(PARKRETURNTO: ${SHARED(PARKRETURNTO,${CHANNEL})})
  87. exten => s,n,Park(${ARG2},sc(${CONTEXT},s,200))
  88. exten => s,1+199(backtosender),Noop(Attempting to go back to sender)
  89. exten => s,n,Set(PARKCALLBACK=${PARKER})
  90. exten => s,n,Set(SHARED(PARKRETURNTO,${CHANNEL})=)
  91. exten => s,n,Goto(park-return-routing,${PARKINGSLOT},1)
  92.  
  93. exten => h,1,Macro(hangupcall,)
  94.  
  95. ;--== end of [macro-parked-call] ==--;
  96.  
  97. [parkedcallstimeout]
  98. include => parkedcallstimeout-custom
  99. exten => _[0-9a-zA-Z*#].,1,Set(PARKCALLBACK=${REPLACE(EXTEN,_,/)})
  100. exten => _[0-9a-zA-Z*#].,n,GotoIf($["${REC_STATUS}" != "RECORDING"]?next)
  101. exten => _[0-9a-zA-Z*#].,n,Set(AUDIOHOOK_INHERIT(MixMonitor)=yes)
  102. exten => _[0-9a-zA-Z*#].,n,MixMonitor(${MIXMON_DIR}${YEAR}/${MONTH}/${DAY}/${CALLFILENAME}.${MIXMON_FORMAT},a,${MIXMON_POST})
  103. exten => _[0-9a-zA-Z*#].,n,Set(CDR(recordingpath)=${ASTSPOOLDIR}/monitor/${MIXMON_DIR}${YEAR}/${MONTH}/${DAY}/${CALLFILENAME}.${MON_FMT}) ;SalesPlatform override
  104. exten => _[0-9a-zA-Z*#].,n(next),Goto(park-return-routing,${PARKINGSLOT},1)
  105.  
  106. ;--== end of [parkedcallstimeout] ==--;
  107.  
  108. [sub-record-cancel]
  109. include => sub-record-cancel-custom
  110. exten => s,1,Return()
  111.  
  112. ;--== end of [sub-record-cancel] ==--;
  113.  
  114. [sub-record-check]
  115. include => sub-record-check-custom
  116. exten => s,1,GotoIf($[${LEN(${FROMEXTEN})}]?initialized)
  117. exten => s,n,Set(__REC_STATUS=INITIALIZED)
  118. exten => s,n,Set(NOW=${EPOCH})
  119. exten => s,n,Set(__DAY=${STRFTIME(${NOW},,%d)})
  120. exten => s,n,Set(__MONTH=${STRFTIME(${NOW},,%m)})
  121. exten => s,n,Set(__YEAR=${STRFTIME(${NOW},,%Y)})
  122. exten => s,n,Set(__TIMESTR=${YEAR}${MONTH}${DAY}-${STRFTIME(${NOW},,%H%M%S)})
  123. exten => s,n,Set(__FROMEXTEN=${IF($[${LEN(${AMPUSER})}]?${AMPUSER}:${IF($[${LEN(${REALCALLERIDNUM})}]?${REALCALLERIDNUM}:unknown)})})
  124. exten => s,n,Set(__MON_FMT=${IF($["${MIXMON_FORMAT}"="wav49"]?WAV:${MIXMON_FORMAT})})
  125. exten => s,n(initialized),Noop(Recordings initialized)
  126. exten => s,n,ExecIf($[!${LEN(${ARG3})}]?Set(ARG3=dontcare))
  127. exten => s,n,Set(REC_POLICY_MODE_SAVE=${REC_POLICY_MODE})
  128. exten => s,n,ExecIf($["${BLINDTRANSFER}${ATTENDEDTRANSFER}" != ""]?Set(REC_STATUS=NO))
  129. exten => s,n(next),GotoIf($[${LEN(${ARG1})}]?checkaction)
  130. exten => s,n(recorderror),Playback(something-terribly-wrong,error)
  131. exten => s,n,Hangup
  132. exten => s,n(checkaction),GotoIf($[${DIALPLAN_EXISTS(sub-record-check,${ARG1})}]?sub-record-check,${ARG1},1)
  133. exten => s,n,Noop(Generic ${ARG1} Recording Check - ${FROMEXTEN} ${ARG2})
  134. exten => s,n,Gosub(recordcheck,1(${ARG3},${ARG1},${ARG2}))
  135. exten => s,n,Return()
  136.  
  137. exten => recordcheck,1,Noop(Starting recording check against ${ARG1})
  138. exten => recordcheck,n,Goto(${ARG1})
  139. exten => recordcheck,n(dontcare),Return()
  140. exten => recordcheck,n(always),Noop(Detected legacy "always" entry. Mapping to "force")
  141. exten => recordcheck,n(force),Set(__REC_POLICY_MODE=FORCE)
  142. exten => recordcheck,n,GotoIf($["${REC_STATUS}"!="RECORDING"]?startrec)
  143. exten => recordcheck,n,Return()
  144. exten => recordcheck,n(delayed),Noop(Detected legacy "delayed" entry. Mapping to "yes")
  145. exten => recordcheck,n(yes),ExecIf($["${REC_POLICY_MODE}" = "NEVER" | "${REC_POLICY_MODE}" = "NO" | "${REC_STATUS}" = "RECORDING"]?Return())
  146. exten => recordcheck,n,Set(__REC_POLICY_MODE=YES)
  147. exten => recordcheck,n,Goto(startrec)
  148. exten => recordcheck,n(no),Set(__REC_POLICY_MODE=NO)
  149. exten => recordcheck,n,Return()
  150. exten => recordcheck,n(never),Set(__REC_POLICY_MODE=NEVER)
  151. exten => recordcheck,n,Goto(stoprec)
  152. exten => recordcheck,n(startrec),Noop(Starting recording: ${ARG2}, ${ARG3})
  153. exten => recordcheck,n,Set(AUDIOHOOK_INHERIT(MixMonitor)=yes)
  154. exten => recordcheck,n,Set(__CALLFILENAME=${ARG2}-${ARG3}-${FROMEXTEN}-${TIMESTR}-${UNIQUEID})
  155. exten => recordcheck,n,MixMonitor(${MIXMON_DIR}${YEAR}/${MONTH}/${DAY}/${CALLFILENAME}.${MON_FMT},abi(LOCAL_MIXMON_ID)${MIXMON_BEEP},${MIXMON_POST})
  156. exten => recordcheck,n,Set(__MIXMON_ID=${LOCAL_MIXMON_ID})
  157. exten => recordcheck,n,Set(__RECORD_ID=${CHANNEL(name)})
  158. exten => recordcheck,n,Set(__REC_STATUS=RECORDING)
  159. exten => recordcheck,n,Set(CDR(recordingfile)=${CALLFILENAME}.${MON_FMT})
  160. exten => recordcheck,n,Set(CDR(recordingpath)=${ASTSPOOLDIR}/monitor/${MIXMON_DIR}${YEAR}/${MONTH}/${DAY}/${CALLFILENAME}.${MON_FMT}) ;SalesPlatform override
  161. exten => recordcheck,n,Return()
  162. exten => recordcheck,n(stoprec),Noop(Stopping recording: ${ARG2}, ${ARG3})
  163. exten => recordcheck,n,Set(__REC_STATUS=STOPPED)
  164. exten => recordcheck,n,System(${AMPBIN}/stoprecording.php "${CHANNEL(name)}")
  165. exten => recordcheck,n,Return()
  166.  
  167. exten => out,1,Noop(Outbound Recording Check from ${FROMEXTEN} to ${ARG2})
  168. exten => out,n,Set(RECMODE=${DB(AMPUSER/${FROMEXTEN}/recording/out/external)})
  169. exten => out,n,ExecIf($[!${LEN(${RECMODE})} | "${RECMODE}" = "dontcare"]?Goto(routewins))
  170. exten => out,n,ExecIf($["${ARG3}" = "never" | "${ARG3}" = "force"]?Goto(routewins))
  171. exten => out,n(extenwins),Gosub(recordcheck,1(${RECMODE},out,${ARG2}))
  172. exten => out,n,Return()
  173. exten => out,n(routewins),Gosub(recordcheck,1(${ARG3},out,${ARG2}))
  174. exten => out,n,Return()
  175.  
  176. exten => in,1,Noop(Inbound Recording Check to ${ARG2})
  177. exten => in,n,Set(FROMEXTEN=unknown)
  178. exten => in,n,ExecIf($[${LEN(${CALLERID(num)})}]?Set(FROMEXTEN=${CALLERID(num)}))
  179. exten => in,n,Gosub(recordcheck,1(${ARG3},in,${ARG2}))
  180. exten => in,n,Return()
  181.  
  182. exten => exten,1,Noop(Exten Recording Check between ${FROMEXTEN} and ${ARG2})
  183. exten => exten,n,Set(CALLTYPE=${IF($[${LEN(${FROM_DID})}]?external:internal)})
  184. exten => exten,n,ExecIf(${LEN(${CALLTYPE_OVERRIDE})}?Set(CALLTYPE=${CALLTYPE_OVERRIDE}))
  185. exten => exten,n,Set(CALLEE=${DB(AMPUSER/${ARG2}/recording/in/${CALLTYPE})})
  186. exten => exten,n,ExecIf($[!${LEN(${CALLEE})}]?Set(CALLEE=dontcare))
  187. exten => exten,n,GotoIf($["${CALLTYPE}"="external"]?callee)
  188. exten => exten,n,GotoIf($["${CALLEE}"="dontcare"]?caller)
  189. exten => exten,n,ExecIf($[${LEN(${DB(AMPUSER/${FROMEXTEN}/recording/priority)})}]?Set(CALLER_PRI=${DB(AMPUSER/${FROMEXTEN}/recording/priority)}):Set(CALLER_PRI=0))
  190. exten => exten,n,ExecIf($[${LEN(${DB(AMPUSER/${ARG2}/recording/priority)})}]?Set(CALLEE_PRI=${DB(AMPUSER/${ARG2}/recording/priority)}):Set(CALLEE_PRI=0))
  191. exten => exten,n,GotoIf($["${CALLER_PRI}"="${CALLEE_PRI}"]?${REC_POLICY}:${IF($[${CALLER_PRI}>${CALLEE_PRI}]?caller:callee)})
  192. exten => exten,n(callee),Gosub(recordcheck,1(${CALLEE},${CALLTYPE},${ARG2}))
  193. exten => exten,n,Return()
  194. exten => exten,n(caller),Set(RECMODE=${DB(AMPUSER/${FROMEXTEN}/recording/out/internal)})
  195. exten => exten,n,ExecIf($[!${LEN(${RECMODE})}]?Set(RECMODE=dontcare))
  196. exten => exten,n,ExecIf($["${RECMODE}"="dontcare"]?Set(RECMODE=${CALLEE}))
  197. exten => exten,n,Gosub(recordcheck,1(${RECMODE},${CALLTYPE},${ARG2}))
  198. exten => exten,n,Return()
  199.  
  200. exten => conf,1,Noop(Conference Recording Check ${FROMEXTEN} to ${ARG2})
  201. exten => conf,n,Gosub(recconf,1(${ARG2},${ARG2},${ARG3}))
  202. exten => conf,n,Return()
  203.  
  204. exten => page,1,Noop(Paging Recording Check ${FROMEXTEN} to ${ARG2})
  205. exten => page,n,GosubIf($["${REC_POLICY_MODE}"="always"]?recconf,1(${ARG2},${FROMEXTEN},${ARG3}))
  206. exten => page,n,Return()
  207.  
  208. exten => recconf,1,Noop(Setting up recording: ${ARG1}, ${ARG2}, ${ARG3})
  209. exten => recconf,n,Set(__CALLFILENAME=${IF($[${CONFBRIDGE_INFO(parties,${ARG2})}]?${DB(RECCONF/${ARG2})}:${ARG1}-${ARG2}-${ARG3}-${TIMESTR}-${UNIQUEID})})
  210. exten => recconf,n,ExecIf($[!${CONFBRIDGE_INFO(parties,${ARG2})}]?Set(DB(RECCONF/${ARG2})=${CALLFILENAME}))
  211. exten => recconf,n,Set(CONFBRIDGE(bridge,record_file)=${MIXMON_DIR}${YEAR}/${MONTH}/${DAY}/${CALLFILENAME}.${MON_FMT})
  212. exten => recconf,n,ExecIf($["${ARG3}"!="always"]?Return())
  213. exten => recconf,n,Set(CONFBRIDGE(bridge,record_conference)=yes)
  214. exten => recconf,n,Set(__REC_STATUS=RECORDING)
  215. exten => recconf,n,Set(CDR(recordingfile)=${IF($[${CONFBRIDGE_INFO(parties,${ARG2})}]?${CALLFILENAME}.${MON_FMT}:${CALLFILENAME}.${MON_FMT})})
  216. exten => recconf,n,Set(CDR(recordingpath)=${ASTSPOOLDIR}/monitor/${MIXMON_DIR}${YEAR}/${MONTH}/${DAY}/${CALLFILENAME}.${MON_FMT}) ;SalesPlatform override
  217. exten => recconf,n,Noop(${MIXMONITOR_FILENAME})
  218. exten => recconf,n,Set(CHANNEL(hangup_handler_push)=sub-record-hh-check,s,1)
  219. exten => recconf,n,Return()
  220.  
  221. exten => recq,1,Noop(Setting up recording: ${ARG1}, ${ARG2}, ${ARG3})
  222. exten => recq,n,Set(AUDIOHOOK_INHERIT(MixMonitor)=yes)
  223. exten => recq,n,Set(MONITOR_FILENAME=${MIXMON_DIR}${YEAR}/${MONTH}/${DAY}/${CALLFILENAME})
  224. exten => recq,n,MixMonitor(${MONITOR_FILENAME}.${MON_FMT},${MONITOR_OPTIONS}${MIXMON_BEEP},${MIXMON_POST})
  225. exten => recq,n,Set(__REC_STATUS=RECORDING)
  226. exten => recq,n,Set(CDR(recordingfile)=${CALLFILENAME}.${MON_FMT})
  227. exten => recq,n,Set(CDR(recordingpath)=${ASTSPOOLDIR}/monitor/${MIXMON_DIR}${YEAR}/${MONTH}/${DAY}/${CALLFILENAME}.${MON_FMT}) ;SalesPlatform override
  228. exten => recq,n,Return()
  229.  
  230. exten => parking,1,Noop(User ${ARG2} picked up a parked call)
  231. exten => parking,n,Set(USER=${ARG2})
  232. exten => parking,n,ExecIf($[!${LEN(${ARG2})}]?Set(USER=unknown))
  233. exten => parking,n,Set(RECMODE=${DB(AMPUSER/${ARG2}/recording/out/internal)})
  234. exten => parking,n,ExecIf($[!${LEN(${RECMODE})}]?Set(RECMODE=dontcare))
  235. exten => parking,n,Gosub(recordcheck,1(${RECMODE},parked,${USER}))
  236. exten => parking,n,Return()
  237.  
  238. ;--== end of [sub-record-check] ==--;
  239. ======================================================================================================
  240.  
  241.  
  242.  
  243. log-Ρ„Π°ΠΉΠ» SPAsteriskConnector :
  244. ======================================================================================================
  245. [Thread-0] INFO org.asteriskjava.manager.internal.ManagerConnectionImpl - Connecting to 127.0.0.1:5038
  246. [main] INFO org.eclipse.jetty.server.Server - jetty-8.1.14.v20131031
  247. [Asterisk-Java ManagerConnection-0-Reader-0] INFO org.asteriskjava.manager.internal.ManagerConnectionImpl - Connected via Asterisk Call Manager/2.10.3
  248. [Asterisk-Java ManagerConnection-0-Reader-0] WARN org.asteriskjava.manager.internal.ManagerConnectionImpl - Unsupported protocol version 'Asterisk Call Manager/2.10.3'. Use at your own risk.
  249. [main] INFO org.eclipse.jetty.webapp.StandardDescriptorProcessor - NO JSP Support for /, did not find org.apache.jasper.servlet.JspServlet
  250. [Thread-0] INFO org.asteriskjava.manager.internal.ManagerConnectionImpl - Successfully logged in
  251. [main] INFO org.eclipse.jetty.server.AbstractConnector - Started SelectChannelConnector@0.0.0.0:5555
  252. [Thread-0] INFO org.asteriskjava.manager.internal.ManagerConnectionImpl - Determined Asterisk version: Asterisk 13
  253. [Asterisk-Java ManagerConnection-0-Reader-0] WARN org.asteriskjava.manager.internal.EventBuilderImpl - Unable to set property 'bridgevideosourcemode' to 'none' on org.asteriskjava.manager.event.BridgeCreateEvent: no setter. Please report at http://jira.reucon.org/browse/AJ
  254. [Asterisk-Java ManagerConnection-0-Reader-0] WARN org.asteriskjava.manager.internal.EventBuilderImpl - Unable to set property 'bridgevideosourcemode' to 'none' on org.asteriskjava.manager.event.BridgeEnterEvent: no setter. Please report at http://jira.reucon.org/browse/AJ
  255. [Asterisk-Java ManagerConnection-0-Reader-0] WARN org.asteriskjava.manager.internal.EventBuilderImpl - Unable to set property 'bridgevideosourcemode' to 'none' on org.asteriskjava.manager.event.BridgeEnterEvent: no setter. Please report at http://jira.reucon.org/browse/AJ
  256. [Asterisk-Java ManagerConnection-0-Reader-0] INFO org.asteriskjava.manager.internal.backwardsCompatibility.bridge.BridgeState - Members size 2 org.asteriskjava.manager.event.BridgeEnterEvent[dateReceived='Thu Mar 14 11:56:58 MSK 2019',privilege='call,all',linkedid='1552553816.130',server=null,calleridname='+37529XXXXXXX',bridgeuniqueid='f82c1852-a8ee-4ae4-b8f5-b53594dc6fee',channel='PJSIP/GSM_Gate-00000025',language='ru',exten='200',calleridnum='+37529XXXXXXX',context='from-trunk',bridgetechnology='simple_bridge',connectedlinenum='200',uniqueid='1552553816.130',timestamp=null,channelstatedesc='Up',systemname=null,bridgetype='basic',bridgenumchannels='2',connectedlinename='200',bridgecreator=null,sequencenumber=null,priority='4',channelstate='6',bridgename=null,accountcode='',systemHashcode=1757259910]
  257. [Asterisk-Java ManagerConnection-0-Reader-0] INFO org.asteriskjava.manager.internal.backwardsCompatibility.bridge.BridgeState - Bridge SIP/200-0000002e PJSIP/GSM_Gate-00000025
  258. [Asterisk-Java ManagerConnection-0-Reader-0] WARN org.asteriskjava.manager.internal.EventBuilderImpl - Unable to set property 'bridgevideosourcemode' to 'none' on org.asteriskjava.manager.event.BridgeLeaveEvent: no setter. Please report at http://jira.reucon.org/browse/AJ
  259. [Asterisk-Java ManagerConnection-0-Reader-0] WARN org.asteriskjava.manager.internal.EventBuilderImpl - Unable to set property 'bridgevideosourcemode' to 'none' on org.asteriskjava.manager.event.BridgeLeaveEvent: no setter. Please report at http://jira.reucon.org/browse/AJ
  260. [Asterisk-Java ManagerConnection-0-Reader-0] WARN org.asteriskjava.manager.internal.EventBuilderImpl - Unable to set property 'bridgevideosourcemode' to 'none' on org.asteriskjava.manager.event.BridgeDestroyEvent: no setter. Please report at http://jira.reucon.org/browse/AJ
  261. ======================================================================================================
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement