diff --git a/App/Controllers/ModulePhoneBookController.php b/App/Controllers/ModulePhoneBookController.php index 58b6c2d..c445bbf 100644 --- a/App/Controllers/ModulePhoneBookController.php +++ b/App/Controllers/ModulePhoneBookController.php @@ -123,6 +123,7 @@ public function getNewRecordsAction(): void $parameters['columns'] = [ 'call_id', 'number' => 'number_rep', + 'created' => 'created', 'DT_RowId' => 'id', ]; $parameters['order'] = ['call_id desc']; @@ -156,20 +157,18 @@ public function saveAction(): void $dataId = $this->request->getPost('id', ['string', 'trim']); $callId = $this->request->getPost('call_id', ['string', 'trim']); - $number = $this->request->getPost('number', ['alnum']); - $numberRep = $this->request->getPost('number_rep', ['string', 'trim'], $number); + $numberRep = $this->request->getPost('number_rep', ['string', 'trim']); + $number = PhoneBook::cleanPhoneNumber($numberRep, TRUE); if (empty($callId) || empty($number)) { return; } // If we are unable to change the primary field, delete the old record and recreate it - $oldId = null; $record = null; if (stripos($dataId, 'new') === false) { $record = PhoneBook::findFirstById($dataId); if ($record->number !== $number) { - $oldId = $record->id; $record->delete(); $record = null; } @@ -179,39 +178,17 @@ public function saveAction(): void $record = new PhoneBook(); } - foreach ($record as $key => $value) { - switch ($key) { - case 'id': - break; - case 'number': - $record->number = $number; - break; - case 'number_rep': - $record->number_rep = $numberRep; - break; - case 'call_id': - $record->call_id = $callId; - break; - case 'search_index': - // Collect data for the search index - $username = mb_strtolower($callId); - // Combine all fields into a single string - $record->search_index = $username . $number . $numberRep; - break; - default: - break; - } - } + $record->setPhonebookRecord($callId, $numberRep); if ($record->save() === false) { $errors = $record->getMessages(); $this->flash->error(implode('
', $errors)); $this->view->success = false; - + $this->response->setStatusCode(500); return; } - $this->view->data = ['oldId' => $oldId, 'newId' => $record->id]; + $this->view->data = ['oldId' => $dataId, 'newId' => $record->id]; $this->view->success = true; } @@ -249,9 +226,9 @@ public function deleteAllRecordsAction(): void } /** - * Toggle input mask feature. + * Save settings */ - public function toggleDisableInputMaskAction(): void + public function saveSettingsAction(): void { if (!$this->request->isPost()) { return; @@ -262,10 +239,19 @@ public function toggleDisableInputMaskAction(): void $settings = new Settings(); } - $settings->disableInputMask = $this->request->getPost('disableInputMask') === 'true' ? '1' : '0'; + if ($this->request->hasPost('disableInputMask')) { + $settings->disableInputMask = $this->request->getPost('disableInputMask') === 'true' ? '1' : '0'; + } + + if ($this->request->hasPost('phoneBookApiUrl')) { + $settings->phoneBookApiUrl = empty($this->request->getPost('phoneBookApiUrl')) ? NULL : $this->request->getPost('phoneBookApiUrl', 'trim'); + $settings->phoneBookLifeTime = empty($this->request->getPost('phoneBookLifeTime')) ? 0 : $this->request->getPost('phoneBookLifeTime', 'int!'); + } + if (!$settings->save()) { $this->flash->error(implode('
', $settings->getMessages())); $this->view->success = false; + $this->response->setStatusCode(500); return; } $this->view->success = true; diff --git a/App/Forms/ModuleConfigForm.php b/App/Forms/ModuleConfigForm.php index ea491e5..9220af7 100644 --- a/App/Forms/ModuleConfigForm.php +++ b/App/Forms/ModuleConfigForm.php @@ -21,6 +21,8 @@ namespace Modules\ModulePhoneBook\App\Forms; use MikoPBX\AdminCabinet\Forms\BaseForm; +use Phalcon\Forms\Element\Text; +use Phalcon\Forms\Element\Numeric; use Phalcon\Forms\Element\Check; use Phalcon\Forms\Element\File; @@ -31,6 +33,20 @@ public function initialize($entity = null, $options = null): void // DisableInputMask $this->addCheckBox('disableInputMask', intval($entity->disableInputMask) === 1); + // phoneBookApiUrl Text field + $this->add( + new Text('phoneBookApiUrl', [ + 'placeholder' => 'https://', + ]) + ); + + // phoneBookLifeTime Text field + $this->add( + new Numeric('phoneBookLifeTime', [ + 'min' => 0 + ]) + ); + // Excel file $excelFile = new File('excelFile'); $this->add($excelFile); @@ -49,7 +65,7 @@ public function addCheckBox(string $fieldName, bool $checked, string $checkedVal { $checkAr = ['value' => null]; if ($checked) { - $checkAr = ['checked' => $checkedValue,'value' => $checkedValue]; + $checkAr = ['checked' => $checkedValue, 'value' => $checkedValue]; } $this->add(new Check($fieldName, $checkAr)); } diff --git a/App/Views/ModulePhoneBook/Tabs/phonebookTab.volt b/App/Views/ModulePhoneBook/Tabs/phonebookTab.volt index aa8bfde..d01f378 100644 --- a/App/Views/ModulePhoneBook/Tabs/phonebookTab.volt +++ b/App/Views/ModulePhoneBook/Tabs/phonebookTab.volt @@ -8,7 +8,7 @@
+
+
+ + {{ form.render('phoneBookApiUrl') }} +
{{ t._('module_phnbk_ApiUrlDescription', {'repesent': '%number%'}) }}
+
+
+ + {{ form.render('phoneBookLifeTime') }} +
{{ t._('module_phnbk_СacheLifetimeDescription') }}
+
+
+
{{ t._('module_phnbk_SaveBtn') }}
+
+
{{ t._('module_phnbk_DeleteAllRecords') }}
diff --git a/Lib/MikoPBXVersion.php b/Lib/MikoPBXVersion.php index 7c25bc4..8207858 100644 --- a/Lib/MikoPBXVersion.php +++ b/Lib/MikoPBXVersion.php @@ -99,4 +99,17 @@ public static function getLoggerClass(): string return \Phalcon\Logger::class; } } + + /** + * Return validator Callback class for the current version of PBX + * @return class-string<\Phalcon\Filter\Validation\Validator\Callback>|class-string<\Phalcon\Validation\Validator\Callback> + */ + public static function getValidatorCallbackClass(): string + { + if (self::isPhalcon5Version()) { + return \Phalcon\Filter\Validation\Validator\Callback::class; + } else { + return \Phalcon\Validation\Validator\Callback::class; + } + } } diff --git a/Lib/PhoneBookAgi.php b/Lib/PhoneBookAgi.php index 4f1e982..bb8b2eb 100644 --- a/Lib/PhoneBookAgi.php +++ b/Lib/PhoneBookAgi.php @@ -23,6 +23,7 @@ use MikoPBX\Core\Asterisk\AGI; use MikoPBX\Core\System\Util; use Modules\ModulePhoneBook\Models\PhoneBook; +use Modules\ModulePhoneBook\Models\Settings; use Phalcon\Di\Injectable; /** @@ -48,15 +49,24 @@ public static function setCallerID(string $type): void } else { $number = $agi->request['agi_extension']; } - + $number_orig = $number; // Normalize the phone number to match the expected format (last 9 digits) - $number = '1' . substr($number, -9); + $number = PhoneBook::cleanPhoneNumber($number, TRUE); // Find the corresponding phonebook entry by the number $result = PhoneBook::findFirstByNumber($number); + $settings = Settings::findFirst(); + $lifeTime = $settings->phoneBookLifeTime ?? 0; + + if ($result === NULL || empty($result->call_id) || ($lifeTime > 0 && $result->created > 0 && $result->created + $lifeTime < time())) { + // The record was not found - we are searching through the API + $searcher = new PhoneBookFind(); + $result = $searcher->findApiByNumber($number_orig, $result); + } + // If a matching record is found and the call_id is not empty, set the appropriate caller ID - if ($result !== null && !empty($result->call_id)) { + if ($result !== NULL && !empty($result->call_id)) { if ($type === 'in') { $agi->set_variable('CALLERID(name)', $result->call_id); } else { @@ -68,4 +78,4 @@ public static function setCallerID(string $type): void Util::sysLogMsg('PhoneBookAGI', $e->getMessage(), LOG_ERR); } } -} \ No newline at end of file +} diff --git a/Lib/PhoneBookFind.php b/Lib/PhoneBookFind.php new file mode 100644 index 0000000..72bf3dd --- /dev/null +++ b/Lib/PhoneBookFind.php @@ -0,0 +1,131 @@ +. + */ + +namespace Modules\ModulePhoneBook\Lib; + +use GuzzleHttp\Client; +use GuzzleHttp\Exception\ClientException; +use GuzzleHttp\Exception\GuzzleException; +use MikoPBX\Core\System\Util; +use Modules\ModulePhoneBook\Models\PhoneBook; +use Modules\ModulePhoneBook\Models\Settings; +use Phalcon\Di\Injectable; + +include_once __DIR__ . '/../vendor/autoload.php'; + +/** + * Class PhoneBookFind + * + */ +class PhoneBookFind extends Injectable +{ + /** + * Find CallerID from API + * + * @param string $number_search + * @param PhoneBook|null $oldPhoneBook + * @return PhoneBook|null + */ + public function findApiByNumber(string $number_search, ?PhoneBook $oldPhoneBook = NULL): ?PhoneBook + { + // Normalize the phone number to match the expected format (last 9 digits) + $number = PhoneBook::cleanPhoneNumber($number_search, TRUE); + + if (empty($number)) { + return NULL; + } + + $settings = Settings::findFirst(); + $url = !empty($settings->phoneBookApiUrl) ? str_replace( + '%number%', + $number, + $settings->phoneBookApiUrl + ) : NULL; + + if (empty($url)) { + return NULL; + } + + $callerID = $this->getRequest($url); + + // Logging + Util::sysLogMsg( + 'PhoneBookAGI', + "Find CallerID from API: $number => " . (empty($callerID) ? 'NOT FOUND' : $callerID) + ); + + if ($callerID !== NULL) { + // Saving the number in the phonebook + $record = $oldPhoneBook !== NULL && $oldPhoneBook->number === $number ? $oldPhoneBook : PhoneBook::findFirstByNumber( + $number + ); + + if ($record == NULL) { + $record = new PhoneBook(); + } + + $record->setPhonebookRecord( + $callerID, + $record->cleanPhoneNumber($number_search), + time() + ); + + if (!$record->save()) { + // Log the error message if an exception occurs + Util::sysLogMsg('PhoneBookAGI', implode(' | ', $record->getMessages()), LOG_ERR); + } else { + return $record; + } + } + + return NULL; + } + + /** + * Get the $url content with CURL + * + * @param string $url + * @return string|null + */ + private function getRequest(string $url): ?string + { + $callerId = NULL; + try { + $client = new Client([ + 'timeout' => 3, + 'connect_timeout' => 2 + ]); + $response = $client->get($url); + $status = $response->getStatusCode(); + if ($status === 200) { + $callerId = trim($response->getBody()->getContents()); + $callerId = trim(strip_tags(str_replace('"', "'", $callerId))); + } + } catch (ClientException $e) { + // ClientException only catches status code between 400x-499 + //Util::sysLogMsg('PhoneBookAGI', $e->getMessage(), LOG_ERR); + } catch (GuzzleException $e) { + // Log the error message if an exception occurs + Util::sysLogMsg('PhoneBookAGI', $e->getMessage(), LOG_ERR); + } + + return !empty($callerId) ? $callerId : NULL; + } +} diff --git a/Lib/PhoneBookImport.php b/Lib/PhoneBookImport.php index e5284b3..02646db 100644 --- a/Lib/PhoneBookImport.php +++ b/Lib/PhoneBookImport.php @@ -67,10 +67,8 @@ public function run(string $uploadedFilePath): PBXApiResult for ($row = 2; $row <= $highestRow; ++$row) { $callId = $sheet->getCell([1, $row])->getValue(); $numberRep = $sheet->getCell([2, $row])->getValue(); - $number = $this->cleanPhoneNumber($numberRep); - $number = '1' . substr($number, -9); // Add 1 to the beginning of the number - $res = $this->savePhonebookRecord($callId, $numberRep, $number); + $res = $this->savePhonebookRecord($callId, $numberRep); if (!$res->success) { $result->success = false; $result->messages['error'] = array_merge($result->messages['error']??[], $res->messages['error']??[]); @@ -111,21 +109,15 @@ private function validateExcelFile(string $filePath): bool * * @param string $callId The caller ID * @param string $numberRep The phone number in its original format (with special characters) - * @param string $number The cleaned phone number (digits only) * @return PBXApiResult The result of the save operation */ - private function savePhonebookRecord(string $callId, string $numberRep, string $number): PBXApiResult + private function savePhonebookRecord(string $callId, string $numberRep): PBXApiResult { $result = new PBXApiResult(); $record = new PhoneBook(); - $record->call_id = $callId; - $record->number_rep = $numberRep; - $record->number = $number; - // Collect data for the search index - $username = mb_strtolower($callId); - // Combine all fields into a single string - $record->search_index = $username . $number . $numberRep; + $record->setPhonebookRecord($callId, $numberRep); + if (!$record->save()) { $errors = implode('
', $record->getMessages()); $message = $this->translation->_("module_phnbk_ImportError"); @@ -136,16 +128,4 @@ private function savePhonebookRecord(string $callId, string $numberRep, string $ $result->success = true; return $result; } - - /** - * Clean phone number by removing non-numeric characters - * - * @param string $numberRep The original phone number (including special characters) - * @return string The cleaned phone number (digits only) - */ - private function cleanPhoneNumber(string $numberRep): string - { - // Remove all non-numeric characters - return preg_replace('/\D+/', '', $numberRep); - } } diff --git a/Messages/en.php b/Messages/en.php index 4473672..05ef9eb 100644 --- a/Messages/en.php +++ b/Messages/en.php @@ -1,12 +1,13 @@ 'Module phonebook - %repesent%', 'mo_ModuleModulePhoneBook' => 'Module phonebook', 'BreadcrumbModulePhoneBook' => 'Phonebook', @@ -45,4 +46,11 @@ 'module_phnbk_AllRecordsDeleted' => 'All entries have been deleted', 'module_phnbk_RecognitionOnProgress' => 'Parsing and loading data from a file', 'module_phnbk_RecognitionFinished' => 'Data loading completed', + 'module_phnbk_UrlNotValid' => 'Url not valid', + 'module_phnbk_IntegerPositiveOrZero' => 'A positive integer or zero', + 'module_phnbk_СacheLifetime' => 'Cache lifetime', + 'module_phnbk_СacheLifetimeDescription' => 'The number of seconds during which the cached record will be valid. 0 - forever.', + 'module_phnbk_SaveBtn' => 'Save', + 'module_phnbk_ApiUrl' => 'The URL to search for the CallerID', + 'module_phnbk_ApiUrlDescription' => '%repesent% in the line will be replaced with a phone number.' ]; diff --git a/Messages/ru.php b/Messages/ru.php index 04ab958..3f1b825 100644 --- a/Messages/ru.php +++ b/Messages/ru.php @@ -48,13 +48,20 @@ 'module_phnbk_NoFileUploaded' => 'Не загружен файл для импорта', 'module_phnbk_invalidFormat' => 'Ошибка формата файла', 'module_phnbk_DeleteAllTitle' => 'Внимание!', - 'module_phnbk_DeleteAllDescription' => 'Все записи телефонной книги будут безвозвратно удалены, если вам нужно удалить одну или запись, используйтесь кнопкой в таблице.', + 'module_phnbk_DeleteAllDescription' => 'Все записи телефонной книги будут безвозвратно удалены, если вам нужно удалить одну или несколько записей, используйтесь кнопкой в таблице.', 'module_phnbk_CancelBtn' => 'Отмена', 'module_phnbk_Approve' => 'Удалить все', 'module_phnbk_GeneraLFileUploadError' => 'Ошибка при загрузке файла', - 'module_phnbk_UploadError'=>'Ошибка загрузки файла', - 'module_phnbk_UploadInProgress'=>'Загрузки файла на сервер', - 'module_phnbk_AllRecordsDeleted'=>'Все записи удалены', - 'module_phnbk_RecognitionOnProgress'=>'Разбор и загрузка данных из файла', - 'module_phnbk_RecognitionFinished'=>'Загрузка данных выполнена' + 'module_phnbk_UploadError' => 'Ошибка загрузки файла', + 'module_phnbk_UploadInProgress' => 'Загрузки файла на сервер', + 'module_phnbk_AllRecordsDeleted' => 'Все записи удалены', + 'module_phnbk_RecognitionOnProgress' => 'Разбор и загрузка данных из файла', + 'module_phnbk_RecognitionFinished' => 'Загрузка данных выполнена', + 'module_phnbk_UrlNotValid' => 'Недопустимый URL-адрес', + 'module_phnbk_IntegerPositiveOrZero' => 'Целое положительное число или ноль', + 'module_phnbk_СacheLifetime' => 'Время жизни кеша', + 'module_phnbk_СacheLifetimeDescription' => 'Количество секунд, в течение которых кэшированная запись будет действительна. 0 - навсегда.', + 'module_phnbk_SaveBtn' => 'Сохранить', + 'module_phnbk_ApiUrl' => 'URL-адрес для поиска CallerID', + 'module_phnbk_ApiUrlDescription' => '%repesent% в строке будет заменен на номер телефона.' ]; diff --git a/Models/PhoneBook.php b/Models/PhoneBook.php index e5a6eba..ce42345 100644 --- a/Models/PhoneBook.php +++ b/Models/PhoneBook.php @@ -17,6 +17,7 @@ * You should have received a copy of the GNU General Public License along with this program. * If not, see . */ + namespace Modules\ModulePhoneBook\Models; use MikoPBX\Modules\Models\ModulesModelsBase; @@ -30,7 +31,8 @@ * @method static mixed findFirstByNumber(array|string|int $parameters = null) * @Indexes( * [name='number', columns=['number'], type=''], - * [name='CallerID', columns=['CallerID'], type=''] + * [name='CallerID', columns=['CallerID'], type=''], + * [name='Created', columns=['created'], type=''] * ) */ class PhoneBook extends ModulesModelsBase @@ -71,6 +73,13 @@ class PhoneBook extends ModulesModelsBase */ public ?string $search_index = ""; + /** + * Created - Created timestamp or 0 + * + * @Column(type="integer", nullable=false, default=0) + */ + public int $created = 0; + /** * Initializes the model by setting the source table, * calling the parent initializer, and enabling dynamic updates. @@ -107,4 +116,38 @@ public function validation(): bool return $this->validate($validation); } + + + /** + * + * @param string $callId + * @param string $numberRep + * @param int $created + * @return void + */ + public function setPhonebookRecord(string $callId, string $numberRep, int $created = 0): void + { + $this->call_id = trim(strip_tags(str_replace('"',"'", $callId))); + $this->number_rep = $numberRep; + $this->number = $this->cleanPhoneNumber($numberRep, TRUE); + $this->created = $created; + + // Combine all fields into a single string + $this->search_index = mb_strtolower($callId) . $this->number . $this->number_rep; + } + + /** + * Clean phone number by removing non-numeric characters + * + * @param string $numberRep The original phone number (including special characters) + * @param boolean $isNormalize Is Normalize number + * @return string The cleaned phone number (digits only) + */ + public static function cleanPhoneNumber(string $numberRep, bool $isNormalize = FALSE): string + { + // Remove all non-numeric characters + $numberRep = preg_replace('/\D+/', '', $numberRep); + // Normalize number + return $isNormalize ? '1' . substr($numberRep, -9) : $numberRep; + } } diff --git a/Models/Settings.php b/Models/Settings.php index f4eeaa1..28001b2 100644 --- a/Models/Settings.php +++ b/Models/Settings.php @@ -15,6 +15,7 @@ namespace Modules\ModulePhoneBook\Models; use MikoPBX\Modules\Models\ModulesModelsBase; +use Modules\ModulePhoneBook\Lib\MikoPBXVersion; class Settings extends ModulesModelsBase { @@ -32,10 +33,62 @@ class Settings extends ModulesModelsBase */ public $disableInputMask; + /** + * Url for CallerID search + * + * @Column(type="string", nullable=true) + */ + public $phoneBookApiUrl; + + /** + * Lifetime in seconds + * + * @Column(type="integer", default="0", nullable=false) + */ + public $phoneBookLifeTime; + public function initialize(): void { $this->setSource('m_ModulePhoneBook'); parent::initialize(); } + + /** + * Validates the instance by ensuring the uniqueness of the 'number' attribute. + * + * @return bool Returns true if validation passes, otherwise false. + */ + public function validation(): bool + { + $validationClass = MikoPBXVersion::getValidationClass(); + $callbackClass = MikoPBXVersion::getValidatorCallbackClass(); + $validation = new $validationClass(); + + $validation->add( + 'phoneBookApiUrl', + new $callbackClass( + [ + 'callback' => function ($data) { + return empty($data->phoneBookApiUrl) || (filter_var($data->phoneBookApiUrl, FILTER_VALIDATE_URL) && stripos($data->phoneBookApiUrl, '%number%') !== FALSE); + }, + 'message' => $this->t('module_phnbk_UrlNotValid'), + ] + ) + ); + + $validation->add( + 'phoneBookLifeTime', + new $callbackClass( + [ + 'callback' => function ($data) { + return $data->phoneBookLifeTime>=0; + }, + 'message' => $this->t('module_phnbk_СacheLifetime') . ' - ' . $this->t('module_phnbk_IntegerPositiveOrZero'), + ] + ) + ); + + return $this->validate($validation); + } } diff --git a/README.md b/README.md index 8aad34b..cab7a2d 100644 --- a/README.md +++ b/README.md @@ -29,15 +29,17 @@ Main table storing contact information: ```sql CREATE TABLE m_PhoneBook ( id INTEGER PRIMARY KEY AUTO_INCREMENT, - number INTEGER, -- Normalized number (1 + last 9 digits) - number_rep VARCHAR(255), -- Display format (e.g., +7(906)555-43-43) - call_id VARCHAR(255), -- Caller ID display name - search_index TEXT -- Combined search field for full-text search + number INTEGER, -- Normalized number (1 + last 9 digits) + number_rep VARCHAR(255), -- Display format (e.g., +7(906)555-43-43) + call_id VARCHAR(255), -- Caller ID display name + search_index TEXT, -- Combined search field for full-text search + created INTEGER DEFAULT 0 -- Created timestamp or 0 ); -- Indexes CREATE INDEX number ON m_PhoneBook (number); CREATE INDEX CallerID ON m_PhoneBook (call_id); +CREATE INDEX Created ON m_PhoneBook (created); ``` ### Settings Table (m_ModulePhoneBook) @@ -47,7 +49,9 @@ Module configuration storage: ```sql CREATE TABLE m_ModulePhoneBook ( id INTEGER PRIMARY KEY AUTO_INCREMENT, - disableInputMask INTEGER DEFAULT 0 -- Toggle for input mask functionality + disableInputMask INTEGER DEFAULT 0, -- Toggle for input mask functionality + phoneBookApiUrl TEXT, -- Url for CallerID search + phoneBookLifeTime INTEGER DEFAULT 0 -- Lifetime in seconds ); ``` @@ -125,13 +129,18 @@ $contact->number_rep = '+7(906)555-43-43'; // Display format $contact->call_id = 'John Doe'; $contact->search_index = 'johndoe1065554343+7(906)555-43-43'; $contact->save(); + +// OR: +$contact = new PhoneBook(); +$contact->setPhonebookRecord('John Doe', '+7(906)555-43-43'); +$contact->save(); ``` ### Excel Import Format The module accepts Excel files with the following structure: ``` -| Name/Company | Phone Number | +| Name/Company | Phone Number | |-----------------|-------------------| | John Doe | +1 (555) 123-4567 | | ACME Corp | +1-777-888-9999 | @@ -169,4 +178,4 @@ GNU General Public License v3.0 - see LICENSE file for details. - Documentation: [https://docs.mikopbx.com/mikopbx/modules/miko/phone-book](https://docs.mikopbx.com/mikopbx/modules/miko/phone-book) - Email: help@miko.ru -- Issues: GitHub issue tracker \ No newline at end of file +- Issues: GitHub issue tracker diff --git a/composer.json b/composer.json index 589bd97..596d987 100644 --- a/composer.json +++ b/composer.json @@ -3,7 +3,8 @@ "description": "ModulePhoneBook", "require": { "php": "^7.4", - "maennchen/zipstream-php":"2.2.6", + "guzzlehttp/guzzle": "^7.10", + "maennchen/zipstream-php": "2.2.6", "phpoffice/phpspreadsheet": "1.29.2" }, "autoload": { diff --git a/composer.lock b/composer.lock index f37f043..62b9642 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "e7b81910101d64d6e1fc21896d21e1ef", + "content-hash": "193b719b1c8fbb8d020bfbcbe0e5087b", "packages": [ { "name": "ezyang/htmlpurifier", @@ -67,6 +67,331 @@ }, "time": "2024-11-01T03:51:45+00:00" }, + { + "name": "guzzlehttp/guzzle", + "version": "7.10.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/b51ac707cfa420b7bfd4e4d5e510ba8008e822b4", + "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^2.3", + "guzzlehttp/psr7": "^2.8", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-curl": "*", + "guzzle/client-integration-tests": "3.0.2", + "php-http/message-factory": "^1.1", + "phpunit/phpunit": "^8.5.39 || ^9.6.20", + "psr/log": "^1.1 || ^2.0 || ^3.0" + }, + "suggest": { + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "psr-18", + "psr-7", + "rest", + "web service" + ], + "support": { + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/7.10.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", + "type": "tidelift" + } + ], + "time": "2025-08-23T22:36:01+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "2.3.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "481557b130ef3790cf82b713667b43030dc9c957" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/481557b130ef3790cf82b713667b43030dc9c957", + "reference": "481557b130ef3790cf82b713667b43030dc9c957", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.44 || ^9.6.25" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/2.3.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "type": "tidelift" + } + ], + "time": "2025-08-22T14:34:08+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.8.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "21dc724a0583619cd1652f673303492272778051" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/21dc724a0583619cd1652f673303492272778051", + "reference": "21dc724a0583619cd1652f673303492272778051", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0", + "ralouphie/getallheaders": "^3.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "http-interop/http-factory-tests": "0.9.0", + "phpunit/phpunit": "^8.5.44 || ^9.6.25" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/2.8.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "time": "2025-08-23T21:21:41+00:00" + }, { "name": "maennchen/zipstream-php", "version": "2.2.6", @@ -631,6 +956,117 @@ }, "time": "2017-10-23T01:57:42+00:00" }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v2.5.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "605389f2a7e5625f273b53960dc46aeaf9c62918" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/605389f2a7e5625f273b53960dc46aeaf9c62918", + "reference": "605389f2a7e5625f273b53960dc46aeaf9c62918", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "2.5-dev" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:11:13+00:00" + }, { "name": "symfony/polyfill-mbstring", "version": "v1.31.0", diff --git a/public/assets/js/module-phonebook-datatable.js b/public/assets/js/module-phonebook-datatable.js index 2cd08b0..dc3c256 100644 --- a/public/assets/js/module-phonebook-datatable.js +++ b/public/assets/js/module-phonebook-datatable.js @@ -19,31 +19,28 @@ */ /* global globalRootUrl, globalTranslate, SemanticLocalization, UserMessage, InputMaskPatterns */ + var ModulePhoneBookDT = { /** * The global search input element. * @type {jQuery} */ $globalSearch: $('#global-search'), - /** * The page length selector. * @type {jQuery} */ $pageLengthSelector: $('#page-length-select'), - /** * The page length selector. * @type {jQuery} */ $searchExtensionsInput: $('#search-extensions-input'), - /** * The data table object. * @type {Object} */ dataTable: {}, - /** * The document body. * @type {jQuery} @@ -51,25 +48,21 @@ var ModulePhoneBookDT = { $body: $('body'), // Cached DOM elements $disableInputMaskToggle: $('#disable-input-mask'), - /** * The extensions table element. * @type {jQuery} */ $recordsTable: $('#phonebook-table'), - /** * The add new button element. * @type {jQuery} */ $addNewButton: $('#add-new-button'), - /** * Selector for number input fields. * @type {string} */ inputNumberJQTPL: 'input.number-input', - /** * List of input masks. * @type {null|Array} @@ -79,7 +72,6 @@ var ModulePhoneBookDT = { getNewRecordsAJAXUrl: "".concat(globalRootUrl, "module-phone-book/getNewRecords"), deleteRecordAJAXUrl: "".concat(globalRootUrl, "module-phone-book/delete"), saveRecordAJAXUrl: "".concat(globalRootUrl, "module-phone-book/save"), - /** * Initialize the module. * This includes setting up event listeners and initializing the DataTable. @@ -89,58 +81,56 @@ var ModulePhoneBookDT = { this.initializeDataTable(); this.initializeEventListeners(); }, - /** * Initialize the search functionality. * It listens for key events and applies a filter based on the user's input. */ initializeSearch: function initializeSearch() { var _this = this; - this.$globalSearch.on('keyup', function (e) { var searchText = _this.$globalSearch.val().trim(); - if (e.keyCode === 13 || e.keyCode === 8 || searchText.length === 0) { _this.applyFilter(searchText); } }); }, - /** * Initialize all event listeners. * Handles input focus, form submission, adding new rows, and delete actions. */ initializeEventListeners: function initializeEventListeners() { var _this2 = this; - // Handle focus on input fields for editing this.$body.on('focusin', '.caller-id-input, .number-input', function (e) { _this2.onFieldFocus($(e.target)); - }); // Handle loss of focus on input fields and save changes + }); + // Handle loss of focus on input fields and save changes this.$body.on('focusout', '.caller-id-input, .number-input', function () { _this2.saveChangesForAllRows(); - }); // Handle delete button click + }); + // Handle delete button click this.$body.on('click', 'a.delete', function (e) { e.preventDefault(); var id = $(e.target).closest('a').data('value'); - _this2.deleteRow($(e.target), id); - }); // Handle Enter or Tab key to trigger form submission + }); + // Handle Enter or Tab key to trigger form submission $(document).on('keydown', function (e) { if (e.key === 'Enter' || e.key === 'Tab' && !$(':focus').hasClass('.number-input')) { _this2.saveChangesForAllRows(); } - }); // Handle adding a new row + }); + // Handle adding a new row this.$addNewButton.on('click', function (e) { e.preventDefault(); - _this2.addNewRow(); - }); // Handle page length selection + }); + // Handle page length selection this.$pageLengthSelector.dropdown({ onChange: function onChange(pageLength) { if (pageLength === 'auto') { @@ -149,16 +139,15 @@ var ModulePhoneBookDT = { } else { localStorage.setItem('phonebookTablePageLength', pageLength); } - ModulePhoneBookDT.dataTable.page.len(pageLength).draw(); } - }); // Prevent event bubbling on dropdown click + }); + // Prevent event bubbling on dropdown click this.$pageLengthSelector.on('click', function (event) { event.stopPropagation(); // Prevent the event from bubbling }); }, - /** * Handle focus event on a field by adding a glowing effect and enabling editing. * @@ -169,24 +158,20 @@ var ModulePhoneBookDT = { $input.closest('div').removeClass('transparent').addClass('changed-field'); $input.attr('readonly', false); }, - /** * Save changes for all modified rows. * It sends the changes for each modified row to the server. */ saveChangesForAllRows: function saveChangesForAllRows() { var _this3 = this; - var $rows = $('.changed-field').closest('tr'); $rows.each(function (_, row) { var rowId = $(row).attr('id'); - if (rowId !== undefined) { _this3.sendChangesToServer(rowId); } }); }, - /** * Add a new row to the phonebook table. * The row is editable and allows for input of new contact information. @@ -203,13 +188,11 @@ var ModulePhoneBookDT = { $newRow.find('.caller-id-input').focus(); this.initializeInputmask($newRow.find('.number-input')); }, - /** * Initialize the DataTable instance with the required settings and options. */ initializeDataTable: function initializeDataTable() { var _this4 = this; - // Get the user's saved value or use the automatically calculated value if none exists var savedPageLength = localStorage.getItem('phonebookTablePageLength'); var pageLength = savedPageLength ? savedPageLength : this.calculatePageLength(); @@ -246,47 +229,47 @@ var ModulePhoneBookDT = { }, language: SemanticLocalization.dataTableLocalisation }); - this.dataTable = this.$recordsTable.DataTable(); // Set the select input value to the saved value if it exists + this.dataTable = this.$recordsTable.DataTable(); + // Set the select input value to the saved value if it exists if (savedPageLength) { this.$pageLengthSelector.dropdown('set value', savedPageLength); - } // Initialize debounce timer variable - + } + // Initialize debounce timer variable var searchDebounceTimer = null; this.$globalSearch.on('keyup', function (e) { // Clear previous timer if the user is still typing - clearTimeout(searchDebounceTimer); // Set a new timer for delayed execution + clearTimeout(searchDebounceTimer); + // Set a new timer for delayed execution searchDebounceTimer = setTimeout(function () { - var text = _this4.$globalSearch.val(); // Trigger the search if input is valid (Enter, Backspace, or more than 2 characters) - - + var text = _this4.$globalSearch.val(); + // Trigger the search if input is valid (Enter, Backspace, or more than 2 characters) if (e.keyCode === 13 || e.keyCode === 8 || text.length >= 2) { _this4.applyFilter(text); } }, 500); // 500ms delay before executing the search - }); // Restore the saved search phrase from DataTables state + }); + // Restore the saved search phrase from DataTables state var state = this.dataTable.state.loaded(); - if (state && state.search) { this.$globalSearch.val(state.search.search); // Set the search field with the saved value - } // Retrieves the value of 'search' query parameter from the URL. - + } - var searchValue = this.getQueryParam('search'); // Sets the global search input value and applies the filter if a search value is provided. + // Retrieves the value of 'search' query parameter from the URL. + var searchValue = this.getQueryParam('search'); + // Sets the global search input value and applies the filter if a search value is provided. if (searchValue) { this.$globalSearch.val(searchValue); this.applyFilter(searchValue); } - this.dataTable.on('draw', function () { _this4.$globalSearch.closest('div').removeClass('loading'); }); }, - /** * Build the HTML template for each row in the DataTable. * @@ -294,15 +277,14 @@ var ModulePhoneBookDT = { * @param {Object} data - The data object for the row. */ buildRowTemplate: function buildRowTemplate(row, data) { - var nameTemplate = "\n
\n \n
"); - var numberTemplate = "\n
\n \n
"); - var deleteButtonTemplate = "\n
\n \n \n \n
"); + var nameTemplate = "
\n \n
"); + var numberTemplate = "
\n \n
"); + var deleteButtonTemplate = ""); $('td', row).eq(0).html(''); $('td', row).eq(1).html(nameTemplate); $('td', row).eq(2).html(numberTemplate); $('td', row).eq(3).html(deleteButtonTemplate); }, - /** * Apply a search filter to the DataTable. * @@ -319,7 +301,6 @@ var ModulePhoneBookDT = { this.dataTable.search(text).draw(); this.$globalSearch.closest('div').addClass('loading'); }, - /** * Initialize input masks for phone number fields. * @@ -327,11 +308,9 @@ var ModulePhoneBookDT = { */ initializeInputmask: function initializeInputmask($el) { if (this.$disableInputMaskToggle.checkbox('is checked')) return; - if (this.$maskList === null) { this.$maskList = $.masksSort(InputMaskPatterns, ['#'], /[0-9]|#/, 'mask'); } - $el.inputmasks({ inputmask: { definitions: { @@ -349,7 +328,6 @@ var ModulePhoneBookDT = { listKey: 'mask' }); }, - /** * Send the changes for a specific row to the server. * @@ -357,16 +335,12 @@ var ModulePhoneBookDT = { */ sendChangesToServer: function sendChangesToServer(recordId) { var _this5 = this; - var callerId = $("tr#".concat(recordId, " .caller-id-input")).val(); var numberInputVal = $("tr#".concat(recordId, " .number-input")).val(); if (!callerId || !numberInputVal) return; - var number = numberInputVal.replace(/\D+/g, ''); - number = "1".concat(number.substr(number.length - 9)); var data = { call_id: callerId, number_rep: numberInputVal, - number: number, id: recordId }; this.displaySavingIcon(recordId); @@ -389,7 +363,6 @@ var ModulePhoneBookDT = { } }); }, - /** * Display a saving icon for the given record. * @@ -398,7 +371,6 @@ var ModulePhoneBookDT = { displaySavingIcon: function displaySavingIcon(recordId) { $("tr#".concat(recordId, " .user.circle")).removeClass('user circle').addClass('spinner loading'); }, - /** * Handle successful saving of a record. * @@ -409,15 +381,14 @@ var ModulePhoneBookDT = { if (response.data) { var oldId = response.data.oldId || recordId; $("tr#".concat(oldId, " input")).attr('readonly', true); + $("tr#".concat(oldId, " a.delete.button")).attr('data-value', response.data.newId); $("tr#".concat(oldId, " div")).removeClass('changed-field loading').addClass('transparent'); $("tr#".concat(oldId, " .spinner.loading")).addClass('user circle').removeClass('spinner loading'); - if (oldId !== response.data.newId) { $("tr#".concat(oldId)).attr('id', response.data.newId); } } }, - /** * Delete a row from the phonebook table. * @@ -426,19 +397,16 @@ var ModulePhoneBookDT = { */ deleteRow: function deleteRow($target, id) { var _this6 = this; - if (id === 'new') { $target.closest('tr').remove(); return; } - $.api({ url: "".concat(this.deleteRecordAJAXUrl, "/").concat(id), on: 'now', onSuccess: function onSuccess(response) { if (response.success) { $target.closest('tr').remove(); - if (_this6.$recordsTable.find('tbody > tr').length === 0) { _this6.$recordsTable.find('tbody').append(''); } @@ -446,7 +414,6 @@ var ModulePhoneBookDT = { } }); }, - /** * Clean number before pasting. * @@ -456,7 +423,6 @@ var ModulePhoneBookDT = { cbOnNumberBeforePaste: function cbOnNumberBeforePaste(pastedValue) { return pastedValue.replace(/\D+/g, ''); }, - /** * Calculate the number of rows that can fit on a page based on window height. * @@ -464,15 +430,15 @@ var ModulePhoneBookDT = { */ calculatePageLength: function calculatePageLength() { // Calculate row height - var rowHeight = this.$recordsTable.find('tr').first().outerHeight(); // Calculate window height and available space for table + var rowHeight = this.$recordsTable.find('tr').first().outerHeight(); + // Calculate window height and available space for table var windowHeight = window.innerHeight; var headerFooterHeight = 550; // Estimate height for header, footer, and other elements - // Calculate new page length + // Calculate new page length return Math.max(Math.floor((windowHeight - headerFooterHeight) / rowHeight), 5); }, - /** * Get the value of a query parameter from the URL. * @@ -487,4 +453,4 @@ var ModulePhoneBookDT = { $(document).ready(function () { ModulePhoneBookDT.initialize(); }); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9tb2R1bGUtcGhvbmVib29rLWRhdGF0YWJsZS5qcyJdLCJuYW1lcyI6WyJNb2R1bGVQaG9uZUJvb2tEVCIsIiRnbG9iYWxTZWFyY2giLCIkIiwiJHBhZ2VMZW5ndGhTZWxlY3RvciIsIiRzZWFyY2hFeHRlbnNpb25zSW5wdXQiLCJkYXRhVGFibGUiLCIkYm9keSIsIiRkaXNhYmxlSW5wdXRNYXNrVG9nZ2xlIiwiJHJlY29yZHNUYWJsZSIsIiRhZGROZXdCdXR0b24iLCJpbnB1dE51bWJlckpRVFBMIiwiJG1hc2tMaXN0IiwiZ2V0TmV3UmVjb3Jkc0FKQVhVcmwiLCJnbG9iYWxSb290VXJsIiwiZGVsZXRlUmVjb3JkQUpBWFVybCIsInNhdmVSZWNvcmRBSkFYVXJsIiwiaW5pdGlhbGl6ZSIsImluaXRpYWxpemVTZWFyY2giLCJpbml0aWFsaXplRGF0YVRhYmxlIiwiaW5pdGlhbGl6ZUV2ZW50TGlzdGVuZXJzIiwib24iLCJlIiwic2VhcmNoVGV4dCIsInZhbCIsInRyaW0iLCJrZXlDb2RlIiwibGVuZ3RoIiwiYXBwbHlGaWx0ZXIiLCJvbkZpZWxkRm9jdXMiLCJ0YXJnZXQiLCJzYXZlQ2hhbmdlc0ZvckFsbFJvd3MiLCJwcmV2ZW50RGVmYXVsdCIsImlkIiwiY2xvc2VzdCIsImRhdGEiLCJkZWxldGVSb3ciLCJkb2N1bWVudCIsImtleSIsImhhc0NsYXNzIiwiYWRkTmV3Um93IiwiZHJvcGRvd24iLCJvbkNoYW5nZSIsInBhZ2VMZW5ndGgiLCJjYWxjdWxhdGVQYWdlTGVuZ3RoIiwibG9jYWxTdG9yYWdlIiwicmVtb3ZlSXRlbSIsInNldEl0ZW0iLCJwYWdlIiwibGVuIiwiZHJhdyIsImV2ZW50Iiwic3RvcFByb3BhZ2F0aW9uIiwiJGlucHV0IiwidHJhbnNpdGlvbiIsInJlbW92ZUNsYXNzIiwiYWRkQ2xhc3MiLCJhdHRyIiwiJHJvd3MiLCJlYWNoIiwiXyIsInJvdyIsInJvd0lkIiwidW5kZWZpbmVkIiwic2VuZENoYW5nZXNUb1NlcnZlciIsIiRlbXB0eVJvdyIsInJlbW92ZSIsIm5ld0lkIiwiTWF0aCIsImZsb29yIiwicmFuZG9tIiwibmV3Um93VGVtcGxhdGUiLCJmaW5kIiwicHJlcGVuZCIsIiRuZXdSb3ciLCJmb2N1cyIsImluaXRpYWxpemVJbnB1dG1hc2siLCJzYXZlZFBhZ2VMZW5ndGgiLCJnZXRJdGVtIiwic2VhcmNoIiwic2VydmVyU2lkZSIsInByb2Nlc3NpbmciLCJhamF4IiwidXJsIiwidHlwZSIsImRhdGFTcmMiLCJjb2x1bW5zIiwicGFnaW5nIiwiZGVmZXJSZW5kZXIiLCJzRG9tIiwib3JkZXJpbmciLCJjcmVhdGVkUm93IiwiYnVpbGRSb3dUZW1wbGF0ZSIsImRyYXdDYWxsYmFjayIsImxhbmd1YWdlIiwiU2VtYW50aWNMb2NhbGl6YXRpb24iLCJkYXRhVGFibGVMb2NhbGlzYXRpb24iLCJEYXRhVGFibGUiLCJzZWFyY2hEZWJvdW5jZVRpbWVyIiwiY2xlYXJUaW1lb3V0Iiwic2V0VGltZW91dCIsInRleHQiLCJzdGF0ZSIsImxvYWRlZCIsInNlYXJjaFZhbHVlIiwiZ2V0UXVlcnlQYXJhbSIsIm5hbWVUZW1wbGF0ZSIsImNhbGxfaWQiLCJudW1iZXJUZW1wbGF0ZSIsIm51bWJlciIsImRlbGV0ZUJ1dHRvblRlbXBsYXRlIiwiRFRfUm93SWQiLCJlcSIsImh0bWwiLCIkY2hhbmdlZEZpZWxkcyIsIm9iaiIsIiRlbCIsImNoZWNrYm94IiwibWFza3NTb3J0IiwiSW5wdXRNYXNrUGF0dGVybnMiLCJpbnB1dG1hc2tzIiwiaW5wdXRtYXNrIiwiZGVmaW5pdGlvbnMiLCJ2YWxpZGF0b3IiLCJjYXJkaW5hbGl0eSIsInNob3dNYXNrT25Ib3ZlciIsIm9uQmVmb3JlUGFzdGUiLCJjYk9uTnVtYmVyQmVmb3JlUGFzdGUiLCJtYXRjaCIsInJlcGxhY2UiLCJsaXN0IiwibGlzdEtleSIsInJlY29yZElkIiwiY2FsbGVySWQiLCJudW1iZXJJbnB1dFZhbCIsInN1YnN0ciIsIm51bWJlcl9yZXAiLCJkaXNwbGF5U2F2aW5nSWNvbiIsImFwaSIsIm1ldGhvZCIsInN1Y2Nlc3NUZXN0IiwicmVzcG9uc2UiLCJzdWNjZXNzIiwib25TdWNjZXNzIiwib25TYXZlU3VjY2VzcyIsIm9uRmFpbHVyZSIsIlVzZXJNZXNzYWdlIiwic2hvd011bHRpU3RyaW5nIiwibWVzc2FnZSIsIm9uRXJyb3IiLCJlcnJvck1lc3NhZ2UiLCJlbGVtZW50IiwieGhyIiwic3RhdHVzIiwid2luZG93IiwibG9jYXRpb24iLCJvbGRJZCIsIiR0YXJnZXQiLCJhcHBlbmQiLCJwYXN0ZWRWYWx1ZSIsInJvd0hlaWdodCIsImZpcnN0Iiwib3V0ZXJIZWlnaHQiLCJ3aW5kb3dIZWlnaHQiLCJpbm5lckhlaWdodCIsImhlYWRlckZvb3RlckhlaWdodCIsIm1heCIsInBhcmFtIiwidXJsUGFyYW1zIiwiVVJMU2VhcmNoUGFyYW1zIiwiZ2V0IiwicmVhZHkiXSwibWFwcGluZ3MiOiI7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUVBLElBQU1BLGlCQUFpQixHQUFHO0FBRXRCO0FBQ0o7QUFDQTtBQUNBO0FBQ0lDLEVBQUFBLGFBQWEsRUFBRUMsQ0FBQyxDQUFDLGdCQUFELENBTk07O0FBUXRCO0FBQ0o7QUFDQTtBQUNBO0FBQ0lDLEVBQUFBLG1CQUFtQixFQUFDRCxDQUFDLENBQUMscUJBQUQsQ0FaQzs7QUFjdEI7QUFDSjtBQUNBO0FBQ0E7QUFDSUUsRUFBQUEsc0JBQXNCLEVBQUVGLENBQUMsQ0FBQywwQkFBRCxDQWxCSDs7QUFxQnRCO0FBQ0o7QUFDQTtBQUNBO0FBQ0lHLEVBQUFBLFNBQVMsRUFBRSxFQXpCVzs7QUEyQnRCO0FBQ0o7QUFDQTtBQUNBO0FBQ0lDLEVBQUFBLEtBQUssRUFBRUosQ0FBQyxDQUFDLE1BQUQsQ0EvQmM7QUFpQ3RCO0FBQ0FLLEVBQUFBLHVCQUF1QixFQUFFTCxDQUFDLENBQUMscUJBQUQsQ0FsQ0o7O0FBb0N0QjtBQUNKO0FB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QU1DLGtCQUFrQixHQUFHLEdBQTNCLENBTmtCLENBTWM7QUFFaEM7O0FBQ0EsV0FBT2pHLElBQUksQ0FBQ2tHLEdBQUwsQ0FBU2xHLElBQUksQ0FBQ0MsS0FBTCxDQUFXLENBQUM4RixZQUFZLEdBQUdFLGtCQUFoQixJQUFzQ0wsU0FBakQsQ0FBVCxFQUFzRSxDQUF0RSxDQUFQO0FBQ0gsR0ExZHFCOztBQTRkdEI7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0l2RCxFQUFBQSxhQWxlc0IseUJBa2VSOEQsS0FsZVEsRUFrZUQ7QUFDakIsUUFBTUMsU0FBUyxHQUFHLElBQUlDLGVBQUosQ0FBb0JmLE1BQU0sQ0FBQ0MsUUFBUCxDQUFnQjVFLE1BQXBDLENBQWxCO0FBQ0EsV0FBT3lGLFNBQVMsQ0FBQ0UsR0FBVixDQUFjSCxLQUFkLENBQVA7QUFDSDtBQXJlcUIsQ0FBMUI7QUF3ZUFwSyxDQUFDLENBQUNrQyxRQUFELENBQUQsQ0FBWXNJLEtBQVosQ0FBa0IsWUFBTTtBQUNwQjFLLEVBQUFBLGlCQUFpQixDQUFDZ0IsVUFBbEI7QUFDSCxDQUZEIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIE1pa29QQlggLSBmcmVlIHBob25lIHN5c3RlbSBmb3Igc21hbGwgYnVzaW5lc3NcbiAqIENvcHlyaWdodCDCqSAyMDE3LTIwMjQgQWxleGV5IFBvcnRub3YgYW5kIE5pa29sYXkgQmVrZXRvdlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcbiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS5cbiAqIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uXG4gKi9cblxuLyogZ2xvYmFsIGdsb2JhbFJvb3RVcmwsIGdsb2JhbFRyYW5zbGF0ZSwgU2VtYW50aWNMb2NhbGl6YXRpb24sIFVzZXJNZXNzYWdlLCBJbnB1dE1hc2tQYXR0ZXJucyAqL1xuXG5jb25zdCBNb2R1bGVQaG9uZUJvb2tEVCA9IHtcblxuICAgIC8qKlxuICAgICAqIFRoZSBnbG9iYWwgc2VhcmNoIGlucHV0IGVsZW1lbnQuXG4gICAgICogQHR5cGUge2pRdWVyeX1cbiAgICAgKi9cbiAgICAkZ2xvYmFsU2VhcmNoOiAkKCcjZ2xvYmFsLXNlYXJjaCcpLFxuXG4gICAgLyoqXG4gICAgICogVGhlIHBhZ2UgbGVuZ3RoIHNlbGVjdG9yLlxuICAgICAqIEB0eXBlIHtqUXVlcnl9XG4gICAgICovXG4gICAgJHBhZ2VMZW5ndGhTZWxlY3RvcjokKCcjcGFnZS1sZW5ndGgtc2VsZWN0JyksXG5cbiAgICAvKipcbiAgICAgKiBUaGUgcGFnZSBsZW5ndGggc2VsZWN0b3IuXG4gICAgICogQHR5cGUge2pRdWVyeX1cbiAgICAgKi9cbiAgICAkc2VhcmNoRXh0ZW5zaW9uc0lucHV0OiAkKCcjc2VhcmNoLWV4dGVuc2lvbnMtaW5wdXQnKSxcblxuXG4gICAgLyoqXG4gICAgICogVGhlIGRhdGEgdGFibGUgb2JqZWN0LlxuICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICovXG4gICAgZGF0YVRhYmxlOiB7fSxcblxuICAgIC8qKlxuICAgICAqIFRoZSBkb2N1bWVudCBib2R5LlxuICAgICAqIEB0eXBlIHtqUXVlcnl9XG4gICAgICovXG4gICAgJGJvZHk6ICQoJ2JvZHknKSxcblxuICAgIC8vIENhY2hlZCBET00gZWxlbWVudHNcbiAgICAkZGlzYWJsZUlucHV0TWFza1RvZ2dsZTogJCgnI2Rpc2FibGUtaW5wdXQtbWFzaycpLFxuXG4gICAgLyoqXG4gICAgICogVGhlIGV4dGVuc2lvbnMgdGFibGUgZWxlbWVudC5cbiAgICAgKiBAdHlwZSB7alF1ZXJ5fVxuICAgICAqL1xuICAgICRyZWNvcmRzVGFibGU6ICQoJyNwaG9uZWJvb2stdGFibGUnKSxcblxuICAgIC8qKlxuICAgICAqIFRoZSBhZGQgbmV3IGJ1dHRvbiBlbGVtZW50LlxuICAgICAqIEB0eXBlIHtqUXVlcnl9XG4gICAgICovXG4gICAgJGFkZE5ld0J1dHRvbjogJCgnI2FkZC1uZXctYnV0dG9uJyksXG5cbiAgICAvKipcbiAgICAgKiBTZWxlY3RvciBmb3IgbnVtYmVyIGlucHV0IGZpZWxkcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIGlucHV0TnVtYmVySlFUUEw6ICdpbnB1dC5udW1iZXItaW5wdXQnLFxuXG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBpbnB1dCBtYXNrcy5cbiAgICAgKiBAdHlwZSB7bnVsbHxBcnJheX1cbiAgICAgKi9cbiAgICAkbWFza0xpc3Q6IG51bGwsXG5cbiAgICAvLyBVUkxzIGZvciBBSkFYIHJlcXVlc3RzXG4gICAgZ2V0TmV3UmVjb3Jkc0FKQVhVcmw6IGAke2dsb2JhbFJvb3RVcmx9bW9kdWxlLXBob25lLWJvb2svZ2V0TmV3UmVjb3Jkc2AsXG5cbiAgICBkZWxldGVSZWNvcmRBSkFYVXJsOiBgJHtnbG9iYWxSb290VXJsfW1vZHVsZS1waG9uZS1ib29rL2RlbGV0ZWAsXG5cbiAgICBzYXZlUmVjb3JkQUpBWFVybDogYCR7Z2xvYmFsUm9vdFVybH1tb2R1bGUtcGhvbmUtYm9vay9zYXZlYCxcblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgdGhlIG1vZHVsZS5cbiAgICAgKiBUaGlzIGluY2x1ZGVzIHNldHRpbmcgdXAgZXZlbnQgbGlzdGVuZXJzIGFuZCBpbml0aWFsaXppbmcgdGhlIERhdGFUYWJsZS5cbiAgICAgKi9cbiAgICBpbml0aWFsaXplKCkge1xuICAgICAgICB0aGlzLmluaXRpYWxpemVTZWFyY2goKTtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplRGF0YVRhYmxlKCk7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZUV2ZW50TGlzdGVuZXJzKCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgdGhlIHNlYXJjaCBmdW5jdGlvbmFsaXR5LlxuICAgICAqIEl0IGxpc3RlbnMgZm9yIGtleSBldmVudHMgYW5kIGFwcGxpZXMgYSBmaWx0ZXIgYmFzZWQgb24gdGhlIHVzZXIncyBpbnB1dC5cbiAgICAgKi9cbiAgICBpbml0aWFsaXplU2VhcmNoKCkge1xuICAgICAgICB0aGlzLiRnbG9iYWxTZWFyY2gub24oJ2tleXVwJywgKGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNlYXJjaFRleHQgPSB0aGlzLiRnbG9iYWxTZWFyY2gudmFsKCkudHJpbSgpO1xuICAgICAgICAgICAgaWYgKGUua2V5Q29kZSA9PT0gMTMgfHwgZS5rZXlDb2RlID09PSA4IHx8IHNlYXJjaFRleHQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hcHBseUZpbHRlcihzZWFyY2hUZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgYWxsIGV2ZW50IGxpc3RlbmVycy5cbiAgICAgKiBIYW5kbGVzIGlucHV0IGZvY3VzLCBmb3JtIHN1Ym1pc3Npb24sIGFkZGluZyBuZXcgcm93cywgYW5kIGRlbGV0ZSBhY3Rpb25zLlxuICAgICAqL1xuICAgIGluaXRpYWxpemVFdmVudExpc3RlbmVycygpIHtcblxuICAgICAgICAvLyBIYW5kbGUgZm9jdXMgb24gaW5wdXQgZmllbGRzIGZvciBlZGl0aW5nXG4gICAgICAgIHRoaXMuJGJvZHkub24oJ2ZvY3VzaW4nLCAnLmNhbGxlci1pZC1pbnB1dCwgLm51bWJlci1pbnB1dCcsIChlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uRmllbGRGb2N1cygkKGUudGFyZ2V0KSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEhhbmRsZSBsb3NzIG9mIGZvY3VzIG9uIGlucHV0IGZpZWxkcyBhbmQgc2F2ZSBjaGFuZ2VzXG4gICAgICAgIHRoaXMuJGJvZHkub24oJ2ZvY3Vzb3V0JywgJy5jYWxsZXItaWQtaW5wdXQsIC5udW1iZXItaW5wdXQnLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNhdmVDaGFuZ2VzRm9yQWxsUm93cygpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBIYW5kbGUgZGVsZXRlIGJ1dHRvbiBjbGlja1xuICAgICAgICB0aGlzLiRib2R5Lm9uKCdjbGljaycsICdhLmRlbGV0ZScsIChlKSA9PiB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBjb25zdCBpZCA9ICQoZS50YXJnZXQpLmNsb3Nlc3QoJ2EnKS5kYXRhKCd2YWx1ZScpO1xuICAgICAgICAgICAgdGhpcy5kZWxldGVSb3coJChlLnRhcmdldCksIGlkKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gSGFuZGxlIEVudGVyIG9yIFRhYiBrZXkgdG8gdHJpZ2dlciBmb3JtIHN1Ym1pc3Npb25cbiAgICAgICAgJChkb2N1bWVudCkub24oJ2tleWRvd24nLCAoZSkgPT4ge1xuICAgICAgICAgICAgaWYgKGUua2V5ID09PSAnRW50ZXInIHx8IChlLmtleSA9PT0gJ1RhYicgJiYgISQoJzpmb2N1cycpLmhhc0NsYXNzKCcubnVtYmVyLWlucHV0JykpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zYXZlQ2hhbmdlc0ZvckFsbFJvd3MoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gSGFuZGxlIGFkZGluZyBhIG5ldyByb3dcbiAgICAgICAgdGhpcy4kYWRkTmV3QnV0dG9uLm9uKCdjbGljaycsIChlKSA9PiB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLmFkZE5ld1JvdygpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBIYW5kbGUgcGFnZSBsZW5ndGggc2VsZWN0aW9uXG4gICAgICAgIHRoaXMuJHBhZ2VMZW5ndGhTZWxlY3Rvci5kcm9wZG93bih7XG4gICAgICAgICAgICBvbkNoYW5nZShwYWdlTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhZ2VMZW5ndGg9PT0nYXV0bycpe1xuICAgICAgICAgICAgICAgICAgICBwYWdlTGVuZ3RoID0gdGhpcy5jYWxjdWxhdGVQYWdlTGVuZ3RoKCk7XG4gICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdwaG9uZWJvb2tUYWJsZVBhZ2VMZW5ndGgnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgncGhvbmVib29rVGFibGVQYWdlTGVuZ3RoJywgcGFnZUxlbmd0aCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIE1vZHVsZVBob25lQm9va0RULmRhdGFUYWJsZS5wYWdlLmxlbihwYWdlTGVuZ3RoKS5kcmF3KCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBQcmV2ZW50IGV2ZW50IGJ1YmJsaW5nIG9uIGRyb3Bkb3duIGNsaWNrXG4gICAgICAgIHRoaXMuJHBhZ2VMZW5ndGhTZWxlY3Rvci5vbignY2xpY2snLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IC8vIFByZXZlbnQgdGhlIGV2ZW50IGZyb20gYnViYmxpbmdcbiAgICAgICAgfSk7XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIGZvY3VzIGV2ZW50IG9uIGEgZmllbGQgYnkgYWRkaW5nIGEgZ2xvd2luZyBlZmZlY3QgYW5kIGVuYWJsaW5nIGVkaXRpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2pRdWVyeX0gJGlucHV0IC0gVGhlIGlucHV0IGZpZWxkIHRoYXQgcmVjZWl2ZWQgZm9jdXMuXG4gICAgICovXG4gICAgb25GaWVsZEZvY3VzKCRpbnB1dCkge1xuICAgICAgICAkaW5wdXQudHJhbnNpdGlvbignZ2xvdycpO1xuICAgICAgICAkaW5wdXQuY2xvc2VzdCgnZGl2JykucmVtb3ZlQ2xhc3MoJ3RyYW5zcGFyZW50JykuYWRkQ2xhc3MoJ2NoYW5nZWQtZmllbGQnKTtcbiAgICAgICAgJGlucHV0LmF0dHIoJ3JlYWRvbmx5JywgZmFsc2UpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTYXZlIGNoYW5nZXMgZm9yIGFsbCBtb2RpZmllZCByb3dzLlxuICAgICAqIEl0IHNlbmRzIHRoZSBjaGFuZ2VzIGZvciBlYWNoIG1vZGlmaWVkIHJvdyB0byB0aGUgc2VydmVyLlxuICAgICAqL1xuICAgIHNhdmVDaGFuZ2VzRm9yQWxsUm93cygpIHtcbiAgICAgICAgY29uc3QgJHJvd3MgPSAkKCcuY2hhbmdlZC1maWVsZCcpLmNsb3Nlc3QoJ3RyJyk7XG4gICAgICAgICRyb3dzLmVhY2goKF8sIHJvdykgPT4ge1xuICAgICAgICAgICAgY29uc3Qgcm93SWQgPSAkKHJvdykuYXR0cignaWQnKTtcbiAgICAgICAgICAgIGlmIChyb3dJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZW5kQ2hhbmdlc1RvU2VydmVyKHJvd0lkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEFkZCBhIG5ldyByb3cgdG8gdGhlIHBob25lYm9vayB0YWJsZS5cbiAgICAgKiBUaGUgcm93IGlzIGVkaXRhYmxlIGFuZCBhbGxvd3MgZm9yIGlucHV0IG9mIG5ldyBjb250YWN0IGluZm9ybWF0aW9uLlxuICAgICAqL1xuICAgIGFkZE5ld1JvdygpIHtcbiAgICAgICAgY29uc3QgJGVtcHR5Um93ID0gJCgnLmRhdGFUYWJsZXNfZW1wdHknKTtcbiAgICAgICAgaWYgKCRlbXB0eVJvdy5sZW5ndGgpICRlbXB0eVJvdy5yZW1vdmUoKTtcblxuICAgICAgICB0aGlzLnNhdmVDaGFuZ2VzRm9yQWxsUm93cygpO1xuXG4gICAgICAgIGNvbnN0IG5ld0lkID0gYG5ldyR7TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogNTAwKX1gO1xuICAgICAgICBjb25zdCBuZXdSb3dUZW1wbGF0ZSA9IGBcbiAgICAgICAgICAgIDx0ciBpZD1cIiR7bmV3SWR9XCI+XG4gICAgICAgICAgICAgICAgPHRkPjxpIGNsYXNzPVwidWkgdXNlciBjaXJjbGUgaWNvblwiPjwvaT48L3RkPlxuICAgICAgICAgICAgICAgIDx0ZD48ZGl2IGNsYXNzPVwidWkgZmx1aWQgaW5wdXQgaW5saW5lLWVkaXQgY2hhbmdlZC1maWVsZFwiPjxpbnB1dCBjbGFzcz1cImNhbGxlci1pZC1pbnB1dFwiIHR5cGU9XCJ0ZXh0XCIgdmFsdWU9XCJcIj48L2Rpdj48L3RkPlxuICAgICAgICAgICAgICAgIDx0ZD48ZGl2IGNsYXNzPVwidWkgZmx1aWQgaW5wdXQgaW5saW5lLWVkaXQgY2hhbmdlZC1maWVsZFwiPjxpbnB1dCBjbGFzcz1cIm51bWJlci1pbnB1dFwiIHR5cGU9XCJ0ZXh0XCIgdmFsdWU9XCJcIj48L2Rpdj48L3RkPlxuICAgICAgICAgICAgICAgIDx0ZD48ZGl2IGNsYXNzPVwidWkgYmFzaWMgaWNvbiBidXR0b25zIGFjdGlvbi1idXR0b25zIHRpbnlcIj5cbiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cIiNcIiBjbGFzcz1cInVpIGJ1dHRvbiBkZWxldGVcIiBkYXRhLXZhbHVlPVwibmV3XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImljb24gdHJhc2ggcmVkXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgPC9kaXY+PC90ZD5cbiAgICAgICAgICAgIDwvdHI+YDtcblxuICAgICAgICB0aGlzLiRyZWNvcmRzVGFibGUuZmluZCgndGJvZHknKS5wcmVwZW5kKG5ld1Jvd1RlbXBsYXRlKTtcbiAgICAgICAgY29uc3QgJG5ld1JvdyA9ICQoYCMke25ld0lkfWApO1xuICAgICAgICAkbmV3Um93LmZpbmQoJ2lucHV0JykudHJhbnNpdGlvbignZ2xvdycpO1xuICAgICAgICAkbmV3Um93LmZpbmQoJy5jYWxsZXItaWQtaW5wdXQnKS5mb2N1cygpO1xuICAgICAgICB0aGlzLmluaXRpYWxpemVJbnB1dG1hc2soJG5ld1Jvdy5maW5kKCcubnVtYmVyLWlucHV0JykpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplIHRoZSBEYXRhVGFibGUgaW5zdGFuY2Ugd2l0aCB0aGUgcmVxdWlyZWQgc2V0dGluZ3MgYW5kIG9wdGlvbnMuXG4gICAgICovXG4gICAgaW5pdGlhbGl6ZURhdGFUYWJsZSgpIHtcblxuICAgICAgICAvLyBHZXQgdGhlIHVzZXIncyBzYXZlZCB2YWx1ZSBvciB1c2UgdGhlIGF1dG9tYXRpY2FsbHkgY2FsY3VsYXRlZCB2YWx1ZSBpZiBub25lIGV4aXN0c1xuICAgICAgICBjb25zdCBzYXZlZFBhZ2VMZW5ndGggPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgncGhvbmVib29rVGFibGVQYWdlTGVuZ3RoJyk7XG4gICAgICAgIGNvbnN0IHBhZ2VMZW5ndGggPSBzYXZlZFBhZ2VMZW5ndGggPyBzYXZlZFBhZ2VMZW5ndGggOiB0aGlzLmNhbGN1bGF0ZVBhZ2VMZW5ndGgoKTtcblxuICAgICAgICB0aGlzLiRyZWNvcmRzVGFibGUuZGF0YVRhYmxlKHtcbiAgICAgICAgICAgIHNlYXJjaDogeyBzZWFyY2g6IHRoaXMuJGdsb2JhbFNlYXJjaC52YWwoKSB9LFxuICAgICAgICAgICAgc2VydmVyU2lkZTogdHJ1ZSxcbiAgICAgICAgICAgIHByb2Nlc3Npbmc6IHRydWUsXG4gICAgICAgICAgICBhamF4OiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0aGlzLmdldE5ld1JlY29yZHNBSkFYVXJsLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICBkYXRhU3JjOiAnZGF0YScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29sdW1uczogW1xuICAgICAgICAgICAgICAgIHsgZGF0YTogbnVsbCB9LFxuICAgICAgICAgICAgICAgIHsgZGF0YTogJ2NhbGxfaWQnIH0sXG4gICAgICAgICAgICAgICAgeyBkYXRhOiAnbnVtYmVyJyB9LFxuICAgICAgICAgICAgICAgIHsgZGF0YTogbnVsbCB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHBhZ2luZzogdHJ1ZSxcbiAgICAgICAgICAgIHBhZ2VMZW5ndGg6IHBhZ2VMZW5ndGgsXG4gICAgICAgICAgICBkZWZlclJlbmRlcjogdHJ1ZSxcbiAgICAgICAgICAgIHNEb206ICdydGlwJyxcbiAgICAgICAgICAgIG9yZGVyaW5nOiBmYWxzZSxcbiAgICAgICAgICAgIGNyZWF0ZWRSb3c6IChyb3csIGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkUm93VGVtcGxhdGUocm93LCBkYXRhKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkcmF3Q2FsbGJhY2s6ICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRpYWxpemVJbnB1dG1hc2soJCh0aGlzLmlucHV0TnVtYmVySlFUUEwpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYW5ndWFnZTogU2VtYW50aWNMb2NhbGl6YXRpb24uZGF0YVRhYmxlTG9jYWxpc2F0aW9uLFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmRhdGFUYWJsZSA9IHRoaXMuJHJlY29yZHNUYWJsZS5EYXRhVGFibGUoKTtcblxuXG4gICAgICAgIC8vIFNldCB0aGUgc2VsZWN0IGlucHV0IHZhbHVlIHRvIHRoZSBzYXZlZCB2YWx1ZSBpZiBpdCBleGlzdHNcbiAgICAgICAgaWYgKHNhdmVkUGFnZUxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy4kcGFnZUxlbmd0aFNlbGVjdG9yLmRyb3Bkb3duKCdzZXQgdmFsdWUnLCBzYXZlZFBhZ2VMZW5ndGgpO1xuICAgICAgICB9XG5cblxuICAgICAgICAvLyBJbml0aWFsaXplIGRlYm91bmNlIHRpbWVyIHZhcmlhYmxlXG4gICAgICAgIGxldCBzZWFyY2hEZWJvdW5jZVRpbWVyID0gbnVsbDtcblxuICAgICAgICB0aGlzLiRnbG9iYWxTZWFyY2gub24oJ2tleXVwJywgKGUpID0+IHtcbiAgICAgICAgICAgIC8vIENsZWFyIHByZXZpb3VzIHRpbWVyIGlmIHRoZSB1c2VyIGlzIHN0aWxsIHR5cGluZ1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHNlYXJjaERlYm91bmNlVGltZXIpO1xuXG4gICAgICAgICAgICAvLyBTZXQgYSBuZXcgdGltZXIgZm9yIGRlbGF5ZWQgZXhlY3V0aW9uXG4gICAgICAgICAgICBzZWFyY2hEZWJvdW5jZVRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dCA9IHRoaXMuJGdsb2JhbFNlYXJjaC52YWwoKTtcbiAgICAgICAgICAgICAgICAvLyBUcmlnZ2VyIHRoZSBzZWFyY2ggaWYgaW5wdXQgaXMgdmFsaWQgKEVudGVyLCBCYWNrc3BhY2UsIG9yIG1vcmUgdGhhbiAyIGNoYXJhY3RlcnMpXG4gICAgICAgICAgICAgICAgaWYgKGUua2V5Q29kZSA9PT0gMTMgfHwgZS5rZXlDb2RlID09PSA4IHx8IHRleHQubGVuZ3RoID49IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHBseUZpbHRlcih0ZXh0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCA1MDApOyAvLyA1MDBtcyBkZWxheSBiZWZvcmUgZXhlY3V0aW5nIHRoZSBzZWFyY2hcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gUmVzdG9yZSB0aGUgc2F2ZWQgc2VhcmNoIHBocmFzZSBmcm9tIERhdGFUYWJsZXMgc3RhdGVcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLmRhdGFUYWJsZS5zdGF0ZS5sb2FkZWQoKTtcbiAgICAgICAgaWYgKHN0YXRlICYmIHN0YXRlLnNlYXJjaCkge1xuICAgICAgICAgICAgdGhpcy4kZ2xvYmFsU2VhcmNoLnZhbChzdGF0ZS5zZWFyY2guc2VhcmNoKTsgLy8gU2V0IHRoZSBzZWFyY2ggZmllbGQgd2l0aCB0aGUgc2F2ZWQgdmFsdWVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJldHJpZXZlcyB0aGUgdmFsdWUgb2YgJ3NlYXJjaCcgcXVlcnkgcGFyYW1ldGVyIGZyb20gdGhlIFVSTC5cbiAgICAgICAgY29uc3Qgc2VhcmNoVmFsdWUgPSB0aGlzLmdldFF1ZXJ5UGFyYW0oJ3NlYXJjaCcpO1xuXG4gICAgICAgIC8vIFNldHMgdGhlIGdsb2JhbCBzZWFyY2ggaW5wdXQgdmFsdWUgYW5kIGFwcGxpZXMgdGhlIGZpbHRlciBpZiBhIHNlYXJjaCB2YWx1ZSBpcyBwcm92aWRlZC5cbiAgICAgICAgaWYgKHNlYXJjaFZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLiRnbG9iYWxTZWFyY2gudmFsKHNlYXJjaFZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMuYXBwbHlGaWx0ZXIoc2VhcmNoVmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5kYXRhVGFibGUub24oJ2RyYXcnLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLiRnbG9iYWxTZWFyY2guY2xvc2VzdCgnZGl2JykucmVtb3ZlQ2xhc3MoJ2xvYWRpbmcnKTtcbiAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEJ1aWxkIHRoZSBIVE1MIHRlbXBsYXRlIGZvciBlYWNoIHJvdyBpbiB0aGUgRGF0YVRhYmxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gcm93IC0gVGhlIHJvdyBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIC0gVGhlIGRhdGEgb2JqZWN0IGZvciB0aGUgcm93LlxuICAgICAqL1xuICAgIGJ1aWxkUm93VGVtcGxhdGUocm93LCBkYXRhKSB7XG4gICAgICAgIGNvbnN0IG5hbWVUZW1wbGF0ZSA9IGBcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1aSB0cmFuc3BhcmVudCBmbHVpZCBpbnB1dCBpbmxpbmUtZWRpdFwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImNhbGxlci1pZC1pbnB1dFwiIHR5cGU9XCJ0ZXh0XCIgdmFsdWU9XCIke2RhdGEuY2FsbF9pZH1cIiAvPlxuICAgICAgICAgICAgPC9kaXY+YDtcbiAgICAgICAgY29uc3QgbnVtYmVyVGVtcGxhdGUgPSBgXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidWkgdHJhbnNwYXJlbnQgaW5wdXQgaW5saW5lLWVkaXRcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJudW1iZXItaW5wdXRcIiB0eXBlPVwidGV4dFwiIHZhbHVlPVwiJHtkYXRhLm51bWJlcn1cIiAvPlxuICAgICAgICAgICAgPC9kaXY+YDtcbiAgICAgICAgY29uc3QgZGVsZXRlQnV0dG9uVGVtcGxhdGUgPSBgXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidWkgYmFzaWMgaWNvbiBidXR0b25zIGFjdGlvbi1idXR0b25zIHRpbnlcIj5cbiAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGRhdGEtdmFsdWU9XCIke2RhdGEuRFRfUm93SWR9XCIgY2xhc3M9XCJ1aSBkZWxldGUgYnV0dG9uXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiaWNvbiB0cmFzaCByZWRcIj48L2k+XG4gICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgPC9kaXY+YDtcblxuICAgICAgICAkKCd0ZCcsIHJvdykuZXEoMCkuaHRtbCgnPGkgY2xhc3M9XCJ1aSB1c2VyIGNpcmNsZSBpY29uXCI+PC9pPicpO1xuICAgICAgICAkKCd0ZCcsIHJvdykuZXEoMSkuaHRtbChuYW1lVGVtcGxhdGUpO1xuICAgICAgICAkKCd0ZCcsIHJvdykuZXEoMikuaHRtbChudW1iZXJUZW1wbGF0ZSk7XG4gICAgICAgICQoJ3RkJywgcm93KS5lcSgzKS5odG1sKGRlbGV0ZUJ1dHRvblRlbXBsYXRlKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQXBwbHkgYSBzZWFyY2ggZmlsdGVyIHRvIHRoZSBEYXRhVGFibGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIFRoZSBzZWFyY2ggdGV4dCB0byBhcHBseS5cbiAgICAgKi9cbiAgICBhcHBseUZpbHRlcih0ZXh0KSB7XG4gICAgICAgIGNvbnN0ICRjaGFuZ2VkRmllbGRzID0gJCgnLmNoYW5nZWQtZmllbGQnKTtcbiAgICAgICAgJGNoYW5nZWRGaWVsZHMuZWFjaCgoXywgb2JqKSA9PiB7XG4gICAgICAgICAgICBjb25zdCAkaW5wdXQgPSAkKG9iaikuZmluZCgnaW5wdXQnKTtcbiAgICAgICAgICAgICRpbnB1dC52YWwoJGlucHV0LmRhdGEoJ3ZhbHVlJykpO1xuICAgICAgICAgICAgJGlucHV0LmF0dHIoJ3JlYWRvbmx5JywgdHJ1ZSk7XG4gICAgICAgICAgICAkKG9iaikucmVtb3ZlQ2xhc3MoJ2NoYW5nZWQtZmllbGQnKS5hZGRDbGFzcygndHJhbnNwYXJlbnQnKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZGF0YVRhYmxlLnNlYXJjaCh0ZXh0KS5kcmF3KCk7XG4gICAgICAgIHRoaXMuJGdsb2JhbFNlYXJjaC5jbG9zZXN0KCdkaXYnKS5hZGRDbGFzcygnbG9hZGluZycpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplIGlucHV0IG1hc2tzIGZvciBwaG9uZSBudW1iZXIgZmllbGRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtqUXVlcnl9ICRlbCAtIFRoZSBpbnB1dCBlbGVtZW50cyB0byBhcHBseSBtYXNrcyB0by5cbiAgICAgKi9cbiAgICBpbml0aWFsaXplSW5wdXRtYXNrKCRlbCkge1xuICAgICAgICBpZiAodGhpcy4kZGlzYWJsZUlucHV0TWFza1RvZ2dsZS5jaGVja2JveCgnaXMgY2hlY2tlZCcpKSByZXR1cm47XG5cbiAgICAgICAgaWYgKHRoaXMuJG1hc2tMaXN0ID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLiRtYXNrTGlzdCA9ICQubWFza3NTb3J0KElucHV0TWFza1BhdHRlcm5zLCBbJyMnXSwgL1swLTldfCMvLCAnbWFzaycpO1xuICAgICAgICB9XG5cbiAgICAgICAgJGVsLmlucHV0bWFza3Moe1xuICAgICAgICAgICAgaW5wdXRtYXNrOiB7XG4gICAgICAgICAgICAgICAgZGVmaW5pdGlvbnM6IHtcbiAgICAgICAgICAgICAgICAgICAgJyMnOiB7IHZhbGlkYXRvcjogJ1swLTldJywgY2FyZGluYWxpdHk6IDEgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNob3dNYXNrT25Ib3ZlcjogZmFsc2UsXG4gICAgICAgICAgICAgICAgb25CZWZvcmVQYXN0ZTogdGhpcy5jYk9uTnVtYmVyQmVmb3JlUGFzdGUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWF0Y2g6IC9bMC05XS8sXG4gICAgICAgICAgICByZXBsYWNlOiAnOScsXG4gICAgICAgICAgICBsaXN0OiB0aGlzLiRtYXNrTGlzdCxcbiAgICAgICAgICAgIGxpc3RLZXk6ICdtYXNrJyxcbiAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNlbmQgdGhlIGNoYW5nZXMgZm9yIGEgc3BlY2lmaWMgcm93IHRvIHRoZSBzZXJ2ZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcmVjb3JkSWQgLSBUaGUgSUQgb2YgdGhlIHJlY29yZCB0byBzYXZlLlxuICAgICAqL1xuICAgIHNlbmRDaGFuZ2VzVG9TZXJ2ZXIocmVjb3JkSWQpIHtcbiAgICAgICAgY29uc3QgY2FsbGVySWQgPSAkKGB0ciMke3JlY29yZElkfSAuY2FsbGVyLWlkLWlucHV0YCkudmFsKCk7XG4gICAgICAgIGNvbnN0IG51bWJlcklucHV0VmFsID0gJChgdHIjJHtyZWNvcmRJZH0gLm51bWJlci1pbnB1dGApLnZhbCgpO1xuXG4gICAgICAgIGlmICghY2FsbGVySWQgfHwgIW51bWJlcklucHV0VmFsKSByZXR1cm47XG5cbiAgICAgICAgbGV0IG51bWJlciA9IG51bWJlcklucHV0VmFsLnJlcGxhY2UoL1xcRCsvZywgJycpO1xuICAgICAgICBudW1iZXIgPSBgMSR7bnVtYmVyLnN1YnN0cihudW1iZXIubGVuZ3RoIC0gOSl9YDtcblxuICAgICAgICBjb25zdCBkYXRhID0ge1xuICAgICAgICAgICAgY2FsbF9pZDogY2FsbGVySWQsXG4gICAgICAgICAgICBudW1iZXJfcmVwOiBudW1iZXJJbnB1dFZhbCxcbiAgICAgICAgICAgIG51bWJlcixcbiAgICAgICAgICAgIGlkOiByZWNvcmRJZCxcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmRpc3BsYXlTYXZpbmdJY29uKHJlY29yZElkKTtcblxuICAgICAgICAkLmFwaSh7XG4gICAgICAgICAgICB1cmw6IHRoaXMuc2F2ZVJlY29yZEFKQVhVcmwsXG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgIG9uOiAnbm93JyxcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICBzdWNjZXNzVGVzdDogKHJlc3BvbnNlKSA9PiByZXNwb25zZSAmJiByZXNwb25zZS5zdWNjZXNzID09PSB0cnVlLFxuICAgICAgICAgICAgb25TdWNjZXNzOiAocmVzcG9uc2UpID0+IHRoaXMub25TYXZlU3VjY2VzcyhyZXNwb25zZSwgcmVjb3JkSWQpLFxuICAgICAgICAgICAgb25GYWlsdXJlOiAocmVzcG9uc2UpID0+IFVzZXJNZXNzYWdlLnNob3dNdWx0aVN0cmluZyhyZXNwb25zZS5tZXNzYWdlKSxcbiAgICAgICAgICAgIG9uRXJyb3I6IChlcnJvck1lc3NhZ2UsIGVsZW1lbnQsIHhocikgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh4aHIuc3RhdHVzID09PSA0MDMpIHdpbmRvdy5sb2NhdGlvbiA9IGAke2dsb2JhbFJvb3RVcmx9c2Vzc2lvbi9pbmRleGA7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRGlzcGxheSBhIHNhdmluZyBpY29uIGZvciB0aGUgZ2l2ZW4gcmVjb3JkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHJlY29yZElkIC0gVGhlIElEIG9mIHRoZSByZWNvcmQgYmVpbmcgc2F2ZWQuXG4gICAgICovXG4gICAgZGlzcGxheVNhdmluZ0ljb24ocmVjb3JkSWQpIHtcbiAgICAgICAgJChgdHIjJHtyZWNvcmRJZH0gLnVzZXIuY2lyY2xlYClcbiAgICAgICAgICAgIC5yZW1vdmVDbGFzcygndXNlciBjaXJjbGUnKVxuICAgICAgICAgICAgLmFkZENsYXNzKCdzcGlubmVyIGxvYWRpbmcnKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHN1Y2Nlc3NmdWwgc2F2aW5nIG9mIGEgcmVjb3JkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHJlc3BvbnNlIC0gVGhlIHNlcnZlciByZXNwb25zZS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcmVjb3JkSWQgLSBUaGUgSUQgb2YgdGhlIHJlY29yZCB0aGF0IHdhcyBzYXZlZC5cbiAgICAgKi9cbiAgICBvblNhdmVTdWNjZXNzKHJlc3BvbnNlLCByZWNvcmRJZCkge1xuICAgICAgICBpZiAocmVzcG9uc2UuZGF0YSkge1xuICAgICAgICAgICAgbGV0IG9sZElkID0gcmVzcG9uc2UuZGF0YS5vbGRJZCB8fCByZWNvcmRJZDtcbiAgICAgICAgICAgICQoYHRyIyR7b2xkSWR9IGlucHV0YCkuYXR0cigncmVhZG9ubHknLCB0cnVlKTtcbiAgICAgICAgICAgICQoYHRyIyR7b2xkSWR9IGRpdmApLnJlbW92ZUNsYXNzKCdjaGFuZ2VkLWZpZWxkIGxvYWRpbmcnKS5hZGRDbGFzcygndHJhbnNwYXJlbnQnKTtcbiAgICAgICAgICAgICQoYHRyIyR7b2xkSWR9IC5zcGlubmVyLmxvYWRpbmdgKS5hZGRDbGFzcygndXNlciBjaXJjbGUnKS5yZW1vdmVDbGFzcygnc3Bpbm5lciBsb2FkaW5nJyk7XG4gICAgICAgICAgICBpZiAob2xkSWQgIT09IHJlc3BvbnNlLmRhdGEubmV3SWQpIHtcbiAgICAgICAgICAgICAgICAkKGB0ciMke29sZElkfWApLmF0dHIoJ2lkJywgcmVzcG9uc2UuZGF0YS5uZXdJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRGVsZXRlIGEgcm93IGZyb20gdGhlIHBob25lYm9vayB0YWJsZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7alF1ZXJ5fSAkdGFyZ2V0IC0gVGhlIGRlbGV0ZSBidXR0b24gZWxlbWVudC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgLSBUaGUgSUQgb2YgdGhlIHJlY29yZCB0byBkZWxldGUuXG4gICAgICovXG4gICAgZGVsZXRlUm93KCR0YXJnZXQsIGlkKSB7XG4gICAgICAgIGlmIChpZCA9PT0gJ25ldycpIHtcbiAgICAgICAgICAgICR0YXJnZXQuY2xvc2VzdCgndHInKS5yZW1vdmUoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgICQuYXBpKHtcbiAgICAgICAgICAgIHVybDogYCR7dGhpcy5kZWxldGVSZWNvcmRBSkFYVXJsfS8ke2lkfWAsXG4gICAgICAgICAgICBvbjogJ25vdycsXG4gICAgICAgICAgICBvblN1Y2Nlc3M6IChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICR0YXJnZXQuY2xvc2VzdCgndHInKS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuJHJlY29yZHNUYWJsZS5maW5kKCd0Ym9keSA+IHRyJykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRyZWNvcmRzVGFibGUuZmluZCgndGJvZHknKS5hcHBlbmQoJzx0ciBjbGFzcz1cIm9kZFwiPjwvdHI+Jyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2xlYW4gbnVtYmVyIGJlZm9yZSBwYXN0aW5nLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHBhc3RlZFZhbHVlIC0gVGhlIHBhc3RlZCBwaG9uZSBudW1iZXIuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gVGhlIGNsZWFuZWQgbnVtYmVyLlxuICAgICAqL1xuICAgIGNiT25OdW1iZXJCZWZvcmVQYXN0ZShwYXN0ZWRWYWx1ZSkge1xuICAgICAgICByZXR1cm4gcGFzdGVkVmFsdWUucmVwbGFjZSgvXFxEKy9nLCAnJyk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHJvd3MgdGhhdCBjYW4gZml0IG9uIGEgcGFnZSBiYXNlZCBvbiB3aW5kb3cgaGVpZ2h0LlxuICAgICAqXG4gICAgICogQHJldHVybnMge251bWJlcn0gVGhlIGNhbGN1bGF0ZWQgbnVtYmVyIG9mIHJvd3MuXG4gICAgICovXG4gICAgY2FsY3VsYXRlUGFnZUxlbmd0aCgpIHtcbiAgICAgICAgLy8gQ2FsY3VsYXRlIHJvdyBoZWlnaHRcbiAgICAgICAgbGV0IHJvd0hlaWdodCA9IHRoaXMuJHJlY29yZHNUYWJsZS5maW5kKCd0cicpLmZpcnN0KCkub3V0ZXJIZWlnaHQoKTtcblxuICAgICAgICAvLyBDYWxjdWxhdGUgd2luZG93IGhlaWdodCBhbmQgYXZhaWxhYmxlIHNwYWNlIGZvciB0YWJsZVxuICAgICAgICBjb25zdCB3aW5kb3dIZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQ7XG4gICAgICAgIGNvbnN0IGhlYWRlckZvb3RlckhlaWdodCA9IDU1MDsgLy8gRXN0aW1hdGUgaGVpZ2h0IGZvciBoZWFkZXIsIGZvb3RlciwgYW5kIG90aGVyIGVsZW1lbnRzXG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIG5ldyBwYWdlIGxlbmd0aFxuICAgICAgICByZXR1cm4gTWF0aC5tYXgoTWF0aC5mbG9vcigod2luZG93SGVpZ2h0IC0gaGVhZGVyRm9vdGVySGVpZ2h0KSAvIHJvd0hlaWdodCksIDUpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHZhbHVlIG9mIGEgcXVlcnkgcGFyYW1ldGVyIGZyb20gdGhlIFVSTC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbSAtIFRoZSBuYW1lIG9mIHRoZSBxdWVyeSBwYXJhbWV0ZXIgdG8gcmV0cmlldmUuXG4gICAgICogQHJldHVybnMge3N0cmluZ3xudWxsfSBUaGUgdmFsdWUgb2YgdGhlIHF1ZXJ5IHBhcmFtZXRlciwgb3IgbnVsbCBpZiBub3QgZm91bmQuXG4gICAgICovXG4gICAgZ2V0UXVlcnlQYXJhbShwYXJhbSkge1xuICAgICAgICBjb25zdCB1cmxQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO1xuICAgICAgICByZXR1cm4gdXJsUGFyYW1zLmdldChwYXJhbSk7XG4gICAgfSxcbn07XG5cbiQoZG9jdW1lbnQpLnJlYWR5KCgpID0+IHtcbiAgICBNb2R1bGVQaG9uZUJvb2tEVC5pbml0aWFsaXplKCk7XG59KTsiXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNb2R1bGVQaG9uZUJvb2tEVCIsIiRnbG9iYWxTZWFyY2giLCIkIiwiJHBhZ2VMZW5ndGhTZWxlY3RvciIsIiRzZWFyY2hFeHRlbnNpb25zSW5wdXQiLCJkYXRhVGFibGUiLCIkYm9keSIsIiRkaXNhYmxlSW5wdXRNYXNrVG9nZ2xlIiwiJHJlY29yZHNUYWJsZSIsIiRhZGROZXdCdXR0b24iLCJpbnB1dE51bWJlckpRVFBMIiwiJG1hc2tMaXN0IiwiZ2V0TmV3UmVjb3Jkc0FKQVhVcmwiLCJjb25jYXQiLCJnbG9iYWxSb290VXJsIiwiZGVsZXRlUmVjb3JkQUpBWFVybCIsInNhdmVSZWNvcmRBSkFYVXJsIiwiaW5pdGlhbGl6ZSIsImluaXRpYWxpemVTZWFyY2giLCJpbml0aWFsaXplRGF0YVRhYmxlIiwiaW5pdGlhbGl6ZUV2ZW50TGlzdGVuZXJzIiwiX3RoaXMiLCJvbiIsImUiLCJzZWFyY2hUZXh0IiwidmFsIiwidHJpbSIsImtleUNvZGUiLCJsZW5ndGgiLCJhcHBseUZpbHRlciIsIl90aGlzMiIsIm9uRmllbGRGb2N1cyIsInRhcmdldCIsInNhdmVDaGFuZ2VzRm9yQWxsUm93cyIsInByZXZlbnREZWZhdWx0IiwiaWQiLCJjbG9zZXN0IiwiZGF0YSIsImRlbGV0ZVJvdyIsImRvY3VtZW50Iiwia2V5IiwiaGFzQ2xhc3MiLCJhZGROZXdSb3ciLCJkcm9wZG93biIsIm9uQ2hhbmdlIiwicGFnZUxlbmd0aCIsImNhbGN1bGF0ZVBhZ2VMZW5ndGgiLCJsb2NhbFN0b3JhZ2UiLCJyZW1vdmVJdGVtIiwic2V0SXRlbSIsInBhZ2UiLCJsZW4iLCJkcmF3IiwiZXZlbnQiLCJzdG9wUHJvcGFnYXRpb24iLCIkaW5wdXQiLCJ0cmFuc2l0aW9uIiwicmVtb3ZlQ2xhc3MiLCJhZGRDbGFzcyIsImF0dHIiLCJfdGhpczMiLCIkcm93cyIsImVhY2giLCJfIiwicm93Iiwicm93SWQiLCJ1bmRlZmluZWQiLCJzZW5kQ2hhbmdlc1RvU2VydmVyIiwiJGVtcHR5Um93IiwicmVtb3ZlIiwibmV3SWQiLCJNYXRoIiwiZmxvb3IiLCJyYW5kb20iLCJuZXdSb3dUZW1wbGF0ZSIsImZpbmQiLCJwcmVwZW5kIiwiJG5ld1JvdyIsImZvY3VzIiwiaW5pdGlhbGl6ZUlucHV0bWFzayIsIl90aGlzNCIsInNhdmVkUGFnZUxlbmd0aCIsImdldEl0ZW0iLCJzZWFyY2giLCJzZXJ2ZXJTaWRlIiwicHJvY2Vzc2luZyIsImFqYXgiLCJ1cmwiLCJ0eXBlIiwiZGF0YVNyYyIsImNvbHVtbnMiLCJwYWdpbmciLCJkZWZlclJlbmRlciIsInNEb20iLCJvcmRlcmluZyIsImNyZWF0ZWRSb3ciLCJidWlsZFJvd1RlbXBsYXRlIiwiZHJhd0NhbGxiYWNrIiwibGFuZ3VhZ2UiLCJTZW1hbnRpY0xvY2FsaXphdGlvbiIsImRhdGFUYWJsZUxvY2FsaXNhdGlvbiIsIkRhdGFUYWJsZSIsInNlYXJjaERlYm91bmNlVGltZXIiLCJjbGVhclRpbWVvdXQiLCJzZXRUaW1lb3V0IiwidGV4dCIsInN0YXRlIiwibG9hZGVkIiwic2VhcmNoVmFsdWUiLCJnZXRRdWVyeVBhcmFtIiwibmFtZVRlbXBsYXRlIiwiY2FsbF9pZCIsIm51bWJlclRlbXBsYXRlIiwibnVtYmVyIiwiZGVsZXRlQnV0dG9uVGVtcGxhdGUiLCJEVF9Sb3dJZCIsImNyZWF0ZWQiLCJlcSIsImh0bWwiLCIkY2hhbmdlZEZpZWxkcyIsIm9iaiIsIiRlbCIsImNoZWNrYm94IiwibWFza3NTb3J0IiwiSW5wdXRNYXNrUGF0dGVybnMiLCJpbnB1dG1hc2tzIiwiaW5wdXRtYXNrIiwiZGVmaW5pdGlvbnMiLCJ2YWxpZGF0b3IiLCJjYXJkaW5hbGl0eSIsInNob3dNYXNrT25Ib3ZlciIsIm9uQmVmb3JlUGFzdGUiLCJjYk9uTnVtYmVyQmVmb3JlUGFzdGUiLCJtYXRjaCIsInJlcGxhY2UiLCJsaXN0IiwibGlzdEtleSIsInJlY29yZElkIiwiX3RoaXM1IiwiY2FsbGVySWQiLCJudW1iZXJJbnB1dFZhbCIsIm51bWJlcl9yZXAiLCJkaXNwbGF5U2F2aW5nSWNvbiIsImFwaSIsIm1ldGhvZCIsInN1Y2Nlc3NUZXN0IiwicmVzcG9uc2UiLCJzdWNjZXNzIiwib25TdWNjZXNzIiwib25TYXZlU3VjY2VzcyIsIm9uRmFpbHVyZSIsIlVzZXJNZXNzYWdlIiwic2hvd011bHRpU3RyaW5nIiwibWVzc2FnZSIsIm9uRXJyb3IiLCJlcnJvck1lc3NhZ2UiLCJlbGVtZW50IiwieGhyIiwic3RhdHVzIiwid2luZG93IiwibG9jYXRpb24iLCJvbGRJZCIsIiR0YXJnZXQiLCJfdGhpczYiLCJhcHBlbmQiLCJwYXN0ZWRWYWx1ZSIsInJvd0hlaWdodCIsImZpcnN0Iiwib3V0ZXJIZWlnaHQiLCJ3aW5kb3dIZWlnaHQiLCJpbm5lckhlaWdodCIsImhlYWRlckZvb3RlckhlaWdodCIsIm1heCIsInBhcmFtIiwidXJsUGFyYW1zIiwiVVJMU2VhcmNoUGFyYW1zIiwiZ2V0IiwicmVhZHkiXSwic291cmNlcyI6WyJzcmMvbW9kdWxlLXBob25lYm9vay1kYXRhdGFibGUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogTWlrb1BCWCAtIGZyZWUgcGhvbmUgc3lzdGVtIGZvciBzbWFsbCBidXNpbmVzc1xyXG4gKiBDb3B5cmlnaHQgwqkgMjAxNy0yMDI0IEFsZXhleSBQb3J0bm92IGFuZCBOaWtvbGF5IEJla2V0b3ZcclxuICpcclxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcclxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcclxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcclxuICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cclxuICpcclxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXHJcbiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXHJcbiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcclxuICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cclxuICpcclxuICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uXHJcbiAqIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uXHJcbiAqL1xyXG5cclxuLyogZ2xvYmFsIGdsb2JhbFJvb3RVcmwsIGdsb2JhbFRyYW5zbGF0ZSwgU2VtYW50aWNMb2NhbGl6YXRpb24sIFVzZXJNZXNzYWdlLCBJbnB1dE1hc2tQYXR0ZXJucyAqL1xyXG5cclxuY29uc3QgTW9kdWxlUGhvbmVCb29rRFQgPSB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZ2xvYmFsIHNlYXJjaCBpbnB1dCBlbGVtZW50LlxyXG4gICAgICogQHR5cGUge2pRdWVyeX1cclxuICAgICAqL1xyXG4gICAgJGdsb2JhbFNlYXJjaDogJCgnI2dsb2JhbC1zZWFyY2gnKSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBwYWdlIGxlbmd0aCBzZWxlY3Rvci5cclxuICAgICAqIEB0eXBlIHtqUXVlcnl9XHJcbiAgICAgKi9cclxuICAgICRwYWdlTGVuZ3RoU2VsZWN0b3I6ICQoJyNwYWdlLWxlbmd0aC1zZWxlY3QnKSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBwYWdlIGxlbmd0aCBzZWxlY3Rvci5cclxuICAgICAqIEB0eXBlIHtqUXVlcnl9XHJcbiAgICAgKi9cclxuICAgICRzZWFyY2hFeHRlbnNpb25zSW5wdXQ6ICQoJyNzZWFyY2gtZXh0ZW5zaW9ucy1pbnB1dCcpLFxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBkYXRhIHRhYmxlIG9iamVjdC5cclxuICAgICAqIEB0eXBlIHtPYmplY3R9XHJcbiAgICAgKi9cclxuICAgIGRhdGFUYWJsZToge30sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZG9jdW1lbnQgYm9keS5cclxuICAgICAqIEB0eXBlIHtqUXVlcnl9XHJcbiAgICAgKi9cclxuICAgICRib2R5OiAkKCdib2R5JyksXHJcblxyXG4gICAgLy8gQ2FjaGVkIERPTSBlbGVtZW50c1xyXG4gICAgJGRpc2FibGVJbnB1dE1hc2tUb2dnbGU6ICQoJyNkaXNhYmxlLWlucHV0LW1hc2snKSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBleHRlbnNpb25zIHRhYmxlIGVsZW1lbnQuXHJcbiAgICAgKiBAdHlwZSB7alF1ZXJ5fVxyXG4gICAgICovXHJcbiAgICAkcmVjb3Jkc1RhYmxlOiAkKCcjcGhvbmVib29rLXRhYmxlJyksXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgYWRkIG5ldyBidXR0b24gZWxlbWVudC5cclxuICAgICAqIEB0eXBlIHtqUXVlcnl9XHJcbiAgICAgKi9cclxuICAgICRhZGROZXdCdXR0b246ICQoJyNhZGQtbmV3LWJ1dHRvbicpLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2VsZWN0b3IgZm9yIG51bWJlciBpbnB1dCBmaWVsZHMuXHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICovXHJcbiAgICBpbnB1dE51bWJlckpRVFBMOiAnaW5wdXQubnVtYmVyLWlucHV0JyxcclxuXHJcbiAgICAvKipcclxuICAgICAqIExpc3Qgb2YgaW5wdXQgbWFza3MuXHJcbiAgICAgKiBAdHlwZSB7bnVsbHxBcnJheX1cclxuICAgICAqL1xyXG4gICAgJG1hc2tMaXN0OiBudWxsLFxyXG5cclxuICAgIC8vIFVSTHMgZm9yIEFKQVggcmVxdWVzdHNcclxuICAgIGdldE5ld1JlY29yZHNBSkFYVXJsOiBgJHtnbG9iYWxSb290VXJsfW1vZHVsZS1waG9uZS1ib29rL2dldE5ld1JlY29yZHNgLFxyXG5cclxuICAgIGRlbGV0ZVJlY29yZEFKQVhVcmw6IGAke2dsb2JhbFJvb3RVcmx9bW9kdWxlLXBob25lLWJvb2svZGVsZXRlYCxcclxuXHJcbiAgICBzYXZlUmVjb3JkQUpBWFVybDogYCR7Z2xvYmFsUm9vdFVybH1tb2R1bGUtcGhvbmUtYm9vay9zYXZlYCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEluaXRpYWxpemUgdGhlIG1vZHVsZS5cclxuICAgICAqIFRoaXMgaW5jbHVkZXMgc2V0dGluZyB1cCBldmVudCBsaXN0ZW5lcnMgYW5kIGluaXRpYWxpemluZyB0aGUgRGF0YVRhYmxlLlxyXG4gICAgICovXHJcbiAgICBpbml0aWFsaXplKCkge1xyXG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZVNlYXJjaCgpO1xyXG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZURhdGFUYWJsZSgpO1xyXG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZUV2ZW50TGlzdGVuZXJzKCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5pdGlhbGl6ZSB0aGUgc2VhcmNoIGZ1bmN0aW9uYWxpdHkuXHJcbiAgICAgKiBJdCBsaXN0ZW5zIGZvciBrZXkgZXZlbnRzIGFuZCBhcHBsaWVzIGEgZmlsdGVyIGJhc2VkIG9uIHRoZSB1c2VyJ3MgaW5wdXQuXHJcbiAgICAgKi9cclxuICAgIGluaXRpYWxpemVTZWFyY2goKSB7XHJcbiAgICAgICAgdGhpcy4kZ2xvYmFsU2VhcmNoLm9uKCdrZXl1cCcsIChlKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlYXJjaFRleHQgPSB0aGlzLiRnbG9iYWxTZWFyY2gudmFsKCkudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoZS5rZXlDb2RlID09PSAxMyB8fCBlLmtleUNvZGUgPT09IDggfHwgc2VhcmNoVGV4dC5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlGaWx0ZXIoc2VhcmNoVGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbml0aWFsaXplIGFsbCBldmVudCBsaXN0ZW5lcnMuXHJcbiAgICAgKiBIYW5kbGVzIGlucHV0IGZvY3VzLCBmb3JtIHN1Ym1pc3Npb24sIGFkZGluZyBuZXcgcm93cywgYW5kIGRlbGV0ZSBhY3Rpb25zLlxyXG4gICAgICovXHJcbiAgICBpbml0aWFsaXplRXZlbnRMaXN0ZW5lcnMoKSB7XHJcblxyXG4gICAgICAgIC8vIEhhbmRsZSBmb2N1cyBvbiBpbnB1dCBmaWVsZHMgZm9yIGVkaXRpbmdcclxuICAgICAgICB0aGlzLiRib2R5Lm9uKCdmb2N1c2luJywgJy5jYWxsZXItaWQtaW5wdXQsIC5udW1iZXItaW5wdXQnLCAoZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLm9uRmllbGRGb2N1cygkKGUudGFyZ2V0KSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIEhhbmRsZSBsb3NzIG9mIGZvY3VzIG9uIGlucHV0IGZpZWxkcyBhbmQgc2F2ZSBjaGFuZ2VzXHJcbiAgICAgICAgdGhpcy4kYm9keS5vbignZm9jdXNvdXQnLCAnLmNhbGxlci1pZC1pbnB1dCwgLm51bWJlci1pbnB1dCcsICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zYXZlQ2hhbmdlc0ZvckFsbFJvd3MoKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gSGFuZGxlIGRlbGV0ZSBidXR0b24gY2xpY2tcclxuICAgICAgICB0aGlzLiRib2R5Lm9uKCdjbGljaycsICdhLmRlbGV0ZScsIChlKSA9PiB7XHJcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgY29uc3QgaWQgPSAkKGUudGFyZ2V0KS5jbG9zZXN0KCdhJykuZGF0YSgndmFsdWUnKTtcclxuICAgICAgICAgICAgdGhpcy5kZWxldGVSb3coJChlLnRhcmdldCksIGlkKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gSGFuZGxlIEVudGVyIG9yIFRhYiBrZXkgdG8gdHJpZ2dlciBmb3JtIHN1Ym1pc3Npb25cclxuICAgICAgICAkKGRvY3VtZW50KS5vbigna2V5ZG93bicsIChlKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJyB8fCAoZS5rZXkgPT09ICdUYWInICYmICEkKCc6Zm9jdXMnKS5oYXNDbGFzcygnLm51bWJlci1pbnB1dCcpKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zYXZlQ2hhbmdlc0ZvckFsbFJvd3MoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBIYW5kbGUgYWRkaW5nIGEgbmV3IHJvd1xyXG4gICAgICAgIHRoaXMuJGFkZE5ld0J1dHRvbi5vbignY2xpY2snLCAoZSkgPT4ge1xyXG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkTmV3Um93KCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIEhhbmRsZSBwYWdlIGxlbmd0aCBzZWxlY3Rpb25cclxuICAgICAgICB0aGlzLiRwYWdlTGVuZ3RoU2VsZWN0b3IuZHJvcGRvd24oe1xyXG4gICAgICAgICAgICBvbkNoYW5nZShwYWdlTGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocGFnZUxlbmd0aCA9PT0gJ2F1dG8nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFnZUxlbmd0aCA9IHRoaXMuY2FsY3VsYXRlUGFnZUxlbmd0aCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdwaG9uZWJvb2tUYWJsZVBhZ2VMZW5ndGgnKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3Bob25lYm9va1RhYmxlUGFnZUxlbmd0aCcsIHBhZ2VMZW5ndGgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgTW9kdWxlUGhvbmVCb29rRFQuZGF0YVRhYmxlLnBhZ2UubGVuKHBhZ2VMZW5ndGgpLmRyYXcoKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gUHJldmVudCBldmVudCBidWJibGluZyBvbiBkcm9wZG93biBjbGlja1xyXG4gICAgICAgIHRoaXMuJHBhZ2VMZW5ndGhTZWxlY3Rvci5vbignY2xpY2snLCBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IC8vIFByZXZlbnQgdGhlIGV2ZW50IGZyb20gYnViYmxpbmdcclxuICAgICAgICB9KTtcclxuICAgIH0sXHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSGFuZGxlIGZvY3VzIGV2ZW50IG9uIGEgZmllbGQgYnkgYWRkaW5nIGEgZ2xvd2luZyBlZmZlY3QgYW5kIGVuYWJsaW5nIGVkaXRpbmcuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtqUXVlcnl9ICRpbnB1dCAtIFRoZSBpbnB1dCBmaWVsZCB0aGF0IHJlY2VpdmVkIGZvY3VzLlxyXG4gICAgICovXHJcbiAgICBvbkZpZWxkRm9jdXMoJGlucHV0KSB7XHJcbiAgICAgICAgJGlucHV0LnRyYW5zaXRpb24oJ2dsb3cnKTtcclxuICAgICAgICAkaW5wdXQuY2xvc2VzdCgnZGl2JykucmVtb3ZlQ2xhc3MoJ3RyYW5zcGFyZW50JykuYWRkQ2xhc3MoJ2NoYW5nZWQtZmllbGQnKTtcclxuICAgICAgICAkaW5wdXQuYXR0cigncmVhZG9ubHknLCBmYWxzZSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2F2ZSBjaGFuZ2VzIGZvciBhbGwgbW9kaWZpZWQgcm93cy5cclxuICAgICAqIEl0IHNlbmRzIHRoZSBjaGFuZ2VzIGZvciBlYWNoIG1vZGlmaWVkIHJvdyB0byB0aGUgc2VydmVyLlxyXG4gICAgICovXHJcbiAgICBzYXZlQ2hhbmdlc0ZvckFsbFJvd3MoKSB7XHJcbiAgICAgICAgY29uc3QgJHJvd3MgPSAkKCcuY2hhbmdlZC1maWVsZCcpLmNsb3Nlc3QoJ3RyJyk7XHJcbiAgICAgICAgJHJvd3MuZWFjaCgoXywgcm93KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJvd0lkID0gJChyb3cpLmF0dHIoJ2lkJyk7XHJcbiAgICAgICAgICAgIGlmIChyb3dJZCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbmRDaGFuZ2VzVG9TZXJ2ZXIocm93SWQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkIGEgbmV3IHJvdyB0byB0aGUgcGhvbmVib29rIHRhYmxlLlxyXG4gICAgICogVGhlIHJvdyBpcyBlZGl0YWJsZSBhbmQgYWxsb3dzIGZvciBpbnB1dCBvZiBuZXcgY29udGFjdCBpbmZvcm1hdGlvbi5cclxuICAgICAqL1xyXG4gICAgYWRkTmV3Um93KCkge1xyXG4gICAgICAgIGNvbnN0ICRlbXB0eVJvdyA9ICQoJy5kYXRhVGFibGVzX2VtcHR5Jyk7XHJcbiAgICAgICAgaWYgKCRlbXB0eVJvdy5sZW5ndGgpICRlbXB0eVJvdy5yZW1vdmUoKTtcclxuXHJcbiAgICAgICAgdGhpcy5zYXZlQ2hhbmdlc0ZvckFsbFJvd3MoKTtcclxuXHJcbiAgICAgICAgY29uc3QgbmV3SWQgPSBgbmV3JHtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiA1MDApfWA7XHJcbiAgICAgICAgY29uc3QgbmV3Um93VGVtcGxhdGUgPSBgXHJcbiAgICAgICAgICAgIDx0ciBpZD1cIiR7bmV3SWR9XCI+XHJcbiAgICAgICAgICAgICAgICA8dGQ+PGkgY2xhc3M9XCJ1aSB1c2VyIGNpcmNsZSBpY29uXCI+PC9pPjwvdGQ+XHJcbiAgICAgICAgICAgICAgICA8dGQ+PGRpdiBjbGFzcz1cInVpIGZsdWlkIGlucHV0IGlubGluZS1lZGl0IGNoYW5nZWQtZmllbGRcIj48aW5wdXQgY2xhc3M9XCJjYWxsZXItaWQtaW5wdXRcIiB0eXBlPVwidGV4dFwiIHZhbHVlPVwiXCI+PC9kaXY+PC90ZD5cclxuICAgICAgICAgICAgICAgIDx0ZD48ZGl2IGNsYXNzPVwidWkgZmx1aWQgaW5wdXQgaW5saW5lLWVkaXQgY2hhbmdlZC1maWVsZFwiPjxpbnB1dCBjbGFzcz1cIm51bWJlci1pbnB1dFwiIHR5cGU9XCJ0ZXh0XCIgdmFsdWU9XCJcIj48L2Rpdj48L3RkPlxyXG4gICAgICAgICAgICAgICAgPHRkPjxkaXYgY2xhc3M9XCJ1aSBiYXNpYyBpY29uIGJ1dHRvbnMgYWN0aW9uLWJ1dHRvbnMgdGlueVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIgY2xhc3M9XCJ1aSBidXR0b24gZGVsZXRlXCIgZGF0YS12YWx1ZT1cIm5ld1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImljb24gdHJhc2ggcmVkXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PjwvdGQ+XHJcbiAgICAgICAgICAgIDwvdHI+YDtcclxuXHJcbiAgICAgICAgdGhpcy4kcmVjb3Jkc1RhYmxlLmZpbmQoJ3Rib2R5JykucHJlcGVuZChuZXdSb3dUZW1wbGF0ZSk7XHJcbiAgICAgICAgY29uc3QgJG5ld1JvdyA9ICQoYCMke25ld0lkfWApO1xyXG4gICAgICAgICRuZXdSb3cuZmluZCgnaW5wdXQnKS50cmFuc2l0aW9uKCdnbG93Jyk7XHJcbiAgICAgICAgJG5ld1Jvdy5maW5kKCcuY2FsbGVyLWlkLWlucHV0JykuZm9jdXMoKTtcclxuICAgICAgICB0aGlzLmluaXRpYWxpemVJbnB1dG1hc2soJG5ld1Jvdy5maW5kKCcubnVtYmVyLWlucHV0JykpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEluaXRpYWxpemUgdGhlIERhdGFUYWJsZSBpbnN0YW5jZSB3aXRoIHRoZSByZXF1aXJlZCBzZXR0aW5ncyBhbmQgb3B0aW9ucy5cclxuICAgICAqL1xyXG4gICAgaW5pdGlhbGl6ZURhdGFUYWJsZSgpIHtcclxuXHJcbiAgICAgICAgLy8gR2V0IHRoZSB1c2VyJ3Mgc2F2ZWQgdmFsdWUgb3IgdXNlIHRoZSBhdXRvbWF0aWNhbGx5IGNhbGN1bGF0ZWQgdmFsdWUgaWYgbm9uZSBleGlzdHNcclxuICAgICAgICBjb25zdCBzYXZlZFBhZ2VMZW5ndGggPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgncGhvbmVib29rVGFibGVQYWdlTGVuZ3RoJyk7XHJcbiAgICAgICAgY29uc3QgcGFnZUxlbmd0aCA9IHNhdmVkUGFnZUxlbmd0aCA/IHNhdmVkUGFnZUxlbmd0aCA6IHRoaXMuY2FsY3VsYXRlUGFnZUxlbmd0aCgpO1xyXG5cclxuICAgICAgICB0aGlzLiRyZWNvcmRzVGFibGUuZGF0YVRhYmxlKHtcclxuICAgICAgICAgICAgc2VhcmNoOiB7c2VhcmNoOiB0aGlzLiRnbG9iYWxTZWFyY2gudmFsKCl9LFxyXG4gICAgICAgICAgICBzZXJ2ZXJTaWRlOiB0cnVlLFxyXG4gICAgICAgICAgICBwcm9jZXNzaW5nOiB0cnVlLFxyXG4gICAgICAgICAgICBhamF4OiB7XHJcbiAgICAgICAgICAgICAgICB1cmw6IHRoaXMuZ2V0TmV3UmVjb3Jkc0FKQVhVcmwsXHJcbiAgICAgICAgICAgICAgICB0eXBlOiAnUE9TVCcsXHJcbiAgICAgICAgICAgICAgICBkYXRhU3JjOiAnZGF0YScsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGNvbHVtbnM6IFtcclxuICAgICAgICAgICAgICAgIHtkYXRhOiBudWxsfSxcclxuICAgICAgICAgICAgICAgIHtkYXRhOiAnY2FsbF9pZCd9LFxyXG4gICAgICAgICAgICAgICAge2RhdGE6ICdudW1iZXInfSxcclxuICAgICAgICAgICAgICAgIHtkYXRhOiBudWxsfSxcclxuICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgcGFnaW5nOiB0cnVlLFxyXG4gICAgICAgICAgICBwYWdlTGVuZ3RoOiBwYWdlTGVuZ3RoLFxyXG4gICAgICAgICAgICBkZWZlclJlbmRlcjogdHJ1ZSxcclxuICAgICAgICAgICAgc0RvbTogJ3J0aXAnLFxyXG4gICAgICAgICAgICBvcmRlcmluZzogZmFsc2UsXHJcbiAgICAgICAgICAgIGNyZWF0ZWRSb3c6IChyb3csIGRhdGEpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRSb3dUZW1wbGF0ZShyb3csIGRhdGEpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBkcmF3Q2FsbGJhY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZUlucHV0bWFzaygkKHRoaXMuaW5wdXROdW1iZXJKUVRQTCkpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBsYW5ndWFnZTogU2VtYW50aWNMb2NhbGl6YXRpb24uZGF0YVRhYmxlTG9jYWxpc2F0aW9uLFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmRhdGFUYWJsZSA9IHRoaXMuJHJlY29yZHNUYWJsZS5EYXRhVGFibGUoKTtcclxuXHJcblxyXG4gICAgICAgIC8vIFNldCB0aGUgc2VsZWN0IGlucHV0IHZhbHVlIHRvIHRoZSBzYXZlZCB2YWx1ZSBpZiBpdCBleGlzdHNcclxuICAgICAgICBpZiAoc2F2ZWRQYWdlTGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuJHBhZ2VMZW5ndGhTZWxlY3Rvci5kcm9wZG93bignc2V0IHZhbHVlJywgc2F2ZWRQYWdlTGVuZ3RoKTtcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAvLyBJbml0aWFsaXplIGRlYm91bmNlIHRpbWVyIHZhcmlhYmxlXHJcbiAgICAgICAgbGV0IHNlYXJjaERlYm91bmNlVGltZXIgPSBudWxsO1xyXG5cclxuICAgICAgICB0aGlzLiRnbG9iYWxTZWFyY2gub24oJ2tleXVwJywgKGUpID0+IHtcclxuICAgICAgICAgICAgLy8gQ2xlYXIgcHJldmlvdXMgdGltZXIgaWYgdGhlIHVzZXIgaXMgc3RpbGwgdHlwaW5nXHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChzZWFyY2hEZWJvdW5jZVRpbWVyKTtcclxuXHJcbiAgICAgICAgICAgIC8vIFNldCBhIG5ldyB0aW1lciBmb3IgZGVsYXllZCBleGVjdXRpb25cclxuICAgICAgICAgICAgc2VhcmNoRGVib3VuY2VUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dCA9IHRoaXMuJGdsb2JhbFNlYXJjaC52YWwoKTtcclxuICAgICAgICAgICAgICAgIC8vIFRyaWdnZXIgdGhlIHNlYXJjaCBpZiBpbnB1dCBpcyB2YWxpZCAoRW50ZXIsIEJhY2tzcGFjZSwgb3IgbW9yZSB0aGFuIDIgY2hhcmFjdGVycylcclxuICAgICAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT09IDEzIHx8IGUua2V5Q29kZSA9PT0gOCB8fCB0ZXh0Lmxlbmd0aCA+PSAyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHBseUZpbHRlcih0ZXh0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSwgNTAwKTsgLy8gNTAwbXMgZGVsYXkgYmVmb3JlIGV4ZWN1dGluZyB0aGUgc2VhcmNoXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIFJlc3RvcmUgdGhlIHNhdmVkIHNlYXJjaCBwaHJhc2UgZnJvbSBEYXRhVGFibGVzIHN0YXRlXHJcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLmRhdGFUYWJsZS5zdGF0ZS5sb2FkZWQoKTtcclxuICAgICAgICBpZiAoc3RhdGUgJiYgc3RhdGUuc2VhcmNoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuJGdsb2JhbFNlYXJjaC52YWwoc3RhdGUuc2VhcmNoLnNlYXJjaCk7IC8vIFNldCB0aGUgc2VhcmNoIGZpZWxkIHdpdGggdGhlIHNhdmVkIHZhbHVlXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBSZXRyaWV2ZXMgdGhlIHZhbHVlIG9mICdzZWFyY2gnIHF1ZXJ5IHBhcmFtZXRlciBmcm9tIHRoZSBVUkwuXHJcbiAgICAgICAgY29uc3Qgc2VhcmNoVmFsdWUgPSB0aGlzLmdldFF1ZXJ5UGFyYW0oJ3NlYXJjaCcpO1xyXG5cclxuICAgICAgICAvLyBTZXRzIHRoZSBnbG9iYWwgc2VhcmNoIGlucHV0IHZhbHVlIGFuZCBhcHBsaWVzIHRoZSBmaWx0ZXIgaWYgYSBzZWFyY2ggdmFsdWUgaXMgcHJvdmlkZWQuXHJcbiAgICAgICAgaWYgKHNlYXJjaFZhbHVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuJGdsb2JhbFNlYXJjaC52YWwoc2VhcmNoVmFsdWUpO1xyXG4gICAgICAgICAgICB0aGlzLmFwcGx5RmlsdGVyKHNlYXJjaFZhbHVlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZGF0YVRhYmxlLm9uKCdkcmF3JywgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLiRnbG9iYWxTZWFyY2guY2xvc2VzdCgnZGl2JykucmVtb3ZlQ2xhc3MoJ2xvYWRpbmcnKTtcclxuICAgICAgICB9KTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBCdWlsZCB0aGUgSFRNTCB0ZW1wbGF0ZSBmb3IgZWFjaCByb3cgaW4gdGhlIERhdGFUYWJsZS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSByb3cgLSBUaGUgcm93IGVsZW1lbnQuXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGF0YSAtIFRoZSBkYXRhIG9iamVjdCBmb3IgdGhlIHJvdy5cclxuICAgICAqL1xyXG4gICAgYnVpbGRSb3dUZW1wbGF0ZShyb3csIGRhdGEpIHtcclxuICAgICAgICBjb25zdCBuYW1lVGVtcGxhdGUgPSBgPGRpdiBjbGFzcz1cInVpIHRyYW5zcGFyZW50IGZsdWlkIGlucHV0IGlubGluZS1lZGl0XCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJjYWxsZXItaWQtaW5wdXRcIiB0eXBlPVwidGV4dFwiIHZhbHVlPVwiJHtkYXRhLmNhbGxfaWR9XCIgLz5cclxuICAgICAgICAgICAgPC9kaXY+YDtcclxuICAgICAgICBjb25zdCBudW1iZXJUZW1wbGF0ZSA9IGA8ZGl2IGNsYXNzPVwidWkgdHJhbnNwYXJlbnQgaW5wdXQgaW5saW5lLWVkaXRcIj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cIm51bWJlci1pbnB1dFwiIHR5cGU9XCJ0ZXh0XCIgdmFsdWU9XCIke2RhdGEubnVtYmVyfVwiIC8+XHJcbiAgICAgICAgICAgIDwvZGl2PmA7XHJcbiAgICAgICAgY29uc3QgZGVsZXRlQnV0dG9uVGVtcGxhdGUgPSBgPGRpdiBjbGFzcz1cInVpIGJhc2ljIGljb24gYnV0dG9ucyBhY3Rpb24tYnV0dG9ucyB0aW55XCI+XHJcbiAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGRhdGEtdmFsdWU9XCIke2RhdGEuRFRfUm93SWR9XCIgY2xhc3M9XCJ1aSBkZWxldGUgYnV0dG9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJpY29uIHRyYXNoICR7ZGF0YT8uY3JlYXRlZCA+IDAgPyAnYmx1ZScgOiAncmVkJ31cIiAvPlxyXG4gICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICA8L2Rpdj5gO1xyXG5cclxuICAgICAgICAkKCd0ZCcsIHJvdykuZXEoMCkuaHRtbCgnPGkgY2xhc3M9XCJ1aSB1c2VyIGNpcmNsZSBpY29uXCI+PC9pPicpO1xyXG4gICAgICAgICQoJ3RkJywgcm93KS5lcSgxKS5odG1sKG5hbWVUZW1wbGF0ZSk7XHJcbiAgICAgICAgJCgndGQnLCByb3cpLmVxKDIpLmh0bWwobnVtYmVyVGVtcGxhdGUpO1xyXG4gICAgICAgICQoJ3RkJywgcm93KS5lcSgzKS5odG1sKGRlbGV0ZUJ1dHRvblRlbXBsYXRlKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBcHBseSBhIHNlYXJjaCBmaWx0ZXIgdG8gdGhlIERhdGFUYWJsZS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIFRoZSBzZWFyY2ggdGV4dCB0byBhcHBseS5cclxuICAgICAqL1xyXG4gICAgYXBwbHlGaWx0ZXIodGV4dCkge1xyXG4gICAgICAgIGNvbnN0ICRjaGFuZ2VkRmllbGRzID0gJCgnLmNoYW5nZWQtZmllbGQnKTtcclxuICAgICAgICAkY2hhbmdlZEZpZWxkcy5lYWNoKChfLCBvYmopID0+IHtcclxuICAgICAgICAgICAgY29uc3QgJGlucHV0ID0gJChvYmopLmZpbmQoJ2lucHV0Jyk7XHJcbiAgICAgICAgICAgICRpbnB1dC52YWwoJGlucHV0LmRhdGEoJ3ZhbHVlJykpO1xyXG4gICAgICAgICAgICAkaW5wdXQuYXR0cigncmVhZG9ubHknLCB0cnVlKTtcclxuICAgICAgICAgICAgJChvYmopLnJlbW92ZUNsYXNzKCdjaGFuZ2VkLWZpZWxkJykuYWRkQ2xhc3MoJ3RyYW5zcGFyZW50Jyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5kYXRhVGFibGUuc2VhcmNoKHRleHQpLmRyYXcoKTtcclxuICAgICAgICB0aGlzLiRnbG9iYWxTZWFyY2guY2xvc2VzdCgnZGl2JykuYWRkQ2xhc3MoJ2xvYWRpbmcnKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbml0aWFsaXplIGlucHV0IG1hc2tzIGZvciBwaG9uZSBudW1iZXIgZmllbGRzLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7alF1ZXJ5fSAkZWwgLSBUaGUgaW5wdXQgZWxlbWVudHMgdG8gYXBwbHkgbWFza3MgdG8uXHJcbiAgICAgKi9cclxuICAgIGluaXRpYWxpemVJbnB1dG1hc2soJGVsKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuJGRpc2FibGVJbnB1dE1hc2tUb2dnbGUuY2hlY2tib3goJ2lzIGNoZWNrZWQnKSkgcmV0dXJuO1xyXG5cclxuICAgICAgICBpZiAodGhpcy4kbWFza0xpc3QgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhpcy4kbWFza0xpc3QgPSAkLm1hc2tzU29ydChJbnB1dE1hc2tQYXR0ZXJucywgWycjJ10sIC9bMC05XXwjLywgJ21hc2snKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgICRlbC5pbnB1dG1hc2tzKHtcclxuICAgICAgICAgICAgaW5wdXRtYXNrOiB7XHJcbiAgICAgICAgICAgICAgICBkZWZpbml0aW9uczoge1xyXG4gICAgICAgICAgICAgICAgICAgICcjJzoge3ZhbGlkYXRvcjogJ1swLTldJywgY2FyZGluYWxpdHk6IDF9LFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHNob3dNYXNrT25Ib3ZlcjogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBvbkJlZm9yZVBhc3RlOiB0aGlzLmNiT25OdW1iZXJCZWZvcmVQYXN0ZSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgbWF0Y2g6IC9bMC05XS8sXHJcbiAgICAgICAgICAgIHJlcGxhY2U6ICc5JyxcclxuICAgICAgICAgICAgbGlzdDogdGhpcy4kbWFza0xpc3QsXHJcbiAgICAgICAgICAgIGxpc3RLZXk6ICdtYXNrJyxcclxuICAgICAgICB9KTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZW5kIHRoZSBjaGFuZ2VzIGZvciBhIHNwZWNpZmljIHJvdyB0byB0aGUgc2VydmVyLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSByZWNvcmRJZCAtIFRoZSBJRCBvZiB0aGUgcmVjb3JkIHRvIHNhdmUuXHJcbiAgICAgKi9cclxuICAgIHNlbmRDaGFuZ2VzVG9TZXJ2ZXIocmVjb3JkSWQpIHtcclxuICAgICAgICBjb25zdCBjYWxsZXJJZCA9ICQoYHRyIyR7cmVjb3JkSWR9IC5jYWxsZXItaWQtaW5wdXRgKS52YWwoKTtcclxuICAgICAgICBjb25zdCBudW1iZXJJbnB1dFZhbCA9ICQoYHRyIyR7cmVjb3JkSWR9IC5udW1iZXItaW5wdXRgKS52YWwoKTtcclxuXHJcbiAgICAgICAgaWYgKCFjYWxsZXJJZCB8fCAhbnVtYmVySW5wdXRWYWwpIHJldHVybjtcclxuXHJcbiAgICAgICAgY29uc3QgZGF0YSA9IHtcclxuICAgICAgICAgICAgY2FsbF9pZDogY2FsbGVySWQsXHJcbiAgICAgICAgICAgIG51bWJlcl9yZXA6IG51bWJlcklucHV0VmFsLFxyXG4gICAgICAgICAgICBpZDogcmVjb3JkSWRcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0aGlzLmRpc3BsYXlTYXZpbmdJY29uKHJlY29yZElkKTtcclxuXHJcbiAgICAgICAgJC5hcGkoe1xyXG4gICAgICAgICAgICB1cmw6IHRoaXMuc2F2ZVJlY29yZEFKQVhVcmwsXHJcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgICAgICAgICBvbjogJ25vdycsXHJcbiAgICAgICAgICAgIGRhdGEsXHJcbiAgICAgICAgICAgIHN1Y2Nlc3NUZXN0OiAocmVzcG9uc2UpID0+IHJlc3BvbnNlICYmIHJlc3BvbnNlLnN1Y2Nlc3MgPT09IHRydWUsXHJcbiAgICAgICAgICAgIG9uU3VjY2VzczogKHJlc3BvbnNlKSA9PiB0aGlzLm9uU2F2ZVN1Y2Nlc3MocmVzcG9uc2UsIHJlY29yZElkKSxcclxuICAgICAgICAgICAgb25GYWlsdXJlOiAocmVzcG9uc2UpID0+IFVzZXJNZXNzYWdlLnNob3dNdWx0aVN0cmluZyhyZXNwb25zZS5tZXNzYWdlKSxcclxuICAgICAgICAgICAgb25FcnJvcjogKGVycm9yTWVzc2FnZSwgZWxlbWVudCwgeGhyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoeGhyLnN0YXR1cyA9PT0gNDAzKSB3aW5kb3cubG9jYXRpb24gPSBgJHtnbG9iYWxSb290VXJsfXNlc3Npb24vaW5kZXhgO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgIH0pO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIERpc3BsYXkgYSBzYXZpbmcgaWNvbiBmb3IgdGhlIGdpdmVuIHJlY29yZC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcmVjb3JkSWQgLSBUaGUgSUQgb2YgdGhlIHJlY29yZCBiZWluZyBzYXZlZC5cclxuICAgICAqL1xyXG4gICAgZGlzcGxheVNhdmluZ0ljb24ocmVjb3JkSWQpIHtcclxuICAgICAgICAkKGB0ciMke3JlY29yZElkfSAudXNlci5jaXJjbGVgKVxyXG4gICAgICAgICAgICAucmVtb3ZlQ2xhc3MoJ3VzZXIgY2lyY2xlJylcclxuICAgICAgICAgICAgLmFkZENsYXNzKCdzcGlubmVyIGxvYWRpbmcnKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIYW5kbGUgc3VjY2Vzc2Z1bCBzYXZpbmcgb2YgYSByZWNvcmQuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHJlc3BvbnNlIC0gVGhlIHNlcnZlciByZXNwb25zZS5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSByZWNvcmRJZCAtIFRoZSBJRCBvZiB0aGUgcmVjb3JkIHRoYXQgd2FzIHNhdmVkLlxyXG4gICAgICovXHJcbiAgICBvblNhdmVTdWNjZXNzKHJlc3BvbnNlLCByZWNvcmRJZCkge1xyXG4gICAgICAgIGlmIChyZXNwb25zZS5kYXRhKSB7XHJcbiAgICAgICAgICAgIGxldCBvbGRJZCA9IHJlc3BvbnNlLmRhdGEub2xkSWQgfHwgcmVjb3JkSWQ7XHJcbiAgICAgICAgICAgICQoYHRyIyR7b2xkSWR9IGlucHV0YCkuYXR0cigncmVhZG9ubHknLCB0cnVlKTtcclxuICAgICAgICAgICAgJChgdHIjJHtvbGRJZH0gYS5kZWxldGUuYnV0dG9uYCkuYXR0cignZGF0YS12YWx1ZScsIHJlc3BvbnNlLmRhdGEubmV3SWQpO1xyXG4gICAgICAgICAgICAkKGB0ciMke29sZElkfSBkaXZgKS5yZW1vdmVDbGFzcygnY2hhbmdlZC1maWVsZCBsb2FkaW5nJykuYWRkQ2xhc3MoJ3RyYW5zcGFyZW50Jyk7XHJcbiAgICAgICAgICAgICQoYHRyIyR7b2xkSWR9IC5zcGlubmVyLmxvYWRpbmdgKS5hZGRDbGFzcygndXNlciBjaXJjbGUnKS5yZW1vdmVDbGFzcygnc3Bpbm5lciBsb2FkaW5nJyk7XHJcbiAgICAgICAgICAgIGlmIChvbGRJZCAhPT0gcmVzcG9uc2UuZGF0YS5uZXdJZCkge1xyXG4gICAgICAgICAgICAgICAgJChgdHIjJHtvbGRJZH1gKS5hdHRyKCdpZCcsIHJlc3BvbnNlLmRhdGEubmV3SWQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIERlbGV0ZSBhIHJvdyBmcm9tIHRoZSBwaG9uZWJvb2sgdGFibGUuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtqUXVlcnl9ICR0YXJnZXQgLSBUaGUgZGVsZXRlIGJ1dHRvbiBlbGVtZW50LlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIC0gVGhlIElEIG9mIHRoZSByZWNvcmQgdG8gZGVsZXRlLlxyXG4gICAgICovXHJcbiAgICBkZWxldGVSb3coJHRhcmdldCwgaWQpIHtcclxuICAgICAgICBpZiAoaWQgPT09ICduZXcnKSB7XHJcbiAgICAgICAgICAgICR0YXJnZXQuY2xvc2VzdCgndHInKS5yZW1vdmUoKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgJC5hcGkoe1xyXG4gICAgICAgICAgICB1cmw6IGAke3RoaXMuZGVsZXRlUmVjb3JkQUpBWFVybH0vJHtpZH1gLFxyXG4gICAgICAgICAgICBvbjogJ25vdycsXHJcbiAgICAgICAgICAgIG9uU3VjY2VzczogKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3VjY2Vzcykge1xyXG4gICAgICAgICAgICAgICAgICAgICR0YXJnZXQuY2xvc2VzdCgndHInKS5yZW1vdmUoKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy4kcmVjb3Jkc1RhYmxlLmZpbmQoJ3Rib2R5ID4gdHInKS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kcmVjb3Jkc1RhYmxlLmZpbmQoJ3Rib2R5JykuYXBwZW5kKCc8dHIgY2xhc3M9XCJvZGRcIj48L3RyPicpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICB9KTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDbGVhbiBudW1iZXIgYmVmb3JlIHBhc3RpbmcuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHBhc3RlZFZhbHVlIC0gVGhlIHBhc3RlZCBwaG9uZSBudW1iZXIuXHJcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgY2xlYW5lZCBudW1iZXIuXHJcbiAgICAgKi9cclxuICAgIGNiT25OdW1iZXJCZWZvcmVQYXN0ZShwYXN0ZWRWYWx1ZSkge1xyXG4gICAgICAgIHJldHVybiBwYXN0ZWRWYWx1ZS5yZXBsYWNlKC9cXEQrL2csICcnKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiByb3dzIHRoYXQgY2FuIGZpdCBvbiBhIHBhZ2UgYmFzZWQgb24gd2luZG93IGhlaWdodC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgY2FsY3VsYXRlZCBudW1iZXIgb2Ygcm93cy5cclxuICAgICAqL1xyXG4gICAgY2FsY3VsYXRlUGFnZUxlbmd0aCgpIHtcclxuICAgICAgICAvLyBDYWxjdWxhdGUgcm93IGhlaWdodFxyXG4gICAgICAgIGxldCByb3dIZWlnaHQgPSB0aGlzLiRyZWNvcmRzVGFibGUuZmluZCgndHInKS5maXJzdCgpLm91dGVySGVpZ2h0KCk7XHJcblxyXG4gICAgICAgIC8vIENhbGN1bGF0ZSB3aW5kb3cgaGVpZ2h0IGFuZCBhdmFpbGFibGUgc3BhY2UgZm9yIHRhYmxlXHJcbiAgICAgICAgY29uc3Qgd2luZG93SGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0O1xyXG4gICAgICAgIGNvbnN0IGhlYWRlckZvb3RlckhlaWdodCA9IDU1MDsgLy8gRXN0aW1hdGUgaGVpZ2h0IGZvciBoZWFkZXIsIGZvb3RlciwgYW5kIG90aGVyIGVsZW1lbnRzXHJcblxyXG4gICAgICAgIC8vIENhbGN1bGF0ZSBuZXcgcGFnZSBsZW5ndGhcclxuICAgICAgICByZXR1cm4gTWF0aC5tYXgoTWF0aC5mbG9vcigod2luZG93SGVpZ2h0IC0gaGVhZGVyRm9vdGVySGVpZ2h0KSAvIHJvd0hlaWdodCksIDUpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgdmFsdWUgb2YgYSBxdWVyeSBwYXJhbWV0ZXIgZnJvbSB0aGUgVVJMLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbSAtIFRoZSBuYW1lIG9mIHRoZSBxdWVyeSBwYXJhbWV0ZXIgdG8gcmV0cmlldmUuXHJcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfG51bGx9IFRoZSB2YWx1ZSBvZiB0aGUgcXVlcnkgcGFyYW1ldGVyLCBvciBudWxsIGlmIG5vdCBmb3VuZC5cclxuICAgICAqL1xyXG4gICAgZ2V0UXVlcnlQYXJhbShwYXJhbSkge1xyXG4gICAgICAgIGNvbnN0IHVybFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7XHJcbiAgICAgICAgcmV0dXJuIHVybFBhcmFtcy5nZXQocGFyYW0pO1xyXG4gICAgfSxcclxufTtcclxuXHJcbiQoZG9jdW1lbnQpLnJl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 \ No newline at end of file diff --git a/public/assets/js/module-phonebook-settings.js b/public/assets/js/module-phonebook-settings.js index c10a6c8..fe54b22 100644 --- a/public/assets/js/module-phonebook-settings.js +++ b/public/assets/js/module-phonebook-settings.js @@ -20,30 +20,39 @@ /* global globalRootUrl, globalTranslate, SemanticLocalization, UserMessage, InputMaskPatterns */ + var ModulePhoneBookSettings = { $disableInputMaskToggle: $('#disable-input-mask'), $deleteAllRecordsButton: $('#delete-all-records'), $deleteAllModal: $('#delete-all-modal-form'), + $saveSettingsApiButton: $('#btn-save-settings-api'), + $inputPhoneBookApiUrl: $('#phoneBookApiUrl'), + $phoneBookLifeTime: $('#phoneBookLifeTime'), deleteAllRecordsAJAXUrl: "".concat(globalRootUrl, "module-phone-book/module-phone-book/deleteAllRecords"), - disableInputMaskAJAXUrl: "".concat(globalRootUrl, "module-phone-book/module-phone-book/toggleDisableInputMask"), - + saveSettingsAJAXUrl: "".concat(globalRootUrl, "module-phone-book/module-phone-book/saveSettings"), /** * Initialize the settings module for the phonebook. * It sets up the event listeners for toggling input masks and deleting all records. */ initialize: function initialize() { // Hide the delete confirmation modal initially - ModulePhoneBookSettings.$deleteAllModal.modal('hide'); // Set up the checkbox for disabling/enabling the input mask + ModulePhoneBookSettings.$deleteAllModal.modal('hide'); + // Set up the checkbox for disabling/enabling the input mask ModulePhoneBookSettings.$disableInputMaskToggle.checkbox({ - onChange: ModulePhoneBookSettings.onChangeInputMaskToggle - }); // Attach event listener for the "Delete All Records" button + onChange: ModulePhoneBookSettings.onSaveSettingsApi + }); + // Attach event listener for the "Delete All Records" button ModulePhoneBookSettings.$deleteAllRecordsButton.on('click', function () { ModulePhoneBookSettings.deleteAllRecords(); }); - }, + // Save settings + ModulePhoneBookSettings.$saveSettingsApiButton.on('click', function () { + ModulePhoneBookSettings.onSaveSettingsApi(false); + }); + }, /** * Handle the deletion of all records. * Displays a confirmation modal, and if approved, sends a request to delete all phonebook records. @@ -56,8 +65,8 @@ var ModulePhoneBookSettings = { return true; // Allows modal to close on "Cancel" }, onApprove: function onApprove() { - ModulePhoneBookSettings.$deleteAllRecordsButton.addClass('loading'); // On approval, send a request to delete all records - + ModulePhoneBookSettings.$deleteAllRecordsButton.addClass('loading'); + // On approval, send a request to delete all records $.api({ url: ModulePhoneBookSettings.deleteAllRecordsAJAXUrl, on: 'now', @@ -65,13 +74,13 @@ var ModulePhoneBookSettings = { successTest: PbxApi.successTest, onSuccess: function onSuccess(response) { ModulePhoneBookSettings.$deleteAllRecordsButton.removeClass('loading'); - UserMessage.showInformation(globalTranslate.module_phnbk_AllRecordsDeleted); // Reload the page after successful update - + UserMessage.showInformation(globalTranslate.module_phnbk_AllRecordsDeleted); + // Reload the page after successful update ModulePhoneBookDT.dataTable.ajax.reload(); }, onFailure: function onFailure(response) { - ModulePhoneBookSettings.$deleteAllRecordsButton.removeClass('loading'); // Show error message if deletion fails - + ModulePhoneBookSettings.$deleteAllRecordsButton.removeClass('loading'); + // Show error message if deletion fails UserMessage.showMultiString(response.messages); } }); @@ -79,35 +88,45 @@ var ModulePhoneBookSettings = { } }).modal('show'); // Display the confirmation modal }, - /** * Handle the toggle of the input mask. * Sends a request to update the setting for enabling or disabling input masks. + * + * @param {boolean} isOnlyInputMask + * @returns {boolean} */ - onChangeInputMaskToggle: function onChangeInputMaskToggle() { - var currentState = ModulePhoneBookSettings.$disableInputMaskToggle.checkbox('is checked'); // Send request to toggle the input mask setting + onSaveSettingsApi: function onSaveSettingsApi() { + var isOnlyInputMask = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; + var data = {}; + if (isOnlyInputMask) { + data.disableInputMask = ModulePhoneBookSettings.$disableInputMaskToggle.checkbox('is checked'); + } else { + data.phoneBookApiUrl = ModulePhoneBookSettings.$inputPhoneBookApiUrl.val(); + data.phoneBookLifeTime = ModulePhoneBookSettings.$phoneBookLifeTime.val(); + } + // Send request to toggle the input mask setting $.api({ - url: ModulePhoneBookSettings.disableInputMaskAJAXUrl, + url: ModulePhoneBookSettings.saveSettingsAJAXUrl, on: 'now', method: 'POST', - data: { - disableInputMask: currentState - }, + data: data, successTest: PbxApi.successTest, onSuccess: function onSuccess(response) { window.location.reload(); }, onFailure: function onFailure(response) { + var _response$message; // Show error message if the update fails - UserMessage.showMultiString(response.messages); + UserMessage.showMultiString((_response$message = response === null || response === void 0 ? void 0 : response.message) !== null && _response$message !== void 0 ? _response$message : response.messages); } }); return true; } -}; // Initialize the settings module when the document is ready +}; +// Initialize the settings module when the document is ready $(document).ready(function () { ModulePhoneBookSettings.initialize(); }); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9tb2R1bGUtcGhvbmVib29rLXNldHRpbmdzLmpzIl0sIm5hbWVzIjpbIk1vZHVsZVBob25lQm9va1NldHRpbmdzIiwiJGRpc2FibGVJbnB1dE1hc2tUb2dnbGUiLCIkIiwiJGRlbGV0ZUFsbFJlY29yZHNCdXR0b24iLCIkZGVsZXRlQWxsTW9kYWwiLCJkZWxldGVBbGxSZWNvcmRzQUpBWFVybCIsImdsb2JhbFJvb3RVcmwiLCJkaXNhYmxlSW5wdXRNYXNrQUpBWFVybCIsImluaXRpYWxpemUiLCJtb2RhbCIsImNoZWNrYm94Iiwib25DaGFuZ2UiLCJvbkNoYW5nZUlucHV0TWFza1RvZ2dsZSIsIm9uIiwiZGVsZXRlQWxsUmVjb3JkcyIsImNsb3NhYmxlIiwib25EZW55Iiwib25BcHByb3ZlIiwiYWRkQ2xhc3MiLCJhcGkiLCJ1cmwiLCJtZXRob2QiLCJzdWNjZXNzVGVzdCIsIlBieEFwaSIsIm9uU3VjY2VzcyIsInJlc3BvbnNlIiwicmVtb3ZlQ2xhc3MiLCJVc2VyTWVzc2FnZSIsInNob3dJbmZvcm1hdGlvbiIsImdsb2JhbFRyYW5zbGF0ZSIsIm1vZHVsZV9waG5ia19BbGxSZWNvcmRzRGVsZXRlZCIsIk1vZHVsZVBob25lQm9va0RUIiwiZGF0YVRhYmxlIiwiYWpheCIsInJlbG9hZCIsIm9uRmFpbHVyZSIsInNob3dNdWx0aVN0cmluZyIsIm1lc3NhZ2VzIiwiY3VycmVudFN0YXRlIiwiZGF0YSIsImRpc2FibGVJbnB1dE1hc2siLCJ3aW5kb3ciLCJsb2NhdGlvbiIsImRvY3VtZW50IiwicmVhZHkiXSwibWFwcGluZ3MiOiI7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBRUEsSUFBTUEsdUJBQXVCLEdBQUc7QUFDNUJDLEVBQUFBLHVCQUF1QixFQUFFQyxDQUFDLENBQUMscUJBQUQsQ0FERTtBQUU1QkMsRUFBQUEs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VyxFQUFFQyxNQUFNLENBQUNELFdBTGxCO0FBTUZFLE1BQUFBLFNBTkUscUJBTVFDLFFBTlIsRUFNa0I7QUFDaEJnQixRQUFBQSxNQUFNLENBQUNDLFFBQVAsQ0FBZ0JSLE1BQWhCO0FBQ0gsT0FSQztBQVNGQyxNQUFBQSxTQVRFLHFCQVNRVixRQVRSLEVBU2tCO0FBQ2hCO0FBQ0FFLFFBQUFBLFdBQVcsQ0FBQ1MsZUFBWixDQUE0QlgsUUFBUSxDQUFDWSxRQUFyQztBQUNIO0FBWkMsS0FBTjtBQWNBLFdBQU8sSUFBUDtBQUNIO0FBdEYyQixDQUFoQyxDLENBeUZBOztBQUNBbkMsQ0FBQyxDQUFDeUMsUUFBRCxDQUFELENBQVlDLEtBQVosQ0FBa0IsWUFBTTtBQUNwQjVDLEVBQUFBLHVCQUF1QixDQUFDUSxVQUF4QjtBQUNILENBRkQiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogTWlrb1BCWCAtIGZyZWUgcGhvbmUgc3lzdGVtIGZvciBzbWFsbCBidXNpbmVzc1xuICogQ29weXJpZ2h0IMKpIDIwMTctMjAyNCBBbGV4ZXkgUG9ydG5vdiBhbmQgTmlrb2xheSBCZWtldG92XG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxuICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLlxuICogSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi5cbiAqL1xuXG4vKiBnbG9iYWwgZ2xvYmFsUm9vdFVybCwgZ2xvYmFsVHJhbnNsYXRlLFxuU2VtYW50aWNMb2NhbGl6YXRpb24sIFVzZXJNZXNzYWdlLCBJbnB1dE1hc2tQYXR0ZXJucyAqL1xuXG5jb25zdCBNb2R1bGVQaG9uZUJvb2tTZXR0aW5ncyA9IHtcbiAgICAkZGlzYWJsZUlucHV0TWFza1RvZ2dsZTogJCgnI2Rpc2FibGUtaW5wdXQtbWFzaycpLFxuICAgICRkZWxldGVBbGxSZWNvcmRzQnV0dG9uOiAkKCcjZGVsZXRlLWFsbC1yZWNvcmRzJyksXG4gICAgJGRlbGV0ZUFsbE1vZGFsOiAkKCcjZGVsZXRlLWFsbC1tb2RhbC1mb3JtJyksXG4gICAgZGVsZXRlQWxsUmVjb3Jkc0FKQVhVcmw6IGAke2dsb2JhbFJvb3RVcmx9bW9kdWxlLXBob25lLWJvb2svbW9kdWxlLXBob25lLWJvb2svZGVsZXRlQWxsUmVjb3Jkc2AsXG4gICAgZGlzYWJsZUlucHV0TWFza0FKQVhVcmw6IGAke2dsb2JhbFJvb3RVcmx9bW9kdWxlLXBob25lLWJvb2svbW9kdWxlLXBob25lLWJvb2svdG9nZ2xlRGlzYWJsZUlucHV0TWFza2AsXG5cbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplIHRoZSBzZXR0aW5ncyBtb2R1bGUgZm9yIHRoZSBwaG9uZWJvb2suXG4gICAgICogSXQgc2V0cyB1cCB0aGUgZXZlbnQgbGlzdGVuZXJzIGZvciB0b2dnbGluZyBpbnB1dCBtYXNrcyBhbmQgZGVsZXRpbmcgYWxsIHJlY29yZHMuXG4gICAgICovXG4gICAgaW5pdGlhbGl6ZSgpIHtcbiAgICAgICAgLy8gSGlkZSB0aGUgZGVsZXRlIGNvbmZpcm1hdGlvbiBtb2RhbCBpbml0aWFsbHlcbiAgICAgICAgTW9kdWxlUGhvbmVCb29rU2V0dGluZ3MuJGRlbGV0ZUFsbE1vZGFsLm1vZGFsKCdoaWRlJyk7XG5cbiAgICAgICAgLy8gU2V0IHVwIHRoZSBjaGVja2JveCBmb3IgZGlzYWJsaW5nL2VuYWJsaW5nIHRoZSBpbnB1dCBtYXNrXG4gICAgICAgIE1vZHVsZVBob25lQm9va1NldHRpbmdzLiRkaXNhYmxlSW5wdXRNYXNrVG9nZ2xlLmNoZWNrYm94KHtcbiAgICAgICAgICAgIG9uQ2hhbmdlOiBNb2R1bGVQaG9uZUJvb2tTZXR0aW5ncy5vbkNoYW5nZUlucHV0TWFza1RvZ2dsZVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBBdHRhY2ggZXZlbnQgbGlzdGVuZXIgZm9yIHRoZSBcIkRlbGV0ZSBBbGwgUmVjb3Jkc1wiIGJ1dHRvblxuICAgICAgICBNb2R1bGVQaG9uZUJvb2tTZXR0aW5ncy4kZGVsZXRlQWxsUmVjb3Jkc0J1dHRvbi5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBNb2R1bGVQaG9uZUJvb2tTZXR0aW5ncy5kZWxldGVBbGxSZWNvcmRzKCk7XG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdGhlIGRlbGV0aW9uIG9mIGFsbCByZWNvcmRzLlxuICAgICAqIERpc3BsYXlzIGEgY29uZmlybWF0aW9uIG1vZGFsLCBhbmQgaWYgYXBwcm92ZWQsIHNlbmRzIGEgcmVxdWVzdCB0byBkZWxldGUgYWxsIHBob25lYm9vayByZWNvcmRzLlxuICAgICAqL1xuICAgIGRlbGV0ZUFsbFJlY29yZHMoKSB7XG4gICAgICAgIE1vZHVsZVBob25lQm9va1NldHRpbmdzLiRkZWxldGVBbGxNb2RhbFxuICAgICAgICAgICAgLm1vZGFsKHtcbiAgICAgICAgICAgICAgICBjbG9zYWJsZTogZmFsc2UsIC8vIFByZXZlbnQgY2xvc2luZyB0aGUgbW9kYWwgd2l0aG91dCB1c2VyIGFjdGlvblxuICAgICAgICAgICAgICAgIG9uRGVueTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gQWxsb3dzIG1vZGFsIHRvIGNsb3NlIG9uIFwiQ2FuY2VsXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG9uQXBwcm92ZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBNb2R1bGVQaG9uZUJvb2tTZXR0aW5ncy4kZGVsZXRlQWxsUmVjb3Jkc0J1dHRvbi5hZGRDbGFzcygnbG9hZGluZycpO1xuICAgICAgICAgICAgICAgICAgICAvLyBPbiBhcHByb3ZhbCwgc2VuZCBhIHJlcXVlc3QgdG8gZGVsZXRlIGFsbCByZWNvcmRzXG4gICAgICAgICAgICAgICAgICAgICQuYXBpKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybDogTW9kdWxlUGhvbmVCb29rU2V0dGluZ3MuZGVsZXRlQWxsUmVjb3Jkc0FKQVhVcmwsXG4gICAgICAgICAgICAgICAgICAgICAgICBvbjogJ25vdycsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NUZXN0OiBQYnhBcGkuc3VjY2Vzc1Rlc3QsXG4gICAgICAgICAgICAgICAgICAgICAgICBvblN1Y2Nlc3MocmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGVQaG9uZUJvb2tTZXR0aW5ncy4kZGVsZXRlQWxsUmVjb3Jkc0J1dHRvbi5yZW1vdmVDbGFzcygnbG9hZGluZycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJNZXNzYWdlLnNob3dJbmZvcm1hdGlvbihnbG9iYWxUcmFuc2xhdGUubW9kdWxlX3BobmJrX0FsbFJlY29yZHNEZWxldGVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWxvYWQgdGhlIHBhZ2UgYWZ0ZXIgc3VjY2Vzc2Z1bCB1cGRhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGVQaG9uZUJvb2tEVC5kYXRhVGFibGUuYWpheC5yZWxvYWQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkZhaWx1cmUocmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGVQaG9uZUJvb2tTZXR0aW5ncy4kZGVsZXRlQWxsUmVjb3Jkc0J1dHRvbi5yZW1vdmVDbGFzcygnbG9hZGluZycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNob3cgZXJyb3IgbWVzc2FnZSBpZiBkZWxldGlvbiBmYWlsc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJNZXNzYWdlLnNob3dNdWx0aVN0cmluZyhyZXNwb25zZS5tZXNzYWdlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAubW9kYWwoJ3Nob3cnKTsgLy8gRGlzcGxheSB0aGUgY29uZmlybWF0aW9uIG1vZGFsXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB0aGUgdG9nZ2xlIG9mIHRoZSBpbnB1dCBtYXNrLlxuICAgICAqIFNlbmRzIGEgcmVxdWVzdCB0byB1cGRhdGUgdGhlIHNldHRpbmcgZm9yIGVuYWJsaW5nIG9yIGRpc2FibGluZyBpbnB1dCBtYXNrcy5cbiAgICAgKi9cbiAgICBvbkNoYW5nZUlucHV0TWFza1RvZ2dsZSgpIHtcbiAgICAgICAgY29uc3QgY3VycmVudFN0YXRlID0gTW9kdWxlUGhvbmVCb29rU2V0dGluZ3MuJGRpc2FibGVJbnB1dE1hc2tUb2dnbGUuY2hlY2tib3goJ2lzIGNoZWNrZWQnKTtcblxuICAgICAgICAvLyBTZW5kIHJlcXVlc3QgdG8gdG9nZ2xlIHRoZSBpbnB1dCBtYXNrIHNldHRpbmdcbiAgICAgICAgJC5hcGkoe1xuICAgICAgICAgICAgdXJsOiBNb2R1bGVQaG9uZUJvb2tTZXR0aW5ncy5kaXNhYmxlSW5wdXRNYXNrQUpBWFVybCxcbiAgICAgICAgICAgIG9uOiAnbm93JyxcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgZGF0YTogeyBkaXNhYmxlSW5wdXRNYXNrOiBjdXJyZW50U3RhdGUgfSxcbiAgICAgICAgICAgIHN1Y2Nlc3NUZXN0OiBQYnhBcGkuc3VjY2Vzc1Rlc3QsXG4gICAgICAgICAgICBvblN1Y2Nlc3MocmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb25GYWlsdXJlKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgLy8gU2hvdyBlcnJvciBtZXNzYWdlIGlmIHRoZSB1cGRhdGUgZmFpbHNcbiAgICAgICAgICAgICAgICBVc2VyTWVzc2FnZS5zaG93TXVsdGlTdHJpbmcocmVzcG9uc2UubWVzc2FnZXMpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG59O1xuXG4vLyBJbml0aWFsaXplIHRoZSBzZXR0aW5ncyBtb2R1bGUgd2hlbiB0aGUgZG9jdW1lbnQgaXMgcmVhZHlcbiQoZG9jdW1lbnQpLnJlYWR5KCgpID0+IHtcbiAgICBNb2R1bGVQaG9uZUJvb2tTZXR0aW5ncy5pbml0aWFsaXplKCk7XG59KTsiXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNb2R1bGVQaG9uZUJvb2tTZXR0aW5ncyIsIiRkaXNhYmxlSW5wdXRNYXNrVG9nZ2xlIiwiJCIsIiRkZWxldGVBbGxSZWNvcmRzQnV0dG9uIiwiJGRlbGV0ZUFsbE1vZGFsIiwiJHNhdmVTZXR0aW5nc0FwaUJ1dHRvbiIsIiRpbnB1dFBob25lQm9va0FwaVVybCIsIiRwaG9uZUJvb2tMaWZlVGltZSIsImRlbGV0ZUFsbFJlY29yZHNBSkFYVXJsIiwiY29uY2F0IiwiZ2xvYmFsUm9vdFVybCIsInNhdmVTZXR0aW5nc0FKQVhVcmwiLCJpbml0aWFsaXplIiwibW9kYWwiLCJjaGVja2JveCIsIm9uQ2hhbmdlIiwib25TYXZlU2V0dGluZ3NBcGkiLCJvbiIsImRlbGV0ZUFsbFJlY29yZHMiLCJjbG9zYWJsZSIsIm9uRGVueSIsIm9uQXBwcm92ZSIsImFkZENsYXNzIiwiYXBpIiwidXJsIiwibWV0aG9kIiwic3VjY2Vzc1Rlc3QiLCJQYnhBcGkiLCJvblN1Y2Nlc3MiLCJyZXNwb25zZSIsInJlbW92ZUNsYXNzIiwiVXNlck1lc3NhZ2UiLCJzaG93SW5mb3JtYXRpb24iLCJnbG9iYWxUcmFuc2xhdGUiLCJtb2R1bGVfcGhuYmtfQWxsUmVjb3Jkc0RlbGV0ZWQiLCJNb2R1bGVQaG9uZUJvb2tEVCIsImRhdGFUYWJsZSIsImFqYXgiLCJyZWxvYWQiLCJvbkZhaWx1cmUiLCJzaG93TXVsdGlTdHJpbmciLCJtZXNzYWdlcyIsImlzT25seUlucHV0TWFzayIsImFyZ3VtZW50cyIsImxlbmd0aCIsInVuZGVmaW5lZCIsImRhdGEiLCJkaXNhYmxlSW5wdXRNYXNrIiwicGhvbmVCb29rQXBpVXJsIiwidmFsIiwicGhvbmVCb29rTGlmZVRpbWUiLCJ3aW5kb3ciLCJsb2NhdGlvbiIsIl9yZXNwb25zZSRtZXNzYWdlIiwibWVzc2FnZSIsImRvY3VtZW50IiwicmVhZHkiXSwic291cmNlcyI6WyJzcmMvbW9kdWxlLXBob25lYm9vay1zZXR0aW5ncy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBNaWtvUEJYIC0gZnJlZSBwaG9uZSBzeXN0ZW0gZm9yIHNtYWxsIGJ1c2luZXNzXHJcbiAqIENvcHlyaWdodCDCqSAyMDE3LTIwMjQgQWxleGV5IFBvcnRub3YgYW5kIE5pa29sYXkgQmVrZXRvdlxyXG4gKlxyXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxyXG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxyXG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxyXG4gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxyXG4gKlxyXG4gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcclxuICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2ZcclxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxyXG4gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxyXG4gKlxyXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS5cclxuICogSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi5cclxuICovXHJcblxyXG4vKiBnbG9iYWwgZ2xvYmFsUm9vdFVybCwgZ2xvYmFsVHJhbnNsYXRlLFxyXG5TZW1hbnRpY0xvY2FsaXphdGlvbiwgVXNlck1lc3NhZ2UsIElucHV0TWFza1BhdHRlcm5zICovXHJcblxyXG5jb25zdCBNb2R1bGVQaG9uZUJvb2tTZXR0aW5ncyA9IHtcclxuICAgICRkaXNhYmxlSW5wdXRNYXNrVG9nZ2xlOiAkKCcjZGlzYWJsZS1pbnB1dC1tYXNrJyksXHJcbiAgICAkZGVsZXRlQWxsUmVjb3Jkc0J1dHRvbjogJCgnI2RlbGV0ZS1hbGwtcmVjb3JkcycpLFxyXG4gICAgJGRlbGV0ZUFsbE1vZGFsOiAkKCcjZGVsZXRlLWFsbC1tb2RhbC1mb3JtJyksXHJcbiAgICAkc2F2ZVNldHRpbmdzQXBpQnV0dG9uOiAkKCcjYnRuLXNhdmUtc2V0dGluZ3MtYXBpJyksXHJcbiAgICAkaW5wdXRQaG9uZUJvb2tBcGlVcmw6ICQoJyNwaG9uZUJvb2tBcGlVcmwnKSxcclxuICAgICRwaG9uZUJvb2tMaWZlVGltZTogJCgnI3Bob25lQm9va0xpZmVUaW1lJyksXHJcbiAgICBkZWxldGVBbGxSZWNvcmRzQUpBWFVybDogYCR7Z2xvYmFsUm9vdFVybH1tb2R1bGUtcGhvbmUtYm9vay9tb2R1bGUtcGhvbmUtYm9vay9kZWxldGVBbGxSZWNvcmRzYCxcclxuICAgIHNhdmVTZXR0aW5nc0FKQVhVcmw6IGAke2dsb2JhbFJvb3RVcmx9bW9kdWxlLXBob25lLWJvb2svbW9kdWxlLXBob25lLWJvb2svc2F2ZVNldHRpbmdzYCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEluaXRpYWxpemUgdGhlIHNldHRpbmdzIG1vZHVsZSBmb3IgdGhlIHBob25lYm9vay5cclxuICAgICAqIEl0IHNldHMgdXAgdGhlIGV2ZW50IGxpc3RlbmVycyBmb3IgdG9nZ2xpbmcgaW5wdXQgbWFza3MgYW5kIGRlbGV0aW5nIGFsbCByZWNvcmRzLlxyXG4gICAgICovXHJcbiAgICBpbml0aWFsaXplKCkge1xyXG4gICAgICAgIC8vIEhpZGUgdGhlIGRlbGV0ZSBjb25maXJtYXRpb24gbW9kYWwgaW5pdGlhbGx5XHJcbiAgICAgICAgTW9kdWxlUGhvbmVCb29rU2V0dGluZ3MuJGRlbGV0ZUFsbE1vZGFsLm1vZGFsKCdoaWRlJyk7XHJcblxyXG4gICAgICAgIC8vIFNldCB1cCB0aGUgY2hlY2tib3ggZm9yIGRpc2FibGluZy9lbmFibGluZyB0aGUgaW5wdXQgbWFza1xyXG4gICAgICAgIE1vZHVsZVBob25lQm9va1NldHRpbmdzLiRkaXNhYmxlSW5wdXRNYXNrVG9nZ2xlLmNoZWNrYm94KHtcclxuICAgICAgICAgICAgb25DaGFuZ2U6IE1vZHVsZVBob25lQm9va1NldHRpbmdzLm9uU2F2ZVNldHRpbmdzQXBpXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIEF0dGFjaCBldmVudCBsaXN0ZW5lciBmb3IgdGhlIFwiRGVsZXRlIEFsbCBSZWNvcmRzXCIgYnV0dG9uXHJcbiAgICAgICAgTW9kdWxlUGhvbmVCb29rU2V0dGluZ3MuJGRlbGV0ZUFsbFJlY29yZHNCdXR0b24ub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBNb2R1bGVQaG9uZUJvb2tTZXR0aW5ncy5kZWxldGVBbGxSZWNvcmRzKCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIFNhdmUgc2V0dGluZ3NcclxuICAgICAgICBNb2R1bGVQaG9uZUJvb2tTZXR0aW5ncy4kc2F2ZVNldHRpbmdzQXBpQnV0dG9uLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgTW9kdWxlUGhvbmVCb29rU2V0dGluZ3Mub25TYXZlU2V0dGluZ3NBcGkoZmFsc2UpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEhhbmRsZSB0aGUgZGVsZXRpb24gb2YgYWxsIHJlY29yZHMuXHJcbiAgICAgKiBEaXNwbGF5cyBhIGNvbmZpcm1hdGlvbiBtb2RhbCwgYW5kIGlmIGFwcHJvdmVkLCBzZW5kcyBhIHJlcXVlc3QgdG8gZGVsZXRlIGFsbCBwaG9uZWJvb2sgcmVjb3Jkcy5cclxuICAgICAqL1xyXG4gICAgZGVsZXRlQWxsUmVjb3JkcygpIHtcclxuICAgICAgICBNb2R1bGVQaG9uZUJvb2tTZXR0aW5ncy4kZGVsZXRlQWxsTW9kYWxcclxuICAgICAgICAgICAgLm1vZGFsKHtcclxuICAgICAgICAgICAgICAgIGNsb3NhYmxlOiBmYWxzZSwgLy8gUHJldmVudCBjbG9zaW5nIHRoZSBtb2RhbCB3aXRob3V0IHVzZXIgYWN0aW9uXHJcbiAgICAgICAgICAgICAgICBvbkRlbnk6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gQWxsb3dzIG1vZGFsIHRvIGNsb3NlIG9uIFwiQ2FuY2VsXCJcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBvbkFwcHJvdmU6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBNb2R1bGVQaG9uZUJvb2tTZXR0aW5ncy4kZGVsZXRlQWxsUmVjb3Jkc0J1dHRvbi5hZGRDbGFzcygnbG9hZGluZycpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIE9uIGFwcHJvdmFsLCBzZW5kIGEgcmVxdWVzdCB0byBkZWxldGUgYWxsIHJlY29yZHNcclxuICAgICAgICAgICAgICAgICAgICAkLmFwaSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybDogTW9kdWxlUGhvbmVCb29rU2V0dGluZ3MuZGVsZXRlQWxsUmVjb3Jkc0FKQVhVcmwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uOiAnbm93JyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NUZXN0OiBQYnhBcGkuc3VjY2Vzc1Rlc3QsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uU3VjY2VzcyhyZXNwb25zZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlUGhvbmVCb29rU2V0dGluZ3MuJGRlbGV0ZUFsbFJlY29yZHNCdXR0b24ucmVtb3ZlQ2xhc3MoJ2xvYWRpbmcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJNZXNzYWdlLnNob3dJbmZvcm1hdGlvbihnbG9iYWxUcmFuc2xhdGUubW9kdWxlX3BobmJrX0FsbFJlY29yZHNEZWxldGVkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlbG9hZCB0aGUgcGFnZSBhZnRlciBzdWNjZXNzZnVsIHVwZGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlUGhvbmVCb29rRFQuZGF0YVRhYmxlLmFqYXgucmVsb2FkKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uRmFpbHVyZShyZXNwb25zZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlUGhvbmVCb29rU2V0dGluZ3MuJGRlbGV0ZUFsbFJlY29yZHNCdXR0b24ucmVtb3ZlQ2xhc3MoJ2xvYWRpbmcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNob3cgZXJyb3IgbWVzc2FnZSBpZiBkZWxldGlvbiBmYWlsc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlck1lc3NhZ2Uuc2hvd011bHRpU3RyaW5nKHJlc3BvbnNlLm1lc3NhZ2VzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC5tb2RhbCgnc2hvdycpOyAvLyBEaXNwbGF5IHRoZSBjb25maXJtYXRpb24gbW9kYWxcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIYW5kbGUgdGhlIHRvZ2dsZSBvZiB0aGUgaW5wdXQgbWFzay5cclxuICAgICAqIFNlbmRzIGEgcmVxdWVzdCB0byB1cGRhdGUgdGhlIHNldHRpbmcgZm9yIGVuYWJsaW5nIG9yIGRpc2FibGluZyBpbnB1dCBtYXNrcy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzT25seUlucHV0TWFza1xyXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAgICAgKi9cclxuICAgIG9uU2F2ZVNldHRpbmdzQXBpKGlzT25seUlucHV0TWFzayA9IHRydWUpIHtcclxuICAgICAgICBjb25zdCBkYXRhID0ge31cclxuICAgICAgICBpZihpc09ubHlJbnB1dE1hc2spe1xyXG4gICAgICAgICAgICBkYXRhLmRpc2FibGVJbnB1dE1hc2sgPSBNb2R1bGVQaG9uZUJvb2tTZXR0aW5ncy4kZGlzYWJsZUlucHV0TWFza1RvZ2dsZS5jaGVja2JveCgnaXMgY2hlY2tlZCcpO1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICBkYXRhLnBob25lQm9va0FwaVVybCA9IE1vZHVsZVBob25lQm9va1NldHRpbmdzLiRpbnB1dFBob25lQm9va0FwaVVybC52YWwoKTtcclxuICAgICAgICAgICAgZGF0YS5waG9uZUJvb2tMaWZlVGltZSA9IE1vZHVsZVBob25lQm9va1NldHRpbmdzLiRwaG9uZUJvb2tMaWZlVGltZS52YWwoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFNlbmQgcmVxdWVzdCB0byB0b2dnbGUgdGhlIGlucHV0IG1hc2sgc2V0dGluZ1xyXG4gICAgICAgICQuYXBpKHtcclxuICAgICAgICAgICAgdXJsOiBNb2R1bGVQaG9uZUJvb2tTZXR0aW5ncy5zYXZlU2V0dGluZ3NBSkFYVXJsLFxyXG4gICAgICAgICAgICBvbjogJ25vdycsXHJcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgICAgICAgICBkYXRhOiBkYXRhLFxyXG4gICAgICAgICAgICBzdWNjZXNzVGVzdDogUGJ4QXBpLnN1Y2Nlc3NUZXN0LFxyXG4gICAgICAgICAgICBvblN1Y2Nlc3MocmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgb25GYWlsdXJlKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBTaG93IGVycm9yIG1lc3NhZ2UgaWYgdGhlIHVwZGF0ZSBmYWlsc1xyXG4gICAgICAgICAgICAgICAgVXNlck1lc3NhZ2Uuc2hvd011bHRpU3RyaW5nKHJlc3BvbnNlPy5tZXNzYWdlID8/IHJlc3BvbnNlLm1lc3NhZ2VzKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH0sXHJcbn07XHJcblxyXG4vLyBJbml0aWFsaXplIHRoZSBzZXR0aW5ncyBtb2R1bGUgd2hlbiB0aGUgZG9jdW1lbnQgaXMgcmVhZHlcclxuJChkb2N1bWVudCkucmVhZHkoKCkgPT4ge1xyXG4gICAgTW9kdWxlUGhvbmVCb29rU2V0dGluZ3MuaW5pdGlhbGl6ZSgpO1xyXG59KTtcclxuIl0sIm1hcHBpbmdzIjoiOztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxJQUFNQSx1QkFBdUIsR0FBRztFQUM1QkMsdUJBQXVCLEVBQUVDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQztFQUNqREMsdUJBQXVCLEVBQUVELENBQUMsQ0FBQyxxQkFBcUIsQ0FBQztFQUNqREUsZUFBZSxFQUFFRixDQUFDLENBQUMsd0JBQXdCLENBQUM7RUFDNUNHLHNCQUFzQixFQUFFSCxDQUFDLENBQUMsd0JBQXdCLENBQUM7RUFDbkRJLHFCQUFxQixFQUFFSixDQUFDLENBQUMsa0JBQWtCLENBQUM7RUFDNUNLLGtCQUFrQixFQUFFTCxDQUFDLENBQUMsb0JBQW9CLENBQUM7RUFDM0NNLHVCQUF1QixLQUFBQyxNQUFBLENBQUtDLGFBQWEseURBQXNE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 \ No newline at end of file diff --git a/public/assets/js/src/module-phonebook-datatable.js b/public/assets/js/src/module-phonebook-datatable.js index 1ac2c7a..3a96aad 100644 --- a/public/assets/js/src/module-phonebook-datatable.js +++ b/public/assets/js/src/module-phonebook-datatable.js @@ -30,7 +30,7 @@ const ModulePhoneBookDT = { * The page length selector. * @type {jQuery} */ - $pageLengthSelector:$('#page-length-select'), + $pageLengthSelector: $('#page-length-select'), /** * The page length selector. @@ -147,7 +147,7 @@ const ModulePhoneBookDT = { // Handle page length selection this.$pageLengthSelector.dropdown({ onChange(pageLength) { - if (pageLength==='auto'){ + if (pageLength === 'auto') { pageLength = this.calculatePageLength(); localStorage.removeItem('phonebookTablePageLength'); } else { @@ -158,7 +158,7 @@ const ModulePhoneBookDT = { }); // Prevent event bubbling on dropdown click - this.$pageLengthSelector.on('click', function(event) { + this.$pageLengthSelector.on('click', function (event) { event.stopPropagation(); // Prevent the event from bubbling }); }, @@ -229,7 +229,7 @@ const ModulePhoneBookDT = { const pageLength = savedPageLength ? savedPageLength : this.calculatePageLength(); this.$recordsTable.dataTable({ - search: { search: this.$globalSearch.val() }, + search: {search: this.$globalSearch.val()}, serverSide: true, processing: true, ajax: { @@ -238,10 +238,10 @@ const ModulePhoneBookDT = { dataSrc: 'data', }, columns: [ - { data: null }, - { data: 'call_id' }, - { data: 'number' }, - { data: null }, + {data: null}, + {data: 'call_id'}, + {data: 'number'}, + {data: null}, ], paging: true, pageLength: pageLength, @@ -310,18 +310,15 @@ const ModulePhoneBookDT = { * @param {Object} data - The data object for the row. */ buildRowTemplate(row, data) { - const nameTemplate = ` -
+ const nameTemplate = `
`; - const numberTemplate = ` -
+ const numberTemplate = `
`; - const deleteButtonTemplate = ` -
+ const deleteButtonTemplate = ``; @@ -363,7 +360,7 @@ const ModulePhoneBookDT = { $el.inputmasks({ inputmask: { definitions: { - '#': { validator: '[0-9]', cardinality: 1 }, + '#': {validator: '[0-9]', cardinality: 1}, }, showMaskOnHover: false, onBeforePaste: this.cbOnNumberBeforePaste, @@ -386,14 +383,10 @@ const ModulePhoneBookDT = { if (!callerId || !numberInputVal) return; - let number = numberInputVal.replace(/\D+/g, ''); - number = `1${number.substr(number.length - 9)}`; - const data = { call_id: callerId, number_rep: numberInputVal, - number, - id: recordId, + id: recordId }; this.displaySavingIcon(recordId); @@ -433,6 +426,7 @@ const ModulePhoneBookDT = { if (response.data) { let oldId = response.data.oldId || recordId; $(`tr#${oldId} input`).attr('readonly', true); + $(`tr#${oldId} a.delete.button`).attr('data-value', response.data.newId); $(`tr#${oldId} div`).removeClass('changed-field loading').addClass('transparent'); $(`tr#${oldId} .spinner.loading`).addClass('user circle').removeClass('spinner loading'); if (oldId !== response.data.newId) { @@ -508,4 +502,4 @@ const ModulePhoneBookDT = { $(document).ready(() => { ModulePhoneBookDT.initialize(); -}); \ No newline at end of file +}); diff --git a/public/assets/js/src/module-phonebook-settings.js b/public/assets/js/src/module-phonebook-settings.js index 3d9109d..de74db8 100644 --- a/public/assets/js/src/module-phonebook-settings.js +++ b/public/assets/js/src/module-phonebook-settings.js @@ -23,8 +23,11 @@ const ModulePhoneBookSettings = { $disableInputMaskToggle: $('#disable-input-mask'), $deleteAllRecordsButton: $('#delete-all-records'), $deleteAllModal: $('#delete-all-modal-form'), + $saveSettingsApiButton: $('#btn-save-settings-api'), + $inputPhoneBookApiUrl: $('#phoneBookApiUrl'), + $phoneBookLifeTime: $('#phoneBookLifeTime'), deleteAllRecordsAJAXUrl: `${globalRootUrl}module-phone-book/module-phone-book/deleteAllRecords`, - disableInputMaskAJAXUrl: `${globalRootUrl}module-phone-book/module-phone-book/toggleDisableInputMask`, + saveSettingsAJAXUrl: `${globalRootUrl}module-phone-book/module-phone-book/saveSettings`, /** * Initialize the settings module for the phonebook. @@ -36,13 +39,18 @@ const ModulePhoneBookSettings = { // Set up the checkbox for disabling/enabling the input mask ModulePhoneBookSettings.$disableInputMaskToggle.checkbox({ - onChange: ModulePhoneBookSettings.onChangeInputMaskToggle + onChange: ModulePhoneBookSettings.onSaveSettingsApi }); // Attach event listener for the "Delete All Records" button ModulePhoneBookSettings.$deleteAllRecordsButton.on('click', function () { ModulePhoneBookSettings.deleteAllRecords(); }); + + // Save settings + ModulePhoneBookSettings.$saveSettingsApiButton.on('click', function () { + ModulePhoneBookSettings.onSaveSettingsApi(false); + }); }, /** @@ -85,23 +93,32 @@ const ModulePhoneBookSettings = { /** * Handle the toggle of the input mask. * Sends a request to update the setting for enabling or disabling input masks. + * + * @param {boolean} isOnlyInputMask + * @returns {boolean} */ - onChangeInputMaskToggle() { - const currentState = ModulePhoneBookSettings.$disableInputMaskToggle.checkbox('is checked'); + onSaveSettingsApi(isOnlyInputMask = true) { + const data = {} + if(isOnlyInputMask){ + data.disableInputMask = ModulePhoneBookSettings.$disableInputMaskToggle.checkbox('is checked'); + }else{ + data.phoneBookApiUrl = ModulePhoneBookSettings.$inputPhoneBookApiUrl.val(); + data.phoneBookLifeTime = ModulePhoneBookSettings.$phoneBookLifeTime.val(); + } // Send request to toggle the input mask setting $.api({ - url: ModulePhoneBookSettings.disableInputMaskAJAXUrl, + url: ModulePhoneBookSettings.saveSettingsAJAXUrl, on: 'now', method: 'POST', - data: { disableInputMask: currentState }, + data: data, successTest: PbxApi.successTest, onSuccess(response) { window.location.reload(); }, onFailure(response) { // Show error message if the update fails - UserMessage.showMultiString(response.messages); + UserMessage.showMultiString(response?.message ?? response.messages); }, }); return true; @@ -111,4 +128,4 @@ const ModulePhoneBookSettings = { // Initialize the settings module when the document is ready $(document).ready(() => { ModulePhoneBookSettings.initialize(); -}); \ No newline at end of file +});