Browse code

removed files to add contacts lits and recording and to upgrade the SIP.js library

DoubleBastionAdmin authored on 21/05/2024 01:25:05
Showing 28 changed files
1 1
deleted file mode 100644
... ...
@@ -1,57 +0,0 @@
1
-======= CHANGELOG =======
2
-
3
-Versions:
4
-
5
-== 1.0.0 - 2022-1-27 ==
6
-* Initial release.
7
-
8
-== 1.0.1 - 2022-3-3 ==
9
-* Added screenshot image and made minor text changes.
10
-
11
-== 1.0.2 - 2022-3-4 ==
12
-* Changed screenshot image.
13
-
14
-== 1.0.3 - 2022-3-30 ==
15
-* Changed presentation text.
16
-
17
-== 1.0.4 - 2022-4-19 ==
18
-* Changed the URL of the pop-up window, to make it work when Nextcloud is served on a subdirectory.
19
-* Changed image displayed on initial screen.
20
-* Changed presentation text.
21
-
22
-== 1.0.5 - 2022-5-9 ==
23
-* Changed syntax of SQL queries and encryption function.
24
-* Modified pop-up window URL.
25
-
26
-== 1.0.6 - 2022-8-20 ==
27
-* Changed presentation text.
28
-
29
-== 1.0.7 - 2022-9-22 ==
30
-* Fixed error when not entering a STUN server on the Settings page.
31
-* Changed presentation text.
32
-
33
-== 1.0.8 - 2022-10-27 ==
34
-* Changed CSS settings to match the modifications introduced in Nextcloud 25.
35
-* Modified presentation text.
36
-
37
-== 1.0.9 - 2022-12-3 ==
38
-* Minor changes to certain SQL queries and minor css change.
39
-
40
-== 1.1.0 - 2023-5-31 ==
41
-* Made app available for Nextcloud 26.
42
-
43
-== 1.1.1 - 2023-10-30 ==
44
-* Marked the app as compatible with Nextcloud 27.
45
-
46
-== 1.1.2 - 2024-1-8 ==
47
-* Added the debug logging checkbox, the 'Available phone number(s)' 
48
-  field and the 'Default phone number for outgoing calls' field, on the settings page.
49
-* Added the 'From' drop-down list on the phone window, to allow the user to choose
50
-  the phone number to call from.
51
-* Added the 'fonts' directory and stored the 'Open Sans' and 'Inter' fonts inside it.
52
-* Made small CSS changes and edited app presentation text.
53
-* Marked the app as compatible with Nextcloud 28.
54
-
55
-== 1.1.3 - 2024-1-10 ==
56
-* Fixed 'Double click to call' bug.
57
-* Made minor CSS changes.
58 0
deleted file mode 100644
... ...
@@ -1,128 +0,0 @@
1
-<span style="display:block;height:15px!important"></span>
2
-<p align="center"><img src="https://git.doublebastion.com/sip-trip-phone/raw/develop/img/sip_trip_phone_logo.png" alt="SIP Trip Phone" width="171px" height="119px"/></p>
3
-
4
-<span style="display:block;height:20px!important"></span>
5
-
6
-**SIP Trip Phone is a browser phone in the form of a Nextcloud application. It can connect to SIP providers via Asterisk or directly.**
7
-
8
-It can be used in conjunction with Asterisk, to benefit from the control, autonomy and advanced PBX features offered by Asterisk, or without Asterisk, if it's connected directly to the 
9
-SIP provider. For calls to and from regular phone numbers, a SIP provider like Telnyx or Localphone is needed and a real phone number acquired from that provider. If Asterisk 
10
-is used, it's recommended to be Asterisk version 18.0.0 LTS and it has to be installed on a VPS or dedicated server, as explained in the documentation mentioned in the 'Installation' 
11
-section from below. The web server has to be configured to allow access to a specific directory and to proxy WebSocket traffic to a specific URL, as explained in the documentation. 
12
-Not all SIP providers allow connections from external Asterisk servers or direct connections from web applications that use SIP over WebSocket, like SIP Trip Phone. Thus, you can 
13
-connect this application to Telnyx, Localphone, Twilio, Flowroute, Vonage, etc. via an Asterisk server, but if you want to connect it directly to the SIP provider, from the 5 
14
-mentioned providers, only Telnyx will work, because the others don't allow direct connections from web applications using SIP over WebSocket. SIP Trip Phone is based on the ctxSip 
15
-phone.
16
-
17
-<span style="display:block;height:20px!important"></span>
18
-
19
-## Features
20
-<span style="display:block;height:10px!important"></span>
21
-
22
-* 📞 SIP Trip Phone allows making and receiving calls to/from any mobile or landline phone at lower rates than with regular phones. It is known that VoIP phone calls are up to 70% cheaper than regular phone calls. International VoIP phone calls can cost even 90% less than regular phone calls.
23
-
24
-* 🌐 You can acquire phone numbers in countries of your choice and make cheap international phone calls to receivers in those countries. When calling you back on those numbers, the receivers will pay as for local calls.
25
-
26
-* 🆓 You can make free calls over the Internet between extensions configured on the underlying Asterisk server.
27
-
28
-* ☎️ SIP Trip Phone logs recent phone calls and their duration and allows holding, muting and transferring phone calls.
29
-
30
-* 📑 When using Asterisk, SIP Trip Phone allows choosing any available phone number as the 'From' number for outgoing calls.
31
-
32
-* 🚩 Incoming calls are signaled by on-screen notifications.
33
-
34
-* 📃 Once you open SIP Trip Phone, you can use it even if you are logged out of Nextcloud.
35
-
36
-* 💻 If Asterisk is used, on the underlying Asterisk server you can implement an IVR (Interactive Voice Response or 'voice menu') and many advanced PBX features such as voicemail, queue management, music on hold, number blacklisting, call recording, audio conference calls, etc.
37
-
38
-* 💰 The only ongoing cost is about $1 per month (depending on the country) for a phone number. No contracts.
39
-
40
-* 💸 Low per minute prices: if Asterisk is used, you can make calls within the US starting from $0.0050 per minute and receive calls with $0.0075 per minute or less (Telnyx), or $0.0060 per minute for outgoing calls and $0 for incoming calls (Localphone). If SIP Trip Phone is connected directly to Telnyx, you can make and receive phone calls with $0.0020 per minute in the US.
41
-
42
-Double Bastion is not affiliated with Telnyx, Localphone, Twilio, Flowroute or Vonage.
43
-
44
-### Donations
45
-
46
-* 🎁 [Donate](https://www.doublebastion.com/donations/)
47
-
48
-<span style="display:block;height:20px!important"></span>
49
-
50
-<p align="center">Initial screen</p>
51
-<span style="display:block;height:10px!important"></span>
52
-<span style="display:block;margin:auto;width:412px;">![Image of SIP Trip Phone Interface](https://git.doublebastion.com/sip-trip-phone/raw/develop/img/sip_trip_phone_initial_screen.png)</span>
53
-<span style="display:block;height:40px!important"></span>
54
-<p align="center">Dialpad</p>
55
-<span style="display:block;height:10px!important"></span>
56
-<span style="display:block;margin:auto;width:412px;">![Image of SIP Trip Phone Interface](https://git.doublebastion.com/sip-trip-phone/raw/develop/img/sip_trip_phone_dialpad.png)</span>
57
-<span style="display:block;height:40px!important"></span>
58
-<p align="center">Making calls</p>
59
-<span style="display:block;height:10px!important"></span>
60
-<span style="display:block;margin:auto;width:412px;">![Image of SIP Trip Phone Interface](https://git.doublebastion.com/sip-trip-phone/raw/develop/img/sip_trip_phone_calling.png)</span>
61
-<span style="display:block;height:40px!important"></span>
62
-<p align="center">Transferring calls</p>
63
-<span style="display:block;height:10px!important"></span>
64
-<span style="display:block;margin:auto;width:412px;">![Image of SIP Trip Phone Interface](https://git.doublebastion.com/sip-trip-phone/raw/develop/img/sip_trip_phone_hold.png)</span>
65
-<span style="display:block;height:40px!important"></span>
66
-
67
-## Browsers
68
-<span style="display:block;height:10px!important"></span>
69
-
70
-SIP Trip Phone works with all the major browsers.
71
-
72
-<span style="display:block;height:20px!important"></span>
73
-
74
-## Programming Languages
75
-<span style="display:block;height:10px!important"></span>
76
-
77
-SIP Trip Phone only uses PHP, SQL, jQuery, CSS and HTML. This means it's robust, efficient, light-weight and easy to maintain and debug.
78
-
79
-<span style="display:block;height:20px!important"></span>
80
-
81
-## Minimum Requirements
82
-<span style="display:block;height:10px!important"></span>
83
-
84
-- **Nextcloud 22+** has to be installed and properly configured, preferably by following the Install Nextcloud chapter in our guide.
85
-
86
-- **A telnyx.com or localphone.com account and a phone number** associated with it. You can use a SIP provider different from Telnyx or Localphone, but they have to allow direct connections from external Asterisk servers and/or from web applications that use SIP over WebSocket.
87
-
88
-If you decide to connect SIP Trip Phone to your SIP provider via Asterisk, you will need **Asterisk, preferably version 18.0.0 LTS** (with **chan_pjsip** enabled), installed on a VPS or 
89
-dedicated server. You can also install Coturn (version 4.5.1.1 or newer) as a STUN server, which facilitates connections when callers are behind routers.
90
-
91
-<span style="display:block;height:20px!important"></span>
92
-
93
-## Installation
94
-<span style="display:block;height:10px!important"></span>
95
-
96
-<a href="https://www.doublebastion.com/install-nextcloud/#install-sip-trip-phone" rel="noreferrer noopener" target="_blank">This chapter</a> of our Complete Guide to a Complete Linux Server 
97
-explains in detail how to install and use this application. It also contains the links to the chapters that describe how to install Asterisk and Coturn.
98
-
99
-SIP Trip Phone is a component of RED Scarf Suite. It can be installed and used alone, but if you want to install <a href="https://www.doublebastion.com/red-scarf-suite-components/" rel="noreferrer noopener" target="_blank">all 
100
-the components</a> of RED Scarf Suite, you can follow our <a href="https://www.doublebastion.com/free-server/complete-guide-to-a-complete-linux-server/" rel="noreferrer noopener" target="_blank">complete guide</a>.
101
-
102
-<span style="display:block;height:20px!important"></span>
103
-
104
-## Contribute
105
-<span style="display:block;height:10px!important"></span>
106
-
107
-This is the official git repository of SIP Trip Phone. The <a href="https://github.com/DoubleBastionAdmin/sip-trip-phone" rel="noreferrer noopener" target="_blank">GitHub SIP Trip Phone
108
-repository</a> is just a pointer to this repository. We don’t use GitHub for developing SIP Trip Phone because GitHub is owned by one of the companies that proved their disrespect for
109
-digital freedom over the years and because centralized services create autonomy and privacy issues, in spite of all the benefits.
110
-
111
-If you want to contribute code to this project, please submit <a href="https://git.doublebastion.com/sip-trip-phone/pullrequests/contrib" rel="noreferrer noopener" target="_blank">this form</a>, 
112
-mentioning your intended changes. We'll send you the credentials needed to push code to the "contrib" branch of this repository. After we review the changes, we can include them in the 
113
-project.
114
-
115
-Please post any bugs that are not security related, or feature requests, on the <a href="https://git.doublebastion.com/sip-trip-phone/issues/develop" rel="noreferrer noopener" target="_blank">
116
-issue tracker</a>. If you notice bugs related to security, don’t post them on the issue tracker; instead, send them to manager [at] doublebastion [dot] com .
117
-
118
-<span style="display:block;height:20px!important"></span>
119
-
120
-## License
121
-<span style="display:block;height:10px!important"></span>
122
-
123
-SIP Trip Phone as a whole is licensed under the GNU Affero General Public License Version 3. If you use SIP Trip Phone or distribute it in modified or unmodified form, you will need to comply with 
124
-the terms of the GNU Affero General Public License Version 3.
125
-
126
-This application is based on the ctxSip phone and the original copyright notice is included in the appropriate files.
127
-
128
-SIP Trip Phone includes libraries licensed under different free software licenses. These libraries contain their respective original copyright notices.
129 0
deleted file mode 100644
... ...
@@ -1,90 +0,0 @@
1
-<?xml version="1.0"?>
2
-<info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
3
-      xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd">
4
-    <id>sip_trip_phone</id>
5
-    <name>SIP Trip Phone</name>
6
-    <summary>Browser softphone</summary>
7
-    <description><![CDATA[
8
-A browser phone that can be connected to SIP providers via Asterisk or directly. It can be used in conjunction 
9
-with Asterisk, to benefit from the control, autonomy and advanced PBX features offered by Asterisk, or without 
10
-Asterisk, if it's connected directly to the SIP provider. For calls to and from regular phone numbers, a SIP 
11
-provider like Telnyx or Localphone is needed and a real phone number acquired from that provider. If Asterisk is 
12
-used, it's recommended to be Asterisk version 18.0.0 LTS and it has to be installed on a VPS or dedicated server, 
13
-as explained in the 'Admin documentation' linked on this page. The web server has to be configured to allow access 
14
-to a specific directory and to proxy WebSocket traffic to a specific URL, as explained in the 'Admin documentation'. 
15
-Not all SIP providers allow connections from external Asterisk servers or direct connections from web applications 
16
-that use SIP over WebSocket, like SIP Trip Phone. Thus, you can connect this application to Telnyx, Localphone, 
17
-Twilio, Flowroute, Vonage, etc. via an Asterisk server, but if you want to connect it directly to the SIP provider, 
18
-from the 5 mentioned providers, only Telnyx will work, because the others don't allow direct connections from web 
19
-applications using SIP over WebSocket.
20
-SIP Trip Phone is based on the ctxSip phone.
21
-
22
-### Features:
23
-
24
-* 📞 SIP Trip Phone allows making and receiving calls to/from any mobile or landline phone at lower rates than with regular phones. It is known that VoIP phone calls are up to 70% cheaper than regular phone calls. International VoIP phone calls can cost even 90% less than regular phone calls.
25
-
26
-* 🌐 You can acquire phone numbers in countries of your choice and make cheap international phone calls to receivers in those countries. When calling you back on those numbers, the receivers will pay as for local calls.
27
-
28
-* 🆓 If Asterisk is used, you can make free calls over the Internet between extensions configured on the underlying Asterisk server.
29
-
30
-* ☎️ SIP Trip Phone logs recent phone calls and their duration and allows holding, muting and transferring phone calls.
31
-
32
-* 📑 When using Asterisk, SIP Trip Phone allows choosing any available phone number as the 'From' number for outgoing calls.
33
-
34
-* 🚩 Incoming calls are signaled by on-screen notifications.
35
-
36
-* 📃 Once you open SIP Trip Phone, you can use it even if you are logged out of Nextcloud.
37
-
38
-* 💻 If Asterisk is used, on the underlying Asterisk server you can implement an IVR (Interactive Voice Response or 'voice menu') and many advanced PBX features such as voicemail, queue management, music on hold, number blacklisting, call recording, audio conference calls, etc.
39
-
40
-* 💰 The only ongoing cost is about $1 per month (depending on the country) for a phone number. No contracts.
41
-
42
-* 💸 Low per minute prices: if Asterisk is used, you can make calls within the US starting from $0.0050 per minute and receive calls with $0.0075 per minute or less (Telnyx), or $0.0060 per minute for outgoing calls and $0 for incoming calls (Localphone). If SIP Trip Phone is connected directly to Telnyx, you can make and receive phone calls with $0.0020 per minute in the US.
43
-
44
-We have no affiliation with Telnyx, Localphone, Twilio, Flowroute or Vonage.
45
-
46
-### Documentation
47
-
48
-* [Admin documentation](https://www.doublebastion.com/install-nextcloud/#install-sip-trip-phone)
49
-
50
-### Donations
51
-
52
-* 🎁 [Donate](https://www.doublebastion.com/donations/)
53
-
54
-    ]]></description>
55
-    <version>1.1.3</version>
56
-    <licence>AGPL</licence>
57
-    <author homepage="https://www.doublebastion.com">Double Bastion LLC</author>
58
-    <namespace>SIPTripPhone</namespace>
59
-	<documentation>
60
-		<admin>https://www.doublebastion.com/install-nextcloud/#install-sip-trip-phone</admin>
61
-	</documentation>
62
-    <category>office</category>
63
-    <category>organization</category>
64
-
65
-    <website>https://www.doublebastion.com/sip-trip-phone/</website>
66
-    <bugs>https://git.doublebastion.com/sip-trip-phone/issues/develop</bugs>
67
-    <repository>https://git.doublebastion.com/sip-trip-phone/develop/</repository>
68
-
69
-    <screenshot>https://git.doublebastion.com/sip-trip-phone/raw/develop/img/sip_trip_phone_keypad.png</screenshot>
70
-    <screenshot>https://git.doublebastion.com/sip-trip-phone/raw/develop/img/sip_trip_phone_making_calls.png</screenshot>
71
-    <screenshot>https://git.doublebastion.com/sip-trip-phone/raw/develop/img/sip_trip_phone_holding.png</screenshot>
72
-
73
-    <dependencies>
74
-            <nextcloud min-version="26" max-version="28" />
75
-    </dependencies>
76
-
77
-    <navigations>
78
-        <navigation>
79
-            <name>SIP Trip Phone</name>
80
-            <route>sip_trip_phone.page.index</route>
81
-            <order>101</order>
82
-            <icon>sip_trip_phone.svg</icon>
83
-        </navigation>
84
-    </navigations>
85
-
86
-    <settings>
87
-            <personal>OCA\SIPTripPhone\Settings\Personal</personal>
88
-            <personal-section>OCA\SIPTripPhone\Settings\PersonalSection</personal-section>
89
-    </settings>
90
-</info>
91 0
deleted file mode 100644
... ...
@@ -1,36 +0,0 @@
1
-<?php
2
-/**
3
- * @copyright 2021 Double Bastion LLC <www.doublebastion.com>
4
- *
5
- * @author Double Bastion LLC
6
- *
7
- * @license GNU AGPL version 3 or any later version
8
- *
9
- * This program is free software; you can redistribute it and/or
10
- * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
11
- * License as published by the Free Software Foundation; either
12
- * version 3 of the License, or any later version.
13
- *
14
- * This program is distributed in the hope that it will be useful,
15
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17
- * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
18
- *
19
- * You should have received a copy of the GNU Affero General Public
20
- * License along with this program.  If not, see <http://www.gnu.org/licenses/>.
21
- *
22
- */
23
-
24
-declare(strict_types=1);
25
-
26
-return [
27
-  'routes' => [
28
-     // User views
29
-     ['name' => 'page#index', 'url' => '/', 'verb' => 'GET'],
30
-     // Settings
31
-     ['name' => 'sphone#getsettings', 'url' => '/user/getsettings/{userId}', 'verb' => 'GET'],
32
-     ['name' => 'sphone#getsippass', 'url' => '/user/getsippass/{userId}', 'verb' => 'GET'],
33
-     ['name' => 'sphone#updatesettings', 'url' => '/user/updatesettings/{userId}', 'verb' => 'PUT']
34
-  ]
35
-];
36
-
37 0
deleted file mode 100644
... ...
@@ -1,418 +0,0 @@
1
-{
2
-    "hashes": {
3
-        "CHANGELOG.txt": "75246899df69baf2e3d3df991735b92af71f9b4603a970857d8dc21cb71ea2eff68a8348342d4044701c27001a4e697be7883d917e51ad64df8bee0d795bb488",
4
-        "COPYING.txt": "a0a86214ea153fb07ff35ceec0848dd1703eae22de036a825efc8394e50f65e3044832f3b49cf7e45a39edc470bdf738abc36a3a78ca7df3a6e73c14eaef94a8",
5
-        "Contributors.txt": "8ab4ea9b8c38e4d115af6ca08e8e27592198b763982bd166b67f38ee0b9f2b7e093cd58ce0927ae38ee3bc015b129add2ffeb3967288c804da493241bc67ba9b",
6
-        "README.md": "ac1d715d0ea3fb8f65e5eff948cef2e727ca283c03ac7763c143eb898e78b63a6a3bb49f86e95dbc578bf7da6f40030702e62dcd565efe28b81727be3d732abd",
7
-        "appinfo\/info.xml": "3a9d986e79a099fb5e0c8a02761efaa06a582e1303c488ca990fb8c90450cba32fc1321db8186547df3c5bda60885da8512f0ae22e88d5cb8a4f75cf70f04a47",
8
-        "appinfo\/routes.php": "8dae8f6d5e152b052b28459a7c33fc31b4a6f4981af58028032630500c9d4d2bd31271de1627cae6f17eee827905ce33e7e2a95ea96b335b2324c838ed1a2286",
9
-        "css\/style.css": "ca2da1bd8adc863ed1300e4ef42f9892c5ab795d3c39d751fb1b1d7a4b1c5456b22a8efe53fffda3e6aaba9c5007e1627364003ece75f61e5e9b484b125af20e",
10
-        "fonts\/Apache_License_v2.0_Open_Sans.txt": "fdae7ed259455ca9fa45939e7f25cbb4de29831cda16d9151de25a5f6e9d9be43b053f4fd3b896026239fca77abce04f543d591c501ecf4ce18c854bc0a51660",
11
-        "fonts\/Inter-Bold.woff": "f34ed611dc0ba6e7c0bf7242bad7c02e09f208bfbdd21d6649ebf9b41bc06696d8856707851944786c80c718df455e619caab170c70bfe97ba2043d651d4532e",
12
-        "fonts\/Inter-Bold.woff2": "736b4aaf8a2de0c17fbd5396a338577227326f078ee0646072d851d328b58a8058989af8735ac073f935b05f291d9310797d95c963e5e3ff0ea61a87f21c9da5",
13
-        "fonts\/Inter-BoldItalic.woff": "619e398d37249fae96ba0deb06fcf5dab215ba888740024287e2c8f1278b33273124cd5b9ea8f7525a17657566b72a1661b688ca670bc068ca6ddf466b7e7ffe",
14
-        "fonts\/Inter-BoldItalic.woff2": "a24bdb558a9b26fbe7631d6cf90b8db8f5f0164c3c814a2971fb7d45e807b0856454893bbd0d5bd0d9f060689f2be5f5bb1b69e4bdea0293d1122e13ad28e96f",
15
-        "fonts\/Inter-ExtraBold.woff": "d527e43747abed5a13d49a70c8db7ef39aab35ab0accfe1e3f6e037f685e08d2e5f7552b40c75d4faecc0e7e1227e97c563af093afefb57f2b6be9c783a85b0e",
16
-        "fonts\/Inter-ExtraBold.woff2": "20a22b0255b2bdc8f30ca7d59f20b3e2dfcbeaa39f035ccbeff40b57ad77d616dee1c41eebe30e1fab53fbb7ab4cc9f842cd13539ef34a680f6dd43441a3f2f6",
17
-        "fonts\/Inter-ExtraBoldItalic.woff": "6fc1da8183d8b131d670ff5a89593967e4666436b37fcf08c4d99d8532654558f281bb8c20c92be8c5e3d6b34e05c7aad182f4c9a413f8bb1c11ef600b3c524b",
18
-        "fonts\/Inter-ExtraBoldItalic.woff2": "3a8c4a113a4308ac9a57e7ad75060e0f08a1dd8638c29c1190f86929363b755ed2de66e4c11d3164a0a1fb1e6e35865bf786a295d3e0ad561c4a94cc8cbec6db",
19
-        "fonts\/Inter-Italic.woff": "72defeb5040f6375683dba41d4ce43654fdbae4f64aea88b01feb023b3e894c278c8a8c7e5583b6d83d980495ca0d5afa5ec7e1bfcc731be08d3dbe1b8b3f348",
20
-        "fonts\/Inter-Italic.woff2": "b128da83c81fe4a28026dc0a2a75c7920f37d4e04d6d6bde4e60b3a9527dbff04ff0ebc8b300874db9bd90036a41a52f4c9d82eb2f78fb8e99a35bb04defa1c2",
21
-        "fonts\/Inter-Medium.woff": "1f7c25aeb1ed534a106254fdba6bf59dfa03542f813489dca31fe067e2a22ab9549babb48af4cd465ab3ef0ef2f4b0f46532efcc8aae8942ad2cf98d0a5a4a3f",
22
-        "fonts\/Inter-Medium.woff2": "ce94d1a0cea81d42546ebc0247403b02c6fae24d3afba618cf658436734557a8b2b8ebed54319a9f66b233bd224da3685f848470866de63a144c8c28070491d4",
23
-        "fonts\/Inter-MediumItalic.woff": "7b7bef9c7a7717c6d52d619059e5ec258b537f538ada38325c2c7bfa4968ff53109bc9ee17a57819ef37d0a145a973f4a7c8e4d8d09e71d3faa4d0fe14cbf487",
24
-        "fonts\/Inter-MediumItalic.woff2": "4a2c5dc8c2ece82489e63b16cd8b1536b8f5502cf8f93307b0c71c6d54594a28ec2a80b8e58dfbbcc1d38a51aa8dd6d6fa025aed2cdc1429a462745a2bf2d414",
25
-        "fonts\/Inter-Regular.woff": "e37409956d19653617af32af2f99f4038c815a3664f2dcb2fef5e6a1a7345c78aaac3badc2ae499b1423514076ad676ab4bd5d936ef9d159899a6f668d991e4c",
26
-        "fonts\/Inter-Regular.woff2": "731924aedf31d6ef8fcd57a3b74182331ec7ba743d64033d8912d350ba98fd5b1942decaa4268f4dc925be2ed711c71a77200b2497bec10cae499b452fb27138",
27
-        "fonts\/Inter-SemiBold.woff": "684602b1f45bf7a9ca5ea6b1aca2cc2046e07ac79eb63b920099463f25866f50cca77ca253f16078d3a6e781ca23b964a69c87389621fa101d5cfffdb292d132",
28
-        "fonts\/Inter-SemiBold.woff2": "12b7680eccc54f56f800ac3ea4eff0490f515911d0fc83f99f62fa0f72d848155c8a7186918301a372d0fd0238d8093109c7b9b3c05168058e3cb47b1f7216ae",
29
-        "fonts\/Inter-SemiBoldItalic.woff": "9623d9c91148b651b7d4a642751e4f9eaeda68b6f4c33355d0173e303252039b3bcd301556a1d8451ffbd36d7996c1e8fc5ca1276884636cf57468e38c9e442a",
30
-        "fonts\/Inter-SemiBoldItalic.woff2": "97b7d8ab268ebcbc00876bd69ca9cc7cf2ae9ba5a6a30c13e3412e41a88f1f5ed758a6d9abbab3a14359943a003b14307cbc379bb11505c014b002322fd53c6e",
31
-        "fonts\/SIL_Open_Font_License_v1.1_Inter.txt": "073e141d4e45a3adfd2cb569db6a4fd217b1721dd6aeab8159e36940b984df5ebdc345deb0eb6be65367f943e516a12dff41eb1238a322d248ca3478c50ef9b6",
32
-        "fonts\/opensans-bold.woff": "d094832745611e047ffa87fdb21bac41befabdb07aecade483d4dc5a5b97bad00f1d4a5dca2a615789cd494791f0ab4209be537eb4b1bc7cbee7c42eb5e201dc",
33
-        "fonts\/opensans-bold.woff2": "096abb618c9ce1a534f0198aeea53c6d1138000f98b883131ab49ee48b80b483af635f0196ac40a1c1bde679f63b3c3b907b8f9b0102a752862d623dd22393a5",
34
-        "fonts\/opensans-bolditalic.woff": "c80f105a10d37c812f5d1b29445cd21cbc95594f71d9c5fc1b3aeeb9985c5465ba017654f1453baefdc56cc27aa325b586d77323012073eb713ab8f88f08dab4",
35
-        "fonts\/opensans-bolditalic.woff2": "38b99ebf320264d74a456fe590fc610580b003bc77a39d97ff42dec41353a8f908d6f680b4777cdb34ed544d9b4ed20dce8c418317de1d721e25ab670f49fc1d",
36
-        "fonts\/opensans-extrabold.woff": "6636a395ba345853ada2237b8e1f81c52e54bfb65559cbcb8de143cac00232f20cf34c764c9c4d4b80e82dae79cba3064ebdf22999cce8839df2d5709ee64092",
37
-        "fonts\/opensans-extrabold.woff2": "758c90eb07c6db7e78cb703ea285f82b443ca2cfab792328a3f8c14acc1f932ae79ec2987b8b94bf19b3cc16fae31c76f3164c9437a2591283fb1592e40ec33d",
38
-        "fonts\/opensans-extrabolditalic.woff": "ab1966f1ab3bb436e489c2d6ee562cf22d05b6b8c9bbca17e903518311aa45659efc329255e08ab597e2b8effe3bda602a7fb56b7d0c1d872b69337537d49dff",
39
-        "fonts\/opensans-extrabolditalic.woff2": "2132d6309969f868521f2d788b991bc9bcf3239f1768db9a2b90faf8838c35efea85225b24db256f54c86d0a7915ecd50a7f5348e6ab040e0f172ba7510598cd",
40
-        "fonts\/opensans-italic.woff": "a9751e7ac7a3c3d9f739d1fe00730a545b68e4a6473beafee8edf583f175b34fd5e0b60a14ec3707c8691fdbebea17e191c51707f50a21281e76be46f55a1140",
41
-        "fonts\/opensans-italic.woff2": "7a80c01d34562e2fe248a71078ffa9413c04c9c320d27acb0bce96cc295101eb9e80a25e97dab3e67c184c40937862be820581441aa4100bd512a26ef2d523cf",
42
-        "fonts\/opensans-light.woff": "cca2c5d207e0935c1848e22965972cb6feea39aa93b1b546051cfabe5ab16e909934d007a7ccd174eda1e7671d838f477890dedcb93d68ba722eda39a16d0bb8",
43
-        "fonts\/opensans-light.woff2": "cdc332de1b13eb0f05cc9dd1ebc905fa5ce948eab71e2fdb1bc538ad54a0de980bf83352090becd650af9c101ec9a6898d2e4798e4fb777e41c20fae85fd568b",
44
-        "fonts\/opensans-lightitalic.woff": "26e7759869088d8abba380f0bb22bbb9fdf0a985c0999519390cbd85099e3f48864d866f4639a8ff1992e7c81c755b0bbf66f525d4d38a929067886e9b54eb88",
45
-        "fonts\/opensans-lightitalic.woff2": "b7f80b69abeca9d0369f5d46da192e98a6329cf1f948c897fb7130e0d815f73e293c37f0e6d0047273fe3f13a19e648d1bd06cfa2fac2142ec38ac244e7f0940",
46
-        "fonts\/opensans-regular.woff": "3a526ba177f8f16ad95941c185411f350fab7e5202b9f56ea9c5f972c62912781d66da10e278e065cc6748a4bc9ab9182d68b27eaf380131c602195148e4b8b4",
47
-        "fonts\/opensans-regular.woff2": "66b3e915b891f7b37b441ee18e40f01274fe19f2515470760e503f428fc1c524ccfbe832191978c2c5f6bc4b7ef46937e4f77f5457b6efbf878c97c054cb45f2",
48
-        "fonts\/opensans-semibold.woff": "173f703ab767d0fcff014dac2fa3dcac787ffd0eb39f0c532b6679935c0105daacfa6a32bca97de13e420e10194b701ad2487bfd35d28807563ebf0b16d0ca35",
49
-        "fonts\/opensans-semibold.woff2": "75068ba76befc2356fe83b198bf6da70e177e53cc3128af09d0d9f69dfe538013f2828b2363c6f533fcaca4d4b2a5ec5159b5eb6f288504ac73d33ac5d1d2c4d",
50
-        "fonts\/opensans-semibolditalic.woff": "9e1e965095991d4a12a0658fa22a116b043ce20fd5f73bb9655d870ae49c46170cec52827510be323332b535002eb96445f79c3d1e4dd0550ff622fda0465f1d",
51
-        "fonts\/opensans-semibolditalic.woff2": "d7e43f05802e26f4cb80ab6a492b01c398c5b41168c7f61356ca3ffc5f4fccabae5ba332956f0aecad69ccabb6b7526efbc0395552cc5d68e47bec00bc660ad7",
52
-        "img\/app-dark.svg": "e56b38a7738e4a6f8700be79918e732dacbd00a027bb9c4d4dea132731d5a7011951423861486d55b01b4b153d7b72d83028dbd1aef5645091e270d3c6418781",
53
-        "img\/app.svg": "b280f77152cd2cbfdb075d0550aeeebb9df34b8fe9e4fa371f7d42bf53fea7afb24da9e5112c7e3b3c9ef868ad361b5456b57979825c332f66434e46acfeebbd",
54
-        "img\/sip_trip_phone-dark.svg": "e56b38a7738e4a6f8700be79918e732dacbd00a027bb9c4d4dea132731d5a7011951423861486d55b01b4b153d7b72d83028dbd1aef5645091e270d3c6418781",
55
-        "img\/sip_trip_phone.svg": "b280f77152cd2cbfdb075d0550aeeebb9df34b8fe9e4fa371f7d42bf53fea7afb24da9e5112c7e3b3c9ef868ad361b5456b57979825c332f66434e46acfeebbd",
56
-        "img\/sip_trip_phone_calling.png": "982286e21f6c8645bf4b2f492509b80b169c1a499b6b45c9d652a70443e4b6d40f622d15df4f119b6583e474c76adb3d3fa5ed582db76c6e4885548e97c72700",
57
-        "img\/sip_trip_phone_dialpad.png": "17e342ef7ed3baf181191c4ab8d3eeb76a29d8f107ace3358dfe63d4fa546a042017dcb51ee1eaf220967a1951c4ca19e66b840d9c85b68e49ef55fde4ea6c33",
58
-        "img\/sip_trip_phone_grey.svg": "5524c9e00c015d023d7a9d8f3427eddb5d94b88551d140528487eea84c6c62b905ce12b53824397f878d214e6911c7fea8ebbc4bff64ef275d443239e70b2767",
59
-        "img\/sip_trip_phone_hold.png": "5da0e2dd8a9e7b3282f1bbbec5d0d922fe266f78bca26a2185430c0db540bbf64a3865bb73b081affcb54f3b8ac1f12ac152c9c824f88cd7327af6ffde5f2d09",
60
-        "img\/sip_trip_phone_holding.png": "27814b9ba86f0609ca0d5eb43e40c709ccfe87811dc7848306c2d56a3aef001aca9b36ab50e85f6706961db2b4c339c17a7d526b5004398fac49b98550a8f34c",
61
-        "img\/sip_trip_phone_initial_screen.png": "b91d7bbbb049934069603fb5d53332f3e38f3ab10bd104dc2ef4271c07d21d4094fa86c9c0e7732288814e654783fe2bcfb53710707c5073b52a4b5c3aa52733",
62
-        "img\/sip_trip_phone_keypad.png": "8dd5ee8c1c15e0f06257e6ae9019c1e260a254f7287b7377ca49909a69c2b06dba87acb10de7f7a487364b59d0aa5a50e67737da90326bd64863546d16d3d3df",
63
-        "img\/sip_trip_phone_logo.png": "3309a656543c4fcec77de1356c88f834cc244d423767c5ebe2f8b90b27b738bc426f3cc0e9141220e37c51e4a15791743539b694ce6826b97ee929b8d8e9a098",
64
-        "img\/sip_trip_phone_making_calls.png": "c564e4dd1d8e11579081fae42cad3ac0d94d95e8c28c484e04fb4d4c44ec2810ea7fadc403371e8809d7c219343757787a6fcc4bc50892191fa86a1505e9a0ae",
65
-        "js\/launchphone.js": "b142f1f86fa0196480b9907f07a3f8b786a3b61293d111bc0d1b6fe6f37abe217fe88b2076326f048915c30cc55293f75cc5ce34ffa55ab6b15690530fdd8ff1",
66
-        "js\/settings.js": "263f0b86f8170cb07b0439a9e5a21a562bab81c83cb31572bf92528c113771938aab06c063f5d12cd64105a998d06daa276220510a4a1d6f15ca9971e1f60fe7",
67
-        "l10n\/en_GB.js": "928d01c11d7ea9d191e83b4d1797fa6c9076d3e7ea8444c324a7c903b36db3ba132a088519d82dbdb002e8e6f0dabe4c7d0bf02a7a5ce175d95fbf8cc5626f13",
68
-        "l10n\/en_GB.json": "a5b2e75415de54aa6da74ef78232bbce9d3027d79e7286ce00596bd22fa8ec25b44b0df12e8e34f68aceb592237e4aea84a81db6cd74df9719f249dfb9534d69",
69
-        "l10n\/en_US.js": "928d01c11d7ea9d191e83b4d1797fa6c9076d3e7ea8444c324a7c903b36db3ba132a088519d82dbdb002e8e6f0dabe4c7d0bf02a7a5ce175d95fbf8cc5626f13",
70
-        "l10n\/en_US.json": "a5b2e75415de54aa6da74ef78232bbce9d3027d79e7286ce00596bd22fa8ec25b44b0df12e8e34f68aceb592237e4aea84a81db6cd74df9719f249dfb9534d69",
71
-        "lib\/AppConfig.php": "e0279b17c389a2ba883c07800f43326efc427d96dd6d4e123e14b0bcd4dd4dcc521af3c2fa1673c7fe68ee915a34222dead68f266ca34db1c864216c24134c39",
72
-        "lib\/AppInfo\/Application.php": "a80c8968ac1af43642ca5131a3119be96fc85f222094f8b8ec638f752b5db75296472a71ffba716eabbb9bb2a0054fd984ff1ae53cc72ba0761ecb64eb8f84cf",
73
-        "lib\/Controller\/PageController.php": "0d32eed8d4cf98d33a7501a5aa7cb8a5921d3a8a98bed952ed9c18d26b154286de383a6d447d998be985848d9fbdc10fdaecb30dd01e3ecd463e75291a5f9418",
74
-        "lib\/Controller\/SphoneController.php": "eba1663a36c493db1abb99084dec80773f907f474ff12f4dc330b2f3374567617d7367c71b6f8b7a2d0f1e8f8d22977cbeb8fe06576a6831ef1a2825d6347776",
75
-        "lib\/Migration\/Version100Date20211106173528.php": "2d81e8fd03611db1017c08d90325a680928cfd367701e479d8c765b8967645cf9ae27725f657d655615f5a878307edb87b3d2a0bb460161e14de85d498798ce8",
76
-        "lib\/Migration\/Version112Date20240108213517.php": "6a535855e4eeeaa63b62ec1b97d9484f727c0aa08f16a4eb65888f0d133d93498e20adc4d1942572924d553af425a8632a94bbde8d3101a28b07c9301d6b43ba",
77
-        "lib\/Service\/SphoneService.php": "872446a48ba6d64c7e85d2bca63ec764691c1cf081b1db0f2741c38ef30975dafb11ede10dcb106fc77e27709b35847ac26bb2defa36a00741826ede1787fe95",
78
-        "lib\/Settings\/Personal.php": "d031350a9e5c1b0e78fff57b672304660485b9b307c28eb8a2dc7a3782c6329cb3fc659041d331b97711485a92d10bd99d739a17eaec088f7837d2be786500a6",
79
-        "lib\/Settings\/PersonalSection.php": "b2104766a5df419eed6811630c2d2de6b817f4b0ca77b5ca018344901cb8db0cefc8c78d4f45b14f4b5129aa986ae583b69c78d50cd91f8502508dd8724d3edb",
80
-        "phone\/css\/bootstrap.min.css": "b82d1fb15e8eec863133d7491103e86bb1cb67442509bd141f2c2730dc237c351d3a10bd4e9633ea208c39a98b6a508769c7c448aed809bee43a83e10361c402",
81
-        "phone\/css\/ctxSip.css": "b5c955062156650d4b919afefda0b9aff36a8b27247a441011ba9bcbb16fdcd17cf8c98f872598d5dcef8aca7034d8e1361bb26934c0cf0fe4156049af4b0a21",
82
-        "phone\/css\/ctxSip.less": "9b53e079978d5a672827cadd1b1f9ca63c69af22a77e52fb12318cf445a96ac2f537c797f64f4d2bfd673bd4c1b15d22de9e9ee226add5ca443db36a6fc24905",
83
-        "phone\/css\/font-awesome-4.7.0\/.gitignore": "c3621f6be50311134e6d7a1d34a9638f747f4074c48527dc7975957d6c87b9cb36b64bf8385fb1a59b52a281f1e72ac3f1c268dba6d09ac951e0f4618bded3d8",
84
-        "phone\/css\/font-awesome-4.7.0\/.npmignore": "6de3301556255638c616eab313a3d8ee5c704b1aa5b57a5d85e5723cb3b810a1ebcc148c33dde5c4989a691f18f8a2ace97c40df2e9c4306b840a4823587ee2e",
85
-        "phone\/css\/font-awesome-4.7.0\/CONTRIBUTING.md": "4576f4a2b8070a422891412d123025245fc3ae5511de09e153a1924aafa5d8d8de65fc530db79426055e21996ee9ef1bef22a192f46cca3bb94894d0d54d6ecf",
86
-        "phone\/css\/font-awesome-4.7.0\/Gemfile": "2add4715a7f520d0bbce11062202f6d1072efe569207c801f9ded213e8d3b2d0f879071c39aa117839e5e3a73780b1081e18dbec2ac79b6b4756deb4a8a4186a",
87
-        "phone\/css\/font-awesome-4.7.0\/Gemfile.lock": "1daf45ff9728c007cec63dbafeafc394322273e3620f911769b230de8408b71838429c86f45324885db7029cb4661a5dd6057e3e6961a98ee08d87e7601b85ab",
88
-        "phone\/css\/font-awesome-4.7.0\/HELP-US-OUT.txt": "f0ebc1e7ec38a8cd333b34e2deebb416ffab31f3cd707f27e310beff328e5e05962a023da606c62559c8b606f7138b90896ee304fd45e86afdd2910ac8cdda57",
89
-        "phone\/css\/font-awesome-4.7.0\/LICENSE": "1a7a0986aaed249087bd3a01cbda0361cddecd4ac0e4da9d7095f6193b4dccc559d570789b0a4ca2606f2ef137f2c4174cef735a8535371ce7e3a55625dfa801",
90
-        "phone\/css\/font-awesome-4.7.0\/README.md": "34655fd4be9d98ed1d419c98372cbfa58684382fda11936fbda3f6b39894cbe9fe429b6ec3346315cca309c2d07648064d0554d1e241c6ef9df57e6fcf758ca1",
91
-        "phone\/css\/font-awesome-4.7.0\/_config.yml": "883821543b8f3d2ea37e88186afe841c085fedb3b7ccaea49757af224b0dac02ac9eb5b8d7ce1648cb57fff434936313315c308ba624941f5f5c0b1fce083d64",
92
-        "phone\/css\/font-awesome-4.7.0\/bower.json": "5407ebc1f339b0ccc665e1fe5edc8c92bce01fcd0f5c3be302f407bec80a315a0612ffb2b71a93bd0e19a1fc1eb34095a02bf0aec659b08411fcffa3d289b7e2",
93
-        "phone\/css\/font-awesome-4.7.0\/component.json": "12fcbaa3f72f707f433aaa532774497453d447e3402f4afb1c27e8ea9b3cf98108229292af312aa434722e9b50b2da115b2392b82f41b19144d6dd2ea183d659",
94
-        "phone\/css\/font-awesome-4.7.0\/composer.json": "566b0aa11e55c98698c1f23b92bd05cd583c5448a3c4a33582f05a19325e26b91f82138822d0ea2b1397491add3e4b79d2682acc7dad6beab24fd1621c3d27fb",
95
-        "phone\/css\/font-awesome-4.7.0\/css\/font-awesome.css": "e40f27c1d30e5ab4b3db47c3b2373381489d50147c9623d853e5b299364fd65998f46e8e73b1e566fd79e97aa7b20354cd3c8c79f15372c147fed9c913ffb106",
96
-        "phone\/css\/font-awesome-4.7.0\/css\/font-awesome.css.map": "fc6df90f77e3ab265e3f19c2d6ccc27c49d5ab94cb956a2de3e16edfb3f59a3e1f9df3182474925704412ea056bc0acfd70f8f599c9fabefb48b43355a1e29cc",
97
-        "phone\/css\/font-awesome-4.7.0\/css\/font-awesome.min.css": "49f4e24e55fa924faa8ad7debe5ffb2e26d439e25696df6b6f20e7f766b50ea58ec3dbd61b6305a1acacd2c80e6e659accee4140f885b9c9e71008e9001fbf4b",
98
-        "phone\/css\/font-awesome-4.7.0\/fonts\/FontAwesome.otf": "a3acaaac3a9861ac7a4ba23e52b9115d39b674cb685b45454fb4b80329a4f7370b5ea7dd8b41d630798f8a54082b62411fd63332752296dbf5f2b3b96abb8874",
99
-        "phone\/css\/font-awesome-4.7.0\/fonts\/fontawesome-webfont.eot": "c160d3d77e67eff986043461693b2a831e1175f579490d7f0b411005ea81bd4f5850ff534f6721b727c002973f3f9027ea960fac4317d37db1d4cb53ec9d343a",
100
-        "phone\/css\/font-awesome-4.7.0\/fonts\/fontawesome-webfont.svg": "4f575d52331de91a2e32cc3408dd0eaf0cf25b7244d34b226314e3647e85ce284f86e3b7238c6c8b9022dc4e2787bf51620849290cdcd5d4c4bc905f289d2156",
101
-        "phone\/css\/font-awesome-4.7.0\/fonts\/fontawesome-webfont.ttf": "9ffb91e68c975172848b4bba25284678cc2c6eb4fb2d42000aa871c36656c4cebc28bf83c94df9afdfbf2407c01fe6b554c660b9b5c11af27c35acadfe6136ac",
102
-        "phone\/css\/font-awesome-4.7.0\/fonts\/fontawesome-webfont.woff": "9c776dea55a01fd854ea23b3463d9ac716077d406ecbe8ed0c9b6120ff7e60357f0521ab3e3bf9d4e17ca2c44a5d63ee58a4e7a37a3d3f26415a98d11c99e04f",
103
-        "phone\/css\/font-awesome-4.7.0\/fonts\/fontawesome-webfont.woff2": "838fefdbc14901f41edf995a78fdac55764cd4912ccb734b8bea4909194582904d8f2afdf2b6c428667912ce4d65681a1044d045d1bc6de2b14113f0315fc892",
104
-        "phone\/css\/font-awesome-4.7.0\/less\/animated.less": "285de8b339ae691c8c95230462b8760949850ecbd1a4f8b98b0f85347f1187ca7727507a50ba7ee362b57b1ccc94efe57fa99bb501bbea93561ca3104f73084c",
105
-        "phone\/css\/font-awesome-4.7.0\/less\/bordered-pulled.less": "666a33697b525aa25d773c94360b96dd6ff833dedf99178af931b040aa93239c5814bfdd433a841d77c2a3addcc444d7ec95c83073b9d30e48ed5fff4e82a111",
106
-        "phone\/css\/font-awesome-4.7.0\/less\/core.less": "88b310200bdd13129f343e8f9b581e3a376fd5aec4c7a604815101774d31ca3fb469d345321aee80303842309b10273885195545f69fb81ea13215e751ef5187",
107
-        "phone\/css\/font-awesome-4.7.0\/less\/fixed-width.less": "b7bf0de65815043012e95e8b1bac895e85c9a07c047c99ba4f5c132a00ace5aeb3e838f2aac26d8451b38d193fde8199c45d58a2a79931e5bdbda47f15c8822d",
108
-        "phone\/css\/font-awesome-4.7.0\/less\/font-awesome.less": "f5cf809023468a015234142efd754543054f9fabcf06ecb58db792537b8526c5d73098cb059e6e37ddf295895e92ace9005e9c4e5eaab19d33f06ac478c69acf",
109
-        "phone\/css\/font-awesome-4.7.0\/less\/icons.less": "8735bbdc8c7c9d082c2a1f261c74bed575fa096ba8775ad48ada6894f03a8319414db099395e80f16f6e89d802c988c1a2bbf73252c65acb040c35d40b9ed0f5",
110
-        "phone\/css\/font-awesome-4.7.0\/less\/larger.less": "5ba01d3b3c917dfcc0bf20a283397e677d420addb83c74d29f81d77658105c8d9e48784d2e8f5214919877141056a74f06d3081fa291269f92c4506ac089a745",
111
-        "phone\/css\/font-awesome-4.7.0\/less\/list.less": "a13c48c3ab87469b5e720287f5f1720f0588bb45a0700968879cbba7ba008d070cdcd69b41d374cb504311c0a20bc4e727872855ae5e90fc76b1589104acc07f",
112
-        "phone\/css\/font-awesome-4.7.0\/less\/mixins.less": "9fba58dc30953169340a57fcda1b3dcccbe69cb9ee5ad3e29e53719fb185f4b49f9571be248675d5cf5d82f86482086df022283b31b1766090f9954755f7a47f",
113
-        "phone\/css\/font-awesome-4.7.0\/less\/path.less": "2214dadd8025d0da912ee4e0366a25b6d521f61ad04cd61c0b13140a9465d7711db8a80e3c83bc5410624eeef8bb2dbd1aba48cc3fa39b75d5eb5e91afbb7ba7",
114
-        "phone\/css\/font-awesome-4.7.0\/less\/rotated-flipped.less": "a906cde529bac0abc118201866c6e81ceed53ea5859795ebe87e52e1d04f1c32b0ae1dc2a9297e2d6a2cc44a7bbfcdccd01ead571198027430b98190ce5efa67",
115
-        "phone\/css\/font-awesome-4.7.0\/less\/screen-reader.less": "7d5c0d28b78b9c24b6af0181f8bf72d1b7bf20c45edbf1594da8b4c8391dd24920b9d0ad186ada7217755cbbabb9bf6ea52acd8ed39f7c9abf4659339eb70504",
116
-        "phone\/css\/font-awesome-4.7.0\/less\/stacked.less": "0f07e1507d430c8ade9cbf2460c8148d69fdce6b5b7c659247953e0e0235c5128cec1cd1a329790b9bfa42967cbafd36776d81f6e4ff80520149f8ff4a6ba629",
117
-        "phone\/css\/font-awesome-4.7.0\/less\/variables.less": "1691b468571a87081a892621941b3f0f954a3c5a4c588811b329e092bae28a8946f4e0ed5c440c7bd4248d3aa31c3be26867d28771703cbca41cedf5f3f3fc72",
118
-        "phone\/css\/font-awesome-4.7.0\/package.json": "e66e530ac7b2d050bf954b40ea6af7c20296e7613dae6028c76a12dc6e0ddc92cc89dc565ccfac27d529c7c4f2aa938b52cf3c7a5ca04c86ab6c52fcb9d9c2e3",
119
-        "phone\/css\/font-awesome-4.7.0\/scss\/_animated.scss": "5d8be64ce5136d02dcc2dc38341491c2cafca5633a8bbcf6bc6931da2ec95e2e29ffddd8a058842da4764620824914f7c7c7048a6c9e54d3e97bd7ab995834f5",
120
-        "phone\/css\/font-awesome-4.7.0\/scss\/_bordered-pulled.scss": "01095953afd37d399f8715168a67a2e60c23623f3ead4eb4360f8800e30cb9572ee5d90b48ab4d0e07271f75b11da2d4a4cc39115a872e2f001000cfb46a8bea",
121
-        "phone\/css\/font-awesome-4.7.0\/scss\/_core.scss": "78b807ddc8ac17eebfd4f59eb923a7f8bac8e7b76bc83985d593382b1964f1d98539af83c95c4aaf99e3e492304e08d452980879213fc13d9b9f69539f1f74c6",
122
-        "phone\/css\/font-awesome-4.7.0\/scss\/_fixed-width.scss": "27392694f9bd1a671cd21517721a86c24725c51fcad4acaf09cb75a9e36bea34176af900c82e061eb0ee6b60a1bd0d9e99213119c5175c2f48b6800258ba840d",
123
-        "phone\/css\/font-awesome-4.7.0\/scss\/_icons.scss": "b7f5aa12eb8cab73fd506d499f9c871b54d5939058b9ac27b858499f051d9af74a6374b2bc32eb2aecc169f9c2332cb2abd6b56b150d864df1d19ae153f16301",
124
-        "phone\/css\/font-awesome-4.7.0\/scss\/_larger.scss": "ed6e63e7cdc9bae34810146c3dfd52b912f7b20219555994249f6f3dbd528673af58b69deecd9819f28f71713076c6694f6db0e31148e8e726f714312f404a73",
125
-        "phone\/css\/font-awesome-4.7.0\/scss\/_list.scss": "d8b110a513c41ba8a00620143aa01b2bca59f21306b64e96cb82e4739ea88beddc0d3ba2679f277a34c89fa5cfa3d4b0f8ac5b16d9beccccae36b2f8450ef75b",
126
-        "phone\/css\/font-awesome-4.7.0\/scss\/_mixins.scss": "da84a310d9322e8a4b5e0c739e93a5c66418930930eed7e4a14351b61aa6073465302552642c75553819fe2ea7903ece21b20494761a94daada05bd6fb2e48fe",
127
-        "phone\/css\/font-awesome-4.7.0\/scss\/_path.scss": "9eaa7d29bb402c790bf1ad40ee849e26743d198bff3cfce0182c2320afd9d47f4377b2bfb147999a057604dcfed33e408065577a516be0f3623fc0df75120912",
128
-        "phone\/css\/font-awesome-4.7.0\/scss\/_rotated-flipped.scss": "89a2a4009628540c88c9375c7f04bade6bb9b901575c12fe22d0031c10011f4c5c3b7834d4caf6b1cfb84501a5a77d5c4e6cebc9a8ff92c8bc6c82ec6bfed40f",
129
-        "phone\/css\/font-awesome-4.7.0\/scss\/_screen-reader.scss": "5e3c8df5f64a9ddd9c7dad6f939156090e832a43c4352f7f470169ba22133267931f53100da2a4f4ec5e5528734c5d60c42ebc64fae6a5ee1dbc2e920dc343c9",
130
-        "phone\/css\/font-awesome-4.7.0\/scss\/_stacked.scss": "25492b5ff68a6d2c8f9ddcebbea75b1f14a7f47d599bea5d75e1f5fabdb5e3d43147e6df2c435c7ea639c094811872e53941ccb79f204026b6fe2cae172df7ac",
131
-        "phone\/css\/font-awesome-4.7.0\/scss\/_variables.scss": "77079c62eb1459ecc6e763e863f02f5faf9289b333cb43b2402bbf822837dba4d6af22d97fcdac68e252cba9758a91386483733ccf690c3d4eb5f1d109794f29",
132
-        "phone\/css\/font-awesome-4.7.0\/scss\/font-awesome.scss": "e5cd637954db11cc3e86af92ec127847c7476c22dd1e165c56a2816733368f02edff7fb54679ca77574f8fd86778528b6ff51ae0a39701e09b310a84b877580a",
133
-        "phone\/css\/font-awesome-4.7.0\/src\/CNAME": "060fe8853f4156b0fc81b945c6a3c98f0259e9a32adf02967a1c03e76bfd3bbb918364d208a411ab86299fc0719034750956f8fcc98286bcc3cdcb65314474a8",
134
-        "phone\/css\/font-awesome-4.7.0\/src\/Makefile": "88682614a1f8b34219819161e3fe03f8ee575afc05d0a883ab78cd8a772a7e6fbdc13ba4e4bb4a9d2f98e32772ddd2958e072b817e9ba195ee66c68087225eba",
135
-        "phone\/css\/font-awesome-4.7.0\/src\/README.md-nobuild": "05eade6bc17a7ab940d65e656c1f4d88656e15137ce90a64b3220c1b74cac41d27cd1764c63a6bcd5d8c43a17aced01d782ff4b714f559d18378c78a518182aa",
136
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/accessibility\/accessibility-facdn.html": "feff45586c2e4dec12c1d766b7a8cc815174a56b37567da96d62c04e15c072c902c70713b6f06fce9cc1eb2b4bf0fe44f2dd7b3b630e6cb3006e98e819cd54e2",
137
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/accessibility\/accessibility-manual.html": "c521d6c66a661530f5368c9cd7d191caa9cb791060f678cd44b79201196ce86827babc366e28a5cb311d9ec8929354354da0f3a04d3ac9e370441933bf57615b",
138
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/accessibility\/background.html": "12ef24dab463fd60c8dba5799f069785be108dd5666bccc3ad551af680d7ed3f1ba5c87feb0a10e52efc415ac5cd9fc89bd314f26552e844b2441a61b6ab2de6",
139
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/accessibility\/cta-cdn-ally.html": "d2cb6cec928638e10ad2aa93b7ea55b2184b9504edcca4e87ab20ebdca610a6edc45ee2360abdfb25956df207949cfd94d78206fb5eeba39c2d8fd9d1410952b",
140
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/accessibility\/other.html": "b6ea9fd4eb72fe8b20f18449ca22c65eb72399c8b5c956b598401d95086a37e885883064a06e58a35f2fbb69a296c069f8ab2d3b033e2148e4663cf08542184f",
141
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/ads\/carbon.html": "d6336f7613a75db891904471980c15e3b6d81ad014e13d6317eca29c7b5103166385e8959d3702e747ff83560e97920801d6a246772c617abc7811086a283aa2",
142
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/brand-adblock-warning.html": "5477ecda666bdd618d7e68af4539187ee932dd29418699c0c0e69548b47d20ea98d289a9e3b691696891caa1a9095ab8252ed11425964d8db9df34641d44d62c",
143
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/brand-license.html": "739eb68b48f8d4f555e02f7ef9ab1801aebf6cfad50325d20c63c9068dfca73d0dd27eb6ec4f4e96cb5224da8d8b8fceda4df088411d1022cdbde272e3ae03ff",
144
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/code\/core.less": "4452c88a8b284dd090873896e0b46b86846f2a23dfc90fe69ae561404bc1417e085c6546ae99827196feaec49bfda147f2810359a1b692071ed2db64eb1561c6",
145
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/code\/core.scss": "125638298cf58ddec200c8c58466fb568fcf76e3255f64737b59f9aab1ffc1c64a5f52082d3de4f80e88d25f3e34472107aa66c4bbd55e823df465db7e768ac4",
146
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/code\/license.css": "4a92760c82226b27a683a3860fcddda105d657ed7282221e5008bd8e80b299cbee5387e45e86e18988291870f1ea980ff5733cf36676bf46fd633f92ddf6e638",
147
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/community\/getting-support.html": "fd3d2680d3ad916cedf632dcd2da0addd756fe939dd400c67168090dd6aa97ed067fd3ba4d4ab8919507a45040ff0a93899617542184691b812a899c84123b6a",
148
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/community\/project-milestones.html": "5ba81ec08a037967dbb218e04057f1cc9b03fd79d02b3baae67a07dda595727b8409749340949b4001409543a8fa184603eb788417353b22d8cfb24eb014b01a",
149
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/community\/reporting-bugs.html": "f6582dee7f90225b0047b480dfaa35362477740b29215366227f27d53ed2c43005c4d2b60dabec41b33a482d516f5a23c2b229408fc21b97063db704d96ad098",
150
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/community\/requesting-new-icons.html": "479e29dd3f3dd17083e8ac7320c1a3de111d69cc1db7f618c0003a494b89d0e744c718f70cdd41300a165bc5e0fb6b9758e8fd82564ae47406e6cd104d9b9b04",
151
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/community\/submitting-pull-requests.html": "d62ea8e1f09ef35627c9d4d0498ff514fb1c88ca4215ab72194fcc3a90aa7a4ada5d202399de9aca41f01a20e9dd674c254797f94a6a3b8380b2df1af463d9f5",
152
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/examples\/accessible.html": "26fcba6f7236ecb034ed5575f02e7e7872878abee5d51444d06e8d976a80faaf017e9bd4aa43f2bc314759e5564c3030ee655ff8062d8aa551ec57060aae6cff",
153
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/examples\/animated.html": "8d8c90d6dea5ac1e869fc1f6234db28f6aefc7b489f774ef8abe64bedd7e82c5ed6efec2d4a85b9ac0152f50273695a2f8688aab3d904a130f001d2ba1704a21",
154
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/examples\/basic.html": "f5ab39675edf6375e893509f3cdc6721c50cc721229d2cd0bcb2437eddc644e02b9d1e714dc1c2d34e6675501e3c7b0469e454455d40c5a8e7aa1e83ae54d873",
155
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/examples\/bootstrap.html": "611cb46b313ed9d3412cfe9279981937a6695268392a88cca6e4252fb84b7f9c63e244d70b650abc8e73fd4648254e04995a79c9f68a695e7b8373bdd2ea6786",
156
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/examples\/bordered-pulled.html": "d97b2d4ca375122587565da7ad6a89cc761c1a01648140f6b003903280af01dd29ef23ea565849a62d892b9dd547a517a8028e2cd63a25fde89417b4476a049f",
157
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/examples\/custom.html": "09e01e23c1941ffe88d5c047285621f41452ce960686f00b3415ffff482d41748f6729f734a44639acfb0e1a6f47bf6931e707cde1cbb059de6b9c4c8e0cecda",
158
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/examples\/fixed-width.html": "fdc321a99a9570b65f3330f1e743e2a5a24f07d8759f45b811b00d2765aa7626e8c48fc316b5c040a4d847469c13873981d1098a378123632d288c787c9d74f1",
159
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/examples\/larger.html": "d9d38540bed78cc038323acd638d96c764cb18765ce328f4fcea4282cf432013e7a15482a56db3be50a9a1150743d078d891fd01cc5945d48952547974338af5",
160
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/examples\/list.html": "43ac890e702de4ee53d71a3f4ed18b66b5633e15ed8ece1f4039d1c3377a1d391051fb00b037f2e4a1f1c757d6cf615f069efe615b88aac1be4ee923b8b1d425",
161
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/examples\/rotated-flipped.html": "9c4eb8ca3cdb2309f87ee0366a75631a6a311700091f4c8189d74bbc4a33e3003635ebccc8c9aaf0d0960284c088f490e61c2a51e79cfbac4a72cc2609f90880",
162
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/examples\/stacked.html": "9bce1d2abd759645aac7c2f0fd54e55a34a2668882e337d89c8ee0bdea14bf790c0c03adc7f6ecc6d8e1cf13deabb8f9c90f0cbe4d44a867fae42f72d5a83711",
163
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/footer.html": "00b38469e9dfbc25d4905c9e71965064f1dd11d868bf0983de1614f870309e2313fea222e4ed4206a71c07924cc45bf28f8c0fd6428d331a58df566cd6988b54",
164
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/accessibility.html": "9b99cab0babf09aa30dd81d6bd675e43b7e8cba79e785d0dca3b7529dae910c2a96eb2c37a97e98610e2d9c5c2bcd84f85cdcf6ec22b72a81fa377edd529ca41",
165
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/brand.html": "fdcf75c126f165963c273c164f14cb933760ed977d1b734e4843d4299ced9dff545bce672409818ab2dc8391fffee391e17d1a56c80d52b39bb92df8679139db",
166
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/chart.html": "5d11f2d8367ee116fd85495a80a918d0bff70f641dfc4d7e6fed17e7e15496c04079bc8753b092fc3b50a19b5eff67c2790f7be8f49228a729bf4eddcfc892a1",
167
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/currency.html": "66b4d159ad39c6c0a96ccddccfec84e1b12f654e5880464042378f3439ce8df3257a33ee1df55252fc214428b52685a425ba91792c52f28984436912bea6ad21",
168
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/directional.html": "281f9c2e899998fee66e3d5aa1481451d23a2c2964e962506b04190cb84acdcf5e12e55d7a02e0a59793fbfdb78a5bd95203ac560441867ea49ae26c971d4060",
169
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/file-type.html": "9db9fd23e94d311b5d6b9258b5efea167037f6fd9ae54c57e8cc6505cd92bb14edded5dfe614dd27327200832268d56084f3060e18f29066bf99c141ef20c109",
170
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/form-control.html": "4a14aa9f08004d97cd7ef070c0e0423734bf71d1607bcd9d27f66f148876a3eeb355966e78207dad0e3da8ac1589df4bc6e1c6da661c2d1ae9c85d34fc77b254",
171
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/gender.html": "76950be4360b1eb448c6a41cf6adf739f74b3c60254b3264356e3b71bcaf791dc048915adf8e1730b819316fdb5cf934446a121d5d5461a743e03b7e54103586",
172
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/hand.html": "2ffce735b462f5b5c117c639f22be1a83de099589ffaf378355c448cb748d9a051280524c30224f7796bd317b74f201451765c5b37125440dc4db6aed420d8c6",
173
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/medical.html": "171a709bfe146dd5ca49647b9acf81ebcf62ef0a27d6e1aa8859c3a00b25f05b867712df7bba53e2e87e33b46dbc0eae107b2e1f3de4eb5b82d7e8fc8443d818",
174
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/new.html": "7d292287112e46c450034b08d51f4c1435782331e6049ec2fb5579ed9c56ccd6ed4c06b9f33b503a1d5e09160bc4c766df53eef6c1c0f90f95f2e7deefc9a628",
175
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/payment.html": "d8169b40692ac8fa117ce16eb7f1f6bb1b6f39eeac5a4f6c1aefad2b5278f1cdaf773907ada1bc87953fac97b9874511eb1d163462491c95eb9dbbb7a27e113d",
176
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/spinner.html": "2049127b24cc76076489d861ebad12207abf87c7b015ddadca72e66ae11a28068bd0d1cc9d28b245f236cbd72e0def6e90486cc1fd14c61442c57052a97cc956",
177
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/text-editor.html": "d4a659a0d14329a5a21c2369c3d3bb3bed12c88b19b18aaaabc61c095245885ecd39db439d454de3b4f15e3ad4764b909e240e38df28ee3eb25fa92240bd8038",
178
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/transportation.html": "4eb63448d28f9f6e13c3bfdadbec3b30f6985b17e3831d48e0ad15b3b1a6c41bb547bdb009b741d149f857cc191dae8f382b550aa6c8b8bad0a3c5088ba2581e",
179
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/video-player.html": "4f3aa37ee53df679d1baaf01d803bbe1346313ff5c6d2932a34993afa0294f23b9b29cb8a3876bd94e7be14469b6f3f04d52393260b32e790ffce2ae38de3a41",
180
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/web-application.html": "c430a80b58d49eefecf12236366f629d3091ba3d558a510d68a7ff7d5e4eb2d55d55c7fd781ec0e14422c7ae16775c6c90ef18f7059991b2285aa94e6630dddd",
181
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/jumbotron-carousel.html": "a9af25e69e6e61a582917c86e34728a8205fce95f94e4ff9fca4a27af05b68750609b2a4e13fa8f728b71bdead30c182055f2a1d329e6cd679d6110fe674e7b3",
182
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/jumbotron.html": "a9663212f87ba8e79d819fb4f896d0a8f53ab8ce57958a7c20e9587d03fdf499878f0121b7125a0bea012d21966bffd8cba3b0dd80ea4872bc590ee8aff9f5a9",
183
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/modals\/download.html": "df2bc4bffe3ee6f3286b7925594b23bee5775cd933b5b102328676b0d9a0e052387aca2d9495f7748bc2a7b626d5e5c08ffa338c2d5766620e0631fd202572a7",
184
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/modals\/fa5.html": "cd55e54afc79886bcc57f7cbaf0f100fcc41c26bb6a8a9c8a072ebec5d0c4c8feec90ea6e0e615e2fc6fc046c3b0dbdbfe66b31d3f9e1e08783e72e81b8c637d",
185
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/navbar.html": "9e8779299c2d4d95380ad8fa355ba826043009d1a4cdb735e376cdf38afb89c553a9c436680b717c312a4cc0e25a6f9cceb9034c6a97495943788ffcba92633a",
186
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/new-features.html": "b4c23f579f8fc506c8f6848a609c1a0c1c06c82deddb2f38b5b9a770e4d8df793d0cbe803b52287f01d3d46c6a143e106ee31cb32b8e985841ca5e4e16b20d5d",
187
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/new-naming.html": "4b0e5128293de9fde103c9a8648b67ef1d261c9eee359fc019083675ee38f66d45756dcd26b41efb034ca819f5c9be532c8b0d2fa1efaa174958c961818030e3",
188
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/new-upgrading.html": "a09270d8ed206b1a3a9b2415190148fbc1bbdda637fa032e7d17e0108c7e4ce4bbde2fc06595866029eac5c4904d6ae7b999b57870d6699a4b7ee2924bda80df",
189
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/newsletter-subscribe.html": "9fb09338a1d452dae32c9cdebb4e8800b26b163b46a88942d526e6965a47e33aa2959ff7855940f47d3f46297d5f2b7d4d7b6d3197928c55e5b17e728af5737a",
190
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/products\/camera-retro-tee.html": "2196b9364ee03668eafd98a2274ec10413c1e80772012636d5ecebfd48888ec5df05dfef642d46d971bf46757473a5fbb876ba457797b6196e33d60b784ebe8a",
191
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/products\/classics-tee.html": "a16ac1e4a87939505a43302b9dd94a1766fb6ed91a67c93efba42e38e264aab1f79c5f9150ad66f7029a6ab1811d60bdaaff6977a9c53148b7e393ab053e6224",
192
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/products\/cta-suggestions.html": "af48d657766f7f6163ce4851571750154337c8471059b200896e79f4ac3ccf2af4955ec4b950f1d8974cc6cde7ae11a29017303ccbd1895f30854adaf94d3730",
193
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/products\/fa-ther-tee.html": "095990235b55e0032b7dedb26ea37a20c3c99d431998d81781e80f409a589205028a0f786cc19dd6b479b2e2738bc0744f41ca7471ea5889f294a137e7100e45",
194
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/products\/green-logo-tee.html": "801e093b284cc4f6ce225877fb0ac5611d35a47360248255b13314e9722c96bbc2abb240b55ef5c7b07f931d392b0dca6f7aca7b68c9d722aedea916b12d0a91",
195
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/products\/old-skool-tee.html": "8a754b53ccf0db827e9d1250744b83e937a820876a2c49c969ef8e403b680d2692777d843c11576435cc6a4b2c2ef08a085497709b87b029a3e0827b68d0e269",
196
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/products\/rock-paper-scissors-lizard-spock-tee.html": "5aab5d331fa8f5a3540d42c901a52cc15345b585ea7b271583f9588949bc282defef5da5349ed795b0628825ce239f11481174bcea5a43aee41169959c0985da",
197
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/products\/space-shuttle-tee.html": "b155fc2184abac985df711df2bf1e3907ff088a9ffb648ff3a0dd8c329598722fb3f100f3230184b73f5a4606936e282fa1281f35f7be2a9e3665fbafedfd0a9",
198
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/products\/white-logo-tee.html": "4394a413fb87a5cd25148f5be1fd7e1ef641f6500f68e607f51e13d5f2718c676b4af28b0669cede49dcfd0784ea0004a23c2f803346c5acc00c1fae38e7015f",
199
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/stripe-ad.html": "046fb057775c05ba14c426912de5d1499ab7ac0069ee6b3920279cdb551e2e4bd7c343008606bdd6cd9231e90d3d821085a7cb43fed8871ce687ef42f26d5a33",
200
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/stripe-social.html": "0e73d4df0440bca1dcd3d32a3ffd1cd566a0a04e021b0c9b777e4503de7a4b90b4132d248e6a317093c276011b171669aad65399503b1e475afe593eed4c65d3",
201
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/tell-me-thanks.html": "7b4aac2c3b5b1fb29e48575ddaf771e9769bb4bc7e9de53b1e6f1001c26ac8380609e3697af6a687c144edce9e0c56e6f7ae24c961434d6c6f7f7e5f0a8791c1",
202
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/tests\/rotated-flipped-inside-anchor.html": "2f385fbca67c27a5700b81c77c8c568536b2f35ed39e5b4baf9b80b4f50c40fae8b44923a2d48ec7cbc78bb4fb3a570533bb3a8a1635ddd6af3d93a5ba58135e",
203
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/tests\/rotated-flipped-inside-btn.html": "94101d52e8831e9655f0100a23ae49d9ba861c55726eb5f5f4e21534224fd3b0faf507adc0f4cfdee449a6713a20f5cfbca2c06e9c580702cf64f8bba2f1f9fa",
204
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/tests\/rotated-flipped.html": "e773c3bbe0f72df812bf3edfcdb2fbd7469b9c852c06d235f2012cec2d7dedb804d615de3b004e1ece3cddec1136db0580a8f256197c1b07629468ffda1b1940",
205
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/tests\/stacked-inside-anchor.html": "59f6a4cd94a0790767d72b0a4f83d1d749667d43bccd60628e271cfb934ad7adba2d8f913c4f55708080aaea6c781b271b09107b56f276c996b49f60a18e911c",
206
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/tests\/stacked-with-text.html": "37054624c8aaabc00921b74100c417d1dc43fe9cc46a92ab6e4c17b496d5c952416936093135637f9f01c41b78b73c727a5d921f036bb0491329a42e3fc8e8bb",
207
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/tests\/stacked.html": "644604c9302130434ec413ac9f30532013d3dd3d0ca6f36ab14bdead72ab56386bf3faf46a0993ac2d4ebc46e37b853a3415bfe82dd602b9379e6260574e2323",
208
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/thanks-to.html": "e95ea8282f36803c852620a01d0d8dcd0c8bc217a863db947aedb700f40f2f3e63f3aa64bb32e10cb2c2a4e4e25aa85f65786106555cdd688035be0bf8dfeffd",
209
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/why.html": "c8bdd398cd372d29a4221d90003e41ea64851afad508ddc07a285e59abeef7fa708db378de329ee5d43d160593c650e6c79a0771448c435b864256437f665da8",
210
-        "phone\/css\/font-awesome-4.7.0\/src\/_layouts\/base.html": "55c3ac21d5fcfc6af1af7b534ad3dd540d6fd574d2b6f16b4a1412977f7e4aa52f3fec17e01cbd8707bbdbaae250c5d14fe3bf776ba34c58b31105905001a92c",
211
-        "phone\/css\/font-awesome-4.7.0\/src\/_layouts\/icon.html": "d58a89c5f5e459f76b6193976ad8d6fb2790c761344afc1e9714cadcaac4295fa33600060fb719de9ad2d6b4bef445921cbc94e9a7df3163d198cd229b6a673d",
212
-        "phone\/css\/font-awesome-4.7.0\/src\/_layouts\/survey.html": "3cad49f4be12b65f99e525424b4a9da671b1c9e103b0d086f60bd9c0321c58048c83b2e2473bf7fe39ce2a8954293c6769ee23a11511e7ad9498b95c2b4d18d7",
213
-        "phone\/css\/font-awesome-4.7.0\/src\/_plugins\/flatten_icon_filters.rb": "359a2c2e490019fbd73818b7bba512408baa61cb9e3519eb97ac0d6998148e753ef1b9e6efa71bae9f6450399a325385cc7377db998256726845e50d94814d99",
214
-        "phone\/css\/font-awesome-4.7.0\/src\/_plugins\/icon_page_generator.rb": "05e73c7a8787eed87f8d85f6e4c4508d35a853623624fe1addd208172ff8ec5ae7f5e5ee7b546c044f2766843e07d9b9d492f708697f319a3cee839fe6792fcc",
215
-        "phone\/css\/font-awesome-4.7.0\/src\/_plugins\/site.rb": "c7e207a821c852b18991122f2397613a8f9ccfaf511b80235a8a17807498f8090df1203c80311b53558fbad4bb3b251267854701521f8b639f7436403e1f21fb",
216
-        "phone\/css\/font-awesome-4.7.0\/src\/accessibility.html": "e3189df725f9a93f691530e07404bd5f0572121bc8b4f22f94caa724e783be7e1bf7fef39bca4dfa99c640689d6ccd7f379c7750e12e3f6d0422524554ed80ee",
217
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/css\/prettify.css": "6947c12db54c8c2b0900923b14b3a0aa8c15477d9b767bf6c7d401a3ed1b0393ad6f03b7a44a11bd81289fc350608f0fb1cfaf7df80a67ebf7ab37815df7a453",
218
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/css\/pygments.css": "35cb14cd45b94b0190d26a84549156caa20469918569cf3a382bc3b0ec200206e553218af8508c31ade050241c304faca75509741b9fdac87a78876f06a8dad1",
219
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/HELP-US-OUT.txt": "f0ebc1e7ec38a8cd333b34e2deebb416ffab31f3cd707f27e310beff328e5e05962a023da606c62559c8b606f7138b90896ee304fd45e86afdd2910ac8cdda57",
220
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/fonts\/FontAwesome.otf": "a3acaaac3a9861ac7a4ba23e52b9115d39b674cb685b45454fb4b80329a4f7370b5ea7dd8b41d630798f8a54082b62411fd63332752296dbf5f2b3b96abb8874",
221
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/fonts\/fontawesome-webfont.eot": "c160d3d77e67eff986043461693b2a831e1175f579490d7f0b411005ea81bd4f5850ff534f6721b727c002973f3f9027ea960fac4317d37db1d4cb53ec9d343a",
222
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/fonts\/fontawesome-webfont.svg": "4f575d52331de91a2e32cc3408dd0eaf0cf25b7244d34b226314e3647e85ce284f86e3b7238c6c8b9022dc4e2787bf51620849290cdcd5d4c4bc905f289d2156",
223
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/fonts\/fontawesome-webfont.ttf": "9ffb91e68c975172848b4bba25284678cc2c6eb4fb2d42000aa871c36656c4cebc28bf83c94df9afdfbf2407c01fe6b554c660b9b5c11af27c35acadfe6136ac",
224
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/fonts\/fontawesome-webfont.woff": "9c776dea55a01fd854ea23b3463d9ac716077d406ecbe8ed0c9b6120ff7e60357f0521ab3e3bf9d4e17ca2c44a5d63ee58a4e7a37a3d3f26415a98d11c99e04f",
225
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/fonts\/fontawesome-webfont.woff2": "838fefdbc14901f41edf995a78fdac55764cd4912ccb734b8bea4909194582904d8f2afdf2b6c428667912ce4d65681a1044d045d1bc6de2b14113f0315fc892",
226
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/less\/animated.less": "871260979d82ccbfaba0da449a8db5fda5149ab93f6cd4c3b7c7258f4b02519010e4b9488402b3bc1483ffe9b1c28e48371827bcb3815d8bf2c2c9fa2c3457db",
227
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/less\/bordered-pulled.less": "fbc272ec15a506c75aa742979053bd53c137e096b9577dc2c2921ae05da4beef051b5c73d523e788009e7473cacfcf2a3f3be3d756f70533fcdd083c28f06283",
228
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/less\/core.less": "7dc7ebd8db2a4a82608ff2bdac7dcfcc25ceaf328ca3dddc24b4d9288dc1cb0fd9666f049a24e84f49de93a9808bf4558a2c9100b60a18eb6ae8ced3ca1e08ac",
229
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/less\/fixed-width.less": "840595e81ca021f4171407c5671024890d8baabe223d4aea8fdbec4af80506e058a02c007b9a8eab3b22b8a1233da5331645f54d458d0cd85e126fe7ecaf0f72",
230
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/less\/font-awesome.less": "16a2f4f83d9c99c04db5f3a2f8b8f912f2615815d46b4248e93085a0d85b26da4602202e7edafea260cb4effb3966a29f35c5718376787df53b463b671a44358",
231
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/less\/icons.less": "fb4ceabdd56efea26de2ca8b1d36eb5bf9449945597d8a885154bb4826beadd742d7ed7bea85d0045b2212bef5271218202ea13a9752162c58f828874c281c12",
232
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/less\/larger.less": "fc61ace85bfb818341e45d7ae4863fdbf772ca3880f056951a8029fd0c0bd2aa64831cd446ab5f8dad19e4b332732eb5cc0d1f82e07ff28284a270545e7c4fc9",
233
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/less\/list.less": "93822d88bcf9a647867411a47721786bb3404a45dd78b1155b1601dea5327f4cb913248014494101d9aaf5ebc53ca8f7b0d279971199c84d0fcba23af42cb3ac",
234
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/less\/mixins.less": "49774e645ddbdb849361cd519f93ac859896040ab6e282c2ca4b7ee5bc3f0ff9ae33febfb03af13f5c3c70c64da49020d6b38aee87c3cb49bdbfd2997e008a39",
235
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/less\/path.less": "2214dadd8025d0da912ee4e0366a25b6d521f61ad04cd61c0b13140a9465d7711db8a80e3c83bc5410624eeef8bb2dbd1aba48cc3fa39b75d5eb5e91afbb7ba7",
236
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/less\/rotated-flipped.less": "0c410031dd5a13e53659de9933ff7cdd1c474d7aa7a92bf3f0acc635099abe6e09eec47385178ad757e604241d8a0a631c4c44c025f588889ce003844263ba03",
237
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/less\/screen-reader.less": "7d5c0d28b78b9c24b6af0181f8bf72d1b7bf20c45edbf1594da8b4c8391dd24920b9d0ad186ada7217755cbbabb9bf6ea52acd8ed39f7c9abf4659339eb70504",
238
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/less\/stacked.less": "02c86ec39dd5c62d633350a7ea40f08179f45d45ee120f980fba55dd9b3268901bd29d83029889982e180c890d8407f9d8902c0a83d65f9eef8cda449dce9b7f",
239
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/less\/variables.less": "20beb08c4fd41e8ea8c5f83402e381f4cdbf5ada68fe4f55a3b7131e15376da55615d9abca6bc4ebe1c5d592f43bcb68099c4fe8291000dbea7aefad87bd0cf8",
240
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/scss\/_animated.scss": "0e27405ded612c01c0d1fdb3327dd0e311ad92146ba05099bc7ab26486fa2e1b6705f642078027696eb66b07e05a0c4fe743c24f5ed28c99b62a095c96e1f0ce",
241
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/scss\/_bordered-pulled.scss": "7e4c565381a5bd3de2c6a7d2d706b592ff23b9634e8aee400aa900abe45b34a6c0a0457661d24c39d2688c0d2464f69cb1c6b38460ad09c0ff22cfad1aa572c7",
242
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/scss\/_core.scss": "a08d491eb1c351847ff35af3220bb18d3f7bf301c56e34f682fbb81f27612aa26ce32cd9cc491f82b23da16cc2d17e4ebf9afebb2d5c040f8639476e247ef912",
243
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/scss\/_fixed-width.scss": "63ff8f10bd612ecb27b17775471d3fd2156e23f20ad5949b444a9ce5c7f5c4c4e963579e90f868d4bee6cabc30ac24c8b428a5aa448c6329e85a3082e688d228",
244
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/scss\/_icons.scss": "bb0c2c272dbd75b0da7e1dab2155a7dddf4e4a15db41f6bba899af8fb0ccb6dbfc715806962c52596e8ff54655a62d12892c05e39cf8d94a32c1b0138798c3f7",
245
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/scss\/_larger.scss": "56e124c9477776ebbf03a9c1abda1216998d58a901bf6ee377c50f7239fc048a2fa72add0f77c8fd01fe38132250a6ecfb17cb37a415b2b2efe38fd0432822ea",
246
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/scss\/_list.scss": "cb337c087a7753cffd1298f24f3a6fda676afb4116f2a9bc52182cf0be3b2baf916152a146f808da073de76f8015157f6384c8c8cbbf743fa778729c2155e058",
247
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/scss\/_mixins.scss": "1a5738e10348256551ce5e24ac2c2999cfb471f59e41c6bad9811fe00cff0d5d91fe3941961ddae0ab799022d1efd55bf771e91ef9198389dbca737c4bf5808a",
248
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/scss\/_path.scss": "9eaa7d29bb402c790bf1ad40ee849e26743d198bff3cfce0182c2320afd9d47f4377b2bfb147999a057604dcfed33e408065577a516be0f3623fc0df75120912",
249
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/scss\/_rotated-flipped.scss": "214f7a0b8237f34b8c95efa9dc56ec15b61700987b8e240fa1d97c29aa2f615b87913bb28a6db1dc92ffaf3e80984e4b5f0b602b94f39604fd4613fa5a146411",
250
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/scss\/_screen-reader.scss": "5e3c8df5f64a9ddd9c7dad6f939156090e832a43c4352f7f470169ba22133267931f53100da2a4f4ec5e5528734c5d60c42ebc64fae6a5ee1dbc2e920dc343c9",
251
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/scss\/_stacked.scss": "10ea316ec6c669b0d07a17eb585f73da0038a9ed622d3e0bb0751ca5ef61159ce6593c3c53e1e0c589f3dd3ddceb2e9c08215475635611fbda9f8e6f7ba5c7a6",
252
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/scss\/_variables.scss": "f036c1d9b7c98d14708c711ee7752db086211c571af722c0e726541fc1429b1cdd1beb747e5e06547aff18f12f2a931e0e78f42e2ecab8f9b70e3fc2a57b9b04",
253
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/scss\/font-awesome.scss": "0f0dfede40b047e2fbaf5090d3f08a06637444c3f9bdcd8cd2242a8d5df7fcec938e073b1f7c91c334646e2a324d6de12f2673424ce7439d45b99eba020361fd",
254
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/ico\/favicon.ico": "8fb75ec6e7d4290d0f342ab1cbbc4d507326fdcae091b08c25a27be56629ab35d96b999cd06c10aea1db67895dd3b3f74c4359c0e4b1f429503bac3764a76992",
255
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/img\/algolia.png": "d2af6d614e206d73dcce611d448befaa4899b09ecbbbf0a0aa6dde1e268958415ea5fd9a2a87b9b1fc7354fbfb1c1161ebfd7170ec3b95fe4be790408f6c89d9",
256
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/img\/logo-themeisle.png": "ed8dc9ff39b794aed38e9f2cf46993d72e027d1f15f662b3f98eb6e08cdb700f0bfb83fccd4e16cec4be2d0f41b4ff0afcc3776f4a2eddf05fa6fa2b639b9445",
257
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/img\/logo-wpbeginner.png": "9c6ed3015a57e44c0538e52080de6033288689387e12cb648500475c42e2fa736cb027e2ce547d63750fc5ceb3831c3473c656ac3e04fa313aecd399f23e6ebe",
258
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/js\/ZeroClipboard-1.1.7.min.js": "99deba8b85b7aa2c092af1b7a2e09757b1b82b6c9509ddf5af0edd48a10a1a7e790158cb473cb86aa133d79d47142f14e8fc15ff4cf3ce9e39268af6593ebcd9",
259
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/js\/ZeroClipboard-1.1.7.swf": "bb635b563a8b0a637d455127a40bf817ed57c4bfdac1cc07858faef1fcc488c3bd9ad057cba83ec38c7a2cbce0522ab402c4d215303103f6f3227db36716ad34",
260
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/js\/html5shiv.js": "d3915b572fce20ce95c1d5a0bb75f424bf3d6f71e726a77afb50e85c457603d60241cb4698227dd3cf071b7133fe444cf2f0e6728913058731173fbbc9ccaac8",
261
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/js\/monetization.js": "7a8e7b8e79aba68f409fc32188905637e798d79de92305c5907c339ff1c9bee5f22f2d58e499e73316f6bb39db580224299d10560e9e29476f819598b19b5076",
262
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/js\/prettify.min.js": "7162bb9b467682742f6d87ea94300000064fc54e15193c3d7e5a4f898f0ad7dd55bad8f01933eb625ab1a0f4a8191d7062e1acbec6512ee610d2c0c413c0b34a",
263
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/js\/respond.min.js": "a133ec6ca8b11553f9e940bd30faddeeb2465bd5cc9b48f3431670140c1f4d1d74b2362729e1e907e50d6a2411ea58b2027996ff0ee3e5f7a420526f8efda5d4",
264
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/js\/search.js": "1a925281a9fc0721c8b290fd8f6048db5bf31057ba7050228e7245d05fb1fbf6742884355254f00ef1bd68a4542bdaea73375f0eac1f40ae21f280d0d08f37cf",
265
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/js\/site.js": "71e19b41cf03a3b0bf05e1bc0c07a0ed3cff51968470b22502d26357a337cff80179d9e2546082851c07ffafe2427919104253f53c97540f90dc2591662ef9d5",
266
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/.csscomb.json": "7d746f81e37b2a55e4eda116b76f688e057fe1e7a7311dedfacfbc2943dac84b2bda9612140cf7f0089015533d9a00efd90fee5e260a2bd94b7fc73737617368",
267
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/.csslintrc": "238adfbeee24fd202885d332d1316c44bf23a37e1899b9c618215715326a3a0a84112ea18f345203e450d096795ddd7b859a055296f8d2f834b2b0eb7f7d5f3c",
268
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/alerts.less": "6ef653823ef237fa019122796e00afeffe3e6f69773b3282e70595946b936a8055865fc1ef115f371be0c81a4b2abf6243de068d8b75b071fd856aec8ba87d91",
269
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/badges.less": "ca5abfb72cce5fcd7958c53fad833af4e8321595538ee76a4c2eeacd79f217f8465c1b86bca32357daf1d7a82edef5560bb9c69c11d137a1aa1fdb8da16d82b1",
270
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/bootstrap.less": "abcad45a2e54b3b501bb5219bc5883702fb9a15e8a23fb9b3a9c78ad705b99ee39c042972ac756409bd85b45db460572949374c0f0b8eb4885ab4d7529b45e93",
271
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/breadcrumbs.less": "66bc7d8baa9d552aa7bb832fead9ffcde5e9ff1ee9aab436c6599566bd3b87849a74e1a888d7d33bb925016a2dc26d0f046ceaff40bdb06464a550a64f27207b",
272
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/button-groups.less": "b99d1ac30a521fb6163effb388a25114b8f849718bc1a2c32bd4c36423e1b51b1d45b6be181ec0ad39d44debb1475e483456c8fb21d86bb2356addfffd488c96",
273
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/buttons.less": "d2795ba4cd91e07fffe5ba49935b36583c324479ef3d3741330e9267430b0f560f24c059dc1e62c5bcab21084790a87d38dbae051dad3a6e50a403abc7b7ccab",
274
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/carousel.less": "e9f601bb603e0a39d1fd7efd07346cac7d094ae1cbf8d8b95dd2836baf7c25757660a532f1a7d8881c9582234f07b64d57e81ee5e863c901b141b6119696e21d",
275
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/close.less": "e2a6a0877df37b1796039939c179b98f2768291a1c8ccd26fe6848590fc865df9f6f0016c6b5b0d0e7367746ea27c8c9103df4bf5efbac063059e4fdc0db3540",
276
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/code.less": "3932fc44533043a4000c26e4fed51f231c2dc054e561c9d4167a5429799b813d4b28654d9ac411e3a425b66217b090ca72ddc3d5963459fef01fc92386ecf525",
277
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/component-animations.less": "bd7517bccb89a397d29bfb1db20bfbacd1b28d4927330168d8984908c1e7d0f647c0cdcd646f8b009344bc967dc751ccedf0efa872691d23f26e2e3debd6b467",
278
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/dropdowns.less": "bd193d3168a7ec1eb89a484c5e79c37a4ba7d6cfbf5b922bb2e7037b88c3b935fc31a9d9c3c52a92c41b03640a6bb12d61917c2f0128c33c64409e0531ae7ec7",
279
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/forms.less": "c8893acca4ceee40dfb2fbbde9720efdfd8fd5f1e74b0202be26aa3746c27c5e836f7268d9b44466086f5eae106571d4be2d4e04011f85ad45d7ededecf4d73d",
280
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/glyphicons.less": "6f909009f4e9f2b6aad0337c650a3e396b63341ee6c4099baf4537a07256f423dcb969f3f452559b0b3790992cdbbe272d52f4898950b50cf386297d5ac693e8",
281
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/grid.less": "9638e08c198425b7e46b2178f022af3c4566adf6e9cc1ce1386b595fdfcf7a07ee51fa60fa9f3c55f02fd9ae1d2e1198e9534171582b0fea5db0d4288854e215",
282
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/input-groups.less": "c8e470633c05493fc778a64600ffad97737f34a94423217849ce01b77054a8c1d0fdd85350595c7c30bfadf159a8d1ca2d04af9f49c08795e9387020a07a4447",
283
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/jumbotron.less": "e3c97f308f50a5a3914eeceeb9a90dd1a7e802492c2c3da657740c997852ee0271a1dc06fd497ab44625544314c4cdef3bb16cb0bdd5067ca9d89b5cd64a3f17",
284
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/labels.less": "640e8861faf662e06fd4ff06a92382a27319fa39761c78b8a19c4b0ab2b2e440b4ee7cdec8a0f7ce67a12f0596ffdbbd19308e2e9a63d164709ee083edceec64",
285
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/list-group.less": "a11b70ab5618e5ea686893fce866074b51254c93d5bcb02fe30306d143b791e76b3672b7f8fe51545ef30d73ab89732bfc45cf2179dcf9ae07ce38d27389f422",
286
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/media.less": "e8d21a5bc99a08d3d04ee371ded649b3cacd1265988efedbba1e8aaead14d346326c14b64dc6aefa744e232ef6ab46d4ba8a1d23e7aa26b276633db92ab94420",
287
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins.less": "f8a8d51bd105a260e9db963e2e7d636bc91c93c51f117574e199f90cb439daaaa32616356b884527ea48b9feece9724952af7ec1452355703df624c8b498e5a4",
288
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/alerts.less": "582d9fbaf2f8b6b737697824af7ba9e47f98dd4a001b60f1668c2f88aed8bdc3e80311618bad7b07605f81876cbfcbc6830b620bef0ee9fa57fb90898988db79",
289
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/background-variant.less": "68709b0c5b5ba52b0f583b7421f79bfcd32c2784620f0ee8077a0d788ddc38a43b11863cec3b1a183451115f257aa7aeb58d077f066e846639fdd881ad069649",
290
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/border-radius.less": "e495c886182327408e6b82511baa49dcbf1e2b05104f844f3a57fcff40a49eaad548e19ce13853c45e74ac52689d9479792cc3de55a020c2229128f595d5288a",
291
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/buttons.less": "fa6f88171ef22558b095a136769533231a9b0ad8954211f85db3a42ab19492e0d456d5feb419f237bef68d1f75ddc42442154a4007a45b76f17608ec907dcfda",
292
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/center-block.less": "3b81464925a61dbb2be2b11d9be3292e9a3d42c65bc05e52f84b91684e0b178021dbd73e6f613c89f39c34ad311d039bb80332cde9bb64ccc51e0af49e63143a",
293
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/clearfix.less": "5989cda9e86899298c7e7c9cf73004d94d6e53f214dbbad93ca7e7e790d1e2043f768481ba9d20e1b7ff5667fbb4902b213560d09e3a7aa7cf977f55a9247614",
294
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/forms.less": "07dabe53df01d5324803837089f67f74b8e890330859fad42fda090f2f9a35280ddf531cbbc6b549e26002d5afba0e1773cd871c63c7f2f580b67a042f18e403",
295
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/gradients.less": "31b17118826eac8be3aad693382b82d99c01983b68ac37c5290d07920f76f61134c69ee12f9f5ed335aa392e69dd3bcb9a512636142e6acc1827f6db673a5a12",
296
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/grid-framework.less": "ab354cc185f82538cf2532bbe7a7df82dd197a6355bfa3c333164294e329742a800f26641fff2857f7269f80a30cb1fc8635fcf6c7575b7b98603db973d4a314",
297
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/grid.less": "4ef011c62ffaf26988e7f30749a58e251f316ccc3093b1c50d5c65cd66065e2af58bcedbf3447a97f5506df294bb2a31ec0d2ed01c70a977135e153991bb6fc6",
298
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/hide-text.less": "770055fd6a76bf5881015e17101bf9079d8e05188ea70e42ad8a2b8d4d141be3e7756039dd7b904786fc79c8f14ecc58d7c9da4122395d6bb5b9f8766c86e3a8",
299
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/image.less": "a0aa831f323ab27f3fe324453e54382b7e4ed8da5fa72e9819df2b3d07705c800ade9f8e5f732eeb36043096479798a812ef712c589164a629dce7fc9b49f75e",
300
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/labels.less": "3923340ff6b2eee8eda3819d42f4c4b7e6291f9edd2b9807c4548e5bfe47eca3076b62de3c5bf257dd7af4711eb1059f0e342984d2e7a606d2229df2b5678865",
301
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/list-group.less": "be85a41f96cf369a90b27fb5b1fe477306fd9687971fe85bfe8aac3a4ee21c775a9b55d2d0062b66a50e71a11368bf6617ab7962c39b978252c20631b4d55db8",
302
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/nav-divider.less": "89478e72ea248cdf80330b4fc356d0901ce5637e98e07419be49ca8dbd563d894af7fa7fb0e8acc8af4255a9c8a929615a19067e83ff554cb7db5a14ce3aad61",
303
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/nav-vertical-align.less": "2b5ad0e0e292a091f90fd02947db3dab499d47c7e44562005a02b4beee1221baf602687aefe63edd30b6ba2959fe2e94ca9088fdb0e7a548d5c722dd3684710c",
304
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/opacity.less": "39f3e7f370cbfe52d61b08688ed4e0070ad396ed7e2e9bc068d3f10d31cd15e1317664cad0cba13b15e4c60076f1fcc353e28e2b2fcb1fe5f3143ed87ae2cdf2",
305
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/pagination.less": "1344d77a2a54bdad0f7c731114e8ead128335bfab274b36f6ba8c02f6362acbfeb3718452d993f945f78af7f439f1240e4205af3b39e2d12883f9ab127a7866e",
306
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/panels.less": "7518af77aea6fa3fc4d2950ed0d7df5d9fb374f7ffc52333b8e4cd6a785b2dc8b1ffb12cda7e5fc3571bbfbcf7e480af1ea8ceefcea09a6af534949d8622e73c",
307
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/progress-bar.less": "b390e21c7a4fc508ea0c8403dfe7e89d0d7c2e6402cd1a7972f1ac3cdfeb354d6890e3d2c8d214575110162326b0a016055a548ca6d6f0fd146a035eb8896a55",
308
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/reset-filter.less": "1cfef8254d9fcd9d3142c9636270bc505cb7ff3d4e74faf7b3f5c90fd5d7eb4465fdf4affeacda7e7ce40800b8756d3ea2a1031f6729eb975acbba71b3a64b37",
309
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/reset-text.less": "e7a4f4abf9fbf88ac5c756798751d7e0b0ce1390607479a522d3044682a19054a1cdebce3a66a4a2bbbdbaeda9db8d14621f12ae7ae67c4ddaaa1c3f43c9ba75",
310
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/resize.less": "653227d4ef865d5ac4e8f844b72019847c1e06e6d9063bb18dfe91b4316957fec4f01063585275b8cec695b602edce11116320972306bd643cecacc6d80fadd4",
311
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/responsive-visibility.less": "4d75a3404f4f5e8e3364a46ddbe9b9a6c0e780825a71ff4e5ce7c712eef99caeeb47c198df6df4d22479a72ff769247548638bf222f492762fbba383028f3318",
312
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/size.less": "5961852fff078e8f3efb4d2584e60d59d5a74ecc325b53c03d80a63339a86757019d34b28435597ba576a7129bd697f7e974e4a374c772cf3d740f4ec27ec720",
313
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/tab-focus.less": "e277a74a513db05ce8c8bef7a2aa56a2e45b0a6f7e49432eb2c07d9e876a950292be339f6d8937eb0339794f632b6eda5fa29b9ba6e1c037b6dca1f720549f8b",
314
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/table-row.less": "60977b7f339f344350b9c904cfabb9209a1121cb26ea41cf516f01ce3e3f9b5f7e262c298d97f33a8a5f201595f3ad0166d800dd625287deb7d3d416a91093a1",
315
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/text-emphasis.less": "644b7f8385aaad90396707bab15dcd319a71f0a72eea7c0721caf98dfe53825b76973dfcb6ad51ae6cc28d181f4f244074a7ac95c29387231697db7de5af42fc",
316
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/text-overflow.less": "a32baf8bc0d47de27e34ffe09a37702a0faa5e541d06803abecd9b82bf59de1bf0a7ea85ea23a68b84726c984ab0caf62e520b1165b80251c031fdf3060f6c20",
317
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/vendor-prefixes.less": "6857da23deb03264fcefc6ca3fefd631571aac71203f23292024f20e0d5bebf4669b5dbcccd36df095460bc9027614396a9f42bcba832e968498d4ac753c76eb",
318
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/modals.less": "4c99c136dbcf3ebe6a95e694ab1bc14a1469f9dca8311390661e5dde3201dcacd855aa9b4400c54d16116a60c98412a06579938fe1c534c7b8643a22d0e6deb4",
319
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/navbar.less": "36d19bb1a44da00094675414d564a1ab382e3fdcfa1eed9e74f5f9ebc0ea5cfbef151996a44de9c9a975d088f409f73fbaaf01887ed0ebb1828810d82fdb3e7b",
320
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/navs.less": "d19df77d08c0bcb9a534533943e2f722a54d26e94cf328849cdd77aed4e1bf067563c0cfd4997f8eaab3dde47fa567025d3283f979d8be5e61c121b784a3d98f",
321
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/normalize.less": "d0a2aafb6b60e57d40747d6b1e36f25011ac250b853eafb50478d4abb1c166aa89edf393a62019081ed19e08b32c6f2fe013edb00090437dd8fa5737379ee718",
322
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/pager.less": "7637659ca2998df19ae2d38304067029b9944db4e70a42c2d0e77ce52cbd0176d765490a890687cbbb24334bf098b4cf54931b35bddc26a85e205b81114dd6a4",
323
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/pagination.less": "365110bafb570d10002748f6d2e743a16a27cadcbe600d64335a1ac09ff690683649872012e3a60bb92a611d87f409b450bc0d9de28d6aa1decae8f70a1a0491",
324
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/panels.less": "d6f37fadce28cf9e90bd1dc47e0bf71b1bd8b67db3e19b0447d2a6a3e13def8cae5d2c52d43aecbfad80fcfcd0b0e24fb5eea205bc6733e10d90b22dde5f275e",
325
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/popovers.less": "084501129f4c74a32eedbd78f6888cd48789e5175987dfcf45385c98a54fbad40654415e6c531a757b1108937ae9c6b9c81404700d754fc54eb925ea4516efac",
326
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/print.less": "9c4f44378fb1cd28535572fd768baf652de2614f31e62753ba79c02a313ab509db28f52c3d0c78665d2384dd7be47edf97e243ef83c6b22e38edec56873aa1ce",
327
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/progress-bars.less": "41c051579d9fb7949b128dda04dedb2ed8adc358b157cf5450d375962323725ee2faa7a4033613471f00544596c8fa400d22d9965c77544aebf6e56b3911cf49",
328
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/responsive-embed.less": "a0288862649916929c2de7a5c982f877847f687422ed205fcb9b6a197ee98a6bf52fd012725f894d951bc6ee4bfdee0a4a8363e652f93b8bb98140aed1995533",
329
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/responsive-utilities.less": "98690e8c90ab2c0c4d9662786b7560f2198a968a4f4ba253b8c87b9402b02c339516c89af569acef3f6f37978ead0a41b234a164f5f16d4828e5bd2b0459f370",
330
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/scaffolding.less": "882fd7d208e76e926ccb9c88ba56741e8baff7b6a46bb17a4c9652778864e63ec04f5113628c6c39c4a94392974293681e560a0e3015226d4c1a66c19e085419",
331
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/tables.less": "8588df750d6291bec4a2359fa6f07658d0a9267b319c47560d61ea909aeef592123fba6aa0ce3cdff19fb92849bc8253f67c98ec5ddeeb782ec73998034c67ec",
332
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/theme.less": "9b0c31e6b9f57bb814edb418813052427ccc97fa23a1ad9c29e1b26f9eb26921948727ed5804cb72d302f53387f4e87aaf8c436e10cdc60c39d3d10a8e89f228",
333
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/thumbnails.less": "000fb95bc0b7210a573f6ae1d336c1baaa78764a9ef5c5054c088b5bd993c4866ee8b5d525c35b0e99d796545389b0a00864c7187222ca23d1d5f395a804a6cf",
334
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/tooltip.less": "76459540fb8f856671ffa6da159ccef956144ec4e38bf73ff2c0f0af40130592d87f7fed1b1b9eda2bfc6e827b4f69dcfbd82a07101b4ec60b8a1e0c3d1c3315",
335
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/type.less": "e2f164468cdf7097e0b3b456bcbae8ba23774c9fa678f2eee698010924f8691a8477de1c259b7e592c5c75f8dc959e7f051a501788b4b7ed4bd73df89a028595",
336
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/utilities.less": "ac3407691078aa6dd779ff6ae1e9cd26abf9913ac18e24188fa31fb3e69b1deb31f7ee8cf8ee7a5fe778d4b0a8a7666faf0d6b30c46257140180a6a6147c2269",
337
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/variables.less": "ae9259421469571038a01a417a1faa001b312ee8a8c16b22022cb169b1ff957a55c0f0d9d31afebb74841f3a23b35c1c41b6c0d66da7a9d16a26e91f7381f0e5",
338
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/wells.less": "58014e2654e7364b1665d22a62edfa71828822547362fd42ffa3580781b4ca5a5ae6d209ce7916063ebe1f619147c9fc64bddd3b94105635afbdfcf9dea71d9c",
339
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/gandy-grid\/grid.less": "b8bd10ea52b0a8ebac7df606b883a3d9c3cd86d11db93494b822f848f6ff712b04f6155cfed3dbfccbd5676e5cb7ee9f1a965806476f771ba805e9433380b83a",
340
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/gandy-grid\/mixins.less": "201801419a28897fc914d74545fb9653cf133957c675f69fcb12fc1d210017d850821eb2b76e8c3e768639d47089ab647469147646c2e49761f143c7c9800b09",
341
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site.less": "2613c3caeb1d7f65290aca49a2dadaf2a82058e915f81fa1e95d19a8cd2a1065e80af28f870c74048848fea4097f3e4630b06b63c54ea2219ca1527e22053dea",
342
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/algolia.less": "3aeb335ed5081bd89f699218f6a94aa1d1d67e9d0f12608b880fe6ded5948f1172f93c4a3604970eb2e0d57bb88f65b192891e2ad77c6b4ed6d9bc4580d64ddb",
343
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/banner-ad.less": "f5617e2a0610c67953cef2f11f14d969f2acc4d6f19155a3b9386e6da7cf938d1d0cc6d2f437348aa03285683bccea3b1e0e61b644ed4a402a38e85c0cf5e9e9",
344
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/bootstrap\/alerts.less": "5bf122c528abe73261e3e5fa571cbef01e133e767c7d59bfcaf5ed88d4747c66b26c8c6f543de14349e5c6ce30a0985cd1ab5439d53bad1036ff29fc35d466c5",
345
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/bootstrap\/buttons.less": "e770985ec8cd35b9e3226af40ea32b31540baf07189fb8fb80b9dde4bb6485297afce6e4aae54fea3760ed643a576d8da45b4b76f282edef0487d34f4f1c473a",
346
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/bootstrap\/jumbotron.less": "8bd6c1a7619f6eb8e89fff5bad824869909c1650d69b7bfbd6a62388644fc906b74de7d4d826c6ef4fd62fe15db80d4a92ca00261ba1f704e30c494842ebb560",
347
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/bootstrap\/labels.less": "33cddb047fd6080281598dbb61960c0c882fd55d116103531413dfa228b2da0ba7a1d74e1a0a784027e2bf196839d44a7ccc0d5bc6d6f9723618c5aff1a90e80",
348
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/bootstrap\/modals.less": "e7bd46144060a749a799012ddd68eb40cc2c2591163a5a2daa5814bd3eb4ae9bfa6fea8729a1ef9bd26956a88a069c0e3673555d2cceacc2b486bade7578012e",
349
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/bootstrap\/navbar.less": "fa7cce0e8647032bf6f84be86cbb21b51fde5ab235d4c9497ae714c450d29a8bbd072a6e0764b1c9b646d5caa1b5386e4b365a08ac725e687a5a02c5db0af717",
350
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/bootstrap\/panels.less": "dbe49fa43779ed116880f620472a17cb0df73f5e1b4ac422727a7efa5f7820d24656ab6702a33ecbf418db70eaab3dbb34c6c52c8856d925532db6027819bb7a",
351
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/bootstrap\/tooltip.less": "48416fa9b750f9ab909e6ecc641a3227956361d458ccace89d5c784d3fbe9cd58d2d8e4a1876062fd4217538dd361286b73b72d65fb43b9e8480e74d8ed1c7e4",
352
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/bootstrap\/type.less": "387eb060b9fae5bb9d75be7fe4243ce95d8331c6bfcd3da567cdb79c750f8bd8a45d36959d0717323b267a081e7c18ace43df84810008256162ce9158bdca09e",
353
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/bootstrap\/variables.less": "2c0810ea534208a0bc6c97f87b61d7788b9fc7f16c63dd30a10759495cfab6b603fa5a1b7b80d3d70897f295065589d9d95d660e8edab05627f0a096996e235b",
354
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/bootstrap\/wells.less": "b1e85ac1c8f2b0a3b372d9e3666b00592e299004c7624f8fc27458dfe2cffee3093058b4c9867ac589a48727d5065ced497ae6ae6469636689aa2d2c9b8566a4",
355
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/bsap-ad.less": "17d85c0b18c3de440cd3ee34fd9f88b20bc00630ddef8e753bf6b0e93933efd8e5e8ff3694ff98df19b422596e374cf28e9193eef073b92e62f3407608c44652",
356
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/carbon-ad.less": "c06e5dcc5d97495dcb4acf6eb0dd9eda68ccf311b808e167ec37cae91af8a8b2f963cdbddb8c489c565323447df2f6fd7d62e6d20b8d1fcfc9849316c4eb2758",
357
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/example-rating.less": "3b62779f2d1e1da0e09614e27e43e369cb6860ea3e3f25bb416321d22355484faa7ef06dcaedb3b0ad62cfe76bbf89b8f5bea97c22d7b883e1d048a705f94486",
358
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/fa5.less": "230d28cd06d28dc7a3698a27b400c643663dd239651c29978bc15d3b86797b43b7530b39730af185c33d6c80f96515ff91e56e3da01a066bb85003d88480082f",
359
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/feature-list.less": "5fd9507d3bd6a2a2f3487163ef9168b5db241055b93013555d74fcb2b81ae7866c5011876831f5ade138242a726c39e327ed7c820c760aad4d4f561b52836d45",
360
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/fontawesome-icon-list.less": "be0af7e5d5a793d5587c79e02ee245e659ea1de4b1bf2d187971f6f51b6976c6d07837c79659e77aa6dc52d0a423f6744cefb537a37245ace430bdda7953c846",
361
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/footer.less": "3195eaff0ecc028109d7a79a1b6d6850d7e619253d4a69c69e7470421617d05cab7a7daa95eff1bb6fea458d6848795fa8f56f4089207442b4cc34fd7f926a96",
362
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/jumbotron-carousel.less": "25fc6b59ec1147d0ceac291147773662201799313a4824ea103f7510ea9b328eb9f27ed9768d1128ba655c493355364ab3f95ab4b58b10d7286f17e3b903a5a3",
363
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/layout.less": "caf18d839d6a84d1cd0e13cfb2a2d9e5884ac802429175b4da914d77f896155d3c5e4925f4392044827a8f87e79c0f97876432f95b7125f0f20692e2a08463a7",
364
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/lazy.less": "e00c9dd4e99db9ec174e6b50dc856637cfb57fdb321b72f95a319b5772c6338f7e1f89d109a6bc18ec890c5d275449f87525dbcc272ae3e89de8f4bf4c6611e8",
365
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/newsletter.less": "1e1baa0263cad5613607142776bee6932e57173cdd77cf5a06f79dc104fb479e30fa8f56f6fbec770fd90e5d456d016747960d0943bc01a4d7128a2b336fefb1",
366
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/print.less": "47ce33620e649fe5f9e899daf9b990ed8ff131146fbb8a21b6816f81bb854025bcce74d146d0bc08e345502fae36ff9d16dd879d72aff48712c1f0d2dfd06964",
367
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/responsive\/screen-lg.less": "25b983b0a15d3d09e2c2eae2750bef037ea4cf6bf67b275b40fdb615579143dd6245dd9ff53044c67254f9a84efd05813a8d975992b138149fa7e248c26adab8",
368
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/responsive\/screen-md.less": "4d88734ce346390a74caf1579f78b41908c5b386b38cf4724c84b7c4bbdb1de987520f51ee2e23bbbe8fce2733e220002fcc18cedc790613f0e6c1ea519baaa7",
369
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/responsive\/screen-sm-up.less": "5a059b3ae6b0d1fb6339b5a031f036f64ee7093271c19c45defe57083205152a57e82e75f6e7cf9d95fc5c7e3e20f9db144616034f90c4ea8803b4846d2da348",
370
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/responsive\/screen-sm.less": "b988a2ed6bb237b5c25f7556a3e07b375c9ed33716015de07e4f7b7f787d35186539f05b2d4f752c5a59edfd43e3501d84d865530cdeec3a61320690d060af00",
371
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/responsive\/screen-xs.less": "5266a0dffdf45a7e45efb3fdad70b058f713a4476f7e356096417b139f4d85d36a8cf9c99cbe4840cf5ba4ea438cc9ecc599e39049cc84d853caf7eafe0cc71b",
372
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/search.less": "de316ec445ee08ae2afd58ec4192419daff43fd3be40a77d29eef3e913dd826d633d9eebbb1b82ff38e0b1c62587c04b0ce9725ed1fc89a8cefffbe4a297e44c",
373
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/social-buttons.less": "acd3c69ed3cb1726e4c4707d9ff68bd0bbe928f5ab7a60eff22c7a239214d94ad0d7aeecd7bb1bf3a600ed8e11a44d7631e99c4eea14f3ca986ec38fbbd102ef",
374
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/store.less": "f7b3701892b29f7e84f9e98089f9d902efe6081adeb426a6330ea8bcb646345142b980d2187880f5b88ffce816a92ae990cb72ddc381beee017c4cd386290970",
375
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/stripe-ad.less": "b15f475b64c9f484603631269f41f319251ed78f8d12c0929b77a48c5d427742b56e2ca5d7ae49dfa1e179357535af024c561fe2aea48de23f79ebb6869f84d8",
376
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/sumome.less": "ce6ee2eb2c308a88e56c952e611c726c2cf158109d42918c2e1ef320c45d51269069ba0d50db0d5c443d2d8fa5634f86050794cd2194ff07689b0777a2f63bc7",
377
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/textured-bg.less": "e26572839aef1ebc89da8e1d443c5cda4f52d5e52473af89fdc2d0393b472f16e3e26a705ab8086c730c9215eb9109dcdcd42e6705ac9209989832b559b293fa",
378
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/views.less": "36c20e316fa6b35959878f3b4a70f3924a0bfd316f34c697a1a3424039fdeb670f976199a01c0896e9158a042eca193674988a4e91d995be289e78ea2ab2fcbb",
379
-        "phone\/css\/font-awesome-4.7.0\/src\/cdn\/error.html": "7e51a097a684678928af7cd5708c2a17222f9cbf81db4a9f85384d28d59031b48ac43315d167ffc0a45097014aea4341416b885d2cf8ccbed6e5bc331767b720",
380
-        "phone\/css\/font-awesome-4.7.0\/src\/cdn\/success.html": "47c4fe2b58da41de009380c016e277dd8beaee35055a3328fb9710dc2e24056ff62f6f9698cf531270c7cea3c96eb84336f201e98aa34d2a37c420d8938ff116",
381
-        "phone\/css\/font-awesome-4.7.0\/src\/cheatsheet.html": "a36cb07fa872f277fac0510ab5d5d640f8d837572c381041cf8623055328e827933b369922dd1c6dc82b7e4bc89d8bdbd19ebd21439a7b95d9b7b43f47d2fb44",
382
-        "phone\/css\/font-awesome-4.7.0\/src\/community.html": "df0bf171b74d07c35d650ed1d786413adae55ec2d74cd779faa2ecfdabf0beaeec77b603a11b9334e31cd74a5458c9100d9336f905b2d50c479fe34c7cf2bcdd",
383
-        "phone\/css\/font-awesome-4.7.0\/src\/design.html": "0df2e8909f5138f50322334a3b5bc65bef0b822cdeab29f8bdba4e077ba0f301a56e8724bfb730e8e6165afe3b761db5c6b6cf8ae2b83e74aac0b0e7563dd999",
384
-        "phone\/css\/font-awesome-4.7.0\/src\/examples.html": "680fb422b52d80c5503cdae6774f4feb7290a542ae93b294961dd96694f6f72c125b39898e21c00470df65414cf4e3e1ae31cc500097e7c8578fa223aeee33bf",
385
-        "phone\/css\/font-awesome-4.7.0\/src\/get-started.html": "f773d4781b5e4817544fdd144005157be79a773d3b1a8a72e30e98354cb6de28887585d4f64f7ea3a8a8ee8faaf242b77c8d4f1b1319c01bc1ed917da7a537b4",
386
-        "phone\/css\/font-awesome-4.7.0\/src\/icons.html": "77017e98ef938c868ed33d4c7125cbd6e5bb6bf5426fe9dfbc9548d5224ca102f5b6277ec6d9e26db29fbffe973a8aa8e77d494832ff3ee6918c8e2d0384be83",
387
-        "phone\/css\/font-awesome-4.7.0\/src\/icons.yml": "b67111f3a3a99ef19f5f7dcc27ff0ad37a5b7e74e288ead793b50ea319e65f4c24716b1ab412e2e12772408b5c1cebb56884cad02d425104325f39236ea4b3c8",
388
-        "phone\/css\/font-awesome-4.7.0\/src\/index.html": "e3c7f7f120a5f0015a7b63d9f84f71aabd6b669cf19e72be01e15374d357171948935ec8b4824f6aafcae82bd9916ccd8768d1d195fccf0b8f281f17c88ac174",
389
-        "phone\/css\/font-awesome-4.7.0\/src\/license.html": "a73280c350c239e7e0d8dc4f96dd9ec90e695accf6a86e7a6641ea68145e007b761324aad669fcfc9bd4f43781b71563b2900016b4c78797d392db6985cb7de9",
390
-        "phone\/css\/font-awesome-4.7.0\/src\/store.html": "a6de552c4d0099c7a4586a2c27ad1bb016461a35bf3d7ec0647ba93c55146e53dcf51b52daae17330a734279513dbf3e6586983574ed5e28d0707bfdb9a13dc1",
391
-        "phone\/css\/font-awesome-4.7.0\/src\/survey.html": "09b3fb7dd39ff303d463da73133ea78ec9a60aa5f7189929ac0a8aea9fe51c09fae1bb8c2c85772001d4e828a42b7e4c4d57419f488f49b5a9584dc010365a10",
392
-        "phone\/css\/font-awesome-4.7.0\/src\/test\/2.3.2.html": "70f712d192f8441b7e2a5504b84955e42360c56b3c2b00df15472a69a4c435c74baae6876c4e8f9d00572f7bc7f24dd17726604025f89b12ecbfd1710b8325e3",
393
-        "phone\/css\/font-awesome-4.7.0\/src\/test\/all.html": "8056255c377ce11e2a51b001330f29ae81462e4ace4e7e3ff960d4e661cc282eeef4ef168a307a01196a830f2fb8dcf572b39c3cbb5d77e8bde8643f2a64e869",
394
-        "phone\/css\/font-awesome-4.7.0\/src\/test\/glyphicons.html": "b21a79668cf8d1a330ea2148e2f1089d41420f7f0e23b2862ea01e1e3c459d325247339aeee5d6dee5149b4f0f143832b819d07138da87eccbfbe130cd9ff650",
395
-        "phone\/css\/font-awesome-4.7.0\/src\/test\/height\/4.4.0.html": "435d1525deea3bbdddf21794156acfa355e9fae0ecb37a64b3e7486d4e3ea798c2d95ceadb12fc3b3f9b4017530e00eb0e44f1fc9c5865013520855b2b184685",
396
-        "phone\/css\/font-awesome-4.7.0\/src\/test\/height\/4.5.0.html": "f8e27986cc8539878b4247d92ea56a4750d036adabdb0b208d5e2a6c0df1ced6f4a6a9fd4d0f9ed7c0cf695233a16f6bed7ab0981e7bd57423f55dc5b3ae0710",
397
-        "phone\/css\/font-awesome-4.7.0\/src\/test\/height\/current.html": "dc9b48458c1841dd7bd085f7753ccbf27203591f68f0278f0b9df1cdaf9beb043a35d9c7b9bb500a2667543582d4c9b40b5c2f144cf88997d8dc84fedd00ee1b",
398
-        "phone\/css\/font-awesome-4.7.0\/src\/test\/index.html": "8060c06227dd2096d27afbc55f027214974a38c5f711d3f0c77ef1645441302324102037c7ad57b116d60c8aed2d847655bfddbfe0ba526fb0b5966435b509be",
399
-        "phone\/css\/font-awesome-4.7.0\/src\/thanks.html": "cf0b677134a1893d3335991a2a9b9533812447a0817b88c03c6f27c967fe8956cdd17b355b6abe796617d83e0229c945a557345c11580b636b5fd633af273bdb",
400
-        "phone\/css\/font-awesome-4.7.0\/src\/whats-new.html": "56607f43fc358a79bce938d9198bb7b091159d9aed52a354b57027810564973ddb9f0cd36b6ed8e573f6e9f09b25b043cdc88a1c22d212367e7794775a0e44f1",
401
-        "phone\/images\/sip_trip_phone_logo.svg": "271b9632efc181f514892220a648aa2636ec8a561e297c1a2abfb64a10ffcdbff37913bf8cc82ad362a33b4faf224e74b45bd32a9b1b760a2e0476d56bc02538",
402
-        "phone\/images\/sip_trip_phone_logo_large.svg": "b622744c5eff160b77ef7226d8f70eef15311db18d7dea9e334e92b20601a33d812cb0bbc3eef74d6294d1ab43ba3969a7ffde23d8ec2f7f9d1dbf6b6ec18e25",
403
-        "phone\/index.html": "4ee572d188ff32e2f7518c6dfd2fb2efcce4a1afddf7661128d3a04120483716f4006e261c61faadb9da64d5c9c09d6ce49cfb32f77adbf98f7703dd3ff253bd",
404
-        "phone\/scripts\/SIP.js\/sip.min.js": "ac923b5f101160a076034d6dfb2409fe479a4df6aa4cca358b64ef516de77f0c58b8faeac6a7bb9b7f0ac908e5773b0d567dcb3aa01a1a3bb5d133d41113a1c4",
405
-        "phone\/scripts\/app.js": "bf2e4c9ea3c61739b6463437ee9676cd4de2b09bba723f243533ece5b8c563dc3ef05afd43f18409de714f672b9b59ddeb1c6f6b8b65a28aa22b71b4843dda04",
406
-        "phone\/scripts\/bootstrap.min.js": "de8d6bf69932b479dcfe470e893effa9f88d399314b2fa74c14a1465c7a6f1da78a3764fa35ee05ddd6a3f225588e601ed5978d5ef48e353e279c596f2471071",
407
-        "phone\/scripts\/jquery-1.11.3.min.js": "25e4bc43cc350f38cab68b422101b528781bcd271a299cad39aaf64aa331ed0a35b9dfed3938ddccaa08c31161ee2c472acf297aabea334315758e128487b0fb",
408
-        "phone\/scripts\/moment.min.js": "8f42e847a067c9f4e803bed887cb458ca2a6973025a6bd7f4a0853eeb24b4c64f8284e9d8fd40066fc71e17a90b36d1a6477939ff7c4160dec09e11e6f90d798",
409
-        "phone\/sounds\/dtmf.ogg": "ff7217621c355aaf8eaf290f61a9fb228be899d055fc312de7ebd8a29e0688f82fbb629519db948737837df1e0aefe8b0ed0b304909f6149e97753dd6f50b791",
410
-        "phone\/sounds\/incoming.ogg": "666a28d6d6dfa0afa0d1be3d838c9b207b91ac5ef46a787b05b30da622a611b4f734ef7512bff873d3e6025ed1bd1699ccc2970292b3ca21d29a58990ec96a73",
411
-        "phone\/sounds\/outgoing.ogg": "b5d17d7a53e42215365176c8ce515bcc71fe682b92d6ee12a484d0b12d7f2a28b81db18b2d6e9073bd774728fe68becfa6c34b8648bca4a20a52622d7eef2fd5",
412
-        "templates\/content\/index.php": "44ea4db27e9af9e1c61a2d6c8431b22d17dbec2e9c732201ac8b81d56ae9d85e37f68cd11f9de2f5936e8de3d240ac5ebd28296f5994411ffd35f01d9a4dcfc1",
413
-        "templates\/index.php": "e1737e2207375f18a5d1b795f9cca76ac2acc20d569452081aa548c2980e3f1d2389afd483e59a29a600dfc766c764550c322c8de9ede58772b9d25f253674bb",
414
-        "templates\/settings.php": "e311bb045304186403743ca156df317e467522cf4a9829a753b94ec792aad38d833ab4f36a5b92a7e3975d73345e8e7289a7ddf4bef145c9fc3a397d2c2a71ef"
415
-    },
416
-    "signature": "ABVpPM1i4MgKTJ41pqIF0NwKqny2yCM8H\/0Gd1hIlXTpFAvJHrGgmvDz7qW9pXUFkWrCOhl6EyNfrIkLL34d4uAWKRZZXLbYr8iB9jobIVss0xspQDQHesFum3Zp+CDdhf4HySjtEOzxgTCQ01Ul52UlHChbebLDNOpvWtUQg8IzaSLWhj0ZsPXhpptC4k\/\/rUawAA9HadD1kewuDiwua0sVJbMLNsfOT9yrtnQBGQHQjGmepUv0Od7yyBt1VYECfQBMdHhrHgViLq5X1uLe4\/sGK3CNBEwHv\/9knMmcSSwqAQ43TcDla86M8lG6zFCIQoc9Tewrk95bSUlcIhxZX78j9OvvnFUYDvu6UaH\/IZyM7GUl+G97fDVQ0upUAoZoEV3OXgCnoTT5TbjT7z5pMoc0HcBY+6fPKimzzZyBf06Od0GQGknnYy+eAfBTJ9auB7lX5PSuAZwmC8uvlwdrPeEKIcHZEHhSxWsVJTjgXkqnESa28\/0wR5RraISANvRbHgm1yPjHZgL07d9WxM9+nPjbdWARL6WxcLF3hl81XB5K7ln14BGaTUUktXasAwea\/Muz2bvwPecJ9pJRJEV36X25IZWMRCfsRA6N77YqJuDqLQdVHH5IljuG\/E5duygPCHo1tVU11z04yeMfQNpsxcc2KjO1gVtEPuCqBM3kI2A=",
417
-    "certificate": "-----BEGIN CERTIFICATE-----\r\nMIIECTCCAvECAhG7MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD\r\nVQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI\r\nMTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB\r\ndXRob3JpdHkwHhcNMjIwMjI1MTU1NzUxWhcNMzIwNjAyMTU1NzUxWjAZMRcwFQYD\r\nVQQDDA5zaXBfdHJpcF9waG9uZTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC\r\nggIBALGXGrkLJY9XsqMXKDMLD4+Ub5HVr9HebfC2593+Ed41HVqIca9z3CdeXg87\r\npTjyZQhqsCzVArIJsmnH5pT02NYZDsZeARWpRLYWOIQeOJwS0EdOtWP6\/VXjxfw+\r\nUaDthCcfcj8TC7y+15zqwx9ERSc8ujXadGPqZEZAfGuZSy6b9+oXo17tT9fCbVeJ\r\nYyXibMWutUhIt8FvUQ2PCUYUity1kvn9+G3sOlPYMWDqPG3tt70EJ2m1J9ZX6Pa8\r\npmI8LG8IvFWImbX1\/+8YrtQZ0RQcoP7yX\/H6S8NvsAux\/sgMYNSEVbXzapE2TeMD\r\n1w0aEH3101twV+2cuKf8U+bt0Vha9HFNC06Nmu2lQkXPV\/Cdvx+DIKXhb3AaApgB\r\nT4uzRE4Zfg\/BZkspJ7IFObi2NpTv2T4frH3tZudOR\/OWtsGTpZbH8p12RK7yE19d\r\nMCR3DdVMe\/OXh1GaIc30s4jd6apskC33xZJ3IamyzY6EYLL41E2vmd9Eg6VMTGXJ\r\nHuOdAtJYy4R6040aDXfeNAnTcCVZQYmPvfnalQfcfiQePaWMyMVsBFy\/utq\/R\/qU\r\nTgtp68+jhvRH2YOxUVvuyrWhxY8PqhNHWlp5OYGllBdes5GrKvGIqnO\/q1nC6V5A\r\nHd+1SZSQJE1kQxpXxiDJeYBUQZUyBOiqM+GNfnZi+kVJ75YtAgMBAAEwDQYJKoZI\r\nhvcNAQELBQADggEBAIOJ8yPdp3vsRaOzsQCg8NdQgIDn9PZRtF0GjOPqVCOo\/ytx\r\nwIgdAiTAl1qvQaUjRSZf+qpYFPs\/Ojqd3DHi+ySPcq6PkkTWxkEpRmoaoFNAt0XA\r\nyOjSQhsBxuqFDmK+U6YvB\/QupGOSZipaBjQnaP5xufoiitIdRqd1XFHyBiNEfRt1\r\nQhLzrz\/u4PLaC6653qrl\/Jpd\/tp7LUtglihr4ODkALNQFWgY0n58tawkvTBaOpf2\r\nE3BfgleQKRa73g\/H3pGtUWtdXeTSkNHlxqef7l\/icwEDWqZfV8MIPRgEymG1naYL\r\nFIBUptO7eT+NDScFHKe4rtPK7FHhUjS7x4OcIao=\r\n-----END CERTIFICATE-----"
418
-}
419 0
\ No newline at end of file
420 1
deleted file mode 100644
421 2
Binary files a/img/sip_trip_phone_calling.png and /dev/null differ
422 3
deleted file mode 100644
423 4
Binary files a/img/sip_trip_phone_dialpad.png and /dev/null differ
424 5
deleted file mode 100644
425 6
Binary files a/img/sip_trip_phone_hold.png and /dev/null differ
426 7
deleted file mode 100644
427 8
Binary files a/img/sip_trip_phone_holding.png and /dev/null differ
428 9
deleted file mode 100644
429 10
Binary files a/img/sip_trip_phone_initial_screen.png and /dev/null differ
430 11
deleted file mode 100644
431 12
Binary files a/img/sip_trip_phone_keypad.png and /dev/null differ
432 13
deleted file mode 100644
433 14
Binary files a/img/sip_trip_phone_making_calls.png and /dev/null differ
434 15
deleted file mode 100644
... ...
@@ -1,71 +0,0 @@
1
-/**
2
- * @copyright 2021 Double Bastion LLC <www.doublebastion.com>
3
- *
4
- * @author Double Bastion LLC
5
- *
6
- * @license GNU AGPL version 3 or any later version
7
- *
8
- * This program is free software; you can redistribute it and/or
9
- * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
10
- * License as published by the Free Software Foundation; either
11
- * version 3 of the License, or any later version.
12
- *
13
- * This program is distributed in the hope that it will be useful,
14
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
- * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
17
- *
18
- * You should have received a copy of the GNU Affero General Public
19
- * License along with this program.  If not, see <http://www.gnu.org/licenses/>.
20
- *
21
- */
22
-
23
-$(document).ready(function() {
24
-
25
-   var baseUrl = OC.generateUrl('/apps/sip_trip_phone/user/getsettings');
26
-   var userid = "<?php p($userId); ?>";
27
-
28
-   $.ajax({
29
-      method: 'GET',
30
-      url: baseUrl + '/' + userid,
31
-      contentType: 'application/json',
32
-      success: function(settingsdb) {
33
-
34
-         var connectData = {
35
-             "User" : settingsdb.sipusername,
36
-             "Realm" : settingsdb.siprealm,
37
-             "Display" : settingsdb.pdisplayname,
38
-             "WSServer" : settingsdb.stphwssurl,
39
-             "Stun" : settingsdb.stunserver,
40
-             "Tracesipmsg" : settingsdb.tracesipmsg,
41
-             "Voicenumbers" : settingsdb.voicenumbers,
42
-             "Defaultvoicenumber" : settingsdb.defaultvoicenumber
43
-         };
44
-
45
-         localStorage.setItem('SIPCreds', JSON.stringify(connectData));
46
-
47
-	 var baseUrl = OC.generateUrl('/apps/sip_trip_phone/user/getsippass');
48
-
49
-         $.ajax({
50
-	      method: 'GET',
51
-	      url: baseUrl + '/' + userid,
52
-              contentType: 'text',
53
-	      success: function(sippassword) {
54
-
55
-                 var url = OC.generateUrl('/apps/sip_trip_phone/phone/index.html');
56
-
57
-                 if (!localStorage.getItem('SipTripPhone')) {
58
-
59
-                     window.open(url, "SipTripPhone", "width=354,height=572,menubar=no,scrollbars=no,status=no,addressbar=no,resizable=no");
60
-                     window.sipUserPasswd = sippassword;
61
-
62
-		 } else {
63
-		     window.alert('The phone is already open !');
64
-		 }
65
-              }
66
-
67
-         });
68
-      }
69
-   });
70
-});
71
-
72 0
deleted file mode 100644
... ...
@@ -1,18 +0,0 @@
1
-OC.L10N.register(
2
-    "sip_trip_phone",
3
-    {
4
-    "Settings" : "Settings",
5
-    "SIP Trip Phone" : "SIP Trip Phone",
6
-    "Enter your credentials in the fields from below:" : "Enter your credentials in the fields from below:",
7
-    "Display Name:" : "Display Name:",
8
-    "SIP User:" : "SIP User:",
9
-    "SIP User Password:" : "SIP User Password:",
10
-    "WSS URL:" : "WSS URL:",
11
-    "SIP Realm  (the IPv4 address of your Asterisk server or the domain from the WSS URL offered by the SIP provider):" : "SIP Realm  (the IPv4 address of your Asterisk server or the domain from the WSS URL offered by the SIP provider):",
12
-    "STUN Server's IPv4 address and port number or domain and port number (optional):" : "STUN Server's IPv4 address and port number or domain and port number (optional):",
13
-    "Show debug logging in my browser's console:" : "Show debug logging in my browser's console:",
14
-    "Available phone number(s):" : "Available phone number(s):",
15
-    "Default phone number for outgoing calls (optional):" : "Default phone number for outgoing calls (optional):",
16
-    "Save" : "Save"
17
-},
18
-"nplurals=2; plural=(n != 1);");
19 0
deleted file mode 100644
... ...
@@ -1,16 +0,0 @@
1
-{ "translations": {
2
-    "Settings" : "Settings",
3
-    "SIP Trip Phone" : "SIP Trip Phone",
4
-    "Enter your credentials in the fields from below:" : "Enter your credentials in the fields from below:",
5
-    "Display Name:" : "Display Name:",
6
-    "SIP User:" : "SIP User:",
7
-    "SIP User Password:" : "SIP User Password:",
8
-    "WSS URL:" : "WSS URL:",
9
-    "SIP Realm  (the IPv4 address of your Asterisk server or the domain from the WSS URL offered by the SIP provider):" : "SIP Realm  (the IPv4 address of your Asterisk server or the domain from the WSS URL offered by the SIP provider):",
10
-    "STUN Server's IPv4 address and port number or domain and port number (optional):" : "STUN Server's IPv4 address and port number or domain and port number (optional):",
11
-    "Show debug logging in my browser's console:" : "Show debug logging in my browser's console:",
12
-    "Available phone number(s):" : "Available phone number(s):",
13
-    "Default phone number for outgoing calls (optional):" : "Default phone number for outgoing calls (optional):",
14
-    "Save" : "Save"
15
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
16
-}
17 0
deleted file mode 100644
... ...
@@ -1,18 +0,0 @@
1
-OC.L10N.register(
2
-    "sip_trip_phone",
3
-    {
4
-    "Settings" : "Settings",
5
-    "SIP Trip Phone" : "SIP Trip Phone",
6
-    "Enter your credentials in the fields from below:" : "Enter your credentials in the fields from below:",
7
-    "Display Name:" : "Display Name:",
8
-    "SIP User:" : "SIP User:",
9
-    "SIP User Password:" : "SIP User Password:",
10
-    "WSS URL:" : "WSS URL:",
11
-    "SIP Realm  (the IPv4 address of your Asterisk server or the domain from the WSS URL offered by the SIP provider):" : "SIP Realm  (the IPv4 address of your Asterisk server or the domain from the WSS URL offered by the SIP provider):",
12
-    "STUN Server's IPv4 address and port number or domain and port number (optional):" : "STUN Server's IPv4 address and port number or domain and port number (optional):",
13
-    "Show debug logging in my browser's console:" : "Show debug logging in my browser's console:",
14
-    "Available phone number(s):" : "Available phone number(s):",
15
-    "Default phone number for outgoing calls (optional):" : "Default phone number for outgoing calls (optional):",
16
-    "Save" : "Save"
17
-},
18
-"nplurals=2; plural=(n != 1);");
19 0
deleted file mode 100644
... ...
@@ -1,16 +0,0 @@
1
-{ "translations": {
2
-    "Settings" : "Settings",
3
-    "SIP Trip Phone" : "SIP Trip Phone",
4
-    "Enter your credentials in the fields from below:" : "Enter your credentials in the fields from below:",
5
-    "Display Name:" : "Display Name:",
6
-    "SIP User:" : "SIP User:",
7
-    "SIP User Password:" : "SIP User Password:",
8
-    "WSS URL:" : "WSS URL:",
9
-    "SIP Realm  (the IPv4 address of your Asterisk server or the domain from the WSS URL offered by the SIP provider):" : "SIP Realm  (the IPv4 address of your Asterisk server or the domain from the WSS URL offered by the SIP provider):",
10
-    "STUN Server's IPv4 address and port number or domain and port number (optional):" : "STUN Server's IPv4 address and port number or domain and port number (optional):",
11
-    "Show debug logging in my browser's console:" : "Show debug logging in my browser's console:",
12
-    "Available phone number(s):" : "Available phone number(s):",
13
-    "Default phone number for outgoing calls (optional):" : "Default phone number for outgoing calls (optional):",
14
-    "Save" : "Save"
15
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
16
-}
17 0
deleted file mode 100644
... ...
@@ -1,57 +0,0 @@
1
-<?php
2
-/**
3
- * @copyright 2021 Double Bastion LLC <www.doublebastion.com>
4
- *
5
- * @author Double Bastion LLC
6
- *
7
- * @license GNU AGPL version 3 or any later version
8
- *
9
- * This program is free software; you can redistribute it and/or
10
- * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
11
- * License as published by the Free Software Foundation; either
12
- * version 3 of the License, or any later version.
13
- *
14
- * This program is distributed in the hope that it will be useful,
15
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17
- * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
18
- *
19
- * You should have received a copy of the GNU Affero General Public
20
- * License along with this program.  If not, see <http://www.gnu.org/licenses/>.
21
- *
22
- */
23
-
24
-declare(strict_types=1);
25
-
26
-namespace OCA\SIPTripPhone\AppInfo;
27
-
28
-use OCP\AppFramework\App;
29
-use OCP\IServerContainer;
30
-use OCA\SIPTripPhone\Controller\PageController;
31
-
32
-
33
-class Application extends App {
34
-
35
-	public function __construct(array $urlParams=array()) {
36
-		parent::__construct('sip_trip_phone', $urlParams);
37
-
38
-        $container = $this->getContainer();
39
-
40
-          // Controllers
41
-          $container->registerService('PageController', function($c) {
42
-              return new PageController(
43
-                  $c->query('AppName'),
44
-                  $c->query('Request')
45
-              );
46
-          });
47
-
48
-	}
49
-
50
-	public function register() {
51
-		$server = $this->getContainer()->getServer();
52
-
53
-                $app = new \OCA\SIPTripPhone\AppInfo\Application();
54
-                $app->register();
55
-
56
-        }
57
-}
58 0
deleted file mode 100644
... ...
@@ -1,54 +0,0 @@
1
-<?php
2
-/**
3
- * @copyright 2021 Double Bastion LLC <www.doublebastion.com>
4
- *
5
- * @author Double Bastion LLC
6
- *
7
- * @license GNU AGPL version 3 or any later version
8
- *
9
- * This program is free software; you can redistribute it and/or
10
- * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
11
- * License as published by the Free Software Foundation; either
12
- * version 3 of the License, or any later version.
13
- *
14
- * This program is distributed in the hope that it will be useful,
15
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17
- * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
18
- *
19
- * You should have received a copy of the GNU Affero General Public
20
- * License along with this program.  If not, see <http://www.gnu.org/licenses/>.
21
- *
22
- */
23
-
24
-declare(strict_types=1);
25
-
26
-namespace OCA\SIPTripPhone\Controller;
27
-
28
-use \OCP\IRequest;
29
-use \OCP\AppFramework\Http\TemplateResponse;
30
-use \OCP\AppFramework\Http\DataResponse;
31
-use \OCP\AppFramework\Controller;
32
-
33
-
34
-class PageController extends Controller {
35
-
36
-        public function __construct($AppName, IRequest $request){
37
-		parent::__construct($AppName, $request);
38
-	}
39
-
40
-	/**
41
-	 * CAUTION: the @Stuff turns off security checks; for this page no admin is
42
-	 *          required and no CSRF check. If you don't know what CSRF is, read
43
-	 *          it up in the docs or you might create a security hole. This is
44
-	 *          basically the only required method to add this exemption, don't
45
-	 *          add it to any other method if you don't exactly know what it does
46
-	 *
47
-	 * @NoAdminRequired
48
-	 * @NoCSRFRequired
49
-	 */
50
-
51
-	public function index() {
52
-              return new TemplateResponse('sip_trip_phone', 'index');
53
-	}
54
-}
55 0
deleted file mode 100644
... ...
@@ -1,70 +0,0 @@
1
-<?php
2
-/**
3
- * @copyright 2021 Double Bastion LLC <www.doublebastion.com>
4
- *
5
- * @author Double Bastion LLC
6
- *
7
- * @license GNU AGPL version 3 or any later version
8
- *
9
- * This program is free software; you can redistribute it and/or
10
- * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
11
- * License as published by the Free Software Foundation; either
12
- * version 3 of the License, or any later version.
13
- *
14
- * This program is distributed in the hope that it will be useful,
15
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17
- * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
18
- *
19
- * You should have received a copy of the GNU Affero General Public
20
- * License along with this program.  If not, see <http://www.gnu.org/licenses/>.
21
- *
22
- */
23
-
24
-declare(strict_types=1);
25
-
26
-namespace OCA\SIPTripPhone\Controller;
27
-
28
-use OCP\IRequest;
29
-use OCP\AppFramework\Controller;
30
-use OCA\SIPTripPhone\Service\SphoneService;
31
-
32
-
33
-class SphoneController extends Controller {
34
-
35
-    private $service;
36
-    private $userId;
37
-
38
-    public function __construct($appName, IRequest $request, SphoneService $service, $userId) {
39
-        parent::__construct($appName, $request);
40
-        $this->service = $service;
41
-        $this->userId = $userId;
42
-    }
43
-
44
-
45
-    /**
46
-     * @NoAdminRequired
47
-     */
48
-    public function getsettings($userId) {
49
-
50
-           return $this->service->getsettings($this->userId);
51
-    }
52
-
53
-    /**
54
-     * @NoAdminRequired
55
-     */
56
-    public function getsippass($userId) {
57
-
58
-           return $this->service->getsippass($this->userId);
59
-    }
60
-
61
-   /**
62
-    * @NoAdminRequired
63
-    */
64
-    public function updatesettings(string $userId, string $pdisplayname, string $sipusername, string $sipuserpassword, string $stphwssurl, string $siprealm, string $stunserver, int $tracesipmsg, string $voicenumbers, string $defaultvoicenumber) {
65
-
66
-          return $this->service->updatesettings($this->userId, $pdisplayname, $sipusername, $sipuserpassword, $stphwssurl, $siprealm, $stunserver, $tracesipmsg, $voicenumbers, $defaultvoicenumber);
67
-
68
-    }
69
-
70
-}
71 0
deleted file mode 100644
... ...
@@ -1,148 +0,0 @@
1
-<?php
2
-/**
3
- * @copyright 2021 Double Bastion LLC <www.doublebastion.com>
4
- *
5
- * @author Double Bastion LLC
6
- *
7
- * @license GNU AGPL version 3 or any later version
8
- *
9
- * This program is free software; you can redistribute it and/or
10
- * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
11
- * License as published by the Free Software Foundation; either
12
- * version 3 of the License, or any later version.
13
- *
14
- * This program is distributed in the hope that it will be useful,
15
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17
- * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
18
- *
19
- * You should have received a copy of the GNU Affero General Public
20
- * License along with this program.  If not, see <http://www.gnu.org/licenses/>.
21
- *
22
- */
23
-
24
-declare(strict_types=1);
25
-
26
-namespace OCA\SIPTripPhone\Service;
27
-
28
-use OCP\DB\QueryBuilder\IQueryBuilder;
29
-use OCP\IDBConnection;
30
-use OCP\Security\ICrypto;
31
-use function OCP\Log\logger;
32
-
33
-class SphoneService {
34
-
35
-    private $connection;
36
-    private $crypto;
37
-
38
-    public function __construct(IDBConnection $connection, ICrypto $crypto) {
39
-                $this->connection = $connection;
40
-                $this->crypto = $crypto;
41
-    }
42
-
43
-    /**
44
-     * @NoAdminRequired
45
-     *
46
-     */
47
-    public function getsettings($userId) {
48
-
49
-        $sql = $this->connection->prepare('
50
-                    SELECT `id`, `user_id`, `pdisplayname`, `sipusername`, `sipuserpassword`, `stphwssurl`, `siprealm`, `stunserver`, `tracesipmsg`, `voicenumbers`, `defaultvoicenumber`
51
-		    FROM  `*PREFIX*sip_trip_phone`
52
-		    WHERE `user_id` = ?');
53
-        $result = $sql->execute([$userId]);
54
-        $settingsdb = $result->fetch();
55
-        $result->closeCursor();
56
-
57
-        if ($settingsdb) {
58
-            if ($settingsdb['sipuserpassword'] != '' && $settingsdb['sipuserpassword'] != null && $settingsdb['sipuserpassword'] != 'undefined') {
59
-                $settingsdb['sipuserpassword'] = "%20%20%20%20%20%20%20";
60
-            } else { $settingsdb['sipuserpassword'] = ''; }
61
-
62
-            return $settingsdb;
63
-        }
64
-    }
65
-
66
-    /**
67
-     * @NoAdminRequired
68
-     *
69
-     */
70
-    public function getsippass($userId) {
71
-
72
-        $sqlps = $this->connection->prepare('
73
-                    SELECT `id`, `user_id`, `sipuserpassword`
74
-		    FROM  `*PREFIX*sip_trip_phone`
75
-		    WHERE `user_id` = ?');
76
-        $resultps = $sqlps->execute([$userId]);
77
-        $settingsdb = $resultps->fetch();
78
-        $resultps->closeCursor();
79
-
80
-        if ($settingsdb) {
81
-            if ($settingsdb['sipuserpassword'] != '' && $settingsdb['sipuserpassword'] != null && $settingsdb['sipuserpassword'] != 'undefined') {
82
-                $sipuserpassworddecr = $this->crypto->decrypt($settingsdb['sipuserpassword']);
83
-                $sippassword = $sipuserpassworddecr;
84
-            }
85
-
86
-            return $sippassword;
87
-        }
88
-    }
89
-
90
-    /**
91
-     * @NoAdminRequired
92
-     *
93
-     */
94
-    public function updatesettings($userId, $pdisplayname, $sipusername, $sipuserpassword, $stphwssurl, $siprealm, $stunserver, $tracesipmsg, $voicenumbers, $defaultvoicenumber) {
95
-
96
-        // Validate the data entered in the fields on the settings page
97
-        if (mb_strlen($pdisplayname) > 128) { logger('sip_trip_phone')->error("The 'Display Name' cannot exceed 128 characters!"); exit(); }
98
-        if (!preg_match('/^[a-zA-Z0-9\*\#]+$/', $sipusername)) { logger('sip_trip_phone')->error("The 'SIP User' that you entered is not valid. The 'SIP User' must contain only alphanumeric characters, asterisks (*) and number signs (#).)"); exit(); }        
99
-        if (mb_strlen($sipuserpassword) > 300) { logger('sip_trip_phone')->error("The 'SIP User Password' cannot exceed 300 characters!"); exit(); }      
100
-        if (filter_var($stphwssurl, FILTER_VALIDATE_URL) == false) { logger('sip_trip_phone')->error("The 'WSS URL' that you entered is not valid."); exit(); }
101
-        if (filter_var($siprealm, FILTER_VALIDATE_IP) == false && filter_var($siprealm, FILTER_VALIDATE_DOMAIN, FILTER_FLAG_HOSTNAME) == false) { logger('sip_trip_phone')->error("The 'SIP Realm' that you entered is not valid."); exit(); }
102
-        if ($stunserver != '') {
103
-            $stunIpDom = explode(":", $stunserver);
104
-            if ((filter_var($stunIpDom[0], FILTER_VALIDATE_IP) == false && filter_var($stunIpDom[0], FILTER_VALIDATE_DOMAIN, FILTER_FLAG_HOSTNAME) == false) || !preg_match('/^[0-9]+$/', $stunIpDom[1])) { logger('sip_trip_phone')->error("The 'STUN Server' that you entered is not valid."); exit(); }
105
-        }
106
-        if (!preg_match('/^[a-zA-Z0-9\040\+\,\:]*$/', $voicenumbers)) { logger('sip_trip_phone')->error("The 'Available phone numbers' that you entered are not valid. The 'Available phone numbers' must contain only alphanumeric characters, colons (:), spaces, plus signs (+), digits (0-9) and commas (,)."); exit(); }
107
-        if (!preg_match('/^[a-zA-Z0-9\040\+\:]*$/', $defaultvoicenumber)) { logger('sip_trip_phone')->error("The 'Default phone number for outgoing calls' that you entered is not valid. The 'Default phone number for outgoing calls' must contain only alphanumeric characters, a colon (:), a space, a plus sign (+) and digits (0-9)."); exit(); }
108
-
109
-        $sqlup = $this->connection->prepare('
110
-                    SELECT `id`, `user_id`, `pdisplayname`, `sipusername`, `sipuserpassword`, `stphwssurl`, `siprealm`, `stunserver`, `tracesipmsg`, `voicenumbers`, `defaultvoicenumber`
111
-		    FROM  `*PREFIX*sip_trip_phone`
112
-		    WHERE `user_id` = ?');
113
-        $resultup = $sqlup->execute([$userId]);
114
-        $row = $resultup->fetch();
115
-        $resultup->closeCursor();
116
-
117
-        if ($resultup && !$row) {
118
-
119
-            if ($sipuserpassword != '') {
120
-                $sipuserpasswordenc = $this->crypto->encrypt($sipuserpassword);
121
-            } else { $sipuserpasswordenc = ''; }
122
-
123
-            $sqlins = $this->connection->prepare('
124
-				INSERT INTO `*PREFIX*sip_trip_phone`
125
-					(`user_id`, `pdisplayname`, `sipusername`, `sipuserpassword`, `stphwssurl`, `siprealm`, `stunserver`, `tracesipmsg`, `voicenumbers`, `defaultvoicenumber`)
126
-				VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)');
127
-	    $sqlins->execute([$userId, $pdisplayname, $sipusername, $sipuserpasswordenc, $stphwssurl, $siprealm, $stunserver, $tracesipmsg, $voicenumbers, $defaultvoicenumber]);
128
-
129
-        } elseif ($resultup && $row) {
130
-
131
-            if ($sipuserpassword != '' && $sipuserpassword != "%20%20%20%20%20%20%20") {
132
-                $sipuserpasswordenc = $this->crypto->encrypt($sipuserpassword);
133
-            } elseif ($sipuserpassword == "%20%20%20%20%20%20%20") {
134
-                $sipuserpasswordenc = $row['sipuserpassword'];
135
-            } elseif ($sipuserpassword == '') {
136
-                $sipuserpasswordenc = '';
137
-            }
138
-
139
-	    $sqlup = $this->connection->prepare('
140
-			UPDATE `*PREFIX*sip_trip_phone`
141
-			SET `pdisplayname` = ?, `sipusername` = ?, `sipuserpassword` = ?, `stphwssurl` = ?, `siprealm` = ?, `stunserver` = ?, `tracesipmsg` = ?, `voicenumbers` = ?, `defaultvoicenumber` = ?
142
-                        WHERE `user_id` = ?');
143
-	    $updateRes = $sqlup->execute([$pdisplayname, $sipusername, $sipuserpasswordenc, $stphwssurl, $siprealm, $stunserver, $tracesipmsg, $voicenumbers, $defaultvoicenumber, $userId]);
144
-	    $updateRes->closeCursor();
145
-
146
-        }
147
-    }
148
-}
149 0
deleted file mode 100644
... ...
@@ -1,301 +0,0 @@
1
-/*
2
- @copyright 2021 Double Bastion LLC <www.doublebastion.com>
3
-
4
- @author Double Bastion LLC
5
-
6
- @license GNU AGPL version 3 or any later version
7
-
8
- This program is free software; you can redistribute it and/or
9
- modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
10
- License as published by the Free Software Foundation; either
11
- version 3 of the License, or any later version.
12
-
13
- This program is distributed in the hope that it will be useful,
14
- but WITHOUT ANY WARRANTY; without even the implied warranty of
15
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
- GNU AFFERO GENERAL PUBLIC LICENSE for more details.
17
-
18
- You should have received a copy of the GNU Affero General Public
19
- License along with this program.  If not, see <http://www.gnu.org/licenses/>.
20
-
21
-
22
-
23
- This is a modified version of the original "ctxSip.css" file.
24
-
25
- Below is the copyright notice of ctxSip phone (https://github.com/collecttix/ctxSip)
26
- which also applies to the original "ctxSip.css" file, which was part of ctxSip phone:
27
-
28
-
29
-   The MIT License (MIT)
30
-
31
-   Copyright (c) 2014 Collecttix
32
-
33
-   Permission is hereby granted, free of charge, to any person obtaining a copy
34
-   of this software and associated documentation files (the "Software"), to deal
35
-   in the Software without restriction, including without limitation the rights
36
-   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
37
-   copies of the Software, and to permit persons to whom the Software is
38
-   furnished to do so, subject to the following conditions:
39
-
40
-   The above copyright notice and this permission notice shall be included in
41
-   all copies or substantial portions of the Software.
42
-
43
-   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
44
-   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
45
-   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
46
-   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
47
-   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
48
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
49
-   THE SOFTWARE.
50
-*/
51
-
52
-@font-face {
53
-    font-family: 'Inter';
54
-    src: url('../../fonts/Inter-Regular.woff2') format('woff2'),
55
-         url('../../fonts/Inter-Regular.woff') format('woff');
56
-    font-weight: 400;
57
-    font-style: normal;
58
-}
59
-@font-face {
60
-    font-family: 'Inter';
61
-    src: url('../../fonts/Inter-Italic.woff2') format('woff2'),
62
-         url('../../fonts/Inter-Italic.woff') format('woff');
63
-    font-weight: 400;
64
-    font-style: italic;
65
-}
66
-@font-face {
67
-    font-family: 'Inter';
68
-    src: url('../../fonts/Inter-Medium.woff2') format('woff2'),
69
-         url('../../fonts/Inter-Medium.woff') format('woff');
70
-    font-weight: 500;
71
-    font-style: normal;
72
-}
73
-@font-face {
74
-    font-family: 'Inter';
75
-    src: url('../../fonts/Inter-MediumItalic.woff2') format('woff2'),
76
-         url('../../fonts/Inter-MediumItalic.woff') format('woff');
77
-    font-weight: 500;
78
-    font-style: italic;
79
-}
80
-@font-face {
81
-    font-family: 'Inter';
82
-    src: url('../../fonts/Inter-SemiBold.woff2') format('woff2'),
83
-         url('../../fonts/Inter-SemiBold.woff') format('woff');
84
-    font-weight: 600;
85
-    font-style: normal;
86
-}
87
-@font-face {
88
-    font-family: 'Inter';
89
-    src: url('../../fonts/Inter-SemiBoldItalic.woff2') format('woff2'),
90
-         url('../../fonts/Inter-SemiBoldItalic.woff') format('woff');
91
-    font-weight: 600;
92
-    font-style: italic;
93
-}
94
-@font-face {
95
-    font-family: 'Inter';
96
-    src: url('../../fonts/Inter-Bold.woff2') format('woff2'),
97
-         url('../../fonts/Inter-Bold.woff') format('woff');
98
-    font-weight: 700;
99
-    font-style: normal;
100
-}
101
-@font-face {
102
-    font-family: 'Inter';
103
-    src: url('../../fonts/Inter-BoldItalic.woff2') format('woff2'),
104
-         url('../../fonts/Inter-BoldItalic.woff') format('woff');
105
-    font-weight: 700;
106
-    font-style: italic;
107
-}
108
-@font-face {
109
-    font-family: 'Inter';
110
-    src: url('../../fonts/Inter-ExtraBold.woff2') format('woff2'),
111
-         url('../../fonts/Inter-ExtraBold.woff') format('woff');
112
-    font-weight: 800;
113
-    font-style: normal;
114
-}
115
-@font-face {
116
-    font-family: 'Inter';
117
-    src: url('../../fonts/Inter-ExtraBoldItalic.woff2') format('woff2'),
118
-         url('../../fonts/Inter-ExtraBoldItalic.woff') format('woff');
119
-    font-weight: 800;
120
-    font-style: italic;
121
-}
122
-
123
-#sipClient {
124
-  background-color: #30394a;
125
-  font-size: 13px;
126
-  line-height: 1.42857143;
127
-  font-family: 'Inter';
128
-  /* firefox 19+ */
129
-  /* ie */
130
-}
131
-#sipClient p {
132
-  margin: 0;
133
-  padding: 0 0 10px 0;
134
-  line-height: 22px;
135
-}
136
-#sipClient .sipStatus {
137
-  margin: 0 -15px 2px -15px;
138
-  padding: 1px 16px;
139
-//  background-color: #111;
140
-  background-color: #2c6595;
141
-  color: #e4e4e4;
142
-  font-weight: 500;
143
-}
144
-#sipClient #txtCallStatus {
145
-  color: #e4e4e4;
146
-}
147
-#sipClient #sip-dialpad {
148
-  margin: 15px 0 0 0;
149
-}
150
-#sipClient #dialpadWrap {
151
-  display: block;
152
-  position: relative;
153
-  width: 246px;
154
-  height: 354px;
155
-}
156
-
157
-#sipClient #sip-dialpad .col-xs-4 {
158
-  text-align: center;
159
-}
160
-#sipClient .btn-default {
161
-  border-color: #ffffff !important;
162
-}
163
-#sipClient #callButton {
164
-  font-weight: 600;
165
-  font-size: 15px;
166
-  padding: 5px 12px;
167
-}
168
-#sipClient .digit {
169
-  height: 66px;
170
-  width: 66px;
171
-  margin: 0 8px 14px 8px !important;
172
-  background-color: #f7f7f7;
173
-  font-weight: 300;
174
-  font-size: 24px;
175
-  border-radius: 6px;
176
-  line-height: 21px;
177
-  padding-top: 14px;
178
-  float: left;
179
-}
180
-#sipClient .digit span {
181
-  display: block;
182
-  color: #999;
183
-  font-size: 11px;
184
-  font-weight: normal;
185
-}
186
-#sipClient .sip-panel h3 {
187
-  margin-top: 22px;
188
-}
189
-#sipClient #sip-splash {
190
-  height: 371px;
191
-}
192
-#sipClient #sip-splash .fa {
193
-  margin-bottom: 15px;
194
-}
195
-#sipClient #sip-splash .fa-circle {
196
-  color: #5cb85c;
197
-}
198
-#sipClient #sip-log .panel-heading {
199
-  padding: 10px 8px;
200
-}
201
-#sipClient #sip-logitems {
202
-  overflow-y: auto;
203
-  overflow-x: hidden;
204
-}
205
-#sipClient #sldVolume {
206
-  width: 140px;
207
-  margin: 0 auto;
208
-  box-shadow: none;
209
-}
210
-#sipClient .sip-logitem {
211
-  padding: 4px;
212
-}
213
-#sipClient #numDisplay::-webkit-input-placeholder {
214
-  color: #bbb;
215
-}
216
-#sipClient #numDisplay::-moz-placeholder {
217
-  color: #bbb;
218
-}
219
-#sipClient #numDisplay::-ms-input-placeholder {
220
-  color: #bbb;
221
-}
222
-#sipClient #numDisplay::-moz-placeholder {
223
-  color: #bbb;
224
-}
225
-#sipClient #numDisplay {
226
-  height: 30px;
227
-  padding: 0px 4px;
228
-  font-size: 15px;
229
-  font-weight: 500;
230
-  overflow: visible;
231
-  border-radius: 4px;
232
-}
233
-.btn .fa {
234
-  display: inline-block; 
235
-  margin: 4px 2px 0px 2px !important;
236
-}
237
-#audioLocal, #audioRemote {
238
-  display: block;
239
-  height: 0px !important;
240
-  width: 0px !important;
241
-  margin: 0px;
242
-}
243
-.page-header {
244
-//  margin: 12px 0 20px 0 !important;
245
-  margin: 26px 0 20px 0 !important;
246
-}
247
-
248
-#selectFromNmbr {
249
-  display: block;
250
-  width: 100%;
251
-  height: auto;
252
-  text-align: center;
253
-  margin: 0 0 4px 0;
254
-}
255
-
256
-#fromNmbrTitle {
257
-  display: inline-block;
258
-  width: 100%;
259
-  height: 20px;
260
-  text-align: center;
261
-  color: #e8e8e8;
262
-  font-size: 14px;
263
-  font-weight: 600;
264
-  border-radius: 4px;
265
-}
266
-
267
-#fromNumber {
268
-  display: inline-block;
269
-  width: auto;
270
-  height: 100%;
271
-  font-size: 15px;
272
-  padding: 0 4px 0 4px;
273
-  text-align: left;
274
-}
275
-
276
-.input-group-btn {
277
-  vertical-align: bottom !important;
278
-}
279
-
280
-@media (min-width: 768px) {
281
-  .lead {
282
-    font-size: 19px !important;
283
-  }
284
-}  
285
-
286
-.panel-title {
287
-  font-size: 15px;
288
-}
289
-
290
-.small, small {
291
-  font-size: 11px;
292
-  margin: 0 0 0 22px;
293
-}
294
-
295
-.list-group-item-warning {
296
-  background-color: #ffffe3;
297
-}
298
-
299
-.text-right {
300
-  word-break: break-word;
301
-}
302 0
\ No newline at end of file
303 1
deleted file mode 100644
... ...
@@ -1,167 +0,0 @@
1
-<!--
2
- @copyright 2021 Double Bastion LLC <www.doublebastion.com>
3
-
4
- @author Double Bastion LLC
5
-
6
- @license GNU AGPL version 3 or any later version
7
-
8
- This program is free software; you can redistribute it and/or
9
- modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
10
- License as published by the Free Software Foundation; either
11
- version 3 of the License, or any later version.
12
-
13
- This program is distributed in the hope that it will be useful,
14
- but WITHOUT ANY WARRANTY; without even the implied warranty of
15
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
- GNU AFFERO GENERAL PUBLIC LICENSE for more details.
17
-
18
- You should have received a copy of the GNU Affero General Public
19
- License along with this program.  If not, see <http://www.gnu.org/licenses/>.
20
-
21
-
22
-
23
- This is a modified version of the original file "index.html".
24
-
25
- Below is the copyright notice of ctxSip phone (https://github.com/collecttix/ctxSip)
26
- which also applies to the original "index.html" file, which was part of ctxSip phone:
27
-
28
-
29
-   The MIT License (MIT)
30
-
31
-   Copyright (c) 2014 Collecttix
32
-
33
-   Permission is hereby granted, free of charge, to any person obtaining a copy
34
-   of this software and associated documentation files (the "Software"), to deal
35
-   in the Software without restriction, including without limitation the rights
36
-   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
37
-   copies of the Software, and to permit persons to whom the Software is
38
-   furnished to do so, subject to the following conditions:
39
-
40
-   The above copyright notice and this permission notice shall be included in
41
-   all copies or substantial portions of the Software.
42
-
43
-   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
44
-   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
45
-   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
46
-   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
47
-   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
48
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
49
-   THE SOFTWARE.
50
-
51
-<!DOCTYPE html>
52
-<html lang="en">
53
-
54
-<head>
55
-    <meta charset="utf-8" />
56
-    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0" />
57
-    <title>SIP Trip Phone</title>
58
-    <link rel="icon" type="image/gif" href="img/favicon.ico" />
59
-    <link rel="stylesheet" type="text/css" href="css/bootstrap.min.css" /> 
60
-    <link rel="stylesheet" type="text/css" href="css/font-awesome-4.7.0/css/font-awesome.min.css" />
61
-    <link rel="stylesheet" type="text/css" href="css/ctxSip.css" />
62
-
63
-    <script type="text/javascript" src="scripts/jquery-1.11.3.min.js"></script>
64
-    <script type="text/javascript" src="scripts/bootstrap.min.js"></script>
65
-    <script type="text/javascript" src="scripts/moment.min.js"></script>
66
-    <script type="text/javascript" src="scripts/SIP.js/sip.min.js"></script>
67
-    <script type="text/javascript" src="scripts/app.js"></script>
68
-
69
-</head>
70
-<body id="sipClient">
71
-<div class="container-fluid">
72
-
73
-    <div class="clearfix sipStatus">
74
-        <div id="txtCallStatus" class="pull-right">&nbsp;</div>
75
-        <div id="txtRegStatus"></div>
76
-    </div>
77
-
78
-    <div class="form-group" id="phoneUI">
79
-        <div class="input-group">
80
-            <div class="input-group-btn">
81
-                <button id="dropDownButton" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" title="Show keypad">
82
-                    <i class="fa fa-th"></i>
83
-                </button>
84
-                <div id="sip-dialpad" class="dropdown-menu">
85
-                  <div id="dialpadWrap">
86
-                    <button type="button" onclick="document.getElementById('dtmfTone').cloneNode(true).play()" class="btn btn-default digit" data-digit="1">1<span>&nbsp;</span></button>
87
-                    <button type="button" onclick="document.getElementById('dtmfTone').cloneNode(true).play()" class="btn btn-default digit" data-digit="2,A,B,C">2<span>ABC</span></button>
88
-                    <button type="button" onclick="document.getElementById('dtmfTone').cloneNode(true).play()" class="btn btn-default digit" data-digit="3,D,E,F">3<span>DEF</span></button>
89
-                    <button type="button" onclick="document.getElementById('dtmfTone').cloneNode(true).play()" class="btn btn-default digit" data-digit="4,G,H,I">4<span>GHI</span></button>
90
-                    <button type="button" onclick="document.getElementById('dtmfTone').cloneNode(true).play()" class="btn btn-default digit" data-digit="5,J,K,L">5<span>JKL</span></button>
91
-                    <button type="button" onclick="document.getElementById('dtmfTone').cloneNode(true).play()" class="btn btn-default digit" data-digit="6,M,N,O">6<span>MNO</span></button>
92
-                    <button type="button" onclick="document.getElementById('dtmfTone').cloneNode(true).play()" class="btn btn-default digit" data-digit="7,P,Q,R,S">7<span>PQRS</span></button>
93
-                    <button type="button" onclick="document.getElementById('dtmfTone').cloneNode(true).play()" class="btn btn-default digit" data-digit="8,T,U,V">8<span>TUV</span></button>
94
-                    <button type="button" onclick="document.getElementById('dtmfTone').cloneNode(true).play()" class="btn btn-default digit" data-digit="9,W,X,Y,Z">9<span>WXYZ</span></button>
95
-                    <button type="button" onclick="document.getElementById('dtmfTone').cloneNode(true).play()" class="btn btn-default digit" data-digit="*">*<span>&nbsp;</span></button>
96
-                    <button type="button" onclick="document.getElementById('dtmfTone').cloneNode(true).play()" class="btn btn-default digit" data-digit="0,+">0<span>+</span></button>
97
-                    <button type="button" onclick="document.getElementById('dtmfTone').cloneNode(true).play()" class="btn btn-default digit" data-digit="#">#<span>&nbsp;</span></button>
98
-                    <div class="clearfix">&nbsp;</div>
99
-                    <button id="callButton" class="btn btn-success btn-block btnCall" title="Call">
100
-                        <i class="fa fa-play"></i> Call
101
-                    </button>
102
-                  </div>
103
-                </div>
104
-            </div>
105
-            <div id="selectFromNmbr"><div id="fromNmbrTitle">From</div><select id="fromNumber" title="Choose a number to call from"></select></div>
106
-            <input type="text" name="number" id="numDisplay" class="form-control text-center input-sm" value="" placeholder="Enter the recipient's number" autocomplete="false" title="Recipient" />
107
-            <div class="input-group-btn input-group-btn-sm">
108
-                <button class="btn btn-sm btn-primary dropdown-toggle" id="btnVol" data-toggle="dropdown" title="Volume">
109
-                    <i class="fa fa-fw fa-volume-up"></i>
110
-                </button>
111
-                <div class="dropdown-menu dropdown-menu-right">
112
-                    <input type="range" min="0" max="100" value="100" step="1" id="sldVolume" />
113
-                </div>
114
-            </div>
115
-        </div>
116
-    </div>
117
-
118
-    <div class="well-sip">
119
-        <div id="sip-splash" class="text-muted text-center panel panel-default">
120
-            <div class="panel-body">
121
-                <div class="page-header">
122
-                  <span>
123
-                        <img src="images/sip_trip_phone_logo_large.svg" style="display:block;margin:0px auto;width:80px;height:80px" />
124
-                  </span>
125
-                  <h3>SIP Trip Phone</h3>
126
-                </div>
127
-                <p class="lead">To make a call click on the button in the upper-left corner, enter a phone number and press 'Call'.
128
-                   You can also use your keyboard to enter phone numbers and press 'Enter' to make calls.</p>
129
-            </div>
130
-        </div>
131
-
132
-        <div id="sip-log" class="panel panel-default hide">
133
-            <div class="panel-heading">
134
-                <h4 class="text-muted panel-title">Recent Calls <span class="pull-right" style="cursor:pointer;"><i class="fa fa-trash text-muted sipLogClear" title="Clear log"></i></span></h4>
135
-            </div>
136
-            <div id="sip-logitems" class="list-group">
137
-                <p class="text-muted text-center">No recent calls from this browser.</p>
138
-            </div>
139
-        </div>
140
-    </div>
141
-
142
-    <div class="modal fade" id="mdlError" tabindex="-1" role="dialog" aria-hidden="true" data-backdrop="static" data-keyboard="false">
143
-        <div class="modal-dialog modal-sm">
144
-            <div class="modal-content">
145
-                <div class="modal-header">
146
-                    <h4 class="modal-title">Sip Error</h4>
147
-                </div>
148
-                <div class="modal-body text-center text-danger">
149
-                    <h3><i class="fa fa-3x fa-ban"></i></h3>
150
-                    <p class="lead">Sip registration failed. No calls can be handled.</p>
151
-                </div>
152
-            </div>
153
-        </div>
154
-    </div>
155
-
156
-</div>
157
-
158
-<audio id="ringtone" src="sounds/incoming.ogg" loop></audio>
159
-<audio id="ringbacktone" src="sounds/outgoing.ogg" loop></audio>
160
-<audio id="dtmfTone" src="sounds/dtmf.ogg" preload></audio>
161
-
162
-<video id="audioRemote"></video>
163
-<video id="audioLocal"></video>
164
-
165
-</body>
166
-</html>
167 0
deleted file mode 100644
... ...
@@ -1,40 +0,0 @@
1
-/*
2
- * SIP version 0.7.8
3
- * Copyright (c) 2014-2017 Junction Networks, Inc <http://www.onsip.com>
4
- * Homepage: http://sipjs.com
5
- * License: http://sipjs.com/license/
6
- *
7
- *
8
- * ~~~SIP.js contains substantial portions of JsSIP under the following license~~~
9
- * Homepage: http://jssip.net
10
- * Copyright (c) 2012-2013 José Luis Millán - Versatica <http://www.versatica.com>
11
- *
12
- * Permission is hereby granted, free of charge, to any person obtaining
13
- * a copy of this software and associated documentation files (the
14
- * "Software"), to deal in the Software without restriction, including
15
- * without limitation the rights to use, copy, modify, merge, publish,
16
- * distribute, sublicense, and/or sell copies of the Software, and to
17
- * permit persons to whom the Software is furnished to do so, subject to
18
- * the following conditions:
19
- *
20
- * The above copyright notice and this permission notice shall be
21
- * included in all copies or substantial portions of the Software.
22
- *
23
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
27
- * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
28
- * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
29
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30
- *
31
- * ~~~ end JsSIP license ~~~
32
- */
33
-
34
-
35
-!function(a){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{var b;b="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,b.SIP=a()}}(function(){return function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);var j=new Error("Cannot find module '"+g+"'");throw j.code="MODULE_NOT_FOUND",j}var k=c[g]={exports:{}};b[g][0].call(k.exports,function(a){var c=b[g][1][a];return e(c?c:a)},k,k.exports,a,b,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;g<d.length;g++)e(d[g]);return e}({1:[function(a,b,c){function d(){this._events=this._events||{},this._maxListeners=this._maxListeners||void 0}function e(a){return"function"==typeof a}function f(a){return"number"==typeof a}function g(a){return"object"==typeof a&&null!==a}function h(a){return void 0===a}b.exports=d,d.EventEmitter=d,d.prototype._events=void 0,d.prototype._maxListeners=void 0,d.defaultMaxListeners=10,d.prototype.setMaxListeners=function(a){if(!f(a)||0>a||isNaN(a))throw TypeError("n must be a positive number");return this._maxListeners=a,this},d.prototype.emit=function(a){var b,c,d,f,i,j;if(this._events||(this._events={}),"error"===a&&(!this._events.error||g(this._events.error)&&!this._events.error.length)){if(b=arguments[1],b instanceof Error)throw b;throw TypeError('Uncaught, unspecified "error" event.')}if(c=this._events[a],h(c))return!1;if(e(c))switch(arguments.length){case 1:c.call(this);break;case 2:c.call(this,arguments[1]);break;case 3:c.call(this,arguments[1],arguments[2]);break;default:for(d=arguments.length,f=new Array(d-1),i=1;d>i;i++)f[i-1]=arguments[i];c.apply(this,f)}else if(g(c)){for(d=arguments.length,f=new Array(d-1),i=1;d>i;i++)f[i-1]=arguments[i];for(j=c.slice(),d=j.length,i=0;d>i;i++)j[i].apply(this,f)}return!0},d.prototype.addListener=function(a,b){var c;if(!e(b))throw TypeError("listener must be a function");if(this._events||(this._events={}),this._events.newListener&&this.emit("newListener",a,e(b.listener)?b.listener:b),this._events[a]?g(this._events[a])?this._events[a].push(b):this._events[a]=[this._events[a],b]:this._events[a]=b,g(this._events[a])&&!this._events[a].warned){var c;c=h(this._maxListeners)?d.defaultMaxListeners:this._maxListeners,c&&c>0&&this._events[a].length>c&&(this._events[a].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[a].length),"function"==typeof console.trace&&console.trace())}return this},d.prototype.on=d.prototype.addListener,d.prototype.once=function(a,b){function c(){this.removeListener(a,c),d||(d=!0,b.apply(this,arguments))}if(!e(b))throw TypeError("listener must be a function");var d=!1;return c.listener=b,this.on(a,c),this},d.prototype.removeListener=function(a,b){var c,d,f,h;if(!e(b))throw TypeError("listener must be a function");if(!this._events||!this._events[a])return this;if(c=this._events[a],f=c.length,d=-1,c===b||e(c.listener)&&c.listener===b)delete this._events[a],this._events.removeListener&&this.emit("removeListener",a,b);else if(g(c)){for(h=f;h-->0;)if(c[h]===b||c[h].listener&&c[h].listener===b){d=h;break}if(0>d)return this;1===c.length?(c.length=0,delete this._events[a]):c.splice(d,1),this._events.removeListener&&this.emit("removeListener",a,b)}return this},d.prototype.removeAllListeners=function(a){var b,c;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[a]&&delete this._events[a],this;if(0===arguments.length){for(b in this._events)"removeListener"!==b&&this.removeAllListeners(b);return this.removeAllListeners("removeListener"),this._events={},this}if(c=this._events[a],e(c))this.removeListener(a,c);else for(;c.length;)this.removeListener(a,c[c.length-1]);return delete this._events[a],this},d.prototype.listeners=function(a){var b;return b=this._events&&this._events[a]?e(this._events[a])?[this._events[a]]:this._events[a].slice():[]},d.listenerCount=function(a,b){var c;return c=a._events&&a._events[b]?e(a._events[b])?1:a._events[b].length:0}},{}],2:[function(a,b,c){b.exports={name:"sip.js",title:"SIP.js",description:"A simple, intuitive, and powerful JavaScript signaling library",version:"0.7.8",main:"src/index.js",browser:{"./src/environment.js":"./src/environment_browser.js"},homepage:"http://sipjs.com",author:"OnSIP <developer@onsip.com> (http://sipjs.com/authors/)",contributors:[{url:"https://github.com/onsip/SIP.js/blob/master/THANKS.md"}],repository:{type:"git",url:"https://github.com/onsip/SIP.js.git"},keywords:["sip","websocket","webrtc","library","javascript"],devDependencies:{beefy:"^2.1.5",browserify:"^4.1.8",grunt:"~0.4.0","grunt-browserify":"^4.0.1","grunt-cli":"~0.1.6","grunt-contrib-copy":"^0.5.0","grunt-contrib-jasmine":"^1.0.3","grunt-contrib-jshint":">0.5.0","grunt-contrib-uglify":"~0.2.0","grunt-peg":"~1.3.1","grunt-trimtrailingspaces":"^0.4.0",pegjs:"^0.8.0"},engines:{node:">=0.12"},license:"MIT",scripts:{repl:"beefy test/repl.js --open",build:"grunt build",prepublish:"cd src/Grammar && mkdir -p dist && pegjs --extra-options-file peg.json src/Grammar.pegjs dist/Grammar.js",test:"grunt travis --verbose"},dependencies:{ws:"^1.0.1"},optionalDependencies:{promiscuous:"^0.6.0"}}},{}],3:[function(a,b,c){"use strict";b.exports=function(a){var b;b=function(b,c,d,e){var f=d;if(void 0===d)throw new TypeError("Not enough arguments");if(this.ua=b,this.logger=b.getLogger("sip.clientcontext"),this.method=c,d=b.normalizeTarget(d),!d)throw new TypeError("Invalid target: "+f);e=Object.create(e||Object.prototype),e.extraHeaders=(e.extraHeaders||[]).slice(),this.request=new a.OutgoingRequest(this.method,d,this.ua,e.params,e.extraHeaders),e.body&&(this.body={},this.body.body=e.body,e.contentType&&(this.body.contentType=e.contentType),this.request.body=this.body),this.localIdentity=this.request.from,this.remoteIdentity=this.request.to,this.data={}},b.prototype=Object.create(a.EventEmitter.prototype),b.prototype.send=function(){return new a.RequestSender(this,this.ua).send(),this},b.prototype.cancel=function(b){b=b||{},b.extraHeaders=(b.extraHeaders||[]).slice();var c=a.Utils.getCancelReason(b.status_code,b.reason_phrase);this.request.cancel(c,b.extraHeaders),this.emit("cancel")},b.prototype.receiveResponse=function(b){var c=a.Utils.getReasonPhrase(b.status_code);switch(!0){case/^1[0-9]{2}$/.test(b.status_code):this.emit("progress",b,c);break;case/^2[0-9]{2}$/.test(b.status_code):this.ua.applicants[this]&&delete this.ua.applicants[this],this.emit("accepted",b,c);break;default:this.ua.applicants[this]&&delete this.ua.applicants[this],this.emit("rejected",b,c),this.emit("failed",b,c)}},b.prototype.onRequestTimeout=function(){this.emit("failed",null,a.C.causes.REQUEST_TIMEOUT)},b.prototype.onTransportError=function(){this.emit("failed",null,a.C.causes.CONNECTION_ERROR)},a.ClientContext=b}},{}],4:[function(a,b,c){"use strict";b.exports=function(a,b){return{USER_AGENT:a+"/"+b,SIP:"sip",SIPS:"sips",causes:{CONNECTION_ERROR:"Connection Error",REQUEST_TIMEOUT:"Request Timeout",SIP_FAILURE_CODE:"SIP Failure Code",INTERNAL_ERROR:"Internal Error",BUSY:"Busy",REJECTED:"Rejected",REDIRECTED:"Redirected",UNAVAILABLE:"Unavailable",NOT_FOUND:"Not Found",ADDRESS_INCOMPLETE:"Address Incomplete",INCOMPATIBLE_SDP:"Incompatible SDP",AUTHENTICATION_ERROR:"Authentication Error",DIALOG_ERROR:"Dialog Error",WEBRTC_NOT_SUPPORTED:"WebRTC Not Supported",WEBRTC_ERROR:"WebRTC Error",CANCELED:"Canceled",NO_ANSWER:"No Answer",EXPIRES:"Expires",NO_ACK:"No ACK",NO_PRACK:"No PRACK",USER_DENIED_MEDIA_ACCESS:"User Denied Media Access",BAD_MEDIA_DESCRIPTION:"Bad Media Description",RTP_TIMEOUT:"RTP Timeout"},supported:{UNSUPPORTED:"none",SUPPORTED:"supported",REQUIRED:"required"},SIP_ERROR_CAUSES:{REDIRECTED:[300,301,302,305,380],BUSY:[486,600],REJECTED:[403,603],NOT_FOUND:[404,604],UNAVAILABLE:[480,410,408,430],ADDRESS_INCOMPLETE:[484],INCOMPATIBLE_SDP:[488,606],AUTHENTICATION_ERROR:[401,407]},ACK:"ACK",BYE:"BYE",CANCEL:"CANCEL",INFO:"INFO",INVITE:"INVITE",MESSAGE:"MESSAGE",NOTIFY:"NOTIFY",OPTIONS:"OPTIONS",REGISTER:"REGISTER",UPDATE:"UPDATE",SUBSCRIBE:"SUBSCRIBE",REFER:"REFER",PRACK:"PRACK",REASON_PHRASE:{100:"Trying",180:"Ringing",181:"Call Is Being Forwarded",182:"Queued",183:"Session Progress",199:"Early Dialog Terminated",200:"OK",202:"Accepted",204:"No Notification",300:"Multiple Choices",301:"Moved Permanently",302:"Moved Temporarily",305:"Use Proxy",380:"Alternative Service",400:"Bad Request",401:"Unauthorized",402:"Payment Required",403:"Forbidden",404:"Not Found",405:"Method Not Allowed",406:"Not Acceptable",407:"Proxy Authentication Required",408:"Request Timeout",410:"Gone",412:"Conditional Request Failed",413:"Request Entity Too Large",414:"Request-URI Too Long",415:"Unsupported Media Type",416:"Unsupported URI Scheme",417:"Unknown Resource-Priority",420:"Bad Extension",421:"Extension Required",422:"Session Interval Too Small",423:"Interval Too Brief",428:"Use Identity Header",429:"Provide Referrer Identity",430:"Flow Failed",433:"Anonymity Disallowed",436:"Bad Identity-Info",437:"Unsupported Certificate",438:"Invalid Identity Header",439:"First Hop Lacks Outbound Support",440:"Max-Breadth Exceeded",469:"Bad Info Package",470:"Consent Needed",478:"Unresolvable Destination",480:"Temporarily Unavailable",481:"Call/Transaction Does Not Exist",482:"Loop Detected",483:"Too Many Hops",484:"Address Incomplete",485:"Ambiguous",486:"Busy Here",487:"Request Terminated",488:"Not Acceptable Here",489:"Bad Event",491:"Request Pending",493:"Undecipherable",494:"Security Agreement Required",500:"Internal Server Error",501:"Not Implemented",502:"Bad Gateway",503:"Service Unavailable",504:"Server Time-out",505:"Version Not Supported",513:"Message Too Large",580:"Precondition Failure",600:"Busy Everywhere",603:"Decline",604:"Does Not Exist Anywhere",606:"Not Acceptable"},OPTION_TAGS:{"100rel":!0,199:!0,answermode:!0,"early-session":!0,eventlist:!0,explicitsub:!0,"from-change":!0,"geolocation-http":!0,"geolocation-sip":!0,gin:!0,gruu:!0,histinfo:!0,ice:!0,join:!0,"multiple-refer":!0,norefersub:!0,nosub:!0,outbound:!0,path:!0,policy:!0,precondition:!0,pref:!0,privacy:!0,"recipient-list-invite":!0,"recipient-list-message":!0,"recipient-list-subscribe":!0,replaces:!0,"resource-priority":!0,"sdp-anat":!0,"sec-agree":!0,tdialog:!0,timer:!0,uui:!0}}}},{}],5:[function(a,b,c){"use strict";b.exports=function(a){var b;return b=function(a,b,c){this.dialog=a,this.applicant=b,this.request=c,this.reattempt=!1,this.reattemptTimer=null},b.prototype={send:function(){var b=this,c=new a.RequestSender(this,this.dialog.owner.ua);c.send(),this.request.method===a.C.INVITE&&c.clientTransaction.state!==a.Transactions.C.STATUS_TERMINATED&&(this.dialog.uac_pending_reply=!0,c.clientTransaction.on("stateChanged",function d(){(this.state===a.Transactions.C.STATUS_ACCEPTED||this.state===a.Transactions.C.STATUS_COMPLETED||this.state===a.Transactions.C.STATUS_TERMINATED)&&(this.removeListener("stateChanged",d),b.dialog.uac_pending_reply=!1,b.dialog.uas_pending_reply===!1&&b.dialog.owner.onReadyToReinvite())}))},onRequestTimeout:function(){this.applicant.onRequestTimeout()},onTransportError:function(){this.applicant.onTransportError()},receiveResponse:function(b){var c=this;408===b.status_code||481===b.status_code?this.applicant.onDialogError(b):b.method===a.C.INVITE&&491===b.status_code?this.reattempt?this.applicant.receiveResponse(b):(this.request.cseq.value=this.dialog.local_seqnum+=1,this.reattemptTimer=a.Timers.setTimeout(function(){c.applicant.owner.status!==a.Session.C.STATUS_TERMINATED&&(c.reattempt=!0,c.request_sender.send())},this.getReattemptTimeout())):this.applicant.receiveResponse(b)}},b}},{}],6:[function(a,b,c){"use strict";b.exports=function(b){var c,d=a("./Dialog/RequestSender")(b),e={STATUS_EARLY:1,STATUS_CONFIRMED:2};c=function(a,c,d,f){var g;return this.uac_pending_reply=!1,this.uas_pending_reply=!1,c.hasHeader("contact")?(f=c instanceof b.IncomingResponse?c.status_code<200?e.STATUS_EARLY:e.STATUS_CONFIRMED:f||e.STATUS_CONFIRMED,g=c.parseHeader("contact"),"UAS"===d?(this.id={call_id:c.call_id,local_tag:c.to_tag,remote_tag:c.from_tag,toString:function(){return this.call_id+this.local_tag+this.remote_tag}},this.state=f,this.remote_seqnum=c.cseq,this.local_uri=c.parseHeader("to").uri,this.remote_uri=c.parseHeader("from").uri,this.remote_target=g.uri,this.route_set=c.getHeaders("record-route"),this.invite_seqnum=c.cseq,this.local_seqnum=c.cseq):"UAC"===d&&(this.id={call_id:c.call_id,local_tag:c.from_tag,remote_tag:c.to_tag,toString:function(){return this.call_id+this.local_tag+this.remote_tag}},this.state=f,this.invite_seqnum=c.cseq,this.local_seqnum=c.cseq,this.local_uri=c.parseHeader("from").uri,this.pracked=[],this.remote_uri=c.parseHeader("to").uri,this.remote_target=g.uri,this.route_set=c.getHeaders("record-route").reverse(),this.state!==e.STATUS_EARLY||a.hasOffer||(this.mediaHandler=a.mediaHandlerFactory(a))),this.logger=a.ua.getLogger("sip.dialog",this.id.toString()),this.owner=a,a.ua.dialogs[this.id.toString()]=this,this.logger.log("new "+d+" dialog created with status "+(this.state===e.STATUS_EARLY?"EARLY":"CONFIRMED")),void a.emit("dialog",this)):{error:"unable to create a Dialog without Contact header field"}},c.prototype={update:function(a,b){this.state=e.STATUS_CONFIRMED,this.logger.log("dialog "+this.id.toString()+"  changed to CONFIRMED state"),"UAC"===b&&(this.route_set=a.getHeaders("record-route").reverse())},terminate:function(){this.logger.log("dialog "+this.id.toString()+" deleted"),this.mediaHandler&&this.state!==e.STATUS_CONFIRMED&&this.mediaHandler.peerConnection.close(),delete this.owner.ua.dialogs[this.id.toString()]},createRequest:function(a,c,d){var e,f;return c=(c||[]).slice(),this.local_seqnum||(this.local_seqnum=Math.floor(1e4*Math.random())),e=a===b.C.CANCEL||a===b.C.ACK?this.invite_seqnum:this.local_seqnum+=1,f=new b.OutgoingRequest(a,this.remote_target,this.owner.ua,{cseq:e,call_id:this.id.call_id,from_uri:this.local_uri,from_tag:this.id.local_tag,to_uri:this.remote_uri,to_tag:this.id.remote_tag,route_set:this.route_set},c,d),f.dialog=this,f},checkInDialogRequest:function(a){var c=this;if(this.remote_seqnum){if(a.cseq<this.remote_seqnum)return a.method!==b.C.ACK&&a.reply(500),a.cseq===this.invite_seqnum?!0:!1;a.cseq>this.remote_seqnum&&(this.remote_seqnum=a.cseq)}else this.remote_seqnum=a.cseq;switch(a.method){case b.C.INVITE:if(this.uac_pending_reply===!0)a.reply(491);else{if(this.uas_pending_reply===!0){var d=(10*Math.random()|0)+1;return a.reply(500,null,["Retry-After:"+d]),!1}this.uas_pending_reply=!0,a.server_transaction.on("stateChanged",function e(){(this.state===b.Transactions.C.STATUS_ACCEPTED||this.state===b.Transactions.C.STATUS_COMPLETED||this.state===b.Transactions.C.STATUS_TERMINATED)&&(this.removeListener("stateChanged",e),c.uas_pending_reply=!1,c.uac_pending_reply===!1&&c.owner.onReadyToReinvite())})}a.hasHeader("contact")&&a.server_transaction.on("stateChanged",function(){this.state===b.Transactions.C.STATUS_ACCEPTED&&(c.remote_target=a.parseHeader("contact").uri)});break;case b.C.NOTIFY:a.hasHeader("contact")&&a.server_transaction.on("stateChanged",function(){this.state===b.Transactions.C.STATUS_COMPLETED&&(c.remote_target=a.parseHeader("contact").uri)})}return!0},sendRequest:function(a,b,c){c=c||{};var e=(c.extraHeaders||[]).slice(),f=null;c.body&&(c.body.body?f=c.body:(f={},f.body=c.body,c.contentType&&(f.contentType=c.contentType)));var g=this.createRequest(b,e,f),h=new d(this,a,g);return h.send(),g},receiveRequest:function(a){this.checkInDialogRequest(a)&&this.owner.receiveRequest(a)}},c.C=e,b.Dialog=c}},{"./Dialog/RequestSender":5}],7:[function(a,b,c){"use strict";b.exports=function(a){var b;return b=function(a){this.logger=a.getLogger("sipjs.digestauthentication"),this.username=a.configuration.authorizationUser,this.password=a.configuration.password,this.cnonce=null,this.nc=0,this.ncHex="00000000",this.response=null},b.prototype.authenticate=function(b,c){if(this.algorithm=c.algorithm,this.realm=c.realm,this.nonce=c.nonce,this.opaque=c.opaque,this.stale=c.stale,this.algorithm){if("MD5"!==this.algorithm)return this.logger.warn('challenge with Digest algorithm different than "MD5", authentication aborted'),!1}else this.algorithm="MD5";if(!this.realm)return this.logger.warn("challenge without Digest realm, authentication aborted"),!1;if(!this.nonce)return this.logger.warn("challenge without Digest nonce, authentication aborted"),!1;if(c.qop)if(c.qop.indexOf("auth")>-1)this.qop="auth";else{if(!(c.qop.indexOf("auth-int")>-1))return this.logger.warn('challenge without Digest qop different than "auth" or "auth-int", authentication aborted'),!1;this.qop="auth-int"}else this.qop=null;return this.method=b.method,this.uri=b.ruri,this.cnonce=a.createRandomToken(12),this.nc+=1,this.updateNcHex(),4294967296===this.nc&&(this.nc=1,this.ncHex="00000001"),this.calculateResponse(),!0},b.prototype.calculateResponse=function(){var b,c;b=a.calculateMD5(this.username+":"+this.realm+":"+this.password),"auth"===this.qop?(c=a.calculateMD5(this.method+":"+this.uri),this.response=a.calculateMD5(b+":"+this.nonce+":"+this.ncHex+":"+this.cnonce+":auth:"+c)):"auth-int"===this.qop?(c=a.calculateMD5(this.method+":"+this.uri+":"+a.calculateMD5(this.body?this.body:"")),this.response=a.calculateMD5(b+":"+this.nonce+":"+this.ncHex+":"+this.cnonce+":auth-int:"+c)):null===this.qop&&(c=a.calculateMD5(this.method+":"+this.uri),this.response=a.calculateMD5(b+":"+this.nonce+":"+c))},b.prototype.toString=function(){var a=[];if(!this.response)throw new Error("response field does not exist, cannot generate Authorization header");return a.push("algorithm="+this.algorithm),a.push('username="'+this.username+'"'),a.push('realm="'+this.realm+'"'),a.push('nonce="'+this.nonce+'"'),a.push('uri="'+this.uri+'"'),a.push('response="'+this.response+'"'),this.opaque&&a.push('opaque="'+this.opaque+'"'),this.qop&&(a.push("qop="+this.qop),a.push('cnonce="'+this.cnonce+'"'),a.push("nc="+this.ncHex)),"Digest "+a.join(", ")},b.prototype.updateNcHex=function(){var a=Number(this.nc).toString(16);this.ncHex="00000000".substr(0,8-a.length)+a},b}},{}],8:[function(a,b,c){"use strict";var d=a("events").EventEmitter;b.exports=function(a){function b(){d.call(this)}return b.prototype=Object.create(d.prototype,{constructor:{value:b,enumerable:!1,writable:!0,configurable:!0}}),b.prototype.off=function(b,c){var d="";return d+="SIP.EventEmitter#off is deprecated and may be removed in future SIP.js versions.\n",d+="Please use removeListener or removeAllListeners instead.\n",d+="See here for more details:\n",d+="http://nodejs.org/api/events.html#events_emitter_removelistener_event_listener",a.warn(d),arguments.length<2?this.removeAllListeners.apply(this,arguments):this.removeListener(b,c)},b}},{events:1}],9:[function(a,b,c){"use strict";b.exports={ConfigurationError:function(){var a=function(a,b){this.code=1,this.name="CONFIGURATION_ERROR",this.parameter=a,this.value=b,this.message=this.value?"Invalid value "+JSON.stringify(this.value)+' for parameter "'+this.parameter+'"':"Missing parameter: "+this.parameter};return a.prototype=new Error,a}(),InvalidStateError:function(){var a=function(a){this.code=2,this.name="INVALID_STATE_ERROR",this.status=a,this.message="Invalid status: "+a};return a.prototype=new Error,a}(),NotSupportedError:function(){var a=function(a){this.code=3,this.name="NOT_SUPPORTED_ERROR",this.message=a};return a.prototype=new Error,a}(),GetDescriptionError:function(){var a=function(a){this.code=4,this.name="GET_DESCRIPTION_ERROR",this.message=a};return a.prototype=new Error,a}()}},{}],10:[function(a,b,c){"use strict";var d=a("./Grammar/dist/Grammar");b.exports=function(a){return{parse:function(b,c){var e={startRule:c,SIP:a};try{d.parse(b,e)}catch(f){e.data=-1}return e.data}}}},{"./Grammar/dist/Grammar":11}],11:[function(a,b,c){b.exports=function(){function a(a,b){function c(){this.constructor=a}c.prototype=b.prototype,a.prototype=new c}function b(a,b,c,d,e,f){this.message=a,this.expected=b,this.found=c,this.offset=d,this.line=e,this.column=f,this.name="SyntaxError"}function c(a){function c(){return a.substring(s,r)}function d(){return s}function e(b){function c(b,c,d){var e,f;for(e=c;d>e;e++)f=a.charAt(e),"\n"===f?(b.seenCR||b.line++,b.column=1,b.seenCR=!1):"\r"===f||"\u2028"===f||"\u2029"===f?(b.line++,b.column=1,b.seenCR=!0):(b.column++,b.seenCR=!1)}return t!==b&&(t>b&&(t=0,u={line:1,column:1,seenCR:!1}),c(u,t,b),t=b),u}function f(a){v>r||(r>v&&(v=r,w=[]),w.push(a))}function g(c,d,f){function g(a){var b=1;for(a.sort(function(a,b){return a.description<b.description?-1:a.description>b.description?1:0});b<a.length;)a[b-1]===a[b]?a.splice(b,1):b++}function h(a,b){function c(a){function b(a){return a.charCodeAt(0).toString(16).toUpperCase()}return a.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\x08/g,"\\b").replace(/\t/g,"\\t").replace(/\n/g,"\\n").replace(/\f/g,"\\f").replace(/\r/g,"\\r").replace(/[\x00-\x07\x0B\x0E\x0F]/g,function(a){return"\\x0"+b(a)}).replace(/[\x10-\x1F\x80-\xFF]/g,function(a){return"\\x"+b(a)}).replace(/[\u0180-\u0FFF]/g,function(a){return"\\u0"+b(a)}).replace(/[\u1080-\uFFFF]/g,function(a){return"\\u"+b(a)})}var d,e,f,g=new Array(a.length);for(f=0;f<a.length;f++)g[f]=a[f].description;return d=a.length>1?g.slice(0,-1).join(", ")+" or "+g[a.length-1]:g[0],e=b?'"'+c(b)+'"':"end of input","Expected "+d+" but "+e+" found."}var i=e(f),j=f<a.length?a.charAt(f):null;return null!==d&&g(d),new b(null!==c?c:h(d,j),d,j,f,i.line,i.column)}function h(a){var b,c=new Array(a.length);for(b=0;b<a.length;b++)c[b]=a.charCodeAt(b)-32;return c}function i(b){function c(a){return"[object Array]"===Object.prototype.toString.apply(a)?[]:a}for(var d,e,g=q[b],h=0,j=[],k=g.length,l=[],n=[];;){for(;k>h;)switch(g[h]){case 0:n.push(c(p[g[h+1]])),h+=2;break;case 1:n.push(r),h++;break;case 2:n.pop(),h++;break;case 3:r=n.pop(),h++;break;case 4:n.length-=g[h+1],h+=2;break;case 5:n.splice(-2,1),h++;break;case 6:n[n.length-2].push(n.pop()),h++;break;case 7:n.push(n.splice(n.length-g[h+1],g[h+1])),h+=2;break;case 8:n.pop(),n.push(a.substring(n[n.length-1],r)),h++;break;case 9:l.push(k),j.push(h+3+g[h+1]+g[h+2]),n[n.length-1]?(k=h+3+g[h+1],h+=3):(k=h+3+g[h+1]+g[h+2],h+=3+g[h+1]);break;case 10:l.push(k),j.push(h+3+g[h+1]+g[h+2]),n[n.length-1]===m?(k=h+3+g[h+1],h+=3):(k=h+3+g[h+1]+g[h+2],h+=3+g[h+1]);break;case 11:l.push(k),j.push(h+3+g[h+1]+g[h+2]),n[n.length-1]!==m?(k=h+3+g[h+1],h+=3):(k=h+3+g[h+1]+g[h+2],h+=3+g[h+1]);break;case 12:n[n.length-1]!==m?(l.push(k),j.push(h),k=h+2+g[h+1],h+=2):h+=2+g[h+1];break;case 13:l.push(k),j.push(h+3+g[h+1]+g[h+2]),a.length>r?(k=h+3+g[h+1],h+=3):(k=h+3+g[h+1]+g[h+2],h+=3+g[h+1]);break;case 14:l.push(k),j.push(h+4+g[h+2]+g[h+3]),a.substr(r,p[g[h+1]].length)===p[g[h+1]]?(k=h+4+g[h+2],h+=4):(k=h+4+g[h+2]+g[h+3],h+=4+g[h+2]);break;case 15:l.push(k),j.push(h+4+g[h+2]+g[h+3]),a.substr(r,p[g[h+1]].length).toLowerCase()===p[g[h+1]]?(k=h+4+g[h+2],h+=4):(k=h+4+g[h+2]+g[h+3],h+=4+g[h+2]);break;case 16:l.push(k),j.push(h+4+g[h+2]+g[h+3]),p[g[h+1]].test(a.charAt(r))?(k=h+4+g[h+2],h+=4):(k=h+4+g[h+2]+g[h+3],h+=4+g[h+2]);break;case 17:n.push(a.substr(r,g[h+1])),r+=g[h+1],h+=2;break;case 18:n.push(p[g[h+1]]),r+=p[g[h+1]].length,h+=2;break;case 19:n.push(m),0===x&&f(p[g[h+1]]),h+=2;break;case 20:s=n[n.length-1-g[h+1]],h+=2;break;case 21:s=r,h++;break;case 22:for(d=g.slice(h+4,h+4+g[h+3]),e=0;e<g[h+3];e++)d[e]=n[n.length-1-d[e]];n.splice(n.length-g[h+2],g[h+2],p[g[h+1]].apply(null,d)),h+=4+g[h+3];break;case 23:n.push(i(g[h+1])),h+=2;break;case 24:x++,h++;break;case 25:x--,h++;break;default:throw new Error("Invalid opcode: "+g[h]+".")}if(!(l.length>0))break;k=l.pop(),h=j.pop()}return n[0]}function j(a,b){return[a].concat(b)}var k,l=arguments.length>1?arguments[1]:{},m={},n={Contact:118,Name_Addr_Header:155,Record_Route:175,Request_Response:81,SIP_URI:45,Subscription_State:185,Supported:190,Require:181,Via:193,absoluteURI:84,Call_ID:117,Content_Disposition:129,Content_Length:134,Content_Type:135,CSeq:145,displayName:121,Event:148,From:150,host:52,Max_Forwards:153,Min_SE:212,Proxy_Authenticate:156,quoted_string:40,Refer_To:177,Replaces:178,Session_Expires:209,stun_URI:216,To:191,turn_URI:223,uuid:226,WWW_Authenticate:208,challenge:157},o=118,p=["\r\n",{type:"literal",value:"\r\n",description:'"\\r\\n"'},/^[0-9]/,{type:"class",value:"[0-9]",description:"[0-9]"},/^[a-zA-Z]/,{type:"class",value:"[a-zA-Z]",description:"[a-zA-Z]"},/^[0-9a-fA-F]/,{type:"class",value:"[0-9a-fA-F]",description:"[0-9a-fA-F]"},/^[\0-\xFF]/,{type:"class",value:"[\\0-\\xFF]",description:"[\\0-\\xFF]"},/^["]/,{type:"class",value:'["]',description:'["]'}," ",{type:"literal",value:" ",description:'" "'},"	",{type:"literal",value:"	",description:'"\\t"'},/^[a-zA-Z0-9]/,{type:"class",value:"[a-zA-Z0-9]",description:"[a-zA-Z0-9]"},";",{type:"literal",value:";",description:'";"'},"/",{type:"literal",value:"/",description:'"/"'},"?",{type:"literal",value:"?",description:'"?"'},":",{type:"literal",value:":",description:'":"'},"@",{type:"literal",value:"@",description:'"@"'},"&",{type:"literal",value:"&",description:'"&"'},"=",{type:"literal",value:"=",description:'"="'},"+",{type:"literal",value:"+",description:'"+"'},"$",{type:"literal",value:"$",description:'"$"'},",",{type:"literal",value:",",description:'","'},"-",{type:"literal",value:"-",description:'"-"'},"_",{type:"literal",value:"_",description:'"_"'},".",{type:"literal",value:".",description:'"."'},"!",{type:"literal",value:"!",description:'"!"'},"~",{type:"literal",value:"~",description:'"~"'},"*",{type:"literal",value:"*",description:'"*"'},"'",{type:"literal",value:"'",description:'"\'"'},"(",{type:"literal",value:"(",description:'"("'},")",{type:"literal",value:")",description:'")"'},m,"%",{type:"literal",value:"%",description:'"%"'},null,[],function(){return" "},function(){return":"},/^[!-~]/,{type:"class",value:"[!-~]",description:"[!-~]"},/^[\x80-\uFFFF]/,{type:"class",value:"[\\x80-\\uFFFF]",description:"[\\x80-\\uFFFF]"},/^[\x80-\xBF]/,{type:"class",value:"[\\x80-\\xBF]",description:"[\\x80-\\xBF]"},/^[a-f]/,{type:"class",value:"[a-f]",description:"[a-f]"},"`",{type:"literal",value:"`",description:'"`"'},"<",{type:"literal",value:"<",description:'"<"'},">",{type:"literal",value:">",description:'">"'},"\\",{type:"literal",value:"\\",description:'"\\\\"'},"[",{type:"literal",value:"[",description:'"["'},"]",{type:"literal",value:"]",description:'"]"'},"{",{type:"literal",value:"{",description:'"{"'},"}",{type:"literal",value:"}",description:'"}"'},function(){return"*"},function(){return"/"},function(){return"="},function(){return"("},function(){return")"},function(){return">"},function(){return"<"},function(){return","},function(){return";"},function(){return":"},function(){return'"'},/^[!-']/,{type:"class",value:"[!-']",description:"[!-']"},/^[*-[]/,{type:"class",value:"[*-[]",description:"[*-[]"},/^[\]-~]/,{type:"class",value:"[\\]-~]",description:"[\\]-~]"},function(a){return a},/^[#-[]/,{type:"class",value:"[#-[]",description:"[#-[]"},/^[\0-\t]/,{type:"class",value:"[\\0-\\t]",description:"[\\0-\\t]"},/^[\x0B-\f]/,{type:"class",value:"[\\x0B-\\f]",description:"[\\x0B-\\f]"},/^[\x0E-]/,{type:"class",value:"[\\x0E-]",description:"[\\x0E-]"},function(){l.data.uri=new l.SIP.URI(l.data.scheme,l.data.user,l.data.host,l.data.port),delete l.data.scheme,delete l.data.user,delete l.data.host,delete l.data.host_type,delete l.data.port},function(){l.data.uri=new l.SIP.URI(l.data.scheme,l.data.user,l.data.host,l.data.port,l.data.uri_params,l.data.uri_headers),delete l.data.scheme,delete l.data.user,delete l.data.host,delete l.data.host_type,delete l.data.port,delete l.data.uri_params,"SIP_URI"===l.startRule&&(l.data=l.data.uri)},"sips",{type:"literal",value:"sips",description:'"sips"'},"sip",{type:"literal",value:"sip",description:'"sip"'},function(a){l.data.scheme=a},function(){l.data.user=decodeURIComponent(c().slice(0,-1))},function(){l.data.password=c()},function(){return l.data.host=c(),l.data.host},function(){return l.data.host_type="domain",c()},/^[a-zA-Z0-9_\-]/,{type:"class",value:"[a-zA-Z0-9_\\-]",description:"[a-zA-Z0-9_\\-]"},/^[a-zA-Z0-9\-]/,{type:"class",value:"[a-zA-Z0-9\\-]",description:"[a-zA-Z0-9\\-]"},function(){return l.data.host_type="IPv6",c()},"::",{type:"literal",value:"::",description:'"::"'},function(){return l.data.host_type="IPv6",c()},function(){return l.data.host_type="IPv4",c()},"25",{type:"literal",value:"25",description:'"25"'},/^[0-5]/,{type:"class",value:"[0-5]",description:"[0-5]"},"2",{type:"literal",value:"2",description:'"2"'},/^[0-4]/,{type:"class",value:"[0-4]",description:"[0-4]"},"1",{type:"literal",value:"1",description:'"1"'},/^[1-9]/,{type:"class",value:"[1-9]",description:"[1-9]"},function(a){return a=parseInt(a.join("")),l.data.port=a,a},"transport=",{type:"literal",value:"transport=",description:'"transport="'},"udp",{type:"literal",value:"udp",description:'"udp"'},"tcp",{type:"literal",value:"tcp",description:'"tcp"'},"sctp",{type:"literal",value:"sctp",description:'"sctp"'},"tls",{type:"literal",value:"tls",description:'"tls"'},function(a){l.data.uri_params||(l.data.uri_params={}),l.data.uri_params.transport=a.toLowerCase()},"user=",{type:"literal",value:"user=",description:'"user="'},"phone",{type:"literal",value:"phone",description:'"phone"'},"ip",{type:"literal",value:"ip",description:'"ip"'},function(a){l.data.uri_params||(l.data.uri_params={}),l.data.uri_params.user=a.toLowerCase()},"method=",{type:"literal",value:"method=",description:'"method="'},function(a){l.data.uri_params||(l.data.uri_params={}),l.data.uri_params.method=a},"ttl=",{type:"literal",value:"ttl=",description:'"ttl="'},function(a){l.data.params||(l.data.params={}),l.data.params.ttl=a},"maddr=",{type:"literal",value:"maddr=",description:'"maddr="'},function(a){l.data.uri_params||(l.data.uri_params={}),l.data.uri_params.maddr=a},"lr",{type:"literal",value:"lr",description:'"lr"'},function(){l.data.uri_params||(l.data.uri_params={}),l.data.uri_params.lr=void 0},function(a,b){l.data.uri_params||(l.data.uri_params={}),b=null===b?void 0:b[1],l.data.uri_params[a.toLowerCase()]=b&&b.toLowerCase()},function(a,b){a=a.join("").toLowerCase(),b=b.join(""),l.data.uri_headers||(l.data.uri_headers={}),l.data.uri_headers[a]?l.data.uri_headers[a].push(b):l.data.uri_headers[a]=[b]},function(){"Refer_To"===l.startRule&&(l.data.uri=new l.SIP.URI(l.data.scheme,l.data.user,l.data.host,l.data.port,l.data.uri_params,l.data.uri_headers),delete l.data.scheme,delete l.data.user,delete l.data.host,delete l.data.host_type,delete l.data.port,delete l.data.uri_params)},"//",{type:"literal",value:"//",description:'"//"'},function(){l.data.scheme=c()},{type:"literal",value:"SIP",description:'"SIP"'},function(){l.data.sip_version=c()},"INVITE",{type:"literal",value:"INVITE",description:'"INVITE"'},"ACK",{type:"literal",value:"ACK",description:'"ACK"'},"VXACH",{type:"literal",value:"VXACH",description:'"VXACH"'},"OPTIONS",{type:"literal",value:"OPTIONS",description:'"OPTIONS"'},"BYE",{type:"literal",value:"BYE",description:'"BYE"'},"CANCEL",{type:"literal",value:"CANCEL",description:'"CANCEL"'},"REGISTER",{type:"literal",value:"REGISTER",description:'"REGISTER"'},"SUBSCRIBE",{type:"literal",value:"SUBSCRIBE",description:'"SUBSCRIBE"'},"NOTIFY",{type:"literal",value:"NOTIFY",description:'"NOTIFY"'},"REFER",{type:"literal",value:"REFER",description:'"REFER"'},function(){return l.data.method=c(),l.data.method},function(a){l.data.status_code=parseInt(a.join(""))},function(){l.data.reason_phrase=c()},function(){l.data=c()},function(){var a,b;for(b=l.data.multi_header.length,a=0;b>a;a++)if(null===l.data.multi_header[a].parsed){l.data=null;break}null!==l.data?l.data=l.data.multi_header:l.data=-1},function(){
36
-var a;l.data.multi_header||(l.data.multi_header=[]);try{a=new l.SIP.NameAddrHeader(l.data.uri,l.data.displayName,l.data.params),delete l.data.uri,delete l.data.displayName,delete l.data.params}catch(b){a=null}l.data.multi_header.push({position:r,offset:d(),parsed:a})},function(a){a=c().trim(),'"'===a[0]&&(a=a.substring(1,a.length-1)),l.data.displayName=a},"q",{type:"literal",value:"q",description:'"q"'},function(a){l.data.params||(l.data.params={}),l.data.params.q=a},"expires",{type:"literal",value:"expires",description:'"expires"'},function(a){l.data.params||(l.data.params={}),l.data.params.expires=a},function(a){return parseInt(a.join(""))},"0",{type:"literal",value:"0",description:'"0"'},function(){return parseFloat(c())},function(a,b){l.data.params||(l.data.params={}),b=null===b?void 0:b[1],l.data.params[a.toLowerCase()]=b},"render",{type:"literal",value:"render",description:'"render"'},"session",{type:"literal",value:"session",description:'"session"'},"icon",{type:"literal",value:"icon",description:'"icon"'},"alert",{type:"literal",value:"alert",description:'"alert"'},function(){"Content_Disposition"===l.startRule&&(l.data.type=c().toLowerCase())},"handling",{type:"literal",value:"handling",description:'"handling"'},"optional",{type:"literal",value:"optional",description:'"optional"'},"required",{type:"literal",value:"required",description:'"required"'},function(a){l.data=parseInt(a.join(""))},function(){l.data=c()},"text",{type:"literal",value:"text",description:'"text"'},"image",{type:"literal",value:"image",description:'"image"'},"audio",{type:"literal",value:"audio",description:'"audio"'},"video",{type:"literal",value:"video",description:'"video"'},"application",{type:"literal",value:"application",description:'"application"'},"message",{type:"literal",value:"message",description:'"message"'},"multipart",{type:"literal",value:"multipart",description:'"multipart"'},"x-",{type:"literal",value:"x-",description:'"x-"'},function(a){l.data.value=parseInt(a.join(""))},function(a){l.data=a},function(a){l.data.event=a.toLowerCase()},function(){var a=l.data.tag;l.data=new l.SIP.NameAddrHeader(l.data.uri,l.data.displayName,l.data.params),a&&l.data.setParam("tag",a)},"tag",{type:"literal",value:"tag",description:'"tag"'},function(a){l.data.tag=a},function(a){l.data=parseInt(a.join(""))},function(a){l.data=a},function(){l.data=new l.SIP.NameAddrHeader(l.data.uri,l.data.displayName,l.data.params)},"digest",{type:"literal",value:"Digest",description:'"Digest"'},"realm",{type:"literal",value:"realm",description:'"realm"'},function(a){l.data.realm=a},"domain",{type:"literal",value:"domain",description:'"domain"'},"nonce",{type:"literal",value:"nonce",description:'"nonce"'},function(a){l.data.nonce=a},"opaque",{type:"literal",value:"opaque",description:'"opaque"'},function(a){l.data.opaque=a},"stale",{type:"literal",value:"stale",description:'"stale"'},"true",{type:"literal",value:"true",description:'"true"'},function(){l.data.stale=!0},"false",{type:"literal",value:"false",description:'"false"'},function(){l.data.stale=!1},"algorithm",{type:"literal",value:"algorithm",description:'"algorithm"'},"md5",{type:"literal",value:"MD5",description:'"MD5"'},"md5-sess",{type:"literal",value:"MD5-sess",description:'"MD5-sess"'},function(a){l.data.algorithm=a.toUpperCase()},"qop",{type:"literal",value:"qop",description:'"qop"'},"auth-int",{type:"literal",value:"auth-int",description:'"auth-int"'},"auth",{type:"literal",value:"auth",description:'"auth"'},function(a){l.data.qop||(l.data.qop=[]),l.data.qop.push(a.toLowerCase())},function(a){l.data.value=parseInt(a.join(""))},function(){var a,b;for(b=l.data.multi_header.length,a=0;b>a;a++)if(null===l.data.multi_header[a].parsed){l.data=null;break}null!==l.data?l.data=l.data.multi_header:l.data=-1},function(){var a;l.data.multi_header||(l.data.multi_header=[]);try{a=new l.SIP.NameAddrHeader(l.data.uri,l.data.displayName,l.data.params),delete l.data.uri,delete l.data.displayName,delete l.data.params}catch(b){a=null}l.data.multi_header.push({position:r,offset:d(),parsed:a})},function(){l.data=new l.SIP.NameAddrHeader(l.data.uri,l.data.displayName,l.data.params)},function(){l.data.replaces_from_tag&&l.data.replaces_to_tag||(l.data=-1)},function(){l.data={call_id:l.data}},"from-tag",{type:"literal",value:"from-tag",description:'"from-tag"'},function(a){l.data.replaces_from_tag=a},"to-tag",{type:"literal",value:"to-tag",description:'"to-tag"'},function(a){l.data.replaces_to_tag=a},"early-only",{type:"literal",value:"early-only",description:'"early-only"'},function(){l.data.early_only=!0},function(a){return a},function(a,b){return j(a,b)},function(a){"Require"===l.startRule&&(l.data=a||[])},function(a){l.data.value=parseInt(a.join(""))},"active",{type:"literal",value:"active",description:'"active"'},"pending",{type:"literal",value:"pending",description:'"pending"'},"terminated",{type:"literal",value:"terminated",description:'"terminated"'},function(){l.data.state=c()},"reason",{type:"literal",value:"reason",description:'"reason"'},function(a){"undefined"!=typeof a&&(l.data.reason=a)},function(a){"undefined"!=typeof a&&(l.data.expires=a)},"retry_after",{type:"literal",value:"retry_after",description:'"retry_after"'},function(a){"undefined"!=typeof a&&(l.data.retry_after=a)},"deactivated",{type:"literal",value:"deactivated",description:'"deactivated"'},"probation",{type:"literal",value:"probation",description:'"probation"'},"rejected",{type:"literal",value:"rejected",description:'"rejected"'},"timeout",{type:"literal",value:"timeout",description:'"timeout"'},"giveup",{type:"literal",value:"giveup",description:'"giveup"'},"noresource",{type:"literal",value:"noresource",description:'"noresource"'},"invariant",{type:"literal",value:"invariant",description:'"invariant"'},function(a){"Supported"===l.startRule&&(l.data=a||[])},function(){var a=l.data.tag;l.data=new l.SIP.NameAddrHeader(l.data.uri,l.data.displayName,l.data.params),a&&l.data.setParam("tag",a)},"ttl",{type:"literal",value:"ttl",description:'"ttl"'},function(a){l.data.ttl=a},"maddr",{type:"literal",value:"maddr",description:'"maddr"'},function(a){l.data.maddr=a},"received",{type:"literal",value:"received",description:'"received"'},function(a){l.data.received=a},"branch",{type:"literal",value:"branch",description:'"branch"'},function(a){l.data.branch=a},"rport",{type:"literal",value:"rport",description:'"rport"'},function(){"undefined"!=typeof response_port&&(l.data.rport=response_port.join(""))},function(a){l.data.protocol=a},{type:"literal",value:"UDP",description:'"UDP"'},{type:"literal",value:"TCP",description:'"TCP"'},{type:"literal",value:"TLS",description:'"TLS"'},{type:"literal",value:"SCTP",description:'"SCTP"'},function(a){l.data.transport=a},function(){l.data.host=c()},function(a){l.data.port=parseInt(a.join(""))},function(a){return parseInt(a.join(""))},function(a){"Session_Expires"===l.startRule&&(l.data.deltaSeconds=a)},"refresher",{type:"literal",value:"refresher",description:'"refresher"'},"uas",{type:"literal",value:"uas",description:'"uas"'},"uac",{type:"literal",value:"uac",description:'"uac"'},function(a){"Session_Expires"===l.startRule&&(l.data.refresher=a)},function(a){"Min_SE"===l.startRule&&(l.data=a)},"stuns",{type:"literal",value:"stuns",description:'"stuns"'},"stun",{type:"literal",value:"stun",description:'"stun"'},function(a){l.data.scheme=a},function(a){l.data.host=a},"?transport=",{type:"literal",value:"?transport=",description:'"?transport="'},"turns",{type:"literal",value:"turns",description:'"turns"'},"turn",{type:"literal",value:"turn",description:'"turn"'},function(){l.data.transport=transport},function(){l.data=c()}],q=[h('. ""2 3!'),h('0"""1!3#'),h('0$""1!3%'),h('0&""1!3\''),h("7'*# \"7("),h('0(""1!3)'),h('0*""1!3+'),h('.,""2,3-'),h('..""2.3/'),h('00""1!31'),h('.2""2233*\x89 ".4""2435*} ".6""2637*q ".8""2839*e ".:""2:3;*Y ".<""2<3=*M ".>""2>3?*A ".@""2@3A*5 ".B""2B3C*) ".D""2D3E'),h('7)*# "7,'),h('.F""2F3G*} ".H""2H3I*q ".J""2J3K*e ".L""2L3M*Y ".N""2N3O*M ".P""2P3Q*A ".R""2R3S*5 ".T""2T3U*) ".V""2V3W'),h('!!.Y""2Y3Z+7$7#+-%7#+#%\'#%$## X$"# X"# X+! (%'),h('!! \\7$,#&7$"+-$7 +#%\'"%$"# X"# X*# " [+@$ \\7$+&$,#&7$""" X+\'%4"6]" %$"# X"# X'),h('7.*# " ['),h('! \\7\'*# "7(,)&7\'*# "7("+A$.8""2839+1%7/+\'%4#6^# %$## X$"# X"# X'),h('!! \\72+&$,#&72""" X+o$ \\! \\7.,#&7."+-$72+#%\'"%$"# X"# X,@&! \\7.,#&7."+-$72+#%\'"%$"# X"# X"+#%\'"%$"# X"# X+! (%'),h('0_""1!3`*# "73'),h('0a""1!3b'),h('0c""1!3d'),h('7!*) "0e""1!3f'),h('! \\7)*\x95 ".F""2F3G*\x89 ".J""2J3K*} ".L""2L3M*q ".Y""2Y3Z*e ".P""2P3Q*Y ".H""2H3I*M ".@""2@3A*A ".g""2g3h*5 ".R""2R3S*) ".N""2N3O+\x9e$,\x9b&7)*\x95 ".F""2F3G*\x89 ".J""2J3K*} ".L""2L3M*q ".Y""2Y3Z*e ".P""2P3Q*Y ".H""2H3I*M ".@""2@3A*A ".g""2g3h*5 ".R""2R3S*) ".N""2N3O""" X+! (%'),h('! \\7)*\x89 ".F""2F3G*} ".L""2L3M*q ".Y""2Y3Z*e ".P""2P3Q*Y ".H""2H3I*M ".@""2@3A*A ".g""2g3h*5 ".R""2R3S*) ".N""2N3O+\x92$,\x8f&7)*\x89 ".F""2F3G*} ".L""2L3M*q ".Y""2Y3Z*e ".P""2P3Q*Y ".H""2H3I*M ".@""2@3A*A ".g""2g3h*5 ".R""2R3S*) ".N""2N3O""" X+! (%'),h('.T""2T3U*\xe3 ".V""2V3W*\xd7 ".i""2i3j*\xcb ".k""2k3l*\xbf ".:""2:3;*\xb3 ".D""2D3E*\xa7 ".2""2233*\x9b ".8""2839*\x8f ".m""2m3n*\x83 "7&*} ".4""2435*q ".o""2o3p*e ".q""2q3r*Y ".6""2637*M ".>""2>3?*A ".s""2s3t*5 ".u""2u3v*) "7\'*# "7('),h('! \\7)*\u012b ".F""2F3G*\u011f ".J""2J3K*\u0113 ".L""2L3M*\u0107 ".Y""2Y3Z*\xfb ".P""2P3Q*\xef ".H""2H3I*\xe3 ".@""2@3A*\xd7 ".g""2g3h*\xcb ".R""2R3S*\xbf ".N""2N3O*\xb3 ".T""2T3U*\xa7 ".V""2V3W*\x9b ".i""2i3j*\x8f ".k""2k3l*\x83 ".8""2839*w ".m""2m3n*k "7&*e ".4""2435*Y ".o""2o3p*M ".q""2q3r*A ".6""2637*5 ".s""2s3t*) ".u""2u3v+\u0134$,\u0131&7)*\u012b ".F""2F3G*\u011f ".J""2J3K*\u0113 ".L""2L3M*\u0107 ".Y""2Y3Z*\xfb ".P""2P3Q*\xef ".H""2H3I*\xe3 ".@""2@3A*\xd7 ".g""2g3h*\xcb ".R""2R3S*\xbf ".N""2N3O*\xb3 ".T""2T3U*\xa7 ".V""2V3W*\x9b ".i""2i3j*\x8f ".k""2k3l*\x83 ".8""2839*w ".m""2m3n*k "7&*e ".4""2435*Y ".o""2o3p*M ".q""2q3r*A ".6""2637*5 ".s""2s3t*) ".u""2u3v""" X+! (%'),h('!7/+A$.P""2P3Q+1%7/+\'%4#6w# %$## X$"# X"# X'),h('!7/+A$.4""2435+1%7/+\'%4#6x# %$## X$"# X"# X'),h('!7/+A$.>""2>3?+1%7/+\'%4#6y# %$## X$"# X"# X'),h('!7/+A$.T""2T3U+1%7/+\'%4#6z# %$## X$"# X"# X'),h('!7/+A$.V""2V3W+1%7/+\'%4#6{# %$## X$"# X"# X'),h('!.k""2k3l+1$7/+\'%4"6|" %$"# X"# X'),h('!7/+7$.i""2i3j+\'%4"6}" %$"# X"# X'),h('!7/+A$.D""2D3E+1%7/+\'%4#6~# %$## X$"# X"# X'),h('!7/+A$.2""2233+1%7/+\'%4#6# %$## X$"# X"# X'),h('!7/+A$.8""2839+1%7/+\'%4#6\x80# %$## X$"# X"# X'),h('!7/+1$7&+\'%4"6\x81" %$"# X"# X'),h('!7&+1$7/+\'%4"6\x81" %$"# X"# X'),h('!7=+W$ \\7G*) "7K*# "7F,/&7G*) "7K*# "7F"+-%7>+#%\'#%$## X$"# X"# X'),h('0\x82""1!3\x83*A "0\x84""1!3\x85*5 "0\x86""1!3\x87*) "73*# "7.'),h('!!7/+U$7&+K% \\7J*# "7K,)&7J*# "7K"+-%7&+#%\'$%$$# X$## X$"# X"# X+! (%'),h('!7/+`$7&+V%! \\7J*# "7K,)&7J*# "7K"+! (%+2%7&+(%4$6\x88$!!%$$# X$## X$"# X"# X'),h('7.*G ".L""2L3M*; "0\x89""1!3\x8a*/ "0\x86""1!3\x87*# "73'),h('!.m""2m3n+K$0\x8b""1!3\x8c*5 "0\x8d""1!3\x8e*) "0\x8f""1!3\x90+#%\'"%$"# X"# X'),h('!7N+Q$.8""2839+A%7O*# " [+1%7S+\'%4$6\x91$ %$$# X$## X$"# X"# X'),h('!7N+k$.8""2839+[%7O*# " [+K%7S+A%7_+7%7l*# " [+\'%4&6\x92& %$&# X$%# X$$# X$## X$"# X"# X'),h('!/\x93""1$3\x94*) "/\x95""1#3\x96+\' 4!6\x97!! %'),h('!7P+b$!.8""2839+-$7R+#%\'"%$"# X"# X*# " [+7%.:""2:3;+\'%4#6\x98# %$## X$"# X"# X'),h(' \\7+*) "7-*# "7Q+2$,/&7+*) "7-*# "7Q""" X'),h('.<""2<3=*q ".>""2>3?*e ".@""2@3A*Y ".B""2B3C*M ".D""2D3E*A ".2""2233*5 ".6""2637*) ".4""2435'),h('! \\7+*_ "7-*Y ".<""2<3=*M ".>""2>3?*A ".@""2@3A*5 ".B""2B3C*) ".D""2D3E,e&7+*_ "7-*Y ".<""2<3=*M ".>""2>3?*A ".@""2@3A*5 ".B""2B3C*) ".D""2D3E"+& 4!6\x99! %'),h('!7T+N$!.8""2839+-$7^+#%\'"%$"# X"# X*# " [+#%\'"%$"# X"# X'),h('!7U*) "7\\*# "7X+& 4!6\x9a! %'),h('! \\!7V+3$.J""2J3K+#%\'"%$"# X"# X,>&!7V+3$.J""2J3K+#%\'"%$"# X"# X"+G$7W+=%.J""2J3K*# " [+\'%4#6\x9b# %$## X$"# X"# X'),h(' \\0\x9c""1!3\x9d+,$,)&0\x9c""1!3\x9d""" X'),h('!0$""1!3%+A$ \\0\x9e""1!3\x9f,)&0\x9e""1!3\x9f"+#%\'"%$"# X"# X'),h('!.o""2o3p+A$7Y+7%.q""2q3r+\'%4#6\xa0# %$## X$"# X"# X'),h('!!7Z+\xbf$.8""2839+\xaf%7Z+\xa5%.8""2839+\x95%7Z+\x8b%.8""2839+{%7Z+q%.8""2839+a%7Z+W%.8""2839+G%7Z+=%.8""2839+-%7[+#%\'-%$-# X$,# X$+# X$*# X$)# X$(# X$\'# X$&# X$%# X$$# X$## X$"# X"# X*\u0838 "!.\xa1""2\xa13\xa2+\xaf$7Z+\xa5%.8""2839+\x95%7Z+\x8b%.8""2839+{%7Z+q%.8""2839+a%7Z+W%.8""2839+G%7Z+=%.8""2839+-%7[+#%\',%$,# X$+# X$*# X$)# X$(# X$\'# X$&# X$%# X$$# X$## X$"# X"# X*\u0795 "!.\xa1""2\xa13\xa2+\x95$7Z+\x8b%.8""2839+{%7Z+q%.8""2839+a%7Z+W%.8""2839+G%7Z+=%.8""2839+-%7[+#%\'*%$*# X$)# X$(# X$\'# X$&# X$%# X$$# X$## X$"# X"# X*\u070c "!.\xa1""2\xa13\xa2+{$7Z+q%.8""2839+a%7Z+W%.8""2839+G%7Z+=%.8""2839+-%7[+#%\'(%$(# X$\'# X$&# X$%# X$$# X$## X$"# X"# X*\u069d "!.\xa1""2\xa13\xa2+a$7Z+W%.8""2839+G%7Z+=%.8""2839+-%7[+#%\'&%$&# X$%# X$$# X$## X$"# X"# X*\u0648 "!.\xa1""2\xa13\xa2+G$7Z+=%.8""2839+-%7[+#%\'$%$$# X$## X$"# X"# X*\u060d "!.\xa1""2\xa13\xa2+-$7[+#%\'"%$"# X"# X*\u05ec "!.\xa1""2\xa13\xa2+-$7Z+#%\'"%$"# X"# X*\u05cb "!7Z+\xa5$.\xa1""2\xa13\xa2+\x95%7Z+\x8b%.8""2839+{%7Z+q%.8""2839+a%7Z+W%.8""2839+G%7Z+=%.8""2839+-%7[+#%\'+%$+# X$*# X$)# X$(# X$\'# X$&# X$%# X$$# X$## X$"# X"# X*\u0538 "!7Z+\xb6$!.8""2839+-$7Z+#%\'"%$"# X"# X*# " [+\x8b%.\xa1""2\xa13\xa2+{%7Z+q%.8""2839+a%7Z+W%.8""2839+G%7Z+=%.8""2839+-%7[+#%\'*%$*# X$)# X$(# X$\'# X$&# X$%# X$$# X$## X$"# X"# X*\u0494 "!7Z+\xc7$!.8""2839+-$7Z+#%\'"%$"# X"# X*# " [+\x9c%!.8""2839+-$7Z+#%\'"%$"# X"# X*# " [+q%.\xa1""2\xa13\xa2+a%7Z+W%.8""2839+G%7Z+=%.8""2839+-%7[+#%\')%$)# X$(# X$\'# X$&# X$%# X$$# X$## X$"# X"# X*\u03df "!7Z+\xd8$!.8""2839+-$7Z+#%\'"%$"# X"# X*# " [+\xad%!.8""2839+-$7Z+#%\'"%$"# X"# X*# " [+\x82%!.8""2839+-$7Z+#%\'"%$"# X"# X*# " [+W%.\xa1""2\xa13\xa2+G%7Z+=%.8""2839+-%7[+#%\'(%$(# X$\'# X$&# X$%# X$$# X$## X$"# X"# X*\u0319 "!7Z+\xe9$!.8""2839+-$7Z+#%\'"%$"# X"# X*# " [+\xbe%!.8""2839+-$7Z+#%\'"%$"# X"# X*# " [+\x93%!.8""2839+-$7Z+#%\'"%$"# X"# X*# " [+h%!.8""2839+-$7Z+#%\'"%$"# X"# X*# " [+=%.\xa1""2\xa13\xa2+-%7[+#%\'\'%$\'# X$&# X$%# X$$# X$## X$"# X"# X*\u0242 "!7Z+\u0114$!.8""2839+-$7Z+#%\'"%$"# X"# X*# " [+\xe9%!.8""2839+-$7Z+#%\'"%$"# X"# X*# " [+\xbe%!.8""2839+-$7Z+#%\'"%$"# X"# X*# " [+\x93%!.8""2839+-$7Z+#%\'"%$"# X"# X*# " [+h%!.8""2839+-$7Z+#%\'"%$"# X"# X*# " [+=%.\xa1""2\xa13\xa2+-%7Z+#%\'(%$(# X$\'# X$&# X$%# X$$# X$## X$"# X"# X*\u0140 "!7Z+\u0135$!.8""2839+-$7Z+#%\'"%$"# X"# X*# " [+\u010a%!.8""2839+-$7Z+#%\'"%$"# X"# X*# " [+\xdf%!.8""2839+-$7Z+#%\'"%$"# X"# X*# " [+\xb4%!.8""2839+-$7Z+#%\'"%$"# X"# X*# " [+\x89%!.8""2839+-$7Z+#%\'"%$"# X"# X*# " [+^%!.8""2839+-$7Z+#%\'"%$"# X"# X*# " [+3%.\xa1""2\xa13\xa2+#%\'(%$(# X$\'# X$&# X$%# X$$# X$## X$"# X"# X+& 4!6\xa3! %'),h('!7#+S$7#*# " [+C%7#*# " [+3%7#*# " [+#%\'$%$$# X$## X$"# X"# X'),h('!7Z+=$.8""2839+-%7Z+#%\'#%$## X$"# X"# X*# "7\\'),h('!7]+u$.J""2J3K+e%7]+[%.J""2J3K+K%7]+A%.J""2J3K+1%7]+\'%4\'6\xa4\' %$\'# X$&# X$%# X$$# X$## X$"# X"# X'),h('!.\xa5""2\xa53\xa6+3$0\xa7""1!3\xa8+#%\'"%$"# X"# X*\xa0 "!.\xa9""2\xa93\xaa+=$0\xab""1!3\xac+-%7!+#%\'#%$## X$"# X"# X*o "!.\xad""2\xad3\xae+7$7!+-%7!+#%\'#%$## X$"# X"# X*D "!0\xaf""1!3\xb0+-$7!+#%\'"%$"# X"# X*# "7!'),h('!!7!*# " [+c$7!*# " [+S%7!*# " [+C%7!*# " [+3%7!*# " [+#%\'%%$%# X$$# X$## X$"# X"# X+\' 4!6\xb1!! %'),h(' \\!.2""2233+-$7`+#%\'"%$"# X"# X,>&!.2""2233+-$7`+#%\'"%$"# X"# X"'),h('7a*A "7b*; "7c*5 "7d*/ "7e*) "7f*# "7g'),h('!/\xb2""1*3\xb3+b$/\xb4""1#3\xb5*G "/\xb6""1#3\xb7*; "/\xb8""1$3\xb9*/ "/\xba""1#3\xbb*# "76+(%4"6\xbc"! %$"# X"# X'),h('!/\xbd""1%3\xbe+J$/\xbf""1%3\xc0*/ "/\xc1""1"3\xc2*# "76+(%4"6\xc3"! %$"# X"# X'),h('!/\xc4""1\'3\xc5+2$7\x8f+(%4"6\xc6"! %$"# X"# X'),h('!/\xc7""1$3\xc8+2$7\xef+(%4"6\xc9"! %$"# X"# X'),h('!/\xca""1&3\xcb+2$7T+(%4"6\xcc"! %$"# X"# X'),h('!/\xcd""1"3\xce+R$!.>""2>3?+-$76+#%\'"%$"# X"# X*# " [+\'%4"6\xcf" %$"# X"# X'),h('!7h+T$!.>""2>3?+-$7i+#%\'"%$"# X"# X*# " [+)%4"6\xd0""! %$"# X"# X'),h('! \\7j+&$,#&7j""" X+! (%'),h('! \\7j+&$,#&7j""" X+! (%'),h('7k*) "7+*# "7-'),h('.o""2o3p*e ".q""2q3r*Y ".4""2435*M ".8""2839*A ".<""2<3=*5 ".@""2@3A*) ".B""2B3C'),h('!.6""2637+u$7m+k% \\!.<""2<3=+-$7m+#%\'"%$"# X"# X,>&!.<""2<3=+-$7m+#%\'"%$"# X"# X"+#%\'#%$## X$"# X"# X'),h('!7n+C$.>""2>3?+3%7o+)%4#6\xd1#"" %$## X$"# X"# X'),h(' \\7p*) "7+*# "7-+2$,/&7p*) "7+*# "7-""" X'),h(' \\7p*) "7+*# "7-,/&7p*) "7+*# "7-"'),h('.o""2o3p*e ".q""2q3r*Y ".4""2435*M ".6""2637*A ".8""2839*5 ".@""2@3A*) ".B""2B3C'),h('7\x90*# "7r'),h("!7\x8f+K$7'+A%7s+7%7'+-%7\x84+#%'%%$%# X$$# X$## X$\"# X\"# X"),h('7M*# "7t'),h('!7+G$.8""2839+7%7u*# "7x+\'%4#6\xd2# %$## X$"# X"# X'),h('!7v*# "7w+N$!.6""2637+-$7\x83+#%\'"%$"# X"# X*# " [+#%\'"%$"# X"# X'),h('!.\xd3""2\xd33\xd4+=$7\x80+3%7w*# " [+#%\'#%$## X$"# X"# X'),h('!.4""2435+-$7{+#%\'"%$"# X"# X'),h('!7z+5$ \\7y,#&7y"+#%\'"%$"# X"# X'),h('7**) "7+*# "7-'),h('7+*\x8f "7-*\x89 ".2""2233*} ".6""2637*q ".8""2839*e ".:""2:3;*Y ".<""2<3=*M ".>""2>3?*A ".@""2@3A*5 ".B""2B3C*) ".D""2D3E'),h('!7|+k$ \\!.4""2435+-$7|+#%\'"%$"# X"# X,>&!.4""2435+-$7|+#%\'"%$"# X"# X"+#%\'"%$"# X"# X'),h('! \\7~,#&7~"+k$ \\!.2""2233+-$7}+#%\'"%$"# X"# X,>&!.2""2233+-$7}+#%\'"%$"# X"# X"+#%\'"%$"# X"# X'),h(' \\7~,#&7~"'),h('7+*w "7-*q ".8""2839*e ".:""2:3;*Y ".<""2<3=*M ".>""2>3?*A ".@""2@3A*5 ".B""2B3C*) ".D""2D3E'),h('!7"+\x8d$ \\7"*G "7!*A ".@""2@3A*5 ".F""2F3G*) ".J""2J3K,M&7"*G "7!*A ".@""2@3A*5 ".F""2F3G*) ".J""2J3K"+\'%4"6\xd5" %$"# X"# X'),h('7\x81*# "7\x82'),h('!!7O+3$.:""2:3;+#%\'"%$"# X"# X*# " [+-$7S+#%\'"%$"# X"# X*# " ['),h(' \\7+*\x83 "7-*} ".B""2B3C*q ".D""2D3E*e ".2""2233*Y ".8""2839*M ".:""2:3;*A ".<""2<3=*5 ".>""2>3?*) ".@""2@3A+\x8c$,\x89&7+*\x83 "7-*} ".B""2B3C*q ".D""2D3E*e ".2""2233*Y ".8""2839*M ".:""2:3;*A ".<""2<3=*5 ".>""2>3?*) ".@""2@3A""" X'),h(' \\7y,#&7y"'),h('!/\x95""1#3\xd6+y$.4""2435+i% \\7!+&$,#&7!""" X+P%.J""2J3K+@% \\7!+&$,#&7!""" X+\'%4%6\xd7% %$%# X$$# X$## X$"# X"# X'),h('.\xd8""2\xd83\xd9'),h('.\xda""2\xda3\xdb'),h('.\xdc""2\xdc3\xdd'),h('.\xde""2\xde3\xdf'),h('.\xe0""2\xe03\xe1'),h('.\xe2""2\xe23\xe3'),h('.\xe4""2\xe43\xe5'),h('.\xe6""2\xe63\xe7'),h('.\xe8""2\xe83\xe9'),h('.\xea""2\xea3\xeb'),h('!7\x85*S "7\x86*M "7\x88*G "7\x89*A "7\x8a*; "7\x8b*5 "7\x8c*/ "7\x8d*) "7\x8e*# "76+& 4!6\xec! %'),h("!7\x84+K$7'+A%7\x91+7%7'+-%7\x93+#%'%%$%# X$$# X$## X$\"# X\"# X"),h("!7\x92+' 4!6\xed!! %"),h('!7!+7$7!+-%7!+#%\'#%$## X$"# X"# X'),h('! \\7**A "7+*; "7-*5 "73*/ "74*) "7\'*# "7(,G&7**A "7+*; "7-*5 "73*/ "74*) "7\'*# "7("+& 4!6\xee! %'),h('!7\xb5+_$ \\!7A+-$7\xb5+#%\'"%$"# X"# X,8&!7A+-$7\xb5+#%\'"%$"# X"# X"+#%\'"%$"# X"# X'),h('!79+R$!.:""2:3;+-$79+#%\'"%$"# X"# X*# " [+\'%4"6\xef" %$"# X"# X'),h('!7:*j "!7\x97+_$ \\!7A+-$7\x97+#%\'"%$"# X"# X,8&!7A+-$7\x97+#%\'"%$"# X"# X"+#%\'"%$"# X"# X+& 4!6\xf0! %'),h('!7L*# "7\x98+c$ \\!7B+-$7\x9a+#%\'"%$"# X"# X,8&!7B+-$7\x9a+#%\'"%$"# X"# X"+\'%4"6\xf1" %$"# X"# X'),h('!7\x99*# " [+A$7@+7%7M+-%7?+#%\'$%$$# X$## X$"# X"# X'),h('!!76+_$ \\!7.+-$76+#%\'"%$"# X"# X,8&!7.+-$76+#%\'"%$"# X"# X"+#%\'"%$"# X"# X*# "7H+\' 4!6\xf2!! %'),h('7\x9b*) "7\x9c*# "7\x9f'),h('!/\xf3""1!3\xf4+<$7<+2%7\x9e+(%4#6\xf5#! %$## X$"# X"# X'),h('!/\xf6""1\'3\xf7+<$7<+2%7\x9d+(%4#6\xf8#! %$## X$"# X"# X'),h('! \\7!+&$,#&7!""" X+\' 4!6\xf9!! %'),h('!.\xfa""2\xfa3\xfb+x$!.J""2J3K+S$7!*# " [+C%7!*# " [+3%7!*# " [+#%\'$%$$# X$## X$"# X"# X*# " [+\'%4"6\xfc" %$"# X"# X'),h('!76+N$!7<+-$7\xa0+#%\'"%$"# X"# X*# " [+)%4"6\xfd""! %$"# X"# X'),h('76*) "7T*# "7H'),h('!7\xa2+_$ \\!7B+-$7\xa3+#%\'"%$"# X"# X,8&!7B+-$7\xa3+#%\'"%$"# X"# X"+#%\'"%$"# X"# X'),h('!/\xfe""1&3\xff*G "/\u0100""1\'3\u0101*; "/\u0102""1$3\u0103*/ "/\u0104""1%3\u0105*# "76+& 4!6\u0106! %'),h('7\xa4*# "7\x9f'),h('!/\u0107""1(3\u0108+O$7<+E%/\u0109""1(3\u010a*/ "/\u010b""1(3\u010c*# "76+#%\'#%$## X$"# X"# X'),h('!76+_$ \\!7A+-$76+#%\'"%$"# X"# X,8&!7A+-$76+#%\'"%$"# X"# X"+#%\'"%$"# X"# X'),h('! \\7!+&$,#&7!""" X+\' 4!6\u010d!! %'),h("!7\xa8+& 4!6\u010e! %"),h('!7\xa9+s$7;+i%7\xae+_% \\!7B+-$7\xaf+#%\'"%$"# X"# X,8&!7B+-$7\xaf+#%\'"%$"# X"# X"+#%\'$%$$# X$## X$"# X"# X'),h('7\xaa*# "7\xab'),h('/\u010f""1$3\u0110*S "/\u0111""1%3\u0112*G "/\u0113""1%3\u0114*; "/\u0115""1%3\u0116*/ "/\u0117""1+3\u0118*# "7\xac'),h('/\u0119""1\'3\u011a*/ "/\u011b""1)3\u011c*# "7\xac'),h('76*# "7\xad'),h('!/\u011d""1"3\u011e+-$76+#%\'"%$"# X"# X'),h('7\xac*# "76'),h('!76+7$7<+-%7\xb0+#%\'#%$## X$"# X"# X'),h('76*# "7H'),h('!7\xb2+7$7.+-%7\x8f+#%\'#%$## X$"# X"# X'),h('! \\7!+&$,#&7!""" X+\' 4!6\u011f!! %'),h("!7\x9d+' 4!6\u0120!! %"),h('!7\xb5+d$ \\!7B+-$7\x9f+#%\'"%$"# X"# X,8&!7B+-$7\x9f+#%\'"%$"# X"# X"+(%4"6\u0121"!!%$"# X"# X'),h('!!77+k$ \\!.J""2J3K+-$77+#%\'"%$"# X"# X,>&!.J""2J3K+-$77+#%\'"%$"# X"# X"+#%\'"%$"# X"# X+! (%'),h('!7L*# "7\x98+c$ \\!7B+-$7\xb7+#%\'"%$"# X"# X,8&!7B+-$7\xb7+#%\'"%$"# X"# X"+\'%4"6\u0122" %$"# X"# X'),h('7\xb8*# "7\x9f'),h('!/\u0123""1#3\u0124+<$7<+2%76+(%4#6\u0125#! %$## X$"# X"# X'),h('! \\7!+&$,#&7!""" X+\' 4!6\u0126!! %'),h("!7\x9d+' 4!6\u0127!! %"),h('! \\7\x99,#&7\x99"+\x81$7@+w%7M+m%7?+c% \\!7B+-$7\x9f+#%\'"%$"# X"# X,8&!7B+-$7\x9f+#%\'"%$"# X"# X"+\'%4%6\u0128% %$%# X$$# X$## X$"# X"# X'),h("7\xbd"),h('!/\u0129""1&3\u012a+s$7.+i%7\xc0+_% \\!7A+-$7\xc0+#%\'"%$"# X"# X,8&!7A+-$7\xc0+#%\'"%$"# X"# X"+#%\'$%$$# X$## X$"# X"# X*# "7\xbe'),h('!76+s$7.+i%7\xbf+_% \\!7A+-$7\xbf+#%\'"%$"# X"# X,8&!7A+-$7\xbf+#%\'"%$"# X"# X"+#%\'$%$$# X$## X$"# X"# X'),h('!76+=$7<+3%76*# "7H+#%\'#%$## X$"# X"# X'),h('7\xc1*G "7\xc3*A "7\xc5*; "7\xc7*5 "7\xc8*/ "7\xc9*) "7\xca*# "7\xbf'),h('!/\u012b""1%3\u012c+7$7<+-%7\xc2+#%\'#%$## X$"# X"# X'),h("!7I+' 4!6\u012d!! %"),h('!/\u012e""1&3\u012f+\xa5$7<+\x9b%7D+\x91%7\xc4+\x87% \\! \\7\'+&$,#&7\'""" X+-$7\xc4+#%\'"%$"# X"# X,G&! \\7\'+&$,#&7\'""" X+-$7\xc4+#%\'"%$"# X"# X"+-%7E+#%\'&%$&# X$%# X$$# X$## X$"# X"# X'),h('7t*# "7w'),h('!/\u0130""1%3\u0131+7$7<+-%7\xc6+#%\'#%$## X$"# X"# X'),h("!7I+' 4!6\u0132!! %"),h('!/\u0133""1&3\u0134+<$7<+2%7I+(%4#6\u0135#! %$## X$"# X"# X'),h('!/\u0136""1%3\u0137+_$7<+U%!/\u0138""1$3\u0139+& 4!6\u013a! %*4 "!/\u013b""1%3\u013c+& 4!6\u013d! %+#%\'#%$## X$"# X"# X'),h('!/\u013e""1)3\u013f+T$7<+J%/\u0140""1#3\u0141*/ "/\u0142""1(3\u0143*# "76+(%4#6\u0144#! %$## X$"# X"# X'),h('!/\u0145""1#3\u0146+\x9e$7<+\x94%7D+\x8a%!7\xcb+k$ \\!.D""2D3E+-$7\xcb+#%\'"%$"# X"# X,>&!.D""2D3E+-$7\xcb+#%\'"%$"# X"# X"+#%\'"%$"# X"# X+-%7E+#%\'%%$%# X$$# X$## X$"# X"# X'),h('!/\u0147""1(3\u0148*/ "/\u0149""1$3\u014a*# "76+\' 4!6\u014b!! %'),h('!76+_$ \\!7A+-$76+#%\'"%$"# X"# X,8&!7A+-$76+#%\'"%$"# X"# X"+#%\'"%$"# X"# X'),h('!7\xce+K$7.+A%7\xce+7%7.+-%7\x8f+#%\'%%$%# X$$# X$## X$"# X"# X'),h('! \\7!+&$,#&7!""" X+\' 4!6\u014c!! %'),h('!7\xd0+c$ \\!7A+-$7\xd0+#%\'"%$"# X"# X,8&!7A+-$7\xd0+#%\'"%$"# X"# X"+\'%4"6\u014d" %$"# X"# X'),h('!7\x98+c$ \\!7B+-$7\x9f+#%\'"%$"# X"# X,8&!7B+-$7\x9f+#%\'"%$"# X"# X"+\'%4"6\u014e" %$"# X"# X'),h('!7L*T "7\x98*N "!7@*# " [+=$7t+3%7?*# " [+#%\'#%$## X$"# X"# X+c$ \\!7B+-$7\x9f+#%\'"%$"# X"# X,8&!7B+-$7\x9f+#%\'"%$"# X"# X"+\'%4"6\u014f" %$"# X"# X'),h('!7\xd3+c$ \\!7B+-$7\xd4+#%\'"%$"# X"# X,8&!7B+-$7\xd4+#%\'"%$"# X"# X"+\'%4"6\u0150" %$"# X"# X'),h("!7\x95+& 4!6\u0151! %"),h('!/\u0152""1(3\u0153+<$7<+2%76+(%4#6\u0154#! %$## X$"# X"# X*j "!/\u0155""1&3\u0156+<$7<+2%76+(%4#6\u0157#! %$## X$"# X"# X*: "!/\u0158""1*3\u0159+& 4!6\u015a! %*# "7\x9f'),h('!!76+o$ \\!7A+2$76+(%4"6\u015b"! %$"# X"# X,=&!7A+2$76+(%4"6\u015b"! %$"# X"# X"+)%4"6\u015c""! %$"# X"# X*# " [+\' 4!6\u015d!! %'),h('!7\xd7+_$ \\!7A+-$7\xd7+#%\'"%$"# X"# X,8&!7A+-$7\xd7+#%\'"%$"# X"# X"+#%\'"%$"# X"# X'),h('!7\x98+_$ \\!7B+-$7\x9f+#%\'"%$"# X"# X,8&!7B+-$7\x9f+#%\'"%$"# X"# X"+#%\'"%$"# X"# X'),h('! \\7!+&$,#&7!""" X+\' 4!6\u015e!! %'),h('!7\xda+_$ \\!7B+-$7\xdb+#%\'"%$"# X"# X,8&!7B+-$7\xdb+#%\'"%$"# X"# X"+#%\'"%$"# X"# X'),h('!/\u015f""1&3\u0160*; "/\u0161""1\'3\u0162*/ "/\u0163""1*3\u0164*# "76+& 4!6\u0165! %'),h('!/\u0166""1&3\u0167+<$7<+2%7\xdc+(%4#6\u0168#! %$## X$"# X"# X*\x83 "!/\xf6""1\'3\xf7+<$7<+2%7\x9d+(%4#6\u0169#! %$## X$"# X"# X*S "!/\u016a""1+3\u016b+<$7<+2%7\x9d+(%4#6\u016c#! %$## X$"# X"# X*# "7\x9f'),h('/\u016d""1+3\u016e*k "/\u016f""1)3\u0170*_ "/\u0171""1(3\u0172*S "/\u0173""1\'3\u0174*G "/\u0175""1&3\u0176*; "/\u0177""1*3\u0178*/ "/\u0179""1)3\u017a*# "76'),h('71*# " ['),h('!!76+o$ \\!7A+2$76+(%4"6\u015b"! %$"# X"# X,=&!7A+2$76+(%4"6\u015b"! %$"# X"# X"+)%4"6\u015c""! %$"# X"# X*# " [+\' 4!6\u017b!! %'),h('!7L*# "7\x98+c$ \\!7B+-$7\xe0+#%\'"%$"# X"# X,8&!7B+-$7\xe0+#%\'"%$"# X"# X"+\'%4"6\u017c" %$"# X"# X'),h('7\xb8*# "7\x9f'),h('!7\xe2+_$ \\!7A+-$7\xe2+#%\'"%$"# X"# X,8&!7A+-$7\xe2+#%\'"%$"# X"# X"+#%\'"%$"# X"# X'),h('!7\xe9+s$7.+i%7\xec+_% \\!7B+-$7\xe3+#%\'"%$"# X"# X,8&!7B+-$7\xe3+#%\'"%$"# X"# X"+#%\'$%$$# X$## X$"# X"# X'),h('7\xe4*; "7\xe5*5 "7\xe6*/ "7\xe7*) "7\xe8*# "7\x9f'),h('!/\u017d""1#3\u017e+<$7<+2%7\xef+(%4#6\u017f#! %$## X$"# X"# X'),h('!/\u0180""1%3\u0181+<$7<+2%7T+(%4#6\u0182#! %$## X$"# X"# X'),h('!/\u0183""1(3\u0184+B$7<+8%7\\*# "7Y+(%4#6\u0185#! %$## X$"# X"# X'),h('!/\u0186""1&3\u0187+<$7<+2%76+(%4#6\u0188#! %$## X$"# X"# X'),h('!/\u0189""1%3\u018a+T$!7<+5$ \\7!,#&7!"+#%\'"%$"# X"# X*# " [+\'%4"6\u018b" %$"# X"# X'),h('!7\xea+K$7;+A%76+7%7;+-%7\xeb+#%\'%%$%# X$$# X$## X$"# X"# X'),h('!/\x95""1#3\xd6*# "76+\' 4!6\u018c!! %'),h('!/\xb4""1#3\u018d*G "/\xb6""1#3\u018e*; "/\xba""1#3\u018f*/ "/\xb8""1$3\u0190*# "76+\' 4!6\u0191!! %'),h('!7\xed+H$!7C+-$7\xee+#%\'"%$"# X"# X*# " [+#%\'"%$"# X"# X'),h('!7U*) "7\\*# "7X+& 4!6\u0192! %'),h('!!7!*# " [+c$7!*# " [+S%7!*# " [+C%7!*# " [+3%7!*# " [+#%\'%%$%# X$$# X$## X$"# X"# X+\' 4!6\u0193!! %'),h('!!7!+C$7!*# " [+3%7!*# " [+#%\'#%$## X$"# X"# X+\' 4!6\u0194!! %'),h("7\xbd"),h('!7\x9d+d$ \\!7B+-$7\xf2+#%\'"%$"# X"# X,8&!7B+-$7\xf2+#%\'"%$"# X"# X"+(%4"6\u0195"!!%$"# X"# X'),h('7\xf3*# "7\x9f'),h('!.\u0196""2\u01963\u0197+N$7<+D%.\u0198""2\u01983\u0199*) ".\u019a""2\u019a3\u019b+(%4#6\u019c#! %$## X$"# X"# X'),h('!7\x9d+d$ \\!7B+-$7\x9f+#%\'"%$"# X"# X,8&!7B+-$7\x9f+#%\'"%$"# X"# X"+(%4"6\u019d"!!%$"# X"# X'),h('!76+7$70+-%7\xf6+#%\'#%$## X$"# X"# X'),h(' \\72*) "74*# "7.,/&72*) "74*# "7."'),h(' \\7%,#&7%"'),h('!7\xf9+=$.8""2839+-%7\xfa+#%\'#%$## X$"# X"# X'),h('!/\u019e""1%3\u019f*) "/\u01a0""1$3\u01a1+\' 4!6\u01a2!! %'),h('!7\xfb+N$!.8""2839+-$7^+#%\'"%$"# X"# X*# " [+#%\'"%$"# X"# X'),h('!7\\*) "7X*# "7\x82+\' 4!6\u01a3!! %'),h('! \\7\xfd*) "7-*# "7\xfe,/&7\xfd*) "7-*# "7\xfe"+! (%'),h('7"*S "7!*M ".F""2F3G*A ".J""2J3K*5 ".H""2H3I*) ".N""2N3O'),h('.L""2L3M*\x95 ".B""2B3C*\x89 ".<""2<3=*} ".R""2R3S*q ".T""2T3U*e ".V""2V3W*Y ".P""2P3Q*M ".@""2@3A*A ".D""2D3E*5 ".2""2233*) ".>""2>3?'),h('!7\u0100+h$.8""2839+X%7\xfa+N%!.\u01a4""2\u01a43\u01a5+-$7\xeb+#%\'"%$"# X"# X*# " [+#%\'$%$$# X$## X$"# X"# X'),h('!/\u01a6""1%3\u01a7*) "/\u01a8""1$3\u01a9+\' 4!6\u01a2!! %'),h('!7\xeb+Q$/\xb4""1#3\xb5*7 "/\xb6""1#3\xb7*+ " \\7+,#&7+"+\'%4"6\u01aa" %$"# X"# X'),h('!7\u0104+\x8f$.F""2F3G+%7\u0103+u%.F""2F3G+e%7\u0103+[%.F""2F3G+K%7\u0103+A%.F""2F3G+1%7\u0105+\'%4)6\u01ab) %$)# X$(# X$\'# X$&# X$%# X$$# X$## X$"# X"# X'),h('!7#+A$7#+7%7#+-%7#+#%\'$%$$# X$## X$"# X"# X'),h('!7\u0103+-$7\u0103+#%\'"%$"# X"# X'),h('!7\u0103+7$7\u0103+-%7\u0103+#%\'#%$## X$"# X"# X')],r=0,s=0,t=0,u={line:1,column:1,seenCR:!1},v=0,w=[],x=0;if("startRule"in l){if(!(l.startRule in n))throw new Error("Can't start parsing from rule \""+l.startRule+'".');o=n[l.startRule]}if(l.data={},k=i(o),k!==m&&r===a.length)return k;throw k!==m&&r<a.length&&f({type:"end",description:"end of input"}),g(null,w,v)}return a(b,Error),{SyntaxError:b,parse:c}}()},{}],12:[function(a,b,c){"use strict";b.exports=function(a){a=a;var b={AllBrowsers:{maskDtls:function(a){return a&&(a=a.replace(/ UDP\/TLS\/RTP\/SAVP/gim," RTP/SAVP")),a},unmaskDtls:function(a){return a.replace(/ RTP\/SAVP/gim," UDP/TLS/RTP/SAVP")}},Firefox:{isFirefox:function(){return"undefined"!=typeof mozRTCPeerConnection},cannotHandleExtraWhitespace:function(a){return this.isFirefox()&&a&&(a=a.replace(/ \r\n/g,"\r\n")),a},hasMissingCLineInSDP:function(a){var b,c;if(a.indexOf("c=")>a.indexOf("m=")){c=a.match(/m=.*\r\n.*/g);for(var d=0;d<c.length;d++)c[d].toString().search(/i=.*/)>=0?(b=a.indexOf(c[d].toString())+c[d].toString().length,"c="!==a.substr(b,2)&&(a=a.substr(0,b)+"\r\nc=IN IP4 0.0.0.0"+a.substr(b))):c[d].toString().search(/c=.*/)<0&&(b=a.indexOf(c[d].toString().match(/.*/))+c[d].toString().match(/.*/).toString().length,a=a.substr(0,b)+"\r\nc=IN IP4 0.0.0.0"+a.substr(b))}return a}},Chrome:{needsExplicitlyInactiveSDP:function(a){var c,d;return b.Firefox.isFirefox()&&(d=a.indexOf("m=video 0"),-1!==d)?(c=a.substr(d),c=c.replace(/\r\nc=IN IP4.*\r\n$/,"\r\nc=IN IP4 0.0.0.0\r\na=inactive\r\n"),a.substr(0,d)+c):a},getsConfusedAboutGUM:function(a){a.mediaHandler&&a.mediaHandler.close()}}};return b}},{}],13:[function(a,b,c){"use strict";var d={error:0,warn:1,log:2,debug:3};b.exports=function(a){function b(a,b,c){this.logger=a,this.category=b,this.label=c}var c=function(){var a,b=2,c=!0,e=null;this.loggers={},a=this.getLogger("sip.loggerfactory"),Object.defineProperties(this,{builtinEnabled:{get:function(){return c},set:function(b){"boolean"==typeof b?c=b:a.error('invalid "builtinEnabled" parameter value: '+JSON.stringify(b))}},level:{get:function(){return b},set:function(c){c>=0&&3>=c?b=c:c>3?b=3:d.hasOwnProperty(c)?b=d[c]:a.error('invalid "level" parameter value: '+JSON.stringify(c))}},connector:{get:function(){return e},set:function(b){null===b||""===b||void 0===b?e=null:"function"==typeof b?e=b:a.error('invalid "connector" parameter value: '+JSON.stringify(b))}}})};return c.prototype.print=function(b,c,d,e){if("string"==typeof e){var f=[new Date,c];d&&f.push(d),e=f.concat(e).join(" | ")}b.call(a,e)},Object.keys(d).forEach(function(e){b.prototype[e]=function(a){this.logger[e](this.category,this.label,a)},c.prototype[e]=function(b,c,f){this.level>=d[e]&&(this.builtinEnabled&&this.print(a[e],b,c,f),this.connector&&this.connector(e,b,c,f))}}),c.prototype.getLogger=function(a,c){var d;return c&&3===this.level?new b(this,a,c):this.loggers[a]?this.loggers[a]:(d=new b(this,a),this.loggers[a]=d,d)},c}},{}],14:[function(a,b,c){"use strict";b.exports=function(a){var b=function(a,b){a=a,b=b};return b.prototype=Object.create(a.prototype,{isReady:{value:function(){}},close:{value:function(){}},getDescription:{value:function(a){a=a}},hasDescription:{value:function(a){a=a}},setDescription:{value:function(a){a=a}}}),b}},{}],15:[function(a,b,c){"use strict";b.exports=function(a){var b;b=function(b,c,d){var e;if(!(b&&b instanceof a.URI))throw new TypeError('missing or invalid "uri" parameter');this.uri=b,this.parameters={};for(e in d)this.setParam(e,d[e]);Object.defineProperties(this,{friendlyName:{get:function(){return this.displayName||b.aor}},displayName:{get:function(){return c},set:function(a){c=0===a?"0":a}}})},b.prototype={setParam:function(a,b){a&&(this.parameters[a.toLowerCase()]="undefined"==typeof b||null===b?null:b.toString())},getParam:a.URI.prototype.getParam,hasParam:a.URI.prototype.hasParam,deleteParam:a.URI.prototype.deleteParam,clearParams:a.URI.prototype.clearParams,clone:function(){return new b(this.uri.clone(),this.displayName,JSON.parse(JSON.stringify(this.parameters)))},toString:function(){var a,b;a=this.displayName||0===this.displayName?'"'+this.displayName+'" ':"",a+="<"+this.uri.toString()+">";for(b in this.parameters)a+=";"+b,null!==this.parameters[b]&&(a+="="+this.parameters[b]);return a}},b.parse=function(b){return b=a.Grammar.parse(b,"Name_Addr_Header"),-1!==b?b:void 0},a.NameAddrHeader=b}},{}],16:[function(a,b,c){"use strict";b.exports=function(a){function b(a,b){var c=b,d=0,e=0;if(a.substring(c,c+2).match(/(^\r\n)/))return-2;for(;0===d;){if(e=a.indexOf("\r\n",c),-1===e)return e;!a.substring(e+2,e+4).match(/(^\r\n)/)&&a.charAt(e+2).match(/(^\s+)/)?c=e+2:d=e}return d}function c(b,c,d,e){var f,g,h,i,j=c.indexOf(":",d),k=c.substring(d,j).trim(),l=c.substring(j+1,e).trim();switch(k.toLowerCase()){case"via":case"v":b.addHeader("via",l),1===b.getHeaders("via").length?(i=b.parseHeader("Via"),i&&(b.via=i,b.via_branch=i.branch)):i=0;break;case"from":case"f":b.setHeader("from",l),i=b.parseHeader("from"),i&&(b.from=i,b.from_tag=i.getParam("tag"));break;case"to":case"t":b.setHeader("to",l),i=b.parseHeader("to"),i&&(b.to=i,b.to_tag=i.getParam("tag"));break;case"record-route":
37
-if(i=a.Grammar.parse(l,"Record_Route"),-1===i){i=void 0;break}for(h=i.length,g=0;h>g;g++)f=i[g],b.addHeader("record-route",l.substring(f.position,f.offset)),b.headers["Record-Route"][b.getHeaders("record-route").length-1].parsed=f.parsed;break;case"call-id":case"i":b.setHeader("call-id",l),i=b.parseHeader("call-id"),i&&(b.call_id=l);break;case"contact":case"m":if(i=a.Grammar.parse(l,"Contact"),-1===i){i=void 0;break}for(h=i.length,g=0;h>g;g++)f=i[g],b.addHeader("contact",l.substring(f.position,f.offset)),b.headers.Contact[b.getHeaders("contact").length-1].parsed=f.parsed;break;case"content-length":case"l":b.setHeader("content-length",l),i=b.parseHeader("content-length");break;case"content-type":case"c":b.setHeader("content-type",l),i=b.parseHeader("content-type");break;case"cseq":b.setHeader("cseq",l),i=b.parseHeader("cseq"),i&&(b.cseq=i.value),b instanceof a.IncomingResponse&&(b.method=i.method);break;case"max-forwards":b.setHeader("max-forwards",l),i=b.parseHeader("max-forwards");break;case"www-authenticate":b.setHeader("www-authenticate",l),i=b.parseHeader("www-authenticate");break;case"proxy-authenticate":b.setHeader("proxy-authenticate",l),i=b.parseHeader("proxy-authenticate");break;case"refer-to":case"r":b.setHeader("refer-to",l),i=b.parseHeader("refer-to"),i&&(b.refer_to=i);break;default:b.setHeader(k,l),i=0}return void 0===i?{error:'error parsing header "'+k+'"'}:!0}var d;d={},d.parseMessage=function(d,e){var f,g,h,i,j,k=0,l=d.indexOf("\r\n"),m=e.getLogger("sip.parser");if(-1===l)return void m.warn("no CRLF found, not a SIP message, discarded");if(g=d.substring(0,l),j=a.Grammar.parse(g,"Request_Response"),-1===j)return void m.warn('error parsing first line of SIP message: "'+g+'"');for(j.status_code?(f=new a.IncomingResponse(e),f.status_code=j.status_code,f.reason_phrase=j.reason_phrase):(f=new a.IncomingRequest(e),f.method=j.method,f.ruri=j.uri),f.data=d,k=l+2;;){if(l=b(d,k),-2===l){i=k+2;break}if(-1===l)return void m.error("malformed message");if(j=c(f,d,k,l),j!==!0)return void m.error(j.error);k=l+2}return f.hasHeader("content-length")?(h=f.getHeader("content-length"),f.body=d.substr(i,h)):f.body=d.substring(i),f},a.Parser=d}},{}],17:[function(a,b,c){"use strict";b.exports=function(a){var b;b=function(b){var c={},d=1;this.registrar=b.configuration.registrarServer,this.expires=b.configuration.registerExpires,this.contact=b.contact.toString(),d&&(this.contact+=";reg-id="+d,this.contact+=';+sip.instance="<urn:uuid:'+b.configuration.instanceId+'>"'),this.call_id=a.Utils.createRandomToken(22),this.cseq=80,this.to_uri=b.configuration.uri,c.to_uri=this.to_uri,c.to_displayName=b.configuration.displayName,c.call_id=this.call_id,c.cseq=this.cseq,a.Utils.augment(this,a.ClientContext,[b,"REGISTER",this.registrar,{params:c}]),this.registrationTimer=null,this.registrationExpiredTimer=null,this.registered=!1,this.logger=b.getLogger("sip.registercontext")},b.prototype={register:function(b){var c,d=this;this.options=b||{},c=(this.options.extraHeaders||[]).slice(),c.push("Contact: "+this.contact+";expires="+this.expires),c.push("Allow: "+a.UA.C.ALLOWED_METHODS.toString()),this.closeHeaders=this.options.closeWithHeaders?(this.options.extraHeaders||[]).slice():[],this.receiveResponse=function(b){var c,e,f,g=b.getHeaders("contact").length;if(b.cseq===this.cseq)switch(null!==this.registrationTimer&&(a.Timers.clearTimeout(this.registrationTimer),this.registrationTimer=null),!0){case/^1[0-9]{2}$/.test(b.status_code):this.emit("progress",b);break;case/^2[0-9]{2}$/.test(b.status_code):if(this.emit("accepted",b),b.hasHeader("expires")&&(e=b.getHeader("expires")),null!==this.registrationExpiredTimer&&(a.Timers.clearTimeout(this.registrationExpiredTimer),this.registrationExpiredTimer=null),!g){this.logger.warn("no Contact header in response to REGISTER, response ignored");break}for(;g--;){if(c=b.parseHeader("contact",g),c.uri.user===this.ua.contact.uri.user){e=c.getParam("expires");break}c=null}if(!c){this.logger.warn("no Contact header pointing to us, response ignored");break}e||(e=this.expires),this.registrationTimer=a.Timers.setTimeout(function(){d.registrationTimer=null,d.register(d.options)},1e3*e-3e3),this.registrationExpiredTimer=a.Timers.setTimeout(function(){d.logger.warn("registration expired"),d.registered&&d.unregistered(null,a.C.causes.EXPIRES)},1e3*e),c.hasParam("temp-gruu")&&(this.ua.contact.temp_gruu=a.URI.parse(c.getParam("temp-gruu").replace(/"/g,""))),c.hasParam("pub-gruu")&&(this.ua.contact.pub_gruu=a.URI.parse(c.getParam("pub-gruu").replace(/"/g,""))),this.registered=!0,this.emit("registered",b||null);break;case/^423$/.test(b.status_code):b.hasHeader("min-expires")?(this.expires=b.getHeader("min-expires"),this.register(this.options)):(this.logger.warn("423 response received for REGISTER without Min-Expires"),this.registrationFailure(b,a.C.causes.SIP_FAILURE_CODE));break;default:f=a.Utils.sipErrorCause(b.status_code),this.registrationFailure(b,f)}},this.onRequestTimeout=function(){this.registrationFailure(null,a.C.causes.REQUEST_TIMEOUT)},this.onTransportError=function(){this.registrationFailure(null,a.C.causes.CONNECTION_ERROR)},this.cseq++,this.request.cseq=this.cseq,this.request.setHeader("cseq",this.cseq+" REGISTER"),this.request.extraHeaders=c,this.send()},registrationFailure:function(a,b){this.emit("failed",a||null,b||null)},onTransportClosed:function(){this.registered_before=this.registered,null!==this.registrationTimer&&(a.Timers.clearTimeout(this.registrationTimer),this.registrationTimer=null),null!==this.registrationExpiredTimer&&(a.Timers.clearTimeout(this.registrationExpiredTimer),this.registrationExpiredTimer=null),this.registered&&this.unregistered(null,a.C.causes.CONNECTION_ERROR)},onTransportConnected:function(){this.register(this.options)},close:function(){var a={all:!1,extraHeaders:this.closeHeaders};this.registered_before=this.registered,this.unregister(a)},unregister:function(b){var c;return b=b||{},this.registered||b.all?(c=(b.extraHeaders||[]).slice(),this.registered=!1,null!==this.registrationTimer&&(a.Timers.clearTimeout(this.registrationTimer),this.registrationTimer=null),b.all?(c.push("Contact: *"),c.push("Expires: 0")):c.push("Contact: "+this.contact+";expires=0"),this.receiveResponse=function(b){var c;switch(!0){case/^1[0-9]{2}$/.test(b.status_code):this.emit("progress",b);break;case/^2[0-9]{2}$/.test(b.status_code):this.emit("accepted",b),null!==this.registrationExpiredTimer&&(a.Timers.clearTimeout(this.registrationExpiredTimer),this.registrationExpiredTimer=null),this.unregistered(b);break;default:c=a.Utils.sipErrorCause(b.status_code),this.unregistered(b,c)}},this.onRequestTimeout=function(){},this.onTransportError=function(){},this.cseq++,this.request.cseq=this.cseq,this.request.setHeader("cseq",this.cseq+" REGISTER"),this.request.extraHeaders=c,void this.send()):void this.logger.warn("already unregistered")},unregistered:function(a,b){this.registered=!1,this.emit("unregistered",a||null,b||null)}},a.RegisterContext=b}},{}],18:[function(a,b,c){"use strict";b.exports=function(a){var b;b=function(b,c){this.logger=c.getLogger("sip.requestsender"),this.ua=c,this.applicant=b,this.method=b.request.method,this.request=b.request,this.credentials=null,this.challenged=!1,this.staled=!1,c.status!==a.UA.C.STATUS_USER_CLOSED||this.method===a.C.BYE&&this.method===a.C.ACK||this.onTransportError()},b.prototype={send:function(){switch(this.method){case"INVITE":this.clientTransaction=new a.Transactions.InviteClientTransaction(this,this.request,this.ua.transport);break;case"ACK":this.clientTransaction=new a.Transactions.AckClientTransaction(this,this.request,this.ua.transport);break;default:this.clientTransaction=new a.Transactions.NonInviteClientTransaction(this,this.request,this.ua.transport)}return this.clientTransaction.send(),this.clientTransaction},onRequestTimeout:function(){this.applicant.onRequestTimeout()},onTransportError:function(){this.applicant.onTransportError()},receiveResponse:function(b){var c,d,e,f=b.status_code;if(401===f||407===f){if(401===b.status_code?(d=b.parseHeader("www-authenticate"),e="authorization"):(d=b.parseHeader("proxy-authenticate"),e="proxy-authorization"),!d)return this.logger.warn(b.status_code+" with wrong or missing challenge, cannot authenticate"),void this.applicant.receiveResponse(b);if(!this.challenged||!this.staled&&d.stale===!0){if(this.credentials||(this.credentials=this.ua.configuration.authenticationFactory(this.ua)),!this.credentials.authenticate(this.request,d))return void this.applicant.receiveResponse(b);this.challenged=!0,d.stale&&(this.staled=!0),b.method===a.C.REGISTER?c=this.applicant.cseq+=1:this.request.dialog?c=this.request.dialog.local_seqnum+=1:(c=this.request.cseq+1,this.request.cseq=c),this.request.setHeader("cseq",c+" "+this.method),this.request.setHeader(e,this.credentials.toString()),this.send()}else this.applicant.receiveResponse(b)}else this.applicant.receiveResponse(b)}},a.RequestSender=b}},{}],19:[function(a,b,c){"use strict";b.exports=function(b){var c=a("../package.json"),d=c.version,e=c.title,f=Object.defineProperties({},{version:{get:function(){return d}},name:{get:function(){return e}}});return a("./Utils")(f,b),f.LoggerFactory=a("./LoggerFactory")(b.console),f.EventEmitter=a("./EventEmitter")(b.console),f.C=a("./Constants")(f.name,f.version),f.Exceptions=a("./Exceptions"),f.Timers=a("./Timers")(b.timers),f.Transport=b.Transport(f,b.WebSocket),a("./Parser")(f),a("./SIPMessage")(f),a("./URI")(f),a("./NameAddrHeader")(f),a("./Transactions")(f),a("./Dialogs")(f),a("./RequestSender")(f),a("./RegisterContext")(f),f.MediaHandler=a("./MediaHandler")(f.EventEmitter),a("./ClientContext")(f),a("./ServerContext")(f),a("./Session")(f,b),a("./Subscription")(f),f.WebRTC=a("./WebRTC")(f,b),a("./UA")(f,b),f.Hacks=a("./Hacks")(f),a("./SanityCheck")(f),f.DigestAuthentication=a("./DigestAuthentication")(f.Utils),f.Grammar=a("./Grammar")(f),f}},{"../package.json":2,"./ClientContext":3,"./Constants":4,"./Dialogs":6,"./DigestAuthentication":7,"./EventEmitter":8,"./Exceptions":9,"./Grammar":10,"./Hacks":12,"./LoggerFactory":13,"./MediaHandler":14,"./NameAddrHeader":15,"./Parser":16,"./RegisterContext":17,"./RequestSender":18,"./SIPMessage":20,"./SanityCheck":21,"./ServerContext":22,"./Session":23,"./Subscription":25,"./Timers":26,"./Transactions":27,"./UA":29,"./URI":30,"./Utils":31,"./WebRTC":32}],20:[function(a,b,c){"use strict";b.exports=function(a){function b(b){var c=b.ua.configuration.hackAllowUnregisteredOptionTags,d=[],e={};return b.method===a.C.REGISTER?d.push("path","gruu"):b.method===a.C.INVITE&&(b.ua.contact.pub_gruu||b.ua.contact.temp_gruu)&&d.push("gruu"),b.ua.configuration.rel100===a.C.supported.SUPPORTED&&d.push("100rel"),b.ua.configuration.replaces===a.C.supported.SUPPORTED&&d.push("replaces"),d.push("outbound"),d=d.concat(b.ua.configuration.extraSupported),d=d.filter(function(b){var d=a.C.OPTION_TAGS[b],f=!e[b];return e[b]=!0,(d||c)&&f}),"Supported: "+d.join(", ")+"\r\n"}var c,d,e,f;c=function(b,c,d,e,f,g){var h,i,j,k,l,m;return e=e||{},b&&c&&d?(this.logger=d.getLogger("sip.sipmessage"),this.ua=d,this.headers={},this.method=b,this.ruri=c,this.body=g,this.extraHeaders=(f||[]).slice(),this.statusCode=e.status_code,this.reasonPhrase=e.reason_phrase,e.route_set?this.setHeader("route",e.route_set):d.configuration.usePreloadedRoute&&this.setHeader("route",d.transport.server.sip_uri),this.setHeader("via",""),this.setHeader("max-forwards",a.UA.C.MAX_FORWARDS),l=e.to_uri||c,h=e.to_displayName||0===e.to_displayName?'"'+e.to_displayName+'" ':"",h+="<"+(l&&l.toRaw?l.toRaw():l)+">",h+=e.to_tag?";tag="+e.to_tag:"",this.to=new a.NameAddrHeader.parse(h),this.setHeader("to",h),m=e.from_uri||d.configuration.uri,i=e.from_displayName||0===e.from_displayName?'"'+e.from_displayName+'" ':d.configuration.displayName?'"'+d.configuration.displayName+'" ':"",i+="<"+(m&&m.toRaw?m.toRaw():m)+">;tag=",i+=e.from_tag||a.Utils.newTag(),this.from=new a.NameAddrHeader.parse(i),this.setHeader("from",i),j=e.call_id||d.configuration.sipjsId+a.Utils.createRandomToken(15),this.call_id=j,this.setHeader("call-id",j),k=e.cseq||Math.floor(1e4*Math.random()),this.cseq=k,void this.setHeader("cseq",k+" "+b)):null},c.prototype={setHeader:function(b,c){this.headers[a.Utils.headerize(b)]=c instanceof Array?c:[c]},getHeader:function(b){var c,d,e=this.extraHeaders.length,f=this.headers[a.Utils.headerize(b)];if(f){if(f[0])return f[0]}else for(c=new RegExp("^\\s*"+b+"\\s*:","i"),d=0;e>d;d++)if(f=this.extraHeaders[d],c.test(f))return f.substring(f.indexOf(":")+1).trim()},getHeaders:function(b){var c,d,e,f=this.headers[a.Utils.headerize(b)],g=[];if(f){for(d=f.length,c=0;d>c;c++)g.push(f[c]);return g}for(d=this.extraHeaders.length,e=new RegExp("^\\s*"+b+"\\s*:","i"),c=0;d>c;c++)f=this.extraHeaders[c],e.test(f)&&g.push(f.substring(f.indexOf(":")+1).trim());return g},hasHeader:function(b){var c,d,e=this.extraHeaders.length;if(this.headers[a.Utils.headerize(b)])return!0;for(c=new RegExp("^\\s*"+b+"\\s*:","i"),d=0;e>d;d++)if(c.test(this.extraHeaders[d]))return!0;return!1},toString:function(){var c,d,e,f="";f+=this.method+" "+(this.ruri.toRaw?this.ruri.toRaw():this.ruri)+" SIP/2.0\r\n";for(c in this.headers)for(d=this.headers[c].length,e=0;d>e;e++)f+=c+": "+this.headers[c][e]+"\r\n";for(d=this.extraHeaders.length,e=0;d>e;e++)f+=this.extraHeaders[e].trim()+"\r\n";return f+=b(this),f+="User-Agent: "+this.ua.configuration.userAgentString+"\r\n",this.body?"string"==typeof this.body?(d=a.Utils.str_utf8_length(this.body),f+="Content-Length: "+d+"\r\n\r\n",f+=this.body):this.body.body&&this.body.contentType?(d=a.Utils.str_utf8_length(this.body.body),f+="Content-Type: "+this.body.contentType+"\r\n",f+="Content-Length: "+d+"\r\n\r\n",f+=this.body.body):f+="Content-Length: 0\r\n\r\n":f+="Content-Length: 0\r\n\r\n",f}},d=function(){this.data=null,this.headers=null,this.method=null,this.via=null,this.via_branch=null,this.call_id=null,this.cseq=null,this.from=null,this.from_tag=null,this.to=null,this.to_tag=null,this.body=null},d.prototype={addHeader:function(b,c){var d={raw:c};b=a.Utils.headerize(b),this.headers[b]?this.headers[b].push(d):this.headers[b]=[d]},getHeader:function(b){var c=this.headers[a.Utils.headerize(b)];if(c)return c[0]?c[0].raw:void 0},getHeaders:function(b){var c,d,e=this.headers[a.Utils.headerize(b)],f=[];if(!e)return[];for(d=e.length,c=0;d>c;c++)f.push(e[c].raw);return f},hasHeader:function(b){return this.headers[a.Utils.headerize(b)]?!0:!1},parseHeader:function(b,c){var d,e,f;return b=a.Utils.headerize(b),c=c||0,this.headers[b]?c>=this.headers[b].length?void this.logger.log('not so many "'+b+'" headers present'):(d=this.headers[b][c],e=d.raw,d.parsed?d.parsed:(f=a.Grammar.parse(e,b.replace(/-/g,"_")),-1===f?(this.headers[b].splice(c,1),void this.logger.warn('error parsing "'+b+'" header field with value "'+e+'"')):(d.parsed=f,f))):void this.logger.log('header "'+b+'" not present')},s:function(a,b){return this.parseHeader(a,b)},setHeader:function(b,c){var d={raw:c};this.headers[a.Utils.headerize(b)]=[d]},toString:function(){return this.data}},e=function(a){this.logger=a.getLogger("sip.sipmessage"),this.ua=a,this.headers={},this.ruri=null,this.transport=null,this.server_transaction=null},e.prototype=new d,e.prototype.reply=function(c,d,e,f,g,h){var i,j,k,l,m,n=this.getHeader("To"),o=0,p=0;if(m=a.Utils.buildStatusLine(c,d),e=(e||[]).slice(),this.method===a.C.INVITE&&c>100&&200>=c)for(i=this.getHeaders("record-route"),k=i.length,o;k>o;o++)m+="Record-Route: "+i[o]+"\r\n";for(j=this.getHeaders("via"),k=j.length,p;k>p;p++)m+="Via: "+j[p]+"\r\n";for(!this.to_tag&&c>100?n+=";tag="+a.Utils.newTag():this.to_tag&&!this.s("to").hasParam("tag")&&(n+=";tag="+this.to_tag),m+="To: "+n+"\r\n",m+="From: "+this.getHeader("From")+"\r\n",m+="Call-ID: "+this.call_id+"\r\n",m+="CSeq: "+this.cseq+" "+this.method+"\r\n",k=e.length,l=0;k>l;l++)m+=e[l].trim()+"\r\n";return m+=b(this),m+="User-Agent: "+this.ua.configuration.userAgentString+"\r\n",f?"string"==typeof f?(k=a.Utils.str_utf8_length(f),m+="Content-Type: application/sdp\r\n",m+="Content-Length: "+k+"\r\n\r\n",m+=f):f.body&&f.contentType?(k=a.Utils.str_utf8_length(f.body),m+="Content-Type: "+f.contentType+"\r\n",m+="Content-Length: "+k+"\r\n\r\n",m+=f.body):m+="Content-Length: 0\r\n\r\n":m+="Content-Length: 0\r\n\r\n",this.server_transaction.receiveResponse(c,m).then(g,h),m},e.prototype.reply_sl=function(b,c){var d,e,f=0,g=this.getHeaders("via"),h=g.length;for(e=a.Utils.buildStatusLine(b,c),f;h>f;f++)e+="Via: "+g[f]+"\r\n";d=this.getHeader("To"),!this.to_tag&&b>100?d+=";tag="+a.Utils.newTag():this.to_tag&&!this.s("to").hasParam("tag")&&(d+=";tag="+this.to_tag),e+="To: "+d+"\r\n",e+="From: "+this.getHeader("From")+"\r\n",e+="Call-ID: "+this.call_id+"\r\n",e+="CSeq: "+this.cseq+" "+this.method+"\r\n",e+="User-Agent: "+this.ua.configuration.userAgentString+"\r\n",e+="Content-Length: 0\r\n\r\n",this.transport.send(e)},f=function(a){this.logger=a.getLogger("sip.sipmessage"),this.headers={},this.status_code=null,this.reason_phrase=null},f.prototype=new d,a.OutgoingRequest=c,a.IncomingRequest=e,a.IncomingResponse=f}},{}],21:[function(a,b,c){"use strict";b.exports=function(a){function b(b,c,d){var e,f=a.Utils.buildStatusLine(b),g=c.getHeaders("via"),h=g.length,i=0;for(i;h>i;i++)f+="Via: "+g[i]+"\r\n";e=c.getHeader("To"),c.to_tag||(e+=";tag="+a.Utils.newTag()),f+="To: "+e+"\r\n",f+="From: "+c.getHeader("From")+"\r\n",f+="Call-ID: "+c.call_id+"\r\n",f+="CSeq: "+c.cseq+" "+c.method+"\r\n",f+="\r\n",d.send(f)}function c(a,c,d){return a.ruri&&"sip"===a.ruri.scheme?void 0:(b(416,a,d),!1)}function d(a,c,d){return a.to_tag||a.call_id.substr(0,5)!==c.configuration.sipjsId?void 0:(b(482,a,d),!1)}function e(c,d,e){var f=a.Utils.str_utf8_length(c.body),g=c.getHeader("content-length");return g>f?(b(400,c,e),!1):void 0}function f(c,d,e){var f,g,h=c.from_tag,i=c.call_id,j=c.cseq;if(!c.to_tag)if(c.method===a.C.INVITE){if(f=d.transactions.ist[c.via_branch])return;for(g in d.transactions.ist)if(f=d.transactions.ist[g],f.request.from_tag===h&&f.request.call_id===i&&f.request.cseq===j)return b(482,c,e),!1}else{if(f=d.transactions.nist[c.via_branch])return;for(g in d.transactions.nist)if(f=d.transactions.nist[g],f.request.from_tag===h&&f.request.call_id===i&&f.request.cseq===j)return b(482,c,e),!1}}function g(a,b){return a.getHeaders("via").length>1?(b.getLogger("sip.sanitycheck").warn("More than one Via header field present in the response. Dropping the response"),!1):void 0}function h(a,b){var c=b.configuration.viaHost;return a.via.host!==c||void 0!==a.via.port?(b.getLogger("sip.sanitycheck").warn("Via sent-by in the response does not match UA Via host value. Dropping the response"),!1):void 0}function i(b,c){var d=a.Utils.str_utf8_length(b.body),e=b.getHeader("content-length");return e>d?(c.getLogger("sip.sanitycheck").warn("Message body length is lower than the value in Content-Length header field. Dropping the response"),!1):void 0}function j(a,b){for(var c=["from","to","call_id","cseq","via"],d=c.length;d--;)if(!a.hasHeader(c[d]))return b.getLogger("sip.sanitycheck").warn("Missing mandatory header field : "+c[d]+". Dropping the response"),!1}var k,l=[],m=[],n=[];l.push(c),l.push(d),l.push(e),l.push(f),m.push(g),m.push(h),m.push(i),n.push(j),k=function(b,c,d){var e,f;for(e=n.length;e--;)if(f=n[e](b,c,d),f===!1)return!1;if(b instanceof a.IncomingRequest){for(e=l.length;e--;)if(f=l[e](b,c,d),f===!1)return!1}else if(b instanceof a.IncomingResponse)for(e=m.length;e--;)if(f=m[e](b,c,d),f===!1)return!1;return!0},a.sanityCheck=k}},{}],22:[function(a,b,c){"use strict";b.exports=function(a){var b;b=function(b,c){this.ua=b,this.logger=b.getLogger("sip.servercontext"),this.request=c,c.method===a.C.INVITE?this.transaction=new a.Transactions.InviteServerTransaction(c,b):this.transaction=new a.Transactions.NonInviteServerTransaction(c,b),c.body&&(this.body=c.body),c.hasHeader("Content-Type")&&(this.contentType=c.getHeader("Content-Type")),this.method=c.method,this.data={},this.localIdentity=c.to,this.remoteIdentity=c.from},b.prototype=Object.create(a.EventEmitter.prototype),b.prototype.progress=function(a){return a=Object.create(a||Object.prototype),a.statusCode||(a.statusCode=180),a.minCode=100,a.maxCode=199,a.events=["progress"],this.reply(a)},b.prototype.accept=function(a){return a=Object.create(a||Object.prototype),a.statusCode||(a.statusCode=200),a.minCode=200,a.maxCode=299,a.events=["accepted"],this.reply(a)},b.prototype.reject=function(a){return a=Object.create(a||Object.prototype),a.statusCode||(a.statusCode=480),a.minCode=300,a.maxCode=699,a.events=["rejected","failed"],this.reply(a)},b.prototype.reply=function(b){b=b||{};var c,d=b.statusCode||100,e=b.minCode||100,f=b.maxCode||699,g=a.Utils.getReasonPhrase(d,b.reasonPhrase),h=b.extraHeaders||[],i=b.body,j=b.events||[];if(e>d||d>f)throw new TypeError("Invalid statusCode: "+d);return c=this.request.reply(d,g,h,i),j.forEach(function(a){this.emit(a,c,g)},this),this},b.prototype.onRequestTimeout=function(){this.emit("failed",null,a.C.causes.REQUEST_TIMEOUT)},b.prototype.onTransportError=function(){this.emit("failed",null,a.C.causes.CONNECTION_ERROR)},a.ServerContext=b}},{}],23:[function(a,b,c){"use strict";b.exports=function(b,c){var d,e,f,g=a("./Session/DTMF")(b),h={STATUS_NULL:0,STATUS_INVITE_SENT:1,STATUS_1XX_RECEIVED:2,STATUS_INVITE_RECEIVED:3,STATUS_WAITING_FOR_ANSWER:4,STATUS_ANSWERED:5,STATUS_WAITING_FOR_PRACK:6,STATUS_WAITING_FOR_ACK:7,STATUS_CANCELED:8,STATUS_TERMINATED:9,STATUS_ANSWERED_WAITING_FOR_PRACK:10,STATUS_EARLY_MEDIA:11,STATUS_CONFIRMED:12};d=function(a){this.status=h.STATUS_NULL,this.dialog=null,this.earlyDialogs={},this.mediaHandlerFactory=a||b.WebRTC.MediaHandler.defaultFactory,this.hasOffer=!1,this.hasAnswer=!1,this.timers={ackTimer:null,expiresTimer:null,invite2xxTimer:null,userNoAnswerTimer:null,rel1xxTimer:null,prackTimer:null},this.startTime=null,this.endTime=null,this.tones=null,this.local_hold=!1,this.remote_hold=!1,this.pending_actions={actions:[],length:function(){return this.actions.length},isPending:function(a){var b=0,c=this.actions.length;for(b;c>b;b++)if(this.actions[b].name===a)return!0;return!1},shift:function(){return this.actions.shift()},push:function(a){this.actions.push({name:a})},pop:function(a){var b=0,c=this.actions.length;for(b;c>b;b++)this.actions[b].name===a&&(this.actions.splice(b,1),c--,b--)}},this.early_sdp=null,this.rel100=b.C.supported.UNSUPPORTED},d.prototype={dtmf:function(a,c){var d,e=[],f=this;if(c=c||{},void 0===a)throw new TypeError("Not enough arguments");if(this.status!==h.STATUS_CONFIRMED&&this.status!==h.STATUS_WAITING_FOR_ACK)throw new b.Exceptions.InvalidStateError(this.status);if("string"!=typeof a&&"number"!=typeof a||!a.toString().match(/^[0-9A-D#*,]+$/i))throw new TypeError("Invalid tones: "+a);for(a=a.toString().split("");a.length>0;)e.push(new g(this,a.shift(),c));if(this.tones)return this.tones=this.tones.concat(e),this;var i=function(){var a,e;return f.status!==h.STATUS_TERMINATED&&f.tones&&0!==f.tones.length?(a=f.tones.shift(),","===d?e=2e3:(a.on("failed",function(){f.tones=null}),a.send(c),e=a.duration+a.interToneGap),void b.Timers.setTimeout(i,e)):(f.tones=null,this)};return this.tones=e,i(),this},bye:function(a){a=Object.create(a||Object.prototype);var c=a.statusCode;if(this.status===h.STATUS_TERMINATED)return this.logger.error("Error: Attempted to send BYE in a terminated session."),this;if(this.logger.log("terminating Session"),c&&(200>c||c>=700))throw new TypeError("Invalid statusCode: "+c);return a.receiveResponse=function(){},this.sendRequest(b.C.BYE,a).terminated()},refer:function(a,c){c=c||{};var d=(c.extraHeaders||[]).slice(),e=a instanceof b.InviteServerContext||a instanceof b.InviteClientContext,f=a;if(void 0===a)throw new TypeError("Not enough arguments");if(this.status!==h.STATUS_CONFIRMED)throw new b.Exceptions.InvalidStateError(this.status);if(e)a='"'+a.remoteIdentity.friendlyName+'" <'+a.dialog.remote_target.toString()+"?Replaces="+a.dialog.id.call_id+"%3Bto-tag%3D"+a.dialog.id.remote_tag+"%3Bfrom-tag%3D"+a.dialog.id.local_tag+">";else{try{a=b.Grammar.parse(a,"Refer_To").uri||a}catch(g){this.logger.debug(".refer() cannot parse Refer_To from",a),this.logger.debug("...falling through to normalizeTarget()")}if(a=this.ua.normalizeTarget(a),!a)throw new TypeError("Invalid target: "+f)}return d.push("Contact: "+this.contact),d.push("Allow: "+b.UA.C.ALLOWED_METHODS.toString()),d.push("Refer-To: "+a),this.sendRequest(b.C.REFER,{extraHeaders:d,body:c.body,receiveResponse:function(b){/^2[0-9]{2}$/.test(b.status_code)&&(e||a.scheme&&a.scheme.match("^sips?$"))&&this.terminate()}.bind(this)}),this},followRefer:function(a){return function(a,d){var e=d.parseHeader("refer-to"),f=e.uri;if(!f.scheme.match("^sips?$")){var g=f.toString();return void("function"==typeof c.open?c.open(g):this.logger.warn("referred to non-SIP URI but `open` isn't in the environment: "+g))}var h=[],i=f.getHeader("Replaces");void 0!==i&&h.push("Replaces: "+decodeURIComponent(i)),f.clearHeaders();var j=this.mediaHandler.getReferMedia,k=j?j.call(this.mediaHandler):this.mediaHint;b.Hacks.Chrome.getsConfusedAboutGUM(this);var l=this.ua.invite(f,{media:k,params:{to_displayName:e.friendlyName},extraHeaders:h});a.call(this,d,l),this.terminate()}.bind(this,a)},sendRequest:function(a,c){c=c||{};var d=this,e=new b.OutgoingRequest(a,this.dialog.remote_target,this.ua,{cseq:c.cseq||(this.dialog.local_seqnum+=1),call_id:this.dialog.id.call_id,from_uri:this.dialog.local_uri,from_tag:this.dialog.id.local_tag,to_uri:this.dialog.remote_uri,to_tag:this.dialog.id.remote_tag,route_set:this.dialog.route_set,statusCode:c.statusCode,reasonPhrase:c.reasonPhrase},c.extraHeaders||[],c.body);return new b.RequestSender({request:e,onRequestTimeout:function(){d.onRequestTimeout()},onTransportError:function(){d.onTransportError()},receiveResponse:c.receiveResponse||function(a){d.receiveNonInviteResponse(a)}},this.ua).send(),this.emit(a.toLowerCase(),e),this},close:function(){var a;if(this.status===h.STATUS_TERMINATED)return this;this.logger.log("closing INVITE session "+this.id),this.mediaHandler&&this.mediaHandler.close();for(a in this.timers)b.Timers.clearTimeout(this.timers[a]);this.dialog&&(this.dialog.terminate(),delete this.dialog);for(a in this.earlyDialogs)this.earlyDialogs[a].terminate(),delete this.earlyDialogs[a];return this.status=h.STATUS_TERMINATED,delete this.ua.sessions[this.id],this},createDialog:function(a,c,d){var e,f,g=a["UAS"===c?"to_tag":"from_tag"],h=a["UAS"===c?"from_tag":"to_tag"],i=a.call_id+g+h;if(f=this.earlyDialogs[i],d)return f?!0:(f=new b.Dialog(this,a,c,b.Dialog.C.STATUS_EARLY),f.error?(this.logger.error(f.error),this.failed(a,b.C.causes.INTERNAL_ERROR),!1):(this.earlyDialogs[i]=f,!0));if(f){f.update(a,c),this.dialog=f,delete this.earlyDialogs[i];for(var j in this.earlyDialogs)this.earlyDialogs[j].terminate(),delete this.earlyDialogs[j];return!0}return e=new b.Dialog(this,a,c),e.error?(this.logger.error(e.error),this.failed(a,b.C.causes.INTERNAL_ERROR),!1):(this.to_tag=a.to_tag,this.dialog=e,!0)},isReadyToReinvite:function(){return this.mediaHandler.isReady()&&!this.dialog.uac_pending_reply&&!this.dialog.uas_pending_reply},mute:function(a){var b=this.mediaHandler.mute(a);b&&this.onmute(b)},unmute:function(a){var b=this.mediaHandler.unmute(a);b&&this.onunmute(b)},hold:function(a){if(this.status!==h.STATUS_WAITING_FOR_ACK&&this.status!==h.STATUS_CONFIRMED)throw new b.Exceptions.InvalidStateError(this.status);return this.mediaHandler.hold(),this.isReadyToReinvite()?void(this.local_hold!==!0&&(this.onhold("local"),this.sendReinvite(a))):void(this.pending_actions.isPending("unhold")?this.pending_actions.pop("unhold"):this.pending_actions.isPending("hold")||this.pending_actions.push("hold"))},unhold:function(a){if(this.status!==h.STATUS_WAITING_FOR_ACK&&this.status!==h.STATUS_CONFIRMED)throw new b.Exceptions.InvalidStateError(this.status);return this.mediaHandler.unhold(),this.isReadyToReinvite()?void(this.local_hold!==!1&&(this.onunhold("local"),this.sendReinvite(a))):void(this.pending_actions.isPending("hold")?this.pending_actions.pop("hold"):this.pending_actions.isPending("unhold")||this.pending_actions.push("unhold"))},isOnHold:function(){return{local:this.local_hold,remote:this.remote_hold}},receiveReinvite:function(a){var c=this;return this.mediaHandler.hasDescription(a)?void this.mediaHandler.setDescription(a).then(this.mediaHandler.getDescription.bind(this.mediaHandler,this.mediaHint)).then(function(b){var d=["Contact: "+c.contact];a.reply(200,null,d,b,function(){c.status=h.STATUS_WAITING_FOR_ACK,c.setInvite2xxTimer(a,b),c.setACKTimer(),c.remote_hold&&!c.mediaHandler.remote_hold?c.onunhold("remote"):!c.remote_hold&&c.mediaHandler.remote_hold&&c.onhold("remote")})})["catch"](function(d){var e;d instanceof b.Exceptions.GetDescriptionError?e=500:(c.logger.error(d),e=488),a.reply(e)}):(this.logger.warn("invalid Content-Type"),void a.reply(415))},sendReinvite:function(a){a=a||{};var c,d=this,e=(a.extraHeaders||[]).slice(),f=a.eventHandlers||{};f.succeeded&&(c=f.succeeded),this.reinviteSucceeded=function(){b.Timers.clearTimeout(d.timers.ackTimer),b.Timers.clearTimeout(d.timers.invite2xxTimer),d.status=h.STATUS_CONFIRMED,c&&c.apply(this,arguments)},f.failed?this.reinviteFailed=f.failed:this.reinviteFailed=function(){},e.push("Contact: "+this.contact),e.push("Allow: "+b.UA.C.ALLOWED_METHODS.toString()),this.receiveResponse=this.receiveReinviteResponse,this.mediaHandler.getDescription(d.mediaHint).then(function(a){d.dialog.sendRequest(d,b.C.INVITE,{extraHeaders:e,body:a})},function(){d.isReadyToReinvite()&&d.onReadyToReinvite(),d.reinviteFailed()})},receiveRequest:function(a){switch(a.method){case b.C.BYE:a.reply(200),this.status===h.STATUS_CONFIRMED&&(this.emit("bye",a),this.terminated(a,b.C.causes.BYE));break;case b.C.INVITE:this.status===h.STATUS_CONFIRMED&&(this.logger.log("re-INVITE received"),this.receiveReinvite(a));break;case b.C.INFO:if(this.status===h.STATUS_CONFIRMED||this.status===h.STATUS_WAITING_FOR_ACK){if(this.onInfo)return this.onInfo(a);var c,d,e,f=a.getHeader("content-type"),i=/^(Signal\s*?=\s*?)([0-9A-D#*]{1})(\s)?.*/,j=/^(Duration\s?=\s?)([0-9]{1,4})(\s)?.*/;f&&(f.match(/^application\/dtmf-relay/i)?(a.body&&(c=a.body.split("\r\n",2),2===c.length&&(i.test(c[0])&&(d=c[0].replace(i,"$2")),j.test(c[1])&&(e=parseInt(c[1].replace(j,"$2"),10)))),new g(this,d,{duration:e}).init_incoming(a)):a.reply(415,null,["Accept: application/dtmf-relay"]))}break;case b.C.REFER:if(this.status===h.STATUS_CONFIRMED){this.logger.log("REFER received");var k,l=this.listeners("refer").length;l?(a.reply(202,"Accepted"),k="SIP/2.0 100 Trying",this.sendRequest(b.C.NOTIFY,{extraHeaders:["Event: refer","Subscription-State: terminated","Content-Type: message/sipfrag"],body:k,receiveResponse:function(){}}),this.emit("refer",a)):a.reply(603,"Declined")}break;case b.C.NOTIFY:a.reply(200,"OK"),this.emit("notify",a)}},receiveReinviteResponse:function(a){var c=this;if(this.status!==h.STATUS_TERMINATED)switch(!0){case/^1[0-9]{2}$/.test(a.status_code):break;case/^2[0-9]{2}$/.test(a.status_code):if(this.status=h.STATUS_CONFIRMED,this.sendRequest(b.C.ACK,{cseq:a.cseq}),!this.mediaHandler.hasDescription(a)){this.reinviteFailed();break}this.mediaHandler.setDescription(a).then(function(){c.reinviteSucceeded()},function(){c.reinviteFailed()});break;default:this.reinviteFailed()}},acceptAndTerminate:function(a,c,d){var e=[];return c&&e.push("Reason: "+b.Utils.getReasonHeaderValue(c,d)),(this.dialog||this.createDialog(a,"UAC"))&&(this.sendRequest(b.C.ACK,{cseq:a.cseq}),this.sendRequest(b.C.BYE,{extraHeaders:e})),this},setInvite2xxTimer:function(a,c){var d=this,e=b.Timers.T1;this.timers.invite2xxTimer=b.Timers.setTimeout(function f(){if(d.status===h.STATUS_WAITING_FOR_ACK){d.logger.log("no ACK received, attempting to retransmit OK");var g=["Contact: "+d.contact];a.reply(200,null,g,c),e=Math.min(2*e,b.Timers.T2),d.timers.invite2xxTimer=b.Timers.setTimeout(f,e)}},e)},setACKTimer:function(){
38
-var a=this;this.timers.ackTimer=b.Timers.setTimeout(function(){a.status===h.STATUS_WAITING_FOR_ACK&&(a.logger.log("no ACK received for an extended period of time, terminating the call"),b.Timers.clearTimeout(a.timers.invite2xxTimer),a.sendRequest(b.C.BYE),a.terminated(null,b.C.causes.NO_ACK))},b.Timers.TIMER_H)},onReadyToReinvite:function(){var a=this.pending_actions.shift();a&&this[a.name]&&this[a.name]()},onTransportError:function(){this.status!==h.STATUS_CONFIRMED&&this.status!==h.STATUS_TERMINATED&&this.failed(null,b.C.causes.CONNECTION_ERROR)},onRequestTimeout:function(){this.status===h.STATUS_CONFIRMED?this.terminated(null,b.C.causes.REQUEST_TIMEOUT):this.status!==h.STATUS_TERMINATED&&(this.failed(null,b.C.causes.REQUEST_TIMEOUT),this.terminated(null,b.C.causes.REQUEST_TIMEOUT))},onDialogError:function(a){this.status===h.STATUS_CONFIRMED?this.terminated(a,b.C.causes.DIALOG_ERROR):this.status!==h.STATUS_TERMINATED&&(this.failed(a,b.C.causes.DIALOG_ERROR),this.terminated(a,b.C.causes.DIALOG_ERROR))},onhold:function(a){this["local"===a?"local_hold":"remote_hold"]=!0,this.emit("hold",{originator:a})},onunhold:function(a){this["local"===a?"local_hold":"remote_hold"]=!1,this.emit("unhold",{originator:a})},onmute:function(a){this.emit("muted",{audio:a.audio,video:a.video})},onunmute:function(a){this.emit("unmuted",{audio:a.audio,video:a.video})},failed:function(a,b){return this.status===h.STATUS_TERMINATED?this:(this.emit("failed",a||null,b||null),this)},rejected:function(a,b){return this.emit("rejected",a||null,b||null),this},canceled:function(){return this.emit("cancel"),this},accepted:function(a,c){return c=b.Utils.getReasonPhrase(a&&a.status_code,c),this.startTime=new Date,this.replacee&&(this.replacee.emit("replaced",this),this.replacee.terminate()),this.emit("accepted",a,c),this},terminated:function(a,b){return this.status===h.STATUS_TERMINATED?this:(this.endTime=new Date,this.close(),this.emit("terminated",a||null,b||null),this)},connecting:function(a){return this.emit("connecting",{request:a}),this}},d.desugar=function(a){return c.HTMLMediaElement&&a instanceof c.HTMLMediaElement&&(a={media:{constraints:{audio:!0,video:"VIDEO"===a.tagName},render:{remote:a}}}),a||{}},d.C=h,b.Session=d,e=function(a,c){function d(a,b){c.hasHeader(a)&&c.getHeader(a).toLowerCase().indexOf("100rel")>=0&&(g.rel100=b)}function e(){var a={extraHeaders:["Contact: "+g.contact]};g.rel100!==b.C.supported.REQUIRED&&g.progress(a),g.status=h.STATUS_WAITING_FOR_ANSWER,g.timers.userNoAnswerTimer=b.Timers.setTimeout(function(){c.reply(408),g.failed(c,b.C.causes.NO_ANSWER),g.terminated(c,b.C.causes.NO_ANSWER)},g.ua.configuration.noAnswerTimeout),f&&(g.timers.expiresTimer=b.Timers.setTimeout(function(){g.status===h.STATUS_WAITING_FOR_ANSWER&&(c.reply(487),g.failed(c,b.C.causes.EXPIRES),g.terminated(c,b.C.causes.EXPIRES))},f)),g.emit("invite",c)}var f,g=this,i=c.getHeader("Content-Type"),j=c.parseHeader("Content-Disposition");if(b.Utils.augment(this,b.ServerContext,[a,c]),b.Utils.augment(this,b.Session,[a.configuration.mediaHandlerFactory]),this.mediaHandler=this.mediaHandlerFactory(this,{RTCConstraints:{optional:[{DtlsSrtpKeyAgreement:"true"}]}}),!j&&!this.mediaHandler.hasDescription(c)||j&&"render"===j.type)this.renderbody=c.body,this.rendertype=i;else if(!this.mediaHandler.hasDescription(c)&&j&&"session"===j.type)return void c.reply(415);return this.status=h.STATUS_INVITE_RECEIVED,this.from_tag=c.from_tag,this.id=c.call_id+this.from_tag,this.request=c,this.contact=this.ua.contact.toString(),this.receiveNonInviteResponse=function(){},this.logger=a.getLogger("sip.inviteservercontext",this.id),this.ua.sessions[this.id]=this,c.hasHeader("expires")&&(f=1e3*c.getHeader("expires")),d("require",b.C.supported.REQUIRED),d("supported",b.C.supported.SUPPORTED),c.to_tag=b.Utils.newTag(),this.createDialog(c,"UAS",!0)?(this.mediaHandler&&this.mediaHandler.getRemoteStreams&&(this.getRemoteStreams=this.mediaHandler.getRemoteStreams.bind(this.mediaHandler),this.getLocalStreams=this.mediaHandler.getLocalStreams.bind(this.mediaHandler)),void(!this.mediaHandler.hasDescription(c)||this.renderbody?b.Timers.setTimeout(e,0):(this.hasOffer=!0,this.mediaHandler.setDescription(c).then(e,function(a){g.logger.warn("invalid description"),g.logger.warn(a),c.reply(488)})))):void c.reply(500,"Missing Contact header field")},e.prototype={reject:function(a){if(this.status===h.STATUS_TERMINATED)throw new b.Exceptions.InvalidStateError(this.status);return this.logger.log("rejecting RTCSession"),b.ServerContext.prototype.reject.call(this,a),this.terminated()},terminate:function(a){a=a||{};var c,d=(a.extraHeaders||[]).slice(),e=a.body,f=this;return this.status===h.STATUS_WAITING_FOR_ACK&&this.request.server_transaction.state!==b.Transactions.C.STATUS_TERMINATED?(c=this.dialog,this.receiveRequest=function(a){a.method===b.C.ACK&&(this.sendRequest(b.C.BYE,{extraHeaders:d,body:e}),c.terminate())},this.request.server_transaction.on("stateChanged",function(){this.state===b.Transactions.C.STATUS_TERMINATED&&this.dialog&&(this.request=new b.OutgoingRequest(b.C.BYE,this.dialog.remote_target,this.ua,{cseq:this.dialog.local_seqnum+=1,call_id:this.dialog.id.call_id,from_uri:this.dialog.local_uri,from_tag:this.dialog.id.local_tag,to_uri:this.dialog.remote_uri,to_tag:this.dialog.id.remote_tag,route_set:this.dialog.route_set},d,e),new b.RequestSender({request:this.request,onRequestTimeout:function(){f.onRequestTimeout()},onTransportError:function(){f.onTransportError()},receiveResponse:function(){}},this.ua).send(),c.terminate())}),this.emit("bye",this.request),this.terminated(),this.dialog=c,this.ua.dialogs[c.id.toString()]=c):this.status===h.STATUS_CONFIRMED?this.bye(a):this.reject(a),this},progress:function(a){function c(){g=a.statusCode||183,this.status=h.STATUS_WAITING_FOR_PRACK,j.push("Contact: "+this.contact),j.push("Require: 100rel"),j.push("RSeq: "+Math.floor(1e4*Math.random())),this.mediaHint=a.media,this.mediaHandler.getDescription(a.media).then(function(a){if(!this.isCanceled&&this.status!==h.STATUS_TERMINATED){this.early_sdp=a.body,this[this.hasOffer?"hasAnswer":"hasOffer"]=!0;var c=b.Timers.T1;this.timers.rel1xxTimer=b.Timers.setTimeout(function d(){this.request.reply(g,null,j,a),c*=2,this.timers.rel1xxTimer=b.Timers.setTimeout(d.bind(this),c)}.bind(this),c),this.timers.prackTimer=b.Timers.setTimeout(function(){this.status===h.STATUS_WAITING_FOR_PRACK&&(this.logger.log("no PRACK received, rejecting the call"),b.Timers.clearTimeout(this.timers.rel1xxTimer),this.request.reply(504),this.terminated(null,b.C.causes.NO_PRACK))}.bind(this),64*b.Timers.T1),f=this.request.reply(g,i,j,a),this.emit("progress",f,i)}}.bind(this),function(){this.request.reply(480),this.failed(null,b.C.causes.WEBRTC_ERROR),this.terminated(null,b.C.causes.WEBRTC_ERROR)}.bind(this))}function d(){f=this.request.reply(g,i,j,m),this.emit("progress",f,i)}a=a||{};var e,f,g=a.statusCode||180,i=a.reasonPhrase,j=(a.extraHeaders||[]).slice(),k=a.stunServers||null,l=a.turnServers||null,m=a.body;if(100>g||g>199)throw new TypeError("Invalid statusCode: "+g);if(this.isCanceled||this.status===h.STATUS_TERMINATED)return this;if(k||l){if(k){if(e=this.ua.getConfigurationCheck().optional.stunServers(k),!e)throw new TypeError("Invalid stunServers: "+k);this.stunServers=e}if(l){if(e=this.ua.getConfigurationCheck().optional.turnServers(l),!e)throw new TypeError("Invalid turnServers: "+l);this.turnServers=e}this.mediaHandler.updateIceServers({stunServers:this.stunServers,turnServers:this.turnServers})}return 100!==a.statusCode&&(this.rel100===b.C.supported.REQUIRED||this.rel100===b.C.supported.SUPPORTED&&a.rel100||this.rel100===b.C.supported.SUPPORTED&&this.ua.configuration.rel100===b.C.supported.REQUIRED)?c.apply(this):d.apply(this),this},accept:function(a){a=Object.create(d.desugar(a)),b.Utils.optionsOverride(a,"media","mediaConstraints",!0,this.logger,this.ua.configuration.media),this.mediaHint=a.media,this.onInfo=a.onInfo;var c,e=this,f=this.request,g=(a.extraHeaders||[]).slice(),i=a.stunServers||null,j=a.turnServers||null,k=function(a){var c,d=function(){e.status=h.STATUS_WAITING_FOR_ACK,e.setInvite2xxTimer(f,a),e.setACKTimer()},i=function(){e.failed(null,b.C.causes.CONNECTION_ERROR),e.terminated(null,b.C.causes.CONNECTION_ERROR)};e.mediaHandler.render(),g.push("Contact: "+e.contact),g.push("Allow: "+b.UA.C.ALLOWED_METHODS.toString()),e.hasOffer?e.hasAnswer=!0:e.hasOffer=!0,c=f.reply(200,null,g,a,d,i),e.status!==h.STATUS_TERMINATED&&e.accepted(c,b.Utils.getReasonPhrase(200))},l=function(){e.status!==h.STATUS_TERMINATED&&(e.request.reply(480),e.failed(null,b.C.causes.WEBRTC_ERROR),e.terminated(null,b.C.causes.WEBRTC_ERROR))};if(this.status===h.STATUS_WAITING_FOR_PRACK)return this.status=h.STATUS_ANSWERED_WAITING_FOR_PRACK,this;if(this.status===h.STATUS_WAITING_FOR_ANSWER)this.status=h.STATUS_ANSWERED;else if(this.status!==h.STATUS_EARLY_MEDIA)throw new b.Exceptions.InvalidStateError(this.status);if((i||j)&&this.status!==h.STATUS_EARLY_MEDIA&&this.status!==h.STATUS_ANSWERED_WAITING_FOR_PRACK){if(i){if(c=this.ua.getConfigurationCheck().optional.stunServers(i),!c)throw new TypeError("Invalid stunServers: "+i);this.stunServers=c}if(j){if(c=this.ua.getConfigurationCheck().optional.turnServers(j),!c)throw new TypeError("Invalid turnServers: "+j);this.turnServers=c}this.mediaHandler.updateIceServers({stunServers:this.stunServers,turnServers:this.turnServers})}return this.createDialog(f,"UAS")?(b.Timers.clearTimeout(this.timers.userNoAnswerTimer),this.status===h.STATUS_EARLY_MEDIA?k({}):this.mediaHandler.getDescription(e.mediaHint).then(k,l),this):(f.reply(500,"Missing Contact header field"),this)},receiveRequest:function(a){function c(){var c;b.Timers.clearTimeout(this.timers.ackTimer),b.Timers.clearTimeout(this.timers.invite2xxTimer),this.status=h.STATUS_CONFIRMED,this.unmute(),c=a.getHeader("Content-Type"),this.mediaHandler.hasDescription(a)||(this.renderbody=a.body,this.rendertype=c),this.emit("confirmed",a)}switch(a.method){case b.C.CANCEL:(this.status===h.STATUS_WAITING_FOR_ANSWER||this.status===h.STATUS_WAITING_FOR_PRACK||this.status===h.STATUS_ANSWERED_WAITING_FOR_PRACK||this.status===h.STATUS_EARLY_MEDIA||this.status===h.STATUS_ANSWERED)&&(this.status=h.STATUS_CANCELED,this.request.reply(487),this.canceled(a),this.rejected(a,b.C.causes.CANCELED),this.failed(a,b.C.causes.CANCELED),this.terminated(a,b.C.causes.CANCELED));break;case b.C.ACK:this.status===h.STATUS_WAITING_FOR_ACK&&(this.hasAnswer?c.apply(this):this.mediaHandler.hasDescription(a)?(this.hasAnswer=!0,this.mediaHandler.setDescription(a).then(c.bind(this),function(c){this.logger.warn(c),this.terminate({statusCode:"488",reasonPhrase:"Bad Media Description"}),this.failed(a,b.C.causes.BAD_MEDIA_DESCRIPTION),this.terminated(a,b.C.causes.BAD_MEDIA_DESCRIPTION)}.bind(this))):this.early_sdp?c.apply(this):(this.failed(a,b.C.causes.BAD_MEDIA_DESCRIPTION),this.terminated(a,b.C.causes.BAD_MEDIA_DESCRIPTION)));break;case b.C.PRACK:this.status===h.STATUS_WAITING_FOR_PRACK||this.status===h.STATUS_ANSWERED_WAITING_FOR_PRACK?this.hasAnswer?(b.Timers.clearTimeout(this.timers.rel1xxTimer),b.Timers.clearTimeout(this.timers.prackTimer),a.reply(200),this.status===h.STATUS_ANSWERED_WAITING_FOR_PRACK&&(this.status=h.STATUS_EARLY_MEDIA,this.accept()),this.status=h.STATUS_EARLY_MEDIA,this.mute()):this.mediaHandler.hasDescription(a)?(this.hasAnswer=!0,this.mediaHandler.setDescription(a).then(function(){b.Timers.clearTimeout(this.timers.rel1xxTimer),b.Timers.clearTimeout(this.timers.prackTimer),a.reply(200),this.status===h.STATUS_ANSWERED_WAITING_FOR_PRACK&&(this.status=h.STATUS_EARLY_MEDIA,this.accept()),this.status=h.STATUS_EARLY_MEDIA,this.mute()}.bind(this),function(c){this.logger.warn(c),this.terminate({statusCode:"488",reasonPhrase:"Bad Media Description"}),this.failed(a,b.C.causes.BAD_MEDIA_DESCRIPTION),this.terminated(a,b.C.causes.BAD_MEDIA_DESCRIPTION)}.bind(this))):(this.terminate({statusCode:"488",reasonPhrase:"Bad Media Description"}),this.failed(a,b.C.causes.BAD_MEDIA_DESCRIPTION),this.terminated(a,b.C.causes.BAD_MEDIA_DESCRIPTION)):this.status===h.STATUS_EARLY_MEDIA&&a.reply(200);break;default:d.prototype.receiveRequest.apply(this,[a])}},onTransportError:function(){this.status!==h.STATUS_CONFIRMED&&this.status!==h.STATUS_TERMINATED&&this.failed(null,b.C.causes.CONNECTION_ERROR)},onRequestTimeout:function(){this.status===h.STATUS_CONFIRMED?this.terminated(null,b.C.causes.REQUEST_TIMEOUT):this.status!==h.STATUS_TERMINATED&&(this.failed(null,b.C.causes.REQUEST_TIMEOUT),this.terminated(null,b.C.causes.REQUEST_TIMEOUT))}},b.InviteServerContext=e,f=function(a,c,e){e=Object.create(d.desugar(e)),e.params=Object.create(e.params||Object.prototype);var f,g=(e.extraHeaders||[]).slice(),i=e.stunServers||null,j=e.turnServers||null,k=e.mediaHandlerFactory||a.configuration.mediaHandlerFactory,l=k.isSupported;if(l&&!l())throw new b.Exceptions.NotSupportedError("Media not supported");if(this.RTCConstraints=e.RTCConstraints||{},this.inviteWithoutSdp=e.inviteWithoutSdp||!1,this.anonymous=e.anonymous||!1,this.renderbody=e.renderbody||null,this.rendertype=e.rendertype||"text/plain",e.params.from_tag=this.from_tag,this.contact=a.contact.toString({anonymous:this.anonymous,outbound:this.anonymous?!a.contact.temp_gruu:!a.contact.pub_gruu}),this.anonymous&&(e.params.from_displayName="Anonymous",e.params.from_uri="sip:anonymous@anonymous.invalid",g.push("P-Preferred-Identity: "+a.configuration.uri.toString()),g.push("Privacy: id")),g.push("Contact: "+this.contact),g.push("Allow: "+b.UA.C.ALLOWED_METHODS.toString()),this.inviteWithoutSdp&&this.renderbody&&(g.push("Content-Type: "+this.rendertype),g.push("Content-Disposition: render;handling=optional")),a.configuration.rel100===b.C.supported.REQUIRED&&g.push("Require: 100rel"),a.configuration.replaces===b.C.supported.REQUIRED&&g.push("Require: replaces"),e.extraHeaders=g,b.Utils.augment(this,b.ClientContext,[a,b.C.INVITE,c,e]),b.Utils.augment(this,b.Session,[k]),this.status!==h.STATUS_NULL)throw new b.Exceptions.InvalidStateError(this.status);if(this.from_tag=b.Utils.newTag(),this.isCanceled=!1,this.received_100=!1,this.method=b.C.INVITE,this.receiveNonInviteResponse=this.receiveResponse,this.receiveResponse=this.receiveInviteResponse,this.logger=a.getLogger("sip.inviteclientcontext"),i){if(f=this.ua.getConfigurationCheck().optional.stunServers(i),!f)throw new TypeError("Invalid stunServers: "+i);this.stunServers=f}if(j){if(f=this.ua.getConfigurationCheck().optional.turnServers(j),!f)throw new TypeError("Invalid turnServers: "+j);this.turnServers=f}a.applicants[this]=this,this.id=this.request.call_id+this.from_tag,this.mediaHandler=this.mediaHandlerFactory(this,{RTCConstraints:this.RTCConstraints,stunServers:this.stunServers,turnServers:this.turnServers}),this.mediaHandler&&this.mediaHandler.getRemoteStreams&&(this.getRemoteStreams=this.mediaHandler.getRemoteStreams.bind(this.mediaHandler),this.getLocalStreams=this.mediaHandler.getLocalStreams.bind(this.mediaHandler)),b.Utils.optionsOverride(e,"media","mediaConstraints",!0,this.logger,this.ua.configuration.media),this.mediaHint=e.media,this.onInfo=e.onInfo},f.prototype={invite:function(){var a=this;return this.ua.sessions[this.id]=this,this.inviteWithoutSdp?(this.request.body=a.renderbody,this.status=h.STATUS_INVITE_SENT,this.send()):this.mediaHandler.getDescription(a.mediaHint).then(function(b){a.isCanceled||a.status===h.STATUS_TERMINATED||(a.hasOffer=!0,a.request.body=b,a.status=h.STATUS_INVITE_SENT,a.send())},function(){a.status!==h.STATUS_TERMINATED&&(a.failed(null,b.C.causes.WEBRTC_ERROR),a.terminated(null,b.C.causes.WEBRTC_ERROR))}),this},receiveInviteResponse:function(a){var c,d=this,e=a.call_id+a.from_tag+a.to_tag,f=[],g={};if(this.status!==h.STATUS_TERMINATED&&a.method===b.C.INVITE){if(this.dialog&&a.status_code>=200&&a.status_code<=299){if(e!==this.dialog.id.toString()){if(!this.createDialog(a,"UAC",!0))return;return this.earlyDialogs[e].sendRequest(this,b.C.ACK,{body:b.Utils.generateFakeSDP(a.body)}),this.earlyDialogs[e].sendRequest(this,b.C.BYE),void(this.status!==h.STATUS_CONFIRMED&&(this.failed(a,b.C.causes.WEBRTC_ERROR),this.terminated(a,b.C.causes.WEBRTC_ERROR)))}if(this.status===h.STATUS_CONFIRMED)return void this.sendRequest(b.C.ACK,{cseq:a.cseq});if(!this.hasAnswer)return}if(this.dialog&&a.status_code<200){if(-1!==this.dialog.pracked.indexOf(a.getHeader("rseq"))||this.dialog.pracked[this.dialog.pracked.length-1]>=a.getHeader("rseq")&&this.dialog.pracked.length>0)return;if(!this.earlyDialogs[e]&&!this.createDialog(a,"UAC",!0))return;if(-1!==this.earlyDialogs[e].pracked.indexOf(a.getHeader("rseq"))||this.earlyDialogs[e].pracked[this.earlyDialogs[e].pracked.length-1]>=a.getHeader("rseq")&&this.earlyDialogs[e].pracked.length>0)return;return f.push("RAck: "+a.getHeader("rseq")+" "+a.getHeader("cseq")),this.earlyDialogs[e].pracked.push(a.getHeader("rseq")),void this.earlyDialogs[e].sendRequest(this,b.C.PRACK,{extraHeaders:f,body:b.Utils.generateFakeSDP(a.body)})}if(this.isCanceled)return void(a.status_code>=100&&a.status_code<200?(this.request.cancel(this.cancelReason,f),this.canceled(null)):a.status_code>=200&&a.status_code<299?(this.acceptAndTerminate(a),this.emit("bye",this.request)):a.status_code>=300&&(c=b.C.REASON_PHRASE[a.status_code]||b.C.causes.CANCELED,this.rejected(a,c),this.failed(a,c),this.terminated(a,c)));switch(!0){case/^100$/.test(a.status_code):this.received_100=!0,this.emit("progress",a);break;case/^1[0-9]{2}$/.test(a.status_code):if(!a.to_tag){this.logger.warn("1xx response received without to tag");break}if(a.hasHeader("contact")&&!this.createDialog(a,"UAC",!0))break;if(this.status=h.STATUS_1XX_RECEIVED,a.hasHeader("require")&&-1!==a.getHeader("require").indexOf("100rel")){if(this.dialog||!this.earlyDialogs[e])break;if(-1!==this.earlyDialogs[e].pracked.indexOf(a.getHeader("rseq"))||this.earlyDialogs[e].pracked[this.earlyDialogs[e].pracked.length-1]>=a.getHeader("rseq")&&this.earlyDialogs[e].pracked.length>0)return;if(this.mediaHandler.hasDescription(a))if(this.hasOffer){if(!this.createDialog(a,"UAC"))break;this.hasAnswer=!0,this.dialog.pracked.push(a.getHeader("rseq")),this.mediaHandler.setDescription(a).then(function(){f.push("RAck: "+a.getHeader("rseq")+" "+a.getHeader("cseq")),d.sendRequest(b.C.PRACK,{extraHeaders:f,receiveResponse:function(){}}),d.status=h.STATUS_EARLY_MEDIA,d.mute(),d.emit("progress",a)},function(c){d.logger.warn(c),d.acceptAndTerminate(a,488,"Not Acceptable Here"),d.failed(a,b.C.causes.BAD_MEDIA_DESCRIPTION)})}else{var i=this.earlyDialogs[e],j=i.mediaHandler;i.pracked.push(a.getHeader("rseq")),j.setDescription(a).then(j.getDescription.bind(j,d.mediaHint)).then(function(c){f.push("RAck: "+a.getHeader("rseq")+" "+a.getHeader("cseq")),i.sendRequest(d,b.C.PRACK,{extraHeaders:f,body:c}),d.status=h.STATUS_EARLY_MEDIA,d.emit("progress",a)})["catch"](function(c){if(c instanceof b.Exceptions.GetDescriptionError){if(i.pracked.push(a.getHeader("rseq")),d.status===h.STATUS_TERMINATED)return;d.failed(null,b.C.causes.WEBRTC_ERROR),d.terminated(null,b.C.causes.WEBRTC_ERROR)}else i.pracked.splice(i.pracked.indexOf(a.getHeader("rseq")),1),d.logger.warn("invalid description"),d.logger.warn(c)})}else f.push("RAck: "+a.getHeader("rseq")+" "+a.getHeader("cseq")),this.earlyDialogs[e].pracked.push(a.getHeader("rseq")),this.earlyDialogs[e].sendRequest(this,b.C.PRACK,{extraHeaders:f}),this.emit("progress",a)}else this.emit("progress",a);break;case/^2[0-9]{2}$/.test(a.status_code):var k=this.request.cseq+" "+this.request.method;if(k!==a.getHeader("cseq"))break;if(this.status===h.STATUS_EARLY_MEDIA&&this.dialog){this.status=h.STATUS_CONFIRMED,this.unmute(),g={},this.renderbody&&(f.push("Content-Type: "+this.rendertype),g.extraHeaders=f,g.body=this.renderbody),g.cseq=a.cseq,this.sendRequest(b.C.ACK,g),this.accepted(a);break}if(this.dialog)break;if(this.hasOffer)if(this.hasAnswer)this.renderbody&&(f.push("Content-Type: "+d.rendertype),g.extraHeaders=f,g.body=this.renderbody),this.sendRequest(b.C.ACK,g);else{if(!this.mediaHandler.hasDescription(a)){this.acceptAndTerminate(a,400,"Missing session description"),this.failed(a,b.C.causes.BAD_MEDIA_DESCRIPTION);break}if(!this.createDialog(a,"UAC"))break;this.hasAnswer=!0,this.mediaHandler.setDescription(a).then(function(){var c={};d.status=h.STATUS_CONFIRMED,d.unmute(),d.renderbody&&(f.push("Content-Type: "+d.rendertype),c.extraHeaders=f,c.body=d.renderbody),c.cseq=a.cseq,d.sendRequest(b.C.ACK,c),d.accepted(a)},function(c){d.logger.warn(c),d.acceptAndTerminate(a,488,"Not Acceptable Here"),d.failed(a,b.C.causes.BAD_MEDIA_DESCRIPTION)})}else if(this.earlyDialogs[e]&&this.earlyDialogs[e].mediaHandler.localMedia){if(this.hasOffer=!0,this.hasAnswer=!0,this.mediaHandler=this.earlyDialogs[e].mediaHandler,!this.createDialog(a,"UAC"))break;this.status=h.STATUS_CONFIRMED,this.sendRequest(b.C.ACK,{cseq:a.cseq}),this.unmute(),this.accepted(a)}else{if(!this.mediaHandler.hasDescription(a)){this.acceptAndTerminate(a,400,"Missing session description"),this.failed(a,b.C.causes.BAD_MEDIA_DESCRIPTION);break}if(!this.createDialog(a,"UAC"))break;this.hasOffer=!0,this.mediaHandler.setDescription(a).then(this.mediaHandler.getDescription.bind(this.mediaHandler,this.mediaHint)).then(function(c){d.isCanceled||d.status===h.STATUS_TERMINATED||(d.status=h.STATUS_CONFIRMED,d.hasAnswer=!0,d.unmute(),d.sendRequest(b.C.ACK,{body:c,cseq:a.cseq}),d.accepted(a))})["catch"](function(c){c instanceof b.Exceptions.GetDescriptionError?d.logger.warn("there was a problem"):(d.logger.warn("invalid description"),d.logger.warn(c),d.acceptAndTerminate(a,488,"Invalid session description"),d.failed(a,b.C.causes.BAD_MEDIA_DESCRIPTION))})}break;default:c=b.Utils.sipErrorCause(a.status_code),this.rejected(a,c),this.failed(a,c),this.terminated(a,c)}}},cancel:function(a){if(a=a||{},a.extraHeaders=(a.extraHeaders||[]).slice(),this.status===h.STATUS_TERMINATED||this.status===h.STATUS_CONFIRMED)throw new b.Exceptions.InvalidStateError(this.status);this.logger.log("canceling RTCSession");var c=b.Utils.getCancelReason(a.status_code,a.reason_phrase);return this.status===h.STATUS_NULL||this.status===h.STATUS_INVITE_SENT&&!this.received_100?(this.isCanceled=!0,this.cancelReason=c):(this.status===h.STATUS_INVITE_SENT||this.status===h.STATUS_1XX_RECEIVED||this.status===h.STATUS_EARLY_MEDIA)&&this.request.cancel(c,a.extraHeaders),this.canceled()},terminate:function(a){return this.status===h.STATUS_TERMINATED?this:(this.status===h.STATUS_WAITING_FOR_ACK||this.status===h.STATUS_CONFIRMED?this.bye(a):this.cancel(a),this)},receiveRequest:function(a){return a.method===b.C.CANCEL,a.method===b.C.ACK&&this.status===h.STATUS_WAITING_FOR_ACK&&(b.Timers.clearTimeout(this.timers.ackTimer),b.Timers.clearTimeout(this.timers.invite2xxTimer),this.status=h.STATUS_CONFIRMED,this.unmute(),this.accepted()),d.prototype.receiveRequest.apply(this,[a])},onTransportError:function(){this.status!==h.STATUS_CONFIRMED&&this.status!==h.STATUS_TERMINATED&&this.failed(null,b.C.causes.CONNECTION_ERROR)},onRequestTimeout:function(){this.status===h.STATUS_CONFIRMED?this.terminated(null,b.C.causes.REQUEST_TIMEOUT):this.status!==h.STATUS_TERMINATED&&(this.failed(null,b.C.causes.REQUEST_TIMEOUT),this.terminated(null,b.C.causes.REQUEST_TIMEOUT))}},b.InviteClientContext=f}},{"./Session/DTMF":24}],24:[function(a,b,c){"use strict";b.exports=function(a){var b,c={MIN_DURATION:70,MAX_DURATION:6e3,DEFAULT_DURATION:100,MIN_INTER_TONE_GAP:50,DEFAULT_INTER_TONE_GAP:500};return b=function(c,d,e){var f,g;if(void 0===d)throw new TypeError("Not enough arguments");if(this.logger=c.ua.getLogger("sip.invitecontext.dtmf",c.id),this.owner=c,this.direction=null,e=e||{},f=e.duration||null,g=e.interToneGap||null,"string"==typeof d)d=d.toUpperCase();else{if("number"!=typeof d)throw new TypeError("Invalid tone: "+d);d=d.toString()}if(!d.match(/^[0-9A-D#*]$/))throw new TypeError("Invalid tone: "+d);if(this.tone=d,f&&!a.Utils.isDecimal(f))throw new TypeError("Invalid tone duration: "+f);if(f?f<b.C.MIN_DURATION?(this.logger.warn('"duration" value is lower than the minimum allowed, setting it to '+b.C.MIN_DURATION+" milliseconds"),f=b.C.MIN_DURATION):f>b.C.MAX_DURATION?(this.logger.warn('"duration" value is greater than the maximum allowed, setting it to '+b.C.MAX_DURATION+" milliseconds"),f=b.C.MAX_DURATION):f=Math.abs(f):f=b.C.DEFAULT_DURATION,this.duration=f,g&&!a.Utils.isDecimal(g))throw new TypeError("Invalid interToneGap: "+g);g?g<b.C.MIN_INTER_TONE_GAP?(this.logger.warn('"interToneGap" value is lower than the minimum allowed, setting it to '+b.C.MIN_INTER_TONE_GAP+" milliseconds"),g=b.C.MIN_INTER_TONE_GAP):g=Math.abs(g):g=b.C.DEFAULT_INTER_TONE_GAP,this.interToneGap=g},b.prototype=Object.create(a.EventEmitter.prototype),b.prototype.send=function(b){var c,d={};if(this.direction="outgoing",this.owner.status!==a.Session.C.STATUS_CONFIRMED&&this.owner.status!==a.Session.C.STATUS_WAITING_FOR_ACK)throw new a.Exceptions.InvalidStateError(this.owner.status);b=b||{},c=b.extraHeaders?b.extraHeaders.slice():[],d.contentType="application/dtmf-relay",d.body="Signal= "+this.tone+"\r\n",d.body+="Duration= "+this.duration,this.request=this.owner.dialog.sendRequest(this,a.C.INFO,{extraHeaders:c,body:d}),this.owner.emit("dtmf",this.request,this)},b.prototype.receiveResponse=function(b){var c;switch(!0){case/^1[0-9]{2}$/.test(b.status_code):break;case/^2[0-9]{2}$/.test(b.status_code):this.emit("succeeded",{originator:"remote",response:b});break;default:c=a.Utils.sipErrorCause(b.status_code),this.emit("failed",b,c)}},b.prototype.onRequestTimeout=function(){this.emit("failed",null,a.C.causes.REQUEST_TIMEOUT),this.owner.onRequestTimeout()},b.prototype.onTransportError=function(){this.emit("failed",null,a.C.causes.CONNECTION_ERROR),this.owner.onTransportError()},b.prototype.onDialogError=function(b){this.emit("failed",b,a.C.causes.DIALOG_ERROR),this.owner.onDialogError(b)},b.prototype.init_incoming=function(a){this.direction="incoming",this.request=a,a.reply(200),this.tone&&this.duration?this.owner.emit("dtmf",a,this):this.logger.warn("invalid INFO DTMF received, discarded")},b.C=c,b}},{}],25:[function(a,b,c){"use strict";b.exports=function(a){a.Subscription=function(b,c,d,e){if(e=Object.create(e||Object.prototype),this.extraHeaders=e.extraHeaders=(e.extraHeaders||[]).slice(),this.id=null,this.state="init",!d)throw new TypeError("Event necessary to create a subscription.");this.event=d,"number"!=typeof e.expires?(b.logger.warn("expires must be a number. Using default of 3600."),this.expires=3600):this.expires=e.expires,e.extraHeaders.push("Event: "+this.event),e.extraHeaders.push("Expires: "+this.expires),e.body&&(this.body=e.body),this.contact=b.contact.toString(),e.extraHeaders.push("Contact: "+this.contact),e.extraHeaders.push("Allow: "+a.UA.C.ALLOWED_METHODS.toString()),a.Utils.augment(this,a.ClientContext,[b,a.C.SUBSCRIBE,c,e]),this.logger=b.getLogger("sip.subscription"),this.dialog=null,this.timers={N:null,sub_duration:null},this.errorCodes=[404,405,410,416,480,481,482,483,484,485,489,501,604]},a.Subscription.prototype={subscribe:function(){var b=this;return"active"===this.state?(this.refresh(),this):"notify_wait"===this.state?this:(a.Timers.clearTimeout(this.timers.sub_duration),a.Timers.clearTimeout(this.timers.N),this.timers.N=a.Timers.setTimeout(b.timer_fire.bind(b),a.Timers.TIMER_N),this.ua.earlySubscriptions[this.request.call_id+this.request.from.parameters.tag+this.event]=this,this.send(),this.state="notify_wait",this)},refresh:function(){"terminated"!==this.state&&"pending"!==this.state&&"notify_wait"!==this.state&&this.dialog.sendRequest(this,a.C.SUBSCRIBE,{extraHeaders:this.extraHeaders,body:this.body})},receiveResponse:function(b){var c,d=this,e=a.Utils.getReasonPhrase(b.status_code);"notify_wait"===this.state&&b.status_code>=300||"notify_wait"!==this.state&&-1!==this.errorCodes.indexOf(b.status_code)?this.failed(b,null):/^2[0-9]{2}$/.test(b.status_code)?(this.emit("accepted",b,e),c=b.getHeader("Expires"),c&&c<=this.expires?(this.expires=c,this.timers.sub_duration=a.Timers.setTimeout(d.refresh.bind(d),900*c)):c?(this.logger.warn("Expires header in a 200-class response to SUBSCRIBE with a higher value than the one in the request"),this.failed(b,a.C.INVALID_EXPIRES_HEADER)):(this.logger.warn("Expires header missing in a 200-class response to SUBSCRIBE"),this.failed(b,a.C.EXPIRES_HEADER_MISSING))):b.statusCode>300&&(this.emit("failed",b,e),this.emit("rejected",b,e))},unsubscribe:function(){var b=[],c=this;this.state="terminated",b.push("Event: "+this.event),b.push("Expires: 0"),b.push("Contact: "+this.contact),b.push("Allow: "+a.UA.C.ALLOWED_METHODS.toString()),this.receiveResponse=function(){},this.dialog.sendRequest(this,this.method,{extraHeaders:b,body:this.body}),a.Timers.clearTimeout(this.timers.sub_duration),a.Timers.clearTimeout(this.timers.N),this.timers.N=a.Timers.setTimeout(c.timer_fire.bind(c),a.Timers.TIMER_N)},timer_fire:function(){"terminated"===this.state?(this.terminateDialog(),a.Timers.clearTimeout(this.timers.N),a.Timers.clearTimeout(this.timers.sub_duration),delete this.ua.subscriptions[this.id]):"notify_wait"===this.state||"pending"===this.state?this.close():this.refresh()},close:function(){"notify_wait"===this.state?(this.state="terminated",a.Timers.clearTimeout(this.timers.N),a.Timers.clearTimeout(this.timers.sub_duration),this.receiveResponse=function(){},delete this.ua.earlySubscriptions[this.request.call_id+this.request.from.parameters.tag+this.event]):"terminated"!==this.state&&this.unsubscribe()},createConfirmedDialog:function(b,c){var d;return this.terminateDialog(),d=new a.Dialog(this,b,c),d.invite_seqnum=this.request.cseq,d.local_seqnum=this.request.cseq,d.error?!1:(this.dialog=d,!0)},terminateDialog:function(){this.dialog&&(delete this.ua.subscriptions[this.id],this.dialog.terminate(),delete this.dialog)},receiveRequest:function(b){function c(){d.expires&&(a.Timers.clearTimeout(e.timers.sub_duration),d.expires=Math.min(e.expires,Math.max(d.expires,0)),e.timers.sub_duration=a.Timers.setTimeout(e.refresh.bind(e),900*d.expires))}var d,e=this;if(!this.matchEvent(b))return void b.reply(489);if(this.dialog||this.createConfirmedDialog(b,"UAS")&&(this.id=this.dialog.id.toString(),delete this.ua.earlySubscriptions[this.request.call_id+this.request.from.parameters.tag+this.event],this.ua.subscriptions[this.id]=this),d=b.parseHeader("Subscription-State"),b.reply(200,a.C.REASON_200),a.Timers.clearTimeout(this.timers.N),this.emit("notify",{request:b}),"terminated"===this.state)return void("terminated"===d.state&&(this.terminateDialog(),a.Timers.clearTimeout(this.timers.N),a.Timers.clearTimeout(this.timers.sub_duration),delete this.ua.subscriptions[this.id]));switch(d.state){case"active":this.state="active",c();break;case"pending":"notify_wait"===this.state&&c(),this.state="pending";break;case"terminated":if(a.Timers.clearTimeout(this.timers.sub_duration),d.reason)switch(this.logger.log("terminating subscription with reason "+d.reason),d.reason){case"deactivated":case"timeout":return void this.subscribe();case"probation":case"giveup":return void(d.params&&d.params["retry-after"]?this.timers.sub_duration=a.Timers.setTimeout(e.subscribe.bind(e),d.params["retry-after"]):this.subscribe());case"rejected":case"noresource":case"invariant":}this.close()}},failed:function(a,b){return this.close(),this.emit("failed",a,b),this.emit("rejected",a,b),this},onDialogError:function(b){this.failed(b,a.C.causes.DIALOG_ERROR)},matchEvent:function(a){var b;return a.hasHeader("Event")?a.hasHeader("Subscription-State")?(b=a.parseHeader("event").event,this.event!==b?(this.logger.warn("event match failed"),a.reply(481,"Event Match Failed"),!1):!0):(this.logger.warn("missing Subscription-State header"),!1):(this.logger.warn("missing Event header"),!1)}}}},{}],26:[function(a,b,c){"use strict";var d=500,e=4e3,f=5e3;b.exports=function(a){var b={T1:d,T2:e,T4:f,TIMER_B:64*d,TIMER_D:0*d,TIMER_F:64*d,TIMER_H:64*d,TIMER_I:0*d,TIMER_J:0*d,TIMER_K:0*f,TIMER_L:64*d,
39
-TIMER_M:64*d,TIMER_N:64*d,PROVISIONAL_RESPONSE_INTERVAL:6e4};return["setTimeout","clearTimeout","setInterval","clearInterval"].forEach(function(c){b[c]=function(){return a[c].apply(a,arguments)}}),b}},{}],27:[function(a,b,c){"use strict";b.exports=function(a){function b(a,b,c){var d;return d="SIP/2.0/"+(a.ua.configuration.hackViaTcp?"TCP":b.server.scheme),d+=" "+a.ua.configuration.viaHost+";branch="+c,a.ua.configuration.forceRport&&(d+=";rport"),d}var c={STATUS_TRYING:1,STATUS_PROCEEDING:2,STATUS_CALLING:3,STATUS_ACCEPTED:4,STATUS_COMPLETED:5,STATUS_TERMINATED:6,STATUS_CONFIRMED:7,NON_INVITE_CLIENT:"nict",NON_INVITE_SERVER:"nist",INVITE_CLIENT:"ict",INVITE_SERVER:"ist"},d=function(a,d,e){var f;this.type=c.NON_INVITE_CLIENT,this.transport=e,this.id="z9hG4bK"+Math.floor(1e7*Math.random()),this.request_sender=a,this.request=d,this.logger=a.ua.getLogger("sip.transaction.nict",this.id),f=b(a,e,this.id),this.request.setHeader("via",f),this.request_sender.ua.newTransaction(this)};d.prototype=Object.create(a.EventEmitter.prototype),d.prototype.stateChanged=function(a){this.state=a,this.emit("stateChanged")},d.prototype.send=function(){var b=this;this.stateChanged(c.STATUS_TRYING),this.F=a.Timers.setTimeout(b.timer_F.bind(b),a.Timers.TIMER_F),this.transport.send(this.request)||this.onTransportError()},d.prototype.onTransportError=function(){this.logger.log("transport error occurred, deleting non-INVITE client transaction "+this.id),a.Timers.clearTimeout(this.F),a.Timers.clearTimeout(this.K),this.stateChanged(c.STATUS_TERMINATED),this.request_sender.ua.destroyTransaction(this),this.request_sender.onTransportError()},d.prototype.timer_F=function(){this.logger.log("Timer F expired for non-INVITE client transaction "+this.id),this.stateChanged(c.STATUS_TERMINATED),this.request_sender.ua.destroyTransaction(this),this.request_sender.onRequestTimeout()},d.prototype.timer_K=function(){this.stateChanged(c.STATUS_TERMINATED),this.request_sender.ua.destroyTransaction(this)},d.prototype.receiveResponse=function(b){var d=this,e=b.status_code;if(200>e)switch(this.state){case c.STATUS_TRYING:case c.STATUS_PROCEEDING:this.stateChanged(c.STATUS_PROCEEDING),this.request_sender.receiveResponse(b)}else switch(this.state){case c.STATUS_TRYING:case c.STATUS_PROCEEDING:this.stateChanged(c.STATUS_COMPLETED),a.Timers.clearTimeout(this.F),408===e?this.request_sender.onRequestTimeout():this.request_sender.receiveResponse(b),this.K=a.Timers.setTimeout(d.timer_K.bind(d),a.Timers.TIMER_K);break;case c.STATUS_COMPLETED:}};var e=function(a,d,e){var f,g=this;this.type=c.INVITE_CLIENT,this.transport=e,this.id="z9hG4bK"+Math.floor(1e7*Math.random()),this.request_sender=a,this.request=d,this.logger=a.ua.getLogger("sip.transaction.ict",this.id),f=b(a,e,this.id),this.request.setHeader("via",f),this.request_sender.ua.newTransaction(this),this.request.cancel=function(a,b){b=(b||[]).slice();for(var c=b.length,d=null,e=0;c>e;e++)d=(d||"")+b[e].trim()+"\r\n";g.cancel_request(g,a,d)}};e.prototype=Object.create(a.EventEmitter.prototype),e.prototype.stateChanged=function(a){this.state=a,this.emit("stateChanged")},e.prototype.send=function(){var b=this;this.stateChanged(c.STATUS_CALLING),this.B=a.Timers.setTimeout(b.timer_B.bind(b),a.Timers.TIMER_B),this.transport.send(this.request)||this.onTransportError()},e.prototype.onTransportError=function(){this.logger.log("transport error occurred, deleting INVITE client transaction "+this.id),a.Timers.clearTimeout(this.B),a.Timers.clearTimeout(this.D),a.Timers.clearTimeout(this.M),this.stateChanged(c.STATUS_TERMINATED),this.request_sender.ua.destroyTransaction(this),this.state!==c.STATUS_ACCEPTED&&this.request_sender.onTransportError()},e.prototype.timer_M=function(){this.logger.log("Timer M expired for INVITE client transaction "+this.id),this.state===c.STATUS_ACCEPTED&&(a.Timers.clearTimeout(this.B),this.stateChanged(c.STATUS_TERMINATED),this.request_sender.ua.destroyTransaction(this))},e.prototype.timer_B=function(){this.logger.log("Timer B expired for INVITE client transaction "+this.id),this.state===c.STATUS_CALLING&&(this.stateChanged(c.STATUS_TERMINATED),this.request_sender.ua.destroyTransaction(this),this.request_sender.onRequestTimeout())},e.prototype.timer_D=function(){this.logger.log("Timer D expired for INVITE client transaction "+this.id),a.Timers.clearTimeout(this.B),this.stateChanged(c.STATUS_TERMINATED),this.request_sender.ua.destroyTransaction(this)},e.prototype.sendACK=function(b){var c=this;this.ack="ACK "+this.request.ruri+" SIP/2.0\r\n",this.ack+="Via: "+this.request.headers.Via.toString()+"\r\n",this.request.headers.Route&&(this.ack+="Route: "+this.request.headers.Route.toString()+"\r\n"),this.ack+="To: "+b.getHeader("to")+"\r\n",this.ack+="From: "+this.request.headers.From.toString()+"\r\n",this.ack+="Call-ID: "+this.request.headers["Call-ID"].toString()+"\r\n",this.ack+="Content-Length: 0\r\n",this.ack+="CSeq: "+this.request.headers.CSeq.toString().split(" ")[0],this.ack+=" ACK\r\n\r\n",this.D=a.Timers.setTimeout(c.timer_D.bind(c),a.Timers.TIMER_D),this.transport.send(this.ack)},e.prototype.cancel_request=function(b,d,e){var f=b.request;this.cancel=a.C.CANCEL+" "+f.ruri+" SIP/2.0\r\n",this.cancel+="Via: "+f.headers.Via.toString()+"\r\n",this.request.headers.Route&&(this.cancel+="Route: "+f.headers.Route.toString()+"\r\n"),this.cancel+="To: "+f.headers.To.toString()+"\r\n",this.cancel+="From: "+f.headers.From.toString()+"\r\n",this.cancel+="Call-ID: "+f.headers["Call-ID"].toString()+"\r\n",this.cancel+="CSeq: "+f.headers.CSeq.toString().split(" ")[0]+" CANCEL\r\n",d&&(this.cancel+="Reason: "+d+"\r\n"),e&&(this.cancel+=e),this.cancel+="Content-Length: 0\r\n\r\n",this.state===c.STATUS_PROCEEDING&&this.transport.send(this.cancel)},e.prototype.receiveResponse=function(b){var d=this,e=b.status_code;if(e>=100&&199>=e)switch(this.state){case c.STATUS_CALLING:this.stateChanged(c.STATUS_PROCEEDING),this.request_sender.receiveResponse(b),this.cancel&&this.transport.send(this.cancel);break;case c.STATUS_PROCEEDING:this.request_sender.receiveResponse(b)}else if(e>=200&&299>=e)switch(this.state){case c.STATUS_CALLING:case c.STATUS_PROCEEDING:this.stateChanged(c.STATUS_ACCEPTED),this.M=a.Timers.setTimeout(d.timer_M.bind(d),a.Timers.TIMER_M),this.request_sender.receiveResponse(b);break;case c.STATUS_ACCEPTED:this.request_sender.receiveResponse(b)}else if(e>=300&&699>=e)switch(this.state){case c.STATUS_CALLING:case c.STATUS_PROCEEDING:this.stateChanged(c.STATUS_COMPLETED),this.sendACK(b),this.request_sender.receiveResponse(b);break;case c.STATUS_COMPLETED:this.sendACK(b)}};var f=function(a,c,d){var e;this.transport=d,this.id="z9hG4bK"+Math.floor(1e7*Math.random()),this.request_sender=a,this.request=c,this.logger=a.ua.getLogger("sip.transaction.nict",this.id),e=b(a,d,this.id),this.request.setHeader("via",e)};f.prototype=Object.create(a.EventEmitter.prototype),f.prototype.send=function(){this.transport.send(this.request)||this.onTransportError()},f.prototype.onTransportError=function(){this.logger.log("transport error occurred, for an ACK client transaction "+this.id),this.request_sender.onTransportError()};var g=function(a,b){this.type=c.NON_INVITE_SERVER,this.id=a.via_branch,this.request=a,this.transport=a.transport,this.ua=b,this.last_response="",a.server_transaction=this,this.logger=b.getLogger("sip.transaction.nist",this.id),this.state=c.STATUS_TRYING,b.newTransaction(this)};g.prototype=Object.create(a.EventEmitter.prototype),g.prototype.stateChanged=function(a){this.state=a,this.emit("stateChanged")},g.prototype.timer_J=function(){this.logger.log("Timer J expired for non-INVITE server transaction "+this.id),this.stateChanged(c.STATUS_TERMINATED),this.ua.destroyTransaction(this)},g.prototype.onTransportError=function(){this.transportError||(this.transportError=!0,this.logger.log("transport error occurred, deleting non-INVITE server transaction "+this.id),a.Timers.clearTimeout(this.J),this.stateChanged(c.STATUS_TERMINATED),this.ua.destroyTransaction(this))},g.prototype.receiveResponse=function(b,d){var e=this,f=a.Utils.defer();if(100===b)switch(this.state){case c.STATUS_TRYING:this.stateChanged(c.STATUS_PROCEEDING),this.transport.send(d)||this.onTransportError();break;case c.STATUS_PROCEEDING:this.last_response=d,this.transport.send(d)?f.resolve():(this.onTransportError(),f.reject())}else if(b>=200&&699>=b)switch(this.state){case c.STATUS_TRYING:case c.STATUS_PROCEEDING:this.stateChanged(c.STATUS_COMPLETED),this.last_response=d,this.J=a.Timers.setTimeout(e.timer_J.bind(e),a.Timers.TIMER_J),this.transport.send(d)?f.resolve():(this.onTransportError(),f.reject());break;case c.STATUS_COMPLETED:}return f.promise};var h=function(a,b){this.type=c.INVITE_SERVER,this.id=a.via_branch,this.request=a,this.transport=a.transport,this.ua=b,this.last_response="",a.server_transaction=this,this.logger=b.getLogger("sip.transaction.ist",this.id),this.state=c.STATUS_PROCEEDING,b.newTransaction(this),this.resendProvisionalTimer=null,a.reply(100)};h.prototype=Object.create(a.EventEmitter.prototype),h.prototype.stateChanged=function(a){this.state=a,this.emit("stateChanged")},h.prototype.timer_H=function(){this.logger.log("Timer H expired for INVITE server transaction "+this.id),this.state===c.STATUS_COMPLETED&&this.logger.warn("transactions","ACK for INVITE server transaction was never received, call will be terminated"),this.stateChanged(c.STATUS_TERMINATED),this.ua.destroyTransaction(this)},h.prototype.timer_I=function(){this.stateChanged(c.STATUS_TERMINATED),this.ua.destroyTransaction(this)},h.prototype.timer_L=function(){this.logger.log("Timer L expired for INVITE server transaction "+this.id),this.state===c.STATUS_ACCEPTED&&(this.stateChanged(c.STATUS_TERMINATED),this.ua.destroyTransaction(this))},h.prototype.onTransportError=function(){this.transportError||(this.transportError=!0,this.logger.log("transport error occurred, deleting INVITE server transaction "+this.id),null!==this.resendProvisionalTimer&&(a.Timers.clearInterval(this.resendProvisionalTimer),this.resendProvisionalTimer=null),a.Timers.clearTimeout(this.L),a.Timers.clearTimeout(this.H),a.Timers.clearTimeout(this.I),this.stateChanged(c.STATUS_TERMINATED),this.ua.destroyTransaction(this))},h.prototype.resend_provisional=function(){this.transport.send(this.last_response)||this.onTransportError()},h.prototype.receiveResponse=function(b,d){var e=this,f=a.Utils.defer();if(b>=100&&199>=b)switch(this.state){case c.STATUS_PROCEEDING:this.transport.send(d)||this.onTransportError(),this.last_response=d}if(b>100&&199>=b&&this.state===c.STATUS_PROCEEDING)null===this.resendProvisionalTimer&&(this.resendProvisionalTimer=a.Timers.setInterval(e.resend_provisional.bind(e),a.Timers.PROVISIONAL_RESPONSE_INTERVAL));else if(b>=200&&299>=b)switch(this.state){case c.STATUS_PROCEEDING:this.stateChanged(c.STATUS_ACCEPTED),this.last_response=d,this.L=a.Timers.setTimeout(e.timer_L.bind(e),a.Timers.TIMER_L),null!==this.resendProvisionalTimer&&(a.Timers.clearInterval(this.resendProvisionalTimer),this.resendProvisionalTimer=null);case c.STATUS_ACCEPTED:this.transport.send(d)?f.resolve():(this.onTransportError(),f.reject())}else if(b>=300&&699>=b)switch(this.state){case c.STATUS_PROCEEDING:null!==this.resendProvisionalTimer&&(a.Timers.clearInterval(this.resendProvisionalTimer),this.resendProvisionalTimer=null),this.transport.send(d)?(this.stateChanged(c.STATUS_COMPLETED),this.H=a.Timers.setTimeout(e.timer_H.bind(e),a.Timers.TIMER_H),f.resolve()):(this.onTransportError(),f.reject())}return f.promise};var i=function(b,d){var e;switch(d.method){case a.C.INVITE:if(e=b.transactions.ist[d.via_branch]){switch(e.state){case c.STATUS_PROCEEDING:e.transport.send(e.last_response);break;case c.STATUS_ACCEPTED:}return!0}break;case a.C.ACK:if(e=b.transactions.ist[d.via_branch],!e)return!1;if(e.state===c.STATUS_ACCEPTED)return!1;if(e.state===c.STATUS_COMPLETED)return e.stateChanged(c.STATUS_CONFIRMED),e.I=a.Timers.setTimeout(e.timer_I.bind(e),a.Timers.TIMER_I),!0;break;case a.C.CANCEL:return e=b.transactions.ist[d.via_branch],e?(d.reply_sl(200),e.state===c.STATUS_PROCEEDING?!1:!0):(d.reply_sl(481),!0);default:if(e=b.transactions.nist[d.via_branch]){switch(e.state){case c.STATUS_TRYING:break;case c.STATUS_PROCEEDING:case c.STATUS_COMPLETED:e.transport.send(e.last_response)}return!0}}};a.Transactions={C:c,checkTransaction:i,NonInviteClientTransaction:d,InviteClientTransaction:e,AckClientTransaction:f,NonInviteServerTransaction:g,InviteServerTransaction:h}}},{}],28:[function(a,b,c){"use strict";b.exports=function(a,b){function c(a){var b=.8*a;return 1e3*(Math.random()*(a-b)+b)}var d,e={STATUS_READY:0,STATUS_DISCONNECTED:1,STATUS_ERROR:2};return d=function(a,b){this.logger=a.getLogger("sip.transport"),this.ua=a,this.ws=null,this.server=b,this.reconnection_attempts=0,this.closed=!1,this.connected=!1,this.reconnectTimer=null,this.lastTransportError={},this.keepAliveInterval=a.configuration.keepAliveInterval,this.keepAliveTimeout=null,this.keepAliveTimer=null,this.ua.transport=this,this.connect()},d.prototype={send:function(a){var c=a.toString();return this.ws&&this.ws.readyState===b.OPEN?(this.ua.configuration.traceSip===!0&&this.logger.log("sending WebSocket message:\n\n"+c+"\n"),this.ws.send(c),!0):(this.logger.warn("unable to send message, WebSocket is not open"),!1)},sendKeepAlive:function(){return this.keepAliveTimeout?void 0:(this.keepAliveTimeout=a.Timers.setTimeout(function(){this.ua.emit("keepAliveTimeout")}.bind(this),1e4),this.send("\r\n\r\n"))},startSendingKeepAlives:function(){this.keepAliveInterval&&!this.keepAliveTimer&&(this.keepAliveTimer=a.Timers.setTimeout(function(){this.sendKeepAlive(),this.keepAliveTimer=null,this.startSendingKeepAlives()}.bind(this),c(this.keepAliveInterval)))},stopSendingKeepAlives:function(){a.Timers.clearTimeout(this.keepAliveTimer),a.Timers.clearTimeout(this.keepAliveTimeout),this.keepAliveTimer=null,this.keepAliveTimeout=null},disconnect:function(){this.ws&&(a.Timers.clearTimeout(this.reconnectTimer),this.stopSendingKeepAlives(),this.closed=!0,this.logger.log("closing WebSocket "+this.server.ws_uri),this.ws.close(),this.ws=null),null!==this.reconnectTimer&&(a.Timers.clearTimeout(this.reconnectTimer),this.reconnectTimer=null,this.ua.emit("disconnected",{transport:this,code:this.lastTransportError.code,reason:this.lastTransportError.reason}))},connect:function(){var a=this;if(this.ws&&(this.ws.readyState===b.OPEN||this.ws.readyState===b.CONNECTING))return this.logger.log("WebSocket "+this.server.ws_uri+" is already connected"),!1;this.ws&&(this.ws.close(),this.ws=null),this.logger.log("connecting to WebSocket "+this.server.ws_uri),this.ua.onTransportConnecting(this,0===this.reconnection_attempts?1:this.reconnection_attempts);try{this.ws=new b(this.server.ws_uri,"sip")}catch(c){this.logger.warn("error connecting to WebSocket "+this.server.ws_uri+": "+c)}this.ws.binaryType="arraybuffer",this.ws.onopen=function(){a.onOpen()},this.ws.onclose=function(b){a.onClose(b),this.onopen=null,this.onclose=null,this.onmessage=null,this.onerror=null},this.ws.onmessage=function(b){a.onMessage(b)},this.ws.onerror=function(b){a.onError(b)}},onOpen:function(){this.connected=!0,this.logger.log("WebSocket "+this.server.ws_uri+" connected"),null!==this.reconnectTimer&&(a.Timers.clearTimeout(this.reconnectTimer),this.reconnectTimer=null),this.reconnection_attempts=0,this.closed=!1,this.ua.onTransportConnected(this),this.startSendingKeepAlives()},onClose:function(a){var b=this.connected;this.lastTransportError.code=a.code,this.lastTransportError.reason=a.reason,this.stopSendingKeepAlives(),this.reconnection_attempts>0?(this.logger.log("Reconnection attempt "+this.reconnection_attempts+" failed (code: "+a.code+(a.reason?"| reason: "+a.reason:"")+")"),this.reconnect()):(this.connected=!1,this.logger.log("WebSocket disconnected (code: "+a.code+(a.reason?"| reason: "+a.reason:"")+")"),a.wasClean===!1&&this.logger.warn("WebSocket abrupt disconnection"),b===!0?(this.ua.onTransportClosed(this),this.closed?this.ua.emit("disconnected",{transport:this,code:this.lastTransportError.code,reason:this.lastTransportError.reason}):this.reconnect()):this.ua.onTransportError(this))},onMessage:function(b){var c,d,e=b.data;if("\r\n"===e)return a.Timers.clearTimeout(this.keepAliveTimeout),this.keepAliveTimeout=null,void(this.ua.configuration.traceSip===!0&&this.logger.log("received WebSocket message with CRLF Keep Alive response"));if("string"!=typeof e){try{e=String.fromCharCode.apply(null,new Uint8Array(e))}catch(f){return void this.logger.warn("received WebSocket binary message failed to be converted into string, message discarded")}this.ua.configuration.traceSip===!0&&this.logger.log("received WebSocket binary message:\n\n"+e+"\n")}else this.ua.configuration.traceSip===!0&&this.logger.log("received WebSocket text message:\n\n"+e+"\n");if(c=a.Parser.parseMessage(e,this.ua),c&&!(this.ua.status===a.UA.C.STATUS_USER_CLOSED&&c instanceof a.IncomingRequest)&&a.sanityCheck(c,this.ua,this))if(c instanceof a.IncomingRequest)c.transport=this,this.ua.receiveRequest(c);else if(c instanceof a.IncomingResponse)switch(c.method){case a.C.INVITE:d=this.ua.transactions.ict[c.via_branch],d&&d.receiveResponse(c);break;case a.C.ACK:break;default:d=this.ua.transactions.nict[c.via_branch],d&&d.receiveResponse(c)}},onError:function(a){this.logger.warn("WebSocket connection error: "+JSON.stringify(a))},reconnect:function(){var b=this;this.reconnection_attempts+=1,this.reconnection_attempts>this.ua.configuration.wsServerMaxReconnection?(this.logger.warn("maximum reconnection attempts for WebSocket "+this.server.ws_uri),this.ua.onTransportError(this)):1===this.reconnection_attempts?(this.logger.log("Connection to WebSocket "+this.server.ws_uri+" severed, attempting first reconnect"),b.connect()):(this.logger.log("trying to reconnect to WebSocket "+this.server.ws_uri+" (reconnection attempt "+this.reconnection_attempts+")"),this.reconnectTimer=a.Timers.setTimeout(function(){b.connect(),b.reconnectTimer=null},1e3*this.ua.configuration.wsServerReconnectionTimeout))}},d.C=e,d}},{}],29:[function(a,b,c){(function(a){"use strict";b.exports=function(b,c){function d(a){return a instanceof Function?(a.initialize||(a.initialize=function(){return b.Utils.Promise.resolve()}),a):void 0}var e,f={STATUS_INIT:0,STATUS_STARTING:1,STATUS_READY:2,STATUS_USER_CLOSED:3,STATUS_NOT_READY:4,CONFIGURATION_ERROR:1,NETWORK_ERROR:2,ALLOWED_METHODS:["ACK","CANCEL","INVITE","MESSAGE","BYE","OPTIONS","INFO","NOTIFY","REFER"],ACCEPTED_BODY_TYPES:["application/sdp","application/dtmf-relay"],MAX_FORWARDS:70,TAG_LENGTH:10};e=function(a){function c(a){return d.emit.bind(d,a)}var d=this;f.ACCEPTED_BODY_TYPES=f.ACCEPTED_BODY_TYPES.toString(),this.log=new b.LoggerFactory,this.logger=this.getLogger("sip.ua"),this.cache={credentials:{}},this.configuration={},this.dialogs={},this.applicants={},this.data={},this.sessions={},this.subscriptions={},this.earlySubscriptions={},this.transport=null,this.contact=null,this.status=f.STATUS_INIT,this.error=null,this.transactions={nist:{},nict:{},ist:{},ict:{}},this.transportRecoverAttempts=0,this.transportRecoveryTimer=null,Object.defineProperties(this,{transactionsCount:{get:function(){var a,b=["nist","nict","ist","ict"],c=0;for(a in b)c+=Object.keys(this.transactions[b[a]]).length;return c}},nictTransactionsCount:{get:function(){return Object.keys(this.transactions.nict).length}},nistTransactionsCount:{get:function(){return Object.keys(this.transactions.nist).length}},ictTransactionsCount:{get:function(){return Object.keys(this.transactions.ict).length}},istTransactionsCount:{get:function(){return Object.keys(this.transactions.ist).length}}}),void 0===a?a={}:("string"==typeof a||a instanceof String)&&(a={uri:a}),a.log&&(a.log.hasOwnProperty("builtinEnabled")&&(this.log.builtinEnabled=a.log.builtinEnabled),a.log.hasOwnProperty("level")&&(this.log.level=a.log.level),a.log.hasOwnProperty("connector")&&(this.log.connector=a.log.connector));try{this.loadConfig(a)}catch(e){throw this.status=f.STATUS_NOT_READY,this.error=f.CONFIGURATION_ERROR,e}this.registerContext=new b.RegisterContext(this),this.registerContext.on("failed",c("registrationFailed")),this.registerContext.on("registered",c("registered")),this.registerContext.on("unregistered",c("unregistered")),this.configuration.autostart&&this.start()},e.prototype=Object.create(b.EventEmitter.prototype),e.prototype.register=function(a){return this.configuration.register=!0,this.registerContext.register(a),this},e.prototype.unregister=function(a){this.configuration.register=!1;var b=this.registerContext;return this.afterConnected(b.unregister.bind(b,a)),this},e.prototype.isRegistered=function(){return this.registerContext.registered},e.prototype.isConnected=function(){return this.transport?this.transport.connected:!1},e.prototype.afterConnected=function(a){this.isConnected()?a():this.once("connected",a)},e.prototype.invite=function(a,c){var d=new b.InviteClientContext(this,a,c);return this.afterConnected(d.invite.bind(d)),this.emit("inviteSent",d),d},e.prototype.subscribe=function(a,c,d){var e=new b.Subscription(this,a,c,d);return this.afterConnected(e.subscribe.bind(e)),e},e.prototype.message=function(a,c,d){if(void 0===c)throw new TypeError("Not enough arguments");return d=Object.create(d||Object.prototype),d.contentType||(d.contentType="text/plain"),d.body=c,this.request(b.C.MESSAGE,a,d)},e.prototype.request=function(a,c,d){var e=new b.ClientContext(this,a,c,d);return this.afterConnected(e.send.bind(e)),e},e.prototype.stop=function(){function d(){0===i.nistTransactionsCount&&0===i.nictTransactionsCount&&(i.removeListener("transactionDestroyed",d),i.transport.disconnect())}var e,g,h,i=this;if(this.logger.log("user requested closure..."),this.status===f.STATUS_USER_CLOSED)return this.logger.warn("UA already closed"),this;b.Timers.clearTimeout(this.transportRecoveryTimer),this.logger.log("closing registerContext"),this.registerContext.close();for(e in this.sessions)this.logger.log("closing session "+e),this.sessions[e].terminate();for(g in this.subscriptions)this.logger.log("unsubscribing from subscription "+g),this.subscriptions[g].close();for(g in this.earlySubscriptions)this.logger.log("unsubscribing from early subscription "+g),this.earlySubscriptions[g].close();for(h in this.applicants)this.applicants[h].close();return this.status=f.STATUS_USER_CLOSED,0===this.nistTransactionsCount&&0===this.nictTransactionsCount?this.transport.disconnect():this.on("transactionDestroyed",d),"function"==typeof c.removeEventListener&&(a.chrome&&a.chrome.app&&a.chrome.app.runtime||c.removeEventListener("unload",this.environListener)),this},e.prototype.start=function(){var d;return this.logger.log("user requested startup..."),this.status===f.STATUS_INIT?(d=this.getNextWsServer(),this.status=f.STATUS_STARTING,new b.Transport(this,d)):this.status===f.STATUS_USER_CLOSED?(this.logger.log("resuming"),this.status=f.STATUS_READY,this.transport.connect()):this.status===f.STATUS_STARTING?this.logger.log("UA is in STARTING status, not opening new connection"):this.status===f.STATUS_READY?this.logger.log("UA is in READY status, not resuming"):this.logger.error("Connection is down. Auto-Recovery system is trying to connect"),this.configuration.autostop&&"function"==typeof c.addEventListener&&(a.chrome&&a.chrome.app&&a.chrome.app.runtime||(this.environListener=this.stop.bind(this),c.addEventListener("unload",this.environListener))),this},e.prototype.normalizeTarget=function(a){return b.Utils.normalizeTarget(a,this.configuration.hostportParams)},e.prototype.saveCredentials=function(a){return this.cache.credentials[a.realm]=this.cache.credentials[a.realm]||{},this.cache.credentials[a.realm][a.uri]=a,this},e.prototype.getCredentials=function(a){var b,c;return b=a.ruri.host,this.cache.credentials[b]&&this.cache.credentials[b][a.ruri]&&(c=this.cache.credentials[b][a.ruri],c.method=a.method),c},e.prototype.getLogger=function(a,b){return this.log.getLogger(a,b)},e.prototype.onTransportClosed=function(a){var c,d,e,f=["nict","ict","nist","ist"];for(a.server.status=b.Transport.C.STATUS_DISCONNECTED,this.logger.log("connection state set to "+b.Transport.C.STATUS_DISCONNECTED),e=f.length,c=0;e>c;c++)for(d in this.transactions[f[c]])this.transactions[f[c]][d].onTransportError();this.contact.pub_gruu||this.closeSessionsOnTransportError()},e.prototype.onTransportError=function(a){var c;this.logger.log("transport "+a.server.ws_uri+" failed | connection state set to "+b.Transport.C.STATUS_ERROR),a.server.status=b.Transport.C.STATUS_ERROR,this.emit("disconnected",{transport:a}),this.status!==f.STATUS_USER_CLOSED&&(c=this.getNextWsServer(),c?new b.Transport(this,c):(this.closeSessionsOnTransportError(),this.error&&this.error===f.NETWORK_ERROR||(this.status=f.STATUS_NOT_READY,this.error=f.NETWORK_ERROR),this.recoverTransport()))},e.prototype.onTransportConnected=function(a){this.transport=a,this.transportRecoverAttempts=0,a.server.status=b.Transport.C.STATUS_READY,this.logger.log("connection state set to "+b.Transport.C.STATUS_READY),this.status!==f.STATUS_USER_CLOSED&&(this.status=f.STATUS_READY,this.error=null,this.configuration.register&&this.configuration.authenticationFactory.initialize().then(function(){this.registerContext.onTransportConnected()}.bind(this)),this.emit("connected",{transport:a}))},e.prototype.onTransportConnecting=function(a,b){this.emit("connecting",{transport:a,attempts:b})},e.prototype.newTransaction=function(a){this.transactions[a.type][a.id]=a,this.emit("newTransaction",{transaction:a})},e.prototype.destroyTransaction=function(a){delete this.transactions[a.type][a.id],this.emit("transactionDestroyed",{transaction:a})},e.prototype.receiveRequest=function(a){function c(b){return b&&b.user===a.ruri.user}var d,e,g,h,i,j,k,l=a.method,m=this;if(!(c(this.configuration.uri)||c(this.contact.uri)||c(this.contact.pub_gruu)||c(this.contact.temp_gruu)))return this.logger.warn("Request-URI does not point to us"),void(a.method!==b.C.ACK&&a.reply_sl(404));if(a.ruri.scheme===b.C.SIPS)return void a.reply_sl(416);if(!b.Transactions.checkTransaction(this,a))if(l===b.C.OPTIONS?(new b.Transactions.NonInviteServerTransaction(a,this),a.reply(200,null,["Allow: "+b.UA.C.ALLOWED_METHODS.toString(),"Accept: "+f.ACCEPTED_BODY_TYPES])):l===b.C.MESSAGE?(g=new b.ServerContext(this,a),g.body=a.body,g.content_type=a.getHeader("Content-Type")||"text/plain",a.reply(200,null),this.emit("message",g)):l!==b.C.INVITE&&l!==b.C.ACK&&(i=new b.ServerContext(this,a)),a.to_tag)d=this.findDialog(a),d?(l===b.C.INVITE&&new b.Transactions.InviteServerTransaction(a,this),d.receiveRequest(a)):l===b.C.NOTIFY?(e=this.findSession(a),h=this.findEarlySubscription(a),e?e.receiveRequest(a):h?h.receiveRequest(a):(this.logger.warn("received NOTIFY request for a non existent session or subscription"),a.reply(481,"Subscription does not exist"))):l!==b.C.ACK&&a.reply(481);else switch(l){case b.C.INVITE:if(j=this.configuration.replaces!==b.C.supported.UNSUPPORTED&&a.parseHeader("replaces")){if(k=this.dialogs[j.call_id+j.replaces_to_tag+j.replaces_from_tag],!k)return void a.reply_sl(481,null);if(k.owner.status===b.Session.C.STATUS_TERMINATED)return void a.reply_sl(603,null);if(k.state===b.Dialog.C.STATUS_CONFIRMED&&j.early_only)return void a.reply_sl(486,null)}var n=this.configuration.mediaHandlerFactory.isSupported;!n||n()?(e=new b.InviteServerContext(this,a),e.replacee=k&&k.owner,e.on("invite",function(){m.emit("invite",this)})):(this.logger.warn("INVITE received but WebRTC is not supported"),a.reply(488));break;case b.C.BYE:a.reply(481);break;case b.C.CANCEL:e=this.findSession(a),e?e.receiveRequest(a):this.logger.warn("received CANCEL request for a non existent session");break;case b.C.ACK:break;case b.C.NOTIFY:this.configuration.allowLegacyNotifications&&this.listeners("notify").length>0?(a.reply(200,null),m.emit("notify",{request:a})):a.reply(481,"Subscription does not exist");break;default:a.reply(405)}},e.prototype.findSession=function(a){return this.sessions[a.call_id+a.from_tag]||this.sessions[a.call_id+a.to_tag]||null},e.prototype.findDialog=function(a){return this.dialogs[a.call_id+a.from_tag+a.to_tag]||this.dialogs[a.call_id+a.to_tag+a.from_tag]||null},e.prototype.findEarlySubscription=function(a){return this.earlySubscriptions[a.call_id+a.to_tag+a.getHeader("event")]||null},e.prototype.getNextWsServer=function(){var a,c,d,e=[];for(c=this.configuration.wsServers.length,a=0;c>a;a++)d=this.configuration.wsServers[a],d.status!==b.Transport.C.STATUS_ERROR&&(0===e.length?e.push(d):d.weight>e[0].weight?e=[d]:d.weight===e[0].weight&&e.push(d));return a=Math.floor(Math.random()*e.length),e[a]},e.prototype.closeSessionsOnTransportError=function(){var a;for(a in this.sessions)this.sessions[a].onTransportError();this.registerContext.onTransportClosed()},e.prototype.recoverTransport=function(a){var c,d,e,f,g,h;for(a=a||this,g=a.transportRecoverAttempts,d=a.configuration.wsServers.length,c=0;d>c;c++)a.configuration.wsServers[c].status=0;h=a.getNextWsServer(),e=Math.floor(Math.random()*Math.pow(2,g)+1),f=e*a.configuration.connectionRecoveryMinInterval,f>a.configuration.connectionRecoveryMaxInterval&&(this.logger.log("time for next connection attempt exceeds connectionRecoveryMaxInterval, resetting counter"),f=a.configuration.connectionRecoveryMinInterval,g=0),this.logger.log("next connection attempt in "+f+" seconds"),this.transportRecoveryTimer=b.Timers.setTimeout(function(){a.transportRecoverAttempts=g+1,new b.Transport(a,h)},1e3*f)},e.prototype.loadConfig=function(a){function c(b,c){var d=b.replace(/([a-z][A-Z])/g,function(a){return a[0]+"_"+a[1].toLowerCase()});if(b!==d){var e=a.hasOwnProperty(b);a.hasOwnProperty(d)&&(c.warn(d+" is deprecated, please use "+b),e&&c.warn(b+" overriding "+d)),a[b]=e?a[b]:a[d]}}var e,f,g,h,i,j={viaHost:b.Utils.createRandomToken(12)+".invalid",uri:new b.URI("sip","anonymous."+b.Utils.createRandomToken(6),"anonymous.invalid",null,null),wsServers:[{scheme:"WSS",sip_uri:"<sip:edge.sip.onsip.com;transport=ws;lr>",status:0,weight:0,ws_uri:"wss://edge.sip.onsip.com"}],custom:{},displayName:"",password:null,registerExpires:600,register:!0,registrarServer:null,wsServerMaxReconnection:3,wsServerReconnectionTimeout:4,connectionRecoveryMinInterval:2,connectionRecoveryMaxInterval:30,keepAliveInterval:0,extraSupported:[],usePreloadedRoute:!1,userAgentString:b.C.USER_AGENT,iceCheckingTimeout:5e3,noAnswerTimeout:60,stunServers:["stun:stun.l.google.com:19302"],turnServers:[],traceSip:!1,hackViaTcp:!1,hackIpInContact:!1,hackWssInTransport:!1,hackAllowUnregisteredOptionTags:!1,hackCleanJitsiSdpImageattr:!1,hackStripTcp:!1,contactTransport:"ws",forceRport:!1,autostart:!0,autostop:!0,rel100:b.C.supported.UNSUPPORTED,replaces:b.C.supported.UNSUPPORTED,mediaHandlerFactory:b.WebRTC.MediaHandler.defaultFactory,authenticationFactory:d(function(a){return new b.DigestAuthentication(a)}),allowLegacyNotifications:!1},k=this.getConfigurationCheck();for(e in k.mandatory){if(c(e,this.logger),!a.hasOwnProperty(e))throw new b.Exceptions.ConfigurationError(e);if(f=a[e],g=k.mandatory[e](f),void 0===g)throw new b.Exceptions.ConfigurationError(e,f);j[e]=g}b.Utils.optionsOverride(a,"rel100","reliable",!0,this.logger,b.C.supported.UNSUPPORTED);var l=["stunServers","turnServers"];for(e in k.optional)if(c(e,this.logger),a.hasOwnProperty(e)){if(f=a[e],f instanceof Array&&0===f.length&&l.indexOf(e)<0)continue;if(null===f||""===f||void 0===f)continue;if("number"==typeof f&&isNaN(f))continue;if(g=k.optional[e](f),void 0===g)throw new b.Exceptions.ConfigurationError(e,f);j[e]=g}if(j.connectionRecoveryMaxInterval<j.connectionRecoveryMinInterval)throw new b.Exceptions.ConfigurationError("connectionRecoveryMaxInterval",j.connectionRecoveryMaxInterval);0===j.displayName&&(j.displayName="0"),j.instanceId||(j.instanceId=b.Utils.newUUID()),j.sipjsId=b.Utils.createRandomToken(5),h=j.uri.clone(),h.user=null,j.hostportParams=h.toRaw().replace(/^sip:/i,""),j.authorizationUser||(j.authorizationUser=j.uri.user),
40
-j.registrarServer||(i=j.uri.clone(),i.user=null,j.registrarServer=i),j.noAnswerTimeout=1e3*j.noAnswerTimeout,j.hackIpInContact&&("boolean"==typeof j.hackIpInContact?j.viaHost=b.Utils.getRandomTestNetIP():"string"==typeof j.hackIpInContact&&(j.viaHost=j.hackIpInContact)),j.hackWssInTransport&&(j.contactTransport="wss"),this.contact={pub_gruu:null,temp_gruu:null,uri:new b.URI("sip",b.Utils.createRandomToken(8),j.viaHost,null,{transport:j.contactTransport}),toString:function(a){a=a||{};var b=a.anonymous||null,c=a.outbound||null,d="<";return d+=b?(this.temp_gruu||"sip:anonymous@anonymous.invalid;transport="+j.contactTransport).toString():(this.pub_gruu||this.uri).toString(),c&&(d+=";ob"),d+=">"}},b.Utils.optionsOverride(j,"media","mediaConstraints",!0,this.logger);var m={};for(e in j)m[e]={value:j[e],writable:"register"===e||"custom"===e,configurable:!1};Object.defineProperties(this.configuration,m),this.logger.log("configuration parameters after validation:");for(e in j)switch(e){case"uri":case"registrarServer":case"mediaHandlerFactory":this.logger.log("\xb7 "+e+": "+j[e]);break;case"password":this.logger.log("\xb7 "+e+": NOT SHOWN");break;default:this.logger.log("\xb7 "+e+": "+JSON.stringify(j[e]))}},e.prototype.getConfigurationCheck=function(){return{mandatory:{},optional:{uri:function(a){var c;return/^sip:/i.test(a)||(a=b.C.SIP+":"+a),c=b.URI.parse(a),c&&c.user?c:void 0},wsServers:function(a){var c,d,e;if("string"==typeof a)a=[{ws_uri:a}];else{if(!(a instanceof Array))return;for(d=a.length,c=0;d>c;c++)"string"==typeof a[c]&&(a[c]={ws_uri:a[c]})}if(0===a.length)return!1;for(d=a.length,c=0;d>c;c++){if(!a[c].ws_uri)return;if(a[c].weight&&!Number(a[c].weight))return;if(e=b.Grammar.parse(a[c].ws_uri,"absoluteURI"),-1===e)return;if(["wss","ws","udp"].indexOf(e.scheme)<0)return;a[c].sip_uri="<sip:"+e.host+(e.port?":"+e.port:"")+";transport="+e.scheme.replace(/^wss$/i,"ws")+";lr>",a[c].weight||(a[c].weight=0),a[c].status=0,a[c].scheme=e.scheme.toUpperCase()}return a},authorizationUser:function(a){return-1===b.Grammar.parse('"'+a+'"',"quoted_string")?void 0:a},connectionRecoveryMaxInterval:function(a){var c;return b.Utils.isDecimal(a)&&(c=Number(a),c>0)?c:void 0},connectionRecoveryMinInterval:function(a){var c;return b.Utils.isDecimal(a)&&(c=Number(a),c>0)?c:void 0},displayName:function(a){return-1===b.Grammar.parse('"'+a+'"',"displayName")?void 0:a},hackViaTcp:function(a){return"boolean"==typeof a?a:void 0},hackIpInContact:function(a){return"boolean"==typeof a?a:"string"==typeof a&&-1!==b.Grammar.parse(a,"host")?a:void 0},iceCheckingTimeout:function(a){return b.Utils.isDecimal(a)?Math.max(500,a):void 0},hackWssInTransport:function(a){return"boolean"==typeof a?a:void 0},hackAllowUnregisteredOptionTags:function(a){return"boolean"==typeof a?a:void 0},hackCleanJitsiSdpImageattr:function(a){return"boolean"==typeof a?a:void 0},hackStripTcp:function(a){return"boolean"==typeof a?a:void 0},contactTransport:function(a){return"string"==typeof a?a:void 0},forceRport:function(a){return"boolean"==typeof a?a:void 0},instanceId:function(a){return"string"==typeof a?(/^uuid:/i.test(a)&&(a=a.substr(5)),-1===b.Grammar.parse(a,"uuid")?void 0:a):void 0},keepAliveInterval:function(a){var c;return b.Utils.isDecimal(a)&&(c=Number(a),c>0)?c:void 0},extraSupported:function(a){var b,c;if(a instanceof Array){for(c=a.length,b=0;c>b;b++)if("string"!=typeof a[b])return;return a}},noAnswerTimeout:function(a){var c;return b.Utils.isDecimal(a)&&(c=Number(a),c>0)?c:void 0},password:function(a){return String(a)},rel100:function(a){return a===b.C.supported.REQUIRED?b.C.supported.REQUIRED:a===b.C.supported.SUPPORTED?b.C.supported.SUPPORTED:b.C.supported.UNSUPPORTED},replaces:function(a){return a===b.C.supported.REQUIRED?b.C.supported.REQUIRED:a===b.C.supported.SUPPORTED?b.C.supported.SUPPORTED:b.C.supported.UNSUPPORTED},register:function(a){return"boolean"==typeof a?a:void 0},registerExpires:function(a){var c;return b.Utils.isDecimal(a)&&(c=Number(a),c>0)?c:void 0},registrarServer:function(a){var c;if("string"==typeof a)return/^sip:/i.test(a)||(a=b.C.SIP+":"+a),c=b.URI.parse(a),c?c.user?void 0:c:void 0},stunServers:function(a){var c,d,e;if("string"==typeof a)a=[a];else if(!(a instanceof Array))return;for(d=a.length,c=0;d>c;c++){if(e=a[c],/^stuns?:/.test(e)||(e="stun:"+e),-1===b.Grammar.parse(e,"stun_URI"))return;a[c]=e}return a},traceSip:function(a){return"boolean"==typeof a?a:void 0},turnServers:function(a){var c,d,e,f,g,h;for(a instanceof Array||(a=[a]),e=a.length,c=0;e>c;c++){if(f=a[c],f.server&&(f.urls=[f.server]),!f.urls)return;for(f.urls instanceof Array?g=f.urls.length:(f.urls=[f.urls],g=1),d=0;g>d;d++)if(h=f.urls[d],/^turns?:/.test(h)||(h="turn:"+h),-1===b.Grammar.parse(h,"turn_URI"))return}return a},rtcpMuxPolicy:function(a){return"string"==typeof a?a:void 0},userAgentString:function(a){return"string"==typeof a?a:void 0},usePreloadedRoute:function(a){return"boolean"==typeof a?a:void 0},wsServerMaxReconnection:function(a){var c;return b.Utils.isDecimal(a)&&(c=Number(a),c>0)?c:void 0},wsServerReconnectionTimeout:function(a){var c;return b.Utils.isDecimal(a)&&(c=Number(a),c>0)?c:void 0},autostart:function(a){return"boolean"==typeof a?a:void 0},autostop:function(a){return"boolean"==typeof a?a:void 0},mediaHandlerFactory:function(a){if(a instanceof Function){var c=function(){function c(a){var c=d[a];if(c.length>1){var e="getDescription"===a;d[a]=b.Utils.promisify(d,a,e)}}var d=a.apply(this,arguments);return c("getDescription"),c("setDescription"),d};return c.isSupported=a.isSupported,c}},authenticationFactory:d,allowLegacyNotifications:function(a){return"boolean"==typeof a?a:void 0},custom:function(a){return"object"==typeof a?a:void 0}}}},e.C=f,b.UA=e}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],30:[function(a,b,c){"use strict";b.exports=function(a){var b;b=function(b,c,d,e,f,g){var h,i,j,k;if(!d)throw new TypeError('missing or invalid "host" parameter');b=b||a.C.SIP,this.parameters={},this.headers={};for(h in f)this.setParam(h,f[h]);for(i in g)this.setHeader(i,g[i]);j={scheme:b,user:c,host:d,port:e},k={scheme:b.toLowerCase(),user:c,host:d.toLowerCase(),port:e},Object.defineProperties(this,{_normal:{get:function(){return k}},_raw:{get:function(){return j}},scheme:{get:function(){return k.scheme},set:function(a){j.scheme=a,k.scheme=a.toLowerCase()}},user:{get:function(){return k.user},set:function(a){k.user=j.user=a}},host:{get:function(){return k.host},set:function(a){j.host=a,k.host=a.toLowerCase()}},aor:{get:function(){return k.user+"@"+k.host}},port:{get:function(){return k.port},set:function(a){k.port=j.port=0===a?a:parseInt(a,10)||null}}})},b.prototype={setParam:function(a,b){a&&(this.parameters[a.toLowerCase()]="undefined"==typeof b||null===b?null:b.toString().toLowerCase())},getParam:function(a){return a?this.parameters[a.toLowerCase()]:void 0},hasParam:function(a){return a?this.parameters.hasOwnProperty(a.toLowerCase())&&!0||!1:void 0},deleteParam:function(a){var b;return a=a.toLowerCase(),this.parameters.hasOwnProperty(a)?(b=this.parameters[a],delete this.parameters[a],b):void 0},clearParams:function(){this.parameters={}},setHeader:function(b,c){this.headers[a.Utils.headerize(b)]=c instanceof Array?c:[c]},getHeader:function(b){return b?this.headers[a.Utils.headerize(b)]:void 0},hasHeader:function(b){return b?this.headers.hasOwnProperty(a.Utils.headerize(b))&&!0||!1:void 0},deleteHeader:function(b){var c;return b=a.Utils.headerize(b),this.headers.hasOwnProperty(b)?(c=this.headers[b],delete this.headers[b],c):void 0},clearHeaders:function(){this.headers={}},clone:function(){return new b(this._raw.scheme,this._raw.user,this._raw.host,this._raw.port,JSON.parse(JSON.stringify(this.parameters)),JSON.parse(JSON.stringify(this.headers)))},toRaw:function(){return this._toString(this._raw)},toString:function(){return this._toString(this._normal)},_toString:function(b){var c,d,e,f,g=[];f=b.scheme+":",b.scheme.toLowerCase().match("^sips?$")||(f+="//"),b.user&&(f+=a.Utils.escapeUser(b.user)+"@"),f+=b.host,(b.port||0===b.port)&&(f+=":"+b.port);for(d in this.parameters)f+=";"+d,null!==this.parameters[d]&&(f+="="+this.parameters[d]);for(c in this.headers)for(e in this.headers[c])g.push(c+"="+this.headers[c][e]);return g.length>0&&(f+="?"+g.join("&")),f}},b.parse=function(b){return b=a.Grammar.parse(b,"SIP_URI"),-1!==b?b:void 0},a.URI=b}},{}],31:[function(a,b,c){"use strict";b.exports=function(a,b){var c;c={Promise:b.Promise,defer:function(){var a={};return a.promise=new c.Promise(function(b,c){a.resolve=b,a.reject=c}),a},promisify:function(a,b,d){var e=a[b];return function(b,f,g){return new c.Promise(function(c,f){var g=[b,c,f];d&&(g=[c,f,b]),e.apply(a,g)}).then(f,g)}},augment:function(a,b,c,d){var e,f;f=b.prototype;for(e in f)(d||void 0===a[e])&&(a[e]=f[e]);b.apply(a,c)},optionsOverride:function(a,b,c,d,e,f){d&&a[c]&&e.warn(c+" is deprecated, please use "+b+" instead"),a[b]&&a[c]&&e.warn(b+" overriding "+c),a[b]=a[b]||a[c]||f},str_utf8_length:function(a){return encodeURIComponent(a).replace(/%[A-F\d]{2}/g,"U").length},generateFakeSDP:function(a){if(a){var b=a.indexOf("o="),c=a.indexOf("\r\n",b);return"v=0\r\n"+a.slice(b,c)+"\r\ns=-\r\nt=0 0\r\nc=IN IP4 0.0.0.0"}},isFunction:function(a){return void 0!==a?"[object Function]"===Object.prototype.toString.call(a):!1},isDecimal:function(a){return!isNaN(a)&&parseFloat(a)===parseInt(a,10)},createRandomToken:function(a,b){var c,d,e="";for(b=b||32,c=0;a>c;c++)d=Math.random()*b|0,e+=d.toString(b);return e},newTag:function(){return a.Utils.createRandomToken(a.UA.C.TAG_LENGTH)},newUUID:function(){var a="xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(a){var b=16*Math.random()|0,c="x"===a?b:3&b|8;return c.toString(16)});return a},hostType:function(b){return b?(b=a.Grammar.parse(b,"host"),-1!==b?b.host_type:void 0):void 0},normalizeTarget:function(b,c){var d,e,f,g;if(b){if(b instanceof a.URI)return b;if("string"==typeof b){switch(e=b.split("@"),e.length){case 1:if(!c)return;f=b,g=c;break;case 2:f=e[0],g=e[1];break;default:f=e.slice(0,e.length-1).join("@"),g=e[e.length-1]}return f=f.replace(/^(sips?|tel):/i,""),/^[\-\.\(\)]*\+?[0-9\-\.\(\)]+$/.test(f)&&(f=f.replace(/[\-\.\(\)]/g,"")),b=a.C.SIP+":"+a.Utils.escapeUser(f)+"@"+g,(d=a.URI.parse(b))?d:void 0}}else;},escapeUser:function(a){return encodeURIComponent(decodeURIComponent(a)).replace(/%3A/gi,":").replace(/%2B/gi,"+").replace(/%3F/gi,"?").replace(/%2F/gi,"/")},headerize:function(a){var b,c={"Call-Id":"Call-ID",Cseq:"CSeq","Min-Se":"Min-SE",Rack:"RAck",Rseq:"RSeq","Www-Authenticate":"WWW-Authenticate"},d=a.toLowerCase().replace(/_/g,"-").split("-"),e="",f=d.length;for(b=0;f>b;b++)0!==b&&(e+="-"),e+=d[b].charAt(0).toUpperCase()+d[b].substring(1);return c[e]&&(e=c[e]),e},sipErrorCause:function(b){var c;for(c in a.C.SIP_ERROR_CAUSES)if(-1!==a.C.SIP_ERROR_CAUSES[c].indexOf(b))return a.C.causes[c];return a.C.causes.SIP_FAILURE_CODE},getReasonPhrase:function(b,c){return c||a.C.REASON_PHRASE[b]||""},getReasonHeaderValue:function(b,c){return c=a.Utils.getReasonPhrase(b,c),"SIP ;cause="+b+' ;text="'+c+'"'},getCancelReason:function(b,c){if(b&&200>b||b>699)throw new TypeError("Invalid status_code: "+b);return b?a.Utils.getReasonHeaderValue(b,c):void 0},buildStatusLine:function(a,b){if(a=a||null,b=b||null,!a||100>a||a>699)throw new TypeError("Invalid status_code: "+a);if(b&&"string"!=typeof b&&!(b instanceof String))throw new TypeError("Invalid reason_phrase: "+b);return b=c.getReasonPhrase(a,b),"SIP/2.0 "+a+" "+b+"\r\n"},getRandomTestNetIP:function(){function a(a,b){return Math.floor(Math.random()*(b-a+1)+a)}return"192.0.2."+a(1,254)},calculateMD5:function(a){function b(a,b){return a<<b|a>>>32-b}function c(a,b){var c,d,e,f,g;return e=2147483648&a,f=2147483648&b,c=1073741824&a,d=1073741824&b,g=(1073741823&a)+(1073741823&b),c&d?2147483648^g^e^f:c|d?1073741824&g?3221225472^g^e^f:1073741824^g^e^f:g^e^f}function d(a,b,c){return a&b|~a&c}function e(a,b,c){return a&c|b&~c}function f(a,b,c){return a^b^c}function g(a,b,c){return b^(a|~c)}function h(a,e,f,g,h,i,j){return a=c(a,c(c(d(e,f,g),h),j)),c(b(a,i),e)}function i(a,d,f,g,h,i,j){return a=c(a,c(c(e(d,f,g),h),j)),c(b(a,i),d)}function j(a,d,e,g,h,i,j){return a=c(a,c(c(f(d,e,g),h),j)),c(b(a,i),d)}function k(a,d,e,f,h,i,j){return a=c(a,c(c(g(d,e,f),h),j)),c(b(a,i),d)}function l(a){for(var b,c=a.length,d=c+8,e=(d-d%64)/64,f=16*(e+1),g=Array(f-1),h=0,i=0;c>i;)b=(i-i%4)/4,h=i%4*8,g[b]=g[b]|a.charCodeAt(i)<<h,i++;return b=(i-i%4)/4,h=i%4*8,g[b]=g[b]|128<<h,g[f-2]=c<<3,g[f-1]=c>>>29,g}function m(a){var b,c,d="",e="";for(c=0;3>=c;c++)b=a>>>8*c&255,e="0"+b.toString(16),d+=e.substr(e.length-2,2);return d}function n(a){a=a.replace(/\r\n/g,"\n");for(var b="",c=0;c<a.length;c++){var d=a.charCodeAt(c);128>d?b+=String.fromCharCode(d):d>127&&2048>d?(b+=String.fromCharCode(d>>6|192),b+=String.fromCharCode(63&d|128)):(b+=String.fromCharCode(d>>12|224),b+=String.fromCharCode(d>>6&63|128),b+=String.fromCharCode(63&d|128))}return b}var o,p,q,r,s,t,u,v,w,x=[],y=7,z=12,A=17,B=22,C=5,D=9,E=14,F=20,G=4,H=11,I=16,J=23,K=6,L=10,M=15,N=21;for(a=n(a),x=l(a),t=1732584193,u=4023233417,v=2562383102,w=271733878,o=0;o<x.length;o+=16)p=t,q=u,r=v,s=w,t=h(t,u,v,w,x[o+0],y,3614090360),w=h(w,t,u,v,x[o+1],z,3905402710),v=h(v,w,t,u,x[o+2],A,606105819),u=h(u,v,w,t,x[o+3],B,3250441966),t=h(t,u,v,w,x[o+4],y,4118548399),w=h(w,t,u,v,x[o+5],z,1200080426),v=h(v,w,t,u,x[o+6],A,2821735955),u=h(u,v,w,t,x[o+7],B,4249261313),t=h(t,u,v,w,x[o+8],y,1770035416),w=h(w,t,u,v,x[o+9],z,2336552879),v=h(v,w,t,u,x[o+10],A,4294925233),u=h(u,v,w,t,x[o+11],B,2304563134),t=h(t,u,v,w,x[o+12],y,1804603682),w=h(w,t,u,v,x[o+13],z,4254626195),v=h(v,w,t,u,x[o+14],A,2792965006),u=h(u,v,w,t,x[o+15],B,1236535329),t=i(t,u,v,w,x[o+1],C,4129170786),w=i(w,t,u,v,x[o+6],D,3225465664),v=i(v,w,t,u,x[o+11],E,643717713),u=i(u,v,w,t,x[o+0],F,3921069994),t=i(t,u,v,w,x[o+5],C,3593408605),w=i(w,t,u,v,x[o+10],D,38016083),v=i(v,w,t,u,x[o+15],E,3634488961),u=i(u,v,w,t,x[o+4],F,3889429448),t=i(t,u,v,w,x[o+9],C,568446438),w=i(w,t,u,v,x[o+14],D,3275163606),v=i(v,w,t,u,x[o+3],E,4107603335),u=i(u,v,w,t,x[o+8],F,1163531501),t=i(t,u,v,w,x[o+13],C,2850285829),w=i(w,t,u,v,x[o+2],D,4243563512),v=i(v,w,t,u,x[o+7],E,1735328473),u=i(u,v,w,t,x[o+12],F,2368359562),t=j(t,u,v,w,x[o+5],G,4294588738),w=j(w,t,u,v,x[o+8],H,2272392833),v=j(v,w,t,u,x[o+11],I,1839030562),u=j(u,v,w,t,x[o+14],J,4259657740),t=j(t,u,v,w,x[o+1],G,2763975236),w=j(w,t,u,v,x[o+4],H,1272893353),v=j(v,w,t,u,x[o+7],I,4139469664),u=j(u,v,w,t,x[o+10],J,3200236656),t=j(t,u,v,w,x[o+13],G,681279174),w=j(w,t,u,v,x[o+0],H,3936430074),v=j(v,w,t,u,x[o+3],I,3572445317),u=j(u,v,w,t,x[o+6],J,76029189),t=j(t,u,v,w,x[o+9],G,3654602809),w=j(w,t,u,v,x[o+12],H,3873151461),v=j(v,w,t,u,x[o+15],I,530742520),u=j(u,v,w,t,x[o+2],J,3299628645),t=k(t,u,v,w,x[o+0],K,4096336452),w=k(w,t,u,v,x[o+7],L,1126891415),v=k(v,w,t,u,x[o+14],M,2878612391),u=k(u,v,w,t,x[o+5],N,4237533241),t=k(t,u,v,w,x[o+12],K,1700485571),w=k(w,t,u,v,x[o+3],L,2399980690),v=k(v,w,t,u,x[o+10],M,4293915773),u=k(u,v,w,t,x[o+1],N,2240044497),t=k(t,u,v,w,x[o+8],K,1873313359),w=k(w,t,u,v,x[o+15],L,4264355552),v=k(v,w,t,u,x[o+6],M,2734768916),u=k(u,v,w,t,x[o+13],N,1309151649),t=k(t,u,v,w,x[o+4],K,4149444226),w=k(w,t,u,v,x[o+11],L,3174756917),v=k(v,w,t,u,x[o+2],M,718787259),u=k(u,v,w,t,x[o+9],N,3951481745),t=c(t,p),u=c(u,q),v=c(v,r),w=c(w,s);var O=m(t)+m(u)+m(v)+m(w);return O.toLowerCase()}},a.Utils=c}},{}],32:[function(a,b,c){"use strict";b.exports=function(b,c){var d;d={},d.MediaHandler=a("./WebRTC/MediaHandler")(b),d.MediaStreamManager=a("./WebRTC/MediaStreamManager")(b,c);var e;return d.isSupported=function(){return void 0!==e?e:(d.MediaStream=c.MediaStream,d.getUserMedia=c.getUserMedia,d.RTCPeerConnection=c.RTCPeerConnection,d.RTCSessionDescription=c.RTCSessionDescription,d.RTCPeerConnection&&d.RTCSessionDescription?(d.getUserMedia&&(d.getUserMedia=b.Utils.promisify(c,"getUserMedia")),e=!0):e=!1,e)},d}},{"./WebRTC/MediaHandler":33,"./WebRTC/MediaStreamManager":34}],33:[function(a,b,c){"use strict";b.exports=function(a){var b=function(b,c){function d(a,b){a.mediaStreamManager.on&&a.mediaStreamManager.on(b,function(){a.emit.apply(a,[b].concat(Array.prototype.slice.call(arguments)))})}c=c||{},this.logger=b.ua.getLogger("sip.invitecontext.mediahandler",b.id),this.session=b,this.localMedia=null,this.ready=!0,this.mediaStreamManager=c.mediaStreamManager||new a.WebRTC.MediaStreamManager(this.logger),this.audioMuted=!1,this.videoMuted=!1,this.local_hold=!1,this.remote_hold=!1;var e=this.prepareIceServers(c.stunServers,c.turnServers);this.RTCConstraints=c.RTCConstraints||{},this.initPeerConnection(e),d(this,"userMediaRequest"),d(this,"userMedia"),d(this,"userMediaFailed")};return b.defaultFactory=function(a,c){return new b(a,c)},b.defaultFactory.isSupported=function(){return a.WebRTC.isSupported()},b.prototype=Object.create(a.MediaHandler.prototype,{isReady:{writable:!0,value:function(){return this.ready}},close:{writable:!0,value:function(){this.logger.log("closing PeerConnection"),this._remoteStreams=[],this.peerConnection&&"closed"!==this.peerConnection.signalingState&&(this.peerConnection.close(),this.localMedia&&this.mediaStreamManager.release(this.localMedia))}},getDescription:{writable:!0,value:function(b){var c=this,d=c.mediaStreamManager.acquire;d.length>1&&(d=a.Utils.promisify(this.mediaStreamManager,"acquire",!0)),b=b||{},b.dataChannel===!0&&(b.dataChannel={}),this.mediaHint=b;var e;return c.localMedia?(c.logger.log("already have local media"),e=a.Utils.Promise.resolve(c.localMedia)):(c.logger.log("acquiring local media"),e=d.call(c.mediaStreamManager,b).then(function(a){return c.logger.log("acquired local media streams"),c.localMedia=a,c.session.connecting(),a},function(a){throw c.logger.error("unable to acquire streams"),c.logger.error(a),c.session.connecting(),a}).then(this.addStreams.bind(this))),e.then(function(){return c.hasOffer("remote")?c.peerConnection.ondatachannel=function(a){c.dataChannel=a.channel,c.emit("dataChannel",c.dataChannel)}:b.dataChannel&&c.peerConnection.createDataChannel&&(c.dataChannel=c.peerConnection.createDataChannel("sipjs",b.dataChannel),c.emit("dataChannel",c.dataChannel)),c.render(),c.createOfferOrAnswer(c.RTCConstraints)}).then(function(b){return b=a.Hacks.Firefox.hasMissingCLineInSDP(b),c.local_hold&&(/a=(sendrecv|sendonly|recvonly|inactive)/.test(b)?(b=b.replace(/a=sendrecv\r\n/g,"a=sendonly\r\n"),b=b.replace(/a=recvonly\r\n/g,"a=inactive\r\n")):b=b.replace(/(m=[^\r]*\r\n)/g,"$1a=sendonly\r\n")),{body:b,contentType:"application/sdp"}})}},hasDescription:{writeable:!0,value:function(a){return"application/sdp"===a.getHeader("Content-Type")&&!!a.body}},setDescription:{writable:!0,value:function(b){var c=this,d=b.body;this.remote_hold=/a=(sendonly|inactive)/.test(d),d=a.Hacks.Firefox.cannotHandleExtraWhitespace(d),d=a.Hacks.AllBrowsers.maskDtls(d);var e={type:this.hasOffer("local")?"answer":"offer",sdp:d};this.emit("setDescription",e);var f=new a.WebRTC.RTCSessionDescription(e);return a.Utils.promisify(this.peerConnection,"setRemoteDescription")(f)["catch"](function(a){throw c.emit("peerConnection-setRemoteDescriptionFailed",a),a})}},getReferMedia:{writable:!0,value:function(){function a(a,b){return b[a]().length>0}function b(b){return this.getLocalStreams().some(a.bind(null,b))&&this.getRemoteStreams().some(a.bind(null,b))}return{constraints:{audio:b.call(this,"getAudioTracks"),video:b.call(this,"getVideoTracks")}}}},updateIceServers:{writeable:!0,value:function(a){var b=this.prepareIceServers(a.stunServers,a.turnServers);this.RTCConstraints=a.RTCConstraints||this.RTCConstraints,this.initPeerConnection(b)}},isMuted:{writable:!0,value:function(){return{audio:this.audioMuted,video:this.videoMuted}}},mute:{writable:!0,value:function(a){if(0!==this.getLocalStreams().length){a=a||{audio:this.getLocalStreams()[0].getAudioTracks().length>0,video:this.getLocalStreams()[0].getVideoTracks().length>0};var b=!1,c=!1;return a.audio&&!this.audioMuted&&(b=!0,this.audioMuted=!0,this.toggleMuteAudio(!0)),a.video&&!this.videoMuted&&(c=!0,this.videoMuted=!0,this.toggleMuteVideo(!0)),b||c?{audio:b,video:c}:void 0}}},unmute:{writable:!0,value:function(a){if(0!==this.getLocalStreams().length){a=a||{audio:this.getLocalStreams()[0].getAudioTracks().length>0,video:this.getLocalStreams()[0].getVideoTracks().length>0};var b=!1,c=!1;return a.audio&&this.audioMuted&&(b=!0,this.audioMuted=!1,this.toggleMuteAudio(!1)),a.video&&this.videoMuted&&(c=!0,this.videoMuted=!1,this.toggleMuteVideo(!1)),b||c?{audio:b,video:c}:void 0}}},hold:{writable:!0,value:function(){this.local_hold=!0,this.toggleMuteAudio(!0),this.toggleMuteVideo(!0)}},unhold:{writable:!0,value:function(){this.local_hold=!1,this.audioMuted||this.toggleMuteAudio(!1),this.videoMuted||this.toggleMuteVideo(!1)}},getLocalStreams:{writable:!0,value:function(){var a=this.peerConnection;return a&&"closed"===a.signalingState?(this.logger.warn("peerConnection is closed, getLocalStreams returning []"),[]):a.getLocalStreams&&a.getLocalStreams()||a.localStreams||[]}},getRemoteStreams:{writable:!0,value:function(){var a=this.peerConnection;return a&&"closed"===a.signalingState?(this.logger.warn("peerConnection is closed, getRemoteStreams returning this._remoteStreams"),this._remoteStreams):a.getRemoteStreams&&a.getRemoteStreams()||a.remoteStreams||[]}},render:{writable:!0,value:function(b){if(b=b||this.mediaHint&&this.mediaHint.render,!b)return!1;var c={local:"getLocalStreams",remote:"getRemoteStreams"};Object.keys(c).forEach(function(d){var e=c[d],f=this[e]();a.WebRTC.MediaStreamManager.render(f,b[d])}.bind(this))}},hasOffer:{writable:!0,value:function(a){var b="have-"+a+"-offer";return this.peerConnection.signalingState===b}},prepareIceServers:{writable:!0,value:function(a,b){var c=[],d=this.session.ua.configuration;return a=a||d.stunServers,b=b||d.turnServers,[].concat(a).forEach(function(a){c.push({urls:a})}),[].concat(b).forEach(function(a){var b={urls:a.urls};a.username&&(b.username=a.username),a.password&&(b.credential=a.password),c.push(b)}),c}},initPeerConnection:{writable:!0,value:function(b){var c=this,d=this.session.ua.configuration;this.onIceCompleted=a.Utils.defer(),this.onIceCompleted.promise.then(function(b){c.emit("iceGatheringComplete",b),c.iceCheckingTimer&&(a.Timers.clearTimeout(c.iceCheckingTimer),c.iceCheckingTimer=null)}),this.peerConnection&&this.peerConnection.close();var e={iceServers:b};d.rtcpMuxPolicy&&(e.rtcpMuxPolicy=d.rtcpMuxPolicy),this.peerConnection=new a.WebRTC.RTCPeerConnection(e),this._remoteStreams=[],this.peerConnection.onaddstream=function(a){c.logger.log("stream added: "+a.stream.id),c._remoteStreams.push(a.stream),c.render(),c.emit("addStream",a)},this.peerConnection.onremovestream=function(a){c.logger.log("stream removed: "+a.stream.id)},this.startIceCheckingTimer=function(){c.iceCheckingTimer||(c.iceCheckingTimer=a.Timers.setTimeout(function(){c.logger.log("RTCIceChecking Timeout Triggered after "+d.iceCheckingTimeout+" milliseconds"),c.onIceCompleted.resolve(this)}.bind(this.peerConnection),d.iceCheckingTimeout))},this.peerConnection.onicecandidate=function(a){c.emit("iceCandidate",a),a.candidate?(c.logger.log("ICE candidate received: "+(null===a.candidate.candidate?null:a.candidate.candidate.trim())),c.startIceCheckingTimer()):c.onIceCompleted.resolve(this)},this.peerConnection.onicegatheringstatechange=function(){c.logger.log("RTCIceGatheringState changed: "+this.iceGatheringState),"gathering"===this.iceGatheringState&&c.emit("iceGathering",this),"complete"===this.iceGatheringState&&c.onIceCompleted.resolve(this)},this.peerConnection.oniceconnectionstatechange=function(){var a;switch("checking"===this.iceConnectionState&&c.startIceCheckingTimer(),this.iceConnectionState){case"new":a="iceConnection";break;case"checking":a="iceConnectionChecking";break;case"connected":a="iceConnectionConnected";break;case"completed":a="iceConnectionCompleted";break;case"failed":a="iceConnectionFailed";break;case"disconnected":a="iceConnectionDisconnected";break;case"closed":a="iceConnectionClosed";break;default:return void c.logger.warn("Unknown iceConnection state:",this.iceConnectionState)}c.emit(a,this)},this.peerConnection.onstatechange=function(){c.logger.log('PeerConnection state changed to "'+this.readyState+'"')}}},createOfferOrAnswer:{writable:!0,value:function(b){var c,d=this,e=d.peerConnection;return d.ready=!1,c=d.hasOffer("remote")?"createAnswer":"createOffer",a.Utils.promisify(e,c,!0)(b)["catch"](function(a){throw d.emit("peerConnection-"+c+"Failed",a),a}).then(a.Utils.promisify(e,"setLocalDescription"))["catch"](function(a){throw d.emit("peerConnection-selLocalDescriptionFailed",a),a}).then(function(){var b=a.Utils.defer();return"complete"!==e.iceGatheringState||"connected"!==e.iceConnectionState&&"completed"!==e.iceConnectionState?d.onIceCompleted.promise.then(b.resolve):b.resolve(),b.promise}).then(function(){var b=e.localDescription.sdp;b=a.Hacks.Chrome.needsExplicitlyInactiveSDP(b),b=a.Hacks.AllBrowsers.unmaskDtls(b);var f={type:"createOffer"===c?"offer":"answer",sdp:b};return d.emit("getDescription",f),d.session.ua.configuration.hackStripTcp&&(f.sdp=f.sdp.replace(/^a=candidate:\d+ \d+ tcp .*?\r\n/gim,"")),d.ready=!0,f.sdp})["catch"](function(b){throw d.logger.error(b),d.ready=!0,new a.Exceptions.GetDescriptionError(b)})}},addStreams:{writable:!0,value:function(b){try{b=[].concat(b),b.forEach(function(a){this.peerConnection.addStream(a)},this)}catch(c){return this.logger.error("error adding stream"),this.logger.error(c),a.Utils.Promise.reject(c)}return a.Utils.Promise.resolve()}},toggleMuteHelper:{writable:!0,value:function(a,b){this.getLocalStreams().forEach(function(c){c[a]().forEach(function(a){a.enabled=!b})})}},toggleMuteAudio:{writable:!0,value:function(a){this.toggleMuteHelper("getAudioTracks",a)}},toggleMuteVideo:{writable:!0,value:function(a){this.toggleMuteHelper("getVideoTracks",a)}}}),b}},{}],34:[function(a,b,c){"use strict";b.exports=function(a,b){var c=function(b,c){if(!a.WebRTC.isSupported())throw new a.Exceptions.NotSupportedError("Media not supported");this.mediaHint=c||{constraints:{audio:!0,video:!0}},this.acquisitions={}};return c.streamId=function(a){return a.getAudioTracks().concat(a.getVideoTracks()).map(function(a){return a.id}).join("")},c.render=function(c,d){function e(a,b){a.srcObject=b}function f(b){var c=100;b.ensurePlayingIntervalId=a.Timers.setInterval(function(){b.paused&&b.srcObject?b.play():a.Timers.clearInterval(b.ensurePlayingIntervalId)},c)}function g(a,c,d){var g=a[d%a.length];"function"==typeof g&&(g=g()),(b.attachMediaStream||e)(g,c),f(g)}if(!d)return!1;if(Array.isArray(d)&&!d.length)throw new TypeError("elements must not be empty");d=[].concat(d),[].concat(c).forEach(g.bind(null,d))},c.prototype=Object.create(a.EventEmitter.prototype,{acquire:{writable:!0,value:function(b){b=Object.keys(b||{}).length?b:this.mediaHint;var d=function(b,d){return d=[].concat(d),d.forEach(function(a){var d=c.streamId(a);this.acquisitions[d]=!!b},this),a.Utils.Promise.resolve(d)}.bind(this);if(b.stream)return d(!0,b.stream);var e=b.constraints||this.mediaHint&&this.mediaHint.constraints||{audio:!0,video:!0},f=a.Utils.defer();return a.Timers.setTimeout(function(){this.emit("userMediaRequest",e);var b=function(a,b){var c=Array.prototype.slice.call(arguments,2),d=[a].concat(c);return this.emit.apply(this,d),b.apply(null,c)}.bind(this);e.audio||e.video?f.resolve(a.WebRTC.getUserMedia(e).then(b.bind(this,"userMedia",d.bind(null,!1)),b.bind(this,"userMediaFailed",function(a){throw a}))):f.resolve([])}.bind(this),0),f.promise}},release:{writable:!0,value:function(a){a=[].concat(a),a.forEach(function(a){var b=c.streamId(a);this.acquisitions[b]===!1&&a.getTracks().forEach(function(a){a.stop()}),delete this.acquisitions[b]},this)}}}),c}},{}],35:[function(a,b,c){(function(c){"use strict";function d(a,b){if(null!=a){var c=b.charAt(0).toUpperCase()+b.slice(1),d=[b,"webkit"+c,"moz"+c];for(var e in d){var f=a[d[e]];if(f)return f.bind(a)}}}var e=c.window||c;b.exports={WebSocket:e.WebSocket,Transport:a("./Transport"),open:e.open,Promise:e.Promise,timers:e,console:e.console||{debug:function(){},log:function(){},warn:function(){},error:function(){}},MediaStream:d(e,"MediaStream"),getUserMedia:d(e.navigator,"getUserMedia"),RTCPeerConnection:d(e,"RTCPeerConnection"),RTCSessionDescription:d(e,"RTCSessionDescription"),addEventListener:d(e,"addEventListener"),removeEventListener:d(e,"removeEventListener"),HTMLMediaElement:e.HTMLMediaElement,attachMediaStream:e.attachMediaStream,createObjectURL:e.URL&&e.URL.createObjectURL,revokeObjectURL:e.URL&&e.URL.revokeObjectURL}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./Transport":28}],36:[function(a,b,c){"use strict";b.exports=a("./SIP")(a("./environment"))},{"./SIP":19,"./environment":35}]},{},[36])(36)});
41 0
\ No newline at end of file
42 1
deleted file mode 100644
... ...
@@ -1,1015 +0,0 @@
1
-/**
2
- * @copyright 2021 Double Bastion LLC <www.doublebastion.com>
3
- *
4
- * @author Double Bastion LLC
5
- *
6
- * @license GNU AGPL version 3 or any later version
7
- *
8
- * This program is free software; you can redistribute it and/or
9
- * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
10
- * License as published by the Free Software Foundation; either
11
- * version 3 of the License, or any later version.
12
- *
13
- * This program is distributed in the hope that it will be useful,
14
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
- * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
17
- *
18
- * You should have received a copy of the GNU Affero General Public
19
- * License along with this program.  If not, see <http://www.gnu.org/licenses/>.
20
- *
21
- *
22
- *
23
- * This is a modified version of the original file "app.js".
24
- *
25
- * Below is the copyright notice of ctxSip phone (https://github.com/collecttix/ctxSip)
26
- * which also applies to the original "app.js" file, which was part of ctxSip phone:
27
- *
28
- *
29
- *  The MIT License (MIT)
30
- *
31
- *  Copyright (c) 2014 Collecttix
32
- *
33
- *  Permission is hereby granted, free of charge, to any person obtaining a copy
34
- *  of this software and associated documentation files (the "Software"), to deal
35
- *  in the Software without restriction, including without limitation the rights
36
- *  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
37
- *  copies of the Software, and to permit persons to whom the Software is
38
- *  furnished to do so, subject to the following conditions:
39
- *
40
- *  The above copyright notice and this permission notice shall be included in
41
- *  all copies or substantial portions of the Software.
42
- *
43
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
44
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
45
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
46
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
47
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
48
- *  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
49
- *  THE SOFTWARE.
50
- *
51
- */
52
-
53
-
54
-/* globals SIP, user, moment, Stopwatch */
55
-
56
-$(document).ready(function() {
57
-
58
-    var ctxSip;
59
-
60
-    // Show system notifications on incoming calls
61
-    function incomingCallNote() {
62
-       var noticeOptions = { body: "New incoming call !!!", icon: "images/sip_trip_phone_logo.svg" }
63
-       var inComingCallNotification = new Notification("SIP Trip Phone incoming call", noticeOptions);
64
-       inComingCallNotification.onclick = function (event) {
65
-         return;
66
-       }
67
-
68
-       if (document.hasFocus()) {
69
-           return;
70
-       } else { setTimeout(incomingCallNote, 8000); }
71
-    }
72
-
73
-    // Change page title on incoming calls
74
-    function changePageTitle() {
75
-        if ($(document).attr("title") == "SIP Trip Phone") { $(document).prop("title", "New call !!!"); } else { $(document).prop("title", "SIP Trip Phone"); }
76
-        if (document.hasFocus()) {
77
-            $(document).prop("title", "SIP Trip Phone");
78
-            return;
79
-        } else { setTimeout(changePageTitle, 460); }
80
-    }
81
-
82
-    var userSIPPass = window.opener.sipUserPasswd;
83
-
84
-    var user = JSON.parse(localStorage.getItem('SIPCreds'));
85
-
86
-    var traceornot = (user.Tracesipmsg == 1)? true : false;
87
-
88
-    // Add the 'available phone numbers' drop-down list
89
-    var stpVoiceNmbrs = user.Voicenumbers;
90
-    var stpVoiceNbOpt = '';
91
-    var stpVoiceNmbrsArr = [];
92
-
93
-    if (stpVoiceNmbrs != '') {
94
-
95
-	stpVoiceNmbrsArr = stpVoiceNmbrs.split(",");
96
-	var stpDefNmbrFdb = user.Defaultvoicenumber;
97
-
98
-	for (var v = 0; v < stpVoiceNmbrsArr.length; v++) {
99
-             stpVoiceNbOpt += '<option value="'+ stpVoiceNmbrsArr[v] +'" class="stpSlctFrmNmbrs">'+ stpVoiceNmbrsArr[v] +'</option>';
100
-	}
101
-    }
102
-    stpVoiceNbOpt += '<option value="'+ user.User +'" class="stpSlctFrmNmbrs">'+ user.User +'</option>';
103
-
104
-    $("#fromNumber").append(stpVoiceNbOpt);
105
-
106
-    if (stpDefNmbrFdb != '' && stpDefNmbrFdb != null) {
107
-        $("#fromNumber").val(stpDefNmbrFdb);
108
-    } else {
109
-        if (stpVoiceNmbrsArr.length > 0) {
110
-            $("#fromNumber").val(stpVoiceNmbrsArr[0]);
111
-        } else { $("#fromNumber").val(user.User); }
112
-    }
113
-
114
-    // Adjust height of text frame and call history list and width of dial pad
115
-    $("#sip-splash").css({ "height" : window.innerHeight - 134 });
116
-    $("#sip-logitems").css({ "height" : window.innerHeight - 174 });
117
-
118
-    $(window).resize(function() {
119
-      $("#sip-splash").css({ "height" : window.innerHeight - 134 });
120
-      $("#sip-logitems").css({ "height" : window.innerHeight - 174 });
121
-    });
122
-
123
-    var calcWidth = parseInt(window.innerWidth - 30) + "px";
124
-    var calcHeight = parseInt(window.innerHeight - 134) + "px";
125
-    $("#sip-dialpad").css({ "width" : calcWidth, "height" : calcHeight });
126
-
127
-    var calcMargin =  parseInt(($("#sip-dialpad").height() - $("#dialpadWrap").height()) / 2)  + "px auto";
128
-    $("#dialpadWrap").css("margin", calcMargin);
129
-
130
-
131
-    if (user.Stun != '') {
132
-        var configComp = {
133
-               password        : userSIPPass,
134
-               displayName     : user.Display,
135
-               uri             : 'sip:'+ user.User +'@'+ user.Realm,
136
-               wsServers       : user.WSServer,
137
-               stunServers     : ["stun:"+ user.Stun],
138
-               traceSip        : traceornot,
139
-               log             : { level : 3 },
140
-               registerExpires : 9999999
141
-            };
142
-    } else {
143
-        var configComp = {
144
-               password        : userSIPPass,
145
-               displayName     : user.Display,
146
-               uri             : 'sip:'+ user.User +'@'+ user.Realm,
147
-               wsServers       : user.WSServer,
148
-               traceSip        : traceornot,
149
-               log             : { level : 3 },
150
-               registerExpires : 9999999
151
-            };
152
-    }
153
-
154
-    ctxSip = {
155
-
156
-        config : configComp,
157
-        ringtone     : document.getElementById('ringtone'),
158
-        ringbacktone : document.getElementById('ringbacktone'),
159
-        // dtmfTone     : document.getElementById('dtmfTone'),
160
-
161
-        Sessions     : [],
162
-        callTimers   : {},
163
-        callActiveID : null,
164
-        callVolume   : 1,
165
-        Stream       : null,
166
-
167
-        /**
168
-         * Parses a SIP uri and returns a formatted phone number.
169
-         *
170
-         * @param  {string} phone number or uri to format
171
-         * @return {string}       formatted number
172
-         */
173
-        formatPhone : function(phone) {
174
-
175
-            var num;
176
-
177
-            if (phone.indexOf('@')) {
178
-                num =  phone.split('@')[0];
179
-            } else {
180
-                num = phone;
181
-            }
182
-
183
-            num = num.toString().replace(/[^0-9]/g, '');
184
-
185
-            if (num.length === 10) {
186
-                return '(' + num.substr(0, 3) + ') ' + num.substr(3, 3) + '-' + num.substr(6,4);
187
-            } else if (num.length === 11) {
188
-                return '(' + num.substr(1, 3) + ') ' + num.substr(4, 3) + '-' + num.substr(7,4);
189
-            } else {
190
-                return num;
191
-            }
192
-        },
193
-
194
-        // Sound methods
195
-        startRingTone : function() {
196
-            try { ctxSip.ringtone.play(); } catch (e) { }
197
-        },
198
-
199
-        stopRingTone : function() {
200
-            try { ctxSip.ringtone.pause(); } catch (e) { }
201
-        },
202
-
203
-        startRingbackTone : function() {
204
-            try { ctxSip.ringbacktone.play(); } catch (e) { }
205
-        },
206
-
207
-        stopRingbackTone : function() {
208
-            try { ctxSip.ringbacktone.pause(); } catch (e) { }
209
-        },
210
-
211
-        // Genereates a random string to ID a call
212
-        getUniqueID : function() {
213
-            return Math.random().toString(36).substr(2, 9);
214
-        },
215
-
216
-
217
-        newSession : function(newSess) {
218
-
219
-            newSess.displayName = newSess.remoteIdentity.displayName || newSess.remoteIdentity.uri.user;
220
-            newSess.ctxid       = ctxSip.getUniqueID();
221
-
222
-            var status;
223
-
224
-            if (newSess.direction === 'incoming') {
225
-                status = "Incoming: "+ newSess.displayName;
226
-                ctxSip.startRingTone();
227
-
228
-                incomingCallNote();
229
-                changePageTitle();
230
-
231
-            } else {
232
-                status = "Trying: "+ newSess.displayName;
233
-                ctxSip.startRingbackTone();
234
-            }
235
-
236
-            ctxSip.logCall(newSess, 'ringing');
237
-
238
-            ctxSip.setCallSessionStatus(status);
239
-
240
-            // EVENT CALLBACKS
241
-
242
-            newSess.on('progress',function(e) {
243
-                if (e.direction === 'outgoing') {
244
-                    ctxSip.setCallSessionStatus('Calling...');
245
-                }
246
-            });
247
-
248
-            newSess.on('connecting',function(e) {
249
-                if (e.direction === 'outgoing') {
250
-                    ctxSip.setCallSessionStatus('Connecting...');
251
-                }
252
-            });
253
-
254
-           newSess.on('accepted',function(e) {
255
-
256
-             // If there is another active call, hold it
257
-             if (ctxSip.callActiveID && ctxSip.callActiveID !== newSess.ctxid) {
258
-                 ctxSip.phoneHoldButtonPressed(ctxSip.callActiveID);
259
-             }
260
-
261
-             ctxSip.stopRingbackTone();
262
-             ctxSip.stopRingTone();
263
-             ctxSip.setCallSessionStatus('Answered');
264
-             ctxSip.logCall(newSess, 'answered');
265
-             ctxSip.callActiveID = newSess.ctxid;
266
-           });
267
-
268
-            newSess.on('hold', function(e) {
269
-                ctxSip.callActiveID = null;
270
-                ctxSip.logCall(newSess, 'holding');
271
-            });
272
-
273
-            newSess.on('unhold', function(e) {
274
-                ctxSip.logCall(newSess, 'resumed');
275
-                ctxSip.callActiveID = newSess.ctxid;
276
-            });
277
-
278
-            newSess.on('muted', function(e) {
279
-                ctxSip.Sessions[newSess.ctxid].isMuted = true;
280
-                ctxSip.setCallSessionStatus("Muted");
281
-            });
282
-
283
-            newSess.on('unmuted', function(e) {
284
-                ctxSip.Sessions[newSess.ctxid].isMuted = false;
285
-                ctxSip.setCallSessionStatus("Answered");
286
-            });
287
-
288
-            newSess.on('cancel', function(e) {
289
-                ctxSip.stopRingTone();
290
-                ctxSip.stopRingbackTone();
291
-                ctxSip.setCallSessionStatus("Canceled");
292
-                if (this.direction === 'outgoing') {
293
-                    ctxSip.callActiveID = null;
294
-                    newSess             = null;
295
-                    ctxSip.logCall(this, 'ended');
296
-                }
297
-            });
298
-
299
-            newSess.on('bye', function(e) {
300
-                ctxSip.stopRingTone();
301
-                ctxSip.stopRingbackTone();
302
-                ctxSip.setCallSessionStatus("");
303
-                ctxSip.logCall(newSess, 'ended');
304
-                ctxSip.callActiveID = null;
305
-                newSess             = null;
306
-            });
307
-
308
-            newSess.on('failed',function(e) {
309
-                ctxSip.stopRingTone();
310
-                ctxSip.stopRingbackTone();
311
-                ctxSip.setCallSessionStatus('Terminated');
312
-            });
313
-
314
-            newSess.on('rejected',function(e) {
315
-                ctxSip.stopRingTone();
316
-                ctxSip.stopRingbackTone();
317
-                ctxSip.setCallSessionStatus('Rejected');
318
-                ctxSip.callActiveID = null;
319
-                ctxSip.logCall(this, 'ended');
320
-                newSess             = null;
321
-            });
322
-
323
-            ctxSip.Sessions[newSess.ctxid] = newSess;
324
-
325
-        },
326
-
327
-        // getUser media request refused or device was not present
328
-        getUserMediaFailure : function(e) {
329
-            window.console.error('getUserMedia failed:', e);
330
-            ctxSip.setError(true, 'Media Error.', 'You must allow access to your microphone.  Check the address bar.', true);
331
-        },
332
-
333
-
334
-        getUserMediaSuccess : function(stream) {
335
-            ctxSip.Stream = stream;
336
-        },
337
-
338
-
339
-        /**
340
-         * sets the ui call status field
341
-         *
342
-         * @param {string} status
343
-         */
344
-        setCallSessionStatus : function(status) {
345
-            $('#txtCallStatus').html(status);
346
-        },
347
-
348
-        /**
349
-         * sets the ui connection status field
350
-         *
351
-         * @param {string} status
352
-         */
353
-        setStatus : function(status) {
354
-            $("#txtRegStatus").html('<i class="fa fa-signal"></i> '+status);
355
-        },
356
-
357
-        /**
358
-         * logs a call to localstorage
359
-         *
360
-         * @param  {object} session
361
-         * @param  {string} status Enum 'ringing', 'answered', 'ended', 'holding', 'resumed'
362
-         */
363
-        logCall : function(session, status) {
364
-
365
-            var log = {
366
-                    clid : session.displayName,
367
-                    uri  : session.remoteIdentity.uri.toString(),
368
-                    id   : session.ctxid,
369
-                    time : new Date().getTime()
370
-                },
371
-                calllog = JSON.parse(localStorage.getItem('sipCalls'));
372
-
373
-            if (!calllog) { calllog = {}; }
374
-
375
-            if (!calllog.hasOwnProperty(session.ctxid)) {
376
-                calllog[log.id] = {
377
-                    id    : log.id,
378
-                    clid  : log.clid,
379
-                    uri   : log.uri,
380
-                    start : log.time,
381
-                    flow  : session.direction
382
-                };
383
-            }
384
-
385
-            if (status === 'ended') {
386
-                calllog[log.id].stop = log.time;
387
-            }
388
-
389
-            if (status === 'ended' && calllog[log.id].status === 'ringing') {
390
-                calllog[log.id].status = 'missed';
391
-            } else {
392
-                calllog[log.id].status = status;
393
-            }
394
-
395
-            localStorage.setItem('sipCalls', JSON.stringify(calllog));
396
-            ctxSip.logShow();
397
-        },
398
-
399
-        /**
400
-         * adds a ui item to the call log
401
-         *
402
-         * @param  {object} item log item
403
-         */
404
-        logItem : function(item) {
405
-
406
-            var callActive = (item.status !== 'ended' && item.status !== 'missed'),
407
-                callLength = (item.status !== 'ended')? '<span id="'+item.id+'"></span>': moment.duration(item.stop - item.start).humanize(),
408
-                callClass  = '',
409
-                callIcon,
410
-                i;
411
-
412
-            switch (item.status) {
413
-                case 'ringing'  :
414
-                    callClass = 'list-group-item-success';
415
-                    callIcon  = 'fa-bell';
416
-                    break;
417
-
418
-                case 'missed'   :
419
-                    callClass = 'list-group-item-danger';
420
-                    if (item.flow === "incoming") { callIcon = 'fa-chevron-left'; }
421
-                    if (item.flow === "outgoing") { callIcon = 'fa-chevron-right'; }
422
-                    break;
423
-
424
-                case 'holding'  :
425
-                    callClass = 'list-group-item-warning';
426
-                    callIcon  = 'fa-pause';
427
-                    break;
428
-
429
-                case 'answered' :
430
-                case 'resumed'  :
431
-                    callClass = 'list-group-item-info';
432
-                    callIcon  = 'fa-phone-square';
433
-                    break;
434
-
435
-                case 'ended'  :
436
-                    if (item.flow === "incoming") { callIcon = 'fa-chevron-left'; }
437
-                    if (item.flow === "outgoing") { callIcon = 'fa-chevron-right'; }
438
-                    break;
439
-            }
440
-
441
-
442
-            i  = '<div class="list-group-item sip-logitem clearfix '+callClass+'" data-uri="'+item.uri+'" data-sessionid="'+item.id+'" title="Double click to call">';
443
-            i += '<div class="clearfix"><div class="pull-left">';
444
-            i += '<i class="fa fa-fw '+callIcon+' fa-fw"></i> <strong>'+ctxSip.formatPhone(item.uri)+'</strong><br><small>'+moment(item.start).format('YYYY/MM/DD HH:mm:ss')+'</small>';
445
-            i += '</div>';
446
-            i += '<div class="pull-right text-right"><em>'+item.clid+'</em><br>' + callLength+'</div></div>';
447
-
448
-            if (callActive) {
449
-                i += '<div class="btn-group btn-group-xs pull-right">';
450
-                if (item.status === 'ringing' && item.flow === 'incoming') {
451
-                    i += '<button class="btn btn-xs btn-success btnCall" title="Call"><i class="fa fa-phone"></i></button>';
452
-                } else {
453
-                    i += '<button class="btn btn-xs btn-primary btnHoldResume" title="Hold"><i class="fa fa-pause"></i></button>';
454
-                    i += '<button class="btn btn-xs btn-info btnTransfer" title="Transfer"><i class="fa fa-random"></i></button>';
455
-                    i += '<button class="btn btn-xs btn-warning btnMute" title="Mute"><i class="fa fa-fw fa-microphone"></i></button>';
456
-                }
457
-                i += '<button class="btn btn-xs btn-danger btnHangUp" title="Hangup"><i class="fa fa-stop"></i></button>';
458
-                i += '</div>';
459
-            }
460
-            i += '</div>';
461
-
462
-            $('#sip-logitems').append(i);
463
-
464
-
465
-            // Start call timer on answer
466
-            if (item.status === 'answered') {
467
-                var tEle = document.getElementById(item.id);
468
-                ctxSip.callTimers[item.id] = new Stopwatch(tEle);
469
-                ctxSip.callTimers[item.id].start();
470
-            }
471
-
472
-            if (callActive && item.status !== 'ringing') {
473
-                ctxSip.callTimers[item.id].start({startTime : item.start});
474
-            }
475
-
476
-            $('#sip-logitems').scrollTop(0);
477
-        },
478
-
479
-        /**
480
-         * updates the call log ui
481
-         */
482
-        logShow : function() {
483
-
484
-            var calllog = JSON.parse(localStorage.getItem('sipCalls')),
485
-            x = [];
486
-
487
-            if (calllog !== null) {
488
-
489
-                $('#sip-splash').addClass('hide');
490
-                $('#sip-log').removeClass('hide');
491
-
492
-                // empty existing logs
493
-                $('#sip-logitems').empty();
494
-
495
-                // JS doesn't guarantee property order so
496
-                // create an array with the start time as
497
-                // the key and sort by that.
498
-
499
-                // Add start time to array
500
-                $.each(calllog, function(k,v) {
501
-                    x.push(v);
502
-                });
503
-
504
-                // sort descending
505
-                x.sort(function(a, b) {
506
-                    return b.start - a.start;
507
-                });
508
-
509
-                $.each(x, function(k, v) {
510
-                    ctxSip.logItem(v);
511
-                });
512
-
513
-            } else {
514
-                $('#sip-splash').removeClass('hide');
515
-                $('#sip-log').addClass('hide');
516
-            }
517
-        },
518
-
519
-        /**
520
-         * removes log items from localstorage and updates the UI
521
-         */
522
-        logClear : function() {
523
-
524
-            localStorage.removeItem('sipCalls');
525
-            ctxSip.logShow();
526
-        },
527
-
528
-        sipCall : function(target) {
529
-
530
-            try {
531
-
532
-	        // Get the name of the SIP provider to send it to Asterisk, so that Asterisk knows what provider
533
-	        // to use for outbound calls, in case multiple phone numbers from different providers are used
534
-	        var callerNumber = $("#fromNumber").val();
535
-
536
-                if (callerNumber.indexOf(":") >= 0) {
537
-	            var shortProv = callerNumber.split(":");
538
-	            var sipProvider = shortProv[0].replace(" ", "");
539
-                    var callFromNumber = shortProv[1].replace(" ", "");
540
-                } else {
541
-	            var sipProvider = 'n/a';
542
-                    var callFromNumber = callerNumber;
543
-                }
544
-
545
-                var s = ctxSip.phone.invite(target, {
546
-                    media : {
547
-                        stream      : ctxSip.Stream,
548
-                        constraints : { audio : true, video : false },
549
-                        render      : { remote: document.getElementById('audioRemote') }
550
-                        // render: { remote: $('#audioRemote').get()[0] }
551
-                        // RTCConstraints : { "optional": [{ 'DtlsSrtpKeyAgreement': 'true'} ]}
552
-                    },
553
-                    extraHeaders    : [ 'X-SipProvider: '+ sipProvider , 'X-CallFromNumber: '+ callFromNumber ]
554
-                });
555
-                s.direction = 'outgoing';
556
-                ctxSip.newSession(s);
557
-
558
-            } catch(e) {
559
-                throw(e);
560
-            }
561
-        },
562
-
563
-        sipTransfer : function(sessionid) {
564
-
565
-                var s  = ctxSip.Sessions[sessionid],
566
-                target = window.prompt('Enter destination number', '');
567
-
568
-                if (target) {
569
-                    ctxSip.setCallSessionStatus('<i>Transfering the call...</i>');
570
-                }
571
-                s.refer(target);
572
-        },
573
-
574
-        sipHangUp : function(sessionid) {
575
-
576
-            var s = ctxSip.Sessions[sessionid];
577
-            // s.terminate();
578
-            if (!s) {
579
-                return;
580
-            } else if (s.startTime) {
581
-                s.bye();
582
-            } else if (s.reject) {
583
-                s.reject();
584
-            } else if (s.cancel) {
585
-                s.cancel();
586
-            }
587
-
588
-        },
589
-
590
-        sipSendDTMF : function(digit) {
591
-
592
-            // try { ctxSip.dtmfTone.play(); } catch(e) { }
593
-
594
-            var a = ctxSip.callActiveID;
595
-            if (a) {
596
-                var s = ctxSip.Sessions[a];
597
-                s.dtmf(digit);
598
-            }
599
-        },
600
-
601
-        phoneCallButtonPressed : function(sessionid) {
602
-
603
-                var s  = ctxSip.Sessions[sessionid];
604
-                var targetinit = $("#numDisplay").val();
605
-
606
-            if (!s) {
607
-
608
-		if (targetinit.trim() !== '') {
609
-		    if (/^[a-zA-Z0-9\+\*\#\@\:\.\-]+$/.test(targetinit) && targetinit.length < 201) {
610
-
611
-                        var target = targetinit;
612
-                        ctxSip.sipCall(target);
613
-
614
-                    } else {
615
-	                alert("The phone number or extension that you have tried to dial is not valid. You can only enter numbers, uppercase and lowercase letters, plus signs (+), asterisks (*), number signs (#), at signs (@), colons (:), periods (.) and hyphens (-) in the 'Recipient' field. Also, the total number of characters cannot exceed 200.");
616
-		    }
617
-                }
618
-
619
-            } else if (s.accept && !s.startTime) {
620
-
621
-                s.accept({
622
-                    media: {
623
-                            stream: ctxSip.Stream,
624
-                            constraints: { audio: true, video: false },
625
-                            render      : { remote: document.getElementById('audioRemote') }
626
-                            // render: { remote: $('#audioRemote').get()[0] }
627
-                            // RTCConstraints : { "optional": [{ 'DtlsSrtpKeyAgreement': 'true'} ]}
628
-                           }
629
-                });
630
-            }
631
-        },
632
-
633
-        phoneMuteButtonPressed : function (sessionid) {
634
-
635
-            var s = ctxSip.Sessions[sessionid];
636
-
637
-            if (!s.isMuted) {
638
-                s.mute();
639
-            } else {
640
-                s.unmute();
641
-            }
642
-        },
643
-
644
-        phoneHoldButtonPressed : function(sessionid) {
645
-
646
-            var s = ctxSip.Sessions[sessionid];
647
-
648
-            if (s.isOnHold().local === true) {
649
-                s.unhold();
650
-            } else {
651
-                s.hold();
652
-            }
653
-        },
654
-
655
-
656
-        setError : function(err, title, msg, closable) {
657
-
658
-            // Show modal if err = true
659
-            if (err === true) {
660
-                $("#mdlError p").html(msg);
661
-                $("#mdlError").modal('show');
662
-
663
-                if (closable) {
664
-                    var b = '<button type="button" class="close" data-dismiss="modal">&times;</button>';
665
-                    $("#mdlError .modal-header").find('button').remove();
666
-                    $("#mdlError .modal-header").prepend(b);
667
-                    $("#mdlError .modal-title").html(title);
668
-                    $("#mdlError").modal({ keyboard : true });
669
-                } else {
670
-                    $("#mdlError .modal-header").find('button').remove();
671
-                    $("#mdlError .modal-title").html(title);
672
-                    $("#mdlError").modal({ keyboard : false });
673
-                }
674
-                $('#numDisplay').prop('disabled', 'disabled');
675
-            } else {
676
-                $('#numDisplay').removeProp('disabled');
677
-                $("#mdlError").modal('hide');
678
-            }
679
-        },
680
-
681
-        /**
682
-         * Tests for a capable browser, return bool, and shows an
683
-         * error modal on fail.
684
-         */
685
-        hasWebRTC : function() {
686
-
687
-            if (navigator.webkitGetUserMedia) {
688
-                return true;
689
-            } else if (navigator.mozGetUserMedia) {
690
-                return true;
691
-            } else if (navigator.getUserMedia) {
692
-                return true;
693
-            } else {
694
-                ctxSip.setError(true, 'Unsupported Browser.', 'Your browser does not support the features required for this phone.');
695
-                window.console.error("WebRTC support not found");
696
-                return false;
697
-            }
698
-        }
699
-    };
700
-
701
-    userSIPPass = '';
702
-    window.opener.sipUserPasswd = '';
703
-
704
-    // Throw an error if the browser can't hack it.
705
-    if (!ctxSip.hasWebRTC()) {
706
-        return true;
707
-    }
708
-
709
-    ctxSip.phone = new SIP.UA(ctxSip.config);
710
-
711
-    ctxSip.phone.on('connected', function(e) {
712
-        ctxSip.setStatus("Connected");
713
-    });
714
-
715
-    ctxSip.phone.on('disconnected', function(e) {
716
-        ctxSip.setStatus("Disconnected");
717
-
718
-        // disable phone
719
-        ctxSip.setError(true, 'Websocket Disconnected.', 'An Error occurred connecting to the websocket.');
720
-
721
-        // remove existing sessions
722
-        $("#sessions > .session").each(function(i, session) {
723
-            ctxSip.removeSession(session, 500);
724
-        });
725
-    });
726
-
727
-    ctxSip.phone.on('registered', function(e) {
728
-
729
-        var closeEditorWarning = function() {
730
-            return 'If you close this window, you will not be able to make or receive calls from your browser.';
731
-        };
732
-
733
-        var closePhone = function() {
734
-            // stop the phone on unload
735
-            localStorage.removeItem('SipTripPhone');
736
-            ctxSip.phone.stop();
737
-        };
738
-
739
-        window.onbeforeunload = closeEditorWarning;
740
-        window.onunload       = closePhone;
741
-
742
-        // This key is set to prevent multiple windows.
743
-        localStorage.setItem('SipTripPhone', 'true');
744
-
745
-        $("#mldError").modal('hide');
746
-        ctxSip.setStatus("Ready");
747
-
748
-        // Get the userMedia and cache the stream
749
-        var audio = document.getElementById('audioRemote');
750
-        var mediaStream = new MediaStream();
751
-        let audioTrack = null;
752
-
753
-        navigator.mediaDevices.getUserMedia({ audio : true, video : false }, ctxSip.getUserMediaSuccess, ctxSip.getUserMediaFailure).then(function(mediaStream) {
754
-
755
-           let audioTracks = mediaStream.getAudioTracks();
756
-           audio.srcObject = mediaStream;
757
-
758
-           if (audioTracks.length) {
759
-               audioTrack = audioTracks[0];
760
-           }
761
-        }).then(function() {
762
-           new Promise(function(resolve) {
763
-               audio.onloadedmetadata = resolve;
764
-           })
765
-        })
766
-
767
-    });
768
-
769
-    ctxSip.phone.on('registrationFailed', function(e) {
770
-        ctxSip.setError(true, 'Registration Error.', 'An error occurred while registering your phone. Please check your settings.');
771
-        ctxSip.setStatus("Error: Registration Failed");
772
-    });
773
-
774
-    ctxSip.phone.on('unregistered', function(e) {
775
-        ctxSip.setError(true, 'Registration Error.', 'An error occurred while registering your phone. Please check your settings.');
776
-        ctxSip.setStatus("Error: Registration Failed");
777
-    });
778
-
779
-    ctxSip.phone.on('invite', function (incomingSession) {
780
-
781
-        var s = incomingSession;
782
-
783
-        s.direction = 'incoming';
784
-        ctxSip.newSession(s);
785
-    });
786
-
787
-    // Auto-focus number input on backspace.
788
-    $('#sipClient').keydown(function(event) {
789
-        if (event.which === 8) {
790
-            $('#numDisplay').focus();
791
-        }
792
-    });
793
-
794
-    $('#numDisplay').keypress(function(e) {
795
-        // Enter pressed? so Dial.
796
-        if (e.which === 13) {
797
-            ctxSip.phoneCallButtonPressed();
798
-        }
799
-    });
800
-
801
-    var clck = 0;
802
-
803
-    $('.digit').click(function(event) {
804
-
805
-     if (event.shiftKey) {
806
-
807
-         clck++;
808
-         event.preventDefault();
809
-         var num = $('#numDisplay').val();
810
-         var dig;
811
-         var diginit = $(this).data('digit').toString().split(',');
812
-         var elct = diginit.length;
813
-
814
-         dig = diginit[clck%elct];
815
-         var numsec = num.slice(0,-1);
816
-         $('#numDisplay').val(numsec+dig);
817
-         ctxSip.sipSendDTMF(dig);
818
-
819
-     } else {
820
-         event.preventDefault();
821
-         var num = $('#numDisplay').val();
822
-         var dig;
823
-         var diginit = $(this).data('digit').toString().split(',');
824
-
825
-         dig = diginit[0];
826
-         clck = 0;
827
-         $('#numDisplay').val(num+dig);
828
-         ctxSip.sipSendDTMF(dig);
829
-       }
830
-
831
-       return false;
832
-
833
-    });
834
-
835
-    $('#phoneUI .dropdown-menu').click(function(e) {
836
-        e.preventDefault();
837
-    });
838
-
839
-    $('#phoneUI').delegate('.btnCall', 'click', function(event) {
840
-        ctxSip.phoneCallButtonPressed();
841
-        // to close the drop-down
842
-        return true;
843
-    });
844
-
845
-    $('.sipLogClear').click(function(event) {
846
-        event.preventDefault();
847
-        ctxSip.logClear();
848
-    });
849
-
850
-    $('#sip-logitems').delegate('.sip-logitem .btnCall', 'click', function(event) {
851
-        var sessionid = $(this).closest('.sip-logitem').data('sessionid');
852
-        ctxSip.phoneCallButtonPressed(sessionid);
853
-        return false;
854
-    });
855
-
856
-    $('#sip-logitems').delegate('.sip-logitem .btnHoldResume', 'click', function(event) {
857
-        var sessionid = $(this).closest('.sip-logitem').data('sessionid');
858
-        ctxSip.phoneHoldButtonPressed(sessionid);
859
-        return false;
860
-    });
861
-
862
-    $('#sip-logitems').delegate('.sip-logitem .btnHangUp', 'click', function(event) {
863
-        var sessionid = $(this).closest('.sip-logitem').data('sessionid');
864
-        ctxSip.sipHangUp(sessionid);
865
-        return false;
866
-    });
867
-
868
-    $('#sip-logitems').delegate('.sip-logitem .btnTransfer', 'click', function(event) {
869
-        var sessionid = $(this).closest('.sip-logitem').data('sessionid');
870
-        ctxSip.sipTransfer(sessionid);
871
-        return false;
872
-    });
873
-
874
-    $('#sip-logitems').delegate('.sip-logitem .btnMute', 'click', function(event) {
875
-        var sessionid = $(this).closest('.sip-logitem').data('sessionid');
876
-        ctxSip.phoneMuteButtonPressed(sessionid);
877
-
878
-        var crtMuteBtn = $(this).closest('.sip-logitem').find('.btnMute');
879
-        if (crtMuteBtn.css("background-color") != "rgb(145, 103, 43)") {
880
-            crtMuteBtn.css("background-color", "rgb(145, 103, 43)");
881
-            crtMuteBtn.prop("title", "Unmute");
882
-        } else {
883
-            crtMuteBtn.css("background-color", "rgb(240, 173, 78)");
884
-            crtMuteBtn.prop("title", "Mute");
885
-        }
886
-
887
-        return false;
888
-    });
889
-
890
-    $('#sip-logitems').delegate('.sip-logitem', 'dblclick', function(event) {
891
-        event.preventDefault();
892
-
893
-        var uricalled = $(this).data('uri');
894
-        var uriproc = uricalled.split(":");
895
-        var uripronb = uriproc[1].split("@");
896
-        var uri = uripronb[0];
897
-        $('#numDisplay').val(uri);
898
-        ctxSip.phoneCallButtonPressed();
899
-    });
900
-
901
-    $('#sldVolume').on('change', function() {
902
-
903
-            var v  = $(this).val() / 100,
904
-            btn    = $('#btnVol'),
905
-            icon   = $('#btnVol').find('i'),
906
-            active = ctxSip.callActiveID;
907
-
908
-        // Set the object and media stream volumes
909
-        if (ctxSip.Sessions[active]) {
910
-            ctxSip.Sessions[active].player.volume = v;
911
-            ctxSip.callVolume                     = v;
912
-        }
913
-
914
-        // Set the others
915
-        $('audio').each(function() {
916
-            $(this).get()[0].volume = v;
917
-        });
918
-
919
-        if (v < 0.1) {
920
-            btn.removeClass(function (index, css) {
921
-                   return (css.match (/(^|\s)btn\S+/g) || []).join(' ');
922
-                })
923
-                .addClass('btn btn-sm btn-danger');
924
-            icon.removeClass().addClass('fa fa-fw fa-volume-off');
925
-        } else if (v < 0.8) {
926
-            btn.removeClass(function (index, css) {
927
-                   return (css.match (/(^|\s)btn\S+/g) || []).join(' ');
928
-               }).addClass('btn btn-sm btn-info');
929
-            icon.removeClass().addClass('fa fa-fw fa-volume-down');
930
-        } else {
931
-            btn.removeClass(function (index, css) {
932
-                   return (css.match (/(^|\s)btn\S+/g) || []).join(' ');
933
-               }).addClass('btn btn-sm btn-primary');
934
-            icon.removeClass().addClass('fa fa-fw fa-volume-up');
935
-        }
936
-        return false;
937
-    });
938
-
939
-    // Hide the spalsh after 3 secs.
940
-    setTimeout(function() {
941
-        ctxSip.logShow();
942
-    }, 3000);
943
-
944
-
945
-    /**
946
-     * Stopwatch object used for call timers
947
-     *
948
-     * @param {dom element} elem
949
-     * @param {[object]} options
950
-     */
951
-    var Stopwatch = function(elem, options) {
952
-
953
-        // Private functions
954
-        function createTimer() {
955
-            return document.createElement("span");
956
-        }
957
-
958
-        var timer = createTimer(),
959
-            offset,
960
-            clock,
961
-            interval;
962
-
963
-        // Default options
964
-        options           = options || {};
965
-        options.delay     = options.delay || 1000;
966
-        options.startTime = options.startTime || Date.now();
967
-
968
-        // Append elements
969
-        elem.appendChild(timer);
970
-
971
-        function start() {
972
-            if (!interval) {
973
-                offset   = options.startTime;
974
-                interval = setInterval(update, options.delay);
975
-            }
976
-        }
977
-
978
-        function stop() {
979
-            if (interval) {
980
-                clearInterval(interval);
981
-                interval = null;
982
-            }
983
-        }
984
-
985
-        function reset() {
986
-            clock = 0;
987
-            render();
988
-        }
989
-
990
-        function update() {
991
-            clock += delta();
992
-            render();
993
-        }
994
-
995
-        function render() {
996
-            timer.innerHTML = moment(clock).format('mm:ss');
997
-        }
998
-
999
-        function delta() {
1000
-            var now = Date.now(),
1001
-                d   = now - offset;
1002
-
1003
-            offset = now;
1004
-            return d;
1005
-        }
1006
-
1007
-        // Initialize
1008
-        reset();
1009
-
1010
-        // Public API
1011
-        this.start = start; //function() { start; }
1012
-        this.stop  = stop; //function() { stop; }
1013
-    };
1014
-
1015
-});
1016 0
deleted file mode 100644
... ...
@@ -1,30 +0,0 @@
1
-<?php
2
-/**
3
- * @copyright 2021 Double Bastion LLC <www.doublebastion.com>
4
- *
5
- * @author Double Bastion LLC
6
- *
7
- * @license GNU AGPL version 3 or any later version
8
- *
9
- * This program is free software; you can redistribute it and/or
10
- * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
11
- * License as published by the Free Software Foundation; either
12
- * version 3 of the License, or any later version.
13
- *
14
- * This program is distributed in the hope that it will be useful,
15
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17
- * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
18
- *
19
- * You should have received a copy of the GNU Affero General Public
20
- * License along with this program.  If not, see <http://www.gnu.org/licenses/>.
21
- *
22
- */
23
-
24
-declare(strict_types=1);
25
-
26
-style('sip_trip_phone', 'style');
27
-
28
-?>
29
-
30
-<div id="STPhoneContent"><div id="STPhoneGreyLogo"></div></div>
31 0
deleted file mode 100644
... ...
@@ -1,37 +0,0 @@
1
-<?php
2
-/**
3
- * @copyright 2021 Double Bastion LLC <www.doublebastion.com>
4
- *
5
- * @author Double Bastion LLC
6
- *
7
- * @license GNU AGPL version 3 or any later version
8
- *
9
- * This program is free software; you can redistribute it and/or
10
- * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
11
- * License as published by the Free Software Foundation; either
12
- * version 3 of the License, or any later version.
13
- *
14
- * This program is distributed in the hope that it will be useful,
15
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17
- * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
18
- *
19
- * You should have received a copy of the GNU Affero General Public
20
- * License along with this program.  If not, see <http://www.gnu.org/licenses/>.
21
- *
22
- */
23
-
24
-declare(strict_types=1);
25
-
26
-script('sip_trip_phone', 'launchphone');
27
-style('sip_trip_phone', 'style');
28
-
29
-?>
30
-
31
-<div id="app">
32
-        <div id="app-content">
33
-                <div id="app-content-wrapper">
34
-                        <?php print_unescaped($this->inc('content/index')); ?>
35
-                </div>
36
-        </div>
37
-</div>
38 0
\ No newline at end of file
39 1
deleted file mode 100644
... ...
@@ -1,82 +0,0 @@
1
-<?php
2
-/**
3
- * @copyright 2021 Double Bastion LLC <www.doublebastion.com>
4
- *
5
- * @author Double Bastion LLC
6
- *
7
- * @license GNU AGPL version 3 or any later version
8
- *
9
- * This program is free software; you can redistribute it and/or
10
- * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
11
- * License as published by the Free Software Foundation; either
12
- * version 3 of the License, or any later version.
13
- *
14
- * This program is distributed in the hope that it will be useful,
15
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17
- * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
18
- *
19
- * You should have received a copy of the GNU Affero General Public
20
- * License along with this program.  If not, see <http://www.gnu.org/licenses/>.
21
- *
22
- */
23
-
24
-declare(strict_types=1);
25
-
26
-style('sip_trip_phone', 'style');
27
-script('sip_trip_phone', 'settings');
28
-
29
-?>
30
-
31
-<div id="sip_trip_phone_adm">
32
-	<div class="section">
33
-           <h2><?php p($l->t('SIP Trip Phone'));?></h2>
34
-	   <p id="settings-dscr"><?php p($l->t('Enter your credentials in the fields from below:')); ?></p><br>
35
-
36
-           <div class="stp_followupsection">
37
-
38
-                <form id="asterisk_credentials" action="#" >
39
-
40
-                   <p><label for="pdisplayname"><b><?php p($l->t('Display Name:'));?></b></label></p>
41
-                   <input type="text" class="sip_trip_box" id="pdisplayname" name="pdisplayname" autocomplete="false"
42
-                          placeholder="E.g.: Ben Dove or +15012345670" /><br>
43
-
44
-                   <p><label for="sipusername"><b><?php p($l->t('SIP User:'));?></b></label></p>
45
-                   <input type="text" class="sip_trip_box" id="sipusername" name="sipusername" autocomplete="false"
46
-                          placeholder="E.g.: 1610  or john_doe" /><br>
47
-
48
-                   <p><label for="sipuserpassword"><b><?php p($l->t('SIP User Password:'));?></b></label></p>
49
-                   <input type="password" class="sip_trip_box" id="sipuserpassword" name="sipuserpassword" autocomplete="false"
50
-                          placeholder="E.g.: r?2V!s5w9Q&d7W?8" /><br>
51
-
52
-                   <p><label for="stphwssurl"><b><?php p($l->t('WSS URL:'));?></b></label></p>
53
-                   <input type="text" class="sip_trip_box" id="stphwssurl" name="stphwssurl" autocomplete="false"
54
-                          placeholder="E.g.: wss://cloud.example.com:8089/ws" /><br>
55
-
56
-                   <p id="labelSipRealm"><label for="siprealm"><b><?php p($l->t('SIP Realm  (the IPv4 address of your Asterisk server or the domain from the WSS URL offered by the SIP provider):'));?></b></label></p>
57
-                   <input type="text" class="sip_trip_box" id="siprealm" name="siprealm" autocomplete="false"
58
-                          placeholder="E.g.: 123.123.123.123 or sip.example.com" /><br>
59
-
60
-                   <p id="stunServer"><label for="stunserver"><b><?php p($l->t("STUN Server's IPv4 address and port number or domain and port number (optional):"));?></b></label></p>
61
-                   <input type="text" class="sip_trip_box" id="stunserver" name="stunserver" autocomplete="false"
62
-                          placeholder="E.g.: 123.123.123.123:8443 or stun.domain.com:3478" /><br>
63
-
64
-                   <p id="debugLogging"><label for="tracesipmsg"><b><?php p($l->t("Show debug logging in my browser's console:"));?></b></label></p>
65
-                   <input type="checkbox" id="tracesipmsg" name="tracesipmsg" autocomplete="false" /><br>
66
-
67
-                   <div id="voiceNumbers"><label for="voicenumbers"><b><?php p($l->t('Available phone number(s):'));?></b><div class="stpVoicePhNoTip"><span id="stpVoicePhNoInfo">i</span><div class="stpVoicePhNoText">Enter all the phone numbers that you have configured in Asterisk and your SIP provider(s), for making voice phone calls. Each number must be preceded by the <a href="https://en.wikipedia.org/wiki/List_of_country_calling_codes#Alphabetical_order" target="_blank" rel="noreferrer noopener" style="color:#1b60ba">country calling code</a>, the plus sign and the 2 letter abbreviation of your SIP provider's name. For example, if you use the US phone number 3076543210 rented from Telnyx, and the UK phone number 7654321012 rented from Localphone, you should enter:<br> Tx: +13076543210,Ln: +447654321012 <br>where Tx stands for Telnyx, 1 is the country calling code for US, Ln stands for Localphone and 44 is the country calling code for UK. There is a space before each plus sign and there is no space before each comma. The 2 letter abbreviation for Telnyx is Tx , for Localphone is Ln , for Flowroute is Fl , for Twilio is Tw and for Vonage is Vn . If you use other providers you can create a different 2 letter abbreviation for each, so as to easily identify it. You have to treat each abbreviation differently in the dial plan, as explained in the <a href="https://www.doublebastion.com/install-asterisk/#testing-asterisk" target="_blank" rel="noreferrer noopener" style="color:#1b60ba">documentation</a>, so that Asterisk knows which SIP provider and phone number to use for each outbound call. <b>This list of phone numbers allows you to set any of them as the 'From' number, when making phone calls.</b> If you are not using Asterisk and you connect SIP Trip Phone directly to the SIP provider, you can leave this field empty.</div></div></label></div>
68
-                   <input type="text" class="sip_trip_box" id="voicenumbers" name="voicenumbers" autocomplete="false" placeholder="Eg: Tx: +15676543210,Ln: +491234567891,Fl: +347865432101" /><br>
69
-
70
-                   <div id="dftVoiceNumber"><label for="defaultvoicenumber"><b><?php p($l->t('Default phone number for outgoing calls (optional):'));?></b><div class="stpdtVoicePhNoTip"><span id="stpdtVoicePhNoInfo">i</span><div class="stpdtVoicePhNoText">Enter the phone number configured for voice calls in Asterisk and your SIP provider, that you want to use as the default 'From' number when making phone calls. If you set a number here and you make a phone call without choosing a 'From' number from the drop-down list on the phone window, the number from this field is automatically chosen as the 'From' number and the receiver sees the call as coming from this number. If you leave this field empty, the first phone number from the numbers listed in the 'Available phone number(s)' field from above is used as the 'From' number for outbound phone calls. The phone number must be preceded by the <a href="https://en.wikipedia.org/wiki/List_of_country_calling_codes#Alphabetical_order" target="_blank" rel="noreferrer noopener" style="color:#1b60ba">country calling code</a>, the plus sign and the 2 letter abbreviation of your SIP provider's name. For example, if you want to set as default 'From' number for outbound calls the US number 3076543210 rented from Telnyx, you have to enter Tx: +13076543210 . There is a space before the plus sign. The 2 letter abbreviation for Telnyx is Tx , for Localphone is Ln , for Flowroute is Fl , for Twilio is Tw and for Vonage is Vn . If you use other providers you can create a different 2 letter abbreviation for each, so as to easily identify it. You have to treat each abbreviation differently in the dial plan, as explained in the <a href="https://www.doublebastion.com/install-asterisk/#testing-asterisk" target="_blank" rel="noreferrer noopener" style="color:#1b60ba">documentation</a>, so that Asterisk knows which SIP provider and phone number to use for each outbound call. If you are not using Asterisk and you connect SIP Trip Phone directly to the SIP provider, you can leave this field empty.</div></div></label></div>
71
-                   <input type="text" class="sip_trip_box" id="defaultvoicenumber" name="defaultvoicenumber" autocomplete="false" placeholder="Eg: Tx: +15676543210" /><br>
72
-
73
-                   <input type="hidden" id="user_id" name="user_id" /><br>
74
-
75
-                   <input id="save_sipph_settings" type="submit" value="<?php p($l->t('Save')) ?>" />
76
-
77
-                   <span id="sip_trip_phone_save_msg"></span>
78
-
79
-               </form>
80
-           </div>
81
-        </div>
82
-</div>