WP Mail Bank: WordPress SMTP Plugin & Email Logs - Version 3.0.8

Version Description

  • TWEAK: Links Added
  • FIX: unserialize changed to maybe_unserialize
  • TWEAK: Code Optimized
  • TRANSLATIONS: Language Updated - Vietnamese
Download this release

Release Info

Developer contact-banker
Plugin Icon 128x128 WP Mail Bank: WordPress SMTP Plugin & Email Logs
Version 3.0.8
Comparing to
See all releases

Code changes from version 3.0.7 to 3.0.8

Files changed (59) hide show
  1. assets/admin/layout/css/font/tech-banker.svg +59 -59
  2. assets/admin/layout/css/layout-rtl.css +2 -2
  3. assets/admin/layout/css/mail-bank-custom.css +15 -0
  4. assets/global/img/icon.png +0 -0
  5. assets/global/plugins/custom/js/custom.js +243 -243
  6. assets/global/plugins/datatables/media/js/jquery.datatables.js +1 -1
  7. assets/global/plugins/icons/fonts/icons.svg +166 -166
  8. assets/global/plugins/icons/icons-lte-ie7.js +5 -5
  9. assets/global/plugins/toastr/toastr.css +4 -4
  10. assets/global/plugins/toastr/toastr.js +338 -338
  11. assets/global/plugins/validation/jquery.validate.js +1221 -1221
  12. includes/authentication-manager-mail-bank.php +22 -22
  13. includes/footer.php +1050 -1050
  14. includes/google-authentication-mail-bank.php +42 -42
  15. includes/header.php +5 -5
  16. includes/mail-bank-configuration-provider.php +11 -11
  17. includes/mail-bank-configure-transport.php +41 -41
  18. includes/mail-bank-email-log.php +84 -84
  19. includes/mail-bank-manage-email-address.php +40 -40
  20. includes/mail-bank-manage-email.php +220 -220
  21. includes/mail-bank-manage-token.php +31 -31
  22. includes/mail-bank-send-mail.php +100 -100
  23. includes/mail-bank-smtp-transport.php +2 -2
  24. includes/mail-bank-zend-engine.php +143 -143
  25. includes/mail-bank-zend-mail-helper.php +32 -32
  26. includes/mailer.php +186 -186
  27. includes/microsoft-authentication-mail-bank.php +40 -40
  28. includes/queries.php +89 -89
  29. includes/sidebar.php +121 -121
  30. includes/token-manager-mail-bank.php +52 -52
  31. includes/translations.php +11 -11
  32. includes/yahoo-authentication-mail-bank.php +50 -50
  33. languages/{wp-mail-bank-vi_VN.mo → wp-mail-bank-vi.mo} +0 -0
  34. languages/{wp-mail-bank-vi_VN.po → wp-mail-bank-vi.po} +2 -2
  35. lib/action-library.php +265 -265
  36. lib/admin-bar-menu.php +98 -98
  37. lib/helper.php +174 -174
  38. lib/install-script.php +316 -316
  39. lib/sidebar-menu.php +260 -260
  40. lib/zend/exception.php +9 -9
  41. lib/zend/loader.php +82 -82
  42. lib/zend/loader/autoloader.php +104 -104
  43. lib/zend/mail.php +176 -176
  44. lib/zend/mail/message.php +17 -17
  45. lib/zend/mail/message/file.php +2 -2
  46. lib/zend/mail/part/file.php +64 -64
  47. lib/zend/mail/protocol/abstract.php +70 -70
  48. lib/zend/mail/protocol/smtp.php +91 -91
  49. lib/zend/mail/protocol/smtp/auth/crammd5.php +8 -8
  50. lib/zend/mail/protocol/smtp/auth/login.php +6 -6
  51. lib/zend/mail/protocol/smtp/auth/oauth2.php +3 -3
  52. lib/zend/mail/protocol/smtp/auth/plain.php +6 -6
  53. lib/zend/mail/storage/abstract.php +11 -11
  54. lib/zend/mail/storage/folder.php +6 -6
  55. lib/zend/mail/storage/folder/maildir.php +88 -88
  56. lib/zend/mail/storage/folder/mbox.php +68 -68
  57. lib/zend/mail/storage/maildir.php +126 -126
  58. lib/zend/mail/storage/mbox.php +90 -90
  59. lib/zend/mail/storage/writable/maildir.php +191 -200
assets/admin/layout/css/font/tech-banker.svg CHANGED
@@ -4,65 +4,65 @@
4
  <metadata>Generated by IcoMoon</metadata>
5
  <defs>
6
  <font id="foobox" horiz-adv-x="1024">
7
- <font-face units-per-em="1024" ascent="960" descent="-64" />
8
- <missing-glyph horiz-adv-x="1024" />
9
- <glyph unicode="&#x20;" d="" horiz-adv-x="512" />
10
- <glyph unicode="&#x2f;" d="M0 249.344v185.344h229.376v-183.296q0-28.672 20.48-49.664t50.176-20.992 50.688 20.48 20.992 50.176v433.152q0 119.808 88.576 204.288t210.432 84.48 210.432-84.992 88.576-205.824v-94.208l-137.216-40.96-91.136 43.008v81.92q0 29.696-20.48 50.176t-50.176 20.48-50.688-20.48-20.992-50.176v-427.008q0-122.88-88.064-209.408t-210.944-86.528q-123.904 0-211.968 87.552t-88.064 212.48zM741.376 246.272v187.392l91.136-43.008 137.216 40.96v-188.416q0-29.696 20.48-50.688t50.176-20.992 50.176 20.992 20.48 50.688v191.488h229.376v-185.344q0-123.904-87.552-211.968t-211.456-88.064-211.968 87.040-88.064 209.92z" horiz-adv-x="1340" />
11
- <glyph unicode="&#x3b;" d="M-1.024 189.952v380.928q0 13.312 13.312 13.312h180.224v132.096q0 14.336 13.312 14.336h100.352v-526.336q0-14.336-12.288-14.336h-294.912zM110.592 274.944h68.608q13.312 0 13.312 14.336v210.944h-68.608q-13.312 0-13.312-14.336v-210.944zM340.992 189.952v380.928q0 13.312 13.312 13.312h100.352v-379.904q0-14.336-12.288-14.336h-101.376zM340.992 645.632v70.656q0 14.336 12.288 14.336h101.376v-70.656q0-14.336-12.288-14.336h-101.376zM493.568 189.952v380.928q0 13.312 13.312 13.312h294.912v-516.096q0-13.312-13.312-13.312h-294.912l1.024 70.656q0 14.336 12.288 14.336h180.224v50.176h-193.536zM606.208 274.944h68.608q12.288 0 12.288 14.336v210.944h-68.608q-12.288 0-12.288-14.336v-210.944zM840.704 125.44q0 14.336 13.312 14.336h180.224v50.176h-193.536v380.928q0 13.312 13.312 13.312h293.888v-516.096q0-13.312-12.288-13.312h-294.912v70.656zM952.32 274.944h68.608q13.312 0 13.312 14.336v210.944h-68.608q-13.312 0-13.312-14.336v-210.944z" horiz-adv-x="1148" />
12
- <glyph unicode="&#x3e;" d="M0 467.456q0 63.488 50.688 108.544t115.2 45.056q63.488 0 107.52-36.864h5.12q137.216 83.968 343.040 83.968l5.12 4.096 71.68 273.408 247.808-36.864q0-1.024 2.048-1.024 1.024 0 0 1.024 2.048 1.024 11.776 15.872t14.848 18.944q34.816 32.768 83.968 32.768 50.176 0 84.48-33.28t34.304-83.456-34.304-86.016-84.48-35.84q-58.368 0-89.088 39.424t-30.72 98.816q-2.048-1.024-99.84 13.312t-112.128 17.408h-3.072q-2.048-2.048-16.896-54.784t-30.72-111.616-17.92-65.024v-3.072l5.12-4.096q73.728 0 151.040-20.992t133.632-58.88l3.072-2.048q1.024 1.024 2.048 1.024t2.048 1.024q25.6 18.432 36.352 25.6t30.208 13.312 44.032 6.144q69.632 0 118.784-49.152t49.152-119.808q0-48.128-27.136-88.064t-71.168-61.44q0-199.68-266.24-310.272-41.984-18.432-57.344-23.552-32.768-10.24-93.184-19.456t-95.232-9.216q-122.88 0-236.544 35.84-2.048 2.048-73.728 38.912-97.28 52.224-156.16 118.784t-58.88 159.744h-5.12q-33.792 17.408-60.416 51.2l-9.216 12.288q-15.36 27.648-19.456 46.592t-4.096 51.712zM34.816 455.168q0-67.584 58.368-114.688 5.12 60.416 49.152 118.784t103.424 103.424q-37.888 26.624-83.968 26.624-50.176 0-88.576-41.472t-38.4-92.672zM139.264 305.664q0-55.296 31.744-106.496t81.408-87.552 104.96-60.928 107.52-34.816q76.8-14.336 149.504-14.336 125.952 0 238.592 40.448t189.44 125.44h-3.072q30.72 38.912 44.032 70.144t13.312 74.24q0 55.296-27.136 105.472t-71.168 86.016-94.208 61.952-102.4 39.424q-87.040 23.552-185.344 23.552-75.776 0-155.136-18.432t-153.6-55.296-121.344-101.888-47.104-146.944zM329.728 380.416q0 37.888 23.040 60.928t60.928 23.040 63.488-23.040 25.6-60.928q0-36.864-26.112-61.44t-62.976-24.576-60.416 24.576-23.552 61.44zM366.592 212.48h45.056q25.6-46.080 81.408-70.144t114.176-24.064q59.392 0 112.64 24.064t86.016 70.144h41.984q-25.6-63.488-95.232-98.304t-145.408-34.816q-73.728 0-144.896 35.328t-95.744 97.792zM710.656 380.416q0 38.912 23.552 61.44t62.464 22.528q34.816 0 59.392-24.576t24.576-59.392-24.576-60.416-59.392-25.6q-37.888 0-61.952 24.064t-24.064 61.952zM971.776 859.648q0-35.84 25.6-61.44t61.44-25.6q36.864 0 60.416 25.088t23.552 61.952q0 34.816-24.576 59.392t-59.392 24.576-60.928-25.088-26.112-58.88zM986.112 571.904q56.32-36.864 97.28-94.72t57.344-122.368q60.416 44.032 60.416 98.304 0 59.392-36.352 102.4t-94.72 43.008q-46.080 0-83.968-26.624z" horiz-adv-x="1232" />
13
- <glyph unicode="&#x74;" d="M0 556.544v145.408q61.44 20.48 103.424 56.32 41.984 33.792 68.608 88.064 26.624 52.224 35.84 130.048h146.432v-259.072h242.688v-160.768h-242.688v-262.144q0-88.064 9.216-114.688 9.216-24.576 34.816-39.936 34.816-20.48 77.824-20.48 78.848 0 154.624 50.176v-160.768q-64.512-31.744-118.784-44.032-53.248-12.288-114.688-12.288-69.632 0-124.928 17.408-56.32 19.456-91.136 51.2-36.864 31.744-53.248 69.632-14.336 34.816-14.336 107.52v358.4h-113.664z" horiz-adv-x="630" />
14
- <glyph unicode="&#xe000;" d="M876.856 448v-73.142q0-30.286-18.572-51.714t-48.286-21.428h-402.286l167.428-168q21.714-20.572 21.714-51.428t-21.714-51.428l-42.858-43.428q-21.142-21.142-51.428-21.142-29.714 0-52 21.142l-372 372.572q-21.142 21.142-21.142 51.428 0 29.714 21.142 52l372 371.428q21.714 21.714 52 21.714 29.714 0 51.428-21.714l42.858-42.286q21.714-21.714 21.714-52t-21.714-52l-167.428-167.428h402.286q29.714 0 48.286-21.428t18.572-51.714z" horiz-adv-x="876" />
15
- <glyph unicode="&#xe001;" d="M840.286 411.428q0-30.858-21.142-52l-372-372q-22.286-21.142-52-21.142-29.142 0-51.428 21.142l-42.858 42.858q-21.714 21.714-21.714 52t21.714 52l167.428 167.428h-402.286q-29.714 0-48.286 21.428t-18.572 51.714v73.142q0 30.286 18.572 51.714t48.286 21.428h402.286l-167.428 168q-21.714 20.572-21.714 51.428t21.714 51.428l42.858 42.858q21.714 21.714 51.428 21.714 30.286 0 52-21.714l372-372q21.142-20 21.142-51.428z" horiz-adv-x="876" />
16
- <glyph unicode="&#xe002;" d="M741.428 204.572q0-22.858-16-38.858l-77.714-77.714q-16-16-38.858-16t-38.858 16l-168 168-168-168q-16-16-38.858-16t-38.858 16l-77.714 77.714q-16 16-16 38.858t16 38.858l168 168-168 168q-16 16-16 38.858t16 38.858l77.714 77.714q16 16 38.858 16t38.858-16l168-168 168 168q16 16 38.858 16t38.858-16l77.714-77.714q16-16 16-38.858t-16-38.858l-168-168 168-168q16-16 16-38.858z" horiz-adv-x="804" />
17
- <glyph unicode="&#xe003;" d="M790.572 430.286l-758.858-421.714q-13.142-7.428-22.572-1.714t-9.428 20.572v841.142q0 14.858 9.428 20.572t22.572-1.714l758.858-421.714q13.142-7.428 13.142-17.714t-13.142-17.714z" horiz-adv-x="804" />
18
- <glyph unicode="&#xe004;" d="M876.856 850.286v-804.572q0-14.858-10.858-25.714t-25.714-10.858h-292.572q-14.858 0-25.714 10.858t-10.858 25.714v804.572q0 14.858 10.858 25.714t25.714 10.858h292.572q14.858 0 25.714-10.858t10.858-25.714zM364.856 850.286v-804.572q0-14.858-10.858-25.714t-25.714-10.858h-292.572q-14.858 0-25.714 10.858t-10.858 25.714v804.572q0 14.858 10.858 25.714t25.714 10.858h292.572q14.858 0 25.714-10.858t10.858-25.714z" horiz-adv-x="876" />
19
- <glyph unicode="&#xe005;" d="M283.428 192q0-34.286-24.286-58.286t-58-24q-34.286 0-58.286 24t-24 58.286 24 58.286 58.286 24q33.714 0 58-24t24.286-58.286zM530.286 82.286q0-30.286-21.428-51.714t-51.714-21.428-51.714 21.428-21.428 51.714 21.428 51.714 51.714 21.428 51.714-21.428 21.428-51.714zM182.858 448q0-37.714-26.858-64.572t-64.572-26.858-64.572 26.858-26.858 64.572 26.858 64.572 64.572 26.858 64.572-26.858 26.858-64.572zM777.142 192q0-26.286-18.858-45.142t-45.142-18.858-45.142 18.858-18.858 45.142 18.858 45.142 45.142 18.858 45.142-18.858 18.858-45.142zM301.714 704q0-41.714-29.428-71.142t-71.142-29.428-71.142 29.428-29.428 71.142 29.428 71.142 71.142 29.428 71.142-29.428 29.428-71.142zM566.858 813.714q0-45.714-32-77.714t-77.714-32-77.714 32-32 77.714 32 77.714 77.714 32 77.714-32 32-77.714zM877.714 448q0-22.858-16-38.858t-38.858-16-38.858 16-16 38.858 16 38.858 38.858 16 38.858-16 16-38.858zM758.858 704q0-18.858-13.428-32.286t-32.286-13.428-32.286 13.428-13.428 32.286 13.428 32.286 32.286 13.428 32.286-13.428 13.428-32.286z" horiz-adv-x="896" />
20
- <glyph unicode="&#xe006;" d="M0 135.786q0 89.058 91.104 158.666t220.084 69.608h55.278q-42.994 40.946-42.994 88.034 0 29.686 16.378 59.372-10.236-1.024-29.686-1.024-106.46 0-174.020 66.538t-67.56 163.784q0 93.152 83.94 162.76t191.422 69.608h317.332l-70.632-51.182h-100.318q48.112-18.426 75.238-69.608t27.126-113.626q0-95.2-90.082-165.832-37.876-29.686-49.136-47.088t-11.26-42.994q0-19.45 27.638-49.136t55.278-50.158q62.442-44.016 86.498-90.082t24.056-115.672q0-92.128-83.94-160.202t-227.25-68.072q-136.146 0-230.32 51.182t-94.176 135.122zM114.648 169.568q0-70.632 59.884-120.278t148.94-49.646q121.814 0 176.58 45.040t54.766 119.766q0 19.45-4.094 32.756-3.070 11.26-7.166 20.984t-12.284 19.45-14.332 16.378-19.962 16.89-20.984 15.354-25.592 17.914-26.614 17.914q-39.922 12.284-78.82 12.284-92.128 1.024-161.224-48.112t-69.096-116.696zM182.21 741.786q11.26-80.868 61.93-139.216t112.090-59.372q60.396-2.048 96.222 53.23t25.592 136.146-60.908 137.168-112.090 58.348-97.246-52.206-25.592-134.098zM750.334 717.22v51.182h204.73v204.73h51.182v-204.73h205.754v-51.182h-205.754v-205.754h-51.182v205.754h-204.73z" horiz-adv-x="1212" />
21
- <glyph unicode="&#xe007;" d="M0 589.312q0 64.512 27.136 128t77.824 117.76 133.12 88.064 182.784 33.792q162.816 0 267.264-100.352t104.448-236.544q0-175.104-88.576-289.28t-228.864-114.176q-46.080 0-86.528 21.504t-56.832 52.224l-40.96-161.792q-5.12-19.456-13.312-39.424t-17.92-38.4-19.456-34.816-19.456-30.72-16.896-24.064-13.312-16.896l-6.144-8.192q-3.072-4.096-8.192-3.072t-6.144 6.144q0 1.024-1.536 14.336t-3.072 28.16-3.072 38.4-1.024 45.568 3.072 48.64 7.68 49.152q11.264 48.128 75.776 320.512-8.192 16.384-13.312 39.424t-5.12 37.376l-1.024 15.36q0 65.536 33.28 109.056t80.384 43.52q37.888 0 58.88-25.088t20.992-62.976q0-23.552-8.704-57.856t-23.040-78.848-20.48-72.192q-10.24-46.080 17.92-79.872t75.264-33.792q80.896 0 133.632 91.648t52.736 221.696q0 99.328-64.512 162.304t-180.224 62.976q-129.024 0-209.408-82.944t-80.384-198.656q0-68.608 38.912-115.712 13.312-15.36 8.192-32.768-2.048-5.12-6.144-23.552t-6.144-23.552q-2.048-11.264-10.24-14.848t-18.432 0.512q-60.416 24.576-90.624 84.48t-30.208 139.776z" horiz-adv-x="793" />
22
- <glyph unicode="&#xe008;" d="M-5.116 852.114q0 51.154 35.808 84.404t93.1 33.25q56.27 0 91.054-32.738 35.808-33.762 35.808-87.984 0-49.108-34.784-81.846-35.808-33.762-94.124-33.762h-1.024q-56.27 0-91.054 33.762t-34.784 84.916zM8.184-43.078v683.416h227.124v-683.416h-227.124zM361.146-43.078h227.124v381.608q0 35.808 8.184 55.246 14.324 34.784 43.48 58.826t73.15 24.042q114.584 0 114.584-154.484v-365.238h227.124v391.838q0 151.416-71.616 229.68t-189.27 78.266q-131.976 0-205.638-113.562v-2.046h-1.024l1.024 2.046v97.192h-227.124q2.046-32.738 2.046-203.592t-2.046-479.824z" horiz-adv-x="1064" />
23
- <glyph unicode="&#xe009;" d="M0 52.19q30.682-3.068 61.366-3.068 180.006 0 321.148 110.458-83.866 1.022-150.346 51.138t-91.026 127.846q20.456-4.092 48.070-4.092 35.796 0 68.526 9.204-90.004 17.386-148.812 88.47t-58.808 164.154v3.068q54.206-30.682 117.618-31.706-53.184 34.774-84.378 91.538t-31.194 123.244q0 69.548 35.796 129.892 96.14-119.664 234.724-190.746t297.114-79.264q-7.16 33.752-7.16 59.32 0 106.368 75.684 182.052t183.074 75.684q111.482 0 188.188-81.822 88.98 18.41 163.642 63.412-28.638-93.072-112.504-143.186 74.662 9.204 147.278 40.91-49.092-76.708-127.846-133.982v-33.752q0-103.3-30.172-207.11t-92.048-198.416-147.79-168.244-206.086-117.106-258.248-43.468q-213.758 0-395.81 115.572z" horiz-adv-x="1258" />
24
- <glyph unicode="&#xe00a;" d="M286.416 426.496v195.584h157.696v98.304q0 106.496 69.12 181.248t167.424 74.752h156.672v-195.584h-156.672q-15.36 0-27.648-16.896t-12.288-41.472v-100.352h196.608v-195.584h-196.608v-474.112h-196.608v474.112h-157.696z" horiz-adv-x="836" />
25
- <glyph unicode="&#xe00b;" d="M0 163.328q11.264 15.36 32.256 26.112t50.176 20.48 41.472 15.872q19.456 0 34.304-4.608t34.304-15.36 25.6-12.8q48.128-21.504 266.24-121.856 19.456-4.096 36.352 0t40.448 17.92 24.576 14.848q20.48 9.216 78.336 35.328t89.6 40.448q4.096 2.048 42.496 21.504t61.952 24.576q13.312 2.048 28.16-1.024t24.064-7.68 23.552-13.312 18.432-10.752 15.872-6.144 18.944-8.192 11.264-11.264q3.072-4.096 4.096-14.336-10.24-13.312-31.744-24.576t-52.224-22.528-40.96-16.384q-44.032-20.48-131.584-62.976t-131.584-62.976q-7.168-3.072-21.504-11.776t-24.064-13.312-26.112-11.264-28.16-7.168-30.208 1.536l-270.336 125.952q-6.144 3.072-32.768 14.336t-52.736 22.528-54.784 24.576-47.616 24.064-22.016 16.896q-4.096 4.096-4.096 13.312zM0 437.76q11.264 15.36 32.256 25.6t51.2 20.48 42.496 15.36q19.456 0 34.816-4.608t35.328-15.36 26.112-13.824q43.008-19.456 129.536-59.392t130.56-60.416q19.456-5.12 37.888-0.512t39.936 17.408 25.6 14.848q69.632 32.768 163.84 73.728 11.264 5.12 32.256 16.896t39.424 19.968 36.864 11.264q16.384 3.072 32.256-1.024t38.4-17.408 23.552-13.312q5.12-3.072 15.872-6.656t18.432-8.192 11.776-10.752q3.072-5.12 4.096-14.336-10.24-14.336-32.256-26.112t-53.76-23.040-41.984-16.384q-49.152-23.552-138.752-66.56t-125.44-60.416q-7.168-3.072-26.624-14.336t-29.696-15.36-33.28-10.24-36.352 0q-219.136 103.424-266.24 124.928-6.144 3.072-45.056 19.456t-71.168 30.72-62.976 30.208-34.816 23.040q-4.096 4.096-4.096 14.336zM0 711.168q10.24 15.36 32.256 27.136t53.76 23.040 41.984 16.384l356.352 165.888q30.72 0 54.784-7.168t57.856-26.624 40.96-22.528q39.936-18.432 119.808-55.808t119.808-55.808q4.096-2.048 37.376-15.36t55.808-24.576 27.648-20.48q3.072-4.096 4.096-13.312-9.216-13.312-26.624-23.040t-44.544-19.456-35.328-13.824q-48.128-22.528-143.36-68.096t-142.336-68.096q-6.144-3.072-20.48-11.264t-23.552-12.8-25.6-10.752-27.648-6.144-28.672 1.024q-250.88 116.736-262.144 121.856-4.096 2.048-64.512 28.16t-104.448 47.616-49.152 30.72q-4.096 4.096-4.096 13.312z" horiz-adv-x="1002" />
26
- <glyph unicode="&#xe00c;" d="M704 384l128 128v-512h-768v768h512l-128-128h-256v-512h512zM960 896v-352l-130.744 130.744-354.746-354.744h-90.51v90.512l354.744 354.744-130.744 130.744z" />
27
- <glyph unicode="&#xe00d;" d="M64 384h384v-384l-138.26 138.26-202-202-107.48 107.48 202 202zM821.74 245.74l202-202-107.48-107.48-202 202-138.26-138.26v384h384zM960 512h-384v384l138.26-138.26 202 202 107.48-107.48-202-202zM309.74 757.74l138.26 138.26v-384h-384l138.26 138.26-202 202 107.48 107.48z" />
28
- <glyph unicode="&#xe00e;" d="M1024 960v-384l-138.26 138.26-212-212-107.48 107.48 212 212-138.26 138.26zM245.74 821.74l212-212-107.48-107.48-212 212-138.26-138.26v384h384zM885.74 181.74l138.26 138.26v-384h-384l138.26 138.26-212 212 107.48 107.48zM457.74 286.26l-212-212 138.26-138.26h-384v384l138.26-138.26 212 212z" />
29
- <glyph unicode="&#xe00f;" d="M512 384l256 256h-192v256h-128v-256h-192zM744.726 488.728l-71.74-71.742 260.080-96.986-421.066-157.018-421.066 157.018 260.080 96.986-71.742 71.742-279.272-104.728v-256l512-192 512 192v256z" />
30
- <glyph unicode="&#xe010;" d="M960 832h-896c-35.2 0-64-28.8-64-64v-640c0-35.2 28.8-64 64-64h896c35.2 0 64 28.8 64 64v640c0 35.2-28.8 64-64 64zM896 704v-46l-384-226.286-384 226.286v46h768zM128 192v354.572l384-226.286 384 226.286v-354.572h-768z" />
31
- <glyph unicode="&#xe011;" d="M1024 448c-1.278 66.862-15.784 133.516-42.576 194.462-26.704 61-65.462 116.258-113.042 161.92-47.552 45.696-103.944 81.82-164.984 105.652-61.004 23.924-126.596 35.352-191.398 33.966-64.81-1.282-129.332-15.374-188.334-41.356-59.048-25.896-112.542-63.47-156.734-109.576-44.224-46.082-79.16-100.708-102.186-159.798-23.114-59.062-34.128-122.52-32.746-185.27 1.286-62.76 14.964-125.148 40.134-182.206 25.088-57.1 61.476-108.828 106.11-151.548 44.61-42.754 97.472-76.504 154.614-98.72 57.118-22.304 118.446-32.902 179.142-31.526 60.708 1.29 120.962 14.554 176.076 38.914 55.15 24.282 105.116 59.48 146.366 102.644 41.282 43.14 73.844 94.236 95.254 149.43 13.034 33.458 21.88 68.4 26.542 103.798 1.246-0.072 2.498-0.12 3.762-0.12 35.346 0 64 28.652 64 64 0 1.796-0.094 3.572-0.238 5.332h0.238zM922.306 278.052c-23.472-53.202-57.484-101.4-99.178-141.18-41.67-39.81-91-71.186-144.244-91.79-53.228-20.678-110.29-30.452-166.884-29.082-56.604 1.298-112.596 13.736-163.82 36.474-51.25 22.666-97.684 55.49-135.994 95.712-38.338 40.198-68.528 87.764-88.322 139.058-19.87 51.284-29.228 106.214-27.864 160.756 1.302 54.552 13.328 108.412 35.254 157.69 21.858 49.3 53.498 93.97 92.246 130.81 38.73 36.868 84.53 65.87 133.874 84.856 49.338 19.060 102.136 28.006 154.626 26.644 52.5-1.306 104.228-12.918 151.562-34.034 47.352-21.050 90.256-51.502 125.624-88.782 35.396-37.258 63.21-81.294 81.39-128.688 18.248-47.392 26.782-98.058 25.424-148.496h0.238c-0.144-1.76-0.238-3.536-0.238-5.332 0-33.012 24.992-60.174 57.086-63.624-6.224-34.822-16.53-68.818-30.78-100.992z" />
32
- <glyph unicode="&#xe012;" d="M192 448c0 12.18 0.704 24.196 2.030 36.022l-184.98 60.104c-5.916-31.14-9.050-63.264-9.050-96.126 0-147.23 62.166-279.922 161.654-373.324l114.284 157.296c-52.124 56.926-83.938 132.758-83.938 216.028zM832 448c0-83.268-31.812-159.102-83.938-216.028l114.284-157.296c99.488 93.402 161.654 226.094 161.654 373.324 0 32.862-3.132 64.986-9.048 96.126l-184.98-60.104c1.324-11.828 2.028-23.842 2.028-36.022zM576 761.592c91.934-18.662 169.544-76.742 214.45-155.826l184.978 60.102c-73.196 155.42-222.24 268.060-399.428 290.156v-194.432zM233.55 605.768c44.906 79.084 122.516 137.164 214.45 155.826v194.43c-177.188-22.096-326.23-134.736-399.426-290.154l184.976-60.102zM644.556 156.672c-40.39-18.408-85.272-28.672-132.556-28.672s-92.166 10.264-132.554 28.67l-114.292-157.31c73.206-40.366 157.336-63.36 246.846-63.36s173.64 22.994 246.848 63.36l-114.292 157.312z" />
33
- <glyph unicode="&#xe013;" d="M384 832c0 70.692 57.308 128 128 128s128-57.308 128-128c0-70.692-57.308-128-128-128-70.692 0-128 57.308-128 128zM655.53 719.53c0 70.692 57.308 128 128 128s128-57.308 128-128c0-70.692-57.308-128-128-128-70.692 0-128 57.308-128 128zM832 448c0 35.346 28.654 64 64 64s64-28.654 64-64c0-35.346-28.654-64-64-64-35.346 0-64 28.654-64 64zM719.53 176.47c0 35.346 28.654 64 64 64s64-28.654 64-64c0-35.346-28.654-64-64-64-35.346 0-64 28.654-64 64zM448.002 64c0 0 0 0 0 0 0 35.346 28.654 64 64 64 35.346 0 64-28.654 64-64 0 0 0 0 0 0 0-35.346-28.654-64-64-64-35.346 0-64 28.654-64 64zM176.472 176.47c0 0 0 0 0 0 0 35.346 28.654 64 64 64 35.346 0 64-28.654 64-64 0 0 0 0 0 0 0-35.346-28.654-64-64-64-35.346 0-64 28.654-64 64zM144.472 719.53c0 0 0 0 0 0 0 53.019 42.981 96 96 96 53.019 0 96-42.981 96-96 0 0 0 0 0 0 0-53.019-42.981-96-96-96-53.019 0-96 42.981-96 96zM56 448c0 39.765 32.235 72 72 72s72-32.235 72-72c0-39.765-32.235-72-72-72-39.765 0-72 32.235-72 72z" />
34
- <glyph unicode="&#xe014;" d="M512 960c-278.748 0-505.458-222.762-511.848-499.974 5.92 241.864 189.832 435.974 415.848 435.974 229.75 0 416-200.576 416-448 0-53.020 42.98-96 96-96 53.020 0 96 42.98 96 96 0 282.77-229.23 512-512 512zM512-64c278.748 0 505.458 222.762 511.848 499.974-5.92-241.864-189.832-435.974-415.848-435.974-229.75 0-416 200.576-416 448 0 53.020-42.98 96-96 96-53.020 0-96-42.98-96-96 0-282.77 229.23-512 512-512z" />
35
- <glyph unicode="&#xe015;" d="M0.042 446.382l-0.022-0.004c0 0 0.012-0.090 0.028-0.222 0.11-3.878 0.55-7.676 1.322-11.352 0.204-1.746 0.428-3.66 0.674-5.774 0.222-1.886 0.46-3.914 0.718-6.078 0.374-2.566 0.77-5.292 1.19-8.176 0.856-5.746 1.8-12.124 2.908-18.958 1.348-6.446 2.804-13.414 4.364-20.864 0.71-3.718 1.776-7.504 2.786-11.406 1.024-3.89 2.078-7.894 3.16-12.004 0.566-2.042 1.040-4.132 1.708-6.208 0.656-2.074 1.32-4.176 1.988-6.3 1.348-4.234 2.726-8.566 4.136-12.988 0.352-1.106 0.708-2.21 1.064-3.324 0.408-1.102 0.814-2.208 1.226-3.316 0.826-2.218 1.658-4.458 2.502-6.714 1.696-4.496 3.422-9.078 5.18-13.742 1.968-4.566 3.97-9.214 6.004-13.934 1.018-2.348 2.044-4.714 3.078-7.098 1.048-2.376 2.27-4.704 3.408-7.074 2.322-4.714 4.678-9.496 7.062-14.332 2.47-4.786 5.208-9.512 7.846-14.328 1.336-2.398 2.68-4.808 4.028-7.23 1.368-2.41 2.902-4.75 4.356-7.14 2.95-4.738 5.93-9.524 8.934-14.348 12.64-18.894 26.676-37.566 42.21-55.278 15.712-17.578 32.726-34.25 50.692-49.602 18.18-15.136 37.264-28.902 56.726-41.114 19.604-12.036 39.644-22.312 59.376-31.144 5.004-2.040 9.964-4.062 14.878-6.066 2.462-0.972 4.868-2.032 7.336-2.918 2.47-0.868 4.93-1.734 7.376-2.594 4.898-1.684 9.678-3.468 14.484-4.992 4.832-1.43 9.604-2.844 14.312-4.242 2.356-0.672 4.66-1.426 7.004-2.012 2.346-0.574 4.676-1.14 6.986-1.704 4.606-1.118 9.142-2.214 13.604-3.296 4.5-0.868 8.926-1.722 13.27-2.558 2.166-0.41 4.31-0.82 6.434-1.222 1.062-0.2 2.118-0.398 3.166-0.598 1.060-0.148 2.118-0.292 3.166-0.442 4.192-0.582 8.292-1.152 12.3-1.71 1.998-0.274 3.972-0.546 5.922-0.816 1.946-0.286 3.904-0.378 5.814-0.57 3.822-0.336 7.544-0.664 11.164-0.98 3.616-0.304 7.104-0.688 10.526-0.738 0.23-0.008 0.452-0.016 0.682-0.026 0.614-34.812 29.008-62.846 63.968-62.846 0.542 0 1.080 0.028 1.62 0.042v-0.022c0 0 0.090 0.012 0.224 0.028 3.878 0.11 7.674 0.55 11.35 1.322 1.748 0.204 3.662 0.426 5.776 0.672 1.884 0.222 3.912 0.462 6.076 0.718 2.566 0.376 5.292 0.772 8.176 1.192 5.746 0.856 12.124 1.8 18.958 2.908 6.446 1.348 13.414 2.804 20.864 4.362 3.718 0.712 7.504 1.778 11.406 2.786 3.892 1.026 7.894 2.080 12.004 3.162 2.044 0.566 4.132 1.040 6.208 1.708 2.074 0.656 4.174 1.318 6.3 1.988 4.232 1.348 8.564 2.726 12.988 4.134 1.104 0.354 2.21 0.708 3.324 1.066 1.1 0.406 2.206 0.814 3.316 1.226 2.216 0.824 4.456 1.658 6.714 2.5 4.496 1.698 9.078 3.424 13.74 5.182 4.568 1.968 9.216 3.97 13.936 6.004 2.348 1.018 4.714 2.044 7.098 3.078 2.376 1.048 4.702 2.27 7.074 3.408 4.714 2.322 9.494 4.678 14.33 7.062 4.786 2.47 9.512 5.208 14.328 7.846 2.398 1.336 4.808 2.678 7.23 4.028 2.41 1.366 4.75 2.9 7.14 4.354 4.738 2.952 9.524 5.93 14.35 8.936 18.89 12.64 37.564 26.674 55.278 42.21 17.574 15.712 34.248 32.726 49.602 50.69 15.136 18.182 28.902 37.264 41.112 56.728 12.036 19.602 22.314 39.644 31.142 59.376 2.042 5.002 4.062 9.964 6.068 14.878 0.974 2.462 2.032 4.868 2.918 7.334 0.87 2.472 1.732 4.932 2.592 7.376 1.686 4.898 3.468 9.678 4.994 14.484 1.432 4.832 2.846 9.604 4.24 14.31 0.674 2.358 1.43 4.66 2.016 7.004 0.57 2.348 1.138 4.676 1.702 6.988 1.118 4.606 2.216 9.14 3.296 13.602 0.868 4.502 1.72 8.928 2.558 13.272 0.41 2.164 0.818 4.308 1.222 6.434 0.2 1.060 0.398 2.116 0.596 3.164 0.148 1.062 0.296 2.118 0.444 3.168 0.582 4.19 1.152 8.292 1.708 12.3 0.278 1.996 0.55 3.97 0.82 5.922 0.284 1.946 0.376 3.902 0.568 5.812 0.336 3.822 0.664 7.546 0.98 11.164 0.304 3.616 0.686 7.106 0.738 10.528 0.020 0.534 0.040 1.044 0.058 1.574 35.224 0.146 63.732 28.738 63.732 63.992 0 0.542-0.028 1.080-0.042 1.62h0.022c0 0-0.012 0.090-0.028 0.224-0.11 3.878-0.55 7.674-1.322 11.35-0.204 1.748-0.428 3.662-0.674 5.776-0.222 1.886-0.46 3.914-0.718 6.076-0.374 2.566-0.77 5.294-1.19 8.176-0.856 5.746-1.8 12.124-2.908 18.958-1.348 6.444-2.804 13.414-4.364 20.862-0.71 3.72-1.776 7.506-2.786 11.408-1.024 3.892-2.078 7.894-3.16 12.002-0.566 2.044-1.040 4.134-1.708 6.208-0.656 2.076-1.32 4.174-1.988 6.3-1.348 4.234-2.726 8.566-4.136 12.99-0.352 1.102-0.708 2.21-1.064 3.324-0.408 1.1-0.814 2.206-1.226 3.316-0.826 2.216-1.658 4.454-2.502 6.714-1.696 4.498-3.422 9.080-5.18 13.74-1.968 4.57-3.97 9.216-6.004 13.936-1.020 2.348-2.044 4.714-3.078 7.098-1.048 2.376-2.27 4.702-3.408 7.076-2.322 4.714-4.678 9.494-7.062 14.33-2.47 4.786-5.208 9.512-7.846 14.328-1.336 2.398-2.68 4.808-4.028 7.23-1.368 2.41-2.902 4.75-4.356 7.14-2.95 4.74-5.93 9.524-8.934 14.35-12.64 18.892-26.676 37.564-42.21 55.278-15.712 17.576-32.726 34.25-50.692 49.602-18.18 15.136-37.264 28.902-56.726 41.112-19.604 12.036-39.644 22.314-59.376 31.142-5.004 2.040-9.964 4.062-14.878 6.068-2.462 0.974-4.868 2.032-7.336 2.918-2.47 0.87-4.93 1.734-7.376 2.592-4.898 1.684-9.678 3.468-14.484 4.994-4.832 1.432-9.604 2.846-14.312 4.242-2.356 0.672-4.66 1.428-7.004 2.014-2.346 0.572-4.676 1.138-6.986 1.702-4.606 1.118-9.142 2.216-13.604 3.298-4.5 0.868-8.926 1.72-13.27 2.558-2.166 0.412-4.31 0.82-6.434 1.222-1.062 0.2-2.118 0.398-3.166 0.596-1.060 0.148-2.118 0.296-3.166 0.442-4.192 0.584-8.292 1.154-12.3 1.71-1.998 0.276-3.972 0.55-5.922 0.82-1.946 0.284-3.904 0.376-5.814 0.57-3.822 0.336-7.544 0.664-11.164 0.98-3.616 0.304-7.104 0.686-10.526 0.738-0.852 0.032-1.674 0.062-2.512 0.092-0.65 34.78-29.028 62.778-63.966 62.778-0.542 0-1.080-0.028-1.62-0.042l-0.002 0.022c0 0-0.090-0.012-0.222-0.028-3.878-0.11-7.676-0.55-11.352-1.322-1.748-0.204-3.662-0.426-5.776-0.672-1.884-0.222-3.912-0.462-6.076-0.718-2.566-0.376-5.292-0.772-8.176-1.192-5.746-0.856-12.124-1.8-18.958-2.908-6.446-1.348-13.414-2.804-20.864-4.362-3.718-0.712-7.504-1.778-11.406-2.786-3.892-1.026-7.894-2.080-12.004-3.162-2.044-0.566-4.132-1.040-6.208-1.708-2.074-0.656-4.174-1.318-6.3-1.988-4.232-1.348-8.564-2.726-12.988-4.134-1.104-0.354-2.21-0.708-3.324-1.066-1.1-0.406-2.206-0.814-3.316-1.226-2.216-0.824-4.456-1.658-6.714-2.5-4.496-1.698-9.078-3.424-13.74-5.182-4.568-1.968-9.216-3.97-13.936-6.004-2.348-1.018-4.714-2.044-7.098-3.078-2.376-1.048-4.702-2.27-7.074-3.408-4.714-2.322-9.494-4.678-14.33-7.062-4.786-2.47-9.512-5.208-14.328-7.846-2.398-1.336-4.808-2.678-7.23-4.028-2.41-1.366-4.75-2.9-7.14-4.354-4.738-2.952-9.524-5.93-14.35-8.936-18.89-12.64-37.564-26.674-55.278-42.21-17.574-15.712-34.248-32.726-49.602-50.69-15.136-18.182-28.902-37.264-41.112-56.728-12.036-19.602-22.314-39.644-31.142-59.376-2.042-5.002-4.062-9.964-6.068-14.878-0.974-2.462-2.032-4.868-2.918-7.334-0.87-2.472-1.732-4.932-2.592-7.376-1.686-4.898-3.468-9.678-4.994-14.484-1.432-4.832-2.846-9.604-4.24-14.31-0.674-2.358-1.43-4.66-2.016-7.004-0.57-2.348-1.138-4.676-1.702-6.988-1.118-4.606-2.216-9.14-3.296-13.602-0.868-4.502-1.72-8.928-2.558-13.272-0.41-2.164-0.818-4.308-1.222-6.434-0.2-1.060-0.398-2.116-0.596-3.164-0.148-1.062-0.296-2.118-0.444-3.168-0.582-4.19-1.152-8.292-1.708-12.3-0.278-1.996-0.55-3.97-0.82-5.922-0.284-1.946-0.376-3.902-0.568-5.812-0.336-3.822-0.664-7.546-0.98-11.164-0.304-3.616-0.686-7.106-0.738-10.528-0.020-0.548-0.040-1.076-0.058-1.62-34.376-1.112-61.902-29.304-61.902-63.946 0-0.542 0.028-1.078 0.042-1.618zM73.518 511.294c0.042 0.196 0.086 0.384 0.128 0.58 0.644 3.248 1.632 6.542 2.556 9.942 0.934 3.388 1.894 6.876 2.88 10.454 0.516 1.78 0.934 3.602 1.546 5.406 0.596 1.802 1.202 3.628 1.81 5.476 1.218 3.682 2.464 7.45 3.736 11.294 0.316 0.958 0.634 1.924 0.956 2.892 0.37 0.954 0.74 1.914 1.114 2.876 0.746 1.924 1.5 3.868 2.26 5.83 1.52 3.904 3.070 7.882 4.646 11.93 1.768 3.96 3.566 7.99 5.392 12.080 0.908 2.038 1.824 4.090 2.746 6.156 0.932 2.060 2.036 4.072 3.052 6.126 2.070 4.084 4.17 8.222 6.294 12.412 2.202 4.142 4.654 8.224 6.998 12.392 1.184 2.074 2.374 4.16 3.57 6.256 1.21 2.086 2.586 4.102 3.876 6.166 2.616 4.098 5.256 8.232 7.918 12.402 11.234 16.298 23.632 32.398 37.33 47.638 13.874 15.104 28.842 29.404 44.598 42.548 15.974 12.928 32.686 24.65 49.676 35.022 17.13 10.194 34.6 18.838 51.734 26.258 4.35 1.7 8.662 3.382 12.934 5.050 2.136 0.812 4.216 1.71 6.36 2.444 2.146 0.714 4.28 1.428 6.404 2.136 4.25 1.386 8.382 2.888 12.548 4.142 4.184 1.174 8.314 2.332 12.392 3.474 2.038 0.55 4.026 1.19 6.054 1.662 2.030 0.458 4.044 0.914 6.044 1.368 3.978 0.91 7.896 1.806 11.748 2.688 3.888 0.686 7.71 1.36 11.462 2.022 1.868 0.33 3.716 0.658 5.546 0.98 0.914 0.162 1.824 0.324 2.728 0.484 0.916 0.112 1.828 0.222 2.734 0.332 3.612 0.448 7.148 0.882 10.604 1.31 1.72 0.216 3.422 0.432 5.102 0.644 1.674 0.226 3.364 0.266 5.010 0.408 3.292 0.238 6.498 0.472 9.616 0.7 3.11 0.218 6.11 0.524 9.058 0.508 5.848 0.132 11.32 0.256 16.38 0.372 4.664-0.168 8.948-0.324 12.818-0.462 1.914-0.054 3.726-0.108 5.432-0.156 2.122-0.134 4.108-0.26 5.958-0.378 2.13-0.138 4.060-0.266 5.82-0.38 3.256-0.51 6.592-0.782 9.99-0.782 0.466 0 0.93 0.026 1.396 0.036 0.132-0.008 0.224-0.014 0.224-0.014v0.020c31.14 0.778 56.75 23.784 61.556 53.754 0.542-0.12 1.064-0.236 1.612-0.356 3.246-0.644 6.542-1.632 9.942-2.556 3.386-0.934 6.876-1.894 10.454-2.88 1.778-0.516 3.602-0.934 5.404-1.546 1.802-0.596 3.63-1.202 5.478-1.812 3.68-1.218 7.448-2.464 11.292-3.736 0.96-0.316 1.924-0.634 2.892-0.956 0.956-0.37 1.914-0.74 2.876-1.112 1.926-0.746 3.868-1.5 5.83-2.26 3.904-1.52 7.884-3.070 11.932-4.646 3.96-1.768 7.988-3.566 12.080-5.392 2.038-0.908 4.088-1.824 6.156-2.746 2.060-0.932 4.072-2.036 6.126-3.054 4.082-2.070 8.222-4.17 12.41-6.294 4.144-2.202 8.226-4.654 12.394-6.998 2.074-1.184 4.16-2.374 6.256-3.572 2.086-1.21 4.102-2.586 6.166-3.876 4.098-2.616 8.23-5.256 12.402-7.918 16.296-11.234 32.398-23.632 47.636-37.33 15.104-13.874 29.406-28.842 42.55-44.598 12.928-15.974 24.648-32.686 35.020-49.676 10.196-17.13 18.84-34.6 26.26-51.736 1.698-4.348 3.382-8.662 5.050-12.932 0.812-2.136 1.71-4.216 2.444-6.36 0.714-2.146 1.428-4.28 2.136-6.404 1.386-4.25 2.888-8.384 4.142-12.548 1.174-4.184 2.33-8.316 3.474-12.392 0.55-2.038 1.19-4.026 1.66-6.054 0.46-2.030 0.916-4.046 1.368-6.046 0.91-3.978 1.808-7.896 2.688-11.748 0.688-3.888 1.362-7.71 2.024-11.462 0.33-1.868 0.656-3.716 0.98-5.548 0.162-0.914 0.324-1.824 0.484-2.728 0.11-0.916 0.222-1.828 0.332-2.734 0.446-3.612 0.882-7.148 1.31-10.604 0.216-1.72 0.432-3.42 0.642-5.1 0.226-1.674 0.268-3.364 0.41-5.010 0.238-3.292 0.472-6.498 0.7-9.616 0.218-3.11 0.524-6.11 0.508-9.058 0.132-5.848 0.256-11.32 0.372-16.38-0.168-4.664-0.324-8.948-0.462-12.818-0.054-1.914-0.108-3.726-0.156-5.432-0.134-2.122-0.26-4.108-0.378-5.958-0.138-2.13-0.266-4.060-0.38-5.82-0.498-3.256-0.768-6.592-0.768-9.99 0-0.468 0.026-0.93 0.036-1.396-0.008-0.132-0.016-0.224-0.016-0.224h0.022c0.768-30.766 23.236-56.128 52.682-61.37-0.066-0.296-0.13-0.584-0.198-0.884-0.644-3.248-1.632-6.542-2.556-9.942-0.934-3.388-1.894-6.876-2.88-10.454-0.516-1.78-0.934-3.602-1.546-5.406-0.596-1.802-1.202-3.628-1.81-5.476-1.218-3.682-2.464-7.45-3.736-11.294-0.316-0.958-0.634-1.924-0.956-2.892-0.37-0.954-0.74-1.914-1.114-2.876-0.746-1.924-1.5-3.868-2.26-5.83-1.52-3.904-3.070-7.882-4.646-11.93-1.768-3.96-3.566-7.99-5.392-12.080-0.908-2.038-1.824-4.090-2.746-6.156-0.932-2.060-2.036-4.072-3.052-6.126-2.070-4.084-4.17-8.222-6.294-12.412-2.202-4.142-4.654-8.224-6.998-12.392-1.184-2.074-2.374-4.16-3.57-6.256-1.21-2.086-2.586-4.102-3.876-6.166-2.616-4.098-5.256-8.232-7.918-12.402-11.234-16.298-23.632-32.398-37.33-47.638-13.874-15.104-28.842-29.404-44.598-42.548-15.974-12.928-32.686-24.65-49.676-35.022-17.13-10.194-34.6-18.838-51.734-26.258-4.35-1.7-8.662-3.382-12.934-5.050-2.136-0.812-4.216-1.71-6.36-2.444-2.146-0.714-4.28-1.428-6.404-2.136-4.25-1.386-8.382-2.888-12.548-4.142-4.184-1.174-8.314-2.332-12.392-3.474-2.038-0.55-4.026-1.19-6.054-1.662-2.030-0.458-4.044-0.914-6.044-1.368-3.978-0.91-7.896-1.806-11.748-2.688-3.888-0.686-7.71-1.36-11.462-2.022-1.868-0.33-3.716-0.658-5.546-0.98-0.914-0.162-1.824-0.324-2.728-0.484-0.916-0.112-1.828-0.222-2.734-0.332-3.612-0.448-7.148-0.882-10.604-1.31-1.72-0.216-3.422-0.432-5.102-0.644-1.674-0.226-3.364-0.266-5.010-0.408-3.292-0.238-6.498-0.472-9.616-0.7-3.11-0.218-6.11-0.524-9.058-0.508-5.848-0.132-11.32-0.256-16.38-0.372-4.664 0.168-8.948 0.324-12.818 0.462-1.914 0.054-3.726 0.108-5.432 0.156-2.122 0.134-4.108 0.26-5.958 0.378-2.13 0.138-4.060 0.266-5.82 0.38-3.256 0.51-6.592 0.782-9.99 0.782-0.466 0-0.93-0.026-1.396-0.036-0.132 0.008-0.224 0.014-0.224 0.014v-0.020c-31.004-0.774-56.524-23.586-61.488-53.364-3.2 0.64-6.446 1.61-9.792 2.522-3.386 0.934-6.876 1.894-10.454 2.878-1.778 0.516-3.602 0.938-5.404 1.546-1.802 0.598-3.63 1.204-5.478 1.812-3.68 1.218-7.448 2.464-11.292 3.738-0.96 0.316-1.924 0.632-2.892 0.954-0.956 0.372-1.914 0.742-2.876 1.114-1.926 0.746-3.868 1.5-5.83 2.258-3.904 1.524-7.884 3.070-11.932 4.648-3.96 1.77-7.988 3.566-12.080 5.39-2.038 0.91-4.088 1.824-6.156 2.746-2.060 0.934-4.072 2.036-6.126 3.054-4.082 2.070-8.222 4.172-12.41 6.296-4.144 2.2-8.226 4.652-12.394 6.996-2.074 1.184-4.16 2.376-6.256 3.57-2.086 1.21-4.102 2.586-6.166 3.878-4.098 2.614-8.23 5.254-12.402 7.918-16.296 11.23-32.398 23.632-47.636 37.328-15.104 13.876-29.406 28.84-42.55 44.598-12.928 15.972-24.648 32.684-35.020 49.676-10.196 17.128-18.84 34.602-26.26 51.734-1.698 4.352-3.382 8.664-5.050 12.934-0.812 2.136-1.71 4.218-2.444 6.36-0.714 2.148-1.428 4.282-2.136 6.406-1.386 4.25-2.888 8.382-4.142 12.546-1.174 4.184-2.33 8.316-3.474 12.394-0.55 2.036-1.19 4.024-1.66 6.054-0.46 2.028-0.916 4.042-1.368 6.042-0.91 3.98-1.808 7.898-2.688 11.75-0.688 3.886-1.362 7.71-2.024 11.46-0.33 1.868-0.656 3.718-0.98 5.546-0.162 0.914-0.324 1.824-0.484 2.73-0.11 0.914-0.222 1.828-0.332 2.734-0.446 3.61-0.882 7.148-1.31 10.602-0.216 1.722-0.432 3.422-0.642 5.102-0.226 1.676-0.268 3.364-0.41 5.012-0.238 3.29-0.472 6.496-0.7 9.614-0.218 3.11-0.524 6.11-0.508 9.058-0.132 5.848-0.256 11.32-0.372 16.382 0.168 4.664 0.324 8.946 0.462 12.816 0.054 1.914 0.108 3.726 0.156 5.434 0.134 2.122 0.26 4.106 0.378 5.958 0.138 2.128 0.266 4.058 0.38 5.82 0.496 3.26 0.766 6.596 0.766 9.994 0 0.466-0.026 0.93-0.036 1.396 0.008 0.132 0.016 0.224 0.016 0.224h-0.022c-0.78 31.38-24.134 57.154-54.44 61.674z" />
36
- <glyph unicode="&#xe016;" d="M1024 544l-225.738 22.574 143.66 175.582-135.766 135.764-175.582-143.658-22.574 225.738h-192l-22.574-225.738-175.582 143.658-135.764-135.764 143.658-175.582-225.738-22.574v-192l225.738-22.574-143.658-175.582 135.764-135.766 175.582 143.66 22.574-225.738h192l22.574 225.738 175.582-143.66 135.766 135.766-143.66 175.582 225.738 22.574v192zM704 527.528v-159.056l-112.472-112.472h-159.056l-112.472 112.472v159.056l112.47 112.472h159.056l112.474-112.472z" />
37
- <glyph unicode="&#xe017;" d="M874.022 810.020c-92.652 92.656-220.636 149.98-362.022 149.98-219.488 0-406.69-138.128-479.498-332.188l119.876-44.954c54.604 145.546 195.006 249.142 359.622 249.142 106.040 0 202.020-43 271.506-112.494l-143.506-143.506h384v384l-149.978-149.98zM512 64c-106.040 0-202.026 42.992-271.512 112.488l143.512 143.512h-384v-384l149.994 149.994c92.646-92.662 220.618-149.994 362.006-149.994 219.49 0 406.692 138.128 479.5 332.188l-119.876 44.954c-54.604-145.546-195.006-249.142-359.624-249.142z" />
38
- <glyph unicode="&#xe018;" d="M512 752c-100.252 0-189.54-46.802-246.326-119.256l-76.776 57.582c74.32 95.764 191.494 157.674 323.102 157.674v112l160-160-160-160v112zM512 144c100.254 0 189.542 46.802 246.326 119.256l76.776-57.582c-74.32-95.764-191.494-157.674-323.102-157.674v-112l-160 160 160 160v-112zM201.6 448c0-100.364 49.928-189.508 126.724-244.902l-57.584-76.78c-100.108 72.928-165.14 189.966-165.14 321.682h-105.6l160 160 160-160h-118.4zM918.4 448h105.6l-160-160-160 160h118.4c0 100.364-49.928 189.508-126.724 244.902l57.584 76.778c100.108-72.926 165.14-189.962 165.14-321.68z" />
39
- <glyph unicode="&#xe019;" d="M831.924 753.296v0 0zM834.050 448c104.384 99.81 155.082 197.58 121.354 256-19.26 33.356-63.36 49.296-123.48 49.296v-48c42.144 0 72.766-9.458 81.912-25.296 7.218-12.504 3.2-31.73-1.446-45.658-8.906-26.71-28.288-58.664-56.042-92.404-16.848-20.478-36.27-41.122-57.874-61.642-29.764 25.698-62.876 51.258-98.796 76.058-3.514 43.48-9.090 84.916-16.458 123.518 56.19 16.666 107.186 25.418 148.682 25.422l0.022 48c-0.008 0-0.018 0-0.026 0-45.174-0.004-99.396-9.032-158.874-26.404-34.24 140.318-93.566 233.11-161.024 233.11-67.458 0-126.784-92.792-161.028-233.102-59.474 17.372-113.698 26.398-158.872 26.398-60.12 0-104.248-15.942-123.506-49.296-33.73-58.42 16.966-156.19 121.352-256-104.386-99.808-155.082-197.58-121.352-256 19.26-33.36 63.37-49.294 123.506-49.294 45.172 0 99.396 9.030 158.872 26.4 34.244-140.314 93.568-233.106 161.028-233.106 67.458 0 126.784 92.792 161.028 233.102 59.474-17.374 113.7-26.398 158.874-26.398 60.12 0 104.248 15.944 123.506 49.296 33.724 58.418-16.97 156.192-121.358 256zM762.542 448c-18.62-15.876-38.454-31.584-59.358-46.988 0.53 15.476 0.816 31.142 0.816 46.988 0 15.844-0.286 31.51-0.812 46.988 20.904-15.404 40.738-31.112 59.354-46.988zM637.292 231.132c-23.054 8.196-46.562 17.52-70.27 27.868 13.626 7.262 27.294 14.824 40.974 22.722 13.722 7.922 27.146 16 40.288 24.198-2.882-25.766-6.562-50.76-10.992-74.788zM584 323.292c-23.782-13.728-47.876-26.63-72-38.616-24.124 11.982-48.22 24.884-72 38.616-23.976 13.844-47.192 28.226-69.498 43.012-1.65 26.712-2.502 54.010-2.502 81.696s0.852 54.984 2.502 81.694c22.306 14.786 45.522 29.17 69.498 43.014 23.78 13.728 47.876 26.63 72 38.614 24.124-11.982 48.218-24.884 72-38.614 23.976-13.842 47.192-28.23 69.498-43.014 1.65-26.71 2.502-54.008 2.502-81.694s-0.852-54.984-2.502-81.696c-22.306-14.784-45.522-29.172-69.498-43.012zM375.712 305.92c13.14-8.198 26.564-16.276 40.288-24.198 13.68-7.898 27.346-15.46 40.974-22.722-23.704-10.348-47.214-19.67-70.266-27.864-4.43 24.026-8.112 49.020-10.996 74.784zM320.812 401.010c-20.904 15.406-40.74 31.116-59.358 46.99 18.618 15.876 38.454 31.584 59.358 46.99-0.528-15.48-0.812-31.144-0.812-46.99s0.284-31.512 0.812-46.99zM386.708 664.864c23.052-8.194 46.562-17.518 70.266-27.864-13.626-7.262-27.294-14.824-40.974-22.722-13.722-7.922-27.146-16.002-40.288-24.198 2.884 25.764 6.566 50.758 10.996 74.784zM608 614.278c-13.68 7.898-27.346 15.46-40.972 22.722 23.706 10.346 47.212 19.668 70.268 27.862 4.43-24.024 8.11-49.016 10.992-74.782-13.142 8.196-26.566 16.274-40.288 24.198zM421.18 793.184c15.34 40.908 33.322 73.668 52.002 94.736 9.738 10.986 24.378 24.080 38.818 24.080 14.442 0 29.078-13.094 38.818-24.080 18.68-21.068 36.658-53.828 52.002-94.736 9.312-24.834 17.478-51.978 24.45-80.952-37.136-12.926-75.832-28.824-115.268-47.532-39.438 18.71-78.132 34.608-115.27 47.536 6.97 28.972 15.136 56.116 24.448 80.948zM167.65 541.938c-27.756 33.74-47.136 65.692-56.042 92.404-4.644 13.926-8.664 33.154-1.444 45.658 9.144 15.838 39.776 25.294 81.938 25.296h0.004c41.492 0 92.486-8.752 148.674-25.418-7.368-38.604-12.942-80.040-16.456-123.522-35.92-24.798-69.036-50.36-98.8-76.058-21.604 20.52-41.026 41.162-57.874 61.64zM192.1 190.708c-42.162 0-72.792 9.456-81.936 25.292-7.22 12.504-3.2 31.73 1.444 45.658 8.906 26.708 28.286 58.662 56.042 92.4 16.848 20.48 36.27 41.124 57.874 61.644 29.762-25.702 62.878-51.262 98.798-76.058 3.514-43.482 9.088-84.916 16.456-123.524-56.19-16.662-107.184-25.412-148.678-25.412zM602.82 102.816c-15.342-40.91-33.322-73.668-52.002-94.738-9.74-10.984-24.376-24.078-38.818-24.078-14.44 0-29.080 13.094-38.818 24.078-18.68 21.070-36.662 53.828-52.002 94.736-9.312 24.834-17.478 51.978-24.45 80.952 37.138 12.93 75.832 28.824 115.268 47.536 39.44-18.71 78.13-34.61 115.27-47.538-6.972-28.972-15.136-56.116-24.448-80.948zM912.39 261.656c4.642-13.926 8.664-33.152 1.446-45.656-9.146-15.84-39.778-25.296-81.938-25.296-41.496 0-92.49 8.754-148.678 25.418 7.368 38.606 12.944 80.042 16.458 123.524 35.92 24.8 69.036 50.362 98.796 76.058 21.604-20.522 41.026-41.164 57.874-61.64 27.758-33.744 47.136-65.696 56.042-92.408zM432 448c0 44.183 35.817 80 80 80s80-35.817 80-80c0-44.183-35.817-80-80-80-44.183 0-80 35.817-80 80z" />
40
- <glyph unicode="&#xe01a;" d="M466.038 402.038l-320 320-146.038-146.038v384h384l-146.038-146.038 320-320zM512 960c282.77 0 512-229.23 512-512s-229.23-512-512-512c-282.77 0-512 229.23-512 512h128c0-212.078 171.922-384 384-384s384 171.922 384 384c0 212.078-171.922 384-384 384v128z" />
41
- <glyph unicode="&#xe01b;" d="M640-64l192 192-320 320 320 320-192 192-512-512z" />
42
- <glyph unicode="&#xe01c;" d="M384 960l-192-192 320-320-320-320 192-192 512 512z" />
43
- <glyph unicode="&#xe01d;" d="M0 448l1024-448-192 448 192 448z" />
44
- <glyph unicode="&#xe01e;" d="M1024 448l-1024 448 192-448-192-448z" />
45
- <glyph unicode="&#xe01f;" d="M768 960l-512-512 512-512-255.998 512z" />
46
- <glyph unicode="&#xe020;" d="M256-64l512 512-512 512 256-512z" />
47
- <glyph unicode="&#xe021;" d="M640.002 704l-256-256 256-256.002z" />
48
- <glyph unicode="&#xe022;" d="M384.002 192l256 256-256 256z" />
49
- <glyph unicode="&#xe023;" d="M0 448.002l512-512.002v320h511.998l0.002 384h-512v320l-512-511.998zM152 509.492l16 16v-154.98l-16 16v122.98zM136 402.512l-16 16v58.98l16 16v-90.98zM184 541.492l16 16v-218.982l-16 16v186.982zM216 573.492l16 16v-282.982l-16 16v250.982zM248 605.492l16 16v-346.982l-16 16v314.982zM280 637.492l16 15.998v-410.98l-16 16v378.982zM312 669.49l16 16v-474.98l-16 16v442.98zM344 701.49l16 16v-538.98l-16 16v506.98zM376 733.49l16 16v-602.98l-16 16v570.98zM408 765.49l16 16v-666.98l-16 16v634.98zM104 461.492v-26.98l-13.49 13.49 13.49 13.49zM472 320v256h16v-256h-16zM504 320v256h16v-256h-16zM536 320v256h16v-256h-16zM568 320v256h16v-256h-16zM600 320v256h16v-256h-16zM632 320v256h16v-256h-16zM664 320v256h16v-256h-16zM696 320v256h16v-256h-16zM728 320v256h16v-256h-16zM760 320v256h16v-256h-16zM792 320v256h16v-256h-16zM824 320v256h16v-256h-16zM856 320v256h16v-256h-16zM888 320v256h16v-256h-16zM920 320v256h16v-256h-16zM959.998 320h-7.998v256h8l-0.002-256zM448 576h8v-256h-8v-229.49l-8 8v698.98l8 8v-229.49z" />
50
- <glyph unicode="&#xe024;" d="M1024 447.998l-512 512.002v-320h-511.998l-0.002-384h512v-320l512 511.998zM872 386.508l-16-16v154.98l16-16v-122.98zM888 493.488l16-16v-58.98l-16-16v90.98zM840 354.508l-16-16v218.982l16-16v-186.982zM808 322.508l-16-16v282.982l16-16v-250.982zM776 290.508l-16-16v346.982l16-16v-314.982zM744 258.508l-16-15.998v410.98l16-16v-378.982zM712 226.51l-16-16v474.98l16-16v-442.98zM680 194.51l-16-16v538.98l16-16v-506.98zM648 162.51l-16-16v602.98l16-16v-570.98zM616 130.51l-16-16v666.98l16-16v-634.98zM920 434.508v26.98l13.49-13.49-13.49-13.49zM552 576v-256h-16v256h16zM520 576v-256h-16v256h16zM488 576v-256h-16v256h16zM456 576v-256h-16v256h16zM424 576v-256h-16v256h16zM392 576v-256h-16v256h16zM360 576v-256h-16v256h16zM328 576v-256h-16v256h16zM296 576v-256h-16v256h16zM264 576v-256h-16v256h16zM232 576v-256h-16v256h16zM200 576v-256h-16v256h16zM168 576v-256h-16v256h16zM136 576v-256h-16v256h16zM104 576v-256h-16v256h16zM64.002 576h7.998v-256h-8l0.002 256zM576 320h-8v256h8v229.49l8-8v-698.98l-8-8v229.49z" />
51
- <glyph unicode="&#xe025;" d="M0 448l512-512v320h511.998l0.002 384h-512v320z" />
52
- <glyph unicode="&#xe026;" d="M1024 448l-512 512v-320h-511.998l-0.002-384h512v-320z" />
53
- <glyph unicode="&#xe027;" d="M448 704c0 35.346 28.654 64 64 64s64-28.654 64-64c0-35.346-28.654-64-64-64-35.346 0-64 28.654-64 64zM512 960c-282.77 0-512-229.23-512-512s229.23-512 512-512 512 229.23 512 512-229.23 512-512 512zM512 128c-35.348 0-64 28.652-64 64s28.652 64 64 64c35.346 0 64-28.652 64-64s-28.654-64-64-64zM512 448c-114.876 0-208-93.124-208-208s93.124-208 208-208c-229.75 0-416 186.25-416 416s186.25 416 416 416c114.876 0 208-93.124 208-208s-93.124-208-208-208z" />
54
- <glyph unicode="&#xe028;" d="M512 864c-111.118 0-215.584-43.272-294.156-121.844s-121.844-183.038-121.844-294.156c0-111.118 43.272-215.584 121.844-294.156 78.572-78.572 183.038-121.844 294.156-121.844 111.118 0 215.584 43.272 294.156 121.844 78.572 78.572 121.844 183.038 121.844 294.156 0 111.118-43.272 215.584-121.844 294.156-78.572 78.572-183.038 121.844-294.156 121.844zM512 960v0c282.77 0 512-229.23 512-512s-229.23-512-512-512c-282.77 0-512 229.23-512 512 0 282.77 229.23 512 512 512zM448 256h128v-128h-128zM448 768h128v-384h-128z" />
55
- <glyph unicode="&#xe3cb;" d="M512 960c-282.77 0-512-229.23-512-512s229.23-512 512-512 512 229.23 512 512-229.23 512-512 512zM512 32c-229.75 0-416 186.25-416 416s186.25 416 416 416 416-186.25 416-416-186.25-416-416-416zM813.256 493.254l-256.002 256c-24.992 24.994-65.514 24.994-90.508 0s-24.994-65.516 0-90.51l146.744-146.744h-357.49c-35.346 0-64-28.654-64-64s28.654-64 64-64h357.49l-146.746-146.744c-24.994-24.994-24.994-65.518 0-90.512 12.498-12.496 28.878-18.744 45.256-18.744s32.758 6.248 45.254 18.744l256.002 256c24.992 24.994 24.992 65.518 0 90.51z" />
56
- <glyph unicode="&#xe3cf;" d="M512 960c282.77 0 512-229.23 512-512s-229.23-512-512-512-512 229.23-512 512 229.23 512 512 512zM512 32c229.75 0 416 186.25 416 416s-186.25 416-416 416-416-186.25-416-416 186.25-416 416-416zM210.744 493.254l256.002 256c24.992 24.994 65.514 24.994 90.508 0s24.994-65.516 0-90.51l-146.744-146.744h357.49c35.346 0 64-28.654 64-64s-28.654-64-64-64h-357.49l146.746-146.744c24.994-24.994 24.994-65.518 0-90.512-12.498-12.496-28.878-18.744-45.256-18.744s-32.758 6.248-45.254 18.744l-256.002 256c-24.992 24.994-24.992 65.518 0 90.51z" />
57
- <glyph unicode="&#xe3d3;" d="M512 960c-282.77 0-512-229.23-512-512s229.23-512 512-512 512 229.23 512 512-229.23 512-512 512zM813.256 402.744l-256.002-256c-12.496-12.496-28.876-18.744-45.254-18.744s-32.758 6.248-45.254 18.744c-24.994 24.994-24.994 65.518 0 90.512l146.744 146.744h-357.49c-35.346 0-64 28.654-64 64s28.654 64 64 64h357.49l-146.746 146.746c-24.994 24.994-24.994 65.516 0 90.51s65.516 24.994 90.508 0l256.002-256c24.994-24.994 24.994-65.518 0.002-90.512z" />
58
- <glyph unicode="&#xe3d7;" d="M512 960c282.77 0 512-229.23 512-512s-229.23-512-512-512-512 229.23-512 512 229.23 512 512 512zM210.744 402.744l256.002-256c12.496-12.496 28.876-18.744 45.254-18.744s32.758 6.248 45.254 18.744c24.994 24.994 24.994 65.518 0 90.512l-146.744 146.744h357.49c35.346 0 64 28.654 64 64s-28.654 64-64 64h-357.49l146.746 146.746c24.994 24.994 24.994 65.516 0 90.51s-65.516 24.994-90.508 0l-256.002-256c-24.994-24.994-24.994-65.518-0.002-90.512z" />
59
- <glyph unicode="&#xe3e3;" d="M1023.998-64h-1023.998v1024h1024l-0.002-1024zM128 832v-768h767.998l0.002 768h-768zM576 224l224 224-224 224v-160h-320v-128h320v-160z" />
60
- <glyph unicode="&#xe3e7;" d="M0.002-64h1023.998v1024h-1024l0.002-1024zM896 832v-768h-767.998l-0.002 768h768zM448 224l-224 224 224 224v-160h320v-128h-320v-160z" />
61
- <glyph unicode="&#xe409;" d="M512 960c-282.77 0-512-229.23-512-512s229.23-512 512-512 512 229.23 512 512-229.23 512-512 512zM576 224v160h-320v128h320v160l224-224-224-224z" />
62
- <glyph unicode="&#xe40b;" d="M512 960c282.77 0 512-229.23 512-512s-229.23-512-512-512-512 229.23-512 512 229.23 512 512 512zM448 224v160h320v128h-320v160l-224-224 224-224z" />
63
- <glyph unicode="&#xe415;" d="M0 640h64v-384h-64zM128 640h64v-384h-64zM256 640h64v-384h-64zM1024 448l-448 448v-256h-192v-384h192v-256z" />
64
- <glyph unicode="&#xe417;" d="M960 640h64v-384h-64zM832 640h64v-384h-64zM704 640h64v-384h-64zM0 448l448 448v-256h192v-384h-192v-256z" />
65
- <glyph unicode="&#xe48c;" d="M864 256c-45.16 0-85.92-18.738-115.012-48.83l-431.004 215.502c1.314 8.252 2.016 16.706 2.016 25.328s-0.702 17.076-2.016 25.326l431.004 215.502c29.092-30.090 69.852-48.828 115.012-48.828 88.366 0 160 71.634 160 160s-71.634 160-160 160-160-71.634-160-160c0-8.622 0.704-17.076 2.016-25.326l-431.004-215.504c-29.092 30.090-69.852 48.83-115.012 48.83-88.366 0-160-71.636-160-160 0-88.368 71.634-160 160-160 45.16 0 85.92 18.738 115.012 48.828l431.004-215.502c-1.312-8.25-2.016-16.704-2.016-25.326 0-88.368 71.634-160 160-160s160 71.632 160 160c0 88.364-71.634 160-160 160z" />
66
  </font>
67
  </defs>
68
  </svg>
4
  <metadata>Generated by IcoMoon</metadata>
5
  <defs>
6
  <font id="foobox" horiz-adv-x="1024">
7
+ <font-face units-per-em="1024" ascent="960" descent="-64" />
8
+ <missing-glyph horiz-adv-x="1024" />
9
+ <glyph unicode="&#x20;" d="" horiz-adv-x="512" />
10
+ <glyph unicode="&#x2f;" d="M0 249.344v185.344h229.376v-183.296q0-28.672 20.48-49.664t50.176-20.992 50.688 20.48 20.992 50.176v433.152q0 119.808 88.576 204.288t210.432 84.48 210.432-84.992 88.576-205.824v-94.208l-137.216-40.96-91.136 43.008v81.92q0 29.696-20.48 50.176t-50.176 20.48-50.688-20.48-20.992-50.176v-427.008q0-122.88-88.064-209.408t-210.944-86.528q-123.904 0-211.968 87.552t-88.064 212.48zM741.376 246.272v187.392l91.136-43.008 137.216 40.96v-188.416q0-29.696 20.48-50.688t50.176-20.992 50.176 20.992 20.48 50.688v191.488h229.376v-185.344q0-123.904-87.552-211.968t-211.456-88.064-211.968 87.040-88.064 209.92z" horiz-adv-x="1340" />
11
+ <glyph unicode="&#x3b;" d="M-1.024 189.952v380.928q0 13.312 13.312 13.312h180.224v132.096q0 14.336 13.312 14.336h100.352v-526.336q0-14.336-12.288-14.336h-294.912zM110.592 274.944h68.608q13.312 0 13.312 14.336v210.944h-68.608q-13.312 0-13.312-14.336v-210.944zM340.992 189.952v380.928q0 13.312 13.312 13.312h100.352v-379.904q0-14.336-12.288-14.336h-101.376zM340.992 645.632v70.656q0 14.336 12.288 14.336h101.376v-70.656q0-14.336-12.288-14.336h-101.376zM493.568 189.952v380.928q0 13.312 13.312 13.312h294.912v-516.096q0-13.312-13.312-13.312h-294.912l1.024 70.656q0 14.336 12.288 14.336h180.224v50.176h-193.536zM606.208 274.944h68.608q12.288 0 12.288 14.336v210.944h-68.608q-12.288 0-12.288-14.336v-210.944zM840.704 125.44q0 14.336 13.312 14.336h180.224v50.176h-193.536v380.928q0 13.312 13.312 13.312h293.888v-516.096q0-13.312-12.288-13.312h-294.912v70.656zM952.32 274.944h68.608q13.312 0 13.312 14.336v210.944h-68.608q-13.312 0-13.312-14.336v-210.944z" horiz-adv-x="1148" />
12
+ <glyph unicode="&#x3e;" d="M0 467.456q0 63.488 50.688 108.544t115.2 45.056q63.488 0 107.52-36.864h5.12q137.216 83.968 343.040 83.968l5.12 4.096 71.68 273.408 247.808-36.864q0-1.024 2.048-1.024 1.024 0 0 1.024 2.048 1.024 11.776 15.872t14.848 18.944q34.816 32.768 83.968 32.768 50.176 0 84.48-33.28t34.304-83.456-34.304-86.016-84.48-35.84q-58.368 0-89.088 39.424t-30.72 98.816q-2.048-1.024-99.84 13.312t-112.128 17.408h-3.072q-2.048-2.048-16.896-54.784t-30.72-111.616-17.92-65.024v-3.072l5.12-4.096q73.728 0 151.040-20.992t133.632-58.88l3.072-2.048q1.024 1.024 2.048 1.024t2.048 1.024q25.6 18.432 36.352 25.6t30.208 13.312 44.032 6.144q69.632 0 118.784-49.152t49.152-119.808q0-48.128-27.136-88.064t-71.168-61.44q0-199.68-266.24-310.272-41.984-18.432-57.344-23.552-32.768-10.24-93.184-19.456t-95.232-9.216q-122.88 0-236.544 35.84-2.048 2.048-73.728 38.912-97.28 52.224-156.16 118.784t-58.88 159.744h-5.12q-33.792 17.408-60.416 51.2l-9.216 12.288q-15.36 27.648-19.456 46.592t-4.096 51.712zM34.816 455.168q0-67.584 58.368-114.688 5.12 60.416 49.152 118.784t103.424 103.424q-37.888 26.624-83.968 26.624-50.176 0-88.576-41.472t-38.4-92.672zM139.264 305.664q0-55.296 31.744-106.496t81.408-87.552 104.96-60.928 107.52-34.816q76.8-14.336 149.504-14.336 125.952 0 238.592 40.448t189.44 125.44h-3.072q30.72 38.912 44.032 70.144t13.312 74.24q0 55.296-27.136 105.472t-71.168 86.016-94.208 61.952-102.4 39.424q-87.040 23.552-185.344 23.552-75.776 0-155.136-18.432t-153.6-55.296-121.344-101.888-47.104-146.944zM329.728 380.416q0 37.888 23.040 60.928t60.928 23.040 63.488-23.040 25.6-60.928q0-36.864-26.112-61.44t-62.976-24.576-60.416 24.576-23.552 61.44zM366.592 212.48h45.056q25.6-46.080 81.408-70.144t114.176-24.064q59.392 0 112.64 24.064t86.016 70.144h41.984q-25.6-63.488-95.232-98.304t-145.408-34.816q-73.728 0-144.896 35.328t-95.744 97.792zM710.656 380.416q0 38.912 23.552 61.44t62.464 22.528q34.816 0 59.392-24.576t24.576-59.392-24.576-60.416-59.392-25.6q-37.888 0-61.952 24.064t-24.064 61.952zM971.776 859.648q0-35.84 25.6-61.44t61.44-25.6q36.864 0 60.416 25.088t23.552 61.952q0 34.816-24.576 59.392t-59.392 24.576-60.928-25.088-26.112-58.88zM986.112 571.904q56.32-36.864 97.28-94.72t57.344-122.368q60.416 44.032 60.416 98.304 0 59.392-36.352 102.4t-94.72 43.008q-46.080 0-83.968-26.624z" horiz-adv-x="1232" />
13
+ <glyph unicode="&#x74;" d="M0 556.544v145.408q61.44 20.48 103.424 56.32 41.984 33.792 68.608 88.064 26.624 52.224 35.84 130.048h146.432v-259.072h242.688v-160.768h-242.688v-262.144q0-88.064 9.216-114.688 9.216-24.576 34.816-39.936 34.816-20.48 77.824-20.48 78.848 0 154.624 50.176v-160.768q-64.512-31.744-118.784-44.032-53.248-12.288-114.688-12.288-69.632 0-124.928 17.408-56.32 19.456-91.136 51.2-36.864 31.744-53.248 69.632-14.336 34.816-14.336 107.52v358.4h-113.664z" horiz-adv-x="630" />
14
+ <glyph unicode="&#xe000;" d="M876.856 448v-73.142q0-30.286-18.572-51.714t-48.286-21.428h-402.286l167.428-168q21.714-20.572 21.714-51.428t-21.714-51.428l-42.858-43.428q-21.142-21.142-51.428-21.142-29.714 0-52 21.142l-372 372.572q-21.142 21.142-21.142 51.428 0 29.714 21.142 52l372 371.428q21.714 21.714 52 21.714 29.714 0 51.428-21.714l42.858-42.286q21.714-21.714 21.714-52t-21.714-52l-167.428-167.428h402.286q29.714 0 48.286-21.428t18.572-51.714z" horiz-adv-x="876" />
15
+ <glyph unicode="&#xe001;" d="M840.286 411.428q0-30.858-21.142-52l-372-372q-22.286-21.142-52-21.142-29.142 0-51.428 21.142l-42.858 42.858q-21.714 21.714-21.714 52t21.714 52l167.428 167.428h-402.286q-29.714 0-48.286 21.428t-18.572 51.714v73.142q0 30.286 18.572 51.714t48.286 21.428h402.286l-167.428 168q-21.714 20.572-21.714 51.428t21.714 51.428l42.858 42.858q21.714 21.714 51.428 21.714 30.286 0 52-21.714l372-372q21.142-20 21.142-51.428z" horiz-adv-x="876" />
16
+ <glyph unicode="&#xe002;" d="M741.428 204.572q0-22.858-16-38.858l-77.714-77.714q-16-16-38.858-16t-38.858 16l-168 168-168-168q-16-16-38.858-16t-38.858 16l-77.714 77.714q-16 16-16 38.858t16 38.858l168 168-168 168q-16 16-16 38.858t16 38.858l77.714 77.714q16 16 38.858 16t38.858-16l168-168 168 168q16 16 38.858 16t38.858-16l77.714-77.714q16-16 16-38.858t-16-38.858l-168-168 168-168q16-16 16-38.858z" horiz-adv-x="804" />
17
+ <glyph unicode="&#xe003;" d="M790.572 430.286l-758.858-421.714q-13.142-7.428-22.572-1.714t-9.428 20.572v841.142q0 14.858 9.428 20.572t22.572-1.714l758.858-421.714q13.142-7.428 13.142-17.714t-13.142-17.714z" horiz-adv-x="804" />
18
+ <glyph unicode="&#xe004;" d="M876.856 850.286v-804.572q0-14.858-10.858-25.714t-25.714-10.858h-292.572q-14.858 0-25.714 10.858t-10.858 25.714v804.572q0 14.858 10.858 25.714t25.714 10.858h292.572q14.858 0 25.714-10.858t10.858-25.714zM364.856 850.286v-804.572q0-14.858-10.858-25.714t-25.714-10.858h-292.572q-14.858 0-25.714 10.858t-10.858 25.714v804.572q0 14.858 10.858 25.714t25.714 10.858h292.572q14.858 0 25.714-10.858t10.858-25.714z" horiz-adv-x="876" />
19
+ <glyph unicode="&#xe005;" d="M283.428 192q0-34.286-24.286-58.286t-58-24q-34.286 0-58.286 24t-24 58.286 24 58.286 58.286 24q33.714 0 58-24t24.286-58.286zM530.286 82.286q0-30.286-21.428-51.714t-51.714-21.428-51.714 21.428-21.428 51.714 21.428 51.714 51.714 21.428 51.714-21.428 21.428-51.714zM182.858 448q0-37.714-26.858-64.572t-64.572-26.858-64.572 26.858-26.858 64.572 26.858 64.572 64.572 26.858 64.572-26.858 26.858-64.572zM777.142 192q0-26.286-18.858-45.142t-45.142-18.858-45.142 18.858-18.858 45.142 18.858 45.142 45.142 18.858 45.142-18.858 18.858-45.142zM301.714 704q0-41.714-29.428-71.142t-71.142-29.428-71.142 29.428-29.428 71.142 29.428 71.142 71.142 29.428 71.142-29.428 29.428-71.142zM566.858 813.714q0-45.714-32-77.714t-77.714-32-77.714 32-32 77.714 32 77.714 77.714 32 77.714-32 32-77.714zM877.714 448q0-22.858-16-38.858t-38.858-16-38.858 16-16 38.858 16 38.858 38.858 16 38.858-16 16-38.858zM758.858 704q0-18.858-13.428-32.286t-32.286-13.428-32.286 13.428-13.428 32.286 13.428 32.286 32.286 13.428 32.286-13.428 13.428-32.286z" horiz-adv-x="896" />
20
+ <glyph unicode="&#xe006;" d="M0 135.786q0 89.058 91.104 158.666t220.084 69.608h55.278q-42.994 40.946-42.994 88.034 0 29.686 16.378 59.372-10.236-1.024-29.686-1.024-106.46 0-174.020 66.538t-67.56 163.784q0 93.152 83.94 162.76t191.422 69.608h317.332l-70.632-51.182h-100.318q48.112-18.426 75.238-69.608t27.126-113.626q0-95.2-90.082-165.832-37.876-29.686-49.136-47.088t-11.26-42.994q0-19.45 27.638-49.136t55.278-50.158q62.442-44.016 86.498-90.082t24.056-115.672q0-92.128-83.94-160.202t-227.25-68.072q-136.146 0-230.32 51.182t-94.176 135.122zM114.648 169.568q0-70.632 59.884-120.278t148.94-49.646q121.814 0 176.58 45.040t54.766 119.766q0 19.45-4.094 32.756-3.070 11.26-7.166 20.984t-12.284 19.45-14.332 16.378-19.962 16.89-20.984 15.354-25.592 17.914-26.614 17.914q-39.922 12.284-78.82 12.284-92.128 1.024-161.224-48.112t-69.096-116.696zM182.21 741.786q11.26-80.868 61.93-139.216t112.090-59.372q60.396-2.048 96.222 53.23t25.592 136.146-60.908 137.168-112.090 58.348-97.246-52.206-25.592-134.098zM750.334 717.22v51.182h204.73v204.73h51.182v-204.73h205.754v-51.182h-205.754v-205.754h-51.182v205.754h-204.73z" horiz-adv-x="1212" />
21
+ <glyph unicode="&#xe007;" d="M0 589.312q0 64.512 27.136 128t77.824 117.76 133.12 88.064 182.784 33.792q162.816 0 267.264-100.352t104.448-236.544q0-175.104-88.576-289.28t-228.864-114.176q-46.080 0-86.528 21.504t-56.832 52.224l-40.96-161.792q-5.12-19.456-13.312-39.424t-17.92-38.4-19.456-34.816-19.456-30.72-16.896-24.064-13.312-16.896l-6.144-8.192q-3.072-4.096-8.192-3.072t-6.144 6.144q0 1.024-1.536 14.336t-3.072 28.16-3.072 38.4-1.024 45.568 3.072 48.64 7.68 49.152q11.264 48.128 75.776 320.512-8.192 16.384-13.312 39.424t-5.12 37.376l-1.024 15.36q0 65.536 33.28 109.056t80.384 43.52q37.888 0 58.88-25.088t20.992-62.976q0-23.552-8.704-57.856t-23.040-78.848-20.48-72.192q-10.24-46.080 17.92-79.872t75.264-33.792q80.896 0 133.632 91.648t52.736 221.696q0 99.328-64.512 162.304t-180.224 62.976q-129.024 0-209.408-82.944t-80.384-198.656q0-68.608 38.912-115.712 13.312-15.36 8.192-32.768-2.048-5.12-6.144-23.552t-6.144-23.552q-2.048-11.264-10.24-14.848t-18.432 0.512q-60.416 24.576-90.624 84.48t-30.208 139.776z" horiz-adv-x="793" />
22
+ <glyph unicode="&#xe008;" d="M-5.116 852.114q0 51.154 35.808 84.404t93.1 33.25q56.27 0 91.054-32.738 35.808-33.762 35.808-87.984 0-49.108-34.784-81.846-35.808-33.762-94.124-33.762h-1.024q-56.27 0-91.054 33.762t-34.784 84.916zM8.184-43.078v683.416h227.124v-683.416h-227.124zM361.146-43.078h227.124v381.608q0 35.808 8.184 55.246 14.324 34.784 43.48 58.826t73.15 24.042q114.584 0 114.584-154.484v-365.238h227.124v391.838q0 151.416-71.616 229.68t-189.27 78.266q-131.976 0-205.638-113.562v-2.046h-1.024l1.024 2.046v97.192h-227.124q2.046-32.738 2.046-203.592t-2.046-479.824z" horiz-adv-x="1064" />
23
+ <glyph unicode="&#xe009;" d="M0 52.19q30.682-3.068 61.366-3.068 180.006 0 321.148 110.458-83.866 1.022-150.346 51.138t-91.026 127.846q20.456-4.092 48.070-4.092 35.796 0 68.526 9.204-90.004 17.386-148.812 88.47t-58.808 164.154v3.068q54.206-30.682 117.618-31.706-53.184 34.774-84.378 91.538t-31.194 123.244q0 69.548 35.796 129.892 96.14-119.664 234.724-190.746t297.114-79.264q-7.16 33.752-7.16 59.32 0 106.368 75.684 182.052t183.074 75.684q111.482 0 188.188-81.822 88.98 18.41 163.642 63.412-28.638-93.072-112.504-143.186 74.662 9.204 147.278 40.91-49.092-76.708-127.846-133.982v-33.752q0-103.3-30.172-207.11t-92.048-198.416-147.79-168.244-206.086-117.106-258.248-43.468q-213.758 0-395.81 115.572z" horiz-adv-x="1258" />
24
+ <glyph unicode="&#xe00a;" d="M286.416 426.496v195.584h157.696v98.304q0 106.496 69.12 181.248t167.424 74.752h156.672v-195.584h-156.672q-15.36 0-27.648-16.896t-12.288-41.472v-100.352h196.608v-195.584h-196.608v-474.112h-196.608v474.112h-157.696z" horiz-adv-x="836" />
25
+ <glyph unicode="&#xe00b;" d="M0 163.328q11.264 15.36 32.256 26.112t50.176 20.48 41.472 15.872q19.456 0 34.304-4.608t34.304-15.36 25.6-12.8q48.128-21.504 266.24-121.856 19.456-4.096 36.352 0t40.448 17.92 24.576 14.848q20.48 9.216 78.336 35.328t89.6 40.448q4.096 2.048 42.496 21.504t61.952 24.576q13.312 2.048 28.16-1.024t24.064-7.68 23.552-13.312 18.432-10.752 15.872-6.144 18.944-8.192 11.264-11.264q3.072-4.096 4.096-14.336-10.24-13.312-31.744-24.576t-52.224-22.528-40.96-16.384q-44.032-20.48-131.584-62.976t-131.584-62.976q-7.168-3.072-21.504-11.776t-24.064-13.312-26.112-11.264-28.16-7.168-30.208 1.536l-270.336 125.952q-6.144 3.072-32.768 14.336t-52.736 22.528-54.784 24.576-47.616 24.064-22.016 16.896q-4.096 4.096-4.096 13.312zM0 437.76q11.264 15.36 32.256 25.6t51.2 20.48 42.496 15.36q19.456 0 34.816-4.608t35.328-15.36 26.112-13.824q43.008-19.456 129.536-59.392t130.56-60.416q19.456-5.12 37.888-0.512t39.936 17.408 25.6 14.848q69.632 32.768 163.84 73.728 11.264 5.12 32.256 16.896t39.424 19.968 36.864 11.264q16.384 3.072 32.256-1.024t38.4-17.408 23.552-13.312q5.12-3.072 15.872-6.656t18.432-8.192 11.776-10.752q3.072-5.12 4.096-14.336-10.24-14.336-32.256-26.112t-53.76-23.040-41.984-16.384q-49.152-23.552-138.752-66.56t-125.44-60.416q-7.168-3.072-26.624-14.336t-29.696-15.36-33.28-10.24-36.352 0q-219.136 103.424-266.24 124.928-6.144 3.072-45.056 19.456t-71.168 30.72-62.976 30.208-34.816 23.040q-4.096 4.096-4.096 14.336zM0 711.168q10.24 15.36 32.256 27.136t53.76 23.040 41.984 16.384l356.352 165.888q30.72 0 54.784-7.168t57.856-26.624 40.96-22.528q39.936-18.432 119.808-55.808t119.808-55.808q4.096-2.048 37.376-15.36t55.808-24.576 27.648-20.48q3.072-4.096 4.096-13.312-9.216-13.312-26.624-23.040t-44.544-19.456-35.328-13.824q-48.128-22.528-143.36-68.096t-142.336-68.096q-6.144-3.072-20.48-11.264t-23.552-12.8-25.6-10.752-27.648-6.144-28.672 1.024q-250.88 116.736-262.144 121.856-4.096 2.048-64.512 28.16t-104.448 47.616-49.152 30.72q-4.096 4.096-4.096 13.312z" horiz-adv-x="1002" />
26
+ <glyph unicode="&#xe00c;" d="M704 384l128 128v-512h-768v768h512l-128-128h-256v-512h512zM960 896v-352l-130.744 130.744-354.746-354.744h-90.51v90.512l354.744 354.744-130.744 130.744z" />
27
+ <glyph unicode="&#xe00d;" d="M64 384h384v-384l-138.26 138.26-202-202-107.48 107.48 202 202zM821.74 245.74l202-202-107.48-107.48-202 202-138.26-138.26v384h384zM960 512h-384v384l138.26-138.26 202 202 107.48-107.48-202-202zM309.74 757.74l138.26 138.26v-384h-384l138.26 138.26-202 202 107.48 107.48z" />
28
+ <glyph unicode="&#xe00e;" d="M1024 960v-384l-138.26 138.26-212-212-107.48 107.48 212 212-138.26 138.26zM245.74 821.74l212-212-107.48-107.48-212 212-138.26-138.26v384h384zM885.74 181.74l138.26 138.26v-384h-384l138.26 138.26-212 212 107.48 107.48zM457.74 286.26l-212-212 138.26-138.26h-384v384l138.26-138.26 212 212z" />
29
+ <glyph unicode="&#xe00f;" d="M512 384l256 256h-192v256h-128v-256h-192zM744.726 488.728l-71.74-71.742 260.080-96.986-421.066-157.018-421.066 157.018 260.080 96.986-71.742 71.742-279.272-104.728v-256l512-192 512 192v256z" />
30
+ <glyph unicode="&#xe010;" d="M960 832h-896c-35.2 0-64-28.8-64-64v-640c0-35.2 28.8-64 64-64h896c35.2 0 64 28.8 64 64v640c0 35.2-28.8 64-64 64zM896 704v-46l-384-226.286-384 226.286v46h768zM128 192v354.572l384-226.286 384 226.286v-354.572h-768z" />
31
+ <glyph unicode="&#xe011;" d="M1024 448c-1.278 66.862-15.784 133.516-42.576 194.462-26.704 61-65.462 116.258-113.042 161.92-47.552 45.696-103.944 81.82-164.984 105.652-61.004 23.924-126.596 35.352-191.398 33.966-64.81-1.282-129.332-15.374-188.334-41.356-59.048-25.896-112.542-63.47-156.734-109.576-44.224-46.082-79.16-100.708-102.186-159.798-23.114-59.062-34.128-122.52-32.746-185.27 1.286-62.76 14.964-125.148 40.134-182.206 25.088-57.1 61.476-108.828 106.11-151.548 44.61-42.754 97.472-76.504 154.614-98.72 57.118-22.304 118.446-32.902 179.142-31.526 60.708 1.29 120.962 14.554 176.076 38.914 55.15 24.282 105.116 59.48 146.366 102.644 41.282 43.14 73.844 94.236 95.254 149.43 13.034 33.458 21.88 68.4 26.542 103.798 1.246-0.072 2.498-0.12 3.762-0.12 35.346 0 64 28.652 64 64 0 1.796-0.094 3.572-0.238 5.332h0.238zM922.306 278.052c-23.472-53.202-57.484-101.4-99.178-141.18-41.67-39.81-91-71.186-144.244-91.79-53.228-20.678-110.29-30.452-166.884-29.082-56.604 1.298-112.596 13.736-163.82 36.474-51.25 22.666-97.684 55.49-135.994 95.712-38.338 40.198-68.528 87.764-88.322 139.058-19.87 51.284-29.228 106.214-27.864 160.756 1.302 54.552 13.328 108.412 35.254 157.69 21.858 49.3 53.498 93.97 92.246 130.81 38.73 36.868 84.53 65.87 133.874 84.856 49.338 19.060 102.136 28.006 154.626 26.644 52.5-1.306 104.228-12.918 151.562-34.034 47.352-21.050 90.256-51.502 125.624-88.782 35.396-37.258 63.21-81.294 81.39-128.688 18.248-47.392 26.782-98.058 25.424-148.496h0.238c-0.144-1.76-0.238-3.536-0.238-5.332 0-33.012 24.992-60.174 57.086-63.624-6.224-34.822-16.53-68.818-30.78-100.992z" />
32
+ <glyph unicode="&#xe012;" d="M192 448c0 12.18 0.704 24.196 2.030 36.022l-184.98 60.104c-5.916-31.14-9.050-63.264-9.050-96.126 0-147.23 62.166-279.922 161.654-373.324l114.284 157.296c-52.124 56.926-83.938 132.758-83.938 216.028zM832 448c0-83.268-31.812-159.102-83.938-216.028l114.284-157.296c99.488 93.402 161.654 226.094 161.654 373.324 0 32.862-3.132 64.986-9.048 96.126l-184.98-60.104c1.324-11.828 2.028-23.842 2.028-36.022zM576 761.592c91.934-18.662 169.544-76.742 214.45-155.826l184.978 60.102c-73.196 155.42-222.24 268.060-399.428 290.156v-194.432zM233.55 605.768c44.906 79.084 122.516 137.164 214.45 155.826v194.43c-177.188-22.096-326.23-134.736-399.426-290.154l184.976-60.102zM644.556 156.672c-40.39-18.408-85.272-28.672-132.556-28.672s-92.166 10.264-132.554 28.67l-114.292-157.31c73.206-40.366 157.336-63.36 246.846-63.36s173.64 22.994 246.848 63.36l-114.292 157.312z" />
33
+ <glyph unicode="&#xe013;" d="M384 832c0 70.692 57.308 128 128 128s128-57.308 128-128c0-70.692-57.308-128-128-128-70.692 0-128 57.308-128 128zM655.53 719.53c0 70.692 57.308 128 128 128s128-57.308 128-128c0-70.692-57.308-128-128-128-70.692 0-128 57.308-128 128zM832 448c0 35.346 28.654 64 64 64s64-28.654 64-64c0-35.346-28.654-64-64-64-35.346 0-64 28.654-64 64zM719.53 176.47c0 35.346 28.654 64 64 64s64-28.654 64-64c0-35.346-28.654-64-64-64-35.346 0-64 28.654-64 64zM448.002 64c0 0 0 0 0 0 0 35.346 28.654 64 64 64 35.346 0 64-28.654 64-64 0 0 0 0 0 0 0-35.346-28.654-64-64-64-35.346 0-64 28.654-64 64zM176.472 176.47c0 0 0 0 0 0 0 35.346 28.654 64 64 64 35.346 0 64-28.654 64-64 0 0 0 0 0 0 0-35.346-28.654-64-64-64-35.346 0-64 28.654-64 64zM144.472 719.53c0 0 0 0 0 0 0 53.019 42.981 96 96 96 53.019 0 96-42.981 96-96 0 0 0 0 0 0 0-53.019-42.981-96-96-96-53.019 0-96 42.981-96 96zM56 448c0 39.765 32.235 72 72 72s72-32.235 72-72c0-39.765-32.235-72-72-72-39.765 0-72 32.235-72 72z" />
34
+ <glyph unicode="&#xe014;" d="M512 960c-278.748 0-505.458-222.762-511.848-499.974 5.92 241.864 189.832 435.974 415.848 435.974 229.75 0 416-200.576 416-448 0-53.020 42.98-96 96-96 53.020 0 96 42.98 96 96 0 282.77-229.23 512-512 512zM512-64c278.748 0 505.458 222.762 511.848 499.974-5.92-241.864-189.832-435.974-415.848-435.974-229.75 0-416 200.576-416 448 0 53.020-42.98 96-96 96-53.020 0-96-42.98-96-96 0-282.77 229.23-512 512-512z" />
35
+ <glyph unicode="&#xe015;" d="M0.042 446.382l-0.022-0.004c0 0 0.012-0.090 0.028-0.222 0.11-3.878 0.55-7.676 1.322-11.352 0.204-1.746 0.428-3.66 0.674-5.774 0.222-1.886 0.46-3.914 0.718-6.078 0.374-2.566 0.77-5.292 1.19-8.176 0.856-5.746 1.8-12.124 2.908-18.958 1.348-6.446 2.804-13.414 4.364-20.864 0.71-3.718 1.776-7.504 2.786-11.406 1.024-3.89 2.078-7.894 3.16-12.004 0.566-2.042 1.040-4.132 1.708-6.208 0.656-2.074 1.32-4.176 1.988-6.3 1.348-4.234 2.726-8.566 4.136-12.988 0.352-1.106 0.708-2.21 1.064-3.324 0.408-1.102 0.814-2.208 1.226-3.316 0.826-2.218 1.658-4.458 2.502-6.714 1.696-4.496 3.422-9.078 5.18-13.742 1.968-4.566 3.97-9.214 6.004-13.934 1.018-2.348 2.044-4.714 3.078-7.098 1.048-2.376 2.27-4.704 3.408-7.074 2.322-4.714 4.678-9.496 7.062-14.332 2.47-4.786 5.208-9.512 7.846-14.328 1.336-2.398 2.68-4.808 4.028-7.23 1.368-2.41 2.902-4.75 4.356-7.14 2.95-4.738 5.93-9.524 8.934-14.348 12.64-18.894 26.676-37.566 42.21-55.278 15.712-17.578 32.726-34.25 50.692-49.602 18.18-15.136 37.264-28.902 56.726-41.114 19.604-12.036 39.644-22.312 59.376-31.144 5.004-2.040 9.964-4.062 14.878-6.066 2.462-0.972 4.868-2.032 7.336-2.918 2.47-0.868 4.93-1.734 7.376-2.594 4.898-1.684 9.678-3.468 14.484-4.992 4.832-1.43 9.604-2.844 14.312-4.242 2.356-0.672 4.66-1.426 7.004-2.012 2.346-0.574 4.676-1.14 6.986-1.704 4.606-1.118 9.142-2.214 13.604-3.296 4.5-0.868 8.926-1.722 13.27-2.558 2.166-0.41 4.31-0.82 6.434-1.222 1.062-0.2 2.118-0.398 3.166-0.598 1.060-0.148 2.118-0.292 3.166-0.442 4.192-0.582 8.292-1.152 12.3-1.71 1.998-0.274 3.972-0.546 5.922-0.816 1.946-0.286 3.904-0.378 5.814-0.57 3.822-0.336 7.544-0.664 11.164-0.98 3.616-0.304 7.104-0.688 10.526-0.738 0.23-0.008 0.452-0.016 0.682-0.026 0.614-34.812 29.008-62.846 63.968-62.846 0.542 0 1.080 0.028 1.62 0.042v-0.022c0 0 0.090 0.012 0.224 0.028 3.878 0.11 7.674 0.55 11.35 1.322 1.748 0.204 3.662 0.426 5.776 0.672 1.884 0.222 3.912 0.462 6.076 0.718 2.566 0.376 5.292 0.772 8.176 1.192 5.746 0.856 12.124 1.8 18.958 2.908 6.446 1.348 13.414 2.804 20.864 4.362 3.718 0.712 7.504 1.778 11.406 2.786 3.892 1.026 7.894 2.080 12.004 3.162 2.044 0.566 4.132 1.040 6.208 1.708 2.074 0.656 4.174 1.318 6.3 1.988 4.232 1.348 8.564 2.726 12.988 4.134 1.104 0.354 2.21 0.708 3.324 1.066 1.1 0.406 2.206 0.814 3.316 1.226 2.216 0.824 4.456 1.658 6.714 2.5 4.496 1.698 9.078 3.424 13.74 5.182 4.568 1.968 9.216 3.97 13.936 6.004 2.348 1.018 4.714 2.044 7.098 3.078 2.376 1.048 4.702 2.27 7.074 3.408 4.714 2.322 9.494 4.678 14.33 7.062 4.786 2.47 9.512 5.208 14.328 7.846 2.398 1.336 4.808 2.678 7.23 4.028 2.41 1.366 4.75 2.9 7.14 4.354 4.738 2.952 9.524 5.93 14.35 8.936 18.89 12.64 37.564 26.674 55.278 42.21 17.574 15.712 34.248 32.726 49.602 50.69 15.136 18.182 28.902 37.264 41.112 56.728 12.036 19.602 22.314 39.644 31.142 59.376 2.042 5.002 4.062 9.964 6.068 14.878 0.974 2.462 2.032 4.868 2.918 7.334 0.87 2.472 1.732 4.932 2.592 7.376 1.686 4.898 3.468 9.678 4.994 14.484 1.432 4.832 2.846 9.604 4.24 14.31 0.674 2.358 1.43 4.66 2.016 7.004 0.57 2.348 1.138 4.676 1.702 6.988 1.118 4.606 2.216 9.14 3.296 13.602 0.868 4.502 1.72 8.928 2.558 13.272 0.41 2.164 0.818 4.308 1.222 6.434 0.2 1.060 0.398 2.116 0.596 3.164 0.148 1.062 0.296 2.118 0.444 3.168 0.582 4.19 1.152 8.292 1.708 12.3 0.278 1.996 0.55 3.97 0.82 5.922 0.284 1.946 0.376 3.902 0.568 5.812 0.336 3.822 0.664 7.546 0.98 11.164 0.304 3.616 0.686 7.106 0.738 10.528 0.020 0.534 0.040 1.044 0.058 1.574 35.224 0.146 63.732 28.738 63.732 63.992 0 0.542-0.028 1.080-0.042 1.62h0.022c0 0-0.012 0.090-0.028 0.224-0.11 3.878-0.55 7.674-1.322 11.35-0.204 1.748-0.428 3.662-0.674 5.776-0.222 1.886-0.46 3.914-0.718 6.076-0.374 2.566-0.77 5.294-1.19 8.176-0.856 5.746-1.8 12.124-2.908 18.958-1.348 6.444-2.804 13.414-4.364 20.862-0.71 3.72-1.776 7.506-2.786 11.408-1.024 3.892-2.078 7.894-3.16 12.002-0.566 2.044-1.040 4.134-1.708 6.208-0.656 2.076-1.32 4.174-1.988 6.3-1.348 4.234-2.726 8.566-4.136 12.99-0.352 1.102-0.708 2.21-1.064 3.324-0.408 1.1-0.814 2.206-1.226 3.316-0.826 2.216-1.658 4.454-2.502 6.714-1.696 4.498-3.422 9.080-5.18 13.74-1.968 4.57-3.97 9.216-6.004 13.936-1.020 2.348-2.044 4.714-3.078 7.098-1.048 2.376-2.27 4.702-3.408 7.076-2.322 4.714-4.678 9.494-7.062 14.33-2.47 4.786-5.208 9.512-7.846 14.328-1.336 2.398-2.68 4.808-4.028 7.23-1.368 2.41-2.902 4.75-4.356 7.14-2.95 4.74-5.93 9.524-8.934 14.35-12.64 18.892-26.676 37.564-42.21 55.278-15.712 17.576-32.726 34.25-50.692 49.602-18.18 15.136-37.264 28.902-56.726 41.112-19.604 12.036-39.644 22.314-59.376 31.142-5.004 2.040-9.964 4.062-14.878 6.068-2.462 0.974-4.868 2.032-7.336 2.918-2.47 0.87-4.93 1.734-7.376 2.592-4.898 1.684-9.678 3.468-14.484 4.994-4.832 1.432-9.604 2.846-14.312 4.242-2.356 0.672-4.66 1.428-7.004 2.014-2.346 0.572-4.676 1.138-6.986 1.702-4.606 1.118-9.142 2.216-13.604 3.298-4.5 0.868-8.926 1.72-13.27 2.558-2.166 0.412-4.31 0.82-6.434 1.222-1.062 0.2-2.118 0.398-3.166 0.596-1.060 0.148-2.118 0.296-3.166 0.442-4.192 0.584-8.292 1.154-12.3 1.71-1.998 0.276-3.972 0.55-5.922 0.82-1.946 0.284-3.904 0.376-5.814 0.57-3.822 0.336-7.544 0.664-11.164 0.98-3.616 0.304-7.104 0.686-10.526 0.738-0.852 0.032-1.674 0.062-2.512 0.092-0.65 34.78-29.028 62.778-63.966 62.778-0.542 0-1.080-0.028-1.62-0.042l-0.002 0.022c0 0-0.090-0.012-0.222-0.028-3.878-0.11-7.676-0.55-11.352-1.322-1.748-0.204-3.662-0.426-5.776-0.672-1.884-0.222-3.912-0.462-6.076-0.718-2.566-0.376-5.292-0.772-8.176-1.192-5.746-0.856-12.124-1.8-18.958-2.908-6.446-1.348-13.414-2.804-20.864-4.362-3.718-0.712-7.504-1.778-11.406-2.786-3.892-1.026-7.894-2.080-12.004-3.162-2.044-0.566-4.132-1.040-6.208-1.708-2.074-0.656-4.174-1.318-6.3-1.988-4.232-1.348-8.564-2.726-12.988-4.134-1.104-0.354-2.21-0.708-3.324-1.066-1.1-0.406-2.206-0.814-3.316-1.226-2.216-0.824-4.456-1.658-6.714-2.5-4.496-1.698-9.078-3.424-13.74-5.182-4.568-1.968-9.216-3.97-13.936-6.004-2.348-1.018-4.714-2.044-7.098-3.078-2.376-1.048-4.702-2.27-7.074-3.408-4.714-2.322-9.494-4.678-14.33-7.062-4.786-2.47-9.512-5.208-14.328-7.846-2.398-1.336-4.808-2.678-7.23-4.028-2.41-1.366-4.75-2.9-7.14-4.354-4.738-2.952-9.524-5.93-14.35-8.936-18.89-12.64-37.564-26.674-55.278-42.21-17.574-15.712-34.248-32.726-49.602-50.69-15.136-18.182-28.902-37.264-41.112-56.728-12.036-19.602-22.314-39.644-31.142-59.376-2.042-5.002-4.062-9.964-6.068-14.878-0.974-2.462-2.032-4.868-2.918-7.334-0.87-2.472-1.732-4.932-2.592-7.376-1.686-4.898-3.468-9.678-4.994-14.484-1.432-4.832-2.846-9.604-4.24-14.31-0.674-2.358-1.43-4.66-2.016-7.004-0.57-2.348-1.138-4.676-1.702-6.988-1.118-4.606-2.216-9.14-3.296-13.602-0.868-4.502-1.72-8.928-2.558-13.272-0.41-2.164-0.818-4.308-1.222-6.434-0.2-1.060-0.398-2.116-0.596-3.164-0.148-1.062-0.296-2.118-0.444-3.168-0.582-4.19-1.152-8.292-1.708-12.3-0.278-1.996-0.55-3.97-0.82-5.922-0.284-1.946-0.376-3.902-0.568-5.812-0.336-3.822-0.664-7.546-0.98-11.164-0.304-3.616-0.686-7.106-0.738-10.528-0.020-0.548-0.040-1.076-0.058-1.62-34.376-1.112-61.902-29.304-61.902-63.946 0-0.542 0.028-1.078 0.042-1.618zM73.518 511.294c0.042 0.196 0.086 0.384 0.128 0.58 0.644 3.248 1.632 6.542 2.556 9.942 0.934 3.388 1.894 6.876 2.88 10.454 0.516 1.78 0.934 3.602 1.546 5.406 0.596 1.802 1.202 3.628 1.81 5.476 1.218 3.682 2.464 7.45 3.736 11.294 0.316 0.958 0.634 1.924 0.956 2.892 0.37 0.954 0.74 1.914 1.114 2.876 0.746 1.924 1.5 3.868 2.26 5.83 1.52 3.904 3.070 7.882 4.646 11.93 1.768 3.96 3.566 7.99 5.392 12.080 0.908 2.038 1.824 4.090 2.746 6.156 0.932 2.060 2.036 4.072 3.052 6.126 2.070 4.084 4.17 8.222 6.294 12.412 2.202 4.142 4.654 8.224 6.998 12.392 1.184 2.074 2.374 4.16 3.57 6.256 1.21 2.086 2.586 4.102 3.876 6.166 2.616 4.098 5.256 8.232 7.918 12.402 11.234 16.298 23.632 32.398 37.33 47.638 13.874 15.104 28.842 29.404 44.598 42.548 15.974 12.928 32.686 24.65 49.676 35.022 17.13 10.194 34.6 18.838 51.734 26.258 4.35 1.7 8.662 3.382 12.934 5.050 2.136 0.812 4.216 1.71 6.36 2.444 2.146 0.714 4.28 1.428 6.404 2.136 4.25 1.386 8.382 2.888 12.548 4.142 4.184 1.174 8.314 2.332 12.392 3.474 2.038 0.55 4.026 1.19 6.054 1.662 2.030 0.458 4.044 0.914 6.044 1.368 3.978 0.91 7.896 1.806 11.748 2.688 3.888 0.686 7.71 1.36 11.462 2.022 1.868 0.33 3.716 0.658 5.546 0.98 0.914 0.162 1.824 0.324 2.728 0.484 0.916 0.112 1.828 0.222 2.734 0.332 3.612 0.448 7.148 0.882 10.604 1.31 1.72 0.216 3.422 0.432 5.102 0.644 1.674 0.226 3.364 0.266 5.010 0.408 3.292 0.238 6.498 0.472 9.616 0.7 3.11 0.218 6.11 0.524 9.058 0.508 5.848 0.132 11.32 0.256 16.38 0.372 4.664-0.168 8.948-0.324 12.818-0.462 1.914-0.054 3.726-0.108 5.432-0.156 2.122-0.134 4.108-0.26 5.958-0.378 2.13-0.138 4.060-0.266 5.82-0.38 3.256-0.51 6.592-0.782 9.99-0.782 0.466 0 0.93 0.026 1.396 0.036 0.132-0.008 0.224-0.014 0.224-0.014v0.020c31.14 0.778 56.75 23.784 61.556 53.754 0.542-0.12 1.064-0.236 1.612-0.356 3.246-0.644 6.542-1.632 9.942-2.556 3.386-0.934 6.876-1.894 10.454-2.88 1.778-0.516 3.602-0.934 5.404-1.546 1.802-0.596 3.63-1.202 5.478-1.812 3.68-1.218 7.448-2.464 11.292-3.736 0.96-0.316 1.924-0.634 2.892-0.956 0.956-0.37 1.914-0.74 2.876-1.112 1.926-0.746 3.868-1.5 5.83-2.26 3.904-1.52 7.884-3.070 11.932-4.646 3.96-1.768 7.988-3.566 12.080-5.392 2.038-0.908 4.088-1.824 6.156-2.746 2.060-0.932 4.072-2.036 6.126-3.054 4.082-2.070 8.222-4.17 12.41-6.294 4.144-2.202 8.226-4.654 12.394-6.998 2.074-1.184 4.16-2.374 6.256-3.572 2.086-1.21 4.102-2.586 6.166-3.876 4.098-2.616 8.23-5.256 12.402-7.918 16.296-11.234 32.398-23.632 47.636-37.33 15.104-13.874 29.406-28.842 42.55-44.598 12.928-15.974 24.648-32.686 35.020-49.676 10.196-17.13 18.84-34.6 26.26-51.736 1.698-4.348 3.382-8.662 5.050-12.932 0.812-2.136 1.71-4.216 2.444-6.36 0.714-2.146 1.428-4.28 2.136-6.404 1.386-4.25 2.888-8.384 4.142-12.548 1.174-4.184 2.33-8.316 3.474-12.392 0.55-2.038 1.19-4.026 1.66-6.054 0.46-2.030 0.916-4.046 1.368-6.046 0.91-3.978 1.808-7.896 2.688-11.748 0.688-3.888 1.362-7.71 2.024-11.462 0.33-1.868 0.656-3.716 0.98-5.548 0.162-0.914 0.324-1.824 0.484-2.728 0.11-0.916 0.222-1.828 0.332-2.734 0.446-3.612 0.882-7.148 1.31-10.604 0.216-1.72 0.432-3.42 0.642-5.1 0.226-1.674 0.268-3.364 0.41-5.010 0.238-3.292 0.472-6.498 0.7-9.616 0.218-3.11 0.524-6.11 0.508-9.058 0.132-5.848 0.256-11.32 0.372-16.38-0.168-4.664-0.324-8.948-0.462-12.818-0.054-1.914-0.108-3.726-0.156-5.432-0.134-2.122-0.26-4.108-0.378-5.958-0.138-2.13-0.266-4.060-0.38-5.82-0.498-3.256-0.768-6.592-0.768-9.99 0-0.468 0.026-0.93 0.036-1.396-0.008-0.132-0.016-0.224-0.016-0.224h0.022c0.768-30.766 23.236-56.128 52.682-61.37-0.066-0.296-0.13-0.584-0.198-0.884-0.644-3.248-1.632-6.542-2.556-9.942-0.934-3.388-1.894-6.876-2.88-10.454-0.516-1.78-0.934-3.602-1.546-5.406-0.596-1.802-1.202-3.628-1.81-5.476-1.218-3.682-2.464-7.45-3.736-11.294-0.316-0.958-0.634-1.924-0.956-2.892-0.37-0.954-0.74-1.914-1.114-2.876-0.746-1.924-1.5-3.868-2.26-5.83-1.52-3.904-3.070-7.882-4.646-11.93-1.768-3.96-3.566-7.99-5.392-12.080-0.908-2.038-1.824-4.090-2.746-6.156-0.932-2.060-2.036-4.072-3.052-6.126-2.070-4.084-4.17-8.222-6.294-12.412-2.202-4.142-4.654-8.224-6.998-12.392-1.184-2.074-2.374-4.16-3.57-6.256-1.21-2.086-2.586-4.102-3.876-6.166-2.616-4.098-5.256-8.232-7.918-12.402-11.234-16.298-23.632-32.398-37.33-47.638-13.874-15.104-28.842-29.404-44.598-42.548-15.974-12.928-32.686-24.65-49.676-35.022-17.13-10.194-34.6-18.838-51.734-26.258-4.35-1.7-8.662-3.382-12.934-5.050-2.136-0.812-4.216-1.71-6.36-2.444-2.146-0.714-4.28-1.428-6.404-2.136-4.25-1.386-8.382-2.888-12.548-4.142-4.184-1.174-8.314-2.332-12.392-3.474-2.038-0.55-4.026-1.19-6.054-1.662-2.030-0.458-4.044-0.914-6.044-1.368-3.978-0.91-7.896-1.806-11.748-2.688-3.888-0.686-7.71-1.36-11.462-2.022-1.868-0.33-3.716-0.658-5.546-0.98-0.914-0.162-1.824-0.324-2.728-0.484-0.916-0.112-1.828-0.222-2.734-0.332-3.612-0.448-7.148-0.882-10.604-1.31-1.72-0.216-3.422-0.432-5.102-0.644-1.674-0.226-3.364-0.266-5.010-0.408-3.292-0.238-6.498-0.472-9.616-0.7-3.11-0.218-6.11-0.524-9.058-0.508-5.848-0.132-11.32-0.256-16.38-0.372-4.664 0.168-8.948 0.324-12.818 0.462-1.914 0.054-3.726 0.108-5.432 0.156-2.122 0.134-4.108 0.26-5.958 0.378-2.13 0.138-4.060 0.266-5.82 0.38-3.256 0.51-6.592 0.782-9.99 0.782-0.466 0-0.93-0.026-1.396-0.036-0.132 0.008-0.224 0.014-0.224 0.014v-0.020c-31.004-0.774-56.524-23.586-61.488-53.364-3.2 0.64-6.446 1.61-9.792 2.522-3.386 0.934-6.876 1.894-10.454 2.878-1.778 0.516-3.602 0.938-5.404 1.546-1.802 0.598-3.63 1.204-5.478 1.812-3.68 1.218-7.448 2.464-11.292 3.738-0.96 0.316-1.924 0.632-2.892 0.954-0.956 0.372-1.914 0.742-2.876 1.114-1.926 0.746-3.868 1.5-5.83 2.258-3.904 1.524-7.884 3.070-11.932 4.648-3.96 1.77-7.988 3.566-12.080 5.39-2.038 0.91-4.088 1.824-6.156 2.746-2.060 0.934-4.072 2.036-6.126 3.054-4.082 2.070-8.222 4.172-12.41 6.296-4.144 2.2-8.226 4.652-12.394 6.996-2.074 1.184-4.16 2.376-6.256 3.57-2.086 1.21-4.102 2.586-6.166 3.878-4.098 2.614-8.23 5.254-12.402 7.918-16.296 11.23-32.398 23.632-47.636 37.328-15.104 13.876-29.406 28.84-42.55 44.598-12.928 15.972-24.648 32.684-35.020 49.676-10.196 17.128-18.84 34.602-26.26 51.734-1.698 4.352-3.382 8.664-5.050 12.934-0.812 2.136-1.71 4.218-2.444 6.36-0.714 2.148-1.428 4.282-2.136 6.406-1.386 4.25-2.888 8.382-4.142 12.546-1.174 4.184-2.33 8.316-3.474 12.394-0.55 2.036-1.19 4.024-1.66 6.054-0.46 2.028-0.916 4.042-1.368 6.042-0.91 3.98-1.808 7.898-2.688 11.75-0.688 3.886-1.362 7.71-2.024 11.46-0.33 1.868-0.656 3.718-0.98 5.546-0.162 0.914-0.324 1.824-0.484 2.73-0.11 0.914-0.222 1.828-0.332 2.734-0.446 3.61-0.882 7.148-1.31 10.602-0.216 1.722-0.432 3.422-0.642 5.102-0.226 1.676-0.268 3.364-0.41 5.012-0.238 3.29-0.472 6.496-0.7 9.614-0.218 3.11-0.524 6.11-0.508 9.058-0.132 5.848-0.256 11.32-0.372 16.382 0.168 4.664 0.324 8.946 0.462 12.816 0.054 1.914 0.108 3.726 0.156 5.434 0.134 2.122 0.26 4.106 0.378 5.958 0.138 2.128 0.266 4.058 0.38 5.82 0.496 3.26 0.766 6.596 0.766 9.994 0 0.466-0.026 0.93-0.036 1.396 0.008 0.132 0.016 0.224 0.016 0.224h-0.022c-0.78 31.38-24.134 57.154-54.44 61.674z" />
36
+ <glyph unicode="&#xe016;" d="M1024 544l-225.738 22.574 143.66 175.582-135.766 135.764-175.582-143.658-22.574 225.738h-192l-22.574-225.738-175.582 143.658-135.764-135.764 143.658-175.582-225.738-22.574v-192l225.738-22.574-143.658-175.582 135.764-135.766 175.582 143.66 22.574-225.738h192l22.574 225.738 175.582-143.66 135.766 135.766-143.66 175.582 225.738 22.574v192zM704 527.528v-159.056l-112.472-112.472h-159.056l-112.472 112.472v159.056l112.47 112.472h159.056l112.474-112.472z" />
37
+ <glyph unicode="&#xe017;" d="M874.022 810.020c-92.652 92.656-220.636 149.98-362.022 149.98-219.488 0-406.69-138.128-479.498-332.188l119.876-44.954c54.604 145.546 195.006 249.142 359.622 249.142 106.040 0 202.020-43 271.506-112.494l-143.506-143.506h384v384l-149.978-149.98zM512 64c-106.040 0-202.026 42.992-271.512 112.488l143.512 143.512h-384v-384l149.994 149.994c92.646-92.662 220.618-149.994 362.006-149.994 219.49 0 406.692 138.128 479.5 332.188l-119.876 44.954c-54.604-145.546-195.006-249.142-359.624-249.142z" />
38
+ <glyph unicode="&#xe018;" d="M512 752c-100.252 0-189.54-46.802-246.326-119.256l-76.776 57.582c74.32 95.764 191.494 157.674 323.102 157.674v112l160-160-160-160v112zM512 144c100.254 0 189.542 46.802 246.326 119.256l76.776-57.582c-74.32-95.764-191.494-157.674-323.102-157.674v-112l-160 160 160 160v-112zM201.6 448c0-100.364 49.928-189.508 126.724-244.902l-57.584-76.78c-100.108 72.928-165.14 189.966-165.14 321.682h-105.6l160 160 160-160h-118.4zM918.4 448h105.6l-160-160-160 160h118.4c0 100.364-49.928 189.508-126.724 244.902l57.584 76.778c100.108-72.926 165.14-189.962 165.14-321.68z" />
39
+ <glyph unicode="&#xe019;" d="M831.924 753.296v0 0zM834.050 448c104.384 99.81 155.082 197.58 121.354 256-19.26 33.356-63.36 49.296-123.48 49.296v-48c42.144 0 72.766-9.458 81.912-25.296 7.218-12.504 3.2-31.73-1.446-45.658-8.906-26.71-28.288-58.664-56.042-92.404-16.848-20.478-36.27-41.122-57.874-61.642-29.764 25.698-62.876 51.258-98.796 76.058-3.514 43.48-9.090 84.916-16.458 123.518 56.19 16.666 107.186 25.418 148.682 25.422l0.022 48c-0.008 0-0.018 0-0.026 0-45.174-0.004-99.396-9.032-158.874-26.404-34.24 140.318-93.566 233.11-161.024 233.11-67.458 0-126.784-92.792-161.028-233.102-59.474 17.372-113.698 26.398-158.872 26.398-60.12 0-104.248-15.942-123.506-49.296-33.73-58.42 16.966-156.19 121.352-256-104.386-99.808-155.082-197.58-121.352-256 19.26-33.36 63.37-49.294 123.506-49.294 45.172 0 99.396 9.030 158.872 26.4 34.244-140.314 93.568-233.106 161.028-233.106 67.458 0 126.784 92.792 161.028 233.102 59.474-17.374 113.7-26.398 158.874-26.398 60.12 0 104.248 15.944 123.506 49.296 33.724 58.418-16.97 156.192-121.358 256zM762.542 448c-18.62-15.876-38.454-31.584-59.358-46.988 0.53 15.476 0.816 31.142 0.816 46.988 0 15.844-0.286 31.51-0.812 46.988 20.904-15.404 40.738-31.112 59.354-46.988zM637.292 231.132c-23.054 8.196-46.562 17.52-70.27 27.868 13.626 7.262 27.294 14.824 40.974 22.722 13.722 7.922 27.146 16 40.288 24.198-2.882-25.766-6.562-50.76-10.992-74.788zM584 323.292c-23.782-13.728-47.876-26.63-72-38.616-24.124 11.982-48.22 24.884-72 38.616-23.976 13.844-47.192 28.226-69.498 43.012-1.65 26.712-2.502 54.010-2.502 81.696s0.852 54.984 2.502 81.694c22.306 14.786 45.522 29.17 69.498 43.014 23.78 13.728 47.876 26.63 72 38.614 24.124-11.982 48.218-24.884 72-38.614 23.976-13.842 47.192-28.23 69.498-43.014 1.65-26.71 2.502-54.008 2.502-81.694s-0.852-54.984-2.502-81.696c-22.306-14.784-45.522-29.172-69.498-43.012zM375.712 305.92c13.14-8.198 26.564-16.276 40.288-24.198 13.68-7.898 27.346-15.46 40.974-22.722-23.704-10.348-47.214-19.67-70.266-27.864-4.43 24.026-8.112 49.020-10.996 74.784zM320.812 401.010c-20.904 15.406-40.74 31.116-59.358 46.99 18.618 15.876 38.454 31.584 59.358 46.99-0.528-15.48-0.812-31.144-0.812-46.99s0.284-31.512 0.812-46.99zM386.708 664.864c23.052-8.194 46.562-17.518 70.266-27.864-13.626-7.262-27.294-14.824-40.974-22.722-13.722-7.922-27.146-16.002-40.288-24.198 2.884 25.764 6.566 50.758 10.996 74.784zM608 614.278c-13.68 7.898-27.346 15.46-40.972 22.722 23.706 10.346 47.212 19.668 70.268 27.862 4.43-24.024 8.11-49.016 10.992-74.782-13.142 8.196-26.566 16.274-40.288 24.198zM421.18 793.184c15.34 40.908 33.322 73.668 52.002 94.736 9.738 10.986 24.378 24.080 38.818 24.080 14.442 0 29.078-13.094 38.818-24.080 18.68-21.068 36.658-53.828 52.002-94.736 9.312-24.834 17.478-51.978 24.45-80.952-37.136-12.926-75.832-28.824-115.268-47.532-39.438 18.71-78.132 34.608-115.27 47.536 6.97 28.972 15.136 56.116 24.448 80.948zM167.65 541.938c-27.756 33.74-47.136 65.692-56.042 92.404-4.644 13.926-8.664 33.154-1.444 45.658 9.144 15.838 39.776 25.294 81.938 25.296h0.004c41.492 0 92.486-8.752 148.674-25.418-7.368-38.604-12.942-80.040-16.456-123.522-35.92-24.798-69.036-50.36-98.8-76.058-21.604 20.52-41.026 41.162-57.874 61.64zM192.1 190.708c-42.162 0-72.792 9.456-81.936 25.292-7.22 12.504-3.2 31.73 1.444 45.658 8.906 26.708 28.286 58.662 56.042 92.4 16.848 20.48 36.27 41.124 57.874 61.644 29.762-25.702 62.878-51.262 98.798-76.058 3.514-43.482 9.088-84.916 16.456-123.524-56.19-16.662-107.184-25.412-148.678-25.412zM602.82 102.816c-15.342-40.91-33.322-73.668-52.002-94.738-9.74-10.984-24.376-24.078-38.818-24.078-14.44 0-29.080 13.094-38.818 24.078-18.68 21.070-36.662 53.828-52.002 94.736-9.312 24.834-17.478 51.978-24.45 80.952 37.138 12.93 75.832 28.824 115.268 47.536 39.44-18.71 78.13-34.61 115.27-47.538-6.972-28.972-15.136-56.116-24.448-80.948zM912.39 261.656c4.642-13.926 8.664-33.152 1.446-45.656-9.146-15.84-39.778-25.296-81.938-25.296-41.496 0-92.49 8.754-148.678 25.418 7.368 38.606 12.944 80.042 16.458 123.524 35.92 24.8 69.036 50.362 98.796 76.058 21.604-20.522 41.026-41.164 57.874-61.64 27.758-33.744 47.136-65.696 56.042-92.408zM432 448c0 44.183 35.817 80 80 80s80-35.817 80-80c0-44.183-35.817-80-80-80-44.183 0-80 35.817-80 80z" />
40
+ <glyph unicode="&#xe01a;" d="M466.038 402.038l-320 320-146.038-146.038v384h384l-146.038-146.038 320-320zM512 960c282.77 0 512-229.23 512-512s-229.23-512-512-512c-282.77 0-512 229.23-512 512h128c0-212.078 171.922-384 384-384s384 171.922 384 384c0 212.078-171.922 384-384 384v128z" />
41
+ <glyph unicode="&#xe01b;" d="M640-64l192 192-320 320 320 320-192 192-512-512z" />
42
+ <glyph unicode="&#xe01c;" d="M384 960l-192-192 320-320-320-320 192-192 512 512z" />
43
+ <glyph unicode="&#xe01d;" d="M0 448l1024-448-192 448 192 448z" />
44
+ <glyph unicode="&#xe01e;" d="M1024 448l-1024 448 192-448-192-448z" />
45
+ <glyph unicode="&#xe01f;" d="M768 960l-512-512 512-512-255.998 512z" />
46
+ <glyph unicode="&#xe020;" d="M256-64l512 512-512 512 256-512z" />
47
+ <glyph unicode="&#xe021;" d="M640.002 704l-256-256 256-256.002z" />
48
+ <glyph unicode="&#xe022;" d="M384.002 192l256 256-256 256z" />
49
+ <glyph unicode="&#xe023;" d="M0 448.002l512-512.002v320h511.998l0.002 384h-512v320l-512-511.998zM152 509.492l16 16v-154.98l-16 16v122.98zM136 402.512l-16 16v58.98l16 16v-90.98zM184 541.492l16 16v-218.982l-16 16v186.982zM216 573.492l16 16v-282.982l-16 16v250.982zM248 605.492l16 16v-346.982l-16 16v314.982zM280 637.492l16 15.998v-410.98l-16 16v378.982zM312 669.49l16 16v-474.98l-16 16v442.98zM344 701.49l16 16v-538.98l-16 16v506.98zM376 733.49l16 16v-602.98l-16 16v570.98zM408 765.49l16 16v-666.98l-16 16v634.98zM104 461.492v-26.98l-13.49 13.49 13.49 13.49zM472 320v256h16v-256h-16zM504 320v256h16v-256h-16zM536 320v256h16v-256h-16zM568 320v256h16v-256h-16zM600 320v256h16v-256h-16zM632 320v256h16v-256h-16zM664 320v256h16v-256h-16zM696 320v256h16v-256h-16zM728 320v256h16v-256h-16zM760 320v256h16v-256h-16zM792 320v256h16v-256h-16zM824 320v256h16v-256h-16zM856 320v256h16v-256h-16zM888 320v256h16v-256h-16zM920 320v256h16v-256h-16zM959.998 320h-7.998v256h8l-0.002-256zM448 576h8v-256h-8v-229.49l-8 8v698.98l8 8v-229.49z" />
50
+ <glyph unicode="&#xe024;" d="M1024 447.998l-512 512.002v-320h-511.998l-0.002-384h512v-320l512 511.998zM872 386.508l-16-16v154.98l16-16v-122.98zM888 493.488l16-16v-58.98l-16-16v90.98zM840 354.508l-16-16v218.982l16-16v-186.982zM808 322.508l-16-16v282.982l16-16v-250.982zM776 290.508l-16-16v346.982l16-16v-314.982zM744 258.508l-16-15.998v410.98l16-16v-378.982zM712 226.51l-16-16v474.98l16-16v-442.98zM680 194.51l-16-16v538.98l16-16v-506.98zM648 162.51l-16-16v602.98l16-16v-570.98zM616 130.51l-16-16v666.98l16-16v-634.98zM920 434.508v26.98l13.49-13.49-13.49-13.49zM552 576v-256h-16v256h16zM520 576v-256h-16v256h16zM488 576v-256h-16v256h16zM456 576v-256h-16v256h16zM424 576v-256h-16v256h16zM392 576v-256h-16v256h16zM360 576v-256h-16v256h16zM328 576v-256h-16v256h16zM296 576v-256h-16v256h16zM264 576v-256h-16v256h16zM232 576v-256h-16v256h16zM200 576v-256h-16v256h16zM168 576v-256h-16v256h16zM136 576v-256h-16v256h16zM104 576v-256h-16v256h16zM64.002 576h7.998v-256h-8l0.002 256zM576 320h-8v256h8v229.49l8-8v-698.98l-8-8v229.49z" />
51
+ <glyph unicode="&#xe025;" d="M0 448l512-512v320h511.998l0.002 384h-512v320z" />
52
+ <glyph unicode="&#xe026;" d="M1024 448l-512 512v-320h-511.998l-0.002-384h512v-320z" />
53
+ <glyph unicode="&#xe027;" d="M448 704c0 35.346 28.654 64 64 64s64-28.654 64-64c0-35.346-28.654-64-64-64-35.346 0-64 28.654-64 64zM512 960c-282.77 0-512-229.23-512-512s229.23-512 512-512 512 229.23 512 512-229.23 512-512 512zM512 128c-35.348 0-64 28.652-64 64s28.652 64 64 64c35.346 0 64-28.652 64-64s-28.654-64-64-64zM512 448c-114.876 0-208-93.124-208-208s93.124-208 208-208c-229.75 0-416 186.25-416 416s186.25 416 416 416c114.876 0 208-93.124 208-208s-93.124-208-208-208z" />
54
+ <glyph unicode="&#xe028;" d="M512 864c-111.118 0-215.584-43.272-294.156-121.844s-121.844-183.038-121.844-294.156c0-111.118 43.272-215.584 121.844-294.156 78.572-78.572 183.038-121.844 294.156-121.844 111.118 0 215.584 43.272 294.156 121.844 78.572 78.572 121.844 183.038 121.844 294.156 0 111.118-43.272 215.584-121.844 294.156-78.572 78.572-183.038 121.844-294.156 121.844zM512 960v0c282.77 0 512-229.23 512-512s-229.23-512-512-512c-282.77 0-512 229.23-512 512 0 282.77 229.23 512 512 512zM448 256h128v-128h-128zM448 768h128v-384h-128z" />
55
+ <glyph unicode="&#xe3cb;" d="M512 960c-282.77 0-512-229.23-512-512s229.23-512 512-512 512 229.23 512 512-229.23 512-512 512zM512 32c-229.75 0-416 186.25-416 416s186.25 416 416 416 416-186.25 416-416-186.25-416-416-416zM813.256 493.254l-256.002 256c-24.992 24.994-65.514 24.994-90.508 0s-24.994-65.516 0-90.51l146.744-146.744h-357.49c-35.346 0-64-28.654-64-64s28.654-64 64-64h357.49l-146.746-146.744c-24.994-24.994-24.994-65.518 0-90.512 12.498-12.496 28.878-18.744 45.256-18.744s32.758 6.248 45.254 18.744l256.002 256c24.992 24.994 24.992 65.518 0 90.51z" />
56
+ <glyph unicode="&#xe3cf;" d="M512 960c282.77 0 512-229.23 512-512s-229.23-512-512-512-512 229.23-512 512 229.23 512 512 512zM512 32c229.75 0 416 186.25 416 416s-186.25 416-416 416-416-186.25-416-416 186.25-416 416-416zM210.744 493.254l256.002 256c24.992 24.994 65.514 24.994 90.508 0s24.994-65.516 0-90.51l-146.744-146.744h357.49c35.346 0 64-28.654 64-64s-28.654-64-64-64h-357.49l146.746-146.744c24.994-24.994 24.994-65.518 0-90.512-12.498-12.496-28.878-18.744-45.256-18.744s-32.758 6.248-45.254 18.744l-256.002 256c-24.992 24.994-24.992 65.518 0 90.51z" />
57
+ <glyph unicode="&#xe3d3;" d="M512 960c-282.77 0-512-229.23-512-512s229.23-512 512-512 512 229.23 512 512-229.23 512-512 512zM813.256 402.744l-256.002-256c-12.496-12.496-28.876-18.744-45.254-18.744s-32.758 6.248-45.254 18.744c-24.994 24.994-24.994 65.518 0 90.512l146.744 146.744h-357.49c-35.346 0-64 28.654-64 64s28.654 64 64 64h357.49l-146.746 146.746c-24.994 24.994-24.994 65.516 0 90.51s65.516 24.994 90.508 0l256.002-256c24.994-24.994 24.994-65.518 0.002-90.512z" />
58
+ <glyph unicode="&#xe3d7;" d="M512 960c282.77 0 512-229.23 512-512s-229.23-512-512-512-512 229.23-512 512 229.23 512 512 512zM210.744 402.744l256.002-256c12.496-12.496 28.876-18.744 45.254-18.744s32.758 6.248 45.254 18.744c24.994 24.994 24.994 65.518 0 90.512l-146.744 146.744h357.49c35.346 0 64 28.654 64 64s-28.654 64-64 64h-357.49l146.746 146.746c24.994 24.994 24.994 65.516 0 90.51s-65.516 24.994-90.508 0l-256.002-256c-24.994-24.994-24.994-65.518-0.002-90.512z" />
59
+ <glyph unicode="&#xe3e3;" d="M1023.998-64h-1023.998v1024h1024l-0.002-1024zM128 832v-768h767.998l0.002 768h-768zM576 224l224 224-224 224v-160h-320v-128h320v-160z" />
60
+ <glyph unicode="&#xe3e7;" d="M0.002-64h1023.998v1024h-1024l0.002-1024zM896 832v-768h-767.998l-0.002 768h768zM448 224l-224 224 224 224v-160h320v-128h-320v-160z" />
61
+ <glyph unicode="&#xe409;" d="M512 960c-282.77 0-512-229.23-512-512s229.23-512 512-512 512 229.23 512 512-229.23 512-512 512zM576 224v160h-320v128h320v160l224-224-224-224z" />
62
+ <glyph unicode="&#xe40b;" d="M512 960c282.77 0 512-229.23 512-512s-229.23-512-512-512-512 229.23-512 512 229.23 512 512 512zM448 224v160h320v128h-320v160l-224-224 224-224z" />
63
+ <glyph unicode="&#xe415;" d="M0 640h64v-384h-64zM128 640h64v-384h-64zM256 640h64v-384h-64zM1024 448l-448 448v-256h-192v-384h192v-256z" />
64
+ <glyph unicode="&#xe417;" d="M960 640h64v-384h-64zM832 640h64v-384h-64zM704 640h64v-384h-64zM0 448l448 448v-256h192v-384h-192v-256z" />
65
+ <glyph unicode="&#xe48c;" d="M864 256c-45.16 0-85.92-18.738-115.012-48.83l-431.004 215.502c1.314 8.252 2.016 16.706 2.016 25.328s-0.702 17.076-2.016 25.326l431.004 215.502c29.092-30.090 69.852-48.828 115.012-48.828 88.366 0 160 71.634 160 160s-71.634 160-160 160-160-71.634-160-160c0-8.622 0.704-17.076 2.016-25.326l-431.004-215.504c-29.092 30.090-69.852 48.83-115.012 48.83-88.366 0-160-71.636-160-160 0-88.368 71.634-160 160-160 45.16 0 85.92 18.738 115.012 48.828l431.004-215.502c-1.312-8.25-2.016-16.704-2.016-25.326 0-88.368 71.634-160 160-160s160 71.632 160 160c0 88.364-71.634 160-160 160z" />
66
  </font>
67
  </defs>
68
  </svg>
assets/admin/layout/css/layout-rtl.css CHANGED
@@ -253,8 +253,8 @@
253
  {
254
  width: 235px;
255
  /* float: left;
256
- position: relative;
257
- margin-right: -100%;*/
258
  }
259
  .page-sidebar-tech-banker.navbar-collapse
260
  {
253
  {
254
  width: 235px;
255
  /* float: left;
256
+ position: relative;
257
+ margin-right: -100%;*/
258
  }
259
  .page-sidebar-tech-banker.navbar-collapse
260
  {
assets/admin/layout/css/mail-bank-custom.css CHANGED
@@ -183,3 +183,18 @@
183
  margin: 65px 0px 10px 0px;
184
  position: initial;
185
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
183
  margin: 65px 0px 10px 0px;
184
  position: initial;
185
  }
186
+ .premium-editions
187
+ {
188
+ float:right;
189
+ font-size:15px !important;
190
+ top:10px !important;
191
+ color:white !important;
192
+ margin-top:10px !important;
193
+ font-weight:500 !important;
194
+ text-decoration: none !important;
195
+
196
+ }
197
+ .premium-editions:hover
198
+ {
199
+ text-decoration: underline !important;
200
+ }
assets/global/img/icon.png CHANGED
Binary file
assets/global/plugins/custom/js/custom.js CHANGED
@@ -18,248 +18,248 @@
18
 
19
  , init: function (type, element, options)
20
  {
21
- var eventIn
22
- , eventOut
23
-
24
- this.type = type
25
- this.$element = $(element)
26
- this.options = this.getOptions(options)
27
- this.enabled = true
28
-
29
- if (this.options.trigger == 'click')
30
- {
31
- this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
32
- } else if (this.options.trigger != 'manual')
33
- {
34
- eventIn = this.options.trigger == 'hover' ? 'mouseenter' : 'focus'
35
- eventOut = this.options.trigger == 'hover' ? 'mouseleave' : 'blur'
36
- this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
37
- this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
38
- }
39
-
40
- this.options.selector ?
41
- (this._options = $.extend({}, this.options, {trigger: 'manual', selector: ''})) :
42
- this.fixTitle()
43
  }
44
 
45
  , getOptions: function (options)
46
  {
47
- options = $.extend({}, $.fn[this.type].defaults, options, this.$element.data())
48
 
49
- if (options.delay && typeof options.delay == 'number')
50
- {
51
- options.delay = {
52
- show: options.delay
53
- , hide: options.delay
54
- }
55
- }
56
 
57
- return options
58
  }
59
 
60
  , enter: function (e)
61
  {
62
- var self = $(e.currentTarget)[this.type](this._options).data(this.type)
63
-
64
- if (!self.options.delay || !self.options.delay.show)
65
- return self.show()
66
-
67
- clearTimeout(this.timeout)
68
- self.hoverState = 'in'
69
- this.timeout = setTimeout(function ()
70
- {
71
- if (self.hoverState == 'in')
72
- self.show()
73
- }, self.options.delay.show)
74
  }
75
 
76
  , leave: function (e)
77
  {
78
- var self = $(e.currentTarget)[this.type](this._options).data(this.type)
79
-
80
- if (this.timeout)
81
- clearTimeout(this.timeout)
82
- if (!self.options.delay || !self.options.delay.hide)
83
- return self.hide()
84
-
85
- self.hoverState = 'out'
86
- this.timeout = setTimeout(function ()
87
- {
88
- if (self.hoverState == 'out')
89
- self.hide()
90
- }, self.options.delay.hide)
91
  }
92
 
93
  , show: function ()
94
  {
95
- var $tip
96
- , inside
97
- , pos
98
- , actualWidth
99
- , actualHeight
100
- , placement
101
- , tp
102
-
103
- if (this.hasContent() && this.enabled)
104
- {
105
- $tip = this.tip()
106
- this.setContent()
107
-
108
- if (this.options.animation)
109
- {
110
- $tip.addClass('fade')
111
- }
112
-
113
- placement = typeof this.options.placement == 'function' ?
114
- this.options.placement.call(this, $tip[0], this.$element[0]) :
115
- this.options.placement
116
-
117
- inside = /in/.test(placement)
118
-
119
- $tip
120
- .detach()
121
- .css({top: 0, left: 0, display: 'block'})
122
- .insertAfter(this.$element)
123
-
124
- pos = this.getPosition(inside)
125
-
126
- actualWidth = $tip[0].offsetWidth
127
- actualHeight = $tip[0].offsetHeight
128
-
129
- switch (inside ? placement.split(' ')[1] : placement)
130
- {
131
- case 'bottom':
132
- tp = {top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2}
133
- break
134
- case 'top':
135
- tp = {top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2}
136
- break
137
- case 'left':
138
- tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth}
139
- break
140
- case 'right':
141
- tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width}
142
- break
143
- }
144
-
145
- $tip
146
- .offset(tp)
147
- .addClass(placement)
148
- .addClass('in')
149
- }
150
  }
151
 
152
  , setContent: function ()
153
  {
154
- var $tip = this.tip()
155
- , title = this.getTitle()
156
 
157
- $tip.find('.tooltip_tip-inner')[this.options.html ? 'html' : 'text'](title)
158
- $tip.removeClass('fade in top bottom left right')
159
  }
160
 
161
  , hide: function ()
162
  {
163
- var that = this
164
- , $tip = this.tip()
165
-
166
- $tip.removeClass('in')
167
-
168
- function removeWithAnimation()
169
- {
170
- var timeout = setTimeout(function ()
171
- {
172
- $tip.off($.support.transition.end).detach()
173
- }, 500)
174
-
175
- $tip.one($.support.transition.end, function ()
176
- {
177
- clearTimeout(timeout)
178
- $tip.detach()
179
- })
180
- }
181
-
182
- $.support.transition && this.$tip.hasClass('fade') ?
183
- removeWithAnimation() :
184
- $tip.detach()
185
-
186
- return this
187
  }
188
 
189
  , fixTitle: function ()
190
  {
191
- var $e = this.$element
192
- if ($e.attr('title') || typeof ($e.attr('data-original-title')) != 'string')
193
- {
194
- $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
195
- }
196
  }
197
 
198
  , hasContent: function ()
199
  {
200
- return this.getTitle()
201
  }
202
 
203
  , getPosition: function (inside)
204
  {
205
- return $.extend({}, (inside ? {top: 0, left: 0} : this.$element.offset()),
206
- {
207
- width: this.$element[0].offsetWidth
208
- , height: this.$element[0].offsetHeight
209
- })
210
  }
211
 
212
  , getTitle: function ()
213
  {
214
- var title
215
- , $e = this.$element
216
- , o = this.options
217
 
218
- title = $e.attr('data-original-title')
219
- || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title)
220
 
221
- return title
222
  }
223
 
224
  , tip: function ()
225
  {
226
- return this.$tip = this.$tip || $(this.options.template)
227
  }
228
 
229
  , validate: function ()
230
  {
231
- if (!this.$element[0].parentNode)
232
- {
233
- this.hide()
234
- this.$element = null
235
- this.options = null
236
- }
237
  }
238
 
239
  , enable: function ()
240
  {
241
- this.enabled = true
242
  }
243
 
244
  , disable: function ()
245
  {
246
- this.enabled = false
247
  }
248
 
249
  , toggleEnabled: function ()
250
  {
251
- this.enabled = !this.enabled
252
  }
253
 
254
  , toggle: function (e)
255
  {
256
- var self = $(e.currentTarget)[this.type](this._options).data(this.type)
257
- self[self.tip().hasClass('in') ? 'hide' : 'show']()
258
  }
259
 
260
  , destroy: function ()
261
  {
262
- this.hide().$element.off('.' + this.type).removeData(this.type)
263
  }
264
 
265
  }
@@ -274,13 +274,13 @@
274
  {
275
  return this.each(function ()
276
  {
277
- var $this = $(this)
278
- , data = $this.data('tooltip_tip')
279
- , options = typeof option == 'object' && option
280
- if (!data)
281
- $this.data('tooltip_tip', (data = new Tooltip(this, options)))
282
- if (typeof option == 'string')
283
- data[option]()
284
  })
285
  }
286
 
@@ -336,44 +336,44 @@
336
 
337
  if (!selector)
338
  {
339
- selector = $this.attr('href')
340
- selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
341
  }
342
 
343
  if ($this.parent('li').hasClass('active'))
344
- return
345
 
346
  var $previous = $ul.find('.active:last a')
347
  var hideEvent = $.Event('hide.bs.tab',
348
- {
349
- relatedTarget: $this[0]
350
- })
351
  var showEvent = $.Event('show.bs.tab',
352
- {
353
- relatedTarget: $previous[0]
354
- })
355
 
356
  $previous.trigger(hideEvent)
357
  $this.trigger(showEvent)
358
 
359
  if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented())
360
- return
361
 
362
  var $target = $(selector)
363
 
364
  this.activate($this.closest('li'), $ul)
365
  this.activate($target, $target.parent(), function ()
366
  {
367
- $previous.trigger
368
- ({
369
- type: 'hidden.bs.tab',
370
- relatedTarget: $this[0]
371
- })
372
- $this.trigger(
373
- {
374
- type: 'shown.bs.tab',
375
- relatedTarget: $previous[0]
376
- })
377
  })
378
  }
379
 
@@ -381,51 +381,51 @@
381
  {
382
  var $active = container.find('> .active')
383
  var transition = callback
384
- && $.support.transition
385
- && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length)
386
 
387
  function next()
388
  {
389
- $active
390
- .removeClass('active')
391
- .find('> .dropdown-menu > .active')
392
- .removeClass('active')
393
- .end()
394
- .find('[data-toggle="tab"]')
395
- .attr('aria-expanded', false)
396
-
397
- element
398
- .addClass('active')
399
- .find('[data-toggle="tab"]')
400
- .attr('aria-expanded', true)
401
-
402
- if (transition)
403
- {
404
- element[0].offsetWidth // reflow for transition
405
- element.addClass('in')
406
- } else
407
- {
408
- element.removeClass('fade')
409
- }
410
-
411
- if (element.parent('.dropdown-menu').length)
412
- {
413
- element
414
- .closest('li.dropdown')
415
- .addClass('active')
416
- .end()
417
- .find('[data-toggle="tab"]')
418
- .attr('aria-expanded', true)
419
- }
420
-
421
- callback && callback()
422
  }
423
 
424
  $active.length && transition ?
425
- $active
426
- .one('bsTransitionEnd', next)
427
- .emulateTransitionEnd(Tab.TRANSITION_DURATION) :
428
- next()
429
 
430
  $active.removeClass('in')
431
  }
@@ -438,13 +438,13 @@
438
  {
439
  return this.each(function ()
440
  {
441
- var $this = $(this)
442
- var data = $this.data('bs.tab')
443
 
444
- if (!data)
445
- $this.data('bs.tab', (data = new Tab(this)))
446
- if (typeof option == 'string')
447
- data[option]()
448
  })
449
  }
450
 
@@ -474,7 +474,7 @@
474
  }
475
 
476
  $(document)
477
- .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler)
478
- .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler)
479
 
480
  }(jQuery);
18
 
19
  , init: function (type, element, options)
20
  {
21
+ var eventIn
22
+ , eventOut
23
+
24
+ this.type = type
25
+ this.$element = $(element)
26
+ this.options = this.getOptions(options)
27
+ this.enabled = true
28
+
29
+ if (this.options.trigger == 'click')
30
+ {
31
+ this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
32
+ } else if (this.options.trigger != 'manual')
33
+ {
34
+ eventIn = this.options.trigger == 'hover' ? 'mouseenter' : 'focus'
35
+ eventOut = this.options.trigger == 'hover' ? 'mouseleave' : 'blur'
36
+ this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
37
+ this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
38
+ }
39
+
40
+ this.options.selector ?
41
+ (this._options = $.extend({}, this.options, {trigger: 'manual', selector: ''})) :
42
+ this.fixTitle()
43
  }
44
 
45
  , getOptions: function (options)
46
  {
47
+ options = $.extend({}, $.fn[this.type].defaults, options, this.$element.data())
48
 
49
+ if (options.delay && typeof options.delay == 'number')
50
+ {
51
+ options.delay = {
52
+ show: options.delay
53
+ , hide: options.delay
54
+ }
55
+ }
56
 
57
+ return options
58
  }
59
 
60
  , enter: function (e)
61
  {
62
+ var self = $(e.currentTarget)[this.type](this._options).data(this.type)
63
+
64
+ if (!self.options.delay || !self.options.delay.show)
65
+ return self.show()
66
+
67
+ clearTimeout(this.timeout)
68
+ self.hoverState = 'in'
69
+ this.timeout = setTimeout(function ()
70
+ {
71
+ if (self.hoverState == 'in')
72
+ self.show()
73
+ }, self.options.delay.show)
74
  }
75
 
76
  , leave: function (e)
77
  {
78
+ var self = $(e.currentTarget)[this.type](this._options).data(this.type)
79
+
80
+ if (this.timeout)
81
+ clearTimeout(this.timeout)
82
+ if (!self.options.delay || !self.options.delay.hide)
83
+ return self.hide()
84
+
85
+ self.hoverState = 'out'
86
+ this.timeout = setTimeout(function ()
87
+ {
88
+ if (self.hoverState == 'out')
89
+ self.hide()
90
+ }, self.options.delay.hide)
91
  }
92
 
93
  , show: function ()
94
  {
95
+ var $tip
96
+ , inside
97
+ , pos
98
+ , actualWidth
99
+ , actualHeight
100
+ , placement
101
+ , tp
102
+
103
+ if (this.hasContent() && this.enabled)
104
+ {
105
+ $tip = this.tip()
106
+ this.setContent()
107
+
108
+ if (this.options.animation)
109
+ {
110
+ $tip.addClass('fade')
111
+ }
112
+
113
+ placement = typeof this.options.placement == 'function' ?
114
+ this.options.placement.call(this, $tip[0], this.$element[0]) :
115
+ this.options.placement
116
+
117
+ inside = /in/.test(placement)
118
+
119
+ $tip
120
+ .detach()
121
+ .css({top: 0, left: 0, display: 'block'})
122
+ .insertAfter(this.$element)
123
+
124
+ pos = this.getPosition(inside)
125
+
126
+ actualWidth = $tip[0].offsetWidth
127
+ actualHeight = $tip[0].offsetHeight
128
+
129
+ switch (inside ? placement.split(' ')[1] : placement)
130
+ {
131
+ case 'bottom':
132
+ tp = {top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2}
133
+ break
134
+ case 'top':
135
+ tp = {top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2}
136
+ break
137
+ case 'left':
138
+ tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth}
139
+ break
140
+ case 'right':
141
+ tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width}
142
+ break
143
+ }
144
+
145
+ $tip
146
+ .offset(tp)
147
+ .addClass(placement)
148
+ .addClass('in')
149
+ }
150
  }
151
 
152
  , setContent: function ()
153
  {
154
+ var $tip = this.tip()
155
+ , title = this.getTitle()
156
 
157
+ $tip.find('.tooltip_tip-inner')[this.options.html ? 'html' : 'text'](title)
158
+ $tip.removeClass('fade in top bottom left right')
159
  }
160
 
161
  , hide: function ()
162
  {
163
+ var that = this
164
+ , $tip = this.tip()
165
+
166
+ $tip.removeClass('in')
167
+
168
+ function removeWithAnimation()
169
+ {
170
+ var timeout = setTimeout(function ()
171
+ {
172
+ $tip.off($.support.transition.end).detach()
173
+ }, 500)
174
+
175
+ $tip.one($.support.transition.end, function ()
176
+ {
177
+ clearTimeout(timeout)
178
+ $tip.detach()
179
+ })
180
+ }
181
+
182
+ $.support.transition && this.$tip.hasClass('fade') ?
183
+ removeWithAnimation() :
184
+ $tip.detach()
185
+
186
+ return this
187
  }
188
 
189
  , fixTitle: function ()
190
  {
191
+ var $e = this.$element
192
+ if ($e.attr('title') || typeof ($e.attr('data-original-title')) != 'string')
193
+ {
194
+ $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
195
+ }
196
  }
197
 
198
  , hasContent: function ()
199
  {
200
+ return this.getTitle()
201
  }
202
 
203
  , getPosition: function (inside)
204
  {
205
+ return $.extend({}, (inside ? {top: 0, left: 0} : this.$element.offset()),
206
+ {
207
+ width: this.$element[0].offsetWidth
208
+ , height: this.$element[0].offsetHeight
209
+ })
210
  }
211
 
212
  , getTitle: function ()
213
  {
214
+ var title
215
+ , $e = this.$element
216
+ , o = this.options
217
 
218
+ title = $e.attr('data-original-title')
219
+ || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title)
220
 
221
+ return title
222
  }
223
 
224
  , tip: function ()
225
  {
226
+ return this.$tip = this.$tip || $(this.options.template)
227
  }
228
 
229
  , validate: function ()
230
  {
231
+ if (!this.$element[0].parentNode)
232
+ {
233
+ this.hide()
234
+ this.$element = null
235
+ this.options = null
236
+ }
237
  }
238
 
239
  , enable: function ()
240
  {
241
+ this.enabled = true
242
  }
243
 
244
  , disable: function ()
245
  {
246
+ this.enabled = false
247
  }
248
 
249
  , toggleEnabled: function ()
250
  {
251
+ this.enabled = !this.enabled
252
  }
253
 
254
  , toggle: function (e)
255
  {
256
+ var self = $(e.currentTarget)[this.type](this._options).data(this.type)
257
+ self[self.tip().hasClass('in') ? 'hide' : 'show']()
258
  }
259
 
260
  , destroy: function ()
261
  {
262
+ this.hide().$element.off('.' + this.type).removeData(this.type)
263
  }
264
 
265
  }
274
  {
275
  return this.each(function ()
276
  {
277
+ var $this = $(this)
278
+ , data = $this.data('tooltip_tip')
279
+ , options = typeof option == 'object' && option
280
+ if (!data)
281
+ $this.data('tooltip_tip', (data = new Tooltip(this, options)))
282
+ if (typeof option == 'string')
283
+ data[option]()
284
  })
285
  }
286
 
336
 
337
  if (!selector)
338
  {
339
+ selector = $this.attr('href')
340
+ selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
341
  }
342
 
343
  if ($this.parent('li').hasClass('active'))
344
+ return
345
 
346
  var $previous = $ul.find('.active:last a')
347
  var hideEvent = $.Event('hide.bs.tab',
348
+ {
349
+ relatedTarget: $this[0]
350
+ })
351
  var showEvent = $.Event('show.bs.tab',
352
+ {
353
+ relatedTarget: $previous[0]
354
+ })
355
 
356
  $previous.trigger(hideEvent)
357
  $this.trigger(showEvent)
358
 
359
  if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented())
360
+ return
361
 
362
  var $target = $(selector)
363
 
364
  this.activate($this.closest('li'), $ul)
365
  this.activate($target, $target.parent(), function ()
366
  {
367
+ $previous.trigger
368
+ ({
369
+ type: 'hidden.bs.tab',
370
+ relatedTarget: $this[0]
371
+ })
372
+ $this.trigger(
373
+ {
374
+ type: 'shown.bs.tab',
375
+ relatedTarget: $previous[0]
376
+ })
377
  })
378
  }
379
 
381
  {
382
  var $active = container.find('> .active')
383
  var transition = callback
384
+ && $.support.transition
385
+ && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length)
386
 
387
  function next()
388
  {
389
+ $active
390
+ .removeClass('active')
391
+ .find('> .dropdown-menu > .active')
392
+ .removeClass('active')
393
+ .end()
394
+ .find('[data-toggle="tab"]')
395
+ .attr('aria-expanded', false)
396
+
397
+ element
398
+ .addClass('active')
399
+ .find('[data-toggle="tab"]')
400
+ .attr('aria-expanded', true)
401
+
402
+ if (transition)
403
+ {
404
+ element[0].offsetWidth // reflow for transition
405
+ element.addClass('in')
406
+ } else
407
+ {
408
+ element.removeClass('fade')
409
+ }
410
+
411
+ if (element.parent('.dropdown-menu').length)
412
+ {
413
+ element
414
+ .closest('li.dropdown')
415
+ .addClass('active')
416
+ .end()
417
+ .find('[data-toggle="tab"]')
418
+ .attr('aria-expanded', true)
419
+ }
420
+
421
+ callback && callback()
422
  }
423
 
424
  $active.length && transition ?
425
+ $active
426
+ .one('bsTransitionEnd', next)
427
+ .emulateTransitionEnd(Tab.TRANSITION_DURATION) :
428
+ next()
429
 
430
  $active.removeClass('in')
431
  }
438
  {
439
  return this.each(function ()
440
  {
441
+ var $this = $(this)
442
+ var data = $this.data('bs.tab')
443
 
444
+ if (!data)
445
+ $this.data('bs.tab', (data = new Tab(this)))
446
+ if (typeof option == 'string')
447
+ data[option]()
448
  })
449
  }
450
 
474
  }
475
 
476
  $(document)
477
+ .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler)
478
+ .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler)
479
 
480
  }(jQuery);
assets/global/plugins/datatables/media/js/jquery.datatables.js CHANGED
@@ -1,3 +1,3 @@
1
  !function(t, e, n){!function(t){"use strict"; "function" == typeof define && define.amd?define("datatables", ["jquery"], t):"object" == typeof exports?module.exports = t(require("jquery")):jQuery && !jQuery.fn.dataTable && t(jQuery)}(function(a){"use strict"; function r(t){var e, n, o = "a aa ai ao as b fn i m o s ", i = {}; a.each(t, function(a, s){e = a.match(/^([^A-Z]+?)([A-Z])/), e && - 1 !== o.indexOf(e[1] + " ") && (n = a.replace(e[0], e[2].toLowerCase()), i[n] = a, "o" === e[1] && r(t[a]))}), t._hungarianMap = i}function o(t, e, i){t._hungarianMap || r(t); var s; a.each(e, function(r, l){s = t._hungarianMap[r], s === n || !i && e[s] !== n || ("o" === s.charAt(0)?(e[s] || (e[s] = {}), a.extend(!0, e[s], e[r]), o(t[s], e[s], i)):e[s] = e[r])})}function i(t){var e = qt.defaults.oLanguage, n = t.sZeroRecords; !t.sEmptyTable && n && "No data available in table" === e.sEmptyTable && Nt(t, t, "sZeroRecords", "sEmptyTable"), !t.sLoadingRecords && n && "Loading..." === e.sLoadingRecords && Nt(t, t, "sZeroRecords", "sLoadingRecords"), t.sInfoThousands && (t.sThousands = t.sInfoThousands); var a = t.sDecimal; a && Xt(a)}function s(t){be(t, "ordering", "bSort"), be(t, "orderMulti", "bSortMulti"), be(t, "orderClasses", "bSortClasses"), be(t, "orderCellsTop", "bSortCellsTop"), be(t, "order", "aaSorting"), be(t, "orderFixed", "aaSortingFixed"), be(t, "paging", "bPaginate"), be(t, "pagingType", "sPaginationType"), be(t, "pageLength", "iDisplayLength"), be(t, "searching", "bFilter"), "boolean" == typeof t.sScrollX && (t.sScrollX = t.sScrollX?"100%":""); var e = t.aoSearchCols; if (e)for (var n = 0, a = e.length; a > n; n++)e[n] && o(qt.models.oSearch, e[n])}function l(t){be(t, "orderable", "bSortable"), be(t, "orderData", "aDataSort"), be(t, "orderSequence", "asSorting"), be(t, "orderDataType", "sortDataType"); var e = t.aDataSort; e && !a.isArray(e) && (t.aDataSort = [e])}function u(t){if (!qt.__browser){var e = {}; qt.__browser = e; var n = a("<div/>").css({position:"fixed", top:0, left:0, height:1, width:1, overflow:"hidden"}).append(a("<div/>").css({position:"absolute", top:1, left:1, width:100, overflow:"scroll"}).append(a("<div/>").css({width:"100%", height:10}))).appendTo("body"), r = n.children(), o = r.children(); e.barWidth = r[0].offsetWidth - r[0].clientWidth, e.bScrollOversize = 100 === o[0].offsetWidth && 100 !== r[0].clientWidth, e.bScrollbarLeft = 1 !== Math.round(o.offset().left), e.bBounding = n[0].getBoundingClientRect().width?!0:!1, n.remove()}a.extend(t.oBrowser, qt.__browser), t.oScroll.iBarWidth = qt.__browser.barWidth}function c(t, e, a, r, o, i){var s, l = r, u = !1; for (a !== n && (s = a, u = !0); l !== o; )t.hasOwnProperty(l) && (s = u?e(s, t[l], l, t):t[l], u = !0, l += i); return s}function f(t, n){var r = qt.defaults.column, o = t.aoColumns.length, i = a.extend({}, qt.models.oColumn, r, {nTh:n?n:e.createElement("th"), sTitle:r.sTitle?r.sTitle:n?n.innerHTML:"", aDataSort:r.aDataSort?r.aDataSort:[o], mData:r.mData?r.mData:o, idx:o}); t.aoColumns.push(i); var s = t.aoPreSearchCols; s[o] = a.extend({}, qt.models.oSearch, s[o]), d(t, o, a(n).data())}function d(t, e, r){var i = t.aoColumns[e], s = t.oClasses, u = a(i.nTh); if (!i.sWidthOrig){i.sWidthOrig = u.attr("width") || null; var c = (u.attr("style") || "").match(/width:\s*(\d+[pxem%]+)/); c && (i.sWidthOrig = c[1])}r !== n && null !== r && (l(r), o(qt.defaults.column, r), r.mDataProp === n || r.mData || (r.mData = r.mDataProp), r.sType && (i._sManualType = r.sType), r.className && !r.sClass && (r.sClass = r.className), a.extend(i, r), Nt(i, r, "sWidth", "sWidthOrig"), r.iDataSort !== n && (i.aDataSort = [r.iDataSort]), Nt(i, r, "aDataSort")); var f = i.mData, d = I(f), h = i.mRender?I(i.mRender):null, p = function(t){return"string" == typeof t && - 1 !== t.indexOf("@")}; i._bAttrSrc = a.isPlainObject(f) && (p(f.sort) || p(f.type) || p(f.filter)), i.fnGetData = function(t, e, a){var r = d(t, e, n, a); return h && e?h(r, e, t, a):r}, i.fnSetData = function(t, e, n){return A(f)(t, e, n)}, "number" != typeof f && (t._rowReadObject = !0), t.oFeatures.bSort || (i.bSortable = !1, u.addClass(s.sSortableNone)); var g = - 1 !== a.inArray("asc", i.asSorting), b = - 1 !== a.inArray("desc", i.asSorting); i.bSortable && (g || b)?g && !b?(i.sSortingClass = s.sSortableAsc, i.sSortingClassJUI = s.sSortJUIAscAllowed):!g && b?(i.sSortingClass = s.sSortableDesc, i.sSortingClassJUI = s.sSortJUIDescAllowed):(i.sSortingClass = s.sSortable, i.sSortingClassJUI = s.sSortJUI):(i.sSortingClass = s.sSortableNone, i.sSortingClassJUI = "")}function h(t){if (t.oFeatures.bAutoWidth !== !1){var e = t.aoColumns; St(t); for (var n = 0, a = e.length; a > n; n++)e[n].nTh.style.width = e[n].sWidth}var r = t.oScroll; ("" !== r.sY || "" !== r.sX) && bt(t), Wt(t, null, "column-sizing", [t])}function p(t, e){var n = v(t, "bVisible"); return"number" == typeof n[e]?n[e]:null}function g(t, e){var n = v(t, "bVisible"), r = a.inArray(e, n); return - 1 !== r?r:null}function b(t){return v(t, "bVisible").length}function v(t, e){var n = []; return a.map(t.aoColumns, function(t, a){t[e] && n.push(a)}), n}function S(t){var e, a, r, o, i, s, l, u, c, f = t.aoColumns, d = t.aoData, h = qt.ext.type.detect; for (e = 0, a = f.length; a > e; e++)if (l = f[e], c = [], !l.sType && l._sManualType)l.sType = l._sManualType; else if (!l.sType){for (r = 0, o = h.length; o > r; r++){for (i = 0, s = d.length; s > i && (c[i] === n && (c[i] = w(t, i, e, "type")), u = h[r](c[i], t), u || r === h.length - 1) && "html" !== u; i++); if (u){l.sType = u; break}}l.sType || (l.sType = "string")}}function m(t, e, r, o){var i, s, l, u, c, d, h, p = t.aoColumns; if (e)for (i = e.length - 1; i >= 0; i--){h = e[i]; var g = h.targets !== n?h.targets:h.aTargets; for (a.isArray(g) || (g = [g]), l = 0, u = g.length; u > l; l++)if ("number" == typeof g[l] && g[l] >= 0){for (; p.length <= g[l]; )f(t); o(g[l], h)} else if ("number" == typeof g[l] && g[l] < 0)o(p.length + g[l], h); else if ("string" == typeof g[l])for (c = 0, d = p.length; d > c; c++)("_all" == g[l] || a(p[c].nTh).hasClass(g[l])) && o(c, h)}if (r)for (i = 0, s = r.length; s > i; i++)o(i, r[i])}function D(t, e, r, o){var i = t.aoData.length, s = a.extend(!0, {}, qt.models.oRow, {src:r?"dom":"data", idx:i}); s._aData = e, t.aoData.push(s); for (var l = t.aoColumns, u = 0, c = l.length; c > u; u++)l[u].sType = null; t.aiDisplayMaster.push(i); var f = t.rowIdFn(e); return f !== n && (t.aIds[f] = s), (r || !t.oFeatures.bDeferRender) && H(t, i, r, o), i}function y(t, e){var n; return e instanceof a || (e = a(e)), e.map(function(e, a){return n = j(t, a), D(t, n.data, a, n.cells)})}function _(t, e){return e._DT_RowIndex !== n?e._DT_RowIndex:null}function T(t, e, n){return a.inArray(n, t.aoData[e].anCells)}function w(t, e, a, r){var o = t.iDraw, i = t.aoColumns[a], s = t.aoData[e]._aData, l = i.sDefaultContent, u = i.fnGetData(s, r, {settings:t, row:e, col:a}); if (u === n)return t.iDrawError != o && null === l && (Ht(t, 0, "Requested unknown parameter " + ("function" == typeof i.mData?"{function}":"'" + i.mData + "'") + " for row " + e, 4), t.iDrawError = o), l; if (u !== s && null !== u || null === l){if ("function" == typeof u)return u.call(s)} else u = l; return null === u && "display" == r?"":u}function C(t, e, n, a){var r = t.aoColumns[n], o = t.aoData[e]._aData; r.fnSetData(o, a, {settings:t, row:e, col:n})}function x(t){return a.map(t.match(/(\\.|[^\.])+/g) || [""], function(t){return t.replace(/\\./g, ".")})}function I(t){if (a.isPlainObject(t)){var e = {}; return a.each(t, function(t, n){n && (e[t] = I(n))}), function(t, a, r, o){var i = e[a] || e._; return i !== n?i(t, a, r, o):t}}if (null === t)return function(t){return t}; if ("function" == typeof t)return function(e, n, a, r){return t(e, n, a, r)}; if ("string" != typeof t || - 1 === t.indexOf(".") && - 1 === t.indexOf("[") && - 1 === t.indexOf("("))return function(e, n){return e[t]}; var r = function(t, e, o){var i, s, l, u; if ("" !== o)for (var c = x(o), f = 0, d = c.length; d > f; f++){if (i = c[f].match(ve), s = c[f].match(Se), i){if (c[f] = c[f].replace(ve, ""), "" !== c[f] && (t = t[c[f]]), l = [], c.splice(0, f + 1), u = c.join("."), a.isArray(t))for (var h = 0, p = t.length; p > h; h++)l.push(r(t[h], e, u)); var g = i[0].substring(1, i[0].length - 1); t = "" === g?l:l.join(g); break}if (s)c[f] = c[f].replace(Se, ""), t = t[c[f]](); else{if (null === t || t[c[f]] === n)return n; t = t[c[f]]}}return t}; return function(e, n){return r(e, n, t)}}function A(t){if (a.isPlainObject(t))return A(t._); if (null === t)return function(){}; if ("function" == typeof t)return function(e, n, a){t(e, "set", n, a)}; if ("string" != typeof t || - 1 === t.indexOf(".") && - 1 === t.indexOf("[") && - 1 === t.indexOf("("))return function(e, n){e[t] = n}; var e = function(t, r, o){for (var i, s, l, u, c, f = x(o), d = f[f.length - 1], h = 0, p = f.length - 1; p > h; h++){if (s = f[h].match(ve), l = f[h].match(Se), s){if (f[h] = f[h].replace(ve, ""), t[f[h]] = [], i = f.slice(), i.splice(0, h + 1), c = i.join("."), a.isArray(r))for (var g = 0, b = r.length; b > g; g++)u = {}, e(u, r[g], c), t[f[h]].push(u); else t[f[h]] = r; return}l && (f[h] = f[h].replace(Se, ""), t = t[f[h]](r)), (null === t[f[h]] || t[f[h]] === n) && (t[f[h]] = {}), t = t[f[h]]}d.match(Se)?t = t[d.replace(Se, "")](r):t[d.replace(ve, "")] = r}; return function(n, a){return e(n, a, t)}}function F(t){return ce(t.aoData, "_aData")}function L(t){t.aoData.length = 0, t.aiDisplayMaster.length = 0, t.aiDisplay.length = 0, t.aIds = {}}function P(t, e, a){for (var r = - 1, o = 0, i = t.length; i > o; o++)t[o] == e?r = o:t[o] > e && t[o]--; - 1 != r && a === n && t.splice(r, 1)}function R(t, e, a, r){var o, i, s = t.aoData[e], l = function(n, a){for (; n.childNodes.length; )n.removeChild(n.firstChild); n.innerHTML = w(t, e, a, "display")}; if ("dom" !== a && (a && "auto" !== a || "dom" !== s.src)){var u = s.anCells; if (u)if (r !== n)l(u[r], r); else for (o = 0, i = u.length; i > o; o++)l(u[o], o)} else s._aData = j(t, s, r, r === n?n:s._aData).data; s._aSortData = null, s._aFilterData = null; var c = t.aoColumns; if (r !== n)c[r].sType = null; else{for (o = 0, i = c.length; i > o; o++)c[o].sType = null; N(t, s)}}function j(t, e, r, o){var i, s, l, u = [], c = e.firstChild, f = 0, d = t.aoColumns, h = t._rowReadObject; o = o !== n?o:h?{}:[]; var p = function(t, e){if ("string" == typeof t){var n = t.indexOf("@"); if ( - 1 !== n){var a = t.substring(n + 1), r = A(t); r(o, e.getAttribute(a))}}}, g = function(t){if (r === n || r === f)if (s = d[f], l = a.trim(t.innerHTML), s && s._bAttrSrc){var e = A(s.mData._); e(o, l), p(s.mData.sort, t), p(s.mData.type, t), p(s.mData.filter, t)} else h?(s._setter || (s._setter = A(s.mData)), s._setter(o, l)):o[f] = l; f++}; if (c)for (; c; )i = c.nodeName.toUpperCase(), ("TD" == i || "TH" == i) && (g(c), u.push(c)), c = c.nextSibling; else{u = e.anCells; for (var b = 0, v = u.length; v > b; b++)g(u[b])}var S = c?e:e.nTr; if (S){var m = S.getAttribute("id"); m && A(t.rowId)(o, m)}return{data:o, cells:u}}function H(t, n, a, r){var o, i, s, l, u, c = t.aoData[n], f = c._aData, d = []; if (null === c.nTr){for (o = a || e.createElement("tr"), c.nTr = o, c.anCells = d, o._DT_RowIndex = n, N(t, c), l = 0, u = t.aoColumns.length; u > l; l++)s = t.aoColumns[l], i = a?r[l]:e.createElement(s.sCellType), d.push(i), (!a || s.mRender || s.mData !== l) && (i.innerHTML = w(t, n, l, "display")), s.sClass && (i.className += " " + s.sClass), s.bVisible && !a?o.appendChild(i):!s.bVisible && a && i.parentNode.removeChild(i), s.fnCreatedCell && s.fnCreatedCell.call(t.oInstance, i, w(t, n, l), f, n, l); Wt(t, "aoRowCreatedCallback", null, [o, f, n])}c.nTr.setAttribute("role", "row")}function N(t, e){var n = e.nTr, r = e._aData; if (n){var o = t.rowIdFn(r); if (o && (n.id = o), r.DT_RowClass){var i = r.DT_RowClass.split(" "); e.__rowc = e.__rowc?ge(e.__rowc.concat(i)):i, a(n).removeClass(e.__rowc.join(" ")).addClass(r.DT_RowClass)}r.DT_RowAttr && a(n).attr(r.DT_RowAttr), r.DT_RowData && a(n).data(r.DT_RowData)}}function k(t){var e, n, r, o, i, s = t.nTHead, l = t.nTFoot, u = 0 === a("th, td", s).length, c = t.oClasses, f = t.aoColumns; for (u && (o = a("<tr/>").appendTo(s)), e = 0, n = f.length; n > e; e++)i = f[e], r = a(i.nTh).addClass(i.sClass), u && r.appendTo(o), t.oFeatures.bSort && (r.addClass(i.sSortingClass), i.bSortable !== !1 && (r.attr("tabindex", t.iTabIndex).attr("aria-controls", t.sTableId), At(t, i.nTh, e))), i.sTitle != r[0].innerHTML && r.html(i.sTitle), Et(t, "header")(t, r, i, c); if (u && E(t.aoHeader, s), a(s).find(">tr").attr("role", "row"), a(s).find(">tr>th, >tr>td").addClass(c.sHeaderTH), a(l).find(">tr>th, >tr>td").addClass(c.sFooterTH), null !== l){var d = t.aoFooter[0]; for (e = 0, n = d.length; n > e; e++)i = f[e], i.nTf = d[e].cell, i.sClass && a(i.nTf).addClass(i.sClass)}}function O(t, e, r){var o, i, s, l, u, c, f, d, h, p = [], g = [], b = t.aoColumns.length; if (e){for (r === n && (r = !1), o = 0, i = e.length; i > o; o++){for (p[o] = e[o].slice(), p[o].nTr = e[o].nTr, s = b - 1; s >= 0; s--)t.aoColumns[s].bVisible || r || p[o].splice(s, 1); g.push([])}for (o = 0, i = p.length; i > o; o++){if (f = p[o].nTr)for (; c = f.firstChild; )f.removeChild(c); for (s = 0, l = p[o].length; l > s; s++)if (d = 1, h = 1, g[o][s] === n){for (f.appendChild(p[o][s].cell), g[o][s] = 1; p[o + d] !== n && p[o][s].cell == p[o + d][s].cell; )g[o + d][s] = 1, d++; for (; p[o][s + h] !== n && p[o][s].cell == p[o][s + h].cell; ){for (u = 0; d > u; u++)g[o + u][s + h] = 1; h++}a(p[o][s].cell).attr("rowspan", d).attr("colspan", h)}}}}function M(t){var e = Wt(t, "aoPreDrawCallback", "preDraw", [t]); if ( - 1 !== a.inArray(!1, e))return void pt(t, !1); var r = [], o = 0, i = t.asStripeClasses, s = i.length, l = (t.aoOpenRows.length, t.oLanguage), u = t.iInitDisplayStart, c = "ssp" == Bt(t), f = t.aiDisplay; t.bDrawing = !0, u !== n && - 1 !== u && (t._iDisplayStart = c?u:u >= t.fnRecordsDisplay()?0:u, t.iInitDisplayStart = - 1); var d = t._iDisplayStart, h = t.fnDisplayEnd(); if (t.bDeferLoading)t.bDeferLoading = !1, t.iDraw++, pt(t, !1); else if (c){if (!t.bDestroying && !X(t))return} else t.iDraw++; if (0 !== f.length)for (var p = c?0:d, g = c?t.aoData.length:h, v = p; g > v; v++){var S = f[v], m = t.aoData[S]; null === m.nTr && H(t, S); var D = m.nTr; if (0 !== s){var y = i[o % s]; m._sRowStripe != y && (a(D).removeClass(m._sRowStripe).addClass(y), m._sRowStripe = y)}Wt(t, "aoRowCallback", null, [D, m._aData, o, v]), r.push(D), o++} else{var _ = l.sZeroRecords; 1 == t.iDraw && "ajax" == Bt(t)?_ = l.sLoadingRecords:l.sEmptyTable && 0 === t.fnRecordsTotal() && (_ = l.sEmptyTable), r[0] = a("<tr/>", {"class":s?i[0]:""}).append(a("<td />", {valign:"top", colSpan:b(t), "class":t.oClasses.sRowEmpty}).html(_))[0]}Wt(t, "aoHeaderCallback", "header", [a(t.nTHead).children("tr")[0], F(t), d, h, f]), Wt(t, "aoFooterCallback", "footer", [a(t.nTFoot).children("tr")[0], F(t), d, h, f]); var T = a(t.nTBody); T.children().detach(), T.append(a(r)), Wt(t, "aoDrawCallback", "draw", [t]), t.bSorted = !1, t.bFiltered = !1, t.bDrawing = !1}function W(t, e){var n = t.oFeatures, a = n.bSort, r = n.bFilter; a && Ct(t), r?z(t, t.oPreviousSearch):t.aiDisplay = t.aiDisplayMaster.slice(), e !== !0 && (t._iDisplayStart = 0), t._drawHold = e, M(t), t._drawHold = !1}function U(t){var e = t.oClasses, n = a(t.nTable), r = a("<div/>").insertBefore(n), o = t.oFeatures, i = a("<div/>", {id:t.sTableId + "_wrapper", "class":e.sWrapper + (t.nTFoot?"":" " + e.sNoFooter)}); t.nHolding = r[0], t.nTableWrapper = i[0], t.nTableReinsertBefore = t.nTable.nextSibling; for (var s, l, u, c, f, d, h = t.sDom.split(""), p = 0; p < h.length; p++){if (s = null, l = h[p], "<" == l){if (u = a("<div/>")[0], c = h[p + 1], "'" == c || '"' == c){for (f = "", d = 2; h[p + d] != c; )f += h[p + d], d++; if ("H" == f?f = e.sJUIHeader:"F" == f && (f = e.sJUIFooter), - 1 != f.indexOf(".")){var g = f.split("."); u.id = g[0].substr(1, g[0].length - 1), u.className = g[1]} else"#" == f.charAt(0)?u.id = f.substr(1, f.length - 1):u.className = f; p += d}i.append(u), i = a(u)} else if (">" == l)i = i.parent(); else if ("l" == l && o.bPaginate && o.bLengthChange)s = ct(t); else if ("f" == l && o.bFilter)s = $(t); else if ("r" == l && o.bProcessing)s = ht(t); else if ("t" == l)s = gt(t); else if ("i" == l && o.bInfo)s = rt(t); else if ("p" == l && o.bPaginate)s = ft(t); else if (0 !== qt.ext.feature.length)for (var b = qt.ext.feature, v = 0, S = b.length; S > v; v++)if (l == b[v].cFeature){s = b[v].fnInit(t); break}if (s){var m = t.aanFeatures; m[l] || (m[l] = []), m[l].push(s), i.append(s)}}r.replaceWith(i), t.nHolding = null}function E(t, e){var n, r, o, i, s, l, u, c, f, d, h, p = a(e).children("tr"), g = function(t, e, n){for (var a = t[e]; a[n]; )n++; return n}; for (t.splice(0, t.length), o = 0, l = p.length; l > o; o++)t.push([]); for (o = 0, l = p.length; l > o; o++)for (n = p[o], c = 0, r = n.firstChild; r; ){if ("TD" == r.nodeName.toUpperCase() || "TH" == r.nodeName.toUpperCase())for (f = 1 * r.getAttribute("colspan"), d = 1 * r.getAttribute("rowspan"), f = f && 0 !== f && 1 !== f?f:1, d = d && 0 !== d && 1 !== d?d:1, u = g(t, o, c), h = 1 === f?!0:!1, s = 0; f > s; s++)for (i = 0; d > i; i++)t[o + i][u + s] = {cell:r, unique:h}, t[o + i].nTr = n; r = r.nextSibling}}function B(t, e, n){var a = []; n || (n = t.aoHeader, e && (n = [], E(n, e))); for (var r = 0, o = n.length; o > r; r++)for (var i = 0, s = n[r].length; s > i; i++)!n[r][i].unique || a[i] && t.bSortCellsTop || (a[i] = n[r][i].cell); return a}function J(t, e, n){if (Wt(t, "aoServerParams", "serverParams", [e]), e && a.isArray(e)){var r = {}, o = /(.*?)\[\]$/; a.each(e, function(t, e){var n = e.name.match(o); if (n){var a = n[0]; r[a] || (r[a] = []), r[a].push(e.value)} else r[e.name] = e.value}), e = r}var i, s = t.ajax, l = t.oInstance, u = function(e){Wt(t, null, "xhr", [t, e, t.jqXHR]), n(e)}; if (a.isPlainObject(s) && s.data){i = s.data; var c = a.isFunction(i)?i(e, t):i; e = a.isFunction(i) && c?c:a.extend(!0, e, c), delete s.data}var f = {data:e, success:function(e){var n = e.error || e.sError; n && Ht(t, 0, n), t.json = e, u(e)}, dataType:"json", cache:!1, type:t.sServerMethod, error:function(e, n, r){var o = Wt(t, null, "xhr", [t, null, t.jqXHR]); - 1 === a.inArray(!0, o) && ("parsererror" == n?Ht(t, 0, "Invalid JSON response", 1):4 === e.readyState && Ht(t, 0, "Ajax error", 7)), pt(t, !1)}}; t.oAjaxData = e, Wt(t, null, "preXhr", [t, e]), t.fnServerData?t.fnServerData.call(l, t.sAjaxSource, a.map(e, function(t, e){return{name:e, value:t}}), u, t):t.sAjaxSource || "string" == typeof s?t.jqXHR = a.ajax(a.extend(f, {url:s || t.sAjaxSource})):a.isFunction(s)?t.jqXHR = s.call(l, e, u, t):(t.jqXHR = a.ajax(a.extend(f, s)), s.data = i)}function X(t){return t.bAjaxDataGet?(t.iDraw++, pt(t, !0), J(t, V(t), function(e){q(t, e)}), !1):!0}function V(t){var e, n, r, o, i = t.aoColumns, s = i.length, l = t.oFeatures, u = t.oPreviousSearch, c = t.aoPreSearchCols, f = [], d = wt(t), h = t._iDisplayStart, p = l.bPaginate !== !1?t._iDisplayLength: - 1, g = function(t, e){f.push({name:t, value:e})}; g("sEcho", t.iDraw), g("iColumns", s), g("sColumns", ce(i, "sName").join(",")), g("iDisplayStart", h), g("iDisplayLength", p); var b = {draw:t.iDraw, columns:[], order:[], start:h, length:p, search:{value:u.sSearch, regex:u.bRegex}}; for (e = 0; s > e; e++)r = i[e], o = c[e], n = "function" == typeof r.mData?"function":r.mData, b.columns.push({data:n, name:r.sName, searchable:r.bSearchable, orderable:r.bSortable, search:{value:o.sSearch, regex:o.bRegex}}), g("mDataProp_" + e, n), l.bFilter && (g("sSearch_" + e, o.sSearch), g("bRegex_" + e, o.bRegex), g("bSearchable_" + e, r.bSearchable)), l.bSort && g("bSortable_" + e, r.bSortable); l.bFilter && (g("sSearch", u.sSearch), g("bRegex", u.bRegex)), l.bSort && (a.each(d, function(t, e){b.order.push({column:e.col, dir:e.dir}), g("iSortCol_" + t, e.col), g("sSortDir_" + t, e.dir)}), g("iSortingCols", d.length)); var v = qt.ext.legacy.ajax; return null === v?t.sAjaxSource?f:b:v?f:b}function q(t, e){var a = function(t, a){return e[t] !== n?e[t]:e[a]}, r = G(t, e), o = a("sEcho", "draw"), i = a("iTotalRecords", "recordsTotal"), s = a("iTotalDisplayRecords", "recordsFiltered"); if (o){if (1 * o < t.iDraw)return; t.iDraw = 1 * o}L(t), t._iRecordsTotal = parseInt(i, 10), t._iRecordsDisplay = parseInt(s, 10); for (var l = 0, u = r.length; u > l; l++)D(t, r[l]); t.aiDisplay = t.aiDisplayMaster.slice(), t.bAjaxDataGet = !1, M(t), t._bInitComplete || lt(t, e), t.bAjaxDataGet = !0, pt(t, !1)}function G(t, e){var r = a.isPlainObject(t.ajax) && t.ajax.dataSrc !== n?t.ajax.dataSrc:t.sAjaxDataProp; return"data" === r?e.aaData || e[r]:"" !== r?I(r)(e):e}function $(t){var n = t.oClasses, r = t.sTableId, o = t.oLanguage, i = t.oPreviousSearch, s = t.aanFeatures, l = '<input type="search" class="' + n.sFilterInput + '"/>', u = o.sSearch; u = u.match(/_INPUT_/)?u.replace("_INPUT_", l):u + l; var c = a("<div/>", {id:s.f?null:r + "_filter", "class":n.sFilter}).append(a("<label/>").append(u)), f = function(){var e = (s.f, this.value?this.value:""); e != i.sSearch && (z(t, {sSearch:e, bRegex:i.bRegex, bSmart:i.bSmart, bCaseInsensitive:i.bCaseInsensitive}), t._iDisplayStart = 0, M(t))}, d = null !== t.searchDelay?t.searchDelay:"ssp" === Bt(t)?400:0, h = a("input", c).val(i.sSearch).attr("placeholder", o.sSearchPlaceholder).bind("keyup.DT search.DT input.DT paste.DT cut.DT", d?mt(f, d):f).bind("keypress.DT", function(t){return 13 == t.keyCode?!1:void 0}).attr("aria-controls", r); return a(t.nTable).on("search.dt.DT", function(n, a){if (t === a)try{h[0] !== e.activeElement && h.val(i.sSearch)} catch (r){}}), c[0]}function z(t, e, a){var r = t.oPreviousSearch, o = t.aoPreSearchCols, i = function(t){r.sSearch = t.sSearch, r.bRegex = t.bRegex, r.bSmart = t.bSmart, r.bCaseInsensitive = t.bCaseInsensitive}, s = function(t){return t.bEscapeRegex !== n?!t.bEscapeRegex:t.bRegex}; if (S(t), "ssp" != Bt(t)){Z(t, e.sSearch, a, s(e), e.bSmart, e.bCaseInsensitive), i(e); for (var l = 0; l < o.length; l++)Q(t, o[l].sSearch, l, s(o[l]), o[l].bSmart, o[l].bCaseInsensitive); Y(t)} else i(e); t.bFiltered = !0, Wt(t, null, "search", [t])}function Y(t){for (var e, n, r = qt.ext.search, o = t.aiDisplay, i = 0, s = r.length; s > i; i++){for (var l = [], u = 0, c = o.length; c > u; u++)n = o[u], e = t.aoData[n], r[i](t, e._aFilterData, n, e._aData, u) && l.push(n); o.length = 0, a.merge(o, l)}}function Q(t, e, n, a, r, o){if ("" !== e)for (var i, s = t.aiDisplay, l = K(e, a, r, o), u = s.length - 1; u >= 0; u--)i = t.aoData[s[u]]._aFilterData[n], l.test(i) || s.splice(u, 1)}function Z(t, e, n, a, r, o){var i, s, l, u = K(e, a, r, o), c = t.oPreviousSearch.sSearch, f = t.aiDisplayMaster; if (0 !== qt.ext.search.length && (n = !0), s = et(t), e.length <= 0)t.aiDisplay = f.slice(); else for ((s || n || c.length > e.length || 0 !== e.indexOf(c) || t.bSorted) && (t.aiDisplay = f.slice()), i = t.aiDisplay, l = i.length - 1; l >= 0; l--)u.test(t.aoData[i[l]]._sFilterRow) || i.splice(l, 1)}function K(t, e, n, r){if (t = e?t:tt(t), n){var o = a.map(t.match(/"[^"]+"|[^ ]+/g) || [""], function(t){if ('"' === t.charAt(0)){var e = t.match(/^"(.*)"$/); t = e?e[1]:t}return t.replace('"', "")}); t = "^(?=.*?" + o.join(")(?=.*?") + ").*$"}return new RegExp(t, r?"i":"")}function tt(t){return t.replace(ne, "\\$1")}function et(t){var e, n, a, r, o, i, s, l, u = t.aoColumns, c = qt.ext.type.search, f = !1; for (n = 0, r = t.aoData.length; r > n; n++)if (l = t.aoData[n], !l._aFilterData){for (i = [], a = 0, o = u.length; o > a; a++)e = u[a], e.bSearchable?(s = w(t, n, a, "filter"), c[e.sType] && (s = c[e.sType](s)), null === s && (s = ""), "string" != typeof s && s.toString && (s = s.toString())):s = "", s.indexOf && - 1 !== s.indexOf("&") && (me.innerHTML = s, s = De?me.textContent:me.innerText), s.replace && (s = s.replace(/[\r\n]/g, "")), i.push(s); l._aFilterData = i, l._sFilterRow = i.join(" "), f = !0}return f}function nt(t){return{search:t.sSearch, smart:t.bSmart, regex:t.bRegex, caseInsensitive:t.bCaseInsensitive}}function at(t){return{sSearch:t.search, bSmart:t.smart, bRegex:t.regex, bCaseInsensitive:t.caseInsensitive}}function rt(t){var e = t.sTableId, n = t.aanFeatures.i, r = a("<div/>", {"class":t.oClasses.sInfo, id:n?null:e + "_info"}); return n || (t.aoDrawCallback.push({fn:ot, sName:"information"}), r.attr("role", "status").attr("aria-live", "polite"), a(t.nTable).attr("aria-describedby", e + "_info")), r[0]}function ot(t){var e = t.aanFeatures.i; if (0 !== e.length){var n = t.oLanguage, r = t._iDisplayStart + 1, o = t.fnDisplayEnd(), i = t.fnRecordsTotal(), s = t.fnRecordsDisplay(), l = s?n.sInfo:n.sInfoEmpty; s !== i && (l += " " + n.sInfoFiltered), l += n.sInfoPostFix, l = it(t, l); var u = n.fnInfoCallback; null !== u && (l = u.call(t.oInstance, t, r, o, i, s, l)), a(e).html(l)}}function it(t, e){var n = t.fnFormatNumber, a = t._iDisplayStart + 1, r = t._iDisplayLength, o = t.fnRecordsDisplay(), i = - 1 === r; return e.replace(/_START_/g, n.call(t, a)).replace(/_END_/g, n.call(t, t.fnDisplayEnd())).replace(/_MAX_/g, n.call(t, t.fnRecordsTotal())).replace(/_TOTAL_/g, n.call(t, o)).replace(/_PAGE_/g, n.call(t, i?1:Math.ceil(a / r))).replace(/_PAGES_/g, n.call(t, i?1:Math.ceil(o / r)))}function st(t){var e, n, a, r = t.iInitDisplayStart, o = t.aoColumns, i = t.oFeatures, s = t.bDeferLoading; if (!t.bInitialised)return void setTimeout(function(){st(t)}, 200); for (U(t), k(t), O(t, t.aoHeader), O(t, t.aoFooter), pt(t, !0), i.bAutoWidth && St(t), e = 0, n = o.length; n > e; e++)a = o[e], a.sWidth && (a.nTh.style.width = Tt(a.sWidth)); Wt(t, null, "preInit", [t]), W(t); var l = Bt(t); ("ssp" != l || s) && ("ajax" == l?J(t, [], function(n){var a = G(t, n); for (e = 0; e < a.length; e++)D(t, a[e]); t.iInitDisplayStart = r, W(t), pt(t, !1), lt(t, n)}, t):(pt(t, !1), lt(t)))}function lt(t, e){t._bInitComplete = !0, (e || t.oInit.aaData) && h(t), Wt(t, "aoInitComplete", "init", [t, e])}function ut(t, e){var n = parseInt(e, 10); t._iDisplayLength = n, Ut(t), Wt(t, null, "length", [t, n])}function ct(t){for (var e = t.oClasses, n = t.sTableId, r = t.aLengthMenu, o = a.isArray(r[0]), i = o?r[0]:r, s = o?r[1]:r, l = a("<select/>", {name:n + "_length", "aria-controls":n, "class":e.sLengthSelect}), u = 0, c = i.length; c > u; u++)l[0][u] = new Option(s[u], i[u]); var f = a("<div><label/></div>").addClass(e.sLength); return t.aanFeatures.l || (f[0].id = n + "_length"), f.children().append(t.oLanguage.sLengthMenu.replace("_MENU_", l[0].outerHTML)), a("select", f).val(t._iDisplayLength).bind("change.DT", function(e){ut(t, a(this).val()), M(t)}), a(t.nTable).bind("length.dt.DT", function(e, n, r){t === n && a("select", f).val(r)}), f[0]}function ft(t){var e = t.sPaginationType, n = qt.ext.pager[e], r = "function" == typeof n, o = function(t){M(t)}, i = a("<div/>").addClass(t.oClasses.sPaging + e)[0], s = t.aanFeatures; return r || n.fnInit(t, i, o), s.p || (i.id = t.sTableId + "_paginate", t.aoDrawCallback.push({fn:function(t){if (r){var e, a, i = t._iDisplayStart, l = t._iDisplayLength, u = t.fnRecordsDisplay(), c = - 1 === l, f = c?0:Math.ceil(i / l), d = c?1:Math.ceil(u / l), h = n(f, d); for (e = 0, a = s.p.length; a > e; e++)Et(t, "pageButton")(t, s.p[e], e, h, f, d)} else n.fnUpdate(t, o)}, sName:"pagination"})), i}function dt(t, e, n){var a = t._iDisplayStart, r = t._iDisplayLength, o = t.fnRecordsDisplay(); 0 === o || - 1 === r?a = 0:"number" == typeof e?(a = e * r, a > o && (a = 0)):"first" == e?a = 0:"previous" == e?(a = r >= 0?a - r:0, 0 > a && (a = 0)):"next" == e?o > a + r && (a += r):"last" == e?a = Math.floor((o - 1) / r) * r:Ht(t, 0, "Unknown paging action: " + e, 5); var i = t._iDisplayStart !== a; return t._iDisplayStart = a, i && (Wt(t, null, "page", [t]), n && M(t)), i}function ht(t){return a("<div/>", {id:t.aanFeatures.r?null:t.sTableId + "_processing", "class":t.oClasses.sProcessing}).html(t.oLanguage.sProcessing).insertBefore(t.nTable)[0]}function pt(t, e){t.oFeatures.bProcessing && a(t.aanFeatures.r).css("display", e?"block":"none"), Wt(t, null, "processing", [t, e])}function gt(t){var e = a(t.nTable); e.attr("role", "grid"); var n = t.oScroll; if ("" === n.sX && "" === n.sY)return t.nTable; var r = n.sX, o = n.sY, i = t.oClasses, s = e.children("caption"), l = s.length?s[0]._captionSide:null, u = a(e[0].cloneNode(!1)), c = a(e[0].cloneNode(!1)), f = e.children("tfoot"), d = "<div/>", h = function(t){return t?Tt(t):null}; n.sX && "100%" === e.attr("width") && e.removeAttr("width"), f.length || (f = null); var p = a(d, {"class":i.sScrollWrapper}).append(a(d, {"class":i.sScrollHead}).css({overflow:"hidden", position:"relative", border:0, width:r?h(r):"100%"}).append(a(d, {"class":i.sScrollHeadInner}).css({"box-sizing":"content-box", width:n.sXInner || "100%"}).append(u.removeAttr("id").css("margin-left", 0).append("top" === l?s:null).append(e.children("thead"))))).append(a(d, {"class":i.sScrollBody}).css({position:"relative", overflow:"auto", width:h(r)}).append(e)); f && p.append(a(d, {"class":i.sScrollFoot}).css({overflow:"hidden", border:0, width:r?h(r):"100%"}).append(a(d, {"class":i.sScrollFootInner}).append(c.removeAttr("id").css("margin-left", 0).append("bottom" === l?s:null).append(e.children("tfoot"))))); var g = p.children(), b = g[0], v = g[1], S = f?g[2]:null; return r && a(v).on("scroll.DT", function(t){var e = this.scrollLeft; b.scrollLeft = e, f && (S.scrollLeft = e)}), a(v).css(o && n.bCollapse?"max-height":"height", o), t.nScrollHead = b, t.nScrollBody = v, t.nScrollFoot = S, t.aoDrawCallback.push({fn:bt, sName:"scrolling"}), p[0]}function bt(t){var e, n, r, o, i, s, l, u, c, f = t.oScroll, d = f.sX, h = f.sXInner, g = f.sY, b = f.iBarWidth, v = a(t.nScrollHead), S = v[0].style, m = v.children("div"), D = m[0].style, y = m.children("table"), _ = t.nScrollBody, T = a(_), w = _.style, C = a(t.nScrollFoot), x = C.children("div"), I = x.children("table"), A = a(t.nTHead), F = a(t.nTable), L = F[0], P = L.style, R = t.nTFoot?a(t.nTFoot):null, j = t.oBrowser, H = j.bScrollOversize, N = [], k = [], O = [], M = function(t){var e = t.style; e.paddingTop = "0", e.paddingBottom = "0", e.borderTopWidth = "0", e.borderBottomWidth = "0", e.height = 0}; F.children("thead, tfoot").remove(), i = A.clone().prependTo(F), e = A.find("tr"), r = i.find("tr"), i.find("th, td").removeAttr("tabindex"), R && (s = R.clone().prependTo(F), n = R.find("tr"), o = s.find("tr")), d || (w.width = "100%", v[0].style.width = "100%"), a.each(B(t, i), function(e, n){l = p(t, e), n.style.width = t.aoColumns[l].sWidth}), R && vt(function(t){t.style.width = ""}, o), c = F.outerWidth(), "" === d?(P.width = "100%", H && (F.find("tbody").height() > _.offsetHeight || "scroll" == T.css("overflow-y")) && (P.width = Tt(F.outerWidth() - b)), c = F.outerWidth()):"" !== h && (P.width = Tt(h), c = F.outerWidth()), vt(M, r), vt(function(t){O.push(t.innerHTML), N.push(Tt(a(t).css("width")))}, r), vt(function(t, e){t.style.width = N[e]}, e), a(r).height(0), R && (vt(M, o), vt(function(t){k.push(Tt(a(t).css("width")))}, o), vt(function(t, e){t.style.width = k[e]}, n), a(o).height(0)), vt(function(t, e){t.innerHTML = '<div class="dataTables_sizing" style="height:0;overflow:hidden;">' + O[e] + "</div>", t.style.width = N[e]}, r), R && vt(function(t, e){t.innerHTML = "", t.style.width = k[e]}, o), F.outerWidth() < c?(u = _.scrollHeight > _.offsetHeight || "scroll" == T.css("overflow-y")?c + b:c, H && (_.scrollHeight > _.offsetHeight || "scroll" == T.css("overflow-y")) && (P.width = Tt(u - b)), ("" === d || "" !== h) && Ht(t, 1, "Possible column misalignment", 6)):u = "100%", w.width = Tt(u), S.width = Tt(u), R && (t.nScrollFoot.style.width = Tt(u)), g || H && (w.height = Tt(L.offsetHeight + b)); var W = F.outerWidth(); y[0].style.width = Tt(W), D.width = Tt(W); var U = F.height() > _.clientHeight || "scroll" == T.css("overflow-y"), E = "padding" + (j.bScrollbarLeft?"Left":"Right"); D[E] = U?b + "px":"0px", R && (I[0].style.width = Tt(W), x[0].style.width = Tt(W), x[0].style[E] = U?b + "px":"0px"), T.scroll(), !t.bSorted && !t.bFiltered || t._drawHold || (_.scrollTop = 0)}function vt(t, e, n){for (var a, r, o = 0, i = 0, s = e.length; s > i; ){for (a = e[i].firstChild, r = n?n[i].firstChild:null; a; )1 === a.nodeType && (n?t(a, r, o):t(a, o), o++), a = a.nextSibling, r = n?r.nextSibling:null; i++}}function St(e){var n, r, o, i, s, l = e.nTable, u = e.aoColumns, c = e.oScroll, f = c.sY, d = c.sX, g = c.sXInner, S = u.length, m = v(e, "bVisible"), D = a("th", e.nTHead), y = l.getAttribute("width"), _ = l.parentNode, T = !1, w = e.oBrowser, C = w.bScrollOversize, x = l.style.width; for (x && - 1 !== x.indexOf("%") && (y = x), n = 0; n < m.length; n++)r = u[m[n]], null !== r.sWidth && (r.sWidth = Dt(r.sWidthOrig, _), T = !0); if (C || !T && !d && !f && S == b(e) && S == D.length)for (n = 0; S > n; n++){var I = p(e, n); I && (u[I].sWidth = Tt(D.eq(n).width()))} else{var A = a(l).clone().css("visibility", "hidden").removeAttr("id"); A.find("tbody tr").remove(); var F = a("<tr/>").appendTo(A.find("tbody")); for (A.find("thead, tfoot").remove(), A.append(a(e.nTHead).clone()).append(a(e.nTFoot).clone()), A.find("tfoot th, tfoot td").css("width", ""), D = B(e, A.find("thead")[0]), n = 0; n < m.length; n++)r = u[m[n]], D[n].style.width = null !== r.sWidthOrig && "" !== r.sWidthOrig?Tt(r.sWidthOrig):""; if (e.aoData.length)for (n = 0; n < m.length; n++)o = m[n], r = u[o], a(yt(e, o)).clone(!1).append(r.sContentPadding).appendTo(F); var L = a("<div/>").css(d || f?{position:"absolute", top:0, left:0, height:1, right:0, overflow:"hidden"}:{}).append(A).appendTo(_); if (d && g?A.width(g):d?(A.css("width", "auto"), A.width() < _.clientWidth && A.width(_.clientWidth)):f?A.width(_.clientWidth):y && A.width(y), d){var P = 0; for (n = 0; n < m.length; n++)r = u[m[n]], s = w.bBounding?D[n].getBoundingClientRect().width:a(D[n]).outerWidth(), P += null === r.sWidthOrig?s:parseInt(r.sWidth, 10) + s - a(D[n]).width(); A.width(Tt(P)), l.style.width = Tt(P)}for (n = 0; n < m.length; n++)r = u[m[n]], i = a(D[n]).width(), i && (r.sWidth = Tt(i)); l.style.width = Tt(A.css("width")), L.remove()}if (y && (l.style.width = Tt(y)), (y || d) && !e._reszEvt){var R = function(){a(t).bind("resize.DT-" + e.sInstance, mt(function(){h(e)}))}; C?setTimeout(R, 1e3):R(), e._reszEvt = !0}}function mt(t, e){var a, r, o = e !== n?e:200; return function(){var e = this, i = + new Date, s = arguments; a && a + o > i?(clearTimeout(r), r = setTimeout(function(){a = n, t.apply(e, s)}, o)):(a = i, t.apply(e, s))}}function Dt(t, n){if (!t)return 0; var r = a("<div/>").css("width", Tt(t)).appendTo(n || e.body), o = r[0].offsetWidth; return r.remove(), o}function yt(t, e){var n = _t(t, e); if (0 > n)return null; var r = t.aoData[n]; return r.nTr?r.anCells[e]:a("<td/>").html(w(t, n, e, "display"))[0]}function _t(t, e){for (var n, a = - 1, r = - 1, o = 0, i = t.aoData.length; i > o; o++)n = w(t, o, e, "display") + "", n = n.replace(ye, ""), n.length > a && (a = n.length, r = o); return r}function Tt(t){return null === t?"0px":"number" == typeof t?0 > t?"0px":t + "px":t.match(/\d$/)?t + "px":t}function wt(t){var e, r, o, i, s, l, u, c = [], f = t.aoColumns, d = t.aaSortingFixed, h = a.isPlainObject(d), p = [], g = function(t){t.length && !a.isArray(t[0])?p.push(t):a.merge(p, t)}; for (a.isArray(d) && g(d), h && d.pre && g(d.pre), g(t.aaSorting), h && d.post && g(d.post), e = 0; e < p.length; e++)for (u = p[e][0], i = f[u].aDataSort, r = 0, o = i.length; o > r; r++)s = i[r], l = f[s].sType || "string", p[e]._idx === n && (p[e]._idx = a.inArray(p[e][1], f[s].asSorting)), c.push({src:u, col:s, dir:p[e][1], index:p[e]._idx, type:l, formatter:qt.ext.type.order[l + "-pre"]}); return c}function Ct(t){var e, n, a, r, o, i = [], s = qt.ext.type.order, l = t.aoData, u = (t.aoColumns, 0), c = t.aiDisplayMaster; for (S(t), o = wt(t), e = 0, n = o.length; n > e; e++)r = o[e], r.formatter && u++, Lt(t, r.col); if ("ssp" != Bt(t) && 0 !== o.length){for (e = 0, a = c.length; a > e; e++)i[c[e]] = e; u === o.length?c.sort(function(t, e){var n, a, r, s, u, c = o.length, f = l[t]._aSortData, d = l[e]._aSortData; for (r = 0; c > r; r++)if (u = o[r], n = f[u.col], a = d[u.col], s = a > n? - 1:n > a?1:0, 0 !== s)return"asc" === u.dir?s: - s; return n = i[t], a = i[e], a > n? - 1:n > a?1:0}):c.sort(function(t, e){var n, a, r, u, c, f, d = o.length, h = l[t]._aSortData, p = l[e]._aSortData; for (r = 0; d > r; r++)if (c = o[r], n = h[c.col], a = p[c.col], f = s[c.type + "-" + c.dir] || s["string-" + c.dir], u = f(n, a), 0 !== u)return u; return n = i[t], a = i[e], a > n? - 1:n > a?1:0})}t.bSorted = !0}function xt(t){for (var e, n, a = t.aoColumns, r = wt(t), o = t.oLanguage.oAria, i = 0, s = a.length; s > i; i++){var l = a[i], u = l.asSorting, c = l.sTitle.replace(/<.*?>/g, ""), f = l.nTh;
2
- f.removeAttribute("aria-sort"), l.bSortable?(r.length > 0 && r[0].col == i?(f.setAttribute("aria-sort", "asc" == r[0].dir?"ascending":"descending"), n = u[r[0].index + 1] || u[0]):n = u[0], e = c + ("asc" === n?o.sSortAscending:o.sSortDescending)):e = c, f.setAttribute("aria-label", e)}}function It(t, e, r, o){var i, s = t.aoColumns[e], l = t.aaSorting, u = s.asSorting, c = function(t, e){var r = t._idx; return r === n && (r = a.inArray(t[1], u)), r + 1 < u.length?r + 1:e?null:0}; if ("number" == typeof l[0] && (l = t.aaSorting = [l]), r && t.oFeatures.bSortMulti){var f = a.inArray(e, ce(l, "0")); - 1 !== f?(i = c(l[f], !0), null === i && 1 === l.length && (i = 0), null === i?l.splice(f, 1):(l[f][1] = u[i], l[f]._idx = i)):(l.push([e, u[0], 0]), l[l.length - 1]._idx = 0)} else l.length && l[0][0] == e?(i = c(l[0]), l.length = 1, l[0][1] = u[i], l[0]._idx = i):(l.length = 0, l.push([e, u[0]]), l[0]._idx = 0); W(t), "function" == typeof o && o(t)}function At(t, e, n, a){var r = t.aoColumns[n]; Ot(e, {}, function(e){r.bSortable !== !1 && (t.oFeatures.bProcessing?(pt(t, !0), setTimeout(function(){It(t, n, e.shiftKey, a), "ssp" !== Bt(t) && pt(t, !1)}, 0)):It(t, n, e.shiftKey, a))})}function Ft(t){var e, n, r, o = t.aLastSort, i = t.oClasses.sSortColumn, s = wt(t), l = t.oFeatures; if (l.bSort && l.bSortClasses){for (e = 0, n = o.length; n > e; e++)r = o[e].src, a(ce(t.aoData, "anCells", r)).removeClass(i + (2 > e?e + 1:3)); for (e = 0, n = s.length; n > e; e++)r = s[e].src, a(ce(t.aoData, "anCells", r)).addClass(i + (2 > e?e + 1:3))}t.aLastSort = s}function Lt(t, e){var n, a = t.aoColumns[e], r = qt.ext.order[a.sSortDataType]; r && (n = r.call(t.oInstance, t, e, g(t, e))); for (var o, i, s = qt.ext.type.order[a.sType + "-pre"], l = 0, u = t.aoData.length; u > l; l++)o = t.aoData[l], o._aSortData || (o._aSortData = []), (!o._aSortData[e] || r) && (i = r?n[l]:w(t, l, e, "sort"), o._aSortData[e] = s?s(i):i)}function Pt(t){if (t.oFeatures.bStateSave && !t.bDestroying){var e = {time: + new Date, start:t._iDisplayStart, length:t._iDisplayLength, order:a.extend(!0, [], t.aaSorting), search:nt(t.oPreviousSearch), columns:a.map(t.aoColumns, function(e, n){return{visible:e.bVisible, search:nt(t.aoPreSearchCols[n])}})}; Wt(t, "aoStateSaveParams", "stateSaveParams", [t, e]), t.oSavedState = e, t.fnStateSaveCallback.call(t.oInstance, t, e)}}function Rt(t, e){var r, o, i = t.aoColumns; if (t.oFeatures.bStateSave){var s = t.fnStateLoadCallback.call(t.oInstance, t); if (s && s.time){var l = Wt(t, "aoStateLoadParams", "stateLoadParams", [t, s]); if ( - 1 === a.inArray(!1, l)){var u = t.iStateDuration; if (!(u > 0 && s.time < + new Date - 1e3 * u) && i.length === s.columns.length){for (t.oLoadedState = a.extend(!0, {}, s), s.start !== n && (t._iDisplayStart = s.start, t.iInitDisplayStart = s.start), s.length !== n && (t._iDisplayLength = s.length), s.order !== n && (t.aaSorting = [], a.each(s.order, function(e, n){t.aaSorting.push(n[0] >= i.length?[0, n[1]]:n)})), s.search !== n && a.extend(t.oPreviousSearch, at(s.search)), r = 0, o = s.columns.length; o > r; r++){var c = s.columns[r]; c.visible !== n && (i[r].bVisible = c.visible), c.search !== n && a.extend(t.aoPreSearchCols[r], at(c.search))}Wt(t, "aoStateLoaded", "stateLoaded", [t, s])}}}}}function jt(t){var e = qt.settings, n = a.inArray(t, ce(e, "nTable")); return - 1 !== n?e[n]:null}function Ht(e, n, a, r){if (a = "DataTables warning: " + (e?"table id=" + e.sTableId + " - ":"") + a, r && (a += ". For more information about this error, please see http://datatables.net/tn/" + r), n)t.console && console.log && console.log(a); else{var o = qt.ext, i = o.sErrMode || o.errMode; if (e && Wt(e, null, "error", [e, r, a]), "alert" == i)alert(a); else{if ("throw" == i)throw new Error(a); "function" == typeof i && i(e, r, a)}}}function Nt(t, e, r, o){return a.isArray(r)?void a.each(r, function(n, r){a.isArray(r)?Nt(t, e, r[0], r[1]):Nt(t, e, r)}):(o === n && (o = r), void(e[r] !== n && (t[o] = e[r])))}function kt(t, e, n){var r; for (var o in e)e.hasOwnProperty(o) && (r = e[o], a.isPlainObject(r)?(a.isPlainObject(t[o]) || (t[o] = {}), a.extend(!0, t[o], r)):n && "data" !== o && "aaData" !== o && a.isArray(r)?t[o] = r.slice():t[o] = r); return t}function Ot(t, e, n){a(t).bind("click.DT", e, function(e){t.blur(), n(e)}).bind("keypress.DT", e, function(t){13 === t.which && (t.preventDefault(), n(t))}).bind("selectstart.DT", function(){return!1})}function Mt(t, e, n, a){n && t[e].push({fn:n, sName:a})}function Wt(t, e, n, r){var o = []; if (e && (o = a.map(t[e].slice().reverse(), function(e, n){return e.fn.apply(t.oInstance, r)})), null !== n){var i = a.Event(n + ".dt"); a(t.nTable).trigger(i, r), o.push(i.result)}return o}function Ut(t){var e = t._iDisplayStart, n = t.fnDisplayEnd(), a = t._iDisplayLength; e >= n && (e = n - a), e -= e % a, ( - 1 === a || 0 > e) && (e = 0), t._iDisplayStart = e}function Et(t, e){var n = t.renderer, r = qt.ext.renderer[e]; return a.isPlainObject(n) && n[e]?r[n[e]] || r._:"string" == typeof n?r[n] || r._:r._}function Bt(t){return t.oFeatures.bServerSide?"ssp":t.ajax || t.sAjaxSource?"ajax":"dom"}function Jt(t, e){var n = [], a = Xe.numbers_length, r = Math.floor(a / 2); return a >= e?n = de(0, e):r >= t?(n = de(0, a - 2), n.push("ellipsis"), n.push(e - 1)):t >= e - 1 - r?(n = de(e - (a - 2), e), n.splice(0, 0, "ellipsis"), n.splice(0, 0, 0)):(n = de(t - r + 2, t + r - 1), n.push("ellipsis"), n.push(e - 1), n.splice(0, 0, "ellipsis"), n.splice(0, 0, 0)), n.DT_el = "span", n}function Xt(t){a.each({num:function(e){return Ve(e, t)}, "num-fmt":function(e){return Ve(e, t, ae)}, "html-num":function(e){return Ve(e, t, Kt)}, "html-num-fmt":function(e){return Ve(e, t, Kt, ae)}}, function(e, n){Gt.type.order[e + t + "-pre"] = n, e.match(/^html\-/) && (Gt.type.search[e + t] = Gt.type.search.html)})}function Vt(t){return function(){var e = [jt(this[qt.ext.iApiIndex])].concat(Array.prototype.slice.call(arguments)); return qt.ext.internal[t].apply(this, e)}}var qt, Gt, $t, zt, Yt, Qt = {}, Zt = /[\r\n]/g, Kt = /<.*?>/g, te = /^[\w\+\-]/, ee = /[\w\+\-]$/, ne = new RegExp("(\\" + ["/", ".", "*", "+", "?", "|", "(", ")", "[", "]", "{", "}", "\\", "$", "^", "-"].join("|\\") + ")", "g"), ae = /[',$£€¥%\u2009\u202F\u20BD\u20a9\u20BArfk]/gi, re = function(t){return t && t !== !0 && "-" !== t?!1:!0}, oe = function(t){var e = parseInt(t, 10); return!isNaN(e) && isFinite(t)?e:null}, ie = function(t, e){return Qt[e] || (Qt[e] = new RegExp(tt(e), "g")), "string" == typeof t && "." !== e?t.replace(/\./g, "").replace(Qt[e], "."):t}, se = function(t, e, n){var a = "string" == typeof t; return re(t)?!0:(e && a && (t = ie(t, e)), n && a && (t = t.replace(ae, "")), !isNaN(parseFloat(t)) && isFinite(t))}, le = function(t){return re(t) || "string" == typeof t}, ue = function(t, e, n){if (re(t))return!0; var a = le(t); return a && se(pe(t), e, n)?!0:null}, ce = function(t, e, a){var r = [], o = 0, i = t.length; if (a !== n)for (; i > o; o++)t[o] && t[o][e] && r.push(t[o][e][a]); else for (; i > o; o++)t[o] && r.push(t[o][e]); return r}, fe = function(t, e, a, r){var o = [], i = 0, s = e.length; if (r !== n)for (; s > i; i++)t[e[i]][a] && o.push(t[e[i]][a][r]); else for (; s > i; i++)o.push(t[e[i]][a]); return o}, de = function(t, e){var a, r = []; e === n?(e = 0, a = t):(a = e, e = t); for (var o = e; a > o; o++)r.push(o); return r}, he = function(t){for (var e = [], n = 0, a = t.length; a > n; n++)t[n] && e.push(t[n]); return e}, pe = function(t){return t.replace(Kt, "")}, ge = function(t){var e, n, a, r = [], o = t.length, i = 0; t:for (n = 0; o > n; n++){for (e = t[n], a = 0; i > a; a++)if (r[a] === e)continue t; r.push(e), i++}return r}, be = function(t, e, a){t[e] !== n && (t[a] = t[e])}, ve = /\[.*?\]$/, Se = /\(\)$/, me = a("<div>")[0], De = me.textContent !== n, ye = /<.*?>/g; qt = function(t){this.$ = function(t, e){return this.api(!0).$(t, e)}, this._ = function(t, e){return this.api(!0).rows(t, e).data()}, this.api = function(t){return new $t(t?jt(this[Gt.iApiIndex]):this)}, this.fnAddData = function(t, e){var r = this.api(!0), o = a.isArray(t) && (a.isArray(t[0]) || a.isPlainObject(t[0]))?r.rows.add(t):r.row.add(t); return(e === n || e) && r.draw(), o.flatten().toArray()}, this.fnAdjustColumnSizing = function(t){var e = this.api(!0).columns.adjust(), a = e.settings()[0], r = a.oScroll; t === n || t?e.draw(!1):("" !== r.sX || "" !== r.sY) && bt(a)}, this.fnClearTable = function(t){var e = this.api(!0).clear(); (t === n || t) && e.draw()}, this.fnClose = function(t){this.api(!0).row(t).child.hide()}, this.fnDeleteRow = function(t, e, a){var r = this.api(!0), o = r.rows(t), i = o.settings()[0], s = i.aoData[o[0][0]]; return o.remove(), e && e.call(this, i, s), (a === n || a) && r.draw(), s}, this.fnDestroy = function(t){this.api(!0).destroy(t)}, this.fnDraw = function(t){this.api(!0).draw(t)}, this.fnFilter = function(t, e, a, r, o, i){var s = this.api(!0); null === e || e === n?s.search(t, a, r, i):s.column(e).search(t, a, r, i), s.draw()}, this.fnGetData = function(t, e){var a = this.api(!0); if (t !== n){var r = t.nodeName?t.nodeName.toLowerCase():""; return e !== n || "td" == r || "th" == r?a.cell(t, e).data():a.row(t).data() || null}return a.data().toArray()}, this.fnGetNodes = function(t){var e = this.api(!0); return t !== n?e.row(t).node():e.rows().nodes().flatten().toArray()}, this.fnGetPosition = function(t){var e = this.api(!0), n = t.nodeName.toUpperCase(); if ("TR" == n)return e.row(t).index(); if ("TD" == n || "TH" == n){var a = e.cell(t).index(); return[a.row, a.columnVisible, a.column]}return null}, this.fnIsOpen = function(t){return this.api(!0).row(t).child.isShown()}, this.fnOpen = function(t, e, n){return this.api(!0).row(t).child(e, n).show().child()[0]}, this.fnPageChange = function(t, e){var a = this.api(!0).page(t); (e === n || e) && a.draw(!1)}, this.fnSetColumnVis = function(t, e, a){var r = this.api(!0).column(t).visible(e); (a === n || a) && r.columns.adjust().draw()}, this.fnSettings = function(){return jt(this[Gt.iApiIndex])}, this.fnSort = function(t){this.api(!0).order(t).draw()}, this.fnSortListener = function(t, e, n){this.api(!0).order.listener(t, e, n)}, this.fnUpdate = function(t, e, a, r, o){var i = this.api(!0); return a === n || null === a?i.row(e).data(t):i.cell(e, a).data(t), (o === n || o) && i.columns.adjust(), (r === n || r) && i.draw(), 0}, this.fnVersionCheck = Gt.fnVersionCheck; var e = this, r = t === n, c = this.length; r && (t = {}), this.oApi = this.internal = Gt.internal; for (var h in qt.ext.internal)h && (this[h] = Vt(h)); return this.each(function(){var h, p = {}, g = c > 1?kt(p, t, !0):t, b = 0, v = this.getAttribute("id"), S = !1, _ = qt.defaults, T = a(this); if ("table" != this.nodeName.toLowerCase())return void Ht(null, 0, "Non-table node initialisation (" + this.nodeName + ")", 2); s(_), l(_.column), o(_, _, !0), o(_.column, _.column, !0), o(_, a.extend(g, T.data())); var w = qt.settings; for (b = 0, h = w.length; h > b; b++){var C = w[b]; if (C.nTable == this || C.nTHead.parentNode == this || C.nTFoot && C.nTFoot.parentNode == this){var x = g.bRetrieve !== n?g.bRetrieve:_.bRetrieve, A = g.bDestroy !== n?g.bDestroy:_.bDestroy; if (r || x)return C.oInstance; if (A){C.oInstance.fnDestroy(); break}return void Ht(C, 0, "Cannot reinitialise DataTable", 3)}if (C.sTableId == this.id){w.splice(b, 1); break}}(null === v || "" === v) && (v = "DataTables_Table_" + qt.ext._unique++, this.id = v); var F = a.extend(!0, {}, qt.models.oSettings, {sDestroyWidth:T[0].style.width, sInstance:v, sTableId:v}); F.nTable = this, F.oApi = e.internal, F.oInit = g, w.push(F), F.oInstance = 1 === e.length?e:T.dataTable(), s(g), g.oLanguage && i(g.oLanguage), g.aLengthMenu && !g.iDisplayLength && (g.iDisplayLength = a.isArray(g.aLengthMenu[0])?g.aLengthMenu[0][0]:g.aLengthMenu[0]), g = kt(a.extend(!0, {}, _), g), Nt(F.oFeatures, g, ["bPaginate", "bLengthChange", "bFilter", "bSort", "bSortMulti", "bInfo", "bProcessing", "bAutoWidth", "bSortClasses", "bServerSide", "bDeferRender"]), Nt(F, g, ["asStripeClasses", "ajax", "fnServerData", "fnFormatNumber", "sServerMethod", "aaSorting", "aaSortingFixed", "aLengthMenu", "sPaginationType", "sAjaxSource", "sAjaxDataProp", "iStateDuration", "sDom", "bSortCellsTop", "iTabIndex", "fnStateLoadCallback", "fnStateSaveCallback", "renderer", "searchDelay", "rowId", ["iCookieDuration", "iStateDuration"], ["oSearch", "oPreviousSearch"], ["aoSearchCols", "aoPreSearchCols"], ["iDisplayLength", "_iDisplayLength"], ["bJQueryUI", "bJUI"]]), Nt(F.oScroll, g, [["sScrollX", "sX"], ["sScrollXInner", "sXInner"], ["sScrollY", "sY"], ["bScrollCollapse", "bCollapse"]]), Nt(F.oLanguage, g, "fnInfoCallback"), Mt(F, "aoDrawCallback", g.fnDrawCallback, "user"), Mt(F, "aoServerParams", g.fnServerParams, "user"), Mt(F, "aoStateSaveParams", g.fnStateSaveParams, "user"), Mt(F, "aoStateLoadParams", g.fnStateLoadParams, "user"), Mt(F, "aoStateLoaded", g.fnStateLoaded, "user"), Mt(F, "aoRowCallback", g.fnRowCallback, "user"), Mt(F, "aoRowCreatedCallback", g.fnCreatedRow, "user"), Mt(F, "aoHeaderCallback", g.fnHeaderCallback, "user"), Mt(F, "aoFooterCallback", g.fnFooterCallback, "user"), Mt(F, "aoInitComplete", g.fnInitComplete, "user"), Mt(F, "aoPreDrawCallback", g.fnPreDrawCallback, "user"), F.rowIdFn = I(g.rowId), u(F); var L = F.oClasses; if (g.bJQueryUI?(a.extend(L, qt.ext.oJUIClasses, g.oClasses), g.sDom === _.sDom && "lfrtip" === _.sDom && (F.sDom = '<"H"lfr>t<"F"ip>'), F.renderer?a.isPlainObject(F.renderer) && !F.renderer.header && (F.renderer.header = "jqueryui"):F.renderer = "jqueryui"):a.extend(L, qt.ext.classes, g.oClasses), T.addClass(L.sTable), F.iInitDisplayStart === n && (F.iInitDisplayStart = g.iDisplayStart, F._iDisplayStart = g.iDisplayStart), null !== g.iDeferLoading){F.bDeferLoading = !0; var P = a.isArray(g.iDeferLoading); F._iRecordsDisplay = P?g.iDeferLoading[0]:g.iDeferLoading, F._iRecordsTotal = P?g.iDeferLoading[1]:g.iDeferLoading}var R = F.oLanguage; a.extend(!0, R, g.oLanguage), "" !== R.sUrl && (a.ajax({dataType:"json", url:R.sUrl, success:function(t){i(t), o(_.oLanguage, t), a.extend(!0, R, t), st(F)}, error:function(){st(F)}}), S = !0), null === g.asStripeClasses && (F.asStripeClasses = [L.sStripeOdd, L.sStripeEven]); var j = F.asStripeClasses, H = T.children("tbody").find("tr").eq(0); - 1 !== a.inArray(!0, a.map(j, function(t, e){return H.hasClass(t)})) && (a("tbody tr", this).removeClass(j.join(" ")), F.asDestroyStripes = j.slice()); var N, k = [], O = this.getElementsByTagName("thead"); if (0 !== O.length && (E(F.aoHeader, O[0]), k = B(F)), null === g.aoColumns)for (N = [], b = 0, h = k.length; h > b; b++)N.push(null); else N = g.aoColumns; for (b = 0, h = N.length; h > b; b++)f(F, k?k[b]:null); if (m(F, g.aoColumnDefs, N, function(t, e){d(F, t, e)}), H.length){var M = function(t, e){return null !== t.getAttribute("data-" + e)?e:null}; a(H[0]).children("th, td").each(function(t, e){var a = F.aoColumns[t]; if (a.mData === t){var r = M(e, "sort") || M(e, "order"), o = M(e, "filter") || M(e, "search"); (null !== r || null !== o) && (a.mData = {_:t + ".display", sort:null !== r?t + ".@data-" + r:n, type:null !== r?t + ".@data-" + r:n, filter:null !== o?t + ".@data-" + o:n}, d(F, t))}})}var W = F.oFeatures; if (g.bStateSave && (W.bStateSave = !0, Rt(F, g), Mt(F, "aoDrawCallback", Pt, "state_save")), g.aaSorting === n){var U = F.aaSorting; for (b = 0, h = U.length; h > b; b++)U[b][1] = F.aoColumns[b].asSorting[0]}Ft(F), W.bSort && Mt(F, "aoDrawCallback", function(){if (F.bSorted){var t = wt(F), e = {}; a.each(t, function(t, n){e[n.src] = n.dir}), Wt(F, null, "order", [F, t, e]), xt(F)}}), Mt(F, "aoDrawCallback", function(){(F.bSorted || "ssp" === Bt(F) || W.bDeferRender) && Ft(F)}, "sc"); var J = T.children("caption").each(function(){this._captionSide = T.css("caption-side")}), X = T.children("thead"); 0 === X.length && (X = a("<thead/>").appendTo(this)), F.nTHead = X[0]; var V = T.children("tbody"); 0 === V.length && (V = a("<tbody/>").appendTo(this)), F.nTBody = V[0]; var q = T.children("tfoot"); if (0 === q.length && J.length > 0 && ("" !== F.oScroll.sX || "" !== F.oScroll.sY) && (q = a("<tfoot/>").appendTo(this)), 0 === q.length || 0 === q.children().length?T.addClass(L.sNoFooter):q.length > 0 && (F.nTFoot = q[0], E(F.aoFooter, F.nTFoot)), g.aaData)for (b = 0; b < g.aaData.length; b++)D(F, g.aaData[b]); else(F.bDeferLoading || "dom" == Bt(F)) && y(F, a(F.nTBody).children("tr")); F.aiDisplay = F.aiDisplayMaster.slice(), F.bInitialised = !0, S === !1 && st(F)}), e = null, this}; var _e = [], Te = Array.prototype, we = function(t){var e, n, r = qt.settings, o = a.map(r, function(t, e){return t.nTable}); return t?t.nTable && t.oApi?[t]:t.nodeName && "table" === t.nodeName.toLowerCase()?(e = a.inArray(t, o), - 1 !== e?[r[e]]:null):t && "function" == typeof t.settings?t.settings().toArray():("string" == typeof t?n = a(t):t instanceof a && (n = t), n?n.map(function(t){return e = a.inArray(this, o), - 1 !== e?r[e]:null}).toArray():void 0):[]}; $t = function(t, e){if (!(this instanceof $t))return new $t(t, e); var n = [], r = function(t){var e = we(t); e && (n = n.concat(e))}; if (a.isArray(t))for (var o = 0, i = t.length; i > o; o++)r(t[o]); else r(t); this.context = ge(n), e && a.merge(this, e), this.selector = {rows:null, cols:null, opts:null}, $t.extend(this, this, _e)}, qt.Api = $t, a.extend($t.prototype, {any:function(){return 0 !== this.count()}, concat:Te.concat, context:[], count:function(){return this.flatten().length}, each:function(t){for (var e = 0, n = this.length; n > e; e++)t.call(this, this[e], e, this); return this}, eq:function(t){var e = this.context; return e.length > t?new $t(e[t], this[t]):null}, filter:function(t){var e = []; if (Te.filter)e = Te.filter.call(this, t, this); else for (var n = 0, a = this.length; a > n; n++)t.call(this, this[n], n, this) && e.push(this[n]); return new $t(this.context, e)}, flatten:function(){var t = []; return new $t(this.context, t.concat.apply(t, this.toArray()))}, join:Te.join, indexOf:Te.indexOf || function(t, e){for (var n = e || 0, a = this.length; a > n; n++)if (this[n] === t)return n; return - 1}, iterator:function(t, e, a, r){var o, i, s, l, u, c, f, d, h = [], p = this.context, g = this.selector; for ("string" == typeof t && (r = a, a = e, e = t, t = !1), i = 0, s = p.length; s > i; i++){var b = new $t(p[i]); if ("table" === e)o = a.call(b, p[i], i), o !== n && h.push(o); else if ("columns" === e || "rows" === e)o = a.call(b, p[i], this[i], i), o !== n && h.push(o); else if ("column" === e || "column-rows" === e || "row" === e || "cell" === e)for (f = this[i], "column-rows" === e && (c = Le(p[i], g.opts)), l = 0, u = f.length; u > l; l++)d = f[l], o = "cell" === e?a.call(b, p[i], d.row, d.column, i, l):a.call(b, p[i], d, i, l, c), o !== n && h.push(o)}if (h.length || r){var v = new $t(p, t?h.concat.apply([], h):h), S = v.selector; return S.rows = g.rows, S.cols = g.cols, S.opts = g.opts, v}return this}, lastIndexOf:Te.lastIndexOf || function(t, e){return this.indexOf.apply(this.toArray.reverse(), arguments)}, length:0, map:function(t){var e = []; if (Te.map)e = Te.map.call(this, t, this); else for (var n = 0, a = this.length; a > n; n++)e.push(t.call(this, this[n], n)); return new $t(this.context, e)}, pluck:function(t){return this.map(function(e){return e[t]})}, pop:Te.pop, push:Te.push, reduce:Te.reduce || function(t, e){return c(this, t, e, 0, this.length, 1)}, reduceRight:Te.reduceRight || function(t, e){return c(this, t, e, this.length - 1, - 1, - 1)}, reverse:Te.reverse, selector:null, shift:Te.shift, sort:Te.sort, splice:Te.splice, toArray:function(){return Te.slice.call(this)}, to$:function(){return a(this)}, toJQuery:function(){return a(this)}, unique:function(){return new $t(this.context, ge(this))}, unshift:Te.unshift}), $t.extend = function(t, e, n){if (n.length && e && (e instanceof $t || e.__dt_wrapper)){var r, o, i, s = function(t, e, n){return function(){var a = e.apply(t, arguments); return $t.extend(a, a, n.methodExt), a}}; for (r = 0, o = n.length; o > r; r++)i = n[r], e[i.name] = "function" == typeof i.val?s(t, i.val, i):a.isPlainObject(i.val)?{}:i.val, e[i.name].__dt_wrapper = !0, $t.extend(t, e[i.name], i.propExt)}}, $t.register = zt = function(t, e){if (a.isArray(t))for (var n = 0, r = t.length; r > n; n++)$t.register(t[n], e); else{var o, i, s, l, u = t.split("."), c = _e, f = function(t, e){for (var n = 0, a = t.length; a > n; n++)if (t[n].name === e)return t[n]; return null}; for (o = 0, i = u.length; i > o; o++){l = - 1 !== u[o].indexOf("()"), s = l?u[o].replace("()", ""):u[o]; var d = f(c, s); d || (d = {name:s, val:{}, methodExt:[], propExt:[]}, c.push(d)), o === i - 1?d.val = e:c = l?d.methodExt:d.propExt}}}, $t.registerPlural = Yt = function(t, e, r){$t.register(t, r), $t.register(e, function(){var t = r.apply(this, arguments); return t === this?this:t instanceof $t?t.length?a.isArray(t[0])?new $t(t.context, t[0]):t[0]:n:t})}; var Ce = function(t, e){if ("number" == typeof t)return[e[t]]; var n = a.map(e, function(t, e){return t.nTable}); return a(n).filter(t).map(function(t){var r = a.inArray(this, n); return e[r]}).toArray()}; zt("tables()", function(t){return t?new $t(Ce(t, this.context)):this}), zt("table()", function(t){var e = this.tables(t), n = e.context; return n.length?new $t(n[0]):e}), Yt("tables().nodes()", "table().node()", function(){return this.iterator("table", function(t){return t.nTable}, 1)}), Yt("tables().body()", "table().body()", function(){return this.iterator("table", function(t){return t.nTBody}, 1)}), Yt("tables().header()", "table().header()", function(){return this.iterator("table", function(t){return t.nTHead}, 1)}), Yt("tables().footer()", "table().footer()", function(){return this.iterator("table", function(t){return t.nTFoot}, 1)}), Yt("tables().containers()", "table().container()", function(){return this.iterator("table", function(t){return t.nTableWrapper}, 1)}), zt("draw()", function(t){return this.iterator("table", function(e){"page" === t?M(e):("string" == typeof t && (t = "full-hold" === t?!1:!0), W(e, t === !1))})}), zt("page()", function(t){return t === n?this.page.info().page:this.iterator("table", function(e){dt(e, t)})}), zt("page.info()", function(t){if (0 === this.context.length)return n; var e = this.context[0], a = e._iDisplayStart, r = e._iDisplayLength, o = e.fnRecordsDisplay(), i = - 1 === r; return{page:i?0:Math.floor(a / r), pages:i?1:Math.ceil(o / r), start:a, end:e.fnDisplayEnd(), length:r, recordsTotal:e.fnRecordsTotal(), recordsDisplay:o, serverSide:"ssp" === Bt(e)}}), zt("page.len()", function(t){return t === n?0 !== this.context.length?this.context[0]._iDisplayLength:n:this.iterator("table", function(e){ut(e, t)})}); var xe = function(t, e, n){if (n){var a = new $t(t); a.one("draw", function(){n(a.ajax.json())})}if ("ssp" == Bt(t))W(t, e); else{pt(t, !0); var r = t.jqXHR; r && 4 !== r.readyState && r.abort(), J(t, [], function(n){L(t); for (var a = G(t, n), r = 0, o = a.length; o > r; r++)D(t, a[r]); W(t, e), pt(t, !1)})}}; zt("ajax.json()", function(){var t = this.context; return t.length > 0?t[0].json:void 0}), zt("ajax.params()", function(){var t = this.context; return t.length > 0?t[0].oAjaxData:void 0}), zt("ajax.reload()", function(t, e){return this.iterator("table", function(n){xe(n, e === !1, t)})}), zt("ajax.url()", function(t){var e = this.context; return t === n?0 === e.length?n:(e = e[0], e.ajax?a.isPlainObject(e.ajax)?e.ajax.url:e.ajax:e.sAjaxSource):this.iterator("table", function(e){a.isPlainObject(e.ajax)?e.ajax.url = t:e.ajax = t})}), zt("ajax.url().load()", function(t, e){return this.iterator("table", function(n){xe(n, e === !1, t)})}); var Ie = function(t, e, r, o, i){var s, l, u, c, f, d, h = [], p = typeof e; for (e && "string" !== p && "function" !== p && e.length !== n || (e = [e]), u = 0, c = e.length; c > u; u++)for (l = e[u] && e[u].split?e[u].split(","):[e[u]], f = 0, d = l.length; d > f; f++)s = r("string" == typeof l[f]?a.trim(l[f]):l[f]), s && s.length && (h = h.concat(s)); var g = Gt.selector[t]; if (g.length)for (u = 0, c = g.length; c > u; u++)h = g[u](o, i, h); return ge(h)}, Ae = function(t){return t || (t = {}), t.filter && t.search === n && (t.search = t.filter), a.extend({search:"none", order:"current", page:"all"}, t)}, Fe = function(t){for (var e = 0, n = t.length; n > e; e++)if (t[e].length > 0)return t[0] = t[e], t[0].length = 1, t.length = 1, t.context = [t.context[e]], t; return t.length = 0, t}, Le = function(t, e){var n, r, o, i = [], s = t.aiDisplay, l = t.aiDisplayMaster, u = e.search, c = e.order, f = e.page; if ("ssp" == Bt(t))return"removed" === u?[]:de(0, l.length); if ("current" == f)for (n = t._iDisplayStart, r = t.fnDisplayEnd(); r > n; n++)i.push(s[n]); else if ("current" == c || "applied" == c)i = "none" == u?l.slice():"applied" == u?s.slice():a.map(l, function(t, e){return - 1 === a.inArray(t, s)?t:null}); else if ("index" == c || "original" == c)for (n = 0, r = t.aoData.length; r > n; n++)"none" == u?i.push(n):(o = a.inArray(n, s), ( - 1 === o && "removed" == u || o >= 0 && "applied" == u) && i.push(n)); return i}, Pe = function(t, e, r){var o = function(e){var o = oe(e); if (null !== o && !r)return[o]; var i = Le(t, r); if (null !== o && - 1 !== a.inArray(o, i))return[o]; if (!e)return i; if ("function" == typeof e)return a.map(i, function(n){var a = t.aoData[n]; return e(n, a._aData, a.nTr)?n:null}); var s = he(fe(t.aoData, i, "nTr")); if (e.nodeName && - 1 !== a.inArray(e, s))return[e._DT_RowIndex]; if ("string" == typeof e && "#" === e.charAt(0)){var l = t.aIds[e.replace(/^#/, "")]; if (l !== n)return[l.idx]}return a(s).filter(e).map(function(){return this._DT_RowIndex}).toArray()}; return Ie("row", e, o, t, r)}; zt("rows()", function(t, e){t === n?t = "":a.isPlainObject(t) && (e = t, t = ""), e = Ae(e); var r = this.iterator("table", function(n){return Pe(n, t, e)}, 1); return r.selector.rows = t, r.selector.opts = e, r}), zt("rows().nodes()", function(){return this.iterator("row", function(t, e){return t.aoData[e].nTr || n}, 1)}), zt("rows().data()", function(){return this.iterator(!0, "rows", function(t, e){return fe(t.aoData, e, "_aData")}, 1)}), Yt("rows().cache()", "row().cache()", function(t){return this.iterator("row", function(e, n){var a = e.aoData[n]; return"search" === t?a._aFilterData:a._aSortData}, 1)}), Yt("rows().invalidate()", "row().invalidate()", function(t){return this.iterator("row", function(e, n){R(e, n, t)})}), Yt("rows().indexes()", "row().index()", function(){return this.iterator("row", function(t, e){return e}, 1)}), Yt("rows().ids()", "row().id()", function(t){for (var e = [], n = this.context, a = 0, r = n.length; r > a; a++)for (var o = 0, i = this[a].length; i > o; o++){var s = n[a].rowIdFn(n[a].aoData[this[a][o]]._aData); e.push((t === !0?"#":"") + s)}return new $t(n, e)}), Yt("rows().remove()", "row().remove()", function(){var t = this; return this.iterator("row", function(e, a, r){var o = e.aoData, i = o[a]; o.splice(a, 1); for (var s = 0, l = o.length; l > s; s++)null !== o[s].nTr && (o[s].nTr._DT_RowIndex = s); P(e.aiDisplayMaster, a), P(e.aiDisplay, a), P(t[r], a, !1), Ut(e); var u = e.rowIdFn(i._aData); u !== n && delete e.aIds[u]}), this.iterator("table", function(t){for (var e = 0, n = t.aoData.length; n > e; e++)t.aoData[e].idx = e}), this}), zt("rows.add()", function(t){var e = this.iterator("table", function(e){var n, a, r, o = []; for (a = 0, r = t.length; r > a; a++)n = t[a], n.nodeName && "TR" === n.nodeName.toUpperCase()?o.push(y(e, n)[0]):o.push(D(e, n)); return o}, 1), n = this.rows( - 1); return n.pop(), a.merge(n, e), n}), zt("row()", function(t, e){return Fe(this.rows(t, e))}), zt("row().data()", function(t){var e = this.context; return t === n?e.length && this.length?e[0].aoData[this[0]]._aData:n:(e[0].aoData[this[0]]._aData = t, R(e[0], this[0], "data"), this)}), zt("row().node()", function(){var t = this.context; return t.length && this.length?t[0].aoData[this[0]].nTr || null:null}), zt("row.add()", function(t){t instanceof a && t.length && (t = t[0]); var e = this.iterator("table", function(e){return t.nodeName && "TR" === t.nodeName.toUpperCase()?y(e, t)[0]:D(e, t)}); return this.row(e[0])}); var Re = function(t, e, n, r){var o = [], i = function(e, n){if (a.isArray(e) || e instanceof a)for (var r = 0, s = e.length; s > r; r++)i(e[r], n); else if (e.nodeName && "tr" === e.nodeName.toLowerCase())o.push(e); else{var l = a("<tr><td/></tr>").addClass(n); a("td", l).addClass(n).html(e)[0].colSpan = b(t), o.push(l[0])}}; i(n, r), e._details && e._details.remove(), e._details = a(o), e._detailsShow && e._details.insertAfter(e.nTr)}, je = function(t, e){var a = t.context; if (a.length){var r = a[0].aoData[e !== n?e:t[0]]; r && r._details && (r._details.remove(), r._detailsShow = n, r._details = n)}}, He = function(t, e){var n = t.context; if (n.length && t.length){var a = n[0].aoData[t[0]]; a._details && (a._detailsShow = e, e?a._details.insertAfter(a.nTr):a._details.detach(), Ne(n[0]))}}, Ne = function(t){var e = new $t(t), n = ".dt.DT_details", a = "draw" + n, r = "column-visibility" + n, o = "destroy" + n, i = t.aoData; e.off(a + " " + r + " " + o), ce(i, "_details").length > 0 && (e.on(a, function(n, a){t === a && e.rows({page:"current"}).eq(0).each(function(t){var e = i[t]; e._detailsShow && e._details.insertAfter(e.nTr)})}), e.on(r, function(e, n, a, r){if (t === n)for (var o, s = b(n), l = 0, u = i.length; u > l; l++)o = i[l], o._details && o._details.children("td[colspan]").attr("colspan", s)}), e.on(o, function(n, a){if (t === a)for (var r = 0, o = i.length; o > r; r++)i[r]._details && je(e, r)}))}, ke = "", Oe = ke + "row().child", Me = Oe + "()"; zt(Me, function(t, e){var a = this.context; return t === n?a.length && this.length?a[0].aoData[this[0]]._details:n:(t === !0?this.child.show():t === !1?je(this):a.length && this.length && Re(a[0], a[0].aoData[this[0]], t, e), this)}), zt([Oe + ".show()", Me + ".show()"], function(t){return He(this, !0), this}), zt([Oe + ".hide()", Me + ".hide()"], function(){return He(this, !1), this}), zt([Oe + ".remove()", Me + ".remove()"], function(){return je(this), this}), zt(Oe + ".isShown()", function(){var t = this.context; return t.length && this.length?t[0].aoData[this[0]]._detailsShow || !1:!1}); var We = /^(.+):(name|visIdx|visible)$/, Ue = function(t, e, n, a, r){for (var o = [], i = 0, s = r.length; s > i; i++)o.push(w(t, r[i], e)); return o}, Ee = function(t, e, n){var r = t.aoColumns, o = ce(r, "sName"), i = ce(r, "nTh"), s = function(e){var s = oe(e); if ("" === e)return de(r.length); if (null !== s)return[s >= 0?s:r.length + s]; if ("function" == typeof e){var l = Le(t, n); return a.map(r, function(n, a){return e(a, Ue(t, a, 0, 0, l), i[a])?a:null})}var u = "string" == typeof e?e.match(We):""; if (!u)return a(i).filter(e).map(function(){return a.inArray(this, i)}).toArray(); switch (u[2]){case"visIdx":case"visible":var c = parseInt(u[1], 10); if (0 > c){var f = a.map(r, function(t, e){return t.bVisible?e:null}); return[f[f.length + c]]}return[p(t, c)]; case"name":return a.map(o, function(t, e){return t === u[1]?e:null})}}; return Ie("column", e, s, t, n)}, Be = function(t, e, r, o){var i, s, l, u, c = t.aoColumns, f = c[e], d = t.aoData; if (r === n)return f.bVisible; if (f.bVisible !== r){if (r){var p = a.inArray(!0, ce(c, "bVisible"), e + 1); for (s = 0, l = d.length; l > s; s++)u = d[s].nTr, i = d[s].anCells, u && u.insertBefore(i[e], i[p] || null)} else a(ce(t.aoData, "anCells", e)).detach(); f.bVisible = r, O(t, t.aoHeader), O(t, t.aoFooter), (o === n || o) && (h(t), (t.oScroll.sX || t.oScroll.sY) && bt(t)), Wt(t, null, "column-visibility", [t, e, r]), Pt(t)}}; zt("columns()", function(t, e){t === n?t = "":a.isPlainObject(t) && (e = t, t = ""), e = Ae(e); var r = this.iterator("table", function(n){return Ee(n, t, e)}, 1); return r.selector.cols = t, r.selector.opts = e, r}), Yt("columns().header()", "column().header()", function(t, e){return this.iterator("column", function(t, e){return t.aoColumns[e].nTh}, 1)}), Yt("columns().footer()", "column().footer()", function(t, e){return this.iterator("column", function(t, e){return t.aoColumns[e].nTf}, 1)}), Yt("columns().data()", "column().data()", function(){return this.iterator("column-rows", Ue, 1)}), Yt("columns().dataSrc()", "column().dataSrc()", function(){return this.iterator("column", function(t, e){return t.aoColumns[e].mData}, 1)}), Yt("columns().cache()", "column().cache()", function(t){return this.iterator("column-rows", function(e, n, a, r, o){return fe(e.aoData, o, "search" === t?"_aFilterData":"_aSortData", n)}, 1)}), Yt("columns().nodes()", "column().nodes()", function(){return this.iterator("column-rows", function(t, e, n, a, r){return fe(t.aoData, r, "anCells", e)}, 1)}), Yt("columns().visible()", "column().visible()", function(t, e){return this.iterator("column", function(a, r){return t === n?a.aoColumns[r].bVisible:void Be(a, r, t, e)})}), Yt("columns().indexes()", "column().index()", function(t){return this.iterator("column", function(e, n){return"visible" === t?g(e, n):n}, 1)}), zt("columns.adjust()", function(){return this.iterator("table", function(t){h(t)}, 1)}), zt("column.index()", function(t, e){if (0 !== this.context.length){var n = this.context[0]; if ("fromVisible" === t || "toData" === t)return p(n, e); if ("fromData" === t || "toVisible" === t)return g(n, e)}}), zt("column()", function(t, e){return Fe(this.columns(t, e))}); var Je = function(t, e, r){var o, i, s, l, u, c, f, d = t.aoData, h = Le(t, r), p = he(fe(d, h, "anCells")), g = a([].concat.apply([], p)), b = t.aoColumns.length, v = function(e){var r = "function" == typeof e; if (null === e || e === n || r){for (i = [], s = 0, l = h.length; l > s; s++)for (o = h[s], u = 0; b > u; u++)c = {row:o, column:u}, r?(f = d[o], e(c, w(t, o, u), f.anCells?f.anCells[u]:null) && i.push(c)):i.push(c); return i}return a.isPlainObject(e)?[e]:g.filter(e).map(function(t, e){if (e.parentNode)o = e.parentNode._DT_RowIndex; else for (t = 0, l = d.length; l > t; t++)if ( - 1 !== a.inArray(e, d[t].anCells)){o = t; break}return{row:o, column:a.inArray(e, d[o].anCells)}}).toArray()}; return Ie("cell", e, v, t, r)}; zt("cells()", function(t, e, r){if (a.isPlainObject(t) && (t.row === n?(r = t, t = null):(r = e, e = null)), a.isPlainObject(e) && (r = e, e = null), null === e || e === n)return this.iterator("table", function(e){return Je(e, t, Ae(r))}); var o, i, s, l, u, c = this.columns(e, r), f = this.rows(t, r), d = this.iterator("table", function(t, e){for (o = [], i = 0, s = f[e].length; s > i; i++)for (l = 0, u = c[e].length; u > l; l++)o.push({row:f[e][i], column:c[e][l]}); return o}, 1); return a.extend(d.selector, {cols:e, rows:t, opts:r}), d}), Yt("cells().nodes()", "cell().node()", function(){return this.iterator("cell", function(t, e, a){var r = t.aoData[e].anCells; return r?r[a]:n}, 1)}), zt("cells().data()", function(){return this.iterator("cell", function(t, e, n){return w(t, e, n)}, 1)}), Yt("cells().cache()", "cell().cache()", function(t){return t = "search" === t?"_aFilterData":"_aSortData", this.iterator("cell", function(e, n, a){return e.aoData[n][t][a]}, 1)}), Yt("cells().render()", "cell().render()", function(t){return this.iterator("cell", function(e, n, a){return w(e, n, a, t)}, 1)}), Yt("cells().indexes()", "cell().index()", function(){return this.iterator("cell", function(t, e, n){return{row:e, column:n, columnVisible:g(t, n)}}, 1)}), Yt("cells().invalidate()", "cell().invalidate()", function(t){return this.iterator("cell", function(e, n, a){R(e, n, t, a)})}), zt("cell()", function(t, e, n){return Fe(this.cells(t, e, n))}), zt("cell().data()", function(t){var e = this.context, a = this[0]; return t === n?e.length && a.length?w(e[0], a[0].row, a[0].column):n:(C(e[0], a[0].row, a[0].column, t), R(e[0], a[0].row, "data", a[0].column), this)}), zt("order()", function(t, e){var r = this.context; return t === n?0 !== r.length?r[0].aaSorting:n:("number" == typeof t?t = [[t, e]]:a.isArray(t[0]) || (t = Array.prototype.slice.call(arguments)), this.iterator("table", function(e){e.aaSorting = t.slice()}))}), zt("order.listener()", function(t, e, n){return this.iterator("table", function(a){
3
  At(a, t, e, n)})}), zt(["columns().order()", "column().order()"], function(t){var e = this; return this.iterator("table", function(n, r){var o = []; a.each(e[r], function(e, n){o.push([n, t])}), n.aaSorting = o})}), zt("search()", function(t, e, r, o){var i = this.context; return t === n?0 !== i.length?i[0].oPreviousSearch.sSearch:n:this.iterator("table", function(n){n.oFeatures.bFilter && z(n, a.extend({}, n.oPreviousSearch, {sSearch:t + "", bRegex:null === e?!1:e, bSmart:null === r?!0:r, bCaseInsensitive:null === o?!0:o}), 1)})}), Yt("columns().search()", "column().search()", function(t, e, r, o){return this.iterator("column", function(i, s){var l = i.aoPreSearchCols; return t === n?l[s].sSearch:void(i.oFeatures.bFilter && (a.extend(l[s], {sSearch:t + "", bRegex:null === e?!1:e, bSmart:null === r?!0:r, bCaseInsensitive:null === o?!0:o}), z(i, i.oPreviousSearch, 1)))})}), zt("state()", function(){return this.context.length?this.context[0].oSavedState:null}), zt("state.clear()", function(){return this.iterator("table", function(t){t.fnStateSaveCallback.call(t.oInstance, t, {})})}), zt("state.loaded()", function(){return this.context.length?this.context[0].oLoadedState:null}), zt("state.save()", function(){return this.iterator("table", function(t){Pt(t)})}), qt.versionCheck = qt.fnVersionCheck = function(t){for (var e, n, a = qt.version.split("."), r = t.split("."), o = 0, i = r.length; i > o; o++)if (e = parseInt(a[o], 10) || 0, n = parseInt(r[o], 10) || 0, e !== n)return e > n; return!0}, qt.isDataTable = qt.fnIsDataTable = function(t){var e = a(t).get(0), n = !1; return a.each(qt.settings, function(t, r){var o = r.nScrollHead?a("table", r.nScrollHead)[0]:null, i = r.nScrollFoot?a("table", r.nScrollFoot)[0]:null; (r.nTable === e || o === e || i === e) && (n = !0)}), n}, qt.tables = qt.fnTables = function(t){var e = !1; a.isPlainObject(t) && (e = t.api, t = t.visible); var n = a.map(qt.settings, function(e){return!t || t && a(e.nTable).is(":visible")?e.nTable:void 0}); return e?new $t(n):n}, qt.util = {throttle:mt, escapeRegex:tt}, qt.camelToHungarian = o, zt("$()", function(t, e){var n = this.rows(e).nodes(), r = a(n); return a([].concat(r.filter(t).toArray(), r.find(t).toArray()))}), a.each(["on", "one", "off"], function(t, e){zt(e + "()", function(){var t = Array.prototype.slice.call(arguments); t[0].match(/\.dt\b/) || (t[0] += ".dt"); var n = a(this.tables().nodes()); return n[e].apply(n, t), this})}), zt("clear()", function(){return this.iterator("table", function(t){L(t)})}), zt("settings()", function(){return new $t(this.context, this.context)}), zt("init()", function(){var t = this.context; return t.length?t[0].oInit:null}), zt("data()", function(){return this.iterator("table", function(t){return ce(t.aoData, "_aData")}).flatten()}), zt("destroy()", function(e){return e = e || !1, this.iterator("table", function(n){var r, o = n.nTableWrapper.parentNode, i = n.oClasses, s = n.nTable, l = n.nTBody, u = n.nTHead, c = n.nTFoot, f = a(s), d = a(l), h = a(n.nTableWrapper), p = a.map(n.aoData, function(t){return t.nTr}); n.bDestroying = !0, Wt(n, "aoDestroyCallback", "destroy", [n]), e || new $t(n).columns().visible(!0), h.unbind(".DT").find(":not(tbody *)").unbind(".DT"), a(t).unbind(".DT-" + n.sInstance), s != u.parentNode && (f.children("thead").detach(), f.append(u)), c && s != c.parentNode && (f.children("tfoot").detach(), f.append(c)), n.aaSorting = [], n.aaSortingFixed = [], Ft(n), a(p).removeClass(n.asStripeClasses.join(" ")), a("th, td", u).removeClass(i.sSortable + " " + i.sSortableAsc + " " + i.sSortableDesc + " " + i.sSortableNone), n.bJUI && (a("th span." + i.sSortIcon + ", td span." + i.sSortIcon, u).detach(), a("th, td", u).each(function(){var t = a("div." + i.sSortJUIWrapper, this); a(this).append(t.contents()), t.detach()})), d.children().detach(), d.append(p); var g = e?"remove":"detach"; f[g](), h[g](), !e && o && (o.insertBefore(s, n.nTableReinsertBefore), f.css("width", n.sDestroyWidth).removeClass(i.sTable), r = n.asDestroyStripes.length, r && d.children().each(function(t){a(this).addClass(n.asDestroyStripes[t % r])})); var b = a.inArray(n, qt.settings); - 1 !== b && qt.settings.splice(b, 1)})}), a.each(["column", "row", "cell"], function(t, e){zt(e + "s().every()", function(t){return this.iterator(e, function(a, r, o, i, s){t.call(new $t(a)[e](r, "cell" === e?o:n), r, o, i, s)})})}), zt("i18n()", function(t, e, r){var o = this.context[0], i = I(t)(o.oLanguage); return i === n && (i = e), r !== n && a.isPlainObject(i) && (i = i[r] !== n?i[r]:i._), i.replace("%d", r)}), qt.version = "1.10.9", qt.settings = [], qt.models = {}, qt.models.oSearch = {bCaseInsensitive:!0, sSearch:"", bRegex:!1, bSmart:!0}, qt.models.oRow = {nTr:null, anCells:null, _aData:[], _aSortData:null, _aFilterData:null, _sFilterRow:null, _sRowStripe:"", src:null, idx: - 1}, qt.models.oColumn = {idx:null, aDataSort:null, asSorting:null, bSearchable:null, bSortable:null, bVisible:null, _sManualType:null, _bAttrSrc:!1, fnCreatedCell:null, fnGetData:null, fnSetData:null, mData:null, mRender:null, nTh:null, nTf:null, sClass:null, sContentPadding:null, sDefaultContent:null, sName:null, sSortDataType:"std", sSortingClass:null, sSortingClassJUI:null, sTitle:null, sType:null, sWidth:null, sWidthOrig:null}, qt.defaults = {aaData:null, aaSorting:[[0, "asc"]], aaSortingFixed:[], ajax:null, aLengthMenu:[10, 25, 50, 100], aoColumns:null, aoColumnDefs:null, aoSearchCols:[], asStripeClasses:null, bAutoWidth:!0, bDeferRender:!1, bDestroy:!1, bFilter:!0, bInfo:!0, bJQueryUI:!1, bLengthChange:!0, bPaginate:!0, bProcessing:!1, bRetrieve:!1, bScrollCollapse:!1, bServerSide:!1, bSort:!0, bSortMulti:!0, bSortCellsTop:!1, bSortClasses:!0, bStateSave:!1, fnCreatedRow:null, fnDrawCallback:null, fnFooterCallback:null, fnFormatNumber:function(t){return t.toString().replace(/\B(?=(\d{3})+(?!\d))/g, this.oLanguage.sThousands)}, fnHeaderCallback:null, fnInfoCallback:null, fnInitComplete:null, fnPreDrawCallback:null, fnRowCallback:null, fnServerData:null, fnServerParams:null, fnStateLoadCallback:function(t){try{return JSON.parse(( - 1 === t.iStateDuration?sessionStorage:localStorage).getItem("DataTables_" + t.sInstance + "_" + location.pathname))} catch (e){}}, fnStateLoadParams:null, fnStateLoaded:null, fnStateSaveCallback:function(t, e){try{( - 1 === t.iStateDuration?sessionStorage:localStorage).setItem("DataTables_" + t.sInstance + "_" + location.pathname, JSON.stringify(e))} catch (n){}}, fnStateSaveParams:null, iStateDuration:7200, iDeferLoading:null, iDisplayLength:10, iDisplayStart:0, iTabIndex:0, oClasses:{}, oLanguage:{oAria:{sSortAscending:": activate to sort column ascending", sSortDescending:": activate to sort column descending"}, oPaginate:{sFirst:"First", sLast:"Last", sNext:"Next", sPrevious:"Previous"}, sEmptyTable:"No data available in table", sInfo:"Showing _START_ to _END_ of _TOTAL_ entries", sInfoEmpty:"Showing 0 to 0 of 0 entries", sInfoFiltered:"(filtered from _MAX_ total entries)", sInfoPostFix:"", sDecimal:"", sThousands:",", sLengthMenu:"Show _MENU_ entries", sLoadingRecords:"Loading...", sProcessing:"Processing...", sSearch:"Search:", sSearchPlaceholder:"", sUrl:"", sZeroRecords:"No matching records found"}, oSearch:a.extend({}, qt.models.oSearch), sAjaxDataProp:"data", sAjaxSource:null, sDom:"lfrtip", searchDelay:null, sPaginationType:"simple_numbers", sScrollX:"", sScrollXInner:"", sScrollY:"", sServerMethod:"GET", renderer:null, rowId:"DT_RowId"}, r(qt.defaults), qt.defaults.column = {aDataSort:null, iDataSort: - 1, asSorting:["asc", "desc"], bSearchable:!0, bSortable:!0, bVisible:!0, fnCreatedCell:null, mData:null, mRender:null, sCellType:"td", sClass:"", sContentPadding:"", sDefaultContent:null, sName:"", sSortDataType:"std", sTitle:null, sType:null, sWidth:null}, r(qt.defaults.column), qt.models.oSettings = {oFeatures:{bAutoWidth:null, bDeferRender:null, bFilter:null, bInfo:null, bLengthChange:null, bPaginate:null, bProcessing:null, bServerSide:null, bSort:null, bSortMulti:null, bSortClasses:null, bStateSave:null}, oScroll:{bCollapse:null, iBarWidth:0, sX:null, sXInner:null, sY:null}, oLanguage:{fnInfoCallback:null}, oBrowser:{bScrollOversize:!1, bScrollbarLeft:!1, bBounding:!1, barWidth:0}, ajax:null, aanFeatures:[], aoData:[], aiDisplay:[], aiDisplayMaster:[], aIds:{}, aoColumns:[], aoHeader:[], aoFooter:[], oPreviousSearch:{}, aoPreSearchCols:[], aaSorting:null, aaSortingFixed:[], asStripeClasses:null, asDestroyStripes:[], sDestroyWidth:0, aoRowCallback:[], aoHeaderCallback:[], aoFooterCallback:[], aoDrawCallback:[], aoRowCreatedCallback:[], aoPreDrawCallback:[], aoInitComplete:[], aoStateSaveParams:[], aoStateLoadParams:[], aoStateLoaded:[], sTableId:"", nTable:null, nTHead:null, nTFoot:null, nTBody:null, nTableWrapper:null, bDeferLoading:!1, bInitialised:!1, aoOpenRows:[], sDom:null, searchDelay:null, sPaginationType:"two_button", iStateDuration:0, aoStateSave:[], aoStateLoad:[], oSavedState:null, oLoadedState:null, sAjaxSource:null, sAjaxDataProp:null, bAjaxDataGet:!0, jqXHR:null, json:n, oAjaxData:n, fnServerData:null, aoServerParams:[], sServerMethod:null, fnFormatNumber:null, aLengthMenu:null, iDraw:0, bDrawing:!1, iDrawError: - 1, _iDisplayLength:10, _iDisplayStart:0, _iRecordsTotal:0, _iRecordsDisplay:0, bJUI:null, oClasses:{}, bFiltered:!1, bSorted:!1, bSortCellsTop:null, oInit:null, aoDestroyCallback:[], fnRecordsTotal:function(){return"ssp" == Bt(this)?1 * this._iRecordsTotal:this.aiDisplayMaster.length}, fnRecordsDisplay:function(){return"ssp" == Bt(this)?1 * this._iRecordsDisplay:this.aiDisplay.length}, fnDisplayEnd:function(){var t = this._iDisplayLength, e = this._iDisplayStart, n = e + t, a = this.aiDisplay.length, r = this.oFeatures, o = r.bPaginate; return r.bServerSide?o === !1 || - 1 === t?e + a:Math.min(e + t, this._iRecordsDisplay):!o || n > a || - 1 === t?a:n}, oInstance:null, sInstance:null, iTabIndex:0, nScrollHead:null, nScrollFoot:null, aLastSort:[], oPlugins:{}, rowIdFn:null, rowId:null}, qt.ext = Gt = {buttons:{}, classes:{}, errMode:"alert", feature:[], search:[], selector:{cell:[], column:[], row:[]}, internal:{}, legacy:{ajax:null}, pager:{}, renderer:{pageButton:{}, header:{}}, order:{}, type:{detect:[], search:{}, order:{}}, _unique:0, fnVersionCheck:qt.fnVersionCheck, iApiIndex:0, oJUIClasses:{}, sVersion:qt.version}, a.extend(Gt, {afnFiltering:Gt.search, aTypes:Gt.type.detect, ofnSearch:Gt.type.search, oSort:Gt.type.order, afnSortData:Gt.order, aoFeatures:Gt.feature, oApi:Gt.internal, oStdClasses:Gt.classes, oPagination:Gt.pager}), a.extend(qt.ext.classes, {sTable:"dataTable", sNoFooter:"no-footer", sPageButton:"paginate_button", sPageButtonActive:"current", sPageButtonDisabled:"disabled", sStripeOdd:"odd", sStripeEven:"even", sRowEmpty:"dataTables_empty", sWrapper:"dataTables_wrapper", sFilter:"dataTables_filter", sInfo:"dataTables_info", sPaging:"dataTables_paginate paging_", sLength:"dataTables_length", sProcessing:"dataTables_processing", sSortAsc:"sorting_asc", sSortDesc:"sorting_desc", sSortable:"sorting", sSortableAsc:"sorting_asc_disabled", sSortableDesc:"sorting_desc_disabled", sSortableNone:"sorting_disabled", sSortColumn:"sorting_", sFilterInput:"", sLengthSelect:"", sScrollWrapper:"dataTables_scroll", sScrollHead:"dataTables_scrollHead", sScrollHeadInner:"dataTables_scrollHeadInner", sScrollBody:"dataTables_scrollBody", sScrollFoot:"dataTables_scrollFoot", sScrollFootInner:"dataTables_scrollFootInner", sHeaderTH:"", sFooterTH:"", sSortJUIAsc:"", sSortJUIDesc:"", sSortJUI:"", sSortJUIAscAllowed:"", sSortJUIDescAllowed:"", sSortJUIWrapper:"", sSortIcon:"", sJUIHeader:"", sJUIFooter:""}), function(){var t = ""; t = ""; var e = t + "ui-state-default", n = t + "css_right ui-icon ui-icon-", r = t + "fg-toolbar ui-toolbar ui-widget-header ui-helper-clearfix"; a.extend(qt.ext.oJUIClasses, qt.ext.classes, {sPageButton:"fg-button ui-button " + e, sPageButtonActive:"ui-state-disabled", sPageButtonDisabled:"ui-state-disabled", sPaging:"dataTables_paginate fg-buttonset ui-buttonset fg-buttonset-multi ui-buttonset-multi paging_", sSortAsc:e + " sorting_asc", sSortDesc:e + " sorting_desc", sSortable:e + " sorting", sSortableAsc:e + " sorting_asc_disabled", sSortableDesc:e + " sorting_desc_disabled", sSortableNone:e + " sorting_disabled", sSortJUIAsc:n + "triangle-1-n", sSortJUIDesc:n + "triangle-1-s", sSortJUI:n + "carat-2-n-s", sSortJUIAscAllowed:n + "carat-1-n", sSortJUIDescAllowed:n + "carat-1-s", sSortJUIWrapper:"DataTables_sort_wrapper", sSortIcon:"DataTables_sort_icon", sScrollHead:"dataTables_scrollHead " + e, sScrollFoot:"dataTables_scrollFoot " + e, sHeaderTH:e, sFooterTH:e, sJUIHeader:r + " ui-corner-tl ui-corner-tr", sJUIFooter:r + " ui-corner-bl ui-corner-br"})}(); var Xe = qt.ext.pager; a.extend(Xe, {simple:function(t, e){return["previous", "next"]}, full:function(t, e){return["first", "previous", "next", "last"]}, numbers:function(t, e){return[Jt(t, e)]}, simple_numbers:function(t, e){return["previous", Jt(t, e), "next"]}, full_numbers:function(t, e){return["first", "previous", Jt(t, e), "next", "last"]}, _numbers:Jt, numbers_length:7}), a.extend(!0, qt.ext.renderer, {pageButton:{_:function(t, n, r, o, i, s){var l, u, c, f = t.oClasses, d = t.oLanguage.oPaginate, h = 0, p = function(e, n){var o, c, g, b, v = function(e){dt(t, e.data.action, !0)}; for (o = 0, c = n.length; c > o; o++)if (b = n[o], a.isArray(b)){var S = a("<" + (b.DT_el || "div") + "/>").appendTo(e); p(S, b)} else{switch (l = null, u = "", b){case"ellipsis":e.append('<span class="ellipsis">&#x2026;</span>'); break; case"first":l = d.sFirst, u = b + (i > 0?"":" " + f.sPageButtonDisabled); break; case"previous":l = d.sPrevious, u = b + (i > 0?"":" " + f.sPageButtonDisabled); break; case"next":l = d.sNext, u = b + (s - 1 > i?"":" " + f.sPageButtonDisabled); break; case"last":l = d.sLast, u = b + (s - 1 > i?"":" " + f.sPageButtonDisabled); break; default:l = b + 1, u = i === b?f.sPageButtonActive:""}null !== l && (g = a("<a>", {"class":f.sPageButton + " " + u, "aria-controls":t.sTableId, "data-dt-idx":h, tabindex:t.iTabIndex, id:0 === r && "string" == typeof b?t.sTableId + "_" + b:null}).html(l).appendTo(e), Ot(g, {action:b}, v), h++)}}; try{c = a(n).find(e.activeElement).data("dt-idx")} catch (g){}p(a(n).empty(), o), c && a(n).find("[data-dt-idx=" + c + "]").focus()}}}), a.extend(qt.ext.type.detect, [function(t, e){var n = e.oLanguage.sDecimal; return se(t, n)?"num" + n:null}, function(t, e){if (t && !(t instanceof Date) && (!te.test(t) || !ee.test(t)))return null; var n = Date.parse(t); return null !== n && !isNaN(n) || re(t)?"date":null}, function(t, e){var n = e.oLanguage.sDecimal; return se(t, n, !0)?"num-fmt" + n:null}, function(t, e){var n = e.oLanguage.sDecimal; return ue(t, n)?"html-num" + n:null}, function(t, e){var n = e.oLanguage.sDecimal; return ue(t, n, !0)?"html-num-fmt" + n:null}, function(t, e){return re(t) || "string" == typeof t && - 1 !== t.indexOf("<")?"html":null}]), a.extend(qt.ext.type.search, {html:function(t){return re(t)?t:"string" == typeof t?t.replace(Zt, " ").replace(Kt, ""):""}, string:function(t){return re(t)?t:"string" == typeof t?t.replace(Zt, " "):t}}); var Ve = function(t, e, n, a){return 0 === t || t && "-" !== t?(e && (t = ie(t, e)), t.replace && (n && (t = t.replace(n, "")), a && (t = t.replace(a, ""))), 1 * t): - (1 / 0)}; return a.extend(Gt.type.order, {"date-pre":function(t){return Date.parse(t) || 0}, "html-pre":function(t){return re(t)?"":t.replace?t.replace(/<.*?>/g, "").toLowerCase():t + ""}, "string-pre":function(t){return re(t)?"":"string" == typeof t?t.toLowerCase():t.toString?t.toString():""}, "string-asc":function(t, e){return e > t? - 1:t > e?1:0}, "string-desc":function(t, e){return e > t?1:t > e? - 1:0}}), Xt(""), a.extend(!0, qt.ext.renderer, {header:{_:function(t, e, n, r){a(t.nTable).on("order.dt.DT", function(a, o, i, s){if (t === o){var l = n.idx; e.removeClass(n.sSortingClass + " " + r.sSortAsc + " " + r.sSortDesc).addClass("asc" == s[l]?r.sSortAsc:"desc" == s[l]?r.sSortDesc:n.sSortingClass)}})}, jqueryui:function(t, e, n, r){a("<div/>").addClass(r.sSortJUIWrapper).append(e.contents()).append(a("<span/>").addClass(r.sSortIcon + " " + n.sSortingClassJUI)).appendTo(e), a(t.nTable).on("order.dt.DT", function(a, o, i, s){if (t === o){var l = n.idx; e.removeClass(r.sSortAsc + " " + r.sSortDesc).addClass("asc" == s[l]?r.sSortAsc:"desc" == s[l]?r.sSortDesc:n.sSortingClass), e.find("span." + r.sSortIcon).removeClass(r.sSortJUIAsc + " " + r.sSortJUIDesc + " " + r.sSortJUI + " " + r.sSortJUIAscAllowed + " " + r.sSortJUIDescAllowed).addClass("asc" == s[l]?r.sSortJUIAsc:"desc" == s[l]?r.sSortJUIDesc:n.sSortingClassJUI)}})}}}), qt.render = {number:function(t, e, n, a, r){return{display:function(o){if ("number" != typeof o && "string" != typeof o)return o; var i = 0 > o?"-":""; o = Math.abs(parseFloat(o)); var s = parseInt(o, 10), l = n?e + (o - s).toFixed(n).substring(2):""; return i + (a || "") + s.toString().replace(/\B(?=(\d{3})+(?!\d))/g, t) + l + (r || "")}}}}, a.extend(qt.ext.internal, {_fnExternApiFunc:Vt, _fnBuildAjax:J, _fnAjaxUpdate:X, _fnAjaxParameters:V, _fnAjaxUpdateDraw:q, _fnAjaxDataSrc:G, _fnAddColumn:f, _fnColumnOptions:d, _fnAdjustColumnSizing:h, _fnVisibleToColumnIndex:p, _fnColumnIndexToVisible:g, _fnVisbleColumns:b, _fnGetColumns:v, _fnColumnTypes:S, _fnApplyColumnDefs:m, _fnHungarianMap:r, _fnCamelToHungarian:o, _fnLanguageCompat:i, _fnBrowserDetect:u, _fnAddData:D, _fnAddTr:y, _fnNodeToDataIndex:_, _fnNodeToColumnIndex:T, _fnGetCellData:w, _fnSetCellData:C, _fnSplitObjNotation:x, _fnGetObjectDataFn:I, _fnSetObjectDataFn:A, _fnGetDataMaster:F, _fnClearTable:L, _fnDeleteIndex:P, _fnInvalidate:R, _fnGetRowElements:j, _fnCreateTr:H, _fnBuildHead:k, _fnDrawHead:O, _fnDraw:M, _fnReDraw:W, _fnAddOptionsHtml:U, _fnDetectHeader:E, _fnGetUniqueThs:B, _fnFeatureHtmlFilter:$, _fnFilterComplete:z, _fnFilterCustom:Y, _fnFilterColumn:Q, _fnFilter:Z, _fnFilterCreateSearch:K, _fnEscapeRegex:tt, _fnFilterData:et, _fnFeatureHtmlInfo:rt, _fnUpdateInfo:ot, _fnInfoMacros:it, _fnInitialise:st, _fnInitComplete:lt, _fnLengthChange:ut, _fnFeatureHtmlLength:ct, _fnFeatureHtmlPaginate:ft, _fnPageChange:dt, _fnFeatureHtmlProcessing:ht, _fnProcessingDisplay:pt, _fnFeatureHtmlTable:gt, _fnScrollDraw:bt, _fnApplyToChildren:vt, _fnCalculateColumnWidths:St, _fnThrottle:mt, _fnConvertToWidth:Dt, _fnGetWidestNode:yt, _fnGetMaxLenString:_t, _fnStringToCss:Tt, _fnSortFlatten:wt, _fnSort:Ct, _fnSortAria:xt, _fnSortListener:It, _fnSortAttachListener:At, _fnSortingClasses:Ft, _fnSortData:Lt, _fnSaveState:Pt, _fnLoadState:Rt, _fnSettingsFromNode:jt, _fnLog:Ht, _fnMap:Nt, _fnBindAction:Ot, _fnCallbackReg:Mt, _fnCallbackFire:Wt, _fnLengthOverflow:Ut, _fnRenderer:Et, _fnDataSource:Bt, _fnRowAttributes:N, _fnCalculateEnd:function(){}}), a.fn.dataTable = qt, a.fn.dataTableSettings = qt.settings, a.fn.dataTableExt = qt.ext, a.fn.DataTable = function(t){return a(this).dataTable(t).api()}, a.each(qt, function(t, e){a.fn.DataTable[t] = e}), a.fn.dataTable})}(window, document), function(t, e, n){var a = function(t, n){"use strict"; t.extend(!0, n.defaults, {dom:"<'row'<'col-sm-5'><'col-sm-4'f><'col-sm-3'l>><'row'<'col-sm-12'tr>><'row'<'col-sm-5'i><'col-sm-7'p>>", renderer:"bootstrap"}), t.extend(n.ext.classes, {sWrapper:"dataTables_wrapper form-inline dt-bootstrap", sFilterInput:"form-control input-sm", sLengthSelect:"form-control input-sm"}), n.ext.renderer.pageButton.bootstrap = function(a, r, o, i, s, l){var u, c, f, d = new n.Api(a), h = a.oClasses, p = a.oLanguage.oPaginate, g = 0, b = function(e, n){var r, i, f, v, S = function(e){e.preventDefault(), t(e.currentTarget).hasClass("disabled") || d.page(e.data.action).draw("page")}; for (r = 0, i = n.length; i > r; r++)if (v = n[r], t.isArray(v))b(e, v); else{switch (u = "", c = "", v){case"ellipsis":u = "&hellip;", c = "disabled"; break; case"first":u = p.sFirst, c = v + (s > 0?"":" disabled"); break; case"previous":u = p.sPrevious, c = v + (s > 0?"":" disabled"); break; case"next":u = p.sNext, c = v + (l - 1 > s?"":" disabled"); break; case"last":u = p.sLast, c = v + (l - 1 > s?"":" disabled"); break; default:u = v + 1, c = s === v?"active":""}u && (f = t("<li>", {"class":h.sPageButton + " " + c, id:0 === o && "string" == typeof v?a.sTableId + "_" + v:null}).append(t("<a>", {href:"#", "aria-controls":a.sTableId, "data-dt-idx":g, tabindex:a.iTabIndex}).html(u)).appendTo(e), a.oApi._fnBindAction(f, {action:v}, S), g++)}}; try{f = t(r).find(e.activeElement).data("dt-idx")} catch (v){}b(t(r).empty().html('<ul class="pagination"/>').children("ul"), i), f && t(r).find("[data-dt-idx=" + f + "]").focus()}, n.TableTools && (t.extend(!0, n.TableTools.classes, {container:"DTTT btn-group", buttons:{normal:"btn btn-default", disabled:"disabled"}, collection:{container:"DTTT_dropdown dropdown-menu", buttons:{normal:"", disabled:"disabled"}}, print:{info:"DTTT_print_info"}, select:{row:"active"}}), t.extend(!0, n.TableTools.DEFAULTS.oTags, {collection:{container:"ul", button:"li", liner:"a"}}))}; "function" == typeof define && define.amd?define(["jquery", "datatables"], a):"object" == typeof exports?a(require("jquery"), require("datatables")):jQuery && a(jQuery, jQuery.fn.dataTable)}(window, document);
1
  !function(t, e, n){!function(t){"use strict"; "function" == typeof define && define.amd?define("datatables", ["jquery"], t):"object" == typeof exports?module.exports = t(require("jquery")):jQuery && !jQuery.fn.dataTable && t(jQuery)}(function(a){"use strict"; function r(t){var e, n, o = "a aa ai ao as b fn i m o s ", i = {}; a.each(t, function(a, s){e = a.match(/^([^A-Z]+?)([A-Z])/), e && - 1 !== o.indexOf(e[1] + " ") && (n = a.replace(e[0], e[2].toLowerCase()), i[n] = a, "o" === e[1] && r(t[a]))}), t._hungarianMap = i}function o(t, e, i){t._hungarianMap || r(t); var s; a.each(e, function(r, l){s = t._hungarianMap[r], s === n || !i && e[s] !== n || ("o" === s.charAt(0)?(e[s] || (e[s] = {}), a.extend(!0, e[s], e[r]), o(t[s], e[s], i)):e[s] = e[r])})}function i(t){var e = qt.defaults.oLanguage, n = t.sZeroRecords; !t.sEmptyTable && n && "No data available in table" === e.sEmptyTable && Nt(t, t, "sZeroRecords", "sEmptyTable"), !t.sLoadingRecords && n && "Loading..." === e.sLoadingRecords && Nt(t, t, "sZeroRecords", "sLoadingRecords"), t.sInfoThousands && (t.sThousands = t.sInfoThousands); var a = t.sDecimal; a && Xt(a)}function s(t){be(t, "ordering", "bSort"), be(t, "orderMulti", "bSortMulti"), be(t, "orderClasses", "bSortClasses"), be(t, "orderCellsTop", "bSortCellsTop"), be(t, "order", "aaSorting"), be(t, "orderFixed", "aaSortingFixed"), be(t, "paging", "bPaginate"), be(t, "pagingType", "sPaginationType"), be(t, "pageLength", "iDisplayLength"), be(t, "searching", "bFilter"), "boolean" == typeof t.sScrollX && (t.sScrollX = t.sScrollX?"100%":""); var e = t.aoSearchCols; if (e)for (var n = 0, a = e.length; a > n; n++)e[n] && o(qt.models.oSearch, e[n])}function l(t){be(t, "orderable", "bSortable"), be(t, "orderData", "aDataSort"), be(t, "orderSequence", "asSorting"), be(t, "orderDataType", "sortDataType"); var e = t.aDataSort; e && !a.isArray(e) && (t.aDataSort = [e])}function u(t){if (!qt.__browser){var e = {}; qt.__browser = e; var n = a("<div/>").css({position:"fixed", top:0, left:0, height:1, width:1, overflow:"hidden"}).append(a("<div/>").css({position:"absolute", top:1, left:1, width:100, overflow:"scroll"}).append(a("<div/>").css({width:"100%", height:10}))).appendTo("body"), r = n.children(), o = r.children(); e.barWidth = r[0].offsetWidth - r[0].clientWidth, e.bScrollOversize = 100 === o[0].offsetWidth && 100 !== r[0].clientWidth, e.bScrollbarLeft = 1 !== Math.round(o.offset().left), e.bBounding = n[0].getBoundingClientRect().width?!0:!1, n.remove()}a.extend(t.oBrowser, qt.__browser), t.oScroll.iBarWidth = qt.__browser.barWidth}function c(t, e, a, r, o, i){var s, l = r, u = !1; for (a !== n && (s = a, u = !0); l !== o; )t.hasOwnProperty(l) && (s = u?e(s, t[l], l, t):t[l], u = !0, l += i); return s}function f(t, n){var r = qt.defaults.column, o = t.aoColumns.length, i = a.extend({}, qt.models.oColumn, r, {nTh:n?n:e.createElement("th"), sTitle:r.sTitle?r.sTitle:n?n.innerHTML:"", aDataSort:r.aDataSort?r.aDataSort:[o], mData:r.mData?r.mData:o, idx:o}); t.aoColumns.push(i); var s = t.aoPreSearchCols; s[o] = a.extend({}, qt.models.oSearch, s[o]), d(t, o, a(n).data())}function d(t, e, r){var i = t.aoColumns[e], s = t.oClasses, u = a(i.nTh); if (!i.sWidthOrig){i.sWidthOrig = u.attr("width") || null; var c = (u.attr("style") || "").match(/width:\s*(\d+[pxem%]+)/); c && (i.sWidthOrig = c[1])}r !== n && null !== r && (l(r), o(qt.defaults.column, r), r.mDataProp === n || r.mData || (r.mData = r.mDataProp), r.sType && (i._sManualType = r.sType), r.className && !r.sClass && (r.sClass = r.className), a.extend(i, r), Nt(i, r, "sWidth", "sWidthOrig"), r.iDataSort !== n && (i.aDataSort = [r.iDataSort]), Nt(i, r, "aDataSort")); var f = i.mData, d = I(f), h = i.mRender?I(i.mRender):null, p = function(t){return"string" == typeof t && - 1 !== t.indexOf("@")}; i._bAttrSrc = a.isPlainObject(f) && (p(f.sort) || p(f.type) || p(f.filter)), i.fnGetData = function(t, e, a){var r = d(t, e, n, a); return h && e?h(r, e, t, a):r}, i.fnSetData = function(t, e, n){return A(f)(t, e, n)}, "number" != typeof f && (t._rowReadObject = !0), t.oFeatures.bSort || (i.bSortable = !1, u.addClass(s.sSortableNone)); var g = - 1 !== a.inArray("asc", i.asSorting), b = - 1 !== a.inArray("desc", i.asSorting); i.bSortable && (g || b)?g && !b?(i.sSortingClass = s.sSortableAsc, i.sSortingClassJUI = s.sSortJUIAscAllowed):!g && b?(i.sSortingClass = s.sSortableDesc, i.sSortingClassJUI = s.sSortJUIDescAllowed):(i.sSortingClass = s.sSortable, i.sSortingClassJUI = s.sSortJUI):(i.sSortingClass = s.sSortableNone, i.sSortingClassJUI = "")}function h(t){if (t.oFeatures.bAutoWidth !== !1){var e = t.aoColumns; St(t); for (var n = 0, a = e.length; a > n; n++)e[n].nTh.style.width = e[n].sWidth}var r = t.oScroll; ("" !== r.sY || "" !== r.sX) && bt(t), Wt(t, null, "column-sizing", [t])}function p(t, e){var n = v(t, "bVisible"); return"number" == typeof n[e]?n[e]:null}function g(t, e){var n = v(t, "bVisible"), r = a.inArray(e, n); return - 1 !== r?r:null}function b(t){return v(t, "bVisible").length}function v(t, e){var n = []; return a.map(t.aoColumns, function(t, a){t[e] && n.push(a)}), n}function S(t){var e, a, r, o, i, s, l, u, c, f = t.aoColumns, d = t.aoData, h = qt.ext.type.detect; for (e = 0, a = f.length; a > e; e++)if (l = f[e], c = [], !l.sType && l._sManualType)l.sType = l._sManualType; else if (!l.sType){for (r = 0, o = h.length; o > r; r++){for (i = 0, s = d.length; s > i && (c[i] === n && (c[i] = w(t, i, e, "type")), u = h[r](c[i], t), u || r === h.length - 1) && "html" !== u; i++); if (u){l.sType = u; break}}l.sType || (l.sType = "string")}}function m(t, e, r, o){var i, s, l, u, c, d, h, p = t.aoColumns; if (e)for (i = e.length - 1; i >= 0; i--){h = e[i]; var g = h.targets !== n?h.targets:h.aTargets; for (a.isArray(g) || (g = [g]), l = 0, u = g.length; u > l; l++)if ("number" == typeof g[l] && g[l] >= 0){for (; p.length <= g[l]; )f(t); o(g[l], h)} else if ("number" == typeof g[l] && g[l] < 0)o(p.length + g[l], h); else if ("string" == typeof g[l])for (c = 0, d = p.length; d > c; c++)("_all" == g[l] || a(p[c].nTh).hasClass(g[l])) && o(c, h)}if (r)for (i = 0, s = r.length; s > i; i++)o(i, r[i])}function D(t, e, r, o){var i = t.aoData.length, s = a.extend(!0, {}, qt.models.oRow, {src:r?"dom":"data", idx:i}); s._aData = e, t.aoData.push(s); for (var l = t.aoColumns, u = 0, c = l.length; c > u; u++)l[u].sType = null; t.aiDisplayMaster.push(i); var f = t.rowIdFn(e); return f !== n && (t.aIds[f] = s), (r || !t.oFeatures.bDeferRender) && H(t, i, r, o), i}function y(t, e){var n; return e instanceof a || (e = a(e)), e.map(function(e, a){return n = j(t, a), D(t, n.data, a, n.cells)})}function _(t, e){return e._DT_RowIndex !== n?e._DT_RowIndex:null}function T(t, e, n){return a.inArray(n, t.aoData[e].anCells)}function w(t, e, a, r){var o = t.iDraw, i = t.aoColumns[a], s = t.aoData[e]._aData, l = i.sDefaultContent, u = i.fnGetData(s, r, {settings:t, row:e, col:a}); if (u === n)return t.iDrawError != o && null === l && (Ht(t, 0, "Requested unknown parameter " + ("function" == typeof i.mData?"{function}":"'" + i.mData + "'") + " for row " + e, 4), t.iDrawError = o), l; if (u !== s && null !== u || null === l){if ("function" == typeof u)return u.call(s)} else u = l; return null === u && "display" == r?"":u}function C(t, e, n, a){var r = t.aoColumns[n], o = t.aoData[e]._aData; r.fnSetData(o, a, {settings:t, row:e, col:n})}function x(t){return a.map(t.match(/(\\.|[^\.])+/g) || [""], function(t){return t.replace(/\\./g, ".")})}function I(t){if (a.isPlainObject(t)){var e = {}; return a.each(t, function(t, n){n && (e[t] = I(n))}), function(t, a, r, o){var i = e[a] || e._; return i !== n?i(t, a, r, o):t}}if (null === t)return function(t){return t}; if ("function" == typeof t)return function(e, n, a, r){return t(e, n, a, r)}; if ("string" != typeof t || - 1 === t.indexOf(".") && - 1 === t.indexOf("[") && - 1 === t.indexOf("("))return function(e, n){return e[t]}; var r = function(t, e, o){var i, s, l, u; if ("" !== o)for (var c = x(o), f = 0, d = c.length; d > f; f++){if (i = c[f].match(ve), s = c[f].match(Se), i){if (c[f] = c[f].replace(ve, ""), "" !== c[f] && (t = t[c[f]]), l = [], c.splice(0, f + 1), u = c.join("."), a.isArray(t))for (var h = 0, p = t.length; p > h; h++)l.push(r(t[h], e, u)); var g = i[0].substring(1, i[0].length - 1); t = "" === g?l:l.join(g); break}if (s)c[f] = c[f].replace(Se, ""), t = t[c[f]](); else{if (null === t || t[c[f]] === n)return n; t = t[c[f]]}}return t}; return function(e, n){return r(e, n, t)}}function A(t){if (a.isPlainObject(t))return A(t._); if (null === t)return function(){}; if ("function" == typeof t)return function(e, n, a){t(e, "set", n, a)}; if ("string" != typeof t || - 1 === t.indexOf(".") && - 1 === t.indexOf("[") && - 1 === t.indexOf("("))return function(e, n){e[t] = n}; var e = function(t, r, o){for (var i, s, l, u, c, f = x(o), d = f[f.length - 1], h = 0, p = f.length - 1; p > h; h++){if (s = f[h].match(ve), l = f[h].match(Se), s){if (f[h] = f[h].replace(ve, ""), t[f[h]] = [], i = f.slice(), i.splice(0, h + 1), c = i.join("."), a.isArray(r))for (var g = 0, b = r.length; b > g; g++)u = {}, e(u, r[g], c), t[f[h]].push(u); else t[f[h]] = r; return}l && (f[h] = f[h].replace(Se, ""), t = t[f[h]](r)), (null === t[f[h]] || t[f[h]] === n) && (t[f[h]] = {}), t = t[f[h]]}d.match(Se)?t = t[d.replace(Se, "")](r):t[d.replace(ve, "")] = r}; return function(n, a){return e(n, a, t)}}function F(t){return ce(t.aoData, "_aData")}function L(t){t.aoData.length = 0, t.aiDisplayMaster.length = 0, t.aiDisplay.length = 0, t.aIds = {}}function P(t, e, a){for (var r = - 1, o = 0, i = t.length; i > o; o++)t[o] == e?r = o:t[o] > e && t[o]--; - 1 != r && a === n && t.splice(r, 1)}function R(t, e, a, r){var o, i, s = t.aoData[e], l = function(n, a){for (; n.childNodes.length; )n.removeChild(n.firstChild); n.innerHTML = w(t, e, a, "display")}; if ("dom" !== a && (a && "auto" !== a || "dom" !== s.src)){var u = s.anCells; if (u)if (r !== n)l(u[r], r); else for (o = 0, i = u.length; i > o; o++)l(u[o], o)} else s._aData = j(t, s, r, r === n?n:s._aData).data; s._aSortData = null, s._aFilterData = null; var c = t.aoColumns; if (r !== n)c[r].sType = null; else{for (o = 0, i = c.length; i > o; o++)c[o].sType = null; N(t, s)}}function j(t, e, r, o){var i, s, l, u = [], c = e.firstChild, f = 0, d = t.aoColumns, h = t._rowReadObject; o = o !== n?o:h?{}:[]; var p = function(t, e){if ("string" == typeof t){var n = t.indexOf("@"); if ( - 1 !== n){var a = t.substring(n + 1), r = A(t); r(o, e.getAttribute(a))}}}, g = function(t){if (r === n || r === f)if (s = d[f], l = a.trim(t.innerHTML), s && s._bAttrSrc){var e = A(s.mData._); e(o, l), p(s.mData.sort, t), p(s.mData.type, t), p(s.mData.filter, t)} else h?(s._setter || (s._setter = A(s.mData)), s._setter(o, l)):o[f] = l; f++}; if (c)for (; c; )i = c.nodeName.toUpperCase(), ("TD" == i || "TH" == i) && (g(c), u.push(c)), c = c.nextSibling; else{u = e.anCells; for (var b = 0, v = u.length; v > b; b++)g(u[b])}var S = c?e:e.nTr; if (S){var m = S.getAttribute("id"); m && A(t.rowId)(o, m)}return{data:o, cells:u}}function H(t, n, a, r){var o, i, s, l, u, c = t.aoData[n], f = c._aData, d = []; if (null === c.nTr){for (o = a || e.createElement("tr"), c.nTr = o, c.anCells = d, o._DT_RowIndex = n, N(t, c), l = 0, u = t.aoColumns.length; u > l; l++)s = t.aoColumns[l], i = a?r[l]:e.createElement(s.sCellType), d.push(i), (!a || s.mRender || s.mData !== l) && (i.innerHTML = w(t, n, l, "display")), s.sClass && (i.className += " " + s.sClass), s.bVisible && !a?o.appendChild(i):!s.bVisible && a && i.parentNode.removeChild(i), s.fnCreatedCell && s.fnCreatedCell.call(t.oInstance, i, w(t, n, l), f, n, l); Wt(t, "aoRowCreatedCallback", null, [o, f, n])}c.nTr.setAttribute("role", "row")}function N(t, e){var n = e.nTr, r = e._aData; if (n){var o = t.rowIdFn(r); if (o && (n.id = o), r.DT_RowClass){var i = r.DT_RowClass.split(" "); e.__rowc = e.__rowc?ge(e.__rowc.concat(i)):i, a(n).removeClass(e.__rowc.join(" ")).addClass(r.DT_RowClass)}r.DT_RowAttr && a(n).attr(r.DT_RowAttr), r.DT_RowData && a(n).data(r.DT_RowData)}}function k(t){var e, n, r, o, i, s = t.nTHead, l = t.nTFoot, u = 0 === a("th, td", s).length, c = t.oClasses, f = t.aoColumns; for (u && (o = a("<tr/>").appendTo(s)), e = 0, n = f.length; n > e; e++)i = f[e], r = a(i.nTh).addClass(i.sClass), u && r.appendTo(o), t.oFeatures.bSort && (r.addClass(i.sSortingClass), i.bSortable !== !1 && (r.attr("tabindex", t.iTabIndex).attr("aria-controls", t.sTableId), At(t, i.nTh, e))), i.sTitle != r[0].innerHTML && r.html(i.sTitle), Et(t, "header")(t, r, i, c); if (u && E(t.aoHeader, s), a(s).find(">tr").attr("role", "row"), a(s).find(">tr>th, >tr>td").addClass(c.sHeaderTH), a(l).find(">tr>th, >tr>td").addClass(c.sFooterTH), null !== l){var d = t.aoFooter[0]; for (e = 0, n = d.length; n > e; e++)i = f[e], i.nTf = d[e].cell, i.sClass && a(i.nTf).addClass(i.sClass)}}function O(t, e, r){var o, i, s, l, u, c, f, d, h, p = [], g = [], b = t.aoColumns.length; if (e){for (r === n && (r = !1), o = 0, i = e.length; i > o; o++){for (p[o] = e[o].slice(), p[o].nTr = e[o].nTr, s = b - 1; s >= 0; s--)t.aoColumns[s].bVisible || r || p[o].splice(s, 1); g.push([])}for (o = 0, i = p.length; i > o; o++){if (f = p[o].nTr)for (; c = f.firstChild; )f.removeChild(c); for (s = 0, l = p[o].length; l > s; s++)if (d = 1, h = 1, g[o][s] === n){for (f.appendChild(p[o][s].cell), g[o][s] = 1; p[o + d] !== n && p[o][s].cell == p[o + d][s].cell; )g[o + d][s] = 1, d++; for (; p[o][s + h] !== n && p[o][s].cell == p[o][s + h].cell; ){for (u = 0; d > u; u++)g[o + u][s + h] = 1; h++}a(p[o][s].cell).attr("rowspan", d).attr("colspan", h)}}}}function M(t){var e = Wt(t, "aoPreDrawCallback", "preDraw", [t]); if ( - 1 !== a.inArray(!1, e))return void pt(t, !1); var r = [], o = 0, i = t.asStripeClasses, s = i.length, l = (t.aoOpenRows.length, t.oLanguage), u = t.iInitDisplayStart, c = "ssp" == Bt(t), f = t.aiDisplay; t.bDrawing = !0, u !== n && - 1 !== u && (t._iDisplayStart = c?u:u >= t.fnRecordsDisplay()?0:u, t.iInitDisplayStart = - 1); var d = t._iDisplayStart, h = t.fnDisplayEnd(); if (t.bDeferLoading)t.bDeferLoading = !1, t.iDraw++, pt(t, !1); else if (c){if (!t.bDestroying && !X(t))return} else t.iDraw++; if (0 !== f.length)for (var p = c?0:d, g = c?t.aoData.length:h, v = p; g > v; v++){var S = f[v], m = t.aoData[S]; null === m.nTr && H(t, S); var D = m.nTr; if (0 !== s){var y = i[o % s]; m._sRowStripe != y && (a(D).removeClass(m._sRowStripe).addClass(y), m._sRowStripe = y)}Wt(t, "aoRowCallback", null, [D, m._aData, o, v]), r.push(D), o++} else{var _ = l.sZeroRecords; 1 == t.iDraw && "ajax" == Bt(t)?_ = l.sLoadingRecords:l.sEmptyTable && 0 === t.fnRecordsTotal() && (_ = l.sEmptyTable), r[0] = a("<tr/>", {"class":s?i[0]:""}).append(a("<td />", {valign:"top", colSpan:b(t), "class":t.oClasses.sRowEmpty}).html(_))[0]}Wt(t, "aoHeaderCallback", "header", [a(t.nTHead).children("tr")[0], F(t), d, h, f]), Wt(t, "aoFooterCallback", "footer", [a(t.nTFoot).children("tr")[0], F(t), d, h, f]); var T = a(t.nTBody); T.children().detach(), T.append(a(r)), Wt(t, "aoDrawCallback", "draw", [t]), t.bSorted = !1, t.bFiltered = !1, t.bDrawing = !1}function W(t, e){var n = t.oFeatures, a = n.bSort, r = n.bFilter; a && Ct(t), r?z(t, t.oPreviousSearch):t.aiDisplay = t.aiDisplayMaster.slice(), e !== !0 && (t._iDisplayStart = 0), t._drawHold = e, M(t), t._drawHold = !1}function U(t){var e = t.oClasses, n = a(t.nTable), r = a("<div/>").insertBefore(n), o = t.oFeatures, i = a("<div/>", {id:t.sTableId + "_wrapper", "class":e.sWrapper + (t.nTFoot?"":" " + e.sNoFooter)}); t.nHolding = r[0], t.nTableWrapper = i[0], t.nTableReinsertBefore = t.nTable.nextSibling; for (var s, l, u, c, f, d, h = t.sDom.split(""), p = 0; p < h.length; p++){if (s = null, l = h[p], "<" == l){if (u = a("<div/>")[0], c = h[p + 1], "'" == c || '"' == c){for (f = "", d = 2; h[p + d] != c; )f += h[p + d], d++; if ("H" == f?f = e.sJUIHeader:"F" == f && (f = e.sJUIFooter), - 1 != f.indexOf(".")){var g = f.split("."); u.id = g[0].substr(1, g[0].length - 1), u.className = g[1]} else"#" == f.charAt(0)?u.id = f.substr(1, f.length - 1):u.className = f; p += d}i.append(u), i = a(u)} else if (">" == l)i = i.parent(); else if ("l" == l && o.bPaginate && o.bLengthChange)s = ct(t); else if ("f" == l && o.bFilter)s = $(t); else if ("r" == l && o.bProcessing)s = ht(t); else if ("t" == l)s = gt(t); else if ("i" == l && o.bInfo)s = rt(t); else if ("p" == l && o.bPaginate)s = ft(t); else if (0 !== qt.ext.feature.length)for (var b = qt.ext.feature, v = 0, S = b.length; S > v; v++)if (l == b[v].cFeature){s = b[v].fnInit(t); break}if (s){var m = t.aanFeatures; m[l] || (m[l] = []), m[l].push(s), i.append(s)}}r.replaceWith(i), t.nHolding = null}function E(t, e){var n, r, o, i, s, l, u, c, f, d, h, p = a(e).children("tr"), g = function(t, e, n){for (var a = t[e]; a[n]; )n++; return n}; for (t.splice(0, t.length), o = 0, l = p.length; l > o; o++)t.push([]); for (o = 0, l = p.length; l > o; o++)for (n = p[o], c = 0, r = n.firstChild; r; ){if ("TD" == r.nodeName.toUpperCase() || "TH" == r.nodeName.toUpperCase())for (f = 1 * r.getAttribute("colspan"), d = 1 * r.getAttribute("rowspan"), f = f && 0 !== f && 1 !== f?f:1, d = d && 0 !== d && 1 !== d?d:1, u = g(t, o, c), h = 1 === f?!0:!1, s = 0; f > s; s++)for (i = 0; d > i; i++)t[o + i][u + s] = {cell:r, unique:h}, t[o + i].nTr = n; r = r.nextSibling}}function B(t, e, n){var a = []; n || (n = t.aoHeader, e && (n = [], E(n, e))); for (var r = 0, o = n.length; o > r; r++)for (var i = 0, s = n[r].length; s > i; i++)!n[r][i].unique || a[i] && t.bSortCellsTop || (a[i] = n[r][i].cell); return a}function J(t, e, n){if (Wt(t, "aoServerParams", "serverParams", [e]), e && a.isArray(e)){var r = {}, o = /(.*?)\[\]$/; a.each(e, function(t, e){var n = e.name.match(o); if (n){var a = n[0]; r[a] || (r[a] = []), r[a].push(e.value)} else r[e.name] = e.value}), e = r}var i, s = t.ajax, l = t.oInstance, u = function(e){Wt(t, null, "xhr", [t, e, t.jqXHR]), n(e)}; if (a.isPlainObject(s) && s.data){i = s.data; var c = a.isFunction(i)?i(e, t):i; e = a.isFunction(i) && c?c:a.extend(!0, e, c), delete s.data}var f = {data:e, success:function(e){var n = e.error || e.sError; n && Ht(t, 0, n), t.json = e, u(e)}, dataType:"json", cache:!1, type:t.sServerMethod, error:function(e, n, r){var o = Wt(t, null, "xhr", [t, null, t.jqXHR]); - 1 === a.inArray(!0, o) && ("parsererror" == n?Ht(t, 0, "Invalid JSON response", 1):4 === e.readyState && Ht(t, 0, "Ajax error", 7)), pt(t, !1)}}; t.oAjaxData = e, Wt(t, null, "preXhr", [t, e]), t.fnServerData?t.fnServerData.call(l, t.sAjaxSource, a.map(e, function(t, e){return{name:e, value:t}}), u, t):t.sAjaxSource || "string" == typeof s?t.jqXHR = a.ajax(a.extend(f, {url:s || t.sAjaxSource})):a.isFunction(s)?t.jqXHR = s.call(l, e, u, t):(t.jqXHR = a.ajax(a.extend(f, s)), s.data = i)}function X(t){return t.bAjaxDataGet?(t.iDraw++, pt(t, !0), J(t, V(t), function(e){q(t, e)}), !1):!0}function V(t){var e, n, r, o, i = t.aoColumns, s = i.length, l = t.oFeatures, u = t.oPreviousSearch, c = t.aoPreSearchCols, f = [], d = wt(t), h = t._iDisplayStart, p = l.bPaginate !== !1?t._iDisplayLength: - 1, g = function(t, e){f.push({name:t, value:e})}; g("sEcho", t.iDraw), g("iColumns", s), g("sColumns", ce(i, "sName").join(",")), g("iDisplayStart", h), g("iDisplayLength", p); var b = {draw:t.iDraw, columns:[], order:[], start:h, length:p, search:{value:u.sSearch, regex:u.bRegex}}; for (e = 0; s > e; e++)r = i[e], o = c[e], n = "function" == typeof r.mData?"function":r.mData, b.columns.push({data:n, name:r.sName, searchable:r.bSearchable, orderable:r.bSortable, search:{value:o.sSearch, regex:o.bRegex}}), g("mDataProp_" + e, n), l.bFilter && (g("sSearch_" + e, o.sSearch), g("bRegex_" + e, o.bRegex), g("bSearchable_" + e, r.bSearchable)), l.bSort && g("bSortable_" + e, r.bSortable); l.bFilter && (g("sSearch", u.sSearch), g("bRegex", u.bRegex)), l.bSort && (a.each(d, function(t, e){b.order.push({column:e.col, dir:e.dir}), g("iSortCol_" + t, e.col), g("sSortDir_" + t, e.dir)}), g("iSortingCols", d.length)); var v = qt.ext.legacy.ajax; return null === v?t.sAjaxSource?f:b:v?f:b}function q(t, e){var a = function(t, a){return e[t] !== n?e[t]:e[a]}, r = G(t, e), o = a("sEcho", "draw"), i = a("iTotalRecords", "recordsTotal"), s = a("iTotalDisplayRecords", "recordsFiltered"); if (o){if (1 * o < t.iDraw)return; t.iDraw = 1 * o}L(t), t._iRecordsTotal = parseInt(i, 10), t._iRecordsDisplay = parseInt(s, 10); for (var l = 0, u = r.length; u > l; l++)D(t, r[l]); t.aiDisplay = t.aiDisplayMaster.slice(), t.bAjaxDataGet = !1, M(t), t._bInitComplete || lt(t, e), t.bAjaxDataGet = !0, pt(t, !1)}function G(t, e){var r = a.isPlainObject(t.ajax) && t.ajax.dataSrc !== n?t.ajax.dataSrc:t.sAjaxDataProp; return"data" === r?e.aaData || e[r]:"" !== r?I(r)(e):e}function $(t){var n = t.oClasses, r = t.sTableId, o = t.oLanguage, i = t.oPreviousSearch, s = t.aanFeatures, l = '<input type="search" class="' + n.sFilterInput + '"/>', u = o.sSearch; u = u.match(/_INPUT_/)?u.replace("_INPUT_", l):u + l; var c = a("<div/>", {id:s.f?null:r + "_filter", "class":n.sFilter}).append(a("<label/>").append(u)), f = function(){var e = (s.f, this.value?this.value:""); e != i.sSearch && (z(t, {sSearch:e, bRegex:i.bRegex, bSmart:i.bSmart, bCaseInsensitive:i.bCaseInsensitive}), t._iDisplayStart = 0, M(t))}, d = null !== t.searchDelay?t.searchDelay:"ssp" === Bt(t)?400:0, h = a("input", c).val(i.sSearch).attr("placeholder", o.sSearchPlaceholder).bind("keyup.DT search.DT input.DT paste.DT cut.DT", d?mt(f, d):f).bind("keypress.DT", function(t){return 13 == t.keyCode?!1:void 0}).attr("aria-controls", r); return a(t.nTable).on("search.dt.DT", function(n, a){if (t === a)try{h[0] !== e.activeElement && h.val(i.sSearch)} catch (r){}}), c[0]}function z(t, e, a){var r = t.oPreviousSearch, o = t.aoPreSearchCols, i = function(t){r.sSearch = t.sSearch, r.bRegex = t.bRegex, r.bSmart = t.bSmart, r.bCaseInsensitive = t.bCaseInsensitive}, s = function(t){return t.bEscapeRegex !== n?!t.bEscapeRegex:t.bRegex}; if (S(t), "ssp" != Bt(t)){Z(t, e.sSearch, a, s(e), e.bSmart, e.bCaseInsensitive), i(e); for (var l = 0; l < o.length; l++)Q(t, o[l].sSearch, l, s(o[l]), o[l].bSmart, o[l].bCaseInsensitive); Y(t)} else i(e); t.bFiltered = !0, Wt(t, null, "search", [t])}function Y(t){for (var e, n, r = qt.ext.search, o = t.aiDisplay, i = 0, s = r.length; s > i; i++){for (var l = [], u = 0, c = o.length; c > u; u++)n = o[u], e = t.aoData[n], r[i](t, e._aFilterData, n, e._aData, u) && l.push(n); o.length = 0, a.merge(o, l)}}function Q(t, e, n, a, r, o){if ("" !== e)for (var i, s = t.aiDisplay, l = K(e, a, r, o), u = s.length - 1; u >= 0; u--)i = t.aoData[s[u]]._aFilterData[n], l.test(i) || s.splice(u, 1)}function Z(t, e, n, a, r, o){var i, s, l, u = K(e, a, r, o), c = t.oPreviousSearch.sSearch, f = t.aiDisplayMaster; if (0 !== qt.ext.search.length && (n = !0), s = et(t), e.length <= 0)t.aiDisplay = f.slice(); else for ((s || n || c.length > e.length || 0 !== e.indexOf(c) || t.bSorted) && (t.aiDisplay = f.slice()), i = t.aiDisplay, l = i.length - 1; l >= 0; l--)u.test(t.aoData[i[l]]._sFilterRow) || i.splice(l, 1)}function K(t, e, n, r){if (t = e?t:tt(t), n){var o = a.map(t.match(/"[^"]+"|[^ ]+/g) || [""], function(t){if ('"' === t.charAt(0)){var e = t.match(/^"(.*)"$/); t = e?e[1]:t}return t.replace('"', "")}); t = "^(?=.*?" + o.join(")(?=.*?") + ").*$"}return new RegExp(t, r?"i":"")}function tt(t){return t.replace(ne, "\\$1")}function et(t){var e, n, a, r, o, i, s, l, u = t.aoColumns, c = qt.ext.type.search, f = !1; for (n = 0, r = t.aoData.length; r > n; n++)if (l = t.aoData[n], !l._aFilterData){for (i = [], a = 0, o = u.length; o > a; a++)e = u[a], e.bSearchable?(s = w(t, n, a, "filter"), c[e.sType] && (s = c[e.sType](s)), null === s && (s = ""), "string" != typeof s && s.toString && (s = s.toString())):s = "", s.indexOf && - 1 !== s.indexOf("&") && (me.innerHTML = s, s = De?me.textContent:me.innerText), s.replace && (s = s.replace(/[\r\n]/g, "")), i.push(s); l._aFilterData = i, l._sFilterRow = i.join(" "), f = !0}return f}function nt(t){return{search:t.sSearch, smart:t.bSmart, regex:t.bRegex, caseInsensitive:t.bCaseInsensitive}}function at(t){return{sSearch:t.search, bSmart:t.smart, bRegex:t.regex, bCaseInsensitive:t.caseInsensitive}}function rt(t){var e = t.sTableId, n = t.aanFeatures.i, r = a("<div/>", {"class":t.oClasses.sInfo, id:n?null:e + "_info"}); return n || (t.aoDrawCallback.push({fn:ot, sName:"information"}), r.attr("role", "status").attr("aria-live", "polite"), a(t.nTable).attr("aria-describedby", e + "_info")), r[0]}function ot(t){var e = t.aanFeatures.i; if (0 !== e.length){var n = t.oLanguage, r = t._iDisplayStart + 1, o = t.fnDisplayEnd(), i = t.fnRecordsTotal(), s = t.fnRecordsDisplay(), l = s?n.sInfo:n.sInfoEmpty; s !== i && (l += " " + n.sInfoFiltered), l += n.sInfoPostFix, l = it(t, l); var u = n.fnInfoCallback; null !== u && (l = u.call(t.oInstance, t, r, o, i, s, l)), a(e).html(l)}}function it(t, e){var n = t.fnFormatNumber, a = t._iDisplayStart + 1, r = t._iDisplayLength, o = t.fnRecordsDisplay(), i = - 1 === r; return e.replace(/_START_/g, n.call(t, a)).replace(/_END_/g, n.call(t, t.fnDisplayEnd())).replace(/_MAX_/g, n.call(t, t.fnRecordsTotal())).replace(/_TOTAL_/g, n.call(t, o)).replace(/_PAGE_/g, n.call(t, i?1:Math.ceil(a / r))).replace(/_PAGES_/g, n.call(t, i?1:Math.ceil(o / r)))}function st(t){var e, n, a, r = t.iInitDisplayStart, o = t.aoColumns, i = t.oFeatures, s = t.bDeferLoading; if (!t.bInitialised)return void setTimeout(function(){st(t)}, 200); for (U(t), k(t), O(t, t.aoHeader), O(t, t.aoFooter), pt(t, !0), i.bAutoWidth && St(t), e = 0, n = o.length; n > e; e++)a = o[e], a.sWidth && (a.nTh.style.width = Tt(a.sWidth)); Wt(t, null, "preInit", [t]), W(t); var l = Bt(t); ("ssp" != l || s) && ("ajax" == l?J(t, [], function(n){var a = G(t, n); for (e = 0; e < a.length; e++)D(t, a[e]); t.iInitDisplayStart = r, W(t), pt(t, !1), lt(t, n)}, t):(pt(t, !1), lt(t)))}function lt(t, e){t._bInitComplete = !0, (e || t.oInit.aaData) && h(t), Wt(t, "aoInitComplete", "init", [t, e])}function ut(t, e){var n = parseInt(e, 10); t._iDisplayLength = n, Ut(t), Wt(t, null, "length", [t, n])}function ct(t){for (var e = t.oClasses, n = t.sTableId, r = t.aLengthMenu, o = a.isArray(r[0]), i = o?r[0]:r, s = o?r[1]:r, l = a("<select/>", {name:n + "_length", "aria-controls":n, "class":e.sLengthSelect}), u = 0, c = i.length; c > u; u++)l[0][u] = new Option(s[u], i[u]); var f = a("<div><label/></div>").addClass(e.sLength); return t.aanFeatures.l || (f[0].id = n + "_length"), f.children().append(t.oLanguage.sLengthMenu.replace("_MENU_", l[0].outerHTML)), a("select", f).val(t._iDisplayLength).bind("change.DT", function(e){ut(t, a(this).val()), M(t)}), a(t.nTable).bind("length.dt.DT", function(e, n, r){t === n && a("select", f).val(r)}), f[0]}function ft(t){var e = t.sPaginationType, n = qt.ext.pager[e], r = "function" == typeof n, o = function(t){M(t)}, i = a("<div/>").addClass(t.oClasses.sPaging + e)[0], s = t.aanFeatures; return r || n.fnInit(t, i, o), s.p || (i.id = t.sTableId + "_paginate", t.aoDrawCallback.push({fn:function(t){if (r){var e, a, i = t._iDisplayStart, l = t._iDisplayLength, u = t.fnRecordsDisplay(), c = - 1 === l, f = c?0:Math.ceil(i / l), d = c?1:Math.ceil(u / l), h = n(f, d); for (e = 0, a = s.p.length; a > e; e++)Et(t, "pageButton")(t, s.p[e], e, h, f, d)} else n.fnUpdate(t, o)}, sName:"pagination"})), i}function dt(t, e, n){var a = t._iDisplayStart, r = t._iDisplayLength, o = t.fnRecordsDisplay(); 0 === o || - 1 === r?a = 0:"number" == typeof e?(a = e * r, a > o && (a = 0)):"first" == e?a = 0:"previous" == e?(a = r >= 0?a - r:0, 0 > a && (a = 0)):"next" == e?o > a + r && (a += r):"last" == e?a = Math.floor((o - 1) / r) * r:Ht(t, 0, "Unknown paging action: " + e, 5); var i = t._iDisplayStart !== a; return t._iDisplayStart = a, i && (Wt(t, null, "page", [t]), n && M(t)), i}function ht(t){return a("<div/>", {id:t.aanFeatures.r?null:t.sTableId + "_processing", "class":t.oClasses.sProcessing}).html(t.oLanguage.sProcessing).insertBefore(t.nTable)[0]}function pt(t, e){t.oFeatures.bProcessing && a(t.aanFeatures.r).css("display", e?"block":"none"), Wt(t, null, "processing", [t, e])}function gt(t){var e = a(t.nTable); e.attr("role", "grid"); var n = t.oScroll; if ("" === n.sX && "" === n.sY)return t.nTable; var r = n.sX, o = n.sY, i = t.oClasses, s = e.children("caption"), l = s.length?s[0]._captionSide:null, u = a(e[0].cloneNode(!1)), c = a(e[0].cloneNode(!1)), f = e.children("tfoot"), d = "<div/>", h = function(t){return t?Tt(t):null}; n.sX && "100%" === e.attr("width") && e.removeAttr("width"), f.length || (f = null); var p = a(d, {"class":i.sScrollWrapper}).append(a(d, {"class":i.sScrollHead}).css({overflow:"hidden", position:"relative", border:0, width:r?h(r):"100%"}).append(a(d, {"class":i.sScrollHeadInner}).css({"box-sizing":"content-box", width:n.sXInner || "100%"}).append(u.removeAttr("id").css("margin-left", 0).append("top" === l?s:null).append(e.children("thead"))))).append(a(d, {"class":i.sScrollBody}).css({position:"relative", overflow:"auto", width:h(r)}).append(e)); f && p.append(a(d, {"class":i.sScrollFoot}).css({overflow:"hidden", border:0, width:r?h(r):"100%"}).append(a(d, {"class":i.sScrollFootInner}).append(c.removeAttr("id").css("margin-left", 0).append("bottom" === l?s:null).append(e.children("tfoot"))))); var g = p.children(), b = g[0], v = g[1], S = f?g[2]:null; return r && a(v).on("scroll.DT", function(t){var e = this.scrollLeft; b.scrollLeft = e, f && (S.scrollLeft = e)}), a(v).css(o && n.bCollapse?"max-height":"height", o), t.nScrollHead = b, t.nScrollBody = v, t.nScrollFoot = S, t.aoDrawCallback.push({fn:bt, sName:"scrolling"}), p[0]}function bt(t){var e, n, r, o, i, s, l, u, c, f = t.oScroll, d = f.sX, h = f.sXInner, g = f.sY, b = f.iBarWidth, v = a(t.nScrollHead), S = v[0].style, m = v.children("div"), D = m[0].style, y = m.children("table"), _ = t.nScrollBody, T = a(_), w = _.style, C = a(t.nScrollFoot), x = C.children("div"), I = x.children("table"), A = a(t.nTHead), F = a(t.nTable), L = F[0], P = L.style, R = t.nTFoot?a(t.nTFoot):null, j = t.oBrowser, H = j.bScrollOversize, N = [], k = [], O = [], M = function(t){var e = t.style; e.paddingTop = "0", e.paddingBottom = "0", e.borderTopWidth = "0", e.borderBottomWidth = "0", e.height = 0}; F.children("thead, tfoot").remove(), i = A.clone().prependTo(F), e = A.find("tr"), r = i.find("tr"), i.find("th, td").removeAttr("tabindex"), R && (s = R.clone().prependTo(F), n = R.find("tr"), o = s.find("tr")), d || (w.width = "100%", v[0].style.width = "100%"), a.each(B(t, i), function(e, n){l = p(t, e), n.style.width = t.aoColumns[l].sWidth}), R && vt(function(t){t.style.width = ""}, o), c = F.outerWidth(), "" === d?(P.width = "100%", H && (F.find("tbody").height() > _.offsetHeight || "scroll" == T.css("overflow-y")) && (P.width = Tt(F.outerWidth() - b)), c = F.outerWidth()):"" !== h && (P.width = Tt(h), c = F.outerWidth()), vt(M, r), vt(function(t){O.push(t.innerHTML), N.push(Tt(a(t).css("width")))}, r), vt(function(t, e){t.style.width = N[e]}, e), a(r).height(0), R && (vt(M, o), vt(function(t){k.push(Tt(a(t).css("width")))}, o), vt(function(t, e){t.style.width = k[e]}, n), a(o).height(0)), vt(function(t, e){t.innerHTML = '<div class="dataTables_sizing" style="height:0;overflow:hidden;">' + O[e] + "</div>", t.style.width = N[e]}, r), R && vt(function(t, e){t.innerHTML = "", t.style.width = k[e]}, o), F.outerWidth() < c?(u = _.scrollHeight > _.offsetHeight || "scroll" == T.css("overflow-y")?c + b:c, H && (_.scrollHeight > _.offsetHeight || "scroll" == T.css("overflow-y")) && (P.width = Tt(u - b)), ("" === d || "" !== h) && Ht(t, 1, "Possible column misalignment", 6)):u = "100%", w.width = Tt(u), S.width = Tt(u), R && (t.nScrollFoot.style.width = Tt(u)), g || H && (w.height = Tt(L.offsetHeight + b)); var W = F.outerWidth(); y[0].style.width = Tt(W), D.width = Tt(W); var U = F.height() > _.clientHeight || "scroll" == T.css("overflow-y"), E = "padding" + (j.bScrollbarLeft?"Left":"Right"); D[E] = U?b + "px":"0px", R && (I[0].style.width = Tt(W), x[0].style.width = Tt(W), x[0].style[E] = U?b + "px":"0px"), T.scroll(), !t.bSorted && !t.bFiltered || t._drawHold || (_.scrollTop = 0)}function vt(t, e, n){for (var a, r, o = 0, i = 0, s = e.length; s > i; ){for (a = e[i].firstChild, r = n?n[i].firstChild:null; a; )1 === a.nodeType && (n?t(a, r, o):t(a, o), o++), a = a.nextSibling, r = n?r.nextSibling:null; i++}}function St(e){var n, r, o, i, s, l = e.nTable, u = e.aoColumns, c = e.oScroll, f = c.sY, d = c.sX, g = c.sXInner, S = u.length, m = v(e, "bVisible"), D = a("th", e.nTHead), y = l.getAttribute("width"), _ = l.parentNode, T = !1, w = e.oBrowser, C = w.bScrollOversize, x = l.style.width; for (x && - 1 !== x.indexOf("%") && (y = x), n = 0; n < m.length; n++)r = u[m[n]], null !== r.sWidth && (r.sWidth = Dt(r.sWidthOrig, _), T = !0); if (C || !T && !d && !f && S == b(e) && S == D.length)for (n = 0; S > n; n++){var I = p(e, n); I && (u[I].sWidth = Tt(D.eq(n).width()))} else{var A = a(l).clone().css("visibility", "hidden").removeAttr("id"); A.find("tbody tr").remove(); var F = a("<tr/>").appendTo(A.find("tbody")); for (A.find("thead, tfoot").remove(), A.append(a(e.nTHead).clone()).append(a(e.nTFoot).clone()), A.find("tfoot th, tfoot td").css("width", ""), D = B(e, A.find("thead")[0]), n = 0; n < m.length; n++)r = u[m[n]], D[n].style.width = null !== r.sWidthOrig && "" !== r.sWidthOrig?Tt(r.sWidthOrig):""; if (e.aoData.length)for (n = 0; n < m.length; n++)o = m[n], r = u[o], a(yt(e, o)).clone(!1).append(r.sContentPadding).appendTo(F); var L = a("<div/>").css(d || f?{position:"absolute", top:0, left:0, height:1, right:0, overflow:"hidden"}:{}).append(A).appendTo(_); if (d && g?A.width(g):d?(A.css("width", "auto"), A.width() < _.clientWidth && A.width(_.clientWidth)):f?A.width(_.clientWidth):y && A.width(y), d){var P = 0; for (n = 0; n < m.length; n++)r = u[m[n]], s = w.bBounding?D[n].getBoundingClientRect().width:a(D[n]).outerWidth(), P += null === r.sWidthOrig?s:parseInt(r.sWidth, 10) + s - a(D[n]).width(); A.width(Tt(P)), l.style.width = Tt(P)}for (n = 0; n < m.length; n++)r = u[m[n]], i = a(D[n]).width(), i && (r.sWidth = Tt(i)); l.style.width = Tt(A.css("width")), L.remove()}if (y && (l.style.width = Tt(y)), (y || d) && !e._reszEvt){var R = function(){a(t).bind("resize.DT-" + e.sInstance, mt(function(){h(e)}))}; C?setTimeout(R, 1e3):R(), e._reszEvt = !0}}function mt(t, e){var a, r, o = e !== n?e:200; return function(){var e = this, i = + new Date, s = arguments; a && a + o > i?(clearTimeout(r), r = setTimeout(function(){a = n, t.apply(e, s)}, o)):(a = i, t.apply(e, s))}}function Dt(t, n){if (!t)return 0; var r = a("<div/>").css("width", Tt(t)).appendTo(n || e.body), o = r[0].offsetWidth; return r.remove(), o}function yt(t, e){var n = _t(t, e); if (0 > n)return null; var r = t.aoData[n]; return r.nTr?r.anCells[e]:a("<td/>").html(w(t, n, e, "display"))[0]}function _t(t, e){for (var n, a = - 1, r = - 1, o = 0, i = t.aoData.length; i > o; o++)n = w(t, o, e, "display") + "", n = n.replace(ye, ""), n.length > a && (a = n.length, r = o); return r}function Tt(t){return null === t?"0px":"number" == typeof t?0 > t?"0px":t + "px":t.match(/\d$/)?t + "px":t}function wt(t){var e, r, o, i, s, l, u, c = [], f = t.aoColumns, d = t.aaSortingFixed, h = a.isPlainObject(d), p = [], g = function(t){t.length && !a.isArray(t[0])?p.push(t):a.merge(p, t)}; for (a.isArray(d) && g(d), h && d.pre && g(d.pre), g(t.aaSorting), h && d.post && g(d.post), e = 0; e < p.length; e++)for (u = p[e][0], i = f[u].aDataSort, r = 0, o = i.length; o > r; r++)s = i[r], l = f[s].sType || "string", p[e]._idx === n && (p[e]._idx = a.inArray(p[e][1], f[s].asSorting)), c.push({src:u, col:s, dir:p[e][1], index:p[e]._idx, type:l, formatter:qt.ext.type.order[l + "-pre"]}); return c}function Ct(t){var e, n, a, r, o, i = [], s = qt.ext.type.order, l = t.aoData, u = (t.aoColumns, 0), c = t.aiDisplayMaster; for (S(t), o = wt(t), e = 0, n = o.length; n > e; e++)r = o[e], r.formatter && u++, Lt(t, r.col); if ("ssp" != Bt(t) && 0 !== o.length){for (e = 0, a = c.length; a > e; e++)i[c[e]] = e; u === o.length?c.sort(function(t, e){var n, a, r, s, u, c = o.length, f = l[t]._aSortData, d = l[e]._aSortData; for (r = 0; c > r; r++)if (u = o[r], n = f[u.col], a = d[u.col], s = a > n? - 1:n > a?1:0, 0 !== s)return"asc" === u.dir?s: - s; return n = i[t], a = i[e], a > n? - 1:n > a?1:0}):c.sort(function(t, e){var n, a, r, u, c, f, d = o.length, h = l[t]._aSortData, p = l[e]._aSortData; for (r = 0; d > r; r++)if (c = o[r], n = h[c.col], a = p[c.col], f = s[c.type + "-" + c.dir] || s["string-" + c.dir], u = f(n, a), 0 !== u)return u; return n = i[t], a = i[e], a > n? - 1:n > a?1:0})}t.bSorted = !0}function xt(t){for (var e, n, a = t.aoColumns, r = wt(t), o = t.oLanguage.oAria, i = 0, s = a.length; s > i; i++){var l = a[i], u = l.asSorting, c = l.sTitle.replace(/<.*?>/g, ""), f = l.nTh;
2
+ f.removeAttribute("aria-sort"), l.bSortable?(r.length > 0 && r[0].col == i?(f.setAttribute("aria-sort", "asc" == r[0].dir?"ascending":"descending"), n = u[r[0].index + 1] || u[0]):n = u[0], e = c + ("asc" === n?o.sSortAscending:o.sSortDescending)):e = c, f.setAttribute("aria-label", e)}}function It(t, e, r, o){var i, s = t.aoColumns[e], l = t.aaSorting, u = s.asSorting, c = function(t, e){var r = t._idx; return r === n && (r = a.inArray(t[1], u)), r + 1 < u.length?r + 1:e?null:0}; if ("number" == typeof l[0] && (l = t.aaSorting = [l]), r && t.oFeatures.bSortMulti){var f = a.inArray(e, ce(l, "0")); - 1 !== f?(i = c(l[f], !0), null === i && 1 === l.length && (i = 0), null === i?l.splice(f, 1):(l[f][1] = u[i], l[f]._idx = i)):(l.push([e, u[0], 0]), l[l.length - 1]._idx = 0)} else l.length && l[0][0] == e?(i = c(l[0]), l.length = 1, l[0][1] = u[i], l[0]._idx = i):(l.length = 0, l.push([e, u[0]]), l[0]._idx = 0); W(t), "function" == typeof o && o(t)}function At(t, e, n, a){var r = t.aoColumns[n]; Ot(e, {}, function(e){r.bSortable !== !1 && (t.oFeatures.bProcessing?(pt(t, !0), setTimeout(function(){It(t, n, e.shiftKey, a), "ssp" !== Bt(t) && pt(t, !1)}, 0)):It(t, n, e.shiftKey, a))})}function Ft(t){var e, n, r, o = t.aLastSort, i = t.oClasses.sSortColumn, s = wt(t), l = t.oFeatures; if (l.bSort && l.bSortClasses){for (e = 0, n = o.length; n > e; e++)r = o[e].src, a(ce(t.aoData, "anCells", r)).removeClass(i + (2 > e?e + 1:3)); for (e = 0, n = s.length; n > e; e++)r = s[e].src, a(ce(t.aoData, "anCells", r)).addClass(i + (2 > e?e + 1:3))}t.aLastSort = s}function Lt(t, e){var n, a = t.aoColumns[e], r = qt.ext.order[a.sSortDataType]; r && (n = r.call(t.oInstance, t, e, g(t, e))); for (var o, i, s = qt.ext.type.order[a.sType + "-pre"], l = 0, u = t.aoData.length; u > l; l++)o = t.aoData[l], o._aSortData || (o._aSortData = []), (!o._aSortData[e] || r) && (i = r?n[l]:w(t, l, e, "sort"), o._aSortData[e] = s?s(i):i)}function Pt(t){if (t.oFeatures.bStateSave && !t.bDestroying){var e = {time: + new Date, start:t._iDisplayStart, length:t._iDisplayLength, order:a.extend(!0, [], t.aaSorting), search:nt(t.oPreviousSearch), columns:a.map(t.aoColumns, function(e, n){return{visible:e.bVisible, search:nt(t.aoPreSearchCols[n])}})}; Wt(t, "aoStateSaveParams", "stateSaveParams", [t, e]), t.oSavedState = e, t.fnStateSaveCallback.call(t.oInstance, t, e)}}function Rt(t, e){var r, o, i = t.aoColumns; if (t.oFeatures.bStateSave){var s = t.fnStateLoadCallback.call(t.oInstance, t); if (s && s.time){var l = Wt(t, "aoStateLoadParams", "stateLoadParams", [t, s]); if ( - 1 === a.inArray(!1, l)){var u = t.iStateDuration; if (!(u > 0 && s.time < + new Date - 1e3 * u) && i.length === s.columns.length){for (t.oLoadedState = a.extend(!0, {}, s), s.start !== n && (t._iDisplayStart = s.start, t.iInitDisplayStart = s.start), s.length !== n && (t._iDisplayLength = s.length), s.order !== n && (t.aaSorting = [], a.each(s.order, function(e, n){t.aaSorting.push(n[0] >= i.length?[0, n[1]]:n)})), s.search !== n && a.extend(t.oPreviousSearch, at(s.search)), r = 0, o = s.columns.length; o > r; r++){var c = s.columns[r]; c.visible !== n && (i[r].bVisible = c.visible), c.search !== n && a.extend(t.aoPreSearchCols[r], at(c.search))}Wt(t, "aoStateLoaded", "stateLoaded", [t, s])}}}}}function jt(t){var e = qt.settings, n = a.inArray(t, ce(e, "nTable")); return - 1 !== n?e[n]:null}function Ht(e, n, a, r){if (a = "DataTables warning: " + (e?"table id=" + e.sTableId + " - ":"") + a, r && (a += ". For more information about this error, please see http://datatables.net/tn/" + r), n)t.console && console.log && console.log(a); else{var o = qt.ext, i = o.sErrMode || o.errMode; if (e && Wt(e, null, "error", [e, r, a]), "alert" == i)alert(a); else{if ("throw" == i)throw new Error(a); "function" == typeof i && i(e, r, a)}}}function Nt(t, e, r, o){return a.isArray(r)?void a.each(r, function(n, r){a.isArray(r)?Nt(t, e, r[0], r[1]):Nt(t, e, r)}):(o === n && (o = r), void(e[r] !== n && (t[o] = e[r])))}function kt(t, e, n){var r; for (var o in e)e.hasOwnProperty(o) && (r = e[o], a.isPlainObject(r)?(a.isPlainObject(t[o]) || (t[o] = {}), a.extend(!0, t[o], r)):n && "data" !== o && "aaData" !== o && a.isArray(r)?t[o] = r.slice():t[o] = r); return t}function Ot(t, e, n){a(t).bind("click.DT", e, function(e){t.blur(), n(e)}).bind("keypress.DT", e, function(t){13 === t.which && (t.preventDefault(), n(t))}).bind("selectstart.DT", function(){return!1})}function Mt(t, e, n, a){n && t[e].push({fn:n, sName:a})}function Wt(t, e, n, r){var o = []; if (e && (o = a.map(t[e].slice().reverse(), function(e, n){return e.fn.apply(t.oInstance, r)})), null !== n){var i = a.Event(n + ".dt"); a(t.nTable).trigger(i, r), o.push(i.result)}return o}function Ut(t){var e = t._iDisplayStart, n = t.fnDisplayEnd(), a = t._iDisplayLength; e >= n && (e = n - a), e -= e % a, ( - 1 === a || 0 > e) && (e = 0), t._iDisplayStart = e}function Et(t, e){var n = t.renderer, r = qt.ext.renderer[e]; return a.isPlainObject(n) && n[e]?r[n[e]] || r._:"string" == typeof n?r[n] || r._:r._}function Bt(t){return t.oFeatures.bServerSide?"ssp":t.ajax || t.sAjaxSource?"ajax":"dom"}function Jt(t, e){var n = [], a = Xe.numbers_length, r = Math.floor(a / 2); return a >= e?n = de(0, e):r >= t?(n = de(0, a - 2), n.push("ellipsis"), n.push(e - 1)):t >= e - 1 - r?(n = de(e - (a - 2), e), n.splice(0, 0, "ellipsis"), n.splice(0, 0, 0)):(n = de(t - r + 2, t + r - 1), n.push("ellipsis"), n.push(e - 1), n.splice(0, 0, "ellipsis"), n.splice(0, 0, 0)), n.DT_el = "span", n}function Xt(t){a.each({num:function(e){return Ve(e, t)}, "num-fmt":function(e){return Ve(e, t, ae)}, "html-num":function(e){return Ve(e, t, Kt)}, "html-num-fmt":function(e){return Ve(e, t, Kt, ae)}}, function(e, n){Gt.type.order[e + t + "-pre"] = n, e.match(/^html\-/) && (Gt.type.search[e + t] = Gt.type.search.html)})}function Vt(t){return function(){var e = [jt(this[qt.ext.iApiIndex])].concat(Array.prototype.slice.call(arguments)); return qt.ext.internal[t].apply(this, e)}}var qt, Gt, $t, zt, Yt, Qt = {}, Zt = /[\r\n]/g, Kt = /<.*?>/g, te = /^[\w\+\-]/, ee = /[\w\+\-]$/, ne = new RegExp("(\\" + ["/", ".", "*", "+", "?", "|", "(", ")", "[", "]", "{", "}", "\\", "$", "^", "-"].join("|\\") + ")", "g"), ae = /[',$£€¥%\u2009\u202F\u20BD\u20a9\u20BArfk]/gi, re = function(t){return t && t !== !0 && "-" !== t?!1:!0}, oe = function(t){var e = parseInt(t, 10); return!isNaN(e) && isFinite(t)?e:null}, ie = function(t, e){return Qt[e] || (Qt[e] = new RegExp(tt(e), "g")), "string" == typeof t && "." !== e?t.replace(/\./g, "").replace(Qt[e], "."):t}, se = function(t, e, n){var a = "string" == typeof t; return re(t)?!0:(e && a && (t = ie(t, e)), n && a && (t = t.replace(ae, "")), !isNaN(parseFloat(t)) && isFinite(t))}, le = function(t){return re(t) || "string" == typeof t}, ue = function(t, e, n){if (re(t))return!0; var a = le(t); return a && se(pe(t), e, n)?!0:null}, ce = function(t, e, a){var r = [], o = 0, i = t.length; if (a !== n)for (; i > o; o++)t[o] && t[o][e] && r.push(t[o][e][a]); else for (; i > o; o++)t[o] && r.push(t[o][e]); return r}, fe = function(t, e, a, r){var o = [], i = 0, s = e.length; if (r !== n)for (; s > i; i++)t[e[i]][a] && o.push(t[e[i]][a][r]); else for (; s > i; i++)o.push(t[e[i]][a]); return o}, de = function(t, e){var a, r = []; e === n?(e = 0, a = t):(a = e, e = t); for (var o = e; a > o; o++)r.push(o); return r}, he = function(t){for (var e = [], n = 0, a = t.length; a > n; n++)t[n] && e.push(t[n]); return e}, pe = function(t){return t.replace(Kt, "")}, ge = function(t){var e, n, a, r = [], o = t.length, i = 0; t:for (n = 0; o > n; n++){for (e = t[n], a = 0; i > a; a++)if (r[a] === e)continue t; r.push(e), i++}return r}, be = function(t, e, a){t[e] !== n && (t[a] = t[e])}, ve = /\[.*?\]$/, Se = /\(\)$/, me = a("<div>")[0], De = me.textContent !== n, ye = /<.*?>/g; qt = function(t){this.$ = function(t, e){return this.api(!0).$(t, e)}, this._ = function(t, e){return this.api(!0).rows(t, e).data()}, this.api = function(t){return new $t(t?jt(this[Gt.iApiIndex]):this)}, this.fnAddData = function(t, e){var r = this.api(!0), o = a.isArray(t) && (a.isArray(t[0]) || a.isPlainObject(t[0]))?r.rows.add(t):r.row.add(t); return(e === n || e) && r.draw(), o.flatten().toArray()}, this.fnAdjustColumnSizing = function(t){var e = this.api(!0).columns.adjust(), a = e.settings()[0], r = a.oScroll; t === n || t?e.draw(!1):("" !== r.sX || "" !== r.sY) && bt(a)}, this.fnClearTable = function(t){var e = this.api(!0).clear(); (t === n || t) && e.draw()}, this.fnClose = function(t){this.api(!0).row(t).child.hide()}, this.fnDeleteRow = function(t, e, a){var r = this.api(!0), o = r.rows(t), i = o.settings()[0], s = i.aoData[o[0][0]]; return o.remove(), e && e.call(this, i, s), (a === n || a) && r.draw(), s}, this.fnDestroy = function(t){this.api(!0).destroy(t)}, this.fnDraw = function(t){this.api(!0).draw(t)}, this.fnFilter = function(t, e, a, r, o, i){var s = this.api(!0); null === e || e === n?s.search(t, a, r, i):s.column(e).search(t, a, r, i), s.draw()}, this.fnGetData = function(t, e){var a = this.api(!0); if (t !== n){var r = t.nodeName?t.nodeName.toLowerCase():""; return e !== n || "td" == r || "th" == r?a.cell(t, e).data():a.row(t).data() || null}return a.data().toArray()}, this.fnGetNodes = function(t){var e = this.api(!0); return t !== n?e.row(t).node():e.rows().nodes().flatten().toArray()}, this.fnGetPosition = function(t){var e = this.api(!0), n = t.nodeName.toUpperCase(); if ("TR" == n)return e.row(t).index(); if ("TD" == n || "TH" == n){var a = e.cell(t).index(); return[a.row, a.columnVisible, a.column]}return null}, this.fnIsOpen = function(t){return this.api(!0).row(t).child.isShown()}, this.fnOpen = function(t, e, n){return this.api(!0).row(t).child(e, n).show().child()[0]}, this.fnPageChange = function(t, e){var a = this.api(!0).page(t); (e === n || e) && a.draw(!1)}, this.fnSetColumnVis = function(t, e, a){var r = this.api(!0).column(t).visible(e); (a === n || a) && r.columns.adjust().draw()}, this.fnSettings = function(){return jt(this[Gt.iApiIndex])}, this.fnSort = function(t){this.api(!0).order(t).draw()}, this.fnSortListener = function(t, e, n){this.api(!0).order.listener(t, e, n)}, this.fnUpdate = function(t, e, a, r, o){var i = this.api(!0); return a === n || null === a?i.row(e).data(t):i.cell(e, a).data(t), (o === n || o) && i.columns.adjust(), (r === n || r) && i.draw(), 0}, this.fnVersionCheck = Gt.fnVersionCheck; var e = this, r = t === n, c = this.length; r && (t = {}), this.oApi = this.internal = Gt.internal; for (var h in qt.ext.internal)h && (this[h] = Vt(h)); return this.each(function(){var h, p = {}, g = c > 1?kt(p, t, !0):t, b = 0, v = this.getAttribute("id"), S = !1, _ = qt.defaults, T = a(this); if ("table" != this.nodeName.toLowerCase())return void Ht(null, 0, "Non-table node initialisation (" + this.nodeName + ")", 2); s(_), l(_.column), o(_, _, !0), o(_.column, _.column, !0), o(_, a.extend(g, T.data())); var w = qt.settings; for (b = 0, h = w.length; h > b; b++){var C = w[b]; if (C.nTable == this || C.nTHead.parentNode == this || C.nTFoot && C.nTFoot.parentNode == this){var x = g.bRetrieve !== n?g.bRetrieve:_.bRetrieve, A = g.bDestroy !== n?g.bDestroy:_.bDestroy; if (r || x)return C.oInstance; if (A){C.oInstance.fnDestroy(); break}return void Ht(C, 0, "Cannot reinitialise DataTable", 3)}if (C.sTableId == this.id){w.splice(b, 1); break}}(null === v || "" === v) && (v = "DataTables_Table_" + qt.ext._unique++, this.id = v); var F = a.extend(!0, {}, qt.models.oSettings, {sDestroyWidth:T[0].style.width, sInstance:v, sTableId:v}); F.nTable = this, F.oApi = e.internal, F.oInit = g, w.push(F), F.oInstance = 1 === e.length?e:T.dataTable(), s(g), g.oLanguage && i(g.oLanguage), g.aLengthMenu && !g.iDisplayLength && (g.iDisplayLength = a.isArray(g.aLengthMenu[0])?g.aLengthMenu[0][0]:g.aLengthMenu[0]), g = kt(a.extend(!0, {}, _), g), Nt(F.oFeatures, g, ["bPaginate", "bLengthChange", "bFilter", "bSort", "bSortMulti", "bInfo", "bProcessing", "bAutoWidth", "bSortClasses", "bServerSide", "bDeferRender"]), Nt(F, g, ["asStripeClasses", "ajax", "fnServerData", "fnFormatNumber", "sServerMethod", "aaSorting", "aaSortingFixed", "aLengthMenu", "sPaginationType", "sAjaxSource", "sAjaxDataProp", "iStateDuration", "sDom", "bSortCellsTop", "iTabIndex", "fnStateLoadCallback", "fnStateSaveCallback", "renderer", "searchDelay", "rowId", ["iCookieDuration", "iStateDuration"], ["oSearch", "oPreviousSearch"], ["aoSearchCols", "aoPreSearchCols"], ["iDisplayLength", "_iDisplayLength"], ["bJQueryUI", "bJUI"]]), Nt(F.oScroll, g, [["sScrollX", "sX"], ["sScrollXInner", "sXInner"], ["sScrollY", "sY"], ["bScrollCollapse", "bCollapse"]]), Nt(F.oLanguage, g, "fnInfoCallback"), Mt(F, "aoDrawCallback", g.fnDrawCallback, "user"), Mt(F, "aoServerParams", g.fnServerParams, "user"), Mt(F, "aoStateSaveParams", g.fnStateSaveParams, "user"), Mt(F, "aoStateLoadParams", g.fnStateLoadParams, "user"), Mt(F, "aoStateLoaded", g.fnStateLoaded, "user"), Mt(F, "aoRowCallback", g.fnRowCallback, "user"), Mt(F, "aoRowCreatedCallback", g.fnCreatedRow, "user"), Mt(F, "aoHeaderCallback", g.fnHeaderCallback, "user"), Mt(F, "aoFooterCallback", g.fnFooterCallback, "user"), Mt(F, "aoInitComplete", g.fnInitComplete, "user"), Mt(F, "aoPreDrawCallback", g.fnPreDrawCallback, "user"), F.rowIdFn = I(g.rowId), u(F); var L = F.oClasses; if (g.bJQueryUI?(a.extend(L, qt.ext.oJUIClasses, g.oClasses), g.sDom === _.sDom && "lfrtip" === _.sDom && (F.sDom = '<"H"lfr>t<"F"ip>'), F.renderer?a.isPlainObject(F.renderer) && !F.renderer.header && (F.renderer.header = "jqueryui"):F.renderer = "jqueryui"):a.extend(L, qt.ext.classes, g.oClasses), T.addClass(L.sTable), F.iInitDisplayStart === n && (F.iInitDisplayStart = g.iDisplayStart, F._iDisplayStart = g.iDisplayStart), null !== g.iDeferLoading){F.bDeferLoading = !0; var P = a.isArray(g.iDeferLoading); F._iRecordsDisplay = P?g.iDeferLoading[0]:g.iDeferLoading, F._iRecordsTotal = P?g.iDeferLoading[1]:g.iDeferLoading}var R = F.oLanguage; a.extend(!0, R, g.oLanguage), "" !== R.sUrl && (a.ajax({dataType:"json", url:R.sUrl, success:function(t){i(t), o(_.oLanguage, t), a.extend(!0, R, t), st(F)}, error:function(){st(F)}}), S = !0), null === g.asStripeClasses && (F.asStripeClasses = [L.sStripeOdd, L.sStripeEven]); var j = F.asStripeClasses, H = T.children("tbody").find("tr").eq(0); - 1 !== a.inArray(!0, a.map(j, function(t, e){return H.hasClass(t)})) && (a("tbody tr", this).removeClass(j.join(" ")), F.asDestroyStripes = j.slice()); var N, k = [], O = this.getElementsByTagName("thead"); if (0 !== O.length && (E(F.aoHeader, O[0]), k = B(F)), null === g.aoColumns)for (N = [], b = 0, h = k.length; h > b; b++)N.push(null); else N = g.aoColumns; for (b = 0, h = N.length; h > b; b++)f(F, k?k[b]:null); if (m(F, g.aoColumnDefs, N, function(t, e){d(F, t, e)}), H.length){var M = function(t, e){return null !== t.getAttribute("data-" + e)?e:null}; a(H[0]).children("th, td").each(function(t, e){var a = F.aoColumns[t]; if (a.mData === t){var r = M(e, "sort") || M(e, "order"), o = M(e, "filter") || M(e, "search"); (null !== r || null !== o) && (a.mData = {_:t + ".display", sort:null !== r?t + ".@data-" + r:n, type:null !== r?t + ".@data-" + r:n, filter:null !== o?t + ".@data-" + o:n}, d(F, t))}})}var W = F.oFeatures; if (g.bStateSave && (W.bStateSave = !0, Rt(F, g), Mt(F, "aoDrawCallback", Pt, "state_save")), g.aaSorting === n){var U = F.aaSorting; for (b = 0, h = U.length; h > b; b++)U[b][1] = F.aoColumns[b].asSorting[0]}Ft(F), W.bSort && Mt(F, "aoDrawCallback", function(){if (F.bSorted){var t = wt(F), e = {}; a.each(t, function(t, n){e[n.src] = n.dir}), Wt(F, null, "order", [F, t, e]), xt(F)}}), Mt(F, "aoDrawCallback", function(){(F.bSorted || "ssp" === Bt(F) || W.bDeferRender) && Ft(F)}, "sc"); var J = T.children("caption").each(function(){this._captionSide = T.css("caption-side")}), X = T.children("thead"); 0 === X.length && (X = a("<thead/>").appendTo(this)), F.nTHead = X[0]; var V = T.children("tbody"); 0 === V.length && (V = a("<tbody/>").appendTo(this)), F.nTBody = V[0]; var q = T.children("tfoot"); if (0 === q.length && J.length > 0 && ("" !== F.oScroll.sX || "" !== F.oScroll.sY) && (q = a("<tfoot/>").appendTo(this)), 0 === q.length || 0 === q.children().length?T.addClass(L.sNoFooter):q.length > 0 && (F.nTFoot = q[0], E(F.aoFooter, F.nTFoot)), g.aaData)for (b = 0; b < g.aaData.length; b++)D(F, g.aaData[b]); else(F.bDeferLoading || "dom" == Bt(F)) && y(F, a(F.nTBody).children("tr")); F.aiDisplay = F.aiDisplayMaster.slice(), F.bInitialised = !0, S === !1 && st(F)}), e = null, this}; var _e = [], Te = Array.prototype, we = function(t){var e, n, r = qt.settings, o = a.map(r, function(t, e){return t.nTable}); return t?t.nTable && t.oApi?[t]:t.nodeName && "table" === t.nodeName.toLowerCase()?(e = a.inArray(t, o), - 1 !== e?[r[e]]:null):t && "function" == typeof t.settings?t.settings().toArray():("string" == typeof t?n = a(t):t instanceof a && (n = t), n?n.map(function(t){return e = a.inArray(this, o), - 1 !== e?r[e]:null}).toArray():void 0):[]}; $t = function(t, e){if (!(this instanceof $t))return new $t(t, e); var n = [], r = function(t){var e = we(t); e && (n = n.concat(e))}; if (a.isArray(t))for (var o = 0, i = t.length; i > o; o++)r(t[o]); else r(t); this.context = ge(n), e && a.merge(this, e), this.selector = {rows:null, cols:null, opts:null}, $t.extend(this, this, _e)}, qt.Api = $t, a.extend($t.prototype, {any:function(){return 0 !== this.count()}, concat:Te.concat, context:[], count:function(){return this.flatten().length}, each:function(t){for (var e = 0, n = this.length; n > e; e++)t.call(this, this[e], e, this); return this}, eq:function(t){var e = this.context; return e.length > t?new $t(e[t], this[t]):null}, filter:function(t){var e = []; if (Te.filter)e = Te.filter.call(this, t, this); else for (var n = 0, a = this.length; a > n; n++)t.call(this, this[n], n, this) && e.push(this[n]); return new $t(this.context, e)}, flatten:function(){var t = []; return new $t(this.context, t.concat.apply(t, this.toArray()))}, join:Te.join, indexOf:Te.indexOf || function(t, e){for (var n = e || 0, a = this.length; a > n; n++)if (this[n] === t)return n; return - 1}, iterator:function(t, e, a, r){var o, i, s, l, u, c, f, d, h = [], p = this.context, g = this.selector; for ("string" == typeof t && (r = a, a = e, e = t, t = !1), i = 0, s = p.length; s > i; i++){var b = new $t(p[i]); if ("table" === e)o = a.call(b, p[i], i), o !== n && h.push(o); else if ("columns" === e || "rows" === e)o = a.call(b, p[i], this[i], i), o !== n && h.push(o); else if ("column" === e || "column-rows" === e || "row" === e || "cell" === e)for (f = this[i], "column-rows" === e && (c = Le(p[i], g.opts)), l = 0, u = f.length; u > l; l++)d = f[l], o = "cell" === e?a.call(b, p[i], d.row, d.column, i, l):a.call(b, p[i], d, i, l, c), o !== n && h.push(o)}if (h.length || r){var v = new $t(p, t?h.concat.apply([], h):h), S = v.selector; return S.rows = g.rows, S.cols = g.cols, S.opts = g.opts, v}return this}, lastIndexOf:Te.lastIndexOf || function(t, e){return this.indexOf.apply(this.toArray.reverse(), arguments)}, length:0, map:function(t){var e = []; if (Te.map)e = Te.map.call(this, t, this); else for (var n = 0, a = this.length; a > n; n++)e.push(t.call(this, this[n], n)); return new $t(this.context, e)}, pluck:function(t){return this.map(function(e){return e[t]})}, pop:Te.pop, push:Te.push, reduce:Te.reduce || function(t, e){return c(this, t, e, 0, this.length, 1)}, reduceRight:Te.reduceRight || function(t, e){return c(this, t, e, this.length - 1, - 1, - 1)}, reverse:Te.reverse, selector:null, shift:Te.shift, sort:Te.sort, splice:Te.splice, toArray:function(){return Te.slice.call(this)}, to$:function(){return a(this)}, toJQuery:function(){return a(this)}, unique:function(){return new $t(this.context, ge(this))}, unshift:Te.unshift}), $t.extend = function(t, e, n){if (n.length && e && (e instanceof $t || e.__dt_wrapper)){var r, o, i, s = function(t, e, n){return function(){var a = e.apply(t, arguments); return $t.extend(a, a, n.methodExt), a}}; for (r = 0, o = n.length; o > r; r++)i = n[r], e[i.name] = "function" == typeof i.val?s(t, i.val, i):a.isPlainObject(i.val)?{}:i.val, e[i.name].__dt_wrapper = !0, $t.extend(t, e[i.name], i.propExt)}}, $t.register = zt = function(t, e){if (a.isArray(t))for (var n = 0, r = t.length; r > n; n++)$t.register(t[n], e); else{var o, i, s, l, u = t.split("."), c = _e, f = function(t, e){for (var n = 0, a = t.length; a > n; n++)if (t[n].name === e)return t[n]; return null}; for (o = 0, i = u.length; i > o; o++){l = - 1 !== u[o].indexOf("()"), s = l?u[o].replace("()", ""):u[o]; var d = f(c, s); d || (d = {name:s, val:{}, methodExt:[], propExt:[]}, c.push(d)), o === i - 1?d.val = e:c = l?d.methodExt:d.propExt}}}, $t.registerPlural = Yt = function(t, e, r){$t.register(t, r), $t.register(e, function(){var t = r.apply(this, arguments); return t === this?this:t instanceof $t?t.length?a.isArray(t[0])?new $t(t.context, t[0]):t[0]:n:t})}; var Ce = function(t, e){if ("number" == typeof t)return[e[t]]; var n = a.map(e, function(t, e){return t.nTable}); return a(n).filter(t).map(function(t){var r = a.inArray(this, n); return e[r]}).toArray()}; zt("tables()", function(t){return t?new $t(Ce(t, this.context)):this}), zt("table()", function(t){var e = this.tables(t), n = e.context; return n.length?new $t(n[0]):e}), Yt("tables().nodes()", "table().node()", function(){return this.iterator("table", function(t){return t.nTable}, 1)}), Yt("tables().body()", "table().body()", function(){return this.iterator("table", function(t){return t.nTBody}, 1)}), Yt("tables().header()", "table().header()", function(){return this.iterator("table", function(t){return t.nTHead}, 1)}), Yt("tables().footer()", "table().footer()", function(){return this.iterator("table", function(t){return t.nTFoot}, 1)}), Yt("tables().containers()", "table().container()", function(){return this.iterator("table", function(t){return t.nTableWrapper}, 1)}), zt("draw()", function(t){return this.iterator("table", function(e){"page" === t?M(e):("string" == typeof t && (t = "full-hold" === t?!1:!0), W(e, t === !1))})}), zt("page()", function(t){return t === n?this.page.info().page:this.iterator("table", function(e){dt(e, t)})}), zt("page.info()", function(t){if (0 === this.context.length)return n; var e = this.context[0], a = e._iDisplayStart, r = e._iDisplayLength, o = e.fnRecordsDisplay(), i = - 1 === r; return{page:i?0:Math.floor(a / r), pages:i?1:Math.ceil(o / r), start:a, end:e.fnDisplayEnd(), length:r, recordsTotal:e.fnRecordsTotal(), recordsDisplay:o, serverSide:"ssp" === Bt(e)}}), zt("page.len()", function(t){return t === n?0 !== this.context.length?this.context[0]._iDisplayLength:n:this.iterator("table", function(e){ut(e, t)})}); var xe = function(t, e, n){if (n){var a = new $t(t); a.one("draw", function(){n(a.ajax.json())})}if ("ssp" == Bt(t))W(t, e); else{pt(t, !0); var r = t.jqXHR; r && 4 !== r.readyState && r.abort(), J(t, [], function(n){L(t); for (var a = G(t, n), r = 0, o = a.length; o > r; r++)D(t, a[r]); W(t, e), pt(t, !1)})}}; zt("ajax.json()", function(){var t = this.context; return t.length > 0?t[0].json:void 0}), zt("ajax.params()", function(){var t = this.context; return t.length > 0?t[0].oAjaxData:void 0}), zt("ajax.reload()", function(t, e){return this.iterator("table", function(n){xe(n, e === !1, t)})}), zt("ajax.url()", function(t){var e = this.context; return t === n?0 === e.length?n:(e = e[0], e.ajax?a.isPlainObject(e.ajax)?e.ajax.url:e.ajax:e.sAjaxSource):this.iterator("table", function(e){a.isPlainObject(e.ajax)?e.ajax.url = t:e.ajax = t})}), zt("ajax.url().load()", function(t, e){return this.iterator("table", function(n){xe(n, e === !1, t)})}); var Ie = function(t, e, r, o, i){var s, l, u, c, f, d, h = [], p = typeof e; for (e && "string" !== p && "function" !== p && e.length !== n || (e = [e]), u = 0, c = e.length; c > u; u++)for (l = e[u] && e[u].split?e[u].split(","):[e[u]], f = 0, d = l.length; d > f; f++)s = r("string" == typeof l[f]?a.trim(l[f]):l[f]), s && s.length && (h = h.concat(s)); var g = Gt.selector[t]; if (g.length)for (u = 0, c = g.length; c > u; u++)h = g[u](o, i, h); return ge(h)}, Ae = function(t){return t || (t = {}), t.filter && t.search === n && (t.search = t.filter), a.extend({search:"none", order:"current", page:"all"}, t)}, Fe = function(t){for (var e = 0, n = t.length; n > e; e++)if (t[e].length > 0)return t[0] = t[e], t[0].length = 1, t.length = 1, t.context = [t.context[e]], t; return t.length = 0, t}, Le = function(t, e){var n, r, o, i = [], s = t.aiDisplay, l = t.aiDisplayMaster, u = e.search, c = e.order, f = e.page; if ("ssp" == Bt(t))return"removed" === u?[]:de(0, l.length); if ("current" == f)for (n = t._iDisplayStart, r = t.fnDisplayEnd(); r > n; n++)i.push(s[n]); else if ("current" == c || "applied" == c)i = "none" == u?l.slice():"applied" == u?s.slice():a.map(l, function(t, e){return - 1 === a.inArray(t, s)?t:null}); else if ("index" == c || "original" == c)for (n = 0, r = t.aoData.length; r > n; n++)"none" == u?i.push(n):(o = a.inArray(n, s), ( - 1 === o && "removed" == u || o >= 0 && "applied" == u) && i.push(n)); return i}, Pe = function(t, e, r){var o = function(e){var o = oe(e); if (null !== o && !r)return[o]; var i = Le(t, r); if (null !== o && - 1 !== a.inArray(o, i))return[o]; if (!e)return i; if ("function" == typeof e)return a.map(i, function(n){var a = t.aoData[n]; return e(n, a._aData, a.nTr)?n:null}); var s = he(fe(t.aoData, i, "nTr")); if (e.nodeName && - 1 !== a.inArray(e, s))return[e._DT_RowIndex]; if ("string" == typeof e && "#" === e.charAt(0)){var l = t.aIds[e.replace(/^#/, "")]; if (l !== n)return[l.idx]}return a(s).filter(e).map(function(){return this._DT_RowIndex}).toArray()}; return Ie("row", e, o, t, r)}; zt("rows()", function(t, e){t === n?t = "":a.isPlainObject(t) && (e = t, t = ""), e = Ae(e); var r = this.iterator("table", function(n){return Pe(n, t, e)}, 1); return r.selector.rows = t, r.selector.opts = e, r}), zt("rows().nodes()", function(){return this.iterator("row", function(t, e){return t.aoData[e].nTr || n}, 1)}), zt("rows().data()", function(){return this.iterator(!0, "rows", function(t, e){return fe(t.aoData, e, "_aData")}, 1)}), Yt("rows().cache()", "row().cache()", function(t){return this.iterator("row", function(e, n){var a = e.aoData[n]; return"search" === t?a._aFilterData:a._aSortData}, 1)}), Yt("rows().invalidate()", "row().invalidate()", function(t){return this.iterator("row", function(e, n){R(e, n, t)})}), Yt("rows().indexes()", "row().index()", function(){return this.iterator("row", function(t, e){return e}, 1)}), Yt("rows().ids()", "row().id()", function(t){for (var e = [], n = this.context, a = 0, r = n.length; r > a; a++)for (var o = 0, i = this[a].length; i > o; o++){var s = n[a].rowIdFn(n[a].aoData[this[a][o]]._aData); e.push((t === !0?"#":"") + s)}return new $t(n, e)}), Yt("rows().remove()", "row().remove()", function(){var t = this; return this.iterator("row", function(e, a, r){var o = e.aoData, i = o[a]; o.splice(a, 1); for (var s = 0, l = o.length; l > s; s++)null !== o[s].nTr && (o[s].nTr._DT_RowIndex = s); P(e.aiDisplayMaster, a), P(e.aiDisplay, a), P(t[r], a, !1), Ut(e); var u = e.rowIdFn(i._aData); u !== n && delete e.aIds[u]}), this.iterator("table", function(t){for (var e = 0, n = t.aoData.length; n > e; e++)t.aoData[e].idx = e}), this}), zt("rows.add()", function(t){var e = this.iterator("table", function(e){var n, a, r, o = []; for (a = 0, r = t.length; r > a; a++)n = t[a], n.nodeName && "TR" === n.nodeName.toUpperCase()?o.push(y(e, n)[0]):o.push(D(e, n)); return o}, 1), n = this.rows( - 1); return n.pop(), a.merge(n, e), n}), zt("row()", function(t, e){return Fe(this.rows(t, e))}), zt("row().data()", function(t){var e = this.context; return t === n?e.length && this.length?e[0].aoData[this[0]]._aData:n:(e[0].aoData[this[0]]._aData = t, R(e[0], this[0], "data"), this)}), zt("row().node()", function(){var t = this.context; return t.length && this.length?t[0].aoData[this[0]].nTr || null:null}), zt("row.add()", function(t){t instanceof a && t.length && (t = t[0]); var e = this.iterator("table", function(e){return t.nodeName && "TR" === t.nodeName.toUpperCase()?y(e, t)[0]:D(e, t)}); return this.row(e[0])}); var Re = function(t, e, n, r){var o = [], i = function(e, n){if (a.isArray(e) || e instanceof a)for (var r = 0, s = e.length; s > r; r++)i(e[r], n); else if (e.nodeName && "tr" === e.nodeName.toLowerCase())o.push(e); else{var l = a("<tr><td/></tr>").addClass(n); a("td", l).addClass(n).html(e)[0].colSpan = b(t), o.push(l[0])}}; i(n, r), e._details && e._details.remove(), e._details = a(o), e._detailsShow && e._details.insertAfter(e.nTr)}, je = function(t, e){var a = t.context; if (a.length){var r = a[0].aoData[e !== n?e:t[0]]; r && r._details && (r._details.remove(), r._detailsShow = n, r._details = n)}}, He = function(t, e){var n = t.context; if (n.length && t.length){var a = n[0].aoData[t[0]]; a._details && (a._detailsShow = e, e?a._details.insertAfter(a.nTr):a._details.detach(), Ne(n[0]))}}, Ne = function(t){var e = new $t(t), n = ".dt.DT_details", a = "draw" + n, r = "column-visibility" + n, o = "destroy" + n, i = t.aoData; e.off(a + " " + r + " " + o), ce(i, "_details").length > 0 && (e.on(a, function(n, a){t === a && e.rows({page:"current"}).eq(0).each(function(t){var e = i[t]; e._detailsShow && e._details.insertAfter(e.nTr)})}), e.on(r, function(e, n, a, r){if (t === n)for (var o, s = b(n), l = 0, u = i.length; u > l; l++)o = i[l], o._details && o._details.children("td[colspan]").attr("colspan", s)}), e.on(o, function(n, a){if (t === a)for (var r = 0, o = i.length; o > r; r++)i[r]._details && je(e, r)}))}, ke = "", Oe = ke + "row().child", Me = Oe + "()"; zt(Me, function(t, e){var a = this.context; return t === n?a.length && this.length?a[0].aoData[this[0]]._details:n:(t === !0?this.child.show():t === !1?je(this):a.length && this.length && Re(a[0], a[0].aoData[this[0]], t, e), this)}), zt([Oe + ".show()", Me + ".show()"], function(t){return He(this, !0), this}), zt([Oe + ".hide()", Me + ".hide()"], function(){return He(this, !1), this}), zt([Oe + ".remove()", Me + ".remove()"], function(){return je(this), this}), zt(Oe + ".isShown()", function(){var t = this.context; return t.length && this.length?t[0].aoData[this[0]]._detailsShow || !1:!1}); var We = /^(.+):(name|visIdx|visible)$/, Ue = function(t, e, n, a, r){for (var o = [], i = 0, s = r.length; s > i; i++)o.push(w(t, r[i], e)); return o}, Ee = function(t, e, n){var r = t.aoColumns, o = ce(r, "sName"), i = ce(r, "nTh"), s = function(e){var s = oe(e); if ("" === e)return de(r.length); if (null !== s)return[s >= 0?s:r.length + s]; if ("function" == typeof e){var l = Le(t, n); return a.map(r, function(n, a){return e(a, Ue(t, a, 0, 0, l), i[a])?a:null})}var u = "string" == typeof e?e.match(We):""; if (!u)return a(i).filter(e).map(function(){return a.inArray(this, i)}).toArray(); switch (u[2]){case"visIdx":case"visible":var c = parseInt(u[1], 10); if (0 > c){var f = a.map(r, function(t, e){return t.bVisible?e:null}); return[f[f.length + c]]}return[p(t, c)]; case"name":return a.map(o, function(t, e){return t === u[1]?e:null})}}; return Ie("column", e, s, t, n)}, Be = function(t, e, r, o){var i, s, l, u, c = t.aoColumns, f = c[e], d = t.aoData; if (r === n)return f.bVisible; if (f.bVisible !== r){if (r){var p = a.inArray(!0, ce(c, "bVisible"), e + 1); for (s = 0, l = d.length; l > s; s++)u = d[s].nTr, i = d[s].anCells, u && u.insertBefore(i[e], i[p] || null)} else a(ce(t.aoData, "anCells", e)).detach(); f.bVisible = r, O(t, t.aoHeader), O(t, t.aoFooter), (o === n || o) && (h(t), (t.oScroll.sX || t.oScroll.sY) && bt(t)), Wt(t, null, "column-visibility", [t, e, r]), Pt(t)}}; zt("columns()", function(t, e){t === n?t = "":a.isPlainObject(t) && (e = t, t = ""), e = Ae(e); var r = this.iterator("table", function(n){return Ee(n, t, e)}, 1); return r.selector.cols = t, r.selector.opts = e, r}), Yt("columns().header()", "column().header()", function(t, e){return this.iterator("column", function(t, e){return t.aoColumns[e].nTh}, 1)}), Yt("columns().footer()", "column().footer()", function(t, e){return this.iterator("column", function(t, e){return t.aoColumns[e].nTf}, 1)}), Yt("columns().data()", "column().data()", function(){return this.iterator("column-rows", Ue, 1)}), Yt("columns().dataSrc()", "column().dataSrc()", function(){return this.iterator("column", function(t, e){return t.aoColumns[e].mData}, 1)}), Yt("columns().cache()", "column().cache()", function(t){return this.iterator("column-rows", function(e, n, a, r, o){return fe(e.aoData, o, "search" === t?"_aFilterData":"_aSortData", n)}, 1)}), Yt("columns().nodes()", "column().nodes()", function(){return this.iterator("column-rows", function(t, e, n, a, r){return fe(t.aoData, r, "anCells", e)}, 1)}), Yt("columns().visible()", "column().visible()", function(t, e){return this.iterator("column", function(a, r){return t === n?a.aoColumns[r].bVisible:void Be(a, r, t, e)})}), Yt("columns().indexes()", "column().index()", function(t){return this.iterator("column", function(e, n){return"visible" === t?g(e, n):n}, 1)}), zt("columns.adjust()", function(){return this.iterator("table", function(t){h(t)}, 1)}), zt("column.index()", function(t, e){if (0 !== this.context.length){var n = this.context[0]; if ("fromVisible" === t || "toData" === t)return p(n, e); if ("fromData" === t || "toVisible" === t)return g(n, e)}}), zt("column()", function(t, e){return Fe(this.columns(t, e))}); var Je = function(t, e, r){var o, i, s, l, u, c, f, d = t.aoData, h = Le(t, r), p = he(fe(d, h, "anCells")), g = a([].concat.apply([], p)), b = t.aoColumns.length, v = function(e){var r = "function" == typeof e; if (null === e || e === n || r){for (i = [], s = 0, l = h.length; l > s; s++)for (o = h[s], u = 0; b > u; u++)c = {row:o, column:u}, r?(f = d[o], e(c, w(t, o, u), f.anCells?f.anCells[u]:null) && i.push(c)):i.push(c); return i}return a.isPlainObject(e)?[e]:g.filter(e).map(function(t, e){if (e.parentNode)o = e.parentNode._DT_RowIndex; else for (t = 0, l = d.length; l > t; t++)if ( - 1 !== a.inArray(e, d[t].anCells)){o = t; break}return{row:o, column:a.inArray(e, d[o].anCells)}}).toArray()}; return Ie("cell", e, v, t, r)}; zt("cells()", function(t, e, r){if (a.isPlainObject(t) && (t.row === n?(r = t, t = null):(r = e, e = null)), a.isPlainObject(e) && (r = e, e = null), null === e || e === n)return this.iterator("table", function(e){return Je(e, t, Ae(r))}); var o, i, s, l, u, c = this.columns(e, r), f = this.rows(t, r), d = this.iterator("table", function(t, e){for (o = [], i = 0, s = f[e].length; s > i; i++)for (l = 0, u = c[e].length; u > l; l++)o.push({row:f[e][i], column:c[e][l]}); return o}, 1); return a.extend(d.selector, {cols:e, rows:t, opts:r}), d}), Yt("cells().nodes()", "cell().node()", function(){return this.iterator("cell", function(t, e, a){var r = t.aoData[e].anCells; return r?r[a]:n}, 1)}), zt("cells().data()", function(){return this.iterator("cell", function(t, e, n){return w(t, e, n)}, 1)}), Yt("cells().cache()", "cell().cache()", function(t){return t = "search" === t?"_aFilterData":"_aSortData", this.iterator("cell", function(e, n, a){return e.aoData[n][t][a]}, 1)}), Yt("cells().render()", "cell().render()", function(t){return this.iterator("cell", function(e, n, a){return w(e, n, a, t)}, 1)}), Yt("cells().indexes()", "cell().index()", function(){return this.iterator("cell", function(t, e, n){return{row:e, column:n, columnVisible:g(t, n)}}, 1)}), Yt("cells().invalidate()", "cell().invalidate()", function(t){return this.iterator("cell", function(e, n, a){R(e, n, t, a)})}), zt("cell()", function(t, e, n){return Fe(this.cells(t, e, n))}), zt("cell().data()", function(t){var e = this.context, a = this[0]; return t === n?e.length && a.length?w(e[0], a[0].row, a[0].column):n:(C(e[0], a[0].row, a[0].column, t), R(e[0], a[0].row, "data", a[0].column), this)}), zt("order()", function(t, e){var r = this.context; return t === n?0 !== r.length?r[0].aaSorting:n:("number" == typeof t?t = [[t, e]]:a.isArray(t[0]) || (t = Array.prototype.slice.call(arguments)), this.iterator("table", function(e){e.aaSorting = t.slice()}))}), zt("order.listener()", function(t, e, n){return this.iterator("table", function(a){
3
  At(a, t, e, n)})}), zt(["columns().order()", "column().order()"], function(t){var e = this; return this.iterator("table", function(n, r){var o = []; a.each(e[r], function(e, n){o.push([n, t])}), n.aaSorting = o})}), zt("search()", function(t, e, r, o){var i = this.context; return t === n?0 !== i.length?i[0].oPreviousSearch.sSearch:n:this.iterator("table", function(n){n.oFeatures.bFilter && z(n, a.extend({}, n.oPreviousSearch, {sSearch:t + "", bRegex:null === e?!1:e, bSmart:null === r?!0:r, bCaseInsensitive:null === o?!0:o}), 1)})}), Yt("columns().search()", "column().search()", function(t, e, r, o){return this.iterator("column", function(i, s){var l = i.aoPreSearchCols; return t === n?l[s].sSearch:void(i.oFeatures.bFilter && (a.extend(l[s], {sSearch:t + "", bRegex:null === e?!1:e, bSmart:null === r?!0:r, bCaseInsensitive:null === o?!0:o}), z(i, i.oPreviousSearch, 1)))})}), zt("state()", function(){return this.context.length?this.context[0].oSavedState:null}), zt("state.clear()", function(){return this.iterator("table", function(t){t.fnStateSaveCallback.call(t.oInstance, t, {})})}), zt("state.loaded()", function(){return this.context.length?this.context[0].oLoadedState:null}), zt("state.save()", function(){return this.iterator("table", function(t){Pt(t)})}), qt.versionCheck = qt.fnVersionCheck = function(t){for (var e, n, a = qt.version.split("."), r = t.split("."), o = 0, i = r.length; i > o; o++)if (e = parseInt(a[o], 10) || 0, n = parseInt(r[o], 10) || 0, e !== n)return e > n; return!0}, qt.isDataTable = qt.fnIsDataTable = function(t){var e = a(t).get(0), n = !1; return a.each(qt.settings, function(t, r){var o = r.nScrollHead?a("table", r.nScrollHead)[0]:null, i = r.nScrollFoot?a("table", r.nScrollFoot)[0]:null; (r.nTable === e || o === e || i === e) && (n = !0)}), n}, qt.tables = qt.fnTables = function(t){var e = !1; a.isPlainObject(t) && (e = t.api, t = t.visible); var n = a.map(qt.settings, function(e){return!t || t && a(e.nTable).is(":visible")?e.nTable:void 0}); return e?new $t(n):n}, qt.util = {throttle:mt, escapeRegex:tt}, qt.camelToHungarian = o, zt("$()", function(t, e){var n = this.rows(e).nodes(), r = a(n); return a([].concat(r.filter(t).toArray(), r.find(t).toArray()))}), a.each(["on", "one", "off"], function(t, e){zt(e + "()", function(){var t = Array.prototype.slice.call(arguments); t[0].match(/\.dt\b/) || (t[0] += ".dt"); var n = a(this.tables().nodes()); return n[e].apply(n, t), this})}), zt("clear()", function(){return this.iterator("table", function(t){L(t)})}), zt("settings()", function(){return new $t(this.context, this.context)}), zt("init()", function(){var t = this.context; return t.length?t[0].oInit:null}), zt("data()", function(){return this.iterator("table", function(t){return ce(t.aoData, "_aData")}).flatten()}), zt("destroy()", function(e){return e = e || !1, this.iterator("table", function(n){var r, o = n.nTableWrapper.parentNode, i = n.oClasses, s = n.nTable, l = n.nTBody, u = n.nTHead, c = n.nTFoot, f = a(s), d = a(l), h = a(n.nTableWrapper), p = a.map(n.aoData, function(t){return t.nTr}); n.bDestroying = !0, Wt(n, "aoDestroyCallback", "destroy", [n]), e || new $t(n).columns().visible(!0), h.unbind(".DT").find(":not(tbody *)").unbind(".DT"), a(t).unbind(".DT-" + n.sInstance), s != u.parentNode && (f.children("thead").detach(), f.append(u)), c && s != c.parentNode && (f.children("tfoot").detach(), f.append(c)), n.aaSorting = [], n.aaSortingFixed = [], Ft(n), a(p).removeClass(n.asStripeClasses.join(" ")), a("th, td", u).removeClass(i.sSortable + " " + i.sSortableAsc + " " + i.sSortableDesc + " " + i.sSortableNone), n.bJUI && (a("th span." + i.sSortIcon + ", td span." + i.sSortIcon, u).detach(), a("th, td", u).each(function(){var t = a("div." + i.sSortJUIWrapper, this); a(this).append(t.contents()), t.detach()})), d.children().detach(), d.append(p); var g = e?"remove":"detach"; f[g](), h[g](), !e && o && (o.insertBefore(s, n.nTableReinsertBefore), f.css("width", n.sDestroyWidth).removeClass(i.sTable), r = n.asDestroyStripes.length, r && d.children().each(function(t){a(this).addClass(n.asDestroyStripes[t % r])})); var b = a.inArray(n, qt.settings); - 1 !== b && qt.settings.splice(b, 1)})}), a.each(["column", "row", "cell"], function(t, e){zt(e + "s().every()", function(t){return this.iterator(e, function(a, r, o, i, s){t.call(new $t(a)[e](r, "cell" === e?o:n), r, o, i, s)})})}), zt("i18n()", function(t, e, r){var o = this.context[0], i = I(t)(o.oLanguage); return i === n && (i = e), r !== n && a.isPlainObject(i) && (i = i[r] !== n?i[r]:i._), i.replace("%d", r)}), qt.version = "1.10.9", qt.settings = [], qt.models = {}, qt.models.oSearch = {bCaseInsensitive:!0, sSearch:"", bRegex:!1, bSmart:!0}, qt.models.oRow = {nTr:null, anCells:null, _aData:[], _aSortData:null, _aFilterData:null, _sFilterRow:null, _sRowStripe:"", src:null, idx: - 1}, qt.models.oColumn = {idx:null, aDataSort:null, asSorting:null, bSearchable:null, bSortable:null, bVisible:null, _sManualType:null, _bAttrSrc:!1, fnCreatedCell:null, fnGetData:null, fnSetData:null, mData:null, mRender:null, nTh:null, nTf:null, sClass:null, sContentPadding:null, sDefaultContent:null, sName:null, sSortDataType:"std", sSortingClass:null, sSortingClassJUI:null, sTitle:null, sType:null, sWidth:null, sWidthOrig:null}, qt.defaults = {aaData:null, aaSorting:[[0, "asc"]], aaSortingFixed:[], ajax:null, aLengthMenu:[10, 25, 50, 100], aoColumns:null, aoColumnDefs:null, aoSearchCols:[], asStripeClasses:null, bAutoWidth:!0, bDeferRender:!1, bDestroy:!1, bFilter:!0, bInfo:!0, bJQueryUI:!1, bLengthChange:!0, bPaginate:!0, bProcessing:!1, bRetrieve:!1, bScrollCollapse:!1, bServerSide:!1, bSort:!0, bSortMulti:!0, bSortCellsTop:!1, bSortClasses:!0, bStateSave:!1, fnCreatedRow:null, fnDrawCallback:null, fnFooterCallback:null, fnFormatNumber:function(t){return t.toString().replace(/\B(?=(\d{3})+(?!\d))/g, this.oLanguage.sThousands)}, fnHeaderCallback:null, fnInfoCallback:null, fnInitComplete:null, fnPreDrawCallback:null, fnRowCallback:null, fnServerData:null, fnServerParams:null, fnStateLoadCallback:function(t){try{return JSON.parse(( - 1 === t.iStateDuration?sessionStorage:localStorage).getItem("DataTables_" + t.sInstance + "_" + location.pathname))} catch (e){}}, fnStateLoadParams:null, fnStateLoaded:null, fnStateSaveCallback:function(t, e){try{( - 1 === t.iStateDuration?sessionStorage:localStorage).setItem("DataTables_" + t.sInstance + "_" + location.pathname, JSON.stringify(e))} catch (n){}}, fnStateSaveParams:null, iStateDuration:7200, iDeferLoading:null, iDisplayLength:10, iDisplayStart:0, iTabIndex:0, oClasses:{}, oLanguage:{oAria:{sSortAscending:": activate to sort column ascending", sSortDescending:": activate to sort column descending"}, oPaginate:{sFirst:"First", sLast:"Last", sNext:"Next", sPrevious:"Previous"}, sEmptyTable:"No data available in table", sInfo:"Showing _START_ to _END_ of _TOTAL_ entries", sInfoEmpty:"Showing 0 to 0 of 0 entries", sInfoFiltered:"(filtered from _MAX_ total entries)", sInfoPostFix:"", sDecimal:"", sThousands:",", sLengthMenu:"Show _MENU_ entries", sLoadingRecords:"Loading...", sProcessing:"Processing...", sSearch:"Search:", sSearchPlaceholder:"", sUrl:"", sZeroRecords:"No matching records found"}, oSearch:a.extend({}, qt.models.oSearch), sAjaxDataProp:"data", sAjaxSource:null, sDom:"lfrtip", searchDelay:null, sPaginationType:"simple_numbers", sScrollX:"", sScrollXInner:"", sScrollY:"", sServerMethod:"GET", renderer:null, rowId:"DT_RowId"}, r(qt.defaults), qt.defaults.column = {aDataSort:null, iDataSort: - 1, asSorting:["asc", "desc"], bSearchable:!0, bSortable:!0, bVisible:!0, fnCreatedCell:null, mData:null, mRender:null, sCellType:"td", sClass:"", sContentPadding:"", sDefaultContent:null, sName:"", sSortDataType:"std", sTitle:null, sType:null, sWidth:null}, r(qt.defaults.column), qt.models.oSettings = {oFeatures:{bAutoWidth:null, bDeferRender:null, bFilter:null, bInfo:null, bLengthChange:null, bPaginate:null, bProcessing:null, bServerSide:null, bSort:null, bSortMulti:null, bSortClasses:null, bStateSave:null}, oScroll:{bCollapse:null, iBarWidth:0, sX:null, sXInner:null, sY:null}, oLanguage:{fnInfoCallback:null}, oBrowser:{bScrollOversize:!1, bScrollbarLeft:!1, bBounding:!1, barWidth:0}, ajax:null, aanFeatures:[], aoData:[], aiDisplay:[], aiDisplayMaster:[], aIds:{}, aoColumns:[], aoHeader:[], aoFooter:[], oPreviousSearch:{}, aoPreSearchCols:[], aaSorting:null, aaSortingFixed:[], asStripeClasses:null, asDestroyStripes:[], sDestroyWidth:0, aoRowCallback:[], aoHeaderCallback:[], aoFooterCallback:[], aoDrawCallback:[], aoRowCreatedCallback:[], aoPreDrawCallback:[], aoInitComplete:[], aoStateSaveParams:[], aoStateLoadParams:[], aoStateLoaded:[], sTableId:"", nTable:null, nTHead:null, nTFoot:null, nTBody:null, nTableWrapper:null, bDeferLoading:!1, bInitialised:!1, aoOpenRows:[], sDom:null, searchDelay:null, sPaginationType:"two_button", iStateDuration:0, aoStateSave:[], aoStateLoad:[], oSavedState:null, oLoadedState:null, sAjaxSource:null, sAjaxDataProp:null, bAjaxDataGet:!0, jqXHR:null, json:n, oAjaxData:n, fnServerData:null, aoServerParams:[], sServerMethod:null, fnFormatNumber:null, aLengthMenu:null, iDraw:0, bDrawing:!1, iDrawError: - 1, _iDisplayLength:10, _iDisplayStart:0, _iRecordsTotal:0, _iRecordsDisplay:0, bJUI:null, oClasses:{}, bFiltered:!1, bSorted:!1, bSortCellsTop:null, oInit:null, aoDestroyCallback:[], fnRecordsTotal:function(){return"ssp" == Bt(this)?1 * this._iRecordsTotal:this.aiDisplayMaster.length}, fnRecordsDisplay:function(){return"ssp" == Bt(this)?1 * this._iRecordsDisplay:this.aiDisplay.length}, fnDisplayEnd:function(){var t = this._iDisplayLength, e = this._iDisplayStart, n = e + t, a = this.aiDisplay.length, r = this.oFeatures, o = r.bPaginate; return r.bServerSide?o === !1 || - 1 === t?e + a:Math.min(e + t, this._iRecordsDisplay):!o || n > a || - 1 === t?a:n}, oInstance:null, sInstance:null, iTabIndex:0, nScrollHead:null, nScrollFoot:null, aLastSort:[], oPlugins:{}, rowIdFn:null, rowId:null}, qt.ext = Gt = {buttons:{}, classes:{}, errMode:"alert", feature:[], search:[], selector:{cell:[], column:[], row:[]}, internal:{}, legacy:{ajax:null}, pager:{}, renderer:{pageButton:{}, header:{}}, order:{}, type:{detect:[], search:{}, order:{}}, _unique:0, fnVersionCheck:qt.fnVersionCheck, iApiIndex:0, oJUIClasses:{}, sVersion:qt.version}, a.extend(Gt, {afnFiltering:Gt.search, aTypes:Gt.type.detect, ofnSearch:Gt.type.search, oSort:Gt.type.order, afnSortData:Gt.order, aoFeatures:Gt.feature, oApi:Gt.internal, oStdClasses:Gt.classes, oPagination:Gt.pager}), a.extend(qt.ext.classes, {sTable:"dataTable", sNoFooter:"no-footer", sPageButton:"paginate_button", sPageButtonActive:"current", sPageButtonDisabled:"disabled", sStripeOdd:"odd", sStripeEven:"even", sRowEmpty:"dataTables_empty", sWrapper:"dataTables_wrapper", sFilter:"dataTables_filter", sInfo:"dataTables_info", sPaging:"dataTables_paginate paging_", sLength:"dataTables_length", sProcessing:"dataTables_processing", sSortAsc:"sorting_asc", sSortDesc:"sorting_desc", sSortable:"sorting", sSortableAsc:"sorting_asc_disabled", sSortableDesc:"sorting_desc_disabled", sSortableNone:"sorting_disabled", sSortColumn:"sorting_", sFilterInput:"", sLengthSelect:"", sScrollWrapper:"dataTables_scroll", sScrollHead:"dataTables_scrollHead", sScrollHeadInner:"dataTables_scrollHeadInner", sScrollBody:"dataTables_scrollBody", sScrollFoot:"dataTables_scrollFoot", sScrollFootInner:"dataTables_scrollFootInner", sHeaderTH:"", sFooterTH:"", sSortJUIAsc:"", sSortJUIDesc:"", sSortJUI:"", sSortJUIAscAllowed:"", sSortJUIDescAllowed:"", sSortJUIWrapper:"", sSortIcon:"", sJUIHeader:"", sJUIFooter:""}), function(){var t = ""; t = ""; var e = t + "ui-state-default", n = t + "css_right ui-icon ui-icon-", r = t + "fg-toolbar ui-toolbar ui-widget-header ui-helper-clearfix"; a.extend(qt.ext.oJUIClasses, qt.ext.classes, {sPageButton:"fg-button ui-button " + e, sPageButtonActive:"ui-state-disabled", sPageButtonDisabled:"ui-state-disabled", sPaging:"dataTables_paginate fg-buttonset ui-buttonset fg-buttonset-multi ui-buttonset-multi paging_", sSortAsc:e + " sorting_asc", sSortDesc:e + " sorting_desc", sSortable:e + " sorting", sSortableAsc:e + " sorting_asc_disabled", sSortableDesc:e + " sorting_desc_disabled", sSortableNone:e + " sorting_disabled", sSortJUIAsc:n + "triangle-1-n", sSortJUIDesc:n + "triangle-1-s", sSortJUI:n + "carat-2-n-s", sSortJUIAscAllowed:n + "carat-1-n", sSortJUIDescAllowed:n + "carat-1-s", sSortJUIWrapper:"DataTables_sort_wrapper", sSortIcon:"DataTables_sort_icon", sScrollHead:"dataTables_scrollHead " + e, sScrollFoot:"dataTables_scrollFoot " + e, sHeaderTH:e, sFooterTH:e, sJUIHeader:r + " ui-corner-tl ui-corner-tr", sJUIFooter:r + " ui-corner-bl ui-corner-br"})}(); var Xe = qt.ext.pager; a.extend(Xe, {simple:function(t, e){return["previous", "next"]}, full:function(t, e){return["first", "previous", "next", "last"]}, numbers:function(t, e){return[Jt(t, e)]}, simple_numbers:function(t, e){return["previous", Jt(t, e), "next"]}, full_numbers:function(t, e){return["first", "previous", Jt(t, e), "next", "last"]}, _numbers:Jt, numbers_length:7}), a.extend(!0, qt.ext.renderer, {pageButton:{_:function(t, n, r, o, i, s){var l, u, c, f = t.oClasses, d = t.oLanguage.oPaginate, h = 0, p = function(e, n){var o, c, g, b, v = function(e){dt(t, e.data.action, !0)}; for (o = 0, c = n.length; c > o; o++)if (b = n[o], a.isArray(b)){var S = a("<" + (b.DT_el || "div") + "/>").appendTo(e); p(S, b)} else{switch (l = null, u = "", b){case"ellipsis":e.append('<span class="ellipsis">&#x2026;</span>'); break; case"first":l = d.sFirst, u = b + (i > 0?"":" " + f.sPageButtonDisabled); break; case"previous":l = d.sPrevious, u = b + (i > 0?"":" " + f.sPageButtonDisabled); break; case"next":l = d.sNext, u = b + (s - 1 > i?"":" " + f.sPageButtonDisabled); break; case"last":l = d.sLast, u = b + (s - 1 > i?"":" " + f.sPageButtonDisabled); break; default:l = b + 1, u = i === b?f.sPageButtonActive:""}null !== l && (g = a("<a>", {"class":f.sPageButton + " " + u, "aria-controls":t.sTableId, "data-dt-idx":h, tabindex:t.iTabIndex, id:0 === r && "string" == typeof b?t.sTableId + "_" + b:null}).html(l).appendTo(e), Ot(g, {action:b}, v), h++)}}; try{c = a(n).find(e.activeElement).data("dt-idx")} catch (g){}p(a(n).empty(), o), c && a(n).find("[data-dt-idx=" + c + "]").focus()}}}), a.extend(qt.ext.type.detect, [function(t, e){var n = e.oLanguage.sDecimal; return se(t, n)?"num" + n:null}, function(t, e){if (t && !(t instanceof Date) && (!te.test(t) || !ee.test(t)))return null; var n = Date.parse(t); return null !== n && !isNaN(n) || re(t)?"date":null}, function(t, e){var n = e.oLanguage.sDecimal; return se(t, n, !0)?"num-fmt" + n:null}, function(t, e){var n = e.oLanguage.sDecimal; return ue(t, n)?"html-num" + n:null}, function(t, e){var n = e.oLanguage.sDecimal; return ue(t, n, !0)?"html-num-fmt" + n:null}, function(t, e){return re(t) || "string" == typeof t && - 1 !== t.indexOf("<")?"html":null}]), a.extend(qt.ext.type.search, {html:function(t){return re(t)?t:"string" == typeof t?t.replace(Zt, " ").replace(Kt, ""):""}, string:function(t){return re(t)?t:"string" == typeof t?t.replace(Zt, " "):t}}); var Ve = function(t, e, n, a){return 0 === t || t && "-" !== t?(e && (t = ie(t, e)), t.replace && (n && (t = t.replace(n, "")), a && (t = t.replace(a, ""))), 1 * t): - (1 / 0)}; return a.extend(Gt.type.order, {"date-pre":function(t){return Date.parse(t) || 0}, "html-pre":function(t){return re(t)?"":t.replace?t.replace(/<.*?>/g, "").toLowerCase():t + ""}, "string-pre":function(t){return re(t)?"":"string" == typeof t?t.toLowerCase():t.toString?t.toString():""}, "string-asc":function(t, e){return e > t? - 1:t > e?1:0}, "string-desc":function(t, e){return e > t?1:t > e? - 1:0}}), Xt(""), a.extend(!0, qt.ext.renderer, {header:{_:function(t, e, n, r){a(t.nTable).on("order.dt.DT", function(a, o, i, s){if (t === o){var l = n.idx; e.removeClass(n.sSortingClass + " " + r.sSortAsc + " " + r.sSortDesc).addClass("asc" == s[l]?r.sSortAsc:"desc" == s[l]?r.sSortDesc:n.sSortingClass)}})}, jqueryui:function(t, e, n, r){a("<div/>").addClass(r.sSortJUIWrapper).append(e.contents()).append(a("<span/>").addClass(r.sSortIcon + " " + n.sSortingClassJUI)).appendTo(e), a(t.nTable).on("order.dt.DT", function(a, o, i, s){if (t === o){var l = n.idx; e.removeClass(r.sSortAsc + " " + r.sSortDesc).addClass("asc" == s[l]?r.sSortAsc:"desc" == s[l]?r.sSortDesc:n.sSortingClass), e.find("span." + r.sSortIcon).removeClass(r.sSortJUIAsc + " " + r.sSortJUIDesc + " " + r.sSortJUI + " " + r.sSortJUIAscAllowed + " " + r.sSortJUIDescAllowed).addClass("asc" == s[l]?r.sSortJUIAsc:"desc" == s[l]?r.sSortJUIDesc:n.sSortingClassJUI)}})}}}), qt.render = {number:function(t, e, n, a, r){return{display:function(o){if ("number" != typeof o && "string" != typeof o)return o; var i = 0 > o?"-":""; o = Math.abs(parseFloat(o)); var s = parseInt(o, 10), l = n?e + (o - s).toFixed(n).substring(2):""; return i + (a || "") + s.toString().replace(/\B(?=(\d{3})+(?!\d))/g, t) + l + (r || "")}}}}, a.extend(qt.ext.internal, {_fnExternApiFunc:Vt, _fnBuildAjax:J, _fnAjaxUpdate:X, _fnAjaxParameters:V, _fnAjaxUpdateDraw:q, _fnAjaxDataSrc:G, _fnAddColumn:f, _fnColumnOptions:d, _fnAdjustColumnSizing:h, _fnVisibleToColumnIndex:p, _fnColumnIndexToVisible:g, _fnVisbleColumns:b, _fnGetColumns:v, _fnColumnTypes:S, _fnApplyColumnDefs:m, _fnHungarianMap:r, _fnCamelToHungarian:o, _fnLanguageCompat:i, _fnBrowserDetect:u, _fnAddData:D, _fnAddTr:y, _fnNodeToDataIndex:_, _fnNodeToColumnIndex:T, _fnGetCellData:w, _fnSetCellData:C, _fnSplitObjNotation:x, _fnGetObjectDataFn:I, _fnSetObjectDataFn:A, _fnGetDataMaster:F, _fnClearTable:L, _fnDeleteIndex:P, _fnInvalidate:R, _fnGetRowElements:j, _fnCreateTr:H, _fnBuildHead:k, _fnDrawHead:O, _fnDraw:M, _fnReDraw:W, _fnAddOptionsHtml:U, _fnDetectHeader:E, _fnGetUniqueThs:B, _fnFeatureHtmlFilter:$, _fnFilterComplete:z, _fnFilterCustom:Y, _fnFilterColumn:Q, _fnFilter:Z, _fnFilterCreateSearch:K, _fnEscapeRegex:tt, _fnFilterData:et, _fnFeatureHtmlInfo:rt, _fnUpdateInfo:ot, _fnInfoMacros:it, _fnInitialise:st, _fnInitComplete:lt, _fnLengthChange:ut, _fnFeatureHtmlLength:ct, _fnFeatureHtmlPaginate:ft, _fnPageChange:dt, _fnFeatureHtmlProcessing:ht, _fnProcessingDisplay:pt, _fnFeatureHtmlTable:gt, _fnScrollDraw:bt, _fnApplyToChildren:vt, _fnCalculateColumnWidths:St, _fnThrottle:mt, _fnConvertToWidth:Dt, _fnGetWidestNode:yt, _fnGetMaxLenString:_t, _fnStringToCss:Tt, _fnSortFlatten:wt, _fnSort:Ct, _fnSortAria:xt, _fnSortListener:It, _fnSortAttachListener:At, _fnSortingClasses:Ft, _fnSortData:Lt, _fnSaveState:Pt, _fnLoadState:Rt, _fnSettingsFromNode:jt, _fnLog:Ht, _fnMap:Nt, _fnBindAction:Ot, _fnCallbackReg:Mt, _fnCallbackFire:Wt, _fnLengthOverflow:Ut, _fnRenderer:Et, _fnDataSource:Bt, _fnRowAttributes:N, _fnCalculateEnd:function(){}}), a.fn.dataTable = qt, a.fn.dataTableSettings = qt.settings, a.fn.dataTableExt = qt.ext, a.fn.DataTable = function(t){return a(this).dataTable(t).api()}, a.each(qt, function(t, e){a.fn.DataTable[t] = e}), a.fn.dataTable})}(window, document), function(t, e, n){var a = function(t, n){"use strict"; t.extend(!0, n.defaults, {dom:"<'row'<'col-sm-5'><'col-sm-4'f><'col-sm-3'l>><'row'<'col-sm-12'tr>><'row'<'col-sm-5'i><'col-sm-7'p>>", renderer:"bootstrap"}), t.extend(n.ext.classes, {sWrapper:"dataTables_wrapper form-inline dt-bootstrap", sFilterInput:"form-control input-sm", sLengthSelect:"form-control input-sm"}), n.ext.renderer.pageButton.bootstrap = function(a, r, o, i, s, l){var u, c, f, d = new n.Api(a), h = a.oClasses, p = a.oLanguage.oPaginate, g = 0, b = function(e, n){var r, i, f, v, S = function(e){e.preventDefault(), t(e.currentTarget).hasClass("disabled") || d.page(e.data.action).draw("page")}; for (r = 0, i = n.length; i > r; r++)if (v = n[r], t.isArray(v))b(e, v); else{switch (u = "", c = "", v){case"ellipsis":u = "&hellip;", c = "disabled"; break; case"first":u = p.sFirst, c = v + (s > 0?"":" disabled"); break; case"previous":u = p.sPrevious, c = v + (s > 0?"":" disabled"); break; case"next":u = p.sNext, c = v + (l - 1 > s?"":" disabled"); break; case"last":u = p.sLast, c = v + (l - 1 > s?"":" disabled"); break; default:u = v + 1, c = s === v?"active":""}u && (f = t("<li>", {"class":h.sPageButton + " " + c, id:0 === o && "string" == typeof v?a.sTableId + "_" + v:null}).append(t("<a>", {href:"#", "aria-controls":a.sTableId, "data-dt-idx":g, tabindex:a.iTabIndex}).html(u)).appendTo(e), a.oApi._fnBindAction(f, {action:v}, S), g++)}}; try{f = t(r).find(e.activeElement).data("dt-idx")} catch (v){}b(t(r).empty().html('<ul class="pagination"/>').children("ul"), i), f && t(r).find("[data-dt-idx=" + f + "]").focus()}, n.TableTools && (t.extend(!0, n.TableTools.classes, {container:"DTTT btn-group", buttons:{normal:"btn btn-default", disabled:"disabled"}, collection:{container:"DTTT_dropdown dropdown-menu", buttons:{normal:"", disabled:"disabled"}}, print:{info:"DTTT_print_info"}, select:{row:"active"}}), t.extend(!0, n.TableTools.DEFAULTS.oTags, {collection:{container:"ul", button:"li", liner:"a"}}))}; "function" == typeof define && define.amd?define(["jquery", "datatables"], a):"object" == typeof exports?a(require("jquery"), require("datatables")):jQuery && a(jQuery, jQuery.fn.dataTable)}(window, document);
assets/global/plugins/icons/fonts/icons.svg CHANGED
@@ -9,10 +9,10 @@
9
  </metadata>
10
  <defs>
11
  <font id="Simple-Line-Icons" horiz-adv-x="512" >
12
- <font-face units-per-em="512" ascent="480" descent="-32" />
13
- <missing-glyph horiz-adv-x="512" />
14
- <glyph class="hidden" unicode="&#xf000;" d="M0,480L 512 -32L0 -32 z" horiz-adv-x="0" />
15
- <glyph unicode="&#xe000;" d="M 480.016,78.656l-139.248,66.032c 18.576,9.312, 91.128,12.264, 97.128,28.64c0,0-28.672,44.008-35.672,101.168
16
  c-2.72,22.184-7.376,51.296-12,92.296C 382.72,433.296, 326.784,480, 256.128,480C 256.088,480, 256.040,480, 256,480c-0.048,0-0.096,0-0.128,0
17
  C 185.216,480, 129.28,433.296, 121.784,366.8c-4.624-41-9.28-70.112-12-92.296c-7-57.168-35.672-101.168-35.672-101.168
18
  c 6-16.376, 78.544-19.328, 97.128-28.64L 31.984,78.656c0,0-31.984-11.232-31.984-37.736l0-42.264 C0-19.032, 14.312-32, 31.984-32l 448.032,0
@@ -24,7 +24,7 @@
24
  c 1.408-10.088, 2.672-19.2, 3.656-27.296c 3.984-32.512, 14.112-61.256, 23.264-81.816c-7.064-1.408-14.344-2.72-19.672-3.656
25
  c-22.456-3.888-36.784-6.576-47.624-12.016c-10.936-5.488-17.784-16.736-17.656-28.968c 0.144-12.232, 7.232-23.344, 18.296-28.576l 139.248-66.032
26
  c 1-0.488, 1.656-0.784, 2.72-1.16c 4.92-1.872, 10.248-5.968, 10.968-7.672L 480.016,0L 32,0 z" />
27
- <glyph unicode="&#xe002;" d="M 32.032,32.656c0,12.72, 9.544,16.704, 13.36,18.472l 140.52,66.312
28
  c 10.072,4.624, 17.024,14.16, 18.376,25.16c 1.36,11-3.080,21.92-11.728,28.856c-33.24,26.688-48.728,85.344-48.728,116.592L 143.832,368
29
  c0,33.432, 58.2,79.928, 112.064,79.928c 54.336,0, 111.96-45.768, 111.96-79.928l0-79.96 c0-30.776-12.8-89.656-47.128-116.68
30
  c-8.752-6.888-13.296-17.84-11.984-28.904c 1.312-11.080, 8.296-20.656, 18.424-25.312l 47.96-22.752l 7.904,31.936l-42.504,19.888
@@ -32,7 +32,7 @@
32
  c0-34.936, 15.944-105.624, 60.696-141.544L 32.008,80.184c0,0-31.976-14.248-31.976-31.984l0-48.016 c0-17.672, 14.32-31.984, 31.976-31.984l 351.96,0 l0,32
33
  L 32.032,0.184L 32.032,32.656 z M 495.968,64.064l-48,0 l0,48 c0,8.84-7.168,16-16,16s-16-7.16-16-16l0-48 l-48,0 c-8.832,0-16-7.16-16-16c0-8.832, 7.168-16, 16-16l 48,0 l0-48
34
  c0-8.832, 7.168-16, 16-16s 16,7.168, 16,16l0,48 l 48,0 c 8.832,0, 16,7.168, 16,16C 511.968,56.904, 504.808,64.064, 495.968,64.064z" />
35
- <glyph unicode="&#xe003;" d="M 31.752,0.12l0,32.472 c0,12.72, 9.552,16.712, 13.36,18.472l 140.52,66.312
36
  c 10.072,4.624, 17.024,14.16, 18.376,25.16c 1.36,11-3.080,21.92-11.728,28.856c-33.24,26.688-48.728,85.352-48.728,116.592l0,79.96
37
  c0,33.432, 58.2,79.928, 112.064,79.928c 54.336,0, 111.968-45.768, 111.968-79.928l0-79.96 c0-30.776-12.8-89.656-47.128-116.688
38
  c-8.752-6.888-13.296-17.84-11.984-28.904c 1.312-11.080, 8.296-20.656, 18.424-25.312l 81.12-38.624l 19.072,27.032l-86.832,40.672
@@ -41,7 +41,7 @@
41
  l-26,31.992L 31.752,0.12z M 506.104,118.248c-6.952,5.456-17.016,4.216-22.456-2.736l-68.424-104.352l-42.528,42.536
42
  c-6.248,6.248-16.384,6.248-22.632,0s-6.248-16.376,0-22.624l 56.568-56.568c 6.248-6.248, 16.376-6.248, 22.624,0
43
  c 1.52,1.512, 2.656,3.272, 3.44,5.144l 76.152,116.152C 514.288,102.752, 513.064,112.808, 506.104,118.248z" />
44
- <glyph unicode="&#xe004;" d="M 399.56,288.072l0,79.96 c0,52.96-73.304,111.928-143.952,111.928c-70.656,0-144.064-58.968-144.064-111.928l0-79.96
45
  c0-34.936, 15.944-105.616, 60.696-141.536L 31.72,80.216c0,0-31.976-14.248-31.976-31.984l0-48.016 c0-17.672, 14.32-31.984, 31.976-31.984l 303.968,0 l0,32
46
  L 31.744,0.216l0,32.472 c0,12.72, 9.552,16.712, 13.36,18.472l 140.52,66.312c 10.072,4.624, 17.024,14.168, 18.376,25.168
47
  c 1.36,11-3.080,21.912-11.728,28.848c-33.24,26.688-48.728,85.344-48.728,116.6l0,79.96 c0,33.432, 58.2,79.928, 112.064,79.928
@@ -51,7 +51,7 @@
51
  c-6.248,6.24-16.384,6.24-22.624,0c-6.248-6.248-6.248-16.392,0-22.624l 45.248-45.256l-45.248-45.248c-6.248-6.24-6.248-16.384,0-22.632
52
  c 6.24-6.232, 16.376-6.232, 22.624,0l 45.248,45.256l 45.256-45.256c 6.24-6.232, 16.376-6.232, 22.616,0c 6.248,6.248, 6.248,16.392,0,22.632
53
  L 462.312,40.6z" />
54
- <glyph unicode="&#xe006;" d="M 367.904,16.064L 142.936,16.064 c-8.84,0-16-7.16-16-16s 7.16-16, 16-16l 224.968,0 c 8.84,0, 16,7.16, 16,16S 376.752,16.064, 367.904,16.064z
55
  M 508.656,419.184c-1.512,7.44-8.080,12.784-15.672,12.784l-78.312,0 L 414.672,447.936 c0,8.84-7.16,16-16,16L 110.904,463.936 c-8.84,0-16-7.16-16-16l0-15.968 L 19.016,431.968
56
  c-7.592,0-14.16-5.344-15.672-12.784c-0.472-2.312-11.2-58.376, 19.952-96.576c 17.92-21.96, 45.304-33.464, 81.248-34.488
57
  C 125.040,227.544, 176.576,182.688, 238.64,176l0-111.456 l-47.888,0 c-8.84,0-16-7.16-16-16s 7.16-16, 16-16l 129.344,0 c 8.84,0, 16,7.16, 16,16s-7.16,16-16,16
@@ -60,15 +60,15 @@
60
  c0-8.648, 0.8-17.080, 1.968-25.384C 75.032,322.608, 58.648,329.984, 48.2,342.72z M 382.672,345.952c0-76.544-57.36-138.832-127.856-138.832
61
  c-70.528,0-127.904,62.28-127.904,138.832L 126.912,431.936 l 255.768,0 L 382.68,345.952 z M 463.8,342.72c-10.84-13.216-28.016-20.744-51.136-22.432
62
  c 1.192,8.392, 2.008,16.92, 2.008,25.664l0,54.016 l 64,0 C 479.392,385.408, 477.968,359.968, 463.8,342.72z" />
63
- <glyph unicode="&#xe010;" d="M 352.072,480L 159.928,480 c-26.512,0-48-21.488-48-48l0-416 c0-26.512, 21.488-48, 48-48l 192.144,0
64
  c 26.512,0, 48,21.488, 48,48L 400.072,432 C 400.072,458.512, 378.584,480, 352.072,480z M 368.072,16c0-8.832-7.168-16-16-16L 159.928,0 c-8.832,0-16,7.168-16,16L 143.928,432
65
  c0,8.832, 7.168,16, 16,16l 192.144,0 c 8.832,0, 16-7.168, 16-16L 368.072,16 z M 256.024,79.912c-17.64,0-31.92-14.296-31.92-31.912s 14.288-31.92, 31.92-31.92
66
  c 17.64,0, 31.92,14.304, 31.92,31.92S 273.664,79.912, 256.024,79.912z M 288.024,432l-64,0 c-8.832,0-16-7.168-16-16s 7.168-16, 16-16l 64,0
67
  c 8.832,0, 16,7.168, 16,16S 296.856,432, 288.024,432z" />
68
- <glyph unicode="&#xe011;" d="M 480,432.096L 32,432.096 c-17.592,0-32-14.4-32-32L0,128 c0-17.592, 14.408-31.992, 32-31.992l 208,0 l0-48.104 L 160,47.904
69
  c-8.832,0-16-7.168-16-16s 7.168-16, 16-16l 192,0 c 8.832,0, 16,7.168, 16,16s-7.168,16-16,16L 272,47.904 l0,48.104 l 208,0 c 17.592,0, 32,14.4, 32,31.992L 512,400.096
70
  C 512,417.696, 497.592,432.096, 480,432.096z M 480,128L 32,128 L 32,400.096 l 448,0 L 480,128 z" />
71
- <glyph unicode="&#xe012;" d="M 467.16,447.048L 467.16,447.048c 5.216,0, 8.888-0.968, 10.8-1.704c 2.296-6.112, 5.376-28.016-17.264-50.672L 355.36,289.344l-10.16-10.16
72
  l 0.832-14.328c 1.752-29.984, 5-83.72, 7.8-129.784c 2.472-41, 4.816-79.72, 4.968-83.016c 0.080-2.264, 0.112-2.8-2-5.344
73
  c-4.72-5.736-13.528-15.456-20.952-23.512c-11.512,31.016-35.704,96.528-49.064,133.2l-17.168,47.184l-35.512-35.512L 168.8,105.28l-9.096-9.080
74
  l-0.28-12.84c-0.216-10.248-0.168-28.64-0.144-44.856c 0.032-11.296, 0.064-21.56-0.016-27.216c-0.144-0.264, 2.184-0.576, 1.968-0.952
@@ -88,7 +88,7 @@
88
  c 0.688-0.080, 1.392-0.112, 2.080-0.112c 6.312,0, 12.856,2.968, 18.216,8.328c0,0, 23.128,24.544, 32.952,36.488
89
  c 9.84,11.936, 9.456,22.128, 9.264,26.936c-0.080,3.328-9.344,154.408-12.784,213.408l 105.328,105.328c 37.328,37.344, 31.392,82.344, 17.528,96.184
90
  C 494.688,474.392, 482.296,479.048, 467.16,479.048L 467.16,479.048z" />
91
- <glyph unicode="&#xe013;" d="M 424.576,480L 105.576,480 C 82.576,480, 72.56,463, 72.56,447l0-63.656 L 55.096,383.344 c-8.656,0-15.672-7.016-15.672-15.672S 46.44,352, 55.096,352L 72.56,352
92
  l0-64.376 L 56.592,287.624 c-8.656,0-15.672-7.016-15.672-15.672s 7.016-15.672, 15.672-15.672L 72.56,256.28 l0-64.72 L 56.248,191.56 c-8.656,0-15.672-7.016-15.672-15.672
93
  s 7.016-15.672, 15.672-15.672L 72.56,160.216 l0-64.232 L 56.248,95.984 c-8.656,0-15.672-7.016-15.672-15.672s 7.016-15.672, 15.672-15.672L 72.56,64.64 L 72.56,0
94
  c0-26.512, 20.768-32, 32.264-32l 319.752,0 c 26.512,0, 48,21.488, 48,48L 472.576,432 C 472.576,458.512, 451.096,480, 424.576,480z M 104.56,0l0,64.64 l 16.672,0
@@ -96,7 +96,7 @@
96
  s-7.016,15.672-15.672,15.672L 104.56,191.56 l0,64.72 l 17.016,0 c 8.656,0, 15.672,7.016, 15.672,15.672s-7.016,15.672-15.672,15.672L 104.56,287.624 L 104.56,352 l 15.512,0
97
  c 8.656,0, 15.672,7.016, 15.672,15.672s-7.016,15.672-15.672,15.672L 104.56,383.344 L 104.56,447 c0,0.376, 0.032,0.688, 0.080,0.968
98
  C 104.888,447.984, 105.2,448, 105.576,448l 255,0 l0-448 L 104.56,0 z M 440.576,16c0-8.832-7.168-16-16-16l-32,0 L 392.576,448 l 32,0 c 8.832,0, 16-7.168, 16-16L 440.576,16 z" />
99
- <glyph unicode="&#xe014;" d="M 396.424,111.64c-50.672,0-79.432,23.816-98.472,39.576c-6.736,5.576-12.864,10.952-18.44,15.832
100
  c-8.456,7.424-19,16.672-22.672,17.952c-0.112,0-1.856,0.080-1.968,0.096c-0.584-0.048-2.072-0.344-2.224-0.36
101
  c-2.536-1.032-11.544-8.784-18.784-15c-6.568-5.64-14.056-12.080-22.52-18.688l-1.544-1.184c-21.736-16.968-48.792-38.080-96.576-38.080
102
  c-35.496,0-70.464,16.064-91.288,41.936c-13.96,17.344-28.648,47.512-19.336,92.736c 1.128,5.472, 5.008,9.952, 10.216,11.816
@@ -114,24 +114,24 @@
114
  c-13.696-6.096-27.552-9.184-41.152-9.184c-10.2,0-19.032,1.704-26.312,4.016c-0.016-17.36, 5.056-32.456, 15.168-45.016
115
  c 14.968-18.576, 40.52-30.128, 66.72-30.128c 37,0, 57.448,15.968, 77.232,31.408L 192,176.392c 8.024,6.264, 15.12,12.376, 21.344,17.72
116
  c 14.256,12.248, 23.664,20.344, 33.824,22.144l0,0C 247.176,216.248, 252.016,217.064, 255.368,217.064z" />
117
- <glyph unicode="&#xe015;" d="M 256.792,480c-79.064,0-144.752-64.112-144.752-143.168l0-225.656
118
  C 112.040,32.112, 177.728-32, 256.792-32s 143.176,64.112, 143.176,143.168L 399.968,336.832 C 399.968,415.888, 335.856,480, 256.792,480z M 367.968,111.168
119
  C 367.968,49.872, 318.096,0, 256.792,0s-112.752,49.872-112.752,111.168L 144.040,336.832 C 144.040,398.128, 195.496,448, 256.792,448
120
  s 111.176-49.872, 111.176-111.168L 367.968,111.168 z M 256.168,384c-8.832,0-16-7.168-16-16l0-80 c0-8.832, 7.168-16, 16-16c 8.832,0, 16,7.168, 16,16L 272.168,368
121
  C 272.168,376.832, 265,384, 256.168,384z" />
122
- <glyph unicode="&#xe016;" d="M 480.144,449.912L 480.144,464.416 c0,8.84-7.16,16-16,16L 351.832,480.416 c-8.84,0-16-7.16-16-16l0-65.328
123
  c0-0.024, 0.016-0.048, 0.016-0.072l0-198.76 c0-48.16-27.168-87.328-75.328-87.328s-84.328,39.168-84.328,87.328L 176.192,449.912 l-0.048,0 L 176.144,464.416
124
  c0,8.84-7.16,16-16,16L 47.832,480.416 c-8.84,0-16-7.16-16-16l0-65.328 c0-0.328, 0.168-0.6, 0.184-0.92l0-205.248
125
  c0-124.456, 99.392-225.328, 223.832-225.328s 224.328,100.872, 224.328,225.328L 480.176,449.912 L 480.144,449.912 z M 448.144,448.416l0-64.168 L 368.016,384.248 L 368.016,448.416 L 448.144,448.416 z
126
  M 144.144,448.416l0-64.168 L 64.016,384.248 L 64.016,448.416 L 144.144,448.416 z M 255.84-0.416c-106.608,0-191.832,86.736-191.832,193.328L 64.008,352.248 l 80.168,0 l0-151.992
127
  c0-65.904, 50.424-119.328, 116.328-119.328S 367.84,134.352, 367.84,200.256L 367.84,352.248 l 80.328,0 l0-159.336 C 448.168,86.32, 362.456-0.416, 255.84-0.416z" />
128
- <glyph unicode="&#xe020;" d="M 297.672,447.64l 0.088,0 M 297.672,447.64l-36.104-189.688l 130.792-0.44L 214.328,0.36l 36.104,208.688l-130.784,0.456L 297.672,447.64
129
  M 297.696,479.64c-0.864,0-1.728-0.032-2.576-0.096c-5.648-0.456-9.392-2.344-13.832-5.328c-2.464-1.64-4.72-3.64-6.696-5.968
130
  c-0.584-0.688-1.136-1.408-1.648-2.144L 93.64,228.8c-7.080-9.704-8.12-22.512-2.68-33.216c 5.432-10.704, 16.416-17.488, 28.456-17.576
131
  l 92.368-0.672l-29.040-171.096c-2.76-14.704, 5.080-29.36, 18.88-35.264c 4.112-1.768, 8.432-2.608, 12.696-2.608c 10.056,0, 18.32,4.704, 24.52,13.2
132
  L 418.368,238.72c 7.080,9.704, 8.112,22.528, 2.68,33.216c-5.432,10.704-16.416,17.488-28.456,17.576l-92.368,0.16l 28.728,150.44
133
  c 0.6,2.424, 0.912,4.936, 0.912,7.528c0,17.312-13.784,31.424-31.032,31.984C 298.448,479.64, 298.072,479.64, 297.696,479.64L 297.696,479.64z" />
134
- <glyph unicode="&#xe021;" d="M 390.632,176.424c-8.128,3.64-17.544-0.032-21.128-8.096c-0.328-0.712-33.064-72.104-114.72-73.064
135
  c-0.504,0-1-0.016-1.504-0.016c-76.832,0-109.968,70.184-111.344,73.2c-3.656,8-13.096,11.56-21.16,7.936
136
  c-8.048-3.64-11.624-13.104-7.984-21.168c 1.704-3.784, 42.688-91.968, 140.424-91.968c 0.64,0, 1.296,0.016, 1.936,0.016
137
  c 101.936,1.2, 141.92,88.328, 143.56,92.032C 402.336,163.376, 398.696,172.832, 390.632,176.424z M 256,480C 114.608,480,0,365.392,0,224
@@ -139,7 +139,7 @@
139
  M 175.752,240.088c 17.632,0, 31.92,14.296, 31.92,31.912s-14.288,31.912-31.92,31.912c-17.64,0-31.92-14.296-31.92-31.912
140
  S 158.112,240.088, 175.752,240.088z M 335.752,240.088c 17.632,0, 31.92,14.296, 31.92,31.912s-14.288,31.912-31.92,31.912
141
  c-17.64,0-31.92-14.296-31.92-31.912S 318.112,240.088, 335.752,240.088z" />
142
- <glyph unicode="&#xe022;" d="M 256,480C 114.608,480,0,365.392,0,224s 114.608-256, 256-256s 256,114.608, 256,256S 397.392,480, 256,480z M 480,224c0-33.16-7.296-64.632-20.28-92.968
143
  l-141.608,75.776c 1.512,5.488, 2.392,11.232, 2.392,17.192c0,35.624-28.872,64.504-64.504,64.504c-7.312,0-14.312-1.272-20.856-3.512
144
  L 150.336,421.448C 181.832,438.368, 217.808,448, 256,448C 379.512,448, 480,347.512, 480,224z M 256,256.496c 17.92,0, 32.504-14.576, 32.504-32.504
145
  S 273.92,191.496, 256,191.496S 223.504,206.080, 223.504,224S 238.080,256.496, 256,256.496z M 123.288,404.312l 85.088-136.92
@@ -147,7 +147,7 @@
147
  c0,31.84, 6.72,62.128, 18.752,89.584l 142.184-76.080c-0.928-4.36-1.44-8.864-1.44-13.504c0-35.624, 28.872-64.504, 64.504-64.504
148
  c 6.2,0, 12.176,0.92, 17.848,2.552l 85.096-136.896C 328.104,9.128, 293.112,0, 256,0C 132.488,0, 32,100.488, 32,224z M 386.224,41.92
149
  L 301.472,178.264c 0.248,0.248, 0.48,0.512, 0.728,0.768l 142.144-76.072C 428.968,79.144, 409.224,58.416, 386.224,41.92z" />
150
- <glyph unicode="&#xe023;" d="M 508.2,231.68l-4.24,4.040c-0.080,0.080-0.168,0.112-0.264,0.184l-64.872,59.216
151
  c-4.672,4.472-12.224,4.472-16.912,0l-2.744-4.032c-4.672-4.472-3.152-11.704, 1.52-16.168l 38.232-34.672L 273.248,240.248 L 273.248,426.92 l 34.672-38.232
152
  c 4.472-4.672, 11.704-6.192, 16.168-1.512l 4.032,2.736c 4.472,4.688, 4.472,12.24,0,16.92l-56.584,61.984
153
  c-1.376,2.776-3.504,5.072-6.16,6.648l-0.712,0.744c-2.216,2.336-5.168,3.504-8.112,3.488c-2.952,0.016-5.888-1.152-8.144-3.488
@@ -162,15 +162,15 @@
162
  c-4.472,4.672-11.704,3.152-16.168-1.52l-34.672-38.232L 273.256,208.248 L 460.24,208.248 l-38.552-34.576c-4.672-4.472-6.184-11.72-1.512-16.184l 2.736-4.032
163
  c 4.688-4.464, 12.248-4.464, 16.912,0l 63.872,57.752c 0.088,0.088, 0.184,0.096, 0.264,0.168l 4.24,4.048
164
  c 2.336,2.248, 3.504,5.184, 3.488,8.144C 511.704,226.496, 510.536,229.456, 508.2,231.68z" />
165
- <glyph unicode="&#xe024;" d="M 496,80l-64,0 L 432,376.952 l 59.728,59.648c 6.24,6.248, 6.24,16.384,0,22.632c-6.248,6.248-16.384,6.248-22.632,0L 409.792,400L 112,400 L 112,464
166
  c0,8.84-7.16,16-16,16s-16-7.16-16-16l0-64 L 16,400 c-8.84,0-16-7.16-16-16c0-8.832, 7.16-16, 16-16l 64,0 l0-304 c0-1.472, 0.472-2.8, 0.84-4.144
167
  c 0.16-0.608, 0.128-1.232, 0.36-1.816c 1.608-4.032, 4.8-7.216, 8.832-8.84c 0.688-0.28, 1.44-0.248, 2.144-0.424
168
  C 93.44,48.456, 94.64,48, 96,48l 304,0 l0-64 c0-8.84, 7.16-16, 16-16s 16,7.16, 16,16l0,64 l 64,0 c 8.84,0, 16,7.16, 16,16S 504.84,80, 496,80z M 377.744,368
169
  L 112,102.608L 112,368 L 377.744,368 z M 134.64,80L 400,344.992L 400,80 L 134.64,80 z" />
170
- <glyph unicode="&#xe025;" d="M 464.072,392L 47.928,392 c-26.512,0-48-21.488-48-48l0-240 c0-26.512, 21.488-48, 48-48l 416.144,0
171
  c 26.512,0, 48,21.488, 48,48L 512.072,344 C 512.072,370.512, 490.584,392, 464.072,392z M 47.928,360l 416.144,0 c 8.832,0, 16-7.168, 16-16l0-32 L 31.928,312 l0,32
172
  C 31.928,352.832, 39.104,360, 47.928,360z M 464.072,88L 47.928,88 c-8.832,0-16,7.168-16,16L 31.928,248 l 448.144,0 l0-144 C 480.072,95.168, 472.896,88, 464.072,88z" />
173
- <glyph unicode="&#xe026;" d="M 405.208-5.36l-85.2,100.832L 320.008,272.224 l 10.656,0 c 8.84,0, 16,7.16, 16,16s-7.16,16-16,16l-26.656,0 c-8.84,0-16-7.16-16-16l0-198.912
174
  c0-3.968, 1.472-7.784, 4.128-10.72l 65.184-78.672l-202.64,0 l 65.184,78.672c 2.656,2.936, 4.128,6.752, 4.128,10.72L 223.992,288.224 c0,8.84-7.16,16-16,16
175
  l-26.656,0 c-8.84,0-16-7.16-16-16s 7.16-16, 16-16l 10.656,0 l0-176.752 L 106.792-5.36c-4.232-4.688-5.312-11.44-2.752-17.216
176
  c 2.576-5.784, 8.296-9.504, 14.624-9.504l 274.672,0 c 6.328,0, 12.048,3.72, 14.624,9.504C 410.52-16.8, 409.448-10.048, 405.208-5.36z M 240,320.16
@@ -178,14 +178,14 @@
178
  C 208.080,334.456, 222.36,320.16, 240,320.16z M 344.24,367.656c 31.184,0, 56.464,25.168, 56.464,56.208s-25.272,56.208-56.464,56.208
179
  c-31.176,0-56.464-25.168-56.464-56.208S 313.064,367.656, 344.24,367.656z M 343.992,448.168c 13.328,0, 24.168-10.792, 24.168-24.064
180
  c0-13.264-10.84-24.064-24.168-24.064s-24.168,10.8-24.168,24.064C 319.832,437.376, 330.664,448.168, 343.992,448.168z" />
181
- <glyph unicode="&#xe005;" d="M 255.864,448c 54.336,0, 111.96-45.768, 111.96-79.928l0-79.96 c0-30.776-12.8-89.656-47.128-116.688c-8.752-6.888-13.296-17.84-11.984-28.904
182
  c 1.312-11.080, 8.296-20.656, 18.424-25.312l 139.248-66.032c 1.088-0.496, 13.344-2.552, 13.344-19.672l 0.016-31.232L 32,0.248L 32,32.72
183
  c0,12.72, 9.544,16.712, 13.36,18.472l 140.512,66.312c 10.080,4.624, 17.032,14.16, 18.384,25.16c 1.36,11-3.080,21.92-11.728,28.856
184
  c-33.24,26.688-48.728,85.352-48.728,116.592l0,79.96 C 143.808,401.496, 202.008,448, 255.864,448 M 255.864,480c-70.656,0-144.064-58.968-144.064-111.928
185
  l0-79.96 c0-34.936, 15.944-105.624, 60.696-141.544L 31.976,80.248c0,0-31.976-14.248-31.976-31.984l0-48.016 c0-17.672, 14.32-31.984, 31.976-31.984l 447.776,0
186
  c 17.672,0, 31.984,14.312, 31.984,31.984l0,48.016 c0,18.8-31.984,31.984-31.984,31.984l-139.248,66.032c 44.328,34.888, 59.328,103.424, 59.328,141.832
187
  l0,79.96 C 399.832,421.032, 326.512,480, 255.864,480L 255.864,480z" />
188
- <glyph unicode="&#xe007;" d="M 255.992,461.936C 115.008,461.936, 0.32,347.232, 0.32,206.248
189
  c0-88.576, 44.84-169.592, 119.952-216.704c 7.472-4.736, 17.344-2.44, 22.048,5.048s 2.44,17.36-5.048,22.048
190
  c-27.048,16.976-49.52,39.024-66.712,64.44l 16.776,9.688c 7.656,4.424, 10.28,14.2, 5.856,21.856c-4.44,7.672-14.232,10.28-21.856,5.856
191
  l-16.8-9.696c-12.2,25.256-19.648,52.896-21.64,81.712l 17.808,0 c 8.84,0, 16,7.16, 16,16s-7.16,16-16,16L 32.976,222.496
@@ -202,7 +202,7 @@
202
  M 374.056,256.136c 7.648,4.424, 10.272,14.2, 5.856,21.856c-4.416,7.648-14.208,10.272-21.856,5.848l-86.912-50.176
203
  c-4.64,2.624-9.928,4.248-15.64,4.248c-17.64,0-31.92-14.296-31.92-31.904c0-17.624, 14.288-31.92, 31.92-31.92c 17.64,0, 31.92,14.296, 31.92,31.92
204
  c0,0.032-0.008,0.072-0.008,0.104L 374.056,256.136z" />
205
- <glyph unicode="&#xe008;" d="M 470.368,385.152c-13.872,9.984-52.528,23.248-214.504,23.248c-173.576,0-199.328-15.232-207.592-20.216
206
  c-43.984-26.424-48.16-143.408-48.544-167.128c 0.528-31.328, 5.592-135.56, 48.512-161.344c 8.248-4.968, 33.856-20.112, 207.624-20.112
207
  c 162.080,0, 200.688,13.2, 214.504,23.144c 37.488,26.968, 41.8,119.84, 41.904,158.72C 512.176,252.728, 508.896,357.4, 470.368,385.152z
208
  M 451.68,88.712c-5.576-4.016-37.592-17.112-195.816-17.112c-152.968,0-185.064,11.872-191.128,15.528c-15.44,9.264-31.736,58.44-33.016,134.016
@@ -211,7 +211,7 @@
211
  c-4.952,2.984-11.112,3.064-16.128,0.232c-5.032-2.84-8.144-8.168-8.144-13.936l0-176.72 c0-5.768, 3.112-11.096, 8.144-13.936
212
  c 2.44-1.376, 5.16-2.064, 7.856-2.064c 2.856,0, 5.736,0.768, 8.264,2.296l 143.968,88.376c 4.8,2.904, 7.736,8.096, 7.736,13.704
213
  S 365.008,233.696, 360.208,236.584z M 223.976,162.848L 223.976,282.896 l 97-60.016L 223.976,162.848z" />
214
- <glyph unicode="&#xe009;" d="M 342.2,400.656c 26.44,0, 50.312-10.816, 67.128-28.184c 20.92,4.048, 40.64,11.424, 58.36,21.64c-6.856-20.816-21.44-38.28-40.408-49.328
215
  c 18.56,2.184, 36.328,6.952, 52.816,14.080c-12.36-17.872-27.92-33.608-45.888-46.184c 0.168-3.816, 0.264-7.672, 0.264-11.512
216
  c0-117.864-92.504-253.808-261.656-253.808c-51.92,0-100.28,14.816-140.952,40.112c 7.184-0.84, 14.504-1.264, 21.92-1.264
217
  c 43.080,0, 82.752,14.248, 114.232,38.2c-40.264,0.688-74.248,26.504-85.904,61.92c 5.608-1.048, 11.376-1.608, 17.312-1.608
@@ -227,7 +227,7 @@
227
  c 182.016,0, 291.504,142.488, 293.632,281.672c 14.896,12.328, 28.064,26.592, 39.224,42.576c 4.064,5.344, 6.48,12.016, 6.48,19.248
228
  c0,10.888-5.448,20.512-13.744,26.296c 3.592,12.312-0.504,25.64-10.504,33.784c-5.84,4.752-13,7.168-20.2,7.168
229
  c-5.504,0-11.016-1.408-15.984-4.28c-10.576-6.096-21.888-10.92-33.8-14.392C 396.36,423.624, 369.64,432.656, 342.2,432.656L 342.2,432.656z" />
230
- <glyph unicode="&#xe00a;" d="M 264.008,448.128l0-111.936 l 112.16,0 l0-47.984 L 264.504,288.208 l-0.16-139.264c0-25.888, 1.344-42.504, 4.080-49.872c 4.264-11.624, 19.784-26.504, 48.592-26.504
231
  c 22.344,0, 52.488,6.72, 75.080,23.624l0-74.656 c-18.84-8.984-36.36-12.608-51.624-16.232c-15.28-3.608-31.832-5.424-49.576-5.424
232
  c-19.768,0-76.832,0.544-100.248,60.2c-4.216,10.736-6.328,26.328-6.328,46.736L 184.32,288.128 l-64.424,0 l 0.312,49.064
233
  c 21.328,0, 85.312,12.952, 85.312,110.936L 264.008,448.128 M 264.008,480.128L 205.52,480.128 c-17.672,0-32-14.328-32-32c0-73.248-40.816-78.936-53.312-78.936
@@ -237,7 +237,7 @@
237
  c-4.528,2.28-9.44,3.392-14.328,3.392c-6.784,0-13.528-2.16-19.168-6.376c-19.048-14.264-43.424-17.248-55.904-17.248
238
  c-12.8,0-17.56,4.64-18.608,5.872c-0.544,2.512-2.064,11.888-2.064,38.504l 0.112,107.264l 79.704,0 c 17.672,0, 32,14.328, 32,32l0,47.984
239
  c0,17.672-14.328,32-32,32l-80.16,0 L 296.008,448.128 C 296.008,465.8, 281.68,480.128, 264.008,480.128L 264.008,480.128z" />
240
- <glyph unicode="&#xe00b;" d="M 290.88,439.752c 1.904,0, 3-0.080, 3-0.080l 41.784,0 l-0.216-48l-41.504,0 c-22.84,0-22.312-19.504-22.312-19.504l0-76.096 l 80.816,0
241
  l-11.28-47.936l-69.8,0 l0-239.888 l-47.952,0 l-0.032,239.888L 159.68,248.136 l-0.128,47.936l 63.856,0 c0,0,0,58.688,0,74.592
242
  C 223.416,435.704, 277.432,439.752, 290.88,439.752 M 335.664,439.672l 0.080,0 M 290.88,471.752L 290.88,471.752c-11.504,0-33.984-1.904-55.28-14.736
243
  c-20.16-12.128-44.184-36.968-44.184-86.344l0-42.592 l-31.856,0 c-8.504,0-16.656-3.392-22.672-9.408c-6-6.032-9.36-14.184-9.328-22.704
@@ -245,7 +245,7 @@
245
  c 14.2,0, 26.704,9.36, 30.704,22.984l 11.28,47.936c 2.84,9.672, 0.952,20.128-5.096,28.184c-6.032,8.080-15.528,12.832-25.608,12.832l-48.816,0
246
  l0,31.576 l 31.816,0.016c 17.608,0, 31.92,14.232, 32,31.856l 0.216,46.376c 0.032,0.592, 0.048,1.168, 0.048,1.768c0,17.672-14.296,32-31.968,32l-0.080,0
247
  l-40.888,0 C 293.864,471.72, 292.536,471.752, 290.88,471.752L 290.88,471.752z" />
248
- <glyph unicode="&#xe00c;" d="M 511.712,367.624c-0.36,5.112-3.144,9.736-7.488,12.456L 361.632,469.064c-5.8,3.608-13.216,3.16-18.528-1.144l-87.112-70.472
249
  L 168.896,467.92c-5.296,4.28-12.768,4.768-18.528,1.144L 7.776,380.080c-4.344-2.72-7.128-7.344-7.488-12.456
250
  c-0.376-5.112, 1.736-10.080, 5.656-13.376l 82.608-69.408l-70.768-55.592c-4.048-3.16-6.312-8.088-6.112-13.208
251
  c 0.2-5.12, 2.84-9.832, 7.112-12.68l 65.488-43.656c-3.216-2.92-5.272-7.104-5.272-11.8l0-64.168 c0-5.56, 2.888-10.72, 7.624-13.64
@@ -257,7 +257,7 @@
257
  L 111.008,141.888 z M 399.104,92.672l-128.128-72.84L 270.976,163.72 l 66.328-50.984c 2.856-2.2, 6.312-3.312, 9.752-3.312c 3.096,0, 6.184,0.888, 8.872,2.688
258
  l 43.168,28.784L 399.096,92.672 z M 456.728,217.76l-109.016-72.664l-63.72,48.968l 113,70.816L 456.728,217.76z M 396.832,304.296l-113.672,73.984
259
  l 71.2,57.592l 114.232-71.296L 396.832,304.296z" />
260
- <glyph unicode="&#xe00d;" d="M 255.992,479.864c-34.928,0-68.232-7.056-98.592-19.784c-1.056-0.336-2.088-0.776-3.072-1.336
261
  C 63.696,419.336, 0.136,328.968, 0.136,223.992c0-141.080, 114.784-255.856, 255.856-255.856c 141.096,0, 255.872,114.784, 255.872,255.856
262
  C 511.864,365.088, 397.088,479.864, 255.992,479.864z M 479.864,223.992c0-1.792-0.096-3.56-0.136-5.336
263
  c-24.512,6.504-86.696,18.72-163.4,1.872c-6.76,15.448-14.256,31.288-22.64,47.408c-0.704,1.352-1.392,2.64-2.088,3.976
@@ -271,7 +271,7 @@
271
  c 13.984,6.336, 27.76,11.392, 41.192,15.456c 30.368-77.16, 40.904-140.784, 44.088-165.296c-26.376-10.952-55.264-17.032-85.56-17.032
272
  C 203.984,0.136, 156.096,18.016, 118.048,47.88z M 371.808,32.48c-4.616,30.8-16.072,88.696-42.984,157.832
273
  c 74.224,14.776, 132.976,0.28, 147.808-4.040C 465.52,121.168, 426.264,65.528, 371.808,32.48z" />
274
- <glyph unicode="&#xe00e;" d="M 453.976,407.76c-5.936,5.544-13.752,8.608-21.832,8.608
275
  c-0.736,0-1.472-0.032-2.2-0.080c-0.456-0.032-5.592-0.344-13.64-0.344c-13.328,0-39.344,0.904-63.984,6.968
276
  c-31.832,7.816-68.56,44.080-79.248,51.232c-5.376,3.592-11.576,5.392-17.784,5.392c-6.184,0-12.392-1.8-17.768-5.376
277
  c-1.296-0.872-39.752-42.016-77.376-51.248c-24.624-6.064-51.144-6.968-64.456-6.968c-8.048,0-13.184,0.312-13.688,0.344
@@ -284,12 +284,12 @@
284
  c-6.248,6.248-16.384,6.248-22.624,0l-45.256-45.256l-45.256,45.256c-6.248,6.248-16.384,6.248-22.632,0s-6.248-16.384,0-22.624l 45.256-45.256
285
  l-45.256-45.256c-6.248-6.24-6.248-16.376,0-22.624s 16.384-6.248, 22.632,0l 45.256,45.256l 45.256-45.256c 6.24-6.248, 16.376-6.248, 22.624,0
286
  s 6.248,16.384,0,22.624l-45.256,45.256l 45.256,45.256C 330.048,290.496, 330.048,300.632, 323.8,306.88z" />
287
- <glyph unicode="&#xe00f;" d="M 416.072,480L 95.928,480 c-26.512,0-48-21.488-48-48l0-416 c0-26.512, 21.488-48, 48-48l 320.144,0
288
  c 26.512,0, 48,21.488, 48,48L 464.072,432 C 464.072,458.512, 442.584,480, 416.072,480z M 432.072,16c0-8.832-7.168-16-16-16L 95.928,0 c-8.832,0-16,7.168-16,16L 79.928,432
289
  c0,8.832, 7.168,16, 16,16l 320.144,0 c 8.832,0, 16-7.168, 16-16L 432.072,16 z M 256.024,79.912c-17.64,0-31.92-14.296-31.92-31.912s 14.28-31.92, 31.92-31.92
290
  c 17.632,0, 31.92,14.304, 31.92,31.92S 273.656,79.912, 256.024,79.912z M 288.024,432l-64,0 c-8.832,0-16-7.168-16-16s 7.168-16, 16-16l 64,0
291
  c 8.832,0, 16,7.168, 16,16S 296.856,432, 288.024,432z" />
292
- <glyph unicode="&#xe017;" d="M 510.256,265.312l-51.392,76.84l 25.576,89.408c 1.592,5.608, 0.032,11.64-4.112,15.752c-4.128,4.128-10.128,5.656-15.768,4.016
293
  L 375.304,425.264l-77.144,51.952c-4.856,3.264-11.080,3.656-16.232,0.968c-5.184-2.656-8.512-7.936-8.704-13.752l-2.768-92.968
294
  l-73.248-57.296c-4.592-3.592-6.856-9.408-5.936-15.16s 4.904-10.544, 10.408-12.512l 68.728-24.64c-0.464-0.368-0.952-0.696-1.384-1.128
295
  L 3.648-4.648c-6.248-6.248-6.248-16.376,0-22.624c 3.128-3.128, 7.216-4.688, 11.312-4.688s 8.184,1.56, 11.312,4.688l 265.376,265.376
@@ -299,14 +299,14 @@
299
  c-1.624,4.472-5.16,7.968-9.64,9.576l-67.296,24.128l 56.312,44.032c 3.752,2.936, 5.984,7.376, 6.144,12.128l 2.128,71.472l 59.296-39.936
300
  c 3.952-2.656, 8.888-3.408, 13.424-2.096l 68.624,20.048l-19.672-68.736c-1.296-4.576-0.504-9.488, 2.168-13.424l 40.28-59.064L 397.024,268.728z
301
  " />
302
- <glyph unicode="&#xe018;" d="M 416.528,447.696l-32.232,0 l0-107.704 c0-52.192-28.328-91.68-89.048-122.6
303
  C 358.28,185.488, 384.8,146.312, 384.8,87.856c0-38.064-0.168-70-0.296-87.56l 32.032,0 c 8.84,0, 16-7.144, 16-15.984s-7.16-16-16-16L 95.472-31.688
304
  c-8.84,0-16,7.16-16,16s 7.16,15.984, 16,15.984l 32.968,0 c-0.12,17.56-0.296,49.504-0.296,87.56c0,58.456, 26.144,97.624, 89.072,129.528
305
  c-60.616,30.92-88.568,70.408-88.568,122.6L 128.648,447.696 l-33.176,0 c-8.84,0-16,7.152-16,16c0,8.832, 7.16,15.992, 16,15.992l 321.064,0
306
  c 8.84,0, 16-7.16, 16-15.992C 432.528,454.848, 425.376,447.696, 416.528,447.696z M 160.136,87.856c0-38.144, 0.176-70.112, 0.296-87.56l 192.088,0
307
  c 0.112,17.456, 0.296,49.424, 0.296,87.56c0,44.504-16.56,79.016-96.592,112.2C 176.216,166.872, 160.136,132.36, 160.136,87.856z M 352.312,447.696
308
  l-191.68,0 l0-107.704 c0-30.688, 10.32-70.208, 95.584-105.264c 85.28,35.056, 96.096,74.576, 96.096,105.264L 352.312,447.696 z" />
309
- <glyph unicode="&#xe019;" d="M 495.424,131.848L 495.424,260.92 l 8.048,4.248c 5.232,2.72, 8.528,8.112, 8.592,14.016
310
  c 0.064,5.888-3.128,11.344-8.296,14.184l-240.72,128.8c-4.816,2.64-10.64,2.624-15.488-0.048L 8.16,293.16
311
  c-5.096-2.84-8.248-8.232-8.216-14.080s 3.248-11.2, 8.408-13.984l 105.192-55.992c-1.32-2.328-2.136-4.984-2.136-7.848l0-135.392
312
  c0-4.56, 1.952-8.92, 5.36-11.952c 3.472-3.080, 36.72-30.048, 138.376-30.048c 101.296,0, 135.44,25.488, 139,28.392
@@ -314,7 +314,7 @@
314
  c-9.488-5.552-15.92-15.736-15.92-27.512c0-17.672, 14.328-32, 32-32s 32,14.328, 32,32C 511.504,116.096, 504.984,126.32, 495.424,131.848z M 368.016,73.816
315
  c-12.576-6.048-45.856-17.952-112.872-17.952c-67.44,0-99.968,12.672-111.736,18.768L 143.408,193.2 l 103.904-55.312c 2.36-1.28, 4.984-1.92, 7.592-1.92
316
  c 2.544,0, 5.096,0.608, 7.408,1.832l 105.704,55.832L 368.016,73.816 z M 255.032,170.096L 49.232,279.376l 206.16,110.488l 206.8-110.168L 255.032,170.096z" />
317
- <glyph unicode="&#xe01a;" d="M 255.992,480.064c-114.608,0-207.84-99.952-207.84-222.8l0-273.336 c0-6.608, 4.080-12.544, 10.248-14.92
318
  c 1.856-0.736, 3.816-1.080, 5.752-1.080c 4.424,0, 8.768,1.84, 11.856,5.264l 60.296,66.56l 47.216-65.216
319
  c 2.984-4.128, 7.752-6.576, 12.84-6.608l 0.112,0 c 5.048,0, 9.816,2.392, 12.832,6.456l 47.408,63.672l 46.592-63.576
320
  c 3.016-4.112, 7.8-6.544, 12.904-6.544c 5.096,0, 9.888,2.424, 12.904,6.528l 47.784,65.144l 59-66.312
@@ -325,7 +325,7 @@
325
  L 80.144,257.272 c0,105.2, 78.888,190.8, 175.84,190.8c 96.968,0, 175.856-85.592, 175.856-190.8L 431.84,25.984 z M 336,303.92c-17.64,0-31.92-14.296-31.92-31.904
326
  c0-17.624, 14.28-31.92, 31.92-31.92s 31.92,14.296, 31.92,31.92C 367.92,289.624, 353.64,303.92, 336,303.92z M 176,303.92
327
  c-17.64,0-31.92-14.296-31.92-31.904c0-17.624, 14.288-31.92, 31.92-31.92s 31.92,14.296, 31.92,31.92C 207.92,289.624, 193.64,303.92, 176,303.92z" />
328
- <glyph unicode="&#xe01b;" d="M 371.608,442.224c-12.8,6.008-24.904,11.664-35.92,17.192
329
  c-28.232,14.144-53.832,21.016-78.232,21.016c-49.144,0-83.152-28.352-104.48-49.68l-17.792-17.808l-11.872-11.888l-17.232-17.256l-26.864-26.896
330
  l-29.664-29.688c-55.344-55.4-64.184-111.8-28.632-182.904c 5.512-11.040, 11.184-23.168, 17.184-36.016
331
  c 32.352-69.192, 65.792-140.744, 120.528-140.744c 1.536,0, 3.056,0.048, 4.608,0.168c 56.488,4.424, 72.512,77.144, 86.656,141.296
@@ -341,7 +341,7 @@
341
  c 6,6, 6,15.736,0,21.728c-6,6-15.72,6-21.72,0l-12.176-12.176l-12.176,12.176c-6,6-15.72,6-21.72,0
342
  c-6-6-6-15.728,0-21.728l 12.176-12.176l-12.176-12.176c-6-5.992-6-15.72,0-21.72c 6-6, 15.728-6, 21.72,0
343
  l 12.176,12.168l 12.528-12.528c 6-6, 15.72-6, 21.72,0s 6,15.736,0,21.736L 164.944,208.28z" />
344
- <glyph unicode="&#xe01c;" d="M 254.208-31.64c-120.624,0-206.184,83.64-206.184,198.888c0,61.184, 36.688,127.096, 38.248,129.856
345
  c 3.184,5.672, 9.44,8.752, 15.968,8.032c 6.456-0.832, 11.768-5.488, 13.44-11.784c 0.096-0.376, 9.984-37.376, 23.032-57.92
346
  c 8.768-13.824, 17.656-23.592, 27.656-30.376c-6.768,29.328-11.952,73.456-3.512,118.736C 186.024,448.080, 283.848,477.816, 288.040,479.016
347
  c 5.392,1.544, 11.112,0.16, 15.216-3.576c 4.096-3.752, 5.968-9.376, 4.904-14.832c-0.16-0.872-16.312-87.888, 17.968-162.032
@@ -354,7 +354,7 @@
354
  c-1.2,1.704-29.656,41.984-42.2,69.12c-26.048,56.296-25.608,117.168-22.952,152.232c-26.36-15.36-66.832-49.672-79.832-119.456
355
  c-12.656-67.904, 11.936-135.8, 12.2-136.472c 2.128-5.544, 1-11.832-2.904-16.296c-3.92-4.44-9.952-6.408-15.768-5.016
356
  c-1.984,0.488-47.016,12.2-76.168,58.144C 106.464,226.512, 101.792,236.472, 97.848,246.16z" />
357
- <glyph unicode="&#xe01d;" d="M 512.688,154.104c-0.488,6.92-26.504,159.656-30.576,184.112c-0.392,2.344-0.704,4.84-1.048,7.472
358
  c-3.144,24.576-9.016,70.312-82.736,70.312c-8.84,0-16-7.16-16-16s 7.16-16, 16-16c 45.56,0, 47.968-18.704, 51-42.392
359
  c 0.392-3.032, 0.768-5.936, 1.216-8.64c 1.872-11.264, 10.352-56.080, 17.672-100.512c-18.776,14.312-42.144,22.904-67.56,22.904
360
  c-40.824,0-77.16-21.976-97.136-54.68c-9.608,3.632-25.912,8.168-47.696,8.168c-21.472,0-37.256-4.568-47.016-8.544
@@ -369,7 +369,7 @@
369
  c-44.096,0-81.344,36.488-81.344,79.672s 37.248,79.672, 81.344,79.672c 38,0, 69.816-26.744, 77.728-62.392
370
  c 0.328-3.264, 0.6-6.336, 0.808-9.144c 0.096-1.344, 0.456-2.608, 0.92-3.832c 0.080-1.44, 0.216-2.856, 0.216-4.312
371
  C 480.328,99.744, 444.592,64.008, 400.656,64.008z" />
372
- <glyph unicode="&#xe01e;" d="M 511.656,243.352c-0.68,5.656-2.808,10.856-6.048,15.232l 0.080,0 l-0.44,0.44c-1.64,2.16-3.56,4.064-5.704,5.752L 290.904,466.48
373
  c-18.112,18.112-49.752,18.144-67.888,0L 14.408,266.352c-4.512-4.2-14.44-15.544-14.44-26.672l0-239.76 c0-17.592, 14.408-32, 32-32l 448,0
374
  c 17.592,0, 32,14.408, 32,32L 511.968,239.048 C 512.080,240.488, 511.936,241.928, 511.656,243.352z M 134.896,116.832L 31.968,22.048L 31.968,207.64 L 134.896,116.832z
375
  M 167.784,103.64c 1.144,0.76, 2.232,1.624, 3.184,2.704c 0.184,0.208, 0.312,0.456, 0.48,0.672l 70.584,65
@@ -377,7 +377,7 @@
377
  l 101.24,89.848l0-180.92 L 378.728,114.72z M 51.888,258.584L 245.64,443.856c 3.032,3.016, 7.048,4.688, 11.312,4.688
378
  c 4.28,0, 8.296-1.672, 11.328-4.688L 448.968,271.68l-0.488,0 l 27.448-27.896l-121.152-107.52l-67.624,60.832
379
  c-18.84,14.768-45.888,15.408-65.84-0.688l-62.752-57.792L 37.664,245.288l 13.496,13.296L 51.888,258.584 z" />
380
- <glyph unicode="&#xe01f;" d="M 511.656,243.36c-0.68,5.656-2.808,10.856-6.048,15.232l 0.080,0 l-0.44,0.44c-1.64,2.16-3.56,4.064-5.704,5.752
381
  L 415.968,348.976L 415.968,400.608 c0,8.84-7.16,16-16,16l-50.664,0 l-58.4,49.856c-18.112,18.112-49.752,18.144-67.888,0l-58.2-49.856l-52.848,0
382
  c-8.84,0-16-7.16-16-16l0-52.688 L 14.408,266.36c-8.672-5.736-14.44-15.544-14.44-26.672l0-239.752 c0-17.592, 14.408-32, 32-32l 448,0
383
  c 17.592,0, 32,14.408, 32,32l0,239.12 C 512.080,240.496, 511.936,241.936, 511.656,243.36z M 134.432,117.248L 31.968,22.208L 31.968,207.656 L 134.432,117.248z
@@ -387,7 +387,7 @@
387
  c 3.032,3.016, 7.048,4.688, 11.312,4.688c 4.28,0, 8.296-1.672, 11.328-4.688l 32.312-27.232L 213.376,416.608 L 245.64,443.84z M 383.968,384.608l0-222.424
388
  l-28.656-25.44l-68.16,61.784c-18.84,14.768-45.888,15.408-65.84-0.688L 158,139.12l-30.032,26.504L 127.968,384.608 L 383.968,384.608 z M 51.888,258.592l 44.080,44.064
389
  l0-108.808 l-58.312,51.448l 13.496,13.296L 51.888,258.592 z" />
390
- <glyph unicode="&#xe027;" d="M 452.808,124.056c-18.672,22.712-44.24,54.872-44.24,87.68l0,104.48
391
  c0,90.008-67.32,163.24-153.344,163.24c-86.040,0-152.832-73.232-152.832-163.24l0-104.48 c0-32.256-27.744-62.744-45.336-86.4
392
  c-15.824-21.256-28.312-38.048-19.88-54.832c 7.416-14.768, 25.984-16.664, 41.328-16.664l 91.68,0 c 0.024-47.104, 38.224-85.288, 85.336-85.288
393
  c 47.12,0, 85.32,38.184, 85.344,85.288l 93.832,0 c 9.76,0, 32.576,0, 40.432,16.6C 483.056,87.248, 470.368,102.696, 452.808,124.056z
@@ -395,7 +395,7 @@
395
  c-2.448,0-4.496,0.080-6.184,0.184c 3.296,5.104, 8.136,11.624, 12.072,16.928c 19.496,26.2, 52.072,63.184, 52.072,106.712l0,104.48
396
  c0,71.232, 51.52,129.176, 118.76,129.176c 67.24,0, 119.28-57.944, 119.28-129.176l0-104.48 c0-45.008, 30.040-82.624, 51.984-109.304
397
  c 3.696-4.496, 8.12-9.88, 11.56-14.48C 437.032,87.92, 435.912,87.904, 434.696,87.904z" />
398
- <glyph unicode="&#xe028;" d="M 510.528,60.016L 416.896,233.168c 9.552,21.68, 14.896,45.64, 14.896,70.848c0,97.152-78.76,175.904-175.904,175.904
399
  c-97.168,0-175.92-78.76-175.92-175.904c0-25.816, 5.608-50.312, 15.592-72.392L 1.512,60.096c-3.032-5.512-2.528-12.312, 1.264-17.344
400
  c 3.8-5.016, 10.216-7.376, 16.344-5.936l 80.312,18.424l 27.488-76.56c 2.144-5.952, 7.576-10.080, 13.872-10.544
401
  c 0.408-0.032, 0.8-0.048, 1.184-0.048c 5.856,0, 11.296,3.216, 14.096,8.44l 81.848,152.488c 5.904-0.6, 11.896-0.904, 17.96-0.904
@@ -406,7 +406,7 @@
406
  c 79.272,0, 143.768-64.496, 143.768-143.768s-64.496-143.784-143.768-143.784C 176.608,160.232, 112.112,224.744, 112.112,304.016z M 405.872,89.592
407
  c-7.936,1.872-15.888-2.56-18.64-10.184l-20.264-56.488L 305.392,135.2c 37.72,11.048, 70.168,34.368, 92.752,65.368l 67.424-124.664L 405.872,89.592z
408
  " />
409
- <glyph unicode="&#xe029;" d="M 510.512,114.296l-41.144,75.648c-0.064,0.104-0.048,0.2-0.112,0.296l-2.936,5.072
410
  c-1.64,2.808-4.216,4.616-7.096,5.296c-2.848,0.704-5.992,0.272-8.704-1.488l-4.92-3.168c-0.096-0.056-0.152-0.144-0.248-0.208
411
  l-72.8-49.16c-5.44-3.504-7.208-10.84-3.968-16.456l 3.272-3.6c 3.24-5.592, 10.632-5.824, 16.080-2.32l 43.52,29.592
412
  c-10.304-83-77.368-146.696-159.48-154.088L 271.976,320.512 L 336,320.512 c 8.832,0, 16,7.168, 16,16s-7.168,16-16,16l-64.72,0
@@ -419,26 +419,26 @@
419
  c 14.688-102.36, 102.552-178.912, 206.64-178.912c 104.032,0, 191.96,76.544, 206.68,178.856l 23.92-44.432c 3.248-5.592, 9.944-8.768, 15.384-5.272
420
  l 4.56,1.712C 511.984,101.36, 513.76,108.712, 510.512,114.296z M 223.752,416.512c0,17.92, 14.576,32.504, 32.496,32.504
421
  c 17.92,0, 32.504-14.576, 32.504-32.504s-14.576-32.504-32.504-32.504C 238.336,384.016, 223.752,398.592, 223.752,416.512z" />
422
- <glyph unicode="&#xe02a;" d="M 511.824,334.76c 0.232,11.832-2.952,39.424-38.92,49.032L 115.024,455.76l-3.328,0.344
423
  c-26.472,0-48-21.528-48-48l0-64.352 l-16,0.040c-26.376-0.112-47.816-21.576-47.816-47.984l0-255.904 c0-26.472, 21.528-48, 48-48l 416.232,0
424
  c 26.472,0, 48,21.528, 48,48L 511.824,334.76z M 95.696,408.104c0,8.36, 6.44,15.232, 14.608,15.936l 353-71.44
425
  c 0.128-0.064-2.624-8.968-15.44-8.8L 95.696,343.8 L 95.696,408.104 z M 480.12,39.896c0-8.832-7.168-16-16-16L 47.88,23.896 c-8.832,0-16,7.168-16,16L 31.88,295.808
426
  c0,8.832, 7.168,16, 16,16l 400.032,0 c 15.704,0, 32.2,5.352, 32.2,15.944L 480.112,39.896 z M 95.912,199.752c-17.672,0-32-14.328-32-32s 14.328-32, 32-32
427
  s 32,14.328, 32,32S 113.584,199.752, 95.912,199.752z" />
428
- <glyph unicode="&#xe02b;" d="M 496,144l-16.136,0 l0,0.808 c0,80.96-43.264,151.904-107.832,191.192l 80.408,0
429
  c 5.544-9.52, 15.752-16, 27.56-16c 17.672,0, 32,14.328, 32,32s-14.328,32-32,32c-11.816,0-22.016-6.48-27.56-16L 304,368 l0,16 c0,8.832-7.168,16-16,16l-64,0
430
  c-8.832,0-16-7.168-16-16l0-16 L 59.56,368 C 54.016,377.52, 43.816,384, 32,384c-17.672,0-32-14.328-32-32s 14.328-32, 32-32c 11.816,0, 22.016,6.48, 27.56,16l 80.4,0
431
  C 75.392,296.704, 32.136,225.768, 32.136,144.808L 32.136,144 L 16,144 c-8.832,0-16-7.168-16-16l0-64 c0-8.832, 7.168-16, 16-16l 64,0 c 8.832,0, 16,7.168, 16,16l0,64
432
  c0,8.832-7.168,16-16,16L 64.136,144 l0,0.808 c0,89.224, 61.232,164.336, 143.864,185.696L 208,320 c0-8.832, 7.168-16, 16-16l 64,0 c 8.832,0, 16,7.168, 16,16l0,10.504
433
  c 82.632-21.368, 143.864-96.48, 143.864-185.696L 447.864,144 L 432,144 c-8.832,0-16-7.168-16-16l0-64 c0-8.832, 7.168-16, 16-16l 64,0 c 8.832,0, 16,7.168, 16,16l0,64
434
  C 512,136.832, 504.832,144, 496,144z M 64,80L 32,80 l0,32 l 32,0 L 64,80 z M 272,336l-32,0 l0,32 l 32,0 L 272,336 z M 480,80l-32,0 l0,32 l 32,0 L 480,80 z" />
435
- <glyph unicode="&#xe02c;" d="M 480,448.2L 32,448.2 c-17.672,0-32-14.328-32-32l0-288.752 c0-17.672, 14.328-32, 32-32l 63.768,0 l0-79.656
436
  c0-6.456, 3.872-12.264, 9.816-14.752c 2-0.84, 4.112-1.248, 6.184-1.248c 4.128,0, 8.168,1.592, 11.216,4.592l 92.512,91.064L 480,95.448
437
  c 17.672,0, 32,14.328, 32,32L 512,416.2 C 512,433.872, 497.672,448.2, 480,448.2z M 480,127.456L 202.392,127.456 l-74.624-73.456l0,73.456 L 32,127.456 L 32,416.2 l 448,0 L 480,127.456 z
438
  M 112,255.496l 288,0 c 8.832,0, 16,7.168, 16,16s-7.168,16-16,16L 112,287.496 c-8.832,0-16-7.168-16-16S 103.168,255.496, 112,255.496z M 112,319.496l 288,0
439
  c 8.832,0, 16,7.168, 16,16s-7.168,16-16,16L 112,351.496 c-8.832,0-16-7.168-16-16S 103.168,319.496, 112,319.496z M 112,191.496l 192,0 c 8.832,0, 16,7.168, 16,16
440
  s-7.168,16-16,16L 112,223.496 c-8.832,0-16-7.168-16-16S 103.168,191.496, 112,191.496z" />
441
- <glyph unicode="&#xe02d;" d="M 256-32.080c-10.144,0-19.688,3.936-26.872,11.096L 10.872,197.264c-14.768,14.84-14.768,38.976-0.032,53.784l 79.952,79.936
442
  c 4.936,4.936, 12.512,6.112, 18.72,2.872c 6.184-3.232, 9.56-10.112, 8.344-16.984c-0.816-4.576-1.184-8.248-1.184-11.56
443
  c0-35, 28.488-64.072, 63.504-64.072c 35.048,0, 60.64,29.072, 60.64,64.072c0,35.048-25.592,63.544-60.64,63.544c-3.28,0-6.936-0.376-11.512-1.184
444
  c-6.936-1.28-13.752,2.16-16.984,8.344c-3.232,6.2-2.064,13.784, 2.872,18.72l 74.544,74.56c 14.44,14.376, 39.408,14.344, 53.784,0.032
@@ -450,20 +450,20 @@
450
  c-30.856,0-55.968-25.128-55.968-56.016c0-1.28, 0.2-2.528, 0.376-3.784l 0.344-2.856c 0.72-6.752-2.888-13.216-9.016-16.144
451
  c-6.080-2.904-13.408-1.656-18.2,3.128l-78.472,78.512c-3.064,3.032-5.472,3.064-8.592-0.032l-48.56-48.56
452
  c 41.64-10.312, 69.688-47.984, 69.688-92.768c0-52.656-39.96-96.064-92.648-96.064C 135.4,209.248, 97.744,240.784, 87.448,282.392z" />
453
- <glyph unicode="&#xe02e;" d="M 476.368,352.536l-60.36,0 L 416.008,479.76 L 95.992,479.76 l0-127.224 L 35.632,352.536 c-19.656,0-35.656-16-35.656-35.672
454
  L-0.024,99.92 c0-19.672, 16-35.672, 35.656-35.672l 60.36,0 L 95.992-31.76 l 320.016,0 L 416.008,64.248 l 60.36,0 c 19.656,0, 35.656,16, 35.656,35.672L 512.024,316.864
455
  C 512.024,336.536, 496.024,352.536, 476.368,352.536z M 127.992,448.256l 256.016,0 l0-95.72 L 127.992,352.536 L 127.992,448.256 z M 384.008,0.24L 127.992,0.24 L 127.992,176.44 l 256.016,0
456
  L 384.008,0.24 z M 480.024,99.92c0-2.040-1.64-3.672-3.656-3.672l-60.36,0 L 416.008,208.44 L 95.992,208.44 l0-112.184 L 35.632,96.256 c-2.016,0-3.656,1.632-3.656,3.672
457
  L 31.976,316.864 c0,2.032, 1.64,3.672, 3.656,3.672l 440.736,0 c 2.016,0, 3.656-1.64, 3.656-3.672L 480.024,99.92 z M 416,288.28l-16,0 c-8.832,0-16-7.168-16-16
458
  s 7.168-16, 16-16l 16,0 c 8.832,0, 16,7.168, 16,16S 424.832,288.28, 416,288.28z" />
459
- <glyph unicode="&#xe02f;" d="M 512,319.752c0,17.672-14.328,32-32,32l-54.624,0 c 14.136,13.944, 23.184,32.224, 23.184,54.736c0,27.72-15.92,57.832-60.608,57.832
460
  c-58.8,0-107.92-62.608-131-97.704C 233.856,401.704, 183.232,464.312, 124.44,464.312c-44.688,0-60.608-30.112-60.608-57.832
461
  c0-22.504, 9.296-40.792, 23.72-54.736L 32,351.744 c-17.672,0-32-14.328-32-32l0-95.784 l 32.28,0 l0-208.28 c0-17.672, 14.328-32, 32-32l 383.84,0 c 17.672,0, 32,14.328, 32,32
462
  L 480.12,223.968 L 512,223.968 L 512,319.752 z M 387.952,432.312c 19.784,0, 28.608-8.312, 28.608-25.832c0-35.544-39.672-54.72-76.984-54.72l-54.168,0
463
  C 308.144,385.528, 348.16,432.312, 387.952,432.312z M 124.44,432.312c 39.8,0, 81.328-46.784, 104.064-80.544l-54.184,0
464
  c-37.312,0-78.488,19.672-78.488,55.216C 95.832,424.496, 104.656,432.312, 124.44,432.312z M 480,255.968L 272,255.968 l0,63.784 l 208,0 L 480,255.968 z M 32,319.752l 208,0 l0-63.784
465
  L 32,255.968 L 32,319.752 z M 64.28,223.968L 240,223.968 l0-208.28 L 64.28,15.688 L 64.28,223.968 z M 448.128,15.688L 272,15.688 L 272,223.968 l 176.128,0 L 448.128,15.688 z" />
466
- <glyph unicode="&#xe030;" d="M 16.88,448.12l 224,0 c 8.832,0, 16,7.168, 16,16s-7.168,16-16,16l-224,0 c-8.832,0-16-7.168-16-16
467
  S 8.040,448.12, 16.88,448.12z M 16.88,352.12l 224,0 c 8.832,0, 16,7.168, 16,16s-7.168,16-16,16l-224,0 c-8.832,0-16-7.168-16-16S 8.040,352.12, 16.88,352.12z
468
  M 256.88,272.12c0,8.832-7.168,16-16,16l-224,0 c-8.832,0-16-7.168-16-16s 7.168-16, 16-16l 224,0 C 249.712,256.12, 256.88,263.288, 256.88,272.12z
469
  M 506.44,317.728L 349.984,474.176c-4.952,4.96-12.328,5.92-18.296,3.008c-6.272-2.168-10.808-8.056-10.808-15.064L 320.88,107.92
@@ -471,7 +471,7 @@
471
  c 53.064,0, 96.048,35.904, 96.048,80.168c0,2.008-0.184,3.968-0.36,5.936L 352.88,426.024 l 130.92-130.928c 6.248-6.248, 16.384-6.248, 22.632,0
472
  C 512.68,301.344, 512.68,311.48, 506.44,317.728z M 320.88,46.488c-1.152-22.248-27.096-46.408-64.064-46.408
473
  c-37.824,0-64.176,25.28-64.176,47.936c0,22.672, 26.352,47.92, 64.176,47.92c 36.968,0, 62.912-24.128, 64.064-46.392L 320.88,46.488 z" />
474
- <glyph unicode="&#xe031;" d="M 507.424,290.168L 323.344,475.176c-3.968,3.984-9.688,5.608-15.16,4.248c-5.456-1.328-9.8-5.424-11.472-10.784
475
  c-11.080-35.656-12.36-67.92-3.896-97.344c-0.776-0.536-1.52-1.12-2.208-1.808L 205.056,283.952c-27.6,12.8-57.272,19.728-86.848,19.728
476
  c-18.8,0-37.232-2.784-54.784-8.232c-5.344-1.672-9.44-6-10.784-11.424c-1.344-5.44, 0.232-11.168, 4.184-15.144l 109.488-110.192
477
  L 13.232,3.168l-13.312-35.064l 32.184,12.44l 156.68,155.52l 110.912-111.632c 3.032-3.064, 7.144-4.72, 11.344-4.72
@@ -482,18 +482,18 @@
482
  c-8.416,12.864-18.232,25.088-29.512,36.376c-11.232,11.232-23.504,21.128-36.48,29.664l 72.064,72.048c 7.352-12.784, 16.832-25, 28.504-36.664
483
  c 11.928-11.92, 24.544-21.568, 37.8-29.032L 300.112,201.728z M 357.312,325.776c-30.768,30.768-42.624,65.064-36.344,106.44l 143.456-144.2
484
  C 423.096,282.088, 388.624,294.464, 357.312,325.776z" />
485
- <glyph unicode="&#xe032;" d="M 480,440.048L 32,440.048 c-17.592,0-32-14.408-32-32l0-368.096 c0-17.592, 14.408-32, 32-32l 448,0 c 17.592,0, 32,14.408, 32,32L 512,408.048
486
  C 512,425.64, 497.592,440.048, 480,440.048z M 480,39.952L 32,39.952 L 32,134.232 l 128.424,124.456l 132.392-132.248c 5.456-6.624, 15.168-5.784, 22.064-0.56
487
  l 58.44,52.904L 478.72,70.592c 0.4-0.4, 0.848-0.696, 1.28-1.040L 480,39.952 z M 480,115.104L 385.984,211.312
488
  c-5.704,5.624-14.64,6.2-20.968,1.376l-60.28-52.512L 172.264,291.216c-2.832,3.424-6.92,5.512-11.344,5.8
489
  c-4.408,0.16-8.752-1.28-11.984-4.312L 32,178.904L 32,408.048 l 448,0 L 480,115.104 z M 368,279.936c 17.64,0, 31.92,14.304, 31.92,31.92
490
  c0,17.608-14.28,31.912-31.92,31.912s-31.92-14.304-31.92-31.912C 336.080,294.24, 350.36,279.936, 368,279.936z" />
491
- <glyph unicode="&#xe033;" d="M 496.592,412.496L 336.112,479.032L 176.392,415.816L 15.408,479
492
  c-1.376,0.408-2.72,0.56-3.984,0.56C 4.856,479.592,0,474.688,0,467.312l0-415 c0-8.784, 6.936-17.936, 15.408-20.28l 161.168-63.592
493
  l 159.504,64.752l 160.512-63.064c 1.376-0.376, 2.72-0.56, 3.984-0.56c 6.56,0, 11.424,4.872, 11.424,12.248L 512,392.184
494
  C 512,400.968, 505.064,410.128, 496.592,412.496z M 192,389.432l 128,50.152l0-380.752 l-128-50.592L 192,389.432 z M 32,436.656l 128-47.288l0-380.88 L 32,60.624L 32,436.656 z
495
  M 480,11l-128,48.192L 352,439.104 l 128-55.192L 480,11 z" />
496
- <glyph unicode="&#xe034;" d="M 10.92,329.096l 237.544-129.36c 2.392-1.296, 5.016-1.952, 7.656-1.952c 2.608,0, 5.216,0.64, 7.592,1.92l 240.048,129.36
497
  c 5.232,2.816, 8.488,8.312, 8.408,14.264c-0.080,5.968-3.456,11.376-8.752,14.080L 265.856,478.048c-4.528,2.296-9.872,2.312-14.44,0.032
498
  L 11.392,357.44c-5.312-2.672-8.72-8.080-8.816-14.032S 5.704,331.936, 10.92,329.096z M 258.576,445.856L 461.656,342.72L 256.168,231.984
499
  L 53.080,342.576L 258.576,445.856z M 500.672,239.84l-47.488,24.112l-34.28-18.488l 40-20.312L 253.424,114.424L 50.328,225.016l 42.656,21.44L 58.8,265.080
@@ -502,7 +502,7 @@
502
  M 500.672,127.84l-44.984,22.112l-34.28-18.488l 37.504-18.312L 253.424,2.424L 50.328,113.016l 39.656,17.936l-34.184,18.624L 8.64,127.872
503
  c-5.312-2.672-8.72-8.080-8.816-14.032s 3.128-11.472, 8.344-14.312l 237.544-129.36c 2.392-1.296, 5.016-1.952, 7.656-1.952
504
  c 2.608,0, 5.216,0.64, 7.592,1.92l 240.048,129.36c 5.232,2.816, 8.488,8.312, 8.408,14.264C 509.344,119.736, 505.968,125.144, 500.672,127.84z" />
505
- <glyph unicode="&#xe035;" d="M 511.368,8.68l-41.704,251.888c-3.72,32.656-33.488,59.216-66.36,59.216l-35.328,0 l0,42.64 c0,65.080-46.424,118.016-111.488,118.016
506
  c-65.048,0-112.472-52.936-112.472-118.016l0-42.64 L 105.68,319.784 c-32.872,0-62.64-26.56-66.264-58.528l-38.64-252.080
507
  c-1.488-13.28, 1.112-23.752, 7.704-31.144c 6.216-6.952, 15.264-10.488, 26.872-10.488l 436.784,0 c 16.456,0, 25.888,6.608, 30.92,12.16
508
  C 507.664-15.192, 512.88-6.224, 511.368,8.68z M 176.024,362.432c0,47.424, 33.064,86.016, 80.472,86.016s 79.488-38.592, 79.488-86.016l0-42.64
@@ -510,7 +510,7 @@
510
  l 38.344,0 l0-36.464 C 134.488,245.784, 128,235.576, 128,223.752c0-17.672, 14.328-32, 32-32s 32,14.328, 32,32c0,11.808-6.464,22-15.976,27.544l0,36.496 l 159.952,0
511
  l0-36.496 C 326.472,245.752, 320,235.552, 320,223.752c0-17.672, 14.328-32, 32-32s 32,14.328, 32,32c0,11.824-6.488,22.032-16.024,27.576l0,36.464 l 35.328,0
512
  c 16.832,0, 32.656-14.128, 34.704-31.72l 41.672-251.64C 479.88,2.384, 478.272-0.224, 473.584-0.224z" />
513
- <glyph unicode="&#xe036;" d="M 464.752,272.792c0,84.392-44.488,160.936-118.984,204.784c-7.624,4.504-17.44,1.936-21.904-5.688
514
  c-4.472-7.608-1.936-17.424, 5.688-21.904c 64.624-38.016, 103.2-104.264, 103.2-177.184c0-121.184-87.968-209.144-209.16-209.144
515
  c-27.096,0-53.392,5.080-78.16,15.080c-8.184,3.328-17.528-0.64-20.832-8.832c-3.312-8.2, 0.64-17.528, 8.832-20.832
516
  c 28.608-11.56, 58.936-17.424, 90.16-17.424c 0.096,0, 0.192,0.008, 0.288,0.008l0-31.504 l-46.464,0 c-9.232,0-16.72-7.152-16.72-15.976
@@ -519,7 +519,7 @@
519
  c-97.344,0-176.232-79.376-176.232-176.704s 78.888-175.72, 176.232-175.72C 320.816,95.632, 399.688,174.024, 399.688,271.352z M 79.248,271.352
520
  c0,79.512, 64.704,144.704, 144.232,144.704c 79.512,0, 144.2-65.184, 144.2-144.704s-64.688-143.72-144.2-143.72
521
  C 143.952,127.632, 79.248,191.832, 79.248,271.352z" />
522
- <glyph unicode="&#xe037;" d="M 512.512,224c0,136.008-106.832,247.552-241.16,255.512c-2.768,0.304-5.544,0.504-8.36,0.504c-0.832,0-1.664-0.088-2.496-0.112
523
  C 259,479.928, 257.512,480.016, 256,480.016C 114.56,480.016-0.512,365.168-0.512,224c0-141.168, 115.072-256.016, 256.512-256.016
524
  c 1.512,0, 3,0.088, 4.504,0.12c 0.832-0.032, 1.664-0.12, 2.496-0.12c 2.816,0, 5.592,0.2, 8.36,0.504
525
  C 405.68-23.552, 512.512,87.976, 512.512,224z M 464.784,141.584c-8.816,2.56-30.96,8.12-70.032,12.696c 3.232,22.096, 5,45.448, 5,69.72
@@ -539,14 +539,14 @@
539
  c 11.632,2.472, 32.456,6.232, 63.296,9.464c 12.144-44.856, 31.896-82.808, 55.568-109.984C 128.848,31.664, 86.76,67.68, 60.544,113.824z
540
  M 345.328,18.408c 19.112,26.632, 34.24,62.512, 43.648,104.4c 31.704-3.64, 51.608-7.896, 61.648-10.432
541
  C 426.616,70.84, 389.696,37.68, 345.328,18.408z" />
542
- <glyph unicode="&#xe038;" d="M 112,424L 16,424 C 7.168,424,0,416.832,0,408l0-96 c0-8.832, 7.168-16, 16-16s 16,7.168, 16,16L 32,392 l 80,0
543
  c 8.832,0, 16,7.168, 16,16S 120.832,424, 112,424z M 496,152c-8.832,0-16-7.168-16-16l0-80 L 400,56 c-8.832,0-16-7.168-16-16s 7.168-16, 16-16l 96,0 c 8.832,0, 16,7.168, 16,16
544
  L 512,136 C 512,144.832, 504.832,152, 496,152z M 112,56L 32,56 L 32,136 c0,8.832-7.168,16-16,16s-16-7.168-16-16l0-96 c0-8.832, 7.168-16, 16-16l 96,0 c 8.832,0, 16,7.168, 16,16
545
  S 120.832,56, 112,56z M 496,424L 400,424 c-8.832,0-16-7.168-16-16s 7.168-16, 16-16l 80,0 l0-80 c0-8.832, 7.168-16, 16-16s 16,7.168, 16,16L 512,408 C 512,416.832, 504.832,424, 496,424z" />
546
- <glyph unicode="&#xe039;" d="M 480.080,376l-240,0 l-48,48l-160,0 c-17.672,0-32-14.328-32-32l0-80 l-0.152,0 l0-32 l 0.152,0 l0-224
547
  c0-17.672, 14.328-32, 32-32l 448,0 c 17.672,0, 32,14.328, 32,32L 512.080,344 C 512.080,361.672, 497.752,376, 480.080,376z M 32.072,392l 145.376,0 l 39.312-38.624L 226.816,344L 480.080,344
548
  l0-32 l-448,0 L 32.080,392 z M 32.072,56L 32.072,280 l 448,0 l0-224 L 32.072,56 z" />
549
- <glyph unicode="&#xe03a;" d="M 400,343.856l 32,0 c 8.832,0, 16,7.168, 16,16l0,16 c0,8.832-7.168,16-16,16l-32,0 c-8.832,0-16-7.168-16-16l0-16 C 384,351.024, 391.168,343.856, 400,343.856z
550
  M 400,247.856l 32,0 c 8.832,0, 16,7.168, 16,16l0,16 c0,8.832-7.168,16-16,16l-32,0 c-8.832,0-16-7.168-16-16l0-16 C 384,255.024, 391.168,247.856, 400,247.856z
551
  M 400,151.856l 32,0 c 8.832,0, 16,7.168, 16,16l0,16 c0,8.832-7.168,16-16,16l-32,0 c-8.832,0-16-7.168-16-16l0-16 C 384,159.024, 391.168,151.856, 400,151.856z
552
  M 400,55.856l 32,0 c 8.832,0, 16,7.168, 16,16l0,16 c0,8.832-7.168,16-16,16l-32,0 c-8.832,0-16-7.168-16-16l0-16 C 384,63.024, 391.168,55.856, 400,55.856z
@@ -556,14 +556,14 @@
556
  M 80,55.856l 32,0 c 8.832,0, 16,7.168, 16,16l0,16 c0,8.832-7.168,16-16,16l-32,0 c-8.832,0-16-7.168-16-16l0-16 C 64,63.024, 71.168,55.856, 80,55.856z M 480,472.048
557
  L 32,472.048 c-17.592,0-32-14.408-32-32l0-432.096 c0-17.592, 14.408-32, 32-32l 448,0 c 17.592,0, 32,14.408, 32,32L 512,440.048 C 512,457.64, 497.592,472.048, 480,472.048z M 480,7.952L 32,7.952
558
  L 32,440.048 l 448,0 L 480,7.952 z" />
559
- <glyph unicode="&#xe03b;" d="M 50.936,314.872c-9.064,0-16.384-7.328-16.384-16.384c0-9.048, 7.32-16.384, 16.384-16.384c 151.504,0, 262.672-112.184, 262.672-263.68
560
  c0-9.048, 7.328-16.376, 16.384-16.376s 16.384,7.328, 16.384,16.376C 346.376,188.608, 221.112,314.872, 50.936,314.872z M 51.080,478.688
561
  c-9.056,0-16.384-7.328-16.384-16.384c0-9.056, 7.328-16.384, 16.384-16.384c 235.088,0, 426.336-191.248, 426.336-426.328
562
  c0-9.048, 7.328-16.376, 16.384-16.376s 16.384,7.328, 16.384,16.376C 510.176,272.736, 304.224,478.688, 51.080,478.688z M 92.008,150.2
563
  c-49.736,0-90.184-40.56-90.184-90.44c0-49.856, 40.456-90.456, 90.184-90.456s 90.2,40.592, 90.2,90.456
564
  C 182.208,109.64, 141.744,150.2, 92.008,150.2z M 92.008,0.984c-32.304,0-58.584,26.376-58.584,58.784s 26.28,58.768, 58.584,58.768
565
  c 32.312,0, 58.608-26.36, 58.608-58.768S 124.32,0.984, 92.008,0.984z" />
566
- <glyph unicode="&#xe03c;" d="M 511.92,193.728c 0.048,10.528-1.608,50.248-2.872,61.608
567
  C 494.488,385.712, 388.672,480.336, 257.456,480.336c-136.672,0-247.408-105.312-254.92-244.952c-0.16-3.048-1.28-24.672-1.36-37.544l-0.040-7.16
568
  c-0.656-2.96-1.056-6.016-1.056-9.168l0-107.328 c0-23.44, 19.064-42.504, 42.504-42.504l 43.144,0 c 23.44,0, 42.512,19.064, 42.512,42.504L 128.24,181.504
569
  c0,23.44-19.080,42.504-42.512,42.504L 42.576,224.008 c-2.944,0-5.816-0.304-8.592-0.872c 0.24,5.192, 0.456,9.288, 0.512,10.528
@@ -575,7 +575,7 @@
575
  c0-5.8-4.72-10.504-10.512-10.504L 42.576,63.672 c-5.8,0-10.504,4.704-10.504,10.504L 32.072,181.504 C 32.080,187.304, 36.784,192.008, 42.576,192.008z
576
  M 416.264,181.504c0,5.8, 4.704,10.504, 10.504,10.504l 42.64,0 c 5.8,0, 10.512-4.704, 10.512-10.504l0-106.832 c0-5.8-4.72-10.504-10.512-10.504
577
  l-42.64,0 c-5.8,0-10.504,4.704-10.504,10.504L 416.264,181.504 z" />
578
- <glyph unicode="&#xe03d;" d="M 511.92,177.72c 0.048,10.528-1.608,50.248-2.872,61.608C 494.488,369.704, 388.672,464.328, 257.456,464.328
579
  c-136.672,0-247.408-105.312-254.92-244.952c-0.16-3.048-1.28-24.672-1.36-37.544l-0.040-7.16c-0.656-2.96-1.056-6.016-1.056-9.168
580
  l0-139.328 c0-23.44, 19.064-42.504, 42.504-42.504l 43.144,0 c 23.44,0, 42.512,19.064, 42.512,42.504L 128.24,165.496 c0,23.44-19.080,42.504-42.512,42.504L 42.568,208
581
  c-2.944,0-5.816-0.304-8.592-0.872c 0.24,5.192, 0.456,9.296, 0.512,10.528C 41.080,340.048, 138.056,432.328, 257.456,432.328
@@ -585,36 +585,36 @@
585
  l0-139.328 c0-5.808-4.72-10.504-10.512-10.504L 42.568,15.664 c-5.8,0-10.504,4.704-10.504,10.504L 32.064,165.496 C 32.080,171.296, 36.784,176, 42.568,176z
586
  M 479.92,26.672c0-5.8-4.72-10.504-10.512-10.504l-42.64,0 c-5.8,0-10.504,4.704-10.504,10.504L 416.264,165.496 c0,5.8, 4.704,10.504, 10.504,10.504
587
  l 42.64,0 c 5.8,0, 10.512-4.704, 10.512-10.504L 479.92,26.672 z" />
588
- <glyph unicode="&#xe03e;" d="M 255.2-31.352c-96.656,0-175.296,77.56-175.296,172.888c0,111.344, 155.816,322.424, 162.456,331.36
589
  c 3,4.032, 7.704,6.424, 12.736,6.456c 5.592,0.048, 9.784-2.296, 12.832-6.28c 6.704-8.768, 164.168-216.112, 164.168-331.528
590
  C 432.096,46.208, 352.736-31.352, 255.2-31.352z M 255.376,436.152c-37.2-52.832-143.472-211.032-143.472-294.608
591
  c0-77.688, 64.28-140.888, 143.296-140.888c 79.888,0, 144.888,63.2, 144.888,140.888C 400.096,228.224, 293.016,384.056, 255.376,436.152z" />
592
- <glyph unicode="&#xe03f;" d="M 511.488,225.008L 452.736,428.552c-1.92,6.936-8.232,11.736-15.424,11.736L 69.64,440.288 c-7.248,0-13.592-4.872-15.472-11.888L 0.472,235.224
593
  c-0.992-3.752-0.504-7.504, 1-10.768C 0.608,221.56,0,218.544,0,215.368l0-175.656 c0-17.672, 14.328-32, 32-32l 448,0 c 17.672,0, 32,14.328, 32,32L 512,215.368
594
  c0,0.856-0.184,1.664-0.248,2.504C 512.168,220.168, 512.16,222.592, 511.488,225.008z M 81.952,408.288l 343.184,0 l 46.56-160.92L 322.528,247.368
595
  c-0.72-38.408-27.952-64.84-66.528-64.84s-65.312,26.44-66.032,64.84L 37.080,247.368 L 81.952,408.288z M 480,39.712L 32,39.712 L 32,215.368 l 131.56,0
596
  c 13.968-40.216, 47.888-64.84, 92.44-64.84s 78.968,24.624, 92.936,64.84L 480,215.368 L 480,39.712 z" />
597
- <glyph unicode="&#xe040;" d="M 384,480L 208,480 c-17.672,0-32-14.328-32-32l 176,0 l0-128 l 128,0 l0-256 L 368,64 l0-32 l 112,0 c 17.672,0, 32,14.328, 32,32L 512,351.992 L 384,480z M 384,352L 384,434.752 L 466.736,352L 384,352 z M 32,416
598
  c-17.672,0-32-14.328-32-32l0-384 c0-17.672, 14.328-32, 32-32l 272,0 c 17.672,0, 32,14.328, 32,32L 336,287.992 L 208,416L 32,416 z M 304,0L 32,0 L 32,384 l 144,0 l0-128 l 128,0 L 304,0 z M 208,288L 208,370.752
599
  L 290.736,288L 208,288 z" />
600
- <glyph unicode="&#xe041;" d="M 508.528,386.968L 458.68,442.64c-3.032,3.424-7.392,5.376-11.968,5.376L 271.584,448.016 L 271.584,465 c0,8.28-7.168,15-16,15
601
  c-8.832,0-16-6.72-16-15l0-16.984 L 111.68,448.016 c-8.84,0-16-7.16-16-16l0-111.832 c0-8.84, 7.16-16, 16-16l 127.904,0 l0-32.048 L 65.288,272.136
602
  c-4.576,0-8.936-1.952-11.968-5.376l-49.84-56.656c-5.376-6.064-5.376-15.184,0-21.248l 49.84-56.144c 3.056-3.424, 7.392-4.872, 11.968-4.872
603
  l 174.296,0 l0-144.84 c0-8.28, 7.168-15, 16-15c 8.832,0, 16,6.72, 16,15L 271.584,127.84 l 128.232,0 c 8.84,0, 16,7.16, 16,16L 415.816,256.144 c0,8.84-7.16,16-16,16
604
  L 271.584,272.144 l0,32.048 l 175.128,0 c 4.576,0, 8.936,1.952, 11.968,5.376l 49.848,56.16C 513.896,371.784, 513.896,380.904, 508.528,386.968z M 383.824,159.84
605
  L 72.48,159.84 l-35.64,39.64l 35.64,40.656l 311.344,0 L 383.824,159.84 z M 439.52,336.184L 127.68,336.184 L 127.68,416.016 l 311.84,0 l 35.64-39.672L 439.52,336.184z" />
606
- <glyph unicode="&#xe042;" d="M 483.456,330.92l-89.56,96C 390.856,430.16, 386.624,432, 382.184,432L 248.624,432 l-0.504,33c0,8.28-7.168,15-16,15
607
  c-8.832,0-15-6.72-15-15L 216.632,432L 40.248,432 c-8.84,0-16-7.16-16-16l0-192 c0-8.84, 7.16-16, 16-16l 176.168,0 l0-225
608
  c0-8.28, 7.168-15, 16-15c 8.832,0, 16,6.72, 16,15L 248.416,208 l 133.768,0 c 4.44,0, 8.672,1.84, 11.704,5.080l 89.56,96
609
  C 489.184,315.232, 489.184,324.768, 483.456,330.92z M 375.232,240L 56.248,240 L 56.248,400 l 318.984,0 l 74.64-80L 375.232,240z" />
610
- <glyph unicode="&#xe043;" d="M 509.36,332.264L 439.424,465.984C 435.344,473.784, 424.792,480.16, 416,480.16L 255.032,480.16 c-0.176,0.008-0.352,0.056-0.528,0.064
611
  c-0.144,0-0.28-0.056-0.424-0.064L 96,480.16 c-8.8,0-19.376-6.36-23.512-14.128L 2.736,334.888c-4.144-7.768-3.312-19.968, 1.816-27.128
612
  L 244.56-26.816c 2.576-3.592, 6-5.408, 9.416-5.408c 3.392,0, 6.792,1.768, 9.384,5.296L 507.312,305.2
613
  C 512.504,312.296, 513.44,324.472, 509.36,332.264z M 471.184,336.184L 385.456,336.184 l 34.328,98.304L 471.184,336.184z M 287.672,448.16l 102.984,0 l-31.944-91.464
614
  L 287.672,448.16z M 334.12,336.184L 185.296,336.184 l 70.336,101.048L 334.12,336.184z M 156.944,351.456L 124.856,448.16l 99.408,0 L 156.944,351.456z
615
  M 340.376,304.184L 254.36,57.912L 172.632,304.184L 340.376,304.184 z M 218.464,64.456L 46.496,304.184l 92.416,0 L 218.464,64.456z M 374.272,304.184l 92.584,0
616
  L 290.368,63.904L 374.272,304.184z M 94.24,438.792l 34.048-102.608L 39.664,336.184 L 94.24,438.792z" />
617
- <glyph unicode="&#xe044;" d="M 416.28,272.104c-4.168,0-17.6,0.080-32.152,0.184l 0.056,31.984c0,17.672-14.328,32-32,32
618
  l-320.248,0.080c-17.672,0-32-14.328-32-32l0-240.472 c0-53.016, 42.984-96, 96-96l 192.328,0 c 53.016,0, 95.504,42.984, 95.504,96l 0.032,16.424
619
  c 14.512-0.112, 29.304-0.2, 32.488-0.2c 52.888,0, 95.784,42.52, 95.784,95.536C 512.064,228.664, 469.168,272.104, 416.28,272.104z
620
  M 351.768,63.88c0-35.296-28.2-64-63.504-64L 95.936-0.12 c-35.296,0-64,28.704-64,64L 31.888,304.352l 0.048,0 l 320.248-0.096L 351.768,63.88z
@@ -623,13 +623,13 @@
623
  s-16-7.168-16-16l0-80 C 271.936,375.28, 279.104,368.12, 287.936,368.12z M 95.936,368.12c 8.832,0, 16,7.168, 16,16l0,80 c0,8.832-7.168,16-16,16
624
  s-16-7.168-16-16l0-80 C 79.936,375.28, 87.104,368.12, 95.936,368.12z M 191.936,368.12c 8.832,0, 16,7.168, 16,16l0,80 c0,8.832-7.168,16-16,16
625
  s-16-7.168-16-16l0-80 C 175.936,375.28, 183.104,368.12, 191.936,368.12z" />
626
- <glyph unicode="&#xe045;" d="M 366.592,339.864l-156.576-67.32c-2.832-1.44-5.128-3.736-6.576-6.576L 131.712,121.36
627
  c-2.936-5.768-1.872-12.768, 2.656-17.392c 2.904-2.952, 6.816-4.512, 10.768-4.512c 2.216,0, 4.472,0.488, 6.56,1.504l 152.864,63.488
628
  c 2.8,1.344, 5.112,3.528, 6.608,6.248l 75.44,148.448c 3.216,5.8, 2.264,13.016-2.328,17.784C 379.672,341.696, 372.488,342.864, 366.592,339.864
629
  z M 178.928,147.592l 43.504,88.84l 43.936-54.992L 178.928,147.592z M 292.352,200.192l-44.4,55.576l 88.392,34.88L 292.352,200.192z M 256,480
630
  C 114.616,480,0,365.384,0,224c0-141.392, 114.616-256, 256-256c 141.392,0, 256,114.608, 256,256C 512,365.384, 397.392,480, 256,480z M 256-0.504
631
  C 132.488-0.504, 32,100.488, 32,224S 132.488,448, 256,448s 224-100.488, 224-224S 379.512-0.504, 256-0.504z" />
632
- <glyph unicode="&#xe046;" d="M 500.176,94.192c-7.832,5.504-93.528,62.488-104.032,68.904
633
  c-4.576,2.8-10.16,4.168-16.232,4.168c-7.832,0-16.504-2.28-24.968-6.736c-8.248-4.344-33.232-18.56-45.456-25.544
634
  c-10.768,7.56-36.064,26.936-75.92,66.832c-39.608,39.592-59.16,65.096-66.768,75.92c 6.968,12.216, 21.168,37.2, 25.488,45.424
635
  c 8.184,15.504, 9.112,30.984, 2.472,41.424c-6.232,9.84-62.984,95.904-68.84,104c-5.512,7.64-15.408,11.768-26.144,11.768
@@ -646,7 +646,7 @@
646
  l-5.848-0.136c-0.112,0-0.2-0.048-0.328-0.064L 379.384,480.112c-6.464-0.144-11.808-5.488-11.96-11.96l-0.016-8.208
647
  c 0.984-7.616, 6.968-12.080, 13.44-11.936l 75.624-0.2L 319.328,311.496c-6.248-6.248-6.248-16.384,0-22.632
648
  C 325.576,282.624, 335.704,282.624, 341.952,288.864z" />
649
- <glyph unicode="&#xe047;" d="M 500.176,94.192c-7.832,5.504-93.528,62.488-104.032,68.904
650
  c-4.576,2.8-10.16,4.168-16.232,4.168c-7.832,0-16.504-2.28-24.968-6.736c-8.248-4.344-33.232-18.56-45.456-25.544
651
  c-10.768,7.56-36.064,26.936-75.92,66.832c-39.608,39.592-59.16,65.096-66.768,75.92c 6.968,12.216, 21.168,37.2, 25.488,45.424
652
  c 8.184,15.504, 9.112,30.984, 2.472,41.424c-6.232,9.84-62.984,95.904-68.84,104c-5.512,7.64-15.408,11.768-26.144,11.768
@@ -663,7 +663,7 @@
663
  c 6.248,6.248, 6.248,16.384,0,22.632c-6.248,6.24-16.376,6.24-22.624,0L 350.84,342.744L 351.28,420.16c 0.144,6.464-4.984,12.096-11.448,11.944
664
  l-8.208-0.008c-6.48-0.16-11.832-4.008-11.968-10.472l-0.328-115.504c0-0.112, 0.44-0.192, 0.44-0.304l-0.64-5.856
665
  C 319.064,296.712, 319.824,293.824, 321.92,291.744z" />
666
- <glyph unicode="&#xe048;" d="M 480.848,380.224c0-0.528-0.048-0.968-0.112-1.312c-13.080-9-86.216-57.312-99.888-66.080c-1.44-0.032-5.096,0.456-10.312,3.2
667
  c-5.56,2.92-21.768,12.016-44.44,24.952l-17.64,10.064l-16.624-11.672c-12.36-8.704-39.232-29.408-80.144-70.312
668
  c-41.088-41.080-61.728-67.856-70.384-80.168l-11.672-16.624l 10.080-17.64c 9.768-17.096, 21.472-37.752, 25-44.472
669
  c 2.84-5.392, 3.064-9.080, 3.064-10.080c0-0.16,0-0.296-0.016-0.408c-7.68-12.248-57.296-86.968-66.336-100.16
@@ -675,7 +675,7 @@
675
  c-4.344,8.248-18.56,33.232-25.544,45.456c 7.56,10.768, 26.936,36.064, 66.832,75.92c 39.592,39.608, 65.096,59.16, 75.92,66.768
676
  c 12.216-6.968, 37.2-21.168, 45.424-25.488c 15.504-8.184, 30.984-9.112, 41.424-2.472c 9.84,6.232, 94.904,62.984, 103,68.84
677
  C 507.728,359.6, 511.848,369.496, 511.848,380.224L 511.848,380.224z" />
678
- <glyph unicode="&#xe049;" d="M 480,480.048L 32,480.048 c-17.592,0-32-14.408-32-32l0-448.096 c0-17.592, 14.408-32, 32-32l 448,0
679
  c 17.592,0, 32,14.408, 32,32L 512,448.048 C 512,465.64, 497.592,480.048, 480,480.048z M 480-0.048L 32-0.048 L 32,448.048 l 448,0 L 480-0.048 z M 112,303.848l 32,0 l0-32 c0-8.832, 7.168-16, 16-16
680
  s 16,7.168, 16,16l0,32 l 32,0 c 8.832,0, 16,7.168, 16,16s-7.168,16-16,16l-32,0 l0,32 c0,8.832-7.168,16-16,16s-16-7.168-16-16l0-32 l-32,0 c-8.832,0-16-7.168-16-16
681
  S 103.168,303.848, 112,303.848z M 216.568,184.424c-6.248,6.248-16.376,6.248-22.624,0L 160,150.488l-33.944,33.936
@@ -684,7 +684,7 @@
684
  l-33.936,33.936l 33.936,33.936C 222.816,168.040, 222.816,178.168, 216.568,184.424z M 304,303.848l 96,0 c 8.832,0, 16,7.168, 16,16s-7.168,16-16,16L 304,335.848
685
  c-8.832,0-16-7.168-16-16S 295.168,303.848, 304,303.848z M 304,143.848l 96,0 c 8.832,0, 16,7.168, 16,16s-7.168,16-16,16L 304,175.848 c-8.832,0-16-7.168-16-16
686
  S 295.168,143.848, 304,143.848z M 304,79.848l 96,0 c 8.832,0, 16,7.168, 16,16s-7.168,16-16,16L 304,111.848 c-8.832,0-16-7.168-16-16S 295.168,79.848, 304,79.848z" />
687
- <glyph unicode="&#xe04a;" d="M 212.408,140.328c 115.472,0, 204.952,65.952, 203.576,163.816c0,86.592-91.608,155.816-207.080,155.816
688
  c-115.488,0-209.080-69.224-209.080-155.816c0-53.936, 26.456-111.44, 81.704-139.688c0-0.328-0.096-0.576-0.096-0.936
689
  c0-23.44-19.512-55.576-27.2-68.832l 0.032,0 c-0.608-1.44-0.976-3-0.976-4.672c0-6.56, 5.288-11.832, 11.848-11.832
690
  c 0.968,0, 2.544,0.2, 3.112,0.2c 0.16,0, 0.216,0, 0.2-0.048c 40.832,6.672, 101.128,52.624, 110.064,63.512
@@ -699,12 +699,12 @@
699
  c 7.744-9.392, 51.112-50.752, 86.408-56.504c-0.016,0.032, 0.032,0.032, 0.184,0.032c 0.472,0, 1.84-0.168, 2.672-0.168
700
  c 5.672,0, 10.248,4.56, 10.248,10.232c0,1.44-0.328,2.8-0.84,4.032l 0.032,0 c-6.64,11.44-17.064,44.872-17.064,65.128
701
  c0,0.312-0.096,0.528-0.096,0.816C 490.048,92.672, 512.168,128.296, 512.168,174.904z" />
702
- <glyph unicode="&#xe04b;" d="M 480.008,384.264L 352.208,384.264 L 352.208,415.264 c0,26.472-21.528,48-48,48L 207.992,463.264 c-26.472,0-48-21.528-48-48l0-31 L 32.008,384.264 c-17.592,0-32-14.408-32-32l0-112.128
703
  l-0.016,0 l0-32 l 0.016,0 l0-191.408 c0-17.592, 14.408-32, 32-32l 448,0 c 17.592,0, 32,14.408, 32,32L 512.008,352.264 C 512.008,369.856, 497.6,384.264, 480.008,384.264z
704
  M 191.992,415.264c0,8.832, 7.168,16, 16,16l 96.216,0 c 8.832,0, 16-7.168, 16-16l0-31 L 191.992,384.264 L 191.992,415.264 z M 32.008,352.264l 448,0 l0-112.128 L 303.824,240.136 l0,16.376
705
  c0,17.64-14.36,32-32,32l-31.872,0 c-17.64,0-32-14.36-32-32l0-16.376 L 32.008,240.136 L 32.008,352.264 z M 271.848,175.936l-31.904,0 L 239.944,256.512 l 31.872,0 L 271.848,175.936z
706
  M 32.008,16.736L 32.008,208.144 l 175.936,0 l0-32.2 c0-17.64, 14.36-32, 32-32l 31.872,0 c 17.64,0, 32,14.36, 32,32l0,32.2 l 176.184,0 l0-191.408 L 32.008,16.736 z" />
707
- <glyph unicode="&#xe04c;" d="M 476.040,479.224L 264.52,421.928c-5.376-1.44-17.048-1.424-22.408,0.080L 36.040,479.112
708
  C 17.648,484.176-0.168,470.912-0.168,451.976l0-389.056 c0-16.048, 12.168-31.392, 27.656-35.704l 206.080-57.112c 5.512-1.528, 12.608-2.376, 19.968-2.376
709
  c 5.048,0, 12.504,0.392, 19.36,2.264l 211.512,57.296c 15.528,4.2, 27.752,19.512, 27.752,35.624L 512.16,451.976 C 512.168,470.896, 494.352,484.208, 476.040,479.224
710
  z M 240,1.528L 35.536,58.056c-1.544,0.424-3.704,3.248-3.704,4.856L 31.832,446.928 l 201.736-55.768c 1.952-0.544, 4.144-0.968, 6.432-1.328L 240,1.528 z
@@ -721,31 +721,31 @@
721
  c 6.984,0, 13.408,4.608, 15.392,11.672C 210.784,221.016, 205.832,229.848, 197.312,232.256z M 197.312,136.256l-111.968,31.512
722
  c-8.456,2.36-17.344-2.576-19.736-11.080s 2.56-17.328, 11.080-19.736l 111.968-31.512c 1.44-0.408, 2.904-0.592, 4.344-0.592
723
  c 6.984,0, 13.408,4.608, 15.392,11.672C 210.784,125.024, 205.832,133.848, 197.312,136.256z" />
724
- <glyph unicode="&#xe04d;" d="M 507.832,338c-2.984,4.232-7.832,6.752-13,6.752L 444.96,344.752 L 342.392,432.168c-12.488,12.488-32.76,12.504-45.248,0L 196.32,344.752
725
  l-41.048,0 l-25.704,88.64c-10.080,34.904-34.032,38.672-43.856,38.672L 17.168,472.064 c-8.784,0-15.888-7.112-15.888-15.888s 7.112-15.888, 15.888-15.888l 68.528,0
726
  c 2.168,0, 8.784,0, 13.296-15.592l 88.424-324.968c 1.92-6.856, 8.168-11.592, 15.296-11.592l 215.984,0 c 6.704,0, 12.688,4.2, 14.952,10.512
727
  l 76.128,224.84C 511.528,328.36, 510.8,333.784, 507.832,338z M 319.768,409.536l 76.016-64.792L 243.728,344.744 L 319.768,409.536z M 407.512,119.904L 214.768,119.904
728
  l-50.576,193.064l 308.048,0 L 407.512,119.904z M 376,55.936c-22.096,0-40-17.904-40-40s 17.904-40, 40-40s 40,17.904, 40,40S 398.096,55.936, 376,55.936z
729
  M 232,55.936c-22.096,0-40-17.904-40-40s 17.904-40, 40-40s 40,17.904, 40,40S 254.096,55.936, 232,55.936z" />
730
- <glyph unicode="&#xe04e;" d="M 507.832,338c-2.984,4.232-7.832,6.752-13,6.752L 155.264,344.752 l-25.704,88.64
731
  c-10.080,34.904-34.032,38.672-43.856,38.672L 17.168,472.064 c-8.784,0-15.888-7.112-15.888-15.888s 7.112-15.888, 15.888-15.888l 68.528,0
732
  c 2.168,0, 8.784,0, 13.296-15.592l 88.424-324.968c 1.92-6.856, 8.168-11.592, 15.296-11.592l 215.984,0 c 6.704,0, 12.688,4.2, 14.952,10.512
733
  l 76.128,224.84C 511.528,328.36, 510.8,333.784, 507.832,338z M 407.512,119.904L 214.768,119.904 l-50.576,193.064l 308.048,0 L 407.512,119.904z M 376,55.936
734
  c-22.096,0-40-17.904-40-40s 17.904-40, 40-40s 40,17.904, 40,40S 398.096,55.936, 376,55.936z M 232,55.936c-22.096,0-40-17.904-40-40s 17.904-40, 40-40
735
  s 40,17.904, 40,40S 254.096,55.936, 232,55.936z" />
736
- <glyph unicode="&#xe04f;" d="M 432,400.648L 336.408,400.648 L 336.408,431.336 c0,26.472-21.528,48-48,48l-63.816,0 c-26.472,0-48-21.528-48-48l0-30.688 L 80,400.648 c-17.672,0-32-14.328-32-32l0-367.984
737
  c0-17.672, 14.328-32, 32-32l 352,0 c 17.672,0, 32,14.328, 32,32L 464,368.648 C 464,386.32, 449.672,400.648, 432,400.648z M 208.592,431.336c0,8.832, 7.168,16, 16,16l 63.816,0
738
  c 8.832,0, 16-7.168, 16-16l0-30.688 L 208.592,400.648 L 208.592,431.336 z M 432,0.664L 80,0.664 L 80,368.648 l 96.592,0 l0-32.92 c0,0-0.424-15.984, 15.904-15.984
739
  c 18,0, 16.096,15.984, 16.096,15.984l0,32.92 l 95.816,0 l0-32.92 c0,0-1.064-16.064, 15.936-16.064c 16,0, 16.064,16.064, 16.064,16.064l0,32.92 L 432,368.648 L 432,0.664 z
740
  " />
741
- <glyph unicode="&#xe050;" d="M 495.032,8.832c-0.168,0-0.36,0-0.544,0.016c-8.096,0.264-13.2,6.544-13.888,14.608c-0.544,5.936-16.984,149.544-241.128,149.392
742
  l0-91.832 c0-6.184-3.56-11.832-9.168-14.472c-5.544-2.656-12.216-1.84-16.984,2.112L 5.832,240.544c-3.72,3.048-5.856,7.592-5.84,12.392
743
  s 2.168,9.344, 5.888,12.376L 213.36,435.592c 4.784,3.904, 11.392,4.656, 16.968,2.048c 5.576-2.656, 9.144-8.28, 9.144-14.456l0-89.816
744
  c 92.984-2.952, 165.496-32.856, 212.168-87.488c 75.968-88.888, 59.016-218.080, 58.216-223.456C 508.672,14.592, 502.92,8.832, 495.032,8.832z
745
  M 223.472,205.096c 0.016,0, 0.032,0, 0.032,0c 160.112-0.096, 221.296-54.16, 256.232-101.904c-5.112,38.248-20.032,84.36-52.504,122.016
746
  c-43.168,50.048-112.72,76.424-203.768,76.424c-8.84,0-16,7.16-16,16l0,71.888 L 41.248,252.84l 166.216-137.952l0,74.2
747
  c0,4.248, 1.688,8.328, 4.704,11.328C 215.168,203.408, 219.232,205.096, 223.472,205.096z" />
748
- <glyph unicode="&#xe051;" d="M 16.968,8.832c 0.168,0, 0.36,0, 0.544,0.016c 8.096,0.264, 13.2,6.544, 13.888,14.608c 0.544,5.936, 16.488,149.544, 240.624,149.392
749
  l 0.504-91.832c0-6.184, 3.56-11.832, 9.168-14.472c 5.544-2.656, 12.216-1.84, 16.984,2.112l 207.488,171.888
750
  c 3.72,3.048, 5.856,7.592, 5.84,12.392s-2.168,9.344-5.888,12.376L 298.64,435.592c-4.784,3.904-11.392,4.656-16.968,2.048
751
  c-5.576-2.656-9.144-8.28-9.144-14.456l-0.504-89.816C 179.048,330.424, 107.040,300.512, 60.36,245.888
@@ -753,7 +753,7 @@
753
  C 128.392,205, 67.2,150.936, 32.264,103.184c 5.112,38.248, 20.032,84.36, 52.504,122.016c 43.168,50.048, 112.72,76.424, 203.768,76.424
754
  c 8.84,0, 16,7.16, 16,16l0,71.888 l 166.216-136.672L 304.528,114.888l0,74.2 c0,4.248-1.688,8.328-4.704,11.328
755
  C 296.832,203.408, 292.768,205.096, 288.528,205.096z" />
756
- <glyph unicode="&#xe052;" d="M 503.184,372.032c-5.392,2.488-11.792,1.544-16.28-2.424l-80.656-72.448l-72.816,74.704l 72.096,83.264
757
  c 3.92,4.528, 4.872,10.768, 2.432,16.256s-7.832,8.848-13.76,8.848l-4.344,0 c-44.56,0-121.488-3.832-155.832-38.672l-6.928-6.88
758
  c-36.64-37.384-43.144-98.688-23.84-145.288L 18.616,100.944c-24.896-25.24-24.896-66.16,0-91.408l 22.536-22.848
759
  C 53.6-25.928, 69.92-32.24, 86.24-32.24c 16.312,0, 32.632,6.312, 45.072,18.928l 187.36,188.864c 17.72-9.576, 42-15.832, 62.392-15.832
@@ -764,24 +764,24 @@
764
  c-7.712,31.192-3.216,74.304, 21.008,99.024l 6.896,6.96c 20.776,21.080, 74.728,27.312, 104.6,29.152l-58.68-67.768
765
  c-5.248-6.064-4.984-15.2, 0.608-20.936L 394.72,265.28c 5.624-5.792, 14.72-6.128, 20.776-0.76l 65.304,58.816
766
  C 478.856,291.656, 472.704,245.648, 452.832,225.496z" />
767
- <glyph unicode="&#xe053;" d="M 512.16,225.208c0-8.832-7.144-15.992-15.984-15.992L 271.736,209.216 L 271.736,47.12
768
  c0-43.576-35.456-79.040-79.048-79.040c-43.592,0-79.056,35.464-79.056,79.040c0,8.832, 7.16,15.992, 15.992,15.992s 15.992-7.16, 15.992-15.992
769
  c0-25.952, 21.112-47.064, 47.080-47.064c 25.96,0, 47.080,21.112, 47.080,47.064L 239.776,209.216 L 15.832,209.216 c-8.832,0-15.992,7.168-15.992,15.992
770
  c0,123.648, 90.456,202.056, 239.928,207.24L 239.768,463.936 c0,8.832, 7.16,15.984, 15.992,15.984c 8.84,0, 15.984-7.16, 15.984-15.984l0-31.488
771
  C 421.248,427.272, 512.16,348.856, 512.16,225.208z M 479.576,241.192C 471.688,341.456, 390.128,400.752, 255.752,400.752
772
  c-134.376,0-215.448-59.296-223.328-159.552L 479.576,241.2 z" />
773
- <glyph unicode="&#xe054;" d="M 448.4,400.488L 335.76,400.488 L 335.76,444.12 c0,20.264-16.504,36.248-36.768,36.248L 213,480.368 c-20.264,0-36.76-15.984-36.76-36.248l0-43.632 L 63.6,400.488
774
  c-8.832,0-16-7.168-16-16s 7.168-16, 16-16l 22.008,0 l 37.12-369.96c 1.552-17.312, 16.304-30.888, 33.568-30.888l 199.4,0 c 17.264,0, 32,13.576, 33.544,30.736
775
  l 37.152,370.12l 22.008,0 c 8.84,0, 16,7.168, 16,16S 457.24,400.488, 448.4,400.488z M 208.24,444.12c0,2.616, 2.136,4.752, 4.76,4.752l 85.992,0
776
  c 2.624,0, 4.768-2.136, 4.768-4.752l0-43.632 L 208.24,400.488 L 208.24,444.12 z M 357.384,1.4c-0.080-0.888-1.128-1.768-1.688-1.768L 156.296-0.368
777
  c-0.56,0-1.616,0.872-1.712,1.92l-36.816,366.928l 276.456,0 L 357.384,1.4z" />
778
- <glyph unicode="&#xe055;" d="M 511.992,271.864L 511.992,441.048 C 511.992,462.52, 494.52,480, 473.056,480L 307.464,479.976L 300.368,480
779
  c-10.84,0-27.248,0-37.96-10.72L 9.44,216.304C 3.36,210.224,0,202.152,0,193.56c0-8.608, 3.344-16.688, 9.424-22.768l 193.4-193.36
780
  C 208.88-28.656, 216.96-32, 225.552-32s 16.68,3.344, 22.744,9.424l 252.976,252.984C 512.12,241.232, 512.056,256.816, 511.992,271.864z
781
  M 478.648,253.032L 225.44,0.064L 32.064,193.672L 284.76,446.424C 287.304,448, 296.464,448, 300.256,448l 7.2-0.024L 473.056,448
782
  c 3.832,0, 6.936-3.12, 6.936-6.952l0-169.312 C 480.024,265.648, 480.056,255.464, 478.648,253.032z M 384.008,416c-35.344,0-64-28.656-64-64s 28.656-64, 64-64
783
  s 64,28.656, 64,64S 419.352,416, 384.008,416z M 384.008,320c-17.672,0-32,14.328-32,32s 14.328,32, 32,32s 32-14.328, 32-32S 401.68,320, 384.008,320z" />
784
- <glyph unicode="&#xe056;" d="M 256,480C 114.616,480,0,365.384,0,224s 114.616-256, 256-256s 256,114.616, 256,256S 397.384,480, 256,480z
785
  M 320,438.512c 72.112-21.496, 128.824-78.4, 150.352-150.512L 366.568,288 c-11.208,19.264-27.296,35.336-46.568,46.528L 320,438.512 z M 351.816,223.896
786
  c0-52.968-42.896-95.904-95.816-95.904s-95.816,42.936-95.816,95.904S 203.088,319.808, 256,319.808S 351.816,276.864, 351.816,223.896z
787
  M 224,445.536c 10.456,1.496, 21.128,2.312, 32,2.312c 10.864,0, 21.544-0.816, 32-2.312l0-97.904 c-10.24,2.648-20.928,4.2-32,4.2
@@ -792,7 +792,7 @@
792
  C 234.248,97.552, 244.928,96, 256,96s 21.76,1.552, 32,4.2L 288,2.312 z M 320,9.336L 320,113.304 c 19.328,11.224, 35.448,27.368, 46.656,46.696l 103.736,0
793
  C 448.896,87.832, 392.16,30.84, 320,9.336z M 379.752,192c 2.624,10.2, 4.080,20.88, 4.080,31.912c0,11.096-1.464,21.832-4.128,32.088l 97.704,0
794
  c 1.504-10.496, 2.44-21.168, 2.44-32.080c0-10.848-0.92-21.488-2.416-31.92L 379.752,192 z" />
795
- <glyph unicode="&#xe057;" d="M 342.952,288.408L 480.584,425.192l-0.448-77.536c-0.144-6.464, 4.984-12.088, 11.456-11.944
796
  l 8.208,0.008c 6.472,0.152, 11.824,4, 11.96,10.464l 0.336,115.504c0,0.112-0.44,0.2-0.44,0.312l 0.632,5.856
797
  c 0.064,3.248-0.696,6.144-2.792,8.216c-2.072,2.088-4.976,3.36-8.2,3.272l-5.848-0.136c-0.112,0-0.2-0.040-0.32-0.056
798
  L 380.384,479.656c-6.464-0.144-11.816-5.488-11.96-11.96l-0.016-8.208c 0.984-7.624, 6.976-12.080, 13.44-11.936l 75.624-0.2L 320.328,311.040
@@ -810,7 +810,7 @@
810
  C 7.472,479.432, 4.552,478.16, 2.496,476.072C 0.392,474-0.368,471.104-0.296,467.856L 0.336,462c0-0.112-0.44-0.192-0.44-0.312
811
  l 0.336-115.504c 0.144-6.464, 5.488-10.312, 11.96-10.464l 8.712-0.008c 6.464-0.144, 11.592,5.48, 11.448,11.944L 31.912,424.768l 137.632-136.36
812
  c 6.24-6.248, 16.376-6.248, 22.624,0c 6.248,6.248, 6.248,16.384,0,22.632L 55.024,447.336z" />
813
- <glyph unicode="&#xe058;" d="M 191.6,306.6L 191.264,422.104c-0.144,6.464-5.496,10.312-11.96,10.464l-8.208,0.008
814
  c-6.472,0.144-11.592-5.488-11.456-11.944l 0.448-77.624L 26.952,474.872c-6.248,6.248-16.376,6.248-22.624,0s-6.248-16.376,0-22.624
815
  l 132.56-131.304l-75.544-0.2c-6.464,0.144-12.456-4.32-13.44-11.936l 0.016-8.208c 0.16-6.472, 5.504-11.824, 11.96-11.968l 114.752,0.504
816
  c 0.128-0.008, 0.208-0.056, 0.32-0.056l 5.848-0.136c 3.224-0.088, 6.136,1.176, 8.2,3.272c 2.104,2.072, 2.856,4.976, 2.792,8.216
@@ -828,7 +828,7 @@
828
  c-3.224,0.088-6.144-2.176-8.2-4.272c-2.104-2.072-2.856-4.968-2.792-8.216l 0.632-5.848c0-0.12-0.44-0.192-0.44-0.304
829
  l 0.336-115.504c 0.144-6.464, 5.488-10.304, 11.96-10.464l 8.712-0.016c 6.472-0.144, 11.592,5.488, 11.448,11.952l-0.44,77.264l 133.632-131.512
830
  c 6.248-6.248, 16.376-6.248, 22.624,0s 6.248,16.376,0,22.624L 375.032,127.552z" />
831
- <glyph unicode="&#xe059;" d="M 201.152,227.072l 19.632,27.624l-67.152,91.64L 1.368,346.336 l0-32 l 135.744,0 L 201.152,227.072z
832
  M 459.392,314.336l-38.768-34.768c-4.672-4.472-6.184-11.72-1.512-16.184l 2.736-4.032c 4.688-4.472, 12.248-4.472, 16.912,0l 63.872,57.752
833
  c 0.088,0.080, 0.192,0.096, 0.272,0.168l 4.232,4.048c 2.336,2.248, 3.504,5.184, 3.488,8.144c 0.016,2.936-1.152,5.888-3.488,8.112
834
  l-4.232,4.048c-0.080,0.080-0.168,0.112-0.272,0.184l-64.864,59.216c-4.68,4.472-12.232,4.472-16.92,0l-2.736-4.032
@@ -838,19 +838,19 @@
838
  l-38.608-34.624c-4.672-4.472-6.184-11.72-1.512-16.184l 2.736-4.032c 4.688-4.472, 12.248-4.472, 16.912,0l 63.872,57.752
839
  c 0.088,0.080, 0.192,0.096, 0.272,0.168l 4.232,4.048c 2.336,2.248, 3.504,5.184, 3.488,8.144c 0.016,2.936-1.152,5.888-3.488,8.112
840
  L 502.904,53.616z" />
841
- <glyph unicode="&#xe05a;" d="M 450.92,5.312l-416,0 l0,320 l 128.8,0 l 32.36,31.168l-0.832,0.832L 34.92,357.312
842
  c-17.672,0-32-14.328-32-32l0-320 c0-17.672, 14.328-32, 32-32l 416,0 c 17.672,0, 32,14.328, 32,32L 482.92,255.648 l-32-30.544L 450.92,5.312 z M 135.064,133.312l 32.24,0
843
  c 22.432,127.248, 133.272,224, 266.944,224c 5.608,0, 10.928-0.048, 16.312-0.088l-58.624-58.616c-6.232-6.248-6.232-16.376,0-22.624
844
  c 3.128-3.128, 7.232-4.688, 11.328-4.688s 8.168,1.56, 11.296,4.688l 94.512,97L 414.56,470c-6.232,6.248-16.36,6.248-22.624,0
845
  c-6.232-6.248-6.232-16.376,0-22.624l 58.088-58.080c-5.016,0.008-9.984,0.024-15.104,0.024C 283.392,389.32, 158.136,278.344, 135.064,133.312z" />
846
- <glyph unicode="&#xe05b;" d="M 432,128c-26.344,0-49.648-12.792-64.216-32.44l-210.68,107.36
847
  C 158.936,209.648, 160,216.688, 160,224c0,9.152-1.608,17.904-4.44,26.088L 367.44,352.896C 381.984,332.992, 405.448,320, 432,320
848
  c 44.184,0, 80,35.824, 80,80c0,44.184-35.816,80-80,80S 352,444.184, 352,400c0-6.216, 0.784-12.232, 2.12-18.040L 139.2,277.672
849
  C 124.56,293.808, 103.504,304, 80,304C 35.816,304,0,268.184,0,224c0-44.176, 35.816-80, 80-80c 25.448,0, 48.064,11.912, 62.712,30.432l 211.552-107.816
850
  C 352.832,60.632, 352,54.424, 352,48c0-44.184, 35.816-80, 80-80s 80,35.816, 80,80S 476.184,128, 432,128z M 432,448c 26.504,0, 48-21.496, 48-48s-21.496-48-48-48
851
  s-48,21.496-48,48S 405.496,448, 432,448z M 80,176c-26.512,0-48,21.496-48,48s 21.488,48, 48,48c 26.504,0, 48-21.496, 48-48S 106.504,176, 80,176z M 432,0
852
  c-26.504,0-48,21.496-48,48s 21.496,48, 48,48s 48-21.496, 48-48S 458.504,0, 432,0z" />
853
- <glyph unicode="&#xe05c;" d="M 104.84,38.368c-10.056-20.904-16.4-34.832-72.344-36.864c 1.608,53.984, 11.896,59.776, 32.496,70.040
854
  c 8.648,4.312, 19.416,9.672, 31.056,18.624L 76.568,115.040c-9.2-7.064-17.664-10.784-25.848-14.856c-34.32-17.112-50.496-33.968-50.496-114.328
855
  l 0.272-16.352l 15.728,0.352c 84.816,0, 100.664,19.16, 116.552,52.16c 3.48,7.232, 5.416,12.12, 11.28,21.864l-23.728,21.552
856
  C 113.216,55.728, 108.776,46.496, 104.84,38.368z M 352.48,385.672c-35.384,0-64.176-28.792-64.176-64.168c0-35.392, 28.8-64.176, 64.176-64.176
@@ -867,7 +867,7 @@
867
  c-0.616,2.608-1.888,5.032-3.696,7.032c-29.424,32.608-73.872,81.904-77.28,85.816c-2.224,2.704-5.304,4.624-8.784,5.424l-73.296,16.768
868
  l 35.952,38l 91.016,0 c 5.56,0, 10.728,2.888, 13.632,7.624c 7.040,11.464, 15.208,27.768, 24.672,46.648c 16.024,31.976, 35.96,74.272, 53.56,94.816
869
  c 20.792,24.264, 41.912,39.504, 68.448,49.424c 59.048,22.064, 119.984,24.384, 147.84,24.176C 480.952,419.384, 479.84,350.976, 461,300.264z" />
870
- <glyph unicode="&#xe05d;" d="M 256,480C 114.616,480,0,365.384,0,224c0-141.392, 114.616-256, 256-256c 141.392,0, 256.008,114.608, 256.008,256C 512.008,365.384, 397.392,480, 256,480z
871
  M 256-0.504C 132.488-0.504, 32,100.488, 32,224S 132.488,448, 256,448s 224.008-100.488, 224.008-224S 379.512-0.504, 256-0.504z M 232.472,79.76l 40.256,0
872
  l0,40.624 l-40.256,0 L 232.472,79.76 z M 255.528,368.232c-23.44,0-42.752-6.32-57.92-18.944c-15.168-12.632-22.544-37.928-22.168-58.888l 0.592-1.168l 36.72,0
873
  c0,12.504, 4.168,30.472, 12.504,36.92c 8.328,6.44, 18.424,9.664, 30.28,9.664c 13.664,0, 24.168-3.712, 31.536-11.136
@@ -875,11 +875,11 @@
875
  c-13.288-11.984-21.496-21.616-24.616-28.904c-3.128-7.296-4.752-20.384-4.872-39.256l 38.48,0 c0,11.84, 0.752,20.568, 2.248,26.168
876
  c 1.488,5.592, 5.752,11.912, 12.784,18.944c 15.112,14.576, 27.248,28.832, 36.44,42.776c 9.168,13.928, 13.76,29.296, 13.76,46.096
877
  c0,23.44-7.088,41.704-21.288,54.784C 301.104,361.696, 281.176,368.232, 255.528,368.232z" />
878
- <glyph unicode="&#xe05e;" d="M 287.8,433.296c-8.832,0-16-7.168-16-16s 7.168-16, 16-16C 401.024,401.296, 480,318.56, 480,205.344C 480,92.112, 387.888,0, 274.664,0
879
  C 161.448,0, 78.704,81.8, 78.704,195.032c0,8.832-7.168,16-16,16s-16-7.168-16-16C 46.704,64.16, 143.8-32, 274.664-32S 512,74.472, 512,205.344
880
  C 512,336.2, 418.664,433.296, 287.8,433.296z M 240.128,255.872L 240.128,464 c0,8.832-7.168,16-16,16C 99.504,480,0,380.496,0,255.872c0-8.832, 7.168-16, 16-16
881
  l 208.128,0 C 232.96,239.872, 240.128,247.040, 240.128,255.872z M 208.128,271.872L 32.656,271.872 C 40.384,366.12, 113.88,439.616, 208.128,447.344L 208.128,271.872 z" />
882
- <glyph unicode="&#xe05f;" d="M 482.128,455.168c-17.432,16.704-36.664,25.168-57.192,25.168c-32.096,0-55.512-20.736-61.92-27.088
883
  C 354,444.32, 46.44,136.648, 46.44,136.648c-2.008-2.016-3.472-4.536-4.224-7.296c-6.936-25.632-41.68-139.36-42.024-140.504
884
  c-1.784-5.824-0.192-12.168, 4.104-16.464c 3.088-3.072, 7.2-4.72, 11.416-4.72c 1.656,0, 3.328,0.248, 4.96,0.784
885
  c 1.176,0.384, 118.568,38.328, 137.888,44.096c 2.544,0.768, 4.872,2.144, 6.768,4.016c 12.208,12.064, 299.064,295.728, 318.104,315.392
@@ -891,7 +891,7 @@
891
  c-5.056,13.024-13.928,29.76-29.288,45.248c-15.696,15.824-31.616,25.16-44.376,30.68c 1.088,1.080, 1.928,1.928, 2.256,2.248
892
  c 1.832,1.808, 18.448,17.688, 39.16,17.688c 11.92,0, 23.624-5.44, 34.808-16.16c 13.256-12.712, 20.088-25.256, 20.312-37.296
893
  C 480.264,381.856, 473.592,368.624, 460.208,354.816z" />
894
- <glyph unicode="&#xe060;" d="M 399.672-0.144l-368,0 l0,400 l 224.8,0 l 32.352,31.168l-0.832,0.832L 31.672,431.856 c-17.672,0-32-14.328-32-32l0-400 c0-17.672, 14.328-32, 32-32l 368,0
895
  c 17.672,0, 32,14.328, 32,32L 431.672,234.184 l-32-30.544L 399.672-0.144 z M 487.112,459.28c-14.44,13.84-30.376,20.856-47.376,20.856
896
  c-26.608,0-46.016-17.184-51.296-22.448c-7.488-7.392-219.584-219.176-219.584-219.176c-1.664-1.696-2.88-3.768-3.504-6.072
897
  c-5.744-21.224-34.536-115.496-34.824-116.432c-1.488-4.832-0.16-10.096, 3.4-13.608c 2.552-2.56, 5.96-3.92, 9.456-3.92
@@ -900,7 +900,7 @@
900
  M 465.216,379.44c-8.904-9.184-78.624-78.080-207.224-204.768l-9.84-9.704c-14.744-4.56-50.048-15.904-76.736-24.512
901
  c 8.592,28.376, 18.904,62.656, 23.504,78.872C 222.4,246.768, 404.112,428.2, 411.016,435.016c 1.344,1.344, 13.608,13.128, 28.72,13.128
902
  c 8.576,0, 16.84-3.912, 25.232-11.96c 10.032-9.624, 15.2-18.872, 15.344-27.512C 480.472,399.776, 475.392,389.944, 465.216,379.44z" />
903
- <glyph unicode="&#xe061;" d="M 495.864,127.296c 0.008,0.28, 0.080,0.536, 0.080,0.816L 495.944,461.624
904
  c 0.192,1.752, 0.128,3.56-0.288,5.376c-1.368,7.456-7.864,13.112-15.712,13.112c-2.944,0-5.672-0.848-8.040-2.24L 172.968,400.048
905
  c-5.384-1.336-9.376-5.36-11.016-10.336c-1.24-2.272-2-4.832-2-7.6L 159.952,95.84 c-15.232,10.192-34.704,16.328-55.936,16.328
906
  c-48.768,0-88.32-32.304-88.32-72.136c0-39.84, 39.552-72.152, 88.32-72.152c 48.784,0, 88.304,32.304, 88.304,72.152
@@ -910,42 +910,42 @@
910
  c 29.616,0, 51.2-16.696, 55.592-33.704l0-0.184 c0-1.616, 0.312-3.144, 0.76-4.608c 0.032-0.496, 0.112-0.984, 0.112-1.48
911
  C 160.816,21.12, 137.616,0.024, 104.352,0.024z M 407.848,80.024c-32.984,0-55.976,21.088-55.976,40S 374.864,160, 407.848,160
912
  c 32.976,0, 55.968-21.064, 55.968-39.976S 440.832,80.024, 407.848,80.024z" />
913
- <glyph unicode="&#xe062;" d="M 426.304,318.352L 269.848,474.808c-4.96,4.96-12.336,5.92-18.304,3.008
914
  c-6.272-2.168-10.8-8.056-10.8-15.064l0-354.2 c-16.96,12.56-39.216,20.264-63.688,20.264c-53.032,0-96.056-35.888-96.056-80.144
915
  c0-44.272, 43.024-80.168, 96.056-80.168c 53.056,0, 96.040,35.888, 96.040,80.168c0,1.96-0.184,3.88-0.352,5.816L 272.744,426.656 L 403.68,295.728
916
  c 6.24-6.248, 16.376-6.248, 22.624,0S 432.552,312.112, 426.304,318.352z M 176.688,0.712c-37.824,0-64.176,25.272-64.176,47.936
917
  s 26.36,47.912, 64.176,47.912c 37.016,0, 63-24.2, 64.064-46.496l0-2.84 C 239.68,24.936, 213.704,0.712, 176.688,0.712z" />
918
- <glyph unicode="&#xe063;" d="M 255.44,128l 3.8,0 C 303.72,128, 336,160.8, 336,205.984L 336,396.688 C 336,443.408, 302.28,480, 259.232,480
919
  L 255.44,480 C 211.632,480, 176,442.624, 176,396.688l0-190.704 C 176,161.528, 210.152,128, 255.44,128z M 208,396.688C 208,424.984, 229.28,448, 255.44,448l 3.8,0
920
  C 284.752,448, 304,425.936, 304,396.688l0-190.704 C 304,178.488, 286.016,160, 259.232,160L 255.44,160 C 227.504,160, 208,178.904, 208,205.984L 208,396.688 z M 400,304
921
  c-8.84,0-16-7.168-16-16l0-66.536 C 384,126.264, 350.016,80, 280.128,80L 232.56,80 C 141.16,80, 128,156.92, 128,221.464L 128,288 c0,8.832-7.168,16-16,16
922
  s-16-7.168-16-16l0-66.536 C 96,111.216, 141.944,48, 232.56,48L 240,48 l0-48 L 160,0 c-8.832,0-16-7.168-16-16s 7.168-16, 16-16l 192,0 c 8.832,0, 16,7.168, 16,16s-7.168,16-16,16
923
  L 272,0 l0,48 l 8.128,0 C 342.112,48, 416,78.096, 416,221.464L 416,288 C 416,296.832, 408.84,304, 400,304z" />
924
- <glyph unicode="&#xe064;" d="M 480,429.080L 32,429.080 c-17.672,0-32-14.328-32-32l0-288 c0-17.68, 14.328-32, 32-32l 80,0
925
  c 10.248,0, 16,13.16, 16,15.992l0,0.008 c0,2.912-5.44,16.208-16,16.208L 51.52,109.288 c-10.688,0-19.36,8.672-19.36,19.36L 32.16,377
926
  c0,10.696, 8.664,19.36, 19.36,19.36l 409.136,0.504c 10.688,0, 19.36-8.664, 19.36-19.36l0-248.848 c0-10.688-8.672-19.36-19.36-19.36L 259.072,109.296
927
  l 37.992,34.456c 4.672,4.472, 6.184,11.704, 1.512,16.168l-2.736,4.032c-4.688,4.472-12.248,4.472-16.92,0l-64.864-59.216
928
  c-0.096-0.080-0.184-0.112-0.264-0.184l-4.24-4.048c-2.336-2.216-3.504-5.168-3.488-8.112c-0.016-2.952, 1.144-5.888, 3.488-8.144
929
  l 4.24-4.048c 0.080-0.080, 0.184-0.096, 0.264-0.168l 63.864-57.752c 4.672-4.472, 12.232-4.472, 16.92,0l 2.736,4.032
930
  c 4.672,4.472, 3.16,11.72-1.512,16.184l-38.568,34.584L 480,77.080 c 17.672,0, 32,14.32, 32,32l0,288 C 512,414.752, 497.672,429.080, 480,429.080z" />
931
- <glyph unicode="&#xe065;" d="M 58.416,208.168l 277.224,0 c 8.848,0, 16,7.168, 16,16s-7.152,16-16,16L 59.416,240.168 l 57.88,57.88
932
  c 6.248,6.248, 6.248,16.376,0,22.624s-16.376,6.248-22.624,0L 0.168,223.672l 94.504-97c 3.128-3.128, 7.216-4.688, 11.312-4.688
933
  s 8.184,1.56, 11.312,4.688c 6.248,6.248, 6.248,16.376,0,22.624L 58.416,208.168z M 479.832,480L 207.832,480 c-17.68,0-32-14.328-32-32l0-144 l 32.208,0 L 208.040,428.488
934
  c0,10.688, 8.672,19.36, 19.36,19.36L 459.76,447.848 c 10.696,0, 19.36-8.672, 19.36-19.36l 0.504-409.144c0-10.688-8.664-19.36-19.36-19.36L 227.408-0.016
935
  c-10.688,0-19.36,8.672-19.36,19.36L 208.048,144.528 l-32.208-0.040L 175.84,0 c0-17.672, 14.32-32, 32-32l 271.992,0 c 17.68,0, 32.008,14.328, 32.008,32L 511.84,448
936
  C 511.832,465.672, 497.504,480, 479.832,480z" />
937
- <glyph unicode="&#xe066;" d="M 266.264,149.296c-6.256-6.248-6.256-16.376,0-22.624
938
  c 3.128-3.128, 7.216-4.688, 11.312-4.688s 8.184,1.56, 11.312,4.688l 94.504,97L 288.888,320.68c-6.248,6.248-16.376,6.248-22.624,0
939
  c-6.256-6.248-6.256-16.376,0-22.624l 57.872-57.88L 15.92,240.176 c-8.84,0-16-7.168-16-16s 7.16-16, 16-16l 309.224,0 L 266.264,149.296z M 480.080,480l-288,0
940
  c-17.68,0-32.008-14.328-32.008-32l0-144 l 32.216,0 L 192.288,428.488 c0,10.688, 8.672,19.36, 19.36,19.36L 460,447.848 c 10.704,0, 19.36-8.672, 19.36-19.36l 0.504-409.144
941
  c0-10.688-8.656-19.36-19.36-19.36L 211.656-0.016 c-10.688,0-19.36,8.672-19.36,19.36L 192.296,144.528 l-32.216-0.040L 160.080,0 c0-17.672, 14.328-32, 32.008-32l 288,0
942
  c 17.672,0, 32,14.328, 32,32L 512.088,448 C 512.080,465.672, 497.752,480, 480.080,480z" />
943
- <glyph unicode="&#xe067;" d="M 48,256L 16,256 c-8.832,0-16-7.168-16-16l0-32 c0-8.832, 7.168-16, 16-16l 32,0 c 8.832,0, 16,7.168, 16,16l0,32
944
  C 64,248.832, 56.832,256, 48,256z M 496,240L 160,240 c-8.832,0-16-7.168-16-16s 7.168-16, 16-16l 336,0 c 8.832,0, 16,7.168, 16,16S 504.832,240, 496,240z M 48,128L 16,128
945
  c-8.832,0-16-7.168-16-16l0-32 c0-8.832, 7.168-16, 16-16l 32,0 c 8.832,0, 16,7.168, 16,16l0,32 C 64,120.832, 56.832,128, 48,128z M 496,112L 160,112 c-8.832,0-16-7.168-16-16
946
  s 7.168-16, 16-16l 336,0 c 8.832,0, 16,7.168, 16,16S 504.832,112, 496,112z M 48,384L 16,384 c-8.832,0-16-7.168-16-16l0-32 c0-8.832, 7.168-16, 16-16l 32,0 c 8.832,0, 16,7.168, 16,16
947
  l0,32 C 64,376.832, 56.832,384, 48,384z M 160,336l 336,0 c 8.832,0, 16,7.168, 16,16s-7.168,16-16,16L 160,368 c-8.832,0-16-7.168-16-16S 151.168,336, 160,336z" />
948
- <glyph unicode="&#xe068;" d="M 304.272-31.872c-145.416,0-146.536,6.032-164.544,19.592c-9.552,7.184-27.576,12.16-93.408,16.448
949
  c-4.776,0.312-9.32,2.144-12.368,5.84c-1.4,1.704-34.296,49.68-34.296,126.52c0,75.72, 23.544,110.232, 24.552,111.832
950
  c 2.92,4.68, 8.048,7.52, 13.56,7.52c 54.056,0, 128.992,69, 179.368,189.448c 8.712,20.832, 10.512,34.536, 42.512,34.536
951
  c 18.2,0, 38.6-13.032, 48.672-29.752c 20.664-34.16, 10.168-107.528, 0.464-146.736c 33,0.264, 92.736,0.712, 121.16,0.712
@@ -960,24 +960,24 @@
960
  c-3,4.472-3.224,10.024-1.464,15.112c 15.632,45.016, 24.36,115.64, 9.864,139.768c-4.272,7.112-5.248,14.216-21.248,14.216
961
  c-2.216,0-7.496-1.752-13-14.872C 193.168,305.088, 113.312,231.096, 47.904,224.424c-5.64-12.864-16.248-39.52-16.248-87.888
962
  C 31.656,87.168, 47.296,48.976, 54.808,36.616z" />
963
- <glyph unicode="&#xe069;" d="M 508.352,223.32L 268.168,474.904c-3.016,3.152-7.184,4.92-11.544,4.92c-4.352,0-8.52-1.776-11.544-4.92L 3.656,223.328
964
  c-6.12-6.376-5.904-16.496, 0.472-22.624c 6.376-6.112, 16.496-5.936, 22.624,0.472l 21.504,22.416l0-239.416 c0-8.84, 7.168-16, 16-16l 111.776,0
965
  c 8.816,0, 15.968,7.128, 16,15.952l 0.504,159.832l 127.496,0 l0-159.784 c0-8.84, 7.16-16, 16-16l 111.736,0 c 8.84,0, 16,7.16, 16,16L 463.768,223.672 l 21.496-22.52
966
  c 3.144-3.264, 7.344-4.92, 11.544-4.92c 3.984,0, 7.984,1.472, 11.080,4.472C 514.256,206.816, 514.464,216.944, 508.352,223.32z
967
  M 431.768,252.592l0-252.416 l-79.736,0 L 352.032,159.952 c0,8.84-7.16,16-16,16l-159.44,0 c-8.816,0-15.968-7.128-16-15.952l-0.504-159.832l-79.832,0 L 80.256,252.592
968
  c0,1.32-0.208,2.584-0.504,3.816l 176.88,184.312l 175.712-184.104C 432,255.32, 431.768,253.984, 431.768,252.592z" />
969
- <glyph unicode="&#xe06a;" d="M 480-32L 320-32 c-17.672,0-32,14.328-32,32L 288,160 c0,17.672, 14.328,32, 32,32l 160,0 c 17.672,0, 32-14.328, 32-32l0-160
970
  C 512-17.672, 497.672-32, 480-32z M 480,160L 320,160 l0-160 l 160,0 L 480,160 z M 480,256L 320,256 c-17.672,0-32,14.328-32,32L 288,448 c0,17.672, 14.328,32, 32,32l 160,0 c 17.672,0, 32-14.328, 32-32l0-160
971
  C 512,270.328, 497.672,256, 480,256z M 480,448L 320,448 l0-160 l 160,0 L 480,448 z M 192-32L 32-32 c-17.672,0-32,14.328-32,32L0,160 c0,17.672, 14.328,32, 32,32l 160,0 c 17.672,0, 32-14.328, 32-32l0-160
972
  C 224-17.672, 209.672-32, 192-32z M 192,160L 32,160 l0-160 l 160,0 L 192,160 z M 192,256L 32,256 c-17.672,0-32,14.328-32,32L0,448 c0,17.672, 14.328,32, 32,32l 160,0 c 17.672,0, 32-14.328, 32-32l0-160
973
  C 224,270.328, 209.672,256, 192,256z M 192,448L 32,448 l0-160 l 160,0 L 192,448 z" />
974
- <glyph unicode="&#xe06b;" d="M 472,368c-22.096,0-40-17.912-40-40c0-4.536, 0.92-8.816, 2.304-12.88L 336.8,231.16C 329.96,236.608, 321.424,240, 312,240
975
  c-10.872,0-20.704-4.368-27.904-11.408l-76.376,38.24C 206.232,287.576, 189.12,304, 168,304c-22.088,0-40-17.912-40-40c0-6.048, 1.44-11.72, 3.84-16.856
976
  L 53.968,157.352C 49.6,158.984, 44.936,160, 40,160c-22.088,0-40-17.912-40-40s 17.912-40, 40-40s 40,17.912, 40,40c0,5.32-1.088,10.384-2.976,15.024
977
  l 79.136,90.96C 159.928,224.816, 163.848,224, 168,224c 11.64,0, 22.024,5.056, 29.336,13l 74.704-37.456C 272.304,177.672, 290.064,160, 312,160
978
  c 22.096,0, 40,17.912, 40,40c0,0.712-0.168,1.376-0.208,2.080L 455.84,291.464C 460.792,289.272, 466.232,288, 472,288c 22.096,0, 40,17.904, 40,40
979
  C 512,350.088, 494.096,368, 472,368z" />
980
- <glyph unicode="&#xe06c;" d="M 80.024,286.064L 80.024,464 c0,8.832-7.168,16-16,16s-16-7.168-16-16l0-177.92
981
  C 20.36,278.952-0.176,253.856-0.176,224c0-29.864, 20.536-54.952, 48.2-62.088L 48.024-16 c0-8.832, 7.168-16, 16-16s 16,7.168, 16,16L 80.024,161.928
982
  c 27.64,7.152, 48.152,32.224, 48.152,62.072C 128.176,253.84, 107.664,278.92, 80.024,286.064z M 64.208,191.984C 64.152,191.984, 64.088,192, 64.024,192
983
  c-0.072,0-0.136-0.016-0.208-0.024C 46.24,192.080, 31.968,206.4, 31.968,224c0,17.592, 14.28,31.92, 31.856,32.016
@@ -993,7 +993,7 @@
993
  c-0.064,0-0.12,0.016-0.176,0.016c-0.072,0-0.144-0.016-0.208-0.016C 430.248,288.080, 415.968,302.4, 415.968,320
994
  c0,17.592, 14.28,31.92, 31.848,32.016c 0.072,0, 0.144-0.016, 0.208-0.016c 0.064,0, 0.12,0.016, 0.176,0.016
995
  c 17.568-0.12, 31.832-14.432, 31.832-32.016C 480.048,302.408, 465.784,288.096, 448.208,287.984z" />
996
- <glyph unicode="&#xe06d;" d="M 207.72,479.88c 145.416,0, 146.544-6.032, 164.552-19.592c 9.552-7.184, 27.576-12.168, 93.416-16.456
997
  c 4.784-0.312, 9.32-2.144, 12.368-5.84c 1.4-1.704, 34.296-49.68, 34.296-126.512c0-75.72-23.544-110.24-24.552-111.848
998
  c-2.92-4.672-8.048-7.512-13.56-7.512c-54.056,0-128.992-69-179.376-189.456c-8.712-20.832-10.504-34.528-42.512-34.528
999
  c-18.2,0-38.6,13.032-48.688,29.752c-20.656,34.16-10.168,107.528-0.456,146.736c-33-0.264-92.736-0.72-121.16-0.72
@@ -1008,39 +1008,39 @@
1008
  s 3.232-10.032, 1.464-15.112c-15.624-45.016-24.352-115.64-9.856-139.768c 4.264-7.112, 5.248-14.216, 21.248-14.216
1009
  c 2.216,0, 7.496,1.752, 13,14.872c 53.496,127.904, 133.352,201.904, 198.76,208.576c 5.64,12.864, 16.248,39.52, 16.248,87.896
1010
  C 480.352,360.832, 464.712,399.016, 457.192,411.376z" />
1011
- <glyph unicode="&#xe06e;" d="M 460.544,428.384L 292.416,35.488l-59.656,172.256L 60.664,259.76L 460.544,428.384 M 502.232,479.616c-3.048,0-6.76-0.864-11.048-2.68
1012
  L 13.856,274.4c-17.192-7.296-18.28-21.352-2.424-31.232l 197.648-61.792l 64.68-201.632c 4.64-7.592, 10.248-11.36, 15.632-11.36
1013
  c 5.968,0, 11.648,4.576, 15.52,13.624L 509.048,458.872C 514.576,471.816, 511.432,479.616, 502.232,479.616L 502.232,479.616z" />
1014
- <glyph unicode="&#xe06f;" d="M 487.472,447.304c0,11.616-6.296,22.328-16.456,27.968
1015
  c-4.84,2.696-10.184,4.032-15.544,4.032c-5.856,0-11.736-1.616-16.888-4.824L 70.72,251.184c-7.976-4.952-13.256-13.104-14.688-22.2L 56.032,464
1016
  c0,8.832-7.168,16-16,16s-16-7.168-16-16l0-480 c0-8.832, 7.168-16, 16-16s 16,7.168, 16,16L 56.032,219.032 c 1.44-9.104, 6.72-17.256, 14.688-22.192L 439.080-26.48
1017
  c 5.16-3.216, 11.032-4.832, 16.888-4.832c 5.36,0, 10.704,1.344, 15.544,4.032c 10.16,5.64, 16.456,16.344, 16.456,27.968L 487.472,447.304z
1018
  M 87.6,224.008L 455.472,447.304l 0.504-446.608L 87.6,224.008z" />
1019
- <glyph unicode="&#xe070;" d="M 286.96,381.048L 34.32,224l 252.64-157.048L 286.96,190.44 l 192-123.488L 478.96,381.048 l-192-123.496L 286.96,385.472 M 285.632,413.048
1020
  c 5.352,0, 11.368-1.336, 16.208-4.032c 10.16-5.64, 17.12-16.352, 17.12-27.968l0-65.92 L 468.072,408.224c 5.16,3.2, 10.688,4.824, 16.56,4.824
1021
  c 5.344,0, 7.864-1.336, 12.712-4.032c 10.16-5.64, 13.616-16.352, 13.616-27.968l0-314.096 c0-11.624-3.624-22.328-13.784-27.968
1022
  c-4.84-2.688-8.864-4.032-14.216-4.032c-5.864,0-10.392,1.608-15.552,4.832L 318.96,132.872l0-65.92 c0-11.624-6.96-22.328-17.12-27.968
1023
  c-4.84-2.688-10.52-4.032-15.88-4.032c-5.856,0-11.896,1.608-17.056,4.832L 16.176,196.832C 6.792,202.656, 1.040,212.936, 1.040,224
1024
  s 5.688,21.336, 15.080,27.176L 268.752,408.224C 273.904,411.432, 279.768,413.048, 285.632,413.048L 285.632,413.048z" />
1025
- <glyph unicode="&#xe071;" d="M 72.312,447.304l 367.872-223.296L 71.816,0.696L 72.312,447.304 M 72.312,479.304c-5.36,0-10.704-1.336-15.544-4.032
1026
  c-10.16-5.64-16.456-16.352-16.456-27.968L 39.816,0.696c0-11.624, 6.296-22.328, 16.456-27.968c 4.84-2.688, 10.184-4.032, 15.544-4.032
1027
  c 5.856,0, 11.736,1.608, 16.888,4.832l 368.36,223.312c 9.408,5.832, 15.128,16.112, 15.128,27.168s-5.72,21.336-15.128,27.176L 89.2,474.488
1028
  C 84.048,477.688, 78.168,479.304, 72.312,479.304L 72.312,479.304z" />
1029
- <glyph unicode="&#xe072;" d="M 208.136,480L 96.032,480 c-8.832,0-16-7.16-16-16l0-480 c0-8.832, 7.168-16, 16-16l 112.104,0 c 8.84,0, 16,7.168, 16,16L 224.136,464
1030
  C 224.136,472.84, 216.976,480, 208.136,480z M 192.136,0L 112.032,0 L 112.032,448 l 80.104,0 L 192.136,0 z M 415.968,480L 304.44,480 c-8.84,0-16-7.16-16-16l0-480 c0-8.832, 7.16-16, 16-16
1031
  l 111.528,0 c 8.84,0, 16,7.168, 16,16L 431.968,464 C 431.968,472.84, 424.816,480, 415.968,480z M 399.968,0l-79.528,0 L 320.44,448 l 79.528,0 L 399.968,0 z" />
1032
- <glyph unicode="&#xe073;" d="M 225.040,381.048L 477.68,224L 225.040,66.952L 225.040,190.44 l-192-123.488L 33.040,381.048 l 192-123.496L 225.040,385.472 M 226.368,413.048
1033
  c-5.36,0-11.368-1.336-16.216-4.032C 200,403.376, 193.040,392.664, 193.040,381.048l0-65.92 L 43.928,408.224c-5.16,3.2-10.688,4.824-16.56,4.824
1034
  c-5.344,0-7.864-1.336-12.72-4.032C 4.504,403.376, 1.040,392.664, 1.040,381.048l0-314.096 c0-11.624, 3.624-22.328, 13.784-27.968
1035
  c 4.84-2.688, 8.864-4.032, 14.216-4.032c 5.864,0, 10.392,1.608, 15.552,4.832L 193.040,132.872l0-65.92 c0-11.624, 6.96-22.328, 17.112-27.968
1036
  c 4.848-2.688, 10.528-4.032, 15.888-4.032c 5.856,0, 11.896,1.608, 17.056,4.832l 252.728,157.048c 9.392,5.832, 15.144,16.112, 15.144,27.168
1037
  s-5.688,21.336-15.080,27.176L 243.248,408.224C 238.096,411.432, 232.224,413.048, 226.368,413.048L 226.368,413.048z" />
1038
- <glyph unicode="&#xe074;" d="M 471.968,480c-8.832,0-16-7.168-16-16l0-235 c-1.44,9.096-6.72,17.232-14.688,22.184
1039
  L 73.424,474.488c-5.16,3.2-11.032,4.824-16.888,4.824c-5.36,0-10.704-1.336-15.544-4.032c-10.16-5.64-16.456-16.352-16.456-27.968
1040
  L 24.032,0.696c0-11.624, 6.296-22.328, 16.456-27.968c 4.84-2.688, 10.184-4.032, 15.544-4.032c 5.856,0, 11.736,1.608, 16.888,4.832
1041
  L 441.28,196.832c 7.968,4.936, 13.248,13.080, 14.688,22.176L 455.968-16 c0-8.832, 7.168-16, 16-16s 16,7.168, 16,16L 487.968,464 C 487.968,472.832, 480.808,480, 471.968,480z
1042
  M 56.032,0.696L 56.528,447.304l 367.872-223.296L 56.032,0.696z" />
1043
- <glyph unicode="&#xe075;" d="M 480,432.056L 351.888,432.056 L 351.888,463.944 c0,8.84-7.16,16-16,16s-16-7.16-16-16l0-31.88 l-128,0 L 191.888,463.944
1044
  c0,8.84-7.16,16-16,16c-8.84,0-16-7.16-16-16l0-31.88 L 32,432.064 c-17.672,0-32-14.328-32-32l0-400 c0-17.672, 14.328-32, 32-32l 448,0 c 17.672,0, 32,14.328, 32,32l0,400
1045
  C 512,417.728, 497.672,432.056, 480,432.056z M 480,0.064L 32,0.064 l0,400 l 127.888,0 l0-16.12 c0-8.84, 7.16-16, 16-16c 8.84,0, 16,7.16, 16,16L 191.888,400.056 l 128,0 l0-16.12
1046
  c0-8.84, 7.16-16, 16-16s 16,7.16, 16,16L 351.888,400.056 L 480,400.056 L 480,0.064 z M 368,224.056l 32,0 c 8.832,0, 16,7.168, 16,16l0,32 c0,8.832-7.168,16-16,16l-32,0
@@ -1050,7 +1050,7 @@
1050
  c 8.832,0, 16,7.168, 16,16l0,32 C 288,280.896, 280.832,288.056, 272,288.056z M 144,288.056l-32,0 c-8.832,0-16-7.168-16-16l0-32 c0-8.832, 7.168-16, 16-16l 32,0
1051
  c 8.832,0, 16,7.168, 16,16l0,32 C 160,280.896, 152.832,288.056, 144,288.056z M 144,160.064l-32,0 c-8.832,0-16-7.168-16-16l0-32 c0-8.84, 7.168-16, 16-16l 32,0
1052
  c 8.832,0, 16,7.16, 16,16l0,32 C 160,152.888, 152.832,160.064, 144,160.064z" />
1053
- <glyph unicode="&#xe076;" d="M 255.992,480C 156.976,480, 79.432,399.448, 79.432,300.432c0-74.6, 36.64-110.128, 65.592-136.064c 18.64-16.712, 31.184-26.776, 31.184-39.176
1054
  l0-27.128 c0-0.696, 0.096-1.376, 0.184-2.064l-0.36,0 l0-46.312 C 176.040,0.832, 207.632-32, 256.568-32c 47.232,0, 79.472,32.832, 79.472,81.688L 336.040,96
1055
  l-0.464,0 c 0.088,0.688, 0.208,1.368, 0.208,2.064l0,27.128 c0,18.88, 14.016,30.296, 35.264,48.848c 28.752,25.104, 61.512,56.344, 61.512,126.392
1056
  C 432.568,399.448, 355.008,480, 255.992,480z M 255.384,0c-29.952,0-47.344,18.576-47.344,49.688l-0.232,21.336C 219.32,67.088, 235,64, 256,64
@@ -1058,39 +1058,39 @@
1058
  l0-20.216 c-7.592-4.24-21.592-9.28-48.064-9.28c-27.784,0-40.96,4.928-47.512,8.736l0,20.768 c0,27.304-21.344,44.648-41.84,63.008
1059
  c-27.16,24.336-54.936,51.92-54.936,112.232C 111.432,381.8, 174.632,448, 255.992,448c 81.376,0, 144.576-66.2, 144.576-147.568
1060
  C 400.568,244.92, 376.336,221.144, 350.008,198.144z" />
1061
- <glyph unicode="&#xe077;" d="M 136.032,320.008L 24,320.008 c-8.84,0-16-7.16-16-16L 8-16 c0-8.84, 7.16-16, 16-16l 112.032,0 c 8.84,0, 16,7.16, 16,16L 152.032,304.008
1062
  C 152.032,312.848, 144.872,320.008, 136.032,320.008z M 120.032,0L 40,0 L 40,288.008 l 80.032,0 L 120.032,0 z M 311.872,224.872L 199.832,224.872 c-8.84,0-16-7.16-16-16L 183.832-16
1063
  c0-8.84, 7.16-16, 16-16l 112.040,0 c 8.84,0, 16,7.16, 16,16L 327.872,208.872 C 327.872,217.72, 320.72,224.872, 311.872,224.872z M 295.872,0L 215.832,0 L 215.832,192.872
1064
  l 80.040,0 L 295.872,0 z M 488,480L 376.136,480 c-8.84,0-16-7.16-16-16l0-480 c0-8.84, 7.16-16, 16-16L 488-32 c 8.84,0, 16,7.16, 16,16L 504,464 C 504,472.84, 496.84,480, 488,480z M 472,0
1065
  l-79.864,0 L 392.136,448 L 472,448 L 472,0 z" />
1066
- <glyph unicode="&#xe078;" d="M 512,224C 512,365.392, 397.384,480, 256,480C 114.608,480,0,365.392,0,224c0-141.384, 114.608-256, 256-256C 397.384-32, 512,82.616, 512,224z M 31.504,224
1067
  C 31.504,347.512, 132.488,448, 256,448s 224-100.488, 224-224S 379.512,0, 256,0S 31.504,100.488, 31.504,224z M 272.168,111.84L 272.168,292.072 l 57.88-57.88
1068
  c 6.248-6.248, 16.376-6.248, 22.624,0s 6.248,16.376,0,22.624L 255.672,351.32L 158.672,256.816c-3.128-3.128-4.688-7.216-4.688-11.312
1069
  s 1.56-8.184, 4.688-11.312c 6.248-6.248, 16.376-6.248, 22.624,0l 58.872,58.88L 240.168,111.84 c0-8.84, 7.168-16, 16-16S 272.168,103, 272.168,111.84z" />
1070
- <glyph unicode="&#xe079;" d="M 256,480C 114.616,480,0,365.384,0,224c0-141.392, 114.616-256, 256-256c 141.392,0, 256,114.608, 256,256C 512,365.384, 397.392,480, 256,480z M 256-0.504
1071
  C 132.488-0.504, 32,100.488, 32,224S 132.488,448, 256,448s 224-100.488, 224-224S 379.512-0.504, 256-0.504z M 266.184,320.68
1072
  c-6.248-6.248-6.248-16.376,0-22.624l 57.88-57.88L 143.84,240.176 c-8.84,0-16-7.168-16-16s 7.16-16, 16-16l 181.232,0 l-58.88-58.872
1073
  c-6.248-6.248-6.248-16.376,0-22.624c 3.128-3.128, 7.216-4.688, 11.312-4.688s 8.184,1.56, 11.312,4.688l 94.504,97L 288.816,320.68
1074
  C 282.56,326.928, 272.44,326.928, 266.184,320.68z" />
1075
- <glyph unicode="&#xe07a;" d="M 256,480C 114.608,480,0,365.384,0,224c0-141.392, 114.608-256, 256-256c 141.384,0, 256,114.608, 256,256C 512,365.384, 397.384,480, 256,480z M 256-0.504
1076
  C 132.488-0.504, 32,100.488, 32,224S 132.488,448, 256,448s 224-100.488, 224-224S 379.512-0.504, 256-0.504z M 368.16,240.168L 187.928,240.168 l 57.88,57.88
1077
  c 6.248,6.248, 6.248,16.376,0,22.624s-16.376,6.248-22.624,0L 128.68,223.672l 94.504-97c 3.128-3.128, 7.216-4.688, 11.312-4.688
1078
  s 8.184,1.56, 11.312,4.688c 6.248,6.248, 6.248,16.376,0,22.624l-58.88,58.872L 368.16,208.168 c 8.84,0, 16,7.168, 16,16S 377,240.168, 368.16,240.168z" />
1079
- <glyph unicode="&#xe07b;" d="M0,224c0-141.392, 114.616-256, 256-256c 141.392,0, 256,114.608, 256,256C 512,365.384, 397.392,480, 256,480C 114.616,480,0,365.384,0,224z M 480.504,224
1080
  c0-123.512-100.984-224-224.504-224S 32,100.488, 32,224S 132.488,448, 256,448S 480.504,347.512, 480.504,224z M 239.832,336.16l0-180.224 l-57.88,57.88
1081
  c-6.248,6.248-16.376,6.248-22.624,0s-6.248-16.376,0-22.624l 97.008-94.504l 97,94.504c 3.128,3.128, 4.688,7.216, 4.688,11.312
1082
  s-1.56,8.184-4.688,11.312c-6.248,6.248-16.376,6.248-22.624,0l-58.872-58.88L 271.84,336.16 c0,8.84-7.168,16-16,16S 239.832,345, 239.832,336.16z" />
1083
- <glyph unicode="&#xe07c;" d="M 256,480C 114.616,480,0,365.384,0,224c0-141.392, 114.616-256, 256-256
1084
  c 141.392,0, 256,114.608, 256,256C 512,365.384, 397.392,480, 256,480z M 32,224c0,56.136, 20.808,107.48, 55.048,146.832l 315.928-315.928
1085
  C 363.608,20.464, 312.208-0.504, 256-0.504C 132.488-0.504, 32,100.488, 32,224z M 425.512,77.608L 109.704,393.416C 148.992,427.384, 200.12,448, 256,448
1086
  c 123.512,0, 224-100.488, 224-224C 480,168.168, 459.424,116.984, 425.512,77.608z" />
1087
- <glyph unicode="&#xe07d;" d="M 256,416c 123.512,0, 224-71.776, 224-160c0-88.216-100.488-160-224-160l-7.568-0.032l-5.688-0.016c-8.792,0-14.544,0.232-23.536,1.576
1088
  l-17.928,2.56l-11.504-13.92c-5.288-6.392-32.272-28.56-62.056-42.832c 6.056,16.016, 10.52,33.504, 10.92,50.8l 0.16,0.952l0,2.736 l0,19.576
1089
  l-17.432,8.904C 64.568,155.36, 32,202.624, 32,256C 32,344.224, 132.488,416, 256,416 M 256,448C 114.6,448,0,362.032,0,256c0-66.032, 39.128-123.576, 106.792-158.168
1090
  c0-0.408-0.128-0.704-0.128-1.16c0-28.688-16.080-60.232-25.504-76.472l 0.024,0 C 80.44,18.456, 80,16.544, 80,14.496
1091
  C 80,6.456, 86.48,0, 94.504,0c 1.208,0, 3.128,0.248, 3.832,0.248c 0.168,0, 0.264,0, 0.248-0.048c 50,8.168, 104.976,52.344, 115.912,65.672
1092
  c 11.24-1.672, 18.832-1.92, 28.24-1.92C 246.704,63.952, 250.984,64, 256,64c 141.376,0, 256,85.952, 256,192C 512,362.032, 397.376,448, 256,448L 256,448z" />
1093
- <glyph unicode="&#xe07e;" d="M 319.064,368.312c 0.64,0, 1.16-0.504, 1.16-1.12l0-63.936 c0-11.832, 6.528-22.712, 17-28.264c 4.704-2.504, 9.856-3.736, 15-3.736
1094
  c 6.28,0, 13.528,1.84, 18.92,5.496L 480,338.368L 480,110.16 L 370.544,169.92c-5.488,3.832-11.888,5.768-18.328,5.768
1095
  c-5.064,0-10.128-1.2-14.784-3.608c-10.56-5.512-17.2-16.44-17.216-28.344l-0.080-62.92c0-0.624-0.504-1.128-1.144-1.128L 33.144,79.688
1096
  C 32.504,79.688, 32,80.184, 32,80.8l 0.080,286.392c0,0.624, 0.504,1.12, 1.144,1.12L 319.064,368.312 M 495.184,384.328c-3.408,0-10.144-1.008-13.984-4.832
@@ -1098,27 +1098,27 @@
1098
  c0-18.28, 14.816-33.128, 33.144-33.128l 285.856,0 c 18.328,0, 33.144,14.84, 33.144,33.128l 0.080,62.872l 131.488-76.656
1099
  c 3.856-3.84, 8.128-3.344, 11.544-3.344c 3.544,0, 6.184,1.080, 6.512,1.216C 507.984,67.496, 512,73.496, 512,80.248L 512,367.736
1100
  c0,6.752-4.016,12.776-10.232,15.328C 501.408,383.224, 498.752,384.328, 495.184,384.328L 495.184,384.328z" />
1101
- <glyph unicode="&#xe07f;" d="M 464,368l-73.592,0 L 352,432L 160,432 l-38.4-64L 48,368 c-16,0-48-16-48-47.504L0,64 c0-26.504, 24-48, 44.664-48l 420.336,0 C 486,16, 512,38.496, 512,63.496L 512,320
1102
  C 512,336, 496,368, 464,368z M 480,63.496c0-6.312-10.232-15.144-15-15.504L 44.76,47.992 C 41.056,48.296, 32,55.512, 32,64L 32,320.496
1103
  C 32,330.632, 45.616,335.744, 48,336l 91.72,0 l 9.32,15.536L 178.12,400l 156.824,0 l 28.56-48.472l 8.8-15.528L 464,336 c 11.28,0, 15.84-14.736, 16-16L 480,63.496 z M 256,320
1104
  c-61.856,0-112-50.144-112-112s 50.144-112, 112-112s 112,50.144, 112,112S 317.856,320, 256,320z M 256,128c-44.112,0-80,35.888-80,80s 35.888,80, 80,80
1105
  s 80-35.888, 80-80S 300.112,128, 256,128z" />
1106
- <glyph unicode="&#xe080;" d="M 256,480C 114.616,480,0,365.384,0,224c0-141.392, 114.616-256, 256-256
1107
  c 141.392,0, 256,114.608, 256,256C 512,365.384, 397.392,480, 256,480z M 256-0.504C 132.488-0.504, 32,100.488, 32,224S 132.488,448, 256,448s 224-100.488, 224-224
1108
  S 379.512-0.504, 256-0.504z M 358.168,317.672L 207.968,166.528l-67.64,67.64c-6.248,6.248-16.376,6.248-22.632,0
1109
  c-6.248-6.248-6.248-16.376,0-22.624l 79.192-79.2c 6.248-6.24, 16.376-6.24, 22.632,0c 0.72,0.72, 1.336,1.504, 1.896,2.32L 380.808,295.040
1110
  c 6.24,6.248, 6.24,16.376,0,22.632C 374.552,323.92, 364.424,323.92, 358.168,317.672z" />
1111
- <glyph unicode="&#xe081;" d="M 256,480C 114.616,480,0,365.384,0,224c0-141.392, 114.616-256, 256-256
1112
  c 141.392,0, 256,114.608, 256,256C 512,365.384, 397.392,480, 256,480z M 256-0.504C 132.488-0.504, 32,100.488, 32,224S 132.488,448, 256,448s 224-100.488, 224-224
1113
  S 379.512-0.504, 256-0.504z M 272,230.496L 272,384 c0,8.832-7.168,16-16,16s-16-7.168-16-16l0-160 c0-4.528, 1.896-8.6, 4.928-11.504
1114
  c 0.264-0.312, 0.48-0.648, 0.768-0.944l 79.192-79.2c 6.248-6.24, 16.376-6.24, 22.624,0c 6.248,6.248, 6.248,16.384,0,22.632L 272,230.496z" />
1115
- <glyph unicode="&#xe082;" d="M 256,480C 114.616,480,0,365.384,0,224c0-141.392, 114.616-256, 256-256
1116
  c 141.392,0, 256,114.608, 256,256C 512,365.384, 397.392,480, 256,480z M 256-0.504C 132.488-0.504, 32,100.488, 32,224S 132.488,448, 256,448s 224-100.488, 224-224
1117
  S 379.512-0.504, 256-0.504z M 346.504,314.504c-6.248,6.248-16.376,6.248-22.624,0L 256,246.624l-67.88,67.88
1118
  c-6.248,6.248-16.376,6.248-22.632,0c-6.248-6.248-6.248-16.376,0-22.624L 233.368,224l-67.88-67.88c-6.248-6.24-6.248-16.384,0-22.624
1119
  c 6.248-6.248, 16.376-6.248, 22.632,0L 256,201.376l 67.88-67.88c 6.248-6.248, 16.376-6.248, 22.624,0c 6.248,6.24, 6.248,16.384,0,22.624
1120
  L 278.624,224l 67.88,67.88C 352.76,298.136, 352.76,308.264, 346.504,314.504z" />
1121
- <glyph unicode="&#xe083;" d="M 381.512,350C 359.2,409.216, 311.232,446.72, 238.784,446.72c-92.192,0-156.696-68.456-162.24-157.768C 32.088,274.736,0,229.392,0,178.032
1122
  c0-62.872, 49.424-115.984, 107.912-115.984l 14.224,0 c 8.832,0, 16,7.16, 16,16s-7.168,16-16,16l-14.224,0 c-41.152,0-76.416,38.456-76.416,83.984
1123
  c0,40.232, 28.208,76.528, 63.592,82.608l 14.52,2.504l-1.296,14.672l-0.12,0.184c 0.008,77.936, 51.304,136.72, 130.592,136.72
1124
  c 63.552,0, 99.256-31.312, 115.776-84.72l 3.416-11.016l 11.536-0.248c 59.432-1.248, 111.544-49.472, 111.544-109.392
@@ -1128,7 +1128,7 @@
1128
  c-4.472-4.688-4.472-12.24,0-16.912l 57.752-63.872c 0.080-0.080, 0.096-0.184, 0.168-0.264l 4.048-4.232
1129
  c 2.248-2.344, 5.184-3.504, 8.144-3.488c 2.936-0.016, 5.888,1.144, 8.112,3.488l 4.048,4.232c 0.080,0.080, 0.12,0.168, 0.184,0.264
1130
  l 59.216,64.872c 4.472,4.672, 4.472,10.224,0,14.912L 323.168,92.264z" />
1131
- <glyph unicode="&#xe084;" d="M 381.512,350.016C 359.2,409.232, 311.232,446.736, 238.776,446.736c-92.192,0-156.696-68.456-162.24-157.768
1132
  C 32.088,274.752,0,229.408,0,178.048c0-62.872, 49.424-115.984, 107.912-115.984l 46.224,0 c 8.832,0, 16,7.168, 16,16c0,8.84-7.168,16-16,16l-46.224,0
1133
  c-41.152,0-76.416,38.456-76.416,83.984c0,40.232, 28.208,76.528, 63.592,82.608l 14.52,2.504l-1.288,14.664l-0.12,0.184
1134
  c0,77.936, 51.288,136.72, 130.576,136.72c 63.552,0, 99.256-31.312, 115.768-84.72l 3.424-11.016l 11.528-0.248
@@ -1138,14 +1138,14 @@
1138
  l-4.048-4.232c-0.080-0.080-0.096-0.176-0.168-0.256l-57.752-63.872c-4.472-4.672-4.472-12.232,0-16.92l 4.032-2.736
1139
  c 4.472-4.672, 11.72-3.16, 16.184,1.512l 34.056,37.968l0-161.216 c0-8.832, 7.168-16, 16-16s 16,7.168, 16,16L 271.808,178.328 l 35.184-38.816
1140
  c 4.472-4.672, 11.704-6.184, 16.168-1.512l 4.032,2.736c 4.472,4.688, 4.472,12.248,0,16.92L 267.992,222.528z" />
1141
- <glyph unicode="&#xe085;" d="M 280,480L 104,480 c-17.672,0-32-14.328-32-32l0-448 c0-17.672, 14.328-32, 32-32l 304,0 c 17.672,0, 32,14.328, 32,32L 440,319.992 L 280,480z M 408,306.736L 408,304 L 264,304 L 264,448 l 2.752,0
1142
  L 408,306.736z M 104,0L 104,448 l 128,0 l0-176 l 176,0 l0-272 L 104,0 z" />
1143
- <glyph unicode="&#xe086;" d="M 511.728,364c 0.496,3.072, 0.088,6.24-1.24,9.136C 506.456,390.856, 493.648,400, 472,400L 56,400 c-19.040,0-39.552-7-49.64-20.736
1144
  c-0.872-0.664-1.704-1.416-2.456-2.288c-3.224-3.72-4.352-8.504-3.632-13.016C 0.128,362.664,0,361.36,0,360l0-256 c0-26.512, 29.496-56, 56-56
1145
  l 416,0 c 26.512,0, 40,29.488, 40,56L 512,360 C 512,361.416, 511.816,362.656, 511.728,364z M 56,368l 416,0 c 0.096,0, 0.144,0, 0.216,0L 256,195.672L 40.656,367.296
1146
  C 45.552,368.2, 51.576,368, 56,368z M 472,80L 56,80 c-8.824,0-24,15.168-24,24L 32,333.224 L 245.52,162.4c 3.008-2.6, 6.744-3.896, 10.48-3.896
1147
  s 7.472,1.296, 10.488,3.896L 480,333.216L 480,104 C 480,95.168, 480.832,80, 472,80z" />
1148
- <glyph unicode="&#xe087;" d="M 257.736,319.296c-53.016,0-96-42.984-96-96c0-53.008, 42.984-96, 96-96s 96,42.984, 96,96
1149
  C 353.736,276.312, 310.752,319.296, 257.736,319.296z M 257.736,159.296c-35.288,0-64.736,29.408-64.736,64.696c0,35.288, 28.712,64, 64,64
1150
  c 35.296,0, 64-28.712, 64-64C 321,188.704, 293.032,159.296, 257.736,159.296z M 511.84,227.712c-0.184,0.808-0.104,1.664-0.344,2.456
1151
  c-0.104,0.336-0.312,0.528-0.432,0.824c-0.168,0.456-0.128,0.992-0.36,1.432C 464.168,338.976, 363.872,400.304, 256.992,400.304
@@ -1156,14 +1156,14 @@
1156
  c 0.112,0.28, 0.328,0.488, 0.424,0.8c 0.248,0.784, 0.168,1.64, 0.344,2.456c 0.28,1.432, 0.544,2.832, 0.544,4.312
1157
  C 512.392,224.872, 512.128,226.264, 511.84,227.712z M 256,79.704c-90.648,0-179.872,47.784-223.712,143.84
1158
  c 43.424,95.736, 133.84,144.752, 224.712,144.752c 90.84,0, 179.248-49.072, 222.688-144.856C 436.28,127.736, 346.872,79.704, 256,79.704z" />
1159
- <glyph unicode="&#xe088;" d="M 340,432.336c-80,0-101.328,48-202.656,48C 72,480.336, 32,430.992, 32,430.992l0-447.328
1160
  c0-8.832, 7.168-16, 16-16s 16,7.168, 16,16L 64,187.6 c 16.88,10.888, 40.168,20.736, 69.344,20.736c 101.328,0, 130.656-48, 210.656-48s 136,48, 136,48l0,272
1161
  C 480,480.336, 420,432.336, 340,432.336z M 448,224.64c-18.080-11.792-56.392-32.304-104-32.304c-31.456,0-52.92,8.632-80.112,19.568
1162
  c-33.136,13.32-70.704,28.432-130.544,28.432c-27.344,0-50.536-6.88-69.344-16.080L 64,417.992 c 12.048,10.96, 38.312,30.344, 73.344,30.344
1163
  c 47.056,0, 73.544-11.424, 101.592-23.504c 27.936-12.040, 56.832-24.496, 101.064-24.496c 42.624,0, 80.064,11.784, 108,24.456L 448,224.64 z" />
1164
- <glyph unicode="&#xe089;" d="M 177.376,392l 39.312-38.624L 226.744,344L 240,344 l 240,0 l0-288 L 32,56 L 32,392 l 144,0 M 192,424L 32,424 c-17.672,0-32-14.328-32-32l0-336 c0-17.672, 14.328-32, 32-32l 448,0
1165
  c 17.672,0, 32,14.328, 32,32L 512,344 c0,17.672-14.328,32-32,32L 240,376 L 192,424L 192,424z" />
1166
- <glyph unicode="&#xe08a;" d="M 143.992,422.92c 15.688,0, 44.048-7.504, 90.048-52.808l 22.808-22.456l 22.464,22.816C 311.248,402.92, 345.232,423.072, 368,423.072
1167
  c 30.704,0, 54.904-10.504, 78.504-34.048c 22.232-22.184, 34.496-51.68, 34.496-83.056c 0.016-31.392-12.224-60.912-34.704-83.336
1168
  c-1.832-1.856-98.496-106.152-179.48-193.552c-3.816-3.624-8.176-4.16-10.496-4.16c-2.288,0-6.6,0.512-10.4,4.048
1169
  c-19.736,21.952-162.776,181-179.408,197.616C 44.248,248.792, 32,278.312, 32,309.696c 0.008,31.376, 12.256,60.864, 34.52,83.072
@@ -1171,17 +1171,17 @@
1171
  c 16.712-16.72, 178.928-197.168, 178.928-197.168c 9.24-9.248, 21.376-13.84, 33.48-13.84c 12.112,0, 24.2,4.592, 33.456,13.84
1172
  c0,0, 177.44,191.512, 179.328,193.424c 58.52,58.44, 58.52,153.12,0,211.504c-29.056,29-61.512,43.392-101.104,43.392
1173
  c-37.824,0-80-30.16-111.504-62.16C 223.992,424.92, 183.12,454.92, 143.992,454.92L 143.992,454.92z" />
1174
- <glyph unicode="&#xe08b;" d="M 288,112l-16,0 L 272,255 c0,0.168-0.048,0.328-0.048,0.504S 272,255.832, 272,256c0,8.832-7.168,16-16,16l-32,0 c-8.832,0-16-7.168-16-16
1175
  s 7.168-16, 16-16l 16,0 l0-128 l-16,0 c-8.832,0-16-7.168-16-16s 7.168-16, 16-16l 64,0 c 8.832,0, 16,7.168, 16,16S 296.832,112, 288,112z M 256,304c 17.672,0, 32,14.328, 32,32
1176
  s-14.328,32-32,32s-32-14.328-32-32S 238.328,304, 256,304z M 256,480C 114.616,480,0,365.384,0,224c0-141.392, 114.616-256, 256-256c 141.392,0, 256,114.608, 256,256
1177
  C 512,365.384, 397.392,480, 256,480z M 256-0.504C 132.488-0.504, 32,100.488, 32,224S 132.488,448, 256,448s 224-100.488, 224-224S 379.512-0.504, 256-0.504z" />
1178
- <glyph unicode="&#xe08c;" d="M 327.848,480c-79.528,0-144-64.576-144-144.232c0-35.704, 13.016-68.312, 34.472-93.504
1179
  c-4.416,0.272-8.92-1.216-12.296-4.592L 44.832,75.48c-6.24-6.248-6.24-16.384,0-22.624c 0.12-0.12, 0.256-0.192, 0.384-0.312
1180
  c 0.040-0.040, 0.064-0.088, 0.104-0.128l 78.456-79.952c 6.24-6.248, 16.376-6.248, 22.624,0s 6.248,16.384,0,22.624l-67.736,69.032l 41.248,41.504
1181
  l 67.864-69.16c 6.24-6.248, 16.376-6.248, 22.624,0s 6.24,16.384,0,22.624l-67.928,69.224l 86.192,86.736c 3.336,3.336, 4.832,7.768, 4.608,12.136
1182
  c 25.312-22.144, 58.336-35.656, 94.584-35.656c 79.528,0, 144,64.576, 144,144.24C 471.848,415.424, 407.384,480, 327.848,480z M 327.848,224
1183
  c-61.624,0-112,50.136-112,112c0,61.872, 50.376,112, 112,112s 112-50.128, 112-112C 439.848,274.136, 389.48,224, 327.848,224z" />
1184
- <glyph unicode="&#xe08d;" d="M 147.832,113.776c 3.128-3.128, 7.216-4.688, 11.312-4.688s 8.184,1.56, 11.312,4.688L 364.288,309.12
1185
  c 6.248,6.248, 6.248,16.376,0,22.624s-16.376,6.248-22.624,0L 147.832,136.4C 141.576,130.152, 141.576,120.024, 147.832,113.776z M 237.936,147.848
1186
  c 5.288-23.312-0.416-46.2-18.432-64.216l-64.624-62.624c-13.6-13.592-31.68-21.080-50.912-21.080s-37.312,7.488-50.904,21.080
1187
  c-28.072,28.080-28.072,73.768-0.168,101.672l 63.128,65.128c 13.6,13.592, 31.68,21.088, 50.912,21.088c 6.576,0, 12.912-1.176, 19.088-2.872
@@ -1193,34 +1193,34 @@
1193
  c 28.064-28.080, 28.064-73.768, 0.16-101.672l-64.624-64.624c-13.592-13.592-31.688-21.080-50.904-21.080c-4.904,0-9.216-0.496-13.92,0.464
1194
  l-25.488-25.504c 12.736-5.296, 25.816-6.968, 39.408-6.968c 26.608,0, 53.216,10.152, 73.528,30.464l 64.472,64.472
1195
  C 522.176,343.144, 522.176,408.984, 481.568,449.608z" />
1196
- <glyph unicode="&#xe08e;" d="M 400,288l-16,0 l0,61.064 C 384,422.488, 330.872,480, 255.408,480C 179.64,480, 128,421.264, 128,349.064L 128,288 l-16,0
1197
  c-35.296,0-64-28.704-64-64l0-192 c0-35.296, 28.704-64, 64-64l 288,0 c 35.296,0, 64,28.704, 64,64L 464,224 C 464,259.296, 435.296,288, 400,288z M 160,349.064
1198
  C 160,403.608, 197.28,448, 255.408,448C 312.936,448, 352,404.544, 352,349.064L 352,288 L 160,288 L 160,349.064 z M 432,32c0-17.64-14.36-32-32-32L 112,0 c-17.64,0-32,14.36-32,32L 80,224
1199
  c0,17.64, 14.36,32, 32,32l 288,0 c 17.64,0, 32-14.36, 32-32L 432,32 z M 256,192c-17.672,0-32-14.328-32-32c0-11.816, 6.48-22.016, 16-27.56L 240,80 c0-8.832, 7.168-16, 16-16
1200
  s 16,7.168, 16,16l0,52.44 c 9.52,5.544, 16,15.752, 16,27.56C 288,177.672, 273.672,192, 256,192z" />
1201
- <glyph unicode="&#xe08f;" d="M 400,287.448L 171.52,287.448 l-8.28,37.136
1202
  c-14.12,52.688, 10.408,105.216, 66.544,120.256c 55.568,14.888, 104.544-16.968, 118.912-70.56l 6.8-26.984c 2.288-8.536, 11.056-13.6, 19.6-11.312
1203
  c 8.536,2.288, 13.6,11.056, 11.312,19.592l-6.808,26.984C 360.608,453.48, 294.408,495.28, 221.504,475.752C 148.32,456.144, 113.648,386.040, 132.336,316.296
1204
  l 6.432-28.848L 112,287.448 c-35.296,0-64-28.704-64-64l0-192 c0-35.296, 28.704-64, 64-64l 288,0 c 35.296,0, 64,28.704, 64,64l0,192 C 464,258.744, 435.296,287.448, 400,287.448z
1205
  M 432,31.448c0-17.64-14.36-32-32-32L 112-0.552 c-17.64,0-32,14.36-32,32l0,192 c0,17.64, 14.36,32, 32,32l 288,0 c 17.64,0, 32-14.36, 32-32L 432,31.448 z M 256,191.448
1206
  c-17.672,0-32-14.328-32-32c0-11.816, 6.48-22.016, 16-27.56l0-52.44 c0-8.832, 7.168-16, 16-16s 16,7.168, 16,16l0,52.44 c 9.52,5.544, 16,15.752, 16,27.56
1207
  C 288,177.12, 273.672,191.448, 256,191.448z" />
1208
- <glyph unicode="&#xe090;" d="M 507.32-4.52L 351.856,151.896c 28.976,34.704, 46.44,79.352, 46.44,128.104
1209
  c0,110.456-89.544,200-200,200c-110.456,0-200-89.544-200-200c0-110.456, 89.544-200, 200-200c 50.184,0, 96.024,18.528, 131.144,49.072l 155.248-156.224
1210
  c 6.248-6.248, 16.384-6.248, 22.632,0C 513.56-20.904, 513.56-10.776, 507.32-4.52z M 198.296,111.736
1211
  C 105.368,111.736, 30.032,187.072, 30.032,280S 105.368,448.264, 198.296,448.264S 366.56,372.928, 366.56,280S 291.224,111.736, 198.296,111.736z" />
1212
- <glyph unicode="&#xe091;" d="M 507.312-4.52L 365.8,137.864c 30.304,36.2, 48.544,82.88, 48.544,133.856
1213
  C 414.344,386.752, 321.592,480, 206.568,480S-1.704,386.752-1.704,271.728c0-115.024, 93.248-208.272, 208.272-208.272
1214
  c 52.504,0, 100.336,19.48, 136.848,51.536l 141.264-142.152c 6.248-6.248, 16.384-6.248, 22.624,0C 513.56-20.904, 513.56-10.776, 507.312-4.52z
1215
  M 206.296,96c-96.776,0-176,79.224-176,176s 79.224,176, 176,176s 176-79.224, 176-176S 303.072,96, 206.296,96z M 286.296,288l-64,0 l0,64 c0,8.832-7.168,16-16,16
1216
  s-16-7.168-16-16l0-64 l-64,0 c-8.832,0-16-7.168-16-16s 7.168-16, 16-16l 64,0 l0-64 c0-8.832, 7.168-16, 16-16s 16,7.168, 16,16l0,64 l 64,0 c 8.832,0, 16,7.168, 16,16
1217
  S 295.136,288, 286.296,288z" />
1218
- <glyph unicode="&#xe092;" d="M 507.312-4.52L 365.8,137.864c 30.304,36.2, 48.544,82.88, 48.544,133.856
1219
  C 414.344,386.752, 321.592,480, 206.568,480S-1.704,386.752-1.704,271.728c0-115.024, 93.248-208.272, 208.272-208.272
1220
  c 52.504,0, 100.336,19.48, 136.848,51.536l 141.264-142.152c 6.248-6.248, 16.384-6.248, 22.624,0C 513.56-20.904, 513.56-10.776, 507.312-4.52z
1221
  M 206.296,96c-96.776,0-176,79.224-176,176s 79.224,176, 176,176s 176-79.224, 176-176S 303.072,96, 206.296,96z M 286.296,288l-160,0 c-8.832,0-16-7.168-16-16
1222
  s 7.168-16, 16-16l 160,0 c 8.832,0, 16,7.168, 16,16S 295.136,288, 286.296,288z" />
1223
- <glyph unicode="&#xe093;" d="M 86.36-23.816c-21.704,0-42.544,8.984-59.152,25.608C-9.616,38.736-9.616,98.824, 27.2,135.744L 314.336,440.656
1224
  c 44.8,44.872, 113.424,40.84, 163.504-9.304c 22.44-22.48, 35.032-54.888, 34.56-88.952c-0.472-33.704-13.64-65.96-36.144-88.504L 259.248,22.872
1225
  c-6.040-6.472-16.168-6.768-22.616-0.696c-6.432,6.080-6.744,16.224-0.68,22.672l 217.336,231.376c 17,17.032, 26.752,41.192, 27.112,66.624
1226
  c 0.36,25.448-8.832,49.44-25.184,65.832c-30.72,30.784-80.736,46.904-117.92,9.632L 50.168,113.4c-24.688-24.752-24.68-64.504-0.32-88.928
@@ -1229,29 +1229,29 @@
1229
  c-6.44,6.064-6.736,16.224-0.68,22.656l 172.272,183.232c 13.544,13.608, 27.392,20.984, 41.488,22.248c 11,0.976, 27.36-1.368, 44.048-18.104
1230
  c 24.768-24.816, 21.688-61.216-7.64-90.608L 153.592,6.64c-18.24-18.304-40.264-28.936-62.36-30.296
1231
  C 89.608-23.768, 87.984-23.816, 86.36-23.816z" />
1232
- <glyph unicode="&#xe094;" d="M 502.016,480c-3.048,0-6.76-0.864-11.048-2.68L 13.64,274.776c-17.184-7.288-18.272-21.344-2.416-31.224l 134.88-84.016
1233
  c 15.856-9.872, 36.824-31.040, 46.592-47.024l 80.856-132.384c 4.64-7.592, 10.248-11.36, 15.64-11.36c 5.96,0, 11.64,4.576, 15.512,13.616
1234
  L 508.832,459.256C 514.36,472.192, 511.208,480, 502.016,480z M 162.776,188.040L 53.448,256.144L 420.256,411.768L 184.16,171.672
1235
  C 176.944,178.072, 169.616,183.784, 162.776,188.040z M 286.36,22.368l-65.216,106.76c-3.848,6.304-8.928,13.024-14.592,19.696l 237.192,241.192
1236
  L 286.36,22.368z" />
1237
- <glyph unicode="&#xe095;" d="M 256,480C 114.616,480,0,365.384,0,224c0-141.392, 114.616-256, 256-256
1238
  c 141.392,0, 256,114.608, 256,256C 512,365.384, 397.392,480, 256,480z M 256-0.504C 132.488-0.504, 32,100.488, 32,224S 132.488,448, 256,448s 224-100.488, 224-224
1239
  S 379.512-0.504, 256-0.504z M 368,240L 272,240 L 272,336 c0,8.832-7.168,16-16,16s-16-7.168-16-16l0-96 L 144,240 c-8.832,0-16-7.168-16-16s 7.168-16, 16-16l 96,0 l0-96
1240
  c0-8.832, 7.168-16, 16-16s 16,7.168, 16,16L 272,208 l 96,0 c 8.832,0, 16,7.168, 16,16S 376.832,240, 368,240z" />
1241
- <glyph unicode="&#xe096;" d="M 257.832,480.184C 152.88,480.184, 64,390.8, 64,284.912c0-110.88, 103.016-224.272, 172.312-303.968c 0.264-0.32, 11.464-12.76, 25.264-12.76
1242
  l 1.224,0 c 13.8,0, 24.92,12.44, 25.2,12.76c 65.032,74.76, 160,198.024, 160,303.968C 448,390.8, 378.672,480.184, 257.832,480.184z M 264.248,2.408
1243
  c-0.56-0.56-1.376-1.184-2.096-1.704c-0.736,0.504-1.536,1.144-2.128,1.704l-8.368,9.624C 185.96,87.4, 96,190.608, 96,284.912
1244
  c0,88.504, 74.112,163.28, 161.832,163.28C 367.096,448.192, 416,366.192, 416,284.912C 416,213.32, 364.936,118.264, 264.248,2.408z M 256.56,383.296
1245
  c-53.016,0-96-42.984-96-96s 42.984-96, 96-96s 96,42.984, 96,96S 309.576,383.296, 256.56,383.296z M 256.56,223.296
1246
  c-35.288,0-64.736,29.408-64.736,64.704c0,35.288, 28.712,64, 64,64c 35.312,0, 64-28.712, 64-64C 319.84,252.704, 291.872,223.296, 256.56,223.296z" />
1247
- <glyph unicode="&#xe097;" d="M 350.776,397.952c-8,3.728-17.512,0.296-21.264-7.712c-3.76-8-0.296-17.52, 7.704-21.272
1248
  c 81.168-38, 125.248-125.976, 107.176-213.936c-21.456-104.44-123.832-171.904-228.28-150.512c-50.584,10.392-92.104,39.856-120.528,82.968
1249
  c-28.432,43.128-38.368,94.752-27.976,145.336c 12.352,60.112, 51.312,109.664, 106.88,135.952c 7.984,3.776, 11.4,13.312, 7.616,21.304
1250
  c-3.776,7.976-13.296,11.368-21.296,7.616C 96.056,367.064, 50.664,309.328, 36.264,239.264c-12.112-58.968-0.536-119.128, 32.592-169.392
1251
  c 33.136-50.24, 81.848-84.584, 140.816-96.704c 15.216-3.128, 30.408-4.624, 45.376-4.624c 104.728,0, 198.824,73.56, 220.688,180.056
1252
  C 496.792,251.104, 445.408,353.648, 350.776,397.952z M 256.008,272c 8.832,0, 16,7.168, 16,16L 272.008,464 c0,8.832-7.168,16-16,16c-8.832,0-16-7.168-16-16l0-176
1253
  C 240.008,279.168, 247.176,272, 256.008,272z" />
1254
- <glyph unicode="&#xe098;" d="M 248.704,30.72c-0.040,0.096-0.136,0.16-0.192,0.24l-45.96,71.832
1255
  c-3.264,5.36-10.344,7.264-15.864,4.256l-4.096-2.52c-5.504-3-5.384-10.768-2.128-16.128l 29.464-45.704
1256
  c-2.512,0.552-5.048,1-7.528,1.648c-51.592,13.496-95.248,48.416-119.768,95.8c-23.168,44.76-27.52,95.848-12.256,143.872
1257
  c 15.256,48.024, 49.888,87.232, 94.648,110.392c 7.624,3.944, 10.6,13.32, 6.656,20.928c-3.936,7.632-13.32,10.616-20.928,6.664
@@ -1266,7 +1266,7 @@
1266
  c 6.504-1, 12.984-2.208, 19.312-3.88c 51.616-13.52, 93.696-48.432, 118.2-95.784c 23.16-44.76, 27.512-95.848, 12.24-143.864
1267
  c-15.256-48.024-48.328-87.224-93.088-110.408c-7.616-3.944-10.584-13.304-6.64-20.936c 2.76-5.32, 8.168-8.384, 13.8-8.384
1268
  c 2.4,0, 4.832,0.56, 7.136,1.744c 52.136,26.968, 90.624,72.64, 108.408,128.56C 489.008,207.968, 483.936,267.48, 456.952,319.592z" />
1269
- <glyph unicode="&#xe099;" d="M 255.64,480C 127.736,480, 23.68,375.936, 23.68,248.032
1270
  c0-120.224, 92.648-220.768, 211.784-231.048l-45.928-23.28c-5.672-3.112-9.048-10.112-5.688-15.64l 1.624-4.2
1271
  c 3.376-5.528, 10.688-7.488, 16.344-4.392l 76.656,39.248c 0.096,0.064, 0.2,0.048, 0.296,0.112l 5.144,2.816
1272
  c 2.84,1.56, 4.72,4.112, 5.472,6.952c 0.784,2.84, 0.424,6-1.264,8.752l-3.048,5c-0.048,0.096-0.144,0.16-0.2,0.248
@@ -1274,7 +1274,7 @@
1274
  c-0.152,0.008-0.288,0.064-0.432,0.072C 137.64,55.376, 55.68,143.032, 55.68,248.032C 55.68,358.296, 145.384,448, 255.64,448
1275
  c 110.272,0, 200.48-89.704, 200.48-199.968c0-63.488-29.16-121.8-80-159.984c-7.064-5.312-8.488-15.344-3.184-22.408
1276
  c 5.312-7.080, 15.344-8.488, 22.408-3.184c 58.968,44.296, 92.784,111.936, 92.784,185.576C 488.12,375.936, 383.552,480, 255.64,480z" />
1277
- <glyph unicode="&#xe09a;" d="M 480.248,272.472l-41.064,9.112c-3.2,10.24-7.392,20.040-12.2,29.464l 22.216,37.016c 8.296,13.256, 12.488,32.76,0,45.256l-22.64,22.624
1278
  c-12.488,12.496-33.576,10.248-46.312,1.416l-36.016-22.944c-9.344,4.848-19.112,9-29.264,12.28l-9.216,41.56
1279
  C 303,463.496, 289.672,480, 272,480l-32,0 c-17.672,0-28.504-16.752-32-32l-10.264-41.064c-10.84-3.456-21.248-7.872-31.168-13.104l-36.92,23.512
1280
  c-12.728,8.832-33.824,11.080-46.312-1.416l-22.632-22.624c-12.496-12.504-8.304-32,0-45.256l 23.376-38.96
@@ -1298,7 +1298,7 @@
1298
  c 3.576-0.664, 6.36-2.728, 6.952-3.848L 480.016,208.976z M 256.216,320.16c-53.136,0-96.368-43.144-96.368-96.16
1299
  c0-53.008, 43.232-96.152, 96.368-96.152c 53.136,0, 96.368,43.144, 96.368,96.152C 352.584,277.016, 309.352,320.16, 256.216,320.16z M 256,160
1300
  c-35.288,0-64,28.712-64,64c0,35.296, 28.712,64, 64,64c 35.296,0, 64-28.704, 64-64C 320,188.712, 291.288,160, 256,160z" />
1301
- <glyph unicode="&#xe09b;" d="M 256,441.256l 58.472-121.264l 10.264-21.28l 23.392-3.488l 132.912-19.744L 384.112,178.808l-16.28-16.248l 3.808-22.656l 22.64-135.080
1302
  l-117.136,63l-21.168,11.392l-21.168-11.392L 117.68,4.792l 22.648,135.112l 3.792,22.656l-16.28,16.248L 30.952,275.496l 132.912,19.744
1303
  l 23.384,3.488l 10.272,21.272L 256,441.256 M 255.992,472.224c-14.328,0-27.392-8.088-33.488-20.728l-57.952-120.32L 31.2,311.344
1304
  c-13.696-2.048-25.072-11.4-29.488-24.192c-4.408-12.832-1.072-26.952, 8.6-36.576l 97.704-97.6l-22.664-135.328
@@ -1306,13 +1306,13 @@
1306
  l 116.256-62.592c 5.592-2.992, 11.752-4.488, 17.888-4.488c 7.48,0, 14.952,2.208, 21.328,6.576c 11.552,7.976, 17.456,21.648, 15.16,35.288
1307
  l-22.672,135.328l 97.752,97.6c 9.672,9.624, 12.984,23.752, 8.576,36.576c-4.424,12.808-15.8,22.16-29.488,24.192l-133.328,19.832l-57.984,120.32
1308
  C 283.424,464.152, 270.352,472.224, 255.992,472.224L 255.992,472.224z" />
1309
- <glyph unicode="&#xe09c;" d="M 311.848,480.112c-110.456,0-200-89.536-200-200c0-49.256, 17.84-94.336, 47.368-129.184
1310
  l-63.656-64.048l-67.632,68.272c-6.24,6.248-16.376,6.248-22.624,0s-6.248-16.376,0-22.624l 67.696-68.344l-68.176-68.592
1311
  c-6.248-6.248-6.248-16.392,0-22.624c 6.24-6.248, 16.376-6.248, 22.624,0l 68.072,68.496l 68.232-68.88c 6.248-6.248, 16.376-6.248, 22.624,0
1312
  s 6.248,16.376,0,22.624l-68.304,68.952l 63.704,64.096c 34.976-29.984, 80.384-48.144, 130.064-48.144c 110.456,0, 200,89.544, 200,200
1313
  C 511.848,390.576, 422.304,480.112, 311.848,480.112z M 311.848,111.84c-92.928,0-168.264,75.344-168.264,168.272
1314
  c0,92.928, 75.336,168.264, 168.264,168.264s 168.264-75.336, 168.264-168.264C 480.12,187.184, 404.784,111.84, 311.848,111.84z" />
1315
- <glyph unicode="&#xe09d;" d="M 511.648,468.672c 0.072,3.24-0.688,6.144-2.792,8.216
1316
  c-2.072,2.088-4.976,3.36-8.2,3.264l-5.848-0.136c-0.112,0-0.192-0.040-0.32-0.056L 347.736,480.472
1317
  c-6.464-0.144-11.808-5.496-11.96-11.96L 335.76,460.296c 0.984-7.624, 6.976-12.080, 13.44-11.936l 107.608-0.216L 328.736,320.848
1318
  c-34.744,29.12-79.504,46.68-128.384,46.68c-110.464,0-200-89.536-200-200c0-110.456, 89.536-200, 200-200c 110.456,0, 200,89.544, 200,200
@@ -1320,13 +1320,13 @@
1320
  c 6.48,0.152, 11.824,4, 11.96,10.464l 0.336,147.504c0,0.12-0.44,0.2-0.44,0.312L 511.648,468.672z M 368.616,167.528
1321
  c0-92.928-75.336-168.264-168.272-168.264c-92.928,0-168.264,75.336-168.264,168.264s 75.336,168.264, 168.264,168.264
1322
  C 293.28,335.8, 368.616,260.464, 368.616,167.528z" />
1323
- <glyph unicode="&#xe09e;" d="M 496,240l-48.72,0 C 439.584,333.264, 365.256,407.52, 272,415.232L 272,464 c0,8.832-7.168,16-16,16
1324
  s-16-7.168-16-16l0-48.768 C 146.752,407.52, 72.416,333.264, 64.712,240L 16,240 c-8.832,0-16-7.168-16-16s 7.168-16, 16-16l 48.712,0
1325
  C 72.416,114.744, 146.752,40.48, 240,32.768L 240-16 c0-8.832, 7.168-16, 16-16s 16,7.168, 16,16l0,48.768 C 365.256,40.48, 439.584,114.744, 447.28,208L 496,208
1326
  c 8.832,0, 16,7.168, 16,16S 504.832,240, 496,240z M 240,383.208L 240,240 L 96.776,240 C 104.28,315.6, 164.4,375.704, 240,383.208z M 96.776,208L 240,208 l0-143.208
1327
  C 164.4,72.296, 104.28,132.4, 96.776,208z M 272,64.792L 272,208 l 143.224,0 C 407.72,132.4, 347.6,72.296, 272,64.792z M 272,240L 272,383.208
1328
  C 347.6,375.704, 407.72,315.6, 415.224,240L 272,240 z" />
1329
- <glyph unicode="&#xe09f;" d="M 327.384,447.048c-5.216,2.776-11.544,2.464-16.456-0.848L 150.384,320.144l-53.312-0.040c-27.256,0-49.44-19.328-49.44-43.2
1330
  l 0.856-105.568c0-23.768, 22.176-43.112, 49.432-43.112l 53.296-0.032l 159.696-126.376c 2.688-1.816, 5.816-2.736, 8.952-2.736
1331
  c 2.576,0, 5.16,0.624, 7.504,1.872c 5.232,2.768, 8.504,8.2, 8.504,14.128L 335.872,432.92 C 335.864,438.832, 332.6,444.264, 327.384,447.048z
1332
  M 303.864,45.184l-138.8,112.264c-2.64,1.784-5.76,2.736-8.944,2.736l-58.192,0.032c-10.272,0-17.44,5.856-17.44,11.232L 79.632,277.024
@@ -1334,7 +1334,7 @@
1334
  c-8.856,1.464-16.968-4.432-18.424-13.152c-1.456-8.712, 4.44-16.96, 13.144-18.416c 25.16-4.2, 42.736-26.152, 42.736-53.376
1335
  c0-25.92-18.184-48.344-43.248-53.344c-8.672-1.72-14.296-10.144-12.56-18.816c 1.512-7.608, 8.184-12.872, 15.672-12.872
1336
  c 1.032,0, 2.096,0.096, 3.144,0.312c 39.984,7.952, 69,43.592, 69,84.72C 464.368,263.752, 435.152,299.472, 394.912,306.184z" />
1337
- <glyph unicode="&#xe0a0;" d="M 287.248,447.048c-5.216,2.776-11.544,2.464-16.456-0.848L 110.248,320.144l-53.312-0.040c-27.256,0-49.44-19.328-49.44-43.2
1338
  l 0.856-105.568c0-23.768, 22.176-43.112, 49.432-43.112l 53.296-0.032l 159.696-126.376c 2.688-1.816, 5.816-2.736, 8.952-2.736
1339
  c 2.576,0, 5.16,0.624, 7.504,1.872c 5.232,2.768, 8.504,8.2, 8.504,14.128L 295.736,432.92 C 295.736,438.832, 292.472,444.264, 287.248,447.048z
1340
  M 263.736,45.184l-138.8,112.264c-2.64,1.784-5.76,2.736-8.944,2.736l-58.192,0.032c-10.272,0-17.44,5.856-17.44,11.232L 39.504,277.024
@@ -1346,7 +1346,7 @@
1346
  c 48.264-18.008, 80.688-64.952, 80.688-116.816c0-51.888-32.424-98.92-80.656-117c-8.28-3.112-12.472-12.328-9.376-20.592
1347
  c 2.408-6.44, 8.504-10.392, 14.984-10.392c 1.872,0, 3.768,0.328, 5.608,1.016c 60.672,22.752, 101.44,81.816, 101.44,146.968
1348
  C 504.504,286.4, 463.704,345.392, 403,368.048z" />
1349
- <glyph unicode="&#xe0a1;" d="M 287.768,447.048c-5.216,2.776-11.544,2.464-16.456-0.848L 110.76,320.144l-53.312-0.040
1350
  c-27.256,0-49.44-19.328-49.44-43.2l 0.856-105.568c0-23.768, 22.176-43.112, 49.432-43.112l 53.296-0.032l 159.696-126.376
1351
  c 2.688-1.816, 5.816-2.736, 8.952-2.736c 2.576,0, 5.16,0.624, 7.504,1.872c 5.232,2.768, 8.504,8.2, 8.504,14.128L 296.248,432.92
1352
  C 296.248,438.832, 292.984,444.264, 287.768,447.048z M 264.248,45.184l-138.8,112.264c-2.64,1.784-5.76,2.736-8.944,2.736l-58.192,0.032
@@ -1354,7 +1354,7 @@
1354
  l 139.664,112L 264.248,45.184 z M 447,223.744l 52.296,52.92c 6.248,6.248, 6.248,16.376,0,22.624c-6.232,6.248-16.376,6.248-22.624,0l-52.168-52.784
1355
  l-52.168,52.784c-6.232,6.248-16.376,6.248-22.624,0s-6.248-16.376,0-22.624l 52.296-52.92l-51.8-52.408c-6.232-6.24-6.248-16.376,0-22.624
1356
  s 16.392-6.248, 22.64,0l 51.656,52.272l 51.656-52.272c 6.248-6.248, 16.376-6.248, 22.624,0s 6.248,16.384,0,22.624L 447,223.744z" />
1357
- <glyph unicode="&#xe001;" d="M 373,62.36L 272.264,118.16c 37.44,29.456, 47.608,87.344, 47.608,119.8l0,67.56 c0,44.736-59.44,94.56-119.144,94.56
1358
  c-59.688,0-120.704-49.832-120.704-94.56l0-67.56 c0-29.512, 12.488-89.216, 50.312-119.544L 27,62.36c0,0-27-12.032-27-27.032l0-40.544
1359
  c0-14.92, 12.112-27.032, 27-27.032l 346,0 c 14.904,0, 27.016,12.112, 27.016,27.032l0,40.544 C 400.016,51.232, 373,62.36, 373,62.36z
1360
  M 368.016-0.248L 32-0.248 l0,28.608 c 2.296,1.672, 5.504,3.608, 8.032,4.768c 0.752,0.344, 1.504,0.704, 2.216,1.112l 103.344,56.048
@@ -1367,7 +1367,7 @@
1367
  c-8.456-6.656-13-17.112-12.112-27.832c 0.904-10.72, 7.128-20.264, 16.56-25.424l 102.232-55.8c 0.888-0.488, 2.016-1.016, 2.952-1.424
1368
  c 2.36-1, 5.264-2.672, 7.392-4.144l0-28.456 l-64.592,0 c 9.752-7.36, 12.704-17.888, 16.488-32l 53.096,0 c 14.904,0, 27.016,12.112, 27.016,27.032l0,40.048
1369
  C 512,130.904, 484.984,142.032, 484.984,142.032z" />
1370
- <glyph unicode="&#x20;" horiz-adv-x="256" />
1371
  </font>
1372
  </defs>
1373
  </svg>
9
  </metadata>
10
  <defs>
11
  <font id="Simple-Line-Icons" horiz-adv-x="512" >
12
+ <font-face units-per-em="512" ascent="480" descent="-32" />
13
+ <missing-glyph horiz-adv-x="512" />
14
+ <glyph class="hidden" unicode="&#xf000;" d="M0,480L 512 -32L0 -32 z" horiz-adv-x="0" />
15
+ <glyph unicode="&#xe000;" d="M 480.016,78.656l-139.248,66.032c 18.576,9.312, 91.128,12.264, 97.128,28.64c0,0-28.672,44.008-35.672,101.168
16
  c-2.72,22.184-7.376,51.296-12,92.296C 382.72,433.296, 326.784,480, 256.128,480C 256.088,480, 256.040,480, 256,480c-0.048,0-0.096,0-0.128,0
17
  C 185.216,480, 129.28,433.296, 121.784,366.8c-4.624-41-9.28-70.112-12-92.296c-7-57.168-35.672-101.168-35.672-101.168
18
  c 6-16.376, 78.544-19.328, 97.128-28.64L 31.984,78.656c0,0-31.984-11.232-31.984-37.736l0-42.264 C0-19.032, 14.312-32, 31.984-32l 448.032,0
24
  c 1.408-10.088, 2.672-19.2, 3.656-27.296c 3.984-32.512, 14.112-61.256, 23.264-81.816c-7.064-1.408-14.344-2.72-19.672-3.656
25
  c-22.456-3.888-36.784-6.576-47.624-12.016c-10.936-5.488-17.784-16.736-17.656-28.968c 0.144-12.232, 7.232-23.344, 18.296-28.576l 139.248-66.032
26
  c 1-0.488, 1.656-0.784, 2.72-1.16c 4.92-1.872, 10.248-5.968, 10.968-7.672L 480.016,0L 32,0 z" />
27
+ <glyph unicode="&#xe002;" d="M 32.032,32.656c0,12.72, 9.544,16.704, 13.36,18.472l 140.52,66.312
28
  c 10.072,4.624, 17.024,14.16, 18.376,25.16c 1.36,11-3.080,21.92-11.728,28.856c-33.24,26.688-48.728,85.344-48.728,116.592L 143.832,368
29
  c0,33.432, 58.2,79.928, 112.064,79.928c 54.336,0, 111.96-45.768, 111.96-79.928l0-79.96 c0-30.776-12.8-89.656-47.128-116.68
30
  c-8.752-6.888-13.296-17.84-11.984-28.904c 1.312-11.080, 8.296-20.656, 18.424-25.312l 47.96-22.752l 7.904,31.936l-42.504,19.888
32
  c0-34.936, 15.944-105.624, 60.696-141.544L 32.008,80.184c0,0-31.976-14.248-31.976-31.984l0-48.016 c0-17.672, 14.32-31.984, 31.976-31.984l 351.96,0 l0,32
33
  L 32.032,0.184L 32.032,32.656 z M 495.968,64.064l-48,0 l0,48 c0,8.84-7.168,16-16,16s-16-7.16-16-16l0-48 l-48,0 c-8.832,0-16-7.16-16-16c0-8.832, 7.168-16, 16-16l 48,0 l0-48
34
  c0-8.832, 7.168-16, 16-16s 16,7.168, 16,16l0,48 l 48,0 c 8.832,0, 16,7.168, 16,16C 511.968,56.904, 504.808,64.064, 495.968,64.064z" />
35
+ <glyph unicode="&#xe003;" d="M 31.752,0.12l0,32.472 c0,12.72, 9.552,16.712, 13.36,18.472l 140.52,66.312
36
  c 10.072,4.624, 17.024,14.16, 18.376,25.16c 1.36,11-3.080,21.92-11.728,28.856c-33.24,26.688-48.728,85.352-48.728,116.592l0,79.96
37
  c0,33.432, 58.2,79.928, 112.064,79.928c 54.336,0, 111.968-45.768, 111.968-79.928l0-79.96 c0-30.776-12.8-89.656-47.128-116.688
38
  c-8.752-6.888-13.296-17.84-11.984-28.904c 1.312-11.080, 8.296-20.656, 18.424-25.312l 81.12-38.624l 19.072,27.032l-86.832,40.672
41
  l-26,31.992L 31.752,0.12z M 506.104,118.248c-6.952,5.456-17.016,4.216-22.456-2.736l-68.424-104.352l-42.528,42.536
42
  c-6.248,6.248-16.384,6.248-22.632,0s-6.248-16.376,0-22.624l 56.568-56.568c 6.248-6.248, 16.376-6.248, 22.624,0
43
  c 1.52,1.512, 2.656,3.272, 3.44,5.144l 76.152,116.152C 514.288,102.752, 513.064,112.808, 506.104,118.248z" />
44
+ <glyph unicode="&#xe004;" d="M 399.56,288.072l0,79.96 c0,52.96-73.304,111.928-143.952,111.928c-70.656,0-144.064-58.968-144.064-111.928l0-79.96
45
  c0-34.936, 15.944-105.616, 60.696-141.536L 31.72,80.216c0,0-31.976-14.248-31.976-31.984l0-48.016 c0-17.672, 14.32-31.984, 31.976-31.984l 303.968,0 l0,32
46
  L 31.744,0.216l0,32.472 c0,12.72, 9.552,16.712, 13.36,18.472l 140.52,66.312c 10.072,4.624, 17.024,14.168, 18.376,25.168
47
  c 1.36,11-3.080,21.912-11.728,28.848c-33.24,26.688-48.728,85.344-48.728,116.6l0,79.96 c0,33.432, 58.2,79.928, 112.064,79.928
51
  c-6.248,6.24-16.384,6.24-22.624,0c-6.248-6.248-6.248-16.392,0-22.624l 45.248-45.256l-45.248-45.248c-6.248-6.24-6.248-16.384,0-22.632
52
  c 6.24-6.232, 16.376-6.232, 22.624,0l 45.248,45.256l 45.256-45.256c 6.24-6.232, 16.376-6.232, 22.616,0c 6.248,6.248, 6.248,16.392,0,22.632
53
  L 462.312,40.6z" />
54
+ <glyph unicode="&#xe006;" d="M 367.904,16.064L 142.936,16.064 c-8.84,0-16-7.16-16-16s 7.16-16, 16-16l 224.968,0 c 8.84,0, 16,7.16, 16,16S 376.752,16.064, 367.904,16.064z
55
  M 508.656,419.184c-1.512,7.44-8.080,12.784-15.672,12.784l-78.312,0 L 414.672,447.936 c0,8.84-7.16,16-16,16L 110.904,463.936 c-8.84,0-16-7.16-16-16l0-15.968 L 19.016,431.968
56
  c-7.592,0-14.16-5.344-15.672-12.784c-0.472-2.312-11.2-58.376, 19.952-96.576c 17.92-21.96, 45.304-33.464, 81.248-34.488
57
  C 125.040,227.544, 176.576,182.688, 238.64,176l0-111.456 l-47.888,0 c-8.84,0-16-7.16-16-16s 7.16-16, 16-16l 129.344,0 c 8.84,0, 16,7.16, 16,16s-7.16,16-16,16
60
  c0-8.648, 0.8-17.080, 1.968-25.384C 75.032,322.608, 58.648,329.984, 48.2,342.72z M 382.672,345.952c0-76.544-57.36-138.832-127.856-138.832
61
  c-70.528,0-127.904,62.28-127.904,138.832L 126.912,431.936 l 255.768,0 L 382.68,345.952 z M 463.8,342.72c-10.84-13.216-28.016-20.744-51.136-22.432
62
  c 1.192,8.392, 2.008,16.92, 2.008,25.664l0,54.016 l 64,0 C 479.392,385.408, 477.968,359.968, 463.8,342.72z" />
63
+ <glyph unicode="&#xe010;" d="M 352.072,480L 159.928,480 c-26.512,0-48-21.488-48-48l0-416 c0-26.512, 21.488-48, 48-48l 192.144,0
64
  c 26.512,0, 48,21.488, 48,48L 400.072,432 C 400.072,458.512, 378.584,480, 352.072,480z M 368.072,16c0-8.832-7.168-16-16-16L 159.928,0 c-8.832,0-16,7.168-16,16L 143.928,432
65
  c0,8.832, 7.168,16, 16,16l 192.144,0 c 8.832,0, 16-7.168, 16-16L 368.072,16 z M 256.024,79.912c-17.64,0-31.92-14.296-31.92-31.912s 14.288-31.92, 31.92-31.92
66
  c 17.64,0, 31.92,14.304, 31.92,31.92S 273.664,79.912, 256.024,79.912z M 288.024,432l-64,0 c-8.832,0-16-7.168-16-16s 7.168-16, 16-16l 64,0
67
  c 8.832,0, 16,7.168, 16,16S 296.856,432, 288.024,432z" />
68
+ <glyph unicode="&#xe011;" d="M 480,432.096L 32,432.096 c-17.592,0-32-14.4-32-32L0,128 c0-17.592, 14.408-31.992, 32-31.992l 208,0 l0-48.104 L 160,47.904
69
  c-8.832,0-16-7.168-16-16s 7.168-16, 16-16l 192,0 c 8.832,0, 16,7.168, 16,16s-7.168,16-16,16L 272,47.904 l0,48.104 l 208,0 c 17.592,0, 32,14.4, 32,31.992L 512,400.096
70
  C 512,417.696, 497.592,432.096, 480,432.096z M 480,128L 32,128 L 32,400.096 l 448,0 L 480,128 z" />
71
+ <glyph unicode="&#xe012;" d="M 467.16,447.048L 467.16,447.048c 5.216,0, 8.888-0.968, 10.8-1.704c 2.296-6.112, 5.376-28.016-17.264-50.672L 355.36,289.344l-10.16-10.16
72
  l 0.832-14.328c 1.752-29.984, 5-83.72, 7.8-129.784c 2.472-41, 4.816-79.72, 4.968-83.016c 0.080-2.264, 0.112-2.8-2-5.344
73
  c-4.72-5.736-13.528-15.456-20.952-23.512c-11.512,31.016-35.704,96.528-49.064,133.2l-17.168,47.184l-35.512-35.512L 168.8,105.28l-9.096-9.080
74
  l-0.28-12.84c-0.216-10.248-0.168-28.64-0.144-44.856c 0.032-11.296, 0.064-21.56-0.016-27.216c-0.144-0.264, 2.184-0.576, 1.968-0.952
88
  c 0.688-0.080, 1.392-0.112, 2.080-0.112c 6.312,0, 12.856,2.968, 18.216,8.328c0,0, 23.128,24.544, 32.952,36.488
89
  c 9.84,11.936, 9.456,22.128, 9.264,26.936c-0.080,3.328-9.344,154.408-12.784,213.408l 105.328,105.328c 37.328,37.344, 31.392,82.344, 17.528,96.184
90
  C 494.688,474.392, 482.296,479.048, 467.16,479.048L 467.16,479.048z" />
91
+ <glyph unicode="&#xe013;" d="M 424.576,480L 105.576,480 C 82.576,480, 72.56,463, 72.56,447l0-63.656 L 55.096,383.344 c-8.656,0-15.672-7.016-15.672-15.672S 46.44,352, 55.096,352L 72.56,352
92
  l0-64.376 L 56.592,287.624 c-8.656,0-15.672-7.016-15.672-15.672s 7.016-15.672, 15.672-15.672L 72.56,256.28 l0-64.72 L 56.248,191.56 c-8.656,0-15.672-7.016-15.672-15.672
93
  s 7.016-15.672, 15.672-15.672L 72.56,160.216 l0-64.232 L 56.248,95.984 c-8.656,0-15.672-7.016-15.672-15.672s 7.016-15.672, 15.672-15.672L 72.56,64.64 L 72.56,0
94
  c0-26.512, 20.768-32, 32.264-32l 319.752,0 c 26.512,0, 48,21.488, 48,48L 472.576,432 C 472.576,458.512, 451.096,480, 424.576,480z M 104.56,0l0,64.64 l 16.672,0
96
  s-7.016,15.672-15.672,15.672L 104.56,191.56 l0,64.72 l 17.016,0 c 8.656,0, 15.672,7.016, 15.672,15.672s-7.016,15.672-15.672,15.672L 104.56,287.624 L 104.56,352 l 15.512,0
97
  c 8.656,0, 15.672,7.016, 15.672,15.672s-7.016,15.672-15.672,15.672L 104.56,383.344 L 104.56,447 c0,0.376, 0.032,0.688, 0.080,0.968
98
  C 104.888,447.984, 105.2,448, 105.576,448l 255,0 l0-448 L 104.56,0 z M 440.576,16c0-8.832-7.168-16-16-16l-32,0 L 392.576,448 l 32,0 c 8.832,0, 16-7.168, 16-16L 440.576,16 z" />
99
+ <glyph unicode="&#xe014;" d="M 396.424,111.64c-50.672,0-79.432,23.816-98.472,39.576c-6.736,5.576-12.864,10.952-18.44,15.832
100
  c-8.456,7.424-19,16.672-22.672,17.952c-0.112,0-1.856,0.080-1.968,0.096c-0.584-0.048-2.072-0.344-2.224-0.36
101
  c-2.536-1.032-11.544-8.784-18.784-15c-6.568-5.64-14.056-12.080-22.52-18.688l-1.544-1.184c-21.736-16.968-48.792-38.080-96.576-38.080
102
  c-35.496,0-70.464,16.064-91.288,41.936c-13.96,17.344-28.648,47.512-19.336,92.736c 1.128,5.472, 5.008,9.952, 10.216,11.816
114
  c-13.696-6.096-27.552-9.184-41.152-9.184c-10.2,0-19.032,1.704-26.312,4.016c-0.016-17.36, 5.056-32.456, 15.168-45.016
115
  c 14.968-18.576, 40.52-30.128, 66.72-30.128c 37,0, 57.448,15.968, 77.232,31.408L 192,176.392c 8.024,6.264, 15.12,12.376, 21.344,17.72
116
  c 14.256,12.248, 23.664,20.344, 33.824,22.144l0,0C 247.176,216.248, 252.016,217.064, 255.368,217.064z" />
117
+ <glyph unicode="&#xe015;" d="M 256.792,480c-79.064,0-144.752-64.112-144.752-143.168l0-225.656
118
  C 112.040,32.112, 177.728-32, 256.792-32s 143.176,64.112, 143.176,143.168L 399.968,336.832 C 399.968,415.888, 335.856,480, 256.792,480z M 367.968,111.168
119
  C 367.968,49.872, 318.096,0, 256.792,0s-112.752,49.872-112.752,111.168L 144.040,336.832 C 144.040,398.128, 195.496,448, 256.792,448
120
  s 111.176-49.872, 111.176-111.168L 367.968,111.168 z M 256.168,384c-8.832,0-16-7.168-16-16l0-80 c0-8.832, 7.168-16, 16-16c 8.832,0, 16,7.168, 16,16L 272.168,368
121
  C 272.168,376.832, 265,384, 256.168,384z" />
122
+ <glyph unicode="&#xe016;" d="M 480.144,449.912L 480.144,464.416 c0,8.84-7.16,16-16,16L 351.832,480.416 c-8.84,0-16-7.16-16-16l0-65.328
123
  c0-0.024, 0.016-0.048, 0.016-0.072l0-198.76 c0-48.16-27.168-87.328-75.328-87.328s-84.328,39.168-84.328,87.328L 176.192,449.912 l-0.048,0 L 176.144,464.416
124
  c0,8.84-7.16,16-16,16L 47.832,480.416 c-8.84,0-16-7.16-16-16l0-65.328 c0-0.328, 0.168-0.6, 0.184-0.92l0-205.248
125
  c0-124.456, 99.392-225.328, 223.832-225.328s 224.328,100.872, 224.328,225.328L 480.176,449.912 L 480.144,449.912 z M 448.144,448.416l0-64.168 L 368.016,384.248 L 368.016,448.416 L 448.144,448.416 z
126
  M 144.144,448.416l0-64.168 L 64.016,384.248 L 64.016,448.416 L 144.144,448.416 z M 255.84-0.416c-106.608,0-191.832,86.736-191.832,193.328L 64.008,352.248 l 80.168,0 l0-151.992
127
  c0-65.904, 50.424-119.328, 116.328-119.328S 367.84,134.352, 367.84,200.256L 367.84,352.248 l 80.328,0 l0-159.336 C 448.168,86.32, 362.456-0.416, 255.84-0.416z" />
128
+ <glyph unicode="&#xe020;" d="M 297.672,447.64l 0.088,0 M 297.672,447.64l-36.104-189.688l 130.792-0.44L 214.328,0.36l 36.104,208.688l-130.784,0.456L 297.672,447.64
129
  M 297.696,479.64c-0.864,0-1.728-0.032-2.576-0.096c-5.648-0.456-9.392-2.344-13.832-5.328c-2.464-1.64-4.72-3.64-6.696-5.968
130
  c-0.584-0.688-1.136-1.408-1.648-2.144L 93.64,228.8c-7.080-9.704-8.12-22.512-2.68-33.216c 5.432-10.704, 16.416-17.488, 28.456-17.576
131
  l 92.368-0.672l-29.040-171.096c-2.76-14.704, 5.080-29.36, 18.88-35.264c 4.112-1.768, 8.432-2.608, 12.696-2.608c 10.056,0, 18.32,4.704, 24.52,13.2
132
  L 418.368,238.72c 7.080,9.704, 8.112,22.528, 2.68,33.216c-5.432,10.704-16.416,17.488-28.456,17.576l-92.368,0.16l 28.728,150.44
133
  c 0.6,2.424, 0.912,4.936, 0.912,7.528c0,17.312-13.784,31.424-31.032,31.984C 298.448,479.64, 298.072,479.64, 297.696,479.64L 297.696,479.64z" />
134
+ <glyph unicode="&#xe021;" d="M 390.632,176.424c-8.128,3.64-17.544-0.032-21.128-8.096c-0.328-0.712-33.064-72.104-114.72-73.064
135
  c-0.504,0-1-0.016-1.504-0.016c-76.832,0-109.968,70.184-111.344,73.2c-3.656,8-13.096,11.56-21.16,7.936
136
  c-8.048-3.64-11.624-13.104-7.984-21.168c 1.704-3.784, 42.688-91.968, 140.424-91.968c 0.64,0, 1.296,0.016, 1.936,0.016
137
  c 101.936,1.2, 141.92,88.328, 143.56,92.032C 402.336,163.376, 398.696,172.832, 390.632,176.424z M 256,480C 114.608,480,0,365.392,0,224
139
  M 175.752,240.088c 17.632,0, 31.92,14.296, 31.92,31.912s-14.288,31.912-31.92,31.912c-17.64,0-31.92-14.296-31.92-31.912
140
  S 158.112,240.088, 175.752,240.088z M 335.752,240.088c 17.632,0, 31.92,14.296, 31.92,31.912s-14.288,31.912-31.92,31.912
141
  c-17.64,0-31.92-14.296-31.92-31.912S 318.112,240.088, 335.752,240.088z" />
142
+ <glyph unicode="&#xe022;" d="M 256,480C 114.608,480,0,365.392,0,224s 114.608-256, 256-256s 256,114.608, 256,256S 397.392,480, 256,480z M 480,224c0-33.16-7.296-64.632-20.28-92.968
143
  l-141.608,75.776c 1.512,5.488, 2.392,11.232, 2.392,17.192c0,35.624-28.872,64.504-64.504,64.504c-7.312,0-14.312-1.272-20.856-3.512
144
  L 150.336,421.448C 181.832,438.368, 217.808,448, 256,448C 379.512,448, 480,347.512, 480,224z M 256,256.496c 17.92,0, 32.504-14.576, 32.504-32.504
145
  S 273.92,191.496, 256,191.496S 223.504,206.080, 223.504,224S 238.080,256.496, 256,256.496z M 123.288,404.312l 85.088-136.92
147
  c0,31.84, 6.72,62.128, 18.752,89.584l 142.184-76.080c-0.928-4.36-1.44-8.864-1.44-13.504c0-35.624, 28.872-64.504, 64.504-64.504
148
  c 6.2,0, 12.176,0.92, 17.848,2.552l 85.096-136.896C 328.104,9.128, 293.112,0, 256,0C 132.488,0, 32,100.488, 32,224z M 386.224,41.92
149
  L 301.472,178.264c 0.248,0.248, 0.48,0.512, 0.728,0.768l 142.144-76.072C 428.968,79.144, 409.224,58.416, 386.224,41.92z" />
150
+ <glyph unicode="&#xe023;" d="M 508.2,231.68l-4.24,4.040c-0.080,0.080-0.168,0.112-0.264,0.184l-64.872,59.216
151
  c-4.672,4.472-12.224,4.472-16.912,0l-2.744-4.032c-4.672-4.472-3.152-11.704, 1.52-16.168l 38.232-34.672L 273.248,240.248 L 273.248,426.92 l 34.672-38.232
152
  c 4.472-4.672, 11.704-6.192, 16.168-1.512l 4.032,2.736c 4.472,4.688, 4.472,12.24,0,16.92l-56.584,61.984
153
  c-1.376,2.776-3.504,5.072-6.16,6.648l-0.712,0.744c-2.216,2.336-5.168,3.504-8.112,3.488c-2.952,0.016-5.888-1.152-8.144-3.488
162
  c-4.472,4.672-11.704,3.152-16.168-1.52l-34.672-38.232L 273.256,208.248 L 460.24,208.248 l-38.552-34.576c-4.672-4.472-6.184-11.72-1.512-16.184l 2.736-4.032
163
  c 4.688-4.464, 12.248-4.464, 16.912,0l 63.872,57.752c 0.088,0.088, 0.184,0.096, 0.264,0.168l 4.24,4.048
164
  c 2.336,2.248, 3.504,5.184, 3.488,8.144C 511.704,226.496, 510.536,229.456, 508.2,231.68z" />
165
+ <glyph unicode="&#xe024;" d="M 496,80l-64,0 L 432,376.952 l 59.728,59.648c 6.24,6.248, 6.24,16.384,0,22.632c-6.248,6.248-16.384,6.248-22.632,0L 409.792,400L 112,400 L 112,464
166
  c0,8.84-7.16,16-16,16s-16-7.16-16-16l0-64 L 16,400 c-8.84,0-16-7.16-16-16c0-8.832, 7.16-16, 16-16l 64,0 l0-304 c0-1.472, 0.472-2.8, 0.84-4.144
167
  c 0.16-0.608, 0.128-1.232, 0.36-1.816c 1.608-4.032, 4.8-7.216, 8.832-8.84c 0.688-0.28, 1.44-0.248, 2.144-0.424
168
  C 93.44,48.456, 94.64,48, 96,48l 304,0 l0-64 c0-8.84, 7.16-16, 16-16s 16,7.16, 16,16l0,64 l 64,0 c 8.84,0, 16,7.16, 16,16S 504.84,80, 496,80z M 377.744,368
169
  L 112,102.608L 112,368 L 377.744,368 z M 134.64,80L 400,344.992L 400,80 L 134.64,80 z" />
170
+ <glyph unicode="&#xe025;" d="M 464.072,392L 47.928,392 c-26.512,0-48-21.488-48-48l0-240 c0-26.512, 21.488-48, 48-48l 416.144,0
171
  c 26.512,0, 48,21.488, 48,48L 512.072,344 C 512.072,370.512, 490.584,392, 464.072,392z M 47.928,360l 416.144,0 c 8.832,0, 16-7.168, 16-16l0-32 L 31.928,312 l0,32
172
  C 31.928,352.832, 39.104,360, 47.928,360z M 464.072,88L 47.928,88 c-8.832,0-16,7.168-16,16L 31.928,248 l 448.144,0 l0-144 C 480.072,95.168, 472.896,88, 464.072,88z" />
173
+ <glyph unicode="&#xe026;" d="M 405.208-5.36l-85.2,100.832L 320.008,272.224 l 10.656,0 c 8.84,0, 16,7.16, 16,16s-7.16,16-16,16l-26.656,0 c-8.84,0-16-7.16-16-16l0-198.912
174
  c0-3.968, 1.472-7.784, 4.128-10.72l 65.184-78.672l-202.64,0 l 65.184,78.672c 2.656,2.936, 4.128,6.752, 4.128,10.72L 223.992,288.224 c0,8.84-7.16,16-16,16
175
  l-26.656,0 c-8.84,0-16-7.16-16-16s 7.16-16, 16-16l 10.656,0 l0-176.752 L 106.792-5.36c-4.232-4.688-5.312-11.44-2.752-17.216
176
  c 2.576-5.784, 8.296-9.504, 14.624-9.504l 274.672,0 c 6.328,0, 12.048,3.72, 14.624,9.504C 410.52-16.8, 409.448-10.048, 405.208-5.36z M 240,320.16
178
  C 208.080,334.456, 222.36,320.16, 240,320.16z M 344.24,367.656c 31.184,0, 56.464,25.168, 56.464,56.208s-25.272,56.208-56.464,56.208
179
  c-31.176,0-56.464-25.168-56.464-56.208S 313.064,367.656, 344.24,367.656z M 343.992,448.168c 13.328,0, 24.168-10.792, 24.168-24.064
180
  c0-13.264-10.84-24.064-24.168-24.064s-24.168,10.8-24.168,24.064C 319.832,437.376, 330.664,448.168, 343.992,448.168z" />
181
+ <glyph unicode="&#xe005;" d="M 255.864,448c 54.336,0, 111.96-45.768, 111.96-79.928l0-79.96 c0-30.776-12.8-89.656-47.128-116.688c-8.752-6.888-13.296-17.84-11.984-28.904
182
  c 1.312-11.080, 8.296-20.656, 18.424-25.312l 139.248-66.032c 1.088-0.496, 13.344-2.552, 13.344-19.672l 0.016-31.232L 32,0.248L 32,32.72
183
  c0,12.72, 9.544,16.712, 13.36,18.472l 140.512,66.312c 10.080,4.624, 17.032,14.16, 18.384,25.16c 1.36,11-3.080,21.92-11.728,28.856
184
  c-33.24,26.688-48.728,85.352-48.728,116.592l0,79.96 C 143.808,401.496, 202.008,448, 255.864,448 M 255.864,480c-70.656,0-144.064-58.968-144.064-111.928
185
  l0-79.96 c0-34.936, 15.944-105.624, 60.696-141.544L 31.976,80.248c0,0-31.976-14.248-31.976-31.984l0-48.016 c0-17.672, 14.32-31.984, 31.976-31.984l 447.776,0
186
  c 17.672,0, 31.984,14.312, 31.984,31.984l0,48.016 c0,18.8-31.984,31.984-31.984,31.984l-139.248,66.032c 44.328,34.888, 59.328,103.424, 59.328,141.832
187
  l0,79.96 C 399.832,421.032, 326.512,480, 255.864,480L 255.864,480z" />
188
+ <glyph unicode="&#xe007;" d="M 255.992,461.936C 115.008,461.936, 0.32,347.232, 0.32,206.248
189
  c0-88.576, 44.84-169.592, 119.952-216.704c 7.472-4.736, 17.344-2.44, 22.048,5.048s 2.44,17.36-5.048,22.048
190
  c-27.048,16.976-49.52,39.024-66.712,64.44l 16.776,9.688c 7.656,4.424, 10.28,14.2, 5.856,21.856c-4.44,7.672-14.232,10.28-21.856,5.856
191
  l-16.8-9.696c-12.2,25.256-19.648,52.896-21.64,81.712l 17.808,0 c 8.84,0, 16,7.16, 16,16s-7.16,16-16,16L 32.976,222.496
202
  M 374.056,256.136c 7.648,4.424, 10.272,14.2, 5.856,21.856c-4.416,7.648-14.208,10.272-21.856,5.848l-86.912-50.176
203
  c-4.64,2.624-9.928,4.248-15.64,4.248c-17.64,0-31.92-14.296-31.92-31.904c0-17.624, 14.288-31.92, 31.92-31.92c 17.64,0, 31.92,14.296, 31.92,31.92
204
  c0,0.032-0.008,0.072-0.008,0.104L 374.056,256.136z" />
205
+ <glyph unicode="&#xe008;" d="M 470.368,385.152c-13.872,9.984-52.528,23.248-214.504,23.248c-173.576,0-199.328-15.232-207.592-20.216
206
  c-43.984-26.424-48.16-143.408-48.544-167.128c 0.528-31.328, 5.592-135.56, 48.512-161.344c 8.248-4.968, 33.856-20.112, 207.624-20.112
207
  c 162.080,0, 200.688,13.2, 214.504,23.144c 37.488,26.968, 41.8,119.84, 41.904,158.72C 512.176,252.728, 508.896,357.4, 470.368,385.152z
208
  M 451.68,88.712c-5.576-4.016-37.592-17.112-195.816-17.112c-152.968,0-185.064,11.872-191.128,15.528c-15.44,9.264-31.736,58.44-33.016,134.016
211
  c-4.952,2.984-11.112,3.064-16.128,0.232c-5.032-2.84-8.144-8.168-8.144-13.936l0-176.72 c0-5.768, 3.112-11.096, 8.144-13.936
212
  c 2.44-1.376, 5.16-2.064, 7.856-2.064c 2.856,0, 5.736,0.768, 8.264,2.296l 143.968,88.376c 4.8,2.904, 7.736,8.096, 7.736,13.704
213
  S 365.008,233.696, 360.208,236.584z M 223.976,162.848L 223.976,282.896 l 97-60.016L 223.976,162.848z" />
214
+ <glyph unicode="&#xe009;" d="M 342.2,400.656c 26.44,0, 50.312-10.816, 67.128-28.184c 20.92,4.048, 40.64,11.424, 58.36,21.64c-6.856-20.816-21.44-38.28-40.408-49.328
215
  c 18.56,2.184, 36.328,6.952, 52.816,14.080c-12.36-17.872-27.92-33.608-45.888-46.184c 0.168-3.816, 0.264-7.672, 0.264-11.512
216
  c0-117.864-92.504-253.808-261.656-253.808c-51.92,0-100.28,14.816-140.952,40.112c 7.184-0.84, 14.504-1.264, 21.92-1.264
217
  c 43.080,0, 82.752,14.248, 114.232,38.2c-40.264,0.688-74.248,26.504-85.904,61.92c 5.608-1.048, 11.376-1.608, 17.312-1.608
227
  c 182.016,0, 291.504,142.488, 293.632,281.672c 14.896,12.328, 28.064,26.592, 39.224,42.576c 4.064,5.344, 6.48,12.016, 6.48,19.248
228
  c0,10.888-5.448,20.512-13.744,26.296c 3.592,12.312-0.504,25.64-10.504,33.784c-5.84,4.752-13,7.168-20.2,7.168
229
  c-5.504,0-11.016-1.408-15.984-4.28c-10.576-6.096-21.888-10.92-33.8-14.392C 396.36,423.624, 369.64,432.656, 342.2,432.656L 342.2,432.656z" />
230
+ <glyph unicode="&#xe00a;" d="M 264.008,448.128l0-111.936 l 112.16,0 l0-47.984 L 264.504,288.208 l-0.16-139.264c0-25.888, 1.344-42.504, 4.080-49.872c 4.264-11.624, 19.784-26.504, 48.592-26.504
231
  c 22.344,0, 52.488,6.72, 75.080,23.624l0-74.656 c-18.84-8.984-36.36-12.608-51.624-16.232c-15.28-3.608-31.832-5.424-49.576-5.424
232
  c-19.768,0-76.832,0.544-100.248,60.2c-4.216,10.736-6.328,26.328-6.328,46.736L 184.32,288.128 l-64.424,0 l 0.312,49.064
233
  c 21.328,0, 85.312,12.952, 85.312,110.936L 264.008,448.128 M 264.008,480.128L 205.52,480.128 c-17.672,0-32-14.328-32-32c0-73.248-40.816-78.936-53.312-78.936
237
  c-4.528,2.28-9.44,3.392-14.328,3.392c-6.784,0-13.528-2.16-19.168-6.376c-19.048-14.264-43.424-17.248-55.904-17.248
238
  c-12.8,0-17.56,4.64-18.608,5.872c-0.544,2.512-2.064,11.888-2.064,38.504l 0.112,107.264l 79.704,0 c 17.672,0, 32,14.328, 32,32l0,47.984
239
  c0,17.672-14.328,32-32,32l-80.16,0 L 296.008,448.128 C 296.008,465.8, 281.68,480.128, 264.008,480.128L 264.008,480.128z" />
240
+ <glyph unicode="&#xe00b;" d="M 290.88,439.752c 1.904,0, 3-0.080, 3-0.080l 41.784,0 l-0.216-48l-41.504,0 c-22.84,0-22.312-19.504-22.312-19.504l0-76.096 l 80.816,0
241
  l-11.28-47.936l-69.8,0 l0-239.888 l-47.952,0 l-0.032,239.888L 159.68,248.136 l-0.128,47.936l 63.856,0 c0,0,0,58.688,0,74.592
242
  C 223.416,435.704, 277.432,439.752, 290.88,439.752 M 335.664,439.672l 0.080,0 M 290.88,471.752L 290.88,471.752c-11.504,0-33.984-1.904-55.28-14.736
243
  c-20.16-12.128-44.184-36.968-44.184-86.344l0-42.592 l-31.856,0 c-8.504,0-16.656-3.392-22.672-9.408c-6-6.032-9.36-14.184-9.328-22.704
245
  c 14.2,0, 26.704,9.36, 30.704,22.984l 11.28,47.936c 2.84,9.672, 0.952,20.128-5.096,28.184c-6.032,8.080-15.528,12.832-25.608,12.832l-48.816,0
246
  l0,31.576 l 31.816,0.016c 17.608,0, 31.92,14.232, 32,31.856l 0.216,46.376c 0.032,0.592, 0.048,1.168, 0.048,1.768c0,17.672-14.296,32-31.968,32l-0.080,0
247
  l-40.888,0 C 293.864,471.72, 292.536,471.752, 290.88,471.752L 290.88,471.752z" />
248
+ <glyph unicode="&#xe00c;" d="M 511.712,367.624c-0.36,5.112-3.144,9.736-7.488,12.456L 361.632,469.064c-5.8,3.608-13.216,3.16-18.528-1.144l-87.112-70.472
249
  L 168.896,467.92c-5.296,4.28-12.768,4.768-18.528,1.144L 7.776,380.080c-4.344-2.72-7.128-7.344-7.488-12.456
250
  c-0.376-5.112, 1.736-10.080, 5.656-13.376l 82.608-69.408l-70.768-55.592c-4.048-3.16-6.312-8.088-6.112-13.208
251
  c 0.2-5.12, 2.84-9.832, 7.112-12.68l 65.488-43.656c-3.216-2.92-5.272-7.104-5.272-11.8l0-64.168 c0-5.56, 2.888-10.72, 7.624-13.64
257
  L 111.008,141.888 z M 399.104,92.672l-128.128-72.84L 270.976,163.72 l 66.328-50.984c 2.856-2.2, 6.312-3.312, 9.752-3.312c 3.096,0, 6.184,0.888, 8.872,2.688
258
  l 43.168,28.784L 399.096,92.672 z M 456.728,217.76l-109.016-72.664l-63.72,48.968l 113,70.816L 456.728,217.76z M 396.832,304.296l-113.672,73.984
259
  l 71.2,57.592l 114.232-71.296L 396.832,304.296z" />
260
+ <glyph unicode="&#xe00d;" d="M 255.992,479.864c-34.928,0-68.232-7.056-98.592-19.784c-1.056-0.336-2.088-0.776-3.072-1.336
261
  C 63.696,419.336, 0.136,328.968, 0.136,223.992c0-141.080, 114.784-255.856, 255.856-255.856c 141.096,0, 255.872,114.784, 255.872,255.856
262
  C 511.864,365.088, 397.088,479.864, 255.992,479.864z M 479.864,223.992c0-1.792-0.096-3.56-0.136-5.336
263
  c-24.512,6.504-86.696,18.72-163.4,1.872c-6.76,15.448-14.256,31.288-22.64,47.408c-0.704,1.352-1.392,2.64-2.088,3.976
271
  c 13.984,6.336, 27.76,11.392, 41.192,15.456c 30.368-77.16, 40.904-140.784, 44.088-165.296c-26.376-10.952-55.264-17.032-85.56-17.032
272
  C 203.984,0.136, 156.096,18.016, 118.048,47.88z M 371.808,32.48c-4.616,30.8-16.072,88.696-42.984,157.832
273
  c 74.224,14.776, 132.976,0.28, 147.808-4.040C 465.52,121.168, 426.264,65.528, 371.808,32.48z" />
274
+ <glyph unicode="&#xe00e;" d="M 453.976,407.76c-5.936,5.544-13.752,8.608-21.832,8.608
275
  c-0.736,0-1.472-0.032-2.2-0.080c-0.456-0.032-5.592-0.344-13.64-0.344c-13.328,0-39.344,0.904-63.984,6.968
276
  c-31.832,7.816-68.56,44.080-79.248,51.232c-5.376,3.592-11.576,5.392-17.784,5.392c-6.184,0-12.392-1.8-17.768-5.376
277
  c-1.296-0.872-39.752-42.016-77.376-51.248c-24.624-6.064-51.144-6.968-64.456-6.968c-8.048,0-13.184,0.312-13.688,0.344
284
  c-6.248,6.248-16.384,6.248-22.624,0l-45.256-45.256l-45.256,45.256c-6.248,6.248-16.384,6.248-22.632,0s-6.248-16.384,0-22.624l 45.256-45.256
285
  l-45.256-45.256c-6.248-6.24-6.248-16.376,0-22.624s 16.384-6.248, 22.632,0l 45.256,45.256l 45.256-45.256c 6.24-6.248, 16.376-6.248, 22.624,0
286
  s 6.248,16.384,0,22.624l-45.256,45.256l 45.256,45.256C 330.048,290.496, 330.048,300.632, 323.8,306.88z" />
287
+ <glyph unicode="&#xe00f;" d="M 416.072,480L 95.928,480 c-26.512,0-48-21.488-48-48l0-416 c0-26.512, 21.488-48, 48-48l 320.144,0
288
  c 26.512,0, 48,21.488, 48,48L 464.072,432 C 464.072,458.512, 442.584,480, 416.072,480z M 432.072,16c0-8.832-7.168-16-16-16L 95.928,0 c-8.832,0-16,7.168-16,16L 79.928,432
289
  c0,8.832, 7.168,16, 16,16l 320.144,0 c 8.832,0, 16-7.168, 16-16L 432.072,16 z M 256.024,79.912c-17.64,0-31.92-14.296-31.92-31.912s 14.28-31.92, 31.92-31.92
290
  c 17.632,0, 31.92,14.304, 31.92,31.92S 273.656,79.912, 256.024,79.912z M 288.024,432l-64,0 c-8.832,0-16-7.168-16-16s 7.168-16, 16-16l 64,0
291
  c 8.832,0, 16,7.168, 16,16S 296.856,432, 288.024,432z" />
292
+ <glyph unicode="&#xe017;" d="M 510.256,265.312l-51.392,76.84l 25.576,89.408c 1.592,5.608, 0.032,11.64-4.112,15.752c-4.128,4.128-10.128,5.656-15.768,4.016
293
  L 375.304,425.264l-77.144,51.952c-4.856,3.264-11.080,3.656-16.232,0.968c-5.184-2.656-8.512-7.936-8.704-13.752l-2.768-92.968
294
  l-73.248-57.296c-4.592-3.592-6.856-9.408-5.936-15.16s 4.904-10.544, 10.408-12.512l 68.728-24.64c-0.464-0.368-0.952-0.696-1.384-1.128
295
  L 3.648-4.648c-6.248-6.248-6.248-16.376,0-22.624c 3.128-3.128, 7.216-4.688, 11.312-4.688s 8.184,1.56, 11.312,4.688l 265.376,265.376
299
  c-1.624,4.472-5.16,7.968-9.64,9.576l-67.296,24.128l 56.312,44.032c 3.752,2.936, 5.984,7.376, 6.144,12.128l 2.128,71.472l 59.296-39.936
300
  c 3.952-2.656, 8.888-3.408, 13.424-2.096l 68.624,20.048l-19.672-68.736c-1.296-4.576-0.504-9.488, 2.168-13.424l 40.28-59.064L 397.024,268.728z
301
  " />
302
+ <glyph unicode="&#xe018;" d="M 416.528,447.696l-32.232,0 l0-107.704 c0-52.192-28.328-91.68-89.048-122.6
303
  C 358.28,185.488, 384.8,146.312, 384.8,87.856c0-38.064-0.168-70-0.296-87.56l 32.032,0 c 8.84,0, 16-7.144, 16-15.984s-7.16-16-16-16L 95.472-31.688
304
  c-8.84,0-16,7.16-16,16s 7.16,15.984, 16,15.984l 32.968,0 c-0.12,17.56-0.296,49.504-0.296,87.56c0,58.456, 26.144,97.624, 89.072,129.528
305
  c-60.616,30.92-88.568,70.408-88.568,122.6L 128.648,447.696 l-33.176,0 c-8.84,0-16,7.152-16,16c0,8.832, 7.16,15.992, 16,15.992l 321.064,0
306
  c 8.84,0, 16-7.16, 16-15.992C 432.528,454.848, 425.376,447.696, 416.528,447.696z M 160.136,87.856c0-38.144, 0.176-70.112, 0.296-87.56l 192.088,0
307
  c 0.112,17.456, 0.296,49.424, 0.296,87.56c0,44.504-16.56,79.016-96.592,112.2C 176.216,166.872, 160.136,132.36, 160.136,87.856z M 352.312,447.696
308
  l-191.68,0 l0-107.704 c0-30.688, 10.32-70.208, 95.584-105.264c 85.28,35.056, 96.096,74.576, 96.096,105.264L 352.312,447.696 z" />
309
+ <glyph unicode="&#xe019;" d="M 495.424,131.848L 495.424,260.92 l 8.048,4.248c 5.232,2.72, 8.528,8.112, 8.592,14.016
310
  c 0.064,5.888-3.128,11.344-8.296,14.184l-240.72,128.8c-4.816,2.64-10.64,2.624-15.488-0.048L 8.16,293.16
311
  c-5.096-2.84-8.248-8.232-8.216-14.080s 3.248-11.2, 8.408-13.984l 105.192-55.992c-1.32-2.328-2.136-4.984-2.136-7.848l0-135.392
312
  c0-4.56, 1.952-8.92, 5.36-11.952c 3.472-3.080, 36.72-30.048, 138.376-30.048c 101.296,0, 135.44,25.488, 139,28.392
314
  c-9.488-5.552-15.92-15.736-15.92-27.512c0-17.672, 14.328-32, 32-32s 32,14.328, 32,32C 511.504,116.096, 504.984,126.32, 495.424,131.848z M 368.016,73.816
315
  c-12.576-6.048-45.856-17.952-112.872-17.952c-67.44,0-99.968,12.672-111.736,18.768L 143.408,193.2 l 103.904-55.312c 2.36-1.28, 4.984-1.92, 7.592-1.92
316
  c 2.544,0, 5.096,0.608, 7.408,1.832l 105.704,55.832L 368.016,73.816 z M 255.032,170.096L 49.232,279.376l 206.16,110.488l 206.8-110.168L 255.032,170.096z" />
317
+ <glyph unicode="&#xe01a;" d="M 255.992,480.064c-114.608,0-207.84-99.952-207.84-222.8l0-273.336 c0-6.608, 4.080-12.544, 10.248-14.92
318
  c 1.856-0.736, 3.816-1.080, 5.752-1.080c 4.424,0, 8.768,1.84, 11.856,5.264l 60.296,66.56l 47.216-65.216
319
  c 2.984-4.128, 7.752-6.576, 12.84-6.608l 0.112,0 c 5.048,0, 9.816,2.392, 12.832,6.456l 47.408,63.672l 46.592-63.576
320
  c 3.016-4.112, 7.8-6.544, 12.904-6.544c 5.096,0, 9.888,2.424, 12.904,6.528l 47.784,65.144l 59-66.312
325
  L 80.144,257.272 c0,105.2, 78.888,190.8, 175.84,190.8c 96.968,0, 175.856-85.592, 175.856-190.8L 431.84,25.984 z M 336,303.92c-17.64,0-31.92-14.296-31.92-31.904
326
  c0-17.624, 14.28-31.92, 31.92-31.92s 31.92,14.296, 31.92,31.92C 367.92,289.624, 353.64,303.92, 336,303.92z M 176,303.92
327
  c-17.64,0-31.92-14.296-31.92-31.904c0-17.624, 14.288-31.92, 31.92-31.92s 31.92,14.296, 31.92,31.92C 207.92,289.624, 193.64,303.92, 176,303.92z" />
328
+ <glyph unicode="&#xe01b;" d="M 371.608,442.224c-12.8,6.008-24.904,11.664-35.92,17.192
329
  c-28.232,14.144-53.832,21.016-78.232,21.016c-49.144,0-83.152-28.352-104.48-49.68l-17.792-17.808l-11.872-11.888l-17.232-17.256l-26.864-26.896
330
  l-29.664-29.688c-55.344-55.4-64.184-111.8-28.632-182.904c 5.512-11.040, 11.184-23.168, 17.184-36.016
331
  c 32.352-69.192, 65.792-140.744, 120.528-140.744c 1.536,0, 3.056,0.048, 4.608,0.168c 56.488,4.424, 72.512,77.144, 86.656,141.296
341
  c 6,6, 6,15.736,0,21.728c-6,6-15.72,6-21.72,0l-12.176-12.176l-12.176,12.176c-6,6-15.72,6-21.72,0
342
  c-6-6-6-15.728,0-21.728l 12.176-12.176l-12.176-12.176c-6-5.992-6-15.72,0-21.72c 6-6, 15.728-6, 21.72,0
343
  l 12.176,12.168l 12.528-12.528c 6-6, 15.72-6, 21.72,0s 6,15.736,0,21.736L 164.944,208.28z" />
344
+ <glyph unicode="&#xe01c;" d="M 254.208-31.64c-120.624,0-206.184,83.64-206.184,198.888c0,61.184, 36.688,127.096, 38.248,129.856
345
  c 3.184,5.672, 9.44,8.752, 15.968,8.032c 6.456-0.832, 11.768-5.488, 13.44-11.784c 0.096-0.376, 9.984-37.376, 23.032-57.92
346
  c 8.768-13.824, 17.656-23.592, 27.656-30.376c-6.768,29.328-11.952,73.456-3.512,118.736C 186.024,448.080, 283.848,477.816, 288.040,479.016
347
  c 5.392,1.544, 11.112,0.16, 15.216-3.576c 4.096-3.752, 5.968-9.376, 4.904-14.832c-0.16-0.872-16.312-87.888, 17.968-162.032
354
  c-1.2,1.704-29.656,41.984-42.2,69.12c-26.048,56.296-25.608,117.168-22.952,152.232c-26.36-15.36-66.832-49.672-79.832-119.456
355
  c-12.656-67.904, 11.936-135.8, 12.2-136.472c 2.128-5.544, 1-11.832-2.904-16.296c-3.92-4.44-9.952-6.408-15.768-5.016
356
  c-1.984,0.488-47.016,12.2-76.168,58.144C 106.464,226.512, 101.792,236.472, 97.848,246.16z" />
357
+ <glyph unicode="&#xe01d;" d="M 512.688,154.104c-0.488,6.92-26.504,159.656-30.576,184.112c-0.392,2.344-0.704,4.84-1.048,7.472
358
  c-3.144,24.576-9.016,70.312-82.736,70.312c-8.84,0-16-7.16-16-16s 7.16-16, 16-16c 45.56,0, 47.968-18.704, 51-42.392
359
  c 0.392-3.032, 0.768-5.936, 1.216-8.64c 1.872-11.264, 10.352-56.080, 17.672-100.512c-18.776,14.312-42.144,22.904-67.56,22.904
360
  c-40.824,0-77.16-21.976-97.136-54.68c-9.608,3.632-25.912,8.168-47.696,8.168c-21.472,0-37.256-4.568-47.016-8.544
369
  c-44.096,0-81.344,36.488-81.344,79.672s 37.248,79.672, 81.344,79.672c 38,0, 69.816-26.744, 77.728-62.392
370
  c 0.328-3.264, 0.6-6.336, 0.808-9.144c 0.096-1.344, 0.456-2.608, 0.92-3.832c 0.080-1.44, 0.216-2.856, 0.216-4.312
371
  C 480.328,99.744, 444.592,64.008, 400.656,64.008z" />
372
+ <glyph unicode="&#xe01e;" d="M 511.656,243.352c-0.68,5.656-2.808,10.856-6.048,15.232l 0.080,0 l-0.44,0.44c-1.64,2.16-3.56,4.064-5.704,5.752L 290.904,466.48
373
  c-18.112,18.112-49.752,18.144-67.888,0L 14.408,266.352c-4.512-4.2-14.44-15.544-14.44-26.672l0-239.76 c0-17.592, 14.408-32, 32-32l 448,0
374
  c 17.592,0, 32,14.408, 32,32L 511.968,239.048 C 512.080,240.488, 511.936,241.928, 511.656,243.352z M 134.896,116.832L 31.968,22.048L 31.968,207.64 L 134.896,116.832z
375
  M 167.784,103.64c 1.144,0.76, 2.232,1.624, 3.184,2.704c 0.184,0.208, 0.312,0.456, 0.48,0.672l 70.584,65
377
  l 101.24,89.848l0-180.92 L 378.728,114.72z M 51.888,258.584L 245.64,443.856c 3.032,3.016, 7.048,4.688, 11.312,4.688
378
  c 4.28,0, 8.296-1.672, 11.328-4.688L 448.968,271.68l-0.488,0 l 27.448-27.896l-121.152-107.52l-67.624,60.832
379
  c-18.84,14.768-45.888,15.408-65.84-0.688l-62.752-57.792L 37.664,245.288l 13.496,13.296L 51.888,258.584 z" />
380
+ <glyph unicode="&#xe01f;" d="M 511.656,243.36c-0.68,5.656-2.808,10.856-6.048,15.232l 0.080,0 l-0.44,0.44c-1.64,2.16-3.56,4.064-5.704,5.752
381
  L 415.968,348.976L 415.968,400.608 c0,8.84-7.16,16-16,16l-50.664,0 l-58.4,49.856c-18.112,18.112-49.752,18.144-67.888,0l-58.2-49.856l-52.848,0
382
  c-8.84,0-16-7.16-16-16l0-52.688 L 14.408,266.36c-8.672-5.736-14.44-15.544-14.44-26.672l0-239.752 c0-17.592, 14.408-32, 32-32l 448,0
383
  c 17.592,0, 32,14.408, 32,32l0,239.12 C 512.080,240.496, 511.936,241.936, 511.656,243.36z M 134.432,117.248L 31.968,22.208L 31.968,207.656 L 134.432,117.248z
387
  c 3.032,3.016, 7.048,4.688, 11.312,4.688c 4.28,0, 8.296-1.672, 11.328-4.688l 32.312-27.232L 213.376,416.608 L 245.64,443.84z M 383.968,384.608l0-222.424
388
  l-28.656-25.44l-68.16,61.784c-18.84,14.768-45.888,15.408-65.84-0.688L 158,139.12l-30.032,26.504L 127.968,384.608 L 383.968,384.608 z M 51.888,258.592l 44.080,44.064
389
  l0-108.808 l-58.312,51.448l 13.496,13.296L 51.888,258.592 z" />
390
+ <glyph unicode="&#xe027;" d="M 452.808,124.056c-18.672,22.712-44.24,54.872-44.24,87.68l0,104.48
391
  c0,90.008-67.32,163.24-153.344,163.24c-86.040,0-152.832-73.232-152.832-163.24l0-104.48 c0-32.256-27.744-62.744-45.336-86.4
392
  c-15.824-21.256-28.312-38.048-19.88-54.832c 7.416-14.768, 25.984-16.664, 41.328-16.664l 91.68,0 c 0.024-47.104, 38.224-85.288, 85.336-85.288
393
  c 47.12,0, 85.32,38.184, 85.344,85.288l 93.832,0 c 9.76,0, 32.576,0, 40.432,16.6C 483.056,87.248, 470.368,102.696, 452.808,124.056z
395
  c-2.448,0-4.496,0.080-6.184,0.184c 3.296,5.104, 8.136,11.624, 12.072,16.928c 19.496,26.2, 52.072,63.184, 52.072,106.712l0,104.48
396
  c0,71.232, 51.52,129.176, 118.76,129.176c 67.24,0, 119.28-57.944, 119.28-129.176l0-104.48 c0-45.008, 30.040-82.624, 51.984-109.304
397
  c 3.696-4.496, 8.12-9.88, 11.56-14.48C 437.032,87.92, 435.912,87.904, 434.696,87.904z" />
398
+ <glyph unicode="&#xe028;" d="M 510.528,60.016L 416.896,233.168c 9.552,21.68, 14.896,45.64, 14.896,70.848c0,97.152-78.76,175.904-175.904,175.904
399
  c-97.168,0-175.92-78.76-175.92-175.904c0-25.816, 5.608-50.312, 15.592-72.392L 1.512,60.096c-3.032-5.512-2.528-12.312, 1.264-17.344
400
  c 3.8-5.016, 10.216-7.376, 16.344-5.936l 80.312,18.424l 27.488-76.56c 2.144-5.952, 7.576-10.080, 13.872-10.544
401
  c 0.408-0.032, 0.8-0.048, 1.184-0.048c 5.856,0, 11.296,3.216, 14.096,8.44l 81.848,152.488c 5.904-0.6, 11.896-0.904, 17.96-0.904
406
  c 79.272,0, 143.768-64.496, 143.768-143.768s-64.496-143.784-143.768-143.784C 176.608,160.232, 112.112,224.744, 112.112,304.016z M 405.872,89.592
407
  c-7.936,1.872-15.888-2.56-18.64-10.184l-20.264-56.488L 305.392,135.2c 37.72,11.048, 70.168,34.368, 92.752,65.368l 67.424-124.664L 405.872,89.592z
408
  " />
409
+ <glyph unicode="&#xe029;" d="M 510.512,114.296l-41.144,75.648c-0.064,0.104-0.048,0.2-0.112,0.296l-2.936,5.072
410
  c-1.64,2.808-4.216,4.616-7.096,5.296c-2.848,0.704-5.992,0.272-8.704-1.488l-4.92-3.168c-0.096-0.056-0.152-0.144-0.248-0.208
411
  l-72.8-49.16c-5.44-3.504-7.208-10.84-3.968-16.456l 3.272-3.6c 3.24-5.592, 10.632-5.824, 16.080-2.32l 43.52,29.592
412
  c-10.304-83-77.368-146.696-159.48-154.088L 271.976,320.512 L 336,320.512 c 8.832,0, 16,7.168, 16,16s-7.168,16-16,16l-64.72,0
419
  c 14.688-102.36, 102.552-178.912, 206.64-178.912c 104.032,0, 191.96,76.544, 206.68,178.856l 23.92-44.432c 3.248-5.592, 9.944-8.768, 15.384-5.272
420
  l 4.56,1.712C 511.984,101.36, 513.76,108.712, 510.512,114.296z M 223.752,416.512c0,17.92, 14.576,32.504, 32.496,32.504
421
  c 17.92,0, 32.504-14.576, 32.504-32.504s-14.576-32.504-32.504-32.504C 238.336,384.016, 223.752,398.592, 223.752,416.512z" />
422
+ <glyph unicode="&#xe02a;" d="M 511.824,334.76c 0.232,11.832-2.952,39.424-38.92,49.032L 115.024,455.76l-3.328,0.344
423
  c-26.472,0-48-21.528-48-48l0-64.352 l-16,0.040c-26.376-0.112-47.816-21.576-47.816-47.984l0-255.904 c0-26.472, 21.528-48, 48-48l 416.232,0
424
  c 26.472,0, 48,21.528, 48,48L 511.824,334.76z M 95.696,408.104c0,8.36, 6.44,15.232, 14.608,15.936l 353-71.44
425
  c 0.128-0.064-2.624-8.968-15.44-8.8L 95.696,343.8 L 95.696,408.104 z M 480.12,39.896c0-8.832-7.168-16-16-16L 47.88,23.896 c-8.832,0-16,7.168-16,16L 31.88,295.808
426
  c0,8.832, 7.168,16, 16,16l 400.032,0 c 15.704,0, 32.2,5.352, 32.2,15.944L 480.112,39.896 z M 95.912,199.752c-17.672,0-32-14.328-32-32s 14.328-32, 32-32
427
  s 32,14.328, 32,32S 113.584,199.752, 95.912,199.752z" />
428
+ <glyph unicode="&#xe02b;" d="M 496,144l-16.136,0 l0,0.808 c0,80.96-43.264,151.904-107.832,191.192l 80.408,0
429
  c 5.544-9.52, 15.752-16, 27.56-16c 17.672,0, 32,14.328, 32,32s-14.328,32-32,32c-11.816,0-22.016-6.48-27.56-16L 304,368 l0,16 c0,8.832-7.168,16-16,16l-64,0
430
  c-8.832,0-16-7.168-16-16l0-16 L 59.56,368 C 54.016,377.52, 43.816,384, 32,384c-17.672,0-32-14.328-32-32s 14.328-32, 32-32c 11.816,0, 22.016,6.48, 27.56,16l 80.4,0
431
  C 75.392,296.704, 32.136,225.768, 32.136,144.808L 32.136,144 L 16,144 c-8.832,0-16-7.168-16-16l0-64 c0-8.832, 7.168-16, 16-16l 64,0 c 8.832,0, 16,7.168, 16,16l0,64
432
  c0,8.832-7.168,16-16,16L 64.136,144 l0,0.808 c0,89.224, 61.232,164.336, 143.864,185.696L 208,320 c0-8.832, 7.168-16, 16-16l 64,0 c 8.832,0, 16,7.168, 16,16l0,10.504
433
  c 82.632-21.368, 143.864-96.48, 143.864-185.696L 447.864,144 L 432,144 c-8.832,0-16-7.168-16-16l0-64 c0-8.832, 7.168-16, 16-16l 64,0 c 8.832,0, 16,7.168, 16,16l0,64
434
  C 512,136.832, 504.832,144, 496,144z M 64,80L 32,80 l0,32 l 32,0 L 64,80 z M 272,336l-32,0 l0,32 l 32,0 L 272,336 z M 480,80l-32,0 l0,32 l 32,0 L 480,80 z" />
435
+ <glyph unicode="&#xe02c;" d="M 480,448.2L 32,448.2 c-17.672,0-32-14.328-32-32l0-288.752 c0-17.672, 14.328-32, 32-32l 63.768,0 l0-79.656
436
  c0-6.456, 3.872-12.264, 9.816-14.752c 2-0.84, 4.112-1.248, 6.184-1.248c 4.128,0, 8.168,1.592, 11.216,4.592l 92.512,91.064L 480,95.448
437
  c 17.672,0, 32,14.328, 32,32L 512,416.2 C 512,433.872, 497.672,448.2, 480,448.2z M 480,127.456L 202.392,127.456 l-74.624-73.456l0,73.456 L 32,127.456 L 32,416.2 l 448,0 L 480,127.456 z
438
  M 112,255.496l 288,0 c 8.832,0, 16,7.168, 16,16s-7.168,16-16,16L 112,287.496 c-8.832,0-16-7.168-16-16S 103.168,255.496, 112,255.496z M 112,319.496l 288,0
439
  c 8.832,0, 16,7.168, 16,16s-7.168,16-16,16L 112,351.496 c-8.832,0-16-7.168-16-16S 103.168,319.496, 112,319.496z M 112,191.496l 192,0 c 8.832,0, 16,7.168, 16,16
440
  s-7.168,16-16,16L 112,223.496 c-8.832,0-16-7.168-16-16S 103.168,191.496, 112,191.496z" />
441
+ <glyph unicode="&#xe02d;" d="M 256-32.080c-10.144,0-19.688,3.936-26.872,11.096L 10.872,197.264c-14.768,14.84-14.768,38.976-0.032,53.784l 79.952,79.936
442
  c 4.936,4.936, 12.512,6.112, 18.72,2.872c 6.184-3.232, 9.56-10.112, 8.344-16.984c-0.816-4.576-1.184-8.248-1.184-11.56
443
  c0-35, 28.488-64.072, 63.504-64.072c 35.048,0, 60.64,29.072, 60.64,64.072c0,35.048-25.592,63.544-60.64,63.544c-3.28,0-6.936-0.376-11.512-1.184
444
  c-6.936-1.28-13.752,2.16-16.984,8.344c-3.232,6.2-2.064,13.784, 2.872,18.72l 74.544,74.56c 14.44,14.376, 39.408,14.344, 53.784,0.032
450
  c-30.856,0-55.968-25.128-55.968-56.016c0-1.28, 0.2-2.528, 0.376-3.784l 0.344-2.856c 0.72-6.752-2.888-13.216-9.016-16.144
451
  c-6.080-2.904-13.408-1.656-18.2,3.128l-78.472,78.512c-3.064,3.032-5.472,3.064-8.592-0.032l-48.56-48.56
452
  c 41.64-10.312, 69.688-47.984, 69.688-92.768c0-52.656-39.96-96.064-92.648-96.064C 135.4,209.248, 97.744,240.784, 87.448,282.392z" />
453
+ <glyph unicode="&#xe02e;" d="M 476.368,352.536l-60.36,0 L 416.008,479.76 L 95.992,479.76 l0-127.224 L 35.632,352.536 c-19.656,0-35.656-16-35.656-35.672
454
  L-0.024,99.92 c0-19.672, 16-35.672, 35.656-35.672l 60.36,0 L 95.992-31.76 l 320.016,0 L 416.008,64.248 l 60.36,0 c 19.656,0, 35.656,16, 35.656,35.672L 512.024,316.864
455
  C 512.024,336.536, 496.024,352.536, 476.368,352.536z M 127.992,448.256l 256.016,0 l0-95.72 L 127.992,352.536 L 127.992,448.256 z M 384.008,0.24L 127.992,0.24 L 127.992,176.44 l 256.016,0
456
  L 384.008,0.24 z M 480.024,99.92c0-2.040-1.64-3.672-3.656-3.672l-60.36,0 L 416.008,208.44 L 95.992,208.44 l0-112.184 L 35.632,96.256 c-2.016,0-3.656,1.632-3.656,3.672
457
  L 31.976,316.864 c0,2.032, 1.64,3.672, 3.656,3.672l 440.736,0 c 2.016,0, 3.656-1.64, 3.656-3.672L 480.024,99.92 z M 416,288.28l-16,0 c-8.832,0-16-7.168-16-16
458
  s 7.168-16, 16-16l 16,0 c 8.832,0, 16,7.168, 16,16S 424.832,288.28, 416,288.28z" />
459
+ <glyph unicode="&#xe02f;" d="M 512,319.752c0,17.672-14.328,32-32,32l-54.624,0 c 14.136,13.944, 23.184,32.224, 23.184,54.736c0,27.72-15.92,57.832-60.608,57.832
460
  c-58.8,0-107.92-62.608-131-97.704C 233.856,401.704, 183.232,464.312, 124.44,464.312c-44.688,0-60.608-30.112-60.608-57.832
461
  c0-22.504, 9.296-40.792, 23.72-54.736L 32,351.744 c-17.672,0-32-14.328-32-32l0-95.784 l 32.28,0 l0-208.28 c0-17.672, 14.328-32, 32-32l 383.84,0 c 17.672,0, 32,14.328, 32,32
462
  L 480.12,223.968 L 512,223.968 L 512,319.752 z M 387.952,432.312c 19.784,0, 28.608-8.312, 28.608-25.832c0-35.544-39.672-54.72-76.984-54.72l-54.168,0
463
  C 308.144,385.528, 348.16,432.312, 387.952,432.312z M 124.44,432.312c 39.8,0, 81.328-46.784, 104.064-80.544l-54.184,0
464
  c-37.312,0-78.488,19.672-78.488,55.216C 95.832,424.496, 104.656,432.312, 124.44,432.312z M 480,255.968L 272,255.968 l0,63.784 l 208,0 L 480,255.968 z M 32,319.752l 208,0 l0-63.784
465
  L 32,255.968 L 32,319.752 z M 64.28,223.968L 240,223.968 l0-208.28 L 64.28,15.688 L 64.28,223.968 z M 448.128,15.688L 272,15.688 L 272,223.968 l 176.128,0 L 448.128,15.688 z" />
466
+ <glyph unicode="&#xe030;" d="M 16.88,448.12l 224,0 c 8.832,0, 16,7.168, 16,16s-7.168,16-16,16l-224,0 c-8.832,0-16-7.168-16-16
467
  S 8.040,448.12, 16.88,448.12z M 16.88,352.12l 224,0 c 8.832,0, 16,7.168, 16,16s-7.168,16-16,16l-224,0 c-8.832,0-16-7.168-16-16S 8.040,352.12, 16.88,352.12z
468
  M 256.88,272.12c0,8.832-7.168,16-16,16l-224,0 c-8.832,0-16-7.168-16-16s 7.168-16, 16-16l 224,0 C 249.712,256.12, 256.88,263.288, 256.88,272.12z
469
  M 506.44,317.728L 349.984,474.176c-4.952,4.96-12.328,5.92-18.296,3.008c-6.272-2.168-10.808-8.056-10.808-15.064L 320.88,107.92
471
  c 53.064,0, 96.048,35.904, 96.048,80.168c0,2.008-0.184,3.968-0.36,5.936L 352.88,426.024 l 130.92-130.928c 6.248-6.248, 16.384-6.248, 22.632,0
472
  C 512.68,301.344, 512.68,311.48, 506.44,317.728z M 320.88,46.488c-1.152-22.248-27.096-46.408-64.064-46.408
473
  c-37.824,0-64.176,25.28-64.176,47.936c0,22.672, 26.352,47.92, 64.176,47.92c 36.968,0, 62.912-24.128, 64.064-46.392L 320.88,46.488 z" />
474
+ <glyph unicode="&#xe031;" d="M 507.424,290.168L 323.344,475.176c-3.968,3.984-9.688,5.608-15.16,4.248c-5.456-1.328-9.8-5.424-11.472-10.784
475
  c-11.080-35.656-12.36-67.92-3.896-97.344c-0.776-0.536-1.52-1.12-2.208-1.808L 205.056,283.952c-27.6,12.8-57.272,19.728-86.848,19.728
476
  c-18.8,0-37.232-2.784-54.784-8.232c-5.344-1.672-9.44-6-10.784-11.424c-1.344-5.44, 0.232-11.168, 4.184-15.144l 109.488-110.192
477
  L 13.232,3.168l-13.312-35.064l 32.184,12.44l 156.68,155.52l 110.912-111.632c 3.032-3.064, 7.144-4.72, 11.344-4.72
482
  c-8.416,12.864-18.232,25.088-29.512,36.376c-11.232,11.232-23.504,21.128-36.48,29.664l 72.064,72.048c 7.352-12.784, 16.832-25, 28.504-36.664
483
  c 11.928-11.92, 24.544-21.568, 37.8-29.032L 300.112,201.728z M 357.312,325.776c-30.768,30.768-42.624,65.064-36.344,106.44l 143.456-144.2
484
  C 423.096,282.088, 388.624,294.464, 357.312,325.776z" />
485
+ <glyph unicode="&#xe032;" d="M 480,440.048L 32,440.048 c-17.592,0-32-14.408-32-32l0-368.096 c0-17.592, 14.408-32, 32-32l 448,0 c 17.592,0, 32,14.408, 32,32L 512,408.048
486
  C 512,425.64, 497.592,440.048, 480,440.048z M 480,39.952L 32,39.952 L 32,134.232 l 128.424,124.456l 132.392-132.248c 5.456-6.624, 15.168-5.784, 22.064-0.56
487
  l 58.44,52.904L 478.72,70.592c 0.4-0.4, 0.848-0.696, 1.28-1.040L 480,39.952 z M 480,115.104L 385.984,211.312
488
  c-5.704,5.624-14.64,6.2-20.968,1.376l-60.28-52.512L 172.264,291.216c-2.832,3.424-6.92,5.512-11.344,5.8
489
  c-4.408,0.16-8.752-1.28-11.984-4.312L 32,178.904L 32,408.048 l 448,0 L 480,115.104 z M 368,279.936c 17.64,0, 31.92,14.304, 31.92,31.92
490
  c0,17.608-14.28,31.912-31.92,31.912s-31.92-14.304-31.92-31.912C 336.080,294.24, 350.36,279.936, 368,279.936z" />
491
+ <glyph unicode="&#xe033;" d="M 496.592,412.496L 336.112,479.032L 176.392,415.816L 15.408,479
492
  c-1.376,0.408-2.72,0.56-3.984,0.56C 4.856,479.592,0,474.688,0,467.312l0-415 c0-8.784, 6.936-17.936, 15.408-20.28l 161.168-63.592
493
  l 159.504,64.752l 160.512-63.064c 1.376-0.376, 2.72-0.56, 3.984-0.56c 6.56,0, 11.424,4.872, 11.424,12.248L 512,392.184
494
  C 512,400.968, 505.064,410.128, 496.592,412.496z M 192,389.432l 128,50.152l0-380.752 l-128-50.592L 192,389.432 z M 32,436.656l 128-47.288l0-380.88 L 32,60.624L 32,436.656 z
495
  M 480,11l-128,48.192L 352,439.104 l 128-55.192L 480,11 z" />
496
+ <glyph unicode="&#xe034;" d="M 10.92,329.096l 237.544-129.36c 2.392-1.296, 5.016-1.952, 7.656-1.952c 2.608,0, 5.216,0.64, 7.592,1.92l 240.048,129.36
497
  c 5.232,2.816, 8.488,8.312, 8.408,14.264c-0.080,5.968-3.456,11.376-8.752,14.080L 265.856,478.048c-4.528,2.296-9.872,2.312-14.44,0.032
498
  L 11.392,357.44c-5.312-2.672-8.72-8.080-8.816-14.032S 5.704,331.936, 10.92,329.096z M 258.576,445.856L 461.656,342.72L 256.168,231.984
499
  L 53.080,342.576L 258.576,445.856z M 500.672,239.84l-47.488,24.112l-34.28-18.488l 40-20.312L 253.424,114.424L 50.328,225.016l 42.656,21.44L 58.8,265.080
502
  M 500.672,127.84l-44.984,22.112l-34.28-18.488l 37.504-18.312L 253.424,2.424L 50.328,113.016l 39.656,17.936l-34.184,18.624L 8.64,127.872
503
  c-5.312-2.672-8.72-8.080-8.816-14.032s 3.128-11.472, 8.344-14.312l 237.544-129.36c 2.392-1.296, 5.016-1.952, 7.656-1.952
504
  c 2.608,0, 5.216,0.64, 7.592,1.92l 240.048,129.36c 5.232,2.816, 8.488,8.312, 8.408,14.264C 509.344,119.736, 505.968,125.144, 500.672,127.84z" />
505
+ <glyph unicode="&#xe035;" d="M 511.368,8.68l-41.704,251.888c-3.72,32.656-33.488,59.216-66.36,59.216l-35.328,0 l0,42.64 c0,65.080-46.424,118.016-111.488,118.016
506
  c-65.048,0-112.472-52.936-112.472-118.016l0-42.64 L 105.68,319.784 c-32.872,0-62.64-26.56-66.264-58.528l-38.64-252.080
507
  c-1.488-13.28, 1.112-23.752, 7.704-31.144c 6.216-6.952, 15.264-10.488, 26.872-10.488l 436.784,0 c 16.456,0, 25.888,6.608, 30.92,12.16
508
  C 507.664-15.192, 512.88-6.224, 511.368,8.68z M 176.024,362.432c0,47.424, 33.064,86.016, 80.472,86.016s 79.488-38.592, 79.488-86.016l0-42.64
510
  l 38.344,0 l0-36.464 C 134.488,245.784, 128,235.576, 128,223.752c0-17.672, 14.328-32, 32-32s 32,14.328, 32,32c0,11.808-6.464,22-15.976,27.544l0,36.496 l 159.952,0
511
  l0-36.496 C 326.472,245.752, 320,235.552, 320,223.752c0-17.672, 14.328-32, 32-32s 32,14.328, 32,32c0,11.824-6.488,22.032-16.024,27.576l0,36.464 l 35.328,0
512
  c 16.832,0, 32.656-14.128, 34.704-31.72l 41.672-251.64C 479.88,2.384, 478.272-0.224, 473.584-0.224z" />
513
+ <glyph unicode="&#xe036;" d="M 464.752,272.792c0,84.392-44.488,160.936-118.984,204.784c-7.624,4.504-17.44,1.936-21.904-5.688
514
  c-4.472-7.608-1.936-17.424, 5.688-21.904c 64.624-38.016, 103.2-104.264, 103.2-177.184c0-121.184-87.968-209.144-209.16-209.144
515
  c-27.096,0-53.392,5.080-78.16,15.080c-8.184,3.328-17.528-0.64-20.832-8.832c-3.312-8.2, 0.64-17.528, 8.832-20.832
516
  c 28.608-11.56, 58.936-17.424, 90.16-17.424c 0.096,0, 0.192,0.008, 0.288,0.008l0-31.504 l-46.464,0 c-9.232,0-16.72-7.152-16.72-15.976
519
  c-97.344,0-176.232-79.376-176.232-176.704s 78.888-175.72, 176.232-175.72C 320.816,95.632, 399.688,174.024, 399.688,271.352z M 79.248,271.352
520
  c0,79.512, 64.704,144.704, 144.232,144.704c 79.512,0, 144.2-65.184, 144.2-144.704s-64.688-143.72-144.2-143.72
521
  C 143.952,127.632, 79.248,191.832, 79.248,271.352z" />
522
+ <glyph unicode="&#xe037;" d="M 512.512,224c0,136.008-106.832,247.552-241.16,255.512c-2.768,0.304-5.544,0.504-8.36,0.504c-0.832,0-1.664-0.088-2.496-0.112
523
  C 259,479.928, 257.512,480.016, 256,480.016C 114.56,480.016-0.512,365.168-0.512,224c0-141.168, 115.072-256.016, 256.512-256.016
524
  c 1.512,0, 3,0.088, 4.504,0.12c 0.832-0.032, 1.664-0.12, 2.496-0.12c 2.816,0, 5.592,0.2, 8.36,0.504
525
  C 405.68-23.552, 512.512,87.976, 512.512,224z M 464.784,141.584c-8.816,2.56-30.96,8.12-70.032,12.696c 3.232,22.096, 5,45.448, 5,69.72
539
  c 11.632,2.472, 32.456,6.232, 63.296,9.464c 12.144-44.856, 31.896-82.808, 55.568-109.984C 128.848,31.664, 86.76,67.68, 60.544,113.824z
540
  M 345.328,18.408c 19.112,26.632, 34.24,62.512, 43.648,104.4c 31.704-3.64, 51.608-7.896, 61.648-10.432
541
  C 426.616,70.84, 389.696,37.68, 345.328,18.408z" />
542
+ <glyph unicode="&#xe038;" d="M 112,424L 16,424 C 7.168,424,0,416.832,0,408l0-96 c0-8.832, 7.168-16, 16-16s 16,7.168, 16,16L 32,392 l 80,0
543
  c 8.832,0, 16,7.168, 16,16S 120.832,424, 112,424z M 496,152c-8.832,0-16-7.168-16-16l0-80 L 400,56 c-8.832,0-16-7.168-16-16s 7.168-16, 16-16l 96,0 c 8.832,0, 16,7.168, 16,16
544
  L 512,136 C 512,144.832, 504.832,152, 496,152z M 112,56L 32,56 L 32,136 c0,8.832-7.168,16-16,16s-16-7.168-16-16l0-96 c0-8.832, 7.168-16, 16-16l 96,0 c 8.832,0, 16,7.168, 16,16
545
  S 120.832,56, 112,56z M 496,424L 400,424 c-8.832,0-16-7.168-16-16s 7.168-16, 16-16l 80,0 l0-80 c0-8.832, 7.168-16, 16-16s 16,7.168, 16,16L 512,408 C 512,416.832, 504.832,424, 496,424z" />
546
+ <glyph unicode="&#xe039;" d="M 480.080,376l-240,0 l-48,48l-160,0 c-17.672,0-32-14.328-32-32l0-80 l-0.152,0 l0-32 l 0.152,0 l0-224
547
  c0-17.672, 14.328-32, 32-32l 448,0 c 17.672,0, 32,14.328, 32,32L 512.080,344 C 512.080,361.672, 497.752,376, 480.080,376z M 32.072,392l 145.376,0 l 39.312-38.624L 226.816,344L 480.080,344
548
  l0-32 l-448,0 L 32.080,392 z M 32.072,56L 32.072,280 l 448,0 l0-224 L 32.072,56 z" />
549
+ <glyph unicode="&#xe03a;" d="M 400,343.856l 32,0 c 8.832,0, 16,7.168, 16,16l0,16 c0,8.832-7.168,16-16,16l-32,0 c-8.832,0-16-7.168-16-16l0-16 C 384,351.024, 391.168,343.856, 400,343.856z
550
  M 400,247.856l 32,0 c 8.832,0, 16,7.168, 16,16l0,16 c0,8.832-7.168,16-16,16l-32,0 c-8.832,0-16-7.168-16-16l0-16 C 384,255.024, 391.168,247.856, 400,247.856z
551
  M 400,151.856l 32,0 c 8.832,0, 16,7.168, 16,16l0,16 c0,8.832-7.168,16-16,16l-32,0 c-8.832,0-16-7.168-16-16l0-16 C 384,159.024, 391.168,151.856, 400,151.856z
552
  M 400,55.856l 32,0 c 8.832,0, 16,7.168, 16,16l0,16 c0,8.832-7.168,16-16,16l-32,0 c-8.832,0-16-7.168-16-16l0-16 C 384,63.024, 391.168,55.856, 400,55.856z
556
  M 80,55.856l 32,0 c 8.832,0, 16,7.168, 16,16l0,16 c0,8.832-7.168,16-16,16l-32,0 c-8.832,0-16-7.168-16-16l0-16 C 64,63.024, 71.168,55.856, 80,55.856z M 480,472.048
557
  L 32,472.048 c-17.592,0-32-14.408-32-32l0-432.096 c0-17.592, 14.408-32, 32-32l 448,0 c 17.592,0, 32,14.408, 32,32L 512,440.048 C 512,457.64, 497.592,472.048, 480,472.048z M 480,7.952L 32,7.952
558
  L 32,440.048 l 448,0 L 480,7.952 z" />
559
+ <glyph unicode="&#xe03b;" d="M 50.936,314.872c-9.064,0-16.384-7.328-16.384-16.384c0-9.048, 7.32-16.384, 16.384-16.384c 151.504,0, 262.672-112.184, 262.672-263.68
560
  c0-9.048, 7.328-16.376, 16.384-16.376s 16.384,7.328, 16.384,16.376C 346.376,188.608, 221.112,314.872, 50.936,314.872z M 51.080,478.688
561
  c-9.056,0-16.384-7.328-16.384-16.384c0-9.056, 7.328-16.384, 16.384-16.384c 235.088,0, 426.336-191.248, 426.336-426.328
562
  c0-9.048, 7.328-16.376, 16.384-16.376s 16.384,7.328, 16.384,16.376C 510.176,272.736, 304.224,478.688, 51.080,478.688z M 92.008,150.2
563
  c-49.736,0-90.184-40.56-90.184-90.44c0-49.856, 40.456-90.456, 90.184-90.456s 90.2,40.592, 90.2,90.456
564
  C 182.208,109.64, 141.744,150.2, 92.008,150.2z M 92.008,0.984c-32.304,0-58.584,26.376-58.584,58.784s 26.28,58.768, 58.584,58.768
565
  c 32.312,0, 58.608-26.36, 58.608-58.768S 124.32,0.984, 92.008,0.984z" />
566
+ <glyph unicode="&#xe03c;" d="M 511.92,193.728c 0.048,10.528-1.608,50.248-2.872,61.608
567
  C 494.488,385.712, 388.672,480.336, 257.456,480.336c-136.672,0-247.408-105.312-254.92-244.952c-0.16-3.048-1.28-24.672-1.36-37.544l-0.040-7.16
568
  c-0.656-2.96-1.056-6.016-1.056-9.168l0-107.328 c0-23.44, 19.064-42.504, 42.504-42.504l 43.144,0 c 23.44,0, 42.512,19.064, 42.512,42.504L 128.24,181.504
569
  c0,23.44-19.080,42.504-42.512,42.504L 42.576,224.008 c-2.944,0-5.816-0.304-8.592-0.872c 0.24,5.192, 0.456,9.288, 0.512,10.528
575
  c0-5.8-4.72-10.504-10.512-10.504L 42.576,63.672 c-5.8,0-10.504,4.704-10.504,10.504L 32.072,181.504 C 32.080,187.304, 36.784,192.008, 42.576,192.008z
576
  M 416.264,181.504c0,5.8, 4.704,10.504, 10.504,10.504l 42.64,0 c 5.8,0, 10.512-4.704, 10.512-10.504l0-106.832 c0-5.8-4.72-10.504-10.512-10.504
577
  l-42.64,0 c-5.8,0-10.504,4.704-10.504,10.504L 416.264,181.504 z" />
578
+ <glyph unicode="&#xe03d;" d="M 511.92,177.72c 0.048,10.528-1.608,50.248-2.872,61.608C 494.488,369.704, 388.672,464.328, 257.456,464.328
579
  c-136.672,0-247.408-105.312-254.92-244.952c-0.16-3.048-1.28-24.672-1.36-37.544l-0.040-7.16c-0.656-2.96-1.056-6.016-1.056-9.168
580
  l0-139.328 c0-23.44, 19.064-42.504, 42.504-42.504l 43.144,0 c 23.44,0, 42.512,19.064, 42.512,42.504L 128.24,165.496 c0,23.44-19.080,42.504-42.512,42.504L 42.568,208
581
  c-2.944,0-5.816-0.304-8.592-0.872c 0.24,5.192, 0.456,9.296, 0.512,10.528C 41.080,340.048, 138.056,432.328, 257.456,432.328
585
  l0-139.328 c0-5.808-4.72-10.504-10.512-10.504L 42.568,15.664 c-5.8,0-10.504,4.704-10.504,10.504L 32.064,165.496 C 32.080,171.296, 36.784,176, 42.568,176z
586
  M 479.92,26.672c0-5.8-4.72-10.504-10.512-10.504l-42.64,0 c-5.8,0-10.504,4.704-10.504,10.504L 416.264,165.496 c0,5.8, 4.704,10.504, 10.504,10.504
587
  l 42.64,0 c 5.8,0, 10.512-4.704, 10.512-10.504L 479.92,26.672 z" />
588
+ <glyph unicode="&#xe03e;" d="M 255.2-31.352c-96.656,0-175.296,77.56-175.296,172.888c0,111.344, 155.816,322.424, 162.456,331.36
589
  c 3,4.032, 7.704,6.424, 12.736,6.456c 5.592,0.048, 9.784-2.296, 12.832-6.28c 6.704-8.768, 164.168-216.112, 164.168-331.528
590
  C 432.096,46.208, 352.736-31.352, 255.2-31.352z M 255.376,436.152c-37.2-52.832-143.472-211.032-143.472-294.608
591
  c0-77.688, 64.28-140.888, 143.296-140.888c 79.888,0, 144.888,63.2, 144.888,140.888C 400.096,228.224, 293.016,384.056, 255.376,436.152z" />
592
+ <glyph unicode="&#xe03f;" d="M 511.488,225.008L 452.736,428.552c-1.92,6.936-8.232,11.736-15.424,11.736L 69.64,440.288 c-7.248,0-13.592-4.872-15.472-11.888L 0.472,235.224
593
  c-0.992-3.752-0.504-7.504, 1-10.768C 0.608,221.56,0,218.544,0,215.368l0-175.656 c0-17.672, 14.328-32, 32-32l 448,0 c 17.672,0, 32,14.328, 32,32L 512,215.368
594
  c0,0.856-0.184,1.664-0.248,2.504C 512.168,220.168, 512.16,222.592, 511.488,225.008z M 81.952,408.288l 343.184,0 l 46.56-160.92L 322.528,247.368
595
  c-0.72-38.408-27.952-64.84-66.528-64.84s-65.312,26.44-66.032,64.84L 37.080,247.368 L 81.952,408.288z M 480,39.712L 32,39.712 L 32,215.368 l 131.56,0
596
  c 13.968-40.216, 47.888-64.84, 92.44-64.84s 78.968,24.624, 92.936,64.84L 480,215.368 L 480,39.712 z" />
597
+ <glyph unicode="&#xe040;" d="M 384,480L 208,480 c-17.672,0-32-14.328-32-32l 176,0 l0-128 l 128,0 l0-256 L 368,64 l0-32 l 112,0 c 17.672,0, 32,14.328, 32,32L 512,351.992 L 384,480z M 384,352L 384,434.752 L 466.736,352L 384,352 z M 32,416
598
  c-17.672,0-32-14.328-32-32l0-384 c0-17.672, 14.328-32, 32-32l 272,0 c 17.672,0, 32,14.328, 32,32L 336,287.992 L 208,416L 32,416 z M 304,0L 32,0 L 32,384 l 144,0 l0-128 l 128,0 L 304,0 z M 208,288L 208,370.752
599
  L 290.736,288L 208,288 z" />
600
+ <glyph unicode="&#xe041;" d="M 508.528,386.968L 458.68,442.64c-3.032,3.424-7.392,5.376-11.968,5.376L 271.584,448.016 L 271.584,465 c0,8.28-7.168,15-16,15
601
  c-8.832,0-16-6.72-16-15l0-16.984 L 111.68,448.016 c-8.84,0-16-7.16-16-16l0-111.832 c0-8.84, 7.16-16, 16-16l 127.904,0 l0-32.048 L 65.288,272.136
602
  c-4.576,0-8.936-1.952-11.968-5.376l-49.84-56.656c-5.376-6.064-5.376-15.184,0-21.248l 49.84-56.144c 3.056-3.424, 7.392-4.872, 11.968-4.872
603
  l 174.296,0 l0-144.84 c0-8.28, 7.168-15, 16-15c 8.832,0, 16,6.72, 16,15L 271.584,127.84 l 128.232,0 c 8.84,0, 16,7.16, 16,16L 415.816,256.144 c0,8.84-7.16,16-16,16
604
  L 271.584,272.144 l0,32.048 l 175.128,0 c 4.576,0, 8.936,1.952, 11.968,5.376l 49.848,56.16C 513.896,371.784, 513.896,380.904, 508.528,386.968z M 383.824,159.84
605
  L 72.48,159.84 l-35.64,39.64l 35.64,40.656l 311.344,0 L 383.824,159.84 z M 439.52,336.184L 127.68,336.184 L 127.68,416.016 l 311.84,0 l 35.64-39.672L 439.52,336.184z" />
606
+ <glyph unicode="&#xe042;" d="M 483.456,330.92l-89.56,96C 390.856,430.16, 386.624,432, 382.184,432L 248.624,432 l-0.504,33c0,8.28-7.168,15-16,15
607
  c-8.832,0-15-6.72-15-15L 216.632,432L 40.248,432 c-8.84,0-16-7.16-16-16l0-192 c0-8.84, 7.16-16, 16-16l 176.168,0 l0-225
608
  c0-8.28, 7.168-15, 16-15c 8.832,0, 16,6.72, 16,15L 248.416,208 l 133.768,0 c 4.44,0, 8.672,1.84, 11.704,5.080l 89.56,96
609
  C 489.184,315.232, 489.184,324.768, 483.456,330.92z M 375.232,240L 56.248,240 L 56.248,400 l 318.984,0 l 74.64-80L 375.232,240z" />
610
+ <glyph unicode="&#xe043;" d="M 509.36,332.264L 439.424,465.984C 435.344,473.784, 424.792,480.16, 416,480.16L 255.032,480.16 c-0.176,0.008-0.352,0.056-0.528,0.064
611
  c-0.144,0-0.28-0.056-0.424-0.064L 96,480.16 c-8.8,0-19.376-6.36-23.512-14.128L 2.736,334.888c-4.144-7.768-3.312-19.968, 1.816-27.128
612
  L 244.56-26.816c 2.576-3.592, 6-5.408, 9.416-5.408c 3.392,0, 6.792,1.768, 9.384,5.296L 507.312,305.2
613
  C 512.504,312.296, 513.44,324.472, 509.36,332.264z M 471.184,336.184L 385.456,336.184 l 34.328,98.304L 471.184,336.184z M 287.672,448.16l 102.984,0 l-31.944-91.464
614
  L 287.672,448.16z M 334.12,336.184L 185.296,336.184 l 70.336,101.048L 334.12,336.184z M 156.944,351.456L 124.856,448.16l 99.408,0 L 156.944,351.456z
615
  M 340.376,304.184L 254.36,57.912L 172.632,304.184L 340.376,304.184 z M 218.464,64.456L 46.496,304.184l 92.416,0 L 218.464,64.456z M 374.272,304.184l 92.584,0
616
  L 290.368,63.904L 374.272,304.184z M 94.24,438.792l 34.048-102.608L 39.664,336.184 L 94.24,438.792z" />
617
+ <glyph unicode="&#xe044;" d="M 416.28,272.104c-4.168,0-17.6,0.080-32.152,0.184l 0.056,31.984c0,17.672-14.328,32-32,32
618
  l-320.248,0.080c-17.672,0-32-14.328-32-32l0-240.472 c0-53.016, 42.984-96, 96-96l 192.328,0 c 53.016,0, 95.504,42.984, 95.504,96l 0.032,16.424
619
  c 14.512-0.112, 29.304-0.2, 32.488-0.2c 52.888,0, 95.784,42.52, 95.784,95.536C 512.064,228.664, 469.168,272.104, 416.28,272.104z
620
  M 351.768,63.88c0-35.296-28.2-64-63.504-64L 95.936-0.12 c-35.296,0-64,28.704-64,64L 31.888,304.352l 0.048,0 l 320.248-0.096L 351.768,63.88z
623
  s-16-7.168-16-16l0-80 C 271.936,375.28, 279.104,368.12, 287.936,368.12z M 95.936,368.12c 8.832,0, 16,7.168, 16,16l0,80 c0,8.832-7.168,16-16,16
624
  s-16-7.168-16-16l0-80 C 79.936,375.28, 87.104,368.12, 95.936,368.12z M 191.936,368.12c 8.832,0, 16,7.168, 16,16l0,80 c0,8.832-7.168,16-16,16
625
  s-16-7.168-16-16l0-80 C 175.936,375.28, 183.104,368.12, 191.936,368.12z" />
626
+ <glyph unicode="&#xe045;" d="M 366.592,339.864l-156.576-67.32c-2.832-1.44-5.128-3.736-6.576-6.576L 131.712,121.36
627
  c-2.936-5.768-1.872-12.768, 2.656-17.392c 2.904-2.952, 6.816-4.512, 10.768-4.512c 2.216,0, 4.472,0.488, 6.56,1.504l 152.864,63.488
628
  c 2.8,1.344, 5.112,3.528, 6.608,6.248l 75.44,148.448c 3.216,5.8, 2.264,13.016-2.328,17.784C 379.672,341.696, 372.488,342.864, 366.592,339.864
629
  z M 178.928,147.592l 43.504,88.84l 43.936-54.992L 178.928,147.592z M 292.352,200.192l-44.4,55.576l 88.392,34.88L 292.352,200.192z M 256,480
630
  C 114.616,480,0,365.384,0,224c0-141.392, 114.616-256, 256-256c 141.392,0, 256,114.608, 256,256C 512,365.384, 397.392,480, 256,480z M 256-0.504
631
  C 132.488-0.504, 32,100.488, 32,224S 132.488,448, 256,448s 224-100.488, 224-224S 379.512-0.504, 256-0.504z" />
632
+ <glyph unicode="&#xe046;" d="M 500.176,94.192c-7.832,5.504-93.528,62.488-104.032,68.904
633
  c-4.576,2.8-10.16,4.168-16.232,4.168c-7.832,0-16.504-2.28-24.968-6.736c-8.248-4.344-33.232-18.56-45.456-25.544
634
  c-10.768,7.56-36.064,26.936-75.92,66.832c-39.608,39.592-59.16,65.096-66.768,75.92c 6.968,12.216, 21.168,37.2, 25.488,45.424
635
  c 8.184,15.504, 9.112,30.984, 2.472,41.424c-6.232,9.84-62.984,95.904-68.84,104c-5.512,7.64-15.408,11.768-26.144,11.768
646
  l-5.848-0.136c-0.112,0-0.2-0.048-0.328-0.064L 379.384,480.112c-6.464-0.144-11.808-5.488-11.96-11.96l-0.016-8.208
647
  c 0.984-7.616, 6.968-12.080, 13.44-11.936l 75.624-0.2L 319.328,311.496c-6.248-6.248-6.248-16.384,0-22.632
648
  C 325.576,282.624, 335.704,282.624, 341.952,288.864z" />
649
+ <glyph unicode="&#xe047;" d="M 500.176,94.192c-7.832,5.504-93.528,62.488-104.032,68.904
650
  c-4.576,2.8-10.16,4.168-16.232,4.168c-7.832,0-16.504-2.28-24.968-6.736c-8.248-4.344-33.232-18.56-45.456-25.544
651
  c-10.768,7.56-36.064,26.936-75.92,66.832c-39.608,39.592-59.16,65.096-66.768,75.92c 6.968,12.216, 21.168,37.2, 25.488,45.424
652
  c 8.184,15.504, 9.112,30.984, 2.472,41.424c-6.232,9.84-62.984,95.904-68.84,104c-5.512,7.64-15.408,11.768-26.144,11.768
663
  c 6.248,6.248, 6.248,16.384,0,22.632c-6.248,6.24-16.376,6.24-22.624,0L 350.84,342.744L 351.28,420.16c 0.144,6.464-4.984,12.096-11.448,11.944
664
  l-8.208-0.008c-6.48-0.16-11.832-4.008-11.968-10.472l-0.328-115.504c0-0.112, 0.44-0.192, 0.44-0.304l-0.64-5.856
665
  C 319.064,296.712, 319.824,293.824, 321.92,291.744z" />
666
+ <glyph unicode="&#xe048;" d="M 480.848,380.224c0-0.528-0.048-0.968-0.112-1.312c-13.080-9-86.216-57.312-99.888-66.080c-1.44-0.032-5.096,0.456-10.312,3.2
667
  c-5.56,2.92-21.768,12.016-44.44,24.952l-17.64,10.064l-16.624-11.672c-12.36-8.704-39.232-29.408-80.144-70.312
668
  c-41.088-41.080-61.728-67.856-70.384-80.168l-11.672-16.624l 10.080-17.64c 9.768-17.096, 21.472-37.752, 25-44.472
669
  c 2.84-5.392, 3.064-9.080, 3.064-10.080c0-0.16,0-0.296-0.016-0.408c-7.68-12.248-57.296-86.968-66.336-100.16
675
  c-4.344,8.248-18.56,33.232-25.544,45.456c 7.56,10.768, 26.936,36.064, 66.832,75.92c 39.592,39.608, 65.096,59.16, 75.92,66.768
676
  c 12.216-6.968, 37.2-21.168, 45.424-25.488c 15.504-8.184, 30.984-9.112, 41.424-2.472c 9.84,6.232, 94.904,62.984, 103,68.84
677
  C 507.728,359.6, 511.848,369.496, 511.848,380.224L 511.848,380.224z" />
678
+ <glyph unicode="&#xe049;" d="M 480,480.048L 32,480.048 c-17.592,0-32-14.408-32-32l0-448.096 c0-17.592, 14.408-32, 32-32l 448,0
679
  c 17.592,0, 32,14.408, 32,32L 512,448.048 C 512,465.64, 497.592,480.048, 480,480.048z M 480-0.048L 32-0.048 L 32,448.048 l 448,0 L 480-0.048 z M 112,303.848l 32,0 l0-32 c0-8.832, 7.168-16, 16-16
680
  s 16,7.168, 16,16l0,32 l 32,0 c 8.832,0, 16,7.168, 16,16s-7.168,16-16,16l-32,0 l0,32 c0,8.832-7.168,16-16,16s-16-7.168-16-16l0-32 l-32,0 c-8.832,0-16-7.168-16-16
681
  S 103.168,303.848, 112,303.848z M 216.568,184.424c-6.248,6.248-16.376,6.248-22.624,0L 160,150.488l-33.944,33.936
684
  l-33.936,33.936l 33.936,33.936C 222.816,168.040, 222.816,178.168, 216.568,184.424z M 304,303.848l 96,0 c 8.832,0, 16,7.168, 16,16s-7.168,16-16,16L 304,335.848
685
  c-8.832,0-16-7.168-16-16S 295.168,303.848, 304,303.848z M 304,143.848l 96,0 c 8.832,0, 16,7.168, 16,16s-7.168,16-16,16L 304,175.848 c-8.832,0-16-7.168-16-16
686
  S 295.168,143.848, 304,143.848z M 304,79.848l 96,0 c 8.832,0, 16,7.168, 16,16s-7.168,16-16,16L 304,111.848 c-8.832,0-16-7.168-16-16S 295.168,79.848, 304,79.848z" />
687
+ <glyph unicode="&#xe04a;" d="M 212.408,140.328c 115.472,0, 204.952,65.952, 203.576,163.816c0,86.592-91.608,155.816-207.080,155.816
688
  c-115.488,0-209.080-69.224-209.080-155.816c0-53.936, 26.456-111.44, 81.704-139.688c0-0.328-0.096-0.576-0.096-0.936
689
  c0-23.44-19.512-55.576-27.2-68.832l 0.032,0 c-0.608-1.44-0.976-3-0.976-4.672c0-6.56, 5.288-11.832, 11.848-11.832
690
  c 0.968,0, 2.544,0.2, 3.112,0.2c 0.16,0, 0.216,0, 0.2-0.048c 40.832,6.672, 101.128,52.624, 110.064,63.512
699
  c 7.744-9.392, 51.112-50.752, 86.408-56.504c-0.016,0.032, 0.032,0.032, 0.184,0.032c 0.472,0, 1.84-0.168, 2.672-0.168
700
  c 5.672,0, 10.248,4.56, 10.248,10.232c0,1.44-0.328,2.8-0.84,4.032l 0.032,0 c-6.64,11.44-17.064,44.872-17.064,65.128
701
  c0,0.312-0.096,0.528-0.096,0.816C 490.048,92.672, 512.168,128.296, 512.168,174.904z" />
702
+ <glyph unicode="&#xe04b;" d="M 480.008,384.264L 352.208,384.264 L 352.208,415.264 c0,26.472-21.528,48-48,48L 207.992,463.264 c-26.472,0-48-21.528-48-48l0-31 L 32.008,384.264 c-17.592,0-32-14.408-32-32l0-112.128
703
  l-0.016,0 l0-32 l 0.016,0 l0-191.408 c0-17.592, 14.408-32, 32-32l 448,0 c 17.592,0, 32,14.408, 32,32L 512.008,352.264 C 512.008,369.856, 497.6,384.264, 480.008,384.264z
704
  M 191.992,415.264c0,8.832, 7.168,16, 16,16l 96.216,0 c 8.832,0, 16-7.168, 16-16l0-31 L 191.992,384.264 L 191.992,415.264 z M 32.008,352.264l 448,0 l0-112.128 L 303.824,240.136 l0,16.376
705
  c0,17.64-14.36,32-32,32l-31.872,0 c-17.64,0-32-14.36-32-32l0-16.376 L 32.008,240.136 L 32.008,352.264 z M 271.848,175.936l-31.904,0 L 239.944,256.512 l 31.872,0 L 271.848,175.936z
706
  M 32.008,16.736L 32.008,208.144 l 175.936,0 l0-32.2 c0-17.64, 14.36-32, 32-32l 31.872,0 c 17.64,0, 32,14.36, 32,32l0,32.2 l 176.184,0 l0-191.408 L 32.008,16.736 z" />
707
+ <glyph unicode="&#xe04c;" d="M 476.040,479.224L 264.52,421.928c-5.376-1.44-17.048-1.424-22.408,0.080L 36.040,479.112
708
  C 17.648,484.176-0.168,470.912-0.168,451.976l0-389.056 c0-16.048, 12.168-31.392, 27.656-35.704l 206.080-57.112c 5.512-1.528, 12.608-2.376, 19.968-2.376
709
  c 5.048,0, 12.504,0.392, 19.36,2.264l 211.512,57.296c 15.528,4.2, 27.752,19.512, 27.752,35.624L 512.16,451.976 C 512.168,470.896, 494.352,484.208, 476.040,479.224
710
  z M 240,1.528L 35.536,58.056c-1.544,0.424-3.704,3.248-3.704,4.856L 31.832,446.928 l 201.736-55.768c 1.952-0.544, 4.144-0.968, 6.432-1.328L 240,1.528 z
721
  c 6.984,0, 13.408,4.608, 15.392,11.672C 210.784,221.016, 205.832,229.848, 197.312,232.256z M 197.312,136.256l-111.968,31.512
722
  c-8.456,2.36-17.344-2.576-19.736-11.080s 2.56-17.328, 11.080-19.736l 111.968-31.512c 1.44-0.408, 2.904-0.592, 4.344-0.592
723
  c 6.984,0, 13.408,4.608, 15.392,11.672C 210.784,125.024, 205.832,133.848, 197.312,136.256z" />
724
+ <glyph unicode="&#xe04d;" d="M 507.832,338c-2.984,4.232-7.832,6.752-13,6.752L 444.96,344.752 L 342.392,432.168c-12.488,12.488-32.76,12.504-45.248,0L 196.32,344.752
725
  l-41.048,0 l-25.704,88.64c-10.080,34.904-34.032,38.672-43.856,38.672L 17.168,472.064 c-8.784,0-15.888-7.112-15.888-15.888s 7.112-15.888, 15.888-15.888l 68.528,0
726
  c 2.168,0, 8.784,0, 13.296-15.592l 88.424-324.968c 1.92-6.856, 8.168-11.592, 15.296-11.592l 215.984,0 c 6.704,0, 12.688,4.2, 14.952,10.512
727
  l 76.128,224.84C 511.528,328.36, 510.8,333.784, 507.832,338z M 319.768,409.536l 76.016-64.792L 243.728,344.744 L 319.768,409.536z M 407.512,119.904L 214.768,119.904
728
  l-50.576,193.064l 308.048,0 L 407.512,119.904z M 376,55.936c-22.096,0-40-17.904-40-40s 17.904-40, 40-40s 40,17.904, 40,40S 398.096,55.936, 376,55.936z
729
  M 232,55.936c-22.096,0-40-17.904-40-40s 17.904-40, 40-40s 40,17.904, 40,40S 254.096,55.936, 232,55.936z" />
730
+ <glyph unicode="&#xe04e;" d="M 507.832,338c-2.984,4.232-7.832,6.752-13,6.752L 155.264,344.752 l-25.704,88.64
731
  c-10.080,34.904-34.032,38.672-43.856,38.672L 17.168,472.064 c-8.784,0-15.888-7.112-15.888-15.888s 7.112-15.888, 15.888-15.888l 68.528,0
732
  c 2.168,0, 8.784,0, 13.296-15.592l 88.424-324.968c 1.92-6.856, 8.168-11.592, 15.296-11.592l 215.984,0 c 6.704,0, 12.688,4.2, 14.952,10.512
733
  l 76.128,224.84C 511.528,328.36, 510.8,333.784, 507.832,338z M 407.512,119.904L 214.768,119.904 l-50.576,193.064l 308.048,0 L 407.512,119.904z M 376,55.936
734
  c-22.096,0-40-17.904-40-40s 17.904-40, 40-40s 40,17.904, 40,40S 398.096,55.936, 376,55.936z M 232,55.936c-22.096,0-40-17.904-40-40s 17.904-40, 40-40
735
  s 40,17.904, 40,40S 254.096,55.936, 232,55.936z" />
736
+ <glyph unicode="&#xe04f;" d="M 432,400.648L 336.408,400.648 L 336.408,431.336 c0,26.472-21.528,48-48,48l-63.816,0 c-26.472,0-48-21.528-48-48l0-30.688 L 80,400.648 c-17.672,0-32-14.328-32-32l0-367.984
737
  c0-17.672, 14.328-32, 32-32l 352,0 c 17.672,0, 32,14.328, 32,32L 464,368.648 C 464,386.32, 449.672,400.648, 432,400.648z M 208.592,431.336c0,8.832, 7.168,16, 16,16l 63.816,0
738
  c 8.832,0, 16-7.168, 16-16l0-30.688 L 208.592,400.648 L 208.592,431.336 z M 432,0.664L 80,0.664 L 80,368.648 l 96.592,0 l0-32.92 c0,0-0.424-15.984, 15.904-15.984
739
  c 18,0, 16.096,15.984, 16.096,15.984l0,32.92 l 95.816,0 l0-32.92 c0,0-1.064-16.064, 15.936-16.064c 16,0, 16.064,16.064, 16.064,16.064l0,32.92 L 432,368.648 L 432,0.664 z
740
  " />
741
+ <glyph unicode="&#xe050;" d="M 495.032,8.832c-0.168,0-0.36,0-0.544,0.016c-8.096,0.264-13.2,6.544-13.888,14.608c-0.544,5.936-16.984,149.544-241.128,149.392
742
  l0-91.832 c0-6.184-3.56-11.832-9.168-14.472c-5.544-2.656-12.216-1.84-16.984,2.112L 5.832,240.544c-3.72,3.048-5.856,7.592-5.84,12.392
743
  s 2.168,9.344, 5.888,12.376L 213.36,435.592c 4.784,3.904, 11.392,4.656, 16.968,2.048c 5.576-2.656, 9.144-8.28, 9.144-14.456l0-89.816
744
  c 92.984-2.952, 165.496-32.856, 212.168-87.488c 75.968-88.888, 59.016-218.080, 58.216-223.456C 508.672,14.592, 502.92,8.832, 495.032,8.832z
745
  M 223.472,205.096c 0.016,0, 0.032,0, 0.032,0c 160.112-0.096, 221.296-54.16, 256.232-101.904c-5.112,38.248-20.032,84.36-52.504,122.016
746
  c-43.168,50.048-112.72,76.424-203.768,76.424c-8.84,0-16,7.16-16,16l0,71.888 L 41.248,252.84l 166.216-137.952l0,74.2
747
  c0,4.248, 1.688,8.328, 4.704,11.328C 215.168,203.408, 219.232,205.096, 223.472,205.096z" />
748
+ <glyph unicode="&#xe051;" d="M 16.968,8.832c 0.168,0, 0.36,0, 0.544,0.016c 8.096,0.264, 13.2,6.544, 13.888,14.608c 0.544,5.936, 16.488,149.544, 240.624,149.392
749
  l 0.504-91.832c0-6.184, 3.56-11.832, 9.168-14.472c 5.544-2.656, 12.216-1.84, 16.984,2.112l 207.488,171.888
750
  c 3.72,3.048, 5.856,7.592, 5.84,12.392s-2.168,9.344-5.888,12.376L 298.64,435.592c-4.784,3.904-11.392,4.656-16.968,2.048
751
  c-5.576-2.656-9.144-8.28-9.144-14.456l-0.504-89.816C 179.048,330.424, 107.040,300.512, 60.36,245.888
753
  C 128.392,205, 67.2,150.936, 32.264,103.184c 5.112,38.248, 20.032,84.36, 52.504,122.016c 43.168,50.048, 112.72,76.424, 203.768,76.424
754
  c 8.84,0, 16,7.16, 16,16l0,71.888 l 166.216-136.672L 304.528,114.888l0,74.2 c0,4.248-1.688,8.328-4.704,11.328
755
  C 296.832,203.408, 292.768,205.096, 288.528,205.096z" />
756
+ <glyph unicode="&#xe052;" d="M 503.184,372.032c-5.392,2.488-11.792,1.544-16.28-2.424l-80.656-72.448l-72.816,74.704l 72.096,83.264
757
  c 3.92,4.528, 4.872,10.768, 2.432,16.256s-7.832,8.848-13.76,8.848l-4.344,0 c-44.56,0-121.488-3.832-155.832-38.672l-6.928-6.88
758
  c-36.64-37.384-43.144-98.688-23.84-145.288L 18.616,100.944c-24.896-25.24-24.896-66.16,0-91.408l 22.536-22.848
759
  C 53.6-25.928, 69.92-32.24, 86.24-32.24c 16.312,0, 32.632,6.312, 45.072,18.928l 187.36,188.864c 17.72-9.576, 42-15.832, 62.392-15.832
764
  c-7.712,31.192-3.216,74.304, 21.008,99.024l 6.896,6.96c 20.776,21.080, 74.728,27.312, 104.6,29.152l-58.68-67.768
765
  c-5.248-6.064-4.984-15.2, 0.608-20.936L 394.72,265.28c 5.624-5.792, 14.72-6.128, 20.776-0.76l 65.304,58.816
766
  C 478.856,291.656, 472.704,245.648, 452.832,225.496z" />
767
+ <glyph unicode="&#xe053;" d="M 512.16,225.208c0-8.832-7.144-15.992-15.984-15.992L 271.736,209.216 L 271.736,47.12
768
  c0-43.576-35.456-79.040-79.048-79.040c-43.592,0-79.056,35.464-79.056,79.040c0,8.832, 7.16,15.992, 15.992,15.992s 15.992-7.16, 15.992-15.992
769
  c0-25.952, 21.112-47.064, 47.080-47.064c 25.96,0, 47.080,21.112, 47.080,47.064L 239.776,209.216 L 15.832,209.216 c-8.832,0-15.992,7.168-15.992,15.992
770
  c0,123.648, 90.456,202.056, 239.928,207.24L 239.768,463.936 c0,8.832, 7.16,15.984, 15.992,15.984c 8.84,0, 15.984-7.16, 15.984-15.984l0-31.488
771
  C 421.248,427.272, 512.16,348.856, 512.16,225.208z M 479.576,241.192C 471.688,341.456, 390.128,400.752, 255.752,400.752
772
  c-134.376,0-215.448-59.296-223.328-159.552L 479.576,241.2 z" />
773
+ <glyph unicode="&#xe054;" d="M 448.4,400.488L 335.76,400.488 L 335.76,444.12 c0,20.264-16.504,36.248-36.768,36.248L 213,480.368 c-20.264,0-36.76-15.984-36.76-36.248l0-43.632 L 63.6,400.488
774
  c-8.832,0-16-7.168-16-16s 7.168-16, 16-16l 22.008,0 l 37.12-369.96c 1.552-17.312, 16.304-30.888, 33.568-30.888l 199.4,0 c 17.264,0, 32,13.576, 33.544,30.736
775
  l 37.152,370.12l 22.008,0 c 8.84,0, 16,7.168, 16,16S 457.24,400.488, 448.4,400.488z M 208.24,444.12c0,2.616, 2.136,4.752, 4.76,4.752l 85.992,0
776
  c 2.624,0, 4.768-2.136, 4.768-4.752l0-43.632 L 208.24,400.488 L 208.24,444.12 z M 357.384,1.4c-0.080-0.888-1.128-1.768-1.688-1.768L 156.296-0.368
777
  c-0.56,0-1.616,0.872-1.712,1.92l-36.816,366.928l 276.456,0 L 357.384,1.4z" />
778
+ <glyph unicode="&#xe055;" d="M 511.992,271.864L 511.992,441.048 C 511.992,462.52, 494.52,480, 473.056,480L 307.464,479.976L 300.368,480
779
  c-10.84,0-27.248,0-37.96-10.72L 9.44,216.304C 3.36,210.224,0,202.152,0,193.56c0-8.608, 3.344-16.688, 9.424-22.768l 193.4-193.36
780
  C 208.88-28.656, 216.96-32, 225.552-32s 16.68,3.344, 22.744,9.424l 252.976,252.984C 512.12,241.232, 512.056,256.816, 511.992,271.864z
781
  M 478.648,253.032L 225.44,0.064L 32.064,193.672L 284.76,446.424C 287.304,448, 296.464,448, 300.256,448l 7.2-0.024L 473.056,448
782
  c 3.832,0, 6.936-3.12, 6.936-6.952l0-169.312 C 480.024,265.648, 480.056,255.464, 478.648,253.032z M 384.008,416c-35.344,0-64-28.656-64-64s 28.656-64, 64-64
783
  s 64,28.656, 64,64S 419.352,416, 384.008,416z M 384.008,320c-17.672,0-32,14.328-32,32s 14.328,32, 32,32s 32-14.328, 32-32S 401.68,320, 384.008,320z" />
784
+ <glyph unicode="&#xe056;" d="M 256,480C 114.616,480,0,365.384,0,224s 114.616-256, 256-256s 256,114.616, 256,256S 397.384,480, 256,480z
785
  M 320,438.512c 72.112-21.496, 128.824-78.4, 150.352-150.512L 366.568,288 c-11.208,19.264-27.296,35.336-46.568,46.528L 320,438.512 z M 351.816,223.896
786
  c0-52.968-42.896-95.904-95.816-95.904s-95.816,42.936-95.816,95.904S 203.088,319.808, 256,319.808S 351.816,276.864, 351.816,223.896z
787
  M 224,445.536c 10.456,1.496, 21.128,2.312, 32,2.312c 10.864,0, 21.544-0.816, 32-2.312l0-97.904 c-10.24,2.648-20.928,4.2-32,4.2
792
  C 234.248,97.552, 244.928,96, 256,96s 21.76,1.552, 32,4.2L 288,2.312 z M 320,9.336L 320,113.304 c 19.328,11.224, 35.448,27.368, 46.656,46.696l 103.736,0
793
  C 448.896,87.832, 392.16,30.84, 320,9.336z M 379.752,192c 2.624,10.2, 4.080,20.88, 4.080,31.912c0,11.096-1.464,21.832-4.128,32.088l 97.704,0
794
  c 1.504-10.496, 2.44-21.168, 2.44-32.080c0-10.848-0.92-21.488-2.416-31.92L 379.752,192 z" />
795
+ <glyph unicode="&#xe057;" d="M 342.952,288.408L 480.584,425.192l-0.448-77.536c-0.144-6.464, 4.984-12.088, 11.456-11.944
796
  l 8.208,0.008c 6.472,0.152, 11.824,4, 11.96,10.464l 0.336,115.504c0,0.112-0.44,0.2-0.44,0.312l 0.632,5.856
797
  c 0.064,3.248-0.696,6.144-2.792,8.216c-2.072,2.088-4.976,3.36-8.2,3.272l-5.848-0.136c-0.112,0-0.2-0.040-0.32-0.056
798
  L 380.384,479.656c-6.464-0.144-11.816-5.488-11.96-11.96l-0.016-8.208c 0.984-7.624, 6.976-12.080, 13.44-11.936l 75.624-0.2L 320.328,311.040
810
  C 7.472,479.432, 4.552,478.16, 2.496,476.072C 0.392,474-0.368,471.104-0.296,467.856L 0.336,462c0-0.112-0.44-0.192-0.44-0.312
811
  l 0.336-115.504c 0.144-6.464, 5.488-10.312, 11.96-10.464l 8.712-0.008c 6.464-0.144, 11.592,5.48, 11.448,11.944L 31.912,424.768l 137.632-136.36
812
  c 6.24-6.248, 16.376-6.248, 22.624,0c 6.248,6.248, 6.248,16.384,0,22.632L 55.024,447.336z" />
813
+ <glyph unicode="&#xe058;" d="M 191.6,306.6L 191.264,422.104c-0.144,6.464-5.496,10.312-11.96,10.464l-8.208,0.008
814
  c-6.472,0.144-11.592-5.488-11.456-11.944l 0.448-77.624L 26.952,474.872c-6.248,6.248-16.376,6.248-22.624,0s-6.248-16.376,0-22.624
815
  l 132.56-131.304l-75.544-0.2c-6.464,0.144-12.456-4.32-13.44-11.936l 0.016-8.208c 0.16-6.472, 5.504-11.824, 11.96-11.968l 114.752,0.504
816
  c 0.128-0.008, 0.208-0.056, 0.32-0.056l 5.848-0.136c 3.224-0.088, 6.136,1.176, 8.2,3.272c 2.104,2.072, 2.856,4.976, 2.792,8.216
828
  c-3.224,0.088-6.144-2.176-8.2-4.272c-2.104-2.072-2.856-4.968-2.792-8.216l 0.632-5.848c0-0.12-0.44-0.192-0.44-0.304
829
  l 0.336-115.504c 0.144-6.464, 5.488-10.304, 11.96-10.464l 8.712-0.016c 6.472-0.144, 11.592,5.488, 11.448,11.952l-0.44,77.264l 133.632-131.512
830
  c 6.248-6.248, 16.376-6.248, 22.624,0s 6.248,16.376,0,22.624L 375.032,127.552z" />
831
+ <glyph unicode="&#xe059;" d="M 201.152,227.072l 19.632,27.624l-67.152,91.64L 1.368,346.336 l0-32 l 135.744,0 L 201.152,227.072z
832
  M 459.392,314.336l-38.768-34.768c-4.672-4.472-6.184-11.72-1.512-16.184l 2.736-4.032c 4.688-4.472, 12.248-4.472, 16.912,0l 63.872,57.752
833
  c 0.088,0.080, 0.192,0.096, 0.272,0.168l 4.232,4.048c 2.336,2.248, 3.504,5.184, 3.488,8.144c 0.016,2.936-1.152,5.888-3.488,8.112
834
  l-4.232,4.048c-0.080,0.080-0.168,0.112-0.272,0.184l-64.864,59.216c-4.68,4.472-12.232,4.472-16.92,0l-2.736-4.032
838
  l-38.608-34.624c-4.672-4.472-6.184-11.72-1.512-16.184l 2.736-4.032c 4.688-4.472, 12.248-4.472, 16.912,0l 63.872,57.752
839
  c 0.088,0.080, 0.192,0.096, 0.272,0.168l 4.232,4.048c 2.336,2.248, 3.504,5.184, 3.488,8.144c 0.016,2.936-1.152,5.888-3.488,8.112
840
  L 502.904,53.616z" />
841
+ <glyph unicode="&#xe05a;" d="M 450.92,5.312l-416,0 l0,320 l 128.8,0 l 32.36,31.168l-0.832,0.832L 34.92,357.312
842
  c-17.672,0-32-14.328-32-32l0-320 c0-17.672, 14.328-32, 32-32l 416,0 c 17.672,0, 32,14.328, 32,32L 482.92,255.648 l-32-30.544L 450.92,5.312 z M 135.064,133.312l 32.24,0
843
  c 22.432,127.248, 133.272,224, 266.944,224c 5.608,0, 10.928-0.048, 16.312-0.088l-58.624-58.616c-6.232-6.248-6.232-16.376,0-22.624
844
  c 3.128-3.128, 7.232-4.688, 11.328-4.688s 8.168,1.56, 11.296,4.688l 94.512,97L 414.56,470c-6.232,6.248-16.36,6.248-22.624,0
845
  c-6.232-6.248-6.232-16.376,0-22.624l 58.088-58.080c-5.016,0.008-9.984,0.024-15.104,0.024C 283.392,389.32, 158.136,278.344, 135.064,133.312z" />
846
+ <glyph unicode="&#xe05b;" d="M 432,128c-26.344,0-49.648-12.792-64.216-32.44l-210.68,107.36
847
  C 158.936,209.648, 160,216.688, 160,224c0,9.152-1.608,17.904-4.44,26.088L 367.44,352.896C 381.984,332.992, 405.448,320, 432,320
848
  c 44.184,0, 80,35.824, 80,80c0,44.184-35.816,80-80,80S 352,444.184, 352,400c0-6.216, 0.784-12.232, 2.12-18.040L 139.2,277.672
849
  C 124.56,293.808, 103.504,304, 80,304C 35.816,304,0,268.184,0,224c0-44.176, 35.816-80, 80-80c 25.448,0, 48.064,11.912, 62.712,30.432l 211.552-107.816
850
  C 352.832,60.632, 352,54.424, 352,48c0-44.184, 35.816-80, 80-80s 80,35.816, 80,80S 476.184,128, 432,128z M 432,448c 26.504,0, 48-21.496, 48-48s-21.496-48-48-48
851
  s-48,21.496-48,48S 405.496,448, 432,448z M 80,176c-26.512,0-48,21.496-48,48s 21.488,48, 48,48c 26.504,0, 48-21.496, 48-48S 106.504,176, 80,176z M 432,0
852
  c-26.504,0-48,21.496-48,48s 21.496,48, 48,48s 48-21.496, 48-48S 458.504,0, 432,0z" />
853
+ <glyph unicode="&#xe05c;" d="M 104.84,38.368c-10.056-20.904-16.4-34.832-72.344-36.864c 1.608,53.984, 11.896,59.776, 32.496,70.040
854
  c 8.648,4.312, 19.416,9.672, 31.056,18.624L 76.568,115.040c-9.2-7.064-17.664-10.784-25.848-14.856c-34.32-17.112-50.496-33.968-50.496-114.328
855
  l 0.272-16.352l 15.728,0.352c 84.816,0, 100.664,19.16, 116.552,52.16c 3.48,7.232, 5.416,12.12, 11.28,21.864l-23.728,21.552
856
  C 113.216,55.728, 108.776,46.496, 104.84,38.368z M 352.48,385.672c-35.384,0-64.176-28.792-64.176-64.168c0-35.392, 28.8-64.176, 64.176-64.176
867
  c-0.616,2.608-1.888,5.032-3.696,7.032c-29.424,32.608-73.872,81.904-77.28,85.816c-2.224,2.704-5.304,4.624-8.784,5.424l-73.296,16.768
868
  l 35.952,38l 91.016,0 c 5.56,0, 10.728,2.888, 13.632,7.624c 7.040,11.464, 15.208,27.768, 24.672,46.648c 16.024,31.976, 35.96,74.272, 53.56,94.816
869
  c 20.792,24.264, 41.912,39.504, 68.448,49.424c 59.048,22.064, 119.984,24.384, 147.84,24.176C 480.952,419.384, 479.84,350.976, 461,300.264z" />
870
+ <glyph unicode="&#xe05d;" d="M 256,480C 114.616,480,0,365.384,0,224c0-141.392, 114.616-256, 256-256c 141.392,0, 256.008,114.608, 256.008,256C 512.008,365.384, 397.392,480, 256,480z
871
  M 256-0.504C 132.488-0.504, 32,100.488, 32,224S 132.488,448, 256,448s 224.008-100.488, 224.008-224S 379.512-0.504, 256-0.504z M 232.472,79.76l 40.256,0
872
  l0,40.624 l-40.256,0 L 232.472,79.76 z M 255.528,368.232c-23.44,0-42.752-6.32-57.92-18.944c-15.168-12.632-22.544-37.928-22.168-58.888l 0.592-1.168l 36.72,0
873
  c0,12.504, 4.168,30.472, 12.504,36.92c 8.328,6.44, 18.424,9.664, 30.28,9.664c 13.664,0, 24.168-3.712, 31.536-11.136
875
  c-13.288-11.984-21.496-21.616-24.616-28.904c-3.128-7.296-4.752-20.384-4.872-39.256l 38.48,0 c0,11.84, 0.752,20.568, 2.248,26.168
876
  c 1.488,5.592, 5.752,11.912, 12.784,18.944c 15.112,14.576, 27.248,28.832, 36.44,42.776c 9.168,13.928, 13.76,29.296, 13.76,46.096
877
  c0,23.44-7.088,41.704-21.288,54.784C 301.104,361.696, 281.176,368.232, 255.528,368.232z" />
878
+ <glyph unicode="&#xe05e;" d="M 287.8,433.296c-8.832,0-16-7.168-16-16s 7.168-16, 16-16C 401.024,401.296, 480,318.56, 480,205.344C 480,92.112, 387.888,0, 274.664,0
879
  C 161.448,0, 78.704,81.8, 78.704,195.032c0,8.832-7.168,16-16,16s-16-7.168-16-16C 46.704,64.16, 143.8-32, 274.664-32S 512,74.472, 512,205.344
880
  C 512,336.2, 418.664,433.296, 287.8,433.296z M 240.128,255.872L 240.128,464 c0,8.832-7.168,16-16,16C 99.504,480,0,380.496,0,255.872c0-8.832, 7.168-16, 16-16
881
  l 208.128,0 C 232.96,239.872, 240.128,247.040, 240.128,255.872z M 208.128,271.872L 32.656,271.872 C 40.384,366.12, 113.88,439.616, 208.128,447.344L 208.128,271.872 z" />
882
+ <glyph unicode="&#xe05f;" d="M 482.128,455.168c-17.432,16.704-36.664,25.168-57.192,25.168c-32.096,0-55.512-20.736-61.92-27.088
883
  C 354,444.32, 46.44,136.648, 46.44,136.648c-2.008-2.016-3.472-4.536-4.224-7.296c-6.936-25.632-41.68-139.36-42.024-140.504
884
  c-1.784-5.824-0.192-12.168, 4.104-16.464c 3.088-3.072, 7.2-4.72, 11.416-4.72c 1.656,0, 3.328,0.248, 4.96,0.784
885
  c 1.176,0.384, 118.568,38.328, 137.888,44.096c 2.544,0.768, 4.872,2.144, 6.768,4.016c 12.208,12.064, 299.064,295.728, 318.104,315.392
891
  c-5.056,13.024-13.928,29.76-29.288,45.248c-15.696,15.824-31.616,25.16-44.376,30.68c 1.088,1.080, 1.928,1.928, 2.256,2.248
892
  c 1.832,1.808, 18.448,17.688, 39.16,17.688c 11.92,0, 23.624-5.44, 34.808-16.16c 13.256-12.712, 20.088-25.256, 20.312-37.296
893
  C 480.264,381.856, 473.592,368.624, 460.208,354.816z" />
894
+ <glyph unicode="&#xe060;" d="M 399.672-0.144l-368,0 l0,400 l 224.8,0 l 32.352,31.168l-0.832,0.832L 31.672,431.856 c-17.672,0-32-14.328-32-32l0-400 c0-17.672, 14.328-32, 32-32l 368,0
895
  c 17.672,0, 32,14.328, 32,32L 431.672,234.184 l-32-30.544L 399.672-0.144 z M 487.112,459.28c-14.44,13.84-30.376,20.856-47.376,20.856
896
  c-26.608,0-46.016-17.184-51.296-22.448c-7.488-7.392-219.584-219.176-219.584-219.176c-1.664-1.696-2.88-3.768-3.504-6.072
897
  c-5.744-21.224-34.536-115.496-34.824-116.432c-1.488-4.832-0.16-10.096, 3.4-13.608c 2.552-2.56, 5.96-3.92, 9.456-3.92
900
  M 465.216,379.44c-8.904-9.184-78.624-78.080-207.224-204.768l-9.84-9.704c-14.744-4.56-50.048-15.904-76.736-24.512
901
  c 8.592,28.376, 18.904,62.656, 23.504,78.872C 222.4,246.768, 404.112,428.2, 411.016,435.016c 1.344,1.344, 13.608,13.128, 28.72,13.128
902
  c 8.576,0, 16.84-3.912, 25.232-11.96c 10.032-9.624, 15.2-18.872, 15.344-27.512C 480.472,399.776, 475.392,389.944, 465.216,379.44z" />
903
+ <glyph unicode="&#xe061;" d="M 495.864,127.296c 0.008,0.28, 0.080,0.536, 0.080,0.816L 495.944,461.624
904
  c 0.192,1.752, 0.128,3.56-0.288,5.376c-1.368,7.456-7.864,13.112-15.712,13.112c-2.944,0-5.672-0.848-8.040-2.24L 172.968,400.048
905
  c-5.384-1.336-9.376-5.36-11.016-10.336c-1.24-2.272-2-4.832-2-7.6L 159.952,95.84 c-15.232,10.192-34.704,16.328-55.936,16.328
906
  c-48.768,0-88.32-32.304-88.32-72.136c0-39.84, 39.552-72.152, 88.32-72.152c 48.784,0, 88.304,32.304, 88.304,72.152
910
  c 29.616,0, 51.2-16.696, 55.592-33.704l0-0.184 c0-1.616, 0.312-3.144, 0.76-4.608c 0.032-0.496, 0.112-0.984, 0.112-1.48
911
  C 160.816,21.12, 137.616,0.024, 104.352,0.024z M 407.848,80.024c-32.984,0-55.976,21.088-55.976,40S 374.864,160, 407.848,160
912
  c 32.976,0, 55.968-21.064, 55.968-39.976S 440.832,80.024, 407.848,80.024z" />
913
+ <glyph unicode="&#xe062;" d="M 426.304,318.352L 269.848,474.808c-4.96,4.96-12.336,5.92-18.304,3.008
914
  c-6.272-2.168-10.8-8.056-10.8-15.064l0-354.2 c-16.96,12.56-39.216,20.264-63.688,20.264c-53.032,0-96.056-35.888-96.056-80.144
915
  c0-44.272, 43.024-80.168, 96.056-80.168c 53.056,0, 96.040,35.888, 96.040,80.168c0,1.96-0.184,3.88-0.352,5.816L 272.744,426.656 L 403.68,295.728
916
  c 6.24-6.248, 16.376-6.248, 22.624,0S 432.552,312.112, 426.304,318.352z M 176.688,0.712c-37.824,0-64.176,25.272-64.176,47.936
917
  s 26.36,47.912, 64.176,47.912c 37.016,0, 63-24.2, 64.064-46.496l0-2.84 C 239.68,24.936, 213.704,0.712, 176.688,0.712z" />
918
+ <glyph unicode="&#xe063;" d="M 255.44,128l 3.8,0 C 303.72,128, 336,160.8, 336,205.984L 336,396.688 C 336,443.408, 302.28,480, 259.232,480
919
  L 255.44,480 C 211.632,480, 176,442.624, 176,396.688l0-190.704 C 176,161.528, 210.152,128, 255.44,128z M 208,396.688C 208,424.984, 229.28,448, 255.44,448l 3.8,0
920
  C 284.752,448, 304,425.936, 304,396.688l0-190.704 C 304,178.488, 286.016,160, 259.232,160L 255.44,160 C 227.504,160, 208,178.904, 208,205.984L 208,396.688 z M 400,304
921
  c-8.84,0-16-7.168-16-16l0-66.536 C 384,126.264, 350.016,80, 280.128,80L 232.56,80 C 141.16,80, 128,156.92, 128,221.464L 128,288 c0,8.832-7.168,16-16,16
922
  s-16-7.168-16-16l0-66.536 C 96,111.216, 141.944,48, 232.56,48L 240,48 l0-48 L 160,0 c-8.832,0-16-7.168-16-16s 7.168-16, 16-16l 192,0 c 8.832,0, 16,7.168, 16,16s-7.168,16-16,16
923
  L 272,0 l0,48 l 8.128,0 C 342.112,48, 416,78.096, 416,221.464L 416,288 C 416,296.832, 408.84,304, 400,304z" />
924
+ <glyph unicode="&#xe064;" d="M 480,429.080L 32,429.080 c-17.672,0-32-14.328-32-32l0-288 c0-17.68, 14.328-32, 32-32l 80,0
925
  c 10.248,0, 16,13.16, 16,15.992l0,0.008 c0,2.912-5.44,16.208-16,16.208L 51.52,109.288 c-10.688,0-19.36,8.672-19.36,19.36L 32.16,377
926
  c0,10.696, 8.664,19.36, 19.36,19.36l 409.136,0.504c 10.688,0, 19.36-8.664, 19.36-19.36l0-248.848 c0-10.688-8.672-19.36-19.36-19.36L 259.072,109.296
927
  l 37.992,34.456c 4.672,4.472, 6.184,11.704, 1.512,16.168l-2.736,4.032c-4.688,4.472-12.248,4.472-16.92,0l-64.864-59.216
928
  c-0.096-0.080-0.184-0.112-0.264-0.184l-4.24-4.048c-2.336-2.216-3.504-5.168-3.488-8.112c-0.016-2.952, 1.144-5.888, 3.488-8.144
929
  l 4.24-4.048c 0.080-0.080, 0.184-0.096, 0.264-0.168l 63.864-57.752c 4.672-4.472, 12.232-4.472, 16.92,0l 2.736,4.032
930
  c 4.672,4.472, 3.16,11.72-1.512,16.184l-38.568,34.584L 480,77.080 c 17.672,0, 32,14.32, 32,32l0,288 C 512,414.752, 497.672,429.080, 480,429.080z" />
931
+ <glyph unicode="&#xe065;" d="M 58.416,208.168l 277.224,0 c 8.848,0, 16,7.168, 16,16s-7.152,16-16,16L 59.416,240.168 l 57.88,57.88
932
  c 6.248,6.248, 6.248,16.376,0,22.624s-16.376,6.248-22.624,0L 0.168,223.672l 94.504-97c 3.128-3.128, 7.216-4.688, 11.312-4.688
933
  s 8.184,1.56, 11.312,4.688c 6.248,6.248, 6.248,16.376,0,22.624L 58.416,208.168z M 479.832,480L 207.832,480 c-17.68,0-32-14.328-32-32l0-144 l 32.208,0 L 208.040,428.488
934
  c0,10.688, 8.672,19.36, 19.36,19.36L 459.76,447.848 c 10.696,0, 19.36-8.672, 19.36-19.36l 0.504-409.144c0-10.688-8.664-19.36-19.36-19.36L 227.408-0.016
935
  c-10.688,0-19.36,8.672-19.36,19.36L 208.048,144.528 l-32.208-0.040L 175.84,0 c0-17.672, 14.32-32, 32-32l 271.992,0 c 17.68,0, 32.008,14.328, 32.008,32L 511.84,448
936
  C 511.832,465.672, 497.504,480, 479.832,480z" />
937
+ <glyph unicode="&#xe066;" d="M 266.264,149.296c-6.256-6.248-6.256-16.376,0-22.624
938
  c 3.128-3.128, 7.216-4.688, 11.312-4.688s 8.184,1.56, 11.312,4.688l 94.504,97L 288.888,320.68c-6.248,6.248-16.376,6.248-22.624,0
939
  c-6.256-6.248-6.256-16.376,0-22.624l 57.872-57.88L 15.92,240.176 c-8.84,0-16-7.168-16-16s 7.16-16, 16-16l 309.224,0 L 266.264,149.296z M 480.080,480l-288,0
940
  c-17.68,0-32.008-14.328-32.008-32l0-144 l 32.216,0 L 192.288,428.488 c0,10.688, 8.672,19.36, 19.36,19.36L 460,447.848 c 10.704,0, 19.36-8.672, 19.36-19.36l 0.504-409.144
941
  c0-10.688-8.656-19.36-19.36-19.36L 211.656-0.016 c-10.688,0-19.36,8.672-19.36,19.36L 192.296,144.528 l-32.216-0.040L 160.080,0 c0-17.672, 14.328-32, 32.008-32l 288,0
942
  c 17.672,0, 32,14.328, 32,32L 512.088,448 C 512.080,465.672, 497.752,480, 480.080,480z" />
943
+ <glyph unicode="&#xe067;" d="M 48,256L 16,256 c-8.832,0-16-7.168-16-16l0-32 c0-8.832, 7.168-16, 16-16l 32,0 c 8.832,0, 16,7.168, 16,16l0,32
944
  C 64,248.832, 56.832,256, 48,256z M 496,240L 160,240 c-8.832,0-16-7.168-16-16s 7.168-16, 16-16l 336,0 c 8.832,0, 16,7.168, 16,16S 504.832,240, 496,240z M 48,128L 16,128
945
  c-8.832,0-16-7.168-16-16l0-32 c0-8.832, 7.168-16, 16-16l 32,0 c 8.832,0, 16,7.168, 16,16l0,32 C 64,120.832, 56.832,128, 48,128z M 496,112L 160,112 c-8.832,0-16-7.168-16-16
946
  s 7.168-16, 16-16l 336,0 c 8.832,0, 16,7.168, 16,16S 504.832,112, 496,112z M 48,384L 16,384 c-8.832,0-16-7.168-16-16l0-32 c0-8.832, 7.168-16, 16-16l 32,0 c 8.832,0, 16,7.168, 16,16
947
  l0,32 C 64,376.832, 56.832,384, 48,384z M 160,336l 336,0 c 8.832,0, 16,7.168, 16,16s-7.168,16-16,16L 160,368 c-8.832,0-16-7.168-16-16S 151.168,336, 160,336z" />
948
+ <glyph unicode="&#xe068;" d="M 304.272-31.872c-145.416,0-146.536,6.032-164.544,19.592c-9.552,7.184-27.576,12.16-93.408,16.448
949
  c-4.776,0.312-9.32,2.144-12.368,5.84c-1.4,1.704-34.296,49.68-34.296,126.52c0,75.72, 23.544,110.232, 24.552,111.832
950
  c 2.92,4.68, 8.048,7.52, 13.56,7.52c 54.056,0, 128.992,69, 179.368,189.448c 8.712,20.832, 10.512,34.536, 42.512,34.536
951
  c 18.2,0, 38.6-13.032, 48.672-29.752c 20.664-34.16, 10.168-107.528, 0.464-146.736c 33,0.264, 92.736,0.712, 121.16,0.712
960
  c-3,4.472-3.224,10.024-1.464,15.112c 15.632,45.016, 24.36,115.64, 9.864,139.768c-4.272,7.112-5.248,14.216-21.248,14.216
961
  c-2.216,0-7.496-1.752-13-14.872C 193.168,305.088, 113.312,231.096, 47.904,224.424c-5.64-12.864-16.248-39.52-16.248-87.888
962
  C 31.656,87.168, 47.296,48.976, 54.808,36.616z" />
963
+ <glyph unicode="&#xe069;" d="M 508.352,223.32L 268.168,474.904c-3.016,3.152-7.184,4.92-11.544,4.92c-4.352,0-8.52-1.776-11.544-4.92L 3.656,223.328
964
  c-6.12-6.376-5.904-16.496, 0.472-22.624c 6.376-6.112, 16.496-5.936, 22.624,0.472l 21.504,22.416l0-239.416 c0-8.84, 7.168-16, 16-16l 111.776,0
965
  c 8.816,0, 15.968,7.128, 16,15.952l 0.504,159.832l 127.496,0 l0-159.784 c0-8.84, 7.16-16, 16-16l 111.736,0 c 8.84,0, 16,7.16, 16,16L 463.768,223.672 l 21.496-22.52
966
  c 3.144-3.264, 7.344-4.92, 11.544-4.92c 3.984,0, 7.984,1.472, 11.080,4.472C 514.256,206.816, 514.464,216.944, 508.352,223.32z
967
  M 431.768,252.592l0-252.416 l-79.736,0 L 352.032,159.952 c0,8.84-7.16,16-16,16l-159.44,0 c-8.816,0-15.968-7.128-16-15.952l-0.504-159.832l-79.832,0 L 80.256,252.592
968
  c0,1.32-0.208,2.584-0.504,3.816l 176.88,184.312l 175.712-184.104C 432,255.32, 431.768,253.984, 431.768,252.592z" />
969
+ <glyph unicode="&#xe06a;" d="M 480-32L 320-32 c-17.672,0-32,14.328-32,32L 288,160 c0,17.672, 14.328,32, 32,32l 160,0 c 17.672,0, 32-14.328, 32-32l0-160
970
  C 512-17.672, 497.672-32, 480-32z M 480,160L 320,160 l0-160 l 160,0 L 480,160 z M 480,256L 320,256 c-17.672,0-32,14.328-32,32L 288,448 c0,17.672, 14.328,32, 32,32l 160,0 c 17.672,0, 32-14.328, 32-32l0-160
971
  C 512,270.328, 497.672,256, 480,256z M 480,448L 320,448 l0-160 l 160,0 L 480,448 z M 192-32L 32-32 c-17.672,0-32,14.328-32,32L0,160 c0,17.672, 14.328,32, 32,32l 160,0 c 17.672,0, 32-14.328, 32-32l0-160
972
  C 224-17.672, 209.672-32, 192-32z M 192,160L 32,160 l0-160 l 160,0 L 192,160 z M 192,256L 32,256 c-17.672,0-32,14.328-32,32L0,448 c0,17.672, 14.328,32, 32,32l 160,0 c 17.672,0, 32-14.328, 32-32l0-160
973
  C 224,270.328, 209.672,256, 192,256z M 192,448L 32,448 l0-160 l 160,0 L 192,448 z" />
974
+ <glyph unicode="&#xe06b;" d="M 472,368c-22.096,0-40-17.912-40-40c0-4.536, 0.92-8.816, 2.304-12.88L 336.8,231.16C 329.96,236.608, 321.424,240, 312,240
975
  c-10.872,0-20.704-4.368-27.904-11.408l-76.376,38.24C 206.232,287.576, 189.12,304, 168,304c-22.088,0-40-17.912-40-40c0-6.048, 1.44-11.72, 3.84-16.856
976
  L 53.968,157.352C 49.6,158.984, 44.936,160, 40,160c-22.088,0-40-17.912-40-40s 17.912-40, 40-40s 40,17.912, 40,40c0,5.32-1.088,10.384-2.976,15.024
977
  l 79.136,90.96C 159.928,224.816, 163.848,224, 168,224c 11.64,0, 22.024,5.056, 29.336,13l 74.704-37.456C 272.304,177.672, 290.064,160, 312,160
978
  c 22.096,0, 40,17.912, 40,40c0,0.712-0.168,1.376-0.208,2.080L 455.84,291.464C 460.792,289.272, 466.232,288, 472,288c 22.096,0, 40,17.904, 40,40
979
  C 512,350.088, 494.096,368, 472,368z" />
980
+ <glyph unicode="&#xe06c;" d="M 80.024,286.064L 80.024,464 c0,8.832-7.168,16-16,16s-16-7.168-16-16l0-177.92
981
  C 20.36,278.952-0.176,253.856-0.176,224c0-29.864, 20.536-54.952, 48.2-62.088L 48.024-16 c0-8.832, 7.168-16, 16-16s 16,7.168, 16,16L 80.024,161.928
982
  c 27.64,7.152, 48.152,32.224, 48.152,62.072C 128.176,253.84, 107.664,278.92, 80.024,286.064z M 64.208,191.984C 64.152,191.984, 64.088,192, 64.024,192
983
  c-0.072,0-0.136-0.016-0.208-0.024C 46.24,192.080, 31.968,206.4, 31.968,224c0,17.592, 14.28,31.92, 31.856,32.016
993
  c-0.064,0-0.12,0.016-0.176,0.016c-0.072,0-0.144-0.016-0.208-0.016C 430.248,288.080, 415.968,302.4, 415.968,320
994
  c0,17.592, 14.28,31.92, 31.848,32.016c 0.072,0, 0.144-0.016, 0.208-0.016c 0.064,0, 0.12,0.016, 0.176,0.016
995
  c 17.568-0.12, 31.832-14.432, 31.832-32.016C 480.048,302.408, 465.784,288.096, 448.208,287.984z" />
996
+ <glyph unicode="&#xe06d;" d="M 207.72,479.88c 145.416,0, 146.544-6.032, 164.552-19.592c 9.552-7.184, 27.576-12.168, 93.416-16.456
997
  c 4.784-0.312, 9.32-2.144, 12.368-5.84c 1.4-1.704, 34.296-49.68, 34.296-126.512c0-75.72-23.544-110.24-24.552-111.848
998
  c-2.92-4.672-8.048-7.512-13.56-7.512c-54.056,0-128.992-69-179.376-189.456c-8.712-20.832-10.504-34.528-42.512-34.528
999
  c-18.2,0-38.6,13.032-48.688,29.752c-20.656,34.16-10.168,107.528-0.456,146.736c-33-0.264-92.736-0.72-121.16-0.72
1008
  s 3.232-10.032, 1.464-15.112c-15.624-45.016-24.352-115.64-9.856-139.768c 4.264-7.112, 5.248-14.216, 21.248-14.216
1009
  c 2.216,0, 7.496,1.752, 13,14.872c 53.496,127.904, 133.352,201.904, 198.76,208.576c 5.64,12.864, 16.248,39.52, 16.248,87.896
1010
  C 480.352,360.832, 464.712,399.016, 457.192,411.376z" />
1011
+ <glyph unicode="&#xe06e;" d="M 460.544,428.384L 292.416,35.488l-59.656,172.256L 60.664,259.76L 460.544,428.384 M 502.232,479.616c-3.048,0-6.76-0.864-11.048-2.68
1012
  L 13.856,274.4c-17.192-7.296-18.28-21.352-2.424-31.232l 197.648-61.792l 64.68-201.632c 4.64-7.592, 10.248-11.36, 15.632-11.36
1013
  c 5.968,0, 11.648,4.576, 15.52,13.624L 509.048,458.872C 514.576,471.816, 511.432,479.616, 502.232,479.616L 502.232,479.616z" />
1014
+ <glyph unicode="&#xe06f;" d="M 487.472,447.304c0,11.616-6.296,22.328-16.456,27.968
1015
  c-4.84,2.696-10.184,4.032-15.544,4.032c-5.856,0-11.736-1.616-16.888-4.824L 70.72,251.184c-7.976-4.952-13.256-13.104-14.688-22.2L 56.032,464
1016
  c0,8.832-7.168,16-16,16s-16-7.168-16-16l0-480 c0-8.832, 7.168-16, 16-16s 16,7.168, 16,16L 56.032,219.032 c 1.44-9.104, 6.72-17.256, 14.688-22.192L 439.080-26.48
1017
  c 5.16-3.216, 11.032-4.832, 16.888-4.832c 5.36,0, 10.704,1.344, 15.544,4.032c 10.16,5.64, 16.456,16.344, 16.456,27.968L 487.472,447.304z
1018
  M 87.6,224.008L 455.472,447.304l 0.504-446.608L 87.6,224.008z" />
1019
+ <glyph unicode="&#xe070;" d="M 286.96,381.048L 34.32,224l 252.64-157.048L 286.96,190.44 l 192-123.488L 478.96,381.048 l-192-123.496L 286.96,385.472 M 285.632,413.048
1020
  c 5.352,0, 11.368-1.336, 16.208-4.032c 10.16-5.64, 17.12-16.352, 17.12-27.968l0-65.92 L 468.072,408.224c 5.16,3.2, 10.688,4.824, 16.56,4.824
1021
  c 5.344,0, 7.864-1.336, 12.712-4.032c 10.16-5.64, 13.616-16.352, 13.616-27.968l0-314.096 c0-11.624-3.624-22.328-13.784-27.968
1022
  c-4.84-2.688-8.864-4.032-14.216-4.032c-5.864,0-10.392,1.608-15.552,4.832L 318.96,132.872l0-65.92 c0-11.624-6.96-22.328-17.12-27.968
1023
  c-4.84-2.688-10.52-4.032-15.88-4.032c-5.856,0-11.896,1.608-17.056,4.832L 16.176,196.832C 6.792,202.656, 1.040,212.936, 1.040,224
1024
  s 5.688,21.336, 15.080,27.176L 268.752,408.224C 273.904,411.432, 279.768,413.048, 285.632,413.048L 285.632,413.048z" />
1025
+ <glyph unicode="&#xe071;" d="M 72.312,447.304l 367.872-223.296L 71.816,0.696L 72.312,447.304 M 72.312,479.304c-5.36,0-10.704-1.336-15.544-4.032
1026
  c-10.16-5.64-16.456-16.352-16.456-27.968L 39.816,0.696c0-11.624, 6.296-22.328, 16.456-27.968c 4.84-2.688, 10.184-4.032, 15.544-4.032
1027
  c 5.856,0, 11.736,1.608, 16.888,4.832l 368.36,223.312c 9.408,5.832, 15.128,16.112, 15.128,27.168s-5.72,21.336-15.128,27.176L 89.2,474.488
1028
  C 84.048,477.688, 78.168,479.304, 72.312,479.304L 72.312,479.304z" />
1029
+ <glyph unicode="&#xe072;" d="M 208.136,480L 96.032,480 c-8.832,0-16-7.16-16-16l0-480 c0-8.832, 7.168-16, 16-16l 112.104,0 c 8.84,0, 16,7.168, 16,16L 224.136,464
1030
  C 224.136,472.84, 216.976,480, 208.136,480z M 192.136,0L 112.032,0 L 112.032,448 l 80.104,0 L 192.136,0 z M 415.968,480L 304.44,480 c-8.84,0-16-7.16-16-16l0-480 c0-8.832, 7.16-16, 16-16
1031
  l 111.528,0 c 8.84,0, 16,7.168, 16,16L 431.968,464 C 431.968,472.84, 424.816,480, 415.968,480z M 399.968,0l-79.528,0 L 320.44,448 l 79.528,0 L 399.968,0 z" />
1032
+ <glyph unicode="&#xe073;" d="M 225.040,381.048L 477.68,224L 225.040,66.952L 225.040,190.44 l-192-123.488L 33.040,381.048 l 192-123.496L 225.040,385.472 M 226.368,413.048
1033
  c-5.36,0-11.368-1.336-16.216-4.032C 200,403.376, 193.040,392.664, 193.040,381.048l0-65.92 L 43.928,408.224c-5.16,3.2-10.688,4.824-16.56,4.824
1034
  c-5.344,0-7.864-1.336-12.72-4.032C 4.504,403.376, 1.040,392.664, 1.040,381.048l0-314.096 c0-11.624, 3.624-22.328, 13.784-27.968
1035
  c 4.84-2.688, 8.864-4.032, 14.216-4.032c 5.864,0, 10.392,1.608, 15.552,4.832L 193.040,132.872l0-65.92 c0-11.624, 6.96-22.328, 17.112-27.968
1036
  c 4.848-2.688, 10.528-4.032, 15.888-4.032c 5.856,0, 11.896,1.608, 17.056,4.832l 252.728,157.048c 9.392,5.832, 15.144,16.112, 15.144,27.168
1037
  s-5.688,21.336-15.080,27.176L 243.248,408.224C 238.096,411.432, 232.224,413.048, 226.368,413.048L 226.368,413.048z" />
1038
+ <glyph unicode="&#xe074;" d="M 471.968,480c-8.832,0-16-7.168-16-16l0-235 c-1.44,9.096-6.72,17.232-14.688,22.184
1039
  L 73.424,474.488c-5.16,3.2-11.032,4.824-16.888,4.824c-5.36,0-10.704-1.336-15.544-4.032c-10.16-5.64-16.456-16.352-16.456-27.968
1040
  L 24.032,0.696c0-11.624, 6.296-22.328, 16.456-27.968c 4.84-2.688, 10.184-4.032, 15.544-4.032c 5.856,0, 11.736,1.608, 16.888,4.832
1041
  L 441.28,196.832c 7.968,4.936, 13.248,13.080, 14.688,22.176L 455.968-16 c0-8.832, 7.168-16, 16-16s 16,7.168, 16,16L 487.968,464 C 487.968,472.832, 480.808,480, 471.968,480z
1042
  M 56.032,0.696L 56.528,447.304l 367.872-223.296L 56.032,0.696z" />
1043
+ <glyph unicode="&#xe075;" d="M 480,432.056L 351.888,432.056 L 351.888,463.944 c0,8.84-7.16,16-16,16s-16-7.16-16-16l0-31.88 l-128,0 L 191.888,463.944
1044
  c0,8.84-7.16,16-16,16c-8.84,0-16-7.16-16-16l0-31.88 L 32,432.064 c-17.672,0-32-14.328-32-32l0-400 c0-17.672, 14.328-32, 32-32l 448,0 c 17.672,0, 32,14.328, 32,32l0,400
1045
  C 512,417.728, 497.672,432.056, 480,432.056z M 480,0.064L 32,0.064 l0,400 l 127.888,0 l0-16.12 c0-8.84, 7.16-16, 16-16c 8.84,0, 16,7.16, 16,16L 191.888,400.056 l 128,0 l0-16.12
1046
  c0-8.84, 7.16-16, 16-16s 16,7.16, 16,16L 351.888,400.056 L 480,400.056 L 480,0.064 z M 368,224.056l 32,0 c 8.832,0, 16,7.168, 16,16l0,32 c0,8.832-7.168,16-16,16l-32,0
1050
  c 8.832,0, 16,7.168, 16,16l0,32 C 288,280.896, 280.832,288.056, 272,288.056z M 144,288.056l-32,0 c-8.832,0-16-7.168-16-16l0-32 c0-8.832, 7.168-16, 16-16l 32,0
1051
  c 8.832,0, 16,7.168, 16,16l0,32 C 160,280.896, 152.832,288.056, 144,288.056z M 144,160.064l-32,0 c-8.832,0-16-7.168-16-16l0-32 c0-8.84, 7.168-16, 16-16l 32,0
1052
  c 8.832,0, 16,7.16, 16,16l0,32 C 160,152.888, 152.832,160.064, 144,160.064z" />
1053
+ <glyph unicode="&#xe076;" d="M 255.992,480C 156.976,480, 79.432,399.448, 79.432,300.432c0-74.6, 36.64-110.128, 65.592-136.064c 18.64-16.712, 31.184-26.776, 31.184-39.176
1054
  l0-27.128 c0-0.696, 0.096-1.376, 0.184-2.064l-0.36,0 l0-46.312 C 176.040,0.832, 207.632-32, 256.568-32c 47.232,0, 79.472,32.832, 79.472,81.688L 336.040,96
1055
  l-0.464,0 c 0.088,0.688, 0.208,1.368, 0.208,2.064l0,27.128 c0,18.88, 14.016,30.296, 35.264,48.848c 28.752,25.104, 61.512,56.344, 61.512,126.392
1056
  C 432.568,399.448, 355.008,480, 255.992,480z M 255.384,0c-29.952,0-47.344,18.576-47.344,49.688l-0.232,21.336C 219.32,67.088, 235,64, 256,64
1058
  l0-20.216 c-7.592-4.24-21.592-9.28-48.064-9.28c-27.784,0-40.96,4.928-47.512,8.736l0,20.768 c0,27.304-21.344,44.648-41.84,63.008
1059
  c-27.16,24.336-54.936,51.92-54.936,112.232C 111.432,381.8, 174.632,448, 255.992,448c 81.376,0, 144.576-66.2, 144.576-147.568
1060
  C 400.568,244.92, 376.336,221.144, 350.008,198.144z" />
1061
+ <glyph unicode="&#xe077;" d="M 136.032,320.008L 24,320.008 c-8.84,0-16-7.16-16-16L 8-16 c0-8.84, 7.16-16, 16-16l 112.032,0 c 8.84,0, 16,7.16, 16,16L 152.032,304.008
1062
  C 152.032,312.848, 144.872,320.008, 136.032,320.008z M 120.032,0L 40,0 L 40,288.008 l 80.032,0 L 120.032,0 z M 311.872,224.872L 199.832,224.872 c-8.84,0-16-7.16-16-16L 183.832-16
1063
  c0-8.84, 7.16-16, 16-16l 112.040,0 c 8.84,0, 16,7.16, 16,16L 327.872,208.872 C 327.872,217.72, 320.72,224.872, 311.872,224.872z M 295.872,0L 215.832,0 L 215.832,192.872
1064
  l 80.040,0 L 295.872,0 z M 488,480L 376.136,480 c-8.84,0-16-7.16-16-16l0-480 c0-8.84, 7.16-16, 16-16L 488-32 c 8.84,0, 16,7.16, 16,16L 504,464 C 504,472.84, 496.84,480, 488,480z M 472,0
1065
  l-79.864,0 L 392.136,448 L 472,448 L 472,0 z" />
1066
+ <glyph unicode="&#xe078;" d="M 512,224C 512,365.392, 397.384,480, 256,480C 114.608,480,0,365.392,0,224c0-141.384, 114.608-256, 256-256C 397.384-32, 512,82.616, 512,224z M 31.504,224
1067
  C 31.504,347.512, 132.488,448, 256,448s 224-100.488, 224-224S 379.512,0, 256,0S 31.504,100.488, 31.504,224z M 272.168,111.84L 272.168,292.072 l 57.88-57.88
1068
  c 6.248-6.248, 16.376-6.248, 22.624,0s 6.248,16.376,0,22.624L 255.672,351.32L 158.672,256.816c-3.128-3.128-4.688-7.216-4.688-11.312
1069
  s 1.56-8.184, 4.688-11.312c 6.248-6.248, 16.376-6.248, 22.624,0l 58.872,58.88L 240.168,111.84 c0-8.84, 7.168-16, 16-16S 272.168,103, 272.168,111.84z" />
1070
+ <glyph unicode="&#xe079;" d="M 256,480C 114.616,480,0,365.384,0,224c0-141.392, 114.616-256, 256-256c 141.392,0, 256,114.608, 256,256C 512,365.384, 397.392,480, 256,480z M 256-0.504
1071
  C 132.488-0.504, 32,100.488, 32,224S 132.488,448, 256,448s 224-100.488, 224-224S 379.512-0.504, 256-0.504z M 266.184,320.68
1072
  c-6.248-6.248-6.248-16.376,0-22.624l 57.88-57.88L 143.84,240.176 c-8.84,0-16-7.168-16-16s 7.16-16, 16-16l 181.232,0 l-58.88-58.872
1073
  c-6.248-6.248-6.248-16.376,0-22.624c 3.128-3.128, 7.216-4.688, 11.312-4.688s 8.184,1.56, 11.312,4.688l 94.504,97L 288.816,320.68
1074
  C 282.56,326.928, 272.44,326.928, 266.184,320.68z" />
1075
+ <glyph unicode="&#xe07a;" d="M 256,480C 114.608,480,0,365.384,0,224c0-141.392, 114.608-256, 256-256c 141.384,0, 256,114.608, 256,256C 512,365.384, 397.384,480, 256,480z M 256-0.504
1076
  C 132.488-0.504, 32,100.488, 32,224S 132.488,448, 256,448s 224-100.488, 224-224S 379.512-0.504, 256-0.504z M 368.16,240.168L 187.928,240.168 l 57.88,57.88
1077
  c 6.248,6.248, 6.248,16.376,0,22.624s-16.376,6.248-22.624,0L 128.68,223.672l 94.504-97c 3.128-3.128, 7.216-4.688, 11.312-4.688
1078
  s 8.184,1.56, 11.312,4.688c 6.248,6.248, 6.248,16.376,0,22.624l-58.88,58.872L 368.16,208.168 c 8.84,0, 16,7.168, 16,16S 377,240.168, 368.16,240.168z" />
1079
+ <glyph unicode="&#xe07b;" d="M0,224c0-141.392, 114.616-256, 256-256c 141.392,0, 256,114.608, 256,256C 512,365.384, 397.392,480, 256,480C 114.616,480,0,365.384,0,224z M 480.504,224
1080
  c0-123.512-100.984-224-224.504-224S 32,100.488, 32,224S 132.488,448, 256,448S 480.504,347.512, 480.504,224z M 239.832,336.16l0-180.224 l-57.88,57.88
1081
  c-6.248,6.248-16.376,6.248-22.624,0s-6.248-16.376,0-22.624l 97.008-94.504l 97,94.504c 3.128,3.128, 4.688,7.216, 4.688,11.312
1082
  s-1.56,8.184-4.688,11.312c-6.248,6.248-16.376,6.248-22.624,0l-58.872-58.88L 271.84,336.16 c0,8.84-7.168,16-16,16S 239.832,345, 239.832,336.16z" />
1083
+ <glyph unicode="&#xe07c;" d="M 256,480C 114.616,480,0,365.384,0,224c0-141.392, 114.616-256, 256-256
1084
  c 141.392,0, 256,114.608, 256,256C 512,365.384, 397.392,480, 256,480z M 32,224c0,56.136, 20.808,107.48, 55.048,146.832l 315.928-315.928
1085
  C 363.608,20.464, 312.208-0.504, 256-0.504C 132.488-0.504, 32,100.488, 32,224z M 425.512,77.608L 109.704,393.416C 148.992,427.384, 200.12,448, 256,448
1086
  c 123.512,0, 224-100.488, 224-224C 480,168.168, 459.424,116.984, 425.512,77.608z" />
1087
+ <glyph unicode="&#xe07d;" d="M 256,416c 123.512,0, 224-71.776, 224-160c0-88.216-100.488-160-224-160l-7.568-0.032l-5.688-0.016c-8.792,0-14.544,0.232-23.536,1.576
1088
  l-17.928,2.56l-11.504-13.92c-5.288-6.392-32.272-28.56-62.056-42.832c 6.056,16.016, 10.52,33.504, 10.92,50.8l 0.16,0.952l0,2.736 l0,19.576
1089
  l-17.432,8.904C 64.568,155.36, 32,202.624, 32,256C 32,344.224, 132.488,416, 256,416 M 256,448C 114.6,448,0,362.032,0,256c0-66.032, 39.128-123.576, 106.792-158.168
1090
  c0-0.408-0.128-0.704-0.128-1.16c0-28.688-16.080-60.232-25.504-76.472l 0.024,0 C 80.44,18.456, 80,16.544, 80,14.496
1091
  C 80,6.456, 86.48,0, 94.504,0c 1.208,0, 3.128,0.248, 3.832,0.248c 0.168,0, 0.264,0, 0.248-0.048c 50,8.168, 104.976,52.344, 115.912,65.672
1092
  c 11.24-1.672, 18.832-1.92, 28.24-1.92C 246.704,63.952, 250.984,64, 256,64c 141.376,0, 256,85.952, 256,192C 512,362.032, 397.376,448, 256,448L 256,448z" />
1093
+ <glyph unicode="&#xe07e;" d="M 319.064,368.312c 0.64,0, 1.16-0.504, 1.16-1.12l0-63.936 c0-11.832, 6.528-22.712, 17-28.264c 4.704-2.504, 9.856-3.736, 15-3.736
1094
  c 6.28,0, 13.528,1.84, 18.92,5.496L 480,338.368L 480,110.16 L 370.544,169.92c-5.488,3.832-11.888,5.768-18.328,5.768
1095
  c-5.064,0-10.128-1.2-14.784-3.608c-10.56-5.512-17.2-16.44-17.216-28.344l-0.080-62.92c0-0.624-0.504-1.128-1.144-1.128L 33.144,79.688
1096
  C 32.504,79.688, 32,80.184, 32,80.8l 0.080,286.392c0,0.624, 0.504,1.12, 1.144,1.12L 319.064,368.312 M 495.184,384.328c-3.408,0-10.144-1.008-13.984-4.832
1098
  c0-18.28, 14.816-33.128, 33.144-33.128l 285.856,0 c 18.328,0, 33.144,14.84, 33.144,33.128l 0.080,62.872l 131.488-76.656
1099
  c 3.856-3.84, 8.128-3.344, 11.544-3.344c 3.544,0, 6.184,1.080, 6.512,1.216C 507.984,67.496, 512,73.496, 512,80.248L 512,367.736
1100
  c0,6.752-4.016,12.776-10.232,15.328C 501.408,383.224, 498.752,384.328, 495.184,384.328L 495.184,384.328z" />
1101
+ <glyph unicode="&#xe07f;" d="M 464,368l-73.592,0 L 352,432L 160,432 l-38.4-64L 48,368 c-16,0-48-16-48-47.504L0,64 c0-26.504, 24-48, 44.664-48l 420.336,0 C 486,16, 512,38.496, 512,63.496L 512,320
1102
  C 512,336, 496,368, 464,368z M 480,63.496c0-6.312-10.232-15.144-15-15.504L 44.76,47.992 C 41.056,48.296, 32,55.512, 32,64L 32,320.496
1103
  C 32,330.632, 45.616,335.744, 48,336l 91.72,0 l 9.32,15.536L 178.12,400l 156.824,0 l 28.56-48.472l 8.8-15.528L 464,336 c 11.28,0, 15.84-14.736, 16-16L 480,63.496 z M 256,320
1104
  c-61.856,0-112-50.144-112-112s 50.144-112, 112-112s 112,50.144, 112,112S 317.856,320, 256,320z M 256,128c-44.112,0-80,35.888-80,80s 35.888,80, 80,80
1105
  s 80-35.888, 80-80S 300.112,128, 256,128z" />
1106
+ <glyph unicode="&#xe080;" d="M 256,480C 114.616,480,0,365.384,0,224c0-141.392, 114.616-256, 256-256
1107
  c 141.392,0, 256,114.608, 256,256C 512,365.384, 397.392,480, 256,480z M 256-0.504C 132.488-0.504, 32,100.488, 32,224S 132.488,448, 256,448s 224-100.488, 224-224
1108
  S 379.512-0.504, 256-0.504z M 358.168,317.672L 207.968,166.528l-67.64,67.64c-6.248,6.248-16.376,6.248-22.632,0
1109
  c-6.248-6.248-6.248-16.376,0-22.624l 79.192-79.2c 6.248-6.24, 16.376-6.24, 22.632,0c 0.72,0.72, 1.336,1.504, 1.896,2.32L 380.808,295.040
1110
  c 6.24,6.248, 6.24,16.376,0,22.632C 374.552,323.92, 364.424,323.92, 358.168,317.672z" />
1111
+ <glyph unicode="&#xe081;" d="M 256,480C 114.616,480,0,365.384,0,224c0-141.392, 114.616-256, 256-256
1112
  c 141.392,0, 256,114.608, 256,256C 512,365.384, 397.392,480, 256,480z M 256-0.504C 132.488-0.504, 32,100.488, 32,224S 132.488,448, 256,448s 224-100.488, 224-224
1113
  S 379.512-0.504, 256-0.504z M 272,230.496L 272,384 c0,8.832-7.168,16-16,16s-16-7.168-16-16l0-160 c0-4.528, 1.896-8.6, 4.928-11.504
1114
  c 0.264-0.312, 0.48-0.648, 0.768-0.944l 79.192-79.2c 6.248-6.24, 16.376-6.24, 22.624,0c 6.248,6.248, 6.248,16.384,0,22.632L 272,230.496z" />
1115
+ <glyph unicode="&#xe082;" d="M 256,480C 114.616,480,0,365.384,0,224c0-141.392, 114.616-256, 256-256
1116
  c 141.392,0, 256,114.608, 256,256C 512,365.384, 397.392,480, 256,480z M 256-0.504C 132.488-0.504, 32,100.488, 32,224S 132.488,448, 256,448s 224-100.488, 224-224
1117
  S 379.512-0.504, 256-0.504z M 346.504,314.504c-6.248,6.248-16.376,6.248-22.624,0L 256,246.624l-67.88,67.88
1118
  c-6.248,6.248-16.376,6.248-22.632,0c-6.248-6.248-6.248-16.376,0-22.624L 233.368,224l-67.88-67.88c-6.248-6.24-6.248-16.384,0-22.624
1119
  c 6.248-6.248, 16.376-6.248, 22.632,0L 256,201.376l 67.88-67.88c 6.248-6.248, 16.376-6.248, 22.624,0c 6.248,6.24, 6.248,16.384,0,22.624
1120
  L 278.624,224l 67.88,67.88C 352.76,298.136, 352.76,308.264, 346.504,314.504z" />
1121
+ <glyph unicode="&#xe083;" d="M 381.512,350C 359.2,409.216, 311.232,446.72, 238.784,446.72c-92.192,0-156.696-68.456-162.24-157.768C 32.088,274.736,0,229.392,0,178.032
1122
  c0-62.872, 49.424-115.984, 107.912-115.984l 14.224,0 c 8.832,0, 16,7.16, 16,16s-7.168,16-16,16l-14.224,0 c-41.152,0-76.416,38.456-76.416,83.984
1123
  c0,40.232, 28.208,76.528, 63.592,82.608l 14.52,2.504l-1.296,14.672l-0.12,0.184c 0.008,77.936, 51.304,136.72, 130.592,136.72
1124
  c 63.552,0, 99.256-31.312, 115.776-84.72l 3.416-11.016l 11.536-0.248c 59.432-1.248, 111.544-49.472, 111.544-109.392
1128
  c-4.472-4.688-4.472-12.24,0-16.912l 57.752-63.872c 0.080-0.080, 0.096-0.184, 0.168-0.264l 4.048-4.232
1129
  c 2.248-2.344, 5.184-3.504, 8.144-3.488c 2.936-0.016, 5.888,1.144, 8.112,3.488l 4.048,4.232c 0.080,0.080, 0.12,0.168, 0.184,0.264
1130
  l 59.216,64.872c 4.472,4.672, 4.472,10.224,0,14.912L 323.168,92.264z" />
1131
+ <glyph unicode="&#xe084;" d="M 381.512,350.016C 359.2,409.232, 311.232,446.736, 238.776,446.736c-92.192,0-156.696-68.456-162.24-157.768
1132
  C 32.088,274.752,0,229.408,0,178.048c0-62.872, 49.424-115.984, 107.912-115.984l 46.224,0 c 8.832,0, 16,7.168, 16,16c0,8.84-7.168,16-16,16l-46.224,0
1133
  c-41.152,0-76.416,38.456-76.416,83.984c0,40.232, 28.208,76.528, 63.592,82.608l 14.52,2.504l-1.288,14.664l-0.12,0.184
1134
  c0,77.936, 51.288,136.72, 130.576,136.72c 63.552,0, 99.256-31.312, 115.768-84.72l 3.424-11.016l 11.528-0.248
1138
  l-4.048-4.232c-0.080-0.080-0.096-0.176-0.168-0.256l-57.752-63.872c-4.472-4.672-4.472-12.232,0-16.92l 4.032-2.736
1139
  c 4.472-4.672, 11.72-3.16, 16.184,1.512l 34.056,37.968l0-161.216 c0-8.832, 7.168-16, 16-16s 16,7.168, 16,16L 271.808,178.328 l 35.184-38.816
1140
  c 4.472-4.672, 11.704-6.184, 16.168-1.512l 4.032,2.736c 4.472,4.688, 4.472,12.248,0,16.92L 267.992,222.528z" />
1141
+ <glyph unicode="&#xe085;" d="M 280,480L 104,480 c-17.672,0-32-14.328-32-32l0-448 c0-17.672, 14.328-32, 32-32l 304,0 c 17.672,0, 32,14.328, 32,32L 440,319.992 L 280,480z M 408,306.736L 408,304 L 264,304 L 264,448 l 2.752,0
1142
  L 408,306.736z M 104,0L 104,448 l 128,0 l0-176 l 176,0 l0-272 L 104,0 z" />
1143
+ <glyph unicode="&#xe086;" d="M 511.728,364c 0.496,3.072, 0.088,6.24-1.24,9.136C 506.456,390.856, 493.648,400, 472,400L 56,400 c-19.040,0-39.552-7-49.64-20.736
1144
  c-0.872-0.664-1.704-1.416-2.456-2.288c-3.224-3.72-4.352-8.504-3.632-13.016C 0.128,362.664,0,361.36,0,360l0-256 c0-26.512, 29.496-56, 56-56
1145
  l 416,0 c 26.512,0, 40,29.488, 40,56L 512,360 C 512,361.416, 511.816,362.656, 511.728,364z M 56,368l 416,0 c 0.096,0, 0.144,0, 0.216,0L 256,195.672L 40.656,367.296
1146
  C 45.552,368.2, 51.576,368, 56,368z M 472,80L 56,80 c-8.824,0-24,15.168-24,24L 32,333.224 L 245.52,162.4c 3.008-2.6, 6.744-3.896, 10.48-3.896
1147
  s 7.472,1.296, 10.488,3.896L 480,333.216L 480,104 C 480,95.168, 480.832,80, 472,80z" />
1148
+ <glyph unicode="&#xe087;" d="M 257.736,319.296c-53.016,0-96-42.984-96-96c0-53.008, 42.984-96, 96-96s 96,42.984, 96,96
1149
  C 353.736,276.312, 310.752,319.296, 257.736,319.296z M 257.736,159.296c-35.288,0-64.736,29.408-64.736,64.696c0,35.288, 28.712,64, 64,64
1150
  c 35.296,0, 64-28.712, 64-64C 321,188.704, 293.032,159.296, 257.736,159.296z M 511.84,227.712c-0.184,0.808-0.104,1.664-0.344,2.456
1151
  c-0.104,0.336-0.312,0.528-0.432,0.824c-0.168,0.456-0.128,0.992-0.36,1.432C 464.168,338.976, 363.872,400.304, 256.992,400.304
1156
  c 0.112,0.28, 0.328,0.488, 0.424,0.8c 0.248,0.784, 0.168,1.64, 0.344,2.456c 0.28,1.432, 0.544,2.832, 0.544,4.312
1157
  C 512.392,224.872, 512.128,226.264, 511.84,227.712z M 256,79.704c-90.648,0-179.872,47.784-223.712,143.84
1158
  c 43.424,95.736, 133.84,144.752, 224.712,144.752c 90.84,0, 179.248-49.072, 222.688-144.856C 436.28,127.736, 346.872,79.704, 256,79.704z" />
1159
+ <glyph unicode="&#xe088;" d="M 340,432.336c-80,0-101.328,48-202.656,48C 72,480.336, 32,430.992, 32,430.992l0-447.328
1160
  c0-8.832, 7.168-16, 16-16s 16,7.168, 16,16L 64,187.6 c 16.88,10.888, 40.168,20.736, 69.344,20.736c 101.328,0, 130.656-48, 210.656-48s 136,48, 136,48l0,272
1161
  C 480,480.336, 420,432.336, 340,432.336z M 448,224.64c-18.080-11.792-56.392-32.304-104-32.304c-31.456,0-52.92,8.632-80.112,19.568
1162
  c-33.136,13.32-70.704,28.432-130.544,28.432c-27.344,0-50.536-6.88-69.344-16.080L 64,417.992 c 12.048,10.96, 38.312,30.344, 73.344,30.344
1163
  c 47.056,0, 73.544-11.424, 101.592-23.504c 27.936-12.040, 56.832-24.496, 101.064-24.496c 42.624,0, 80.064,11.784, 108,24.456L 448,224.64 z" />
1164
+ <glyph unicode="&#xe089;" d="M 177.376,392l 39.312-38.624L 226.744,344L 240,344 l 240,0 l0-288 L 32,56 L 32,392 l 144,0 M 192,424L 32,424 c-17.672,0-32-14.328-32-32l0-336 c0-17.672, 14.328-32, 32-32l 448,0
1165
  c 17.672,0, 32,14.328, 32,32L 512,344 c0,17.672-14.328,32-32,32L 240,376 L 192,424L 192,424z" />
1166
+ <glyph unicode="&#xe08a;" d="M 143.992,422.92c 15.688,0, 44.048-7.504, 90.048-52.808l 22.808-22.456l 22.464,22.816C 311.248,402.92, 345.232,423.072, 368,423.072
1167
  c 30.704,0, 54.904-10.504, 78.504-34.048c 22.232-22.184, 34.496-51.68, 34.496-83.056c 0.016-31.392-12.224-60.912-34.704-83.336
1168
  c-1.832-1.856-98.496-106.152-179.48-193.552c-3.816-3.624-8.176-4.16-10.496-4.16c-2.288,0-6.6,0.512-10.4,4.048
1169
  c-19.736,21.952-162.776,181-179.408,197.616C 44.248,248.792, 32,278.312, 32,309.696c 0.008,31.376, 12.256,60.864, 34.52,83.072
1171
  c 16.712-16.72, 178.928-197.168, 178.928-197.168c 9.24-9.248, 21.376-13.84, 33.48-13.84c 12.112,0, 24.2,4.592, 33.456,13.84
1172
  c0,0, 177.44,191.512, 179.328,193.424c 58.52,58.44, 58.52,153.12,0,211.504c-29.056,29-61.512,43.392-101.104,43.392
1173
  c-37.824,0-80-30.16-111.504-62.16C 223.992,424.92, 183.12,454.92, 143.992,454.92L 143.992,454.92z" />
1174
+ <glyph unicode="&#xe08b;" d="M 288,112l-16,0 L 272,255 c0,0.168-0.048,0.328-0.048,0.504S 272,255.832, 272,256c0,8.832-7.168,16-16,16l-32,0 c-8.832,0-16-7.168-16-16
1175
  s 7.168-16, 16-16l 16,0 l0-128 l-16,0 c-8.832,0-16-7.168-16-16s 7.168-16, 16-16l 64,0 c 8.832,0, 16,7.168, 16,16S 296.832,112, 288,112z M 256,304c 17.672,0, 32,14.328, 32,32
1176
  s-14.328,32-32,32s-32-14.328-32-32S 238.328,304, 256,304z M 256,480C 114.616,480,0,365.384,0,224c0-141.392, 114.616-256, 256-256c 141.392,0, 256,114.608, 256,256
1177
  C 512,365.384, 397.392,480, 256,480z M 256-0.504C 132.488-0.504, 32,100.488, 32,224S 132.488,448, 256,448s 224-100.488, 224-224S 379.512-0.504, 256-0.504z" />
1178
+ <glyph unicode="&#xe08c;" d="M 327.848,480c-79.528,0-144-64.576-144-144.232c0-35.704, 13.016-68.312, 34.472-93.504
1179
  c-4.416,0.272-8.92-1.216-12.296-4.592L 44.832,75.48c-6.24-6.248-6.24-16.384,0-22.624c 0.12-0.12, 0.256-0.192, 0.384-0.312
1180
  c 0.040-0.040, 0.064-0.088, 0.104-0.128l 78.456-79.952c 6.24-6.248, 16.376-6.248, 22.624,0s 6.248,16.384,0,22.624l-67.736,69.032l 41.248,41.504
1181
  l 67.864-69.16c 6.24-6.248, 16.376-6.248, 22.624,0s 6.24,16.384,0,22.624l-67.928,69.224l 86.192,86.736c 3.336,3.336, 4.832,7.768, 4.608,12.136
1182
  c 25.312-22.144, 58.336-35.656, 94.584-35.656c 79.528,0, 144,64.576, 144,144.24C 471.848,415.424, 407.384,480, 327.848,480z M 327.848,224
1183
  c-61.624,0-112,50.136-112,112c0,61.872, 50.376,112, 112,112s 112-50.128, 112-112C 439.848,274.136, 389.48,224, 327.848,224z" />
1184
+ <glyph unicode="&#xe08d;" d="M 147.832,113.776c 3.128-3.128, 7.216-4.688, 11.312-4.688s 8.184,1.56, 11.312,4.688L 364.288,309.12
1185
  c 6.248,6.248, 6.248,16.376,0,22.624s-16.376,6.248-22.624,0L 147.832,136.4C 141.576,130.152, 141.576,120.024, 147.832,113.776z M 237.936,147.848
1186
  c 5.288-23.312-0.416-46.2-18.432-64.216l-64.624-62.624c-13.6-13.592-31.68-21.080-50.912-21.080s-37.312,7.488-50.904,21.080
1187
  c-28.072,28.080-28.072,73.768-0.168,101.672l 63.128,65.128c 13.6,13.592, 31.68,21.088, 50.912,21.088c 6.576,0, 12.912-1.176, 19.088-2.872
1193
  c 28.064-28.080, 28.064-73.768, 0.16-101.672l-64.624-64.624c-13.592-13.592-31.688-21.080-50.904-21.080c-4.904,0-9.216-0.496-13.92,0.464
1194
  l-25.488-25.504c 12.736-5.296, 25.816-6.968, 39.408-6.968c 26.608,0, 53.216,10.152, 73.528,30.464l 64.472,64.472
1195
  C 522.176,343.144, 522.176,408.984, 481.568,449.608z" />
1196
+ <glyph unicode="&#xe08e;" d="M 400,288l-16,0 l0,61.064 C 384,422.488, 330.872,480, 255.408,480C 179.64,480, 128,421.264, 128,349.064L 128,288 l-16,0
1197
  c-35.296,0-64-28.704-64-64l0-192 c0-35.296, 28.704-64, 64-64l 288,0 c 35.296,0, 64,28.704, 64,64L 464,224 C 464,259.296, 435.296,288, 400,288z M 160,349.064
1198
  C 160,403.608, 197.28,448, 255.408,448C 312.936,448, 352,404.544, 352,349.064L 352,288 L 160,288 L 160,349.064 z M 432,32c0-17.64-14.36-32-32-32L 112,0 c-17.64,0-32,14.36-32,32L 80,224
1199
  c0,17.64, 14.36,32, 32,32l 288,0 c 17.64,0, 32-14.36, 32-32L 432,32 z M 256,192c-17.672,0-32-14.328-32-32c0-11.816, 6.48-22.016, 16-27.56L 240,80 c0-8.832, 7.168-16, 16-16
1200
  s 16,7.168, 16,16l0,52.44 c 9.52,5.544, 16,15.752, 16,27.56C 288,177.672, 273.672,192, 256,192z" />
1201
+ <glyph unicode="&#xe08f;" d="M 400,287.448L 171.52,287.448 l-8.28,37.136
1202
  c-14.12,52.688, 10.408,105.216, 66.544,120.256c 55.568,14.888, 104.544-16.968, 118.912-70.56l 6.8-26.984c 2.288-8.536, 11.056-13.6, 19.6-11.312
1203
  c 8.536,2.288, 13.6,11.056, 11.312,19.592l-6.808,26.984C 360.608,453.48, 294.408,495.28, 221.504,475.752C 148.32,456.144, 113.648,386.040, 132.336,316.296
1204
  l 6.432-28.848L 112,287.448 c-35.296,0-64-28.704-64-64l0-192 c0-35.296, 28.704-64, 64-64l 288,0 c 35.296,0, 64,28.704, 64,64l0,192 C 464,258.744, 435.296,287.448, 400,287.448z
1205
  M 432,31.448c0-17.64-14.36-32-32-32L 112-0.552 c-17.64,0-32,14.36-32,32l0,192 c0,17.64, 14.36,32, 32,32l 288,0 c 17.64,0, 32-14.36, 32-32L 432,31.448 z M 256,191.448
1206
  c-17.672,0-32-14.328-32-32c0-11.816, 6.48-22.016, 16-27.56l0-52.44 c0-8.832, 7.168-16, 16-16s 16,7.168, 16,16l0,52.44 c 9.52,5.544, 16,15.752, 16,27.56
1207
  C 288,177.12, 273.672,191.448, 256,191.448z" />
1208
+ <glyph unicode="&#xe090;" d="M 507.32-4.52L 351.856,151.896c 28.976,34.704, 46.44,79.352, 46.44,128.104
1209
  c0,110.456-89.544,200-200,200c-110.456,0-200-89.544-200-200c0-110.456, 89.544-200, 200-200c 50.184,0, 96.024,18.528, 131.144,49.072l 155.248-156.224
1210
  c 6.248-6.248, 16.384-6.248, 22.632,0C 513.56-20.904, 513.56-10.776, 507.32-4.52z M 198.296,111.736
1211
  C 105.368,111.736, 30.032,187.072, 30.032,280S 105.368,448.264, 198.296,448.264S 366.56,372.928, 366.56,280S 291.224,111.736, 198.296,111.736z" />
1212
+ <glyph unicode="&#xe091;" d="M 507.312-4.52L 365.8,137.864c 30.304,36.2, 48.544,82.88, 48.544,133.856
1213
  C 414.344,386.752, 321.592,480, 206.568,480S-1.704,386.752-1.704,271.728c0-115.024, 93.248-208.272, 208.272-208.272
1214
  c 52.504,0, 100.336,19.48, 136.848,51.536l 141.264-142.152c 6.248-6.248, 16.384-6.248, 22.624,0C 513.56-20.904, 513.56-10.776, 507.312-4.52z
1215
  M 206.296,96c-96.776,0-176,79.224-176,176s 79.224,176, 176,176s 176-79.224, 176-176S 303.072,96, 206.296,96z M 286.296,288l-64,0 l0,64 c0,8.832-7.168,16-16,16
1216
  s-16-7.168-16-16l0-64 l-64,0 c-8.832,0-16-7.168-16-16s 7.168-16, 16-16l 64,0 l0-64 c0-8.832, 7.168-16, 16-16s 16,7.168, 16,16l0,64 l 64,0 c 8.832,0, 16,7.168, 16,16
1217
  S 295.136,288, 286.296,288z" />
1218
+ <glyph unicode="&#xe092;" d="M 507.312-4.52L 365.8,137.864c 30.304,36.2, 48.544,82.88, 48.544,133.856
1219
  C 414.344,386.752, 321.592,480, 206.568,480S-1.704,386.752-1.704,271.728c0-115.024, 93.248-208.272, 208.272-208.272
1220
  c 52.504,0, 100.336,19.48, 136.848,51.536l 141.264-142.152c 6.248-6.248, 16.384-6.248, 22.624,0C 513.56-20.904, 513.56-10.776, 507.312-4.52z
1221
  M 206.296,96c-96.776,0-176,79.224-176,176s 79.224,176, 176,176s 176-79.224, 176-176S 303.072,96, 206.296,96z M 286.296,288l-160,0 c-8.832,0-16-7.168-16-16
1222
  s 7.168-16, 16-16l 160,0 c 8.832,0, 16,7.168, 16,16S 295.136,288, 286.296,288z" />
1223
+ <glyph unicode="&#xe093;" d="M 86.36-23.816c-21.704,0-42.544,8.984-59.152,25.608C-9.616,38.736-9.616,98.824, 27.2,135.744L 314.336,440.656
1224
  c 44.8,44.872, 113.424,40.84, 163.504-9.304c 22.44-22.48, 35.032-54.888, 34.56-88.952c-0.472-33.704-13.64-65.96-36.144-88.504L 259.248,22.872
1225
  c-6.040-6.472-16.168-6.768-22.616-0.696c-6.432,6.080-6.744,16.224-0.68,22.672l 217.336,231.376c 17,17.032, 26.752,41.192, 27.112,66.624
1226
  c 0.36,25.448-8.832,49.44-25.184,65.832c-30.72,30.784-80.736,46.904-117.92,9.632L 50.168,113.4c-24.688-24.752-24.68-64.504-0.32-88.928
1229
  c-6.44,6.064-6.736,16.224-0.68,22.656l 172.272,183.232c 13.544,13.608, 27.392,20.984, 41.488,22.248c 11,0.976, 27.36-1.368, 44.048-18.104
1230
  c 24.768-24.816, 21.688-61.216-7.64-90.608L 153.592,6.64c-18.24-18.304-40.264-28.936-62.36-30.296
1231
  C 89.608-23.768, 87.984-23.816, 86.36-23.816z" />
1232
+ <glyph unicode="&#xe094;" d="M 502.016,480c-3.048,0-6.76-0.864-11.048-2.68L 13.64,274.776c-17.184-7.288-18.272-21.344-2.416-31.224l 134.88-84.016
1233
  c 15.856-9.872, 36.824-31.040, 46.592-47.024l 80.856-132.384c 4.64-7.592, 10.248-11.36, 15.64-11.36c 5.96,0, 11.64,4.576, 15.512,13.616
1234
  L 508.832,459.256C 514.36,472.192, 511.208,480, 502.016,480z M 162.776,188.040L 53.448,256.144L 420.256,411.768L 184.16,171.672
1235
  C 176.944,178.072, 169.616,183.784, 162.776,188.040z M 286.36,22.368l-65.216,106.76c-3.848,6.304-8.928,13.024-14.592,19.696l 237.192,241.192
1236
  L 286.36,22.368z" />
1237
+ <glyph unicode="&#xe095;" d="M 256,480C 114.616,480,0,365.384,0,224c0-141.392, 114.616-256, 256-256
1238
  c 141.392,0, 256,114.608, 256,256C 512,365.384, 397.392,480, 256,480z M 256-0.504C 132.488-0.504, 32,100.488, 32,224S 132.488,448, 256,448s 224-100.488, 224-224
1239
  S 379.512-0.504, 256-0.504z M 368,240L 272,240 L 272,336 c0,8.832-7.168,16-16,16s-16-7.168-16-16l0-96 L 144,240 c-8.832,0-16-7.168-16-16s 7.168-16, 16-16l 96,0 l0-96
1240
  c0-8.832, 7.168-16, 16-16s 16,7.168, 16,16L 272,208 l 96,0 c 8.832,0, 16,7.168, 16,16S 376.832,240, 368,240z" />
1241
+ <glyph unicode="&#xe096;" d="M 257.832,480.184C 152.88,480.184, 64,390.8, 64,284.912c0-110.88, 103.016-224.272, 172.312-303.968c 0.264-0.32, 11.464-12.76, 25.264-12.76
1242
  l 1.224,0 c 13.8,0, 24.92,12.44, 25.2,12.76c 65.032,74.76, 160,198.024, 160,303.968C 448,390.8, 378.672,480.184, 257.832,480.184z M 264.248,2.408
1243
  c-0.56-0.56-1.376-1.184-2.096-1.704c-0.736,0.504-1.536,1.144-2.128,1.704l-8.368,9.624C 185.96,87.4, 96,190.608, 96,284.912
1244
  c0,88.504, 74.112,163.28, 161.832,163.28C 367.096,448.192, 416,366.192, 416,284.912C 416,213.32, 364.936,118.264, 264.248,2.408z M 256.56,383.296
1245
  c-53.016,0-96-42.984-96-96s 42.984-96, 96-96s 96,42.984, 96,96S 309.576,383.296, 256.56,383.296z M 256.56,223.296
1246
  c-35.288,0-64.736,29.408-64.736,64.704c0,35.288, 28.712,64, 64,64c 35.312,0, 64-28.712, 64-64C 319.84,252.704, 291.872,223.296, 256.56,223.296z" />
1247
+ <glyph unicode="&#xe097;" d="M 350.776,397.952c-8,3.728-17.512,0.296-21.264-7.712c-3.76-8-0.296-17.52, 7.704-21.272
1248
  c 81.168-38, 125.248-125.976, 107.176-213.936c-21.456-104.44-123.832-171.904-228.28-150.512c-50.584,10.392-92.104,39.856-120.528,82.968
1249
  c-28.432,43.128-38.368,94.752-27.976,145.336c 12.352,60.112, 51.312,109.664, 106.88,135.952c 7.984,3.776, 11.4,13.312, 7.616,21.304
1250
  c-3.776,7.976-13.296,11.368-21.296,7.616C 96.056,367.064, 50.664,309.328, 36.264,239.264c-12.112-58.968-0.536-119.128, 32.592-169.392
1251
  c 33.136-50.24, 81.848-84.584, 140.816-96.704c 15.216-3.128, 30.408-4.624, 45.376-4.624c 104.728,0, 198.824,73.56, 220.688,180.056
1252
  C 496.792,251.104, 445.408,353.648, 350.776,397.952z M 256.008,272c 8.832,0, 16,7.168, 16,16L 272.008,464 c0,8.832-7.168,16-16,16c-8.832,0-16-7.168-16-16l0-176
1253
  C 240.008,279.168, 247.176,272, 256.008,272z" />
1254
+ <glyph unicode="&#xe098;" d="M 248.704,30.72c-0.040,0.096-0.136,0.16-0.192,0.24l-45.96,71.832
1255
  c-3.264,5.36-10.344,7.264-15.864,4.256l-4.096-2.52c-5.504-3-5.384-10.768-2.128-16.128l 29.464-45.704
1256
  c-2.512,0.552-5.048,1-7.528,1.648c-51.592,13.496-95.248,48.416-119.768,95.8c-23.168,44.76-27.52,95.848-12.256,143.872
1257
  c 15.256,48.024, 49.888,87.232, 94.648,110.392c 7.624,3.944, 10.6,13.32, 6.656,20.928c-3.936,7.632-13.32,10.616-20.928,6.664
1266
  c 6.504-1, 12.984-2.208, 19.312-3.88c 51.616-13.52, 93.696-48.432, 118.2-95.784c 23.16-44.76, 27.512-95.848, 12.24-143.864
1267
  c-15.256-48.024-48.328-87.224-93.088-110.408c-7.616-3.944-10.584-13.304-6.64-20.936c 2.76-5.32, 8.168-8.384, 13.8-8.384
1268
  c 2.4,0, 4.832,0.56, 7.136,1.744c 52.136,26.968, 90.624,72.64, 108.408,128.56C 489.008,207.968, 483.936,267.48, 456.952,319.592z" />
1269
+ <glyph unicode="&#xe099;" d="M 255.64,480C 127.736,480, 23.68,375.936, 23.68,248.032
1270
  c0-120.224, 92.648-220.768, 211.784-231.048l-45.928-23.28c-5.672-3.112-9.048-10.112-5.688-15.64l 1.624-4.2
1271
  c 3.376-5.528, 10.688-7.488, 16.344-4.392l 76.656,39.248c 0.096,0.064, 0.2,0.048, 0.296,0.112l 5.144,2.816
1272
  c 2.84,1.56, 4.72,4.112, 5.472,6.952c 0.784,2.84, 0.424,6-1.264,8.752l-3.048,5c-0.048,0.096-0.144,0.16-0.2,0.248
1274
  c-0.152,0.008-0.288,0.064-0.432,0.072C 137.64,55.376, 55.68,143.032, 55.68,248.032C 55.68,358.296, 145.384,448, 255.64,448
1275
  c 110.272,0, 200.48-89.704, 200.48-199.968c0-63.488-29.16-121.8-80-159.984c-7.064-5.312-8.488-15.344-3.184-22.408
1276
  c 5.312-7.080, 15.344-8.488, 22.408-3.184c 58.968,44.296, 92.784,111.936, 92.784,185.576C 488.12,375.936, 383.552,480, 255.64,480z" />
1277
+ <glyph unicode="&#xe09a;" d="M 480.248,272.472l-41.064,9.112c-3.2,10.24-7.392,20.040-12.2,29.464l 22.216,37.016c 8.296,13.256, 12.488,32.76,0,45.256l-22.64,22.624
1278
  c-12.488,12.496-33.576,10.248-46.312,1.416l-36.016-22.944c-9.344,4.848-19.112,9-29.264,12.28l-9.216,41.56
1279
  C 303,463.496, 289.672,480, 272,480l-32,0 c-17.672,0-28.504-16.752-32-32l-10.264-41.064c-10.84-3.456-21.248-7.872-31.168-13.104l-36.92,23.512
1280
  c-12.728,8.832-33.824,11.080-46.312-1.416l-22.632-22.624c-12.496-12.504-8.304-32,0-45.256l 23.376-38.96
1298
  c 3.576-0.664, 6.36-2.728, 6.952-3.848L 480.016,208.976z M 256.216,320.16c-53.136,0-96.368-43.144-96.368-96.16
1299
  c0-53.008, 43.232-96.152, 96.368-96.152c 53.136,0, 96.368,43.144, 96.368,96.152C 352.584,277.016, 309.352,320.16, 256.216,320.16z M 256,160
1300
  c-35.288,0-64,28.712-64,64c0,35.296, 28.712,64, 64,64c 35.296,0, 64-28.704, 64-64C 320,188.712, 291.288,160, 256,160z" />
1301
+ <glyph unicode="&#xe09b;" d="M 256,441.256l 58.472-121.264l 10.264-21.28l 23.392-3.488l 132.912-19.744L 384.112,178.808l-16.28-16.248l 3.808-22.656l 22.64-135.080
1302
  l-117.136,63l-21.168,11.392l-21.168-11.392L 117.68,4.792l 22.648,135.112l 3.792,22.656l-16.28,16.248L 30.952,275.496l 132.912,19.744
1303
  l 23.384,3.488l 10.272,21.272L 256,441.256 M 255.992,472.224c-14.328,0-27.392-8.088-33.488-20.728l-57.952-120.32L 31.2,311.344
1304
  c-13.696-2.048-25.072-11.4-29.488-24.192c-4.408-12.832-1.072-26.952, 8.6-36.576l 97.704-97.6l-22.664-135.328
1306
  l 116.256-62.592c 5.592-2.992, 11.752-4.488, 17.888-4.488c 7.48,0, 14.952,2.208, 21.328,6.576c 11.552,7.976, 17.456,21.648, 15.16,35.288
1307
  l-22.672,135.328l 97.752,97.6c 9.672,9.624, 12.984,23.752, 8.576,36.576c-4.424,12.808-15.8,22.16-29.488,24.192l-133.328,19.832l-57.984,120.32
1308
  C 283.424,464.152, 270.352,472.224, 255.992,472.224L 255.992,472.224z" />
1309
+ <glyph unicode="&#xe09c;" d="M 311.848,480.112c-110.456,0-200-89.536-200-200c0-49.256, 17.84-94.336, 47.368-129.184
1310
  l-63.656-64.048l-67.632,68.272c-6.24,6.248-16.376,6.248-22.624,0s-6.248-16.376,0-22.624l 67.696-68.344l-68.176-68.592
1311
  c-6.248-6.248-6.248-16.392,0-22.624c 6.24-6.248, 16.376-6.248, 22.624,0l 68.072,68.496l 68.232-68.88c 6.248-6.248, 16.376-6.248, 22.624,0
1312
  s 6.248,16.376,0,22.624l-68.304,68.952l 63.704,64.096c 34.976-29.984, 80.384-48.144, 130.064-48.144c 110.456,0, 200,89.544, 200,200
1313
  C 511.848,390.576, 422.304,480.112, 311.848,480.112z M 311.848,111.84c-92.928,0-168.264,75.344-168.264,168.272
1314
  c0,92.928, 75.336,168.264, 168.264,168.264s 168.264-75.336, 168.264-168.264C 480.12,187.184, 404.784,111.84, 311.848,111.84z" />
1315
+ <glyph unicode="&#xe09d;" d="M 511.648,468.672c 0.072,3.24-0.688,6.144-2.792,8.216
1316
  c-2.072,2.088-4.976,3.36-8.2,3.264l-5.848-0.136c-0.112,0-0.192-0.040-0.32-0.056L 347.736,480.472
1317
  c-6.464-0.144-11.808-5.496-11.96-11.96L 335.76,460.296c 0.984-7.624, 6.976-12.080, 13.44-11.936l 107.608-0.216L 328.736,320.848
1318
  c-34.744,29.12-79.504,46.68-128.384,46.68c-110.464,0-200-89.536-200-200c0-110.456, 89.536-200, 200-200c 110.456,0, 200,89.544, 200,200
1320
  c 6.48,0.152, 11.824,4, 11.96,10.464l 0.336,147.504c0,0.12-0.44,0.2-0.44,0.312L 511.648,468.672z M 368.616,167.528
1321
  c0-92.928-75.336-168.264-168.272-168.264c-92.928,0-168.264,75.336-168.264,168.264s 75.336,168.264, 168.264,168.264
1322
  C 293.28,335.8, 368.616,260.464, 368.616,167.528z" />
1323
+ <glyph unicode="&#xe09e;" d="M 496,240l-48.72,0 C 439.584,333.264, 365.256,407.52, 272,415.232L 272,464 c0,8.832-7.168,16-16,16
1324
  s-16-7.168-16-16l0-48.768 C 146.752,407.52, 72.416,333.264, 64.712,240L 16,240 c-8.832,0-16-7.168-16-16s 7.168-16, 16-16l 48.712,0
1325
  C 72.416,114.744, 146.752,40.48, 240,32.768L 240-16 c0-8.832, 7.168-16, 16-16s 16,7.168, 16,16l0,48.768 C 365.256,40.48, 439.584,114.744, 447.28,208L 496,208
1326
  c 8.832,0, 16,7.168, 16,16S 504.832,240, 496,240z M 240,383.208L 240,240 L 96.776,240 C 104.28,315.6, 164.4,375.704, 240,383.208z M 96.776,208L 240,208 l0-143.208
1327
  C 164.4,72.296, 104.28,132.4, 96.776,208z M 272,64.792L 272,208 l 143.224,0 C 407.72,132.4, 347.6,72.296, 272,64.792z M 272,240L 272,383.208
1328
  C 347.6,375.704, 407.72,315.6, 415.224,240L 272,240 z" />
1329
+ <glyph unicode="&#xe09f;" d="M 327.384,447.048c-5.216,2.776-11.544,2.464-16.456-0.848L 150.384,320.144l-53.312-0.040c-27.256,0-49.44-19.328-49.44-43.2
1330
  l 0.856-105.568c0-23.768, 22.176-43.112, 49.432-43.112l 53.296-0.032l 159.696-126.376c 2.688-1.816, 5.816-2.736, 8.952-2.736
1331
  c 2.576,0, 5.16,0.624, 7.504,1.872c 5.232,2.768, 8.504,8.2, 8.504,14.128L 335.872,432.92 C 335.864,438.832, 332.6,444.264, 327.384,447.048z
1332
  M 303.864,45.184l-138.8,112.264c-2.64,1.784-5.76,2.736-8.944,2.736l-58.192,0.032c-10.272,0-17.44,5.856-17.44,11.232L 79.632,277.024
1334
  c-8.856,1.464-16.968-4.432-18.424-13.152c-1.456-8.712, 4.44-16.96, 13.144-18.416c 25.16-4.2, 42.736-26.152, 42.736-53.376
1335
  c0-25.92-18.184-48.344-43.248-53.344c-8.672-1.72-14.296-10.144-12.56-18.816c 1.512-7.608, 8.184-12.872, 15.672-12.872
1336
  c 1.032,0, 2.096,0.096, 3.144,0.312c 39.984,7.952, 69,43.592, 69,84.72C 464.368,263.752, 435.152,299.472, 394.912,306.184z" />
1337
+ <glyph unicode="&#xe0a0;" d="M 287.248,447.048c-5.216,2.776-11.544,2.464-16.456-0.848L 110.248,320.144l-53.312-0.040c-27.256,0-49.44-19.328-49.44-43.2
1338
  l 0.856-105.568c0-23.768, 22.176-43.112, 49.432-43.112l 53.296-0.032l 159.696-126.376c 2.688-1.816, 5.816-2.736, 8.952-2.736
1339
  c 2.576,0, 5.16,0.624, 7.504,1.872c 5.232,2.768, 8.504,8.2, 8.504,14.128L 295.736,432.92 C 295.736,438.832, 292.472,444.264, 287.248,447.048z
1340
  M 263.736,45.184l-138.8,112.264c-2.64,1.784-5.76,2.736-8.944,2.736l-58.192,0.032c-10.272,0-17.44,5.856-17.44,11.232L 39.504,277.024
1346
  c 48.264-18.008, 80.688-64.952, 80.688-116.816c0-51.888-32.424-98.92-80.656-117c-8.28-3.112-12.472-12.328-9.376-20.592
1347
  c 2.408-6.44, 8.504-10.392, 14.984-10.392c 1.872,0, 3.768,0.328, 5.608,1.016c 60.672,22.752, 101.44,81.816, 101.44,146.968
1348
  C 504.504,286.4, 463.704,345.392, 403,368.048z" />
1349
+ <glyph unicode="&#xe0a1;" d="M 287.768,447.048c-5.216,2.776-11.544,2.464-16.456-0.848L 110.76,320.144l-53.312-0.040
1350
  c-27.256,0-49.44-19.328-49.44-43.2l 0.856-105.568c0-23.768, 22.176-43.112, 49.432-43.112l 53.296-0.032l 159.696-126.376
1351
  c 2.688-1.816, 5.816-2.736, 8.952-2.736c 2.576,0, 5.16,0.624, 7.504,1.872c 5.232,2.768, 8.504,8.2, 8.504,14.128L 296.248,432.92
1352
  C 296.248,438.832, 292.984,444.264, 287.768,447.048z M 264.248,45.184l-138.8,112.264c-2.64,1.784-5.76,2.736-8.944,2.736l-58.192,0.032
1354
  l 139.664,112L 264.248,45.184 z M 447,223.744l 52.296,52.92c 6.248,6.248, 6.248,16.376,0,22.624c-6.232,6.248-16.376,6.248-22.624,0l-52.168-52.784
1355
  l-52.168,52.784c-6.232,6.248-16.376,6.248-22.624,0s-6.248-16.376,0-22.624l 52.296-52.92l-51.8-52.408c-6.232-6.24-6.248-16.376,0-22.624
1356
  s 16.392-6.248, 22.64,0l 51.656,52.272l 51.656-52.272c 6.248-6.248, 16.376-6.248, 22.624,0s 6.248,16.384,0,22.624L 447,223.744z" />
1357
+ <glyph unicode="&#xe001;" d="M 373,62.36L 272.264,118.16c 37.44,29.456, 47.608,87.344, 47.608,119.8l0,67.56 c0,44.736-59.44,94.56-119.144,94.56
1358
  c-59.688,0-120.704-49.832-120.704-94.56l0-67.56 c0-29.512, 12.488-89.216, 50.312-119.544L 27,62.36c0,0-27-12.032-27-27.032l0-40.544
1359
  c0-14.92, 12.112-27.032, 27-27.032l 346,0 c 14.904,0, 27.016,12.112, 27.016,27.032l0,40.544 C 400.016,51.232, 373,62.36, 373,62.36z
1360
  M 368.016-0.248L 32-0.248 l0,28.608 c 2.296,1.672, 5.504,3.608, 8.032,4.768c 0.752,0.344, 1.504,0.704, 2.216,1.112l 103.344,56.048
1367
  c-8.456-6.656-13-17.112-12.112-27.832c 0.904-10.72, 7.128-20.264, 16.56-25.424l 102.232-55.8c 0.888-0.488, 2.016-1.016, 2.952-1.424
1368
  c 2.36-1, 5.264-2.672, 7.392-4.144l0-28.456 l-64.592,0 c 9.752-7.36, 12.704-17.888, 16.488-32l 53.096,0 c 14.904,0, 27.016,12.112, 27.016,27.032l0,40.048
1369
  C 512,130.904, 484.984,142.032, 484.984,142.032z" />
1370
+ <glyph unicode="&#x20;" horiz-adv-x="256" />
1371
  </font>
1372
  </defs>
1373
  </svg>
assets/global/plugins/icons/icons-lte-ie7.js CHANGED
@@ -169,21 +169,21 @@ window.onload = function () {
169
  'icon-volume-2': '&#xe0a0;',
170
  'icon-volume-off': '&#xe0a1;'
171
  },
172
- els = document.getElementsByTagName('*'),
173
- i, attr, c, el;
174
  for (i = 0; ; i += 1) {
175
  el = els[i];
176
  if (!el) {
177
- break;
178
  }
179
  attr = el.getAttribute('data-icon');
180
  if (attr) {
181
- addIcon(el, attr);
182
  }
183
  c = el.className;
184
  c = c.match(/icon-[^\s'"]+/);
185
  if (c && icons[c[0]]) {
186
- addIcon(el, icons[c[0]]);
187
  }
188
  }
189
  };
169
  'icon-volume-2': '&#xe0a0;',
170
  'icon-volume-off': '&#xe0a1;'
171
  },
172
+ els = document.getElementsByTagName('*'),
173
+ i, attr, c, el;
174
  for (i = 0; ; i += 1) {
175
  el = els[i];
176
  if (!el) {
177
+ break;
178
  }
179
  attr = el.getAttribute('data-icon');
180
  if (attr) {
181
+ addIcon(el, attr);
182
  }
183
  c = el.className;
184
  c = c.match(/icon-[^\s'"]+/);
185
  if (c && icons[c[0]]) {
186
+ addIcon(el, icons[c[0]]);
187
  }
188
  }
189
  };
assets/global/plugins/toastr/toastr.css CHANGED
@@ -140,15 +140,15 @@ button.toast-close-button
140
  #toast-container>.toast-custom-error
141
  {
142
  /*background-image:
143
- url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHOSURBVEhLrZa/SgNBEMZzh0WKCClSCKaIYOED+AAKeQQLG8HWztLCImBrYadgIdY+gIKNYkBFSwu7CAoqCgkkoGBI/E28PdbLZmeDLgzZzcx83/zZ2SSXC1j9fr+I1Hq93g2yxH4iwM1vkoBWAdxCmpzTxfkN2RcyZNaHFIkSo10+8kgxkXIURV5HGxTmFuc75B2RfQkpxHG8aAgaAFa0tAHqYFfQ7Iwe2yhODk8+J4C7yAoRTWI3w/4klGRgR4lO7Rpn9+gvMyWp+uxFh8+H+ARlgN1nJuJuQAYvNkEnwGFck18Er4q3egEc/oO+mhLdKgRyhdNFiacC0rlOCbhNVz4H9FnAYgDBvU3QIioZlJFLJtsoHYRDfiZoUyIxqCtRpVlANq0EU4dApjrtgezPFad5S19Wgjkc0hNVnuF4HjVA6C7QrSIbylB+oZe3aHgBsqlNqKYH48jXyJKMuAbiyVJ8KzaB3eRc0pg9VwQ4niFryI68qiOi3AbjwdsfnAtk0bCjTLJKr6mrD9g8iq/S/B81hguOMlQTnVyG40wAcjnmgsCNESDrjme7wfftP4P7SP4N3CJZdvzoNyGq2c/HWOXJGsvVg+RA/k2MC/wN6I2YA2Pt8GkAAAAASUVORK5CYII=")
144
- !important*/
145
  background-image: url("../../img/error.png") !important;
146
  }
147
  #toast-container>.toast-custom-success
148
  {
149
  /*background-image:
150
- url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADsSURBVEhLY2AYBfQMgf///3P8+/evAIgvA/FsIF+BavYDDWMBGroaSMMBiE8VC7AZDrIFaMFnii3AZTjUgsUUWUDA8OdAH6iQbQEhw4HyGsPEcKBXBIC4ARhex4G4BsjmweU1soIFaGg/WtoFZRIZdEvIMhxkCCjXIVsATV6gFGACs4Rsw0EGgIIH3QJYJgHSARQZDrWAB+jawzgs+Q2UO49D7jnRSRGoEFRILcdmEMWGI0cm0JJ2QpYA1RDvcmzJEWhABhD/pqrL0S0CWuABKgnRki9lLseS7g2AlqwHWQSKH4oKLrILpRGhEQCw2LiRUIa4lwAAAABJRU5ErkJggg==")
151
- !important*/
152
  background-image: url("../../img/success.png") !important
153
  }
154
  #toast-container>.toast-warning
140
  #toast-container>.toast-custom-error
141
  {
142
  /*background-image:
143
+ url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHOSURBVEhLrZa/SgNBEMZzh0WKCClSCKaIYOED+AAKeQQLG8HWztLCImBrYadgIdY+gIKNYkBFSwu7CAoqCgkkoGBI/E28PdbLZmeDLgzZzcx83/zZ2SSXC1j9fr+I1Hq93g2yxH4iwM1vkoBWAdxCmpzTxfkN2RcyZNaHFIkSo10+8kgxkXIURV5HGxTmFuc75B2RfQkpxHG8aAgaAFa0tAHqYFfQ7Iwe2yhODk8+J4C7yAoRTWI3w/4klGRgR4lO7Rpn9+gvMyWp+uxFh8+H+ARlgN1nJuJuQAYvNkEnwGFck18Er4q3egEc/oO+mhLdKgRyhdNFiacC0rlOCbhNVz4H9FnAYgDBvU3QIioZlJFLJtsoHYRDfiZoUyIxqCtRpVlANq0EU4dApjrtgezPFad5S19Wgjkc0hNVnuF4HjVA6C7QrSIbylB+oZe3aHgBsqlNqKYH48jXyJKMuAbiyVJ8KzaB3eRc0pg9VwQ4niFryI68qiOi3AbjwdsfnAtk0bCjTLJKr6mrD9g8iq/S/B81hguOMlQTnVyG40wAcjnmgsCNESDrjme7wfftP4P7SP4N3CJZdvzoNyGq2c/HWOXJGsvVg+RA/k2MC/wN6I2YA2Pt8GkAAAAASUVORK5CYII=")
144
+ !important*/
145
  background-image: url("../../img/error.png") !important;
146
  }
147
  #toast-container>.toast-custom-success
148
  {
149
  /*background-image:
150
+ url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADsSURBVEhLY2AYBfQMgf///3P8+/evAIgvA/FsIF+BavYDDWMBGroaSMMBiE8VC7AZDrIFaMFnii3AZTjUgsUUWUDA8OdAH6iQbQEhw4HyGsPEcKBXBIC4ARhex4G4BsjmweU1soIFaGg/WtoFZRIZdEvIMhxkCCjXIVsATV6gFGACs4Rsw0EGgIIH3QJYJgHSARQZDrWAB+jawzgs+Q2UO49D7jnRSRGoEFRILcdmEMWGI0cm0JJ2QpYA1RDvcmzJEWhABhD/pqrL0S0CWuABKgnRki9lLseS7g2AlqwHWQSKH4oKLrILpRGhEQCw2LiRUIa4lwAAAABJRU5ErkJggg==")
151
+ !important*/
152
  background-image: url("../../img/success.png") !important
153
  }
154
  #toast-container>.toast-warning
assets/global/plugins/toastr/toastr.js CHANGED
@@ -2,344 +2,344 @@
2
  (function (define) {
3
  define(['jquery'], function ($) {
4
  return (function () {
5
- var $container;
6
- var listener;
7
- var toastId = 0;
8
- var toastType = {
9
- error: 'error',
10
- info: 'info',
11
- success: 'success',
12
- warning: 'warning'
13
- };
14
-
15
- var toastr = {
16
- clear: clear,
17
- remove: remove,
18
- error: error,
19
- getContainer: getContainer,
20
- info: info,
21
- options: {},
22
- subscribe: subscribe,
23
- success: success,
24
- version: '2.1.0',
25
- warning: warning
26
- };
27
-
28
- var previousToast;
29
-
30
- return toastr;
31
-
32
- //#region Accessible Methods
33
- function error(message, title, optionsOverride) {
34
- return notify({
35
- type: toastType.error,
36
- iconClass: getOptions().iconClasses.error,
37
- message: message,
38
- optionsOverride: optionsOverride,
39
- title: title
40
- });
41
- }
42
-
43
- function getContainer(options, create) {
44
- if (!options) {
45
- options = getOptions();
46
- }
47
- $container = $('#' + options.containerId);
48
- if ($container.length) {
49
- return $container;
50
- }
51
- if (create) {
52
- $container = createContainer(options);
53
- }
54
- return $container;
55
- }
56
-
57
- function info(message, title, optionsOverride) {
58
- return notify({
59
- type: toastType.info,
60
- iconClass: getOptions().iconClasses.info,
61
- message: message,
62
- optionsOverride: optionsOverride,
63
- title: title
64
- });
65
- }
66
-
67
- function subscribe(callback) {
68
- listener = callback;
69
- }
70
-
71
- function success(message, title, optionsOverride) {
72
- return notify({
73
- type: toastType.success,
74
- iconClass: getOptions().iconClasses.success,
75
- message: message,
76
- optionsOverride: optionsOverride,
77
- title: title
78
- });
79
- }
80
-
81
- function warning(message, title, optionsOverride) {
82
- return notify({
83
- type: toastType.warning,
84
- iconClass: getOptions().iconClasses.warning,
85
- message: message,
86
- optionsOverride: optionsOverride,
87
- title: title
88
- });
89
- }
90
-
91
- function clear($toastElement) {
92
- var options = getOptions();
93
- if (!$container) {
94
- getContainer(options);
95
- }
96
- if (!clearToast($toastElement, options)) {
97
- clearContainer(options);
98
- }
99
- }
100
-
101
- function remove($toastElement) {
102
- var options = getOptions();
103
- if (!$container) {
104
- getContainer(options);
105
- }
106
- if ($toastElement && $(':focus', $toastElement).length === 0) {
107
- removeToast($toastElement);
108
- return;
109
- }
110
- if ($container.children().length) {
111
- $container.remove();
112
- }
113
- }
114
- //#endregion
115
-
116
- //#region Internal Methods
117
-
118
- function clearContainer(options) {
119
- var toastsToClear = $container.children();
120
- for (var i = toastsToClear.length - 1; i >= 0; i--) {
121
- clearToast($(toastsToClear[i]), options);
122
- }
123
- ;
124
- }
125
-
126
- function clearToast($toastElement, options) {
127
- if ($toastElement && $(':focus', $toastElement).length === 0) {
128
- $toastElement[options.hideMethod]({
129
- duration: options.hideDuration,
130
- easing: options.hideEasing,
131
- complete: function () {
132
- removeToast($toastElement);
133
- }
134
- });
135
- return true;
136
- }
137
- return false;
138
- }
139
-
140
- function createContainer(options) {
141
- $container = $('<div/>')
142
- .attr('id', options.containerId)
143
- .addClass(options.positionClass)
144
- .attr('aria-live', 'polite')
145
- .attr('role', 'alert');
146
-
147
- $container.appendTo($(options.target));
148
- return $container;
149
- }
150
-
151
- function getDefaults() {
152
- return {
153
- tapToDismiss: true,
154
- toastClass: 'toast',
155
- containerId: 'toast-container',
156
- debug: false,
157
-
158
- showMethod: 'fadeIn', //fadeIn, slideDown, and show are built into jQuery
159
- showDuration: 300,
160
- showEasing: 'swing', //swing and linear are built into jQuery
161
- onShown: undefined,
162
- hideMethod: 'fadeOut',
163
- hideDuration: 1000,
164
- hideEasing: 'swing',
165
- onHidden: undefined,
166
-
167
- extendedTimeOut: 1000,
168
- iconClasses: {
169
- error: 'toast-custom-error',
170
- info: 'toast-info',
171
- success: 'toast-custom-success',
172
- warning: 'toast-warning'
173
- },
174
- iconClass: 'toast-info',
175
- positionClass: 'toast-top-right',
176
- timeOut: 5000, // Set timeOut and extendedTimeOut to 0 to make it sticky
177
- titleClass: 'toast-title',
178
- messageClass: 'toast-message',
179
- target: 'body',
180
- closeHtml: '<button>&times;</button>',
181
- newestOnTop: true,
182
- preventDuplicates: false
183
- };
184
- }
185
-
186
- function publish(args) {
187
- if (!listener) {
188
- return;
189
- }
190
- listener(args);
191
- }
192
-
193
- function notify(map) {
194
- var options = getOptions(),
195
- iconClass = map.iconClass || options.iconClass;
196
-
197
- if (options.preventDuplicates) {
198
- if (map.message === previousToast) {
199
- return;
200
- } else {
201
- previousToast = map.message;
202
- }
203
- }
204
-
205
- if (typeof (map.optionsOverride) !== 'undefined') {
206
- options = $.extend(options, map.optionsOverride);
207
- iconClass = map.optionsOverride.iconClass || iconClass;
208
- }
209
-
210
- toastId++;
211
-
212
- $container = getContainer(options, true);
213
- var intervalId = null,
214
- $toastElement = $('<div/>'),
215
- $titleElement = $('<div/>'),
216
- $messageElement = $('<div/>'),
217
- $closeElement = $(options.closeHtml),
218
- response = {
219
- toastId: toastId,
220
- state: 'visible',
221
- startTime: new Date(),
222
- options: options,
223
- map: map
224
- };
225
-
226
- if (map.iconClass) {
227
- $toastElement.addClass(options.toastClass).addClass(iconClass);
228
- }
229
-
230
- if (map.title) {
231
- $titleElement.append(map.title).addClass(options.titleClass);
232
- $toastElement.append($titleElement);
233
- }
234
-
235
- if (map.message) {
236
- $messageElement.append(map.message).addClass(options.messageClass);
237
- $toastElement.append($messageElement);
238
- }
239
-
240
- if (options.closeButton) {
241
- $closeElement.addClass('toast-close-button').attr("role", "button");
242
- $toastElement.prepend($closeElement);
243
- }
244
-
245
- $toastElement.hide();
246
- if (options.newestOnTop) {
247
- $container.prepend($toastElement);
248
- } else {
249
- $container.append($toastElement);
250
- }
251
-
252
-
253
- $toastElement[options.showMethod](
254
- {duration: options.showDuration, easing: options.showEasing, complete: options.onShown}
255
- );
256
-
257
- if (options.timeOut > 0) {
258
- intervalId = setTimeout(hideToast, options.timeOut);
259
- }
260
-
261
- $toastElement.hover(stickAround, delayedHideToast);
262
- if (!options.onclick && options.tapToDismiss) {
263
- $toastElement.click(hideToast);
264
- }
265
-
266
- if (options.closeButton && $closeElement) {
267
- $closeElement.click(function (event) {
268
- if (event.stopPropagation) {
269
- event.stopPropagation();
270
- } else if (event.cancelBubble !== undefined && event.cancelBubble !== true) {
271
- event.cancelBubble = true;
272
- }
273
- hideToast(true);
274
- });
275
- }
276
-
277
- if (options.onclick) {
278
- $toastElement.click(function () {
279
- options.onclick();
280
- hideToast();
281
- });
282
- }
283
-
284
- publish(response);
285
-
286
- if (options.debug && console) {
287
- console.log(response);
288
- }
289
-
290
- return $toastElement;
291
-
292
- function hideToast(override) {
293
- if ($(':focus', $toastElement).length && !override) {
294
- return;
295
- }
296
- return $toastElement[options.hideMethod]({
297
- duration: options.hideDuration,
298
- easing: options.hideEasing,
299
- complete: function () {
300
- removeToast($toastElement);
301
- if (options.onHidden && response.state !== 'hidden') {
302
- options.onHidden();
303
- }
304
- response.state = 'hidden';
305
- response.endTime = new Date();
306
- publish(response);
307
- }
308
- });
309
- }
310
-
311
- function delayedHideToast() {
312
- if (options.timeOut > 0 || options.extendedTimeOut > 0) {
313
- intervalId = setTimeout(hideToast, options.extendedTimeOut);
314
- }
315
- }
316
-
317
- function stickAround() {
318
- clearTimeout(intervalId);
319
- $toastElement.stop(true, true)[options.showMethod](
320
- {duration: options.showDuration, easing: options.showEasing}
321
- );
322
- }
323
- }
324
-
325
- function getOptions() {
326
- return $.extend({}, getDefaults(), toastr.options);
327
- }
328
-
329
- function removeToast($toastElement) {
330
- if (!$container) {
331
- $container = getContainer();
332
- }
333
- if ($toastElement.is(':visible')) {
334
- return;
335
- }
336
- $toastElement.remove();
337
- $toastElement = null;
338
- if ($container.children().length === 0) {
339
- $container.remove();
340
- }
341
- }
342
- //#endregion
343
 
344
  })();
345
  });
2
  (function (define) {
3
  define(['jquery'], function ($) {
4
  return (function () {
5
+ var $container;
6
+ var listener;
7
+ var toastId = 0;
8
+ var toastType = {
9
+ error: 'error',
10
+ info: 'info',
11
+ success: 'success',
12
+ warning: 'warning'
13
+ };
14
+
15
+ var toastr = {
16
+ clear: clear,
17
+ remove: remove,
18
+ error: error,
19
+ getContainer: getContainer,
20
+ info: info,
21
+ options: {},
22
+ subscribe: subscribe,
23
+ success: success,
24
+ version: '2.1.0',
25
+ warning: warning
26
+ };
27
+
28
+ var previousToast;
29
+
30
+ return toastr;
31
+
32
+ //#region Accessible Methods
33
+ function error(message, title, optionsOverride) {
34
+ return notify({
35
+ type: toastType.error,
36
+ iconClass: getOptions().iconClasses.error,
37
+ message: message,
38
+ optionsOverride: optionsOverride,
39
+ title: title
40
+ });
41
+ }
42
+
43
+ function getContainer(options, create) {
44
+ if (!options) {
45
+ options = getOptions();
46
+ }
47
+ $container = $('#' + options.containerId);
48
+ if ($container.length) {
49
+ return $container;
50
+ }
51
+ if (create) {
52
+ $container = createContainer(options);
53
+ }
54
+ return $container;
55
+ }
56
+
57
+ function info(message, title, optionsOverride) {
58
+ return notify({
59
+ type: toastType.info,
60
+ iconClass: getOptions().iconClasses.info,
61
+ message: message,
62
+ optionsOverride: optionsOverride,
63
+ title: title
64
+ });
65
+ }
66
+
67
+ function subscribe(callback) {
68
+ listener = callback;
69
+ }
70
+
71
+ function success(message, title, optionsOverride) {
72
+ return notify({
73
+ type: toastType.success,
74
+ iconClass: getOptions().iconClasses.success,
75
+ message: message,
76
+ optionsOverride: optionsOverride,
77
+ title: title
78
+ });
79
+ }
80
+
81
+ function warning(message, title, optionsOverride) {
82
+ return notify({
83
+ type: toastType.warning,
84
+ iconClass: getOptions().iconClasses.warning,
85
+ message: message,
86
+ optionsOverride: optionsOverride,
87
+ title: title
88
+ });
89
+ }
90
+
91
+ function clear($toastElement) {
92
+ var options = getOptions();
93
+ if (!$container) {
94
+ getContainer(options);
95
+ }
96
+ if (!clearToast($toastElement, options)) {
97
+ clearContainer(options);
98
+ }
99
+ }
100
+
101
+ function remove($toastElement) {
102
+ var options = getOptions();
103
+ if (!$container) {
104
+ getContainer(options);
105
+ }
106
+ if ($toastElement && $(':focus', $toastElement).length === 0) {
107
+ removeToast($toastElement);
108
+ return;
109
+ }
110
+ if ($container.children().length) {
111
+ $container.remove();
112
+ }
113
+ }
114
+ //#endregion
115
+
116
+ //#region Internal Methods
117
+
118
+ function clearContainer(options) {
119
+ var toastsToClear = $container.children();
120
+ for (var i = toastsToClear.length - 1; i >= 0; i--) {
121
+ clearToast($(toastsToClear[i]), options);
122
+ }
123
+ ;
124
+ }
125
+
126
+ function clearToast($toastElement, options) {
127
+ if ($toastElement && $(':focus', $toastElement).length === 0) {
128
+ $toastElement[options.hideMethod]({
129
+ duration: options.hideDuration,
130
+ easing: options.hideEasing,
131
+ complete: function () {
132
+ removeToast($toastElement);
133
+ }
134
+ });
135
+ return true;
136
+ }
137
+ return false;
138
+ }
139
+
140
+ function createContainer(options) {
141
+ $container = $('<div/>')
142
+ .attr('id', options.containerId)
143
+ .addClass(options.positionClass)
144
+ .attr('aria-live', 'polite')
145
+ .attr('role', 'alert');
146
+
147
+ $container.appendTo($(options.target));
148
+ return $container;
149
+ }
150
+
151
+ function getDefaults() {
152
+ return {
153
+ tapToDismiss: true,
154
+ toastClass: 'toast',
155
+ containerId: 'toast-container',
156
+ debug: false,
157
+
158
+ showMethod: 'fadeIn', //fadeIn, slideDown, and show are built into jQuery
159
+ showDuration: 300,
160
+ showEasing: 'swing', //swing and linear are built into jQuery
161
+ onShown: undefined,
162
+ hideMethod: 'fadeOut',
163
+ hideDuration: 1000,
164
+ hideEasing: 'swing',
165
+ onHidden: undefined,
166
+
167
+ extendedTimeOut: 1000,
168
+ iconClasses: {
169
+ error: 'toast-custom-error',
170
+ info: 'toast-info',
171
+ success: 'toast-custom-success',
172
+ warning: 'toast-warning'
173
+ },
174
+ iconClass: 'toast-info',
175
+ positionClass: 'toast-top-right',
176
+ timeOut: 5000, // Set timeOut and extendedTimeOut to 0 to make it sticky
177
+ titleClass: 'toast-title',
178
+ messageClass: 'toast-message',
179
+ target: 'body',
180
+ closeHtml: '<button>&times;</button>',
181
+ newestOnTop: true,
182
+ preventDuplicates: false
183
+ };
184
+ }
185
+
186
+ function publish(args) {
187
+ if (!listener) {
188
+ return;
189
+ }
190
+ listener(args);
191
+ }
192
+
193
+ function notify(map) {
194
+ var options = getOptions(),
195
+ iconClass = map.iconClass || options.iconClass;
196
+
197
+ if (options.preventDuplicates) {
198
+ if (map.message === previousToast) {
199
+ return;
200
+ } else {
201
+ previousToast = map.message;
202
+ }
203
+ }
204
+
205
+ if (typeof (map.optionsOverride) !== 'undefined') {
206
+ options = $.extend(options, map.optionsOverride);
207
+ iconClass = map.optionsOverride.iconClass || iconClass;
208
+ }
209
+
210
+ toastId++;
211
+
212
+ $container = getContainer(options, true);
213
+ var intervalId = null,
214
+ $toastElement = $('<div/>'),
215
+ $titleElement = $('<div/>'),
216
+ $messageElement = $('<div/>'),
217
+ $closeElement = $(options.closeHtml),
218
+ response = {
219
+ toastId: toastId,
220
+ state: 'visible',
221
+ startTime: new Date(),
222
+ options: options,
223
+ map: map
224
+ };
225
+
226
+ if (map.iconClass) {
227
+ $toastElement.addClass(options.toastClass).addClass(iconClass);
228
+ }
229
+
230
+ if (map.title) {
231
+ $titleElement.append(map.title).addClass(options.titleClass);
232
+ $toastElement.append($titleElement);
233
+ }
234
+
235
+ if (map.message) {
236
+ $messageElement.append(map.message).addClass(options.messageClass);
237
+ $toastElement.append($messageElement);
238
+ }
239
+
240
+ if (options.closeButton) {
241
+ $closeElement.addClass('toast-close-button').attr("role", "button");
242
+ $toastElement.prepend($closeElement);
243
+ }
244
+
245
+ $toastElement.hide();
246
+ if (options.newestOnTop) {
247
+ $container.prepend($toastElement);
248
+ } else {
249
+ $container.append($toastElement);
250
+ }
251
+
252
+
253
+ $toastElement[options.showMethod](
254
+ {duration: options.showDuration, easing: options.showEasing, complete: options.onShown}
255
+ );
256
+
257
+ if (options.timeOut > 0) {
258
+ intervalId = setTimeout(hideToast, options.timeOut);
259
+ }
260
+
261
+ $toastElement.hover(stickAround, delayedHideToast);
262
+ if (!options.onclick && options.tapToDismiss) {
263
+ $toastElement.click(hideToast);
264
+ }
265
+
266
+ if (options.closeButton && $closeElement) {
267
+ $closeElement.click(function (event) {
268
+ if (event.stopPropagation) {
269
+ event.stopPropagation();
270
+ } else if (event.cancelBubble !== undefined && event.cancelBubble !== true) {
271
+ event.cancelBubble = true;
272
+ }
273
+ hideToast(true);
274
+ });
275
+ }
276
+
277
+ if (options.onclick) {
278
+ $toastElement.click(function () {
279
+ options.onclick();
280
+ hideToast();
281
+ });
282
+ }
283
+
284
+ publish(response);
285
+
286
+ if (options.debug && console) {
287
+ console.log(response);
288
+ }
289
+
290
+ return $toastElement;
291
+
292
+ function hideToast(override) {
293
+ if ($(':focus', $toastElement).length && !override) {
294
+ return;
295
+ }
296
+ return $toastElement[options.hideMethod]({
297
+ duration: options.hideDuration,
298
+ easing: options.hideEasing,
299
+ complete: function () {
300
+ removeToast($toastElement);
301
+ if (options.onHidden && response.state !== 'hidden') {
302
+ options.onHidden();
303
+ }
304
+ response.state = 'hidden';
305
+ response.endTime = new Date();
306
+ publish(response);
307
+ }
308
+ });
309
+ }
310
+
311
+ function delayedHideToast() {
312
+ if (options.timeOut > 0 || options.extendedTimeOut > 0) {
313
+ intervalId = setTimeout(hideToast, options.extendedTimeOut);
314
+ }
315
+ }
316
+
317
+ function stickAround() {
318
+ clearTimeout(intervalId);
319
+ $toastElement.stop(true, true)[options.showMethod](
320
+ {duration: options.showDuration, easing: options.showEasing}
321
+ );
322
+ }
323
+ }
324
+
325
+ function getOptions() {
326
+ return $.extend({}, getDefaults(), toastr.options);
327
+ }
328
+
329
+ function removeToast($toastElement) {
330
+ if (!$container) {
331
+ $container = getContainer();
332
+ }
333
+ if ($toastElement.is(':visible')) {
334
+ return;
335
+ }
336
+ $toastElement.remove();
337
+ $toastElement = null;
338
+ if ($container.children().length === 0) {
339
+ $container.remove();
340
+ }
341
+ }
342
+ //#endregion
343
 
344
  })();
345
  });
assets/global/plugins/validation/jquery.validate.js CHANGED
@@ -15,195 +15,195 @@
15
  $.extend($.fn, {
16
  validate: function (options) {
17
 
18
- // If nothing is selected, return nothing; can't chain anyway
19
- if (!this.length) {
20
- if (options && options.debug && window.console) {
21
- console.warn("Nothing selected, can't validate, returning nothing.");
22
- }
23
- return;
24
- }
25
-
26
- // Check if a validator for this form was already created
27
- var validator = $.data(this[ 0 ], "validator");
28
- if (validator) {
29
- return validator;
30
- }
31
-
32
- // Add novalidate tag if HTML5.
33
- this.attr("novalidate", "novalidate");
34
-
35
- validator = new $.validator(options, this[ 0 ]);
36
- $.data(this[ 0 ], "validator", validator);
37
-
38
- if (validator.settings.onsubmit) {
39
-
40
- this.on("click.validate", ":submit", function (event) {
41
- if (validator.settings.submitHandler) {
42
- validator.submitButton = event.target;
43
- }
44
-
45
- // Allow suppressing validation by adding a cancel class to the submit button
46
- if ($(this).hasClass("cancel")) {
47
- validator.cancelSubmit = true;
48
- }
49
-
50
- // Allow suppressing validation by adding the html5 formnovalidate attribute to the submit button
51
- if ($(this).attr("formnovalidate") !== undefined) {
52
- validator.cancelSubmit = true;
53
- }
54
- });
55
-
56
- // Validate the form on submit
57
- this.on("submit.validate", function (event) {
58
- if (validator.settings.debug) {
59
-
60
- // Prevent form submit to be able to see console output
61
- event.preventDefault();
62
- }
63
- function handle() {
64
- var hidden, result;
65
- if (validator.settings.submitHandler) {
66
- if (validator.submitButton) {
67
-
68
- // Insert a hidden input as a replacement for the missing submit button
69
- hidden = $("<input type='hidden'/>")
70
- .attr("name", validator.submitButton.name)
71
- .val($(validator.submitButton).val())
72
- .appendTo(validator.currentForm);
73
- }
74
- result = validator.settings.submitHandler.call(validator, validator.currentForm, event);
75
- if (validator.submitButton) {
76
-
77
- // And clean up afterwards; thanks to no-block-scope, hidden can be referenced
78
- hidden.remove();
79
- }
80
- if (result !== undefined) {
81
- return result;
82
- }
83
- return false;
84
- }
85
- return true;
86
- }
87
- if (validator.cancelSubmit) {
88
- validator.cancelSubmit = false;
89
- return handle();
90
- }
91
- if (validator.form()) {
92
- if (validator.pendingRequest) {
93
- validator.formSubmitted = true;
94
- return false;
95
- }
96
- return handle();
97
- } else {
98
- validator.focusInvalid();
99
- return false;
100
- }
101
- });
102
- }
103
-
104
- return validator;
105
  },
106
  valid: function () {
107
- var valid, validator, errorList;
108
-
109
- if ($(this[ 0 ]).is("form")) {
110
- valid = this.validate().form();
111
- } else {
112
- errorList = [];
113
- valid = true;
114
- validator = $(this[ 0 ].form).validate();
115
- this.each(function () {
116
- valid = validator.element(this) && valid;
117
- if (!valid) {
118
- errorList = errorList.concat(validator.errorList);
119
- }
120
- });
121
- validator.errorList = errorList;
122
- }
123
- return valid;
124
  },
125
  rules: function (command, argument) {
126
 
127
- // If nothing is selected, return nothing; can't chain anyway
128
- if (!this.length) {
129
- return;
130
- }
131
-
132
- var element = this[ 0 ],
133
- settings, staticRules, existingRules, data, param, filtered;
134
-
135
- if (command) {
136
- settings = $.data(element.form, "validator").settings;
137
- staticRules = settings.rules;
138
- existingRules = $.validator.staticRules(element);
139
- switch (command) {
140
- case "add":
141
- $.extend(existingRules, $.validator.normalizeRule(argument));
142
-
143
- // Remove messages from rules, but allow them to be set separately
144
- delete existingRules.messages;
145
- staticRules[ element.name ] = existingRules;
146
- if (argument.messages) {
147
- settings.messages[ element.name ] = $.extend(settings.messages[ element.name ], argument.messages);
148
- }
149
- break;
150
- case "remove":
151
- if (!argument) {
152
- delete staticRules[ element.name ];
153
- return existingRules;
154
- }
155
- filtered = {};
156
- $.each(argument.split(/\s/), function (index, method) {
157
- filtered[ method ] = existingRules[ method ];
158
- delete existingRules[ method ];
159
- if (method === "required") {
160
- $(element).removeAttr("aria-required");
161
- }
162
- });
163
- return filtered;
164
- }
165
- }
166
-
167
- data = $.validator.normalizeRules(
168
- $.extend(
169
- {},
170
- $.validator.classRules(element),
171
- $.validator.attributeRules(element),
172
- $.validator.dataRules(element),
173
- $.validator.staticRules(element)
174
- ), element);
175
-
176
- // Make sure required is at front
177
- if (data.required) {
178
- param = data.required;
179
- delete data.required;
180
- data = $.extend({required: param}, data);
181
- $(element).attr("aria-required", "true");
182
- }
183
-
184
- // Make sure remote is at back
185
- if (data.remote) {
186
- param = data.remote;
187
- delete data.remote;
188
- data = $.extend(data, {remote: param});
189
- }
190
-
191
- return data;
192
  }
193
  });
194
 
195
  // Custom selectors
196
  $.extend($.expr[ ":" ], {
197
  blank: function (a) {
198
- return !$.trim("" + $(a).val());
199
  },
200
  filled: function (a) {
201
- var val = $(a).val();
202
- return val !== null && !!$.trim("" + val);
203
  },
204
 
205
  unchecked: function (a) {
206
- return !$(a).prop("checked");
207
  }
208
  });
209
 
@@ -216,25 +216,25 @@
216
 
217
  $.validator.format = function (source, params) {
218
  if (arguments.length === 1) {
219
- return function () {
220
- var args = $.makeArray(arguments);
221
- args.unshift(source);
222
- return $.validator.format.apply(this, args);
223
- };
224
  }
225
  if (params === undefined) {
226
- return source;
227
  }
228
  if (arguments.length > 2 && params.constructor !== Array) {
229
- params = $.makeArray(arguments).slice(1);
230
  }
231
  if (params.constructor !== Array) {
232
- params = [params];
233
  }
234
  $.each(params, function (i, n) {
235
- source = source.replace(new RegExp("\\{" + i + "\\}", "g"), function () {
236
- return n;
237
- });
238
  });
239
  return source;
240
  };
@@ -242,1093 +242,1093 @@
242
  $.extend($.validator, {
243
 
244
  defaults: {
245
- messages: {},
246
- groups: {},
247
- rules: {},
248
- errorClass: "error",
249
- pendingClass: "pending",
250
- validClass: "valid",
251
- errorElement: "label",
252
- focusCleanup: false,
253
- focusInvalid: true,
254
- errorContainer: $([]),
255
- errorLabelContainer: $([]),
256
- onsubmit: true,
257
- ignore: ":hidden",
258
- ignoreTitle: false,
259
- onfocusin: function (element) {
260
- this.lastActive = element;
261
- if (this.settings.focusCleanup) {
262
- if (this.settings.unhighlight) {
263
- this.settings.unhighlight.call(this, element, this.settings.errorClass, this.settings.validClass);
264
- }
265
- this.hideThese(this.errorsFor(element));
266
- }
267
- },
268
- onfocusout: function (element) {
269
- if (!this.checkable(element) && (element.name in this.submitted || !this.optional(element))) {
270
- this.element(element);
271
- }
272
- },
273
- onkeyup: function (element, event) {
274
- var excludedKeys = [
275
- 16, 17, 18, 20, 35, 36, 37,
276
- 38, 39, 40, 45, 144, 225
277
- ];
278
-
279
- if (event.which === 9 && this.elementValue(element) === "" || $.inArray(event.keyCode, excludedKeys) !== -1) {
280
- return;
281
- } else if (element.name in this.submitted || element.name in this.invalid) {
282
- this.element(element);
283
- }
284
- },
285
- onclick: function (element) {
286
-
287
- // Click on selects, radiobuttons and checkboxes
288
- if (element.name in this.submitted) {
289
- this.element(element);
290
-
291
- // Or option elements, check parent select in that case
292
- } else if (element.parentNode.name in this.submitted) {
293
- this.element(element.parentNode);
294
- }
295
- },
296
- highlight: function (element, errorClass, validClass) {
297
- if (element.type === "radio") {
298
- this.findByName(element.name).addClass(errorClass).removeClass(validClass);
299
- } else {
300
- $(element).addClass(errorClass).removeClass(validClass);
301
- }
302
- },
303
- unhighlight: function (element, errorClass, validClass) {
304
- if (element.type === "radio") {
305
- this.findByName(element.name).removeClass(errorClass).addClass(validClass);
306
- } else {
307
- $(element).removeClass(errorClass).addClass(validClass);
308
- }
309
- }
310
  },
311
  setDefaults: function (settings) {
312
- $.extend($.validator.defaults, settings);
313
  },
314
 
315
  messages: {
316
- required: "This field is required.",
317
- remote: "Please fix this field.",
318
- email: "Please enter a valid email address.",
319
- url: "Please enter a valid URL.",
320
- date: "Please enter a valid date.",
321
- dateISO: "Please enter a valid date ( ISO ).",
322
- number: "Please enter a valid number.",
323
- digits: "Please enter only digits.",
324
- equalTo: "Please enter the same value again.",
325
- maxlength: $.validator.format("Please enter no more than {0} characters."),
326
- minlength: $.validator.format("Please enter at least {0} characters."),
327
- rangelength: $.validator.format("Please enter a value between {0} and {1} characters long."),
328
- range: $.validator.format("Please enter a value between {0} and {1}."),
329
- max: $.validator.format("Please enter a value less than or equal to {0}."),
330
- min: $.validator.format("Please enter a value greater than or equal to {0}."),
331
- step: $.validator.format("Please enter a multiple of {0}.")
332
  },
333
 
334
  autoCreateRanges: false,
335
 
336
  prototype: {
337
 
338
- init: function () {
339
- this.labelContainer = $(this.settings.errorLabelContainer);
340
- this.errorContext = this.labelContainer.length && this.labelContainer || $(this.currentForm);
341
- this.containers = $(this.settings.errorContainer).add(this.settings.errorLabelContainer);
342
- this.submitted = {};
343
- this.valueCache = {};
344
- this.pendingRequest = 0;
345
- this.pending = {};
346
- this.invalid = {};
347
- this.reset();
348
-
349
- var groups = (this.groups = {}),
350
- rules;
351
- $.each(this.settings.groups, function (key, value) {
352
- if (typeof value === "string") {
353
- value = value.split(/\s/);
354
- }
355
- $.each(value, function (index, name) {
356
- groups[ name ] = key;
357
- });
358
- });
359
- rules = this.settings.rules;
360
- $.each(rules, function (key, value) {
361
- rules[ key ] = $.validator.normalizeRule(value);
362
- });
363
-
364
- function delegate(event) {
365
- var validator = $.data(this.form, "validator"),
366
- eventType = "on" + event.type.replace(/^validate/, ""),
367
- settings = validator.settings;
368
- if (settings[ eventType ] && !$(this).is(settings.ignore)) {
369
- settings[ eventType ].call(validator, this, event);
370
- }
371
- }
372
-
373
- $(this.currentForm)
374
- .on("focusin.validate focusout.validate keyup.validate",
375
- ":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'], " +
376
- "[type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], " +
377
- "[type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'], " +
378
- "[type='radio'], [type='checkbox'], [contenteditable]", delegate)
379
- .on("click.validate", "select, option, [type='radio'], [type='checkbox']", delegate);
380
-
381
- if (this.settings.invalidHandler) {
382
- $(this.currentForm).on("invalid-form.validate", this.settings.invalidHandler);
383
- }
384
-
385
- // Add aria-required to any Static/Data/Class required fields before first validation
386
- // Screen readers require this attribute to be present before the initial submission http://www.w3.org/TR/WCAG-TECHS/ARIA2.html
387
- $(this.currentForm).find("[required], [data-rule-required], .required").attr("aria-required", "true");
388
- },
389
-
390
- form: function () {
391
- this.checkForm();
392
- $.extend(this.submitted, this.errorMap);
393
- this.invalid = $.extend({}, this.errorMap);
394
- if (!this.valid()) {
395
- $(this.currentForm).triggerHandler("invalid-form", [this]);
396
- }
397
- this.showErrors();
398
- return this.valid();
399
- },
400
-
401
- checkForm: function () {
402
- this.prepareForm();
403
- for (var i = 0, elements = (this.currentElements = this.elements()); elements[ i ]; i++) {
404
- this.check(elements[ i ]);
405
- }
406
- return this.valid();
407
- },
408
- element: function (element) {
409
- var cleanElement = this.clean(element),
410
- checkElement = this.validationTargetFor(cleanElement),
411
- v = this,
412
- result = true,
413
- rs, group;
414
-
415
- if (checkElement === undefined) {
416
- delete this.invalid[ cleanElement.name ];
417
- } else {
418
- this.prepareElement(checkElement);
419
- this.currentElements = $(checkElement);
420
-
421
- // If this element is grouped, then validate all group elements already
422
- // containing a value
423
- group = this.groups[ checkElement.name ];
424
- if (group) {
425
- $.each(this.groups, function (name, testgroup) {
426
- if (testgroup === group && name !== checkElement.name) {
427
- cleanElement = v.validationTargetFor(v.clean(v.findByName(name)));
428
- if (cleanElement && cleanElement.name in v.invalid) {
429
- v.currentElements.push(cleanElement);
430
- result = result && v.check(cleanElement);
431
- }
432
- }
433
- });
434
- }
435
-
436
- rs = this.check(checkElement) !== false;
437
- result = result && rs;
438
- if (rs) {
439
- this.invalid[ checkElement.name ] = false;
440
- } else {
441
- this.invalid[ checkElement.name ] = true;
442
- }
443
-
444
- if (!this.numberOfInvalids()) {
445
-
446
- // Hide error containers on last error
447
- this.toHide = this.toHide.add(this.containers);
448
- }
449
- this.showErrors();
450
-
451
- // Add aria-invalid status for screen readers
452
- $(element).attr("aria-invalid", !rs);
453
- }
454
-
455
- return result;
456
- },
457
- showErrors: function (errors) {
458
- if (errors) {
459
- var validator = this;
460
-
461
- // Add items to error list and map
462
- $.extend(this.errorMap, errors);
463
- this.errorList = $.map(this.errorMap, function (message, name) {
464
- return {
465
- message: message,
466
- element: validator.findByName(name)[ 0 ]
467
- };
468
- });
469
-
470
- // Remove items from success list
471
- this.successList = $.grep(this.successList, function (element) {
472
- return !(element.name in errors);
473
- });
474
- }
475
- if (this.settings.showErrors) {
476
- this.settings.showErrors.call(this, this.errorMap, this.errorList);
477
- } else {
478
- this.defaultShowErrors();
479
- }
480
- },
481
- resetForm: function () {
482
- if ($.fn.resetForm) {
483
- $(this.currentForm).resetForm();
484
- }
485
- this.invalid = {};
486
- this.submitted = {};
487
- this.prepareForm();
488
- this.hideErrors();
489
- var elements = this.elements()
490
- .removeData("previousValue")
491
- .removeAttr("aria-invalid");
492
-
493
- this.resetElements(elements);
494
- },
495
-
496
- resetElements: function (elements) {
497
- var i;
498
-
499
- if (this.settings.unhighlight) {
500
- for (i = 0; elements[ i ]; i++) {
501
- this.settings.unhighlight.call(this, elements[ i ],
502
- this.settings.errorClass, "");
503
- this.findByName(elements[ i ].name).removeClass(this.settings.validClass);
504
- }
505
- } else {
506
- elements
507
- .removeClass(this.settings.errorClass)
508
- .removeClass(this.settings.validClass);
509
- }
510
- },
511
-
512
- numberOfInvalids: function () {
513
- return this.objectLength(this.invalid);
514
- },
515
-
516
- objectLength: function (obj) {
517
- /* jshint unused: false */
518
- var count = 0,
519
- i;
520
- for (i in obj) {
521
- if (obj[ i ]) {
522
- count++;
523
- }
524
- }
525
- return count;
526
- },
527
-
528
- hideErrors: function () {
529
- this.hideThese(this.toHide);
530
- },
531
-
532
- hideThese: function (errors) {
533
- errors.not(this.containers).text("");
534
- this.addWrapper(errors).hide();
535
- },
536
-
537
- valid: function () {
538
- return this.size() === 0;
539
- },
540
-
541
- size: function () {
542
- return this.errorList.length;
543
- },
544
-
545
- focusInvalid: function () {
546
- if (this.settings.focusInvalid) {
547
- try {
548
- $(this.findLastActive() || this.errorList.length && this.errorList[ 0 ].element || [])
549
- .filter(":visible")
550
- .focus()
551
-
552
- // Manually trigger focusin event; without it, focusin handler isn't called, findLastActive won't have anything to find
553
- .trigger("focusin");
554
- } catch (e) {
555
- }
556
- }
557
- },
558
-
559
- findLastActive: function () {
560
- var lastActive = this.lastActive;
561
- return lastActive && $.grep(this.errorList, function (n) {
562
- return n.element.name === lastActive.name;
563
- }).length === 1 && lastActive;
564
- },
565
-
566
- elements: function () {
567
- var validator = this,
568
- rulesCache = {};
569
-
570
- // Select all valid inputs inside the form (no submit or reset buttons)
571
- return $(this.currentForm)
572
- .find("input, select, textarea, [contenteditable]")
573
- .not(":submit, :reset, :image, :disabled")
574
- .not(this.settings.ignore)
575
- .filter(function () {
576
- var name = this.name || $(this).attr("name"); // For contenteditable
577
- if (!name && validator.settings.debug && window.console) {
578
- console.error("%o has no name assigned", this);
579
- }
580
-
581
- if (this.hasAttribute("contenteditable")) {
582
- this.form = $(this).closest("form")[ 0 ];
583
- }
584
-
585
- // Select only the first element for each name, and only those with rules specified
586
- if (name in rulesCache || !validator.objectLength($(this).rules())) {
587
- return false;
588
- }
589
-
590
- rulesCache[ name ] = true;
591
- return true;
592
- });
593
- },
594
-
595
- clean: function (selector) {
596
- return $(selector)[ 0 ];
597
- },
598
-
599
- errors: function () {
600
- var errorClass = this.settings.errorClass.split(" ").join(".");
601
- return $(this.settings.errorElement + "." + errorClass, this.errorContext);
602
- },
603
-
604
- resetInternals: function () {
605
- this.successList = [];
606
- this.errorList = [];
607
- this.errorMap = {};
608
- this.toShow = $([]);
609
- this.toHide = $([]);
610
- },
611
-
612
- reset: function () {
613
- this.resetInternals();
614
- this.currentElements = $([]);
615
- },
616
-
617
- prepareForm: function () {
618
- this.reset();
619
- this.toHide = this.errors().add(this.containers);
620
- },
621
-
622
- prepareElement: function (element) {
623
- this.reset();
624
- this.toHide = this.errorsFor(element);
625
- },
626
-
627
- elementValue: function (element) {
628
- var $element = $(element),
629
- type = element.type,
630
- val, idx;
631
-
632
- if (type === "radio" || type === "checkbox") {
633
- return this.findByName(element.name).filter(":checked").val();
634
- } else if (type === "number" && typeof element.validity !== "undefined") {
635
- return element.validity.badInput ? "NaN" : $element.val();
636
- }
637
-
638
- if (element.hasAttribute("contenteditable")) {
639
- val = $element.text();
640
- } else {
641
- val = $element.val();
642
- }
643
-
644
- if (type === "file") {
645
-
646
- // Modern browser (chrome & safari)
647
- if (val.substr(0, 12) === "C:\\fakepath\\") {
648
- return val.substr(12);
649
- }
650
-
651
- idx = val.lastIndexOf("/");
652
- if (idx >= 0) {
653
- return val.substr(idx + 1);
654
- }
655
-
656
- // Windows-based path
657
- idx = val.lastIndexOf("\\");
658
- if (idx >= 0) {
659
- return val.substr(idx + 1);
660
- }
661
-
662
- // Just the file name
663
- return val;
664
- }
665
-
666
- if (typeof val === "string") {
667
- return val.replace(/\r/g, "");
668
- }
669
- return val;
670
- },
671
-
672
- check: function (element) {
673
- element = this.validationTargetFor(this.clean(element));
674
-
675
- var rules = $(element).rules(),
676
- rulesCount = $.map(rules, function (n, i) {
677
- return i;
678
- }).length,
679
- dependencyMismatch = false,
680
- val = this.elementValue(element),
681
- result, method, rule;
682
- if (typeof rules.normalizer === "function") {
683
- val = rules.normalizer.call(element, val);
684
-
685
- if (typeof val !== "string") {
686
- throw new TypeError("The normalizer should return a string value.");
687
- }
688
- delete rules.normalizer;
689
- }
690
-
691
- for (method in rules) {
692
- rule = {method: method, parameters: rules[ method ]};
693
- try {
694
- result = $.validator.methods[ method ].call(this, val, element, rule.parameters);
695
- if (result === "dependency-mismatch" && rulesCount === 1) {
696
- dependencyMismatch = true;
697
- continue;
698
- }
699
- dependencyMismatch = false;
700
-
701
- if (result === "pending") {
702
- this.toHide = this.toHide.not(this.errorsFor(element));
703
- return;
704
- }
705
-
706
- if (!result) {
707
- this.formatAndAdd(element, rule);
708
- return false;
709
- }
710
- } catch (e) {
711
- if (this.settings.debug && window.console) {
712
- console.log("Exception occurred when checking element " + element.id + ", check the '" + rule.method + "' method.", e);
713
- }
714
- if (e instanceof TypeError) {
715
- e.message += ". Exception occurred when checking element " + element.id + ", check the '" + rule.method + "' method.";
716
- }
717
-
718
- throw e;
719
- }
720
- }
721
- if (dependencyMismatch) {
722
- return;
723
- }
724
- if (this.objectLength(rules)) {
725
- this.successList.push(element);
726
- }
727
- return true;
728
- },
729
-
730
- customDataMessage: function (element, method) {
731
- return $(element).data("msg" + method.charAt(0).toUpperCase() +
732
- method.substring(1).toLowerCase()) || $(element).data("msg");
733
- },
734
-
735
- // Return the custom message for the given element name and validation method
736
- customMessage: function (name, method) {
737
- var m = this.settings.messages[ name ];
738
- return m && (m.constructor === String ? m : m[ method ]);
739
- },
740
-
741
- // Return the first defined argument, allowing empty strings
742
- findDefined: function () {
743
- for (var i = 0; i < arguments.length; i++) {
744
- if (arguments[ i ] !== undefined) {
745
- return arguments[ i ];
746
- }
747
- }
748
- return undefined;
749
- },
750
-
751
- defaultMessage: function (element, rule) {
752
- var message = this.findDefined(
753
- this.customMessage(element.name, rule.method),
754
- this.customDataMessage(element, rule.method),
755
- // 'title' is never undefined, so handle empty string as undefined
756
- !this.settings.ignoreTitle && element.title || undefined,
757
- $.validator.messages[ rule.method ],
758
- "<strong>Warning: No message defined for " + element.name + "</strong>"
759
- ),
760
- theregex = /\$?\{(\d+)\}/g;
761
- if (typeof message === "function") {
762
- message = message.call(this, rule.parameters, element);
763
- } else if (theregex.test(message)) {
764
- message = $.validator.format(message.replace(theregex, "{$1}"), rule.parameters);
765
- }
766
-
767
- return message;
768
- },
769
-
770
- formatAndAdd: function (element, rule) {
771
- var message = this.defaultMessage(element, rule);
772
-
773
- this.errorList.push({
774
- message: message,
775
- element: element,
776
- method: rule.method
777
- });
778
-
779
- this.errorMap[ element.name ] = message;
780
- this.submitted[ element.name ] = message;
781
- },
782
-
783
- addWrapper: function (toToggle) {
784
- if (this.settings.wrapper) {
785
- toToggle = toToggle.add(toToggle.parent(this.settings.wrapper));
786
- }
787
- return toToggle;
788
- },
789
-
790
- defaultShowErrors: function () {
791
- var i, elements, error;
792
- for (i = 0; this.errorList[ i ]; i++) {
793
- error = this.errorList[ i ];
794
- if (this.settings.highlight) {
795
- this.settings.highlight.call(this, error.element, this.settings.errorClass, this.settings.validClass);
796
- }
797
- this.showLabel(error.element, error.message);
798
- }
799
- if (this.errorList.length) {
800
- this.toShow = this.toShow.add(this.containers);
801
- }
802
- if (this.settings.success) {
803
- for (i = 0; this.successList[ i ]; i++) {
804
- this.showLabel(this.successList[ i ]);
805
- }
806
- }
807
- if (this.settings.unhighlight) {
808
- for (i = 0, elements = this.validElements(); elements[ i ]; i++) {
809
- this.settings.unhighlight.call(this, elements[ i ], this.settings.errorClass, this.settings.validClass);
810
- }
811
- }
812
- this.toHide = this.toHide.not(this.toShow);
813
- this.hideErrors();
814
- this.addWrapper(this.toShow).show();
815
- },
816
-
817
- validElements: function () {
818
- return this.currentElements.not(this.invalidElements());
819
- },
820
-
821
- invalidElements: function () {
822
- return $(this.errorList).map(function () {
823
- return this.element;
824
- });
825
- },
826
-
827
- showLabel: function (element, message) {
828
- var place, group, errorID, v,
829
- error = this.errorsFor(element),
830
- elementID = this.idOrName(element),
831
- describedBy = $(element).attr("aria-describedby");
832
-
833
- if (error.length) {
834
-
835
- // Refresh error/success class
836
- error.removeClass(this.settings.validClass).addClass(this.settings.errorClass);
837
-
838
- // Replace message on existing label
839
- error.html(message);
840
- } else {
841
-
842
- // Create error element
843
- error = $("<" + this.settings.errorElement + ">")
844
- .attr("id", elementID + "-error")
845
- .addClass(this.settings.errorClass)
846
- .html(message || "");
847
-
848
- // Maintain reference to the element to be placed into the DOM
849
- place = error;
850
- if (this.settings.wrapper) {
851
- place = error.hide().show().wrap("<" + this.settings.wrapper + "/>").parent();
852
- }
853
- if (this.labelContainer.length) {
854
- this.labelContainer.append(place);
855
- } else if (this.settings.errorPlacement) {
856
- this.settings.errorPlacement(place, $(element));
857
- } else {
858
- place.insertAfter(element);
859
- }
860
-
861
- if (error.is("label")) {
862
- error.attr("for", elementID);
863
- } else if (error.parents("label[for='" + this.escapeCssMeta(elementID) + "']").length === 0) {
864
- errorID = error.attr("id");
865
- if (!describedBy) {
866
- describedBy = errorID;
867
- } else if (!describedBy.match(new RegExp("\\b" + this.escapeCssMeta(errorID) + "\\b"))) {
868
- describedBy += " " + errorID;
869
- }
870
- $(element).attr("aria-describedby", describedBy);
871
- group = this.groups[ element.name ];
872
- if (group) {
873
- v = this;
874
- $.each(v.groups, function (name, testgroup) {
875
- if (testgroup === group) {
876
- $("[name='" + v.escapeCssMeta(name) + "']", v.currentForm)
877
- .attr("aria-describedby", error.attr("id"));
878
- }
879
- });
880
- }
881
- }
882
- }
883
- if (!message && this.settings.success) {
884
- error.text("");
885
- if (typeof this.settings.success === "string") {
886
- error.addClass(this.settings.success);
887
- } else {
888
- this.settings.success(error, element);
889
- }
890
- }
891
- this.toShow = this.toShow.add(error);
892
- },
893
-
894
- errorsFor: function (element) {
895
- var name = this.escapeCssMeta(this.idOrName(element)),
896
- describer = $(element).attr("aria-describedby"),
897
- selector = "label[for='" + name + "'], label[for='" + name + "'] *";
898
- if (describer) {
899
- selector = selector + ", #" + this.escapeCssMeta(describer)
900
- .replace(/\s+/g, ", #");
901
- }
902
-
903
- return this
904
- .errors()
905
- .filter(selector);
906
- },
907
- escapeCssMeta: function (string) {
908
- return string.replace(/([\\!"#$%&'()*+,./:;<=>?@\[\]^`{|}~])/g, "\\$1");
909
- },
910
-
911
- idOrName: function (element) {
912
- return this.groups[ element.name ] || (this.checkable(element) ? element.name : element.id || element.name);
913
- },
914
-
915
- validationTargetFor: function (element) {
916
-
917
- if (this.checkable(element)) {
918
- element = this.findByName(element.name);
919
- }
920
- return $(element).not(this.settings.ignore)[ 0 ];
921
- },
922
-
923
- checkable: function (element) {
924
- return (/radio|checkbox/i).test(element.type);
925
- },
926
-
927
- findByName: function (name) {
928
- return $(this.currentForm).find("[name='" + this.escapeCssMeta(name) + "']");
929
- },
930
-
931
- getLength: function (value, element) {
932
- switch (element.nodeName.toLowerCase()) {
933
- case "select":
934
- return $("option:selected", element).length;
935
- case "input":
936
- if (this.checkable(element)) {
937
- return this.findByName(element.name).filter(":checked").length;
938
- }
939
- }
940
- return value.length;
941
- },
942
-
943
- depend: function (param, element) {
944
- return this.dependTypes[ typeof param ] ? this.dependTypes[ typeof param ](param, element) : true;
945
- },
946
-
947
- dependTypes: {
948
- "boolean": function (param) {
949
- return param;
950
- },
951
- "string": function (param, element) {
952
- return !!$(param, element.form).length;
953
- },
954
- "function": function (param, element) {
955
- return param(element);
956
- }
957
- },
958
-
959
- optional: function (element) {
960
- var val = this.elementValue(element);
961
- return !$.validator.methods.required.call(this, val, element) && "dependency-mismatch";
962
- },
963
-
964
- startRequest: function (element) {
965
- if (!this.pending[ element.name ]) {
966
- this.pendingRequest++;
967
- $(element).addClass(this.settings.pendingClass);
968
- this.pending[ element.name ] = true;
969
- }
970
- },
971
- stopRequest: function (element, valid) {
972
- this.pendingRequest--;
973
- if (this.pendingRequest < 0) {
974
- this.pendingRequest = 0;
975
- }
976
- delete this.pending[ element.name ];
977
- $(element).removeClass(this.settings.pendingClass);
978
- if (valid && this.pendingRequest === 0 && this.formSubmitted && this.form()) {
979
- $(this.currentForm).submit();
980
- this.formSubmitted = false;
981
- } else if (!valid && this.pendingRequest === 0 && this.formSubmitted) {
982
- $(this.currentForm).triggerHandler("invalid-form", [this]);
983
- this.formSubmitted = false;
984
- }
985
- },
986
- previousValue: function (element, method) {
987
- return $.data(element, "previousValue") || $.data(element, "previousValue", {
988
- old: null,
989
- valid: true,
990
- message: this.defaultMessage(element, {method: method})
991
- });
992
- },
993
- destroy: function () {
994
- this.resetForm();
995
- $(this.currentForm)
996
- .off(".validate")
997
- .removeData("validator")
998
- .find(".validate-equalTo-blur")
999
- .off(".validate-equalTo")
1000
- .removeClass("validate-equalTo-blur");
1001
- }
1002
  },
1003
  classRuleSettings: {
1004
- required: {required: true},
1005
- email: {email: true},
1006
- url: {url: true},
1007
- date: {date: true},
1008
- dateISO: {dateISO: true},
1009
- number: {number: true},
1010
- digits: {digits: true},
1011
- creditcard: {creditcard: true}
1012
  },
1013
 
1014
  addClassRules: function (className, rules) {
1015
- if (className.constructor === String) {
1016
- this.classRuleSettings[ className ] = rules;
1017
- } else {
1018
- $.extend(this.classRuleSettings, className);
1019
- }
1020
  },
1021
 
1022
  classRules: function (element) {
1023
- var rules = {},
1024
- classes = $(element).attr("class");
1025
-
1026
- if (classes) {
1027
- $.each(classes.split(" "), function () {
1028
- if (this in $.validator.classRuleSettings) {
1029
- $.extend(rules, $.validator.classRuleSettings[ this ]);
1030
- }
1031
- });
1032
- }
1033
- return rules;
1034
  },
1035
 
1036
  normalizeAttributeRule: function (rules, type, method, value) {
1037
- if (/min|max|step/.test(method) && (type === null || /number|range|text/.test(type))) {
1038
- value = Number(value);
1039
- if (isNaN(value)) {
1040
- value = undefined;
1041
- }
1042
- }
1043
-
1044
- if (value || value === 0) {
1045
- rules[ method ] = value;
1046
- } else if (type === method && type !== "range") {
1047
- rules[ method ] = true;
1048
- }
1049
  },
1050
 
1051
  attributeRules: function (element) {
1052
- var rules = {},
1053
- $element = $(element),
1054
- type = element.getAttribute("type"),
1055
- method, value;
1056
-
1057
- for (method in $.validator.methods) {
1058
- if (method === "required") {
1059
- value = element.getAttribute(method);
1060
- if (value === "") {
1061
- value = true;
1062
- }
1063
- value = !!value;
1064
- } else {
1065
- value = $element.attr(method);
1066
- }
1067
- this.normalizeAttributeRule(rules, type, method, value);
1068
- }
1069
- if (rules.maxlength && /-1|2147483647|524288/.test(rules.maxlength)) {
1070
- delete rules.maxlength;
1071
- }
1072
-
1073
- return rules;
1074
  },
1075
 
1076
  dataRules: function (element) {
1077
- var rules = {},
1078
- $element = $(element),
1079
- type = element.getAttribute("type"),
1080
- method, value;
1081
-
1082
- for (method in $.validator.methods) {
1083
- value = $element.data("rule" + method.charAt(0).toUpperCase() + method.substring(1).toLowerCase());
1084
- this.normalizeAttributeRule(rules, type, method, value);
1085
- }
1086
- return rules;
1087
  },
1088
 
1089
  staticRules: function (element) {
1090
- var rules = {},
1091
- validator = $.data(element.form, "validator");
1092
 
1093
- if (validator.settings.rules) {
1094
- rules = $.validator.normalizeRule(validator.settings.rules[ element.name ]) || {};
1095
- }
1096
- return rules;
1097
  },
1098
 
1099
  normalizeRules: function (rules, element) {
1100
- $.each(rules, function (prop, val) {
1101
- if (val === false) {
1102
- delete rules[ prop ];
1103
- return;
1104
- }
1105
- if (val.param || val.depends) {
1106
- var keepRule = true;
1107
- switch (typeof val.depends) {
1108
- case "string":
1109
- keepRule = !!$(val.depends, element.form).length;
1110
- break;
1111
- case "function":
1112
- keepRule = val.depends.call(element, element);
1113
- break;
1114
- }
1115
- if (keepRule) {
1116
- rules[ prop ] = val.param !== undefined ? val.param : true;
1117
- } else {
1118
- $.data(element.form, "validator").resetElements($(element));
1119
- delete rules[ prop ];
1120
- }
1121
- }
1122
- });
1123
- $.each(rules, function (rule, parameter) {
1124
- rules[ rule ] = $.isFunction(parameter) && rule !== "normalizer" ? parameter(element) : parameter;
1125
- });
1126
- $.each(["minlength", "maxlength"], function () {
1127
- if (rules[ this ]) {
1128
- rules[ this ] = Number(rules[ this ]);
1129
- }
1130
- });
1131
- $.each(["rangelength", "range"], function () {
1132
- var parts;
1133
- if (rules[ this ]) {
1134
- if ($.isArray(rules[ this ])) {
1135
- rules[ this ] = [Number(rules[ this ][ 0 ]), Number(rules[ this ][ 1 ])];
1136
- } else if (typeof rules[ this ] === "string") {
1137
- parts = rules[ this ].replace(/[\[\]]/g, "").split(/[\s,]+/);
1138
- rules[ this ] = [Number(parts[ 0 ]), Number(parts[ 1 ])];
1139
- }
1140
- }
1141
- });
1142
- if ($.validator.autoCreateRanges) {
1143
- if (rules.min != null && rules.max != null) {
1144
- rules.range = [rules.min, rules.max];
1145
- delete rules.min;
1146
- delete rules.max;
1147
- }
1148
- if (rules.minlength != null && rules.maxlength != null) {
1149
- rules.rangelength = [rules.minlength, rules.maxlength];
1150
- delete rules.minlength;
1151
- delete rules.maxlength;
1152
- }
1153
- }
1154
- return rules;
1155
  },
1156
  normalizeRule: function (data) {
1157
- if (typeof data === "string") {
1158
- var transformed = {};
1159
- $.each(data.split(/\s/), function () {
1160
- transformed[ this ] = true;
1161
- });
1162
- data = transformed;
1163
- }
1164
- return data;
1165
  },
1166
  addMethod: function (name, method, message) {
1167
- $.validator.methods[ name ] = method;
1168
- $.validator.messages[ name ] = message !== undefined ? message : $.validator.messages[ name ];
1169
- if (method.length < 3) {
1170
- $.validator.addClassRules(name, $.validator.normalizeRule(name));
1171
- }
1172
  },
1173
  methods: {
1174
- required: function (value, element, param) {
1175
- if (!this.depend(param, element)) {
1176
- return "dependency-mismatch";
1177
- }
1178
- if (element.nodeName.toLowerCase() === "select") {
1179
- var val = $(element).val();
1180
- return val && val.length > 0;
1181
- }
1182
- if (this.checkable(element)) {
1183
- return this.getLength(value, element) > 0;
1184
- }
1185
- return value.length > 0;
1186
- },
1187
- email: function (value, element) {
1188
- return this.optional(element) || /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(value);
1189
- },
1190
- url: function (value, element) {
1191
- return this.optional(element) || /^(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})).?)(?::\d{2,5})?(?:[/?#]\S*)?$/i.test(value);
1192
- },
1193
- date: function (value, element) {
1194
- return this.optional(element) || !/Invalid|NaN/.test(new Date(value).toString());
1195
- },
1196
- dateISO: function (value, element) {
1197
- return this.optional(element) || /^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test(value);
1198
- },
1199
- number: function (value, element) {
1200
- return this.optional(element) || /^(?:-?\d+|-?\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(value);
1201
- },
1202
- digits: function (value, element) {
1203
- return this.optional(element) || /^\d+$/.test(value);
1204
- },
1205
- minlength: function (value, element, param) {
1206
- var length = $.isArray(value) ? value.length : this.getLength(value, element);
1207
- return this.optional(element) || length >= param;
1208
- },
1209
- maxlength: function (value, element, param) {
1210
- var length = $.isArray(value) ? value.length : this.getLength(value, element);
1211
- return this.optional(element) || length <= param;
1212
- },
1213
- rangelength: function (value, element, param) {
1214
- var length = $.isArray(value) ? value.length : this.getLength(value, element);
1215
- return this.optional(element) || (length >= param[ 0 ] && length <= param[ 1 ]);
1216
- },
1217
- min: function (value, element, param) {
1218
- return this.optional(element) || value >= param;
1219
- },
1220
- max: function (value, element, param) {
1221
- return this.optional(element) || value <= param;
1222
- },
1223
- range: function (value, element, param) {
1224
- return this.optional(element) || (value >= param[ 0 ] && value <= param[ 1 ]);
1225
- },
1226
- step: function (value, element, param) {
1227
- var type = $(element).attr("type"),
1228
- errorMessage = "Step attribute on input type " + type + " is not supported.",
1229
- supportedTypes = ["text", "number", "range"],
1230
- re = new RegExp("\\b" + type + "\\b"),
1231
- notSupported = type && !re.test(supportedTypes.join());
1232
- if (notSupported) {
1233
- throw new Error(errorMessage);
1234
- }
1235
- return this.optional(element) || (value % param === 0);
1236
- },
1237
- equalTo: function (value, element, param) {
1238
- var target = $(param);
1239
- if (this.settings.onfocusout && target.not(".validate-equalTo-blur").length) {
1240
- target.addClass("validate-equalTo-blur").on("blur.validate-equalTo", function () {
1241
- $(element).valid();
1242
- });
1243
- }
1244
- return value === target.val();
1245
- },
1246
- remote: function (value, element, param, method) {
1247
- if (this.optional(element)) {
1248
- return "dependency-mismatch";
1249
- }
1250
-
1251
- method = typeof method === "string" && method || "remote";
1252
-
1253
- var previous = this.previousValue(element, method),
1254
- validator, data, optionDataString;
1255
-
1256
- if (!this.settings.messages[ element.name ]) {
1257
- this.settings.messages[ element.name ] = {};
1258
- }
1259
- previous.originalMessage = previous.originalMessage || this.settings.messages[ element.name ][ method ];
1260
- this.settings.messages[ element.name ][ method ] = previous.message;
1261
-
1262
- param = typeof param === "string" && {url: param} || param;
1263
- optionDataString = $.param($.extend({data: value}, param.data));
1264
- if (previous.old === optionDataString) {
1265
- return previous.valid;
1266
- }
1267
-
1268
- previous.old = optionDataString;
1269
- validator = this;
1270
- this.startRequest(element);
1271
- data = {};
1272
- data[ element.name ] = value;
1273
- $.ajax($.extend(true, {
1274
- mode: "abort",
1275
- port: "validate" + element.name,
1276
- dataType: "json",
1277
- data: data,
1278
- context: validator.currentForm,
1279
- success: function (response) {
1280
- var valid = response === true || response === "true",
1281
- errors, message, submitted;
1282
-
1283
- validator.settings.messages[ element.name ][ method ] = previous.originalMessage;
1284
- if (valid) {
1285
- submitted = validator.formSubmitted;
1286
- validator.resetInternals();
1287
- validator.toHide = validator.errorsFor(element);
1288
- validator.formSubmitted = submitted;
1289
- validator.successList.push(element);
1290
- validator.invalid[ element.name ] = false;
1291
- validator.showErrors();
1292
- } else {
1293
- errors = {};
1294
- message = response || validator.defaultMessage(element, {method: method, parameters: value});
1295
- errors[ element.name ] = previous.message = message;
1296
- validator.invalid[ element.name ] = true;
1297
- validator.showErrors(errors);
1298
- }
1299
- previous.valid = valid;
1300
- validator.stopRequest(element, valid);
1301
- }
1302
- }, param));
1303
- return "pending";
1304
- }
1305
  }
1306
  });
1307
  var pendingRequests = {},
1308
- ajax;
1309
  if ($.ajaxPrefilter) {
1310
  $.ajaxPrefilter(function (settings, _, xhr) {
1311
- var port = settings.port;
1312
- if (settings.mode === "abort") {
1313
- if (pendingRequests[ port ]) {
1314
- pendingRequests[ port ].abort();
1315
- }
1316
- pendingRequests[ port ] = xhr;
1317
- }
1318
  });
1319
  } else {
1320
  ajax = $.ajax;
1321
  $.ajax = function (settings) {
1322
- var mode = ("mode" in settings ? settings : $.ajaxSettings).mode,
1323
- port = ("port" in settings ? settings : $.ajaxSettings).port;
1324
- if (mode === "abort") {
1325
- if (pendingRequests[ port ]) {
1326
- pendingRequests[ port ].abort();
1327
- }
1328
- pendingRequests[ port ] = ajax.apply(this, arguments);
1329
- return pendingRequests[ port ];
1330
- }
1331
- return ajax.apply(this, arguments);
1332
  };
1333
  }
1334
  }));
15
  $.extend($.fn, {
16
  validate: function (options) {
17
 
18
+ // If nothing is selected, return nothing; can't chain anyway
19
+ if (!this.length) {
20
+ if (options && options.debug && window.console) {
21
+ console.warn("Nothing selected, can't validate, returning nothing.");
22
+ }
23
+ return;
24
+ }
25
+
26
+ // Check if a validator for this form was already created
27
+ var validator = $.data(this[ 0 ], "validator");
28
+ if (validator) {
29
+ return validator;
30
+ }
31
+
32
+ // Add novalidate tag if HTML5.
33
+ this.attr("novalidate", "novalidate");
34
+
35
+ validator = new $.validator(options, this[ 0 ]);
36
+ $.data(this[ 0 ], "validator", validator);
37
+
38
+ if (validator.settings.onsubmit) {
39
+
40
+ this.on("click.validate", ":submit", function (event) {
41
+ if (validator.settings.submitHandler) {
42
+ validator.submitButton = event.target;
43
+ }
44
+
45
+ // Allow suppressing validation by adding a cancel class to the submit button
46
+ if ($(this).hasClass("cancel")) {
47
+ validator.cancelSubmit = true;
48
+ }
49
+
50
+ // Allow suppressing validation by adding the html5 formnovalidate attribute to the submit button
51
+ if ($(this).attr("formnovalidate") !== undefined) {
52
+ validator.cancelSubmit = true;
53
+ }
54
+ });
55
+
56
+ // Validate the form on submit
57
+ this.on("submit.validate", function (event) {
58
+ if (validator.settings.debug) {
59
+
60
+ // Prevent form submit to be able to see console output
61
+ event.preventDefault();
62
+ }
63
+ function handle() {
64
+ var hidden, result;
65
+ if (validator.settings.submitHandler) {
66
+ if (validator.submitButton) {
67
+
68
+ // Insert a hidden input as a replacement for the missing submit button
69
+ hidden = $("<input type='hidden'/>")
70
+ .attr("name", validator.submitButton.name)
71
+ .val($(validator.submitButton).val())
72
+ .appendTo(validator.currentForm);
73
+ }
74
+ result = validator.settings.submitHandler.call(validator, validator.currentForm, event);
75
+ if (validator.submitButton) {
76
+
77
+ // And clean up afterwards; thanks to no-block-scope, hidden can be referenced
78
+ hidden.remove();
79
+ }
80
+ if (result !== undefined) {
81
+ return result;
82
+ }
83
+ return false;
84
+ }
85
+ return true;
86
+ }
87
+ if (validator.cancelSubmit) {
88
+ validator.cancelSubmit = false;
89
+ return handle();
90
+ }
91
+ if (validator.form()) {
92
+ if (validator.pendingRequest) {
93
+ validator.formSubmitted = true;
94
+ return false;
95
+ }
96
+ return handle();
97
+ } else {
98
+ validator.focusInvalid();
99
+ return false;
100
+ }
101
+ });
102
+ }
103
+
104
+ return validator;
105
  },
106
  valid: function () {
107
+ var valid, validator, errorList;
108
+
109
+ if ($(this[ 0 ]).is("form")) {
110
+ valid = this.validate().form();
111
+ } else {
112
+ errorList = [];
113
+ valid = true;
114
+ validator = $(this[ 0 ].form).validate();
115
+ this.each(function () {
116
+ valid = validator.element(this) && valid;
117
+ if (!valid) {
118
+ errorList = errorList.concat(validator.errorList);
119
+ }
120
+ });
121
+ validator.errorList = errorList;
122
+ }
123
+ return valid;
124
  },
125
  rules: function (command, argument) {
126
 
127
+ // If nothing is selected, return nothing; can't chain anyway
128
+ if (!this.length) {
129
+ return;
130
+ }
131
+
132
+ var element = this[ 0 ],
133
+ settings, staticRules, existingRules, data, param, filtered;
134
+
135
+ if (command) {
136
+ settings = $.data(element.form, "validator").settings;
137
+ staticRules = settings.rules;
138
+ existingRules = $.validator.staticRules(element);
139
+ switch (command) {
140
+ case "add":
141
+ $.extend(existingRules, $.validator.normalizeRule(argument));
142
+
143
+ // Remove messages from rules, but allow them to be set separately
144
+ delete existingRules.messages;
145
+ staticRules[ element.name ] = existingRules;
146
+ if (argument.messages) {
147
+ settings.messages[ element.name ] = $.extend(settings.messages[ element.name ], argument.messages);
148
+ }
149
+ break;
150
+ case "remove":
151
+ if (!argument) {
152
+ delete staticRules[ element.name ];
153
+ return existingRules;
154
+ }
155
+ filtered = {};
156
+ $.each(argument.split(/\s/), function (index, method) {
157
+ filtered[ method ] = existingRules[ method ];
158
+ delete existingRules[ method ];
159
+ if (method === "required") {
160
+ $(element).removeAttr("aria-required");
161
+ }
162
+ });
163
+ return filtered;
164
+ }
165
+ }
166
+
167
+ data = $.validator.normalizeRules(
168
+ $.extend(
169
+ {},
170
+ $.validator.classRules(element),
171
+ $.validator.attributeRules(element),
172
+ $.validator.dataRules(element),
173
+ $.validator.staticRules(element)
174
+ ), element);
175
+
176
+ // Make sure required is at front
177
+ if (data.required) {
178
+ param = data.required;
179
+ delete data.required;
180
+ data = $.extend({required: param}, data);
181
+ $(element).attr("aria-required", "true");
182
+ }
183
+
184
+ // Make sure remote is at back
185
+ if (data.remote) {
186
+ param = data.remote;
187
+ delete data.remote;
188
+ data = $.extend(data, {remote: param});
189
+ }
190
+
191
+ return data;
192
  }
193
  });
194
 
195
  // Custom selectors
196
  $.extend($.expr[ ":" ], {
197
  blank: function (a) {
198
+ return !$.trim("" + $(a).val());
199
  },
200
  filled: function (a) {
201
+ var val = $(a).val();
202
+ return val !== null && !!$.trim("" + val);
203
  },
204
 
205
  unchecked: function (a) {
206
+ return !$(a).prop("checked");
207
  }
208
  });
209
 
216
 
217
  $.validator.format = function (source, params) {
218
  if (arguments.length === 1) {
219
+ return function () {
220
+ var args = $.makeArray(arguments);
221
+ args.unshift(source);
222
+ return $.validator.format.apply(this, args);
223
+ };
224
  }
225
  if (params === undefined) {
226
+ return source;
227
  }
228
  if (arguments.length > 2 && params.constructor !== Array) {
229
+ params = $.makeArray(arguments).slice(1);
230
  }
231
  if (params.constructor !== Array) {
232
+ params = [params];
233
  }
234
  $.each(params, function (i, n) {
235
+ source = source.replace(new RegExp("\\{" + i + "\\}", "g"), function () {
236
+ return n;
237
+ });
238
  });
239
  return source;
240
  };
242
  $.extend($.validator, {
243
 
244
  defaults: {
245
+ messages: {},
246
+ groups: {},
247
+ rules: {},
248
+ errorClass: "error",
249
+ pendingClass: "pending",
250
+ validClass: "valid",
251
+ errorElement: "label",
252
+ focusCleanup: false,
253
+ focusInvalid: true,
254
+ errorContainer: $([]),
255
+ errorLabelContainer: $([]),
256
+ onsubmit: true,
257
+ ignore: ":hidden",
258
+ ignoreTitle: false,
259
+ onfocusin: function (element) {
260
+ this.lastActive = element;
261
+ if (this.settings.focusCleanup) {
262
+ if (this.settings.unhighlight) {
263
+ this.settings.unhighlight.call(this, element, this.settings.errorClass, this.settings.validClass);
264
+ }
265
+ this.hideThese(this.errorsFor(element));
266
+ }
267
+ },
268
+ onfocusout: function (element) {
269
+ if (!this.checkable(element) && (element.name in this.submitted || !this.optional(element))) {
270
+ this.element(element);
271
+ }
272
+ },
273
+ onkeyup: function (element, event) {
274
+ var excludedKeys = [
275
+ 16, 17, 18, 20, 35, 36, 37,
276
+ 38, 39, 40, 45, 144, 225
277
+ ];
278
+
279
+ if (event.which === 9 && this.elementValue(element) === "" || $.inArray(event.keyCode, excludedKeys) !== -1) {
280
+ return;
281
+ } else if (element.name in this.submitted || element.name in this.invalid) {
282
+ this.element(element);
283
+ }
284
+ },
285
+ onclick: function (element) {
286
+
287
+ // Click on selects, radiobuttons and checkboxes
288
+ if (element.name in this.submitted) {
289
+ this.element(element);
290
+
291
+ // Or option elements, check parent select in that case
292
+ } else if (element.parentNode.name in this.submitted) {
293
+ this.element(element.parentNode);
294
+ }
295
+ },
296
+ highlight: function (element, errorClass, validClass) {
297
+ if (element.type === "radio") {
298
+ this.findByName(element.name).addClass(errorClass).removeClass(validClass);
299
+ } else {
300
+ $(element).addClass(errorClass).removeClass(validClass);
301
+ }
302
+ },
303
+ unhighlight: function (element, errorClass, validClass) {
304
+ if (element.type === "radio") {
305
+ this.findByName(element.name).removeClass(errorClass).addClass(validClass);
306
+ } else {
307
+ $(element).removeClass(errorClass).addClass(validClass);
308
+ }
309
+ }
310
  },
311
  setDefaults: function (settings) {
312
+ $.extend($.validator.defaults, settings);
313
  },
314
 
315
  messages: {
316
+ required: "This field is required.",
317
+ remote: "Please fix this field.",
318
+ email: "Please enter a valid email address.",
319
+ url: "Please enter a valid URL.",
320
+ date: "Please enter a valid date.",
321
+ dateISO: "Please enter a valid date ( ISO ).",
322
+ number: "Please enter a valid number.",
323
+ digits: "Please enter only digits.",
324
+ equalTo: "Please enter the same value again.",
325
+ maxlength: $.validator.format("Please enter no more than {0} characters."),
326
+ minlength: $.validator.format("Please enter at least {0} characters."),
327
+ rangelength: $.validator.format("Please enter a value between {0} and {1} characters long."),
328
+ range: $.validator.format("Please enter a value between {0} and {1}."),
329
+ max: $.validator.format("Please enter a value less than or equal to {0}."),
330
+ min: $.validator.format("Please enter a value greater than or equal to {0}."),
331
+ step: $.validator.format("Please enter a multiple of {0}.")
332
  },
333
 
334
  autoCreateRanges: false,
335
 
336
  prototype: {
337
 
338
+ init: function () {
339
+ this.labelContainer = $(this.settings.errorLabelContainer);
340
+ this.errorContext = this.labelContainer.length && this.labelContainer || $(this.currentForm);
341
+ this.containers = $(this.settings.errorContainer).add(this.settings.errorLabelContainer);
342
+ this.submitted = {};
343
+ this.valueCache = {};
344
+ this.pendingRequest = 0;
345
+ this.pending = {};
346
+ this.invalid = {};
347
+ this.reset();
348
+
349
+ var groups = (this.groups = {}),
350
+ rules;
351
+ $.each(this.settings.groups, function (key, value) {
352
+ if (typeof value === "string") {
353
+ value = value.split(/\s/);
354
+ }
355
+ $.each(value, function (index, name) {
356
+ groups[ name ] = key;
357
+ });
358
+ });
359
+ rules = this.settings.rules;
360
+ $.each(rules, function (key, value) {
361
+ rules[ key ] = $.validator.normalizeRule(value);
362
+ });
363
+
364
+ function delegate(event) {
365
+ var validator = $.data(this.form, "validator"),
366
+ eventType = "on" + event.type.replace(/^validate/, ""),
367
+ settings = validator.settings;
368
+ if (settings[ eventType ] && !$(this).is(settings.ignore)) {
369
+ settings[ eventType ].call(validator, this, event);
370
+ }
371
+ }
372
+
373
+ $(this.currentForm)
374
+ .on("focusin.validate focusout.validate keyup.validate",
375
+ ":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'], " +
376
+ "[type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], " +
377
+ "[type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'], " +
378
+ "[type='radio'], [type='checkbox'], [contenteditable]", delegate)
379
+ .on("click.validate", "select, option, [type='radio'], [type='checkbox']", delegate);
380
+
381
+ if (this.settings.invalidHandler) {
382
+ $(this.currentForm).on("invalid-form.validate", this.settings.invalidHandler);
383
+ }
384
+
385
+ // Add aria-required to any Static/Data/Class required fields before first validation
386
+ // Screen readers require this attribute to be present before the initial submission http://www.w3.org/TR/WCAG-TECHS/ARIA2.html
387
+ $(this.currentForm).find("[required], [data-rule-required], .required").attr("aria-required", "true");
388
+ },
389
+
390
+ form: function () {
391
+ this.checkForm();
392
+ $.extend(this.submitted, this.errorMap);
393
+ this.invalid = $.extend({}, this.errorMap);
394
+ if (!this.valid()) {
395
+ $(this.currentForm).triggerHandler("invalid-form", [this]);
396
+ }
397
+ this.showErrors();
398
+ return this.valid();
399
+ },
400
+
401
+ checkForm: function () {
402
+ this.prepareForm();
403
+ for (var i = 0, elements = (this.currentElements = this.elements()); elements[ i ]; i++) {
404
+ this.check(elements[ i ]);
405
+ }
406
+ return this.valid();
407
+ },
408
+ element: function (element) {
409
+ var cleanElement = this.clean(element),
410
+ checkElement = this.validationTargetFor(cleanElement),
411
+ v = this,
412
+ result = true,
413
+ rs, group;
414
+
415
+ if (checkElement === undefined) {
416
+ delete this.invalid[ cleanElement.name ];
417
+ } else {
418
+ this.prepareElement(checkElement);
419
+ this.currentElements = $(checkElement);
420
+
421
+ // If this element is grouped, then validate all group elements already
422
+ // containing a value
423
+ group = this.groups[ checkElement.name ];
424
+ if (group) {
425
+ $.each(this.groups, function (name, testgroup) {
426
+ if (testgroup === group && name !== checkElement.name) {
427
+ cleanElement = v.validationTargetFor(v.clean(v.findByName(name)));
428
+ if (cleanElement && cleanElement.name in v.invalid) {
429
+ v.currentElements.push(cleanElement);
430
+ result = result && v.check(cleanElement);
431
+ }
432
+ }
433
+ });
434
+ }
435
+
436
+ rs = this.check(checkElement) !== false;
437
+ result = result && rs;
438
+ if (rs) {
439
+ this.invalid[ checkElement.name ] = false;
440
+ } else {
441
+ this.invalid[ checkElement.name ] = true;
442
+ }
443
+
444
+ if (!this.numberOfInvalids()) {
445
+
446
+ // Hide error containers on last error
447
+ this.toHide = this.toHide.add(this.containers);
448
+ }
449
+ this.showErrors();
450
+
451
+ // Add aria-invalid status for screen readers
452
+ $(element).attr("aria-invalid", !rs);
453
+ }
454
+
455
+ return result;
456
+ },
457
+ showErrors: function (errors) {
458
+ if (errors) {
459
+ var validator = this;
460
+
461
+ // Add items to error list and map
462
+ $.extend(this.errorMap, errors);
463
+ this.errorList = $.map(this.errorMap, function (message, name) {
464
+ return {
465
+ message: message,
466
+ element: validator.findByName(name)[ 0 ]
467
+ };
468
+ });
469
+
470
+ // Remove items from success list
471
+ this.successList = $.grep(this.successList, function (element) {
472
+ return !(element.name in errors);
473
+ });
474
+ }
475
+ if (this.settings.showErrors) {
476
+ this.settings.showErrors.call(this, this.errorMap, this.errorList);
477
+ } else {
478
+ this.defaultShowErrors();
479
+ }
480
+ },
481
+ resetForm: function () {
482
+ if ($.fn.resetForm) {
483
+ $(this.currentForm).resetForm();
484
+ }
485
+ this.invalid = {};
486
+ this.submitted = {};
487
+ this.prepareForm();
488
+ this.hideErrors();
489
+ var elements = this.elements()
490
+ .removeData("previousValue")
491
+ .removeAttr("aria-invalid");
492
+
493
+ this.resetElements(elements);
494
+ },
495
+
496
+ resetElements: function (elements) {
497
+ var i;
498
+
499
+ if (this.settings.unhighlight) {
500
+ for (i = 0; elements[ i ]; i++) {
501
+ this.settings.unhighlight.call(this, elements[ i ],
502
+ this.settings.errorClass, "");
503
+ this.findByName(elements[ i ].name).removeClass(this.settings.validClass);
504
+ }
505
+ } else {
506
+ elements
507
+ .removeClass(this.settings.errorClass)
508
+ .removeClass(this.settings.validClass);
509
+ }
510
+ },
511
+
512
+ numberOfInvalids: function () {
513
+ return this.objectLength(this.invalid);
514
+ },
515
+
516
+ objectLength: function (obj) {
517
+ /* jshint unused: false */
518
+ var count = 0,
519
+ i;
520
+ for (i in obj) {
521
+ if (obj[ i ]) {
522
+ count++;
523
+ }
524
+ }
525
+ return count;
526
+ },
527
+
528
+ hideErrors: function () {
529
+ this.hideThese(this.toHide);
530
+ },
531
+
532
+ hideThese: function (errors) {
533
+ errors.not(this.containers).text("");
534
+ this.addWrapper(errors).hide();
535
+ },
536
+
537
+ valid: function () {
538
+ return this.size() === 0;
539
+ },
540
+
541
+ size: function () {
542
+ return this.errorList.length;
543
+ },
544
+
545
+ focusInvalid: function () {
546
+ if (this.settings.focusInvalid) {
547
+ try {
548
+ $(this.findLastActive() || this.errorList.length && this.errorList[ 0 ].element || [])
549
+ .filter(":visible")
550
+ .focus()
551
+
552
+ // Manually trigger focusin event; without it, focusin handler isn't called, findLastActive won't have anything to find
553
+ .trigger("focusin");
554
+ } catch (e) {
555
+ }
556
+ }
557
+ },
558
+
559
+ findLastActive: function () {
560
+ var lastActive = this.lastActive;
561
+ return lastActive && $.grep(this.errorList, function (n) {
562
+ return n.element.name === lastActive.name;
563
+ }).length === 1 && lastActive;
564
+ },
565
+
566
+ elements: function () {
567
+ var validator = this,
568
+ rulesCache = {};
569
+
570
+ // Select all valid inputs inside the form (no submit or reset buttons)
571
+ return $(this.currentForm)
572
+ .find("input, select, textarea, [contenteditable]")
573
+ .not(":submit, :reset, :image, :disabled")
574
+ .not(this.settings.ignore)
575
+ .filter(function () {
576
+ var name = this.name || $(this).attr("name"); // For contenteditable
577
+ if (!name && validator.settings.debug && window.console) {
578
+ console.error("%o has no name assigned", this);
579
+ }
580
+
581
+ if (this.hasAttribute("contenteditable")) {
582
+ this.form = $(this).closest("form")[ 0 ];
583
+ }
584
+
585
+ // Select only the first element for each name, and only those with rules specified
586
+ if (name in rulesCache || !validator.objectLength($(this).rules())) {
587
+ return false;
588
+ }
589
+
590
+ rulesCache[ name ] = true;
591
+ return true;
592
+ });
593
+ },
594
+
595
+ clean: function (selector) {
596
+ return $(selector)[ 0 ];
597
+ },
598
+
599
+ errors: function () {
600
+ var errorClass = this.settings.errorClass.split(" ").join(".");
601
+ return $(this.settings.errorElement + "." + errorClass, this.errorContext);
602
+ },
603
+
604
+ resetInternals: function () {
605
+ this.successList = [];
606
+ this.errorList = [];
607
+ this.errorMap = {};
608
+ this.toShow = $([]);
609
+ this.toHide = $([]);
610
+ },
611
+
612
+ reset: function () {
613
+ this.resetInternals();
614
+ this.currentElements = $([]);
615
+ },
616
+
617
+ prepareForm: function () {
618
+ this.reset();
619
+ this.toHide = this.errors().add(this.containers);
620
+ },
621
+
622
+ prepareElement: function (element) {
623
+ this.reset();
624
+ this.toHide = this.errorsFor(element);
625
+ },
626
+
627
+ elementValue: function (element) {
628
+ var $element = $(element),
629
+ type = element.type,
630
+ val, idx;
631
+
632
+ if (type === "radio" || type === "checkbox") {
633
+ return this.findByName(element.name).filter(":checked").val();
634
+ } else if (type === "number" && typeof element.validity !== "undefined") {
635
+ return element.validity.badInput ? "NaN" : $element.val();
636
+ }
637
+
638
+ if (element.hasAttribute("contenteditable")) {
639
+ val = $element.text();
640
+ } else {
641
+ val = $element.val();
642
+ }
643
+
644
+ if (type === "file") {
645
+
646
+ // Modern browser (chrome & safari)
647
+ if (val.substr(0, 12) === "C:\\fakepath\\") {
648
+ return val.substr(12);
649
+ }
650
+
651
+ idx = val.lastIndexOf("/");
652
+ if (idx >= 0) {
653
+ return val.substr(idx + 1);
654
+ }
655
+
656
+ // Windows-based path
657
+ idx = val.lastIndexOf("\\");
658
+ if (idx >= 0) {
659
+ return val.substr(idx + 1);
660
+ }
661
+
662
+ // Just the file name
663
+ return val;
664
+ }
665
+
666
+ if (typeof val === "string") {
667
+ return val.replace(/\r/g, "");
668
+ }
669
+ return val;
670
+ },
671
+
672
+ check: function (element) {
673
+ element = this.validationTargetFor(this.clean(element));
674
+
675
+ var rules = $(element).rules(),
676
+ rulesCount = $.map(rules, function (n, i) {
677
+ return i;
678
+ }).length,
679
+ dependencyMismatch = false,
680
+ val = this.elementValue(element),
681
+ result, method, rule;
682
+ if (typeof rules.normalizer === "function") {
683
+ val = rules.normalizer.call(element, val);
684
+
685
+ if (typeof val !== "string") {
686
+ throw new TypeError("The normalizer should return a string value.");
687
+ }
688
+ delete rules.normalizer;
689
+ }
690
+
691
+ for (method in rules) {
692
+ rule = {method: method, parameters: rules[ method ]};
693
+ try {
694
+ result = $.validator.methods[ method ].call(this, val, element, rule.parameters);
695
+ if (result === "dependency-mismatch" && rulesCount === 1) {
696
+ dependencyMismatch = true;
697
+ continue;
698
+ }
699
+ dependencyMismatch = false;
700
+
701
+ if (result === "pending") {
702
+ this.toHide = this.toHide.not(this.errorsFor(element));
703
+ return;
704
+ }
705
+
706
+ if (!result) {
707
+ this.formatAndAdd(element, rule);
708
+ return false;
709
+ }
710
+ } catch (e) {
711
+ if (this.settings.debug && window.console) {
712
+ console.log("Exception occurred when checking element " + element.id + ", check the '" + rule.method + "' method.", e);
713
+ }
714
+ if (e instanceof TypeError) {
715
+ e.message += ". Exception occurred when checking element " + element.id + ", check the '" + rule.method + "' method.";
716
+ }
717
+
718
+ throw e;
719
+ }
720
+ }
721
+ if (dependencyMismatch) {
722
+ return;
723
+ }
724
+ if (this.objectLength(rules)) {
725
+ this.successList.push(element);
726
+ }
727
+ return true;
728
+ },
729
+
730
+ customDataMessage: function (element, method) {
731
+ return $(element).data("msg" + method.charAt(0).toUpperCase() +
732
+ method.substring(1).toLowerCase()) || $(element).data("msg");
733
+ },
734
+
735
+ // Return the custom message for the given element name and validation method
736
+ customMessage: function (name, method) {
737
+ var m = this.settings.messages[ name ];
738
+ return m && (m.constructor === String ? m : m[ method ]);
739
+ },
740
+
741
+ // Return the first defined argument, allowing empty strings
742
+ findDefined: function () {
743
+ for (var i = 0; i < arguments.length; i++) {
744
+ if (arguments[ i ] !== undefined) {
745
+ return arguments[ i ];
746
+ }
747
+ }
748
+ return undefined;
749
+ },
750
+
751
+ defaultMessage: function (element, rule) {
752
+ var message = this.findDefined(
753
+ this.customMessage(element.name, rule.method),
754
+ this.customDataMessage(element, rule.method),
755
+ // 'title' is never undefined, so handle empty string as undefined
756
+ !this.settings.ignoreTitle && element.title || undefined,
757
+ $.validator.messages[ rule.method ],
758
+ "<strong>Warning: No message defined for " + element.name + "</strong>"
759
+ ),
760
+ theregex = /\$?\{(\d+)\}/g;
761
+ if (typeof message === "function") {
762
+ message = message.call(this, rule.parameters, element);
763
+ } else if (theregex.test(message)) {
764
+ message = $.validator.format(message.replace(theregex, "{$1}"), rule.parameters);
765
+ }
766
+
767
+ return message;
768
+ },
769
+
770
+ formatAndAdd: function (element, rule) {
771
+ var message = this.defaultMessage(element, rule);
772
+
773
+ this.errorList.push({
774
+ message: message,
775
+ element: element,
776
+ method: rule.method
777
+ });
778
+
779
+ this.errorMap[ element.name ] = message;
780
+ this.submitted[ element.name ] = message;
781
+ },
782
+
783
+ addWrapper: function (toToggle) {
784
+ if (this.settings.wrapper) {
785
+ toToggle = toToggle.add(toToggle.parent(this.settings.wrapper));
786
+ }
787
+ return toToggle;
788
+ },
789
+
790
+ defaultShowErrors: function () {
791
+ var i, elements, error;
792
+ for (i = 0; this.errorList[ i ]; i++) {
793
+ error = this.errorList[ i ];
794
+ if (this.settings.highlight) {
795
+ this.settings.highlight.call(this, error.element, this.settings.errorClass, this.settings.validClass);
796
+ }
797
+ this.showLabel(error.element, error.message);
798
+ }
799
+ if (this.errorList.length) {
800
+ this.toShow = this.toShow.add(this.containers);
801
+ }
802
+ if (this.settings.success) {
803
+ for (i = 0; this.successList[ i ]; i++) {
804
+ this.showLabel(this.successList[ i ]);
805
+ }
806
+ }
807
+ if (this.settings.unhighlight) {
808
+ for (i = 0, elements = this.validElements(); elements[ i ]; i++) {
809
+ this.settings.unhighlight.call(this, elements[ i ], this.settings.errorClass, this.settings.validClass);
810
+ }
811
+ }
812
+ this.toHide = this.toHide.not(this.toShow);
813
+ this.hideErrors();
814
+ this.addWrapper(this.toShow).show();
815
+ },
816
+
817
+ validElements: function () {
818
+ return this.currentElements.not(this.invalidElements());
819
+ },
820
+
821
+ invalidElements: function () {
822
+ return $(this.errorList).map(function () {
823
+ return this.element;
824
+ });
825
+ },
826
+
827
+ showLabel: function (element, message) {
828
+ var place, group, errorID, v,
829
+ error = this.errorsFor(element),
830
+ elementID = this.idOrName(element),
831
+ describedBy = $(element).attr("aria-describedby");
832
+
833
+ if (error.length) {
834
+
835
+ // Refresh error/success class
836
+ error.removeClass(this.settings.validClass).addClass(this.settings.errorClass);
837
+
838
+ // Replace message on existing label
839
+ error.html(message);
840
+ } else {
841
+
842
+ // Create error element
843
+ error = $("<" + this.settings.errorElement + ">")
844
+ .attr("id", elementID + "-error")
845
+ .addClass(this.settings.errorClass)
846
+ .html(message || "");
847
+
848
+ // Maintain reference to the element to be placed into the DOM
849
+ place = error;
850
+ if (this.settings.wrapper) {
851
+ place = error.hide().show().wrap("<" + this.settings.wrapper + "/>").parent();
852
+ }
853
+ if (this.labelContainer.length) {
854
+ this.labelContainer.append(place);
855
+ } else if (this.settings.errorPlacement) {
856
+ this.settings.errorPlacement(place, $(element));
857
+ } else {
858
+ place.insertAfter(element);
859
+ }
860
+
861
+ if (error.is("label")) {
862
+ error.attr("for", elementID);
863
+ } else if (error.parents("label[for='" + this.escapeCssMeta(elementID) + "']").length === 0) {
864
+ errorID = error.attr("id");
865
+ if (!describedBy) {
866
+ describedBy = errorID;
867
+ } else if (!describedBy.match(new RegExp("\\b" + this.escapeCssMeta(errorID) + "\\b"))) {
868
+ describedBy += " " + errorID;
869
+ }
870
+ $(element).attr("aria-describedby", describedBy);
871
+ group = this.groups[ element.name ];
872
+ if (group) {
873
+ v = this;
874
+ $.each(v.groups, function (name, testgroup) {
875
+ if (testgroup === group) {
876
+ $("[name='" + v.escapeCssMeta(name) + "']", v.currentForm)
877
+ .attr("aria-describedby", error.attr("id"));
878
+ }
879
+ });
880
+ }
881
+ }
882
+ }
883
+ if (!message && this.settings.success) {
884
+ error.text("");
885
+ if (typeof this.settings.success === "string") {
886
+ error.addClass(this.settings.success);
887
+ } else {
888
+ this.settings.success(error, element);
889
+ }
890
+ }
891
+ this.toShow = this.toShow.add(error);
892
+ },
893
+
894
+ errorsFor: function (element) {
895
+ var name = this.escapeCssMeta(this.idOrName(element)),
896
+ describer = $(element).attr("aria-describedby"),
897
+ selector = "label[for='" + name + "'], label[for='" + name + "'] *";
898
+ if (describer) {
899
+ selector = selector + ", #" + this.escapeCssMeta(describer)
900
+ .replace(/\s+/g, ", #");
901
+ }
902
+
903
+ return this
904
+ .errors()
905
+ .filter(selector);
906
+ },
907
+ escapeCssMeta: function (string) {
908
+ return string.replace(/([\\!"#$%&'()*+,./:;<=>?@\[\]^`{|}~])/g, "\\$1");
909
+ },
910
+
911
+ idOrName: function (element) {
912
+ return this.groups[ element.name ] || (this.checkable(element) ? element.name : element.id || element.name);
913
+ },
914
+
915
+ validationTargetFor: function (element) {
916
+
917
+ if (this.checkable(element)) {
918
+ element = this.findByName(element.name);
919
+ }
920
+ return $(element).not(this.settings.ignore)[ 0 ];
921
+ },
922
+
923
+ checkable: function (element) {
924
+ return (/radio|checkbox/i).test(element.type);
925
+ },
926
+
927
+ findByName: function (name) {
928
+ return $(this.currentForm).find("[name='" + this.escapeCssMeta(name) + "']");
929
+ },
930
+
931
+ getLength: function (value, element) {
932
+ switch (element.nodeName.toLowerCase()) {
933
+ case "select":
934
+ return $("option:selected", element).length;
935
+ case "input":
936
+ if (this.checkable(element)) {
937
+ return this.findByName(element.name).filter(":checked").length;
938
+ }
939
+ }
940
+ return value.length;
941
+ },
942
+
943
+ depend: function (param, element) {
944
+ return this.dependTypes[ typeof param ] ? this.dependTypes[ typeof param ](param, element) : true;
945
+ },
946
+
947
+ dependTypes: {
948
+ "boolean": function (param) {
949
+ return param;
950
+ },
951
+ "string": function (param, element) {
952
+ return !!$(param, element.form).length;
953
+ },
954
+ "function": function (param, element) {
955
+ return param(element);
956
+ }
957
+ },
958
+
959
+ optional: function (element) {
960
+ var val = this.elementValue(element);
961
+ return !$.validator.methods.required.call(this, val, element) && "dependency-mismatch";
962
+ },
963
+
964
+ startRequest: function (element) {
965
+ if (!this.pending[ element.name ]) {
966
+ this.pendingRequest++;
967
+ $(element).addClass(this.settings.pendingClass);
968
+ this.pending[ element.name ] = true;
969
+ }
970
+ },
971
+ stopRequest: function (element, valid) {
972
+ this.pendingRequest--;
973
+ if (this.pendingRequest < 0) {
974
+ this.pendingRequest = 0;
975
+ }
976
+ delete this.pending[ element.name ];
977
+ $(element).removeClass(this.settings.pendingClass);
978
+ if (valid && this.pendingRequest === 0 && this.formSubmitted && this.form()) {
979
+ $(this.currentForm).submit();
980
+ this.formSubmitted = false;
981
+ } else if (!valid && this.pendingRequest === 0 && this.formSubmitted) {
982
+ $(this.currentForm).triggerHandler("invalid-form", [this]);
983
+ this.formSubmitted = false;
984
+ }
985
+ },
986
+ previousValue: function (element, method) {
987
+ return $.data(element, "previousValue") || $.data(element, "previousValue", {
988
+ old: null,
989
+ valid: true,
990
+ message: this.defaultMessage(element, {method: method})
991
+ });
992
+ },
993
+ destroy: function () {
994
+ this.resetForm();
995
+ $(this.currentForm)
996
+ .off(".validate")
997
+ .removeData("validator")
998
+ .find(".validate-equalTo-blur")
999
+ .off(".validate-equalTo")
1000
+ .removeClass("validate-equalTo-blur");
1001
+ }
1002
  },
1003
  classRuleSettings: {
1004
+ required: {required: true},
1005
+ email: {email: true},
1006
+ url: {url: true},
1007
+ date: {date: true},
1008
+ dateISO: {dateISO: true},
1009
+ number: {number: true},
1010
+ digits: {digits: true},
1011
+ creditcard: {creditcard: true}
1012
  },
1013
 
1014
  addClassRules: function (className, rules) {
1015
+ if (className.constructor === String) {
1016
+ this.classRuleSettings[ className ] = rules;
1017
+ } else {
1018
+ $.extend(this.classRuleSettings, className);
1019
+ }
1020
  },
1021
 
1022
  classRules: function (element) {
1023
+ var rules = {},
1024
+ classes = $(element).attr("class");
1025
+
1026
+ if (classes) {
1027
+ $.each(classes.split(" "), function () {
1028
+ if (this in $.validator.classRuleSettings) {
1029
+ $.extend(rules, $.validator.classRuleSettings[ this ]);
1030
+ }
1031
+ });
1032
+ }
1033
+ return rules;
1034
  },
1035
 
1036
  normalizeAttributeRule: function (rules, type, method, value) {
1037
+ if (/min|max|step/.test(method) && (type === null || /number|range|text/.test(type))) {
1038
+ value = Number(value);
1039
+ if (isNaN(value)) {
1040
+ value = undefined;
1041
+ }
1042
+ }
1043
+
1044
+ if (value || value === 0) {
1045
+ rules[ method ] = value;
1046
+ } else if (type === method && type !== "range") {
1047
+ rules[ method ] = true;
1048
+ }
1049
  },
1050
 
1051
  attributeRules: function (element) {
1052
+ var rules = {},
1053
+ $element = $(element),
1054
+ type = element.getAttribute("type"),
1055
+ method, value;
1056
+
1057
+ for (method in $.validator.methods) {
1058
+ if (method === "required") {
1059
+ value = element.getAttribute(method);
1060
+ if (value === "") {
1061
+ value = true;
1062
+ }
1063
+ value = !!value;
1064
+ } else {
1065
+ value = $element.attr(method);
1066
+ }
1067
+ this.normalizeAttributeRule(rules, type, method, value);
1068
+ }
1069
+ if (rules.maxlength && /-1|2147483647|524288/.test(rules.maxlength)) {
1070
+ delete rules.maxlength;
1071
+ }
1072
+
1073
+ return rules;
1074
  },
1075
 
1076
  dataRules: function (element) {
1077
+ var rules = {},
1078
+ $element = $(element),
1079
+ type = element.getAttribute("type"),
1080
+ method, value;
1081
+
1082
+ for (method in $.validator.methods) {
1083
+ value = $element.data("rule" + method.charAt(0).toUpperCase() + method.substring(1).toLowerCase());
1084
+ this.normalizeAttributeRule(rules, type, method, value);
1085
+ }
1086
+ return rules;
1087
  },
1088
 
1089
  staticRules: function (element) {
1090
+ var rules = {},
1091
+ validator = $.data(element.form, "validator");
1092
 
1093
+ if (validator.settings.rules) {
1094
+ rules = $.validator.normalizeRule(validator.settings.rules[ element.name ]) || {};
1095
+ }
1096
+ return rules;
1097
  },
1098
 
1099
  normalizeRules: function (rules, element) {
1100
+ $.each(rules, function (prop, val) {
1101
+ if (val === false) {
1102
+ delete rules[ prop ];
1103
+ return;
1104
+ }
1105
+ if (val.param || val.depends) {
1106
+ var keepRule = true;
1107
+ switch (typeof val.depends) {
1108
+ case "string":
1109
+ keepRule = !!$(val.depends, element.form).length;
1110
+ break;
1111
+ case "function":
1112
+ keepRule = val.depends.call(element, element);
1113
+ break;
1114
+ }
1115
+ if (keepRule) {
1116
+ rules[ prop ] = val.param !== undefined ? val.param : true;
1117
+ } else {
1118
+ $.data(element.form, "validator").resetElements($(element));
1119
+ delete rules[ prop ];
1120
+ }
1121
+ }
1122
+ });
1123
+ $.each(rules, function (rule, parameter) {
1124
+ rules[ rule ] = $.isFunction(parameter) && rule !== "normalizer" ? parameter(element) : parameter;
1125
+ });
1126
+ $.each(["minlength", "maxlength"], function () {
1127
+ if (rules[ this ]) {
1128
+ rules[ this ] = Number(rules[ this ]);
1129
+ }
1130
+ });
1131
+ $.each(["rangelength", "range"], function () {
1132
+ var parts;
1133
+ if (rules[ this ]) {
1134
+ if ($.isArray(rules[ this ])) {
1135
+ rules[ this ] = [Number(rules[ this ][ 0 ]), Number(rules[ this ][ 1 ])];
1136
+ } else if (typeof rules[ this ] === "string") {
1137
+ parts = rules[ this ].replace(/[\[\]]/g, "").split(/[\s,]+/);
1138
+ rules[ this ] = [Number(parts[ 0 ]), Number(parts[ 1 ])];
1139
+ }
1140
+ }
1141
+ });
1142
+ if ($.validator.autoCreateRanges) {
1143
+ if (rules.min != null && rules.max != null) {
1144
+ rules.range = [rules.min, rules.max];
1145
+ delete rules.min;
1146
+ delete rules.max;
1147
+ }
1148
+ if (rules.minlength != null && rules.maxlength != null) {
1149
+ rules.rangelength = [rules.minlength, rules.maxlength];
1150
+ delete rules.minlength;
1151
+ delete rules.maxlength;
1152
+ }
1153
+ }
1154
+ return rules;
1155
  },
1156
  normalizeRule: function (data) {
1157
+ if (typeof data === "string") {
1158
+ var transformed = {};
1159
+ $.each(data.split(/\s/), function () {
1160
+ transformed[ this ] = true;
1161
+ });
1162
+ data = transformed;
1163
+ }
1164
+ return data;
1165
  },
1166
  addMethod: function (name, method, message) {
1167
+ $.validator.methods[ name ] = method;
1168
+ $.validator.messages[ name ] = message !== undefined ? message : $.validator.messages[ name ];
1169
+ if (method.length < 3) {
1170
+ $.validator.addClassRules(name, $.validator.normalizeRule(name));
1171
+ }
1172
  },
1173
  methods: {
1174
+ required: function (value, element, param) {
1175
+ if (!this.depend(param, element)) {
1176
+ return "dependency-mismatch";
1177
+ }
1178
+ if (element.nodeName.toLowerCase() === "select") {
1179
+ var val = $(element).val();
1180
+ return val && val.length > 0;
1181
+ }
1182
+ if (this.checkable(element)) {
1183
+ return this.getLength(value, element) > 0;
1184
+ }
1185
+ return value.length > 0;
1186
+ },
1187
+ email: function (value, element) {
1188
+ return this.optional(element) || /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(value);
1189
+ },
1190
+ url: function (value, element) {
1191
+ return this.optional(element) || /^(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})).?)(?::\d{2,5})?(?:[/?#]\S*)?$/i.test(value);
1192
+ },
1193
+ date: function (value, element) {
1194
+ return this.optional(element) || !/Invalid|NaN/.test(new Date(value).toString());
1195
+ },
1196
+ dateISO: function (value, element) {
1197
+ return this.optional(element) || /^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test(value);
1198
+ },
1199
+ number: function (value, element) {
1200
+ return this.optional(element) || /^(?:-?\d+|-?\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(value);
1201
+ },
1202
+ digits: function (value, element) {
1203
+ return this.optional(element) || /^\d+$/.test(value);
1204
+ },
1205
+ minlength: function (value, element, param) {
1206
+ var length = $.isArray(value) ? value.length : this.getLength(value, element);
1207
+ return this.optional(element) || length >= param;
1208
+ },
1209
+ maxlength: function (value, element, param) {
1210
+ var length = $.isArray(value) ? value.length : this.getLength(value, element);
1211
+ return this.optional(element) || length <= param;
1212
+ },
1213
+ rangelength: function (value, element, param) {
1214
+ var length = $.isArray(value) ? value.length : this.getLength(value, element);
1215
+ return this.optional(element) || (length >= param[ 0 ] && length <= param[ 1 ]);
1216
+ },
1217
+ min: function (value, element, param) {
1218
+ return this.optional(element) || value >= param;
1219
+ },
1220
+ max: function (value, element, param) {
1221
+ return this.optional(element) || value <= param;
1222
+ },
1223
+ range: function (value, element, param) {
1224
+ return this.optional(element) || (value >= param[ 0 ] && value <= param[ 1 ]);
1225
+ },
1226
+ step: function (value, element, param) {
1227
+ var type = $(element).attr("type"),
1228
+ errorMessage = "Step attribute on input type " + type + " is not supported.",
1229
+ supportedTypes = ["text", "number", "range"],
1230
+ re = new RegExp("\\b" + type + "\\b"),
1231
+ notSupported = type && !re.test(supportedTypes.join());
1232
+ if (notSupported) {
1233
+ throw new Error(errorMessage);
1234
+ }
1235
+ return this.optional(element) || (value % param === 0);
1236
+ },
1237
+ equalTo: function (value, element, param) {
1238
+ var target = $(param);
1239
+ if (this.settings.onfocusout && target.not(".validate-equalTo-blur").length) {
1240
+ target.addClass("validate-equalTo-blur").on("blur.validate-equalTo", function () {
1241
+ $(element).valid();
1242
+ });
1243
+ }
1244
+ return value === target.val();
1245
+ },
1246
+ remote: function (value, element, param, method) {
1247
+ if (this.optional(element)) {
1248
+ return "dependency-mismatch";
1249
+ }
1250
+
1251
+ method = typeof method === "string" && method || "remote";
1252
+
1253
+ var previous = this.previousValue(element, method),
1254
+ validator, data, optionDataString;
1255
+
1256
+ if (!this.settings.messages[ element.name ]) {
1257
+ this.settings.messages[ element.name ] = {};
1258
+ }
1259
+ previous.originalMessage = previous.originalMessage || this.settings.messages[ element.name ][ method ];
1260
+ this.settings.messages[ element.name ][ method ] = previous.message;
1261
+
1262
+ param = typeof param === "string" && {url: param} || param;
1263
+ optionDataString = $.param($.extend({data: value}, param.data));
1264
+ if (previous.old === optionDataString) {
1265
+ return previous.valid;
1266
+ }
1267
+
1268
+ previous.old = optionDataString;
1269
+ validator = this;
1270
+ this.startRequest(element);
1271
+ data = {};
1272
+ data[ element.name ] = value;
1273
+ $.ajax($.extend(true, {
1274
+ mode: "abort",
1275
+ port: "validate" + element.name,
1276
+ dataType: "json",
1277
+ data: data,
1278
+ context: validator.currentForm,
1279
+ success: function (response) {
1280
+ var valid = response === true || response === "true",
1281
+ errors, message, submitted;
1282
+
1283
+ validator.settings.messages[ element.name ][ method ] = previous.originalMessage;
1284
+ if (valid) {
1285
+ submitted = validator.formSubmitted;
1286
+ validator.resetInternals();
1287
+ validator.toHide = validator.errorsFor(element);
1288
+ validator.formSubmitted = submitted;
1289
+ validator.successList.push(element);
1290
+ validator.invalid[ element.name ] = false;
1291
+ validator.showErrors();
1292
+ } else {
1293
+ errors = {};
1294
+ message = response || validator.defaultMessage(element, {method: method, parameters: value});
1295
+ errors[ element.name ] = previous.message = message;
1296
+ validator.invalid[ element.name ] = true;
1297
+ validator.showErrors(errors);
1298
+ }
1299
+ previous.valid = valid;
1300
+ validator.stopRequest(element, valid);
1301
+ }
1302
+ }, param));
1303
+ return "pending";
1304
+ }
1305
  }
1306
  });
1307
  var pendingRequests = {},
1308
+ ajax;
1309
  if ($.ajaxPrefilter) {
1310
  $.ajaxPrefilter(function (settings, _, xhr) {
1311
+ var port = settings.port;
1312
+ if (settings.mode === "abort") {
1313
+ if (pendingRequests[ port ]) {
1314
+ pendingRequests[ port ].abort();
1315
+ }
1316
+ pendingRequests[ port ] = xhr;
1317
+ }
1318
  });
1319
  } else {
1320
  ajax = $.ajax;
1321
  $.ajax = function (settings) {
1322
+ var mode = ("mode" in settings ? settings : $.ajaxSettings).mode,
1323
+ port = ("port" in settings ? settings : $.ajaxSettings).port;
1324
+ if (mode === "abort") {
1325
+ if (pendingRequests[ port ]) {
1326
+ pendingRequests[ port ].abort();
1327
+ }
1328
+ pendingRequests[ port ] = ajax.apply(this, arguments);
1329
+ return pendingRequests[ port ];
1330
+ }
1331
+ return ajax.apply(this, arguments);
1332
  };
1333
  }
1334
  }));
includes/authentication-manager-mail-bank.php CHANGED
@@ -21,40 +21,40 @@ if (!class_exists("authentication_manager_mail_bank")) {
21
  class authentication_manager_mail_bank {
22
 
23
  public function create_authentication_manager() {
24
- $obj_mail_bank_register_transport = new mail_bank_register_transport();
25
- $transport = $obj_mail_bank_register_transport->retrieve_mailertype_mail_bank();
26
- return $this->create_manager($transport);
27
  }
28
 
29
  public function create_manager(mail_bank_smtp_transport $transport) {
30
- $obj_mb_config_provider = new mail_bank_configuration_provider();
31
- $configuration_settings = $obj_mb_config_provider->get_configuration_settings();
32
- $authorization_token = mail_bank_manage_token::get_instance();
33
- $hostname = $configuration_settings["hostname"];
34
- $client_id = $configuration_settings["client_id"];
35
- $client_secret = $configuration_settings["client_secret"];
36
- $sender_email = $configuration_settings["sender_email"];
37
- $redirect_uri = admin_url("admin-ajax.php");
38
- if ($this->check_google_service_provider_mail_bank($hostname)) {
39
- $obj_service_provider = new google_authentication_mail_bank($client_id, $client_secret, $authorization_token, $redirect_uri, $sender_email);
40
- } elseif ($this->check_microsoft_service_provider_mail_bank($hostname)) {
41
- $obj_service_provider = new microsoft_authentication_mail_bank($client_id, $client_secret, $authorization_token, $redirect_uri);
42
- } elseif ($this->check_yahoo_service_provider_mail_bank($hostname)) {
43
- $obj_service_provider = new yahoo_authentication_mail_bank($client_id, $client_secret, $authorization_token, $redirect_uri);
44
- }
45
- return $obj_service_provider;
46
  }
47
 
48
  public function check_google_service_provider_mail_bank($hostname) {
49
- return mail_bank_zend_mail_helper::email_domains_mail_bank($hostname, "gmail.com") || mail_bank_zend_mail_helper::email_domains_mail_bank($hostname, "googleapis.com");
50
  }
51
 
52
  public function check_microsoft_service_provider_mail_bank($hostname) {
53
- return mail_bank_zend_mail_helper::email_domains_mail_bank($hostname, "live.com");
54
  }
55
 
56
  public function check_yahoo_service_provider_mail_bank($hostname) {
57
- return strpos($hostname, "yahoo");
58
  }
59
 
60
  }
21
  class authentication_manager_mail_bank {
22
 
23
  public function create_authentication_manager() {
24
+ $obj_mail_bank_register_transport = new mail_bank_register_transport();
25
+ $transport = $obj_mail_bank_register_transport->retrieve_mailertype_mail_bank();
26
+ return $this->create_manager($transport);
27
  }
28
 
29
  public function create_manager(mail_bank_smtp_transport $transport) {
30
+ $obj_mb_config_provider = new mail_bank_configuration_provider();
31
+ $configuration_settings = $obj_mb_config_provider->get_configuration_settings();
32
+ $authorization_token = mail_bank_manage_token::get_instance();
33
+ $hostname = $configuration_settings["hostname"];
34
+ $client_id = $configuration_settings["client_id"];
35
+ $client_secret = $configuration_settings["client_secret"];
36
+ $sender_email = $configuration_settings["sender_email"];
37
+ $redirect_uri = admin_url("admin-ajax.php");
38
+ if ($this->check_google_service_provider_mail_bank($hostname)) {
39
+ $obj_service_provider = new google_authentication_mail_bank($client_id, $client_secret, $authorization_token, $redirect_uri, $sender_email);
40
+ } elseif ($this->check_microsoft_service_provider_mail_bank($hostname)) {
41
+ $obj_service_provider = new microsoft_authentication_mail_bank($client_id, $client_secret, $authorization_token, $redirect_uri);
42
+ } elseif ($this->check_yahoo_service_provider_mail_bank($hostname)) {
43
+ $obj_service_provider = new yahoo_authentication_mail_bank($client_id, $client_secret, $authorization_token, $redirect_uri);
44
+ }
45
+ return $obj_service_provider;
46
  }
47
 
48
  public function check_google_service_provider_mail_bank($hostname) {
49
+ return mail_bank_zend_mail_helper::email_domains_mail_bank($hostname, "gmail.com") || mail_bank_zend_mail_helper::email_domains_mail_bank($hostname, "googleapis.com");
50
  }
51
 
52
  public function check_microsoft_service_provider_mail_bank($hostname) {
53
+ return mail_bank_zend_mail_helper::email_domains_mail_bank($hostname, "live.com");
54
  }
55
 
56
  public function check_yahoo_service_provider_mail_bank($hostname) {
57
+ return strpos($hostname, "yahoo");
58
  }
59
 
60
  }
includes/footer.php CHANGED
@@ -15,8 +15,8 @@ if (!is_user_logged_in()) {
15
  $access_granted = false;
16
  foreach ($user_role_permission as $permission) {
17
  if (current_user_can($permission)) {
18
- $access_granted = true;
19
- break;
20
  }
21
  }
22
  if (!$access_granted) {
@@ -29,65 +29,65 @@ if (!is_user_logged_in()) {
29
  <div class="popup" data-popup="ux_open_popup_translator">
30
  <div class="popup-inner">
31
  <div class="portlet box vivid-green" style="margin-bottom:0px;">
32
- <div class="portlet-title">
33
- <div class="caption" id="ux_div_action">
34
- <?php echo $mb_translation_request; ?>
35
- </div>
36
- </div>
37
- <div class="portlet-body form">
38
- <div id="ux_div_popup_header">
39
- <form id="ux_frm_language_translator">
40
- <div class="form-body">
41
- <div class="row">
42
- <div class="col-md-6 popup-control">
43
- <div class="form-group">
44
- <label class="control-label">
45
- <?php echo $mb_feature_requests_your_name; ?> :
46
- <i class="icon-custom-question tooltips" data-original-title="<?php echo $mb_popup_your_name_tooltip; ?>" data-placement="right"></i>
47
- <span class="required" aria-required="true">*</span>
48
- </label>
49
- <input type="text" class="form-control" name="ux_txt_your_name" id="ux_txt_your_name" value="" placeholder="<?php echo $mb_feature_requests_your_name_placeholder; ?>">
50
- </div>
51
- </div>
52
- <div class="col-md-6 popup-control">
53
- <div class="form-group">
54
- <label class="control-label">
55
- <?php echo $mb_feature_requests_your_email; ?> :
56
- <i class="icon-custom-question tooltips" data-original-title="<?php echo $mb_popup_your_email_tooltip; ?>" data-placement="right"></i>
57
- <span class="required" aria-required="true">*</span>
58
- </label>
59
- <input type="text" class="form-control" name="ux_txt_email_address" id="ux_txt_email_address" value="" placeholder="<?php echo $mb_feature_requests_your_email_placeholder; ?>">
60
- </div>
61
- </div>
62
- </div>
63
- <div class="form-group">
64
- <label class="control-label">
65
- <?php echo $mb_language_interested_to_translate; ?> :
66
- <i class="icon-custom-question tooltips" data-original-title="<?php echo $mb_language_interested_to_translate_tooltip; ?>" data-placement="right"></i>
67
- <span class="required" aria-required="true">*</span>
68
- </label>
69
- <input type="text" class="form-control" name="ux_txt_language" id="ux_txt_language" value="" placeholder="<?php echo $mb_language_interested_to_translate_placeholder; ?>">
70
- </div>
71
- <div class="form-group">
72
- <label class="control-label">
73
- <?php echo $mb_popup_query; ?> :
74
- <i class="icon-custom-question tooltips" data-original-title="<?php echo $mb_popup_query_tooltip; ?>" data-placement="right"></i>
75
- <span class="required" aria-required="true">*</span>
76
- </label>
77
- <textarea class="form-control" name="ux_txtarea_query" id="ux_txtarea_query" rows="7" placeholder="<?php echo $mb_popup_query_placeholder; ?>"><?php echo "Hi,\r\r\nI am interested in translating your plugin Mail Bank in my native language.\r\r\nPlease get back to me!\r\r\nThanks"; ?></textarea>
78
- </div>
79
- </div>
80
- <div class="modal-footer">
81
- <div class="form-actions">
82
- <div class="pull-right">
83
- <input type="button" data-popup-close-translator="ux_open_popup_translator" class="btn vivid-green" name="ux_btn_close" id="ux_btn_close" value="<?php echo $mb_manage_backups_close; ?>">
84
- <input type="submit" class="btn vivid-green" name="ux_btn_send_request" id="ux_btn_send_request" value="<?php echo $mb_feature_requests_send_request; ?>">
85
- </div>
86
- </div>
87
- </div>
88
- </form>
89
- </div>
90
- </div>
91
  </div>
92
  </div>
93
  </div>
@@ -97,7 +97,7 @@ if (!is_user_logged_in()) {
97
  {
98
  if (jQuery(this).parent("ul.page-sidebar-menu-tech-banker").size() === 1)
99
  {
100
- jQuery(this).find("> a").append("<span class=\"selected\"></span>");
101
  }
102
  });
103
 
@@ -107,10 +107,10 @@ if (!is_user_logged_in()) {
107
  var content_height = jQuery(".page-content").height() + 30;
108
  if (parseInt(menus_height) > parseInt(content_height))
109
  {
110
- jQuery(".page-content").attr("style", "min-height:" + menus_height + "px")
111
  } else
112
  {
113
- jQuery(".page-sidebar-menu-tech-banker").attr("style", "min-height:" + content_height + "px")
114
  }
115
  }
116
 
@@ -126,27 +126,27 @@ if (!is_user_logged_in()) {
126
  var sidebar_close = parent.children("li.open").removeClass("open");
127
  if (sidebar_close)
128
  {
129
- setInterval(load_sidebar_content_mail_bank, 100);
130
  }
131
  if (sub.is(":visible"))
132
  {
133
- jQuery(this).parent().removeClass("open");
134
- sub.slideUp(slideSpeed);
135
  } else if (hasSubMenu)
136
  {
137
- jQuery(this).parent().addClass("open");
138
- sub.slideDown(slideSpeed);
139
  }
140
  });
141
  function paste_only_digits_mail_bank(control_id)
142
  {
143
  jQuery("#" + control_id).on("paste keypress", function (e)
144
  {
145
- var $this = jQuery("#" + control_id);
146
- setTimeout(function ()
147
- {
148
- $this.val($this.val().replace(/[^0-9]/g, ""));
149
- }, 5);
150
  });
151
  }
152
 
@@ -171,14 +171,14 @@ if (!is_user_logged_in()) {
171
  jQuery("body").append(overlay);
172
  if (control_id !== undefined)
173
  {
174
- var message = control_id;
175
- var success = <?php echo json_encode($mb_success); ?>;
176
- var issuccessmessage = jQuery("#toast-container").exists();
177
- if (issuccessmessage !== true)
178
- {
179
- var shortCutFunction = jQuery("#manage_messages input:checked").val();
180
- toastr[shortCutFunction](message, success);
181
- }
182
  }
183
  }
184
 
@@ -192,24 +192,24 @@ if (!is_user_logged_in()) {
192
  {
193
  var b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
194
  var o1, o2, o3, h1, h2, h3, h4, bits, i = 0,
195
- ac = 0,
196
- enc = '',
197
- tmp_arr = [];
198
  if (!data)
199
  {
200
- return data;
201
  }
202
  do
203
  {
204
- o1 = data.charCodeAt(i++);
205
- o2 = data.charCodeAt(i++);
206
- o3 = data.charCodeAt(i++);
207
- bits = o1 << 16 | o2 << 8 | o3;
208
- h1 = bits >> 18 & 0x3f;
209
- h2 = bits >> 12 & 0x3f;
210
- h3 = bits >> 6 & 0x3f;
211
- h4 = bits & 0x3f;
212
- tmp_arr[ac++] = b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4);
213
  } while (i < data.length);
214
  enc = tmp_arr.join('');
215
  var r = data.length % 3;
@@ -230,107 +230,107 @@ if (!is_user_logged_in()) {
230
  var hostname = smtp_host.substr(indexof, 5);
231
  if (smtp_host === "smtp.gmail.com")
232
  {
233
- jQuery("#ux_link_content").text("(" +<?php echo json_encode($mb_email_configuration_get_google_credentials); ?> + ")");
234
- jQuery("#ux_link_reference").attr("href", "https://console.developers.google.com");
235
  } else if (smtp_host === "smtp.live.com")
236
  {
237
- jQuery("#ux_link_content").text("(" +<?php echo json_encode($mb_email_configuration_get_microsoft_credentials); ?> + ")");
238
- jQuery("#ux_link_reference").attr("href", "https://account.live.com/developers/applications/create");
239
  } else if (hostname === "yahoo")
240
  {
241
- jQuery("#ux_link_content").text("(" +<?php echo json_encode($mb_email_configuration_get_yahoo_credentials); ?> + ")");
242
- jQuery("#ux_link_reference").attr("href", "https://developer.yahoo.com/apps/");
243
  } else
244
  {
245
- jQuery("#ux_link_content").text("");
246
  }
247
  }
248
 
249
  function mail_bank_mail_sender(to_email_address)
250
  {
251
  jQuery.post(ajaxurl,
252
- {
253
- data: base64_encode_mail_bank(jQuery("#ux_frm_test_email_configuration").serialize()),
254
- param: "mail_bank_test_email_configuration_module",
255
- action: "mail_bank_action",
256
- _wp_nonce: "<?php echo isset($mail_bank_test_email_configuration) ? $mail_bank_test_email_configuration : ""; ?>"
257
- },
258
- function (data)
259
- {
260
- jQuery("#ux_txtarea_result_log").html("<?php echo $mb_email_configuration_send_test_email_textarea; ?>\n");
261
- jQuery("#ux_txtarea_result_log").append(<?php echo json_encode($mb_test_email_sending_test_email); ?> + "&nbsp;" + to_email_address + "\n");
262
- if (jQuery.trim(data) === "true" || jQuery.trim(data) === "1")
263
- {
264
- jQuery("#ux_div_mail_console").css("display", "block");
265
- jQuery("#console_log_div").css("display", "none");
266
- jQuery("#ux_txtarea_result_log").append(<?php echo json_encode($mb_test_email_sent); ?>);
267
- } else
268
- {
269
- jQuery("#console_log_div").css("display", "none");
270
- jQuery("#ux_div_mail_console").css("display", "block");
271
- if (jQuery.trim(data) !== "")
272
- {
273
- jQuery("#ux_txtarea_result_log").html(data);
274
- } else
275
- {
276
- jQuery("#ux_txtarea_result_log").append(<?php echo json_encode($mb_test_email_not_send); ?>);
277
- }
278
- }
279
- load_sidebar_content_mail_bank();
280
- });
281
  }
282
 
283
  function mail_bank_send_test_mail()
284
  {
285
  jQuery("#ux_frm_test_email_configuration").validate
286
- ({
287
- rules:
288
- {
289
- ux_txt_email:
290
- {
291
- required: true,
292
- email: true
293
- },
294
- ux_txt_subject:
295
- {
296
- required: true
297
- },
298
- ux_content:
299
- {
300
- required: true
301
- }
302
- },
303
- errorPlacement: function ()
304
- {
305
- },
306
- highlight: function (element)
307
- {
308
- jQuery(element).closest(".form-group").removeClass("has-success").addClass("has-error");
309
- },
310
- success: function (label, element)
311
- {
312
- var icon = jQuery(element).parent(".input-icon").children("i");
313
- jQuery(element).closest(".form-group").removeClass("has-error").addClass("has-success");
314
- icon.removeClass("fa-warning").addClass("fa-check");
315
- },
316
- submitHandler: function ()
317
- {
318
- var to_email_address = jQuery("#ux_txt_email").val();
319
- if (window.CKEDITOR)
320
- {
321
- jQuery("#ux_email_configuration_text_area").val(CKEDITOR.instances["ux_content"].getData());
322
- } else if (jQuery("#wp-ux_content-wrap").hasClass("tmce-active"))
323
- {
324
- jQuery("#ux_email_configuration_text_area").val(tinyMCE.get("ux_content").getContent());
325
- } else
326
- {
327
- jQuery("#ux_email_configuration_text_area").val(jQuery("#ux_content").val());
328
- }
329
- mail_bank_mail_sender(to_email_address);
330
- jQuery("#console_log_div").css("display", "block");
331
- jQuery("#ux_div_test_mail").css("display", "none");
332
- }
333
- });
334
  }
335
 
336
  // Close popup
@@ -339,8 +339,8 @@ if (!is_user_logged_in()) {
339
  var confirm_close = confirm(<?php echo json_encode($mb_confirm_close); ?>);
340
  if (confirm_close === true)
341
  {
342
- var targeted_popup_class = jQuery(this).attr("data-popup-close-translator");
343
- jQuery('[data-popup="' + targeted_popup_class + '"]').fadeOut(350);
344
  }
345
  e.preventDefault();
346
  });
@@ -348,25 +348,25 @@ if (!is_user_logged_in()) {
348
  {
349
  jQuery("[data-popup-open]").on("click", function (e)
350
  {
351
- var targeted_popup_class = jQuery(this).attr("data-popup-open");
352
- jQuery('[data-popup="' + targeted_popup_class + '"]').fadeIn(350);
353
- e.preventDefault();
354
  });
355
  // Close popup
356
  jQuery("[data-popup-close]").on("click", function (e)
357
  {
358
- var targeted_popup_class = jQuery(this).attr("data-popup-close");
359
- jQuery('[data-popup="' + targeted_popup_class + '"]').fadeOut(350);
360
- e.preventDefault();
361
  });
362
  jQuery(document).keydown(function (e)
363
  {
364
- // ESCAPE key pressed
365
- if (e.keyCode === 27)
366
- {
367
- var targeted_popup_class = jQuery("[data-popup-close]").attr("data-popup-close");
368
- jQuery('[data-popup="' + targeted_popup_class + '"]').fadeOut(350);
369
- }
370
  });
371
  }
372
 
@@ -374,63 +374,63 @@ if (!is_user_logged_in()) {
374
  var url = "<?php echo tech_banker_url . "/feedbacks.php"; ?>";
375
  var domain_url = "<?php echo site_url(); ?>";
376
  jQuery("#ux_frm_language_translator").validate
377
- ({
378
- rules:
379
- {
380
- ux_txt_your_name:
381
- {
382
- required: true
383
- },
384
- ux_txt_email_address:
385
- {
386
- required: true,
387
- email: true
388
- },
389
- ux_txt_language:
390
- {
391
- required: true
392
- },
393
- ux_txtarea_query:
394
- {
395
- required: true
396
- }
397
- },
398
- errorPlacement: function ()
399
- {
400
- },
401
- highlight: function (element)
402
- {
403
- jQuery(element).closest(".form-group").removeClass("has-success").addClass("has-error");
404
- },
405
- success: function (label, element)
406
- {
407
- var icon = jQuery(element).parent(".input-icon").children("i");
408
- jQuery(element).closest(".form-group").removeClass("has-error").addClass("has-success");
409
- icon.removeClass("fa-warning").addClass("fa-check");
410
- },
411
- submitHandler: function ()
412
- {
413
- translation_request_array.push(jQuery("#ux_txt_your_name").val());
414
- translation_request_array.push(jQuery("#ux_txt_email_address").val());
415
- translation_request_array.push(domain_url);
416
- translation_request_array.push(jQuery("#ux_txt_language").val());
417
- translation_request_array.push(jQuery("#ux_txtarea_query").val());
418
- jQuery.post(url,
419
- {
420
- data: JSON.stringify(translation_request_array),
421
- param: "mail_bank_translation_request"
422
- },
423
- function ()
424
- {
425
- overlay_loading_mail_bank(<?php echo json_encode($mb_feature_request_message) ?>);
426
- setTimeout(function ()
427
- {
428
- remove_overlay_mail_bank();
429
- window.location.href = "admin.php?page=mb_email_configuration";
430
- }, 3000);
431
- });
432
- }
433
- });
434
  function show_pop_up_mail_bank()
435
  {
436
  open_popup_mail_bank();
@@ -451,827 +451,827 @@ if (!is_user_logged_in()) {
451
  $check_wp_mail_bank_wizard = get_option("wp-mail-bank-wizard-set-up");
452
  $page_url = $check_wp_mail_bank_wizard == "" ? "wp_mail_bank_wizard" : esc_attr($_GET["page"]);
453
  if (isset($_GET["page"])) {
454
- switch ($page_url) {
455
- case "wp_mail_bank_wizard":
456
- ?>
457
- function show_hide_details_wp_mail_bank()
458
- {
459
- if (jQuery("#ux_div_wizard_set_up").hasClass("wizard-set-up"))
460
- {
461
- jQuery("#ux_div_wizard_set_up").css("display", "none");
462
- jQuery("#ux_div_wizard_set_up").removeClass("wizard-set-up");
463
- } else
464
- {
465
- jQuery("#ux_div_wizard_set_up").css("display", "block");
466
- jQuery("#ux_div_wizard_set_up").addClass("wizard-set-up");
467
- }
468
- }
469
 
470
- function plugin_stats_wp_mail_bank(type)
471
- {
472
- overlay_loading_mail_bank();
473
- jQuery.post(ajaxurl,
474
- {
475
- type: type,
476
- param: "wizard_wp_mail_bank",
477
- action: "mail_bank_action",
478
- _wp_nonce: "<?php echo $wp_mail_bank_check_status; ?>"
479
- },
480
- function ()
481
- {
482
- remove_overlay_mail_bank();
483
- window.location.href = "admin.php?page=mb_email_configuration";
484
- });
485
- }
486
 
487
- <?php
488
- break;
489
- case "mb_email_configuration":
490
- ?>
491
- jQuery("#ux_mb_li_email_configuration").addClass("active");
492
- <?php
493
- if (email_configuration_mail_bank == 1) {
494
- ?>
495
- function select_credentials_mail_bank()
496
- {
497
- var selected_credential = jQuery("#ux_ddl_mb_authentication").val();
498
- var type = jQuery("#ux_ddl_type").val();
499
- if (selected_credential === "oauth2" && type === "smtp")
500
- {
501
- jQuery("#ux_div_username_password_authentication").css("display", "none");
502
- jQuery("#ux_div_oauth_authentication").css("display", "block");
503
- check_links_oauth_mail_bank();
504
- } else
505
- {
506
- if (selected_credential === "none")
507
- {
508
- jQuery("#ux_div_username_password_authentication").css("display", "none");
509
- jQuery("#ux_div_oauth_authentication").css("display", "none");
510
- } else
511
- {
512
- jQuery("#ux_div_username_password_authentication").css("display", "block");
513
- jQuery("#ux_div_oauth_authentication").css("display", "none");
514
- }
515
- }
516
- }
517
 
518
- function mail_bank_second_step_settings()
519
- {
520
- jQuery("#ux_div_first_step").css("display", "none");
521
- jQuery("#test_email").css("display", "none");
522
- jQuery("#ux_div_second_step").css("display", "block");
523
- jQuery("#ux_div_step_progres_bar_width").css("width", "66%");
524
- jQuery("#ux_div_frm_wizard li:eq(1)").addClass("active");
525
- jQuery("#ux_div_frm_wizard li:eq(2)").removeClass("active");
526
- }
527
 
528
- function mail_bank_third_step_settings()
529
- {
530
- jQuery("#ux_div_first_step").removeClass("first-step-helper");
531
- jQuery("#test_email").css("display", "block");
532
- jQuery("#ux_div_first_step").css("display", "none");
533
- jQuery("#ux_div_second_step").css("display", "none");
534
- jQuery("#ux_div_step_progres_bar_width").css("width", "100%");
535
- jQuery("#ux_div_frm_wizard li:eq(1)").addClass("active");
536
- jQuery("#ux_div_frm_wizard li:eq(2)").addClass("active");
537
- }
538
 
539
- function mail_bank_from_name_override()
540
- {
541
- var from_name = jQuery("#ux_ddl_from_name").val();
542
- if (jQuery.trim(from_name) === "dont_override")
543
- {
544
- jQuery("#ux_txt_mb_from_name").attr("disabled", true);
545
- } else
546
- {
547
- jQuery("#ux_txt_mb_from_name").attr("disabled", false);
548
- }
549
- }
550
 
551
- function mail_bank_from_email_override()
552
- {
553
- var from_email = jQuery("#ux_ddl_from_email").val();
554
- if (jQuery.trim(from_email) === "dont_override")
555
- {
556
- jQuery("#ux_txt_mb_from_email_configuration").attr("disabled", true);
557
- } else
558
- {
559
- jQuery("#ux_txt_mb_from_email_configuration").attr("disabled", false);
560
- }
561
- }
562
 
563
- function mail_bank_validate_settings()
564
- {
565
- jQuery("#ux_frm_email_configuration").validate
566
- ({
567
- rules:
568
- {
569
- ux_txt_mb_from_name:
570
- {
571
- required: true
572
- },
573
- ux_txt_mb_from_email_configuration:
574
- {
575
- required: true,
576
- email: true
577
- },
578
- ux_txt_email_address:
579
- {
580
- required: true,
581
- email: true
582
- },
583
- ux_txt_host:
584
- {
585
- required: true
586
- },
587
- ux_txt_port:
588
- {
589
- required: true
590
- },
591
- ux_txt_client_id:
592
- {
593
- required: true
594
- },
595
- ux_txt_client_secret:
596
- {
597
- required: true
598
- },
599
- ux_txt_username:
600
- {
601
- required: true
602
- },
603
- ux_txt_password:
604
- {
605
- required: true
606
- }
607
- },
608
- errorPlacement: function ()
609
- {
610
- },
611
- highlight: function (element)
612
- {
613
- jQuery(element).closest(".form-group").removeClass("has-success").addClass("has-error");
614
- },
615
- success: function (label, element)
616
- {
617
- var icon = jQuery(element).parent(".input-icon").children("i");
618
- jQuery(element).closest(".form-group").removeClass("has-error").addClass("has-success");
619
- icon.removeClass("fa-warning").addClass("fa-check");
620
- },
621
- submitHandler: function ()
622
- {
623
- if (jQuery("#ux_div_first_step").hasClass("first-step-helper"))
624
- {
625
- mail_bank_second_step_settings();
626
- } else if (jQuery("#test_email").hasClass("second-step-helper"))
627
- {
628
- jQuery.post(ajaxurl,
629
- {
630
- data: base64_encode_mail_bank(jQuery("#ux_frm_email_configuration").serialize()),
631
- action: "mail_bank_action",
632
- param: "mail_bank_email_configuration_settings_module",
633
- _wp_nonce: "<?php echo $mail_bank_email_configuration_settings; ?>"
634
- },
635
- function (data)
636
- {
637
- var automatic_mail = jQuery("#ux_chk_automatic_sent_mail").is(":checked");
638
- var mailer_type = jQuery("#ux_ddl_type").val();
639
- if (jQuery.trim(data) === "100" && mailer_type === "smtp")
640
- {
641
- var shortCutFunction = jQuery("#toastTypeGroup_error input:checked").val();
642
- toastr[shortCutFunction](<?php echo json_encode($oauth_not_supported); ?>);
643
- } else if (jQuery.trim(data) !== "" && mailer_type === "smtp")
644
- {
645
- window.location.href = data;
646
- } else
647
- {
648
- var send_mail = false;
649
- if (jQuery.trim(automatic_mail) === "true")
650
- {
651
- var send_mail = true;
652
- }
653
- window.location.href = "admin.php?page=mb_email_configuration&auto_mail=" + send_mail;
654
- }
655
- });
656
- }
657
- }
658
- });
659
- }
660
 
661
- function change_settings_mail_bank()
662
- {
663
- var type = jQuery("#ux_ddl_type").val();
664
- switch (type)
665
- {
666
- case "php_mail_function":
667
- jQuery("#ux_div_smtp_mail_function").css("display", "none");
668
- break;
669
- case "smtp":
670
- jQuery("#ux_div_smtp_mail_function").css("display", "block");
671
- break;
672
- }
673
- select_credentials_mail_bank();
674
- }
675
 
676
- function mail_bank_get_host_port()
677
- {
678
- change_settings_mail_bank();
679
- var smtp_user = jQuery("#ux_txt_email_address").val();
680
- jQuery.post(ajaxurl,
681
- {
682
- smtp_user: smtp_user,
683
- param: "mail_bank_set_hostname_port_module",
684
- action: "mail_bank_action",
685
- _wp_nonce: "<?php echo $mail_bank_set_hostname_port; ?>"
686
- },
687
- function (data)
688
- {
689
- if (jQuery.trim(data) !== "")
690
- {
691
- jQuery("#ux_txt_host").val(data);
692
- check_links_oauth_mail_bank();
693
- } else
694
- {
695
- jQuery("#ux_txt_host").val("");
696
- jQuery("#ux_link_content").text("");
697
- }
698
- change_settings_mail_bank();
699
- });
700
- }
701
 
702
- function change_link_content_mail_bank()
703
- {
704
- var host_type = jQuery("#ux_txt_host").val();
705
- var indexof = host_type.indexOf("yahoo");
706
- var hostname = host_type.substr(indexof, 5);
707
- if (host_type === "smtp.gmail.com")
708
- {
709
- check_links_oauth_mail_bank();
710
- jQuery("#ux_ddl_mb_authentication").val("oauth2");
711
- select_credentials_mail_bank();
712
- } else if (host_type === "smtp.live.com")
713
- {
714
- check_links_oauth_mail_bank();
715
- jQuery("#ux_ddl_mb_authentication").val("oauth2");
716
- select_credentials_mail_bank();
717
- } else if (hostname === "yahoo")
718
- {
719
- check_links_oauth_mail_bank();
720
- jQuery("#ux_ddl_mb_authentication").val("oauth2");
721
- select_credentials_mail_bank();
722
- } else
723
- {
724
- check_links_oauth_mail_bank();
725
- jQuery("#ux_ddl_mb_authentication").val("login");
726
- select_credentials_mail_bank();
727
- }
728
- }
729
 
730
- jQuery(document).ready(function ()
731
- {
732
- if (window.CKEDITOR)
733
- {
734
- CKEDITOR.replace("ux_content");
735
- }
736
- jQuery("#ux_ddl_type").val("<?php echo isset($email_configuration_array["mailer_type"]) ? esc_attr($email_configuration_array["mailer_type"]) : ""; ?>");
737
- jQuery("#ux_ddl_mb_authentication").val("<?php echo isset($email_configuration_array["auth_type"]) ? esc_attr($email_configuration_array["auth_type"]) : "login"; ?>");
738
- jQuery("#ux_ddl_from_name").val("<?php echo isset($email_configuration_array["sender_name_configuration"]) ? esc_html($email_configuration_array["sender_name_configuration"]) : ""; ?>");
739
- jQuery("#ux_ddl_from_email").val("<?php echo isset($email_configuration_array["from_email_configuration"]) ? esc_attr($email_configuration_array["from_email_configuration"]) : ""; ?>");
740
- jQuery("#ux_ddl_encryption").val("<?php echo isset($email_configuration_array["enc_type"]) ? esc_attr($email_configuration_array["enc_type"]) : "" ?>");
741
- <?php
742
- if (isset($test_secret_key_error)) {
743
- ?>
744
- var shortCutFunction = jQuery("#toastTypeGroup_error input:checked").val();
745
- toastr[shortCutFunction](<?php echo json_encode($test_secret_key_error); ?>);
746
- mail_bank_second_step_settings();
747
- <?php
748
- }
749
- if (isset($automatically_send_mail)) {
750
- ?>
751
- window.location.href = "admin.php?page=mb_email_configuration&auto_mail=true";
752
- <?php
753
- } elseif (isset($automatically_not_send_mail)) {
754
- ?>
755
- window.location.href = "admin.php?page=mb_email_configuration&auto_mail=false";
756
- <?php
757
- }
758
- ?>
759
- load_sidebar_content_mail_bank();
760
- //change_link_content_mail_bank();
761
- select_credentials_mail_bank();
762
- change_settings_mail_bank();
763
- mail_bank_from_name_override();
764
- mail_bank_from_email_override();
765
- <?php
766
- if (isset($_REQUEST["auto_mail"]) && esc_attr($_REQUEST["auto_mail"]) == "true") {
767
- ?>
768
- mail_bank_mail_sender("<?php echo get_option('admin_email'); ?>");
769
- jQuery("#console_log_div").css("display", "block");
770
- jQuery("#ux_div_mail_console").css("display", "none");
771
- jQuery("#ux_div_test_mail").css("display", "none");
772
- mail_bank_third_step_settings();
773
- <?php
774
- } elseif (isset($_REQUEST["auto_mail"]) && esc_attr($_REQUEST["auto_mail"]) == "false") {
775
- ?>
776
- jQuery("#ux_div_mail_console").css("display", "none");
777
- jQuery("#ux_div_test_mail").css("display", "block");
778
- mail_bank_third_step_settings();
779
- <?php
780
- }
781
- if ($email_configuration_array["hostname"] != "") {
782
- ?>
783
- jQuery("#ux_txt_host").val("<?php echo isset($email_configuration_array["hostname"]) ? esc_attr($email_configuration_array["hostname"]) : ""; ?>");
784
- <?php
785
- } else {
786
- ?>
787
- mail_bank_get_host_port();
788
- <?php
789
- }
790
- ?>
791
- });
792
- function mail_bank_move_to_second_step()
793
- {
794
- jQuery("#ux_div_first_step").addClass("first-step-helper");
795
- mail_bank_validate_settings();
796
- }
797
 
798
- function mail_bank_move_to_first_step()
799
- {
800
- jQuery("#ux_div_first_step").removeClass("first-step-helper");
801
- jQuery("#test_email").removeClass("second-step-helper");
802
- jQuery("#ux_div_first_step").css("display", "block");
803
- jQuery("#test_email").css("display", "none");
804
- jQuery("#ux_div_second_step").css("display", "none");
805
- jQuery("#ux_div_step_progres_bar_width").css("width", "33%");
806
- jQuery("#ux_div_frm_wizard li:eq(1)").removeClass("active");
807
- }
808
 
809
- function mail_bank_save_changes()
810
- {
811
- overlay_loading_mail_bank(<?php echo json_encode($mb_update_email_configuration); ?>);
812
- setTimeout(function ()
813
- {
814
- remove_overlay_mail_bank();
815
- window.location.href = "admin.php?page=mb_email_configuration";
816
- }, 3000);
817
- }
818
 
819
- function mail_bank_move_to_third_step()
820
- {
821
- mail_bank_validate_settings();
822
- jQuery("#ux_div_first_step").removeClass("first-step-helper");
823
- jQuery("#test_email").addClass("second-step-helper");
824
- }
825
 
826
- function mail_bank_select_port()
827
- {
828
- var encryption = jQuery("#ux_ddl_encryption").val();
829
- switch (encryption)
830
- {
831
- case "none":
832
- case "tls":
833
- jQuery("#ux_txt_port").val(587);
834
- break;
835
- case "ssl":
836
- jQuery("#ux_txt_port").val(465);
837
- break;
838
- }
839
- }
840
 
841
- var sidebar_load_interval = setInterval(load_sidebar_content_mail_bank, 1000);
842
- setTimeout(function ()
843
- {
844
- clearInterval(sidebar_load_interval);
845
- }, 5000);
846
- load_sidebar_content_mail_bank();
847
- <?php
848
- }
849
- break;
850
- case "mb_test_email":
851
- ?>
852
- jQuery("#ux_mb_li_test_email").addClass("active");
853
- jQuery(document).ready(function ()
854
- {
855
- if (window.CKEDITOR)
856
- {
857
- CKEDITOR.replace("ux_content");
858
- }
859
- });
860
- <?php
861
- break;
862
- case "mb_connectivity_test":
863
- ?>
864
- jQuery("#ux_mb_li_connectivity_test").addClass("active");
865
- <?php
866
- if (conectivity_test_email_mail_bank == 1) {
867
- ?>
868
- jQuery("#ux_frm_settings").validate
869
- ({
870
- rules:
871
- {
872
- ux_txt_conn_search:
873
- {
874
- required: true
875
- }
876
- },
877
- errorPlacement: function ()
878
- {
879
- },
880
- highlight: function (element)
881
- {
882
- jQuery(element).closest(".form-group").removeClass("has-success").addClass("has-error");
883
- },
884
- success: function (label, element)
885
- {
886
- var icon = jQuery(element).parent(".input-icon").children("i");
887
- jQuery(element).closest(".form-group").removeClass("has-error").addClass("has-success");
888
- icon.removeClass("fa-warning").addClass("fa-check");
889
- },
890
- submitHandler: function ()
891
- {
892
- jQuery("#ux_div_connectivity_test").css("display", "block");
893
- overlay_loading_mail_bank();
894
- jQuery.post(ajaxurl,
895
- {
896
- smtp_host: jQuery("#ux_txt_conn_search").val(),
897
- param: "mail_bank_connectivity_test",
898
- action: "mail_bank_action",
899
- _wp_nonce: "<?php echo $connectivity_test_nonce; ?>"
900
- },
901
- function (data)
902
- {
903
- jQuery("#ux_tbody_smtp").html(data);
904
- setTimeout(function ()
905
- {
906
- remove_overlay_mail_bank();
907
- }, 1000);
908
- });
909
- }
910
- });
911
- var sidebar_load_interval = setInterval(load_sidebar_content_mail_bank, 1000);
912
- setTimeout(function ()
913
- {
914
- clearInterval(sidebar_load_interval);
915
- }, 5000);
916
- <?php
917
- }
918
- break;
919
- case "mb_email_logs":
920
- ?>
921
- jQuery("#ux_mb_li_email_logs").addClass("active");
922
- <?php
923
- if (email_logs_mail_bank == 1) {
924
- ?>
925
- jQuery(document).ready(function ()
926
- {
927
- jQuery("#ux_txt_mb_start_date").datepicker
928
- ({
929
- dateFormat: 'mm/dd/yy',
930
- numberOfMonths: 1,
931
- changeMonth: true,
932
- changeYear: true,
933
- yearRange: "1970:2039",
934
- onSelect: function (selected)
935
- {
936
- jQuery("#ux_txt_mb_end_date").datepicker("option", "minDate", selected)
937
- }
938
- });
939
- jQuery("#ux_txt_mb_end_date").datepicker
940
- ({
941
- dateFormat: 'mm/dd/yy',
942
- numberOfMonths: 1,
943
- changeMonth: true,
944
- changeYear: true,
945
- yearRange: "1970:2039",
946
- onSelect: function (selected)
947
- {
948
- jQuery("#ux_txt_mb_start_date").datepicker("option", "maxDate", selected)
949
- }
950
- });
951
- });
952
- function prevent_datepicker_mail_bank(id)
953
- {
954
- jQuery("#" + id).on("keypress", function (e)
955
- {
956
- e.preventDefault();
957
- });
958
- }
959
 
960
- var oTable = jQuery("#ux_tbl_email_logs").dataTable
961
- ({
962
- "pagingType": "full_numbers",
963
- "language":
964
- {
965
- "emptyTable": "No data available in table",
966
- "info": "Showing _START_ to _END_ of _TOTAL_ entries",
967
- "infoEmpty": "No entries found",
968
- "infoFiltered": "(filtered1 from _MAX_ total entries)",
969
- "lengthMenu": "Show _MENU_ entries",
970
- "search": "Search:",
971
- "zeroRecords": "No matching records found"
972
- },
973
- "bSort": true,
974
- "pageLength": 10,
975
- "aoColumnDefs": [{"bSortable": false, "aTargets": [0]}]
976
- });
977
- var sidebar_load_interval = setInterval(load_sidebar_content_mail_bank, 1000);
978
- setTimeout(function ()
979
- {
980
- clearInterval(sidebar_load_interval);
981
- }, 5000);
982
- jQuery("#ux_chk_all_email_logs").click(function ()
983
- {
984
- jQuery("input[type=checkbox]", oTable.fnGetFilteredNodes()).attr("checked", this.checked);
985
- });
986
- function check_email_logs()
987
- {
988
- if (jQuery("input:checked", oTable.fnGetFilteredNodes()).length === jQuery("input[type=checkbox]", oTable.fnGetFilteredNodes()).length)
989
- {
990
- jQuery("#ux_chk_all_email_logs").attr("checked", "checked");
991
- } else
992
- {
993
- jQuery("#ux_chk_all_email_logs").removeAttr("checked");
994
- }
995
- }
996
 
997
- var ux_frm_email_logs = jQuery("#ux_frm_email_logs").validate
998
- ({
999
- submitHandler: function ()
1000
- {
1001
- premium_edition_notification_mail_bank();
1002
- }
1003
- });
1004
- load_sidebar_content_mail_bank();
1005
- <?php
1006
- }
1007
- break;
1008
- case "mb_settings":
1009
- ?>
1010
- jQuery("#ux_mb_li_settings").addClass("active");
1011
- <?php
1012
- if (settings_mail_bank == 1) {
1013
- ?>
1014
- jQuery(document).ready(function ()
1015
- {
1016
- jQuery("#ux_ddl_debug_mode").val("<?php echo isset($settings_data_array["debug_mode"]) ? esc_attr($settings_data_array["debug_mode"]) : "enable"; ?>");
1017
- jQuery("#ux_ddl_remove_tables").val("<?php echo isset($settings_data_array["remove_tables_at_uninstall"]) ? esc_attr($settings_data_array["remove_tables_at_uninstall"]) : "disable"; ?>");
1018
- jQuery("#ux_ddl_monitor_email_logs").val("<?php echo isset($settings_data_array["monitor_email_logs"]) ? esc_attr($settings_data_array["monitor_email_logs"]) : "enable"; ?>");
1019
- });
1020
- jQuery("#ux_frm_settings").validate
1021
- ({
1022
- submitHandler: function ()
1023
- {
1024
- overlay_loading_mail_bank(<?php echo json_encode($mb_update_settings); ?>);
1025
- jQuery.post(ajaxurl,
1026
- {
1027
- data: base64_encode_mail_bank(jQuery("#ux_frm_settings").serialize()),
1028
- action: "mail_bank_action",
1029
- param: "mail_bank_settings_module",
1030
- _wp_nonce: "<?php echo $mail_bank_settings; ?>"
1031
- },
1032
- function ()
1033
- {
1034
- setTimeout(function ()
1035
- {
1036
- remove_overlay_mail_bank();
1037
- window.location.href = "admin.php?page=mb_settings";
1038
- }, 3000);
1039
- });
1040
- }
1041
- });
1042
- load_sidebar_content_mail_bank();
1043
- <?php
1044
- }
1045
- break;
1046
- case "mb_roles_and_capabilities":
1047
- ?>
1048
- jQuery("#ux_mb_li_roles_and_capabilities").addClass("active");
1049
- var sidebar_load_interval = setInterval(load_sidebar_content_mail_bank, 1000);
1050
- setTimeout(function ()
1051
- {
1052
- clearInterval(sidebar_load_interval);
1053
- }, 5000);
1054
- <?php
1055
- if (roles_and_capabilities_mail_bank == 1) {
1056
- ?>
1057
- function full_control_function_mail_bank(id, div_id)
1058
- {
1059
- var checkbox_id = jQuery(id).prop("checked");
1060
- jQuery("#" + div_id + " input[type=checkbox]").each(function ()
1061
- {
1062
- if (checkbox_id)
1063
- {
1064
- jQuery(this).attr("checked", "checked");
1065
- if (jQuery(id).attr("id") !== jQuery(this).attr("id"))
1066
- {
1067
- jQuery(this).attr("disabled", "disabled");
1068
- }
1069
- } else
1070
- {
1071
- if (jQuery(id).attr("id") !== jQuery(this).attr("id"))
1072
- {
1073
- jQuery(this).removeAttr("disabled");
1074
- jQuery("#ux_chk_other_capabilities_manage_options").attr("disabled", "disabled");
1075
- jQuery("#ux_chk_other_capabilities_read").attr("checked", "checked").attr("disabled", "disabled");
1076
- }
1077
- }
1078
- });
1079
- }
1080
 
1081
- function show_roles_capabilities_mail_bank(id, div_id)
1082
- {
1083
- if (jQuery(id).prop("checked"))
1084
- {
1085
- jQuery("#" + div_id).css("display", "block");
1086
- } else
1087
- {
1088
- jQuery("#" + div_id).css("display", "none");
1089
- }
1090
- }
1091
 
1092
- jQuery(document).ready(function ()
1093
- {
1094
- jQuery("#ux_ddl_mail_bank_menu").val("<?php echo isset($details_roles_capabilities["show_mail_bank_top_bar_menu"]) ? esc_attr($details_roles_capabilities["show_mail_bank_top_bar_menu"]) : "enable"; ?>");
1095
- show_roles_capabilities_mail_bank("#ux_chk_author", "ux_div_author_roles");
1096
- full_control_function_mail_bank("#ux_chk_full_control_author", "ux_div_author_roles");
1097
- show_roles_capabilities_mail_bank("#ux_chk_editor", "ux_div_editor_roles");
1098
- full_control_function_mail_bank("#ux_chk_full_control_editor", "ux_div_editor_roles");
1099
- show_roles_capabilities_mail_bank("#ux_chk_contributor", "ux_div_contributor_roles");
1100
- full_control_function_mail_bank("#ux_chk_full_control_contributor", "ux_div_contributor_roles");
1101
- show_roles_capabilities_mail_bank("#ux_chk_subscriber", "ux_div_subscriber_roles");
1102
- full_control_function_mail_bank("#ux_chk_full_control_subscriber", "ux_div_subscriber_roles");
1103
- show_roles_capabilities_mail_bank("#ux_chk_others_privileges", "ux_div_other_privileges_roles");
1104
- full_control_function_mail_bank("#ux_chk_full_control_other_privileges_roles", "ux_div_other_privileges_roles");
1105
- full_control_function_mail_bank("#ux_chk_full_control_other_roles", "ux_div_other_roles");
1106
- });
1107
- jQuery("#ux_frm_roles_and_capabilities").validate
1108
- ({
1109
- submitHandler: function ()
1110
- {
1111
- premium_edition_notification_mail_bank();
1112
- }
1113
- });
1114
- load_sidebar_content_mail_bank();
1115
- <?php
1116
- }
1117
- break;
1118
- case "mb_feedbacks":
1119
- ?>
1120
- jQuery("#ux_mb_li_feedbacks").addClass("active");
1121
- load_sidebar_content_mail_bank();
1122
- var feedback_array = [];
1123
- var url = "<?php echo tech_banker_url . "/feedbacks.php"; ?>";
1124
- var domain_url = "<?php echo site_url(); ?>";
1125
- jQuery("#ux_frm_feedbacks").validate
1126
- ({
1127
- rules:
1128
- {
1129
- ux_txt_your_name:
1130
- {
1131
- required: true
1132
- },
1133
- ux_txt_email_address:
1134
- {
1135
- required: true,
1136
- email: true
1137
- },
1138
- ux_txtarea_feedbacks:
1139
- {
1140
- required: true
1141
- }
1142
- },
1143
- errorPlacement: function ()
1144
- {
1145
- },
1146
- highlight: function (element)
1147
- {
1148
- jQuery(element).closest(".form-group").removeClass("has-success").addClass("has-error");
1149
- },
1150
- success: function (label, element)
1151
- {
1152
- var icon = jQuery(element).parent(".input-icon").children("i");
1153
- jQuery(element).closest(".form-group").removeClass("has-error").addClass("has-success");
1154
- icon.removeClass("fa-warning").addClass("fa-check");
1155
- },
1156
- submitHandler: function ()
1157
- {
1158
- feedback_array.push(jQuery("#ux_txt_your_name").val(), jQuery("#ux_txt_email_address").val(), domain_url, jQuery("#ux_txtarea_feedbacks").val());
1159
- overlay_loading_mail_bank(<?php echo json_encode($mb_update_feedbacks); ?>);
1160
- jQuery.post(url,
1161
- {
1162
- data: JSON.stringify(feedback_array),
1163
- param: "mail_bank_send_feedback"
1164
- },
1165
- function ()
1166
- {
1167
- setTimeout(function ()
1168
- {
1169
- remove_overlay_mail_bank();
1170
- window.location.href = "admin.php?page=mb_feedbacks";
1171
- }, 3000);
1172
- });
1173
- }
1174
- });
1175
- load_sidebar_content_mail_bank();
1176
- <?php
1177
- break;
1178
- case "mb_system_information":
1179
- ?>
1180
- jQuery("#ux_mb_li_system_information").addClass("active");
1181
- var sidebar_load_interval = setInterval(load_sidebar_content_mail_bank, 1000);
1182
- setTimeout(function ()
1183
- {
1184
- clearInterval(sidebar_load_interval);
1185
- }, 5000);
1186
- <?php
1187
- if (system_information_mail_bank == 1) {
1188
- ?>
1189
- jQuery.getSystemReport = function (strDefault, stringCount, string, location)
1190
- {
1191
- var o = strDefault.toString();
1192
- if (!string)
1193
- {
1194
- string = "0";
1195
- }
1196
- while (o.length < stringCount)
1197
- {
1198
- if (location === "undefined")
1199
- {
1200
- o = string + o;
1201
- } else
1202
- {
1203
- o = o + string;
1204
- }
1205
- }
1206
- return o;
1207
- };
1208
- jQuery(".system-report").click(function ()
1209
- {
1210
- var report = "";
1211
- jQuery(".custom-form-body").each(function ()
1212
- {
1213
- jQuery("h3.form-section", jQuery(this)).each(function ()
1214
- {
1215
- report = report + "\n### " + jQuery.trim(jQuery(this).text()) + " ###\n\n";
1216
- });
1217
- jQuery("tbody > tr", jQuery(this)).each(function ()
1218
- {
1219
- var the_name = jQuery.getSystemReport(jQuery.trim(jQuery(this).find("strong").text()), 25, " ");
1220
- var the_value = jQuery.trim(jQuery(this).find("span").text());
1221
- var value_array = the_value.split(", ");
1222
- if (value_array.length > 1)
1223
- {
1224
- var temp_line = "";
1225
- jQuery.each(value_array, function (key, line)
1226
- {
1227
- var tab = (key == 0) ? 0 : 25;
1228
- temp_line = temp_line + jQuery.getSystemReport("", tab, " ", "f") + line + "\n";
1229
- });
1230
- the_value = temp_line;
1231
- }
1232
- report = report + "" + the_name + the_value + "\n";
1233
- });
1234
- });
1235
- try
1236
- {
1237
- jQuery("#ux_system_information").slideDown();
1238
- jQuery("#ux_system_information textarea").val(report).focus().select();
1239
- return false;
1240
- } catch (e)
1241
- {
1242
- }
1243
- return false;
1244
- });
1245
- jQuery("#ux_btn_system_information").click(function ()
1246
- {
1247
- if (jQuery("#ux_btn_system_information").text() === "Close System Information!")
1248
- {
1249
- jQuery("#ux_system_information").slideUp();
1250
- jQuery("#ux_btn_system_information").html("Get System Information!");
1251
- } else
1252
- {
1253
- jQuery("#ux_btn_system_information").html("Close System Information!");
1254
- jQuery("#ux_btn_system_information").removeClass("system-information");
1255
- jQuery("#ux_btn_system_information").addClass("close-information");
1256
- }
1257
- });
1258
- load_sidebar_content_mail_bank();
1259
- <?php
1260
- }
1261
- break;
1262
 
1263
- case "mb_upgrade":
1264
- ?>
1265
- jQuery("#ux_li_upgrade").addClass("active");
1266
- var sidebar_load_interval = setInterval(load_sidebar_content_mail_bank, 1000);
1267
- setTimeout(function ()
1268
- {
1269
- clearInterval(sidebar_load_interval);
1270
- }, 5000);
1271
- load_sidebar_content_mail_bank();
1272
- <?php
1273
- break;
1274
- }
1275
  }
1276
  ?>
1277
  </script>
15
  $access_granted = false;
16
  foreach ($user_role_permission as $permission) {
17
  if (current_user_can($permission)) {
18
+ $access_granted = true;
19
+ break;
20
  }
21
  }
22
  if (!$access_granted) {
29
  <div class="popup" data-popup="ux_open_popup_translator">
30
  <div class="popup-inner">
31
  <div class="portlet box vivid-green" style="margin-bottom:0px;">
32
+ <div class="portlet-title">
33
+ <div class="caption" id="ux_div_action">
34
+ <?php echo $mb_translation_request; ?>
35
+ </div>
36
+ </div>
37
+ <div class="portlet-body form">
38
+ <div id="ux_div_popup_header">
39
+ <form id="ux_frm_language_translator">
40
+ <div class="form-body">
41
+ <div class="row">
42
+ <div class="col-md-6 popup-control">
43
+ <div class="form-group">
44
+ <label class="control-label">
45
+ <?php echo $mb_feature_requests_your_name; ?> :
46
+ <i class="icon-custom-question tooltips" data-original-title="<?php echo $mb_popup_your_name_tooltip; ?>" data-placement="right"></i>
47
+ <span class="required" aria-required="true">*</span>
48
+ </label>
49
+ <input type="text" class="form-control" name="ux_txt_your_name" id="ux_txt_your_name" value="" placeholder="<?php echo $mb_feature_requests_your_name_placeholder; ?>">
50
+ </div>
51
+ </div>
52
+ <div class="col-md-6 popup-control">
53
+ <div class="form-group">
54
+ <label class="control-label">
55
+ <?php echo $mb_feature_requests_your_email; ?> :
56
+ <i class="icon-custom-question tooltips" data-original-title="<?php echo $mb_popup_your_email_tooltip; ?>" data-placement="right"></i>
57
+ <span class="required" aria-required="true">*</span>
58
+ </label>
59
+ <input type="text" class="form-control" name="ux_txt_email_address" id="ux_txt_email_address" value="" placeholder="<?php echo $mb_feature_requests_your_email_placeholder; ?>">
60
+ </div>
61
+ </div>
62
+ </div>
63
+ <div class="form-group">
64
+ <label class="control-label">
65
+ <?php echo $mb_language_interested_to_translate; ?> :
66
+ <i class="icon-custom-question tooltips" data-original-title="<?php echo $mb_language_interested_to_translate_tooltip; ?>" data-placement="right"></i>
67
+ <span class="required" aria-required="true">*</span>
68
+ </label>
69
+ <input type="text" class="form-control" name="ux_txt_language" id="ux_txt_language" value="" placeholder="<?php echo $mb_language_interested_to_translate_placeholder; ?>">
70
+ </div>
71
+ <div class="form-group">
72
+ <label class="control-label">
73
+ <?php echo $mb_popup_query; ?> :
74
+ <i class="icon-custom-question tooltips" data-original-title="<?php echo $mb_popup_query_tooltip; ?>" data-placement="right"></i>
75
+ <span class="required" aria-required="true">*</span>
76
+ </label>
77
+ <textarea class="form-control" name="ux_txtarea_query" id="ux_txtarea_query" rows="7" placeholder="<?php echo $mb_popup_query_placeholder; ?>"><?php echo "Hi,\r\r\nI am interested in translating your plugin Mail Bank in my native language.\r\r\nPlease get back to me!\r\r\nThanks"; ?></textarea>
78
+ </div>
79
+ </div>
80
+ <div class="modal-footer">
81
+ <div class="form-actions">
82
+ <div class="pull-right">
83
+ <input type="button" data-popup-close-translator="ux_open_popup_translator" class="btn vivid-green" name="ux_btn_close" id="ux_btn_close" value="<?php echo $mb_manage_backups_close; ?>">
84
+ <input type="submit" class="btn vivid-green" name="ux_btn_send_request" id="ux_btn_send_request" value="<?php echo $mb_feature_requests_send_request; ?>">
85
+ </div>
86
+ </div>
87
+ </div>
88
+ </form>
89
+ </div>
90
+ </div>
91
  </div>
92
  </div>
93
  </div>
97
  {
98
  if (jQuery(this).parent("ul.page-sidebar-menu-tech-banker").size() === 1)
99
  {
100
+ jQuery(this).find("> a").append("<span class=\"selected\"></span>");
101
  }
102
  });
103
 
107
  var content_height = jQuery(".page-content").height() + 30;
108
  if (parseInt(menus_height) > parseInt(content_height))
109
  {
110
+ jQuery(".page-content").attr("style", "min-height:" + menus_height + "px")
111
  } else
112
  {
113
+ jQuery(".page-sidebar-menu-tech-banker").attr("style", "min-height:" + content_height + "px")
114
  }
115
  }
116
 
126
  var sidebar_close = parent.children("li.open").removeClass("open");
127
  if (sidebar_close)
128
  {
129
+ setInterval(load_sidebar_content_mail_bank, 100);
130
  }
131
  if (sub.is(":visible"))
132
  {
133
+ jQuery(this).parent().removeClass("open");
134
+ sub.slideUp(slideSpeed);
135
  } else if (hasSubMenu)
136
  {
137
+ jQuery(this).parent().addClass("open");
138
+ sub.slideDown(slideSpeed);
139
  }
140
  });
141
  function paste_only_digits_mail_bank(control_id)
142
  {
143
  jQuery("#" + control_id).on("paste keypress", function (e)
144
  {
145
+ var $this = jQuery("#" + control_id);
146
+ setTimeout(function ()
147
+ {
148
+ $this.val($this.val().replace(/[^0-9]/g, ""));
149
+ }, 5);
150
  });
151
  }
152
 
171
  jQuery("body").append(overlay);
172
  if (control_id !== undefined)
173
  {
174
+ var message = control_id;
175
+ var success = <?php echo json_encode($mb_success); ?>;
176
+ var issuccessmessage = jQuery("#toast-container").exists();
177
+ if (issuccessmessage !== true)
178
+ {
179
+ var shortCutFunction = jQuery("#manage_messages input:checked").val();
180
+ toastr[shortCutFunction](message, success);
181
+ }
182
  }
183
  }
184
 
192
  {
193
  var b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
194
  var o1, o2, o3, h1, h2, h3, h4, bits, i = 0,
195
+ ac = 0,
196
+ enc = '',
197
+ tmp_arr = [];
198
  if (!data)
199
  {
200
+ return data;
201
  }
202
  do
203
  {
204
+ o1 = data.charCodeAt(i++);
205
+ o2 = data.charCodeAt(i++);
206
+ o3 = data.charCodeAt(i++);
207
+ bits = o1 << 16 | o2 << 8 | o3;
208
+ h1 = bits >> 18 & 0x3f;
209
+ h2 = bits >> 12 & 0x3f;
210
+ h3 = bits >> 6 & 0x3f;
211
+ h4 = bits & 0x3f;
212
+ tmp_arr[ac++] = b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4);
213
  } while (i < data.length);
214
  enc = tmp_arr.join('');
215
  var r = data.length % 3;
230
  var hostname = smtp_host.substr(indexof, 5);
231
  if (smtp_host === "smtp.gmail.com")
232
  {
233
+ jQuery("#ux_link_content").text("(" +<?php echo json_encode($mb_email_configuration_get_google_credentials); ?> + ")");
234
+ jQuery("#ux_link_reference").attr("href", "https://console.developers.google.com");
235
  } else if (smtp_host === "smtp.live.com")
236
  {
237
+ jQuery("#ux_link_content").text("(" +<?php echo json_encode($mb_email_configuration_get_microsoft_credentials); ?> + ")");
238
+ jQuery("#ux_link_reference").attr("href", "https://account.live.com/developers/applications/create");
239
  } else if (hostname === "yahoo")
240
  {
241
+ jQuery("#ux_link_content").text("(" +<?php echo json_encode($mb_email_configuration_get_yahoo_credentials); ?> + ")");
242
+ jQuery("#ux_link_reference").attr("href", "https://developer.yahoo.com/apps/");
243
  } else
244
  {
245
+ jQuery("#ux_link_content").text("");
246
  }
247
  }
248
 
249
  function mail_bank_mail_sender(to_email_address)
250
  {
251
  jQuery.post(ajaxurl,
252
+ {
253
+ data: base64_encode_mail_bank(jQuery("#ux_frm_test_email_configuration").serialize()),
254
+ param: "mail_bank_test_email_configuration_module",
255
+ action: "mail_bank_action",
256
+ _wp_nonce: "<?php echo isset($mail_bank_test_email_configuration) ? $mail_bank_test_email_configuration : ""; ?>"
257
+ },
258
+ function (data)
259
+ {
260
+ jQuery("#ux_txtarea_result_log").html("<?php echo $mb_email_configuration_send_test_email_textarea; ?>\n");
261
+ jQuery("#ux_txtarea_result_log").append(<?php echo json_encode($mb_test_email_sending_test_email); ?> + "&nbsp;" + to_email_address + "\n");
262
+ if (jQuery.trim(data) === "true" || jQuery.trim(data) === "1")
263
+ {
264
+ jQuery("#ux_div_mail_console").css("display", "block");
265
+ jQuery("#console_log_div").css("display", "none");
266
+ jQuery("#ux_txtarea_result_log").append(<?php echo json_encode($mb_test_email_sent); ?>);
267
+ } else
268
+ {
269
+ jQuery("#console_log_div").css("display", "none");
270
+ jQuery("#ux_div_mail_console").css("display", "block");
271
+ if (jQuery.trim(data) !== "")
272
+ {
273
+ jQuery("#ux_txtarea_result_log").html(data);
274
+ } else
275
+ {
276
+ jQuery("#ux_txtarea_result_log").append(<?php echo json_encode($mb_test_email_not_send); ?>);
277
+ }
278
+ }
279
+ load_sidebar_content_mail_bank();
280
+ });
281
  }
282
 
283
  function mail_bank_send_test_mail()
284
  {
285
  jQuery("#ux_frm_test_email_configuration").validate
286
+ ({
287
+ rules:
288
+ {
289
+ ux_txt_email:
290
+ {
291
+ required: true,
292
+ email: true
293
+ },
294
+ ux_txt_subject:
295
+ {
296
+ required: true
297
+ },
298
+ ux_content:
299
+ {
300
+ required: true
301
+ }
302
+ },
303
+ errorPlacement: function ()
304
+ {
305
+ },
306
+ highlight: function (element)
307
+ {
308
+ jQuery(element).closest(".form-group").removeClass("has-success").addClass("has-error");
309
+ },
310
+ success: function (label, element)
311
+ {
312
+ var icon = jQuery(element).parent(".input-icon").children("i");
313
+ jQuery(element).closest(".form-group").removeClass("has-error").addClass("has-success");
314
+ icon.removeClass("fa-warning").addClass("fa-check");
315
+ },
316
+ submitHandler: function ()
317
+ {
318
+ var to_email_address = jQuery("#ux_txt_email").val();
319
+ if (window.CKEDITOR)
320
+ {
321
+ jQuery("#ux_email_configuration_text_area").val(CKEDITOR.instances["ux_content"].getData());
322
+ } else if (jQuery("#wp-ux_content-wrap").hasClass("tmce-active"))
323
+ {
324
+ jQuery("#ux_email_configuration_text_area").val(tinyMCE.get("ux_content").getContent());
325
+ } else
326
+ {
327
+ jQuery("#ux_email_configuration_text_area").val(jQuery("#ux_content").val());
328
+ }
329
+ mail_bank_mail_sender(to_email_address);
330
+ jQuery("#console_log_div").css("display", "block");
331
+ jQuery("#ux_div_test_mail").css("display", "none");
332
+ }
333
+ });
334
  }
335
 
336
  // Close popup
339
  var confirm_close = confirm(<?php echo json_encode($mb_confirm_close); ?>);
340
  if (confirm_close === true)
341
  {
342
+ var targeted_popup_class = jQuery(this).attr("data-popup-close-translator");
343
+ jQuery('[data-popup="' + targeted_popup_class + '"]').fadeOut(350);
344
  }
345
  e.preventDefault();
346
  });
348
  {
349
  jQuery("[data-popup-open]").on("click", function (e)
350
  {
351
+ var targeted_popup_class = jQuery(this).attr("data-popup-open");
352
+ jQuery('[data-popup="' + targeted_popup_class + '"]').fadeIn(350);
353
+ e.preventDefault();
354
  });
355
  // Close popup
356
  jQuery("[data-popup-close]").on("click", function (e)
357
  {
358
+ var targeted_popup_class = jQuery(this).attr("data-popup-close");
359
+ jQuery('[data-popup="' + targeted_popup_class + '"]').fadeOut(350);
360
+ e.preventDefault();
361
  });
362
  jQuery(document).keydown(function (e)
363
  {
364
+ // ESCAPE key pressed
365
+ if (e.keyCode === 27)
366
+ {
367
+ var targeted_popup_class = jQuery("[data-popup-close]").attr("data-popup-close");
368
+ jQuery('[data-popup="' + targeted_popup_class + '"]').fadeOut(350);
369
+ }
370
  });
371
  }
372
 
374
  var url = "<?php echo tech_banker_url . "/feedbacks.php"; ?>";
375
  var domain_url = "<?php echo site_url(); ?>";
376
  jQuery("#ux_frm_language_translator").validate
377
+ ({
378
+ rules:
379
+ {
380
+ ux_txt_your_name:
381
+ {
382
+ required: true
383
+ },
384
+ ux_txt_email_address:
385
+ {
386
+ required: true,
387
+ email: true
388
+ },
389
+ ux_txt_language:
390
+ {
391
+ required: true
392
+ },
393
+ ux_txtarea_query:
394
+ {
395
+ required: true
396
+ }
397
+ },
398
+ errorPlacement: function ()
399
+ {
400
+ },
401
+ highlight: function (element)
402
+ {
403
+ jQuery(element).closest(".form-group").removeClass("has-success").addClass("has-error");
404
+ },
405
+ success: function (label, element)
406
+ {
407
+ var icon = jQuery(element).parent(".input-icon").children("i");
408
+ jQuery(element).closest(".form-group").removeClass("has-error").addClass("has-success");
409
+ icon.removeClass("fa-warning").addClass("fa-check");
410
+ },
411
+ submitHandler: function ()
412
+ {
413
+ translation_request_array.push(jQuery("#ux_txt_your_name").val());
414
+ translation_request_array.push(jQuery("#ux_txt_email_address").val());
415
+ translation_request_array.push(domain_url);
416
+ translation_request_array.push(jQuery("#ux_txt_language").val());
417
+ translation_request_array.push(jQuery("#ux_txtarea_query").val());
418
+ jQuery.post(url,
419
+ {
420
+ data: JSON.stringify(translation_request_array),
421
+ param: "mail_bank_translation_request"
422
+ },
423
+ function ()
424
+ {
425
+ overlay_loading_mail_bank(<?php echo json_encode($mb_feature_request_message) ?>);
426
+ setTimeout(function ()
427
+ {
428
+ remove_overlay_mail_bank();
429
+ window.location.href = "admin.php?page=mb_email_configuration";
430
+ }, 3000);
431
+ });
432
+ }
433
+ });
434
  function show_pop_up_mail_bank()
435
  {
436
  open_popup_mail_bank();
451
  $check_wp_mail_bank_wizard = get_option("wp-mail-bank-wizard-set-up");
452
  $page_url = $check_wp_mail_bank_wizard == "" ? "wp_mail_bank_wizard" : esc_attr($_GET["page"]);
453
  if (isset($_GET["page"])) {
454
+ switch ($page_url) {
455
+ case "wp_mail_bank_wizard":
456
+ ?>
457
+ function show_hide_details_wp_mail_bank()
458
+ {
459
+ if (jQuery("#ux_div_wizard_set_up").hasClass("wizard-set-up"))
460
+ {
461
+ jQuery("#ux_div_wizard_set_up").css("display", "none");
462
+ jQuery("#ux_div_wizard_set_up").removeClass("wizard-set-up");
463
+ } else
464
+ {
465
+ jQuery("#ux_div_wizard_set_up").css("display", "block");
466
+ jQuery("#ux_div_wizard_set_up").addClass("wizard-set-up");
467
+ }
468
+ }
469
 
470
+ function plugin_stats_wp_mail_bank(type)
471
+ {
472
+ overlay_loading_mail_bank();
473
+ jQuery.post(ajaxurl,
474
+ {
475
+ type: type,
476
+ param: "wizard_wp_mail_bank",
477
+ action: "mail_bank_action",
478
+ _wp_nonce: "<?php echo $wp_mail_bank_check_status; ?>"
479
+ },
480
+ function ()
481
+ {
482
+ remove_overlay_mail_bank();
483
+ window.location.href = "admin.php?page=mb_email_configuration";
484
+ });
485
+ }
486
 
487
+ <?php
488
+ break;
489
+ case "mb_email_configuration":
490
+ ?>
491
+ jQuery("#ux_mb_li_email_configuration").addClass("active");
492
+ <?php
493
+ if (email_configuration_mail_bank == 1) {
494
+ ?>
495
+ function select_credentials_mail_bank()
496
+ {
497
+ var selected_credential = jQuery("#ux_ddl_mb_authentication").val();
498
+ var type = jQuery("#ux_ddl_type").val();
499
+ if (selected_credential === "oauth2" && type === "smtp")
500
+ {
501
+ jQuery("#ux_div_username_password_authentication").css("display", "none");
502
+ jQuery("#ux_div_oauth_authentication").css("display", "block");
503
+ check_links_oauth_mail_bank();
504
+ } else
505
+ {
506
+ if (selected_credential === "none")
507
+ {
508
+ jQuery("#ux_div_username_password_authentication").css("display", "none");
509
+ jQuery("#ux_div_oauth_authentication").css("display", "none");
510
+ } else
511
+ {
512
+ jQuery("#ux_div_username_password_authentication").css("display", "block");
513
+ jQuery("#ux_div_oauth_authentication").css("display", "none");
514
+ }
515
+ }
516
+ }
517
 
518
+ function mail_bank_second_step_settings()
519
+ {
520
+ jQuery("#ux_div_first_step").css("display", "none");
521
+ jQuery("#test_email").css("display", "none");
522
+ jQuery("#ux_div_second_step").css("display", "block");
523
+ jQuery("#ux_div_step_progres_bar_width").css("width", "66%");
524
+ jQuery("#ux_div_frm_wizard li:eq(1)").addClass("active");
525
+ jQuery("#ux_div_frm_wizard li:eq(2)").removeClass("active");
526
+ }
527
 
528
+ function mail_bank_third_step_settings()
529
+ {
530
+ jQuery("#ux_div_first_step").removeClass("first-step-helper");
531
+ jQuery("#test_email").css("display", "block");
532
+ jQuery("#ux_div_first_step").css("display", "none");
533
+ jQuery("#ux_div_second_step").css("display", "none");
534
+ jQuery("#ux_div_step_progres_bar_width").css("width", "100%");
535
+ jQuery("#ux_div_frm_wizard li:eq(1)").addClass("active");
536
+ jQuery("#ux_div_frm_wizard li:eq(2)").addClass("active");
537
+ }
538
 
539
+ function mail_bank_from_name_override()
540
+ {
541
+ var from_name = jQuery("#ux_ddl_from_name").val();
542
+ if (jQuery.trim(from_name) === "dont_override")
543
+ {
544
+ jQuery("#ux_txt_mb_from_name").attr("disabled", true);
545
+ } else
546
+ {
547
+ jQuery("#ux_txt_mb_from_name").attr("disabled", false);
548
+ }
549
+ }
550
 
551
+ function mail_bank_from_email_override()
552
+ {
553
+ var from_email = jQuery("#ux_ddl_from_email").val();
554
+ if (jQuery.trim(from_email) === "dont_override")
555
+ {
556
+ jQuery("#ux_txt_mb_from_email_configuration").attr("disabled", true);
557
+ } else
558
+ {
559
+ jQuery("#ux_txt_mb_from_email_configuration").attr("disabled", false);
560
+ }
561
+ }
562
 
563
+ function mail_bank_validate_settings()
564
+ {
565
+ jQuery("#ux_frm_email_configuration").validate
566
+ ({
567
+ rules:
568
+ {
569
+ ux_txt_mb_from_name:
570
+ {
571
+ required: true
572
+ },
573
+ ux_txt_mb_from_email_configuration:
574
+ {
575
+ required: true,
576
+ email: true
577
+ },
578
+ ux_txt_email_address:
579
+ {
580
+ required: true,
581
+ email: true
582
+ },
583
+ ux_txt_host:
584
+ {
585
+ required: true
586
+ },
587
+ ux_txt_port:
588
+ {
589
+ required: true
590
+ },
591
+ ux_txt_client_id:
592
+ {
593
+ required: true
594
+ },
595
+ ux_txt_client_secret:
596
+ {
597
+ required: true
598
+ },
599
+ ux_txt_username:
600
+ {
601
+ required: true
602
+ },
603
+ ux_txt_password:
604
+ {
605
+ required: true
606
+ }
607
+ },
608
+ errorPlacement: function ()
609
+ {
610
+ },
611
+ highlight: function (element)
612
+ {
613
+ jQuery(element).closest(".form-group").removeClass("has-success").addClass("has-error");
614
+ },
615
+ success: function (label, element)
616
+ {
617
+ var icon = jQuery(element).parent(".input-icon").children("i");
618
+ jQuery(element).closest(".form-group").removeClass("has-error").addClass("has-success");
619
+ icon.removeClass("fa-warning").addClass("fa-check");
620
+ },
621
+ submitHandler: function ()
622
+ {
623
+ if (jQuery("#ux_div_first_step").hasClass("first-step-helper"))
624
+ {
625
+ mail_bank_second_step_settings();
626
+ } else if (jQuery("#test_email").hasClass("second-step-helper"))
627
+ {
628
+ jQuery.post(ajaxurl,
629
+ {
630
+ data: base64_encode_mail_bank(jQuery("#ux_frm_email_configuration").serialize()),
631
+ action: "mail_bank_action",
632
+ param: "mail_bank_email_configuration_settings_module",
633
+ _wp_nonce: "<?php echo $mail_bank_email_configuration_settings; ?>"
634
+ },
635
+ function (data)
636
+ {
637
+ var automatic_mail = jQuery("#ux_chk_automatic_sent_mail").is(":checked");
638
+ var mailer_type = jQuery("#ux_ddl_type").val();
639
+ if (jQuery.trim(data) === "100" && mailer_type === "smtp")
640
+ {
641
+ var shortCutFunction = jQuery("#toastTypeGroup_error input:checked").val();
642
+ toastr[shortCutFunction](<?php echo json_encode($oauth_not_supported); ?>);
643
+ } else if (jQuery.trim(data) !== "" && mailer_type === "smtp")
644
+ {
645
+ window.location.href = data;
646
+ } else
647
+ {
648
+ var send_mail = false;
649
+ if (jQuery.trim(automatic_mail) === "true")
650
+ {
651
+ var send_mail = true;
652
+ }
653
+ window.location.href = "admin.php?page=mb_email_configuration&auto_mail=" + send_mail;
654
+ }
655
+ });
656
+ }
657
+ }
658
+ });
659
+ }
660
 
661
+ function change_settings_mail_bank()
662
+ {
663
+ var type = jQuery("#ux_ddl_type").val();
664
+ switch (type)
665
+ {
666
+ case "php_mail_function":
667
+ jQuery("#ux_div_smtp_mail_function").css("display", "none");
668
+ break;
669
+ case "smtp":
670
+ jQuery("#ux_div_smtp_mail_function").css("display", "block");
671
+ break;
672
+ }
673
+ select_credentials_mail_bank();
674
+ }
675
 
676
+ function mail_bank_get_host_port()
677
+ {
678
+ change_settings_mail_bank();
679
+ var smtp_user = jQuery("#ux_txt_email_address").val();
680
+ jQuery.post(ajaxurl,
681
+ {
682
+ smtp_user: smtp_user,
683
+ param: "mail_bank_set_hostname_port_module",
684
+ action: "mail_bank_action",
685
+ _wp_nonce: "<?php echo $mail_bank_set_hostname_port; ?>"
686
+ },
687
+ function (data)
688
+ {
689
+ if (jQuery.trim(data) !== "")
690
+ {
691
+ jQuery("#ux_txt_host").val(data);
692
+ check_links_oauth_mail_bank();
693
+ } else
694
+ {
695
+ jQuery("#ux_txt_host").val("");
696
+ jQuery("#ux_link_content").text("");
697
+ }
698
+ change_settings_mail_bank();
699
+ });
700
+ }
701
 
702
+ function change_link_content_mail_bank()
703
+ {
704
+ var host_type = jQuery("#ux_txt_host").val();
705
+ var indexof = host_type.indexOf("yahoo");
706
+ var hostname = host_type.substr(indexof, 5);
707
+ if (host_type === "smtp.gmail.com")
708
+ {
709
+ check_links_oauth_mail_bank();
710
+ jQuery("#ux_ddl_mb_authentication").val("oauth2");
711
+ select_credentials_mail_bank();
712
+ } else if (host_type === "smtp.live.com")
713
+ {
714
+ check_links_oauth_mail_bank();
715
+ jQuery("#ux_ddl_mb_authentication").val("oauth2");
716
+ select_credentials_mail_bank();
717
+ } else if (hostname === "yahoo")
718
+ {
719
+ check_links_oauth_mail_bank();
720
+ jQuery("#ux_ddl_mb_authentication").val("oauth2");
721
+ select_credentials_mail_bank();
722
+ } else
723
+ {
724
+ check_links_oauth_mail_bank();
725
+ jQuery("#ux_ddl_mb_authentication").val("login");
726
+ select_credentials_mail_bank();
727
+ }
728
+ }
729
 
730
+ jQuery(document).ready(function ()
731
+ {
732
+ if (window.CKEDITOR)
733
+ {
734
+ CKEDITOR.replace("ux_content");
735
+ }
736
+ jQuery("#ux_ddl_type").val("<?php echo isset($email_configuration_array["mailer_type"]) ? esc_attr($email_configuration_array["mailer_type"]) : ""; ?>");
737
+ jQuery("#ux_ddl_mb_authentication").val("<?php echo isset($email_configuration_array["auth_type"]) ? esc_attr($email_configuration_array["auth_type"]) : "login"; ?>");
738
+ jQuery("#ux_ddl_from_name").val("<?php echo isset($email_configuration_array["sender_name_configuration"]) ? esc_html($email_configuration_array["sender_name_configuration"]) : ""; ?>");
739
+ jQuery("#ux_ddl_from_email").val("<?php echo isset($email_configuration_array["from_email_configuration"]) ? esc_attr($email_configuration_array["from_email_configuration"]) : ""; ?>");
740
+ jQuery("#ux_ddl_encryption").val("<?php echo isset($email_configuration_array["enc_type"]) ? esc_attr($email_configuration_array["enc_type"]) : "" ?>");
741
+ <?php
742
+ if (isset($test_secret_key_error)) {
743
+ ?>
744
+ var shortCutFunction = jQuery("#toastTypeGroup_error input:checked").val();
745
+ toastr[shortCutFunction](<?php echo json_encode($test_secret_key_error); ?>);
746
+ mail_bank_second_step_settings();
747
+ <?php
748
+ }
749
+ if (isset($automatically_send_mail)) {
750
+ ?>
751
+ window.location.href = "admin.php?page=mb_email_configuration&auto_mail=true";
752
+ <?php
753
+ } elseif (isset($automatically_not_send_mail)) {
754
+ ?>
755
+ window.location.href = "admin.php?page=mb_email_configuration&auto_mail=false";
756
+ <?php
757
+ }
758
+ ?>
759
+ load_sidebar_content_mail_bank();
760
+ //change_link_content_mail_bank();
761
+ select_credentials_mail_bank();
762
+ change_settings_mail_bank();
763
+ mail_bank_from_name_override();
764
+ mail_bank_from_email_override();
765
+ <?php
766
+ if (isset($_REQUEST["auto_mail"]) && esc_attr($_REQUEST["auto_mail"]) == "true") {
767
+ ?>
768
+ mail_bank_mail_sender("<?php echo get_option('admin_email'); ?>");
769
+ jQuery("#console_log_div").css("display", "block");
770
+ jQuery("#ux_div_mail_console").css("display", "none");
771
+ jQuery("#ux_div_test_mail").css("display", "none");
772
+ mail_bank_third_step_settings();
773
+ <?php
774
+ } elseif (isset($_REQUEST["auto_mail"]) && esc_attr($_REQUEST["auto_mail"]) == "false") {
775
+ ?>
776
+ jQuery("#ux_div_mail_console").css("display", "none");
777
+ jQuery("#ux_div_test_mail").css("display", "block");
778
+ mail_bank_third_step_settings();
779
+ <?php
780
+ }
781
+ if ($email_configuration_array["hostname"] != "") {
782
+ ?>
783
+ jQuery("#ux_txt_host").val("<?php echo isset($email_configuration_array["hostname"]) ? esc_attr($email_configuration_array["hostname"]) : ""; ?>");
784
+ <?php
785
+ } else {
786
+ ?>
787
+ mail_bank_get_host_port();
788
+ <?php
789
+ }
790
+ ?>
791
+ });
792
+ function mail_bank_move_to_second_step()
793
+ {
794
+ jQuery("#ux_div_first_step").addClass("first-step-helper");
795
+ mail_bank_validate_settings();
796
+ }
797
 
798
+ function mail_bank_move_to_first_step()
799
+ {
800
+ jQuery("#ux_div_first_step").removeClass("first-step-helper");
801
+ jQuery("#test_email").removeClass("second-step-helper");
802
+ jQuery("#ux_div_first_step").css("display", "block");
803
+ jQuery("#test_email").css("display", "none");
804
+ jQuery("#ux_div_second_step").css("display", "none");
805
+ jQuery("#ux_div_step_progres_bar_width").css("width", "33%");
806
+ jQuery("#ux_div_frm_wizard li:eq(1)").removeClass("active");
807
+ }
808
 
809
+ function mail_bank_save_changes()
810
+ {
811
+ overlay_loading_mail_bank(<?php echo json_encode($mb_update_email_configuration); ?>);
812
+ setTimeout(function ()
813
+ {
814
+ remove_overlay_mail_bank();
815
+ window.location.href = "admin.php?page=mb_email_configuration";
816
+ }, 3000);
817
+ }
818
 
819
+ function mail_bank_move_to_third_step()
820
+ {
821
+ mail_bank_validate_settings();
822
+ jQuery("#ux_div_first_step").removeClass("first-step-helper");
823
+ jQuery("#test_email").addClass("second-step-helper");
824
+ }
825
 
826
+ function mail_bank_select_port()
827
+ {
828
+ var encryption = jQuery("#ux_ddl_encryption").val();
829
+ switch (encryption)
830
+ {
831
+ case "none":
832
+ case "tls":
833
+ jQuery("#ux_txt_port").val(587);
834
+ break;
835
+ case "ssl":
836
+ jQuery("#ux_txt_port").val(465);
837
+ break;
838
+ }
839
+ }
840
 
841
+ var sidebar_load_interval = setInterval(load_sidebar_content_mail_bank, 1000);
842
+ setTimeout(function ()
843
+ {
844
+ clearInterval(sidebar_load_interval);
845
+ }, 5000);
846
+ load_sidebar_content_mail_bank();
847
+ <?php
848
+ }
849
+ break;
850
+ case "mb_test_email":
851
+ ?>
852
+ jQuery("#ux_mb_li_test_email").addClass("active");
853
+ jQuery(document).ready(function ()
854
+ {
855
+ if (window.CKEDITOR)
856
+ {
857
+ CKEDITOR.replace("ux_content");
858
+ }
859
+ });
860
+ <?php
861
+ break;
862
+ case "mb_connectivity_test":
863
+ ?>
864
+ jQuery("#ux_mb_li_connectivity_test").addClass("active");
865
+ <?php
866
+ if (conectivity_test_email_mail_bank == 1) {
867
+ ?>
868
+ jQuery("#ux_frm_settings").validate
869
+ ({
870
+ rules:
871
+ {
872
+ ux_txt_conn_search:
873
+ {
874
+ required: true
875
+ }
876
+ },
877
+ errorPlacement: function ()
878
+ {
879
+ },
880
+ highlight: function (element)
881
+ {
882
+ jQuery(element).closest(".form-group").removeClass("has-success").addClass("has-error");
883
+ },
884
+ success: function (label, element)
885
+ {
886
+ var icon = jQuery(element).parent(".input-icon").children("i");
887
+ jQuery(element).closest(".form-group").removeClass("has-error").addClass("has-success");
888
+ icon.removeClass("fa-warning").addClass("fa-check");
889
+ },
890
+ submitHandler: function ()
891
+ {
892
+ jQuery("#ux_div_connectivity_test").css("display", "block");
893
+ overlay_loading_mail_bank();
894
+ jQuery.post(ajaxurl,
895
+ {
896
+ smtp_host: jQuery("#ux_txt_conn_search").val(),
897
+ param: "mail_bank_connectivity_test",
898
+ action: "mail_bank_action",
899
+ _wp_nonce: "<?php echo $connectivity_test_nonce; ?>"
900
+ },
901
+ function (data)
902
+ {
903
+ jQuery("#ux_tbody_smtp").html(data);
904
+ setTimeout(function ()
905
+ {
906
+ remove_overlay_mail_bank();
907
+ }, 1000);
908
+ });
909
+ }
910
+ });
911
+ var sidebar_load_interval = setInterval(load_sidebar_content_mail_bank, 1000);
912
+ setTimeout(function ()
913
+ {
914
+ clearInterval(sidebar_load_interval);
915
+ }, 5000);
916
+ <?php
917
+ }
918
+ break;
919
+ case "mb_email_logs":
920
+ ?>
921
+ jQuery("#ux_mb_li_email_logs").addClass("active");
922
+ <?php
923
+ if (email_logs_mail_bank == 1) {
924
+ ?>
925
+ jQuery(document).ready(function ()
926
+ {
927
+ jQuery("#ux_txt_mb_start_date").datepicker
928
+ ({
929
+ dateFormat: 'mm/dd/yy',
930
+ numberOfMonths: 1,
931
+ changeMonth: true,
932
+ changeYear: true,
933
+ yearRange: "1970:2039",
934
+ onSelect: function (selected)
935
+ {
936
+ jQuery("#ux_txt_mb_end_date").datepicker("option", "minDate", selected)
937
+ }
938
+ });
939
+ jQuery("#ux_txt_mb_end_date").datepicker
940
+ ({
941
+ dateFormat: 'mm/dd/yy',
942
+ numberOfMonths: 1,
943
+ changeMonth: true,
944
+ changeYear: true,
945
+ yearRange: "1970:2039",
946
+ onSelect: function (selected)
947
+ {
948
+ jQuery("#ux_txt_mb_start_date").datepicker("option", "maxDate", selected)
949
+ }
950
+ });
951
+ });
952
+ function prevent_datepicker_mail_bank(id)
953
+ {
954
+ jQuery("#" + id).on("keypress", function (e)
955
+ {
956
+ e.preventDefault();
957
+ });
958
+ }
959
 
960
+ var oTable = jQuery("#ux_tbl_email_logs").dataTable
961
+ ({
962
+ "pagingType": "full_numbers",
963
+ "language":
964
+ {
965
+ "emptyTable": "No data available in table",
966
+ "info": "Showing _START_ to _END_ of _TOTAL_ entries",
967
+ "infoEmpty": "No entries found",
968
+ "infoFiltered": "(filtered1 from _MAX_ total entries)",
969
+ "lengthMenu": "Show _MENU_ entries",
970
+ "search": "Search:",
971
+ "zeroRecords": "No matching records found"
972
+ },
973
+ "bSort": true,
974
+ "pageLength": 10,
975
+ "aoColumnDefs": [{"bSortable": false, "aTargets": [0]}]
976
+ });
977
+ var sidebar_load_interval = setInterval(load_sidebar_content_mail_bank, 1000);
978
+ setTimeout(function ()
979
+ {
980
+ clearInterval(sidebar_load_interval);
981
+ }, 5000);
982
+ jQuery("#ux_chk_all_email_logs").click(function ()
983
+ {
984
+ jQuery("input[type=checkbox]", oTable.fnGetFilteredNodes()).attr("checked", this.checked);
985
+ });
986
+ function check_email_logs()
987
+ {
988
+ if (jQuery("input:checked", oTable.fnGetFilteredNodes()).length === jQuery("input[type=checkbox]", oTable.fnGetFilteredNodes()).length)
989
+ {
990
+ jQuery("#ux_chk_all_email_logs").attr("checked", "checked");
991
+ } else
992
+ {
993
+ jQuery("#ux_chk_all_email_logs").removeAttr("checked");
994
+ }
995
+ }
996
 
997
+ var ux_frm_email_logs = jQuery("#ux_frm_email_logs").validate
998
+ ({
999
+ submitHandler: function ()
1000
+ {
1001
+ premium_edition_notification_mail_bank();
1002
+ }
1003
+ });
1004
+ load_sidebar_content_mail_bank();
1005
+ <?php
1006
+ }
1007
+ break;
1008
+ case "mb_settings":
1009
+ ?>
1010
+ jQuery("#ux_mb_li_settings").addClass("active");
1011
+ <?php
1012
+ if (settings_mail_bank == 1) {
1013
+ ?>
1014
+ jQuery(document).ready(function ()
1015
+ {
1016
+ jQuery("#ux_ddl_debug_mode").val("<?php echo isset($settings_data_array["debug_mode"]) ? esc_attr($settings_data_array["debug_mode"]) : "enable"; ?>");
1017
+ jQuery("#ux_ddl_remove_tables").val("<?php echo isset($settings_data_array["remove_tables_at_uninstall"]) ? esc_attr($settings_data_array["remove_tables_at_uninstall"]) : "disable"; ?>");
1018
+ jQuery("#ux_ddl_monitor_email_logs").val("<?php echo isset($settings_data_array["monitor_email_logs"]) ? esc_attr($settings_data_array["monitor_email_logs"]) : "enable"; ?>");
1019
+ });
1020
+ jQuery("#ux_frm_settings").validate
1021
+ ({
1022
+ submitHandler: function ()
1023
+ {
1024
+ overlay_loading_mail_bank(<?php echo json_encode($mb_update_settings); ?>);
1025
+ jQuery.post(ajaxurl,
1026
+ {
1027
+ data: base64_encode_mail_bank(jQuery("#ux_frm_settings").serialize()),
1028
+ action: "mail_bank_action",
1029
+ param: "mail_bank_settings_module",
1030
+ _wp_nonce: "<?php echo $mail_bank_settings; ?>"
1031
+ },
1032
+ function ()
1033
+ {
1034
+ setTimeout(function ()
1035
+ {
1036
+ remove_overlay_mail_bank();
1037
+ window.location.href = "admin.php?page=mb_settings";
1038
+ }, 3000);
1039
+ });
1040
+ }
1041
+ });
1042
+ load_sidebar_content_mail_bank();
1043
+ <?php
1044
+ }
1045
+ break;
1046
+ case "mb_roles_and_capabilities":
1047
+ ?>
1048
+ jQuery("#ux_mb_li_roles_and_capabilities").addClass("active");
1049
+ var sidebar_load_interval = setInterval(load_sidebar_content_mail_bank, 1000);
1050
+ setTimeout(function ()
1051
+ {
1052
+ clearInterval(sidebar_load_interval);
1053
+ }, 5000);
1054
+ <?php
1055
+ if (roles_and_capabilities_mail_bank == 1) {
1056
+ ?>
1057
+ function full_control_function_mail_bank(id, div_id)
1058
+ {
1059
+ var checkbox_id = jQuery(id).prop("checked");
1060
+ jQuery("#" + div_id + " input[type=checkbox]").each(function ()
1061
+ {
1062
+ if (checkbox_id)
1063
+ {
1064
+ jQuery(this).attr("checked", "checked");
1065
+ if (jQuery(id).attr("id") !== jQuery(this).attr("id"))
1066
+ {
1067
+ jQuery(this).attr("disabled", "disabled");
1068
+ }
1069
+ } else
1070
+ {
1071
+ if (jQuery(id).attr("id") !== jQuery(this).attr("id"))
1072
+ {
1073
+ jQuery(this).removeAttr("disabled");
1074
+ jQuery("#ux_chk_other_capabilities_manage_options").attr("disabled", "disabled");
1075
+ jQuery("#ux_chk_other_capabilities_read").attr("checked", "checked").attr("disabled", "disabled");
1076
+ }
1077
+ }
1078
+ });
1079
+ }
1080
 
1081
+ function show_roles_capabilities_mail_bank(id, div_id)
1082
+ {
1083
+ if (jQuery(id).prop("checked"))
1084
+ {
1085
+ jQuery("#" + div_id).css("display", "block");
1086
+ } else
1087
+ {
1088
+ jQuery("#" + div_id).css("display", "none");
1089
+ }
1090
+ }
1091
 
1092
+ jQuery(document).ready(function ()
1093
+ {
1094
+ jQuery("#ux_ddl_mail_bank_menu").val("<?php echo isset($details_roles_capabilities["show_mail_bank_top_bar_menu"]) ? esc_attr($details_roles_capabilities["show_mail_bank_top_bar_menu"]) : "enable"; ?>");
1095
+ show_roles_capabilities_mail_bank("#ux_chk_author", "ux_div_author_roles");
1096
+ full_control_function_mail_bank("#ux_chk_full_control_author", "ux_div_author_roles");
1097
+ show_roles_capabilities_mail_bank("#ux_chk_editor", "ux_div_editor_roles");
1098
+ full_control_function_mail_bank("#ux_chk_full_control_editor", "ux_div_editor_roles");
1099
+ show_roles_capabilities_mail_bank("#ux_chk_contributor", "ux_div_contributor_roles");
1100
+ full_control_function_mail_bank("#ux_chk_full_control_contributor", "ux_div_contributor_roles");
1101
+ show_roles_capabilities_mail_bank("#ux_chk_subscriber", "ux_div_subscriber_roles");
1102
+ full_control_function_mail_bank("#ux_chk_full_control_subscriber", "ux_div_subscriber_roles");
1103
+ show_roles_capabilities_mail_bank("#ux_chk_others_privileges", "ux_div_other_privileges_roles");
1104
+ full_control_function_mail_bank("#ux_chk_full_control_other_privileges_roles", "ux_div_other_privileges_roles");
1105
+ full_control_function_mail_bank("#ux_chk_full_control_other_roles", "ux_div_other_roles");
1106
+ });
1107
+ jQuery("#ux_frm_roles_and_capabilities").validate
1108
+ ({
1109
+ submitHandler: function ()
1110
+ {
1111
+ premium_edition_notification_mail_bank();
1112
+ }
1113
+ });
1114
+ load_sidebar_content_mail_bank();
1115
+ <?php
1116
+ }
1117
+ break;
1118
+ case "mb_feedbacks":
1119
+ ?>
1120
+ jQuery("#ux_mb_li_feedbacks").addClass("active");
1121
+ load_sidebar_content_mail_bank();
1122
+ var feedback_array = [];
1123
+ var url = "<?php echo tech_banker_url . "/feedbacks.php"; ?>";
1124
+ var domain_url = "<?php echo site_url(); ?>";
1125
+ jQuery("#ux_frm_feedbacks").validate
1126
+ ({
1127
+ rules:
1128
+ {
1129
+ ux_txt_your_name:
1130
+ {
1131
+ required: true
1132
+ },
1133
+ ux_txt_email_address:
1134
+ {
1135
+ required: true,
1136
+ email: true
1137
+ },
1138
+ ux_txtarea_feedbacks:
1139
+ {
1140
+ required: true
1141
+ }
1142
+ },
1143
+ errorPlacement: function ()
1144
+ {
1145
+ },
1146
+ highlight: function (element)
1147
+ {
1148
+ jQuery(element).closest(".form-group").removeClass("has-success").addClass("has-error");
1149
+ },
1150
+ success: function (label, element)
1151
+ {
1152
+ var icon = jQuery(element).parent(".input-icon").children("i");
1153
+ jQuery(element).closest(".form-group").removeClass("has-error").addClass("has-success");
1154
+ icon.removeClass("fa-warning").addClass("fa-check");
1155
+ },
1156
+ submitHandler: function ()
1157
+ {
1158
+ feedback_array.push(jQuery("#ux_txt_your_name").val(), jQuery("#ux_txt_email_address").val(), domain_url, jQuery("#ux_txtarea_feedbacks").val());
1159
+ overlay_loading_mail_bank(<?php echo json_encode($mb_update_feedbacks); ?>);
1160
+ jQuery.post(url,
1161
+ {
1162
+ data: JSON.stringify(feedback_array),
1163
+ param: "mail_bank_send_feedback"
1164
+ },
1165
+ function ()
1166
+ {
1167
+ setTimeout(function ()
1168
+ {
1169
+ remove_overlay_mail_bank();
1170
+ window.location.href = "admin.php?page=mb_feedbacks";
1171
+ }, 3000);
1172
+ });
1173
+ }
1174
+ });
1175
+ load_sidebar_content_mail_bank();
1176
+ <?php
1177
+ break;
1178
+ case "mb_system_information":
1179
+ ?>
1180
+ jQuery("#ux_mb_li_system_information").addClass("active");
1181
+ var sidebar_load_interval = setInterval(load_sidebar_content_mail_bank, 1000);
1182
+ setTimeout(function ()
1183
+ {
1184
+ clearInterval(sidebar_load_interval);
1185
+ }, 5000);
1186
+ <?php
1187
+ if (system_information_mail_bank == 1) {
1188
+ ?>
1189
+ jQuery.getSystemReport = function (strDefault, stringCount, string, location)
1190
+ {
1191
+ var o = strDefault.toString();
1192
+ if (!string)
1193
+ {
1194
+ string = "0";
1195
+ }
1196
+ while (o.length < stringCount)
1197
+ {
1198
+ if (location === "undefined")
1199
+ {
1200
+ o = string + o;
1201
+ } else
1202
+ {
1203
+ o = o + string;
1204
+ }
1205
+ }
1206
+ return o;
1207
+ };
1208
+ jQuery(".system-report").click(function ()
1209
+ {
1210
+ var report = "";
1211
+ jQuery(".custom-form-body").each(function ()
1212
+ {
1213
+ jQuery("h3.form-section", jQuery(this)).each(function ()
1214
+ {
1215
+ report = report + "\n### " + jQuery.trim(jQuery(this).text()) + " ###\n\n";
1216
+ });
1217
+ jQuery("tbody > tr", jQuery(this)).each(function ()
1218
+ {
1219
+ var the_name = jQuery.getSystemReport(jQuery.trim(jQuery(this).find("strong").text()), 25, " ");
1220
+ var the_value = jQuery.trim(jQuery(this).find("span").text());
1221
+ var value_array = the_value.split(", ");
1222
+ if (value_array.length > 1)
1223
+ {
1224
+ var temp_line = "";
1225
+ jQuery.each(value_array, function (key, line)
1226
+ {
1227
+ var tab = (key == 0) ? 0 : 25;
1228
+ temp_line = temp_line + jQuery.getSystemReport("", tab, " ", "f") + line + "\n";
1229
+ });
1230
+ the_value = temp_line;
1231
+ }
1232
+ report = report + "" + the_name + the_value + "\n";
1233
+ });
1234
+ });
1235
+ try
1236
+ {
1237
+ jQuery("#ux_system_information").slideDown();
1238
+ jQuery("#ux_system_information textarea").val(report).focus().select();
1239
+ return false;
1240
+ } catch (e)
1241
+ {
1242
+ }
1243
+ return false;
1244
+ });
1245
+ jQuery("#ux_btn_system_information").click(function ()
1246
+ {
1247
+ if (jQuery("#ux_btn_system_information").text() === "Close System Information!")
1248
+ {
1249
+ jQuery("#ux_system_information").slideUp();
1250
+ jQuery("#ux_btn_system_information").html("Get System Information!");
1251
+ } else
1252
+ {
1253
+ jQuery("#ux_btn_system_information").html("Close System Information!");
1254
+ jQuery("#ux_btn_system_information").removeClass("system-information");
1255
+ jQuery("#ux_btn_system_information").addClass("close-information");
1256
+ }
1257
+ });
1258
+ load_sidebar_content_mail_bank();
1259
+ <?php
1260
+ }
1261
+ break;
1262
 
1263
+ case "mb_upgrade":
1264
+ ?>
1265
+ jQuery("#ux_li_upgrade").addClass("active");
1266
+ var sidebar_load_interval = setInterval(load_sidebar_content_mail_bank, 1000);
1267
+ setTimeout(function ()
1268
+ {
1269
+ clearInterval(sidebar_load_interval);
1270
+ }, 5000);
1271
+ load_sidebar_content_mail_bank();
1272
+ <?php
1273
+ break;
1274
+ }
1275
  }
1276
  ?>
1277
  </script>
includes/google-authentication-mail-bank.php CHANGED
@@ -12,60 +12,60 @@ if (!class_exists("google_authentication_mail_bank")) {
12
  class google_authentication_mail_bank extends token_manager_mail_bank {
13
 
14
  public
15
- $client_id,
16
- $client_secret,
17
- $callback_uri,
18
- $sender_email,
19
- $token_url;
20
 
21
  // Constructor
22
  public function __construct($client_id, $client_secret, mail_bank_manage_token $authorization_token, $callback_uri, $sender_email) {
23
- $this->sender_email = $sender_email;
24
- $this->client_id = $client_id;
25
- $this->client_secret = $client_secret;
26
- $this->callback_uri = $callback_uri;
27
- $this->token_url = "https://www.googleapis.com/oauth2/v3/token";
28
- parent::__construct($client_id, $client_secret, $authorization_token, $callback_uri);
29
  }
30
 
31
  // This function request the token code
32
  public function get_token_code($state_id) {
33
- $configurations = array(
34
- "response_type" => "code",
35
- "redirect_uri" => urlencode($this->callback_uri),
36
- "client_id" => $this->client_id,
37
- "scope" => urlencode("https://mail.google.com/"),
38
- "access_type" => "offline",
39
- "approval_prompt" => "force",
40
- "state" => $state_id,
41
- "login_hint" => $this->sender_email
42
- );
43
 
44
- echo $oauth_url = "https://accounts.google.com/o/oauth2/auth?" . build_query($configurations);
45
  }
46
 
47
  // This function process the token code
48
  public function process_token_Code($state_id) {
49
- if (isset($_REQUEST["access_token"])) {
50
- $code = esc_attr($_REQUEST["access_token"]);
51
- $configurations = array(
52
- "client_id" => $this->client_id,
53
- "client_secret" => $this->client_secret,
54
- "grant_type" => "authorization_code",
55
- "redirect_uri" => $this->callback_uri,
56
- "code" => $code
57
- );
58
- $response = mail_bank_zend_mail_helper::retrieve_body_from_response_mail_bank($this->token_url, $configurations);
59
- $test_error = $this->process_response($response);
60
- if (isset($test_error->error)) {
61
- return $test_error;
62
- } else {
63
- $this->get_authorization_token()->set_vendorname_mail_bank("google");
64
- return "1";
65
- }
66
- } else {
67
- return false;
68
- }
69
  }
70
 
71
  }
12
  class google_authentication_mail_bank extends token_manager_mail_bank {
13
 
14
  public
15
+ $client_id,
16
+ $client_secret,
17
+ $callback_uri,
18
+ $sender_email,
19
+ $token_url;
20
 
21
  // Constructor
22
  public function __construct($client_id, $client_secret, mail_bank_manage_token $authorization_token, $callback_uri, $sender_email) {
23
+ $this->sender_email = $sender_email;
24
+ $this->client_id = $client_id;
25
+ $this->client_secret = $client_secret;
26
+ $this->callback_uri = $callback_uri;
27
+ $this->token_url = "https://www.googleapis.com/oauth2/v3/token";
28
+ parent::__construct($client_id, $client_secret, $authorization_token, $callback_uri);
29
  }
30
 
31
  // This function request the token code
32
  public function get_token_code($state_id) {
33
+ $configurations = array(
34
+ "response_type" => "code",
35
+ "redirect_uri" => urlencode($this->callback_uri),
36
+ "client_id" => $this->client_id,
37
+ "scope" => urlencode("https://mail.google.com/"),
38
+ "access_type" => "offline",
39
+ "approval_prompt" => "force",
40
+ "state" => $state_id,
41
+ "login_hint" => $this->sender_email
42
+ );
43
 
44
+ echo $oauth_url = "https://accounts.google.com/o/oauth2/auth?" . build_query($configurations);
45
  }
46
 
47
  // This function process the token code
48
  public function process_token_Code($state_id) {
49
+ if (isset($_REQUEST["access_token"])) {
50
+ $code = esc_attr($_REQUEST["access_token"]);
51
+ $configurations = array(
52
+ "client_id" => $this->client_id,
53
+ "client_secret" => $this->client_secret,
54
+ "grant_type" => "authorization_code",
55
+ "redirect_uri" => $this->callback_uri,
56
+ "code" => $code
57
+ );
58
+ $response = mail_bank_zend_mail_helper::retrieve_body_from_response_mail_bank($this->token_url, $configurations);
59
+ $test_error = $this->process_response($response);
60
+ if (isset($test_error->error)) {
61
+ return $test_error;
62
+ } else {
63
+ $this->get_authorization_token()->set_vendorname_mail_bank("google");
64
+ return "1";
65
+ }
66
+ } else {
67
+ return false;
68
+ }
69
  }
70
 
71
  }
includes/header.php CHANGED
@@ -15,8 +15,8 @@ if (!is_user_logged_in()) {
15
  $access_granted = false;
16
  foreach ($user_role_permission as $permission) {
17
  if (current_user_can($permission)) {
18
- $access_granted = true;
19
- break;
20
  }
21
  }
22
  if (!$access_granted) {
@@ -26,14 +26,14 @@ if (!is_user_logged_in()) {
26
  <div class="page-container">
27
  <div id="manage_messages" style="display:none;">
28
  <div class="radio">
29
- <input type="radio" value="success" checked="checked" />
30
  </div>
31
  </div>
32
  <div id="toastTypeGroup_error" style="display:none;">
33
  <div class="radio">
34
- <input type="radio" value="error" checked=""/>
35
  </div>
36
  </div>
37
- <?php
38
  }
39
  }
15
  $access_granted = false;
16
  foreach ($user_role_permission as $permission) {
17
  if (current_user_can($permission)) {
18
+ $access_granted = true;
19
+ break;
20
  }
21
  }
22
  if (!$access_granted) {
26
  <div class="page-container">
27
  <div id="manage_messages" style="display:none;">
28
  <div class="radio">
29
+ <input type="radio" value="success" checked="checked" />
30
  </div>
31
  </div>
32
  <div id="toastTypeGroup_error" style="display:none;">
33
  <div class="radio">
34
+ <input type="radio" value="error" checked=""/>
35
  </div>
36
  </div>
37
+ <?php
38
  }
39
  }
includes/mail-bank-configuration-provider.php CHANGED
@@ -8,17 +8,17 @@ if (!class_exists("mail_bank_configuration_provider")) {
8
  class mail_bank_configuration_provider {
9
 
10
  public function get_configuration_settings() {
11
- global $wpdb;
12
- $email_configuration_data = $wpdb->get_var
13
- (
14
- $wpdb->prepare
15
- (
16
- "SELECT meta_value FROM " . mail_bank_meta() .
17
- " WHERE meta_key=%s", "email_configuration"
18
- )
19
- );
20
- $email_configuration_array = maybe_unserialize($email_configuration_data);
21
- return $email_configuration_array;
22
  }
23
 
24
  }
8
  class mail_bank_configuration_provider {
9
 
10
  public function get_configuration_settings() {
11
+ global $wpdb;
12
+ $email_configuration_data = $wpdb->get_var
13
+ (
14
+ $wpdb->prepare
15
+ (
16
+ "SELECT meta_value FROM " . mail_bank_meta() .
17
+ " WHERE meta_key=%s", "email_configuration"
18
+ )
19
+ );
20
+ $email_configuration_array = maybe_unserialize($email_configuration_data);
21
+ return $email_configuration_array;
22
  }
23
 
24
  }
includes/mail-bank-configure-transport.php CHANGED
@@ -12,50 +12,50 @@ if (!class_exists("mail_bank_configure_transport")) {
12
  class mail_bank_configure_transport {
13
 
14
  public function configure_plain_transport() {
15
- $obj_mail_bank_configuration_provider = new mail_bank_configuration_provider();
16
- $configuration_setting = $obj_mail_bank_configuration_provider->get_configuration_settings();
17
-
18
- $port = $configuration_setting["port"];
19
- $enc_type = $configuration_setting["enc_type"];
20
-
21
- //set configurations
22
- $config = array(
23
- "port" => $port
24
- );
25
- if ($enc_type != "none") {
26
- $config["ssl"] = $enc_type;
27
- }
28
-
29
- $config["auth"] = $configuration_setting["auth_type"];
30
- $config["username"] = $configuration_setting["username"];
31
- $config["password"] = base64_decode($configuration_setting["password"]);
32
- return $config;
33
  }
34
 
35
  public function configure_oauth_transport() {
36
- $obj_mail_bank_configuration_provider = new mail_bank_configuration_provider();
37
- $configuration_setting = $obj_mail_bank_configuration_provider->get_configuration_settings();
38
- $sender_email = $configuration_setting["email_address"];
39
-
40
- //set vendor name for yahoo
41
- $vendor = "";
42
- if (mail_bank_zend_mail_helper::email_domains_mail_bank($configuration_setting["hostname"], "yahoo.com")) {
43
- $vendor = "yahoo";
44
- }
45
-
46
- $obj_mail_bank_manage_token = mail_bank_manage_token::get_instance();
47
- // create oauth2 string
48
- $xoauth2_request = base64_encode(sprintf("user=%s\1auth=Bearer %s\1%s\1", $sender_email, $obj_mail_bank_manage_token->retrieve_access_token_mail_bank(), $vendor));
49
-
50
- //set configurations
51
- $config = array(
52
- "ssl" => $configuration_setting["enc_type"],
53
- "port" => $configuration_setting["port"],
54
- "auth" => "oauth2",
55
- "xoauth2_request" => $xoauth2_request
56
- );
57
-
58
- return $config;
59
  }
60
 
61
  }
12
  class mail_bank_configure_transport {
13
 
14
  public function configure_plain_transport() {
15
+ $obj_mail_bank_configuration_provider = new mail_bank_configuration_provider();
16
+ $configuration_setting = $obj_mail_bank_configuration_provider->get_configuration_settings();
17
+
18
+ $port = $configuration_setting["port"];
19
+ $enc_type = $configuration_setting["enc_type"];
20
+
21
+ //set configurations
22
+ $config = array(
23
+ "port" => $port
24
+ );
25
+ if ($enc_type != "none") {
26
+ $config["ssl"] = $enc_type;
27
+ }
28
+
29
+ $config["auth"] = $configuration_setting["auth_type"];
30
+ $config["username"] = $configuration_setting["username"];
31
+ $config["password"] = base64_decode($configuration_setting["password"]);
32
+ return $config;
33
  }
34
 
35
  public function configure_oauth_transport() {
36
+ $obj_mail_bank_configuration_provider = new mail_bank_configuration_provider();
37
+ $configuration_setting = $obj_mail_bank_configuration_provider->get_configuration_settings();
38
+ $sender_email = $configuration_setting["email_address"];
39
+
40
+ //set vendor name for yahoo
41
+ $vendor = "";
42
+ if (mail_bank_zend_mail_helper::email_domains_mail_bank($configuration_setting["hostname"], "yahoo.com")) {
43
+ $vendor = "yahoo";
44
+ }
45
+
46
+ $obj_mail_bank_manage_token = mail_bank_manage_token::get_instance();
47
+ // create oauth2 string
48
+ $xoauth2_request = base64_encode(sprintf("user=%s\1auth=Bearer %s\1%s\1", $sender_email, $obj_mail_bank_manage_token->retrieve_access_token_mail_bank(), $vendor));
49
+
50
+ //set configurations
51
+ $config = array(
52
+ "ssl" => $configuration_setting["enc_type"],
53
+ "port" => $configuration_setting["port"],
54
+ "auth" => "oauth2",
55
+ "xoauth2_request" => $xoauth2_request
56
+ );
57
+
58
+ return $config;
59
  }
60
 
61
  }
includes/mail-bank-email-log.php CHANGED
@@ -22,106 +22,106 @@ if (!class_exists("mail_bank_email_log_writter")) {
22
 
23
  // This function is used to write success logs.
24
  public function mb_success_log($email_logs, $email_message, $debug_mode, $email_configuration_settings, $obj_mail_bank_manage_email) {
25
- $status = "Sent";
26
- $subject = $email_message->mb_get_subject();
27
- $this->mb_create_email_log($email_logs, $email_message);
28
- $this->mb_email_log($email_logs, $debug_mode, $status, $email_configuration_settings, $obj_mail_bank_manage_email, $email_message);
29
  }
30
 
31
  // This function is used to write failure logs.
32
  public function mb_failure_log($email_logs, $email_message = null, $debug_mode, $email_configuration_settings, $obj_mail_bank_manage_email) {
33
- $status = "Not Sent";
34
- $this->mb_create_email_log($email_logs, $email_message);
35
- $this->mb_email_log($email_logs, $debug_mode, $status, $email_configuration_settings, $obj_mail_bank_manage_email, $email_message);
36
  }
37
 
38
  // This function writes the Email Logs.
39
  public function mb_email_log($email_logs, $debug_mode, $status, $email_configuration_settings, $obj_mail_bank_manage_email, $message) {
40
- $sender = $message->get_email_address_mail_bank();
41
-
42
- $sender_email = $email_configuration_settings["from_email_configuration"] == "override" ? $email_configuration_settings["sender_email"] : $sender->mb_get_email();
43
- $sender_name = $email_configuration_settings["sender_name_configuration"] == "override" ? $email_configuration_settings["sender_name"] : $sender->mb_get_name();
44
-
45
- $cc_recipients = $obj_mail_bank_manage_email->mb_get_cc_recipients();
46
- $bcc_recipients = $obj_mail_bank_manage_email->mb_get_bcc_recipients();
47
- $cc_address = "";
48
- if ($email_configuration_settings["cc"] == "") {
49
- $cc_array = array();
50
- foreach ($cc_recipients as $recipient) {
51
- array_push($cc_array, $recipient->email);
52
- }
53
- $cc_address = implode(",", $cc_array);
54
- } else {
55
- $cc_address = $email_configuration_settings["cc"];
56
- }
57
- $bcc_address = "";
58
- if ($email_configuration_settings["bcc"] == "") {
59
- $bcc_array = array();
60
- foreach ($bcc_recipients as $recipient) {
61
- array_push($bcc_array, $recipient->email);
62
- }
63
- $bcc_address = implode(",", $bcc_array);
64
- } else {
65
- $bcc_address = $email_configuration_settings["bcc"];
66
- }
67
-
68
- $email_logs_data_array = array();
69
- $email_logs_data_array["email_to"] = $email_logs->to_recipients;
70
- $email_logs_data_array["cc"] = $cc_address;
71
- $email_logs_data_array["bcc"] = $bcc_address;
72
- $email_logs_data_array["subject"] = $email_logs->subject;
73
- $email_logs_data_array["content"] = $email_logs->body;
74
- $email_logs_data_array["sender_name"] = $sender_name;
75
- $email_logs_data_array["sender_email"] = $sender_email;
76
- if ($debug_mode == "enable") {
77
- $email_logs_data_array["debug_mode"] = $debug_mode;
78
- $email_logs_data_array["debugging_output"] = get_option("mail_bank_mail_status");
79
- }
80
- $email_logs_data_array["timestamp"] = MAIL_BANK_LOCAL_TIME;
81
- $email_logs_data_array["status"] = $status;
82
- global $wpdb;
83
- $email_logs_id = $wpdb->get_var
84
- (
85
- $wpdb->prepare
86
- (
87
- "SELECT id FROM " . mail_bank() .
88
- " WHERE type = %s", "email_logs"
89
- )
90
- );
91
-
92
- $email_logs_data = array();
93
- $email_logs_data["meta_id"] = $email_logs_id;
94
- $email_logs_data["meta_key"] = "email_logs";
95
- $email_logs_data["meta_value"] = serialize($email_logs_data_array);
96
- $wpdb->insert(mail_bank_meta(), $email_logs_data);
97
  }
98
 
99
  // This function is used to create email logs
100
  public function mb_create_email_log($email_logs, mail_bank_manage_email $email_message = null) {
101
- if ($email_message) {
102
- $email_logs->to_recipients = $this->mb_flat_emails($email_message->mb_get_to_recipients());
103
- $email_logs->subject = $email_message->mb_get_subject();
104
- $email_logs->body = $email_message->mb_get_body();
105
- }
106
- return $email_logs;
107
  }
108
 
109
  // This function creates a readable "TO" entry based on the recipient header
110
  public static function mb_flat_emails(array $addresses) {
111
- $flat = "";
112
- $count = 0;
113
- foreach ($addresses as $address) {
114
- if ($count >= 3) {
115
- $flat .= sprintf('.. +%d more', sizeof($addresses) - $count);
116
- break;
117
- }
118
- if ($count > 0) {
119
- $flat .= ', ';
120
- }
121
- $flat .= $address->mb_email_format();
122
- $count ++;
123
- }
124
- return $flat;
125
  }
126
 
127
  }
22
 
23
  // This function is used to write success logs.
24
  public function mb_success_log($email_logs, $email_message, $debug_mode, $email_configuration_settings, $obj_mail_bank_manage_email) {
25
+ $status = "Sent";
26
+ $subject = $email_message->mb_get_subject();
27
+ $this->mb_create_email_log($email_logs, $email_message);
28
+ $this->mb_email_log($email_logs, $debug_mode, $status, $email_configuration_settings, $obj_mail_bank_manage_email, $email_message);
29
  }
30
 
31
  // This function is used to write failure logs.
32
  public function mb_failure_log($email_logs, $email_message = null, $debug_mode, $email_configuration_settings, $obj_mail_bank_manage_email) {
33
+ $status = "Not Sent";
34
+ $this->mb_create_email_log($email_logs, $email_message);
35
+ $this->mb_email_log($email_logs, $debug_mode, $status, $email_configuration_settings, $obj_mail_bank_manage_email, $email_message);
36
  }
37
 
38
  // This function writes the Email Logs.
39
  public function mb_email_log($email_logs, $debug_mode, $status, $email_configuration_settings, $obj_mail_bank_manage_email, $message) {
40
+ $sender = $message->get_email_address_mail_bank();
41
+
42
+ $sender_email = $email_configuration_settings["from_email_configuration"] == "override" ? $email_configuration_settings["sender_email"] : $sender->mb_get_email();
43
+ $sender_name = $email_configuration_settings["sender_name_configuration"] == "override" ? $email_configuration_settings["sender_name"] : $sender->mb_get_name();
44
+
45
+ $cc_recipients = $obj_mail_bank_manage_email->mb_get_cc_recipients();
46
+ $bcc_recipients = $obj_mail_bank_manage_email->mb_get_bcc_recipients();
47
+ $cc_address = "";
48
+ if ($email_configuration_settings["cc"] == "") {
49
+ $cc_array = array();
50
+ foreach ($cc_recipients as $recipient) {
51
+ array_push($cc_array, $recipient->email);
52
+ }
53
+ $cc_address = implode(",", $cc_array);
54
+ } else {
55
+ $cc_address = $email_configuration_settings["cc"];
56
+ }
57
+ $bcc_address = "";
58
+ if ($email_configuration_settings["bcc"] == "") {
59
+ $bcc_array = array();
60
+ foreach ($bcc_recipients as $recipient) {
61
+ array_push($bcc_array, $recipient->email);
62
+ }
63
+ $bcc_address = implode(",", $bcc_array);
64
+ } else {
65
+ $bcc_address = $email_configuration_settings["bcc"];
66
+ }
67
+
68
+ $email_logs_data_array = array();
69
+ $email_logs_data_array["email_to"] = $email_logs->to_recipients;
70
+ $email_logs_data_array["cc"] = $cc_address;
71
+ $email_logs_data_array["bcc"] = $bcc_address;
72
+ $email_logs_data_array["subject"] = $email_logs->subject;
73
+ $email_logs_data_array["content"] = $email_logs->body;
74
+ $email_logs_data_array["sender_name"] = $sender_name;
75
+ $email_logs_data_array["sender_email"] = $sender_email;
76
+ if ($debug_mode == "enable") {
77
+ $email_logs_data_array["debug_mode"] = $debug_mode;
78
+ $email_logs_data_array["debugging_output"] = get_option("mail_bank_mail_status");
79
+ }
80
+ $email_logs_data_array["timestamp"] = MAIL_BANK_LOCAL_TIME;
81
+ $email_logs_data_array["status"] = $status;
82
+ global $wpdb;
83
+ $email_logs_id = $wpdb->get_var
84
+ (
85
+ $wpdb->prepare
86
+ (
87
+ "SELECT id FROM " . mail_bank() .
88
+ " WHERE type = %s", "email_logs"
89
+ )
90
+ );
91
+
92
+ $email_logs_data = array();
93
+ $email_logs_data["meta_id"] = $email_logs_id;
94
+ $email_logs_data["meta_key"] = "email_logs";
95
+ $email_logs_data["meta_value"] = serialize($email_logs_data_array);
96
+ $wpdb->insert(mail_bank_meta(), $email_logs_data);
97
  }
98
 
99
  // This function is used to create email logs
100
  public function mb_create_email_log($email_logs, mail_bank_manage_email $email_message = null) {
101
+ if ($email_message) {
102
+ $email_logs->to_recipients = $this->mb_flat_emails($email_message->mb_get_to_recipients());
103
+ $email_logs->subject = $email_message->mb_get_subject();
104
+ $email_logs->body = $email_message->mb_get_body();
105
+ }
106
+ return $email_logs;
107
  }
108
 
109
  // This function creates a readable "TO" entry based on the recipient header
110
  public static function mb_flat_emails(array $addresses) {
111
+ $flat = "";
112
+ $count = 0;
113
+ foreach ($addresses as $address) {
114
+ if ($count >= 3) {
115
+ $flat .= sprintf('.. +%d more', sizeof($addresses) - $count);
116
+ break;
117
+ }
118
+ if ($count > 0) {
119
+ $flat .= ', ';
120
+ }
121
+ $flat .= $address->mb_email_format();
122
+ $count ++;
123
+ }
124
+ return $flat;
125
  }
126
 
127
  }
includes/mail-bank-manage-email-address.php CHANGED
@@ -8,71 +8,71 @@ if (!class_exists("mail_bank_manage_email_address")) {
8
  class mail_bank_manage_email_address {
9
 
10
  public
11
- $name,
12
- $email;
13
 
14
  public function __construct($email, $name = null) {
15
- if (preg_match('/(.*)<(.+)>/', $email, $matches)) {
16
- if (count($matches) == 3) {
17
- $name = $matches [1];
18
- $email = $matches [2];
19
- }
20
- }
21
- $this->mb_set_email(trim($email));
22
- $this->mb_set_name(trim($name));
23
  }
24
 
25
  public function mb_get_name() {
26
- return $this->name;
27
  }
28
 
29
  public function mb_get_email() {
30
- return $this->email;
31
  }
32
 
33
  public function mb_email_format() {
34
- $name = $this->mb_get_name();
35
- if (!empty($name)) {
36
- return sprintf("%s <%s>", $this->mb_get_name(), $this->mb_get_email());
37
- } else {
38
- return sprintf("%s", $this->mb_get_email());
39
- }
40
  }
41
 
42
  public function mb_set_name($name) {
43
- $this->name = $name;
44
  }
45
 
46
  public function mb_set_email($email) {
47
- $this->email = $email;
48
  }
49
 
50
  // This function validate the email address.
51
  public function validate_email_contents_mail_bank($description = "") {
52
- if (!mail_bank_zend_mail_helper::email_validation_mail_bank($this->email)) {
53
- if (empty($description)) {
54
- $message = sprintf('Invalid e-mail address "%s"', $this->email);
55
- } else {
56
- $message = sprintf('Invalid "%1$s" e-mail address "%2$s"', $description, $this->email);
57
- }
58
- throw new Exception($message);
59
- }
60
  }
61
 
62
  // This function takes a string or array of addresses and return an array.
63
  public static function convert_string_to_array_mail_bank($emails) {
64
- if (!is_array($emails)) {
65
- $t = explode(",", $emails);
66
- $emails = array();
67
- foreach ($t as $k => $v) {
68
- if (strpos($v, ',') !== false) {
69
- $t[$k] = '"' . str_replace(' <', '" <', $v);
70
- }
71
- $simplified_email = trim($t [$k]);
72
- array_push($emails, $simplified_email);
73
- }
74
- }
75
- return $emails;
76
  }
77
 
78
  }
8
  class mail_bank_manage_email_address {
9
 
10
  public
11
+ $name,
12
+ $email;
13
 
14
  public function __construct($email, $name = null) {
15
+ if (preg_match('/(.*)<(.+)>/', $email, $matches)) {
16
+ if (count($matches) == 3) {
17
+ $name = $matches [1];
18
+ $email = $matches [2];
19
+ }
20
+ }
21
+ $this->mb_set_email(trim($email));
22
+ $this->mb_set_name(trim($name));
23
  }
24
 
25
  public function mb_get_name() {
26
+ return $this->name;
27
  }
28
 
29
  public function mb_get_email() {
30
+ return $this->email;
31
  }
32
 
33
  public function mb_email_format() {
34
+ $name = $this->mb_get_name();
35
+ if (!empty($name)) {
36
+ return sprintf("%s <%s>", $this->mb_get_name(), $this->mb_get_email());
37
+ } else {
38
+ return sprintf("%s", $this->mb_get_email());
39
+ }
40
  }
41
 
42
  public function mb_set_name($name) {
43
+ $this->name = $name;
44
  }
45
 
46
  public function mb_set_email($email) {
47
+ $this->email = $email;
48
  }
49
 
50
  // This function validate the email address.
51
  public function validate_email_contents_mail_bank($description = "") {
52
+ if (!mail_bank_zend_mail_helper::email_validation_mail_bank($this->email)) {
53
+ if (empty($description)) {
54
+ $message = sprintf('Invalid e-mail address "%s"', $this->email);
55
+ } else {
56
+ $message = sprintf('Invalid "%1$s" e-mail address "%2$s"', $description, $this->email);
57
+ }
58
+ throw new Exception($message);
59
+ }
60
  }
61
 
62
  // This function takes a string or array of addresses and return an array.
63
  public static function convert_string_to_array_mail_bank($emails) {
64
+ if (!is_array($emails)) {
65
+ $t = explode(",", $emails);
66
+ $emails = array();
67
+ foreach ($t as $k => $v) {
68
+ if (strpos($v, ',') !== false) {
69
+ $t[$k] = '"' . str_replace(' <', '" <', $v);
70
+ }
71
+ $simplified_email = trim($t [$k]);
72
+ array_push($emails, $simplified_email);
73
+ }
74
+ }
75
+ return $emails;
76
  }
77
 
78
  }
includes/mail-bank-manage-email.php CHANGED
@@ -13,29 +13,29 @@ if (!class_exists("mail_bank_manage_email")) {
13
  const EOL = "\r\n";
14
 
15
  public
16
- $from,
17
- $reply_to,
18
- $to_recipients,
19
- $cc_recipients,
20
- $bcc_recipients,
21
- $subject,
22
- $body,
23
- $body_textpart,
24
- $body_htmlpart,
25
- $headers,
26
- $attachments,
27
- $date,
28
- $message_id,
29
- $content_type,
30
- $charset,
31
- $boundary;
32
 
33
  // Constructor
34
  function __construct() {
35
- $this->headers = array();
36
- $this->to_recipients = array();
37
- $this->cc_recipients = array();
38
- $this->bcc_recipients = array();
39
  }
40
 
41
  // public static function getinstance()
@@ -49,326 +49,326 @@ if (!class_exists("mail_bank_manage_email")) {
49
  // }
50
 
51
  public function check_email_body_parts_mail_bank() {
52
- return empty($this->body_textpart) && empty($this->body_htmlpart);
53
  }
54
 
55
  public function validate_email_contents_mail_bank($transport) {
56
- $this->validate_email_headers_mail_bank();
57
  }
58
 
59
  // This function create body parts based on content type
60
  public function createBodyParts() {
61
- if (false !== stripos($this->content_type, "multipart") && !empty($this->boundary)) {
62
- $this->content_type = sprintf("%s;\r\n\t boundary=\"%s\"", $this->content_type, $this->mb_get_boundary());
63
- }
64
-
65
- $body = $this->mb_get_body();
66
- $content_type = $this->mb_get_content_type();
67
- if ($content_type == "") {
68
- $content_type = apply_filters("wp_mail_content_type", $content_type);
69
- }
70
- if (substr($content_type, 0, 9) === "text/html") {
71
- $this->mb_set_body_htmlPart($body);
72
- } else if (substr($content_type, 0, 10) === "text/plain") {
73
- $this->mb_set_body_textpart($body);
74
- } else if (substr($content_type, 0, 21) === "multipart/alternative") {
75
- $arr = explode(PHP_EOL, $body);
76
- $textBody = "";
77
- $htmlBody = "";
78
- $mode = "";
79
- foreach ($arr as $s) {
80
- if (substr($s, 0, 25) === "Content-Type: text/plain;") {
81
- $mode = "foundText";
82
- } else if (substr($s, 0, 24) === "Content-Type: text/html;") {
83
- $mode = "foundHtml";
84
- } else if ($mode == "textReading") {
85
- $textBody .= $s;
86
- } else if ($mode == "htmlReading") {
87
- $htmlBody .= $s;
88
- } else if ($mode == "foundText") {
89
- $trim = trim($s);
90
- if (empty($trim)) {
91
- $mode = "textReading";
92
- }
93
- } else if ($mode == "foundHtml") {
94
- $trim = trim($s);
95
- if (empty($trim)) {
96
- $mode = "htmlReading";
97
- }
98
- }
99
- }
100
- $this->mb_set_body_htmlPart($htmlBody);
101
- $this->mb_set_body_textpart($textBody);
102
- } else {
103
- $this->mb_set_body_textpart($body);
104
- }
105
  }
106
 
107
  // This function validate email headers
108
  public function validate_email_headers_mail_bank() {
109
- if (isset($this->reply_to)) {
110
- $this->mb_get_reply_to()->validate_email_contents_mail_bank("Reply-To");
111
- }
112
 
113
- // validate the from address
114
- $this->get_email_address_mail_bank()->validate_email_contents_mail_bank("From");
115
 
116
- // validate the to recipients
117
- foreach ((array) $this->mb_get_to_recipients() as $to_address) {
118
- $to_address->validate_email_contents_mail_bank("To");
119
- }
120
 
121
- // validate the cc recipients
122
- foreach ((array) $this->mb_get_cc_recipients() as $cc_address) {
123
- $cc_address->validate_email_contents_mail_bank("Cc");
124
- }
125
 
126
- // validate the bcc recipients
127
- foreach ((array) $this->mb_get_bcc_recipients() as $bcc_address) {
128
- $bcc_address->validate_email_contents_mail_bank("Bcc");
129
- }
130
  }
131
 
132
  public function get_email_address_mail_bank() {
133
- return $this->from;
134
  }
135
 
136
  // Get the charset.
137
  public function mb_get_charset() {
138
- return $this->charset;
139
  }
140
 
141
  // Set the charset
142
  public function mb_set_charset($charset) {
143
- $this->charset = $charset;
144
  }
145
 
146
  // Get the content type
147
  public function mb_get_content_type() {
148
- return $this->content_type;
149
  }
150
 
151
  public function mb_set_content_type($content_type) {
152
- $this->content_type = $content_type;
153
  }
154
 
155
  public function mb_addto($to) {
156
- $this->mb_add_recipients($this->to_recipients, $to);
157
  }
158
 
159
  public function mb_add_cc($cc) {
160
- $this->mb_add_recipients($this->cc_recipients, $cc);
161
  }
162
 
163
  public function mb_add_bcc($bcc) {
164
- $this->mb_add_recipients($this->bcc_recipients, $bcc);
165
  }
166
 
167
  public function mb_add_recipients(&$all_recipients, $recipients) {
168
- if (!empty($recipients)) {
169
- $recipients = mail_bank_manage_email_address::convert_string_to_array_mail_bank($recipients);
170
- foreach ($recipients as $recipient) {
171
- if (!empty($recipient)) {
172
- array_push($all_recipients, new mail_bank_manage_email_address($recipient));
173
- }
174
- }
175
- }
176
  }
177
 
178
  // This function add headers
179
  public function mb_add_headers($headers) {
180
- if (!is_array($headers)) {
181
- $headers = explode("\n", str_replace("\r\n", "\n", $headers));
182
- }
183
- foreach ($headers as $header) {
184
- if (!empty($header)) {
185
- if (strpos($header, ":") === false) {
186
- if (false !== stripos($header, "boundary=")) {
187
- $parts = preg_split("/boundary=/i", trim($header));
188
- $this->boundary = trim(str_replace(array(
189
- "'",
190
- '"'
191
- ), '', $parts [1]));
192
- }
193
- continue;
194
- }
195
- list($name, $content) = explode(":", trim($header), 2);
196
- $this->mb_process_header($name, $content);
197
- }
198
- }
199
  }
200
 
201
  // This function process headers
202
  public function mb_process_header($name, $content) {
203
- $name = trim($name);
204
- $content = trim($content);
205
- switch (strtolower($name)) {
206
- case "content-type" :
207
- if (strpos($content, ";") !== false) {
208
- list($type, $charset) = explode(";", $content);
209
- $this->mb_set_content_type(trim($type));
210
- if (false !== stripos($charset, "charset=")) {
211
- $charset = trim(str_replace(array(
212
- 'charset=',
213
- '"'
214
- ), '', $charset));
215
- } elseif (false !== stripos($charset, "boundary=")) {
216
- $this->boundary = trim(str_replace(array(
217
- 'BOUNDARY=',
218
- 'boundary=',
219
- '"'
220
- ), '', $charset));
221
- $charset = '';
222
- }
223
- if (!empty($charset)) {
224
- $this->mb_set_charset($charset);
225
- }
226
- } else {
227
- $this->mb_set_content_type(trim($content));
228
- }
229
- break;
230
- case "to" :
231
- $this->mb_addto($content);
232
- break;
233
- case "cc" :
234
- $this->mb_add_cc($content);
235
- break;
236
- case "bcc" :
237
- $this->mb_add_bcc($content);
238
- break;
239
- case "from" :
240
- $this->mb_set_from($content);
241
- break;
242
- case "subject" :
243
- $this->mb_set_subject($content);
244
- break;
245
- case "reply-to" :
246
- $this->mb_set_replyto($content);
247
- break;
248
- case "sender" :
249
- break;
250
- case "return-path" :
251
- break;
252
- case "date" :
253
- $this->mb_set_date($content);
254
- break;
255
- case "message-id" :
256
- $this->mb_set_messageid($content);
257
- break;
258
- default :
259
- array_push($this->headers, array(
260
- "name" => $name,
261
- "content" => $content
262
- ));
263
- break;
264
- }
265
  }
266
 
267
  // Add attachments to the message
268
  public function mb_add_attachments_to_mail(mail_bank_Zend_Mail $mail) {
269
- $attachments = $this->attachments;
270
- if (!is_array($attachments)) {
271
- $attributes_array = explode(PHP_EOL, $attachments);
272
- } else {
273
- $attributes_array = $attachments;
274
- }
275
- foreach ($attributes_array as $file) {
276
- if (file_exists($file)) {
277
- $at = new mail_bank_Zend_Mime_Part(file_get_contents($file));
278
- $at->disposition = mail_bank_Zend_Mime::DISPOSITION_ATTACHMENT;
279
- $at->encoding = mail_bank_Zend_Mime::ENCODING_BASE64;
280
- $at->filename = basename($file);
281
- $mail->addAttachment($at);
282
- }
283
- }
284
  }
285
 
286
  function mb_set_body($body) {
287
- $this->body = $body;
288
  }
289
 
290
  function mb_set_body_textpart($body_textpart) {
291
- $this->body_textpart = $body_textpart;
292
  }
293
 
294
  function mb_set_body_htmlPart($body_htmlpart) {
295
- $this->body_htmlpart = $body_htmlpart;
296
  }
297
 
298
  function mb_set_subject($subject) {
299
- $this->subject = $subject;
300
  }
301
 
302
  function mb_set_attachments($attachments) {
303
- $this->attachments = $attachments;
304
  }
305
 
306
  function mb_set_from($email, $name = null) {
307
- if (!empty($email)) {
308
- $this->from = new mail_bank_manage_email_address($email, $name);
309
- }
310
  }
311
 
312
  function mb_set_replyto($reply_to) {
313
- if (!empty($reply_to)) {
314
- $this->reply_to = new mail_bank_manage_email_address($reply_to);
315
- }
316
  }
317
 
318
  function mb_set_messageid($message_id) {
319
- $this->message_id = $message_id;
320
  }
321
 
322
  function mb_set_date($date) {
323
- $this->date = $date;
324
  }
325
 
326
  public function mb_get_headers() {
327
- return $this->headers;
328
  }
329
 
330
  public function mb_get_boundary() {
331
- return $this->boundary;
332
  }
333
 
334
  public function mb_get_to_recipients() {
335
- return $this->to_recipients;
336
  }
337
 
338
  public function mb_get_cc_recipients() {
339
- return $this->cc_recipients;
340
  }
341
 
342
  public function mb_get_bcc_recipients() {
343
- return $this->bcc_recipients;
344
  }
345
 
346
  public function mb_get_reply_to() {
347
- return $this->reply_to;
348
  }
349
 
350
  public function mb_get_date() {
351
- return $this->date;
352
  }
353
 
354
  public function mb_get_message_id() {
355
- return $this->message_id;
356
  }
357
 
358
  public function mb_get_subject() {
359
- return $this->subject;
360
  }
361
 
362
  public function mb_get_body() {
363
- return $this->body;
364
  }
365
 
366
  public function mb_get_body_textPart() {
367
- return $this->body_textpart;
368
  }
369
 
370
  public function mb_get_body_html_part() {
371
- return $this->body_htmlpart;
372
  }
373
 
374
  }
13
  const EOL = "\r\n";
14
 
15
  public
16
+ $from,
17
+ $reply_to,
18
+ $to_recipients,
19
+ $cc_recipients,
20
+ $bcc_recipients,
21
+ $subject,
22
+ $body,
23
+ $body_textpart,
24
+ $body_htmlpart,
25
+ $headers,
26
+ $attachments,
27
+ $date,
28
+ $message_id,
29
+ $content_type,
30
+ $charset,
31
+ $boundary;
32
 
33
  // Constructor
34
  function __construct() {
35
+ $this->headers = array();
36
+ $this->to_recipients = array();
37
+ $this->cc_recipients = array();
38
+ $this->bcc_recipients = array();
39
  }
40
 
41
  // public static function getinstance()
49
  // }
50
 
51
  public function check_email_body_parts_mail_bank() {
52
+ return empty($this->body_textpart) && empty($this->body_htmlpart);
53
  }
54
 
55
  public function validate_email_contents_mail_bank($transport) {
56
+ $this->validate_email_headers_mail_bank();
57
  }
58
 
59
  // This function create body parts based on content type
60
  public function createBodyParts() {
61
+ if (false !== stripos($this->content_type, "multipart") && !empty($this->boundary)) {
62
+ $this->content_type = sprintf("%s;\r\n\t boundary=\"%s\"", $this->content_type, $this->mb_get_boundary());
63
+ }
64
+
65
+ $body = $this->mb_get_body();
66
+ $content_type = $this->mb_get_content_type();
67
+ if ($content_type == "") {
68
+ $content_type = apply_filters("wp_mail_content_type", $content_type);
69
+ }
70
+ if (substr($content_type, 0, 9) === "text/html") {
71
+ $this->mb_set_body_htmlPart($body);
72
+ } else if (substr($content_type, 0, 10) === "text/plain") {
73
+ $this->mb_set_body_textpart($body);
74
+ } else if (substr($content_type, 0, 21) === "multipart/alternative") {
75
+ $arr = explode(PHP_EOL, $body);
76
+ $textBody = "";
77
+ $htmlBody = "";
78
+ $mode = "";
79
+ foreach ($arr as $s) {
80
+ if (substr($s, 0, 25) === "Content-Type: text/plain;") {
81
+ $mode = "foundText";
82
+ } else if (substr($s, 0, 24) === "Content-Type: text/html;") {
83
+ $mode = "foundHtml";
84
+ } else if ($mode == "textReading") {
85
+ $textBody .= $s;
86
+ } else if ($mode == "htmlReading") {
87
+ $htmlBody .= $s;
88
+ } else if ($mode == "foundText") {
89
+ $trim = trim($s);
90
+ if (empty($trim)) {
91
+ $mode = "textReading";
92
+ }
93
+ } else if ($mode == "foundHtml") {
94
+ $trim = trim($s);
95
+ if (empty($trim)) {
96
+ $mode = "htmlReading";
97
+ }
98
+ }
99
+ }
100
+ $this->mb_set_body_htmlPart($htmlBody);
101
+ $this->mb_set_body_textpart($textBody);
102
+ } else {
103
+ $this->mb_set_body_textpart($body);
104
+ }
105
  }
106
 
107
  // This function validate email headers
108
  public function validate_email_headers_mail_bank() {
109
+ if (isset($this->reply_to)) {
110
+ $this->mb_get_reply_to()->validate_email_contents_mail_bank("Reply-To");
111
+ }
112
 
113
+ // validate the from address
114
+ $this->get_email_address_mail_bank()->validate_email_contents_mail_bank("From");
115
 
116
+ // validate the to recipients
117
+ foreach ((array) $this->mb_get_to_recipients() as $to_address) {
118
+ $to_address->validate_email_contents_mail_bank("To");
119
+ }
120
 
121
+ // validate the cc recipients
122
+ foreach ((array) $this->mb_get_cc_recipients() as $cc_address) {
123
+ $cc_address->validate_email_contents_mail_bank("Cc");
124
+ }
125
 
126
+ // validate the bcc recipients
127
+ foreach ((array) $this->mb_get_bcc_recipients() as $bcc_address) {
128
+ $bcc_address->validate_email_contents_mail_bank("Bcc");
129
+ }
130
  }
131
 
132
  public function get_email_address_mail_bank() {
133
+ return $this->from;
134
  }
135
 
136
  // Get the charset.
137
  public function mb_get_charset() {
138
+ return $this->charset;
139
  }
140
 
141
  // Set the charset
142
  public function mb_set_charset($charset) {
143
+ $this->charset = $charset;
144
  }
145
 
146
  // Get the content type
147
  public function mb_get_content_type() {
148
+ return $this->content_type;
149
  }
150
 
151
  public function mb_set_content_type($content_type) {
152
+ $this->content_type = $content_type;
153
  }
154
 
155
  public function mb_addto($to) {
156
+ $this->mb_add_recipients($this->to_recipients, $to);
157
  }
158
 
159
  public function mb_add_cc($cc) {
160
+ $this->mb_add_recipients($this->cc_recipients, $cc);
161
  }
162
 
163
  public function mb_add_bcc($bcc) {
164
+ $this->mb_add_recipients($this->bcc_recipients, $bcc);
165
  }
166
 
167
  public function mb_add_recipients(&$all_recipients, $recipients) {
168
+ if (!empty($recipients)) {
169
+ $recipients = mail_bank_manage_email_address::convert_string_to_array_mail_bank($recipients);
170
+ foreach ($recipients as $recipient) {
171
+ if (!empty($recipient)) {
172
+ array_push($all_recipients, new mail_bank_manage_email_address($recipient));
173
+ }
174
+ }
175
+ }
176
  }
177
 
178
  // This function add headers
179
  public function mb_add_headers($headers) {
180
+ if (!is_array($headers)) {
181
+ $headers = explode("\n", str_replace("\r\n", "\n", $headers));
182
+ }
183
+ foreach ($headers as $header) {
184
+ if (!empty($header)) {
185
+ if (strpos($header, ":") === false) {
186
+ if (false !== stripos($header, "boundary=")) {
187
+ $parts = preg_split("/boundary=/i", trim($header));
188
+ $this->boundary = trim(str_replace(array(
189
+ "'",
190
+ '"'
191
+ ), '', $parts [1]));
192
+ }
193
+ continue;
194
+ }
195
+ list($name, $content) = explode(":", trim($header), 2);
196
+ $this->mb_process_header($name, $content);
197
+ }
198
+ }
199
  }
200
 
201
  // This function process headers
202
  public function mb_process_header($name, $content) {
203
+ $name = trim($name);
204
+ $content = trim($content);
205
+ switch (strtolower($name)) {
206
+ case "content-type" :
207
+ if (strpos($content, ";") !== false) {
208
+ list($type, $charset) = explode(";", $content);
209
+ $this->mb_set_content_type(trim($type));
210
+ if (false !== stripos($charset, "charset=")) {
211
+ $charset = trim(str_replace(array(
212
+ 'charset=',
213
+ '"'
214
+ ), '', $charset));
215
+ } elseif (false !== stripos($charset, "boundary=")) {
216
+ $this->boundary = trim(str_replace(array(
217
+ 'BOUNDARY=',
218
+ 'boundary=',
219
+ '"'
220
+ ), '', $charset));
221
+ $charset = '';
222
+ }
223
+ if (!empty($charset)) {
224
+ $this->mb_set_charset($charset);
225
+ }
226
+ } else {
227
+ $this->mb_set_content_type(trim($content));
228
+ }
229
+ break;
230
+ case "to" :
231
+ $this->mb_addto($content);
232
+ break;
233
+ case "cc" :
234
+ $this->mb_add_cc($content);
235
+ break;
236
+ case "bcc" :
237
+ $this->mb_add_bcc($content);
238
+ break;
239
+ case "from" :
240
+ $this->mb_set_from($content);
241
+ break;
242
+ case "subject" :
243
+ $this->mb_set_subject($content);
244
+ break;
245
+ case "reply-to" :
246
+ $this->mb_set_replyto($content);
247
+ break;
248
+ case "sender" :
249
+ break;
250
+ case "return-path" :
251
+ break;
252
+ case "date" :
253
+ $this->mb_set_date($content);
254
+ break;
255
+ case "message-id" :
256
+ $this->mb_set_messageid($content);
257
+ break;
258
+ default :
259
+ array_push($this->headers, array(
260
+ "name" => $name,
261
+ "content" => $content
262
+ ));
263
+ break;
264
+ }
265
  }
266
 
267
  // Add attachments to the message
268
  public function mb_add_attachments_to_mail(mail_bank_Zend_Mail $mail) {
269
+ $attachments = $this->attachments;
270
+ if (!is_array($attachments)) {
271
+ $attributes_array = explode(PHP_EOL, $attachments);
272
+ } else {
273
+ $attributes_array = $attachments;
274
+ }
275
+ foreach ($attributes_array as $file) {
276
+ if (file_exists($file)) {
277
+ $at = new mail_bank_Zend_Mime_Part(file_get_contents($file));
278
+ $at->disposition = mail_bank_Zend_Mime::DISPOSITION_ATTACHMENT;
279
+ $at->encoding = mail_bank_Zend_Mime::ENCODING_BASE64;
280
+ $at->filename = basename($file);
281
+ $mail->addAttachment($at);
282
+ }
283
+ }
284
  }
285
 
286
  function mb_set_body($body) {
287
+ $this->body = $body;
288
  }
289
 
290
  function mb_set_body_textpart($body_textpart) {
291
+ $this->body_textpart = $body_textpart;
292
  }
293
 
294
  function mb_set_body_htmlPart($body_htmlpart) {
295
+ $this->body_htmlpart = $body_htmlpart;
296
  }
297
 
298
  function mb_set_subject($subject) {
299
+ $this->subject = $subject;
300
  }
301
 
302
  function mb_set_attachments($attachments) {
303
+ $this->attachments = $attachments;
304
  }
305
 
306
  function mb_set_from($email, $name = null) {
307
+ if (!empty($email)) {
308
+ $this->from = new mail_bank_manage_email_address($email, $name);
309
+ }
310
  }
311
 
312
  function mb_set_replyto($reply_to) {
313
+ if (!empty($reply_to)) {
314
+ $this->reply_to = new mail_bank_manage_email_address($reply_to);
315
+ }
316
  }
317
 
318
  function mb_set_messageid($message_id) {
319
+ $this->message_id = $message_id;
320
  }
321
 
322
  function mb_set_date($date) {
323
+ $this->date = $date;
324
  }
325
 
326
  public function mb_get_headers() {
327
+ return $this->headers;
328
  }
329
 
330
  public function mb_get_boundary() {
331
+ return $this->boundary;
332
  }
333
 
334
  public function mb_get_to_recipients() {
335
+ return $this->to_recipients;
336
  }
337
 
338
  public function mb_get_cc_recipients() {
339
+ return $this->cc_recipients;
340
  }
341
 
342
  public function mb_get_bcc_recipients() {
343
+ return $this->bcc_recipients;
344
  }
345
 
346
  public function mb_get_reply_to() {
347
+ return $this->reply_to;
348
  }
349
 
350
  public function mb_get_date() {
351
+ return $this->date;
352
  }
353
 
354
  public function mb_get_message_id() {
355
+ return $this->message_id;
356
  }
357
 
358
  public function mb_get_subject() {
359
+ return $this->subject;
360
  }
361
 
362
  public function mb_get_body() {
363
+ return $this->body;
364
  }
365
 
366
  public function mb_get_body_textPart() {
367
+ return $this->body_textpart;
368
  }
369
 
370
  public function mb_get_body_html_part() {
371
+ return $this->body_htmlpart;
372
  }
373
 
374
  }
includes/mail-bank-manage-token.php CHANGED
@@ -8,76 +8,76 @@ if (!class_exists("mail_bank_manage_token")) {
8
  class mail_bank_manage_token {
9
 
10
  public
11
- $vendor_name,
12
- $access_token,
13
- $refresh_token,
14
- $expiry_time;
15
 
16
  public function __construct() {
17
- $this->get_token_mail_bank();
18
  }
19
 
20
  public static function get_instance() {
21
- static $instance = null;
22
- if ($instance === null) {
23
- $instance = new mail_bank_manage_token();
24
- }
25
- return $instance;
26
  }
27
 
28
  public function isValid() {
29
- $access_token = $this->retrieve_access_token_mail_bank();
30
- $refresh_token = $this->retrieve_refresh_token_mail_bank();
31
- return !(empty($access_token) || empty($refresh_token));
32
  }
33
 
34
  public function get_token_mail_bank() {
35
- $oauth_token = get_option("mail_bank_auth");
36
- $this->set_access_token_mail_bank($oauth_token["access_token"]);
37
- $this->set_refresh_token_mail_bank($oauth_token["refresh_token"]);
38
- $this->set_token_expirytime_mail_bank($oauth_token["auth_token_expires"]);
39
- $this->set_vendorname_mail_bank($oauth_token["vendor_name"]);
40
  }
41
 
42
  // Save the mail bank oauth token properties to the database
43
  public function save_token_mail_bank() {
44
- $oauth_token["access_token"] = $this->retrieve_access_token_mail_bank();
45
- $oauth_token["refresh_token"] = $this->retrieve_refresh_token_mail_bank();
46
- $oauth_token["auth_token_expires"] = $this->retrieve_token_expiry_time_mail_bank();
47
- $oauth_token["vendor_name"] = $this->get_vendor_mail_bank();
48
- update_option("mail_bank_auth", $oauth_token);
49
  }
50
 
51
  public function get_vendor_mail_bank() {
52
- return $this->vendor_name;
53
  }
54
 
55
  public function retrieve_token_expiry_time_mail_bank() {
56
- return $this->expiry_time;
57
  }
58
 
59
  public function retrieve_access_token_mail_bank() {
60
- return $this->access_token;
61
  }
62
 
63
  public function retrieve_refresh_token_mail_bank() {
64
- return $this->refresh_token;
65
  }
66
 
67
  public function set_vendorname_mail_bank($name) {
68
- $this->vendor_name = esc_html($name);
69
  }
70
 
71
  public function set_token_expirytime_mail_bank($time) {
72
- $this->expiry_time = esc_html($time);
73
  }
74
 
75
  public function set_access_token_mail_bank($token) {
76
- $this->access_token = esc_html($token);
77
  }
78
 
79
  public function set_refresh_token_mail_bank($token) {
80
- $this->refresh_token = esc_html($token);
81
  }
82
 
83
  }
8
  class mail_bank_manage_token {
9
 
10
  public
11
+ $vendor_name,
12
+ $access_token,
13
+ $refresh_token,
14
+ $expiry_time;
15
 
16
  public function __construct() {
17
+ $this->get_token_mail_bank();
18
  }
19
 
20
  public static function get_instance() {
21
+ static $instance = null;
22
+ if ($instance === null) {
23
+ $instance = new mail_bank_manage_token();
24
+ }
25
+ return $instance;
26
  }
27
 
28
  public function isValid() {
29
+ $access_token = $this->retrieve_access_token_mail_bank();
30
+ $refresh_token = $this->retrieve_refresh_token_mail_bank();
31
+ return !(empty($access_token) || empty($refresh_token));
32
  }
33
 
34
  public function get_token_mail_bank() {
35
+ $oauth_token = get_option("mail_bank_auth");
36
+ $this->set_access_token_mail_bank($oauth_token["access_token"]);
37
+ $this->set_refresh_token_mail_bank($oauth_token["refresh_token"]);
38
+ $this->set_token_expirytime_mail_bank($oauth_token["auth_token_expires"]);
39
+ $this->set_vendorname_mail_bank($oauth_token["vendor_name"]);
40
  }
41
 
42
  // Save the mail bank oauth token properties to the database
43
  public function save_token_mail_bank() {
44
+ $oauth_token["access_token"] = $this->retrieve_access_token_mail_bank();
45
+ $oauth_token["refresh_token"] = $this->retrieve_refresh_token_mail_bank();
46
+ $oauth_token["auth_token_expires"] = $this->retrieve_token_expiry_time_mail_bank();
47
+ $oauth_token["vendor_name"] = $this->get_vendor_mail_bank();
48
+ update_option("mail_bank_auth", $oauth_token);
49
  }
50
 
51
  public function get_vendor_mail_bank() {
52
+ return $this->vendor_name;
53
  }
54
 
55
  public function retrieve_token_expiry_time_mail_bank() {
56
+ return $this->expiry_time;
57
  }
58
 
59
  public function retrieve_access_token_mail_bank() {
60
+ return $this->access_token;
61
  }
62
 
63
  public function retrieve_refresh_token_mail_bank() {
64
+ return $this->refresh_token;
65
  }
66
 
67
  public function set_vendorname_mail_bank($name) {
68
+ $this->vendor_name = esc_html($name);
69
  }
70
 
71
  public function set_token_expirytime_mail_bank($time) {
72
+ $this->expiry_time = esc_html($time);
73
  }
74
 
75
  public function set_access_token_mail_bank($token) {
76
+ $this->access_token = esc_html($token);
77
  }
78
 
79
  public function set_refresh_token_mail_bank($token) {
80
+ $this->refresh_token = esc_html($token);
81
  }
82
 
83
  }
includes/mail-bank-send-mail.php CHANGED
@@ -21,136 +21,136 @@ if (!class_exists("mail_bank_send_mail")) {
21
  class mail_bank_send_mail {
22
 
23
  public
24
- $exception,
25
- $configuration_settings,
26
- $obj_mail_bank_register_transport;
27
 
28
  public function __construct() {
29
- $obj_mb_config_provider = new mail_bank_configuration_provider();
30
- $this->obj_mail_bank_register_transport = new mail_bank_register_transport();
31
- $this->configuration_settings = $obj_mb_config_provider->get_configuration_settings();
32
  }
33
 
34
  // This function is used to send the message and return the result.
35
  public function send_email_message_mail_bank($to, $subject, $message, $headers = "", $attachments = array(), $email_configuration_settings) {
36
- $mail_bank_manage_email = $this->build_message_mail_bank($to, $subject, $message, $headers, $attachments);
37
 
38
- $log = new mail_bank_email_log();
39
- $log->email_to = $to;
40
- $log->email_subject = $subject;
41
- $log->email_message = $message;
42
- $log->email_headers = $headers;
43
 
44
- return $this->get_message_content_mail_bank($mail_bank_manage_email, $log, $email_configuration_settings);
45
  }
46
 
47
  // This function is used to build a message based on the wordPress wp_mail parameters.
48
  public function build_message_mail_bank($to, $subject, $message, $headers, $attachments) {
49
- if (!is_array($attachments)) {
50
- $attachments = explode("\n", str_replace("\r\n", "\n", $attachments));
51
- }
52
 
53
- // Creates the message
54
- $mail_bank_manage_email = $this->create_message_mail_bank();
55
- $this->get_entire_message_content_mail_bank($mail_bank_manage_email, $to, $subject, $message, $headers, $attachments);
56
 
57
- // Return the message
58
- return $mail_bank_manage_email;
59
  }
60
 
61
  // This function is used to create the instance of mail_bank_manage_email.
62
  public function create_message_mail_bank() {
63
- $message = new mail_bank_manage_email();
64
- $transport = $this->obj_mail_bank_register_transport->retrieve_mailertype_mail_bank();
65
- $message->mb_set_from($this->configuration_settings["email_address"], html_entity_decode($this->configuration_settings["sender_name"], ENT_QUOTES));
66
- $message->mb_set_charset(get_bloginfo("charset"));
67
- return $message;
68
  }
69
 
70
  // This function is used to get the options and token generated to send the message
71
  public function get_message_content_mail_bank(mail_bank_manage_email $message, mail_bank_email_log $log, $email_configuration_settings) {
72
- global $wpdb;
73
- $mail_bank_settings_data = $wpdb->get_row
74
- (
75
- $wpdb->prepare
76
- (
77
- "SELECT meta_value FROM " . mail_bank_meta() .
78
- " WHERE meta_key = %s", "settings"
79
- )
80
- );
81
-
82
- $settings_data = maybe_unserialize($mail_bank_settings_data->meta_value);
83
- $ob_mb_config_provider = new mail_bank_configuration_provider();
84
- $this->configuration_settings = $ob_mb_config_provider->get_configuration_settings();
85
- $authorization_token = mail_bank_manage_token::get_instance();
86
-
87
- $transport = $this->obj_mail_bank_register_transport->retrieve_mailertype_mail_bank();
88
- $engine = $transport->initiate_mail_engine_mail_bank();
89
-
90
- if ($message->check_email_body_parts_mail_bank()) {
91
- $message->createBodyParts();
92
- }
93
- $obj_mail_bank_manage_email = new mail_bank_manage_email();
94
-
95
- try {
96
- $message->validate_email_contents_mail_bank($transport);
97
-
98
- if ($this->configuration_settings["auth_type"] == "oauth2") {
99
- $this->check_authtoken_mail_bank($transport, $authorization_token);
100
- }
101
- $engine->send_email_mail_bank($message);
102
-
103
- // writes the log on success.
104
- if ($engine->get_output_mail_bank() != "" && $settings_data["debug_mode"] == "enable") {
105
- update_option("mail_bank_mail_status", $engine->get_output_mail_bank());
106
- } else {
107
- update_option("mail_bank_mail_status", true);
108
- }
109
- $obj_mb_log_writter = new mail_bank_email_log_writter();
110
- update_option("mail_bank_is_mail_sent", "Sent");
111
- if ($settings_data["monitor_email_logs"] == "enable") {
112
- $obj_mb_log_writter->mb_success_log($log, $message, $settings_data["debug_mode"], $email_configuration_settings, $obj_mail_bank_manage_email);
113
- }
114
- return true;
115
- } catch (Exception $e) {
116
- $this->exception = $e;
117
- // Writes the log on failure
118
- if ($e->getCode() == 334 && $settings_data["debug_mode"] == "enable") {
119
- update_option("mail_bank_mail_status", $e->getMessage());
120
- } elseif ($engine->get_output_mail_bank() != "" && $settings_data["debug_mode"] == "enable") {
121
- update_option("mail_bank_mail_status", $engine->get_output_mail_bank());
122
- } elseif ($engine->get_output_mail_bank() == "" && $settings_data["debug_mode"] == "enable") {
123
- update_option("mail_bank_mail_status", $e->getMessage());
124
- } else {
125
- update_option("mail_bank_mail_status", false);
126
- }
127
- $obj_mb_log_writter = new mail_bank_email_log_writter();
128
- update_option("mail_bank_is_mail_sent", "Not Sent");
129
- if ($settings_data["monitor_email_logs"] == "enable") {
130
- $obj_mb_log_writter->mb_failure_log($log, $message, $settings_data["debug_mode"], $email_configuration_settings, $obj_mail_bank_manage_email);
131
- }
132
- return false;
133
- }
134
  }
135
 
136
  // This function is used to ensure the token is updated.
137
  public function check_authtoken_mail_bank($transport, $authorization_token) {
138
- $authentication_manager = new authentication_manager_mail_bank();
139
- $obj_authentication_manager_mail_bank = $authentication_manager->create_authentication_manager();
140
- if ($obj_authentication_manager_mail_bank->check_access_token()) {
141
- $obj_authentication_manager_mail_bank->get_refresh_token();
142
- $authorization_token->save_token_mail_bank();
143
- }
144
  }
145
 
146
  // This function is used to set all the content into a message.
147
  public function get_entire_message_content_mail_bank($message, $to, $subject, $body, $headers, $attachments) {
148
- $message->mb_add_headers($headers);
149
- $message->mb_set_body($body);
150
- $message->mb_set_subject($subject);
151
- $message->mb_addto($to);
152
- $message->mb_set_attachments($attachments);
153
- return $message;
154
  }
155
 
156
  }
21
  class mail_bank_send_mail {
22
 
23
  public
24
+ $exception,
25
+ $configuration_settings,
26
+ $obj_mail_bank_register_transport;
27
 
28
  public function __construct() {
29
+ $obj_mb_config_provider = new mail_bank_configuration_provider();
30
+ $this->obj_mail_bank_register_transport = new mail_bank_register_transport();
31
+ $this->configuration_settings = $obj_mb_config_provider->get_configuration_settings();
32
  }
33
 
34
  // This function is used to send the message and return the result.
35
  public function send_email_message_mail_bank($to, $subject, $message, $headers = "", $attachments = array(), $email_configuration_settings) {
36
+ $mail_bank_manage_email = $this->build_message_mail_bank($to, $subject, $message, $headers, $attachments);
37
 
38
+ $log = new mail_bank_email_log();
39
+ $log->email_to = $to;
40
+ $log->email_subject = $subject;
41
+ $log->email_message = $message;
42
+ $log->email_headers = $headers;
43
 
44
+ return $this->get_message_content_mail_bank($mail_bank_manage_email, $log, $email_configuration_settings);
45
  }
46
 
47
  // This function is used to build a message based on the wordPress wp_mail parameters.
48
  public function build_message_mail_bank($to, $subject, $message, $headers, $attachments) {
49
+ if (!is_array($attachments)) {
50
+ $attachments = explode("\n", str_replace("\r\n", "\n", $attachments));
51
+ }
52
 
53
+ // Creates the message
54
+ $mail_bank_manage_email = $this->create_message_mail_bank();
55
+ $this->get_entire_message_content_mail_bank($mail_bank_manage_email, $to, $subject, $message, $headers, $attachments);
56
 
57
+ // Return the message
58
+ return $mail_bank_manage_email;
59
  }
60
 
61
  // This function is used to create the instance of mail_bank_manage_email.
62
  public function create_message_mail_bank() {
63
+ $message = new mail_bank_manage_email();
64
+ $transport = $this->obj_mail_bank_register_transport->retrieve_mailertype_mail_bank();
65
+ $message->mb_set_from($this->configuration_settings["email_address"], html_entity_decode($this->configuration_settings["sender_name"], ENT_QUOTES));
66
+ $message->mb_set_charset(get_bloginfo("charset"));
67
+ return $message;
68
  }
69
 
70
  // This function is used to get the options and token generated to send the message
71
  public function get_message_content_mail_bank(mail_bank_manage_email $message, mail_bank_email_log $log, $email_configuration_settings) {
72
+ global $wpdb;
73
+ $mail_bank_settings_data = $wpdb->get_row
74
+ (
75
+ $wpdb->prepare
76
+ (
77
+ "SELECT meta_value FROM " . mail_bank_meta() .
78
+ " WHERE meta_key = %s", "settings"
79
+ )
80
+ );
81
+
82
+ $settings_data = maybe_unserialize($mail_bank_settings_data->meta_value);
83
+ $ob_mb_config_provider = new mail_bank_configuration_provider();
84
+ $this->configuration_settings = $ob_mb_config_provider->get_configuration_settings();
85
+ $authorization_token = mail_bank_manage_token::get_instance();
86
+
87
+ $transport = $this->obj_mail_bank_register_transport->retrieve_mailertype_mail_bank();
88
+ $engine = $transport->initiate_mail_engine_mail_bank();
89
+
90
+ if ($message->check_email_body_parts_mail_bank()) {
91
+ $message->createBodyParts();
92
+ }
93
+ $obj_mail_bank_manage_email = new mail_bank_manage_email();
94
+
95
+ try {
96
+ $message->validate_email_contents_mail_bank($transport);
97
+
98
+ if ($this->configuration_settings["auth_type"] == "oauth2") {
99
+ $this->check_authtoken_mail_bank($transport, $authorization_token);
100
+ }
101
+ $engine->send_email_mail_bank($message);
102
+
103
+ // writes the log on success.
104
+ if ($engine->get_output_mail_bank() != "" && $settings_data["debug_mode"] == "enable") {
105
+ update_option("mail_bank_mail_status", $engine->get_output_mail_bank());
106
+ } else {
107
+ update_option("mail_bank_mail_status", true);
108
+ }
109
+ $obj_mb_log_writter = new mail_bank_email_log_writter();
110
+ update_option("mail_bank_is_mail_sent", "Sent");
111
+ if ($settings_data["monitor_email_logs"] == "enable") {
112
+ $obj_mb_log_writter->mb_success_log($log, $message, $settings_data["debug_mode"], $email_configuration_settings, $obj_mail_bank_manage_email);
113
+ }
114
+ return true;
115
+ } catch (Exception $e) {
116
+ $this->exception = $e;
117
+ // Writes the log on failure
118
+ if ($e->getCode() == 334 && $settings_data["debug_mode"] == "enable") {
119
+ update_option("mail_bank_mail_status", $e->getMessage());
120
+ } elseif ($engine->get_output_mail_bank() != "" && $settings_data["debug_mode"] == "enable") {
121
+ update_option("mail_bank_mail_status", $engine->get_output_mail_bank());
122
+ } elseif ($engine->get_output_mail_bank() == "" && $settings_data["debug_mode"] == "enable") {
123
+ update_option("mail_bank_mail_status", $e->getMessage());
124
+ } else {
125
+ update_option("mail_bank_mail_status", false);
126
+ }
127
+ $obj_mb_log_writter = new mail_bank_email_log_writter();
128
+ update_option("mail_bank_is_mail_sent", "Not Sent");
129
+ if ($settings_data["monitor_email_logs"] == "enable") {
130
+ $obj_mb_log_writter->mb_failure_log($log, $message, $settings_data["debug_mode"], $email_configuration_settings, $obj_mail_bank_manage_email);
131
+ }
132
+ return false;
133
+ }
134
  }
135
 
136
  // This function is used to ensure the token is updated.
137
  public function check_authtoken_mail_bank($transport, $authorization_token) {
138
+ $authentication_manager = new authentication_manager_mail_bank();
139
+ $obj_authentication_manager_mail_bank = $authentication_manager->create_authentication_manager();
140
+ if ($obj_authentication_manager_mail_bank->check_access_token()) {
141
+ $obj_authentication_manager_mail_bank->get_refresh_token();
142
+ $authorization_token->save_token_mail_bank();
143
+ }
144
  }
145
 
146
  // This function is used to set all the content into a message.
147
  public function get_entire_message_content_mail_bank($message, $to, $subject, $body, $headers, $attachments) {
148
+ $message->mb_add_headers($headers);
149
+ $message->mb_set_body($body);
150
+ $message->mb_set_subject($subject);
151
+ $message->mb_addto($to);
152
+ $message->mb_set_attachments($attachments);
153
+ return $message;
154
  }
155
 
156
  }
includes/mail-bank-smtp-transport.php CHANGED
@@ -23,9 +23,9 @@ class mail_bank_smtp_transport {
23
  public function initiate_zendmail_transport_mail_bank($fake_hostname, $fake_config) {
24
  $obj_mb_configure_transport = new mail_bank_configure_transport();
25
  if ($this->configuration_settings["auth_type"] == "oauth2") {
26
- $config = $obj_mb_configure_transport->configure_oauth_transport();
27
  } else {
28
- $config = $obj_mb_configure_transport->configure_plain_transport();
29
  }
30
  return new mail_bank_Zend_Mail_Transport_Smtp($this->configuration_settings["hostname"], $config);
31
  }
23
  public function initiate_zendmail_transport_mail_bank($fake_hostname, $fake_config) {
24
  $obj_mb_configure_transport = new mail_bank_configure_transport();
25
  if ($this->configuration_settings["auth_type"] == "oauth2") {
26
+ $config = $obj_mb_configure_transport->configure_oauth_transport();
27
  } else {
28
+ $config = $obj_mb_configure_transport->configure_plain_transport();
29
  }
30
  return new mail_bank_Zend_Mail_Transport_Smtp($this->configuration_settings["hostname"], $config);
31
  }
includes/mail-bank-zend-engine.php CHANGED
@@ -84,163 +84,163 @@ if (!class_exists("mail_bank_zend_engine")) {
84
  class mail_bank_zend_engine {
85
 
86
  public
87
- $transcript,
88
- $mail_bank_options,
89
- $transport;
90
 
91
  function __construct($transport) {
92
- $this->transport = $transport;
93
- $mb_config_provider_obj = new mail_bank_configuration_provider();
94
- $this->mail_bank_options = $mb_config_provider_obj->get_configuration_settings();
95
  }
96
 
97
  // This Function is used to send Email.
98
  public function send_email_mail_bank(mail_bank_manage_email $message) {
99
- $envelope_from = new mail_bank_manage_email_address($this->mail_bank_options["email_address"]);
100
- $envelope_from->validate_email_contents_mail_bank("Envelope From");
101
- $charset = $message->mb_get_charset();
102
- $mail = new mail_bank_Zend_Mail($charset);
103
-
104
- // Add headers
105
- foreach ((array) $message->mb_get_headers() as $header) {
106
- $mail->addHeader($header["name"], $header["content"], true);
107
- }
108
-
109
- $content_type = $message->mb_get_content_type();
110
- if (!empty($content_type)) {
111
- $mail->addHeader("Content-Type", $content_type, false);
112
- }
113
-
114
- // Add the from header
115
- $fromHeader = $this->get_sender_from_email_mail_bank($message, $mail);
116
- $mail->addHeader("Sender", $this->mail_bank_options["email_address"], false);
117
-
118
- // Add to recipients
119
- foreach ((array) $message->mb_get_to_recipients() as $recipient) {
120
- $mail->addTo($recipient->mb_get_email(), $recipient->mb_get_name());
121
- }
122
-
123
- // Add cc recipients
124
- if ($this->mail_bank_options["cc"] == "") {
125
- foreach ((array) $message->mb_get_cc_recipients() as $recipient) {
126
- $mail->addCc($recipient->mb_get_email(), $recipient->mb_get_name());
127
- }
128
- } else {
129
- $cc_address_array = explode(",", $this->mail_bank_options["cc"]);
130
- foreach ($cc_address_array as $cc_address) {
131
- $mail->addCc($cc_address);
132
- }
133
- }
134
-
135
-
136
- // Add bcc recepients
137
- if ($this->mail_bank_options["bcc"] == "") {
138
- foreach ((array) $message->mb_get_bcc_recipients() as $recipient) {
139
- $mail->addBcc($recipient->mb_get_email(), $recipient->mb_get_name());
140
- }
141
- } else {
142
- $bcc_address_array = explode(",", $this->mail_bank_options["bcc"]);
143
- foreach ($bcc_address_array as $bcc_address) {
144
- $mail->addBcc($bcc_address);
145
- }
146
- }
147
-
148
- // Add reply to
149
- $reply_to = $message->mb_get_reply_to();
150
- if ($this->mail_bank_options["reply_to"] != "") {
151
- $mail->setReplyTo($this->mail_bank_options["reply_to"]);
152
- } elseif (isset($reply_to)) {
153
- $mail->setReplyTo($reply_to->mb_get_email());
154
- }
155
-
156
- // Add date
157
- $date = $message->mb_get_date();
158
- if (!empty($date)) {
159
- $mail->setDate($date);
160
- }
161
-
162
- // Add message id
163
- $message_id = $message->mb_get_message_id();
164
- if (!empty($message_id)) {
165
- $mail->setMessageId($message_id);
166
- }
167
-
168
- // Add subject of the email
169
- if (null !== $message->mb_get_subject()) {
170
- $mail->setSubject($message->mb_get_subject());
171
- }
172
-
173
- // Add message content of the email
174
- //{
175
- $text_part = $message->mb_get_body_textPart();
176
- if (!empty($text_part)) {
177
- $mail->setBodyText($text_part);
178
- }
179
- $html_part = $message->mb_get_body_html_part();
180
- if (!empty($html_part)) {
181
- $mail->setBodyHtml($html_part);
182
- }
183
- //}
184
- // Add attachments to the email
185
- $message->mb_add_attachments_to_mail($mail);
186
-
187
- // Create the SMTP transport
188
- $zend_transport = $this->transport->initiate_zendmail_transport_mail_bank($this->mail_bank_options["hostname"], array());
189
- try {
190
- // Send the message
191
- $mail->send($zend_transport);
192
- if ($zend_transport->getConnection() && !mail_bank_zend_mail_helper::check_field_mail_bank($zend_transport->getConnection()->getLog())) {
193
- $this->transcript = $zend_transport->getConnection()->getLog();
194
- } else if (method_exists($zend_transport, "get_output_mail_bank") && !mail_bank_zend_mail_helper::check_field_mail_bank($zend_transport->get_output_mail_bank())) {
195
- // use the API response
196
- $this->transcript = $zend_transport->get_output_mail_bank();
197
- } else if (method_exists($zend_transport, "getMessage") && !mail_bank_zend_mail_helper::check_field_mail_bank($zend_transport->getMessage())) {
198
- //use the raw message as the transcript
199
- $this->transcript = $zend_transport->getMessage();
200
- }
201
- } catch (Exception $e) {
202
- // In case of Error
203
- if ($zend_transport->getConnection() && !mail_bank_zend_mail_helper::check_field_mail_bank($zend_transport->getConnection()->getLog())) {
204
- $this->transcript = $zend_transport->getConnection()->getLog();
205
- } else if (method_exists($zend_transport, "get_output_mail_bank") && !mail_bank_zend_mail_helper::check_field_mail_bank($zend_transport->get_output_mail_bank())) {
206
- // Use API response
207
- $this->transcript = $zend_transport->get_output_mail_bank();
208
- } else if (method_exists($zend_transport, "getMessage") && !mail_bank_zend_mail_helper::check_field_mail_bank($zend_transport->getMessage())) {
209
- // Use message as the transcript
210
- $this->transcript = $zend_transport->getMessage();
211
- }
212
-
213
- // Get the current exception message
214
- $message = $e->getMessage();
215
- if ($e->getCode() == 334) {
216
- $message = "From Email should be of same account used to create the Client Id.";
217
- }
218
- $exception = new Exception($message, $e->getCode());
219
- // Throws the new exception
220
- throw $exception;
221
- }
222
  }
223
 
224
  // This function is used to get the sender from mail_bank_manage_email and add it to the mail_bank_Zend_Mail object
225
  public function get_sender_from_email_mail_bank($message, $mail) {
226
- $sender = $message->get_email_address_mail_bank();
227
- $sender_email = $sender->mb_get_email();
228
- $sender_name = $sender->mb_get_name();
229
- if (($this->mail_bank_options["sender_name_configuration"] == "override") && ($this->mail_bank_options["from_email_configuration"] == "override")) {
230
- $mail->setFrom($this->mail_bank_options["sender_email"], html_entity_decode($this->mail_bank_options["sender_name"], ENT_QUOTES));
231
- } elseif (($this->mail_bank_options["sender_name_configuration"] == "dont_override") && ($this->mail_bank_options["from_email_configuration"] == "dont_override")) {
232
- $mail->setFrom($sender_email, $sender_name);
233
- } elseif (($this->mail_bank_options["sender_name_configuration"] == "override") && ($this->mail_bank_options["from_email_configuration"] == "dont_override")) {
234
- $mail->setFrom($sender_email, html_entity_decode($this->mail_bank_options["sender_name"], ENT_QUOTES));
235
- } else {
236
- $mail->setFrom($this->mail_bank_options["sender_email"], $sender_name);
237
- }
238
- return $sender;
239
  }
240
 
241
  // This funtion is used to return SMTP session Transcript.
242
  public function get_output_mail_bank() {
243
- return $this->transcript;
244
  }
245
 
246
  }
84
  class mail_bank_zend_engine {
85
 
86
  public
87
+ $transcript,
88
+ $mail_bank_options,
89
+ $transport;
90
 
91
  function __construct($transport) {
92
+ $this->transport = $transport;
93
+ $mb_config_provider_obj = new mail_bank_configuration_provider();
94
+ $this->mail_bank_options = $mb_config_provider_obj->get_configuration_settings();
95
  }
96
 
97
  // This Function is used to send Email.
98
  public function send_email_mail_bank(mail_bank_manage_email $message) {
99
+ $envelope_from = new mail_bank_manage_email_address($this->mail_bank_options["email_address"]);
100
+ $envelope_from->validate_email_contents_mail_bank("Envelope From");
101
+ $charset = $message->mb_get_charset();
102
+ $mail = new mail_bank_Zend_Mail($charset);
103
+
104
+ // Add headers
105
+ foreach ((array) $message->mb_get_headers() as $header) {
106
+ $mail->addHeader($header["name"], $header["content"], true);
107
+ }
108
+
109
+ $content_type = $message->mb_get_content_type();
110
+ if (!empty($content_type)) {
111
+ $mail->addHeader("Content-Type", $content_type, false);
112
+ }
113
+
114
+ // Add the from header
115
+ $fromHeader = $this->get_sender_from_email_mail_bank($message, $mail);
116
+ $mail->addHeader("Sender", $this->mail_bank_options["email_address"], false);
117
+
118
+ // Add to recipients
119
+ foreach ((array) $message->mb_get_to_recipients() as $recipient) {
120
+ $mail->addTo($recipient->mb_get_email(), $recipient->mb_get_name());
121
+ }
122
+
123
+ // Add cc recipients
124
+ if ($this->mail_bank_options["cc"] == "") {
125
+ foreach ((array) $message->mb_get_cc_recipients() as $recipient) {
126
+ $mail->addCc($recipient->mb_get_email(), $recipient->mb_get_name());
127
+ }
128
+ } else {
129
+ $cc_address_array = explode(",", $this->mail_bank_options["cc"]);
130
+ foreach ($cc_address_array as $cc_address) {
131
+ $mail->addCc($cc_address);
132
+ }
133
+ }
134
+
135
+
136
+ // Add bcc recepients
137
+ if ($this->mail_bank_options["bcc"] == "") {
138
+ foreach ((array) $message->mb_get_bcc_recipients() as $recipient) {
139
+ $mail->addBcc($recipient->mb_get_email(), $recipient->mb_get_name());
140
+ }
141
+ } else {
142
+ $bcc_address_array = explode(",", $this->mail_bank_options["bcc"]);
143
+ foreach ($bcc_address_array as $bcc_address) {
144
+ $mail->addBcc($bcc_address);
145
+ }
146
+ }
147
+
148
+ // Add reply to
149
+ $reply_to = $message->mb_get_reply_to();
150
+ if ($this->mail_bank_options["reply_to"] != "") {
151
+ $mail->setReplyTo($this->mail_bank_options["reply_to"]);
152
+ } elseif (isset($reply_to)) {
153
+ $mail->setReplyTo($reply_to->mb_get_email());
154
+ }
155
+
156
+ // Add date
157
+ $date = $message->mb_get_date();
158
+ if (!empty($date)) {
159
+ $mail->setDate($date);
160
+ }
161
+
162
+ // Add message id
163
+ $message_id = $message->mb_get_message_id();
164
+ if (!empty($message_id)) {
165
+ $mail->setMessageId($message_id);
166
+ }
167
+
168
+ // Add subject of the email
169
+ if (null !== $message->mb_get_subject()) {
170
+ $mail->setSubject($message->mb_get_subject());
171
+ }
172
+
173
+ // Add message content of the email
174
+ //{
175
+ $text_part = $message->mb_get_body_textPart();
176
+ if (!empty($text_part)) {
177
+ $mail->setBodyText($text_part);
178
+ }
179
+ $html_part = $message->mb_get_body_html_part();
180
+ if (!empty($html_part)) {
181
+ $mail->setBodyHtml($html_part);
182
+ }
183
+ //}
184
+ // Add attachments to the email
185
+ $message->mb_add_attachments_to_mail($mail);
186
+
187
+ // Create the SMTP transport
188
+ $zend_transport = $this->transport->initiate_zendmail_transport_mail_bank($this->mail_bank_options["hostname"], array());
189
+ try {
190
+ // Send the message
191
+ $mail->send($zend_transport);
192
+ if ($zend_transport->getConnection() && !mail_bank_zend_mail_helper::check_field_mail_bank($zend_transport->getConnection()->getLog())) {
193
+ $this->transcript = $zend_transport->getConnection()->getLog();
194
+ } else if (method_exists($zend_transport, "get_output_mail_bank") && !mail_bank_zend_mail_helper::check_field_mail_bank($zend_transport->get_output_mail_bank())) {
195
+ // use the API response
196
+ $this->transcript = $zend_transport->get_output_mail_bank();
197
+ } else if (method_exists($zend_transport, "getMessage") && !mail_bank_zend_mail_helper::check_field_mail_bank($zend_transport->getMessage())) {
198
+ //use the raw message as the transcript
199
+ $this->transcript = $zend_transport->getMessage();
200
+ }
201
+ } catch (Exception $e) {
202
+ // In case of Error
203
+ if ($zend_transport->getConnection() && !mail_bank_zend_mail_helper::check_field_mail_bank($zend_transport->getConnection()->getLog())) {
204
+ $this->transcript = $zend_transport->getConnection()->getLog();
205
+ } else if (method_exists($zend_transport, "get_output_mail_bank") && !mail_bank_zend_mail_helper::check_field_mail_bank($zend_transport->get_output_mail_bank())) {
206
+ // Use API response
207
+ $this->transcript = $zend_transport->get_output_mail_bank();
208
+ } else if (method_exists($zend_transport, "getMessage") && !mail_bank_zend_mail_helper::check_field_mail_bank($zend_transport->getMessage())) {
209
+ // Use message as the transcript
210
+ $this->transcript = $zend_transport->getMessage();
211
+ }
212
+
213
+ // Get the current exception message
214
+ $message = $e->getMessage();
215
+ if ($e->getCode() == 334) {
216
+ $message = "From Email should be of same account used to create the Client Id.";
217
+ }
218
+ $exception = new Exception($message, $e->getCode());
219
+ // Throws the new exception
220
+ throw $exception;
221
+ }
222
  }
223
 
224
  // This function is used to get the sender from mail_bank_manage_email and add it to the mail_bank_Zend_Mail object
225
  public function get_sender_from_email_mail_bank($message, $mail) {
226
+ $sender = $message->get_email_address_mail_bank();
227
+ $sender_email = $sender->mb_get_email();
228
+ $sender_name = $sender->mb_get_name();
229
+ if (($this->mail_bank_options["sender_name_configuration"] == "override") && ($this->mail_bank_options["from_email_configuration"] == "override")) {
230
+ $mail->setFrom($this->mail_bank_options["sender_email"], html_entity_decode($this->mail_bank_options["sender_name"], ENT_QUOTES));
231
+ } elseif (($this->mail_bank_options["sender_name_configuration"] == "dont_override") && ($this->mail_bank_options["from_email_configuration"] == "dont_override")) {
232
+ $mail->setFrom($sender_email, $sender_name);
233
+ } elseif (($this->mail_bank_options["sender_name_configuration"] == "override") && ($this->mail_bank_options["from_email_configuration"] == "dont_override")) {
234
+ $mail->setFrom($sender_email, html_entity_decode($this->mail_bank_options["sender_name"], ENT_QUOTES));
235
+ } else {
236
+ $mail->setFrom($this->mail_bank_options["sender_email"], $sender_name);
237
+ }
238
+ return $sender;
239
  }
240
 
241
  // This funtion is used to return SMTP session Transcript.
242
  public function get_output_mail_bank() {
243
+ return $this->transcript;
244
  }
245
 
246
  }
includes/mail-bank-zend-mail-helper.php CHANGED
@@ -10,55 +10,55 @@ if (!class_exists("mail_bank_zend_mail_helper")) {
10
  public static $validate_email;
11
 
12
  public static function email_domains_mail_bank($hostname, $needle) {
13
- $length = strlen($needle);
14
- return(substr($hostname, - $length) === $needle);
15
  }
16
 
17
  // This function is used to make the outgoing Http requests.
18
  public static function retrieve_body_from_response_mail_bank($url, $parameters, array $headers = array()) {
19
- $response = mail_bank_zend_mail_helper::post_request_mail_bank($url, $parameters, $headers);
20
- if (isset($response["error"])) {
21
- return json_encode($response);
22
- }
23
- $body = wp_remote_retrieve_body($response);
24
- return $body;
25
  }
26
 
27
  // This function is used to make outgoing Http requests.
28
  public static function post_request_mail_bank($url, $parameters = array(), array $headers = array()) {
29
- $args = array(
30
- "timeout" => "10000",
31
- "headers" => $headers,
32
- "body" => $parameters
33
- );
34
- $response = wp_remote_post($url, $args);
35
 
36
- if (is_wp_error($response)) {
37
- return array("error" => "An error occured", "error_description" => $response->get_error_message());
38
- } else {
39
- return $response;
40
- }
41
  }
42
 
43
  // This function is used for basic field validation.
44
  public static function check_field_mail_bank($text) {
45
- return(!isset($text) || trim($text) === "");
46
  }
47
 
48
  // This function is used to validate an email-address.
49
  public static function email_validation_mail_bank($email) {
50
- require_once MAIL_BANK_DIR_PATH . "lib/zend/exception.php";
51
- require_once MAIL_BANK_DIR_PATH . "lib/zend/registry.php";
52
- require_once MAIL_BANK_DIR_PATH . "lib/zend/validate/exception.php";
53
- require_once MAIL_BANK_DIR_PATH . "lib/zend/validate/interface.php";
54
- require_once MAIL_BANK_DIR_PATH . "lib/zend/validate/abstract.php";
55
- require_once MAIL_BANK_DIR_PATH . "lib/zend/validate/ip.php";
56
- require_once MAIL_BANK_DIR_PATH . "lib/zend/validate/hostname.php";
57
- require_once MAIL_BANK_DIR_PATH . "lib/zend/validate/emailaddress.php";
58
- if (!isset(mail_bank_zend_mail_helper::$validate_email)) {
59
- mail_bank_zend_mail_helper::$validate_email = new mail_bank_Zend_Validate_EmailAddress();
60
- }
61
- return mail_bank_zend_mail_helper::$validate_email->isValid($email);
62
  }
63
 
64
  }
10
  public static $validate_email;
11
 
12
  public static function email_domains_mail_bank($hostname, $needle) {
13
+ $length = strlen($needle);
14
+ return(substr($hostname, - $length) === $needle);
15
  }
16
 
17
  // This function is used to make the outgoing Http requests.
18
  public static function retrieve_body_from_response_mail_bank($url, $parameters, array $headers = array()) {
19
+ $response = mail_bank_zend_mail_helper::post_request_mail_bank($url, $parameters, $headers);
20
+ if (isset($response["error"])) {
21
+ return json_encode($response);
22
+ }
23
+ $body = wp_remote_retrieve_body($response);
24
+ return $body;
25
  }
26
 
27
  // This function is used to make outgoing Http requests.
28
  public static function post_request_mail_bank($url, $parameters = array(), array $headers = array()) {
29
+ $args = array(
30
+ "timeout" => "10000",
31
+ "headers" => $headers,
32
+ "body" => $parameters
33
+ );
34
+ $response = wp_remote_post($url, $args);
35
 
36
+ if (is_wp_error($response)) {
37
+ return array("error" => "An error occured", "error_description" => $response->get_error_message());
38
+ } else {
39
+ return $response;
40
+ }
41
  }
42
 
43
  // This function is used for basic field validation.
44
  public static function check_field_mail_bank($text) {
45
+ return(!isset($text) || trim($text) === "");
46
  }
47
 
48
  // This function is used to validate an email-address.
49
  public static function email_validation_mail_bank($email) {
50
+ require_once MAIL_BANK_DIR_PATH . "lib/zend/exception.php";
51
+ require_once MAIL_BANK_DIR_PATH . "lib/zend/registry.php";
52
+ require_once MAIL_BANK_DIR_PATH . "lib/zend/validate/exception.php";
53
+ require_once MAIL_BANK_DIR_PATH . "lib/zend/validate/interface.php";
54
+ require_once MAIL_BANK_DIR_PATH . "lib/zend/validate/abstract.php";
55
+ require_once MAIL_BANK_DIR_PATH . "lib/zend/validate/ip.php";
56
+ require_once MAIL_BANK_DIR_PATH . "lib/zend/validate/hostname.php";
57
+ require_once MAIL_BANK_DIR_PATH . "lib/zend/validate/emailaddress.php";
58
+ if (!isset(mail_bank_zend_mail_helper::$validate_email)) {
59
+ mail_bank_zend_mail_helper::$validate_email = new mail_bank_Zend_Validate_EmailAddress();
60
+ }
61
+ return mail_bank_zend_mail_helper::$validate_email->isValid($email);
62
  }
63
 
64
  }
includes/mailer.php CHANGED
@@ -23,75 +23,75 @@ if (!class_exists("mail_bank_auth_host")) {
23
  public $api_key;
24
  public $authorization_token;
25
  public $oauth_domains = array(
26
- "hotmail.com" => "smtp.live.com",
27
- "outlook.com" => "smtp.live.com",
28
- "yahoo.ca" => "smtp.mail.yahoo.ca",
29
- "yahoo.co.id" => "smtp.mail.yahoo.co.id",
30
- "yahoo.co.in" => "smtp.mail.yahoo.co.in",
31
- "yahoo.co.kr" => "smtp.mail.yahoo.com",
32
- "yahoo.com" => "smtp.mail.yahoo.com",
33
- "ymail.com" => "smtp.mail.yahoo.com",
34
- "yahoo.com.ar" => "smtp.mail.yahoo.com.ar",
35
- "yahoo.com.au" => "smtp.mail.yahoo.com.au",
36
- "yahoo.com.br" => "smtp.mail.yahoo.com.br",
37
- "yahoo.com.cn" => "smtp.mail.yahoo.com.cn",
38
- "yahoo.com.hk" => "smtp.mail.yahoo.com.hk",
39
- "yahoo.com.mx" => "smtp.mail.yahoo.com",
40
- "yahoo.com.my" => "smtp.mail.yahoo.com.my",
41
- "yahoo.com.ph" => "smtp.mail.yahoo.com.ph",
42
- "yahoo.com.sg" => "smtp.mail.yahoo.com.sg",
43
- "yahoo.com.tw" => "smtp.mail.yahoo.com.tw",
44
- "yahoo.com.vn" => "smtp.mail.yahoo.com.vn",
45
- "yahoo.co.nz" => "smtp.mail.yahoo.com.au",
46
- "yahoo.co.th" => "smtp.mail.yahoo.co.th",
47
- "yahoo.co.uk" => "smtp.mail.yahoo.co.uk",
48
- "yahoo.de" => "smtp.mail.yahoo.de",
49
- "yahoo.es" => "smtp.correo.yahoo.es",
50
- "yahoo.fr" => "smtp.mail.yahoo.fr",
51
- "yahoo.ie" => "smtp.mail.yahoo.co.uk",
52
- "yahoo.it" => "smtp.mail.yahoo.it",
53
- "gmail.com" => "smtp.gmail.com",
54
  );
55
  public $yahoo_domains = array(
56
- "smtp.mail.yahoo.ca",
57
- "smtp.mail.yahoo.co.id",
58
- "smtp.mail.yahoo.co.in",
59
- "smtp.mail.yahoo.com",
60
- "smtp.mail.yahoo.com",
61
- "smtp.mail.yahoo.com.ar",
62
- "smtp.mail.yahoo.com.au",
63
- "smtp.mail.yahoo.com.br",
64
- "smtp.mail.yahoo.com.cn",
65
- "smtp.mail.yahoo.com.hk",
66
- "smtp.mail.yahoo.com",
67
- "smtp.mail.yahoo.com.my",
68
- "smtp.mail.yahoo.com.ph",
69
- "smtp.mail.yahoo.com.sg",
70
- "smtp.mail.yahoo.com.tw",
71
- "smtp.mail.yahoo.com.vn",
72
- "smtp.mail.yahoo.com.au",
73
- "smtp.mail.yahoo.co.th",
74
- "smtp.mail.yahoo.co.uk",
75
- "smtp.mail.yahoo.de",
76
- "smtp.correo.yahoo.es",
77
- "smtp.mail.yahoo.fr",
78
- "smtp.mail.yahoo.co.uk",
79
- "smtp.mail.yahoo.it"
80
  );
81
 
82
  public function __construct($settings_array) {
83
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/mail-bank-manage-token.php")) {
84
- include_once MAIL_BANK_DIR_PATH . "includes/mail-bank-manage-token.php";
85
- }
86
- $this->authorization_token = mail_bank_manage_token::get_instance();
87
- $this->from_name = $settings_array["sender_name"];
88
- $this->from_email = $settings_array["sender_email"];
89
- $this->smtp_host = $settings_array["hostname"];
90
- $this->smtp_port = $settings_array["port"];
91
- $this->client_id = $settings_array["client_id"];
92
- $this->client_secret = $settings_array["client_secret"];
93
- $this->redirect_uri = $settings_array["redirect_uri"];
94
- $this->sender_email = $settings_array["email_address"];
95
  }
96
 
97
  /*
@@ -103,25 +103,25 @@ if (!class_exists("mail_bank_auth_host")) {
103
  */
104
 
105
  public function send_test_mail_bank($to, $subject, $message, $headers = "", $attachments = "", $email_configuration_settings) {
106
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/mail-bank-send-mail.php")) {
107
- include_once MAIL_BANK_DIR_PATH . "includes/mail-bank-send-mail.php";
108
- }
109
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/mail-bank-manage-token.php")) {
110
- include_once MAIL_BANK_DIR_PATH . "includes/mail-bank-manage-token.php";
111
- }
112
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/mail-bank-zend-mail-helper.php")) {
113
- include_once MAIL_BANK_DIR_PATH . "includes/mail-bank-zend-mail-helper.php";
114
- }
115
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/mail-bank-smtp-transport.php")) {
116
- include_once MAIL_BANK_DIR_PATH . "includes/mail-bank-smtp-transport.php";
117
- }
118
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/mail-bank-register-transport.php")) {
119
- include_once MAIL_BANK_DIR_PATH . "includes/mail-bank-register-transport.php";
120
- }
121
- $obj_transport_registry = new mail_bank_register_transport();
122
- $obj_transport_registry->listing_transport_mail_bank(new mail_bank_smtp_transport($email_configuration_settings));
123
- $obj_wp_mail = new mail_bank_send_mail();
124
- return $obj_wp_mail->send_email_message_mail_bank($to, $subject, $message, $headers, $attachments, $email_configuration_settings);
125
  }
126
 
127
  /*
@@ -133,15 +133,15 @@ if (!class_exists("mail_bank_auth_host")) {
133
  */
134
 
135
  public function microsoft_authentication() {
136
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/microsoft-authentication-mail-bank.php")) {
137
- include_once MAIL_BANK_DIR_PATH . "includes/microsoft-authentication-mail-bank.php";
138
- }
139
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/authentication-manager-mail-bank.php")) {
140
- include_once MAIL_BANK_DIR_PATH . "includes/authentication-manager-mail-bank.php";
141
- }
142
- $obj_microsoft_authentication_mail_bank = new microsoft_authentication_mail_bank($this->client_id, $this->client_secret, $this->authorization_token, $this->redirect_uri);
143
 
144
- $obj_microsoft_authentication_mail_bank->get_token_code(md5(rand()));
145
  }
146
 
147
  /*
@@ -153,15 +153,15 @@ if (!class_exists("mail_bank_auth_host")) {
153
  */
154
 
155
  public function google_authentication() {
156
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/google-authentication-mail-bank.php")) {
157
- include_once MAIL_BANK_DIR_PATH . "includes/google-authentication-mail-bank.php";
158
- }
159
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/authentication-manager-mail-bank.php")) {
160
- include_once MAIL_BANK_DIR_PATH . "includes/authentication-manager-mail-bank.php";
161
- }
162
- $obj_google_authentication_mail_bank = new google_authentication_mail_bank($this->client_id, $this->client_secret, $this->authorization_token, $this->redirect_uri, $this->sender_email);
163
 
164
- $obj_google_authentication_mail_bank->get_token_code(md5(rand()));
165
  }
166
 
167
  /*
@@ -173,22 +173,22 @@ if (!class_exists("mail_bank_auth_host")) {
173
  */
174
 
175
  public function microsoft_authentication_token($code) {
176
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/mail-bank-zend-mail-helper.php")) {
177
- include_once MAIL_BANK_DIR_PATH . "includes/mail-bank-zend-mail-helper.php";
178
- }
179
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/microsoft-authentication-mail-bank.php")) {
180
- include_once MAIL_BANK_DIR_PATH . "includes/microsoft-authentication-mail-bank.php";
181
- }
182
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/authentication-manager-mail-bank.php")) {
183
- include_once MAIL_BANK_DIR_PATH . "includes/authentication-manager-mail-bank.php";
184
- }
185
- $obj_microsoft_authentication_mail_bank = new microsoft_authentication_mail_bank($this->client_id, $this->client_secret, $this->authorization_token, $this->redirect_uri);
186
 
187
- $test_error = $obj_microsoft_authentication_mail_bank->process_token_Code(md5(rand()));
188
- if (isset($test_error->error)) {
189
- return $test_error;
190
- }
191
- $this->authorization_token->save_token_mail_bank();
192
  }
193
 
194
  /*
@@ -200,23 +200,23 @@ if (!class_exists("mail_bank_auth_host")) {
200
  */
201
 
202
  public function google_authentication_token($code) {
203
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/mail-bank-zend-mail-helper.php")) {
204
- include_once MAIL_BANK_DIR_PATH . "includes/mail-bank-zend-mail-helper.php";
205
- }
206
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/google-authentication-mail-bank.php")) {
207
- include_once MAIL_BANK_DIR_PATH . "includes/google-authentication-mail-bank.php";
208
- }
209
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/authentication-manager-mail-bank.php")) {
210
- include_once MAIL_BANK_DIR_PATH . "includes/authentication-manager-mail-bank.php";
211
- }
212
- $obj_google_authentication_mail_bank = new google_authentication_mail_bank($this->client_id, $this->client_secret, $this->authorization_token, $this->redirect_uri, $this->sender_email);
213
 
214
- $test_error1 = $obj_google_authentication_mail_bank->process_token_Code(md5(rand()));
215
- if (isset($test_error1->error)) {
216
- return $test_error1;
217
- }
218
 
219
- $this->authorization_token->save_token_mail_bank();
220
  }
221
 
222
  /*
@@ -228,18 +228,18 @@ if (!class_exists("mail_bank_auth_host")) {
228
  */
229
 
230
  public function yahoo_authentication() {
231
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/mail-bank-zend-mail-helper.php")) {
232
- include_once MAIL_BANK_DIR_PATH . "includes/mail-bank-zend-mail-helper.php";
233
- }
234
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/yahoo-authentication-mail-bank.php")) {
235
- include_once MAIL_BANK_DIR_PATH . "includes/yahoo-authentication-mail-bank.php";
236
- }
237
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/authentication-manager-mail-bank.php")) {
238
- include_once MAIL_BANK_DIR_PATH . "includes/authentication-manager-mail-bank.php";
239
- }
240
 
241
- $obj_yahoo_authentication_mail_bank = new yahoo_authentication_mail_bank($this->client_id, $this->client_secret, $this->authorization_token, $this->redirect_uri);
242
- $obj_yahoo_authentication_mail_bank->get_token_code(md5(rand()));
243
  }
244
 
245
  /*
@@ -251,22 +251,22 @@ if (!class_exists("mail_bank_auth_host")) {
251
  */
252
 
253
  public function yahoo_authentication_token($code) {
254
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/mail-bank-zend-mail-helper.php")) {
255
- include_once MAIL_BANK_DIR_PATH . "includes/mail-bank-zend-mail-helper.php";
256
- }
257
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/yahoo-authentication-mail-bank.php")) {
258
- include_once MAIL_BANK_DIR_PATH . "includes/yahoo-authentication-mail-bank.php";
259
- }
260
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/authentication-manager-mail-bank.php")) {
261
- include_once MAIL_BANK_DIR_PATH . "includes/authentication-manager-mail-bank.php";
262
- }
263
- $obj_yahoo_authentication_mail_bank = new yahoo_authentication_mail_bank($this->client_id, $this->client_secret, $this->authorization_token, $this->redirect_uri, $this->sender_email);
264
 
265
- $test_error1 = $obj_yahoo_authentication_mail_bank->process_token_Code(md5(rand()));
266
- if (isset($test_error1->error)) {
267
- return $test_error1;
268
- }
269
- $this->authorization_token->save_token_mail_bank();
270
  }
271
 
272
  /*
@@ -278,40 +278,40 @@ if (!class_exists("mail_bank_auth_host")) {
278
  */
279
 
280
  public static function override_wp_mail_function() {
281
- global $wpdb;
282
- $mail_bank_version_number = get_option("mail-bank-version-number");
283
- if ($mail_bank_version_number != "") {
284
- $email_configuration_data = $wpdb->get_var
285
- (
286
- $wpdb->prepare
287
- (
288
- "SELECT meta_value FROM " . mail_bank_meta() . "
289
  WHERE meta_key = %s", "email_configuration"
290
- )
291
- );
292
- $email_configuration_data_array = maybe_unserialize($email_configuration_data);
293
- if ($email_configuration_data_array["mailer_type"] == "smtp") {
294
- if (!function_exists("wp_mail")) {
295
 
296
- function wp_mail($to, $subject, $message, $headers = "", $attachments = "") {
297
- global $wpdb;
298
- $email_configuration_data_array = $wpdb->get_var
299
- (
300
- $wpdb->prepare
301
- (
302
- "SELECT meta_value FROM " . mail_bank_meta() .
303
- " WHERE meta_key=%s", "email_configuration"
304
- )
305
- );
306
- $email_configuration_settings = maybe_unserialize($email_configuration_data_array);
307
- $obj_send_test_mail = new mail_bank_auth_host($email_configuration_settings);
308
- $result = $obj_send_test_mail->send_test_mail_bank($to, $subject, $message, $headers, $attachments, $email_configuration_settings);
309
- return $result;
310
- }
311
 
312
- }
313
- }
314
- }
315
  }
316
 
317
  }
23
  public $api_key;
24
  public $authorization_token;
25
  public $oauth_domains = array(
26
+ "hotmail.com" => "smtp.live.com",
27
+ "outlook.com" => "smtp.live.com",
28
+ "yahoo.ca" => "smtp.mail.yahoo.ca",
29
+ "yahoo.co.id" => "smtp.mail.yahoo.co.id",
30
+ "yahoo.co.in" => "smtp.mail.yahoo.co.in",
31
+ "yahoo.co.kr" => "smtp.mail.yahoo.com",
32
+ "yahoo.com" => "smtp.mail.yahoo.com",
33
+ "ymail.com" => "smtp.mail.yahoo.com",
34
+ "yahoo.com.ar" => "smtp.mail.yahoo.com.ar",
35
+ "yahoo.com.au" => "smtp.mail.yahoo.com.au",
36
+ "yahoo.com.br" => "smtp.mail.yahoo.com.br",
37
+ "yahoo.com.cn" => "smtp.mail.yahoo.com.cn",
38
+ "yahoo.com.hk" => "smtp.mail.yahoo.com.hk",
39
+ "yahoo.com.mx" => "smtp.mail.yahoo.com",
40
+ "yahoo.com.my" => "smtp.mail.yahoo.com.my",
41
+ "yahoo.com.ph" => "smtp.mail.yahoo.com.ph",
42
+ "yahoo.com.sg" => "smtp.mail.yahoo.com.sg",
43
+ "yahoo.com.tw" => "smtp.mail.yahoo.com.tw",
44
+ "yahoo.com.vn" => "smtp.mail.yahoo.com.vn",
45
+ "yahoo.co.nz" => "smtp.mail.yahoo.com.au",
46
+ "yahoo.co.th" => "smtp.mail.yahoo.co.th",
47
+ "yahoo.co.uk" => "smtp.mail.yahoo.co.uk",
48
+ "yahoo.de" => "smtp.mail.yahoo.de",
49
+ "yahoo.es" => "smtp.correo.yahoo.es",
50
+ "yahoo.fr" => "smtp.mail.yahoo.fr",
51
+ "yahoo.ie" => "smtp.mail.yahoo.co.uk",
52
+ "yahoo.it" => "smtp.mail.yahoo.it",
53
+ "gmail.com" => "smtp.gmail.com",
54
  );
55
  public $yahoo_domains = array(
56
+ "smtp.mail.yahoo.ca",
57
+ "smtp.mail.yahoo.co.id",
58
+ "smtp.mail.yahoo.co.in",
59
+ "smtp.mail.yahoo.com",
60
+ "smtp.mail.yahoo.com",
61
+ "smtp.mail.yahoo.com.ar",
62
+ "smtp.mail.yahoo.com.au",
63
+ "smtp.mail.yahoo.com.br",
64
+ "smtp.mail.yahoo.com.cn",
65
+ "smtp.mail.yahoo.com.hk",
66
+ "smtp.mail.yahoo.com",
67
+ "smtp.mail.yahoo.com.my",
68
+ "smtp.mail.yahoo.com.ph",
69
+ "smtp.mail.yahoo.com.sg",
70
+ "smtp.mail.yahoo.com.tw",
71
+ "smtp.mail.yahoo.com.vn",
72
+ "smtp.mail.yahoo.com.au",
73
+ "smtp.mail.yahoo.co.th",
74
+ "smtp.mail.yahoo.co.uk",
75
+ "smtp.mail.yahoo.de",
76
+ "smtp.correo.yahoo.es",
77
+ "smtp.mail.yahoo.fr",
78
+ "smtp.mail.yahoo.co.uk",
79
+ "smtp.mail.yahoo.it"
80
  );
81
 
82
  public function __construct($settings_array) {
83
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/mail-bank-manage-token.php")) {
84
+ include_once MAIL_BANK_DIR_PATH . "includes/mail-bank-manage-token.php";
85
+ }
86
+ $this->authorization_token = mail_bank_manage_token::get_instance();
87
+ $this->from_name = $settings_array["sender_name"];
88
+ $this->from_email = $settings_array["sender_email"];
89
+ $this->smtp_host = $settings_array["hostname"];
90
+ $this->smtp_port = $settings_array["port"];
91
+ $this->client_id = $settings_array["client_id"];
92
+ $this->client_secret = $settings_array["client_secret"];
93
+ $this->redirect_uri = $settings_array["redirect_uri"];
94
+ $this->sender_email = $settings_array["email_address"];
95
  }
96
 
97
  /*
103
  */
104
 
105
  public function send_test_mail_bank($to, $subject, $message, $headers = "", $attachments = "", $email_configuration_settings) {
106
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/mail-bank-send-mail.php")) {
107
+ include_once MAIL_BANK_DIR_PATH . "includes/mail-bank-send-mail.php";
108
+ }
109
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/mail-bank-manage-token.php")) {
110
+ include_once MAIL_BANK_DIR_PATH . "includes/mail-bank-manage-token.php";
111
+ }
112
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/mail-bank-zend-mail-helper.php")) {
113
+ include_once MAIL_BANK_DIR_PATH . "includes/mail-bank-zend-mail-helper.php";
114
+ }
115
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/mail-bank-smtp-transport.php")) {
116
+ include_once MAIL_BANK_DIR_PATH . "includes/mail-bank-smtp-transport.php";
117
+ }
118
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/mail-bank-register-transport.php")) {
119
+ include_once MAIL_BANK_DIR_PATH . "includes/mail-bank-register-transport.php";
120
+ }
121
+ $obj_transport_registry = new mail_bank_register_transport();
122
+ $obj_transport_registry->listing_transport_mail_bank(new mail_bank_smtp_transport($email_configuration_settings));
123
+ $obj_wp_mail = new mail_bank_send_mail();
124
+ return $obj_wp_mail->send_email_message_mail_bank($to, $subject, $message, $headers, $attachments, $email_configuration_settings);
125
  }
126
 
127
  /*
133
  */
134
 
135
  public function microsoft_authentication() {
136
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/microsoft-authentication-mail-bank.php")) {
137
+ include_once MAIL_BANK_DIR_PATH . "includes/microsoft-authentication-mail-bank.php";
138
+ }
139
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/authentication-manager-mail-bank.php")) {
140
+ include_once MAIL_BANK_DIR_PATH . "includes/authentication-manager-mail-bank.php";
141
+ }
142
+ $obj_microsoft_authentication_mail_bank = new microsoft_authentication_mail_bank($this->client_id, $this->client_secret, $this->authorization_token, $this->redirect_uri);
143
 
144
+ $obj_microsoft_authentication_mail_bank->get_token_code(md5(rand()));
145
  }
146
 
147
  /*
153
  */
154
 
155
  public function google_authentication() {
156
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/google-authentication-mail-bank.php")) {
157
+ include_once MAIL_BANK_DIR_PATH . "includes/google-authentication-mail-bank.php";
158
+ }
159
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/authentication-manager-mail-bank.php")) {
160
+ include_once MAIL_BANK_DIR_PATH . "includes/authentication-manager-mail-bank.php";
161
+ }
162
+ $obj_google_authentication_mail_bank = new google_authentication_mail_bank($this->client_id, $this->client_secret, $this->authorization_token, $this->redirect_uri, $this->sender_email);
163
 
164
+ $obj_google_authentication_mail_bank->get_token_code(md5(rand()));
165
  }
166
 
167
  /*
173
  */
174
 
175
  public function microsoft_authentication_token($code) {
176
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/mail-bank-zend-mail-helper.php")) {
177
+ include_once MAIL_BANK_DIR_PATH . "includes/mail-bank-zend-mail-helper.php";
178
+ }
179
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/microsoft-authentication-mail-bank.php")) {
180
+ include_once MAIL_BANK_DIR_PATH . "includes/microsoft-authentication-mail-bank.php";
181
+ }
182
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/authentication-manager-mail-bank.php")) {
183
+ include_once MAIL_BANK_DIR_PATH . "includes/authentication-manager-mail-bank.php";
184
+ }
185
+ $obj_microsoft_authentication_mail_bank = new microsoft_authentication_mail_bank($this->client_id, $this->client_secret, $this->authorization_token, $this->redirect_uri);
186
 
187
+ $test_error = $obj_microsoft_authentication_mail_bank->process_token_Code(md5(rand()));
188
+ if (isset($test_error->error)) {
189
+ return $test_error;
190
+ }
191
+ $this->authorization_token->save_token_mail_bank();
192
  }
193
 
194
  /*
200
  */
201
 
202
  public function google_authentication_token($code) {
203
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/mail-bank-zend-mail-helper.php")) {
204
+ include_once MAIL_BANK_DIR_PATH . "includes/mail-bank-zend-mail-helper.php";
205
+ }
206
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/google-authentication-mail-bank.php")) {
207
+ include_once MAIL_BANK_DIR_PATH . "includes/google-authentication-mail-bank.php";
208
+ }
209
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/authentication-manager-mail-bank.php")) {
210
+ include_once MAIL_BANK_DIR_PATH . "includes/authentication-manager-mail-bank.php";
211
+ }
212
+ $obj_google_authentication_mail_bank = new google_authentication_mail_bank($this->client_id, $this->client_secret, $this->authorization_token, $this->redirect_uri, $this->sender_email);
213
 
214
+ $test_error1 = $obj_google_authentication_mail_bank->process_token_Code(md5(rand()));
215
+ if (isset($test_error1->error)) {
216
+ return $test_error1;
217
+ }
218
 
219
+ $this->authorization_token->save_token_mail_bank();
220
  }
221
 
222
  /*
228
  */
229
 
230
  public function yahoo_authentication() {
231
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/mail-bank-zend-mail-helper.php")) {
232
+ include_once MAIL_BANK_DIR_PATH . "includes/mail-bank-zend-mail-helper.php";
233
+ }
234
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/yahoo-authentication-mail-bank.php")) {
235
+ include_once MAIL_BANK_DIR_PATH . "includes/yahoo-authentication-mail-bank.php";
236
+ }
237
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/authentication-manager-mail-bank.php")) {
238
+ include_once MAIL_BANK_DIR_PATH . "includes/authentication-manager-mail-bank.php";
239
+ }
240
 
241
+ $obj_yahoo_authentication_mail_bank = new yahoo_authentication_mail_bank($this->client_id, $this->client_secret, $this->authorization_token, $this->redirect_uri);
242
+ $obj_yahoo_authentication_mail_bank->get_token_code(md5(rand()));
243
  }
244
 
245
  /*
251
  */
252
 
253
  public function yahoo_authentication_token($code) {
254
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/mail-bank-zend-mail-helper.php")) {
255
+ include_once MAIL_BANK_DIR_PATH . "includes/mail-bank-zend-mail-helper.php";
256
+ }
257
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/yahoo-authentication-mail-bank.php")) {
258
+ include_once MAIL_BANK_DIR_PATH . "includes/yahoo-authentication-mail-bank.php";
259
+ }
260
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/authentication-manager-mail-bank.php")) {
261
+ include_once MAIL_BANK_DIR_PATH . "includes/authentication-manager-mail-bank.php";
262
+ }
263
+ $obj_yahoo_authentication_mail_bank = new yahoo_authentication_mail_bank($this->client_id, $this->client_secret, $this->authorization_token, $this->redirect_uri, $this->sender_email);
264
 
265
+ $test_error1 = $obj_yahoo_authentication_mail_bank->process_token_Code(md5(rand()));
266
+ if (isset($test_error1->error)) {
267
+ return $test_error1;
268
+ }
269
+ $this->authorization_token->save_token_mail_bank();
270
  }
271
 
272
  /*
278
  */
279
 
280
  public static function override_wp_mail_function() {
281
+ global $wpdb;
282
+ $mail_bank_version_number = get_option("mail-bank-version-number");
283
+ if ($mail_bank_version_number != "") {
284
+ $email_configuration_data = $wpdb->get_var
285
+ (
286
+ $wpdb->prepare
287
+ (
288
+ "SELECT meta_value FROM " . mail_bank_meta() . "
289
  WHERE meta_key = %s", "email_configuration"
290
+ )
291
+ );
292
+ $email_configuration_data_array = maybe_unserialize($email_configuration_data);
293
+ if ($email_configuration_data_array["mailer_type"] == "smtp") {
294
+ if (!function_exists("wp_mail")) {
295
 
296
+ function wp_mail($to, $subject, $message, $headers = "", $attachments = "") {
297
+ global $wpdb;
298
+ $email_configuration_data_array = $wpdb->get_var
299
+ (
300
+ $wpdb->prepare
301
+ (
302
+ "SELECT meta_value FROM " . mail_bank_meta() .
303
+ " WHERE meta_key=%s", "email_configuration"
304
+ )
305
+ );
306
+ $email_configuration_settings = maybe_unserialize($email_configuration_data_array);
307
+ $obj_send_test_mail = new mail_bank_auth_host($email_configuration_settings);
308
+ $result = $obj_send_test_mail->send_test_mail_bank($to, $subject, $message, $headers, $attachments, $email_configuration_settings);
309
+ return $result;
310
+ }
311
 
312
+ }
313
+ }
314
+ }
315
  }
316
 
317
  }
includes/microsoft-authentication-mail-bank.php CHANGED
@@ -12,57 +12,57 @@ if (!class_exists("microsoft_authentication_mail_bank")) {
12
  class microsoft_authentication_mail_bank extends token_manager_mail_bank {
13
 
14
  public
15
- $client_id,
16
- $client_secret,
17
- $callback_uri,
18
- $token_url;
19
 
20
  //Constructor
21
  public function __construct($client_id, $client_secret, mail_bank_manage_token $authorization_token, $callback_uri) {
22
- $this->client_id = $client_id;
23
- $this->client_secret = $client_secret;
24
- $this->callback_uri = $callback_uri;
25
- $this->token_url = "https://login.live.com/oauth20_token.srf";
26
- parent::__construct($client_id, $client_secret, $authorization_token, $callback_uri);
27
  }
28
 
29
  // This function return the verification code after successfull authentication
30
  public function get_token_code($transactionId) {
31
- $configurations = array(
32
- "response_type" => "code",
33
- "redirect_uri" => urlencode($this->callback_uri),
34
- "client_id" => $this->client_id,
35
- "client_secret" => $this->client_secret,
36
- "scope" => urlencode("wl.imap,wl.offline_access"),
37
- "access_type" => "offline",
38
- "approval_prompt" => "force"
39
- );
40
- $oauth_url = "https://login.live.com/oauth20_authorize.srf?" . build_query($configurations);
41
- echo $oauth_url;
42
  }
43
 
44
  // This function proccess the grant code
45
  public function process_token_Code($transactionId) {
46
- if (isset($_REQUEST["access_token"])) {
47
- $code = esc_attr($_REQUEST["access_token"]);
48
- $configurations = array(
49
- "client_id" => $this->client_id,
50
- "client_secret" => $this->client_secret,
51
- "grant_type" => "authorization_code",
52
- "redirect_uri" => $this->callback_uri,
53
- "code" => $code
54
- );
55
- $response = mail_bank_zend_mail_helper::retrieve_body_from_response_mail_bank($this->token_url, $configurations);
56
- $microsoft_secret_key = $this->process_response($response);
57
- if (isset($microsoft_secret_key->error)) {
58
- return $microsoft_secret_key;
59
- } else {
60
- $this->get_authorization_token()->set_vendorname_mail_bank("microsoft");
61
- return "1";
62
- }
63
- } else {
64
- return false;
65
- }
66
  }
67
 
68
  }
12
  class microsoft_authentication_mail_bank extends token_manager_mail_bank {
13
 
14
  public
15
+ $client_id,
16
+ $client_secret,
17
+ $callback_uri,
18
+ $token_url;
19
 
20
  //Constructor
21
  public function __construct($client_id, $client_secret, mail_bank_manage_token $authorization_token, $callback_uri) {
22
+ $this->client_id = $client_id;
23
+ $this->client_secret = $client_secret;
24
+ $this->callback_uri = $callback_uri;
25
+ $this->token_url = "https://login.live.com/oauth20_token.srf";
26
+ parent::__construct($client_id, $client_secret, $authorization_token, $callback_uri);
27
  }
28
 
29
  // This function return the verification code after successfull authentication
30
  public function get_token_code($transactionId) {
31
+ $configurations = array(
32
+ "response_type" => "code",
33
+ "redirect_uri" => urlencode($this->callback_uri),
34
+ "client_id" => $this->client_id,
35
+ "client_secret" => $this->client_secret,
36
+ "scope" => urlencode("wl.imap,wl.offline_access"),
37
+ "access_type" => "offline",
38
+ "approval_prompt" => "force"
39
+ );
40
+ $oauth_url = "https://login.live.com/oauth20_authorize.srf?" . build_query($configurations);
41
+ echo $oauth_url;
42
  }
43
 
44
  // This function proccess the grant code
45
  public function process_token_Code($transactionId) {
46
+ if (isset($_REQUEST["access_token"])) {
47
+ $code = esc_attr($_REQUEST["access_token"]);
48
+ $configurations = array(
49
+ "client_id" => $this->client_id,
50
+ "client_secret" => $this->client_secret,
51
+ "grant_type" => "authorization_code",
52
+ "redirect_uri" => $this->callback_uri,
53
+ "code" => $code
54
+ );
55
+ $response = mail_bank_zend_mail_helper::retrieve_body_from_response_mail_bank($this->token_url, $configurations);
56
+ $microsoft_secret_key = $this->process_response($response);
57
+ if (isset($microsoft_secret_key->error)) {
58
+ return $microsoft_secret_key;
59
+ } else {
60
+ $this->get_authorization_token()->set_vendorname_mail_bank("microsoft");
61
+ return "1";
62
+ }
63
+ } else {
64
+ return false;
65
+ }
66
  }
67
 
68
  }
includes/queries.php CHANGED
@@ -16,8 +16,8 @@ if (!is_user_logged_in()) {
16
  $access_granted = false;
17
  foreach ($user_role_permission as $permission) {
18
  if (current_user_can($permission)) {
19
- $access_granted = true;
20
- break;
21
  }
22
  }
23
  if (!$access_granted) {
@@ -25,107 +25,107 @@ if (!is_user_logged_in()) {
25
  } else {
26
 
27
  function get_mail_bank_log_data_maybe_unserialize($data, $start_date, $end_date) {
28
- $array_details = array();
29
- foreach ($data as $raw_row) {
30
- $unserialize_data = maybe_unserialize($raw_row->meta_value);
31
- $unserialize_data["id"] = $raw_row->id;
32
- $unserialize_data["meta_id"] = $raw_row->meta_id;
33
- if ($unserialize_data["timestamp"] >= $start_date && $unserialize_data["timestamp"] <= $end_date)
34
- array_push($array_details, $unserialize_data);
35
- }
36
- return $array_details;
37
  }
38
 
39
  function get_mail_bank_meta_value($meta_key) {
40
- global $wpdb;
41
- $meta_value = $wpdb->get_var
42
- (
43
- $wpdb->prepare
44
- (
45
- "SELECT meta_value FROM " . mail_bank_meta() .
46
- " WHERE meta_key=%s", $meta_key
47
- )
48
- );
49
- return maybe_unserialize($meta_value);
50
  }
51
 
52
  if (isset($_GET["page"])) {
53
- switch (esc_attr($_GET["page"])) {
54
- case "mb_roles_and_capabilities":
55
- $details_roles_capabilities = get_mail_bank_meta_value("roles_and_capabilities");
56
- $other_roles_access_array = array(
57
- "manage_options",
58
- "edit_plugins",
59
- "edit_posts",
60
- "publish_posts",
61
- "publish_pages",
62
- "edit_pages",
63
- "read"
64
- );
65
- $other_roles_array = isset($details_roles_capabilities["capabilities"]) && $details_roles_capabilities["capabilities"] != "" ? $details_roles_capabilities["capabilities"] : $other_roles_access_array;
66
- break;
67
 
68
- case "mb_settings":
69
- $settings_data_array = get_mail_bank_meta_value("settings");
70
- break;
71
 
72
- case "mb_email_logs":
73
- $end_date = MAIL_BANK_LOCAL_TIME + 86400;
74
- $start_date = $end_date - 2678400;
75
- $email_logs_data = $wpdb->get_results
76
- (
77
- $wpdb->prepare
78
- (
79
- "SELECT * FROM " . mail_bank_meta() . "
80
  WHERE meta_key = %s ORDER BY id DESC", "email_logs"
81
- )
82
- );
83
- $unserialized_email_logs_data = get_mail_bank_log_data_maybe_unserialize($email_logs_data, $start_date, $end_date);
84
 
85
- break;
86
 
87
 
88
- case "mb_email_configuration":
89
 
90
- $email_configuration_array = get_mail_bank_meta_value("email_configuration");
91
- if (!empty($_REQUEST["access_token"])) {
92
- $code = esc_attr($_REQUEST["access_token"]);
93
- $update_email_configuration_data = get_option("update_email_configuration");
94
- $mail_bank_auth_host = new mail_bank_auth_host($update_email_configuration_data);
95
- if ($update_email_configuration_data["hostname"] == "smtp.gmail.com") {
96
- $test_secret_key_error = $mail_bank_auth_host->google_authentication_token($code);
97
- if (isset($test_secret_key_error->error)) {
98
- $test_secret_key_error = $test_secret_key_error->error_description;
99
- break;
100
- }
101
- } elseif (in_array($update_email_configuration_data["hostname"], $mail_bank_auth_host->yahoo_domains)) {
102
- $test_secret_key_error = $mail_bank_auth_host->yahoo_authentication_token($code);
103
- if (isset($test_secret_key_error->error)) {
104
- $test_secret_key_error = $test_secret_key_error->error_description;
105
- break;
106
- }
107
- } else {
108
- $test_secret_key_error = $mail_bank_auth_host->microsoft_authentication_token($code);
109
- if (isset($test_secret_key_error->error)) {
110
- $test_secret_key_error = $test_secret_key_error->error_description;
111
- break;
112
- }
113
- }
114
- $obj_dbHelper_mail_bank = new dbHelper_mail_bank();
115
 
116
- $update_email_configuration_array = array();
117
- $where = array();
118
- $where["meta_key"] = "email_configuration";
119
- $update_email_configuration_array["meta_value"] = serialize($update_email_configuration_data);
120
- $obj_dbHelper_mail_bank->updateCommand(mail_bank_meta(), $update_email_configuration_array, $where);
121
- if ($update_email_configuration_data["automatic_mail"] == 1) {
122
- $automatically_send_mail = "true";
123
- } else {
124
- $automatically_not_send_mail = "true";
125
- }
126
- }
127
- break;
128
- }
129
  }
130
  }
131
  }
16
  $access_granted = false;
17
  foreach ($user_role_permission as $permission) {
18
  if (current_user_can($permission)) {
19
+ $access_granted = true;
20
+ break;
21
  }
22
  }
23
  if (!$access_granted) {
25
  } else {
26
 
27
  function get_mail_bank_log_data_maybe_unserialize($data, $start_date, $end_date) {
28
+ $array_details = array();
29
+ foreach ($data as $raw_row) {
30
+ $unserialize_data = maybe_unserialize($raw_row->meta_value);
31
+ $unserialize_data["id"] = $raw_row->id;
32
+ $unserialize_data["meta_id"] = $raw_row->meta_id;
33
+ if ($unserialize_data["timestamp"] >= $start_date && $unserialize_data["timestamp"] <= $end_date)
34
+ array_push($array_details, $unserialize_data);
35
+ }
36
+ return $array_details;
37
  }
38
 
39
  function get_mail_bank_meta_value($meta_key) {
40
+ global $wpdb;
41
+ $meta_value = $wpdb->get_var
42
+ (
43
+ $wpdb->prepare
44
+ (
45
+ "SELECT meta_value FROM " . mail_bank_meta() .
46
+ " WHERE meta_key=%s", $meta_key
47
+ )
48
+ );
49
+ return maybe_unserialize($meta_value);
50
  }
51
 
52
  if (isset($_GET["page"])) {
53
+ switch (esc_attr($_GET["page"])) {
54
+ case "mb_roles_and_capabilities":
55
+ $details_roles_capabilities = get_mail_bank_meta_value("roles_and_capabilities");
56
+ $other_roles_access_array = array(
57
+ "manage_options",
58
+ "edit_plugins",
59
+ "edit_posts",
60
+ "publish_posts",
61
+ "publish_pages",
62
+ "edit_pages",
63
+ "read"
64
+ );
65
+ $other_roles_array = isset($details_roles_capabilities["capabilities"]) && $details_roles_capabilities["capabilities"] != "" ? $details_roles_capabilities["capabilities"] : $other_roles_access_array;
66
+ break;
67
 
68
+ case "mb_settings":
69
+ $settings_data_array = get_mail_bank_meta_value("settings");
70
+ break;
71
 
72
+ case "mb_email_logs":
73
+ $end_date = MAIL_BANK_LOCAL_TIME + 86400;
74
+ $start_date = $end_date - 2678400;
75
+ $email_logs_data = $wpdb->get_results
76
+ (
77
+ $wpdb->prepare
78
+ (
79
+ "SELECT * FROM " . mail_bank_meta() . "
80
  WHERE meta_key = %s ORDER BY id DESC", "email_logs"
81
+ )
82
+ );
83
+ $unserialized_email_logs_data = get_mail_bank_log_data_maybe_unserialize($email_logs_data, $start_date, $end_date);
84
 
85
+ break;
86
 
87
 
88
+ case "mb_email_configuration":
89
 
90
+ $email_configuration_array = get_mail_bank_meta_value("email_configuration");
91
+ if (!empty($_REQUEST["access_token"])) {
92
+ $code = esc_attr($_REQUEST["access_token"]);
93
+ $update_email_configuration_data = get_option("update_email_configuration");
94
+ $mail_bank_auth_host = new mail_bank_auth_host($update_email_configuration_data);
95
+ if ($update_email_configuration_data["hostname"] == "smtp.gmail.com") {
96
+ $test_secret_key_error = $mail_bank_auth_host->google_authentication_token($code);
97
+ if (isset($test_secret_key_error->error)) {
98
+ $test_secret_key_error = $test_secret_key_error->error_description;
99
+ break;
100
+ }
101
+ } elseif (in_array($update_email_configuration_data["hostname"], $mail_bank_auth_host->yahoo_domains)) {
102
+ $test_secret_key_error = $mail_bank_auth_host->yahoo_authentication_token($code);
103
+ if (isset($test_secret_key_error->error)) {
104
+ $test_secret_key_error = $test_secret_key_error->error_description;
105
+ break;
106
+ }
107
+ } else {
108
+ $test_secret_key_error = $mail_bank_auth_host->microsoft_authentication_token($code);
109
+ if (isset($test_secret_key_error->error)) {
110
+ $test_secret_key_error = $test_secret_key_error->error_description;
111
+ break;
112
+ }
113
+ }
114
+ $obj_dbHelper_mail_bank = new dbHelper_mail_bank();
115
 
116
+ $update_email_configuration_array = array();
117
+ $where = array();
118
+ $where["meta_key"] = "email_configuration";
119
+ $update_email_configuration_array["meta_value"] = serialize($update_email_configuration_data);
120
+ $obj_dbHelper_mail_bank->updateCommand(mail_bank_meta(), $update_email_configuration_array, $where);
121
+ if ($update_email_configuration_data["automatic_mail"] == 1) {
122
+ $automatically_send_mail = "true";
123
+ } else {
124
+ $automatically_not_send_mail = "true";
125
+ }
126
+ }
127
+ break;
128
+ }
129
  }
130
  }
131
  }
includes/sidebar.php CHANGED
@@ -15,8 +15,8 @@ if (!is_user_logged_in()) {
15
  $access_granted = false;
16
  foreach ($user_role_permission as $permission) {
17
  if (current_user_can($permission)) {
18
- $access_granted = true;
19
- break;
20
  }
21
  }
22
  if (!$access_granted) {
@@ -26,133 +26,133 @@ if (!is_user_logged_in()) {
26
  <div class="page-sidebar-wrapper-tech-banker">
27
  <div class="page-sidebar-tech-banker navbar-collapse collapse">
28
  <div class="sidebar-menu-tech-banker">
29
- <ul class="page-sidebar-menu-tech-banker" data-slide-speed="200">
30
- <div class="sidebar-search-wrapper" style="padding:20px;text-align:center">
31
- <a class="plugin-logo" href="<?php echo tech_banker_beta_url; ?>" target="_blank">
32
- <img src="<?php echo plugins_url("assets/global/img/mail-bank-logo.png", dirname(__FILE__)); ?>" alt="Mail Bank">
33
- </a>
34
- </div>
35
- <li id="ux_mb_li_email_configuration">
36
- <a href="admin.php?page=mb_email_configuration">
37
- <i class="icon-custom-envelope-open"></i>
38
- <span class="title">
39
- <?php echo $mb_email_configuration; ?>
40
- </span>
41
- </a>
42
- </li>
43
- <li id="ux_mb_li_test_email">
44
- <a href="admin.php?page=mb_test_email">
45
- <i class="icon-custom-envelope "></i>
46
- <span class="title">
47
- <?php echo $mb_test_email; ?>
48
- </span>
49
- </a>
50
- </li>
51
- <li id="ux_mb_li_connectivity_test">
52
- <a href="admin.php?page=mb_connectivity_test">
53
- <i class="icon-custom-globe"></i>
54
- <span class="title">
55
- <?php echo $mb_connectivity_test; ?>
56
- </span>
57
- </a>
58
- </li>
59
- <li id="ux_mb_li_email_logs">
60
- <a href="admin.php?page=mb_email_logs">
61
- <i class="icon-custom-note"></i>
62
- <span class="title">
63
- <?php echo $mb_email_logs; ?>
64
- </span>
65
- <span class="badge">
66
- Pro
67
- </span>
68
- </a>
69
- </li>
70
- <li id="ux_mb_li_settings">
71
- <a href="admin.php?page=mb_settings">
72
- <i class="icon-custom-paper-clip"></i>
73
- <span class="title">
74
- <?php echo $mb_settings; ?>
75
- </span>
76
- </a>
77
- </li>
78
- <li id="ux_mb_li_roles_and_capabilities">
79
- <a href="admin.php?page=mb_roles_and_capabilities">
80
- <i class="icon-custom-user"></i>
81
- <span class="title">
82
- <?php echo $mb_roles_and_capabilities; ?>
83
- </span>
84
- <span class="badge">Pro</span>
85
- </a>
86
- </li>
87
- <li id="ux_mb_li_feedbacks">
88
- <a href="admin.php?page=mb_feedbacks">
89
- <i class="icon-custom-star"></i>
90
- <span class="title">
91
- <?php echo $mb_feedbacks; ?>
92
- </span>
93
- </a>
94
- </li>
95
- <li id="ux_mb_li_system_information">
96
- <a href="admin.php?page=mb_system_information">
97
- <i class="icon-custom-screen-desktop"></i>
98
- <span class="title">
99
- <?php echo $mb_system_information; ?>
100
- </span>
101
- </a>
102
- </li>
103
- <li class="" id="ux_li_upgrade">
104
- <a href="admin.php?page=mb_upgrade">
105
- <i class="icon-custom-briefcase"></i>
106
- <span class="title">
107
- <?php echo $mb_upgrade; ?>
108
- </span>
109
- </a>
110
- </li>
111
- </ul>
112
  </div>
113
  </div>
114
  </div>
115
  <div class="page-content-wrapper">
116
  <div class="page-content">
117
  <div style="margin-bottom:10px">
118
- <a href="http://beta.tech-banker.com/products/mail-bank/" target="_blank">
119
- <img src="<?php echo plugins_url("assets/global/img/mail-bank-banner.png", dirname(__FILE__)); ?>" title="Mail Bank" style="width: 100%;">
120
- </a>
121
  </div>
122
  <div class="container-fluid page-header-container">
123
- <div class="row">
124
- <div class="col-md-3 page-header-column">
125
- <h4>Get Started</h4>
126
- <a class="btn" href="#" target="_blank">Watch Video!</a>
127
- <p>or <a href="http://beta.tech-banker.com/products/mail-bank/user-guide/" target="_blank">read documentation here</a></p>
128
- </div>
129
- <div class="col-md-3 page-header-column">
130
- <h4>Go Premium</h4>
131
- <ul>
132
- <li><a href="http://beta.tech-banker.com/products/mail-bank/" target="_blank">Features</a></li>
133
- <li><a href="http://beta.tech-banker.com/products/mail-bank/demos/" target="_blank">Online Demos</a></li>
134
- <li><a href="http://beta.tech-banker.com/products/mail-bank/pricing/" target="_blank">Pricing Plans</a></li>
135
- </ul>
136
- </div>
137
- <div class="col-md-3 page-header-column">
138
- <h4>User Guide</h4>
139
- <ul>
140
- <li><a href="http://beta.tech-banker.com/products/mail-bank/user-guide/" target="_blank">Documentation</a></li>
141
- <li><a href="https://wordpress.org/support/plugin/wp-mail-bank" target="_blank">Support Question!</a></li>
142
- <li><a href="http://beta.tech-banker.com/contact-us/" target="_blank">Contact Us</a></li>
143
- </ul>
144
- </div>
145
- <div class="col-md-3 page-header-column">
146
- <h4>More Actions</h4>
147
- <ul>
148
- <li><a href="https://wordpress.org/support/plugin/wp-mail-bank/reviews/?filter=5" target="_blank">Rate Us!</a></li>
149
- <li><a href="http://beta.tech-banker.com/products/" target="_blank">Our Other Products</a></li>
150
- <li><a href="http://beta.tech-banker.com/services/" target="_blank">Our Other Services</a></li>
151
- </ul>
152
- </div>
153
- </div>
154
  </div>
155
- <?php
156
- }
157
  }
158
 
15
  $access_granted = false;
16
  foreach ($user_role_permission as $permission) {
17
  if (current_user_can($permission)) {
18
+ $access_granted = true;
19
+ break;
20
  }
21
  }
22
  if (!$access_granted) {
26
  <div class="page-sidebar-wrapper-tech-banker">
27
  <div class="page-sidebar-tech-banker navbar-collapse collapse">
28
  <div class="sidebar-menu-tech-banker">
29
+ <ul class="page-sidebar-menu-tech-banker" data-slide-speed="200">
30
+ <div class="sidebar-search-wrapper" style="padding:20px;text-align:center">
31
+ <a class="plugin-logo" href="<?php echo tech_banker_beta_url; ?>" target="_blank">
32
+ <img src="<?php echo plugins_url("assets/global/img/mail-bank-logo.png", dirname(__FILE__)); ?>" alt="Mail Bank">
33
+ </a>
34
+ </div>
35
+ <li id="ux_mb_li_email_configuration">
36
+ <a href="admin.php?page=mb_email_configuration">
37
+ <i class="icon-custom-envelope-open"></i>
38
+ <span class="title">
39
+ <?php echo $mb_email_configuration; ?>
40
+ </span>
41
+ </a>
42
+ </li>
43
+ <li id="ux_mb_li_test_email">
44
+ <a href="admin.php?page=mb_test_email">
45
+ <i class="icon-custom-envelope "></i>
46
+ <span class="title">
47
+ <?php echo $mb_test_email; ?>
48
+ </span>
49
+ </a>
50
+ </li>
51
+ <li id="ux_mb_li_connectivity_test">
52
+ <a href="admin.php?page=mb_connectivity_test">
53
+ <i class="icon-custom-globe"></i>
54
+ <span class="title">
55
+ <?php echo $mb_connectivity_test; ?>
56
+ </span>
57
+ </a>
58
+ </li>
59
+ <li id="ux_mb_li_email_logs">
60
+ <a href="admin.php?page=mb_email_logs">
61
+ <i class="icon-custom-note"></i>
62
+ <span class="title">
63
+ <?php echo $mb_email_logs; ?>
64
+ </span>
65
+ <span class="badge">
66
+ Pro
67
+ </span>
68
+ </a>
69
+ </li>
70
+ <li id="ux_mb_li_settings">
71
+ <a href="admin.php?page=mb_settings">
72
+ <i class="icon-custom-paper-clip"></i>
73
+ <span class="title">
74
+ <?php echo $mb_settings; ?>
75
+ </span>
76
+ </a>
77
+ </li>
78
+ <li id="ux_mb_li_roles_and_capabilities">
79
+ <a href="admin.php?page=mb_roles_and_capabilities">
80
+ <i class="icon-custom-user"></i>
81
+ <span class="title">
82
+ <?php echo $mb_roles_and_capabilities; ?>
83
+ </span>
84
+ <span class="badge">Pro</span>
85
+ </a>
86
+ </li>
87
+ <li id="ux_mb_li_feedbacks">
88
+ <a href="admin.php?page=mb_feedbacks">
89
+ <i class="icon-custom-star"></i>
90
+ <span class="title">
91
+ <?php echo $mb_feedbacks; ?>
92
+ </span>
93
+ </a>
94
+ </li>
95
+ <li id="ux_mb_li_system_information">
96
+ <a href="admin.php?page=mb_system_information">
97
+ <i class="icon-custom-screen-desktop"></i>
98
+ <span class="title">
99
+ <?php echo $mb_system_information; ?>
100
+ </span>
101
+ </a>
102
+ </li>
103
+ <li class="" id="ux_li_upgrade">
104
+ <a href="admin.php?page=mb_upgrade">
105
+ <i class="icon-custom-briefcase"></i>
106
+ <span class="title">
107
+ <?php echo $mb_upgrade; ?>
108
+ </span>
109
+ </a>
110
+ </li>
111
+ </ul>
112
  </div>
113
  </div>
114
  </div>
115
  <div class="page-content-wrapper">
116
  <div class="page-content">
117
  <div style="margin-bottom:10px">
118
+ <a href="http://beta.tech-banker.com/products/mail-bank/" target="_blank">
119
+ <img src="<?php echo plugins_url("assets/global/img/mail-bank-banner.png", dirname(__FILE__)); ?>" title="Mail Bank" style="width: 100%;">
120
+ </a>
121
  </div>
122
  <div class="container-fluid page-header-container">
123
+ <div class="row">
124
+ <div class="col-md-3 page-header-column">
125
+ <h4>Get Started</h4>
126
+ <a class="btn" href="#" target="_blank">Watch Video!</a>
127
+ <p>or <a href="http://beta.tech-banker.com/products/mail-bank/user-guide/" target="_blank">read documentation here</a></p>
128
+ </div>
129
+ <div class="col-md-3 page-header-column">
130
+ <h4>Go Premium</h4>
131
+ <ul>
132
+ <li><a href="http://beta.tech-banker.com/products/mail-bank/" target="_blank">Features</a></li>
133
+ <li><a href="http://beta.tech-banker.com/products/mail-bank/demos/" target="_blank">Online Demos</a></li>
134
+ <li><a href="http://beta.tech-banker.com/products/mail-bank/pricing/" target="_blank">Pricing Plans</a></li>
135
+ </ul>
136
+ </div>
137
+ <div class="col-md-3 page-header-column">
138
+ <h4>User Guide</h4>
139
+ <ul>
140
+ <li><a href="http://beta.tech-banker.com/products/mail-bank/user-guide/" target="_blank">Documentation</a></li>
141
+ <li><a href="https://wordpress.org/support/plugin/wp-mail-bank" target="_blank">Support Question!</a></li>
142
+ <li><a href="http://beta.tech-banker.com/contact-us/" target="_blank">Contact Us</a></li>
143
+ </ul>
144
+ </div>
145
+ <div class="col-md-3 page-header-column">
146
+ <h4>More Actions</h4>
147
+ <ul>
148
+ <li><a href="https://wordpress.org/support/plugin/wp-mail-bank/reviews/?filter=5" target="_blank">Rate Us!</a></li>
149
+ <li><a href="http://beta.tech-banker.com/products/" target="_blank">Our Other Products</a></li>
150
+ <li><a href="http://beta.tech-banker.com/services/" target="_blank">Our Other Services</a></li>
151
+ </ul>
152
+ </div>
153
+ </div>
154
  </div>
155
+ <?php
156
+ }
157
  }
158
 
includes/token-manager-mail-bank.php CHANGED
@@ -8,81 +8,81 @@ if (!class_exists("token_manager_mail_bank")) {
8
  class token_manager_mail_bank {
9
 
10
  public
11
- $client_id,
12
- $client_secret,
13
- $authorization_token,
14
- $callback_uri;
15
 
16
  // Constructor
17
  public function __construct($client_id, $client_secret, mail_bank_manage_token $authorization_token, $callback_uri) {
18
- $this->client_id = $client_id;
19
- $this->client_secret = $client_secret;
20
- $this->authorization_token = $authorization_token;
21
- $this->callback_uri = $callback_uri;
22
  }
23
 
24
  public function get_authorization_token() {
25
- return $this->authorization_token;
26
  }
27
 
28
  public function check_access_token() {
29
- $expiry_time = ($this->authorization_token->retrieve_token_expiry_time_mail_bank() - 60);
30
- $token_expired = time() > $expiry_time;
31
- return $token_expired;
32
  }
33
 
34
  // Decoded the received token
35
  public function process_response($response) {
36
- $oauth_token = json_decode(stripslashes($response));
37
- if ($oauth_token === NULL) {
38
- throw new Exception($response);
39
- } elseif (isset($oauth_token->{"error"})) {
40
- if (isset($oauth_token->{"error_description"})) {
41
- return $oauth_token;
42
- } else {
43
- throw new Exception($oauth_token->{"error"});
44
- }
45
- } else {
46
- $this->receive_decode_authorization_token($oauth_token);
47
- }
48
  }
49
 
50
  //This function is used to extracts values(expiry time, accesstoken, refresh token)
51
  public function receive_decode_authorization_token($new_token) {
52
- // Update expiry time
53
- if (empty($new_token->{"expires_in"})) {
54
- throw new Exception("[expires_in] value is missing from token");
55
- }
56
- $changed_expiry_time = time() + $new_token->{"expires_in"};
57
- $this->get_authorization_token()->set_token_expirytime_mail_bank($changed_expiry_time);
58
 
59
- // Update access token
60
- if (empty($new_token->{"access_token"})) {
61
- throw new Exception("[access_token] value is missing from token");
62
- }
63
- $new_access_token = $new_token->{"access_token"};
64
- $this->get_authorization_token()->set_access_token_mail_bank($new_access_token);
65
 
66
- // Update refresh token
67
- if (isset($new_token->{"refresh_token"})) {
68
- $new_refresh_token = $new_token->{"refresh_token"};
69
- $this->get_authorization_token()->set_refresh_token_mail_bank($new_refresh_token);
70
- }
71
  }
72
 
73
  // get_refresh_token function is used to give specific URL and redirectUri to refresh the access token.
74
  public function get_refresh_token() {
75
- $refresh_uri = $this->token_url;
76
- $callback_uri = $this->callback_uri;
77
- $configurations = array(
78
- "client_id" => $this->client_id,
79
- "client_secret" => $this->client_secret,
80
- "redirect_uri" => $callback_uri,
81
- "grant_type" => "refresh_token",
82
- "refresh_token" => $this->get_authorization_token()->retrieve_refresh_token_mail_bank()
83
- );
84
- $response = mail_bank_zend_mail_helper::retrieve_body_from_response_mail_bank($refresh_uri, $configurations);
85
- $this->process_response($response);
86
  }
87
 
88
  }
8
  class token_manager_mail_bank {
9
 
10
  public
11
+ $client_id,
12
+ $client_secret,
13
+ $authorization_token,
14
+ $callback_uri;
15
 
16
  // Constructor
17
  public function __construct($client_id, $client_secret, mail_bank_manage_token $authorization_token, $callback_uri) {
18
+ $this->client_id = $client_id;
19
+ $this->client_secret = $client_secret;
20
+ $this->authorization_token = $authorization_token;
21
+ $this->callback_uri = $callback_uri;
22
  }
23
 
24
  public function get_authorization_token() {
25
+ return $this->authorization_token;
26
  }
27
 
28
  public function check_access_token() {
29
+ $expiry_time = ($this->authorization_token->retrieve_token_expiry_time_mail_bank() - 60);
30
+ $token_expired = time() > $expiry_time;
31
+ return $token_expired;
32
  }
33
 
34
  // Decoded the received token
35
  public function process_response($response) {
36
+ $oauth_token = json_decode(stripslashes($response));
37
+ if ($oauth_token === NULL) {
38
+ throw new Exception($response);
39
+ } elseif (isset($oauth_token->{"error"})) {
40
+ if (isset($oauth_token->{"error_description"})) {
41
+ return $oauth_token;
42
+ } else {
43
+ throw new Exception($oauth_token->{"error"});
44
+ }
45
+ } else {
46
+ $this->receive_decode_authorization_token($oauth_token);
47
+ }
48
  }
49
 
50
  //This function is used to extracts values(expiry time, accesstoken, refresh token)
51
  public function receive_decode_authorization_token($new_token) {
52
+ // Update expiry time
53
+ if (empty($new_token->{"expires_in"})) {
54
+ throw new Exception("[expires_in] value is missing from token");
55
+ }
56
+ $changed_expiry_time = time() + $new_token->{"expires_in"};
57
+ $this->get_authorization_token()->set_token_expirytime_mail_bank($changed_expiry_time);
58
 
59
+ // Update access token
60
+ if (empty($new_token->{"access_token"})) {
61
+ throw new Exception("[access_token] value is missing from token");
62
+ }
63
+ $new_access_token = $new_token->{"access_token"};
64
+ $this->get_authorization_token()->set_access_token_mail_bank($new_access_token);
65
 
66
+ // Update refresh token
67
+ if (isset($new_token->{"refresh_token"})) {
68
+ $new_refresh_token = $new_token->{"refresh_token"};
69
+ $this->get_authorization_token()->set_refresh_token_mail_bank($new_refresh_token);
70
+ }
71
  }
72
 
73
  // get_refresh_token function is used to give specific URL and redirectUri to refresh the access token.
74
  public function get_refresh_token() {
75
+ $refresh_uri = $this->token_url;
76
+ $callback_uri = $this->callback_uri;
77
+ $configurations = array(
78
+ "client_id" => $this->client_id,
79
+ "client_secret" => $this->client_secret,
80
+ "redirect_uri" => $callback_uri,
81
+ "grant_type" => "refresh_token",
82
+ "refresh_token" => $this->get_authorization_token()->retrieve_refresh_token_mail_bank()
83
+ );
84
+ $response = mail_bank_zend_mail_helper::retrieve_body_from_response_mail_bank($refresh_uri, $configurations);
85
+ $this->process_response($response);
86
  }
87
 
88
  }
includes/translations.php CHANGED
@@ -1,5 +1,4 @@
1
- <?php
2
-
3
  /**
4
  * This file is used for translation strings.
5
  *
@@ -16,8 +15,8 @@ if (!is_user_logged_in()) {
16
  $access_granted = false;
17
  foreach ($user_role_permission as $permission) {
18
  if (current_user_can($permission)) {
19
- $access_granted = true;
20
- break;
21
  }
22
  }
23
  if (!$access_granted) {
@@ -161,14 +160,13 @@ if (!is_user_logged_in()) {
161
  $wp_langs["yor"] = "Yorùbá";
162
  $locale = strtolower(get_locale());
163
  if (array_key_exists("$locale", $wp_langs)) {
164
- $language = $wp_langs["$locale"];
165
- $mb_message_translate_help = __("If you would like to translate in $language & help us, we will reward you with a free Personal Edition License of Mail Bank.", "wp-mail-bank");
166
- $mb_kindly_click = __("If Interested, Kindly click ", "wp-mail-bank");
167
- $mb_message_translate_here = __("here.", "wp-mail-bank");
168
  } else {
169
- $mb_message_translate_help = "";
170
- $mb_kindly_click = "";
171
- $mb_message_translate_here = "";
172
  }
173
 
174
  //Disclaimer
@@ -176,6 +174,7 @@ if (!is_user_logged_in()) {
176
  $mb_premium_edition_label = __("Premium Edition", "wp-mail-bank");
177
  $mb_message_premium_edition = __("This feature is available only in Premium Editions! <br> Kindly Purchase to unlock it!", "wp-mail-bank");
178
 
 
179
  //wizard
180
  $mb_wizard_basic_info = __("Basic Info", "wp-mail-bank");
181
  $mb_wizard_account_setup = __("Account Setup", "wp-mail-bank");
@@ -229,6 +228,7 @@ if (!is_user_logged_in()) {
229
  $mb_subject = __("Subject", "wp-mail-bank");
230
  $mb_next_step = __("Next Step", "wp-mail-bank");
231
  $mb_previous_step = __("Previous Step", "wp-mail-bank");
 
232
 
233
  // Email Setup
234
  $mb_email_configuration_cc_label = __("Cc", "wp-mail-bank");
1
+ <?php
 
2
  /**
3
  * This file is used for translation strings.
4
  *
15
  $access_granted = false;
16
  foreach ($user_role_permission as $permission) {
17
  if (current_user_can($permission)) {
18
+ $access_granted = true;
19
+ break;
20
  }
21
  }
22
  if (!$access_granted) {
160
  $wp_langs["yor"] = "Yorùbá";
161
  $locale = strtolower(get_locale());
162
  if (array_key_exists("$locale", $wp_langs)) {
163
+ $language = $wp_langs["$locale"];
164
+ $mb_message_translate_help = __("If you would like to translate in $language & help the wordpress community, please fill in the form ", "wp-mail-bank");
165
+ $mb_message_translate_here = __("here.", "wp-mail-bank");
 
166
  } else {
167
+ $mb_message_translate_help = "";
168
+ $mb_kindly_click = "";
169
+ $mb_message_translate_here = "";
170
  }
171
 
172
  //Disclaimer
174
  $mb_premium_edition_label = __("Premium Edition", "wp-mail-bank");
175
  $mb_message_premium_edition = __("This feature is available only in Premium Editions! <br> Kindly Purchase to unlock it!", "wp-mail-bank");
176
 
177
+
178
  //wizard
179
  $mb_wizard_basic_info = __("Basic Info", "wp-mail-bank");
180
  $mb_wizard_account_setup = __("Account Setup", "wp-mail-bank");
228
  $mb_subject = __("Subject", "wp-mail-bank");
229
  $mb_next_step = __("Next Step", "wp-mail-bank");
230
  $mb_previous_step = __("Previous Step", "wp-mail-bank");
231
+ $mb_upgrade_to = __("Upgrade to Premium Editions", "wp-mail-bank");
232
 
233
  // Email Setup
234
  $mb_email_configuration_cc_label = __("Cc", "wp-mail-bank");
includes/yahoo-authentication-mail-bank.php CHANGED
@@ -12,73 +12,73 @@ if (!class_exists("yahoo_authentication_mail_bank")) {
12
  class yahoo_authentication_mail_bank extends token_manager_mail_bank {
13
 
14
  public
15
- $client_id,
16
- $client_secret,
17
- $callback_uri,
18
- $token_url;
19
 
20
  // Constructor
21
  public function __construct($client_id, $client_secret, mail_bank_manage_token $authorization_token, $callback_uri) {
22
- $this->client_id = $client_id;
23
- $this->client_secret = $client_secret;
24
- $this->callback_uri = $callback_uri;
25
- $this->token_url = "https://api.login.yahoo.com/oauth2/get_token";
26
- parent::__construct($client_id, $client_secret, $authorization_token, $callback_uri);
27
  }
28
 
29
  // This function is used to get token code.
30
  public function get_token_code($transactionId) {
31
- $configurations = array(
32
- "response_type" => "code",
33
- "redirect_uri" => urlencode($this->callback_uri),
34
- "client_id" => $this->client_id,
35
- "state" => $transactionId,
36
- "language" => get_locale()
37
- );
38
- echo $authUrl = "https://api.login.yahoo.com/oauth2/request_auth?" . build_query($configurations);
39
  }
40
 
41
  // This function is used to process token code
42
  public function process_token_Code($transactionId) {
43
- if (isset($_REQUEST["access_token"])) {
44
- $code = esc_attr($_REQUEST["access_token"]);
45
 
46
- $headers = array(
47
- "Authorization" => sprintf("Basic %s", base64_encode($this->client_id . ':' . $this->client_secret))
48
- );
49
- $configurations = array(
50
- "code" => $code,
51
- "grant_type" => "authorization_code",
52
- "redirect_uri" => $this->callback_uri
53
- );
54
- $response = mail_bank_zend_mail_helper::retrieve_body_from_response_mail_bank($this->token_url, $configurations, $headers);
55
- $yahoo_secret_key = $this->process_response($response);
56
- if (isset($yahoo_secret_key->error)) {
57
- return $yahoo_secret_key;
58
- } else {
59
- $this->get_authorization_token()->set_vendorname_mail_bank("yahoo");
60
- return "1";
61
- }
62
- } else {
63
- return false;
64
- }
65
  }
66
 
67
  //This function is used to get refresh token for new access token
68
  public function get_refresh_token() {
69
- $refresh_url = $this->token_url;
70
- $callback_uri = $this->callback_uri;
71
- $headers = array(
72
- "Authorization" => sprintf("Basic %s", base64_encode($this->client_id . ':' . $this->client_secret))
73
- );
74
 
75
- $configurations = array(
76
- "redirect_uri" => $callback_uri,
77
- "grant_type" => "refresh_token",
78
- "refresh_token" => $this->get_authorization_token()->retrieve_refresh_token_mail_bank()
79
- );
80
- $response = mail_bank_zend_mail_helper::retrieve_body_from_response_mail_bank($this->token_url, $configurations, $headers);
81
- $this->process_response($response);
82
  }
83
 
84
  }
12
  class yahoo_authentication_mail_bank extends token_manager_mail_bank {
13
 
14
  public
15
+ $client_id,
16
+ $client_secret,
17
+ $callback_uri,
18
+ $token_url;
19
 
20
  // Constructor
21
  public function __construct($client_id, $client_secret, mail_bank_manage_token $authorization_token, $callback_uri) {
22
+ $this->client_id = $client_id;
23
+ $this->client_secret = $client_secret;
24
+ $this->callback_uri = $callback_uri;
25
+ $this->token_url = "https://api.login.yahoo.com/oauth2/get_token";
26
+ parent::__construct($client_id, $client_secret, $authorization_token, $callback_uri);
27
  }
28
 
29
  // This function is used to get token code.
30
  public function get_token_code($transactionId) {
31
+ $configurations = array(
32
+ "response_type" => "code",
33
+ "redirect_uri" => urlencode($this->callback_uri),
34
+ "client_id" => $this->client_id,
35
+ "state" => $transactionId,
36
+ "language" => get_locale()
37
+ );
38
+ echo $authUrl = "https://api.login.yahoo.com/oauth2/request_auth?" . build_query($configurations);
39
  }
40
 
41
  // This function is used to process token code
42
  public function process_token_Code($transactionId) {
43
+ if (isset($_REQUEST["access_token"])) {
44
+ $code = esc_attr($_REQUEST["access_token"]);
45
 
46
+ $headers = array(
47
+ "Authorization" => sprintf("Basic %s", base64_encode($this->client_id . ':' . $this->client_secret))
48
+ );
49
+ $configurations = array(
50
+ "code" => $code,
51
+ "grant_type" => "authorization_code",
52
+ "redirect_uri" => $this->callback_uri
53
+ );
54
+ $response = mail_bank_zend_mail_helper::retrieve_body_from_response_mail_bank($this->token_url, $configurations, $headers);
55
+ $yahoo_secret_key = $this->process_response($response);
56
+ if (isset($yahoo_secret_key->error)) {
57
+ return $yahoo_secret_key;
58
+ } else {
59
+ $this->get_authorization_token()->set_vendorname_mail_bank("yahoo");
60
+ return "1";
61
+ }
62
+ } else {
63
+ return false;
64
+ }
65
  }
66
 
67
  //This function is used to get refresh token for new access token
68
  public function get_refresh_token() {
69
+ $refresh_url = $this->token_url;
70
+ $callback_uri = $this->callback_uri;
71
+ $headers = array(
72
+ "Authorization" => sprintf("Basic %s", base64_encode($this->client_id . ':' . $this->client_secret))
73
+ );
74
 
75
+ $configurations = array(
76
+ "redirect_uri" => $callback_uri,
77
+ "grant_type" => "refresh_token",
78
+ "refresh_token" => $this->get_authorization_token()->retrieve_refresh_token_mail_bank()
79
+ );
80
+ $response = mail_bank_zend_mail_helper::retrieve_body_from_response_mail_bank($this->token_url, $configurations, $headers);
81
+ $this->process_response($response);
82
  }
83
 
84
  }
languages/{wp-mail-bank-vi_VN.mo → wp-mail-bank-vi.mo} RENAMED
Binary file
languages/{wp-mail-bank-vi_VN.po → wp-mail-bank-vi.po} RENAMED
@@ -3,7 +3,7 @@ msgstr ""
3
  "Project-Id-Version: Mail Bank\n"
4
  "Report-Msgid-Bugs-To: \n"
5
  "POT-Creation-Date: 2017-05-22 17:39+0530\n"
6
- "PO-Revision-Date: 2017-06-06 11:39+0530\n"
7
  "Last-Translator: Tech Banker\n"
8
  "Language-Team: Vietnamese (Vietnam)\n"
9
  "Language: vi_VN\n"
@@ -11,7 +11,7 @@ msgstr ""
11
  "Content-Type: text/plain; charset=UTF-8\n"
12
  "Content-Transfer-Encoding: 8bit\n"
13
  "Plural-Forms: nplurals=1; plural=0;\n"
14
- "X-Generator: Poedit 1.8.12\n"
15
  "X-Loco-Source-Locale: en-IN\n"
16
  "X-Loco-Project-Id: 22543\n"
17
  "X-Loco-Api-Version: 1.0.17 20170516-2\n"
3
  "Project-Id-Version: Mail Bank\n"
4
  "Report-Msgid-Bugs-To: \n"
5
  "POT-Creation-Date: 2017-05-22 17:39+0530\n"
6
+ "PO-Revision-Date: 2017-06-13 17:02+0530\n"
7
  "Last-Translator: Tech Banker\n"
8
  "Language-Team: Vietnamese (Vietnam)\n"
9
  "Language: vi_VN\n"
11
  "Content-Type: text/plain; charset=UTF-8\n"
12
  "Content-Transfer-Encoding: 8bit\n"
13
  "Plural-Forms: nplurals=1; plural=0;\n"
14
+ "X-Generator: Poedit 2.0\n"
15
  "X-Loco-Source-Locale: en-IN\n"
16
  "X-Loco-Project-Id: 22543\n"
17
  "X-Loco-Api-Version: 1.0.17 20170516-2\n"
lib/action-library.php CHANGED
@@ -15,8 +15,8 @@ if (!is_user_logged_in()) {
15
  $access_granted = false;
16
  foreach ($user_role_permission as $permission) {
17
  if (current_user_can($permission)) {
18
- $access_granted = true;
19
- break;
20
  }
21
  }
22
  if (!$access_granted) {
@@ -24,293 +24,293 @@ if (!is_user_logged_in()) {
24
  } else {
25
 
26
  function get_mail_bank_details_maybe_unserialize($email_data_manage, $mb_date1, $mb_date2) {
27
- $email_details = array();
28
- foreach ($email_data_manage as $raw_row) {
29
- $unserialize_data = maybe_unserialize($raw_row->meta_value);
30
- $unserialize_data["id"] = $raw_row->id;
31
- $unserialize_data["meta_id"] = $raw_row->meta_id;
32
- if ($unserialize_data["timestamp"] >= $mb_date1 && $unserialize_data["timestamp"] <= $mb_date2)
33
- array_push($email_details, $unserialize_data);
34
- }
35
- return $email_details;
36
  }
37
 
38
  if (isset($_REQUEST["param"])) {
39
- $obj_dbHelper_mail_bank = new dbHelper_mail_bank();
40
- switch (esc_attr($_REQUEST["param"])) {
41
- case "wizard_wp_mail_bank":
42
- if (wp_verify_nonce(isset($_REQUEST["_wp_nonce"]) ? esc_attr($_REQUEST["_wp_nonce"]) : "", "wp_mail_bank_check_status")) {
43
- $type = isset($_REQUEST["type"]) ? esc_attr($_REQUEST["type"]) : "";
44
- update_option("wp-mail-bank-wizard-set-up", $type);
45
- if ($type == "opt_in") {
46
- $plugin_info_wp_mail_bank = new plugin_info_wp_mail_bank();
47
- global $wp_version;
48
- $url = tech_banker_stats_url . "/wp-admin/admin-ajax.php";
49
- $theme_details = array();
50
- if ($wp_version >= 3.4) {
51
- $active_theme = wp_get_theme();
52
- $theme_details["theme_name"] = strip_tags($active_theme->Name);
53
- $theme_details["theme_version"] = strip_tags($active_theme->Version);
54
- $theme_details["author_url"] = strip_tags($active_theme->{"Author URI"});
55
- }
56
 
57
- $plugin_stat_data = array();
58
- $plugin_stat_data["plugin_slug"] = "wp-mail-bank";
59
- $plugin_stat_data["type"] = "standard_edition";
60
- $plugin_stat_data["version_number"] = mail_bank_version_number;
61
- $plugin_stat_data["status"] = $type;
62
- $plugin_stat_data["event"] = "activate";
63
- $plugin_stat_data["domain_url"] = site_url();
64
- $plugin_stat_data["wp_language"] = defined("WPLANG") && WPLANG ? WPLANG : get_locale();
65
- $plugin_stat_data["email"] = get_option("admin_email");
66
- $plugin_stat_data["wp_version"] = $wp_version;
67
- $plugin_stat_data["php_version"] = esc_html(phpversion());
68
- $plugin_stat_data["mysql_version"] = $wpdb->db_version();
69
- $plugin_stat_data["max_input_vars"] = ini_get("max_input_vars");
70
- $plugin_stat_data["operating_system"] = PHP_OS . " (" . PHP_INT_SIZE * 8 . ") BIT";
71
- $plugin_stat_data["php_memory_limit"] = ini_get("memory_limit") ? ini_get("memory_limit") : "N/A";
72
- $plugin_stat_data["extensions"] = get_loaded_extensions();
73
- $plugin_stat_data["plugins"] = $plugin_info_wp_mail_bank->get_plugin_info_wp_mail_bank();
74
- $plugin_stat_data["themes"] = $theme_details;
75
 
76
- $response = wp_safe_remote_post($url, array
77
- (
78
- "method" => "POST",
79
- "timeout" => 45,
80
- "redirection" => 5,
81
- "httpversion" => "1.0",
82
- "blocking" => true,
83
- "headers" => array(),
84
- "body" => array("data" => serialize($plugin_stat_data), "site_id" => get_option("mb_tech_banker_site_id") != "" ? get_option("mb_tech_banker_site_id") : "", "action" => "plugin_analysis_data")
85
- ));
86
- if (!is_wp_error($response)) {
87
- $response["body"] != "" ? update_option("mb_tech_banker_site_id", $response["body"]) : "";
88
- }
89
- }
90
- }
91
- break;
92
 
93
- case "mail_bank_set_hostname_port_module":
94
- if (wp_verify_nonce(isset($_REQUEST["_wp_nonce"]) ? esc_attr($_REQUEST["_wp_nonce"]) : "", "mail_bank_set_hostname_port")) {
95
- $smtp_user = isset($_REQUEST["smtp_user"]) ? esc_attr($_REQUEST["smtp_user"]) : "";
96
- $hostname = substr(strrchr($smtp_user, "@"), 1);
97
- $obj_mail_bank_discover_host = new mail_bank_discover_host();
98
- $hostname_to_set = $obj_mail_bank_discover_host->get_smtp_from_email($hostname);
99
- echo $hostname_to_set;
100
- }
101
- break;
102
 
103
- case "mail_bank_test_email_configuration_module":
104
- if (wp_verify_nonce(isset($_REQUEST["_wp_nonce"]) ? esc_attr($_REQUEST["_wp_nonce"]) : "", "mail_bank_test_email_configuration")) {
105
- parse_str(isset($_REQUEST["data"]) ? base64_decode($_REQUEST["data"]) : "", $form_data);
106
- global $phpmailer;
107
- $logs = array();
108
- if (!is_object($phpmailer) || !is_a($phpmailer, "PHPMailer")) {
109
- if (file_exists(ABSPATH . WPINC . "/class-phpmailer.php"))
110
- require_once ABSPATH . WPINC . "/class-phpmailer.php";
111
 
112
- if (file_exists(ABSPATH . WPINC . "/class-smtp.php"))
113
- require_once ABSPATH . WPINC . "/class-smtp.php";
114
 
115
- $phpmailer = new PHPMailer(true);
116
- }
117
- $phpmailer->SMTPDebug = true;
118
 
119
- $to = isset($form_data["ux_txt_email"]) ? esc_attr($form_data["ux_txt_email"]) : "";
120
- $subject = stripcslashes(htmlspecialchars_decode($form_data["ux_txt_subject"], ENT_QUOTES));
121
- $message = htmlspecialchars_decode(!empty($form_data["ux_email_configuration_text_area"]) ? esc_attr($form_data["ux_email_configuration_text_area"]) : "This is a demo Test Email for Email Setup - Mail Bank");
122
- $headers = "Content-Type: text/html; charset= utf-8" . "\r\n";
123
- $result = wp_mail($to, $subject, $message, $headers);
124
- $mb_email_configuration_data = $wpdb->get_row
125
- (
126
- $wpdb->prepare
127
- (
128
- "SELECT meta_value FROM " . mail_bank_meta() .
129
- " WHERE meta_key = %s", "email_configuration"
130
- )
131
- );
132
- $unserialized_email_configuration_data = maybe_unserialize($mb_email_configuration_data->meta_value);
133
 
134
- $settings_data = $wpdb->get_var
135
- (
136
- $wpdb->prepare
137
- (
138
- "SELECT meta_value FROM " . mail_bank_meta() .
139
- " WHERE meta_key=%s", "settings"
140
- )
141
- );
142
- $settings_data_array = maybe_unserialize($settings_data);
143
- $debugging_output = "";
144
- $mailer_type_mail_bank = isset($unserialized_email_configuration_data["mailer_type"]) ? esc_attr($unserialized_email_configuration_data["mailer_type"]) : "";
145
 
146
- if ($mailer_type_mail_bank == "smtp") {
147
- $mail_bank_mail_status = get_option("mail_bank_mail_status");
148
- $debug_mode_mail_bank = isset($settings_data_array["debug_mode"]) ? esc_attr($settings_data_array["debug_mode"]) : "";
149
- if ($debug_mode_mail_bank == "enable") {
150
- $debugging_output .= $mb_email_configuration_send_test_email_textarea . "\n";
151
- $debugging_output .= $mb_test_email_sending_test_email . " " . $to . "\n";
152
- $debugging_output .= $mb_test_email_status . " : ";
153
- $debugging_output .= get_option("mail_bank_is_mail_sent") == "Sent" ? $mb_status_sent : $mb_status_not_sent;
154
- $debugging_output .= "\n----------------------------------------------------------------------------------------\n";
155
- $debugging_output .= $mb_email_logs_debugging_output . " :\n";
156
- $debugging_output .= "----------------------------------------------------------------------------------------\n";
157
- }
158
- $debugging_output .= $mail_bank_mail_status;
159
- echo $debugging_output;
160
- } else {
161
- $to_address = $phpmailer->getToAddresses();
162
 
163
- $email_logs_data_array = array();
164
- $email_logs_data_array["email_to"] = $to_address[0][0];
165
- $monitor_email_logs = isset($settings_data_array["monitor_email_logs"]) ? esc_attr($settings_data_array["monitor_email_logs"]) : "";
166
- if ($monitor_email_logs == "enable") {
167
- $email_logs_data_array["sender_name"] = isset($unserialized_email_configuration_data["sender_name"]) ? esc_attr($unserialized_email_configuration_data["sender_name"]) : "";
168
- $email_logs_data_array["sender_email"] = isset($unserialized_email_configuration_data["sender_email"]) ? esc_attr($unserialized_email_configuration_data["sender_email"]) : "";
169
- $email_logs_data_array["cc"] = "";
170
- $email_logs_data_array["bcc"] = "";
171
- $email_logs_data_array["subject"] = $phpmailer->Subject;
172
- $email_logs_data_array["content"] = $phpmailer->Body;
173
- $email_logs_data_array["timestamp"] = MAIL_BANK_LOCAL_TIME;
174
 
175
- if ($result == "true" || $result == "1") {
176
- $email_logs_data_array["status"] = "Sent";
177
- } else {
178
- $email_logs_data_array["status"] = "Not Sent";
179
- }
180
- $email_logs_id = $wpdb->get_var
181
- (
182
- $wpdb->prepare
183
- (
184
- "SELECT id FROM " . mail_bank() .
185
- " WHERE type = %s", "email_logs"
186
- )
187
- );
188
 
189
- $email_logs_data = array();
190
- $email_logs_data["meta_id"] = $email_logs_id;
191
- $email_logs_data["meta_key"] = "email_logs";
192
- $email_logs_data["meta_value"] = serialize($email_logs_data_array);
193
- $obj_dbHelper_mail_bank->insertCommand(mail_bank_meta(), $email_logs_data);
194
- }
195
- echo $result;
196
- }
197
- }
198
- break;
199
 
200
- case "mail_bank_settings_module":
201
- if (wp_verify_nonce(isset($_REQUEST["_wp_nonce"]) ? esc_attr($_REQUEST["_wp_nonce"]) : "", "mail_bank_settings")) {
202
- parse_str(isset($_REQUEST["data"]) ? base64_decode($_REQUEST["data"]) : "", $settings_array);
203
 
204
- $settings_data = array();
205
- $settings_data["debug_mode"] = esc_attr($settings_array["ux_ddl_debug_mode"]);
206
- $settings_data["remove_tables_at_uninstall"] = esc_attr($settings_array["ux_ddl_remove_tables"]);
207
- $settings_data["monitor_email_logs"] = esc_attr($settings_array["ux_ddl_monitor_email_logs"]);
208
- $where = array();
209
- $settings_data_array = array();
210
- $where["meta_key"] = "settings";
211
- $settings_data_array["meta_value"] = serialize($settings_data);
212
- $obj_dbHelper_mail_bank->updateCommand(mail_bank_meta(), $settings_data_array, $where);
213
- }
214
- break;
215
 
216
- case "mail_bank_email_configuration_settings_module":
217
- if (wp_verify_nonce(isset($_REQUEST["_wp_nonce"]) ? esc_attr($_REQUEST["_wp_nonce"]) : "", "mail_bank_email_configuration_settings")) {
218
- parse_str(isset($_REQUEST["data"]) ? base64_decode($_REQUEST["data"]) : "", $form_data);
219
- $update_email_configuration_array = array();
220
- $update_email_configuration_array["email_address"] = esc_attr($form_data["ux_txt_email_address"]);
221
- $update_email_configuration_array["reply_to"] = "";
222
- $update_email_configuration_array["cc"] = "";
223
- $update_email_configuration_array["bcc"] = "";
224
- $update_email_configuration_array["mailer_type"] = esc_attr($form_data["ux_ddl_type"]);
225
- $update_email_configuration_array["sender_name_configuration"] = esc_attr($form_data["ux_ddl_from_name"]);
226
- $update_email_configuration_array["sender_name"] = isset($form_data["ux_txt_mb_from_name"]) ? esc_html($form_data["ux_txt_mb_from_name"]) : "";
227
- $update_email_configuration_array["from_email_configuration"] = esc_attr($form_data["ux_ddl_from_email"]);
228
- $update_email_configuration_array["sender_email"] = isset($form_data["ux_txt_mb_from_email_configuration"]) ? esc_html($form_data["ux_txt_mb_from_email_configuration"]) : "";
229
- $update_email_configuration_array["hostname"] = esc_html($form_data["ux_txt_host"]);
230
- $update_email_configuration_array["port"] = intval($form_data["ux_txt_port"]);
231
- $update_email_configuration_array["enc_type"] = esc_attr($form_data["ux_ddl_encryption"]);
232
- $update_email_configuration_array["auth_type"] = esc_attr($form_data["ux_ddl_mb_authentication"]);
233
- $update_email_configuration_array["client_id"] = esc_html(trim($form_data["ux_txt_client_id"]));
234
- $update_email_configuration_array["client_secret"] = esc_html(trim($form_data["ux_txt_client_secret"]));
235
- $update_email_configuration_array["username"] = esc_html($form_data["ux_txt_username"]);
236
- $update_email_configuration_array["automatic_mail"] = isset($form_data["ux_chk_automatic_sent_mail"]) ? esc_html($form_data["ux_chk_automatic_sent_mail"]) : "";
237
 
238
- if (preg_match('/^\**$/', $form_data["ux_txt_password"])) {
239
- $email_configuration_data = $wpdb->get_var
240
- (
241
- $wpdb->prepare
242
- (
243
- "SELECT meta_value FROM " . mail_bank_meta() .
244
- " WHERE meta_key=%s", "email_configuration"
245
- )
246
- );
247
- $email_configuration_array = maybe_unserialize($email_configuration_data);
248
- $update_email_configuration_array["password"] = isset($email_configuration_array["password"]) ? esc_attr($email_configuration_array["password"]) : "";
249
- } else {
250
- $update_email_configuration_array["password"] = base64_encode(esc_html($form_data["ux_txt_password"]));
251
- }
252
 
253
- $update_email_configuration_array["redirect_uri"] = esc_html($form_data["ux_txt_redirect_uri"]);
254
 
255
- update_option("update_email_configuration", $update_email_configuration_array);
256
 
257
- $mail_bank_auth_host = new mail_bank_auth_host($update_email_configuration_array);
258
- if (!in_array($form_data["ux_txt_host"], $mail_bank_auth_host->oauth_domains) && $form_data["ux_ddl_mb_authentication"] == "oauth2") {
259
- echo "100";
260
- die();
261
- }
262
 
263
- if ($update_email_configuration_array["auth_type"] == "oauth2" && $update_email_configuration_array["mailer_type"] == "smtp") {
264
- if ($update_email_configuration_array["hostname"] == "smtp.gmail.com") {
265
- $mail_bank_auth_host->google_authentication();
266
- } elseif ($update_email_configuration_array["hostname"] == "smtp.live.com" && $update_email_configuration_array["mailer_type"] == "smtp") {
267
- $mail_bank_auth_host->microsoft_authentication();
268
- } elseif (in_array($update_email_configuration_array["hostname"], $mail_bank_auth_host->yahoo_domains)) {
269
- $mail_bank_auth_host->yahoo_authentication();
270
- }
271
- } else {
272
- $update_email_configuration_data_array = array();
273
- $where = array();
274
- $where["meta_key"] = "email_configuration";
275
- $update_email_configuration_data_array["meta_value"] = serialize($update_email_configuration_array);
276
- $obj_dbHelper_mail_bank->updateCommand(mail_bank_meta(), $update_email_configuration_data_array, $where);
277
- }
278
- }
279
- break;
280
 
281
- case "mail_bank_connectivity_test":
282
- if (wp_verify_nonce(isset($_REQUEST["_wp_nonce"]) ? esc_attr($_REQUEST["_wp_nonce"]) : "", "connectivity_test_nonce")) {
283
- $host = isset($_REQUEST["smtp_host"]) ? esc_attr($_REQUEST["smtp_host"]) : "";
284
- $ports = array(25, 587, 465, 2525, 4065, 25025);
285
- $ports_result = array();
286
- foreach ($ports as $port) {
287
- $connection = @fsockopen($host, $port);
288
- if (is_resource($connection)) {
289
- $ports_result[$port] = "Open";
290
- fclose($connection);
291
- } else {
292
- $ports_result[$port] = "Close";
293
- }
294
- }
295
- foreach ($ports_result as $results => $val) {
296
- ?>
297
- <tr>
298
- <td>
299
- <?php echo $mb_smtp; ?>
300
- </td>
301
- <td>
302
- <?php echo $host . ":" . intval($results); ?>
303
- </td>
304
- <td>
305
- <span style="<?php echo $val == 'Close' ? 'color:red' : ""; ?>"><?php echo $val; ?>
306
- </td>
307
- </tr>
308
- <?php
309
- }
310
- }
311
- break;
312
- }
313
- die();
314
  }
315
  }
316
  }
15
  $access_granted = false;
16
  foreach ($user_role_permission as $permission) {
17
  if (current_user_can($permission)) {
18
+ $access_granted = true;
19
+ break;
20
  }
21
  }
22
  if (!$access_granted) {
24
  } else {
25
 
26
  function get_mail_bank_details_maybe_unserialize($email_data_manage, $mb_date1, $mb_date2) {
27
+ $email_details = array();
28
+ foreach ($email_data_manage as $raw_row) {
29
+ $unserialize_data = maybe_unserialize($raw_row->meta_value);
30
+ $unserialize_data["id"] = $raw_row->id;
31
+ $unserialize_data["meta_id"] = $raw_row->meta_id;
32
+ if ($unserialize_data["timestamp"] >= $mb_date1 && $unserialize_data["timestamp"] <= $mb_date2)
33
+ array_push($email_details, $unserialize_data);
34
+ }
35
+ return $email_details;
36
  }
37
 
38
  if (isset($_REQUEST["param"])) {
39
+ $obj_dbHelper_mail_bank = new dbHelper_mail_bank();
40
+ switch (esc_attr($_REQUEST["param"])) {
41
+ case "wizard_wp_mail_bank":
42
+ if (wp_verify_nonce(isset($_REQUEST["_wp_nonce"]) ? esc_attr($_REQUEST["_wp_nonce"]) : "", "wp_mail_bank_check_status")) {
43
+ $type = isset($_REQUEST["type"]) ? esc_attr($_REQUEST["type"]) : "";
44
+ update_option("wp-mail-bank-wizard-set-up", $type);
45
+ if ($type == "opt_in") {
46
+ $plugin_info_wp_mail_bank = new plugin_info_wp_mail_bank();
47
+ global $wp_version;
48
+ $url = tech_banker_stats_url . "/wp-admin/admin-ajax.php";
49
+ $theme_details = array();
50
+ if ($wp_version >= 3.4) {
51
+ $active_theme = wp_get_theme();
52
+ $theme_details["theme_name"] = strip_tags($active_theme->Name);
53
+ $theme_details["theme_version"] = strip_tags($active_theme->Version);
54
+ $theme_details["author_url"] = strip_tags($active_theme->{"Author URI"});
55
+ }
56
 
57
+ $plugin_stat_data = array();
58
+ $plugin_stat_data["plugin_slug"] = "wp-mail-bank";
59
+ $plugin_stat_data["type"] = "standard_edition";
60
+ $plugin_stat_data["version_number"] = mail_bank_version_number;
61
+ $plugin_stat_data["status"] = $type;
62
+ $plugin_stat_data["event"] = "activate";
63
+ $plugin_stat_data["domain_url"] = site_url();
64
+ $plugin_stat_data["wp_language"] = defined("WPLANG") && WPLANG ? WPLANG : get_locale();
65
+ $plugin_stat_data["email"] = get_option("admin_email");
66
+ $plugin_stat_data["wp_version"] = $wp_version;
67
+ $plugin_stat_data["php_version"] = esc_html(phpversion());
68
+ $plugin_stat_data["mysql_version"] = $wpdb->db_version();
69
+ $plugin_stat_data["max_input_vars"] = ini_get("max_input_vars");
70
+ $plugin_stat_data["operating_system"] = PHP_OS . " (" . PHP_INT_SIZE * 8 . ") BIT";
71
+ $plugin_stat_data["php_memory_limit"] = ini_get("memory_limit") ? ini_get("memory_limit") : "N/A";
72
+ $plugin_stat_data["extensions"] = get_loaded_extensions();
73
+ $plugin_stat_data["plugins"] = $plugin_info_wp_mail_bank->get_plugin_info_wp_mail_bank();
74
+ $plugin_stat_data["themes"] = $theme_details;
75
 
76
+ $response = wp_safe_remote_post($url, array
77
+ (
78
+ "method" => "POST",
79
+ "timeout" => 45,
80
+ "redirection" => 5,
81
+ "httpversion" => "1.0",
82
+ "blocking" => true,
83
+ "headers" => array(),
84
+ "body" => array("data" => serialize($plugin_stat_data), "site_id" => get_option("mb_tech_banker_site_id") != "" ? get_option("mb_tech_banker_site_id") : "", "action" => "plugin_analysis_data")
85
+ ));
86
+ if (!is_wp_error($response)) {
87
+ $response["body"] != "" ? update_option("mb_tech_banker_site_id", $response["body"]) : "";
88
+ }
89
+ }
90
+ }
91
+ break;
92
 
93
+ case "mail_bank_set_hostname_port_module":
94
+ if (wp_verify_nonce(isset($_REQUEST["_wp_nonce"]) ? esc_attr($_REQUEST["_wp_nonce"]) : "", "mail_bank_set_hostname_port")) {
95
+ $smtp_user = isset($_REQUEST["smtp_user"]) ? esc_attr($_REQUEST["smtp_user"]) : "";
96
+ $hostname = substr(strrchr($smtp_user, "@"), 1);
97
+ $obj_mail_bank_discover_host = new mail_bank_discover_host();
98
+ $hostname_to_set = $obj_mail_bank_discover_host->get_smtp_from_email($hostname);
99
+ echo $hostname_to_set;
100
+ }
101
+ break;
102
 
103
+ case "mail_bank_test_email_configuration_module":
104
+ if (wp_verify_nonce(isset($_REQUEST["_wp_nonce"]) ? esc_attr($_REQUEST["_wp_nonce"]) : "", "mail_bank_test_email_configuration")) {
105
+ parse_str(isset($_REQUEST["data"]) ? base64_decode($_REQUEST["data"]) : "", $form_data);
106
+ global $phpmailer;
107
+ $logs = array();
108
+ if (!is_object($phpmailer) || !is_a($phpmailer, "PHPMailer")) {
109
+ if (file_exists(ABSPATH . WPINC . "/class-phpmailer.php"))
110
+ require_once ABSPATH . WPINC . "/class-phpmailer.php";
111
 
112
+ if (file_exists(ABSPATH . WPINC . "/class-smtp.php"))
113
+ require_once ABSPATH . WPINC . "/class-smtp.php";
114
 
115
+ $phpmailer = new PHPMailer(true);
116
+ }
117
+ $phpmailer->SMTPDebug = true;
118
 
119
+ $to = isset($form_data["ux_txt_email"]) ? esc_attr($form_data["ux_txt_email"]) : "";
120
+ $subject = stripcslashes(htmlspecialchars_decode($form_data["ux_txt_subject"], ENT_QUOTES));
121
+ $message = htmlspecialchars_decode(!empty($form_data["ux_email_configuration_text_area"]) ? esc_attr($form_data["ux_email_configuration_text_area"]) : "This is a demo Test Email for Email Setup - Mail Bank");
122
+ $headers = "Content-Type: text/html; charset= utf-8" . "\r\n";
123
+ $result = wp_mail($to, $subject, $message, $headers);
124
+ $mb_email_configuration_data = $wpdb->get_row
125
+ (
126
+ $wpdb->prepare
127
+ (
128
+ "SELECT meta_value FROM " . mail_bank_meta() .
129
+ " WHERE meta_key = %s", "email_configuration"
130
+ )
131
+ );
132
+ $unserialized_email_configuration_data = maybe_unserialize($mb_email_configuration_data->meta_value);
133
 
134
+ $settings_data = $wpdb->get_var
135
+ (
136
+ $wpdb->prepare
137
+ (
138
+ "SELECT meta_value FROM " . mail_bank_meta() .
139
+ " WHERE meta_key=%s", "settings"
140
+ )
141
+ );
142
+ $settings_data_array = maybe_unserialize($settings_data);
143
+ $debugging_output = "";
144
+ $mailer_type_mail_bank = isset($unserialized_email_configuration_data["mailer_type"]) ? esc_attr($unserialized_email_configuration_data["mailer_type"]) : "";
145
 
146
+ if ($mailer_type_mail_bank == "smtp") {
147
+ $mail_bank_mail_status = get_option("mail_bank_mail_status");
148
+ $debug_mode_mail_bank = isset($settings_data_array["debug_mode"]) ? esc_attr($settings_data_array["debug_mode"]) : "";
149
+ if ($debug_mode_mail_bank == "enable") {
150
+ $debugging_output .= $mb_email_configuration_send_test_email_textarea . "\n";
151
+ $debugging_output .= $mb_test_email_sending_test_email . " " . $to . "\n";
152
+ $debugging_output .= $mb_test_email_status . " : ";
153
+ $debugging_output .= get_option("mail_bank_is_mail_sent") == "Sent" ? $mb_status_sent : $mb_status_not_sent;
154
+ $debugging_output .= "\n----------------------------------------------------------------------------------------\n";
155
+ $debugging_output .= $mb_email_logs_debugging_output . " :\n";
156
+ $debugging_output .= "----------------------------------------------------------------------------------------\n";
157
+ }
158
+ $debugging_output .= $mail_bank_mail_status;
159
+ echo $debugging_output;
160
+ } else {
161
+ $to_address = $phpmailer->getToAddresses();
162
 
163
+ $email_logs_data_array = array();
164
+ $email_logs_data_array["email_to"] = $to_address[0][0];
165
+ $monitor_email_logs = isset($settings_data_array["monitor_email_logs"]) ? esc_attr($settings_data_array["monitor_email_logs"]) : "";
166
+ if ($monitor_email_logs == "enable") {
167
+ $email_logs_data_array["sender_name"] = isset($unserialized_email_configuration_data["sender_name"]) ? esc_attr($unserialized_email_configuration_data["sender_name"]) : "";
168
+ $email_logs_data_array["sender_email"] = isset($unserialized_email_configuration_data["sender_email"]) ? esc_attr($unserialized_email_configuration_data["sender_email"]) : "";
169
+ $email_logs_data_array["cc"] = "";
170
+ $email_logs_data_array["bcc"] = "";
171
+ $email_logs_data_array["subject"] = $phpmailer->Subject;
172
+ $email_logs_data_array["content"] = $phpmailer->Body;
173
+ $email_logs_data_array["timestamp"] = MAIL_BANK_LOCAL_TIME;
174
 
175
+ if ($result == "true" || $result == "1") {
176
+ $email_logs_data_array["status"] = "Sent";
177
+ } else {
178
+ $email_logs_data_array["status"] = "Not Sent";
179
+ }
180
+ $email_logs_id = $wpdb->get_var
181
+ (
182
+ $wpdb->prepare
183
+ (
184
+ "SELECT id FROM " . mail_bank() .
185
+ " WHERE type = %s", "email_logs"
186
+ )
187
+ );
188
 
189
+ $email_logs_data = array();
190
+ $email_logs_data["meta_id"] = $email_logs_id;
191
+ $email_logs_data["meta_key"] = "email_logs";
192
+ $email_logs_data["meta_value"] = serialize($email_logs_data_array);
193
+ $obj_dbHelper_mail_bank->insertCommand(mail_bank_meta(), $email_logs_data);
194
+ }
195
+ echo $result;
196
+ }
197
+ }
198
+ break;
199
 
200
+ case "mail_bank_settings_module":
201
+ if (wp_verify_nonce(isset($_REQUEST["_wp_nonce"]) ? esc_attr($_REQUEST["_wp_nonce"]) : "", "mail_bank_settings")) {
202
+ parse_str(isset($_REQUEST["data"]) ? base64_decode($_REQUEST["data"]) : "", $settings_array);
203
 
204
+ $settings_data = array();
205
+ $settings_data["debug_mode"] = esc_attr($settings_array["ux_ddl_debug_mode"]);
206
+ $settings_data["remove_tables_at_uninstall"] = esc_attr($settings_array["ux_ddl_remove_tables"]);
207
+ $settings_data["monitor_email_logs"] = esc_attr($settings_array["ux_ddl_monitor_email_logs"]);
208
+ $where = array();
209
+ $settings_data_array = array();
210
+ $where["meta_key"] = "settings";
211
+ $settings_data_array["meta_value"] = serialize($settings_data);
212
+ $obj_dbHelper_mail_bank->updateCommand(mail_bank_meta(), $settings_data_array, $where);
213
+ }
214
+ break;
215
 
216
+ case "mail_bank_email_configuration_settings_module":
217
+ if (wp_verify_nonce(isset($_REQUEST["_wp_nonce"]) ? esc_attr($_REQUEST["_wp_nonce"]) : "", "mail_bank_email_configuration_settings")) {
218
+ parse_str(isset($_REQUEST["data"]) ? base64_decode($_REQUEST["data"]) : "", $form_data);
219
+ $update_email_configuration_array = array();
220
+ $update_email_configuration_array["email_address"] = esc_attr($form_data["ux_txt_email_address"]);
221
+ $update_email_configuration_array["reply_to"] = "";
222
+ $update_email_configuration_array["cc"] = "";
223
+ $update_email_configuration_array["bcc"] = "";
224
+ $update_email_configuration_array["mailer_type"] = esc_attr($form_data["ux_ddl_type"]);
225
+ $update_email_configuration_array["sender_name_configuration"] = esc_attr($form_data["ux_ddl_from_name"]);
226
+ $update_email_configuration_array["sender_name"] = isset($form_data["ux_txt_mb_from_name"]) ? esc_html($form_data["ux_txt_mb_from_name"]) : "";
227
+ $update_email_configuration_array["from_email_configuration"] = esc_attr($form_data["ux_ddl_from_email"]);
228
+ $update_email_configuration_array["sender_email"] = isset($form_data["ux_txt_mb_from_email_configuration"]) ? esc_html($form_data["ux_txt_mb_from_email_configuration"]) : "";
229
+ $update_email_configuration_array["hostname"] = esc_html($form_data["ux_txt_host"]);
230
+ $update_email_configuration_array["port"] = intval($form_data["ux_txt_port"]);
231
+ $update_email_configuration_array["enc_type"] = esc_attr($form_data["ux_ddl_encryption"]);
232
+ $update_email_configuration_array["auth_type"] = esc_attr($form_data["ux_ddl_mb_authentication"]);
233
+ $update_email_configuration_array["client_id"] = esc_html(trim($form_data["ux_txt_client_id"]));
234
+ $update_email_configuration_array["client_secret"] = esc_html(trim($form_data["ux_txt_client_secret"]));
235
+ $update_email_configuration_array["username"] = esc_html($form_data["ux_txt_username"]);
236
+ $update_email_configuration_array["automatic_mail"] = isset($form_data["ux_chk_automatic_sent_mail"]) ? esc_html($form_data["ux_chk_automatic_sent_mail"]) : "";
237
 
238
+ if (preg_match('/^\**$/', $form_data["ux_txt_password"])) {
239
+ $email_configuration_data = $wpdb->get_var
240
+ (
241
+ $wpdb->prepare
242
+ (
243
+ "SELECT meta_value FROM " . mail_bank_meta() .
244
+ " WHERE meta_key=%s", "email_configuration"
245
+ )
246
+ );
247
+ $email_configuration_array = maybe_unserialize($email_configuration_data);
248
+ $update_email_configuration_array["password"] = isset($email_configuration_array["password"]) ? esc_attr($email_configuration_array["password"]) : "";
249
+ } else {
250
+ $update_email_configuration_array["password"] = base64_encode(esc_html($form_data["ux_txt_password"]));
251
+ }
252
 
253
+ $update_email_configuration_array["redirect_uri"] = esc_html($form_data["ux_txt_redirect_uri"]);
254
 
255
+ update_option("update_email_configuration", $update_email_configuration_array);
256
 
257
+ $mail_bank_auth_host = new mail_bank_auth_host($update_email_configuration_array);
258
+ if (!in_array($form_data["ux_txt_host"], $mail_bank_auth_host->oauth_domains) && $form_data["ux_ddl_mb_authentication"] == "oauth2") {
259
+ echo "100";
260
+ die();
261
+ }
262
 
263
+ if ($update_email_configuration_array["auth_type"] == "oauth2" && $update_email_configuration_array["mailer_type"] == "smtp") {
264
+ if ($update_email_configuration_array["hostname"] == "smtp.gmail.com") {
265
+ $mail_bank_auth_host->google_authentication();
266
+ } elseif ($update_email_configuration_array["hostname"] == "smtp.live.com" && $update_email_configuration_array["mailer_type"] == "smtp") {
267
+ $mail_bank_auth_host->microsoft_authentication();
268
+ } elseif (in_array($update_email_configuration_array["hostname"], $mail_bank_auth_host->yahoo_domains)) {
269
+ $mail_bank_auth_host->yahoo_authentication();
270
+ }
271
+ } else {
272
+ $update_email_configuration_data_array = array();
273
+ $where = array();
274
+ $where["meta_key"] = "email_configuration";
275
+ $update_email_configuration_data_array["meta_value"] = serialize($update_email_configuration_array);
276
+ $obj_dbHelper_mail_bank->updateCommand(mail_bank_meta(), $update_email_configuration_data_array, $where);
277
+ }
278
+ }
279
+ break;
280
 
281
+ case "mail_bank_connectivity_test":
282
+ if (wp_verify_nonce(isset($_REQUEST["_wp_nonce"]) ? esc_attr($_REQUEST["_wp_nonce"]) : "", "connectivity_test_nonce")) {
283
+ $host = isset($_REQUEST["smtp_host"]) ? esc_attr($_REQUEST["smtp_host"]) : "";
284
+ $ports = array(25, 587, 465, 2525, 4065, 25025);
285
+ $ports_result = array();
286
+ foreach ($ports as $port) {
287
+ $connection = @fsockopen($host, $port);
288
+ if (is_resource($connection)) {
289
+ $ports_result[$port] = "Open";
290
+ fclose($connection);
291
+ } else {
292
+ $ports_result[$port] = "Close";
293
+ }
294
+ }
295
+ foreach ($ports_result as $results => $val) {
296
+ ?>
297
+ <tr>
298
+ <td>
299
+ <?php echo $mb_smtp; ?>
300
+ </td>
301
+ <td>
302
+ <?php echo $host . ":" . intval($results); ?>
303
+ </td>
304
+ <td>
305
+ <span style="<?php echo $val == 'Close' ? 'color:red' : ""; ?>"><?php echo $val; ?>
306
+ </td>
307
+ </tr>
308
+ <?php
309
+ }
310
+ }
311
+ break;
312
+ }
313
+ die();
314
  }
315
  }
316
  }
lib/admin-bar-menu.php CHANGED
@@ -16,8 +16,8 @@ if (!is_user_logged_in()) {
16
  $access_granted = false;
17
  foreach ($user_role_permission as $permission) {
18
  if (current_user_can($permission)) {
19
- $access_granted = true;
20
- break;
21
  }
22
  }
23
  if (!$access_granted) {
@@ -26,121 +26,121 @@ if (!is_user_logged_in()) {
26
  $flag = 0;
27
 
28
  $role_capabilities = $wpdb->get_var
29
- (
30
- $wpdb->prepare
31
- (
32
- "SELECT meta_value FROM " . mail_bank_meta() . "
33
  WHERE meta_key = %s", "roles_and_capabilities"
34
- )
35
  );
36
 
37
  $roles_and_capabilities_unserialized_data = maybe_unserialize($role_capabilities);
38
  $capabilities = explode(",", isset($roles_and_capabilities_unserialized_data["roles_and_capabilities"]) ? esc_attr($roles_and_capabilities_unserialized_data["roles_and_capabilities"]) : "");
39
 
40
  if (is_super_admin()) {
41
- $mb_role = "administrator";
42
  } else {
43
- $mb_role = check_user_roles_mail_bank();
44
  }
45
  switch ($mb_role) {
46
- case "administrator":
47
- $flag = $capabilities[0];
48
- break;
49
 
50
- case "author":
51
- $flag = $capabilities[1];
52
- break;
53
 
54
- case "editor":
55
- $flag = $capabilities[2];
56
- break;
57
 
58
- case "contributor":
59
- $flag = $capabilities[3];
60
- break;
61
 
62
- case "subscriber":
63
- $flag = $capabilities[4];
64
- break;
65
 
66
- default:
67
- $flag = $capabilities[5];
68
- break;
69
  }
70
 
71
  if ($flag == "1") {
72
- global $wp_version;
73
- $icon = "<img style=\"vertical-align:middle; margin-right:3px;\" src=" . plugins_url("assets/global/img/icon.png", dirname(__FILE__)) . ">";
74
- $wp_admin_bar->add_menu(array
75
- (
76
- "id" => "wp_mail_bank",
77
- "title" => $icon . "<span class=\"ab-label\">" . $wp_mail_bank . "</span>",
78
- "href" => admin_url("admin.php?page=mb_email_configuration")
79
- ));
80
- $wp_admin_bar->add_menu(array
81
- (
82
- "parent" => "wp_mail_bank",
83
- "id" => "email_configuration_mail_bank",
84
- "title" => $mb_email_configuration,
85
- "href" => admin_url("admin.php?page=mb_email_configuration")
86
- ));
87
- $wp_admin_bar->add_menu(array
88
- (
89
- "parent" => "wp_mail_bank",
90
- "id" => "test_email_mail_bank",
91
- "title" => $mb_test_email,
92
- "href" => admin_url("admin.php?page=mb_test_email")
93
- ));
94
- $wp_admin_bar->add_menu(array
95
- (
96
- "parent" => "wp_mail_bank",
97
- "id" => "connectivity_test_mail_bank",
98
- "title" => $mb_connectivity_test,
99
- "href" => admin_url("admin.php?page=mb_connectivity_test")
100
- ));
101
- $wp_admin_bar->add_menu(array
102
- (
103
- "parent" => "wp_mail_bank",
104
- "id" => "email_logs_mail_bank",
105
- "title" => $mb_email_logs,
106
- "href" => admin_url("admin.php?page=mb_email_logs")
107
- ));
108
 
109
- $wp_admin_bar->add_menu(array
110
- (
111
- "parent" => "wp_mail_bank",
112
- "id" => "general_settings_mail_bank",
113
- "title" => $mb_settings,
114
- "href" => admin_url("admin.php?page=mb_settings")
115
- ));
116
- $wp_admin_bar->add_menu(array
117
- (
118
- "parent" => "wp_mail_bank",
119
- "id" => "roles_and_capabilities_mail_bank",
120
- "title" => $mb_roles_and_capabilities,
121
- "href" => admin_url("admin.php?page=mb_roles_and_capabilities")
122
- ));
123
- $wp_admin_bar->add_menu(array
124
- (
125
- "parent" => "wp_mail_bank",
126
- "id" => "feedbacks_mail_bank",
127
- "title" => $mb_feedbacks,
128
- "href" => admin_url("admin.php?page=mb_feedbacks")
129
- ));
130
- $wp_admin_bar->add_menu(array
131
- (
132
- "parent" => "wp_mail_bank",
133
- "id" => "system_information_mail_bank",
134
- "title" => $mb_system_information,
135
- "href" => admin_url("admin.php?page=mb_system_information")
136
- ));
137
- $wp_admin_bar->add_menu(array
138
- (
139
- "parent" => "wp_mail_bank",
140
- "id" => "mb_upgrade",
141
- "title" => $mb_upgrade,
142
- "href" => admin_url("admin.php?page=mb_upgrade")
143
- ));
144
  }
145
  }
146
  }
16
  $access_granted = false;
17
  foreach ($user_role_permission as $permission) {
18
  if (current_user_can($permission)) {
19
+ $access_granted = true;
20
+ break;
21
  }
22
  }
23
  if (!$access_granted) {
26
  $flag = 0;
27
 
28
  $role_capabilities = $wpdb->get_var
29
+ (
30
+ $wpdb->prepare
31
+ (
32
+ "SELECT meta_value FROM " . mail_bank_meta() . "
33
  WHERE meta_key = %s", "roles_and_capabilities"
34
+ )
35
  );
36
 
37
  $roles_and_capabilities_unserialized_data = maybe_unserialize($role_capabilities);
38
  $capabilities = explode(",", isset($roles_and_capabilities_unserialized_data["roles_and_capabilities"]) ? esc_attr($roles_and_capabilities_unserialized_data["roles_and_capabilities"]) : "");
39
 
40
  if (is_super_admin()) {
41
+ $mb_role = "administrator";
42
  } else {
43
+ $mb_role = check_user_roles_mail_bank();
44
  }
45
  switch ($mb_role) {
46
+ case "administrator":
47
+ $flag = $capabilities[0];
48
+ break;
49
 
50
+ case "author":
51
+ $flag = $capabilities[1];
52
+ break;
53
 
54
+ case "editor":
55
+ $flag = $capabilities[2];
56
+ break;
57
 
58
+ case "contributor":
59
+ $flag = $capabilities[3];
60
+ break;
61
 
62
+ case "subscriber":
63
+ $flag = $capabilities[4];
64
+ break;
65
 
66
+ default:
67
+ $flag = $capabilities[5];
68
+ break;
69
  }
70
 
71
  if ($flag == "1") {
72
+ global $wp_version;
73
+ $icon = "<img style=\"vertical-align:middle; margin-right:3px;\" src=" . plugins_url("assets/global/img/icon.png", dirname(__FILE__)) . ">";
74
+ $wp_admin_bar->add_menu(array
75
+ (
76
+ "id" => "wp_mail_bank",
77
+ "title" => $icon . "<span class=\"ab-label\">" . $wp_mail_bank . "</span>",
78
+ "href" => admin_url("admin.php?page=mb_email_configuration")
79
+ ));
80
+ $wp_admin_bar->add_menu(array
81
+ (
82
+ "parent" => "wp_mail_bank",
83
+ "id" => "email_configuration_mail_bank",
84
+ "title" => $mb_email_configuration,
85
+ "href" => admin_url("admin.php?page=mb_email_configuration")
86
+ ));
87
+ $wp_admin_bar->add_menu(array
88
+ (
89
+ "parent" => "wp_mail_bank",
90
+ "id" => "test_email_mail_bank",
91
+ "title" => $mb_test_email,
92
+ "href" => admin_url("admin.php?page=mb_test_email")
93
+ ));
94
+ $wp_admin_bar->add_menu(array
95
+ (
96
+ "parent" => "wp_mail_bank",
97
+ "id" => "connectivity_test_mail_bank",
98
+ "title" => $mb_connectivity_test,
99
+ "href" => admin_url("admin.php?page=mb_connectivity_test")
100
+ ));
101
+ $wp_admin_bar->add_menu(array
102
+ (
103
+ "parent" => "wp_mail_bank",
104
+ "id" => "email_logs_mail_bank",
105
+ "title" => $mb_email_logs,
106
+ "href" => admin_url("admin.php?page=mb_email_logs")
107
+ ));
108
 
109
+ $wp_admin_bar->add_menu(array
110
+ (
111
+ "parent" => "wp_mail_bank",
112
+ "id" => "general_settings_mail_bank",
113
+ "title" => $mb_settings,
114
+ "href" => admin_url("admin.php?page=mb_settings")
115
+ ));
116
+ $wp_admin_bar->add_menu(array
117
+ (
118
+ "parent" => "wp_mail_bank",
119
+ "id" => "roles_and_capabilities_mail_bank",
120
+ "title" => $mb_roles_and_capabilities,
121
+ "href" => admin_url("admin.php?page=mb_roles_and_capabilities")
122
+ ));
123
+ $wp_admin_bar->add_menu(array
124
+ (
125
+ "parent" => "wp_mail_bank",
126
+ "id" => "feedbacks_mail_bank",
127
+ "title" => $mb_feedbacks,
128
+ "href" => admin_url("admin.php?page=mb_feedbacks")
129
+ ));
130
+ $wp_admin_bar->add_menu(array
131
+ (
132
+ "parent" => "wp_mail_bank",
133
+ "id" => "system_information_mail_bank",
134
+ "title" => $mb_system_information,
135
+ "href" => admin_url("admin.php?page=mb_system_information")
136
+ ));
137
+ $wp_admin_bar->add_menu(array
138
+ (
139
+ "parent" => "wp_mail_bank",
140
+ "id" => "mb_upgrade",
141
+ "title" => $mb_upgrade,
142
+ "href" => admin_url("admin.php?page=mb_upgrade")
143
+ ));
144
  }
145
  }
146
  }
lib/helper.php CHANGED
@@ -16,8 +16,8 @@ if (!is_user_logged_in()) {
16
  $access_granted = false;
17
  foreach ($user_role_permission as $permission) {
18
  if (current_user_can($permission)) {
19
- $access_granted = true;
20
- break;
21
  }
22
  }
23
  if (!$access_granted) {
@@ -32,77 +32,77 @@ if (!is_user_logged_in()) {
32
  */
33
 
34
  class dbHelper_mail_bank {
35
- /*
36
- Function Name: insertCommand
37
- Parameters: Yes($table_name,$data)
38
- Description: This Function is used for Insert data in database.
39
- Created On: 15-06-2016 10:43
40
- Created By: Tech Banker Team
41
- */
42
-
43
- function insertCommand($table_name, $data) {
44
- global $wpdb;
45
- $wpdb->insert($table_name, $data);
46
- return $wpdb->insert_id;
47
- }
48
-
49
- /*
50
- Function Name: updateCommand
51
- Parameters: Yes($table_name,$data,$where)
52
- Description: This function is used for Update data in database.
53
- Created On: 15-06-2016 10:43
54
- Created By: Tech Banker Team
55
- */
56
-
57
- function updateCommand($table_name, $data, $where) {
58
- global $wpdb;
59
- $wpdb->update($table_name, $data, $where);
60
- }
61
-
62
- /*
63
- Function Name: deleteCommand
64
- Parameters: Yes($table_name,$where)
65
- Description: This function is used for delete data from database.
66
- Created On: 15-06-2016 10:43
67
- Created By: Tech Banker Team
68
- */
69
-
70
- function deleteCommand($table_name, $where) {
71
- global $wpdb;
72
- $wpdb->delete($table_name, $where);
73
- }
74
-
75
- /*
76
- Function Name: file_reader
77
- Parameters: Yes($filepath)
78
- Description: This function is used to read file contents
79
- Created On: 18-01-2017 11:24
80
- Created By: Tech Banker Team
81
- */
82
-
83
- public static function file_reader($filepath) {
84
- $reader = "";
85
- if (file_exists($filepath)) {
86
- $reader = file_get_contents($filepath);
87
- }
88
- return $reader;
89
- }
90
-
91
- /*
92
- Function Name: bulk_deleteCommand
93
- Parameters: Yes($table_name,$data,$where)
94
- Decription: This function is being used to delete multiple data from database.
95
- Created On: 15-06-2016 10:43
96
- Created By: Tech Banker Team
97
- */
98
-
99
- function bulk_deleteCommand($table_name, $where, $data) {
100
- global $wpdb;
101
- $wpdb->query
102
- (
103
- "DELETE FROM $table_name WHERE $where IN ($data)"
104
- );
105
- }
106
 
107
  }
108
 
@@ -116,111 +116,111 @@ if (!is_user_logged_in()) {
116
 
117
  class mail_bank_discover_host {
118
 
119
- public $domain;
120
- public $email_domains = array(
121
- "1and1.com" => "smtp.1and1.com",
122
- "airmail.net" => "smtp.airmail.net",
123
- "aol.com" => "smtp.aol.com",
124
- "Bluewin.ch" => "Smtpauths.bluewin.ch",
125
- "Comcast.net" => "Smtp.comcast.net",
126
- "Earthlink.net" => "Smtpauth.earthlink.net",
127
- "gmail.com" => "smtp.gmail.com",
128
- "Gmx.com" => "mail.gmx.com",
129
- "Gmx.net" => "mail.gmx.com",
130
- "Gmx.us" => "mail.gmx.com",
131
- "hotmail.com" => "smtp.live.com",
132
- "outlook.com" => "smtp.live.com",
133
- "icloud.com" => "smtp.mail.me.com",
134
- "mail.com" => "smtp.mail.com",
135
- "ntlworld.com" => "smtp.ntlworld.com",
136
- "rocketmail.com" => "smtp.mail.yahoo.com",
137
- "rogers.com" => "smtp.broadband.rogers.com",
138
- "yahoo.ca" => "smtp.mail.yahoo.ca",
139
- "yahoo.co.id" => "smtp.mail.yahoo.co.id",
140
- "yahoo.co.in" => "smtp.mail.yahoo.co.in",
141
- "yahoo.co.kr" => "smtp.mail.yahoo.com",
142
- "yahoo.com" => "smtp.mail.yahoo.com",
143
- "yahoo.com.ar" => "smtp.mail.yahoo.com.ar",
144
- "yahoo.com.au" => "smtp.mail.yahoo.com.au",
145
- "yahoo.com.br" => "smtp.mail.yahoo.com.br",
146
- "yahoo.com.cn" => "smtp.mail.yahoo.com.cn",
147
- "yahoo.com.hk" => "smtp.mail.yahoo.com.hk",
148
- "yahoo.com.mx" => "smtp.mail.yahoo.com",
149
- "yahoo.com.my" => "smtp.mail.yahoo.com.my",
150
- "yahoo.com.ph" => "smtp.mail.yahoo.com.ph",
151
- "yahoo.com.sg" => "smtp.mail.yahoo.com.sg",
152
- "yahoo.com.tw" => "smtp.mail.yahoo.com.tw",
153
- "yahoo.com.vn" => "smtp.mail.yahoo.com.vn",
154
- "yahoo.co.nz" => "smtp.mail.yahoo.com.au",
155
- "yahoo.co.th" => "smtp.mail.yahoo.co.th",
156
- "yahoo.co.uk" => "smtp.mail.yahoo.co.uk",
157
- "ymail.com" => "smtp.mail.yahoo.com",
158
- "yahoo.de" => "smtp.mail.yahoo.de",
159
- "yahoo.es" => "smtp.correo.yahoo.es",
160
- "yahoo.fr" => "smtp.mail.yahoo.fr",
161
- "yahoo.ie" => "smtp.mail.yahoo.co.uk",
162
- "yahoo.it" => "smtp.mail.yahoo.it",
163
- "zoho.com" => "smtp.zoho.com",
164
- "ameritech.net" => "outbound.att.net",
165
- "att.net" => "outbound.att.net",
166
- "bellsouth.net" => "outbound.att.net",
167
- "flash.net" => "outbound.att.net",
168
- "nvbell.net" => "outbound.att.net",
169
- "pacbell.net" => "outbound.att.net",
170
- "prodigy.net" => "outbound.att.net",
171
- "sbcglobal.net" => "outbound.att.net",
172
- "snet.net" => "outbound.att.net",
173
- "swbell.net" => "outbound.att.net",
174
- "wans.net" => "outbound.att.net"
175
- );
176
-
177
- /*
178
- Function Name: get_smtp_from_email
179
- Parameters: Yes($hostname)
180
- Description: This Function is used for getting hostname.
181
- Created On: 15-06-2016 10:43
182
- Created By: Tech Banker Team
183
- */
184
-
185
- public function get_smtp_from_email($hostname) {
186
- reset($this->email_domains);
187
- while (list($domain, $smtp) = each($this->email_domains)) {
188
- if (strcasecmp($hostname, $domain) == 0) {
189
- return $smtp;
190
- }
191
- }
192
- return false;
193
- }
194
 
195
  }
196
 
197
  class plugin_info_wp_mail_bank {
198
- /*
199
- Function Name: get_plugin_info_wp_mail_bank
200
- Parameters: No
201
- Decription: This function is used to return the information about plugins.
202
- Created On: 21-04-2017 09:48
203
- Created By: Tech Banker Team
204
- */
205
-
206
- function get_plugin_info_wp_mail_bank() {
207
- $active_plugins = (array) get_option("active_plugins", array());
208
- if (is_multisite())
209
- $active_plugins = array_merge($active_plugins, get_site_option("active_sitewide_plugins", array()));
210
- $plugins = array();
211
- if (count($active_plugins) > 0) {
212
- $get_plugins = array();
213
- foreach ($active_plugins as $plugin) {
214
- $plugin_data = @get_plugin_data(WP_PLUGIN_DIR . "/" . $plugin);
215
-
216
- $get_plugins["plugin_name"] = strip_tags($plugin_data["Name"]);
217
- $get_plugins["plugin_author"] = strip_tags($plugin_data["Author"]);
218
- $get_plugins["plugin_version"] = strip_tags($plugin_data["Version"]);
219
- array_push($plugins, $get_plugins);
220
- }
221
- return $plugins;
222
- }
223
- }
224
 
225
  }
226
 
16
  $access_granted = false;
17
  foreach ($user_role_permission as $permission) {
18
  if (current_user_can($permission)) {
19
+ $access_granted = true;
20
+ break;
21
  }
22
  }
23
  if (!$access_granted) {
32
  */
33
 
34
  class dbHelper_mail_bank {
35
+ /*
36
+ Function Name: insertCommand
37
+ Parameters: Yes($table_name,$data)
38
+ Description: This Function is used for Insert data in database.
39
+ Created On: 15-06-2016 10:43
40
+ Created By: Tech Banker Team
41
+ */
42
+
43
+ function insertCommand($table_name, $data) {
44
+ global $wpdb;
45
+ $wpdb->insert($table_name, $data);
46
+ return $wpdb->insert_id;
47
+ }
48
+
49
+ /*
50
+ Function Name: updateCommand
51
+ Parameters: Yes($table_name,$data,$where)
52
+ Description: This function is used for Update data in database.
53
+ Created On: 15-06-2016 10:43
54
+ Created By: Tech Banker Team
55
+ */
56
+
57
+ function updateCommand($table_name, $data, $where) {
58
+ global $wpdb;
59
+ $wpdb->update($table_name, $data, $where);
60
+ }
61
+
62
+ /*
63
+ Function Name: deleteCommand
64
+ Parameters: Yes($table_name,$where)
65
+ Description: This function is used for delete data from database.
66
+ Created On: 15-06-2016 10:43
67
+ Created By: Tech Banker Team
68
+ */
69
+
70
+ function deleteCommand($table_name, $where) {
71
+ global $wpdb;
72
+ $wpdb->delete($table_name, $where);
73
+ }
74
+
75
+ /*
76
+ Function Name: file_reader
77
+ Parameters: Yes($filepath)
78
+ Description: This function is used to read file contents
79
+ Created On: 18-01-2017 11:24
80
+ Created By: Tech Banker Team
81
+ */
82
+
83
+ public static function file_reader($filepath) {
84
+ $reader = "";
85
+ if (file_exists($filepath)) {
86
+ $reader = file_get_contents($filepath);
87
+ }
88
+ return $reader;
89
+ }
90
+
91
+ /*
92
+ Function Name: bulk_deleteCommand
93
+ Parameters: Yes($table_name,$data,$where)
94
+ Decription: This function is being used to delete multiple data from database.
95
+ Created On: 15-06-2016 10:43
96
+ Created By: Tech Banker Team
97
+ */
98
+
99
+ function bulk_deleteCommand($table_name, $where, $data) {
100
+ global $wpdb;
101
+ $wpdb->query
102
+ (
103
+ "DELETE FROM $table_name WHERE $where IN ($data)"
104
+ );
105
+ }
106
 
107
  }
108
 
116
 
117
  class mail_bank_discover_host {
118
 
119
+ public $domain;
120
+ public $email_domains = array(
121
+ "1and1.com" => "smtp.1and1.com",
122
+ "airmail.net" => "smtp.airmail.net",
123
+ "aol.com" => "smtp.aol.com",
124
+ "Bluewin.ch" => "Smtpauths.bluewin.ch",
125
+ "Comcast.net" => "Smtp.comcast.net",
126
+ "Earthlink.net" => "Smtpauth.earthlink.net",
127
+ "gmail.com" => "smtp.gmail.com",
128
+ "Gmx.com" => "mail.gmx.com",
129
+ "Gmx.net" => "mail.gmx.com",
130
+ "Gmx.us" => "mail.gmx.com",
131
+ "hotmail.com" => "smtp.live.com",
132
+ "outlook.com" => "smtp.live.com",
133
+ "icloud.com" => "smtp.mail.me.com",
134
+ "mail.com" => "smtp.mail.com",
135
+ "ntlworld.com" => "smtp.ntlworld.com",
136
+ "rocketmail.com" => "smtp.mail.yahoo.com",
137
+ "rogers.com" => "smtp.broadband.rogers.com",
138
+ "yahoo.ca" => "smtp.mail.yahoo.ca",
139
+ "yahoo.co.id" => "smtp.mail.yahoo.co.id",
140
+ "yahoo.co.in" => "smtp.mail.yahoo.co.in",
141
+ "yahoo.co.kr" => "smtp.mail.yahoo.com",
142
+ "yahoo.com" => "smtp.mail.yahoo.com",
143
+ "yahoo.com.ar" => "smtp.mail.yahoo.com.ar",
144
+ "yahoo.com.au" => "smtp.mail.yahoo.com.au",
145
+ "yahoo.com.br" => "smtp.mail.yahoo.com.br",
146
+ "yahoo.com.cn" => "smtp.mail.yahoo.com.cn",
147
+ "yahoo.com.hk" => "smtp.mail.yahoo.com.hk",
148
+ "yahoo.com.mx" => "smtp.mail.yahoo.com",
149
+ "yahoo.com.my" => "smtp.mail.yahoo.com.my",
150
+ "yahoo.com.ph" => "smtp.mail.yahoo.com.ph",
151
+ "yahoo.com.sg" => "smtp.mail.yahoo.com.sg",
152
+ "yahoo.com.tw" => "smtp.mail.yahoo.com.tw",
153
+ "yahoo.com.vn" => "smtp.mail.yahoo.com.vn",
154
+ "yahoo.co.nz" => "smtp.mail.yahoo.com.au",
155
+ "yahoo.co.th" => "smtp.mail.yahoo.co.th",
156
+ "yahoo.co.uk" => "smtp.mail.yahoo.co.uk",
157
+ "ymail.com" => "smtp.mail.yahoo.com",
158
+ "yahoo.de" => "smtp.mail.yahoo.de",
159
+ "yahoo.es" => "smtp.correo.yahoo.es",
160
+ "yahoo.fr" => "smtp.mail.yahoo.fr",
161
+ "yahoo.ie" => "smtp.mail.yahoo.co.uk",
162
+ "yahoo.it" => "smtp.mail.yahoo.it",
163
+ "zoho.com" => "smtp.zoho.com",
164
+ "ameritech.net" => "outbound.att.net",
165
+ "att.net" => "outbound.att.net",
166
+ "bellsouth.net" => "outbound.att.net",
167
+ "flash.net" => "outbound.att.net",
168
+ "nvbell.net" => "outbound.att.net",
169
+ "pacbell.net" => "outbound.att.net",
170
+ "prodigy.net" => "outbound.att.net",
171
+ "sbcglobal.net" => "outbound.att.net",
172
+ "snet.net" => "outbound.att.net",
173
+ "swbell.net" => "outbound.att.net",
174
+ "wans.net" => "outbound.att.net"
175
+ );
176
+
177
+ /*
178
+ Function Name: get_smtp_from_email
179
+ Parameters: Yes($hostname)
180
+ Description: This Function is used for getting hostname.
181
+ Created On: 15-06-2016 10:43
182
+ Created By: Tech Banker Team
183
+ */
184
+
185
+ public function get_smtp_from_email($hostname) {
186
+ reset($this->email_domains);
187
+ while (list($domain, $smtp) = each($this->email_domains)) {
188
+ if (strcasecmp($hostname, $domain) == 0) {
189
+ return $smtp;
190
+ }
191
+ }
192
+ return false;
193
+ }
194
 
195
  }
196
 
197
  class plugin_info_wp_mail_bank {
198
+ /*
199
+ Function Name: get_plugin_info_wp_mail_bank
200
+ Parameters: No
201
+ Decription: This function is used to return the information about plugins.
202
+ Created On: 21-04-2017 09:48
203
+ Created By: Tech Banker Team
204
+ */
205
+
206
+ function get_plugin_info_wp_mail_bank() {
207
+ $active_plugins = (array) get_option("active_plugins", array());
208
+ if (is_multisite())
209
+ $active_plugins = array_merge($active_plugins, get_site_option("active_sitewide_plugins", array()));
210
+ $plugins = array();
211
+ if (count($active_plugins) > 0) {
212
+ $get_plugins = array();
213
+ foreach ($active_plugins as $plugin) {
214
+ $plugin_data = @get_plugin_data(WP_PLUGIN_DIR . "/" . $plugin);
215
+
216
+ $get_plugins["plugin_name"] = strip_tags($plugin_data["Name"]);
217
+ $get_plugins["plugin_author"] = strip_tags($plugin_data["Author"]);
218
+ $get_plugins["plugin_version"] = strip_tags($plugin_data["Version"]);
219
+ array_push($plugins, $get_plugins);
220
+ }
221
+ return $plugins;
222
+ }
223
+ }
224
 
225
  }
226
 
lib/install-script.php CHANGED
@@ -25,42 +25,42 @@ if (!is_user_logged_in()) {
25
  */
26
 
27
  class dbHelper_install_script_mail_bank {
28
- /*
29
- Function Name: insertCommand
30
- Parameters: Yes($table_name,$data)
31
- Description: This Function is used to Insert data in database.
32
- Created On: 05-02-2016 11:40
33
- Created By: Tech Banker Team
34
- */
35
-
36
- function insertCommand($table_name, $data) {
37
- global $wpdb;
38
- $wpdb->insert($table_name, $data);
39
- return $wpdb->insert_id;
40
- }
41
-
42
- /*
43
- Function Name: updateCommand
44
- Parameters: Yes($table_name,$data,$where)
45
- Description: This function is used to Update data.
46
- Created On: 05-02-2016 11:40
47
- Created By: Tech Banker Team
48
- */
49
-
50
- function updateCommand($table_name, $data, $where) {
51
- global $wpdb;
52
- $wpdb->update($table_name, $data, $where);
53
- }
54
 
55
  }
56
 
57
  if (file_exists(ABSPATH . "wp-admin/includes/upgrade.php"))
58
- require_once ABSPATH . "wp-admin/includes/upgrade.php";
59
 
60
  $mail_bank_version_number = get_option("mail-bank-version-number");
61
 
62
  function mail_bank_table() {
63
- $sql = "CREATE TABLE IF NOT EXISTS " . mail_bank() . "
64
  (
65
  `id` int(11) NOT NULL AUTO_INCREMENT,
66
  `type` varchar(100) NOT NULL,
@@ -68,20 +68,20 @@ if (!is_user_logged_in()) {
68
  PRIMARY KEY (`id`)
69
  )
70
  ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1";
71
- dbDelta($sql);
72
 
73
- $data = "INSERT INTO " . mail_bank() . " (`type`, `parent_id`) VALUES
74
  ('email_configuration', 0),
75
  ('email_logs', 0),
76
  ('settings', 0),
77
  ('roles_and_capabilities', 0)";
78
- dbDelta($data);
79
  }
80
 
81
  function mail_bank_meta_table() {
82
- $obj_dbHelper_install_script_mail_bank = new dbHelper_install_script_mail_bank();
83
- global $wpdb;
84
- $sql = "CREATE TABLE IF NOT EXISTS " . mail_bank_meta() . "
85
  (
86
  `id` int(11) NOT NULL AUTO_INCREMENT,
87
  `meta_id` int(11) NOT NULL,
@@ -90,293 +90,293 @@ if (!is_user_logged_in()) {
90
  PRIMARY KEY (`id`)
91
  )
92
  ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1";
93
- dbDelta($sql);
94
-
95
- $admin_email = get_option("admin_email");
96
- $admin_name = get_option("blogname");
97
-
98
- $mail_bank_table_data = $wpdb->get_results
99
- (
100
- "SELECT * FROM " . mail_bank()
101
- );
102
-
103
- foreach ($mail_bank_table_data as $row) {
104
- switch ($row->type) {
105
- case "email_configuration":
106
- $email_configuration_array = array();
107
- $email_configuration_array["email_address"] = $admin_email;
108
- $email_configuration_array["reply_to"] = "";
109
- $email_configuration_array["cc"] = "";
110
- $email_configuration_array["bcc"] = "";
111
- $email_configuration_array["mailer_type"] = "smtp";
112
- $email_configuration_array["sender_name"] = $admin_name;
113
- $email_configuration_array["sender_name_configuration"] = "override";
114
- $email_configuration_array["hostname"] = "";
115
- $email_configuration_array["port"] = "587";
116
- $email_configuration_array["client_id"] = "";
117
- $email_configuration_array["client_secret"] = "";
118
- $email_configuration_array["redirect_uri"] = "";
119
- $email_configuration_array["sender_email"] = $admin_email;
120
- $email_configuration_array["from_email_configuration"] = "override";
121
- $email_configuration_array["auth_type"] = "none";
122
- $email_configuration_array["username"] = $admin_email;
123
- $email_configuration_array["password"] = "";
124
- $email_configuration_array["enc_type"] = "tls";
125
-
126
- $email_configuration_array_data = array();
127
- $email_configuration_array_data["meta_id"] = $row->id;
128
- $email_configuration_array_data["meta_key"] = "email_configuration";
129
- $email_configuration_array_data["meta_value"] = serialize($email_configuration_array);
130
- $obj_dbHelper_install_script_mail_bank->insertCommand(mail_bank_meta(), $email_configuration_array_data);
131
- break;
132
-
133
- case "settings":
134
- $settings_data_array = array();
135
- $settings_data_array["debug_mode"] = "enable";
136
- $settings_data_array["remove_tables_at_uninstall"] = "enable";
137
- $settings_data_array["monitor_email_logs"] = "enable";
138
-
139
- $settings_array = array();
140
- $settings_array["meta_id"] = $row->id;
141
- $settings_array["meta_key"] = "settings";
142
- $settings_array["meta_value"] = serialize($settings_data_array);
143
- $obj_dbHelper_install_script_mail_bank->insertCommand(mail_bank_meta(), $settings_array);
144
- break;
145
-
146
- case "roles_and_capabilities":
147
- $roles_capabilities_data_array = array();
148
- $roles_capabilities_data_array["roles_and_capabilities"] = "1,1,1,0,0,0";
149
- $roles_capabilities_data_array["show_mail_bank_top_bar_menu"] = "enable";
150
- $roles_capabilities_data_array["others_full_control_capability"] = "0";
151
- $roles_capabilities_data_array["administrator_privileges"] = "1,1,1,1,1,1,1,1,1,1";
152
- $roles_capabilities_data_array["author_privileges"] = "0,0,1,0,0,0,0,0,0,0";
153
- $roles_capabilities_data_array["editor_privileges"] = "0,0,1,0,0,0,1,0,0,0";
154
- $roles_capabilities_data_array["contributor_privileges"] = "0,0,0,0,0,0,1,0,0,0";
155
- $roles_capabilities_data_array["subscriber_privileges"] = "0,0,0,0,0,0,0,0,0,0";
156
- $roles_capabilities_data_array["other_roles_privileges"] = "0,0,0,0,0,0,0,0,0,0";
157
- $user_capabilities = get_others_capabilities_mail_bank();
158
- $other_roles_array = array();
159
- $other_roles_access_array = array(
160
- "manage_options",
161
- "edit_plugins",
162
- "edit_posts",
163
- "publish_posts",
164
- "publish_pages",
165
- "edit_pages",
166
- "read"
167
- );
168
- foreach ($other_roles_access_array as $role) {
169
- if (in_array($role, $user_capabilities)) {
170
- array_push($other_roles_array, $role);
171
- }
172
- }
173
- $roles_capabilities_data_array["capabilities"] = $other_roles_array;
174
-
175
- $roles_data_array = array();
176
- $roles_data_array["meta_id"] = $row->id;
177
- $roles_data_array["meta_key"] = "roles_and_capabilities";
178
- $roles_data_array["meta_value"] = serialize($roles_capabilities_data_array);
179
- $obj_dbHelper_install_script_mail_bank->insertCommand(mail_bank_meta(), $roles_data_array);
180
- break;
181
- }
182
- }
183
  }
184
 
185
  $obj_dbHelper_install_script_mail_bank = new dbHelper_install_script_mail_bank();
186
  switch ($mail_bank_version_number) {
187
- case "":
188
- if (count($wpdb->get_var("SHOW TABLES LIKE '" . $wpdb->prefix . "mail_bank'")) != 0) {
189
- $mail_bank_data = $wpdb->get_row
190
- (
191
- "SELECT * FROM " . $wpdb->prefix . "mail_bank"
192
- );
193
-
194
- $wpdb->query("DROP TABLE IF EXISTS " . $wpdb->prefix . "mail_bank");
195
- mail_bank_table();
196
- mail_bank_meta_table();
197
-
198
- $get_from_name = get_option("show_from_name_in_email");
199
- $get_from_email = get_option("show_from_email_in_email");
200
-
201
- if (count($mail_bank_data) > 0) {
202
- $update_mail_bank_data = array();
203
- $update_mail_bank_data["email_address"] = get_option("admin_email");
204
- $update_mail_bank_data["reply_to"] = "";
205
- $update_mail_bank_data["cc"] = "";
206
- $update_mail_bank_data["bcc"] = "";
207
- $update_mail_bank_data["mailer_type"] = isset($mail_bank_data->mailer_type) && $mail_bank_data->mailer_type == 1 ? "php_mail_function" : "smtp";
208
- $update_mail_bank_data["sender_name_configuration"] = isset($get_from_name) && $get_from_name == 1 ? "override" : "dont_override";
209
- $update_mail_bank_data["sender_name"] = isset($mail_bank_data->from_name) ? esc_html($mail_bank_data->from_name) : esc_html(get_option("blogname"));
210
- $update_mail_bank_data["from_email_configuration"] = isset($get_from_email) && $get_from_email == 1 ? "override" : "dont_override";
211
- $update_mail_bank_data["sender_email"] = isset($mail_bank_data->from_email) ? esc_attr($mail_bank_data->from_email) : get_option("admin_email");
212
- $update_mail_bank_data["hostname"] = isset($mail_bank_data->smtp_host) ? esc_attr($mail_bank_data->smtp_host) : "";
213
- $update_mail_bank_data["port"] = isset($mail_bank_data->smtp_port) ? intval($mail_bank_data->smtp_port) : 0;
214
- $update_mail_bank_data["enc_type"] = isset($mail_bank_data->encryption) && (($mail_bank_data->encryption) == 0) ? "none" : ((($mail_bank_data->encryption) == 1) ? "ssl" : "tls");
215
- $update_mail_bank_data["auth_type"] = "login";
216
- $update_mail_bank_data["client_id"] = "";
217
- $update_mail_bank_data["client_secret"] = "";
218
- $update_mail_bank_data["redirect_uri"] = "";
219
- $update_mail_bank_data["username"] = isset($mail_bank_data->smtp_username) ? esc_attr($mail_bank_data->smtp_username) : "";
220
- $update_mail_bank_data["password"] = isset($mail_bank_data->smtp_password) ? base64_encode($mail_bank_data->smtp_password) : "";
221
- $update_mail_bank_data["automatic_mail"] = "1";
222
-
223
- $update_mail_bank_data_serialize = array();
224
- $where = array();
225
- $where["meta_id"] = $mail_bank_data->id;
226
- $where["meta_key"] = "email_configuration";
227
- $update_mail_bank_data_serialize["meta_value"] = serialize($update_mail_bank_data);
228
- $obj_dbHelper_install_script_mail_bank->updateCommand(mail_bank_meta(), $update_mail_bank_data_serialize, $where);
229
- }
230
- $plugin_settings_data = $wpdb->get_var
231
- (
232
- $wpdb->prepare
233
- (
234
- "SELECT meta_value FROM " . mail_bank_meta() . "
235
  WHERE meta_key = %s", "settings"
236
- )
237
- );
238
- $plugin_settings_data_unserialize = maybe_unserialize($plugin_settings_data);
239
-
240
- $update_plugin_data = array();
241
- $update_plugin_data["debug_mode"] = isset($plugin_settings_data_unserialize["debug_mode"]) ? esc_attr($plugin_settings_data_unserialize["debug_mode"]) : "enable";
242
- $update_plugin_data["remove_tables_at_uninstall"] = isset($plugin_settings_data_unserialize["remove_tables_at_uninstall"]) ? esc_attr($plugin_settings_data_unserialize["remove_tables_at_uninstall"]) : "disable";
243
- $update_plugin_data["monitor_email_logs"] = isset($plugin_settings_data_unserialize["monitor_email_logs"]) ? esc_attr($plugin_settings_data_unserialize["monitor_email_logs"]) : "enable";
244
-
245
- $update_plugin_settings_data_serialize = array();
246
- $where = array();
247
- $where["meta_key"] = "settings";
248
- $update_plugin_settings_data_serialize["meta_value"] = serialize($update_plugin_data);
249
- $obj_dbHelper_install_script_mail_bank->updateCommand(mail_bank_meta(), $update_plugin_settings_data_serialize, $where);
250
- } else {
251
- mail_bank_table();
252
- mail_bank_meta_table();
253
- }
254
- break;
255
-
256
- default:
257
- if (count($wpdb->get_var("SHOW TABLES LIKE '" . mail_bank() . "'")) != 0 && count($wpdb->get_var("SHOW TABLES LIKE '" . mail_bank_meta() . "'")) != 0) {
258
- $settings_data = $wpdb->get_var
259
- (
260
- $wpdb->prepare
261
- (
262
- "SELECT meta_value FROM " . mail_bank_meta() .
263
- " WHERE meta_key=%s", "settings"
264
- )
265
- );
266
-
267
- $settings_data_array = maybe_unserialize($settings_data);
268
- if (!array_key_exists("monitor_email_logs", $settings_data_array)) {
269
- $settings_data_array["monitor_email_logs"] = "enable";
270
- }
271
- $where = array();
272
- $settings_array = array();
273
- $where["meta_key"] = "settings";
274
- $settings_array["meta_value"] = serialize($settings_data_array);
275
- $obj_dbHelper_install_script_mail_bank->updateCommand(mail_bank_meta(), $settings_array, $where);
276
-
277
- $get_roles_settings_data = $wpdb->get_var
278
- (
279
- $wpdb->prepare
280
- (
281
- "SELECT meta_value FROM " . mail_bank_meta() .
282
- " WHERE meta_key=%s", "roles_and_capabilities"
283
- )
284
- );
285
-
286
- $get_roles_settings_data_array = maybe_unserialize($get_roles_settings_data);
287
-
288
- if (array_key_exists("roles_and_capabilities", $get_roles_settings_data_array)) {
289
- $roles_and_capabilities_data = isset($get_roles_settings_data_array["roles_and_capabilities"]) ? explode(",", $get_roles_settings_data_array["roles_and_capabilities"]) : "1,1,1,0,0,0";
290
- $administrator_privileges_data = isset($get_roles_settings_data_array["administrator_privileges"]) ? explode(",", $get_roles_settings_data_array["administrator_privileges"]) : "1,1,1,1,1,1,1,1,1,1";
291
- $author_privileges_data = isset($get_roles_settings_data_array["author_privileges"]) ? explode(",", $get_roles_settings_data_array["author_privileges"]) : "0,0,1,0,0,0,0,0,0,0";
292
- $editor_privileges_data = isset($get_roles_settings_data_array["editor_privileges"]) ? explode(",", $get_roles_settings_data_array["editor_privileges"]) : "0,0,1,0,0,0,1,0,0,0";
293
- $contributor_privileges_data = isset($get_roles_settings_data_array["contributor_privileges"]) ? explode(",", $get_roles_settings_data_array["contributor_privileges"]) : "0,0,0,0,0,0,1,0,0,0";
294
- $subscriber_privileges_data = isset($get_roles_settings_data_array["subscriber_privileges"]) ? explode(",", $get_roles_settings_data_array["subscriber_privileges"]) : "0,0,0,0,0,0,0,0,0,0";
295
- $other_privileges_data = isset($get_roles_settings_data_array["other_roles_privileges"]) ? explode(",", $get_roles_settings_data_array["other_roles_privileges"]) : "0,0,0,0,0,0,0,0,0,0";
296
-
297
- if (count($roles_and_capabilities_data) == 5) {
298
- array_push($roles_and_capabilities_data, 0);
299
- }
300
-
301
- if (count($administrator_privileges_data) == 8) {
302
- array_splice($administrator_privileges_data, 3, 0, 1);
303
- array_splice($administrator_privileges_data, 8, 0, 1);
304
- } elseif (count($administrator_privileges_data) == 9) {
305
- array_splice($administrator_privileges_data, 3, 0, 1);
306
- }
307
-
308
- if (count($author_privileges_data) == 8) {
309
- array_splice($author_privileges_data, 3, 0, 0);
310
- array_splice($author_privileges_data, 8, 0, 0);
311
- } elseif (count($author_privileges_data) == 9) {
312
- array_splice($author_privileges_data, 3, 0, 0);
313
- }
314
-
315
- if (count($editor_privileges_data) == 8) {
316
- array_splice($editor_privileges_data, 3, 0, 0);
317
- array_splice($editor_privileges_data, 8, 0, 0);
318
- } elseif (count($editor_privileges_data) == 9) {
319
- array_splice($editor_privileges_data, 3, 0, 0);
320
- }
321
-
322
- if (count($contributor_privileges_data) == 8) {
323
- array_splice($contributor_privileges_data, 3, 0, 0);
324
- array_splice($contributor_privileges_data, 8, 0, 0);
325
- } elseif (count($contributor_privileges_data) == 9) {
326
- array_splice($editor_privileges_data, 3, 0, 0);
327
- }
328
-
329
- if (count($subscriber_privileges_data) == 8) {
330
- array_splice($subscriber_privileges_data, 3, 0, 0);
331
- array_splice($subscriber_privileges_data, 8, 0, 0);
332
- } elseif (count($subscriber_privileges_data) == 9) {
333
- array_splice($subscriber_privileges_data, 3, 0, 0);
334
- }
335
-
336
- if (count($other_privileges_data) == 8) {
337
- array_splice($other_privileges_data, 3, 0, 0);
338
- array_splice($other_privileges_data, 8, 0, 0);
339
- } elseif (count($other_privileges_data) == 9) {
340
- array_splice($other_privileges_data, 3, 0, 0);
341
- }
342
-
343
- if (!array_key_exists("others_full_control_capability", $get_roles_settings_data_array)) {
344
- $get_roles_settings_data_array["others_full_control_capability"] = "0";
345
- }
346
-
347
- if (!array_key_exists("capabilities", $get_roles_settings_data_array)) {
348
- $user_capabilities = get_others_capabilities_mail_bank();
349
- $other_roles_array = array();
350
- $other_roles_access_array = array(
351
- "manage_options",
352
- "edit_plugins",
353
- "edit_posts",
354
- "publish_posts",
355
- "publish_pages",
356
- "edit_pages",
357
- "read"
358
- );
359
- foreach ($other_roles_access_array as $role) {
360
- if (in_array($role, $user_capabilities)) {
361
- array_push($other_roles_array, $role);
362
- }
363
- }
364
- $get_roles_settings_data_array["capabilities"] = $other_roles_array;
365
- }
366
- $get_roles_settings_data_array["roles_and_capabilities"] = implode(",", $roles_and_capabilities_data);
367
- $get_roles_settings_data_array["administrator_privileges"] = implode(",", $administrator_privileges_data);
368
- $get_roles_settings_data_array["author_privileges"] = implode(",", $author_privileges_data);
369
- $get_roles_settings_data_array["editor_privileges"] = implode(",", $editor_privileges_data);
370
- $get_roles_settings_data_array["contributor_privileges"] = implode(",", $contributor_privileges_data);
371
- $get_roles_settings_data_array["subscriber_privileges"] = implode(",", $subscriber_privileges_data);
372
- $get_roles_settings_data_array["other_roles_privileges"] = implode(",", $other_privileges_data);
373
- $where = array();
374
- $roles_capabilities_array = array();
375
- $where["meta_key"] = "roles_and_capabilities";
376
- $roles_capabilities_array["meta_value"] = serialize($get_roles_settings_data_array);
377
- $obj_dbHelper_install_script_mail_bank->updateCommand(mail_bank_meta(), $roles_capabilities_array, $where);
378
- }
379
- }
380
  }
381
  update_option("mail-bank-version-number", "3.0.0");
382
  }
25
  */
26
 
27
  class dbHelper_install_script_mail_bank {
28
+ /*
29
+ Function Name: insertCommand
30
+ Parameters: Yes($table_name,$data)
31
+ Description: This Function is used to Insert data in database.
32
+ Created On: 05-02-2016 11:40
33
+ Created By: Tech Banker Team
34
+ */
35
+
36
+ function insertCommand($table_name, $data) {
37
+ global $wpdb;
38
+ $wpdb->insert($table_name, $data);
39
+ return $wpdb->insert_id;
40
+ }
41
+
42
+ /*
43
+ Function Name: updateCommand
44
+ Parameters: Yes($table_name,$data,$where)
45
+ Description: This function is used to Update data.
46
+ Created On: 05-02-2016 11:40
47
+ Created By: Tech Banker Team
48
+ */
49
+
50
+ function updateCommand($table_name, $data, $where) {
51
+ global $wpdb;
52
+ $wpdb->update($table_name, $data, $where);
53
+ }
54
 
55
  }
56
 
57
  if (file_exists(ABSPATH . "wp-admin/includes/upgrade.php"))
58
+ require_once ABSPATH . "wp-admin/includes/upgrade.php";
59
 
60
  $mail_bank_version_number = get_option("mail-bank-version-number");
61
 
62
  function mail_bank_table() {
63
+ $sql = "CREATE TABLE IF NOT EXISTS " . mail_bank() . "
64
  (
65
  `id` int(11) NOT NULL AUTO_INCREMENT,
66
  `type` varchar(100) NOT NULL,
68
  PRIMARY KEY (`id`)
69
  )
70
  ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1";
71
+ dbDelta($sql);
72
 
73
+ $data = "INSERT INTO " . mail_bank() . " (`type`, `parent_id`) VALUES
74
  ('email_configuration', 0),
75
  ('email_logs', 0),
76
  ('settings', 0),
77
  ('roles_and_capabilities', 0)";
78
+ dbDelta($data);
79
  }
80
 
81
  function mail_bank_meta_table() {
82
+ $obj_dbHelper_install_script_mail_bank = new dbHelper_install_script_mail_bank();
83
+ global $wpdb;
84
+ $sql = "CREATE TABLE IF NOT EXISTS " . mail_bank_meta() . "
85
  (
86
  `id` int(11) NOT NULL AUTO_INCREMENT,
87
  `meta_id` int(11) NOT NULL,
90
  PRIMARY KEY (`id`)
91
  )
92
  ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1";
93
+ dbDelta($sql);
94
+
95
+ $admin_email = get_option("admin_email");
96
+ $admin_name = get_option("blogname");
97
+
98
+ $mail_bank_table_data = $wpdb->get_results
99
+ (
100
+ "SELECT * FROM " . mail_bank()
101
+ );
102
+
103
+ foreach ($mail_bank_table_data as $row) {
104
+ switch ($row->type) {
105
+ case "email_configuration":
106
+ $email_configuration_array = array();
107
+ $email_configuration_array["email_address"] = $admin_email;
108
+ $email_configuration_array["reply_to"] = "";
109
+ $email_configuration_array["cc"] = "";
110
+ $email_configuration_array["bcc"] = "";
111
+ $email_configuration_array["mailer_type"] = "smtp";
112
+ $email_configuration_array["sender_name"] = $admin_name;
113
+ $email_configuration_array["sender_name_configuration"] = "override";
114
+ $email_configuration_array["hostname"] = "";
115
+ $email_configuration_array["port"] = "587";
116
+ $email_configuration_array["client_id"] = "";
117
+ $email_configuration_array["client_secret"] = "";
118
+ $email_configuration_array["redirect_uri"] = "";
119
+ $email_configuration_array["sender_email"] = $admin_email;
120
+ $email_configuration_array["from_email_configuration"] = "override";
121
+ $email_configuration_array["auth_type"] = "none";
122
+ $email_configuration_array["username"] = $admin_email;
123
+ $email_configuration_array["password"] = "";
124
+ $email_configuration_array["enc_type"] = "tls";
125
+
126
+ $email_configuration_array_data = array();
127
+ $email_configuration_array_data["meta_id"] = $row->id;
128
+ $email_configuration_array_data["meta_key"] = "email_configuration";
129
+ $email_configuration_array_data["meta_value"] = serialize($email_configuration_array);
130
+ $obj_dbHelper_install_script_mail_bank->insertCommand(mail_bank_meta(), $email_configuration_array_data);
131
+ break;
132
+
133
+ case "settings":
134
+ $settings_data_array = array();
135
+ $settings_data_array["debug_mode"] = "enable";
136
+ $settings_data_array["remove_tables_at_uninstall"] = "enable";
137
+ $settings_data_array["monitor_email_logs"] = "enable";
138
+
139
+ $settings_array = array();
140
+ $settings_array["meta_id"] = $row->id;
141
+ $settings_array["meta_key"] = "settings";
142
+ $settings_array["meta_value"] = serialize($settings_data_array);
143
+ $obj_dbHelper_install_script_mail_bank->insertCommand(mail_bank_meta(), $settings_array);
144
+ break;
145
+
146
+ case "roles_and_capabilities":
147
+ $roles_capabilities_data_array = array();
148
+ $roles_capabilities_data_array["roles_and_capabilities"] = "1,1,1,0,0,0";
149
+ $roles_capabilities_data_array["show_mail_bank_top_bar_menu"] = "enable";
150
+ $roles_capabilities_data_array["others_full_control_capability"] = "0";
151
+ $roles_capabilities_data_array["administrator_privileges"] = "1,1,1,1,1,1,1,1,1,1";
152
+ $roles_capabilities_data_array["author_privileges"] = "0,0,1,0,0,0,0,0,0,0";
153
+ $roles_capabilities_data_array["editor_privileges"] = "0,0,1,0,0,0,1,0,0,0";
154
+ $roles_capabilities_data_array["contributor_privileges"] = "0,0,0,0,0,0,1,0,0,0";
155
+ $roles_capabilities_data_array["subscriber_privileges"] = "0,0,0,0,0,0,0,0,0,0";
156
+ $roles_capabilities_data_array["other_roles_privileges"] = "0,0,0,0,0,0,0,0,0,0";
157
+ $user_capabilities = get_others_capabilities_mail_bank();
158
+ $other_roles_array = array();
159
+ $other_roles_access_array = array(
160
+ "manage_options",
161
+ "edit_plugins",
162
+ "edit_posts",
163
+ "publish_posts",
164
+ "publish_pages",
165
+ "edit_pages",
166
+ "read"
167
+ );
168
+ foreach ($other_roles_access_array as $role) {
169
+ if (in_array($role, $user_capabilities)) {
170
+ array_push($other_roles_array, $role);
171
+ }
172
+ }
173
+ $roles_capabilities_data_array["capabilities"] = $other_roles_array;
174
+
175
+ $roles_data_array = array();
176
+ $roles_data_array["meta_id"] = $row->id;
177
+ $roles_data_array["meta_key"] = "roles_and_capabilities";
178
+ $roles_data_array["meta_value"] = serialize($roles_capabilities_data_array);
179
+ $obj_dbHelper_install_script_mail_bank->insertCommand(mail_bank_meta(), $roles_data_array);
180
+ break;
181
+ }
182
+ }
183
  }
184
 
185
  $obj_dbHelper_install_script_mail_bank = new dbHelper_install_script_mail_bank();
186
  switch ($mail_bank_version_number) {
187
+ case "":
188
+ if (count($wpdb->get_var("SHOW TABLES LIKE '" . $wpdb->prefix . "mail_bank'")) != 0) {
189
+ $mail_bank_data = $wpdb->get_row
190
+ (
191
+ "SELECT * FROM " . $wpdb->prefix . "mail_bank"
192
+ );
193
+
194
+ $wpdb->query("DROP TABLE IF EXISTS " . $wpdb->prefix . "mail_bank");
195
+ mail_bank_table();
196
+ mail_bank_meta_table();
197
+
198
+ $get_from_name = get_option("show_from_name_in_email");
199
+ $get_from_email = get_option("show_from_email_in_email");
200
+
201
+ if (count($mail_bank_data) > 0) {
202
+ $update_mail_bank_data = array();
203
+ $update_mail_bank_data["email_address"] = get_option("admin_email");
204
+ $update_mail_bank_data["reply_to"] = "";
205
+ $update_mail_bank_data["cc"] = "";
206
+ $update_mail_bank_data["bcc"] = "";
207
+ $update_mail_bank_data["mailer_type"] = isset($mail_bank_data->mailer_type) && $mail_bank_data->mailer_type == 1 ? "php_mail_function" : "smtp";
208
+ $update_mail_bank_data["sender_name_configuration"] = isset($get_from_name) && $get_from_name == 1 ? "override" : "dont_override";
209
+ $update_mail_bank_data["sender_name"] = isset($mail_bank_data->from_name) ? esc_html($mail_bank_data->from_name) : esc_html(get_option("blogname"));
210
+ $update_mail_bank_data["from_email_configuration"] = isset($get_from_email) && $get_from_email == 1 ? "override" : "dont_override";
211
+ $update_mail_bank_data["sender_email"] = isset($mail_bank_data->from_email) ? esc_attr($mail_bank_data->from_email) : get_option("admin_email");
212
+ $update_mail_bank_data["hostname"] = isset($mail_bank_data->smtp_host) ? esc_attr($mail_bank_data->smtp_host) : "";
213
+ $update_mail_bank_data["port"] = isset($mail_bank_data->smtp_port) ? intval($mail_bank_data->smtp_port) : 0;
214
+ $update_mail_bank_data["enc_type"] = isset($mail_bank_data->encryption) && (($mail_bank_data->encryption) == 0) ? "none" : ((($mail_bank_data->encryption) == 1) ? "ssl" : "tls");
215
+ $update_mail_bank_data["auth_type"] = "login";
216
+ $update_mail_bank_data["client_id"] = "";
217
+ $update_mail_bank_data["client_secret"] = "";
218
+ $update_mail_bank_data["redirect_uri"] = "";
219
+ $update_mail_bank_data["username"] = isset($mail_bank_data->smtp_username) ? esc_attr($mail_bank_data->smtp_username) : "";
220
+ $update_mail_bank_data["password"] = isset($mail_bank_data->smtp_password) ? base64_encode($mail_bank_data->smtp_password) : "";
221
+ $update_mail_bank_data["automatic_mail"] = "1";
222
+
223
+ $update_mail_bank_data_serialize = array();
224
+ $where = array();
225
+ $where["meta_id"] = $mail_bank_data->id;
226
+ $where["meta_key"] = "email_configuration";
227
+ $update_mail_bank_data_serialize["meta_value"] = serialize($update_mail_bank_data);
228
+ $obj_dbHelper_install_script_mail_bank->updateCommand(mail_bank_meta(), $update_mail_bank_data_serialize, $where);
229
+ }
230
+ $plugin_settings_data = $wpdb->get_var
231
+ (
232
+ $wpdb->prepare
233
+ (
234
+ "SELECT meta_value FROM " . mail_bank_meta() . "
235
  WHERE meta_key = %s", "settings"
236
+ )
237
+ );
238
+ $plugin_settings_data_unserialize = maybe_unserialize($plugin_settings_data);
239
+
240
+ $update_plugin_data = array();
241
+ $update_plugin_data["debug_mode"] = isset($plugin_settings_data_unserialize["debug_mode"]) ? esc_attr($plugin_settings_data_unserialize["debug_mode"]) : "enable";
242
+ $update_plugin_data["remove_tables_at_uninstall"] = isset($plugin_settings_data_unserialize["remove_tables_at_uninstall"]) ? esc_attr($plugin_settings_data_unserialize["remove_tables_at_uninstall"]) : "disable";
243
+ $update_plugin_data["monitor_email_logs"] = isset($plugin_settings_data_unserialize["monitor_email_logs"]) ? esc_attr($plugin_settings_data_unserialize["monitor_email_logs"]) : "enable";
244
+
245
+ $update_plugin_settings_data_serialize = array();
246
+ $where = array();
247
+ $where["meta_key"] = "settings";
248
+ $update_plugin_settings_data_serialize["meta_value"] = serialize($update_plugin_data);
249
+ $obj_dbHelper_install_script_mail_bank->updateCommand(mail_bank_meta(), $update_plugin_settings_data_serialize, $where);
250
+ } else {
251
+ mail_bank_table();
252
+ mail_bank_meta_table();
253
+ }
254
+ break;
255
+
256
+ default:
257
+ if (count($wpdb->get_var("SHOW TABLES LIKE '" . mail_bank() . "'")) != 0 && count($wpdb->get_var("SHOW TABLES LIKE '" . mail_bank_meta() . "'")) != 0) {
258
+ $settings_data = $wpdb->get_var
259
+ (
260
+ $wpdb->prepare
261
+ (
262
+ "SELECT meta_value FROM " . mail_bank_meta() .
263
+ " WHERE meta_key=%s", "settings"
264
+ )
265
+ );
266
+
267
+ $settings_data_array = maybe_unserialize($settings_data);
268
+ if (!array_key_exists("monitor_email_logs", $settings_data_array)) {
269
+ $settings_data_array["monitor_email_logs"] = "enable";
270
+ }
271
+ $where = array();
272
+ $settings_array = array();
273
+ $where["meta_key"] = "settings";
274
+ $settings_array["meta_value"] = serialize($settings_data_array);
275
+ $obj_dbHelper_install_script_mail_bank->updateCommand(mail_bank_meta(), $settings_array, $where);
276
+
277
+ $get_roles_settings_data = $wpdb->get_var
278
+ (
279
+ $wpdb->prepare
280
+ (
281
+ "SELECT meta_value FROM " . mail_bank_meta() .
282
+ " WHERE meta_key=%s", "roles_and_capabilities"
283
+ )
284
+ );
285
+
286
+ $get_roles_settings_data_array = maybe_unserialize($get_roles_settings_data);
287
+
288
+ if (array_key_exists("roles_and_capabilities", $get_roles_settings_data_array)) {
289
+ $roles_and_capabilities_data = isset($get_roles_settings_data_array["roles_and_capabilities"]) ? explode(",", $get_roles_settings_data_array["roles_and_capabilities"]) : "1,1,1,0,0,0";
290
+ $administrator_privileges_data = isset($get_roles_settings_data_array["administrator_privileges"]) ? explode(",", $get_roles_settings_data_array["administrator_privileges"]) : "1,1,1,1,1,1,1,1,1,1";
291
+ $author_privileges_data = isset($get_roles_settings_data_array["author_privileges"]) ? explode(",", $get_roles_settings_data_array["author_privileges"]) : "0,0,1,0,0,0,0,0,0,0";
292
+ $editor_privileges_data = isset($get_roles_settings_data_array["editor_privileges"]) ? explode(",", $get_roles_settings_data_array["editor_privileges"]) : "0,0,1,0,0,0,1,0,0,0";
293
+ $contributor_privileges_data = isset($get_roles_settings_data_array["contributor_privileges"]) ? explode(",", $get_roles_settings_data_array["contributor_privileges"]) : "0,0,0,0,0,0,1,0,0,0";
294
+ $subscriber_privileges_data = isset($get_roles_settings_data_array["subscriber_privileges"]) ? explode(",", $get_roles_settings_data_array["subscriber_privileges"]) : "0,0,0,0,0,0,0,0,0,0";
295
+ $other_privileges_data = isset($get_roles_settings_data_array["other_roles_privileges"]) ? explode(",", $get_roles_settings_data_array["other_roles_privileges"]) : "0,0,0,0,0,0,0,0,0,0";
296
+
297
+ if (count($roles_and_capabilities_data) == 5) {
298
+ array_push($roles_and_capabilities_data, 0);
299
+ }
300
+
301
+ if (count($administrator_privileges_data) == 8) {
302
+ array_splice($administrator_privileges_data, 3, 0, 1);
303
+ array_splice($administrator_privileges_data, 8, 0, 1);
304
+ } elseif (count($administrator_privileges_data) == 9) {
305
+ array_splice($administrator_privileges_data, 3, 0, 1);
306
+ }
307
+
308
+ if (count($author_privileges_data) == 8) {
309
+ array_splice($author_privileges_data, 3, 0, 0);
310
+ array_splice($author_privileges_data, 8, 0, 0);
311
+ } elseif (count($author_privileges_data) == 9) {
312
+ array_splice($author_privileges_data, 3, 0, 0);
313
+ }
314
+
315
+ if (count($editor_privileges_data) == 8) {
316
+ array_splice($editor_privileges_data, 3, 0, 0);
317
+ array_splice($editor_privileges_data, 8, 0, 0);
318
+ } elseif (count($editor_privileges_data) == 9) {
319
+ array_splice($editor_privileges_data, 3, 0, 0);
320
+ }
321
+
322
+ if (count($contributor_privileges_data) == 8) {
323
+ array_splice($contributor_privileges_data, 3, 0, 0);
324
+ array_splice($contributor_privileges_data, 8, 0, 0);
325
+ } elseif (count($contributor_privileges_data) == 9) {
326
+ array_splice($editor_privileges_data, 3, 0, 0);
327
+ }
328
+
329
+ if (count($subscriber_privileges_data) == 8) {
330
+ array_splice($subscriber_privileges_data, 3, 0, 0);
331
+ array_splice($subscriber_privileges_data, 8, 0, 0);
332
+ } elseif (count($subscriber_privileges_data) == 9) {
333
+ array_splice($subscriber_privileges_data, 3, 0, 0);
334
+ }
335
+
336
+ if (count($other_privileges_data) == 8) {
337
+ array_splice($other_privileges_data, 3, 0, 0);
338
+ array_splice($other_privileges_data, 8, 0, 0);
339
+ } elseif (count($other_privileges_data) == 9) {
340
+ array_splice($other_privileges_data, 3, 0, 0);
341
+ }
342
+
343
+ if (!array_key_exists("others_full_control_capability", $get_roles_settings_data_array)) {
344
+ $get_roles_settings_data_array["others_full_control_capability"] = "0";
345
+ }
346
+
347
+ if (!array_key_exists("capabilities", $get_roles_settings_data_array)) {
348
+ $user_capabilities = get_others_capabilities_mail_bank();
349
+ $other_roles_array = array();
350
+ $other_roles_access_array = array(
351
+ "manage_options",
352
+ "edit_plugins",
353
+ "edit_posts",
354
+ "publish_posts",
355
+ "publish_pages",
356
+ "edit_pages",
357
+ "read"
358
+ );
359
+ foreach ($other_roles_access_array as $role) {
360
+ if (in_array($role, $user_capabilities)) {
361
+ array_push($other_roles_array, $role);
362
+ }
363
+ }
364
+ $get_roles_settings_data_array["capabilities"] = $other_roles_array;
365
+ }
366
+ $get_roles_settings_data_array["roles_and_capabilities"] = implode(",", $roles_and_capabilities_data);
367
+ $get_roles_settings_data_array["administrator_privileges"] = implode(",", $administrator_privileges_data);
368
+ $get_roles_settings_data_array["author_privileges"] = implode(",", $author_privileges_data);
369
+ $get_roles_settings_data_array["editor_privileges"] = implode(",", $editor_privileges_data);
370
+ $get_roles_settings_data_array["contributor_privileges"] = implode(",", $contributor_privileges_data);
371
+ $get_roles_settings_data_array["subscriber_privileges"] = implode(",", $subscriber_privileges_data);
372
+ $get_roles_settings_data_array["other_roles_privileges"] = implode(",", $other_privileges_data);
373
+ $where = array();
374
+ $roles_capabilities_array = array();
375
+ $where["meta_key"] = "roles_and_capabilities";
376
+ $roles_capabilities_array["meta_value"] = serialize($get_roles_settings_data_array);
377
+ $obj_dbHelper_install_script_mail_bank->updateCommand(mail_bank_meta(), $roles_capabilities_array, $where);
378
+ }
379
+ }
380
  }
381
  update_option("mail-bank-version-number", "3.0.0");
382
  }
lib/sidebar-menu.php CHANGED
@@ -16,8 +16,8 @@ if (!is_user_logged_in()) {
16
  $access_granted = false;
17
  foreach ($user_role_permission as $permission) {
18
  if (current_user_can($permission)) {
19
- $access_granted = true;
20
- break;
21
  }
22
  }
23
  if (!$access_granted) {
@@ -26,99 +26,99 @@ if (!is_user_logged_in()) {
26
  $flag = 0;
27
 
28
  $role_capabilities = $wpdb->get_var
29
- (
30
- $wpdb->prepare
31
- (
32
- "SELECT meta_value from " . mail_bank_meta() . "
33
  WHERE meta_key = %s", "roles_and_capabilities"
34
- )
35
  );
36
 
37
  $roles_and_capabilities_unserialized_data = maybe_unserialize($role_capabilities);
38
  $capabilities = explode(",", isset($roles_and_capabilities_unserialized_data["roles_and_capabilities"]) ? esc_attr($roles_and_capabilities_unserialized_data["roles_and_capabilities"]) : "");
39
 
40
  if (is_super_admin()) {
41
- $mb_role = "administrator";
42
  } else {
43
- $mb_role = check_user_roles_mail_bank();
44
  }
45
  switch ($mb_role) {
46
- case "administrator":
47
- $privileges = "administrator_privileges";
48
- $flag = $capabilities[0];
49
- break;
50
-
51
- case "author":
52
- $privileges = "author_privileges";
53
- $flag = $capabilities[1];
54
- break;
55
-
56
- case "editor":
57
- $privileges = "editor_privileges";
58
- $flag = $capabilities[2];
59
- break;
60
-
61
- case "contributor":
62
- $privileges = "contributor_privileges";
63
- $flag = $capabilities[3];
64
- break;
65
-
66
- case "subscriber":
67
- $privileges = "subscriber_privileges";
68
- $flag = $capabilities[4];
69
- break;
70
-
71
- default:
72
- $privileges = "other_roles_privileges";
73
- $flag = $capabilities[5];
74
- break;
75
  }
76
 
77
  foreach ($roles_and_capabilities_unserialized_data as $key => $value) {
78
- if ($privileges == $key) {
79
- $privileges_value = $value;
80
- break;
81
- }
82
  }
83
 
84
  $full_control = explode(",", $privileges_value);
85
  if (!defined("full_control"))
86
- define("full_control", "$full_control[0]");
87
  if (!defined("email_configuration_mail_bank"))
88
- define("email_configuration_mail_bank", "$full_control[1]");
89
  if (!defined("test_email_mail_bank"))
90
- define("test_email_mail_bank", "$full_control[2]");
91
  if (!defined("conectivity_test_email_mail_bank"))
92
- define("conectivity_test_email_mail_bank", "$full_control[3]");
93
  if (!defined("email_logs_mail_bank"))
94
- define("email_logs_mail_bank", "$full_control[4]");
95
  if (!defined("settings_mail_bank"))
96
- define("settings_mail_bank", "$full_control[5]");
97
  if (!defined("roles_and_capabilities_mail_bank"))
98
- define("roles_and_capabilities_mail_bank", "$full_control[6]");
99
  if (!defined("system_information_mail_bank"))
100
- define("system_information_mail_bank", "$full_control[7]");
101
  $check_wp_mail_bank_wizard = get_option("wp-mail-bank-wizard-set-up");
102
  if ($flag == "1") {
103
- global $wp_version;
104
-
105
- $icon = plugins_url("assets/global/img/icon.png", dirname(__FILE__));
106
- if ($check_wp_mail_bank_wizard) {
107
- add_menu_page($wp_mail_bank, $wp_mail_bank, "read", "mb_email_configuration", "", $icon);
108
- } else {
109
- add_menu_page($wp_mail_bank, $wp_mail_bank, "read", "wp_mail_bank_wizard", "", plugins_url("assets/global/img/icon.png", dirname(__FILE__)));
110
- add_submenu_page($wp_mail_bank, $wp_mail_bank, "", "read", "wp_mail_bank_wizard", "wp_mail_bank_wizard");
111
- }
112
-
113
- add_submenu_page("mb_email_configuration", $mb_email_configuration, $mb_email_configuration, "read", "mb_email_configuration", $check_wp_mail_bank_wizard == "" ? "wp_mail_bank_wizard" : "mb_email_configuration");
114
- add_submenu_page("mb_email_configuration", $mb_test_email, $mb_test_email, "read", "mb_test_email", $check_wp_mail_bank_wizard == "" ? "wp_mail_bank_wizard" : "mb_test_email");
115
- add_submenu_page("mb_email_configuration", $mb_connectivity_test, $mb_connectivity_test, "read", "mb_connectivity_test", $check_wp_mail_bank_wizard == "" ? "wp_mail_bank_wizard" : "mb_connectivity_test");
116
- add_submenu_page("mb_email_configuration", $mb_email_logs, $mb_email_logs, "read", "mb_email_logs", $check_wp_mail_bank_wizard == "" ? "wp_mail_bank_wizard" : "mb_email_logs");
117
- add_submenu_page("mb_email_configuration", $mb_settings, $mb_settings, "read", "mb_settings", $check_wp_mail_bank_wizard == "" ? "wp_mail_bank_wizard" : "mb_settings");
118
- add_submenu_page("mb_email_configuration", $mb_roles_and_capabilities, $mb_roles_and_capabilities, "read", "mb_roles_and_capabilities", $check_wp_mail_bank_wizard == "" ? "wp_mail_bank_wizard" : "mb_roles_and_capabilities");
119
- add_submenu_page("mb_email_configuration", $mb_feedbacks, $mb_feedbacks, "read", "mb_feedbacks", $check_wp_mail_bank_wizard == "" ? "wp_mail_bank_wizard" : "mb_feedbacks");
120
- add_submenu_page("mb_email_configuration", $mb_system_information, $mb_system_information, "read", "mb_system_information", $check_wp_mail_bank_wizard == "" ? "wp_mail_bank_wizard" : "mb_system_information");
121
- add_submenu_page("mb_email_configuration", $mb_upgrade, $mb_upgrade, "read", "mb_upgrade", $check_wp_mail_bank_wizard == "" ? "wp_mail_bank_wizard" : "mb_upgrade");
122
  }
123
 
124
 
@@ -131,17 +131,17 @@ if (!is_user_logged_in()) {
131
  */
132
 
133
  function wp_mail_bank_wizard() {
134
- global $wpdb;
135
- $user_role_permission = get_users_capabilities_mail_bank();
136
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/translations.php")) {
137
- include MAIL_BANK_DIR_PATH . "includes/translations.php";
138
- }
139
- if (file_exists(MAIL_BANK_DIR_PATH . "views/wizard/wizard.php")) {
140
- include_once MAIL_BANK_DIR_PATH . "views/wizard/wizard.php";
141
- }
142
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/footer.php")) {
143
- include_once MAIL_BANK_DIR_PATH . "includes/footer.php";
144
- }
145
  }
146
 
147
  /*
@@ -153,26 +153,26 @@ if (!is_user_logged_in()) {
153
  */
154
 
155
  function mb_email_configuration() {
156
- global $wpdb;
157
- $user_role_permission = get_users_capabilities_mail_bank();
158
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/translations.php")) {
159
- include MAIL_BANK_DIR_PATH . "includes/translations.php";
160
- }
161
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/header.php")) {
162
- include_once MAIL_BANK_DIR_PATH . "includes/header.php";
163
- }
164
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/sidebar.php")) {
165
- include_once MAIL_BANK_DIR_PATH . "includes/sidebar.php";
166
- }
167
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/queries.php")) {
168
- include_once MAIL_BANK_DIR_PATH . "includes/queries.php";
169
- }
170
- if (file_exists(MAIL_BANK_DIR_PATH . "views/email-setup/email-setup.php")) {
171
- include_once MAIL_BANK_DIR_PATH . "views/email-setup/email-setup.php";
172
- }
173
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/footer.php")) {
174
- include_once MAIL_BANK_DIR_PATH . "includes/footer.php";
175
- }
176
  }
177
 
178
  /*
@@ -184,26 +184,26 @@ if (!is_user_logged_in()) {
184
  */
185
 
186
  function mb_test_email() {
187
- global $wpdb;
188
- $user_role_permission = get_users_capabilities_mail_bank();
189
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/translations.php")) {
190
- include MAIL_BANK_DIR_PATH . "includes/translations.php";
191
- }
192
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/header.php")) {
193
- include_once MAIL_BANK_DIR_PATH . "includes/header.php";
194
- }
195
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/sidebar.php")) {
196
- include_once MAIL_BANK_DIR_PATH . "includes/sidebar.php";
197
- }
198
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/queries.php")) {
199
- include_once MAIL_BANK_DIR_PATH . "includes/queries.php";
200
- }
201
- if (file_exists(MAIL_BANK_DIR_PATH . "views/test-email/test-email.php")) {
202
- include_once MAIL_BANK_DIR_PATH . "views/test-email/test-email.php";
203
- }
204
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/footer.php")) {
205
- include_once MAIL_BANK_DIR_PATH . "includes/footer.php";
206
- }
207
  }
208
 
209
  /*
@@ -215,26 +215,26 @@ if (!is_user_logged_in()) {
215
  */
216
 
217
  function mb_connectivity_test() {
218
- global $wpdb;
219
- $user_role_permission = get_users_capabilities_mail_bank();
220
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/translations.php")) {
221
- include MAIL_BANK_DIR_PATH . "includes/translations.php";
222
- }
223
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/header.php")) {
224
- include_once MAIL_BANK_DIR_PATH . "includes/header.php";
225
- }
226
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/sidebar.php")) {
227
- include_once MAIL_BANK_DIR_PATH . "includes/sidebar.php";
228
- }
229
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/queries.php")) {
230
- include_once MAIL_BANK_DIR_PATH . "includes/queries.php";
231
- }
232
- if (file_exists(MAIL_BANK_DIR_PATH . "views/connectivity-test/connectivity-test.php")) {
233
- include_once MAIL_BANK_DIR_PATH . "views/connectivity-test/connectivity-test.php";
234
- }
235
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/footer.php")) {
236
- include_once MAIL_BANK_DIR_PATH . "includes/footer.php";
237
- }
238
  }
239
 
240
  /*
@@ -246,26 +246,26 @@ if (!is_user_logged_in()) {
246
  */
247
 
248
  function mb_email_logs() {
249
- global $wpdb;
250
- $user_role_permission = get_users_capabilities_mail_bank();
251
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/translations.php")) {
252
- include MAIL_BANK_DIR_PATH . "includes/translations.php";
253
- }
254
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/header.php")) {
255
- include_once MAIL_BANK_DIR_PATH . "includes/header.php";
256
- }
257
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/sidebar.php")) {
258
- include_once MAIL_BANK_DIR_PATH . "includes/sidebar.php";
259
- }
260
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/queries.php")) {
261
- include_once MAIL_BANK_DIR_PATH . "includes/queries.php";
262
- }
263
- if (file_exists(MAIL_BANK_DIR_PATH . "views/email-logs/email-logs.php")) {
264
- include_once MAIL_BANK_DIR_PATH . "views/email-logs/email-logs.php";
265
- }
266
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/footer.php")) {
267
- include_once MAIL_BANK_DIR_PATH . "includes/footer.php";
268
- }
269
  }
270
 
271
  /*
@@ -277,26 +277,26 @@ if (!is_user_logged_in()) {
277
  */
278
 
279
  function mb_settings() {
280
- global $wpdb;
281
- $user_role_permission = get_users_capabilities_mail_bank();
282
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/translations.php")) {
283
- include MAIL_BANK_DIR_PATH . "includes/translations.php";
284
- }
285
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/header.php")) {
286
- include_once MAIL_BANK_DIR_PATH . "includes/header.php";
287
- }
288
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/sidebar.php")) {
289
- include_once MAIL_BANK_DIR_PATH . "includes/sidebar.php";
290
- }
291
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/queries.php")) {
292
- include_once MAIL_BANK_DIR_PATH . "includes/queries.php";
293
- }
294
- if (file_exists(MAIL_BANK_DIR_PATH . "views/settings/settings.php")) {
295
- include_once MAIL_BANK_DIR_PATH . "views/settings/settings.php";
296
- }
297
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/footer.php")) {
298
- include_once MAIL_BANK_DIR_PATH . "includes/footer.php";
299
- }
300
  }
301
 
302
  /*
@@ -308,26 +308,26 @@ if (!is_user_logged_in()) {
308
  */
309
 
310
  function mb_roles_and_capabilities() {
311
- global $wpdb;
312
- $user_role_permission = get_users_capabilities_mail_bank();
313
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/translations.php")) {
314
- include MAIL_BANK_DIR_PATH . "includes/translations.php";
315
- }
316
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/header.php")) {
317
- include_once MAIL_BANK_DIR_PATH . "includes/header.php";
318
- }
319
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/sidebar.php")) {
320
- include_once MAIL_BANK_DIR_PATH . "includes/sidebar.php";
321
- }
322
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/queries.php")) {
323
- include_once MAIL_BANK_DIR_PATH . "includes/queries.php";
324
- }
325
- if (file_exists(MAIL_BANK_DIR_PATH . "views/roles-and-capabilities/roles-and-capabilities.php")) {
326
- include_once MAIL_BANK_DIR_PATH . "views/roles-and-capabilities/roles-and-capabilities.php";
327
- }
328
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/footer.php")) {
329
- include_once MAIL_BANK_DIR_PATH . "includes/footer.php";
330
- }
331
  }
332
 
333
  /*
@@ -339,26 +339,26 @@ if (!is_user_logged_in()) {
339
  */
340
 
341
  function mb_feedbacks() {
342
- global $wpdb;
343
- $user_role_permission = get_users_capabilities_mail_bank();
344
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/translations.php")) {
345
- include MAIL_BANK_DIR_PATH . "includes/translations.php";
346
- }
347
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/header.php")) {
348
- include_once MAIL_BANK_DIR_PATH . "includes/header.php";
349
- }
350
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/sidebar.php")) {
351
- include_once MAIL_BANK_DIR_PATH . "includes/sidebar.php";
352
- }
353
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/queries.php")) {
354
- include_once MAIL_BANK_DIR_PATH . "includes/queries.php";
355
- }
356
- if (file_exists(MAIL_BANK_DIR_PATH . "views/feedbacks/feedbacks.php")) {
357
- include_once MAIL_BANK_DIR_PATH . "views/feedbacks/feedbacks.php";
358
- }
359
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/footer.php")) {
360
- include_once MAIL_BANK_DIR_PATH . "includes/footer.php";
361
- }
362
  }
363
 
364
  /*
@@ -370,26 +370,26 @@ if (!is_user_logged_in()) {
370
  */
371
 
372
  function mb_system_information() {
373
- global $wpdb;
374
- $user_role_permission = get_users_capabilities_mail_bank();
375
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/translations.php")) {
376
- include MAIL_BANK_DIR_PATH . "includes/translations.php";
377
- }
378
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/header.php")) {
379
- include_once MAIL_BANK_DIR_PATH . "includes/header.php";
380
- }
381
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/sidebar.php")) {
382
- include_once MAIL_BANK_DIR_PATH . "includes/sidebar.php";
383
- }
384
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/queries.php")) {
385
- include_once MAIL_BANK_DIR_PATH . "includes/queries.php";
386
- }
387
- if (file_exists(MAIL_BANK_DIR_PATH . "views/system-information/system-information.php")) {
388
- include_once MAIL_BANK_DIR_PATH . "views/system-information/system-information.php";
389
- }
390
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/footer.php")) {
391
- include_once MAIL_BANK_DIR_PATH . "includes/footer.php";
392
- }
393
  }
394
 
395
  /*
@@ -401,26 +401,26 @@ if (!is_user_logged_in()) {
401
  */
402
 
403
  function mb_upgrade() {
404
- global $wpdb;
405
- $user_role_permission = get_users_capabilities_mail_bank();
406
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/translations.php")) {
407
- include MAIL_BANK_DIR_PATH . "includes/translations.php";
408
- }
409
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/header.php")) {
410
- include_once MAIL_BANK_DIR_PATH . "includes/header.php";
411
- }
412
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/sidebar.php")) {
413
- include_once MAIL_BANK_DIR_PATH . "includes/sidebar.php";
414
- }
415
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/queries.php")) {
416
- include_once MAIL_BANK_DIR_PATH . "includes/queries.php";
417
- }
418
- if (file_exists(MAIL_BANK_DIR_PATH . "views/premium-editions/premium-editions.php")) {
419
- include_once MAIL_BANK_DIR_PATH . "views/premium-editions/premium-editions.php";
420
- }
421
- if (file_exists(MAIL_BANK_DIR_PATH . "includes/footer.php")) {
422
- include_once MAIL_BANK_DIR_PATH . "includes/footer.php";
423
- }
424
  }
425
 
426
  }
16
  $access_granted = false;
17
  foreach ($user_role_permission as $permission) {
18
  if (current_user_can($permission)) {
19
+ $access_granted = true;
20
+ break;
21
  }
22
  }
23
  if (!$access_granted) {
26
  $flag = 0;
27
 
28
  $role_capabilities = $wpdb->get_var
29
+ (
30
+ $wpdb->prepare
31
+ (
32
+ "SELECT meta_value from " . mail_bank_meta() . "
33
  WHERE meta_key = %s", "roles_and_capabilities"
34
+ )
35
  );
36
 
37
  $roles_and_capabilities_unserialized_data = maybe_unserialize($role_capabilities);
38
  $capabilities = explode(",", isset($roles_and_capabilities_unserialized_data["roles_and_capabilities"]) ? esc_attr($roles_and_capabilities_unserialized_data["roles_and_capabilities"]) : "");
39
 
40
  if (is_super_admin()) {
41
+ $mb_role = "administrator";
42
  } else {
43
+ $mb_role = check_user_roles_mail_bank();
44
  }
45
  switch ($mb_role) {
46
+ case "administrator":
47
+ $privileges = "administrator_privileges";
48
+ $flag = $capabilities[0];
49
+ break;
50
+
51
+ case "author":
52
+ $privileges = "author_privileges";
53
+ $flag = $capabilities[1];
54
+ break;
55
+
56
+ case "editor":
57
+ $privileges = "editor_privileges";
58
+ $flag = $capabilities[2];
59
+ break;
60
+
61
+ case "contributor":
62
+ $privileges = "contributor_privileges";
63
+ $flag = $capabilities[3];
64
+ break;
65
+
66
+ case "subscriber":
67
+ $privileges = "subscriber_privileges";
68
+ $flag = $capabilities[4];
69
+ break;
70
+
71
+ default:
72
+ $privileges = "other_roles_privileges";
73
+ $flag = $capabilities[5];
74
+ break;
75
  }
76
 
77
  foreach ($roles_and_capabilities_unserialized_data as $key => $value) {
78
+ if ($privileges == $key) {
79
+ $privileges_value = $value;
80
+ break;
81
+ }
82
  }
83
 
84
  $full_control = explode(",", $privileges_value);
85
  if (!defined("full_control"))
86
+ define("full_control", "$full_control[0]");
87
  if (!defined("email_configuration_mail_bank"))
88
+ define("email_configuration_mail_bank", "$full_control[1]");
89
  if (!defined("test_email_mail_bank"))
90
+ define("test_email_mail_bank", "$full_control[2]");
91
  if (!defined("conectivity_test_email_mail_bank"))
92
+ define("conectivity_test_email_mail_bank", "$full_control[3]");
93
  if (!defined("email_logs_mail_bank"))
94
+ define("email_logs_mail_bank", "$full_control[4]");
95
  if (!defined("settings_mail_bank"))
96
+ define("settings_mail_bank", "$full_control[5]");
97
  if (!defined("roles_and_capabilities_mail_bank"))
98
+ define("roles_and_capabilities_mail_bank", "$full_control[6]");
99
  if (!defined("system_information_mail_bank"))
100
+ define("system_information_mail_bank", "$full_control[7]");
101
  $check_wp_mail_bank_wizard = get_option("wp-mail-bank-wizard-set-up");
102
  if ($flag == "1") {
103
+ global $wp_version;
104
+
105
+ $icon = plugins_url("assets/global/img/icon.png", dirname(__FILE__));
106
+ if ($check_wp_mail_bank_wizard) {
107
+ add_menu_page($wp_mail_bank, $wp_mail_bank, "read", "mb_email_configuration", "", $icon);
108
+ } else {
109
+ add_menu_page($wp_mail_bank, $wp_mail_bank, "read", "wp_mail_bank_wizard", "", plugins_url("assets/global/img/icon.png", dirname(__FILE__)));
110
+ add_submenu_page($wp_mail_bank, $wp_mail_bank, "", "read", "wp_mail_bank_wizard", "wp_mail_bank_wizard");
111
+ }
112
+
113
+ add_submenu_page("mb_email_configuration", $mb_email_configuration, $mb_email_configuration, "read", "mb_email_configuration", $check_wp_mail_bank_wizard == "" ? "wp_mail_bank_wizard" : "mb_email_configuration");
114
+ add_submenu_page("mb_email_configuration", $mb_test_email, $mb_test_email, "read", "mb_test_email", $check_wp_mail_bank_wizard == "" ? "wp_mail_bank_wizard" : "mb_test_email");
115
+ add_submenu_page("mb_email_configuration", $mb_connectivity_test, $mb_connectivity_test, "read", "mb_connectivity_test", $check_wp_mail_bank_wizard == "" ? "wp_mail_bank_wizard" : "mb_connectivity_test");
116
+ add_submenu_page("mb_email_configuration", $mb_email_logs, $mb_email_logs, "read", "mb_email_logs", $check_wp_mail_bank_wizard == "" ? "wp_mail_bank_wizard" : "mb_email_logs");
117
+ add_submenu_page("mb_email_configuration", $mb_settings, $mb_settings, "read", "mb_settings", $check_wp_mail_bank_wizard == "" ? "wp_mail_bank_wizard" : "mb_settings");
118
+ add_submenu_page("mb_email_configuration", $mb_roles_and_capabilities, $mb_roles_and_capabilities, "read", "mb_roles_and_capabilities", $check_wp_mail_bank_wizard == "" ? "wp_mail_bank_wizard" : "mb_roles_and_capabilities");
119
+ add_submenu_page("mb_email_configuration", $mb_feedbacks, $mb_feedbacks, "read", "mb_feedbacks", $check_wp_mail_bank_wizard == "" ? "wp_mail_bank_wizard" : "mb_feedbacks");
120
+ add_submenu_page("mb_email_configuration", $mb_system_information, $mb_system_information, "read", "mb_system_information", $check_wp_mail_bank_wizard == "" ? "wp_mail_bank_wizard" : "mb_system_information");
121
+ add_submenu_page("mb_email_configuration", $mb_upgrade, $mb_upgrade, "read", "mb_upgrade", $check_wp_mail_bank_wizard == "" ? "wp_mail_bank_wizard" : "mb_upgrade");
122
  }
123
 
124
 
131
  */
132
 
133
  function wp_mail_bank_wizard() {
134
+ global $wpdb;
135
+ $user_role_permission = get_users_capabilities_mail_bank();
136
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/translations.php")) {
137
+ include MAIL_BANK_DIR_PATH . "includes/translations.php";
138
+ }
139
+ if (file_exists(MAIL_BANK_DIR_PATH . "views/wizard/wizard.php")) {
140
+ include_once MAIL_BANK_DIR_PATH . "views/wizard/wizard.php";
141
+ }
142
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/footer.php")) {
143
+ include_once MAIL_BANK_DIR_PATH . "includes/footer.php";
144
+ }
145
  }
146
 
147
  /*
153
  */
154
 
155
  function mb_email_configuration() {
156
+ global $wpdb;
157
+ $user_role_permission = get_users_capabilities_mail_bank();
158
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/translations.php")) {
159
+ include MAIL_BANK_DIR_PATH . "includes/translations.php";
160
+ }
161
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/header.php")) {
162
+ include_once MAIL_BANK_DIR_PATH . "includes/header.php";
163
+ }
164
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/sidebar.php")) {
165
+ include_once MAIL_BANK_DIR_PATH . "includes/sidebar.php";
166
+ }
167
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/queries.php")) {
168
+ include_once MAIL_BANK_DIR_PATH . "includes/queries.php";
169
+ }
170
+ if (file_exists(MAIL_BANK_DIR_PATH . "views/email-setup/email-setup.php")) {
171
+ include_once MAIL_BANK_DIR_PATH . "views/email-setup/email-setup.php";
172
+ }
173
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/footer.php")) {
174
+ include_once MAIL_BANK_DIR_PATH . "includes/footer.php";
175
+ }
176
  }
177
 
178
  /*
184
  */
185
 
186
  function mb_test_email() {
187
+ global $wpdb;
188
+ $user_role_permission = get_users_capabilities_mail_bank();
189
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/translations.php")) {
190
+ include MAIL_BANK_DIR_PATH . "includes/translations.php";
191
+ }
192
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/header.php")) {
193
+ include_once MAIL_BANK_DIR_PATH . "includes/header.php";
194
+ }
195
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/sidebar.php")) {
196
+ include_once MAIL_BANK_DIR_PATH . "includes/sidebar.php";
197
+ }
198
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/queries.php")) {
199
+ include_once MAIL_BANK_DIR_PATH . "includes/queries.php";
200
+ }
201
+ if (file_exists(MAIL_BANK_DIR_PATH . "views/test-email/test-email.php")) {
202
+ include_once MAIL_BANK_DIR_PATH . "views/test-email/test-email.php";
203
+ }
204
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/footer.php")) {
205
+ include_once MAIL_BANK_DIR_PATH . "includes/footer.php";
206
+ }
207
  }
208
 
209
  /*
215
  */
216
 
217
  function mb_connectivity_test() {
218
+ global $wpdb;
219
+ $user_role_permission = get_users_capabilities_mail_bank();
220
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/translations.php")) {
221
+ include MAIL_BANK_DIR_PATH . "includes/translations.php";
222
+ }
223
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/header.php")) {
224
+ include_once MAIL_BANK_DIR_PATH . "includes/header.php";
225
+ }
226
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/sidebar.php")) {
227
+ include_once MAIL_BANK_DIR_PATH . "includes/sidebar.php";
228
+ }
229
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/queries.php")) {
230
+ include_once MAIL_BANK_DIR_PATH . "includes/queries.php";
231
+ }
232
+ if (file_exists(MAIL_BANK_DIR_PATH . "views/connectivity-test/connectivity-test.php")) {
233
+ include_once MAIL_BANK_DIR_PATH . "views/connectivity-test/connectivity-test.php";
234
+ }
235
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/footer.php")) {
236
+ include_once MAIL_BANK_DIR_PATH . "includes/footer.php";
237
+ }
238
  }
239
 
240
  /*
246
  */
247
 
248
  function mb_email_logs() {
249
+ global $wpdb;
250
+ $user_role_permission = get_users_capabilities_mail_bank();
251
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/translations.php")) {
252
+ include MAIL_BANK_DIR_PATH . "includes/translations.php";
253
+ }
254
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/header.php")) {
255
+ include_once MAIL_BANK_DIR_PATH . "includes/header.php";
256
+ }
257
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/sidebar.php")) {
258
+ include_once MAIL_BANK_DIR_PATH . "includes/sidebar.php";
259
+ }
260
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/queries.php")) {
261
+ include_once MAIL_BANK_DIR_PATH . "includes/queries.php";
262
+ }
263
+ if (file_exists(MAIL_BANK_DIR_PATH . "views/email-logs/email-logs.php")) {
264
+ include_once MAIL_BANK_DIR_PATH . "views/email-logs/email-logs.php";
265
+ }
266
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/footer.php")) {
267
+ include_once MAIL_BANK_DIR_PATH . "includes/footer.php";
268
+ }
269
  }
270
 
271
  /*
277
  */
278
 
279
  function mb_settings() {
280
+ global $wpdb;
281
+ $user_role_permission = get_users_capabilities_mail_bank();
282
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/translations.php")) {
283
+ include MAIL_BANK_DIR_PATH . "includes/translations.php";
284
+ }
285
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/header.php")) {
286
+ include_once MAIL_BANK_DIR_PATH . "includes/header.php";
287
+ }
288
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/sidebar.php")) {
289
+ include_once MAIL_BANK_DIR_PATH . "includes/sidebar.php";
290
+ }
291
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/queries.php")) {
292
+ include_once MAIL_BANK_DIR_PATH . "includes/queries.php";
293
+ }
294
+ if (file_exists(MAIL_BANK_DIR_PATH . "views/settings/settings.php")) {
295
+ include_once MAIL_BANK_DIR_PATH . "views/settings/settings.php";
296
+ }
297
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/footer.php")) {
298
+ include_once MAIL_BANK_DIR_PATH . "includes/footer.php";
299
+ }
300
  }
301
 
302
  /*
308
  */
309
 
310
  function mb_roles_and_capabilities() {
311
+ global $wpdb;
312
+ $user_role_permission = get_users_capabilities_mail_bank();
313
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/translations.php")) {
314
+ include MAIL_BANK_DIR_PATH . "includes/translations.php";
315
+ }
316
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/header.php")) {
317
+ include_once MAIL_BANK_DIR_PATH . "includes/header.php";
318
+ }
319
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/sidebar.php")) {
320
+ include_once MAIL_BANK_DIR_PATH . "includes/sidebar.php";
321
+ }
322
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/queries.php")) {
323
+ include_once MAIL_BANK_DIR_PATH . "includes/queries.php";
324
+ }
325
+ if (file_exists(MAIL_BANK_DIR_PATH . "views/roles-and-capabilities/roles-and-capabilities.php")) {
326
+ include_once MAIL_BANK_DIR_PATH . "views/roles-and-capabilities/roles-and-capabilities.php";
327
+ }
328
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/footer.php")) {
329
+ include_once MAIL_BANK_DIR_PATH . "includes/footer.php";
330
+ }
331
  }
332
 
333
  /*
339
  */
340
 
341
  function mb_feedbacks() {
342
+ global $wpdb;
343
+ $user_role_permission = get_users_capabilities_mail_bank();
344
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/translations.php")) {
345
+ include MAIL_BANK_DIR_PATH . "includes/translations.php";
346
+ }
347
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/header.php")) {
348
+ include_once MAIL_BANK_DIR_PATH . "includes/header.php";
349
+ }
350
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/sidebar.php")) {
351
+ include_once MAIL_BANK_DIR_PATH . "includes/sidebar.php";
352
+ }
353
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/queries.php")) {
354
+ include_once MAIL_BANK_DIR_PATH . "includes/queries.php";
355
+ }
356
+ if (file_exists(MAIL_BANK_DIR_PATH . "views/feedbacks/feedbacks.php")) {
357
+ include_once MAIL_BANK_DIR_PATH . "views/feedbacks/feedbacks.php";
358
+ }
359
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/footer.php")) {
360
+ include_once MAIL_BANK_DIR_PATH . "includes/footer.php";
361
+ }
362
  }
363
 
364
  /*
370
  */
371
 
372
  function mb_system_information() {
373
+ global $wpdb;
374
+ $user_role_permission = get_users_capabilities_mail_bank();
375
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/translations.php")) {
376
+ include MAIL_BANK_DIR_PATH . "includes/translations.php";
377
+ }
378
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/header.php")) {
379
+ include_once MAIL_BANK_DIR_PATH . "includes/header.php";
380
+ }
381
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/sidebar.php")) {
382
+ include_once MAIL_BANK_DIR_PATH . "includes/sidebar.php";
383
+ }
384
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/queries.php")) {
385
+ include_once MAIL_BANK_DIR_PATH . "includes/queries.php";
386
+ }
387
+ if (file_exists(MAIL_BANK_DIR_PATH . "views/system-information/system-information.php")) {
388
+ include_once MAIL_BANK_DIR_PATH . "views/system-information/system-information.php";
389
+ }
390
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/footer.php")) {
391
+ include_once MAIL_BANK_DIR_PATH . "includes/footer.php";
392
+ }
393
  }
394
 
395
  /*
401
  */
402
 
403
  function mb_upgrade() {
404
+ global $wpdb;
405
+ $user_role_permission = get_users_capabilities_mail_bank();
406
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/translations.php")) {
407
+ include MAIL_BANK_DIR_PATH . "includes/translations.php";
408
+ }
409
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/header.php")) {
410
+ include_once MAIL_BANK_DIR_PATH . "includes/header.php";
411
+ }
412
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/sidebar.php")) {
413
+ include_once MAIL_BANK_DIR_PATH . "includes/sidebar.php";
414
+ }
415
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/queries.php")) {
416
+ include_once MAIL_BANK_DIR_PATH . "includes/queries.php";
417
+ }
418
+ if (file_exists(MAIL_BANK_DIR_PATH . "views/premium-editions/premium-editions.php")) {
419
+ include_once MAIL_BANK_DIR_PATH . "views/premium-editions/premium-editions.php";
420
+ }
421
+ if (file_exists(MAIL_BANK_DIR_PATH . "includes/footer.php")) {
422
+ include_once MAIL_BANK_DIR_PATH . "includes/footer.php";
423
+ }
424
  }
425
 
426
  }
lib/zend/exception.php CHANGED
@@ -46,10 +46,10 @@ class mail_bank_Zend_Exception extends Exception {
46
  */
47
  public function __construct($msg = '', $code = 0, Exception $previous = null) {
48
  if (version_compare(PHP_VERSION, '5.3.0', '<')) {
49
- parent::__construct($msg, (int) $code);
50
- $this->_previous = $previous;
51
  } else {
52
- parent::__construct($msg, (int) $code, $previous);
53
  }
54
  }
55
 
@@ -64,7 +64,7 @@ class mail_bank_Zend_Exception extends Exception {
64
  */
65
  public function __call($method, array $args) {
66
  if ('getprevious' == strtolower($method)) {
67
- return $this->_getPrevious();
68
  }
69
  return null;
70
  }
@@ -76,11 +76,11 @@ class mail_bank_Zend_Exception extends Exception {
76
  */
77
  public function __toString() {
78
  if (version_compare(PHP_VERSION, '5.3.0', '<')) {
79
- if (null !== ($e = $this->getPrevious())) {
80
- return $e->__toString()
81
- . "\n\nNext "
82
- . parent::__toString();
83
- }
84
  }
85
  return parent::__toString();
86
  }
46
  */
47
  public function __construct($msg = '', $code = 0, Exception $previous = null) {
48
  if (version_compare(PHP_VERSION, '5.3.0', '<')) {
49
+ parent::__construct($msg, (int) $code);
50
+ $this->_previous = $previous;
51
  } else {
52
+ parent::__construct($msg, (int) $code, $previous);
53
  }
54
  }
55
 
64
  */
65
  public function __call($method, array $args) {
66
  if ('getprevious' == strtolower($method)) {
67
+ return $this->_getPrevious();
68
  }
69
  return null;
70
  }
76
  */
77
  public function __toString() {
78
  if (version_compare(PHP_VERSION, '5.3.0', '<')) {
79
+ if (null !== ($e = $this->getPrevious())) {
80
+ return $e->__toString()
81
+ . "\n\nNext "
82
+ . parent::__toString();
83
+ }
84
  }
85
  return parent::__toString();
86
  }
lib/zend/loader.php CHANGED
@@ -55,41 +55,41 @@ class mail_bank_Zend_Loader {
55
  */
56
  public static function loadClass($class, $dirs = null) {
57
  if (class_exists($class, false) || interface_exists($class, false)) {
58
- return;
59
  }
60
 
61
  if ((null !== $dirs) && !is_string($dirs) && !is_array($dirs)) {
62
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/exception.php'))
63
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/exception.php';
64
 
65
- throw new mail_bank_Zend_Exception('Directory argument must be a string or an array');
66
  }
67
 
68
  $file = self::standardiseFile($class);
69
  if (!empty($dirs)) {
70
- // use the autodiscovered path
71
- $dirPath = dirname($file);
72
- if (is_string($dirs)) {
73
- $dirs = explode(PATH_SEPARATOR, $dirs);
74
- }
75
- foreach ($dirs as $key => $dir) {
76
- if ($dir == '.') {
77
- $dirs[$key] = $dirPath;
78
- } else {
79
- $dir = rtrim($dir, '\\/');
80
- $dirs[$key] = $dir . DIRECTORY_SEPARATOR . $dirPath;
81
- }
82
- }
83
- $file = basename($file);
84
- self::loadFile($file, $dirs, true);
85
  } else {
86
- self::loadFile($file, null, true);
87
  }
88
  if (!class_exists($class, false) && !interface_exists($class, false)) {
89
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/exception.php'))
90
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/exception.php';
91
 
92
- throw new mail_bank_Zend_Exception("File \"$file\" does not exist or class \"$class\" was not found in the file");
93
  }
94
  }
95
 
@@ -124,30 +124,30 @@ class mail_bank_Zend_Loader {
124
  */
125
  $incPath = false;
126
  if (!empty($dirs) && (is_array($dirs) || is_string($dirs))) {
127
- if (is_array($dirs)) {
128
- $dirs = implode(PATH_SEPARATOR, $dirs);
129
- }
130
- $incPath = get_include_path();
131
- set_include_path($dirs . PATH_SEPARATOR . $incPath);
132
  }
133
 
134
  /**
135
  * Try finding for the plain filename in the include_path.
136
  */
137
  if ($once) {
138
- if (file_exists($filename))
139
- include_once $filename;
140
  }
141
  else {
142
- if (file_exists($filename))
143
- include $filename;
144
  }
145
 
146
  /**
147
  * If searching in directories, reset include_path
148
  */
149
  if ($incPath) {
150
- set_include_path($incPath);
151
  }
152
 
153
  return true;
@@ -168,29 +168,29 @@ class mail_bank_Zend_Loader {
168
  */
169
  public static function isReadable($filename) {
170
  if (is_readable($filename)) {
171
- // Return early if the filename is readable without needing the
172
- // include_path
173
- return true;
174
  }
175
 
176
  if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN' && preg_match('/^[a-z]:/i', $filename)
177
  ) {
178
- // If on windows, and path provided is clearly an absolute path,
179
- // return false immediately
180
- return false;
181
  }
182
 
183
  foreach (self::explodeIncludePath() as $path) {
184
- if ($path == '.') {
185
- if (is_readable($filename)) {
186
- return true;
187
- }
188
- continue;
189
- }
190
- $file = $path . '/' . $filename;
191
- if (is_readable($file)) {
192
- return true;
193
- }
194
  }
195
  return false;
196
  }
@@ -206,16 +206,16 @@ class mail_bank_Zend_Loader {
206
  */
207
  public static function explodeIncludePath($path = null) {
208
  if (null === $path) {
209
- $path = get_include_path();
210
  }
211
 
212
  if (PATH_SEPARATOR == ':') {
213
- // On *nix systems, include_paths which include paths with a stream
214
- // schema cannot be safely explode'd, so we have to be a bit more
215
- // intelligent in the approach.
216
- $paths = preg_split('#:(?!//)#', $path);
217
  } else {
218
- $paths = explode(PATH_SEPARATOR, $path);
219
  }
220
  return $paths;
221
  }
@@ -235,10 +235,10 @@ class mail_bank_Zend_Loader {
235
  public static function autoload($class) {
236
  trigger_error(__CLASS__ . '::' . __METHOD__ . ' is deprecated as of 1.8.0 and will be removed with 2.0.0; use Zend_Loader_Autoloader instead', E_USER_NOTICE);
237
  try {
238
- @self::loadClass($class);
239
- return $class;
240
  } catch (Exception $e) {
241
- return false;
242
  }
243
  }
244
 
@@ -255,28 +255,28 @@ class mail_bank_Zend_Loader {
255
  public static function registerAutoload($class = 'mail_bank_Zend_Loader', $enabled = true) {
256
  trigger_error(__CLASS__ . '::' . __METHOD__ . ' is deprecated as of 1.8.0 and will be removed with 2.0.0; use mail_bank_Zend_Loader_Autoloader instead', E_USER_NOTICE);
257
  if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/loader/autoloader.php'))
258
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/loader/autoloader.php';
259
 
260
  $autoloader = mail_bank_Zend_Loader_Autoloader::getInstance();
261
  $autoloader->setFallbackAutoloader(true);
262
 
263
  if ('mail_bank_Zend_Loader' != $class) {
264
- self::loadClass($class);
265
- $methods = get_class_methods($class);
266
- if (!in_array('autoload', (array) $methods)) {
267
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/exception.php'))
268
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/exception.php';
269
 
270
- throw new mail_bank_Zend_Exception("The class \"$class\" does not have an autoload() method");
271
- }
272
 
273
- $callback = array($class, 'autoload');
274
 
275
- if ($enabled) {
276
- $autoloader->pushAutoloader($callback);
277
- } else {
278
- $autoloader->removeAutoloader($callback);
279
- }
280
  }
281
  }
282
 
@@ -292,10 +292,10 @@ class mail_bank_Zend_Loader {
292
  * Security check
293
  */
294
  if (preg_match('/[^a-z0-9\\/\\\\_.:-]/i', $filename)) {
295
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/exception.php'))
296
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/exception.php';
297
 
298
- throw new mail_bank_Zend_Exception('Security check: Illegal character in filename');
299
  }
300
  }
301
 
@@ -315,12 +315,12 @@ class mail_bank_Zend_Loader {
315
  */
316
  protected static function _includeFile($filespec, $once = false) {
317
  if ($once) {
318
- if (file_exists($filespec))
319
- return include_once $filespec;
320
  }
321
  else {
322
- if (file_exists($filespec))
323
- return include $filespec;
324
  }
325
  }
326
 
@@ -341,9 +341,9 @@ class mail_bank_Zend_Loader {
341
  $file = '';
342
  $namespace = '';
343
  if ($lastNsPos = strripos($fileName, '\\')) {
344
- $namespace = substr($fileName, 0, $lastNsPos);
345
- $fileName = substr($fileName, $lastNsPos + 1);
346
- $file = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
347
  }
348
  $file .= str_replace('_', DIRECTORY_SEPARATOR, $fileName) . '.php';
349
  return $file;
55
  */
56
  public static function loadClass($class, $dirs = null) {
57
  if (class_exists($class, false) || interface_exists($class, false)) {
58
+ return;
59
  }
60
 
61
  if ((null !== $dirs) && !is_string($dirs) && !is_array($dirs)) {
62
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/exception.php'))
63
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/exception.php';
64
 
65
+ throw new mail_bank_Zend_Exception('Directory argument must be a string or an array');
66
  }
67
 
68
  $file = self::standardiseFile($class);
69
  if (!empty($dirs)) {
70
+ // use the autodiscovered path
71
+ $dirPath = dirname($file);
72
+ if (is_string($dirs)) {
73
+ $dirs = explode(PATH_SEPARATOR, $dirs);
74
+ }
75
+ foreach ($dirs as $key => $dir) {
76
+ if ($dir == '.') {
77
+ $dirs[$key] = $dirPath;
78
+ } else {
79
+ $dir = rtrim($dir, '\\/');
80
+ $dirs[$key] = $dir . DIRECTORY_SEPARATOR . $dirPath;
81
+ }
82
+ }
83
+ $file = basename($file);
84
+ self::loadFile($file, $dirs, true);
85
  } else {
86
+ self::loadFile($file, null, true);
87
  }
88
  if (!class_exists($class, false) && !interface_exists($class, false)) {
89
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/exception.php'))
90
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/exception.php';
91
 
92
+ throw new mail_bank_Zend_Exception("File \"$file\" does not exist or class \"$class\" was not found in the file");
93
  }
94
  }
95
 
124
  */
125
  $incPath = false;
126
  if (!empty($dirs) && (is_array($dirs) || is_string($dirs))) {
127
+ if (is_array($dirs)) {
128
+ $dirs = implode(PATH_SEPARATOR, $dirs);
129
+ }
130
+ $incPath = get_include_path();
131
+ set_include_path($dirs . PATH_SEPARATOR . $incPath);
132
  }
133
 
134
  /**
135
  * Try finding for the plain filename in the include_path.
136
  */
137
  if ($once) {
138
+ if (file_exists($filename))
139
+ include_once $filename;
140
  }
141
  else {
142
+ if (file_exists($filename))
143
+ include $filename;
144
  }
145
 
146
  /**
147
  * If searching in directories, reset include_path
148
  */
149
  if ($incPath) {
150
+ set_include_path($incPath);
151
  }
152
 
153
  return true;
168
  */
169
  public static function isReadable($filename) {
170
  if (is_readable($filename)) {
171
+ // Return early if the filename is readable without needing the
172
+ // include_path
173
+ return true;
174
  }
175
 
176
  if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN' && preg_match('/^[a-z]:/i', $filename)
177
  ) {
178
+ // If on windows, and path provided is clearly an absolute path,
179
+ // return false immediately
180
+ return false;
181
  }
182
 
183
  foreach (self::explodeIncludePath() as $path) {
184
+ if ($path == '.') {
185
+ if (is_readable($filename)) {
186
+ return true;
187
+ }
188
+ continue;
189
+ }
190
+ $file = $path . '/' . $filename;
191
+ if (is_readable($file)) {
192
+ return true;
193
+ }
194
  }
195
  return false;
196
  }
206
  */
207
  public static function explodeIncludePath($path = null) {
208
  if (null === $path) {
209
+ $path = get_include_path();
210
  }
211
 
212
  if (PATH_SEPARATOR == ':') {
213
+ // On *nix systems, include_paths which include paths with a stream
214
+ // schema cannot be safely explode'd, so we have to be a bit more
215
+ // intelligent in the approach.
216
+ $paths = preg_split('#:(?!//)#', $path);
217
  } else {
218
+ $paths = explode(PATH_SEPARATOR, $path);
219
  }
220
  return $paths;
221
  }
235
  public static function autoload($class) {
236
  trigger_error(__CLASS__ . '::' . __METHOD__ . ' is deprecated as of 1.8.0 and will be removed with 2.0.0; use Zend_Loader_Autoloader instead', E_USER_NOTICE);
237
  try {
238
+ @self::loadClass($class);
239
+ return $class;
240
  } catch (Exception $e) {
241
+ return false;
242
  }
243
  }
244
 
255
  public static function registerAutoload($class = 'mail_bank_Zend_Loader', $enabled = true) {
256
  trigger_error(__CLASS__ . '::' . __METHOD__ . ' is deprecated as of 1.8.0 and will be removed with 2.0.0; use mail_bank_Zend_Loader_Autoloader instead', E_USER_NOTICE);
257
  if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/loader/autoloader.php'))
258
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/loader/autoloader.php';
259
 
260
  $autoloader = mail_bank_Zend_Loader_Autoloader::getInstance();
261
  $autoloader->setFallbackAutoloader(true);
262
 
263
  if ('mail_bank_Zend_Loader' != $class) {
264
+ self::loadClass($class);
265
+ $methods = get_class_methods($class);
266
+ if (!in_array('autoload', (array) $methods)) {
267
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/exception.php'))
268
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/exception.php';
269
 
270
+ throw new mail_bank_Zend_Exception("The class \"$class\" does not have an autoload() method");
271
+ }
272
 
273
+ $callback = array($class, 'autoload');
274
 
275
+ if ($enabled) {
276
+ $autoloader->pushAutoloader($callback);
277
+ } else {
278
+ $autoloader->removeAutoloader($callback);
279
+ }
280
  }
281
  }
282
 
292
  * Security check
293
  */
294
  if (preg_match('/[^a-z0-9\\/\\\\_.:-]/i', $filename)) {
295
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/exception.php'))
296
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/exception.php';
297
 
298
+ throw new mail_bank_Zend_Exception('Security check: Illegal character in filename');
299
  }
300
  }
301
 
315
  */
316
  protected static function _includeFile($filespec, $once = false) {
317
  if ($once) {
318
+ if (file_exists($filespec))
319
+ return include_once $filespec;
320
  }
321
  else {
322
+ if (file_exists($filespec))
323
+ return include $filespec;
324
  }
325
  }
326
 
341
  $file = '';
342
  $namespace = '';
343
  if ($lastNsPos = strripos($fileName, '\\')) {
344
+ $namespace = substr($fileName, 0, $lastNsPos);
345
+ $fileName = substr($fileName, $lastNsPos + 1);
346
+ $file = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
347
  }
348
  $file .= str_replace('_', DIRECTORY_SEPARATOR, $fileName) . '.php';
349
  return $file;
lib/zend/loader/autoloader.php CHANGED
@@ -92,7 +92,7 @@ class mail_bank_Zend_Loader_Autoloader {
92
  */
93
  public static function getInstance() {
94
  if (null === self::$_instance) {
95
- self::$_instance = new self();
96
  }
97
  return self::$_instance;
98
  }
@@ -116,19 +116,19 @@ class mail_bank_Zend_Loader_Autoloader {
116
  $self = self::getInstance();
117
 
118
  foreach ($self->getClassAutoloaders($class) as $autoloader) {
119
- if ($autoloader instanceof mail_bank_Zend_Loader_Autoloader_Interface) {
120
- if ($autoloader->autoload($class)) {
121
- return true;
122
- }
123
- } elseif (is_array($autoloader)) {
124
- if (call_user_func($autoloader, $class)) {
125
- return true;
126
- }
127
- } elseif (is_string($autoloader) || is_callable($autoloader)) {
128
- if ($autoloader($class)) {
129
- return true;
130
- }
131
- }
132
  }
133
  return false;
134
  }
@@ -141,7 +141,7 @@ class mail_bank_Zend_Loader_Autoloader {
141
  */
142
  public function setDefaultAutoloader($callback) {
143
  if (!is_callable($callback)) {
144
- throw new mail_bank_Zend_Loader_Exception('Invalid callback specified for default autoloader');
145
  }
146
 
147
  $this->_defaultAutoloader = $callback;
@@ -186,7 +186,7 @@ class mail_bank_Zend_Loader_Autoloader {
186
  public function getNamespaceAutoloaders($namespace) {
187
  $namespace = (string) $namespace;
188
  if (!array_key_exists($namespace, $this->_namespaceAutoloaders)) {
189
- return array();
190
  }
191
  return $this->_namespaceAutoloaders[$namespace];
192
  }
@@ -199,15 +199,15 @@ class mail_bank_Zend_Loader_Autoloader {
199
  */
200
  public function registerNamespace($namespace) {
201
  if (is_string($namespace)) {
202
- $namespace = (array) $namespace;
203
  } elseif (!is_array($namespace)) {
204
- throw new mail_bank_Zend_Loader_Exception('Invalid namespace provided');
205
  }
206
 
207
  foreach ($namespace as $ns) {
208
- if (!isset($this->_namespaces[$ns])) {
209
- $this->_namespaces[$ns] = true;
210
- }
211
  }
212
  return $this;
213
  }
@@ -220,15 +220,15 @@ class mail_bank_Zend_Loader_Autoloader {
220
  */
221
  public function unregisterNamespace($namespace) {
222
  if (is_string($namespace)) {
223
- $namespace = (array) $namespace;
224
  } elseif (!is_array($namespace)) {
225
- throw new mail_bank_Zend_Loader_Exception('Invalid namespace provided');
226
  }
227
 
228
  foreach ($namespace as $ns) {
229
- if (isset($this->_namespaces[$ns])) {
230
- unset($this->_namespaces[$ns]);
231
- }
232
  }
233
  return $this;
234
  }
@@ -245,19 +245,19 @@ class mail_bank_Zend_Loader_Autoloader {
245
  public function setZfPath($spec, $version = 'latest') {
246
  $path = $spec;
247
  if (is_array($spec)) {
248
- if (!isset($spec['path'])) {
249
- throw new mail_bank_Zend_Loader_Exception('No path specified for ZF');
250
- }
251
- $path = $spec['path'];
252
- if (isset($spec['version'])) {
253
- $version = $spec['version'];
254
- }
255
  }
256
 
257
  $this->_zfPath = $this->_getVersionPath($path, $version);
258
  set_include_path(implode(PATH_SEPARATOR, array(
259
- $this->_zfPath,
260
- get_include_path(),
261
  )));
262
  return $this;
263
  }
@@ -274,7 +274,7 @@ class mail_bank_Zend_Loader_Autoloader {
274
  */
275
  public function suppressNotFoundWarnings($flag = null) {
276
  if (null === $flag) {
277
- return $this->_suppressNotFoundWarnings;
278
  }
279
  $this->_suppressNotFoundWarnings = (bool) $flag;
280
  return $this;
@@ -316,38 +316,38 @@ class mail_bank_Zend_Loader_Autoloader {
316
 
317
  // Add concrete namespaced autoloaders
318
  foreach (array_keys($this->_namespaceAutoloaders) as $ns) {
319
- if ('' == $ns) {
320
- continue;
321
- }
322
- if (0 === strpos($class, $ns)) {
323
- if ((false === $namespace) || (strlen($ns) > strlen($namespace))) {
324
- $namespace = $ns;
325
- $autoloaders = $this->getNamespaceAutoloaders($ns);
326
- }
327
- }
328
  }
329
 
330
  // Add internal namespaced autoloader
331
  foreach ($this->getRegisteredNamespaces() as $ns) {
332
- if (0 === strpos($class, $ns)) {
333
- $namespace = $ns;
334
- $autoloaders[] = $this->_internalAutoloader;
335
- break;
336
- }
337
  }
338
 
339
  // Add non-namespaced autoloaders
340
  $autoloadersNonNamespace = $this->getNamespaceAutoloaders('');
341
  if (count($autoloadersNonNamespace)) {
342
- foreach ($autoloadersNonNamespace as $ns) {
343
- $autoloaders[] = $ns;
344
- }
345
- unset($autoloadersNonNamespace);
346
  }
347
 
348
  // Add fallback autoloader
349
  if (!$namespace && $this->isFallbackAutoloader()) {
350
- $autoloaders[] = $this->_internalAutoloader;
351
  }
352
 
353
  return $autoloaders;
@@ -367,9 +367,9 @@ class mail_bank_Zend_Loader_Autoloader {
367
 
368
  $namespace = (array) $namespace;
369
  foreach ($namespace as $ns) {
370
- $autoloaders = $this->getNamespaceAutoloaders($ns);
371
- array_unshift($autoloaders, $callback);
372
- $this->_setNamespaceAutoloaders($autoloaders, $ns);
373
  }
374
 
375
  return $this;
@@ -389,9 +389,9 @@ class mail_bank_Zend_Loader_Autoloader {
389
 
390
  $namespace = (array) $namespace;
391
  foreach ($namespace as $ns) {
392
- $autoloaders = $this->getNamespaceAutoloaders($ns);
393
- array_push($autoloaders, $callback);
394
- $this->_setNamespaceAutoloaders($autoloaders, $ns);
395
  }
396
 
397
  return $this;
@@ -406,27 +406,27 @@ class mail_bank_Zend_Loader_Autoloader {
406
  */
407
  public function removeAutoloader($callback, $namespace = null) {
408
  if (null === $namespace) {
409
- $autoloaders = $this->getAutoloaders();
410
- if (false !== ($index = array_search($callback, $autoloaders, true))) {
411
- unset($autoloaders[$index]);
412
- $this->setAutoloaders($autoloaders);
413
- }
414
-
415
- foreach ($this->_namespaceAutoloaders as $ns => $autoloaders) {
416
- if (false !== ($index = array_search($callback, $autoloaders, true))) {
417
- unset($autoloaders[$index]);
418
- $this->_setNamespaceAutoloaders($autoloaders, $ns);
419
- }
420
- }
421
  } else {
422
- $namespace = (array) $namespace;
423
- foreach ($namespace as $ns) {
424
- $autoloaders = $this->getNamespaceAutoloaders($ns);
425
- if (false !== ($index = array_search($callback, $autoloaders, true))) {
426
- unset($autoloaders[$index]);
427
- $this->_setNamespaceAutoloaders($autoloaders, $ns);
428
- }
429
- }
430
  }
431
 
432
  return $this;
@@ -453,14 +453,14 @@ class mail_bank_Zend_Loader_Autoloader {
453
  protected function _autoload($class) {
454
  $callback = $this->getDefaultAutoloader();
455
  try {
456
- if ($this->suppressNotFoundWarnings()) {
457
- @call_user_func($callback, $class);
458
- } else {
459
- call_user_func($callback, $class);
460
- }
461
- return $class;
462
  } catch (mail_bank_Zend_Exception $e) {
463
- return false;
464
  }
465
  }
466
 
@@ -488,12 +488,12 @@ class mail_bank_Zend_Loader_Autoloader {
488
  $type = $this->_getVersionType($version);
489
 
490
  if ($type == 'latest') {
491
- $version = 'latest';
492
  }
493
 
494
  $availableVersions = $this->_getAvailableVersions($path, $version);
495
  if (empty($availableVersions)) {
496
- throw new mail_bank_Zend_Loader_Exception('No valid ZF installations discovered');
497
  }
498
 
499
  $matchedVersion = array_pop($availableVersions);
@@ -509,19 +509,19 @@ class mail_bank_Zend_Loader_Autoloader {
509
  */
510
  protected function _getVersionType($version) {
511
  if (strtolower($version) == 'latest') {
512
- return 'latest';
513
  }
514
 
515
  $parts = explode('.', $version);
516
  $count = count($parts);
517
  if (1 == $count) {
518
- return 'major';
519
  }
520
  if (2 == $count) {
521
- return 'minor';
522
  }
523
  if (3 < $count) {
524
- throw new mail_bank_Zend_Loader_Exception('Invalid version string provided');
525
  }
526
  return 'specific';
527
  }
@@ -535,7 +535,7 @@ class mail_bank_Zend_Loader_Autoloader {
535
  */
536
  protected function _getAvailableVersions($path, $version) {
537
  if (!is_dir($path)) {
538
- throw new mail_bank_Zend_Loader_Exception('Invalid ZF path provided');
539
  }
540
 
541
  $path = rtrim($path, '/');
@@ -544,17 +544,17 @@ class mail_bank_Zend_Loader_Autoloader {
544
  $versions = array();
545
  $dirs = glob("$path/*", GLOB_ONLYDIR);
546
  foreach ((array) $dirs as $dir) {
547
- $dirName = substr($dir, strlen($path) + 1);
548
- if (!preg_match('/^(?:ZendFramework-)?(\d+\.\d+\.\d+((a|b|pl|pr|p|rc)\d+)?)(?:-minimal)?$/i', $dirName, $matches)) {
549
- continue;
550
- }
551
 
552
- $matchedVersion = $matches[1];
553
 
554
- if (('latest' == $version) || ((strlen($matchedVersion) >= $versionLen) && (0 === strpos($matchedVersion, $version)))
555
- ) {
556
- $versions[$matchedVersion] = $dir . '/library';
557
- }
558
  }
559
 
560
  uksort($versions, 'version_compare');
92
  */
93
  public static function getInstance() {
94
  if (null === self::$_instance) {
95
+ self::$_instance = new self();
96
  }
97
  return self::$_instance;
98
  }
116
  $self = self::getInstance();
117
 
118
  foreach ($self->getClassAutoloaders($class) as $autoloader) {
119
+ if ($autoloader instanceof mail_bank_Zend_Loader_Autoloader_Interface) {
120
+ if ($autoloader->autoload($class)) {
121
+ return true;
122
+ }
123
+ } elseif (is_array($autoloader)) {
124
+ if (call_user_func($autoloader, $class)) {
125
+ return true;
126
+ }
127
+ } elseif (is_string($autoloader) || is_callable($autoloader)) {
128
+ if ($autoloader($class)) {
129
+ return true;
130
+ }
131
+ }
132
  }
133
  return false;
134
  }
141
  */
142
  public function setDefaultAutoloader($callback) {
143
  if (!is_callable($callback)) {
144
+ throw new mail_bank_Zend_Loader_Exception('Invalid callback specified for default autoloader');
145
  }
146
 
147
  $this->_defaultAutoloader = $callback;
186
  public function getNamespaceAutoloaders($namespace) {
187
  $namespace = (string) $namespace;
188
  if (!array_key_exists($namespace, $this->_namespaceAutoloaders)) {
189
+ return array();
190
  }
191
  return $this->_namespaceAutoloaders[$namespace];
192
  }
199
  */
200
  public function registerNamespace($namespace) {
201
  if (is_string($namespace)) {
202
+ $namespace = (array) $namespace;
203
  } elseif (!is_array($namespace)) {
204
+ throw new mail_bank_Zend_Loader_Exception('Invalid namespace provided');
205
  }
206
 
207
  foreach ($namespace as $ns) {
208
+ if (!isset($this->_namespaces[$ns])) {
209
+ $this->_namespaces[$ns] = true;
210
+ }
211
  }
212
  return $this;
213
  }
220
  */
221
  public function unregisterNamespace($namespace) {
222
  if (is_string($namespace)) {
223
+ $namespace = (array) $namespace;
224
  } elseif (!is_array($namespace)) {
225
+ throw new mail_bank_Zend_Loader_Exception('Invalid namespace provided');
226
  }
227
 
228
  foreach ($namespace as $ns) {
229
+ if (isset($this->_namespaces[$ns])) {
230
+ unset($this->_namespaces[$ns]);
231
+ }
232
  }
233
  return $this;
234
  }
245
  public function setZfPath($spec, $version = 'latest') {
246
  $path = $spec;
247
  if (is_array($spec)) {
248
+ if (!isset($spec['path'])) {
249
+ throw new mail_bank_Zend_Loader_Exception('No path specified for ZF');
250
+ }
251
+ $path = $spec['path'];
252
+ if (isset($spec['version'])) {
253
+ $version = $spec['version'];
254
+ }
255
  }
256
 
257
  $this->_zfPath = $this->_getVersionPath($path, $version);
258
  set_include_path(implode(PATH_SEPARATOR, array(
259
+ $this->_zfPath,
260
+ get_include_path(),
261
  )));
262
  return $this;
263
  }
274
  */
275
  public function suppressNotFoundWarnings($flag = null) {
276
  if (null === $flag) {
277
+ return $this->_suppressNotFoundWarnings;
278
  }
279
  $this->_suppressNotFoundWarnings = (bool) $flag;
280
  return $this;
316
 
317
  // Add concrete namespaced autoloaders
318
  foreach (array_keys($this->_namespaceAutoloaders) as $ns) {
319
+ if ('' == $ns) {
320
+ continue;
321
+ }
322
+ if (0 === strpos($class, $ns)) {
323
+ if ((false === $namespace) || (strlen($ns) > strlen($namespace))) {
324
+ $namespace = $ns;
325
+ $autoloaders = $this->getNamespaceAutoloaders($ns);
326
+ }
327
+ }
328
  }
329
 
330
  // Add internal namespaced autoloader
331
  foreach ($this->getRegisteredNamespaces() as $ns) {
332
+ if (0 === strpos($class, $ns)) {
333
+ $namespace = $ns;
334
+ $autoloaders[] = $this->_internalAutoloader;
335
+ break;
336
+ }
337
  }
338
 
339
  // Add non-namespaced autoloaders
340
  $autoloadersNonNamespace = $this->getNamespaceAutoloaders('');
341
  if (count($autoloadersNonNamespace)) {
342
+ foreach ($autoloadersNonNamespace as $ns) {
343
+ $autoloaders[] = $ns;
344
+ }
345
+ unset($autoloadersNonNamespace);
346
  }
347
 
348
  // Add fallback autoloader
349
  if (!$namespace && $this->isFallbackAutoloader()) {
350
+ $autoloaders[] = $this->_internalAutoloader;
351
  }
352
 
353
  return $autoloaders;
367
 
368
  $namespace = (array) $namespace;
369
  foreach ($namespace as $ns) {
370
+ $autoloaders = $this->getNamespaceAutoloaders($ns);
371
+ array_unshift($autoloaders, $callback);
372
+ $this->_setNamespaceAutoloaders($autoloaders, $ns);
373
  }
374
 
375
  return $this;
389
 
390
  $namespace = (array) $namespace;
391
  foreach ($namespace as $ns) {
392
+ $autoloaders = $this->getNamespaceAutoloaders($ns);
393
+ array_push($autoloaders, $callback);
394
+ $this->_setNamespaceAutoloaders($autoloaders, $ns);
395
  }
396
 
397
  return $this;
406
  */
407
  public function removeAutoloader($callback, $namespace = null) {
408
  if (null === $namespace) {
409
+ $autoloaders = $this->getAutoloaders();
410
+ if (false !== ($index = array_search($callback, $autoloaders, true))) {
411
+ unset($autoloaders[$index]);
412
+ $this->setAutoloaders($autoloaders);
413
+ }
414
+
415
+ foreach ($this->_namespaceAutoloaders as $ns => $autoloaders) {
416
+ if (false !== ($index = array_search($callback, $autoloaders, true))) {
417
+ unset($autoloaders[$index]);
418
+ $this->_setNamespaceAutoloaders($autoloaders, $ns);
419
+ }
420
+ }
421
  } else {
422
+ $namespace = (array) $namespace;
423
+ foreach ($namespace as $ns) {
424
+ $autoloaders = $this->getNamespaceAutoloaders($ns);
425
+ if (false !== ($index = array_search($callback, $autoloaders, true))) {
426
+ unset($autoloaders[$index]);
427
+ $this->_setNamespaceAutoloaders($autoloaders, $ns);
428
+ }
429
+ }
430
  }
431
 
432
  return $this;
453
  protected function _autoload($class) {
454
  $callback = $this->getDefaultAutoloader();
455
  try {
456
+ if ($this->suppressNotFoundWarnings()) {
457
+ @call_user_func($callback, $class);
458
+ } else {
459
+ call_user_func($callback, $class);
460
+ }
461
+ return $class;
462
  } catch (mail_bank_Zend_Exception $e) {
463
+ return false;
464
  }
465
  }
466
 
488
  $type = $this->_getVersionType($version);
489
 
490
  if ($type == 'latest') {
491
+ $version = 'latest';
492
  }
493
 
494
  $availableVersions = $this->_getAvailableVersions($path, $version);
495
  if (empty($availableVersions)) {
496
+ throw new mail_bank_Zend_Loader_Exception('No valid ZF installations discovered');
497
  }
498
 
499
  $matchedVersion = array_pop($availableVersions);
509
  */
510
  protected function _getVersionType($version) {
511
  if (strtolower($version) == 'latest') {
512
+ return 'latest';
513
  }
514
 
515
  $parts = explode('.', $version);
516
  $count = count($parts);
517
  if (1 == $count) {
518
+ return 'major';
519
  }
520
  if (2 == $count) {
521
+ return 'minor';
522
  }
523
  if (3 < $count) {
524
+ throw new mail_bank_Zend_Loader_Exception('Invalid version string provided');
525
  }
526
  return 'specific';
527
  }
535
  */
536
  protected function _getAvailableVersions($path, $version) {
537
  if (!is_dir($path)) {
538
+ throw new mail_bank_Zend_Loader_Exception('Invalid ZF path provided');
539
  }
540
 
541
  $path = rtrim($path, '/');
544
  $versions = array();
545
  $dirs = glob("$path/*", GLOB_ONLYDIR);
546
  foreach ((array) $dirs as $dir) {
547
+ $dirName = substr($dir, strlen($path) + 1);
548
+ if (!preg_match('/^(?:ZendFramework-)?(\d+\.\d+\.\d+((a|b|pl|pr|p|rc)\d+)?)(?:-minimal)?$/i', $dirName, $matches)) {
549
+ continue;
550
+ }
551
 
552
+ $matchedVersion = $matches[1];
553
 
554
+ if (('latest' == $version) || ((strlen($matchedVersion) >= $versionLen) && (0 === strpos($matchedVersion, $version)))
555
+ ) {
556
+ $versions[$matchedVersion] = $dir . '/library';
557
+ }
558
  }
559
 
560
  uksort($versions, 'version_compare');
lib/zend/mail.php CHANGED
@@ -212,7 +212,7 @@ class mail_bank_Zend_Mail extends mail_bank_Zend_Mime_Message {
212
  */
213
  public function __construct($charset = null) {
214
  if ($charset != null) {
215
- $this->_charset = $charset;
216
  }
217
  }
218
 
@@ -236,18 +236,18 @@ class mail_bank_Zend_Mail extends mail_bank_Zend_Mime_Message {
236
  */
237
  public function setType($type) {
238
  $allowed = array(
239
- mail_bank_Zend_Mime::MULTIPART_ALTERNATIVE,
240
- mail_bank_Zend_Mime::MULTIPART_MIXED,
241
- mail_bank_Zend_Mime::MULTIPART_RELATED,
242
  );
243
  if (!in_array($type, $allowed)) {
244
- /**
245
- * @see mail_bank_Zend_Mail_Exception
246
- */
247
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php'))
248
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php';
249
 
250
- throw new mail_bank_Zend_Mail_Exception('Invalid content type "' . $type . '"');
251
  }
252
 
253
  $this->_type = $type;
@@ -328,17 +328,17 @@ class mail_bank_Zend_Mail extends mail_bank_Zend_Mime_Message {
328
  */
329
  public function setHeaderEncoding($encoding) {
330
  $allowed = array(
331
- mail_bank_Zend_Mime::ENCODING_BASE64,
332
- mail_bank_Zend_Mime::ENCODING_QUOTEDPRINTABLE
333
  );
334
  if (!in_array($encoding, $allowed)) {
335
- /**
336
- * @see mail_bank_Zend_Mail_Exception
337
- */
338
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php'))
339
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php';
340
 
341
- throw new mail_bank_Zend_Mail_Exception('Invalid encoding "' . $encoding . '"');
342
  }
343
  $this->_headerEncoding = $encoding;
344
 
@@ -355,7 +355,7 @@ class mail_bank_Zend_Mail extends mail_bank_Zend_Mime_Message {
355
  */
356
  public function setBodyText($txt, $charset = null, $encoding = mail_bank_Zend_Mime::ENCODING_QUOTEDPRINTABLE) {
357
  if ($charset === null) {
358
- $charset = $this->_charset;
359
  }
360
 
361
  $mp = new mail_bank_Zend_Mime_Part($txt);
@@ -378,8 +378,8 @@ class mail_bank_Zend_Mail extends mail_bank_Zend_Mime_Message {
378
  */
379
  public function getBodyText($textOnly = false) {
380
  if ($textOnly && $this->_bodyText) {
381
- $body = $this->_bodyText;
382
- return $body->getContent();
383
  }
384
 
385
  return $this->_bodyText;
@@ -395,7 +395,7 @@ class mail_bank_Zend_Mail extends mail_bank_Zend_Mime_Message {
395
  */
396
  public function setBodyHtml($html, $charset = null, $encoding = mail_bank_Zend_Mime::ENCODING_QUOTEDPRINTABLE) {
397
  if ($charset === null) {
398
- $charset = $this->_charset;
399
  }
400
 
401
  $mp = new mail_bank_Zend_Mime_Part($html);
@@ -417,8 +417,8 @@ class mail_bank_Zend_Mail extends mail_bank_Zend_Mime_Message {
417
  */
418
  public function getBodyHtml($htmlOnly = false) {
419
  if ($htmlOnly && $this->_bodyHtml) {
420
- $body = $this->_bodyHtml;
421
- return $body->getContent();
422
  }
423
 
424
  return $this->_bodyHtml;
@@ -483,11 +483,11 @@ class mail_bank_Zend_Mail extends mail_bank_Zend_Mime_Message {
483
  */
484
  protected function _encodeHeader($value) {
485
  if (mail_bank_Zend_Mime::isPrintable($value) === false) {
486
- if ($this->getHeaderEncoding() === mail_bank_Zend_Mime::ENCODING_QUOTEDPRINTABLE) {
487
- $value = mail_bank_Zend_Mime::encodeQuotedPrintableHeader($value, $this->getCharset(), mail_bank_Zend_Mime::LINELENGTH, mail_bank_Zend_Mime::LINEEND);
488
- } else {
489
- $value = mail_bank_Zend_Mime::encodeBase64Header($value, $this->getCharset(), mail_bank_Zend_Mime::LINELENGTH, mail_bank_Zend_Mime::LINEEND);
490
- }
491
  }
492
 
493
  return $value;
@@ -505,13 +505,13 @@ class mail_bank_Zend_Mail extends mail_bank_Zend_Mime_Message {
505
  */
506
  protected function _storeHeader($headerName, $value, $append = false) {
507
  if (isset($this->_headers[$headerName])) {
508
- $this->_headers[$headerName][] = $value;
509
  } else {
510
- $this->_headers[$headerName] = array($value);
511
  }
512
 
513
  if ($append) {
514
- $this->_headers[$headerName]['append'] = true;
515
  }
516
  }
517
 
@@ -550,12 +550,12 @@ class mail_bank_Zend_Mail extends mail_bank_Zend_Mime_Message {
550
  */
551
  public function addTo($email, $name = '') {
552
  if (!is_array($email)) {
553
- $email = array($name => $email);
554
  }
555
 
556
  foreach ($email as $n => $recipient) {
557
- $this->_addRecipientAndHeader('To', $recipient, is_int($n) ? '' : $n);
558
- $this->_to[] = $recipient;
559
  }
560
 
561
  return $this;
@@ -571,11 +571,11 @@ class mail_bank_Zend_Mail extends mail_bank_Zend_Mime_Message {
571
  */
572
  public function addCc($email, $name = '') {
573
  if (!is_array($email)) {
574
- $email = array($name => $email);
575
  }
576
 
577
  foreach ($email as $n => $recipient) {
578
- $this->_addRecipientAndHeader('Cc', $recipient, is_int($n) ? '' : $n);
579
  }
580
 
581
  return $this;
@@ -589,11 +589,11 @@ class mail_bank_Zend_Mail extends mail_bank_Zend_Mime_Message {
589
  */
590
  public function addBcc($email) {
591
  if (!is_array($email)) {
592
- $email = array($email);
593
  }
594
 
595
  foreach ($email as $recipient) {
596
- $this->_addRecipientAndHeader('Bcc', $recipient, '');
597
  }
598
 
599
  return $this;
@@ -616,7 +616,7 @@ class mail_bank_Zend_Mail extends mail_bank_Zend_Mime_Message {
616
  */
617
  public function clearHeader($headerName) {
618
  if (isset($this->_headers[$headerName])) {
619
- unset($this->_headers[$headerName]);
620
  }
621
  return $this;
622
  }
@@ -647,13 +647,13 @@ class mail_bank_Zend_Mail extends mail_bank_Zend_Mime_Message {
647
  */
648
  public function setFrom($email, $name = null) {
649
  if (null !== $this->_from) {
650
- /**
651
- * @see mail_bank_Zend_Mail_Exception
652
- */
653
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php'))
654
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php';
655
 
656
- throw new mail_bank_Zend_Mail_Exception('From Header set twice');
657
  }
658
 
659
  $email = $this->_filterEmail($email);
@@ -674,13 +674,13 @@ class mail_bank_Zend_Mail extends mail_bank_Zend_Mime_Message {
674
  */
675
  public function setReplyTo($email, $name = null) {
676
  if (null !== $this->_replyTo) {
677
- /**
678
- * @see mail_bank_Zend_Mail_Exception
679
- */
680
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php'))
681
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php';
682
 
683
- throw new mail_bank_Zend_Mail_Exception('Reply-To Header set twice');
684
  }
685
 
686
  $email = $this->_filterEmail($email);
@@ -771,11 +771,11 @@ class mail_bank_Zend_Mail extends mail_bank_Zend_Mime_Message {
771
  public function setFromToDefaultFrom() {
772
  $from = self::getDefaultFrom();
773
  if ($from === null) {
774
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php'))
775
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php';
776
 
777
- throw new mail_bank_Zend_Mail_Exception(
778
- 'No default From Address set to use');
779
  }
780
 
781
  $this->setFrom($from['email'], $from['name']);
@@ -821,11 +821,11 @@ class mail_bank_Zend_Mail extends mail_bank_Zend_Mime_Message {
821
  public function setReplyToFromDefault() {
822
  $replyTo = self::getDefaultReplyTo();
823
  if ($replyTo === null) {
824
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php'))
825
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php';
826
 
827
- throw new mail_bank_Zend_Mail_Exception(
828
- 'No default Reply-To Address set to use');
829
  }
830
 
831
  $this->setReplyTo($replyTo['email'], $replyTo['name']);
@@ -842,17 +842,17 @@ class mail_bank_Zend_Mail extends mail_bank_Zend_Mime_Message {
842
  */
843
  public function setReturnPath($email) {
844
  if ($this->_returnPath === null) {
845
- $email = $this->_filterEmail($email);
846
- $this->_returnPath = $email;
847
- $this->_storeHeader('Return-Path', $email, false);
848
  } else {
849
- /**
850
- * @see mail_bank_Zend_Mail_Exception
851
- */
852
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php'))
853
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php';
854
 
855
- throw new mail_bank_Zend_Mail_Exception('Return-Path Header set twice');
856
  }
857
  return $this;
858
  }
@@ -866,7 +866,7 @@ class mail_bank_Zend_Mail extends mail_bank_Zend_Mime_Message {
866
  */
867
  public function getReturnPath() {
868
  if (null !== $this->_returnPath) {
869
- return $this->_returnPath;
870
  }
871
 
872
  return $this->_from;
@@ -893,17 +893,17 @@ class mail_bank_Zend_Mail extends mail_bank_Zend_Mime_Message {
893
  */
894
  public function setSubject($subject) {
895
  if ($this->_subject === null) {
896
- $subject = $this->_filterOther($subject);
897
- $this->_subject = $this->_encodeHeader($subject);
898
- $this->_storeHeader('Subject', $this->_subject);
899
  } else {
900
- /**
901
- * @see mail_bank_Zend_Mail_Exception
902
- */
903
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php'))
904
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php';
905
 
906
- throw new mail_bank_Zend_Mail_Exception('Subject set twice');
907
  }
908
  return $this;
909
  }
@@ -939,47 +939,47 @@ class mail_bank_Zend_Mail extends mail_bank_Zend_Mime_Message {
939
  */
940
  public function setDate($date = null) {
941
  if ($this->_date === null) {
942
- if ($date === null) {
943
- $date = date('r');
944
- } else if (is_int($date)) {
945
- $date = date('r', $date);
946
- } else if (is_string($date)) {
947
- $date = strtotime($date);
948
- if ($date === false || $date < 0) {
949
- /**
950
- * @see mail_bank_Zend_Mail_Exception
951
- */
952
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php'))
953
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php';
954
-
955
- throw new mail_bank_Zend_Mail_Exception('String representations of Date Header must be ' .
956
- 'strtotime()-compatible');
957
- }
958
- $date = date('r', $date);
959
- }
960
- else if ($date instanceof mail_bank_Zend_Date) {
961
- $date = $date->get(mail_bank_Zend_Date::RFC_2822);
962
- } else {
963
- /**
964
- * @see mail_bank_Zend_Mail_Exception
965
- */
966
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php'))
967
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php';
968
-
969
- throw new mail_bank_Zend_Mail_Exception(__METHOD__ . ' only accepts UNIX timestamps, Zend_Date objects, ' .
970
- ' and strtotime()-compatible strings');
971
- }
972
- $this->_date = $date;
973
- $this->_storeHeader('Date', $date);
974
  }
975
  else {
976
- /**
977
- * @see mail_bank_Zend_Mail_Exception
978
- */
979
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php'))
980
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php';
981
 
982
- throw new mail_bank_Zend_Mail_Exception('Date Header set twice');
983
  }
984
  return $this;
985
  }
@@ -1018,23 +1018,23 @@ class mail_bank_Zend_Mail extends mail_bank_Zend_Mime_Message {
1018
  */
1019
  public function setMessageId($id = true) {
1020
  if ($id === null || $id === false) {
1021
- return $this;
1022
  } elseif ($id === true) {
1023
- $id = $this->createMessageId();
1024
  }
1025
 
1026
  if ($this->_messageId === null) {
1027
- $id = $this->_filterOther($id);
1028
- $this->_messageId = $id;
1029
- $this->_storeHeader('Message-Id', '<' . $this->_messageId . '>');
1030
  } else {
1031
- /**
1032
- * @see mail_bank_Zend_Mail_Exception
1033
- */
1034
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php'))
1035
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php';
1036
 
1037
- throw new mail_bank_Zend_Mail_Exception('Message-ID set twice');
1038
  }
1039
 
1040
  return $this;
@@ -1070,25 +1070,25 @@ class mail_bank_Zend_Mail extends mail_bank_Zend_Mime_Message {
1070
  $time = time();
1071
 
1072
  if ($this->_from !== null) {
1073
- $user = $this->_from;
1074
  } elseif (isset($_SERVER['REMOTE_ADDR'])) {
1075
- $user = $_SERVER['REMOTE_ADDR'];
1076
  } else {
1077
- $user = getmypid();
1078
  }
1079
 
1080
  $rand = mt_rand();
1081
 
1082
  if ($this->_recipients !== array()) {
1083
- $recipient = array_rand($this->_recipients);
1084
  } else {
1085
- $recipient = 'unknown';
1086
  }
1087
 
1088
  if (isset($_SERVER["SERVER_NAME"])) {
1089
- $hostName = $_SERVER["SERVER_NAME"];
1090
  } else {
1091
- $hostName = php_uname('n');
1092
  }
1093
 
1094
  return sha1($time . $user . $rand . $recipient) . '@' . $hostName;
@@ -1105,17 +1105,17 @@ class mail_bank_Zend_Mail extends mail_bank_Zend_Mime_Message {
1105
  */
1106
  public function addHeader($name, $value, $append = false) {
1107
  $prohibit = array('to', 'cc', 'bcc', 'from', 'subject',
1108
- 'reply-to', 'return-path',
1109
- 'date', 'message-id',
1110
  );
1111
  if (in_array(strtolower($name), $prohibit)) {
1112
- /**
1113
- * @see mail_bank_Zend_Mail_Exception
1114
- */
1115
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php'))
1116
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php';
1117
 
1118
- throw new mail_bank_Zend_Mail_Exception('Cannot set standard header from addHeader()');
1119
  }
1120
 
1121
  $value = $this->_filterOther($value);
@@ -1144,27 +1144,27 @@ class mail_bank_Zend_Mail extends mail_bank_Zend_Mime_Message {
1144
  */
1145
  public function send($transport = null) {
1146
  if ($transport === null) {
1147
- if (!self::$_defaultTransport instanceof mail_bank_Zend_Mail_Transport_Abstract) {
1148
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/transport/sendmail.php'))
1149
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/transport/sendmail.php';
1150
-
1151
- $transport = new mail_bank_Zend_Mail_Transport_Sendmail();
1152
- }
1153
- else {
1154
- $transport = self::$_defaultTransport;
1155
- }
1156
  }
1157
 
1158
  if ($this->_date === null) {
1159
- $this->setDate();
1160
  }
1161
 
1162
  if (null === $this->_from && null !== self::getDefaultFrom()) {
1163
- $this->setFromToDefaultFrom();
1164
  }
1165
 
1166
  if (null === $this->_replyTo && null !== self::getDefaultReplyTo()) {
1167
- $this->setReplyToFromDefault();
1168
  }
1169
 
1170
  $transport->send($this);
@@ -1180,12 +1180,12 @@ class mail_bank_Zend_Mail extends mail_bank_Zend_Mime_Message {
1180
  */
1181
  protected function _filterEmail($email) {
1182
  $rule = array("\r" => '',
1183
- "\n" => '',
1184
- "\t" => '',
1185
- '"' => '',
1186
- ',' => '',
1187
- '<' => '',
1188
- '>' => '',
1189
  );
1190
 
1191
  return strtr($email, $rule);
@@ -1199,11 +1199,11 @@ class mail_bank_Zend_Mail extends mail_bank_Zend_Mime_Message {
1199
  */
1200
  protected function _filterName($name) {
1201
  $rule = array("\r" => '',
1202
- "\n" => '',
1203
- "\t" => '',
1204
- '"' => "'",
1205
- '<' => '[',
1206
- '>' => ']',
1207
  );
1208
 
1209
  return trim(strtr($name, $rule));
@@ -1217,8 +1217,8 @@ class mail_bank_Zend_Mail extends mail_bank_Zend_Mime_Message {
1217
  */
1218
  protected function _filterOther($data) {
1219
  $rule = array("\r" => '',
1220
- "\n" => '',
1221
- "\t" => '',
1222
  );
1223
 
1224
  return strtr($data, $rule);
@@ -1233,15 +1233,15 @@ class mail_bank_Zend_Mail extends mail_bank_Zend_Mime_Message {
1233
  */
1234
  protected function _formatAddress($email, $name) {
1235
  if ($name === '' || $name === null || $name === $email) {
1236
- return $email;
1237
  } else {
1238
- $encodedName = $this->_encodeHeader($name);
1239
- if ($encodedName === $name && strcspn($name, '()<>[]:;@\\,.') != strlen($name)) {
1240
- $format = '"%s" <%s>';
1241
- } else {
1242
- $format = '%s <%s>';
1243
- }
1244
- return sprintf($format, $encodedName, $email);
1245
  }
1246
  }
1247
 
212
  */
213
  public function __construct($charset = null) {
214
  if ($charset != null) {
215
+ $this->_charset = $charset;
216
  }
217
  }
218
 
236
  */
237
  public function setType($type) {
238
  $allowed = array(
239
+ mail_bank_Zend_Mime::MULTIPART_ALTERNATIVE,
240
+ mail_bank_Zend_Mime::MULTIPART_MIXED,
241
+ mail_bank_Zend_Mime::MULTIPART_RELATED,
242
  );
243
  if (!in_array($type, $allowed)) {
244
+ /**
245
+ * @see mail_bank_Zend_Mail_Exception
246
+ */
247
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php'))
248
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php';
249
 
250
+ throw new mail_bank_Zend_Mail_Exception('Invalid content type "' . $type . '"');
251
  }
252
 
253
  $this->_type = $type;
328
  */
329
  public function setHeaderEncoding($encoding) {
330
  $allowed = array(
331
+ mail_bank_Zend_Mime::ENCODING_BASE64,
332
+ mail_bank_Zend_Mime::ENCODING_QUOTEDPRINTABLE
333
  );
334
  if (!in_array($encoding, $allowed)) {
335
+ /**
336
+ * @see mail_bank_Zend_Mail_Exception
337
+ */
338
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php'))
339
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php';
340
 
341
+ throw new mail_bank_Zend_Mail_Exception('Invalid encoding "' . $encoding . '"');
342
  }
343
  $this->_headerEncoding = $encoding;
344
 
355
  */
356
  public function setBodyText($txt, $charset = null, $encoding = mail_bank_Zend_Mime::ENCODING_QUOTEDPRINTABLE) {
357
  if ($charset === null) {
358
+ $charset = $this->_charset;
359
  }
360
 
361
  $mp = new mail_bank_Zend_Mime_Part($txt);
378
  */
379
  public function getBodyText($textOnly = false) {
380
  if ($textOnly && $this->_bodyText) {
381
+ $body = $this->_bodyText;
382
+ return $body->getContent();
383
  }
384
 
385
  return $this->_bodyText;
395
  */
396
  public function setBodyHtml($html, $charset = null, $encoding = mail_bank_Zend_Mime::ENCODING_QUOTEDPRINTABLE) {
397
  if ($charset === null) {
398
+ $charset = $this->_charset;
399
  }
400
 
401
  $mp = new mail_bank_Zend_Mime_Part($html);
417
  */
418
  public function getBodyHtml($htmlOnly = false) {
419
  if ($htmlOnly && $this->_bodyHtml) {
420
+ $body = $this->_bodyHtml;
421
+ return $body->getContent();
422
  }
423
 
424
  return $this->_bodyHtml;
483
  */
484
  protected function _encodeHeader($value) {
485
  if (mail_bank_Zend_Mime::isPrintable($value) === false) {
486
+ if ($this->getHeaderEncoding() === mail_bank_Zend_Mime::ENCODING_QUOTEDPRINTABLE) {
487
+ $value = mail_bank_Zend_Mime::encodeQuotedPrintableHeader($value, $this->getCharset(), mail_bank_Zend_Mime::LINELENGTH, mail_bank_Zend_Mime::LINEEND);
488
+ } else {
489
+ $value = mail_bank_Zend_Mime::encodeBase64Header($value, $this->getCharset(), mail_bank_Zend_Mime::LINELENGTH, mail_bank_Zend_Mime::LINEEND);
490
+ }
491
  }
492
 
493
  return $value;
505
  */
506
  protected function _storeHeader($headerName, $value, $append = false) {
507
  if (isset($this->_headers[$headerName])) {
508
+ $this->_headers[$headerName][] = $value;
509
  } else {
510
+ $this->_headers[$headerName] = array($value);
511
  }
512
 
513
  if ($append) {
514
+ $this->_headers[$headerName]['append'] = true;
515
  }
516
  }
517
 
550
  */
551
  public function addTo($email, $name = '') {
552
  if (!is_array($email)) {
553
+ $email = array($name => $email);
554
  }
555
 
556
  foreach ($email as $n => $recipient) {
557
+ $this->_addRecipientAndHeader('To', $recipient, is_int($n) ? '' : $n);
558
+ $this->_to[] = $recipient;
559
  }
560
 
561
  return $this;
571
  */
572
  public function addCc($email, $name = '') {
573
  if (!is_array($email)) {
574
+ $email = array($name => $email);
575
  }
576
 
577
  foreach ($email as $n => $recipient) {
578
+ $this->_addRecipientAndHeader('Cc', $recipient, is_int($n) ? '' : $n);
579
  }
580
 
581
  return $this;
589
  */
590
  public function addBcc($email) {
591
  if (!is_array($email)) {
592
+ $email = array($email);
593
  }
594
 
595
  foreach ($email as $recipient) {
596
+ $this->_addRecipientAndHeader('Bcc', $recipient, '');
597
  }
598
 
599
  return $this;
616
  */
617
  public function clearHeader($headerName) {
618
  if (isset($this->_headers[$headerName])) {
619
+ unset($this->_headers[$headerName]);
620
  }
621
  return $this;
622
  }
647
  */
648
  public function setFrom($email, $name = null) {
649
  if (null !== $this->_from) {
650
+ /**
651
+ * @see mail_bank_Zend_Mail_Exception
652
+ */
653
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php'))
654
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php';
655
 
656
+ throw new mail_bank_Zend_Mail_Exception('From Header set twice');
657
  }
658
 
659
  $email = $this->_filterEmail($email);
674
  */
675
  public function setReplyTo($email, $name = null) {
676
  if (null !== $this->_replyTo) {
677
+ /**
678
+ * @see mail_bank_Zend_Mail_Exception
679
+ */
680
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php'))
681
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php';
682
 
683
+ throw new mail_bank_Zend_Mail_Exception('Reply-To Header set twice');
684
  }
685
 
686
  $email = $this->_filterEmail($email);
771
  public function setFromToDefaultFrom() {
772
  $from = self::getDefaultFrom();
773
  if ($from === null) {
774
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php'))
775
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php';
776
 
777
+ throw new mail_bank_Zend_Mail_Exception(
778
+ 'No default From Address set to use');
779
  }
780
 
781
  $this->setFrom($from['email'], $from['name']);
821
  public function setReplyToFromDefault() {
822
  $replyTo = self::getDefaultReplyTo();
823
  if ($replyTo === null) {
824
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php'))
825
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php';
826
 
827
+ throw new mail_bank_Zend_Mail_Exception(
828
+ 'No default Reply-To Address set to use');
829
  }
830
 
831
  $this->setReplyTo($replyTo['email'], $replyTo['name']);
842
  */
843
  public function setReturnPath($email) {
844
  if ($this->_returnPath === null) {
845
+ $email = $this->_filterEmail($email);
846
+ $this->_returnPath = $email;
847
+ $this->_storeHeader('Return-Path', $email, false);
848
  } else {
849
+ /**
850
+ * @see mail_bank_Zend_Mail_Exception
851
+ */
852
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php'))
853
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php';
854
 
855
+ throw new mail_bank_Zend_Mail_Exception('Return-Path Header set twice');
856
  }
857
  return $this;
858
  }
866
  */
867
  public function getReturnPath() {
868
  if (null !== $this->_returnPath) {
869
+ return $this->_returnPath;
870
  }
871
 
872
  return $this->_from;
893
  */
894
  public function setSubject($subject) {
895
  if ($this->_subject === null) {
896
+ $subject = $this->_filterOther($subject);
897
+ $this->_subject = $this->_encodeHeader($subject);
898
+ $this->_storeHeader('Subject', $this->_subject);
899
  } else {
900
+ /**
901
+ * @see mail_bank_Zend_Mail_Exception
902
+ */
903
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php'))
904
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php';
905
 
906
+ throw new mail_bank_Zend_Mail_Exception('Subject set twice');
907
  }
908
  return $this;
909
  }
939
  */
940
  public function setDate($date = null) {
941
  if ($this->_date === null) {
942
+ if ($date === null) {
943
+ $date = date('r');
944
+ } else if (is_int($date)) {
945
+ $date = date('r', $date);
946
+ } else if (is_string($date)) {
947
+ $date = strtotime($date);
948
+ if ($date === false || $date < 0) {
949
+ /**
950
+ * @see mail_bank_Zend_Mail_Exception
951
+ */
952
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php'))
953
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php';
954
+
955
+ throw new mail_bank_Zend_Mail_Exception('String representations of Date Header must be ' .
956
+ 'strtotime()-compatible');
957
+ }
958
+ $date = date('r', $date);
959
+ }
960
+ else if ($date instanceof mail_bank_Zend_Date) {
961
+ $date = $date->get(mail_bank_Zend_Date::RFC_2822);
962
+ } else {
963
+ /**
964
+ * @see mail_bank_Zend_Mail_Exception
965
+ */
966
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php'))
967
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php';
968
+
969
+ throw new mail_bank_Zend_Mail_Exception(__METHOD__ . ' only accepts UNIX timestamps, Zend_Date objects, ' .
970
+ ' and strtotime()-compatible strings');
971
+ }
972
+ $this->_date = $date;
973
+ $this->_storeHeader('Date', $date);
974
  }
975
  else {
976
+ /**
977
+ * @see mail_bank_Zend_Mail_Exception
978
+ */
979
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php'))
980
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php';
981
 
982
+ throw new mail_bank_Zend_Mail_Exception('Date Header set twice');
983
  }
984
  return $this;
985
  }
1018
  */
1019
  public function setMessageId($id = true) {
1020
  if ($id === null || $id === false) {
1021
+ return $this;
1022
  } elseif ($id === true) {
1023
+ $id = $this->createMessageId();
1024
  }
1025
 
1026
  if ($this->_messageId === null) {
1027
+ $id = $this->_filterOther($id);
1028
+ $this->_messageId = $id;
1029
+ $this->_storeHeader('Message-Id', '<' . $this->_messageId . '>');
1030
  } else {
1031
+ /**
1032
+ * @see mail_bank_Zend_Mail_Exception
1033
+ */
1034
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php'))
1035
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php';
1036
 
1037
+ throw new mail_bank_Zend_Mail_Exception('Message-ID set twice');
1038
  }
1039
 
1040
  return $this;
1070
  $time = time();
1071
 
1072
  if ($this->_from !== null) {
1073
+ $user = $this->_from;
1074
  } elseif (isset($_SERVER['REMOTE_ADDR'])) {
1075
+ $user = $_SERVER['REMOTE_ADDR'];
1076
  } else {
1077
+ $user = getmypid();
1078
  }
1079
 
1080
  $rand = mt_rand();
1081
 
1082
  if ($this->_recipients !== array()) {
1083
+ $recipient = array_rand($this->_recipients);
1084
  } else {
1085
+ $recipient = 'unknown';
1086
  }
1087
 
1088
  if (isset($_SERVER["SERVER_NAME"])) {
1089
+ $hostName = $_SERVER["SERVER_NAME"];
1090
  } else {
1091
+ $hostName = php_uname('n');
1092
  }
1093
 
1094
  return sha1($time . $user . $rand . $recipient) . '@' . $hostName;
1105
  */
1106
  public function addHeader($name, $value, $append = false) {
1107
  $prohibit = array('to', 'cc', 'bcc', 'from', 'subject',
1108
+ 'reply-to', 'return-path',
1109
+ 'date', 'message-id',
1110
  );
1111
  if (in_array(strtolower($name), $prohibit)) {
1112
+ /**
1113
+ * @see mail_bank_Zend_Mail_Exception
1114
+ */
1115
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php'))
1116
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php';
1117
 
1118
+ throw new mail_bank_Zend_Mail_Exception('Cannot set standard header from addHeader()');
1119
  }
1120
 
1121
  $value = $this->_filterOther($value);
1144
  */
1145
  public function send($transport = null) {
1146
  if ($transport === null) {
1147
+ if (!self::$_defaultTransport instanceof mail_bank_Zend_Mail_Transport_Abstract) {
1148
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/transport/sendmail.php'))
1149
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/transport/sendmail.php';
1150
+
1151
+ $transport = new mail_bank_Zend_Mail_Transport_Sendmail();
1152
+ }
1153
+ else {
1154
+ $transport = self::$_defaultTransport;
1155
+ }
1156
  }
1157
 
1158
  if ($this->_date === null) {
1159
+ $this->setDate();
1160
  }
1161
 
1162
  if (null === $this->_from && null !== self::getDefaultFrom()) {
1163
+ $this->setFromToDefaultFrom();
1164
  }
1165
 
1166
  if (null === $this->_replyTo && null !== self::getDefaultReplyTo()) {
1167
+ $this->setReplyToFromDefault();
1168
  }
1169
 
1170
  $transport->send($this);
1180
  */
1181
  protected function _filterEmail($email) {
1182
  $rule = array("\r" => '',
1183
+ "\n" => '',
1184
+ "\t" => '',
1185
+ '"' => '',
1186
+ ',' => '',
1187
+ '<' => '',
1188
+ '>' => '',
1189
  );
1190
 
1191
  return strtr($email, $rule);
1199
  */
1200
  protected function _filterName($name) {
1201
  $rule = array("\r" => '',
1202
+ "\n" => '',
1203
+ "\t" => '',
1204
+ '"' => "'",
1205
+ '<' => '[',
1206
+ '>' => ']',
1207
  );
1208
 
1209
  return trim(strtr($name, $rule));
1217
  */
1218
  protected function _filterOther($data) {
1219
  $rule = array("\r" => '',
1220
+ "\n" => '',
1221
+ "\t" => '',
1222
  );
1223
 
1224
  return strtr($data, $rule);
1233
  */
1234
  protected function _formatAddress($email, $name) {
1235
  if ($name === '' || $name === null || $name === $email) {
1236
+ return $email;
1237
  } else {
1238
+ $encodedName = $this->_encodeHeader($name);
1239
+ if ($encodedName === $name && strcspn($name, '()<>[]:;@\\,.') != strlen($name)) {
1240
+ $format = '"%s" <%s>';
1241
+ } else {
1242
+ $format = '%s <%s>';
1243
+ }
1244
+ return sprintf($format, $encodedName, $email);
1245
  }
1246
  }
1247
 
lib/zend/mail/message.php CHANGED
@@ -59,27 +59,27 @@ class mail_bank_Zend_Mail_Message extends mail_bank_Zend_Mail_Part implements ma
59
  */
60
  public function __construct(array $params) {
61
  if (isset($params['file'])) {
62
- if (!is_resource($params['file'])) {
63
- $params['raw'] = @file_get_contents($params['file']);
64
- if ($params['raw'] === false) {
65
- /**
66
- * @see mail_bank_Zend_Mail_Exception
67
- */
68
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php'))
69
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php';
70
 
71
- throw new mail_bank_Zend_Mail_Exception('could not open file');
72
- }
73
- }
74
- else {
75
- $params['raw'] = stream_get_contents($params['file']);
76
- }
77
- $params['raw'] = preg_replace("/(?<!\r)\n/", "\r\n", $params['raw']);
78
  }
79
 
80
  if (!empty($params['flags'])) {
81
- // set key and value to the same value for easy lookup
82
- $this->_flags = array_merge($this->_flags, array_combine($params['flags'], $params['flags']));
83
  }
84
 
85
  parent::__construct($params);
59
  */
60
  public function __construct(array $params) {
61
  if (isset($params['file'])) {
62
+ if (!is_resource($params['file'])) {
63
+ $params['raw'] = @file_get_contents($params['file']);
64
+ if ($params['raw'] === false) {
65
+ /**
66
+ * @see mail_bank_Zend_Mail_Exception
67
+ */
68
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php'))
69
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php';
70
 
71
+ throw new mail_bank_Zend_Mail_Exception('could not open file');
72
+ }
73
+ }
74
+ else {
75
+ $params['raw'] = stream_get_contents($params['file']);
76
+ }
77
+ $params['raw'] = preg_replace("/(?<!\r)\n/", "\r\n", $params['raw']);
78
  }
79
 
80
  if (!empty($params['flags'])) {
81
+ // set key and value to the same value for easy lookup
82
+ $this->_flags = array_merge($this->_flags, array_combine($params['flags'], $params['flags']));
83
  }
84
 
85
  parent::__construct($params);
lib/zend/mail/message/file.php CHANGED
@@ -59,8 +59,8 @@ class mail_bank_Zend_Mail_Message_File extends mail_bank_Zend_Mail_Part_File imp
59
  */
60
  public function __construct(array $params) {
61
  if (!empty($params['flags'])) {
62
- // set key and value to the same value for easy lookup
63
- $this->_flags = array_combine($params['flags'], $params['flags']);
64
  }
65
 
66
  parent::__construct($params);
59
  */
60
  public function __construct(array $params) {
61
  if (!empty($params['flags'])) {
62
+ // set key and value to the same value for easy lookup
63
+ $this->_flags = array_combine($params['flags'], $params['flags']);
64
  }
65
 
66
  parent::__construct($params);
lib/zend/mail/part/file.php CHANGED
@@ -59,96 +59,96 @@ class mail_bank_Zend_Mail_Part_File extends mail_bank_Zend_Mail_Part {
59
  */
60
  public function __construct(array $params) {
61
  if (empty($params['file'])) {
62
- /**
63
- * @see mail_bank_Zend_Mail_Exception
64
- */
65
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php'))
66
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php';
67
 
68
- throw new mail_bank_Zend_Mail_Exception('no file given in params');
69
  }
70
 
71
  if (!is_resource($params['file'])) {
72
- $this->_fh = fopen($params['file'], 'r');
73
  } else {
74
- $this->_fh = $params['file'];
75
  }
76
  if (!$this->_fh) {
77
- /**
78
- * @see mail_bank_Zend_Mail_Exception
79
- */
80
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php'))
81
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php';
82
 
83
- throw new mail_bank_Zend_Mail_Exception('could not open file');
84
  }
85
  if (isset($params['startPos'])) {
86
- fseek($this->_fh, $params['startPos']);
87
  }
88
  $header = '';
89
  $endPos = isset($params['endPos']) ? $params['endPos'] : null;
90
  while (($endPos === null || ftell($this->_fh) < $endPos) && trim($line = fgets($this->_fh))) {
91
- $header .= $line;
92
  }
93
 
94
  mail_bank_Zend_Mime_Decode::splitMessage($header, $this->_headers, $null);
95
 
96
  $this->_contentPos[0] = ftell($this->_fh);
97
  if ($endPos !== null) {
98
- $this->_contentPos[1] = $endPos;
99
  } else {
100
- fseek($this->_fh, 0, SEEK_END);
101
- $this->_contentPos[1] = ftell($this->_fh);
102
  }
103
  if (!$this->isMultipart()) {
104
- return;
105
  }
106
 
107
  $boundary = $this->getHeaderField('content-type', 'boundary');
108
  if (!$boundary) {
109
- /**
110
- * @see mail_bank_Zend_Mail_Exception
111
- */
112
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php'))
113
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php';
114
 
115
- throw new mail_bank_Zend_Mail_Exception('no boundary found in content type to split message');
116
  }
117
 
118
  $part = array();
119
  $pos = $this->_contentPos[0];
120
  fseek($this->_fh, $pos);
121
  while (!feof($this->_fh) && ($endPos === null || $pos < $endPos)) {
122
- $line = fgets($this->_fh);
123
- if ($line === false) {
124
- if (feof($this->_fh)) {
125
- break;
126
- }
127
- /**
128
- * @see mail_bank_Zend_Mail_Exception
129
- */
130
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php'))
131
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php';
132
-
133
- throw new mail_bank_Zend_Mail_Exception('error reading file');
134
- }
135
-
136
- $lastPos = $pos;
137
- $pos = ftell($this->_fh);
138
- $line = trim($line);
139
-
140
- if ($line == '--' . $boundary) {
141
- if ($part) {
142
- // not first part
143
- $part[1] = $lastPos;
144
- $this->_partPos[] = $part;
145
- }
146
- $part = array($pos);
147
- } else if ($line == '--' . $boundary . '--') {
148
- $part[1] = $lastPos;
149
- $this->_partPos[] = $part;
150
- break;
151
- }
152
  }
153
  $this->_countParts = count($this->_partPos);
154
  }
@@ -164,7 +164,7 @@ class mail_bank_Zend_Mail_Part_File extends mail_bank_Zend_Mail_Part {
164
  public function getContent($stream = null) {
165
  fseek($this->_fh, $this->_contentPos[0]);
166
  if ($stream !== null) {
167
- return stream_copy_to_stream($this->_fh, $stream, $this->_contentPos[1] - $this->_contentPos[0]);
168
  }
169
  $length = $this->_contentPos[1] - $this->_contentPos[0];
170
  return $length < 1 ? '' : fread($this->_fh, $length);
@@ -191,17 +191,17 @@ class mail_bank_Zend_Mail_Part_File extends mail_bank_Zend_Mail_Part {
191
  public function getPart($num) {
192
  --$num;
193
  if (!isset($this->_partPos[$num])) {
194
- /**
195
- * @see mail_bank_Zend_Mail_Exception
196
- */
197
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php'))
198
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php';
199
 
200
- throw new mail_bank_Zend_Mail_Exception('part not found');
201
  }
202
 
203
  return new self(array('file' => $this->_fh, 'startPos' => $this->_partPos[$num][0],
204
- 'endPos' => $this->_partPos[$num][1]));
205
  }
206
 
207
  }
59
  */
60
  public function __construct(array $params) {
61
  if (empty($params['file'])) {
62
+ /**
63
+ * @see mail_bank_Zend_Mail_Exception
64
+ */
65
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php'))
66
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php';
67
 
68
+ throw new mail_bank_Zend_Mail_Exception('no file given in params');
69
  }
70
 
71
  if (!is_resource($params['file'])) {
72
+ $this->_fh = fopen($params['file'], 'r');
73
  } else {
74
+ $this->_fh = $params['file'];
75
  }
76
  if (!$this->_fh) {
77
+ /**
78
+ * @see mail_bank_Zend_Mail_Exception
79
+ */
80
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php'))
81
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php';
82
 
83
+ throw new mail_bank_Zend_Mail_Exception('could not open file');
84
  }
85
  if (isset($params['startPos'])) {
86
+ fseek($this->_fh, $params['startPos']);
87
  }
88
  $header = '';
89
  $endPos = isset($params['endPos']) ? $params['endPos'] : null;
90
  while (($endPos === null || ftell($this->_fh) < $endPos) && trim($line = fgets($this->_fh))) {
91
+ $header .= $line;
92
  }
93
 
94
  mail_bank_Zend_Mime_Decode::splitMessage($header, $this->_headers, $null);
95
 
96
  $this->_contentPos[0] = ftell($this->_fh);
97
  if ($endPos !== null) {
98
+ $this->_contentPos[1] = $endPos;
99
  } else {
100
+ fseek($this->_fh, 0, SEEK_END);
101
+ $this->_contentPos[1] = ftell($this->_fh);
102
  }
103
  if (!$this->isMultipart()) {
104
+ return;
105
  }
106
 
107
  $boundary = $this->getHeaderField('content-type', 'boundary');
108
  if (!$boundary) {
109
+ /**
110
+ * @see mail_bank_Zend_Mail_Exception
111
+ */
112
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php'))
113
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php';
114
 
115
+ throw new mail_bank_Zend_Mail_Exception('no boundary found in content type to split message');
116
  }
117
 
118
  $part = array();
119
  $pos = $this->_contentPos[0];
120
  fseek($this->_fh, $pos);
121
  while (!feof($this->_fh) && ($endPos === null || $pos < $endPos)) {
122
+ $line = fgets($this->_fh);
123
+ if ($line === false) {
124
+ if (feof($this->_fh)) {
125
+ break;
126
+ }
127
+ /**
128
+ * @see mail_bank_Zend_Mail_Exception
129
+ */
130
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php'))
131
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php';
132
+
133
+ throw new mail_bank_Zend_Mail_Exception('error reading file');
134
+ }
135
+
136
+ $lastPos = $pos;
137
+ $pos = ftell($this->_fh);
138
+ $line = trim($line);
139
+
140
+ if ($line == '--' . $boundary) {
141
+ if ($part) {
142
+ // not first part
143
+ $part[1] = $lastPos;
144
+ $this->_partPos[] = $part;
145
+ }
146
+ $part = array($pos);
147
+ } else if ($line == '--' . $boundary . '--') {
148
+ $part[1] = $lastPos;
149
+ $this->_partPos[] = $part;
150
+ break;
151
+ }
152
  }
153
  $this->_countParts = count($this->_partPos);
154
  }
164
  public function getContent($stream = null) {
165
  fseek($this->_fh, $this->_contentPos[0]);
166
  if ($stream !== null) {
167
+ return stream_copy_to_stream($this->_fh, $stream, $this->_contentPos[1] - $this->_contentPos[0]);
168
  }
169
  $length = $this->_contentPos[1] - $this->_contentPos[0];
170
  return $length < 1 ? '' : fread($this->_fh, $length);
191
  public function getPart($num) {
192
  --$num;
193
  if (!isset($this->_partPos[$num])) {
194
+ /**
195
+ * @see mail_bank_Zend_Mail_Exception
196
+ */
197
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php'))
198
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/exception.php';
199
 
200
+ throw new mail_bank_Zend_Mail_Exception('part not found');
201
  }
202
 
203
  return new self(array('file' => $this->_fh, 'startPos' => $this->_partPos[$num][0],
204
+ 'endPos' => $this->_partPos[$num][1]));
205
  }
206
 
207
  }
lib/zend/mail/protocol/abstract.php CHANGED
@@ -129,13 +129,13 @@ abstract class mail_bank_Zend_Mail_Protocol_Abstract {
129
  $this->_validHost->addValidator(new mail_bank_Zend_Validate_Hostname(mail_bank_Zend_Validate_Hostname::ALLOW_ALL));
130
 
131
  if (!$this->_validHost->isValid($host)) {
132
- /**
133
- * @see mail_bank_Zend_Mail_Protocol_Exception
134
- */
135
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php'))
136
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php';
137
 
138
- throw new mail_bank_Zend_Mail_Protocol_Exception(join(', ', $this->_validHost->getMessages()));
139
  }
140
 
141
  $this->_host = $host;
@@ -221,7 +221,7 @@ abstract class mail_bank_Zend_Mail_Protocol_Abstract {
221
  */
222
  protected function _addLog($value) {
223
  if ($this->_maximumLog >= 0 && count($this->_log) >= $this->_maximumLog) {
224
- array_shift($this->_log);
225
  }
226
 
227
  $this->_log[] = $value;
@@ -244,26 +244,26 @@ abstract class mail_bank_Zend_Mail_Protocol_Abstract {
244
  $this->_socket = @stream_socket_client($remote, $errorNum, $errorStr, self::TIMEOUT_CONNECTION);
245
 
246
  if ($this->_socket === false) {
247
- if ($errorNum == 0) {
248
- $errorStr = 'Could not open socket';
249
- }
250
- /**
251
- * @see mail_bank_Zend_Mail_Protocol_Exception
252
- */
253
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php'))
254
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php';
255
-
256
- throw new mail_bank_Zend_Mail_Protocol_Exception($errorStr);
257
  }
258
 
259
  if (($result = $this->_setStreamTimeout(self::TIMEOUT_CONNECTION)) === false) {
260
- /**
261
- * @see mail_bank_Zend_Mail_Protocol_Exception
262
- */
263
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php'))
264
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php';
265
 
266
- throw new mail_bank_Zend_Mail_Protocol_Exception('Could not set stream timeout');
267
  }
268
 
269
  return $result;
@@ -276,7 +276,7 @@ abstract class mail_bank_Zend_Mail_Protocol_Abstract {
276
  */
277
  protected function _disconnect() {
278
  if (is_resource($this->_socket)) {
279
- fclose($this->_socket);
280
  }
281
  }
282
 
@@ -289,13 +289,13 @@ abstract class mail_bank_Zend_Mail_Protocol_Abstract {
289
  */
290
  protected function _send($request) {
291
  if (!is_resource($this->_socket)) {
292
- /**
293
- * @see mail_bank_Zend_Mail_Protocol_Exception
294
- */
295
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php'))
296
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php';
297
 
298
- throw new mail_bank_Zend_Mail_Protocol_Exception('No connection has been established to ' . $this->_host);
299
  }
300
 
301
  $this->_request = $request;
@@ -306,13 +306,13 @@ abstract class mail_bank_Zend_Mail_Protocol_Abstract {
306
  $this->_addLog($request . self::EOL);
307
 
308
  if ($result === false) {
309
- /**
310
- * @see mail_bank_Zend_Mail_Protocol_Exception
311
- */
312
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php'))
313
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php';
314
 
315
- throw new mail_bank_Zend_Mail_Protocol_Exception('Could not send request to ' . $this->_host);
316
  }
317
 
318
  return $result;
@@ -327,18 +327,18 @@ abstract class mail_bank_Zend_Mail_Protocol_Abstract {
327
  */
328
  protected function _receive($timeout = null) {
329
  if (!is_resource($this->_socket)) {
330
- /**
331
- * @see mail_bank_Zend_Mail_Protocol_Exception
332
- */
333
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php'))
334
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php';
335
 
336
- throw new mail_bank_Zend_Mail_Protocol_Exception('No connection has been established to ' . $this->_host);
337
  }
338
 
339
  // Adapters may wish to supply per-commend timeouts according to appropriate RFC
340
  if ($timeout !== null) {
341
- $this->_setStreamTimeout($timeout);
342
  }
343
 
344
  // Retrieve response
@@ -351,23 +351,23 @@ abstract class mail_bank_Zend_Mail_Protocol_Abstract {
351
  $info = stream_get_meta_data($this->_socket);
352
 
353
  if (!empty($info['timed_out'])) {
354
- /**
355
- * @see mail_bank_Zend_Mail_Protocol_Exception
356
- */
357
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php'))
358
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php';
359
 
360
- throw new mail_bank_Zend_Mail_Protocol_Exception($this->_host . ' has timed out');
361
  }
362
 
363
  if ($reponse === false) {
364
- /**
365
- * @see mail_bank_Zend_Mail_Protocol_Exception
366
- */
367
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php'))
368
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php';
369
 
370
- throw new mail_bank_Zend_Mail_Protocol_Exception('Could not read from ' . $this->_host);
371
  }
372
 
373
  return $reponse;
@@ -391,28 +391,28 @@ abstract class mail_bank_Zend_Mail_Protocol_Abstract {
391
  $errMsg = '';
392
 
393
  if (!is_array($code)) {
394
- $code = array($code);
395
  }
396
 
397
  do {
398
- $this->_response[] = $result = $this->_receive($timeout);
399
- list($cmd, $more, $msg) = preg_split('/([\s-]+)/', $result, 2, PREG_SPLIT_DELIM_CAPTURE);
400
-
401
- if ($errMsg !== '') {
402
- $errMsg .= ' ' . $msg;
403
- } elseif ($cmd === null || !in_array($cmd, $code)) {
404
- $errMsg = $msg;
405
- }
406
  } while (strpos($more, '-') === 0); // The '-' message prefix indicates an information string instead of a response string.
407
 
408
  if ($errMsg !== '') {
409
- /**
410
- * @see mail_bank_Zend_Mail_Protocol_Exception
411
- */
412
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php'))
413
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php';
414
 
415
- throw new mail_bank_Zend_Mail_Protocol_Exception($errMsg, $cmd);
416
  }
417
 
418
  return $msg;
129
  $this->_validHost->addValidator(new mail_bank_Zend_Validate_Hostname(mail_bank_Zend_Validate_Hostname::ALLOW_ALL));
130
 
131
  if (!$this->_validHost->isValid($host)) {
132
+ /**
133
+ * @see mail_bank_Zend_Mail_Protocol_Exception
134
+ */
135
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php'))
136
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php';
137
 
138
+ throw new mail_bank_Zend_Mail_Protocol_Exception(join(', ', $this->_validHost->getMessages()));
139
  }
140
 
141
  $this->_host = $host;
221
  */
222
  protected function _addLog($value) {
223
  if ($this->_maximumLog >= 0 && count($this->_log) >= $this->_maximumLog) {
224
+ array_shift($this->_log);
225
  }
226
 
227
  $this->_log[] = $value;
244
  $this->_socket = @stream_socket_client($remote, $errorNum, $errorStr, self::TIMEOUT_CONNECTION);
245
 
246
  if ($this->_socket === false) {
247
+ if ($errorNum == 0) {
248
+ $errorStr = 'Could not open socket';
249
+ }
250
+ /**
251
+ * @see mail_bank_Zend_Mail_Protocol_Exception
252
+ */
253
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php'))
254
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php';
255
+
256
+ throw new mail_bank_Zend_Mail_Protocol_Exception($errorStr);
257
  }
258
 
259
  if (($result = $this->_setStreamTimeout(self::TIMEOUT_CONNECTION)) === false) {
260
+ /**
261
+ * @see mail_bank_Zend_Mail_Protocol_Exception
262
+ */
263
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php'))
264
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php';
265
 
266
+ throw new mail_bank_Zend_Mail_Protocol_Exception('Could not set stream timeout');
267
  }
268
 
269
  return $result;
276
  */
277
  protected function _disconnect() {
278
  if (is_resource($this->_socket)) {
279
+ fclose($this->_socket);
280
  }
281
  }
282
 
289
  */
290
  protected function _send($request) {
291
  if (!is_resource($this->_socket)) {
292
+ /**
293
+ * @see mail_bank_Zend_Mail_Protocol_Exception
294
+ */
295
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php'))
296
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php';
297
 
298
+ throw new mail_bank_Zend_Mail_Protocol_Exception('No connection has been established to ' . $this->_host);
299
  }
300
 
301
  $this->_request = $request;
306
  $this->_addLog($request . self::EOL);
307
 
308
  if ($result === false) {
309
+ /**
310
+ * @see mail_bank_Zend_Mail_Protocol_Exception
311
+ */
312
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php'))
313
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php';
314
 
315
+ throw new mail_bank_Zend_Mail_Protocol_Exception('Could not send request to ' . $this->_host);
316
  }
317
 
318
  return $result;
327
  */
328
  protected function _receive($timeout = null) {
329
  if (!is_resource($this->_socket)) {
330
+ /**
331
+ * @see mail_bank_Zend_Mail_Protocol_Exception
332
+ */
333
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php'))
334
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php';
335
 
336
+ throw new mail_bank_Zend_Mail_Protocol_Exception('No connection has been established to ' . $this->_host);
337
  }
338
 
339
  // Adapters may wish to supply per-commend timeouts according to appropriate RFC
340
  if ($timeout !== null) {
341
+ $this->_setStreamTimeout($timeout);
342
  }
343
 
344
  // Retrieve response
351
  $info = stream_get_meta_data($this->_socket);
352
 
353
  if (!empty($info['timed_out'])) {
354
+ /**
355
+ * @see mail_bank_Zend_Mail_Protocol_Exception
356
+ */
357
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php'))
358
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php';
359
 
360
+ throw new mail_bank_Zend_Mail_Protocol_Exception($this->_host . ' has timed out');
361
  }
362
 
363
  if ($reponse === false) {
364
+ /**
365
+ * @see mail_bank_Zend_Mail_Protocol_Exception
366
+ */
367
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php'))
368
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php';
369
 
370
+ throw new mail_bank_Zend_Mail_Protocol_Exception('Could not read from ' . $this->_host);
371
  }
372
 
373
  return $reponse;
391
  $errMsg = '';
392
 
393
  if (!is_array($code)) {
394
+ $code = array($code);
395
  }
396
 
397
  do {
398
+ $this->_response[] = $result = $this->_receive($timeout);
399
+ list($cmd, $more, $msg) = preg_split('/([\s-]+)/', $result, 2, PREG_SPLIT_DELIM_CAPTURE);
400
+
401
+ if ($errMsg !== '') {
402
+ $errMsg .= ' ' . $msg;
403
+ } elseif ($cmd === null || !in_array($cmd, $code)) {
404
+ $errMsg = $msg;
405
+ }
406
  } while (strpos($more, '-') === 0); // The '-' message prefix indicates an information string instead of a response string.
407
 
408
  if ($errMsg !== '') {
409
+ /**
410
+ * @see mail_bank_Zend_Mail_Protocol_Exception
411
+ */
412
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php'))
413
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php';
414
 
415
+ throw new mail_bank_Zend_Mail_Protocol_Exception($errMsg, $cmd);
416
  }
417
 
418
  return $msg;
lib/zend/mail/protocol/smtp.php CHANGED
@@ -115,36 +115,36 @@ class mail_bank_Zend_Mail_Protocol_Smtp extends mail_bank_Zend_Mail_Protocol_Abs
115
  */
116
  public function __construct($host = '127.0.0.1', $port = null, array $config = array()) {
117
  if (isset($config['ssl'])) {
118
- switch (strtolower($config['ssl'])) {
119
- case 'tls':
120
- $this->_secure = 'tls';
121
- break;
122
-
123
- case 'ssl':
124
- $this->_transport = 'ssl';
125
- $this->_secure = 'ssl';
126
- if ($port == null) {
127
- $port = 465;
128
- }
129
- break;
130
-
131
- default:
132
- /**
133
- * @see mail_bank_Zend_Mail_Protocol_Exception
134
- */
135
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php'))
136
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php';
137
-
138
- throw new mail_bank_Zend_Mail_Protocol_Exception($config['ssl'] . ' is unsupported SSL type');
139
- break;
140
- }
141
  }
142
 
143
  // If no port has been specified then check the bank PHP ini file. Defaults to 25 if the ini setting is null.
144
  if ($port == null) {
145
- if (($port = ini_get('smtp_port')) == '') {
146
- $port = 25;
147
- }
148
  }
149
 
150
  parent::__construct($host, $port);
@@ -169,24 +169,24 @@ class mail_bank_Zend_Mail_Protocol_Smtp extends mail_bank_Zend_Mail_Protocol_Abs
169
  public function helo($host = '127.0.0.1') {
170
  // Respect RFC 2821 and disallow HELO attempts if session is already initiated.
171
  if ($this->_sess === true) {
172
- /**
173
- * @see mail_bank_Zend_Mail_Protocol_Exception
174
- */
175
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php'))
176
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php';
177
 
178
- throw new mail_bank_Zend_Mail_Protocol_Exception('Cannot issue HELO to existing session');
179
  }
180
 
181
  // Validate client hostname
182
  if (!$this->_validHost->isValid($host)) {
183
- /**
184
- * @see mail_bank_Zend_Mail_Protocol_Exception
185
- */
186
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php'))
187
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php';
188
 
189
- throw new mail_bank_Zend_Mail_Protocol_Exception(join(', ', $this->_validHost->getMessages()));
190
  }
191
 
192
  // Initiate helo sequence
@@ -195,22 +195,22 @@ class mail_bank_Zend_Mail_Protocol_Smtp extends mail_bank_Zend_Mail_Protocol_Abs
195
 
196
  // If a TLS session is required, commence negotiation
197
  if ($this->_secure == 'tls') {
198
- $this->_send('STARTTLS');
199
- $this->_expect(220, 180);
200
- stream_context_set_option($this->_socket, 'ssl', 'verify_peer', false);
201
- stream_context_set_option($this->_socket, 'ssl', 'verify_peer_name', false);
202
- if (extension_loaded("openssl")) {
203
- if (!stream_socket_enable_crypto($this->_socket, true, STREAM_CRYPTO_METHOD_TLS_CLIENT)) {
204
- /**
205
- * @see mail_bank_Zend_Mail_Protocol_Exception
206
- */
207
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php'))
208
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php';
209
-
210
- throw new mail_bank_Zend_Mail_Protocol_Exception('Unable to connect via TLS');
211
- }
212
- }
213
- $this->_ehlo($host);
214
  }
215
 
216
  $this->_startSession();
@@ -227,13 +227,13 @@ class mail_bank_Zend_Mail_Protocol_Smtp extends mail_bank_Zend_Mail_Protocol_Abs
227
  protected function _ehlo($host) {
228
  // Support for older, less-compliant remote servers. Tries multiple attempts of EHLO or HELO.
229
  try {
230
- $this->_send('EHLO ' . $host);
231
- $this->_expect(250, 300); // Timeout set for 5 minutes as per RFC 2821 4.5.3.2
232
  } catch (mail_bank_Zend_Mail_Protocol_Exception $e) {
233
- $this->_send('HELO ' . $host);
234
- $this->_expect(250, 300); // Timeout set for 5 minutes as per RFC 2821 4.5.3.2
235
  } catch (mail_bank_Zend_Mail_Protocol_Exception $e) {
236
- throw $e;
237
  }
238
  }
239
 
@@ -246,13 +246,13 @@ class mail_bank_Zend_Mail_Protocol_Smtp extends mail_bank_Zend_Mail_Protocol_Abs
246
  */
247
  public function mail($from) {
248
  if ($this->_sess !== true) {
249
- /**
250
- * @see mail_bank_Zend_Mail_Protocol_Exception
251
- */
252
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php'))
253
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php';
254
 
255
- throw new mail_bank_Zend_Mail_Protocol_Exception('A valid session has not been started');
256
  }
257
 
258
  $this->_send('MAIL FROM:<' . $from . '>');
@@ -272,13 +272,13 @@ class mail_bank_Zend_Mail_Protocol_Smtp extends mail_bank_Zend_Mail_Protocol_Abs
272
  */
273
  public function rcpt($to) {
274
  if ($this->_mail !== true) {
275
- /**
276
- * @see mail_bank_Zend_Mail_Protocol_Exception
277
- */
278
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php'))
279
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php';
280
 
281
- throw new mail_bank_Zend_Mail_Protocol_Exception('No sender reverse path has been supplied');
282
  }
283
 
284
  // Set rcpt to true, as per 4.1.1.3 of RFC 2821
@@ -297,24 +297,24 @@ class mail_bank_Zend_Mail_Protocol_Smtp extends mail_bank_Zend_Mail_Protocol_Abs
297
  public function data($data) {
298
  // Ensure recipients have been set
299
  if ($this->_rcpt !== true) {
300
- /**
301
- * @see mail_bank_Zend_Mail_Protocol_Exception
302
- */
303
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php'))
304
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php';
305
 
306
- throw new mail_bank_Zend_Mail_Protocol_Exception('No recipient forward path has been supplied');
307
  }
308
 
309
  $this->_send('DATA');
310
  $this->_expect(354, 120); // Timeout set for 2 minutes as per RFC 2821 4.5.3.2
311
 
312
  foreach (explode(mail_bank_Zend_Mime::LINEEND, $data) as $line) {
313
- if (strpos($line, '.') === 0) {
314
- // Escape lines prefixed with a '.'
315
- $line = '.' . $line;
316
- }
317
- $this->_send($line);
318
  }
319
 
320
  $this->_send('.');
@@ -371,9 +371,9 @@ class mail_bank_Zend_Mail_Protocol_Smtp extends mail_bank_Zend_Mail_Protocol_Abs
371
  */
372
  public function quit() {
373
  if ($this->_sess) {
374
- $this->_send('QUIT');
375
- $this->_expect(221, 300); // Timeout set for 5 minutes as per RFC 2821 4.5.3.2
376
- $this->_stopSession();
377
  }
378
  }
379
 
@@ -387,13 +387,13 @@ class mail_bank_Zend_Mail_Protocol_Smtp extends mail_bank_Zend_Mail_Protocol_Abs
387
  */
388
  public function auth() {
389
  if ($this->_auth === true) {
390
- /**
391
- * @see mail_bank_Zend_Mail_Protocol_Exception
392
- */
393
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php'))
394
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php';
395
 
396
- throw new mail_bank_Zend_Mail_Protocol_Exception('Already authenticated for this session');
397
  }
398
  }
399
 
115
  */
116
  public function __construct($host = '127.0.0.1', $port = null, array $config = array()) {
117
  if (isset($config['ssl'])) {
118
+ switch (strtolower($config['ssl'])) {
119
+ case 'tls':
120
+ $this->_secure = 'tls';
121
+ break;
122
+
123
+ case 'ssl':
124
+ $this->_transport = 'ssl';
125
+ $this->_secure = 'ssl';
126
+ if ($port == null) {
127
+ $port = 465;
128
+ }
129
+ break;
130
+
131
+ default:
132
+ /**
133
+ * @see mail_bank_Zend_Mail_Protocol_Exception
134
+ */
135
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php'))
136
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php';
137
+
138
+ throw new mail_bank_Zend_Mail_Protocol_Exception($config['ssl'] . ' is unsupported SSL type');
139
+ break;
140
+ }
141
  }
142
 
143
  // If no port has been specified then check the bank PHP ini file. Defaults to 25 if the ini setting is null.
144
  if ($port == null) {
145
+ if (($port = ini_get('smtp_port')) == '') {
146
+ $port = 25;
147
+ }
148
  }
149
 
150
  parent::__construct($host, $port);
169
  public function helo($host = '127.0.0.1') {
170
  // Respect RFC 2821 and disallow HELO attempts if session is already initiated.
171
  if ($this->_sess === true) {
172
+ /**
173
+ * @see mail_bank_Zend_Mail_Protocol_Exception
174
+ */
175
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php'))
176
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php';
177
 
178
+ throw new mail_bank_Zend_Mail_Protocol_Exception('Cannot issue HELO to existing session');
179
  }
180
 
181
  // Validate client hostname
182
  if (!$this->_validHost->isValid($host)) {
183
+ /**
184
+ * @see mail_bank_Zend_Mail_Protocol_Exception
185
+ */
186
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php'))
187
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php';
188
 
189
+ throw new mail_bank_Zend_Mail_Protocol_Exception(join(', ', $this->_validHost->getMessages()));
190
  }
191
 
192
  // Initiate helo sequence
195
 
196
  // If a TLS session is required, commence negotiation
197
  if ($this->_secure == 'tls') {
198
+ $this->_send('STARTTLS');
199
+ $this->_expect(220, 180);
200
+ stream_context_set_option($this->_socket, 'ssl', 'verify_peer', false);
201
+ stream_context_set_option($this->_socket, 'ssl', 'verify_peer_name', false);
202
+ if (extension_loaded("openssl")) {
203
+ if (!stream_socket_enable_crypto($this->_socket, true, STREAM_CRYPTO_METHOD_TLS_CLIENT)) {
204
+ /**
205
+ * @see mail_bank_Zend_Mail_Protocol_Exception
206
+ */
207
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php'))
208
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php';
209
+
210
+ throw new mail_bank_Zend_Mail_Protocol_Exception('Unable to connect via TLS');
211
+ }
212
+ }
213
+ $this->_ehlo($host);
214
  }
215
 
216
  $this->_startSession();
227
  protected function _ehlo($host) {
228
  // Support for older, less-compliant remote servers. Tries multiple attempts of EHLO or HELO.
229
  try {
230
+ $this->_send('EHLO ' . $host);
231
+ $this->_expect(250, 300); // Timeout set for 5 minutes as per RFC 2821 4.5.3.2
232
  } catch (mail_bank_Zend_Mail_Protocol_Exception $e) {
233
+ $this->_send('HELO ' . $host);
234
+ $this->_expect(250, 300); // Timeout set for 5 minutes as per RFC 2821 4.5.3.2
235
  } catch (mail_bank_Zend_Mail_Protocol_Exception $e) {
236
+ throw $e;
237
  }
238
  }
239
 
246
  */
247
  public function mail($from) {
248
  if ($this->_sess !== true) {
249
+ /**
250
+ * @see mail_bank_Zend_Mail_Protocol_Exception
251
+ */
252
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php'))
253
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php';
254
 
255
+ throw new mail_bank_Zend_Mail_Protocol_Exception('A valid session has not been started');
256
  }
257
 
258
  $this->_send('MAIL FROM:<' . $from . '>');
272
  */
273
  public function rcpt($to) {
274
  if ($this->_mail !== true) {
275
+ /**
276
+ * @see mail_bank_Zend_Mail_Protocol_Exception
277
+ */
278
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php'))
279
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php';
280
 
281
+ throw new mail_bank_Zend_Mail_Protocol_Exception('No sender reverse path has been supplied');
282
  }
283
 
284
  // Set rcpt to true, as per 4.1.1.3 of RFC 2821
297
  public function data($data) {
298
  // Ensure recipients have been set
299
  if ($this->_rcpt !== true) {
300
+ /**
301
+ * @see mail_bank_Zend_Mail_Protocol_Exception
302
+ */
303
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php'))
304
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php';
305
 
306
+ throw new mail_bank_Zend_Mail_Protocol_Exception('No recipient forward path has been supplied');
307
  }
308
 
309
  $this->_send('DATA');
310
  $this->_expect(354, 120); // Timeout set for 2 minutes as per RFC 2821 4.5.3.2
311
 
312
  foreach (explode(mail_bank_Zend_Mime::LINEEND, $data) as $line) {
313
+ if (strpos($line, '.') === 0) {
314
+ // Escape lines prefixed with a '.'
315
+ $line = '.' . $line;
316
+ }
317
+ $this->_send($line);
318
  }
319
 
320
  $this->_send('.');
371
  */
372
  public function quit() {
373
  if ($this->_sess) {
374
+ $this->_send('QUIT');
375
+ $this->_expect(221, 300); // Timeout set for 5 minutes as per RFC 2821 4.5.3.2
376
+ $this->_stopSession();
377
  }
378
  }
379
 
387
  */
388
  public function auth() {
389
  if ($this->_auth === true) {
390
+ /**
391
+ * @see mail_bank_Zend_Mail_Protocol_Exception
392
+ */
393
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php'))
394
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/protocol/exception.php';
395
 
396
+ throw new mail_bank_Zend_Mail_Protocol_Exception('Already authenticated for this session');
397
  }
398
  }
399
 
lib/zend/mail/protocol/smtp/auth/crammd5.php CHANGED
@@ -51,12 +51,12 @@ class mail_bank_Zend_Mail_Protocol_Smtp_Auth_Crammd5 extends mail_bank_Zend_Mail
51
  */
52
  public function __construct($host = '127.0.0.1', $port = null, $config = null) {
53
  if (is_array($config)) {
54
- if (isset($config['username'])) {
55
- $this->_username = $config['username'];
56
- }
57
- if (isset($config['password'])) {
58
- $this->_password = $config['password'];
59
- }
60
  }
61
 
62
  parent::__construct($host, $port, $config);
@@ -90,9 +90,9 @@ class mail_bank_Zend_Mail_Protocol_Smtp_Auth_Crammd5 extends mail_bank_Zend_Mail
90
  */
91
  protected function _hmacMd5($key, $data, $block = 64) {
92
  if (strlen($key) > 64) {
93
- $key = pack('H32', md5($key));
94
  } elseif (strlen($key) < 64) {
95
- $key = str_pad($key, $block, "\0");
96
  }
97
 
98
  $k_ipad = substr($key, 0, 64) ^ str_repeat(chr(0x36), 64);
51
  */
52
  public function __construct($host = '127.0.0.1', $port = null, $config = null) {
53
  if (is_array($config)) {
54
+ if (isset($config['username'])) {
55
+ $this->_username = $config['username'];
56
+ }
57
+ if (isset($config['password'])) {
58
+ $this->_password = $config['password'];
59
+ }
60
  }
61
 
62
  parent::__construct($host, $port, $config);
90
  */
91
  protected function _hmacMd5($key, $data, $block = 64) {
92
  if (strlen($key) > 64) {
93
+ $key = pack('H32', md5($key));
94
  } elseif (strlen($key) < 64) {
95
+ $key = str_pad($key, $block, "\0");
96
  }
97
 
98
  $k_ipad = substr($key, 0, 64) ^ str_repeat(chr(0x36), 64);
lib/zend/mail/protocol/smtp/auth/login.php CHANGED
@@ -65,12 +65,12 @@ class mail_bank_Zend_Mail_Protocol_Smtp_Auth_Login extends mail_bank_Zend_Mail_P
65
  */
66
  public function __construct($host = '127.0.0.1', $port = null, $config = null) {
67
  if (is_array($config)) {
68
- if (isset($config['username'])) {
69
- $this->_username = $config['username'];
70
- }
71
- if (isset($config['password'])) {
72
- $this->_password = $config['password'];
73
- }
74
  }
75
 
76
  parent::__construct($host, $port, $config);
65
  */
66
  public function __construct($host = '127.0.0.1', $port = null, $config = null) {
67
  if (is_array($config)) {
68
+ if (isset($config['username'])) {
69
+ $this->_username = $config['username'];
70
+ }
71
+ if (isset($config['password'])) {
72
+ $this->_password = $config['password'];
73
+ }
74
  }
75
 
76
  parent::__construct($host, $port, $config);
lib/zend/mail/protocol/smtp/auth/oauth2.php CHANGED
@@ -44,9 +44,9 @@ class mail_bank_Zend_Mail_Protocol_Smtp_Auth_Oauth2 extends mail_bank_Zend_Mail_
44
  //Constructor.
45
  public function __construct($host = "127.0.0.1", $port = null, $config = null) {
46
  if (is_array($config)) {
47
- if (isset($config["xoauth2_request"])) {
48
- $this->_xoauth2_request = $config["xoauth2_request"];
49
- }
50
  }
51
  parent::__construct($host, $port, $config);
52
  }
44
  //Constructor.
45
  public function __construct($host = "127.0.0.1", $port = null, $config = null) {
46
  if (is_array($config)) {
47
+ if (isset($config["xoauth2_request"])) {
48
+ $this->_xoauth2_request = $config["xoauth2_request"];
49
+ }
50
  }
51
  parent::__construct($host, $port, $config);
52
  }
lib/zend/mail/protocol/smtp/auth/plain.php CHANGED
@@ -64,12 +64,12 @@ class mail_bank_Zend_Mail_Protocol_Smtp_Auth_Plain extends mail_bank_Zend_Mail_P
64
  */
65
  public function __construct($host = '127.0.0.1', $port = null, $config = null) {
66
  if (is_array($config)) {
67
- if (isset($config['username'])) {
68
- $this->_username = $config['username'];
69
- }
70
- if (isset($config['password'])) {
71
- $this->_password = $config['password'];
72
- }
73
  }
74
 
75
  parent::__construct($host, $port, $config);
64
  */
65
  public function __construct($host = '127.0.0.1', $port = null, $config = null) {
66
  if (is_array($config)) {
67
+ if (isset($config['username'])) {
68
+ $this->_username = $config['username'];
69
+ }
70
+ if (isset($config['password'])) {
71
+ $this->_password = $config['password'];
72
+ }
73
  }
74
 
75
  parent::__construct($host, $port, $config);
lib/zend/mail/storage/abstract.php CHANGED
@@ -77,15 +77,15 @@ abstract class mail_bank_Zend_Mail_Storage_Abstract implements Countable, ArrayA
77
  */
78
  public function __get($var) {
79
  if (strpos($var, 'has') === 0) {
80
- $var = strtolower(substr($var, 3));
81
- return isset($this->_has[$var]) ? $this->_has[$var] : null;
82
  }
83
 
84
  /**
85
  * @see mail_bank_Zend_Mail_Storage_Exception
86
  */
87
  if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
88
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
89
 
90
  throw new mail_bank_Zend_Mail_Storage_Exception($var . ' not found');
91
  }
@@ -221,11 +221,11 @@ abstract class mail_bank_Zend_Mail_Storage_Abstract implements Countable, ArrayA
221
  */
222
  public function offsetExists($id) {
223
  try {
224
- if ($this->getMessage($id)) {
225
- return true;
226
- }
227
  } catch (mail_bank_Zend_Mail_Storage_Exception $e) {
228
-
229
  }
230
 
231
  return false;
@@ -254,7 +254,7 @@ abstract class mail_bank_Zend_Mail_Storage_Abstract implements Countable, ArrayA
254
  * @see mail_bank_Zend_Mail_Storage_Exception
255
  */
256
  if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
257
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
258
 
259
  throw new mail_bank_Zend_Mail_Storage_Exception('cannot write mail messages via array access');
260
  }
@@ -317,7 +317,7 @@ abstract class mail_bank_Zend_Mail_Storage_Abstract implements Countable, ArrayA
317
  */
318
  public function valid() {
319
  if ($this->_iterationMax === null) {
320
- $this->_iterationMax = $this->countMessages();
321
  }
322
  return $this->_iterationPos && $this->_iterationPos <= $this->_iterationMax;
323
  }
@@ -331,11 +331,11 @@ abstract class mail_bank_Zend_Mail_Storage_Abstract implements Countable, ArrayA
331
  */
332
  public function seek($pos) {
333
  if ($this->_iterationMax === null) {
334
- $this->_iterationMax = $this->countMessages();
335
  }
336
 
337
  if ($pos > $this->_iterationMax) {
338
- throw new OutOfBoundsException('this position does not exist');
339
  }
340
  $this->_iterationPos = $pos;
341
  }
77
  */
78
  public function __get($var) {
79
  if (strpos($var, 'has') === 0) {
80
+ $var = strtolower(substr($var, 3));
81
+ return isset($this->_has[$var]) ? $this->_has[$var] : null;
82
  }
83
 
84
  /**
85
  * @see mail_bank_Zend_Mail_Storage_Exception
86
  */
87
  if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
88
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
89
 
90
  throw new mail_bank_Zend_Mail_Storage_Exception($var . ' not found');
91
  }
221
  */
222
  public function offsetExists($id) {
223
  try {
224
+ if ($this->getMessage($id)) {
225
+ return true;
226
+ }
227
  } catch (mail_bank_Zend_Mail_Storage_Exception $e) {
228
+
229
  }
230
 
231
  return false;
254
  * @see mail_bank_Zend_Mail_Storage_Exception
255
  */
256
  if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
257
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
258
 
259
  throw new mail_bank_Zend_Mail_Storage_Exception('cannot write mail messages via array access');
260
  }
317
  */
318
  public function valid() {
319
  if ($this->_iterationMax === null) {
320
+ $this->_iterationMax = $this->countMessages();
321
  }
322
  return $this->_iterationPos && $this->_iterationPos <= $this->_iterationMax;
323
  }
331
  */
332
  public function seek($pos) {
333
  if ($this->_iterationMax === null) {
334
+ $this->_iterationMax = $this->countMessages();
335
  }
336
 
337
  if ($pos > $this->_iterationMax) {
338
+ throw new OutOfBoundsException('this position does not exist');
339
  }
340
  $this->_iterationPos = $pos;
341
  }
lib/zend/mail/storage/folder.php CHANGED
@@ -145,13 +145,13 @@ class mail_bank_Zend_Mail_Storage_Folder implements RecursiveIterator {
145
  */
146
  public function __get($name) {
147
  if (!isset($this->_folders[$name])) {
148
- /**
149
- * @see mail_bank_Zend_Mail_Storage_Exception
150
- */
151
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
152
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
153
 
154
- throw new mail_bank_Zend_Mail_Storage_Exception("no subfolder named $name");
155
  }
156
 
157
  return $this->_folders[$name];
145
  */
146
  public function __get($name) {
147
  if (!isset($this->_folders[$name])) {
148
+ /**
149
+ * @see mail_bank_Zend_Mail_Storage_Exception
150
+ */
151
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
152
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
153
 
154
+ throw new mail_bank_Zend_Mail_Storage_Exception("no subfolder named $name");
155
  }
156
 
157
  return $this->_folders[$name];
lib/zend/mail/storage/folder/maildir.php CHANGED
@@ -87,17 +87,17 @@ class mail_bank_Zend_Mail_Storage_Folder_Maildir extends mail_bank_Zend_Mail_Sto
87
  */
88
  public function __construct($params) {
89
  if (is_array($params)) {
90
- $params = (object) $params;
91
  }
92
 
93
  if (!isset($params->dirname) || !is_dir($params->dirname)) {
94
- /**
95
- * @see mail_bank_Zend_Mail_Storage_Exception
96
- */
97
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
98
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
99
 
100
- throw new mail_bank_Zend_Mail_Storage_Exception('no valid dirname given in params');
101
  }
102
 
103
  $this->_rootdir = rtrim($params->dirname, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR;
@@ -125,23 +125,23 @@ class mail_bank_Zend_Mail_Storage_Folder_Maildir extends mail_bank_Zend_Mail_Sto
125
 
126
  $dh = @opendir($this->_rootdir);
127
  if (!$dh) {
128
- /**
129
- * @see mail_bank_Zend_Mail_Storage_Exception
130
- */
131
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
132
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
133
 
134
- throw new mail_bank_Zend_Mail_Storage_Exception("can't read folders in maildir");
135
  }
136
  $dirs = array();
137
  while (($entry = readdir($dh)) !== false) {
138
- // maildir++ defines folders must start with .
139
- if ($entry[0] != '.' || $entry == '.' || $entry == '..') {
140
- continue;
141
- }
142
- if ($this->_isMaildir($this->_rootdir . $entry)) {
143
- $dirs[] = $entry;
144
- }
145
  }
146
  closedir($dh);
147
 
@@ -152,40 +152,40 @@ class mail_bank_Zend_Mail_Storage_Folder_Maildir extends mail_bank_Zend_Mail_Sto
152
  $parent = '.';
153
 
154
  foreach ($dirs as $dir) {
155
- do {
156
- if (strpos($dir, $parent) === 0) {
157
- $local = substr($dir, strlen($parent));
158
- if (strpos($local, $this->_delim) !== false) {
159
- /**
160
- * @see mail_bank_Zend_Mail_Storage_Exception
161
- */
162
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
163
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
164
-
165
- throw new mail_bank_Zend_Mail_Storage_Exception('error while reading maildir');
166
- }
167
- array_push($stack, $parent);
168
- $parent = $dir . $this->_delim;
169
- $folder = new mail_bank_Zend_Mail_Storage_Folder($local, substr($dir, 1), true);
170
- $parentFolder->$local = $folder;
171
- array_push($folderStack, $parentFolder);
172
- $parentFolder = $folder;
173
- break;
174
- }
175
- else if ($stack) {
176
- $parent = array_pop($stack);
177
- $parentFolder = array_pop($folderStack);
178
- }
179
- } while ($stack);
180
- if (!$stack) {
181
- /**
182
- * @see mail_bank_Zend_Mail_Storage_Exception
183
- */
184
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
185
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
186
-
187
- throw new mail_bank_Zend_Mail_Storage_Exception('error while reading maildir');
188
- }
189
  }
190
  }
191
 
@@ -198,31 +198,31 @@ class mail_bank_Zend_Mail_Storage_Folder_Maildir extends mail_bank_Zend_Mail_Sto
198
  */
199
  public function getFolders($rootFolder = null) {
200
  if (!$rootFolder || $rootFolder == 'INBOX') {
201
- return $this->_rootFolder;
202
  }
203
 
204
  // rootdir is same as INBOX in maildir
205
  if (strpos($rootFolder, 'INBOX' . $this->_delim) === 0) {
206
- $rootFolder = substr($rootFolder, 6);
207
  }
208
  $currentFolder = $this->_rootFolder;
209
  $subname = trim($rootFolder, $this->_delim);
210
  while ($currentFolder) {
211
- @list($entry, $subname) = @explode($this->_delim, $subname, 2);
212
- $currentFolder = $currentFolder->$entry;
213
- if (!$subname) {
214
- break;
215
- }
216
  }
217
 
218
  if ($currentFolder->getGlobalName() != rtrim($rootFolder, $this->_delim)) {
219
- /**
220
- * @see mail_bank_Zend_Mail_Storage_Exception
221
- */
222
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
223
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
224
 
225
- throw new mail_bank_Zend_Mail_Storage_Exception("folder $rootFolder not found");
226
  }
227
  return $currentFolder;
228
  }
@@ -243,28 +243,28 @@ class mail_bank_Zend_Mail_Storage_Folder_Maildir extends mail_bank_Zend_Mail_Sto
243
  $folder = $this->getFolders($this->_currentFolder);
244
 
245
  try {
246
- $this->_openMaildir($this->_rootdir . '.' . $folder->getGlobalName());
247
  } catch (mail_bank_Zend_Mail_Storage_Exception $e) {
248
- // check what went wrong
249
- if (!$folder->isSelectable()) {
250
- /**
251
- * @see mail_bank_Zend_Mail_Storage_Exception
252
- */
253
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
254
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
255
-
256
- throw new mail_bank_Zend_Mail_Storage_Exception("{$this->_currentFolder} is not selectable", 0, $e);
257
- }
258
- // seems like file has vanished; rebuilding folder tree - but it's still an exception
259
- $this->_buildFolderTree($this->_rootdir);
260
- /**
261
- * @see mail_bank_Zend_Mail_Storage_Exception
262
- */
263
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
264
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
265
-
266
- throw new mail_bank_Zend_Mail_Storage_Exception('seems like the maildir has vanished, I\'ve rebuild the ' .
267
- 'folder tree, search for an other folder and try again', 0, $e);
268
  }
269
  }
270
 
87
  */
88
  public function __construct($params) {
89
  if (is_array($params)) {
90
+ $params = (object) $params;
91
  }
92
 
93
  if (!isset($params->dirname) || !is_dir($params->dirname)) {
94
+ /**
95
+ * @see mail_bank_Zend_Mail_Storage_Exception
96
+ */
97
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
98
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
99
 
100
+ throw new mail_bank_Zend_Mail_Storage_Exception('no valid dirname given in params');
101
  }
102
 
103
  $this->_rootdir = rtrim($params->dirname, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR;
125
 
126
  $dh = @opendir($this->_rootdir);
127
  if (!$dh) {
128
+ /**
129
+ * @see mail_bank_Zend_Mail_Storage_Exception
130
+ */
131
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
132
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
133
 
134
+ throw new mail_bank_Zend_Mail_Storage_Exception("can't read folders in maildir");
135
  }
136
  $dirs = array();
137
  while (($entry = readdir($dh)) !== false) {
138
+ // maildir++ defines folders must start with .
139
+ if ($entry[0] != '.' || $entry == '.' || $entry == '..') {
140
+ continue;
141
+ }
142
+ if ($this->_isMaildir($this->_rootdir . $entry)) {
143
+ $dirs[] = $entry;
144
+ }
145
  }
146
  closedir($dh);
147
 
152
  $parent = '.';
153
 
154
  foreach ($dirs as $dir) {
155
+ do {
156
+ if (strpos($dir, $parent) === 0) {
157
+ $local = substr($dir, strlen($parent));
158
+ if (strpos($local, $this->_delim) !== false) {
159
+ /**
160
+ * @see mail_bank_Zend_Mail_Storage_Exception
161
+ */
162
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
163
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
164
+
165
+ throw new mail_bank_Zend_Mail_Storage_Exception('error while reading maildir');
166
+ }
167
+ array_push($stack, $parent);
168
+ $parent = $dir . $this->_delim;
169
+ $folder = new mail_bank_Zend_Mail_Storage_Folder($local, substr($dir, 1), true);
170
+ $parentFolder->$local = $folder;
171
+ array_push($folderStack, $parentFolder);
172
+ $parentFolder = $folder;
173
+ break;
174
+ }
175
+ else if ($stack) {
176
+ $parent = array_pop($stack);
177
+ $parentFolder = array_pop($folderStack);
178
+ }
179
+ } while ($stack);
180
+ if (!$stack) {
181
+ /**
182
+ * @see mail_bank_Zend_Mail_Storage_Exception
183
+ */
184
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
185
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
186
+
187
+ throw new mail_bank_Zend_Mail_Storage_Exception('error while reading maildir');
188
+ }
189
  }
190
  }
191
 
198
  */
199
  public function getFolders($rootFolder = null) {
200
  if (!$rootFolder || $rootFolder == 'INBOX') {
201
+ return $this->_rootFolder;
202
  }
203
 
204
  // rootdir is same as INBOX in maildir
205
  if (strpos($rootFolder, 'INBOX' . $this->_delim) === 0) {
206
+ $rootFolder = substr($rootFolder, 6);
207
  }
208
  $currentFolder = $this->_rootFolder;
209
  $subname = trim($rootFolder, $this->_delim);
210
  while ($currentFolder) {
211
+ @list($entry, $subname) = @explode($this->_delim, $subname, 2);
212
+ $currentFolder = $currentFolder->$entry;
213
+ if (!$subname) {
214
+ break;
215
+ }
216
  }
217
 
218
  if ($currentFolder->getGlobalName() != rtrim($rootFolder, $this->_delim)) {
219
+ /**
220
+ * @see mail_bank_Zend_Mail_Storage_Exception
221
+ */
222
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
223
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
224
 
225
+ throw new mail_bank_Zend_Mail_Storage_Exception("folder $rootFolder not found");
226
  }
227
  return $currentFolder;
228
  }
243
  $folder = $this->getFolders($this->_currentFolder);
244
 
245
  try {
246
+ $this->_openMaildir($this->_rootdir . '.' . $folder->getGlobalName());
247
  } catch (mail_bank_Zend_Mail_Storage_Exception $e) {
248
+ // check what went wrong
249
+ if (!$folder->isSelectable()) {
250
+ /**
251
+ * @see mail_bank_Zend_Mail_Storage_Exception
252
+ */
253
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
254
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
255
+
256
+ throw new mail_bank_Zend_Mail_Storage_Exception("{$this->_currentFolder} is not selectable", 0, $e);
257
+ }
258
+ // seems like file has vanished; rebuilding folder tree - but it's still an exception
259
+ $this->_buildFolderTree($this->_rootdir);
260
+ /**
261
+ * @see mail_bank_Zend_Mail_Storage_Exception
262
+ */
263
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
264
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
265
+
266
+ throw new mail_bank_Zend_Mail_Storage_Exception('seems like the maildir has vanished, I\'ve rebuild the ' .
267
+ 'folder tree, search for an other folder and try again', 0, $e);
268
  }
269
  }
270
 
lib/zend/mail/storage/folder/mbox.php CHANGED
@@ -82,27 +82,27 @@ class mail_bank_Zend_Mail_Storage_Folder_Mbox extends mail_bank_Zend_Mail_Storag
82
  */
83
  public function __construct($params) {
84
  if (is_array($params)) {
85
- $params = (object) $params;
86
  }
87
 
88
  if (isset($params->filename)) {
89
- /**
90
- * @see mail_bank_Zend_Mail_Storage_Exception
91
- */
92
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
93
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
94
 
95
- throw new mail_bank_Zend_Mail_Storage_Exception('use Zend_Mail_Storage_Mbox for a single file');
96
  }
97
 
98
  if (!isset($params->dirname) || !is_dir($params->dirname)) {
99
- /**
100
- * @see mail_bank_Zend_Mail_Storage_Exception
101
- */
102
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
103
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
104
 
105
- throw new mail_bank_Zend_Mail_Storage_Exception('no valid dirname given in params');
106
  }
107
 
108
  $this->_rootdir = rtrim($params->dirname, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR;
@@ -127,37 +127,37 @@ class mail_bank_Zend_Mail_Storage_Folder_Mbox extends mail_bank_Zend_Mail_Storag
127
  */
128
  protected function _buildFolderTree($currentDir, $parentFolder = null, $parentGlobalName = '') {
129
  if (!$parentFolder) {
130
- $this->_rootFolder = new mail_bank_Zend_Mail_Storage_Folder('/', '/', false);
131
- $parentFolder = $this->_rootFolder;
132
  }
133
 
134
  $dh = @opendir($currentDir);
135
  if (!$dh) {
136
- /**
137
- * @see mail_bank_Zend_Mail_Storage_Exception
138
- */
139
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
140
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
141
 
142
- throw new mail_bank_Zend_Mail_Storage_Exception("can't read dir $currentDir");
143
  }
144
  while (($entry = readdir($dh)) !== false) {
145
- // ignore hidden files for mbox
146
- if ($entry[0] == '.') {
147
- continue;
148
- }
149
- $absoluteEntry = $currentDir . $entry;
150
- $globalName = $parentGlobalName . DIRECTORY_SEPARATOR . $entry;
151
- if (is_file($absoluteEntry) && $this->_isMboxFile($absoluteEntry)) {
152
- $parentFolder->$entry = new mail_bank_Zend_Mail_Storage_Folder($entry, $globalName);
153
- continue;
154
- }
155
- if (!is_dir($absoluteEntry) /* || $entry == '.' || $entry == '..' */) {
156
- continue;
157
- }
158
- $folder = new mail_bank_Zend_Mail_Storage_Folder($entry, $globalName, false);
159
- $parentFolder->$entry = $folder;
160
- $this->_buildFolderTree($absoluteEntry . DIRECTORY_SEPARATOR, $folder, $globalName);
161
  }
162
 
163
  closedir($dh);
@@ -172,27 +172,27 @@ class mail_bank_Zend_Mail_Storage_Folder_Mbox extends mail_bank_Zend_Mail_Storag
172
  */
173
  public function getFolders($rootFolder = null) {
174
  if (!$rootFolder) {
175
- return $this->_rootFolder;
176
  }
177
 
178
  $currentFolder = $this->_rootFolder;
179
  $subname = trim($rootFolder, DIRECTORY_SEPARATOR);
180
  while ($currentFolder) {
181
- @list($entry, $subname) = @explode(DIRECTORY_SEPARATOR, $subname, 2);
182
- $currentFolder = $currentFolder->$entry;
183
- if (!$subname) {
184
- break;
185
- }
186
  }
187
 
188
  if ($currentFolder->getGlobalName() != DIRECTORY_SEPARATOR . trim($rootFolder, DIRECTORY_SEPARATOR)) {
189
- /**
190
- * @see mail_bank_Zend_Mail_Storage_Exception
191
- */
192
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
193
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
194
 
195
- throw new mail_bank_Zend_Mail_Storage_Exception("folder $rootFolder not found");
196
  }
197
  return $currentFolder;
198
  }
@@ -213,28 +213,28 @@ class mail_bank_Zend_Mail_Storage_Folder_Mbox extends mail_bank_Zend_Mail_Storag
213
  $folder = $this->getFolders($this->_currentFolder);
214
 
215
  try {
216
- $this->_openMboxFile($this->_rootdir . $folder->getGlobalName());
217
  } catch (mail_bank_Zend_Mail_Storage_Exception $e) {
218
- // check what went wrong
219
- if (!$folder->isSelectable()) {
220
- /**
221
- * @see mail_bank_Zend_Mail_Storage_Exception
222
- */
223
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
224
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
225
 
226
- throw new mail_bank_Zend_Mail_Storage_Exception("{$this->_currentFolder} is not selectable", 0, $e);
227
- }
228
- // seems like file has vanished; rebuilding folder tree - but it's still an exception
229
- $this->_buildFolderTree($this->_rootdir);
230
- /**
231
- * @see mail_bank_Zend_Mail_Storage_Exception
232
- */
233
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
234
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
235
 
236
- throw new mail_bank_Zend_Mail_Storage_Exception('seems like the mbox file has vanished, I\'ve rebuild the ' .
237
- 'folder tree, search for an other folder and try again', 0, $e);
238
  }
239
  }
240
 
82
  */
83
  public function __construct($params) {
84
  if (is_array($params)) {
85
+ $params = (object) $params;
86
  }
87
 
88
  if (isset($params->filename)) {
89
+ /**
90
+ * @see mail_bank_Zend_Mail_Storage_Exception
91
+ */
92
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
93
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
94
 
95
+ throw new mail_bank_Zend_Mail_Storage_Exception('use Zend_Mail_Storage_Mbox for a single file');
96
  }
97
 
98
  if (!isset($params->dirname) || !is_dir($params->dirname)) {
99
+ /**
100
+ * @see mail_bank_Zend_Mail_Storage_Exception
101
+ */
102
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
103
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
104
 
105
+ throw new mail_bank_Zend_Mail_Storage_Exception('no valid dirname given in params');
106
  }
107
 
108
  $this->_rootdir = rtrim($params->dirname, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR;
127
  */
128
  protected function _buildFolderTree($currentDir, $parentFolder = null, $parentGlobalName = '') {
129
  if (!$parentFolder) {
130
+ $this->_rootFolder = new mail_bank_Zend_Mail_Storage_Folder('/', '/', false);
131
+ $parentFolder = $this->_rootFolder;
132
  }
133
 
134
  $dh = @opendir($currentDir);
135
  if (!$dh) {
136
+ /**
137
+ * @see mail_bank_Zend_Mail_Storage_Exception
138
+ */
139
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
140
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
141
 
142
+ throw new mail_bank_Zend_Mail_Storage_Exception("can't read dir $currentDir");
143
  }
144
  while (($entry = readdir($dh)) !== false) {
145
+ // ignore hidden files for mbox
146
+ if ($entry[0] == '.') {
147
+ continue;
148
+ }
149
+ $absoluteEntry = $currentDir . $entry;
150
+ $globalName = $parentGlobalName . DIRECTORY_SEPARATOR . $entry;
151
+ if (is_file($absoluteEntry) && $this->_isMboxFile($absoluteEntry)) {
152
+ $parentFolder->$entry = new mail_bank_Zend_Mail_Storage_Folder($entry, $globalName);
153
+ continue;
154
+ }
155
+ if (!is_dir($absoluteEntry) /* || $entry == '.' || $entry == '..' */) {
156
+ continue;
157
+ }
158
+ $folder = new mail_bank_Zend_Mail_Storage_Folder($entry, $globalName, false);
159
+ $parentFolder->$entry = $folder;
160
+ $this->_buildFolderTree($absoluteEntry . DIRECTORY_SEPARATOR, $folder, $globalName);
161
  }
162
 
163
  closedir($dh);
172
  */
173
  public function getFolders($rootFolder = null) {
174
  if (!$rootFolder) {
175
+ return $this->_rootFolder;
176
  }
177
 
178
  $currentFolder = $this->_rootFolder;
179
  $subname = trim($rootFolder, DIRECTORY_SEPARATOR);
180
  while ($currentFolder) {
181
+ @list($entry, $subname) = @explode(DIRECTORY_SEPARATOR, $subname, 2);
182
+ $currentFolder = $currentFolder->$entry;
183
+ if (!$subname) {
184
+ break;
185
+ }
186
  }
187
 
188
  if ($currentFolder->getGlobalName() != DIRECTORY_SEPARATOR . trim($rootFolder, DIRECTORY_SEPARATOR)) {
189
+ /**
190
+ * @see mail_bank_Zend_Mail_Storage_Exception
191
+ */
192
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
193
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
194
 
195
+ throw new mail_bank_Zend_Mail_Storage_Exception("folder $rootFolder not found");
196
  }
197
  return $currentFolder;
198
  }
213
  $folder = $this->getFolders($this->_currentFolder);
214
 
215
  try {
216
+ $this->_openMboxFile($this->_rootdir . $folder->getGlobalName());
217
  } catch (mail_bank_Zend_Mail_Storage_Exception $e) {
218
+ // check what went wrong
219
+ if (!$folder->isSelectable()) {
220
+ /**
221
+ * @see mail_bank_Zend_Mail_Storage_Exception
222
+ */
223
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
224
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
225
 
226
+ throw new mail_bank_Zend_Mail_Storage_Exception("{$this->_currentFolder} is not selectable", 0, $e);
227
+ }
228
+ // seems like file has vanished; rebuilding folder tree - but it's still an exception
229
+ $this->_buildFolderTree($this->_rootdir);
230
+ /**
231
+ * @see mail_bank_Zend_Mail_Storage_Exception
232
+ */
233
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
234
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
235
 
236
+ throw new mail_bank_Zend_Mail_Storage_Exception('seems like the mbox file has vanished, I\'ve rebuild the ' .
237
+ 'folder tree, search for an other folder and try again', 0, $e);
238
  }
239
  }
240
 
lib/zend/mail/storage/maildir.php CHANGED
@@ -86,27 +86,27 @@ class mail_bank_Zend_Mail_Storage_Maildir extends mail_bank_Zend_Mail_Storage_Ab
86
  */
87
  public function countMessages($flags = null) {
88
  if ($flags === null) {
89
- return count($this->_files);
90
  }
91
 
92
  $count = 0;
93
  if (!is_array($flags)) {
94
- foreach ($this->_files as $file) {
95
- if (isset($file['flaglookup'][$flags])) {
96
- ++$count;
97
- }
98
- }
99
- return $count;
100
  }
101
 
102
  $flags = array_flip($flags);
103
  foreach ($this->_files as $file) {
104
- foreach ($flags as $flag => $v) {
105
- if (!isset($file['flaglookup'][$flag])) {
106
- continue 2;
107
- }
108
- }
109
- ++$count;
110
  }
111
  return $count;
112
  }
@@ -121,27 +121,27 @@ class mail_bank_Zend_Mail_Storage_Maildir extends mail_bank_Zend_Mail_Storage_Ab
121
  */
122
  protected function _getFileData($id, $field = null) {
123
  if (!isset($this->_files[$id - 1])) {
124
- /**
125
- * @see mail_bank_Zend_Mail_Storage_Exception
126
- */
127
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
128
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
129
 
130
- throw new mail_bank_Zend_Mail_Storage_Exception('id does not exist');
131
  }
132
 
133
  if (!$field) {
134
- return $this->_files[$id - 1];
135
  }
136
 
137
  if (!isset($this->_files[$id - 1][$field])) {
138
- /**
139
- * @see mail_bank_Zend_Mail_Storage_Exception
140
- */
141
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
142
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
143
 
144
- throw new mail_bank_Zend_Mail_Storage_Exception('field does not exist');
145
  }
146
 
147
  return $this->_files[$id - 1][$field];
@@ -156,13 +156,13 @@ class mail_bank_Zend_Mail_Storage_Maildir extends mail_bank_Zend_Mail_Storage_Ab
156
  */
157
  public function getSize($id = null) {
158
  if ($id !== null) {
159
- $filedata = $this->_getFileData($id);
160
- return isset($filedata['size']) ? $filedata['size'] : filesize($filedata['filename']);
161
  }
162
 
163
  $result = array();
164
  foreach ($this->_files as $num => $data) {
165
- $result[$num + 1] = isset($data['size']) ? $data['size'] : filesize($data['filename']);
166
  }
167
 
168
  return $result;
@@ -178,12 +178,12 @@ class mail_bank_Zend_Mail_Storage_Maildir extends mail_bank_Zend_Mail_Storage_Ab
178
  public function getMessage($id) {
179
  // TODO that's ugly, would be better to let the message class decide
180
  if (strtolower($this->_messageClass) == 'mail_bank_zend_mail_message_file' || is_subclass_of($this->_messageClass, 'mail_bank_zend_mail_message_file')) {
181
- return new $this->_messageClass(array('file' => $this->_getFileData($id, 'filename'),
182
- 'flags' => $this->_getFileData($id, 'flags')));
183
  }
184
 
185
  return new $this->_messageClass(array('handler' => $this, 'id' => $id, 'headers' => $this->getRawHeader($id),
186
- 'flags' => $this->_getFileData($id, 'flags')));
187
  }
188
 
189
  /*
@@ -198,25 +198,25 @@ class mail_bank_Zend_Mail_Storage_Maildir extends mail_bank_Zend_Mail_Storage_Ab
198
 
199
  public function getRawHeader($id, $part = null, $topLines = 0) {
200
  if ($part !== null) {
201
- // TODO: implement
202
- /**
203
- * @see mail_bank_Zend_Mail_Storage_Exception
204
- */
205
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
206
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
207
-
208
- throw new mail_bank_Zend_Mail_Storage_Exception('not implemented');
209
  }
210
 
211
  $fh = fopen($this->_getFileData($id, 'filename'), 'r');
212
 
213
  $content = '';
214
  while (!feof($fh)) {
215
- $line = fgets($fh);
216
- if (!trim($line)) {
217
- break;
218
- }
219
- $content .= $line;
220
  }
221
 
222
  fclose($fh);
@@ -234,23 +234,23 @@ class mail_bank_Zend_Mail_Storage_Maildir extends mail_bank_Zend_Mail_Storage_Ab
234
 
235
  public function getRawContent($id, $part = null) {
236
  if ($part !== null) {
237
- // TODO: implement
238
- /**
239
- * @see mail_bank_Zend_Mail_Storage_Exception
240
- */
241
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
242
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
243
-
244
- throw new mail_bank_Zend_Mail_Storage_Exception('not implemented');
245
  }
246
 
247
  $fh = fopen($this->_getFileData($id, 'filename'), 'r');
248
 
249
  while (!feof($fh)) {
250
- $line = fgets($fh);
251
- if (!trim($line)) {
252
- break;
253
- }
254
  }
255
 
256
  $content = stream_get_contents($fh);
@@ -268,27 +268,27 @@ class mail_bank_Zend_Mail_Storage_Maildir extends mail_bank_Zend_Mail_Storage_Ab
268
  */
269
  public function __construct($params) {
270
  if (is_array($params)) {
271
- $params = (object) $params;
272
  }
273
 
274
  if (!isset($params->dirname) || !is_dir($params->dirname)) {
275
- /**
276
- * @see mail_bank_Zend_Mail_Storage_Exception
277
- */
278
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
279
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
280
 
281
- throw new mail_bank_Zend_Mail_Storage_Exception('no valid dirname given in params');
282
  }
283
 
284
  if (!$this->_isMaildir($params->dirname)) {
285
- /**
286
- * @see mail_bank_Zend_Mail_Storage_Exception
287
- */
288
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
289
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
290
 
291
- throw new mail_bank_Zend_Mail_Storage_Exception('invalid maildir given');
292
  }
293
 
294
  $this->_has['top'] = true;
@@ -304,10 +304,10 @@ class mail_bank_Zend_Mail_Storage_Maildir extends mail_bank_Zend_Mail_Storage_Ab
304
  */
305
  protected function _isMaildir($dirname) {
306
  if (file_exists($dirname . '/new') && !is_dir($dirname . '/new')) {
307
- return false;
308
  }
309
  if (file_exists($dirname . '/tmp') && !is_dir($dirname . '/tmp')) {
310
- return false;
311
  }
312
  return is_dir($dirname . '/cur');
313
  }
@@ -321,34 +321,34 @@ class mail_bank_Zend_Mail_Storage_Maildir extends mail_bank_Zend_Mail_Storage_Ab
321
  */
322
  protected function _openMaildir($dirname) {
323
  if ($this->_files) {
324
- $this->close();
325
  }
326
 
327
  $dh = @opendir($dirname . '/cur/');
328
  if (!$dh) {
329
- /**
330
- * @see mail_bank_Zend_Mail_Storage_Exception
331
- */
332
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
333
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
334
 
335
- throw new mail_bank_Zend_Mail_Storage_Exception('cannot open maildir');
336
  }
337
  $this->_getMaildirFiles($dh, $dirname . '/cur/');
338
  closedir($dh);
339
 
340
  $dh = @opendir($dirname . '/new/');
341
  if ($dh) {
342
- $this->_getMaildirFiles($dh, $dirname . '/new/', array(mail_bank_Zend_Mail_Storage::FLAG_RECENT));
343
- closedir($dh);
344
  } else if (file_exists($dirname . '/new/')) {
345
- /**
346
- * @see mail_bank_Zend_Mail_Storage_Exception
347
- */
348
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
349
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
350
 
351
- throw new mail_bank_Zend_Mail_Storage_Exception('cannot read recent mails in maildir');
352
  }
353
  }
354
 
@@ -362,38 +362,38 @@ class mail_bank_Zend_Mail_Storage_Maildir extends mail_bank_Zend_Mail_Storage_Ab
362
  */
363
  protected function _getMaildirFiles($dh, $dirname, $default_flags = array()) {
364
  while (($entry = readdir($dh)) !== false) {
365
- if ($entry[0] == '.' || !is_file($dirname . $entry)) {
366
- continue;
367
- }
368
-
369
- @list($uniq, $info) = explode(':', $entry, 2);
370
- @list(, $size) = explode(',', $uniq, 2);
371
- if ($size && $size[0] == 'S' && $size[1] == '=') {
372
- $size = substr($size, 2);
373
- }
374
- if (!ctype_digit($size)) {
375
- $size = null;
376
- }
377
- @list($version, $flags) = explode(',', $info, 2);
378
- if ($version != 2) {
379
- $flags = '';
380
- }
381
-
382
- $named_flags = $default_flags;
383
- $length = strlen($flags);
384
- for ($i = 0; $i < $length; ++$i) {
385
- $flag = $flags[$i];
386
- $named_flags[$flag] = isset(self::$_knownFlags[$flag]) ? self::$_knownFlags[$flag] : $flag;
387
- }
388
-
389
- $data = array('uniq' => $uniq,
390
- 'flags' => $named_flags,
391
- 'flaglookup' => array_flip($named_flags),
392
- 'filename' => $dirname . $entry);
393
- if ($size !== null) {
394
- $data['size'] = (int) $size;
395
- }
396
- $this->_files[] = $data;
397
  }
398
  }
399
 
@@ -427,7 +427,7 @@ class mail_bank_Zend_Mail_Storage_Maildir extends mail_bank_Zend_Mail_Storage_Ab
427
  * @see mail_bank_Zend_Mail_Storage_Exception
428
  */
429
  if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
430
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
431
 
432
  throw new mail_bank_Zend_Mail_Storage_Exception('maildir is (currently) read-only');
433
  }
@@ -443,12 +443,12 @@ class mail_bank_Zend_Mail_Storage_Maildir extends mail_bank_Zend_Mail_Storage_Ab
443
  */
444
  public function getUniqueId($id = null) {
445
  if ($id) {
446
- return $this->_getFileData($id, 'uniq');
447
  }
448
 
449
  $ids = array();
450
  foreach ($this->_files as $num => $file) {
451
- $ids[$num + 1] = $file['uniq'];
452
  }
453
  return $ids;
454
  }
@@ -465,16 +465,16 @@ class mail_bank_Zend_Mail_Storage_Maildir extends mail_bank_Zend_Mail_Storage_Ab
465
  */
466
  public function getNumberByUniqueId($id) {
467
  foreach ($this->_files as $num => $file) {
468
- if ($file['uniq'] == $id) {
469
- return $num + 1;
470
- }
471
  }
472
 
473
  /**
474
  * @see mail_bank_Zend_Mail_Storage_Exception
475
  */
476
  if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
477
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
478
 
479
  throw new mail_bank_Zend_Mail_Storage_Exception('unique id not found');
480
  }
86
  */
87
  public function countMessages($flags = null) {
88
  if ($flags === null) {
89
+ return count($this->_files);
90
  }
91
 
92
  $count = 0;
93
  if (!is_array($flags)) {
94
+ foreach ($this->_files as $file) {
95
+ if (isset($file['flaglookup'][$flags])) {
96
+ ++$count;
97
+ }
98
+ }
99
+ return $count;
100
  }
101
 
102
  $flags = array_flip($flags);
103
  foreach ($this->_files as $file) {
104
+ foreach ($flags as $flag => $v) {
105
+ if (!isset($file['flaglookup'][$flag])) {
106
+ continue 2;
107
+ }
108
+ }
109
+ ++$count;
110
  }
111
  return $count;
112
  }
121
  */
122
  protected function _getFileData($id, $field = null) {
123
  if (!isset($this->_files[$id - 1])) {
124
+ /**
125
+ * @see mail_bank_Zend_Mail_Storage_Exception
126
+ */
127
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
128
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
129
 
130
+ throw new mail_bank_Zend_Mail_Storage_Exception('id does not exist');
131
  }
132
 
133
  if (!$field) {
134
+ return $this->_files[$id - 1];
135
  }
136
 
137
  if (!isset($this->_files[$id - 1][$field])) {
138
+ /**
139
+ * @see mail_bank_Zend_Mail_Storage_Exception
140
+ */
141
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
142
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
143
 
144
+ throw new mail_bank_Zend_Mail_Storage_Exception('field does not exist');
145
  }
146
 
147
  return $this->_files[$id - 1][$field];
156
  */
157
  public function getSize($id = null) {
158
  if ($id !== null) {
159
+ $filedata = $this->_getFileData($id);
160
+ return isset($filedata['size']) ? $filedata['size'] : filesize($filedata['filename']);
161
  }
162
 
163
  $result = array();
164
  foreach ($this->_files as $num => $data) {
165
+ $result[$num + 1] = isset($data['size']) ? $data['size'] : filesize($data['filename']);
166
  }
167
 
168
  return $result;
178
  public function getMessage($id) {
179
  // TODO that's ugly, would be better to let the message class decide
180
  if (strtolower($this->_messageClass) == 'mail_bank_zend_mail_message_file' || is_subclass_of($this->_messageClass, 'mail_bank_zend_mail_message_file')) {
181
+ return new $this->_messageClass(array('file' => $this->_getFileData($id, 'filename'),
182
+ 'flags' => $this->_getFileData($id, 'flags')));
183
  }
184
 
185
  return new $this->_messageClass(array('handler' => $this, 'id' => $id, 'headers' => $this->getRawHeader($id),
186
+ 'flags' => $this->_getFileData($id, 'flags')));
187
  }
188
 
189
  /*
198
 
199
  public function getRawHeader($id, $part = null, $topLines = 0) {
200
  if ($part !== null) {
201
+ // TODO: implement
202
+ /**
203
+ * @see mail_bank_Zend_Mail_Storage_Exception
204
+ */
205
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
206
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
207
+
208
+ throw new mail_bank_Zend_Mail_Storage_Exception('not implemented');
209
  }
210
 
211
  $fh = fopen($this->_getFileData($id, 'filename'), 'r');
212
 
213
  $content = '';
214
  while (!feof($fh)) {
215
+ $line = fgets($fh);
216
+ if (!trim($line)) {
217
+ break;
218
+ }
219
+ $content .= $line;
220
  }
221
 
222
  fclose($fh);
234
 
235
  public function getRawContent($id, $part = null) {
236
  if ($part !== null) {
237
+ // TODO: implement
238
+ /**
239
+ * @see mail_bank_Zend_Mail_Storage_Exception
240
+ */
241
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
242
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
243
+
244
+ throw new mail_bank_Zend_Mail_Storage_Exception('not implemented');
245
  }
246
 
247
  $fh = fopen($this->_getFileData($id, 'filename'), 'r');
248
 
249
  while (!feof($fh)) {
250
+ $line = fgets($fh);
251
+ if (!trim($line)) {
252
+ break;
253
+ }
254
  }
255
 
256
  $content = stream_get_contents($fh);
268
  */
269
  public function __construct($params) {
270
  if (is_array($params)) {
271
+ $params = (object) $params;
272
  }
273
 
274
  if (!isset($params->dirname) || !is_dir($params->dirname)) {
275
+ /**
276
+ * @see mail_bank_Zend_Mail_Storage_Exception
277
+ */
278
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
279
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
280
 
281
+ throw new mail_bank_Zend_Mail_Storage_Exception('no valid dirname given in params');
282
  }
283
 
284
  if (!$this->_isMaildir($params->dirname)) {
285
+ /**
286
+ * @see mail_bank_Zend_Mail_Storage_Exception
287
+ */
288
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
289
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
290
 
291
+ throw new mail_bank_Zend_Mail_Storage_Exception('invalid maildir given');
292
  }
293
 
294
  $this->_has['top'] = true;
304
  */
305
  protected function _isMaildir($dirname) {
306
  if (file_exists($dirname . '/new') && !is_dir($dirname . '/new')) {
307
+ return false;
308
  }
309
  if (file_exists($dirname . '/tmp') && !is_dir($dirname . '/tmp')) {
310
+ return false;
311
  }
312
  return is_dir($dirname . '/cur');
313
  }
321
  */
322
  protected function _openMaildir($dirname) {
323
  if ($this->_files) {
324
+ $this->close();
325
  }
326
 
327
  $dh = @opendir($dirname . '/cur/');
328
  if (!$dh) {
329
+ /**
330
+ * @see mail_bank_Zend_Mail_Storage_Exception
331
+ */
332
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
333
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
334
 
335
+ throw new mail_bank_Zend_Mail_Storage_Exception('cannot open maildir');
336
  }
337
  $this->_getMaildirFiles($dh, $dirname . '/cur/');
338
  closedir($dh);
339
 
340
  $dh = @opendir($dirname . '/new/');
341
  if ($dh) {
342
+ $this->_getMaildirFiles($dh, $dirname . '/new/', array(mail_bank_Zend_Mail_Storage::FLAG_RECENT));
343
+ closedir($dh);
344
  } else if (file_exists($dirname . '/new/')) {
345
+ /**
346
+ * @see mail_bank_Zend_Mail_Storage_Exception
347
+ */
348
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
349
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
350
 
351
+ throw new mail_bank_Zend_Mail_Storage_Exception('cannot read recent mails in maildir');
352
  }
353
  }
354
 
362
  */
363
  protected function _getMaildirFiles($dh, $dirname, $default_flags = array()) {
364
  while (($entry = readdir($dh)) !== false) {
365
+ if ($entry[0] == '.' || !is_file($dirname . $entry)) {
366
+ continue;
367
+ }
368
+
369
+ @list($uniq, $info) = explode(':', $entry, 2);
370
+ @list(, $size) = explode(',', $uniq, 2);
371
+ if ($size && $size[0] == 'S' && $size[1] == '=') {
372
+ $size = substr($size, 2);
373
+ }
374
+ if (!ctype_digit($size)) {
375
+ $size = null;
376
+ }
377
+ @list($version, $flags) = explode(',', $info, 2);
378
+ if ($version != 2) {
379
+ $flags = '';
380
+ }
381
+
382
+ $named_flags = $default_flags;
383
+ $length = strlen($flags);
384
+ for ($i = 0; $i < $length; ++$i) {
385
+ $flag = $flags[$i];
386
+ $named_flags[$flag] = isset(self::$_knownFlags[$flag]) ? self::$_knownFlags[$flag] : $flag;
387
+ }
388
+
389
+ $data = array('uniq' => $uniq,
390
+ 'flags' => $named_flags,
391
+ 'flaglookup' => array_flip($named_flags),
392
+ 'filename' => $dirname . $entry);
393
+ if ($size !== null) {
394
+ $data['size'] = (int) $size;
395
+ }
396
+ $this->_files[] = $data;
397
  }
398
  }
399
 
427
  * @see mail_bank_Zend_Mail_Storage_Exception
428
  */
429
  if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
430
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
431
 
432
  throw new mail_bank_Zend_Mail_Storage_Exception('maildir is (currently) read-only');
433
  }
443
  */
444
  public function getUniqueId($id = null) {
445
  if ($id) {
446
+ return $this->_getFileData($id, 'uniq');
447
  }
448
 
449
  $ids = array();
450
  foreach ($this->_files as $num => $file) {
451
+ $ids[$num + 1] = $file['uniq'];
452
  }
453
  return $ids;
454
  }
465
  */
466
  public function getNumberByUniqueId($id) {
467
  foreach ($this->_files as $num => $file) {
468
+ if ($file['uniq'] == $id) {
469
+ return $num + 1;
470
+ }
471
  }
472
 
473
  /**
474
  * @see mail_bank_Zend_Mail_Storage_Exception
475
  */
476
  if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
477
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
478
 
479
  throw new mail_bank_Zend_Mail_Storage_Exception('unique id not found');
480
  }
lib/zend/mail/storage/mbox.php CHANGED
@@ -99,13 +99,13 @@ class mail_bank_Zend_Mail_Storage_Mbox extends mail_bank_Zend_Mail_Storage_Abstr
99
  */
100
  public function getSize($id = 0) {
101
  if ($id) {
102
- $pos = $this->_positions[$id - 1];
103
- return $pos['end'] - $pos['start'];
104
  }
105
 
106
  $result = array();
107
  foreach ($this->_positions as $num => $pos) {
108
- $result[$num + 1] = $pos['end'] - $pos['start'];
109
  }
110
 
111
  return $result;
@@ -120,13 +120,13 @@ class mail_bank_Zend_Mail_Storage_Mbox extends mail_bank_Zend_Mail_Storage_Abstr
120
  */
121
  protected function _getPos($id) {
122
  if (!isset($this->_positions[$id - 1])) {
123
- /**
124
- * @see mail_bank_Zend_Mail_Storage_Exception
125
- */
126
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
127
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
128
 
129
- throw new mail_bank_Zend_Mail_Storage_Exception('id does not exist');
130
  }
131
 
132
  return $this->_positions[$id - 1];
@@ -142,10 +142,10 @@ class mail_bank_Zend_Mail_Storage_Mbox extends mail_bank_Zend_Mail_Storage_Abstr
142
  public function getMessage($id) {
143
  // TODO that's ugly, would be better to let the message class decide
144
  if (strtolower($this->_messageClass) == 'mail_bank_zend_mail_message_file' || is_subclass_of($this->_messageClass, 'mail_bank_zend_mail_message_file')) {
145
- // TODO top/body lines
146
- $messagePos = $this->_getPos($id);
147
- return new $this->_messageClass(array('file' => $this->_fh, 'startPos' => $messagePos['start'],
148
- 'endPos' => $messagePos['end']));
149
  }
150
 
151
  $bodyLines = 0; // TODO: need a way to change that
@@ -153,10 +153,10 @@ class mail_bank_Zend_Mail_Storage_Mbox extends mail_bank_Zend_Mail_Storage_Abstr
153
  $message = $this->getRawHeader($id);
154
  // file pointer is after headers now
155
  if ($bodyLines) {
156
- $message .= "\n";
157
- while ($bodyLines-- && ftell($this->_fh) < $this->_positions[$id - 1]['end']) {
158
- $message .= fgets($this->_fh);
159
- }
160
  }
161
 
162
  return new $this->_messageClass(array('handler' => $this, 'id' => $id, 'headers' => $message));
@@ -175,14 +175,14 @@ class mail_bank_Zend_Mail_Storage_Mbox extends mail_bank_Zend_Mail_Storage_Abstr
175
 
176
  public function getRawHeader($id, $part = null, $topLines = 0) {
177
  if ($part !== null) {
178
- // TODO: implement
179
- /**
180
- * @see mail_bank_Zend_Mail_Storage_Exception
181
- */
182
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
183
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
184
-
185
- throw new mail_bank_Zend_Mail_Storage_Exception('not implemented');
186
  }
187
  $messagePos = $this->_getPos($id);
188
  // TODO: toplines
@@ -201,14 +201,14 @@ class mail_bank_Zend_Mail_Storage_Mbox extends mail_bank_Zend_Mail_Storage_Abstr
201
 
202
  public function getRawContent($id, $part = null) {
203
  if ($part !== null) {
204
- // TODO: implement
205
- /**
206
- * @see mail_bank_Zend_Mail_Storage_Exception
207
- */
208
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
209
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
210
-
211
- throw new mail_bank_Zend_Mail_Storage_Exception('not implemented');
212
  }
213
  $messagePos = $this->_getPos($id);
214
  return stream_get_contents($this->_fh, $messagePos['end'] - $messagePos['separator'], $messagePos['separator']);
@@ -224,17 +224,17 @@ class mail_bank_Zend_Mail_Storage_Mbox extends mail_bank_Zend_Mail_Storage_Abstr
224
  */
225
  public function __construct($params) {
226
  if (is_array($params)) {
227
- $params = (object) $params;
228
  }
229
 
230
  if (!isset($params->filename) /* || mail_bank_Zend_Loader::isReadable($params['filename']) */) {
231
- /**
232
- * @see mail_bank_Zend_Mail_Storage_Exception
233
- */
234
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
235
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
236
 
237
- throw new mail_bank_Zend_Mail_Storage_Exception('no valid filename given in params');
238
  }
239
 
240
  $this->_openMboxFile($params->filename);
@@ -253,23 +253,23 @@ class mail_bank_Zend_Mail_Storage_Mbox extends mail_bank_Zend_Mail_Storage_Abstr
253
  */
254
  protected function _isMboxFile($file, $fileIsString = true) {
255
  if ($fileIsString) {
256
- $file = @fopen($file, 'r');
257
- if (!$file) {
258
- return false;
259
- }
260
  } else {
261
- fseek($file, 0);
262
  }
263
 
264
  $result = false;
265
 
266
  $line = fgets($file);
267
  if (strpos($line, 'From ') === 0) {
268
- $result = true;
269
  }
270
 
271
  if ($fileIsString) {
272
- @fclose($file);
273
  }
274
 
275
  return $result;
@@ -284,51 +284,51 @@ class mail_bank_Zend_Mail_Storage_Mbox extends mail_bank_Zend_Mail_Storage_Abstr
284
  */
285
  protected function _openMboxFile($filename) {
286
  if ($this->_fh) {
287
- $this->close();
288
  }
289
 
290
  $this->_fh = @fopen($filename, 'r');
291
  if (!$this->_fh) {
292
- /**
293
- * @see mail_bank_Zend_Mail_Storage_Exception
294
- */
295
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
296
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
297
 
298
- throw new mail_bank_Zend_Mail_Storage_Exception('cannot open mbox file');
299
  }
300
  $this->_filename = $filename;
301
  $this->_filemtime = filemtime($this->_filename);
302
 
303
  if (!$this->_isMboxFile($this->_fh, false)) {
304
- @fclose($this->_fh);
305
- /**
306
- * @see mail_bank_Zend_Mail_Storage_Exception
307
- */
308
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
309
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
310
-
311
- throw new mail_bank_Zend_Mail_Storage_Exception('file is not a valid mbox format');
312
  }
313
 
314
  $messagePos = array('start' => ftell($this->_fh), 'separator' => 0, 'end' => 0);
315
  while (($line = fgets($this->_fh)) !== false) {
316
- if (strpos($line, 'From ') === 0) {
317
- $messagePos['end'] = ftell($this->_fh) - strlen($line) - 2; // + newline
318
- if (!$messagePos['separator']) {
319
- $messagePos['separator'] = $messagePos['end'];
320
- }
321
- $this->_positions[] = $messagePos;
322
- $messagePos = array('start' => ftell($this->_fh), 'separator' => 0, 'end' => 0);
323
- }
324
- if (!$messagePos['separator'] && !trim($line)) {
325
- $messagePos['separator'] = ftell($this->_fh);
326
- }
327
  }
328
 
329
  $messagePos['end'] = ftell($this->_fh);
330
  if (!$messagePos['separator']) {
331
- $messagePos['separator'] = $messagePos['end'];
332
  }
333
  $this->_positions[] = $messagePos;
334
  }
@@ -364,7 +364,7 @@ class mail_bank_Zend_Mail_Storage_Mbox extends mail_bank_Zend_Mail_Storage_Abstr
364
  * @see mail_bank_Zend_Mail_Storage_Exception
365
  */
366
  if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
367
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
368
 
369
  throw new mail_bank_Zend_Mail_Storage_Exception('mbox is read-only');
370
  }
@@ -382,9 +382,9 @@ class mail_bank_Zend_Mail_Storage_Mbox extends mail_bank_Zend_Mail_Storage_Abstr
382
  */
383
  public function getUniqueId($id = null) {
384
  if ($id) {
385
- // check if id exists
386
- $this->_getPos($id);
387
- return $id;
388
  }
389
 
390
  $range = range(1, $this->countMessages());
@@ -429,19 +429,19 @@ class mail_bank_Zend_Mail_Storage_Mbox extends mail_bank_Zend_Mail_Storage_Abstr
429
  */
430
  public function __wakeup() {
431
  if ($this->_filemtime != @filemtime($this->_filename)) {
432
- $this->close();
433
- $this->_openMboxFile($this->_filename);
434
  } else {
435
- $this->_fh = @fopen($this->_filename, 'r');
436
- if (!$this->_fh) {
437
- /**
438
- * @see mail_bank_Zend_Mail_Storage_Exception
439
- */
440
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
441
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
442
-
443
- throw new mail_bank_Zend_Mail_Storage_Exception('cannot open mbox file');
444
- }
445
  }
446
  }
447
 
99
  */
100
  public function getSize($id = 0) {
101
  if ($id) {
102
+ $pos = $this->_positions[$id - 1];
103
+ return $pos['end'] - $pos['start'];
104
  }
105
 
106
  $result = array();
107
  foreach ($this->_positions as $num => $pos) {
108
+ $result[$num + 1] = $pos['end'] - $pos['start'];
109
  }
110
 
111
  return $result;
120
  */
121
  protected function _getPos($id) {
122
  if (!isset($this->_positions[$id - 1])) {
123
+ /**
124
+ * @see mail_bank_Zend_Mail_Storage_Exception
125
+ */
126
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
127
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
128
 
129
+ throw new mail_bank_Zend_Mail_Storage_Exception('id does not exist');
130
  }
131
 
132
  return $this->_positions[$id - 1];
142
  public function getMessage($id) {
143
  // TODO that's ugly, would be better to let the message class decide
144
  if (strtolower($this->_messageClass) == 'mail_bank_zend_mail_message_file' || is_subclass_of($this->_messageClass, 'mail_bank_zend_mail_message_file')) {
145
+ // TODO top/body lines
146
+ $messagePos = $this->_getPos($id);
147
+ return new $this->_messageClass(array('file' => $this->_fh, 'startPos' => $messagePos['start'],
148
+ 'endPos' => $messagePos['end']));
149
  }
150
 
151
  $bodyLines = 0; // TODO: need a way to change that
153
  $message = $this->getRawHeader($id);
154
  // file pointer is after headers now
155
  if ($bodyLines) {
156
+ $message .= "\n";
157
+ while ($bodyLines-- && ftell($this->_fh) < $this->_positions[$id - 1]['end']) {
158
+ $message .= fgets($this->_fh);
159
+ }
160
  }
161
 
162
  return new $this->_messageClass(array('handler' => $this, 'id' => $id, 'headers' => $message));
175
 
176
  public function getRawHeader($id, $part = null, $topLines = 0) {
177
  if ($part !== null) {
178
+ // TODO: implement
179
+ /**
180
+ * @see mail_bank_Zend_Mail_Storage_Exception
181
+ */
182
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
183
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
184
+
185
+ throw new mail_bank_Zend_Mail_Storage_Exception('not implemented');
186
  }
187
  $messagePos = $this->_getPos($id);
188
  // TODO: toplines
201
 
202
  public function getRawContent($id, $part = null) {
203
  if ($part !== null) {
204
+ // TODO: implement
205
+ /**
206
+ * @see mail_bank_Zend_Mail_Storage_Exception
207
+ */
208
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
209
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
210
+
211
+ throw new mail_bank_Zend_Mail_Storage_Exception('not implemented');
212
  }
213
  $messagePos = $this->_getPos($id);
214
  return stream_get_contents($this->_fh, $messagePos['end'] - $messagePos['separator'], $messagePos['separator']);
224
  */
225
  public function __construct($params) {
226
  if (is_array($params)) {
227
+ $params = (object) $params;
228
  }
229
 
230
  if (!isset($params->filename) /* || mail_bank_Zend_Loader::isReadable($params['filename']) */) {
231
+ /**
232
+ * @see mail_bank_Zend_Mail_Storage_Exception
233
+ */
234
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
235
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
236
 
237
+ throw new mail_bank_Zend_Mail_Storage_Exception('no valid filename given in params');
238
  }
239
 
240
  $this->_openMboxFile($params->filename);
253
  */
254
  protected function _isMboxFile($file, $fileIsString = true) {
255
  if ($fileIsString) {
256
+ $file = @fopen($file, 'r');
257
+ if (!$file) {
258
+ return false;
259
+ }
260
  } else {
261
+ fseek($file, 0);
262
  }
263
 
264
  $result = false;
265
 
266
  $line = fgets($file);
267
  if (strpos($line, 'From ') === 0) {
268
+ $result = true;
269
  }
270
 
271
  if ($fileIsString) {
272
+ @fclose($file);
273
  }
274
 
275
  return $result;
284
  */
285
  protected function _openMboxFile($filename) {
286
  if ($this->_fh) {
287
+ $this->close();
288
  }
289
 
290
  $this->_fh = @fopen($filename, 'r');
291
  if (!$this->_fh) {
292
+ /**
293
+ * @see mail_bank_Zend_Mail_Storage_Exception
294
+ */
295
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
296
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
297
 
298
+ throw new mail_bank_Zend_Mail_Storage_Exception('cannot open mbox file');
299
  }
300
  $this->_filename = $filename;
301
  $this->_filemtime = filemtime($this->_filename);
302
 
303
  if (!$this->_isMboxFile($this->_fh, false)) {
304
+ @fclose($this->_fh);
305
+ /**
306
+ * @see mail_bank_Zend_Mail_Storage_Exception
307
+ */
308
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
309
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
310
+
311
+ throw new mail_bank_Zend_Mail_Storage_Exception('file is not a valid mbox format');
312
  }
313
 
314
  $messagePos = array('start' => ftell($this->_fh), 'separator' => 0, 'end' => 0);
315
  while (($line = fgets($this->_fh)) !== false) {
316
+ if (strpos($line, 'From ') === 0) {
317
+ $messagePos['end'] = ftell($this->_fh) - strlen($line) - 2; // + newline
318
+ if (!$messagePos['separator']) {
319
+ $messagePos['separator'] = $messagePos['end'];
320
+ }
321
+ $this->_positions[] = $messagePos;
322
+ $messagePos = array('start' => ftell($this->_fh), 'separator' => 0, 'end' => 0);
323
+ }
324
+ if (!$messagePos['separator'] && !trim($line)) {
325
+ $messagePos['separator'] = ftell($this->_fh);
326
+ }
327
  }
328
 
329
  $messagePos['end'] = ftell($this->_fh);
330
  if (!$messagePos['separator']) {
331
+ $messagePos['separator'] = $messagePos['end'];
332
  }
333
  $this->_positions[] = $messagePos;
334
  }
364
  * @see mail_bank_Zend_Mail_Storage_Exception
365
  */
366
  if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
367
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
368
 
369
  throw new mail_bank_Zend_Mail_Storage_Exception('mbox is read-only');
370
  }
382
  */
383
  public function getUniqueId($id = null) {
384
  if ($id) {
385
+ // check if id exists
386
+ $this->_getPos($id);
387
+ return $id;
388
  }
389
 
390
  $range = range(1, $this->countMessages());
429
  */
430
  public function __wakeup() {
431
  if ($this->_filemtime != @filemtime($this->_filename)) {
432
+ $this->close();
433
+ $this->_openMboxFile($this->_filename);
434
  } else {
435
+ $this->_fh = @fopen($this->_filename, 'r');
436
+ if (!$this->_fh) {
437
+ /**
438
+ * @see mail_bank_Zend_Mail_Storage_Exception
439
+ */
440
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
441
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
442
+
443
+ throw new mail_bank_Zend_Mail_Storage_Exception('cannot open mbox file');
444
+ }
445
  }
446
  }
447
 
lib/zend/mail/storage/writable/maildir.php CHANGED
@@ -62,47 +62,47 @@ class mail_bank_Zend_Mail_Storage_Writable_Maildir extends mail_bank_Zend_Mail_S
62
  */
63
  public static function initMaildir($dir) {
64
  if (file_exists($dir)) {
65
- if (!is_dir($dir)) {
66
- /**
67
- * @see mail_bank_Zend_Mail_Storage_Exception
68
- */
69
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
70
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
71
 
72
- throw new mail_bank_Zend_Mail_Storage_Exception('maildir must be a directory if already exists');
73
- }
74
  }
75
  else {
76
- if (!mkdir($dir)) {
77
- /**
78
- * @see mail_bank_Zend_Mail_Storage_Exception
79
- */
80
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
81
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
82
- $dir = dirname($dir);
83
- if (!file_exists($dir)) {
84
- throw new mail_bank_Zend_Mail_Storage_Exception("parent $dir not found");
85
- } else if (!is_dir($dir)) {
86
- throw new mail_bank_Zend_Mail_Storage_Exception("parent $dir not a directory");
87
- } else {
88
- throw new mail_bank_Zend_Mail_Storage_Exception('cannot create maildir');
89
- }
90
- }
91
  }
92
 
93
  foreach (array('cur', 'tmp', 'new') as $subdir) {
94
- if (!@mkdir($dir . DIRECTORY_SEPARATOR . $subdir)) {
95
- // ignore if dir exists (i.e. was already valid maildir or two processes try to create one)
96
- if (!file_exists($dir . DIRECTORY_SEPARATOR . $subdir)) {
97
- /**
98
- * @see mail_bank_Zend_Mail_Storage_Exception
99
- */
100
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
101
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
102
-
103
- throw new mail_bank_Zend_Mail_Storage_Exception('could not create subdir ' . $subdir);
104
- }
105
- }
106
  }
107
  }
108
 
@@ -116,11 +116,11 @@ class mail_bank_Zend_Mail_Storage_Writable_Maildir extends mail_bank_Zend_Mail_S
116
  */
117
  public function __construct($params) {
118
  if (is_array($params)) {
119
- $params = (object) $params;
120
  }
121
 
122
  if (!empty($params->create) && isset($params->dirname) && !file_exists($params->dirname . DIRECTORY_SEPARATOR . 'cur')) {
123
- self::initMaildir($params->dirname);
124
  }
125
 
126
  parent::__construct($params);
@@ -139,11 +139,11 @@ class mail_bank_Zend_Mail_Storage_Writable_Maildir extends mail_bank_Zend_Mail_S
139
  */
140
  public function createFolder($name, $parentFolder = null) {
141
  if ($parentFolder instanceof mail_bank_Zend_Mail_Storage_Folder) {
142
- $folder = $parentFolder->getGlobalName() . $this->_delim . $name;
143
  } else if ($parentFolder != null) {
144
- $folder = rtrim($parentFolder, $this->_delim) . $this->_delim . $name;
145
  } else {
146
- $folder = $name;
147
  }
148
 
149
  $folder = trim($folder, $this->_delim);
@@ -151,68 +151,68 @@ class mail_bank_Zend_Mail_Storage_Writable_Maildir extends mail_bank_Zend_Mail_S
151
  // first we check if we try to create a folder that does exist
152
  $exists = null;
153
  try {
154
- $exists = $this->getFolders($folder);
155
  } catch (mail_bank_Zend_Mail_Exception $e) {
156
- // ok
157
  }
158
  if ($exists) {
159
- /**
160
- * @see mail_bank_Zend_Mail_Storage_Exception
161
- */
162
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
163
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
164
 
165
- throw new mail_bank_Zend_Mail_Storage_Exception('folder already exists');
166
  }
167
 
168
  if (strpos($folder, $this->_delim . $this->_delim) !== false) {
169
- /**
170
- * @see mail_bank_Zend_Mail_Storage_Exception
171
- */
172
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
173
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
174
 
175
- throw new mail_bank_Zend_Mail_Storage_Exception('invalid name - folder parts may not be empty');
176
  }
177
 
178
  if (strpos($folder, 'INBOX' . $this->_delim) === 0) {
179
- $folder = substr($folder, 6);
180
  }
181
 
182
  $fulldir = $this->_rootdir . '.' . $folder;
183
 
184
  // check if we got tricked and would create a dir outside of the rootdir or not as direct child
185
  if (strpos($folder, DIRECTORY_SEPARATOR) !== false || strpos($folder, '/') !== false || dirname($fulldir) . DIRECTORY_SEPARATOR != $this->_rootdir) {
186
- /**
187
- * @see mail_bank_Zend_Mail_Storage_Exception
188
- */
189
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
190
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
191
 
192
- throw new mail_bank_Zend_Mail_Storage_Exception('invalid name - no directory seprator allowed in folder name');
193
  }
194
 
195
  // has a parent folder?
196
  $parent = null;
197
  if (strpos($folder, $this->_delim)) {
198
- // let's see if the parent folder exists
199
- $parent = substr($folder, 0, strrpos($folder, $this->_delim));
200
- try {
201
- $this->getFolders($parent);
202
- } catch (mail_bank_Zend_Mail_Exception $e) {
203
- // does not - create parent folder
204
- $this->createFolder($parent);
205
- }
206
  }
207
 
208
  if (!@mkdir($fulldir) || !@mkdir($fulldir . DIRECTORY_SEPARATOR . 'cur')) {
209
- /**
210
- * @see mail_bank_Zend_Mail_Storage_Exception
211
- */
212
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
213
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
214
 
215
- throw new mail_bank_Zend_Mail_Storage_Exception('error while creating new folder, may be created incompletly');
216
  }
217
 
218
  mkdir($fulldir . DIRECTORY_SEPARATOR . 'new');
@@ -239,98 +239,98 @@ class mail_bank_Zend_Mail_Storage_Writable_Maildir extends mail_bank_Zend_Mail_S
239
  // directory name and it should be ignored as long as other processes obey the standard.
240
 
241
  if ($name instanceof mail_bank_Zend_Mail_Storage_Folder) {
242
- $name = $name->getGlobalName();
243
  }
244
 
245
  $name = trim($name, $this->_delim);
246
  if (strpos($name, 'INBOX' . $this->_delim) === 0) {
247
- $name = substr($name, 6);
248
  }
249
 
250
  // check if folder exists and has no children
251
  if (!$this->getFolders($name)->isLeaf()) {
252
- /**
253
- * @see mail_bank_Zend_Mail_Storage_Exception
254
- */
255
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
256
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
257
 
258
- throw new mail_bank_Zend_Mail_Storage_Exception('delete children first');
259
  }
260
 
261
  if ($name == 'INBOX' || $name == DIRECTORY_SEPARATOR || $name == '/') {
262
- /**
263
- * @see mail_bank_Zend_Mail_Storage_Exception
264
- */
265
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
266
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
267
 
268
- throw new mail_bank_Zend_Mail_Storage_Exception('wont delete INBOX');
269
  }
270
 
271
  if ($name == $this->getCurrentFolder()) {
272
- /**
273
- * @see mail_bank_Zend_Mail_Storage_Exception
274
- */
275
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
276
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
277
 
278
- throw new mail_bank_Zend_Mail_Storage_Exception('wont delete selected folder');
279
  }
280
 
281
  foreach (array('tmp', 'new', 'cur', '.') as $subdir) {
282
- $dir = $this->_rootdir . '.' . $name . DIRECTORY_SEPARATOR . $subdir;
283
- if (!file_exists($dir)) {
284
- continue;
285
- }
286
- $dh = opendir($dir);
287
- if (!$dh) {
288
- /**
289
- * @see mail_bank_Zend_Mail_Storage_Exception
290
- */
291
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
292
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
293
-
294
- throw new mail_bank_Zend_Mail_Storage_Exception("error opening $subdir");
295
- }
296
- while (($entry = readdir($dh)) !== false) {
297
- if ($entry == '.' || $entry == '..') {
298
- continue;
299
- }
300
- if (!unlink($dir . DIRECTORY_SEPARATOR . $entry)) {
301
- /**
302
- * @see mail_bank_Zend_Mail_Storage_Exception
303
- */
304
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
305
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
306
-
307
- throw new mail_bank_Zend_Mail_Storage_Exception("error cleaning $subdir");
308
- }
309
- }
310
- closedir($dh);
311
- if ($subdir !== '.') {
312
- if (!rmdir($dir)) {
313
- /**
314
- * @see mail_bank_Zend_Mail_Storage_Exception
315
- */
316
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
317
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
318
-
319
- throw new mail_bank_Zend_Mail_Storage_Exception("error removing $subdir");
320
- }
321
- }
322
  }
323
 
324
  if (!rmdir($this->_rootdir . '.' . $name)) {
325
- // at least we should try to make it a valid maildir again
326
- mkdir($this->_rootdir . '.' . $name . DIRECTORY_SEPARATOR . 'cur');
327
- /**
328
- * @see mail_bank_Zend_Mail_Storage_Exception
329
- */
330
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
331
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
332
 
333
- throw new mail_bank_Zend_Mail_Storage_Exception("error removing maindir");
334
  }
335
 
336
  $parent = strpos($name, $this->_delim) ? substr($name, 0, strrpos($name, $this->_delim)) : null;
@@ -352,76 +352,76 @@ class mail_bank_Zend_Mail_Storage_Writable_Maildir extends mail_bank_Zend_Mail_S
352
  // TODO: This is also not atomar and has similar problems as removeFolder()
353
 
354
  if ($oldName instanceof mail_bank_Zend_Mail_Storage_Folder) {
355
- $oldName = $oldName->getGlobalName();
356
  }
357
 
358
  $oldName = trim($oldName, $this->_delim);
359
  if (strpos($oldName, 'INBOX' . $this->_delim) === 0) {
360
- $oldName = substr($oldName, 6);
361
  }
362
 
363
  $newName = trim($newName, $this->_delim);
364
  if (strpos($newName, 'INBOX' . $this->_delim) === 0) {
365
- $newName = substr($newName, 6);
366
  }
367
 
368
  if (strpos($newName, $oldName . $this->_delim) === 0) {
369
- /**
370
- * @see mail_bank_Zend_Mail_Storage_Exception
371
- */
372
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
373
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
374
 
375
- throw new mail_bank_Zend_Mail_Storage_Exception('new folder cannot be a child of old folder');
376
  }
377
 
378
  // check if folder exists and has no children
379
  $folder = $this->getFolders($oldName);
380
 
381
  if ($oldName == 'INBOX' || $oldName == DIRECTORY_SEPARATOR || $oldName == '/') {
382
- /**
383
- * @see mail_bank_Zend_Mail_Storage_Exception
384
- */
385
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
386
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
387
 
388
- throw new mail_bank_Zend_Mail_Storage_Exception('wont rename INBOX');
389
  }
390
 
391
  if ($oldName == $this->getCurrentFolder()) {
392
- /**
393
- * @see mail_bank_Zend_Mail_Storage_Exception
394
- */
395
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
396
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
397
 
398
- throw new mail_bank_Zend_Mail_Storage_Exception('wont rename selected folder');
399
  }
400
 
401
  $newdir = $this->createFolder($newName);
402
 
403
  if (!$folder->isLeaf()) {
404
- foreach ($folder as $k => $v) {
405
- $this->renameFolder($v->getGlobalName(), $newName . $this->_delim . $k);
406
- }
407
  }
408
 
409
  $olddir = $this->_rootdir . '.' . $folder;
410
  foreach (array('tmp', 'new', 'cur') as $subdir) {
411
- $subdir = DIRECTORY_SEPARATOR . $subdir;
412
- if (!file_exists($olddir . $subdir)) {
413
- continue;
414
- }
415
- // using copy or moving files would be even better - but also much slower
416
- if (!rename($olddir . $subdir, $newdir . $subdir)) {
417
- /**
418
- * @see mail_bank_Zend_Mail_Storage_Exception
419
- */
420
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
421
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
422
-
423
- throw new mail_bank_Zend_Mail_Storage_Exception('error while moving ' . $subdir);
424
- }
425
  }
426
  // create a dummy if removing fails - otherwise we can't read it next time
427
  mkdir($olddir . DIRECTORY_SEPARATOR . 'cur');
@@ -463,20 +463,20 @@ class mail_bank_Zend_Mail_Storage_Writable_Maildir extends mail_bank_Zend_Mail_S
463
  */
464
  protected function _createTmpFile($folder = 'INBOX') {
465
  if ($folder == 'INBOX') {
466
- $tmpdir = $this->_rootdir . DIRECTORY_SEPARATOR . 'tmp' . DIRECTORY_SEPARATOR;
467
  } else {
468
- $tmpdir = $this->_rootdir . '.' . $folder . DIRECTORY_SEPARATOR . 'tmp' . DIRECTORY_SEPARATOR;
469
  }
470
  if (!file_exists($tmpdir)) {
471
- if (!mkdir($tmpdir)) {
472
- /**
473
- * @see mail_bank_Zend_Mail_Storage_Exception
474
- */
475
- if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
476
- require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
477
 
478
- throw new mail_bank_Zend_Mail_Storage_Exception('problems creating tmp dir');
479
- }
480
  }
481
 
482
  // we should retry to create a unique id if a file with the same name exists
@@ -486,34 +486,34 @@ class mail_bank_Zend_Mail_Storage_Writable_Maildir extends mail_bank_Zend_Mail_S
486
  // normally we should have a valid unique name after the first try, we're just following the "standard" here
487
  $max_tries = 5;
488
  for ($i = 0; $i < $max_tries; ++$i) {
489
- $uniq = $this->_createUniqueId();
490
- if (!file_exists($tmpdir . $uniq)) {
491
- // here is the race condition! - as defined in the standard
492
- // to avoid having a long time between stat()ing the file and creating it we're opening it here
493
- // to mark the filename as taken
494
- $fh = fopen($tmpdir . $uniq, 'w');
495
- if (!$fh) {
496
- /**
497
- * @see mail_bank_Zend_Mail_Storage_Exception
62
  */
63
  public static function initMaildir($dir) {
64
  if (file_exists($dir)) {
65
+ if (!is_dir($dir)) {
66
+ /**
67
+ * @see mail_bank_Zend_Mail_Storage_Exception
68
+ */
69
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
70
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
71
 
72
+ throw new mail_bank_Zend_Mail_Storage_Exception('maildir must be a directory if already exists');
73
+ }
74
  }
75
  else {
76
+ if (!mkdir($dir)) {
77
+ /**
78
+ * @see mail_bank_Zend_Mail_Storage_Exception
79
+ */
80
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
81
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
82
+ $dir = dirname($dir);
83
+ if (!file_exists($dir)) {
84
+ throw new mail_bank_Zend_Mail_Storage_Exception("parent $dir not found");
85
+ } else if (!is_dir($dir)) {
86
+ throw new mail_bank_Zend_Mail_Storage_Exception("parent $dir not a directory");
87
+ } else {
88
+ throw new mail_bank_Zend_Mail_Storage_Exception('cannot create maildir');
89
+ }
90
+ }
91
  }
92
 
93
  foreach (array('cur', 'tmp', 'new') as $subdir) {
94
+ if (!@mkdir($dir . DIRECTORY_SEPARATOR . $subdir)) {
95
+ // ignore if dir exists (i.e. was already valid maildir or two processes try to create one)
96
+ if (!file_exists($dir . DIRECTORY_SEPARATOR . $subdir)) {
97
+ /**
98
+ * @see mail_bank_Zend_Mail_Storage_Exception
99
+ */
100
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
101
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
102
+
103
+ throw new mail_bank_Zend_Mail_Storage_Exception('could not create subdir ' . $subdir);
104
+ }
105
+ }
106
  }
107
  }
108
 
116
  */
117
  public function __construct($params) {
118
  if (is_array($params)) {
119
+ $params = (object) $params;
120
  }
121
 
122
  if (!empty($params->create) && isset($params->dirname) && !file_exists($params->dirname . DIRECTORY_SEPARATOR . 'cur')) {
123
+ self::initMaildir($params->dirname);
124
  }
125
 
126
  parent::__construct($params);
139
  */
140
  public function createFolder($name, $parentFolder = null) {
141
  if ($parentFolder instanceof mail_bank_Zend_Mail_Storage_Folder) {
142
+ $folder = $parentFolder->getGlobalName() . $this->_delim . $name;
143
  } else if ($parentFolder != null) {
144
+ $folder = rtrim($parentFolder, $this->_delim) . $this->_delim . $name;
145
  } else {
146
+ $folder = $name;
147
  }
148
 
149
  $folder = trim($folder, $this->_delim);
151
  // first we check if we try to create a folder that does exist
152
  $exists = null;
153
  try {
154
+ $exists = $this->getFolders($folder);
155
  } catch (mail_bank_Zend_Mail_Exception $e) {
156
+ // ok
157
  }
158
  if ($exists) {
159
+ /**
160
+ * @see mail_bank_Zend_Mail_Storage_Exception
161
+ */
162
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
163
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
164
 
165
+ throw new mail_bank_Zend_Mail_Storage_Exception('folder already exists');
166
  }
167
 
168
  if (strpos($folder, $this->_delim . $this->_delim) !== false) {
169
+ /**
170
+ * @see mail_bank_Zend_Mail_Storage_Exception
171
+ */
172
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
173
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
174
 
175
+ throw new mail_bank_Zend_Mail_Storage_Exception('invalid name - folder parts may not be empty');
176
  }
177
 
178
  if (strpos($folder, 'INBOX' . $this->_delim) === 0) {
179
+ $folder = substr($folder, 6);
180
  }
181
 
182
  $fulldir = $this->_rootdir . '.' . $folder;
183
 
184
  // check if we got tricked and would create a dir outside of the rootdir or not as direct child
185
  if (strpos($folder, DIRECTORY_SEPARATOR) !== false || strpos($folder, '/') !== false || dirname($fulldir) . DIRECTORY_SEPARATOR != $this->_rootdir) {
186
+ /**
187
+ * @see mail_bank_Zend_Mail_Storage_Exception
188
+ */
189
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
190
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
191
 
192
+ throw new mail_bank_Zend_Mail_Storage_Exception('invalid name - no directory seprator allowed in folder name');
193
  }
194
 
195
  // has a parent folder?
196
  $parent = null;
197
  if (strpos($folder, $this->_delim)) {
198
+ // let's see if the parent folder exists
199
+ $parent = substr($folder, 0, strrpos($folder, $this->_delim));
200
+ try {
201
+ $this->getFolders($parent);
202
+ } catch (mail_bank_Zend_Mail_Exception $e) {
203
+ // does not - create parent folder
204
+ $this->createFolder($parent);
205
+ }
206
  }
207
 
208
  if (!@mkdir($fulldir) || !@mkdir($fulldir . DIRECTORY_SEPARATOR . 'cur')) {
209
+ /**
210
+ * @see mail_bank_Zend_Mail_Storage_Exception
211
+ */
212
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
213
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
214
 
215
+ throw new mail_bank_Zend_Mail_Storage_Exception('error while creating new folder, may be created incompletly');
216
  }
217
 
218
  mkdir($fulldir . DIRECTORY_SEPARATOR . 'new');
239
  // directory name and it should be ignored as long as other processes obey the standard.
240
 
241
  if ($name instanceof mail_bank_Zend_Mail_Storage_Folder) {
242
+ $name = $name->getGlobalName();
243
  }
244
 
245
  $name = trim($name, $this->_delim);
246
  if (strpos($name, 'INBOX' . $this->_delim) === 0) {
247
+ $name = substr($name, 6);
248
  }
249
 
250
  // check if folder exists and has no children
251
  if (!$this->getFolders($name)->isLeaf()) {
252
+ /**
253
+ * @see mail_bank_Zend_Mail_Storage_Exception
254
+ */
255
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
256
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
257
 
258
+ throw new mail_bank_Zend_Mail_Storage_Exception('delete children first');
259
  }
260
 
261
  if ($name == 'INBOX' || $name == DIRECTORY_SEPARATOR || $name == '/') {
262
+ /**
263
+ * @see mail_bank_Zend_Mail_Storage_Exception
264
+ */
265
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
266
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
267
 
268
+ throw new mail_bank_Zend_Mail_Storage_Exception('wont delete INBOX');
269
  }
270
 
271
  if ($name == $this->getCurrentFolder()) {
272
+ /**
273
+ * @see mail_bank_Zend_Mail_Storage_Exception
274
+ */
275
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
276
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
277
 
278
+ throw new mail_bank_Zend_Mail_Storage_Exception('wont delete selected folder');
279
  }
280
 
281
  foreach (array('tmp', 'new', 'cur', '.') as $subdir) {
282
+ $dir = $this->_rootdir . '.' . $name . DIRECTORY_SEPARATOR . $subdir;
283
+ if (!file_exists($dir)) {
284
+ continue;
285
+ }
286
+ $dh = opendir($dir);
287
+ if (!$dh) {
288
+ /**
289
+ * @see mail_bank_Zend_Mail_Storage_Exception
290
+ */
291
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
292
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
293
+
294
+ throw new mail_bank_Zend_Mail_Storage_Exception("error opening $subdir");
295
+ }
296
+ while (($entry = readdir($dh)) !== false) {
297
+ if ($entry == '.' || $entry == '..') {
298
+ continue;
299
+ }
300
+ if (!unlink($dir . DIRECTORY_SEPARATOR . $entry)) {
301
+ /**
302
+ * @see mail_bank_Zend_Mail_Storage_Exception
303
+ */
304
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
305
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
306
+
307
+ throw new mail_bank_Zend_Mail_Storage_Exception("error cleaning $subdir");
308
+ }
309
+ }
310
+ closedir($dh);
311
+ if ($subdir !== '.') {
312
+ if (!rmdir($dir)) {
313
+ /**
314
+ * @see mail_bank_Zend_Mail_Storage_Exception
315
+ */
316
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
317
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
318
+
319
+ throw new mail_bank_Zend_Mail_Storage_Exception("error removing $subdir");
320
+ }
321
+ }
322
  }
323
 
324
  if (!rmdir($this->_rootdir . '.' . $name)) {
325
+ // at least we should try to make it a valid maildir again
326
+ mkdir($this->_rootdir . '.' . $name . DIRECTORY_SEPARATOR . 'cur');
327
+ /**
328
+ * @see mail_bank_Zend_Mail_Storage_Exception
329
+ */
330
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
331
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
332
 
333
+ throw new mail_bank_Zend_Mail_Storage_Exception("error removing maindir");
334
  }
335
 
336
  $parent = strpos($name, $this->_delim) ? substr($name, 0, strrpos($name, $this->_delim)) : null;
352
  // TODO: This is also not atomar and has similar problems as removeFolder()
353
 
354
  if ($oldName instanceof mail_bank_Zend_Mail_Storage_Folder) {
355
+ $oldName = $oldName->getGlobalName();
356
  }
357
 
358
  $oldName = trim($oldName, $this->_delim);
359
  if (strpos($oldName, 'INBOX' . $this->_delim) === 0) {
360
+ $oldName = substr($oldName, 6);
361
  }
362
 
363
  $newName = trim($newName, $this->_delim);
364
  if (strpos($newName, 'INBOX' . $this->_delim) === 0) {
365
+ $newName = substr($newName, 6);
366
  }
367
 
368
  if (strpos($newName, $oldName . $this->_delim) === 0) {
369
+ /**
370
+ * @see mail_bank_Zend_Mail_Storage_Exception
371
+ */
372
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
373
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
374
 
375
+ throw new mail_bank_Zend_Mail_Storage_Exception('new folder cannot be a child of old folder');
376
  }
377
 
378
  // check if folder exists and has no children
379
  $folder = $this->getFolders($oldName);
380
 
381
  if ($oldName == 'INBOX' || $oldName == DIRECTORY_SEPARATOR || $oldName == '/') {
382
+ /**
383
+ * @see mail_bank_Zend_Mail_Storage_Exception
384
+ */
385
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
386
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
387
 
388
+ throw new mail_bank_Zend_Mail_Storage_Exception('wont rename INBOX');
389
  }
390
 
391
  if ($oldName == $this->getCurrentFolder()) {
392
+ /**
393
+ * @see mail_bank_Zend_Mail_Storage_Exception
394
+ */
395
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
396
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
397
 
398
+ throw new mail_bank_Zend_Mail_Storage_Exception('wont rename selected folder');
399
  }
400
 
401
  $newdir = $this->createFolder($newName);
402
 
403
  if (!$folder->isLeaf()) {
404
+ foreach ($folder as $k => $v) {
405
+ $this->renameFolder($v->getGlobalName(), $newName . $this->_delim . $k);
406
+ }
407
  }
408
 
409
  $olddir = $this->_rootdir . '.' . $folder;
410
  foreach (array('tmp', 'new', 'cur') as $subdir) {
411
+ $subdir = DIRECTORY_SEPARATOR . $subdir;
412
+ if (!file_exists($olddir . $subdir)) {
413
+ continue;
414
+ }
415
+ // using copy or moving files would be even better - but also much slower
416
+ if (!rename($olddir . $subdir, $newdir . $subdir)) {
417
+ /**
418
+ * @see mail_bank_Zend_Mail_Storage_Exception
419
+ */
420
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
421
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
422
+
423
+ throw new mail_bank_Zend_Mail_Storage_Exception('error while moving ' . $subdir);
424
+ }
425
  }
426
  // create a dummy if removing fails - otherwise we can't read it next time
427
  mkdir($olddir . DIRECTORY_SEPARATOR . 'cur');
463
  */
464
  protected function _createTmpFile($folder = 'INBOX') {
465
  if ($folder == 'INBOX') {
466
+ $tmpdir = $this->_rootdir . DIRECTORY_SEPARATOR . 'tmp' . DIRECTORY_SEPARATOR;
467
  } else {
468
+ $tmpdir = $this->_rootdir . '.' . $folder . DIRECTORY_SEPARATOR . 'tmp' . DIRECTORY_SEPARATOR;
469
  }
470
  if (!file_exists($tmpdir)) {
471
+ if (!mkdir($tmpdir)) {
472
+ /**
473
+ * @see mail_bank_Zend_Mail_Storage_Exception
474
+ */
475
+ if (file_exists(MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php'))
476
+ require_once MAIL_BANK_DIR_PATH . 'lib/zend/mail/storage/exception.php';
477
 
478
+ throw new mail_bank_Zend_Mail_Storage_Exception('problems creating tmp dir');
479
+ }
480
  }
481
 
482
  // we should retry to create a unique id if a file with the same name exists
486
  // normally we should have a valid unique name after the first try, we're just following the "standard" here
487
  $max_tries = 5;
488
  for ($i = 0; $i < $max_tries; ++$i) {