SHARE
TWEET

Untitled

a guest Oct 21st, 2019 84 in 265 days
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;
  2. ; The "General" category is for certain variables.
  3. ;
  4. [general]
  5. ;
  6. ; If static is set to no, or omitted, then the pbx_config will rewrite
  7. ; this file when extensions are modified.  Remember that all comments
  8. ; made in the file will be lost when that happens.
  9. ;
  10. ; XXX Not yet implemented XXX
  11. ;
  12. static=yes
  13. ;
  14. ; if static=yes and writeprotect=no, you can save dialplan by
  15. ; CLI command "dialplan save" too
  16. ;
  17. writeprotect=no
  18. ;
  19. ; If autofallthrough is set, then if an extension runs out of
  20. ; things to do, it will terminate the call with BUSY, CONGESTION
  21. ; or HANGUP depending on Asterisk's best guess. This is the default.
  22. ;
  23. ; If autofallthrough is not set, then if an extension runs out of
  24. ; things to do, Asterisk will wait for a new extension to be dialed
  25. ; (this is the original behavior of Asterisk 1.0 and earlier).
  26. ;
  27. ;autofallthrough=no
  28. ;
  29. ;
  30. ;
  31. ; If extenpatternmatchnew is set (true, yes, etc), then a new algorithm that uses
  32. ; a Trie to find the best matching pattern is used. In dialplans
  33. ; with more than about 20-40 extensions in a single context, this
  34. ; new algorithm can provide a noticeable speedup.
  35. ; With 50 extensions, the speedup is 1.32x
  36. ; with 88 extensions, the speedup is 2.23x
  37. ; with 138 extensions, the speedup is 3.44x
  38. ; with 238 extensions, the speedup is 5.8x
  39. ; with 438 extensions, the speedup is 10.4x
  40. ; With 1000 extensions, the speedup is ~25x
  41. ; with 10,000 extensions, the speedup is 374x
  42. ; Basically, the new algorithm provides a flat response
  43. ; time, no matter the number of extensions.
  44. ;
  45. ; By default, the old pattern matcher is used.
  46. ;
  47. ; ****This is a new feature! *********************
  48. ; The new pattern matcher is for the brave, the bold, and
  49. ; the desperate. If you have large dialplans (more than about 50 extensions
  50. ; in a context), and/or high call volume, you might consider setting
  51. ; this value to "yes" !!
  52. ; Please, if you try this out, and are forced to return to the
  53. ; old pattern matcher, please report your reasons in a bug report
  54. ; on https://issues.asterisk.org. We have made good progress in providing
  55. ; something compatible with the old matcher; help us finish the job!
  56. ;
  57. ; This value can be switched at runtime using the cli command "dialplan set extenpatternmatchnew true"
  58. ; or "dialplan set extenpatternmatchnew false", so you can experiment to your hearts content.
  59. ;
  60. ;extenpatternmatchnew=no
  61. ;
  62. ; If clearglobalvars is set, global variables will be cleared
  63. ; and reparsed on a dialplan reload, or Asterisk reload.
  64. ;
  65. ; If clearglobalvars is not set, then global variables will persist
  66. ; through reloads, and even if deleted from the extensions.conf or
  67. ; one of its included files, will remain set to the previous value.
  68. ;
  69. ; NOTE: A complication sets in, if you put your global variables into
  70. ; the AEL file, instead of the extensions.conf file. With clearglobalvars
  71. ; set, a "reload" will often leave the globals vars cleared, because it
  72. ; is not unusual to have extensions.conf (which will have no globals)
  73. ; load after the extensions.ael file (where the global vars are stored).
  74. ; So, with "reload" in this particular situation, first the AEL file will
  75. ; clear and then set all the global vars, then, later, when the extensions.conf
  76. ; file is loaded, the global vars are all cleared, and then not set, because
  77. ; they are not stored in the extensions.conf file.
  78. ;
  79. clearglobalvars=no
  80.  
  81. ; The "Globals" category contains global variables that can be referenced
  82. ; in the dialplan with the GLOBAL dialplan function:
  83. ; ${GLOBAL(VARIABLE)}
  84. ; ${${GLOBAL(VARIABLE)}} or ${text${GLOBAL(VARIABLE)}} or any hybrid
  85. ; Unix/Linux environmental variables can be reached with the ENV dialplan
  86. ; function: ${ENV(VARIABLE)}
  87. ;
  88. [globals]
  89.  
  90. [cnet-inbound]
  91. ; translate c*net extensions from 3 digit to 4 digit
  92. exten => _13231XXX,1,Gosub(inbound-sub,${EXTEN:5:1}0${EXTEN:6:2},1(public))
  93. same  => n,Hangup()
  94.  
  95. [ipcommfreedid-inbound]
  96. exten => <freeDID number here>,1,Gosub(inbound-sub,9001,1(public))
  97. same  => n,Hangup
  98.  
  99. [private-inbound]
  100. exten => _!,1,Gosub(inbound-sub,${EXTEN},1(private))
  101. same  => n,Hangup
  102.  
  103. [internal-inbound]
  104. exten => _.,1,Set(TRANSFER_CONTEXT=private-inbound)
  105. same  => n,Gosub(inbound-sub,${EXTEN},1(internal))
  106. same  => n,Hangup
  107.  
  108. [inbound-sub]
  109. ; this context should only be called by a Gosub that includes arguments that indicate the privilege level of the caller
  110. ; privilege levels, in general, are used to determine how a given extension reacts
  111. ; privilege level is generally determined by where the call came from
  112. ; privilege level may be used to disallow access to an extension entirely, or change how that extension acts
  113. ; currently defined privilege levels:
  114. ; public - calls from the PSTN, C*NET, other unprivileged source
  115. ; private - calls from trusted sources, more access allowed than public
  116. ; internal - calls from internal extensions
  117.  
  118. exten => _7XXX,1,Gotoif($["${ARG1}" = "internal"]?park)
  119. same  => n,Playback(custom/cbrfca)
  120. same  => n,Playback(custom/cbrfca)
  121. same  => n,Hangup
  122. same  => n(park),Goto(parking-lots,${EXTEN},1)
  123. same  => n,Hangup
  124.  
  125. include => test-extensions
  126. include => cisco-outbound
  127. include => trmg-outbound
  128. include => doppler-outbound
  129. include => conf
  130. include => cnet-outbound
  131. include => vcf-outbound
  132. include => callwithus-outbound
  133.  
  134. [parking-lots]
  135. include => parkedcalls
  136. include => mohparkedcalls
  137.  
  138. [test-extensions]
  139. ;exten => 8004,1,Set(RTNUM=${CALLERID(num)})
  140. ;same  => n,NoOp(Incoming CLID appears to be ${RTNUM})
  141. ;same  => n,NoOp(${CDR(src)})
  142. ;same  => n,Answer()
  143. ;same  => n,MusicOnHold(origdefault)
  144. ;same  => n,Hangup()
  145. ;
  146. ;exten => h,1,GotoIf($["${ISNULL(${RTNUM})}" = "1"]?abort)
  147. ;same  => n,NoOp(Calling back ${RTNUM})
  148. ;same  => n,System(asterisk -x "originate PJSIP/${RTNUM}@3845end application MusicOnHold origdefault")
  149. ;same  => n(abort),Hangup()
  150.  
  151. ; milliwatt tone
  152. exten => 8000,1,Answer
  153. same  => n,While(true)
  154. same  => n,PlayTones(1004/1000)
  155. same  => n,Wait(300)
  156. same  => n,EndWhile
  157. same  => n,Hangup
  158.  
  159. ; modem answer tone
  160. exten => 8001,1,Answer
  161. same  => n,While(true)
  162. same  => n,PlayTones(2225/1000)
  163. same  => n,Wait(300)
  164. same  => n,EndWhile
  165. same  => n,Hangup
  166.  
  167. ; silence
  168. exten => 8002,1,Answer
  169. same  => n,While(true)
  170. same  => n,Wait(600)
  171. same  => n,EndWhile
  172. same  => n,Hangup
  173.  
  174. ; simple recording extension
  175. exten => 8003,1,Goto(${ARG1})
  176. same  => n(public),Progress
  177. same  => n,Playback(custom/cbrfca,noanswer)
  178. same  => n,Playback(custom/cbrfca,noanswer)
  179. same  => n,Hangup()
  180. same  => n(private),Noop
  181. same  => n(internal),Answer
  182. same  => n,Record(/media/scratch/asterisk/recordings/8003-%d.ulaw,,,x)
  183. same  => n,Hangup()
  184.  
  185. ; ringer test extension intercept (not available except from inside)
  186. exten => 8004,1,Progress
  187. same  => n,Playback(custom/cbrfca,noanswer)
  188. same  => n,Playback(custom/cbrfca,noanswer)
  189. same  => n,Hangup()
  190.  
  191. ; dtmf sayer test extension
  192. exten => 8005,1,Answer()
  193. same  => n,Read(keyPress,,1)
  194. same  => n,SayDigits(${keyPress})
  195. same  => n,Goto(8005,1)
  196. same  => n,Hangup()
  197.  
  198. exten => 8007,1,Answer()
  199. same  => n,MusicOnHold(origdefault)
  200. same  => n,Hangup()
  201.  
  202. exten => 8010,1,Answer
  203. same  => n,SayDigits(${CALLERID(num)})
  204. same  => n,Hangup()
  205.  
  206. exten => 8011,1,Playback(demo-echotest)
  207. same  => n,Echo
  208. same  => n,Playback(demo-echodone)
  209. same  => n,Hangup()
  210.  
  211. exten => 8020,1,Answer
  212. same  => n,PlayTones(100/1000)
  213. same  => n,Wait(300)
  214. same  => n,Hangup()
  215.  
  216. exten => 8021,1,Answer
  217. same  => n,PlayTones(125/1000)
  218. same  => n,Wait(300)
  219. same  => n,Hangup()
  220.  
  221. exten => 8022,1,Answer
  222. same  => n,PlayTones(158/1000)
  223. same  => n,Wait(300)
  224. same  => n,Hangup()
  225.  
  226. exten => 8023,1,Answer
  227. same  => n,PlayTones(200/1000)
  228. same  => n,Wait(300)
  229. same  => n,Hangup()
  230.  
  231. exten => 8024,1,Answer
  232. same  => n,PlayTones(251/1000)
  233. same  => n,Wait(300)
  234. same  => n,Hangup()
  235.  
  236. exten => 8025,1,Answer
  237. same  => n,PlayTones(316/1000)
  238. same  => n,Wait(300)
  239. same  => n,Hangup()
  240.  
  241. exten => 8026,1,Answer
  242. same  => n,PlayTones(398/1000)
  243. same  => n,Wait(300)
  244. same  => n,Hangup()
  245.  
  246. exten => 8027,1,Answer
  247. same  => n,PlayTones(501/1000)
  248. same  => n,Wait(300)
  249. same  => n,Hangup()
  250.  
  251. exten => 8028,1,Answer
  252. same  => n,PlayTones(631/1000)
  253. same  => n,Wait(300)
  254. same  => n,Hangup()
  255.  
  256. exten => 8029,1,Answer
  257. same  => n,PlayTones(794/1000)
  258. same  => n,Wait(300)
  259. same  => n,Hangup()
  260.  
  261. exten => 8030,1,Answer
  262. same  => n,PlayTones(1000/1000)
  263. same  => n,Wait(300)
  264. same  => n,Hangup()
  265.  
  266. exten => 8031,1,Answer
  267. same  => n,PlayTones(1259/1000)
  268. same  => n,Wait(300)
  269. same  => n,Hangup()
  270.  
  271. exten => 8032,1,Answer
  272. same  => n,PlayTones(1585/1000)
  273. same  => n,Wait(300)
  274. same  => n,Hangup()
  275.  
  276. exten => 8033,1,Answer
  277. same  => n,PlayTones(1995/1000)
  278. same  => n,Wait(300)
  279. same  => n,Hangup()
  280.  
  281. exten => 8034,1,Answer
  282. same  => n,PlayTones(2512/1000)
  283. same  => n,Wait(300)
  284. same  => n,Hangup()
  285.  
  286. exten => 8035,1,Answer
  287. same  => n,PlayTones(3162/1000)
  288. same  => n,Wait(300)
  289. same  => n,Hangup()
  290.  
  291. exten => 8036,1,Answer
  292. same  => n,PlayTones(3981/1000)
  293. same  => n,Wait(300)
  294. same  => n,Hangup()
  295.  
  296. [cisco-outbound]
  297. exten => _6002.,1,Goto(${ARG1})
  298. same  => n(public),NoOp
  299. same  => n(private),Progress
  300. same  => n,Playback(custom/cbrfca,noanswer)
  301. same  => n,Playback(custom/cbrfca,noanswer)
  302. same  => n,Hangup()
  303. same  => n(internal),Dial(PJSIP/${EXTEN:4}@3845end,180,${IF($["${ARG1}" = "internal"]?T)}t)
  304. same  => n,Hangup
  305.  
  306. exten => _90XX,1,Dial(PJSIP/${EXTEN}@3845end,180,${IF($["${ARG1}" = "internal"]?T)}t)
  307. same  => n,Hangup
  308.  
  309. exten => 5000,1,Dial(PJSIP/9001@3845end,180,${IF($["${ARG1}" = "internal"]?T)}t)
  310. same  => n,Hangup
  311.  
  312. [trmg-outbound]
  313. exten => _6001.,1,Goto(${ARG1})
  314. same  => n(public),Progress
  315. same  => n,Playback(custom/cbrfca,noanswer)
  316. same  => n,Playback(custom/cbrfca,noanswer)
  317. same  => n,Hangup()
  318. same  => n(private),Noop
  319. same  => n(internal),Dial(IAX2/trmg-joe_z/${EXTEN:4},180,${IF($["${ARG1}" = "internal"]?T)})
  320. same  => n,Hangup
  321.  
  322. [doppler-outbound]
  323. exten => _6003.,1,Goto(${ARG1})
  324. same  => n(public),Progress
  325. same  => n,Playback(custom/cbrfca,noanswer)
  326. same  => n,Playback(custom/cbrfca,noanswer)
  327. same  => n,Hangup()
  328. same  => n(private),Noop
  329. same  => n(internal),Dial(IAX2/doppler-joe_z/${EXTEN:4},180,${IF($["${ARG1}" = "internal"]?T)})
  330. same  => n,Hangup
  331.  
  332. [conf]
  333. exten => 4000,1,Progress
  334. same  => n,Playback(custom/apollo-11-intercept,noanswer)
  335. same  => n,Playback(custom/apollo-11-intercept,noanswer)
  336. same  => n,Hangup()
  337.  
  338. exten => 4001,1,Goto(${ARG1})
  339. same  => n(public),Noop
  340. same  => n(private),Progress
  341. same  => n,Playback(custom/cbrfca,noanswer)
  342. same  => n,Playback(custom/cbrfca,noanswer)
  343. same  => n,Hangup()
  344. same  => n(internal),ConfBridge(1,default_bridge,apollo_user)
  345. same  => n,Hangup()
  346.  
  347. [cnet-outbound]
  348. exten => _6005.,1,Goto(${ARG1})
  349. same  => n(public),Progress
  350. same  => n,Playback(custom/cbrfca,noanswer)
  351. same  => n,Playback(custom/cbrfca,noanswer)
  352. same  => n,Hangup()
  353. same  => n(internal),Set(CALLERID(all)=13231${CALLERID(num):0:1}${CALLERID(num):2:2})
  354. same  => n(private),Noop
  355. same  => n,Gosub(macro-dialcnet,s,1(${EXTEN:4}))
  356. same  => n,Hangup()
  357.  
  358. [vcf-outbound]
  359. exten => _3.,1,Dial(IAX2/doppler-joe_z/${EXTEN:4},180,${IF($["${ARG1}" = "internal"]?T)})
  360. same  => n,Hangup
  361.  
  362. [callwithus-outbound]
  363. exten => _1XXXXXXXXXX,1,Goto(${ARG1})
  364. same  => n(public),Noop
  365. same  => n(private),Progress
  366. same  => n,Playback(custom/cbrfca,noanswer)
  367. same  => n,Playback(custom/cbrfca,noanswer)
  368. same  => n,Hangup()
  369. same  => n(internal),Set(CALLERID(all)=(224) 325-0776)
  370. same  => n,Dial(PJSIP/${EXTEN}@callwithusend,180,T)
  371. same  => n,Hangup
  372.  
  373. exten => _6000.,1,Goto(${ARG1})
  374. same  => n(public),Noop
  375. same  => n(private),Progress
  376. same  => n,Playback(custom/cbrfca,noanswer)
  377. same  => n,Playback(custom/cbrfca,noanswer)
  378. same  => n,Hangup()
  379. same  => n(internal),Dial(PJSIP/${EXTEN:4}@callwithusend,180,T)
  380. same  => n,Hangup
  381.  
  382. exten => _6004.,1,Goto(${ARG1})
  383. same  => n(public),Noop
  384. same  => n(private),Progress
  385. same  => n,Playback(custom/cbrfca,noanswer)
  386. same  => n,Playback(custom/cbrfca,noanswer)
  387. same  => n,Hangup()
  388. same  => n(internal),Set(CALLERID(all)=${EXTEN:4:10})
  389. same  => n,Goto(inbound-sub,${EXTEN:14},1)
  390.  
  391. [macro-dialcnet]                                        
  392. ;version bjc1.01 - asterisk 1.4 and asterisk 1.2
  393. ;Written by Brian Clancy
  394. ;
  395. exten => s,1,Set(NUMBER=${ARG1})                         ;Store number to be called
  396. exten => s,2,GotoIf($[ ${ARG1:0:1} = "+"]?search)        ;Is number prefixed with '+'?
  397. exten => s,3,Set(ARG1=+${ARG1})                          ;Prefix number with '+'
  398. ;uncomment this line if you are using Asterisk 1.4 or newer
  399. exten => s,4(search),Set(ENUM=${ENUMLOOKUP(${ARG1},ALL,,1,std.ckts.info)})
  400. ;uncomment this line if you are using Asterisk 1.2 or older
  401. ;exten => s,4(search),Set(ENUM=${ENUMLOOKUP(${ARG1},ALL,,std.ckts.info)})  
  402. exten => s,5,GotoIf($[${LEN(${ENUM})}=0]?no_uri)         ;Is ENUM record found?      
  403. ;exten => s,6,Gotoif(${DB_EXISTS(ELBD/${NUMBER})}?cdata)  ;Does backup entry exist?
  404. exten => s,6,NoOp()
  405. ;exten => s,7,Set(DB(ELBD/${NUMBER})=${ENUM})             ;No existing backup so store backup ENUM data
  406. exten => s,7,NoOp()
  407. exten => s,8(test),GotoIf($[${ENUM:0:3} = iax ]?iaxuri)  ;Yes-IAX2 protocol
  408. exten => s,9,GotoIf($[${ENUM:0:3} = sip ]?sipuri)        ;Yes-SIP protocol
  409. exten => s,10,GotoIf($[${ENUM:0:3} = h32 ]?h323uri)      ;Yes-H323 protocol
  410. ;exten => s,11(no_uri),Gotoif(${DB_EXISTS(ELBD/${NUMBER})}?seek)  ;ENUM="", is there a backup entry?
  411. exten => s,11(no_uri),NoOp()
  412. ;exten => s,12,Macro(invalid-office-code,${NUMBER})       ;No valid ENUM and no backup entry
  413. exten => s,12,GoSub(macro-invalid-office-code,s,1(${NUMBER}))
  414. exten => s,13,Wait(5)                                    ;Pause
  415. exten => s,14,Hangup                                     ;Done - failed to make call - Goodbye
  416. ;exten => s,15(seek),Set(ENUM=${DB_RESULT})               ;Set ENUM to backup base entry
  417. ;exten => s,16,GotoIf(${REGEX("iax2,sip,h323"${ENUM})}?test)      ;If it's a single backup proceed to dial out
  418. ;exten => s,17,Set(NE=${CUT(ENUM,":",1)})                 ;Get backup entry field 1
  419. ;exten => s,18,Set(LU=${CUT(ENUM,":",2)})                 ;Get backup entry field 2
  420. ;exten => s,19,GotoIf($[${NE}>${LU}]?grec)                ;Was last used the last entry in list?
  421. ;exten => s,20(frec),Set(LU=0)                            ;Reset entry pointer
  422. ;exten => s,21(grec),Set(LU=$[${LU}+1])                   ;Increment last used pointer
  423. ;exten => s,22,Set(ENUM=${DB(ELBD/${NUMBER}/${LU})})      ;Read ENUM backup entry
  424. ;exten => s,23,Set(DB(ELBD/${NUMBER})=${NE}:${LU})        ;Update last used record
  425. ;exten => s,24,Goto(test)                                 ;Proceed to dial out
  426. exten => s,25(iaxuri),Set(DIALSTR=IAX2/${ENUM:5})        ;IAX2
  427. exten => s,26,Goto(dodial)                               ;Make call
  428. exten => s,27(sipuri),Set(DIALSTR=SIP/${ENUM:4})         ;SIP
  429. exten => s,28,Goto(dodial)                               ;Make call
  430. exten => s,29(h323uri),Set(DIALSTR=H323/${ENUM:5})       ;H323
  431. ;exten => s,30,Macro(invalid,${NUMBER})                   ;Make Call
  432. exten => s,30,Gosub(macro-invalid,s,1(${NUMBER}))
  433. exten => s,31(dodial),NoOp(Outbound Caller ID is ${CALLERID(all)})
  434. exten => s,32,Dial(${DIALSTR})                           ;Dial Out
  435. exten => s,33,Hangup                                     ;Done -call attempted - Goodbye
  436. ;exten => s,34(cdata),Gotoif($["${DB_RESULT}"="${ENUM}"]?test)    ;Does entry have a single backup?
  437. ;exten => s,35,Set(SR=${DB_RESULT})                               ;Backup does not match current
  438. ;exten => s,36,GotoIf(${REGEX("iax2,sip,h323"${SR})}?shuffle)     ;Is more than one backup entry stored?
  439. ;exten => s,37,Set(NE=${CUT(SR,":",1)})                   ;Get backup entry field 1
  440. ;exten => s,38,Set(LU=${CUT(SR,":",2)})                   ;Get backup entry field 2
  441. ;exten => s,39,Gosub(rent)                                ;Check multiple backup entries
  442. ;exten => s,40,Set(DB(ELBD/${NUMBER})=${NE}:${MR})        ;Store no. of entries and match as entry last used
  443. ;exten => s,41,GotoIf($[${MR}>0]?test)                    ;If backup exists proceed to dial out
  444. ;exten => s,42,Set(NE=$[${NE}+1])                         ;Increment entries pointer
  445. ;exten => s,43,Set(DB(ELBD/${NUMBER})=${NE}:${NE})        ;Update entry count and usage
  446. ;exten => s,44,Set(DB(ELBD/${NUMBER}/${NE})=${ENUM})      ;Store nth backup entry
  447. ;exten => s,45,Goto(test)                                 ;Nth entry stored - proceed to dial out
  448. ;exten => s,46(shuffle),Set(DB(ELBD/${NUMBER}/1)=${SR})   ;Move stored entry to backup entry /1
  449. ;exten => s,47,Set(DB(ELBD/${NUMBER}/2)=${ENUM})          ;Create second backup entry /2
  450. ;exten => s,48,Set(DB(ELBD/${NUMBER})=2:2)                ;Store no. of backup entries & last called
  451. ;exten => s,49,Goto(test)                                 ;Alternative backup entry stored - proceed to dial out
  452. ;exten => s,50(rent),Set(i=0)                             ;Load test counter
  453. ;exten => s,51,Set(MR=0)                                  ;Load match store
  454. ;exten => s,52,While($[${i}<${NE}])                       ;Check multiple entries for a NUMBER looking for a match
  455. ;exten => s,53,GotoIf($["${DB(ELBD/${NUMBER}/$[${i}+1])}"="${ENUM}"]?mark)        ;Mark entry matching ENUM result
  456. ;exten => s,54,Set(i=$[${i}+1])                           ;Increment counter
  457. ;exten => s,55,EndWhile                                   ;Look at next entry if one exists
  458. ;exten => s,56,Return                                     ;Done searching for ENUM result backup record
  459. ;exten => s,57(mark),Set(MR=$[${i}+1])                    ;ENUM result already backed up
  460. ;exten => s,58,Set(i=${NE})                               ;Load counter with no. of last entry
  461. ;exten => s,59,ContinueWhile                              ;Stop searching
  462.  
  463. ;
  464. [macro-invalid-office-code]
  465. exten => s,1,Congestion
  466. exten => s,2,Hangup
  467. ;
  468. [macro-invalid]
  469. exten => s,1,Congestion
  470. exten => s,2,Hangup
  471.  
  472. [default]
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top