From dfaac9d34cb60e05153b10a3779d44e44754105d Mon Sep 17 00:00:00 2001 From: Passman Bot Date: Fri, 6 Jan 2017 19:42:58 +0100 Subject: [PATCH] Passman 2.0.0-RC3 Merge remote-tracking branch 'EdOverflow/hash_equals' Signed-off-by: Passman Bot --- CHANGELOG.md | 26 ++- CONTRIBUTING.md | 2 + README.md | 8 +- appinfo/app.php | 2 + appinfo/info.xml | 5 +- appinfo/routes.php | 6 +- controller/credentialcontroller.php | 78 ++++---- controller/filecontroller.php | 4 +- controller/internalcontroller.php | 69 +++++-- controller/settingscontroller.php | 96 ++++++++++ controller/sharecontroller.php | 78 ++++---- controller/translationcontroller.php | 16 +- controller/vaultcontroller.php | 46 +++-- css/passman.min.css | 2 +- img/app.svg | 8 +- js/passman.min.js | 14 +- l10n/de.js | 17 +- l10n/de.json | 17 +- l10n/de_DE.js | 17 +- l10n/de_DE.json | 17 +- l10n/es.js | 1 - l10n/es.json | 1 - l10n/fr.js | 37 +++- l10n/fr.json | 37 +++- l10n/it.js | 27 ++- l10n/it.json | 27 ++- l10n/nl.js | 17 +- l10n/nl.json | 17 +- l10n/pt_BR.js | 17 +- l10n/pt_BR.json | 17 +- l10n/ru.js | 276 +++++++++++++++++++++++++++ l10n/ru.json | 274 ++++++++++++++++++++++++++ lib/AppInfo/Application.php | 41 ++-- lib/Db/CredentialMapper.php | 4 +- lib/Db/SharingACLMapper.php | 10 +- lib/Service/CredentialService.php | 3 +- lib/Service/CronService.php | 3 - lib/Service/SettingsService.php | 118 ++++++++++++ middleware/sharemiddleware.php | 45 +++++ templates/admin.settings.php | 4 + templates/part.admin.php | 103 ++++++++++ 41 files changed, 1418 insertions(+), 189 deletions(-) create mode 100644 CONTRIBUTING.md create mode 100644 controller/settingscontroller.php create mode 100644 l10n/ru.js create mode 100644 l10n/ru.json create mode 100644 lib/Service/SettingsService.php create mode 100644 middleware/sharemiddleware.php create mode 100644 templates/admin.settings.php create mode 100644 templates/part.admin.php diff --git a/CHANGELOG.md b/CHANGELOG.md index 1ba9606c..bcc05c71 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,20 @@ -owncloud-passman (0.0.1) -* **Security**: Security description here -* **Backwards incompatible change**: Changes in the API -* **New dependency**: New dependencies such as a new ownCloud or PHP version -* **Bugfix**: Bugfix description -* **Enhancement**: New feature description \ No newline at end of file +## [Unreleased] +### Updated +- Updated to passman 2.0.0 + +## 2.0.0 – 2016-12-31 +### Added +- Password sharing +- Vaults +- Change vault passwords +- Unit tests + +### Changed +- Passman API overhaul +- Rewrite of code base +- New passman repo at https://github.com/nextcloud/passman +### Fixed +- A lot of small bug fixes + +### Removed +- Old passman API diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..1e75baf7 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,2 @@ +If you want to contribute make sure the commits are `verified`. +You can read how to GPG sign you commits [here](https://help.github.com/articles/signing-commits-using-gpg/). \ No newline at end of file diff --git a/README.md b/README.md index 606944bd..c4bc83aa 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ Features: - Clipperz.is -For an demo of this app visit [https://demo.passman.cc](https://demo.passman.cc) +For a demo of this app visit [https://demo.passman.cc](https://demo.passman.cc) ## Tested on - NextCloud 10 / 11 @@ -71,9 +71,9 @@ Example: ## Development Passman uses a single `.js` file for the templates. This gives the benefit that we don't need to request every template with XHR. For CSS we use SASS so you need ruby and sass installed. -`templates.js` and the CSS are build width `grunt`. +`templates.js` and the CSS are built with `grunt`. To watch for changes use `grunt watch` -To run the unit tests install phpunit globally, and stup the envioronment variables on the `launch_phpunit.sh` script then just run that script any argumetns passed to this script will be forwarded to phpunit. +To run the unit tests install phpunit globally, and setup the environment variables on the `launch_phpunit.sh` script then just run that script, any arguments passed to this script will be forwarded to phpunit. ## Main developers - Brantje @@ -86,4 +86,4 @@ Add yours when creating a pull request! ## FAQ **Are you adding something to check if malicious code is executing on the browser?** -No, because malitous code could edit the functions that check for malicious code. \ No newline at end of file +No, because malicious code could edit the functions that check for malicious code. \ No newline at end of file diff --git a/appinfo/app.php b/appinfo/app.php index 6e415c3b..1403c4ae 100644 --- a/appinfo/app.php +++ b/appinfo/app.php @@ -14,6 +14,7 @@ namespace OCA\Passman\AppInfo; use OCP\Util; use OCP\BackgroundJob; +use OCP\App; use OCA\Passman\Notifier; use OCA\Passman\Activity; require_once __DIR__ . '/autoload.php'; @@ -49,3 +50,4 @@ $manager->registerExtension(function() { * The string has to match the app's folder name */ Util::addTranslations('passman'); +\OCP\App::registerAdmin('passman', 'templates/admin.settings'); \ No newline at end of file diff --git a/appinfo/info.xml b/appinfo/info.xml index 1263836d..f700dc9f 100644 --- a/appinfo/info.xml +++ b/appinfo/info.xml @@ -17,7 +17,7 @@ For an demo of this app visit [https://demo.passman.cc](https://demo.passman.cc) ]]> AGPL - 2.0.0-RC2 + 2.0.0-RC3 Sander Brand Marcos Zuriaga Passman @@ -41,6 +41,9 @@ For an demo of this app visit [https://demo.passman.cc](https://demo.passman.cc) mysql + + OCA\Passman\Controller\SettingsController + OCA\Passman\BackgroundJob\ExpireCredentials diff --git a/appinfo/routes.php b/appinfo/routes.php index 3af8fdf2..5413b79f 100644 --- a/appinfo/routes.php +++ b/appinfo/routes.php @@ -67,6 +67,11 @@ return [ ['name' => 'share#updateSharedCredentialACL', 'url' => '/api/v2/sharing/credential/{item_guid}/acl', 'verb' => 'PATCH'], ['name' => 'internal#getAppVersion', 'url' => '/api/v2/version', 'verb' => 'GET'], + //Settings + ['name' => 'settings#getSettings', 'url' => '/api/v2/settings', 'verb' => 'GET'], + ['name' => 'settings#saveUserSetting', 'url' => '/api/v2/settings/{key}/{value}', 'verb' => 'POST'], + ['name' => 'settings#saveAdminSetting', 'url' => '/api/v2/settings/{key}/{value}/admin1/admin2', 'verb' => 'POST'], + //Translations ['name' => 'translation#getLanguageStrings', 'url' => '/api/v2/language', 'verb' => 'GET'], @@ -76,6 +81,5 @@ return [ ['name' => 'internal#read', 'url' => '/api/internal/notifications/read/{credential_id}', 'verb' => 'DELETE'], ['name' => 'internal#getAppVersion', 'url' => '/api/internal/version', 'verb' => 'GET'], ['name' => 'internal#generatePerson', 'url' => '/api/internal/generate_person', 'verb' => 'GET'], - ] ]; \ No newline at end of file diff --git a/controller/credentialcontroller.php b/controller/credentialcontroller.php index 45a6499a..3c6dd6b5 100644 --- a/controller/credentialcontroller.php +++ b/controller/credentialcontroller.php @@ -11,10 +11,9 @@ namespace OCA\Passman\Controller; -use OCA\Files_External\NotFoundException; use OCA\Passman\Db\SharingACL; +use OCA\Passman\Service\SettingsService; use OCA\Passman\Utility\NotFoundJSONResponse; -use OCP\AppFramework\Db\DoesNotExistException; use OCP\AppFramework\Http; use OCP\AppFramework\Http\DataResponse; use OCP\IRequest; @@ -25,7 +24,7 @@ use OCA\Passman\Activity; use OCA\Passman\Service\ActivityService; use OCA\Passman\Service\CredentialRevisionService; use OCA\Passman\Service\ShareService; -use OCP\IUser; + class CredentialController extends ApiController { private $userId; @@ -33,6 +32,7 @@ class CredentialController extends ApiController { private $activityService; private $credentialRevisionService; private $sharingService; + private $settings; public function __construct($AppName, IRequest $request, @@ -40,7 +40,8 @@ class CredentialController extends ApiController { CredentialService $credentialService, ActivityService $activityService, CredentialRevisionService $credentialRevisionService, - ShareService $sharingService + ShareService $sharingService, + SettingsService $settings ) { parent::__construct($AppName, $request); $this->userId = $userId; @@ -48,8 +49,10 @@ class CredentialController extends ApiController { $this->activityService = $activityService; $this->credentialRevisionService = $credentialRevisionService; $this->sharingService = $sharingService; + $this->settings = $settings; } + /** * @NoAdminRequired * @NoCSRFRequired @@ -85,7 +88,7 @@ class CredentialController extends ApiController { ); $credential = $this->credentialService->createCredential($credential); $link = ''; // @TODO create direct link to credential - if(!$credential->getHidden()) { + if (!$credential->getHidden()) { $this->activityService->add( Activity::SUBJECT_ITEM_CREATED_SELF, array($label, $this->userId), '', array(), @@ -139,14 +142,18 @@ class CredentialController extends ApiController { ); - if ($storedCredential->getUserId() !== $this->userId) { + if (!hash_equals($storedCredential->getUserId(), $this->userId)) { $acl = $this->sharingService->getCredentialAclForUser($this->userId, $storedCredential->getGuid()); if ($acl->hasPermission(SharingACL::WRITE)) { $credential['shared_key'] = $storedCredential->getSharedKey(); } else { return new DataResponse(['msg' => 'Not authorized'], Http::STATUS_UNAUTHORIZED); } + if ($this->settings->isEnabled('user_sharing_enabled')) { + return new DataResponse(['msg' => 'Not authorized'], Http::STATUS_UNAUTHORIZED); + } } + $link = ''; // @TODO create direct link to credential if ($revision_created) { $activity = 'item_apply_revision'; @@ -154,13 +161,13 @@ class CredentialController extends ApiController { $activity . '_self', array($label, $this->userId, $revision_created), '', array(), $link, $this->userId, Activity::TYPE_ITEM_ACTION); - } else if (($storedCredential->getDeleteTime() === 0) && (int) $delete_time > 0) { + } else if (($storedCredential->getDeleteTime() === 0) && (int)$delete_time > 0) { $activity = 'item_deleted'; $this->activityService->add( $activity . '_self', array($label, $this->userId), '', array(), $link, $this->userId, Activity::TYPE_ITEM_ACTION); - } else if (($storedCredential->getDeleteTime() > 0) && (int) $delete_time === 0) { + } else if (($storedCredential->getDeleteTime() > 0) && (int)$delete_time === 0) { $activity = 'item_recovered'; $this->activityService->add( $activity . '_self', array($label, $this->userId), @@ -183,7 +190,7 @@ class CredentialController extends ApiController { try { $acl_list = $this->sharingService->getCredentialAclList($storedCredential->getGuid()); - } catch (DoesNotExistException $exception) { + } catch (\Exception $exception) { // Just check if we have an acl list } if (!empty($acl_list)) { @@ -204,7 +211,7 @@ class CredentialController extends ApiController { foreach ($acl_list as $sharingACL) { $target_user = $sharingACL->getUserId(); - if($target_user === $this->userId){ + if ($target_user === $this->userId) { continue; } $this->activityService->add( @@ -212,22 +219,22 @@ class CredentialController extends ApiController { '', array(), $link, $target_user, Activity::TYPE_ITEM_ACTION); } - if ($this->userId !== $storedCredential->getUserId()) { + if (!hash_equals($this->userId, $storedCredential->getUserId())) { $this->activityService->add( $activity, $params, '', array(), $link, $storedCredential->getUserId(), Activity::TYPE_ITEM_ACTION); } } - if($set_share_key === true){ + if ($set_share_key === true) { $storedCredential->setSharedKey($shared_key); $credential['shared_key'] = $shared_key; } - if($unshare_action === true){ + if ($unshare_action === true) { $storedCredential->setSharedKey(''); $credential['shared_key'] = ''; } - if(!$skip_revision) { + if (!$skip_revision) { $this->credentialRevisionService->createRevision($storedCredential, $storedCredential->getUserId(), $credential_id, $this->userId); } $credential = $this->credentialService->updateCredential($credential); @@ -259,26 +266,23 @@ class CredentialController extends ApiController { * @NoCSRFRequired */ public function getRevision($credential_guid) { - try { - $credential = $this->credentialService->getCredentialByGUID($credential_guid); - } - catch (DoesNotExistException $ex){ - return new NotFoundJSONResponse(); - } + try { + $credential = $this->credentialService->getCredentialByGUID($credential_guid); + } catch (\Exception $ex) { + return new NotFoundJSONResponse(); + } - // If the request was made by the owner of the credential - if ($this->userId === $credential->getUserId()) { - $result = $this->credentialRevisionService->getRevisions($credential->getId(), $this->userId); - } - else { - $acl = $this->sharingService->getACL($this->userId, $credential_guid); - if ($acl->hasPermission(SharingACL::HISTORY)){ - $result = $this->credentialRevisionService->getRevisions($credential->getId()); - } - else { - return new NotFoundJSONResponse(); - } - } + // If the request was made by the owner of the credential + if ($this->userId === $credential->getUserId()) { + $result = $this->credentialRevisionService->getRevisions($credential->getId(), $this->userId); + } else { + $acl = $this->sharingService->getACL($this->userId, $credential_guid); + if ($acl->hasPermission(SharingACL::HISTORY)) { + $result = $this->credentialRevisionService->getRevisions($credential->getId()); + } else { + return new NotFoundJSONResponse(); + } + } return new JSONResponse($result); } @@ -296,17 +300,17 @@ class CredentialController extends ApiController { * @NoAdminRequired * @NoCSRFRequired */ - public function updateRevision($credential_guid, $revision_id, $credential_data){ + public function updateRevision($credential_guid, $revision_id, $credential_data) { $revision = null; try { $this->credentialService->getCredentialByGUID($credential_guid, $this->userId); - } catch (DoesNotExistException $e) { + } catch (\Exception $e) { return new NotFoundJSONResponse(); } - try{ + try { $revision = $this->credentialRevisionService->getRevision($revision_id); - } catch(DoesNotExistException $exception){ + } catch (\Exception $exception) { return new NotFoundJSONResponse(); } diff --git a/controller/filecontroller.php b/controller/filecontroller.php index 618133ea..368e1c87 100644 --- a/controller/filecontroller.php +++ b/controller/filecontroller.php @@ -59,10 +59,10 @@ class FileController extends ApiController { return new JSONResponse($this->fileService->deleteFile($file_id, $this->userId)); } - public function updateFile($file_id, $file_data, $filename, $mimetype, $size){ + public function updateFile($file_id, $file_data, $filename){ try{ $file = $this->fileService->getFile($file_id, $this->userId); - } catch (DoesNotExistException $doesNotExistException){ + } catch (\Exception $doesNotExistException){ } if($file){ diff --git a/controller/internalcontroller.php b/controller/internalcontroller.php index 01a310a9..5bbad891 100644 --- a/controller/internalcontroller.php +++ b/controller/internalcontroller.php @@ -11,6 +11,7 @@ namespace OCA\Passman\Controller; +use OCP\IConfig; use OCP\IRequest; use OCP\AppFramework\Http\JSONResponse; use OCP\AppFramework\ApiController; @@ -20,14 +21,18 @@ use \OCP\App; class InternalController extends ApiController { private $userId; private $credentialService; + private $config; public function __construct($AppName, IRequest $request, $UserId, - CredentialService $credentialService) { + CredentialService $credentialService, + IConfig $config + ) { parent::__construct($AppName, $request); $this->userId = $UserId; $this->credentialService = $credentialService; + $this->config = $config; } /** @@ -35,15 +40,17 @@ class InternalController extends ApiController { */ public function remind($credential_id) { $credential = $this->credentialService->getCredentialById($credential_id, $this->userId); - $credential->setExpireTime(time() + (24 * 60 * 60)); - $this->credentialService->upd($credential); + if($credential) { + $credential->setExpireTime(time() + (24 * 60 * 60)); + $this->credentialService->upd($credential); - $manager = \OC::$server->getNotificationManager(); - $notification = $manager->createNotification(); - $notification->setApp('passman') - ->setObject('credential', $credential_id) - ->setUser($this->userId); - $manager->markProcessed($notification); + $manager = \OC::$server->getNotificationManager(); + $notification = $manager->createNotification(); + $notification->setApp('passman') + ->setObject('credential', $credential_id) + ->setUser($this->userId); + $manager->markProcessed($notification); + } } /** @@ -52,15 +59,17 @@ class InternalController extends ApiController { public function read($credential_id) { $credential = $this->credentialService->getCredentialById($credential_id, $this->userId); - $credential->setExpireTime(0); - $this->credentialService->upd($credential); + if($credential) { + $credential->setExpireTime(0); + $this->credentialService->upd($credential); - $manager = \OC::$server->getNotificationManager(); - $notification = $manager->createNotification(); - $notification->setApp('passman') - ->setObject('credential', $credential_id) - ->setUser($this->userId); - $manager->markProcessed($notification); + $manager = \OC::$server->getNotificationManager(); + $notification = $manager->createNotification(); + $notification->setApp('passman') + ->setObject('credential', $credential_id) + ->setUser($this->userId); + $manager->markProcessed($notification); + } } /** @@ -80,4 +89,30 @@ class InternalController extends ApiController { return new JSONResponse($random_person); } + /** + * @NoAdminRequired + * @NoCSRFRequired + */ + public function getSettings() { + $settings = array( + 'link_sharing_enabled' => intval($this->config->getAppValue('passman', 'link_sharing_enabled', 1)), + 'user_sharing_enabled' => intval($this->config->getAppValue('passman', 'user_sharing_enabled', 1)), + 'vault_key_strength' => intval($this->config->getAppValue('passman', 'vault_key_strength', 3)), + 'check_version' => intval($this->config->getAppValue('passman', 'check_version', 1)), + 'https_check' => intval($this->config->getAppValue('passman', 'https_check', 1)), + 'disable_contextmenu' => intval($this->config->getAppValue('passman', 'disable_contextmenu', 1)), + ); + return new JSONResponse($settings); + } + + /** + * @NoCSRFRequired + */ + public function saveSettings($key, $value) { + if (is_numeric($value)) { + $value = intval($value); + } + $this->config->setAppValue('passman', $key, $value); + } + } \ No newline at end of file diff --git a/controller/settingscontroller.php b/controller/settingscontroller.php new file mode 100644 index 00000000..50a2ac7c --- /dev/null +++ b/controller/settingscontroller.php @@ -0,0 +1,96 @@ + + * @copyright Sander Brand 2016 + */ + +namespace OCA\Passman\Controller; + +use OCP\IL10N; +use OCP\Settings\ISettings; +use OCP\AppFramework\Http\TemplateResponse; +use OCP\AppFramework\Http\JSONResponse; +use OCP\AppFramework\ApiController; +use OCP\IRequest; +use OCA\Passman\Service\SettingsService; + +class SettingsController extends ApiController { + private $userId; + private $settings; + + public function __construct( + $AppName, + IRequest $request, + $userId, + SettingsService $settings, + IL10N $l) { + parent::__construct($AppName, $request); + $this->settings = $settings; + $this->l = $l; + $this->userId = $userId; + } + + /** + * @return TemplateResponse + */ + public function getForm() { + return new TemplateResponse('passman', 'part.admin'); + } + + /** + * @return string the section ID, e.g. 'sharing' + */ + public function getSection() { + return 'additional'; + } + + /** + * @return int whether the form should be rather on the top or bottom of + * the admin section. The forms are arranged in ascending order of the + * priority values. It is required to return a value between 0 and 100. + * + * E.g.: 70 + */ + public function getPriority() { + return 0; + } + + /** + * Get all settings + * + * @NoAdminRequired + * @NoCSRFRequired + */ + public function getSettings() { + $settings = $this->settings->getAppSettings(); + return new JSONResponse($settings); + } + + /** + * Save a user setting + * + * @NoAdminRequired + * @NoCSRFRequired + */ + public function saveUserSetting($key, $value) { + $this->settings->setUserSetting($key, $value); + return new JSONResponse('OK'); + } + + + /** + * Save a app setting + * + * @NoCSRFRequired + */ + public function saveAdminSetting($key, $value) { + $this->settings->setAppSetting($key, $value); + return new JSONResponse('OK'); + } + +} \ No newline at end of file diff --git a/controller/sharecontroller.php b/controller/sharecontroller.php index 361d5351..24d852a9 100644 --- a/controller/sharecontroller.php +++ b/controller/sharecontroller.php @@ -11,28 +11,22 @@ namespace OCA\Passman\Controller; -use OCA\Files_External\NotFoundException; -use OCA\Passman\Db\ShareRequest; use OCA\Passman\Db\SharingACL; use OCA\Passman\Db\Vault; use OCA\Passman\Service\CredentialService; use OCA\Passman\Service\FileService; use OCA\Passman\Service\NotificationService; +use OCA\Passman\Service\SettingsService; use OCA\Passman\Service\ShareService; use OCA\Passman\Utility\NotFoundJSONResponse; use OCA\Passman\Utility\Utils; -use OCP\AppFramework\Db\DoesNotExistException; use OCP\AppFramework\Http\NotFoundResponse; use OCP\IRequest; use OCP\AppFramework\Http\JSONResponse; use OCP\AppFramework\ApiController; -use OCP\AppFramework\Http; -use OCP\AppFramework\Http\DataResponse; -use OCP\IGroup; use OCP\IGroupManager; use OCP\IUserManager; -use OCP\IUser; use OCA\Passman\Service\VaultService; use OCA\Passman\Service\ActivityService; @@ -49,6 +43,7 @@ class ShareController extends ApiController { private $credentialService; private $notificationService; private $fileService; + private $settings; private $limit = 50; private $offset = 0; @@ -63,7 +58,8 @@ class ShareController extends ApiController { ShareService $shareService, CredentialService $credentialService, NotificationService $notificationService, - FileService $fileService + FileService $fileService, + SettingsService $config ) { parent::__construct($AppName, $request); @@ -76,8 +72,10 @@ class ShareController extends ApiController { $this->credentialService = $credentialService; $this->notificationService = $notificationService; $this->fileService = $fileService; + $this->settings = $config; } + /** * @param $item_id * @param $item_guid @@ -87,16 +85,15 @@ class ShareController extends ApiController { * @NoCSRFRequired */ public function createPublicShare($item_id, $item_guid, $permissions, $expire_timestamp, $expire_views) { - - try{ + try { $credential = $this->credentialService->getCredentialByGUID($item_guid); - } catch (DoesNotExistException $exception){ + } catch (\Exception $exception) { return new NotFoundResponse(); } try { $acl = $this->shareService->getACL(null, $item_guid); - } catch (DoesNotExistException $exception) { + } catch (\Exception $exception) { $acl = new SharingACL(); } @@ -138,15 +135,15 @@ class ShareController extends ApiController { if (count($shareRequests) > 0) { return new JSONResponse(array('error' => 'User got already pending requests')); } - } catch (DoesNotExistException $exception) { - + } catch (\Exception $exception) { + // no need to catch this } $acl = null; try { $acl = $this->shareService->getCredentialAclForUser($first_vault['user_id'], $item_guid); - } catch (DoesNotExistException $exception) { - + } catch (\Exception $exception) { + // no need to catch this } if ($acl) { @@ -234,21 +231,21 @@ class ShareController extends ApiController { } - public function unshareCredentialFromUser($item_guid, $user_id){ + public function unshareCredentialFromUser($item_guid, $user_id) { $acl = null; $sr = null; try { $acl = $this->shareService->getCredentialAclForUser($user_id, $item_guid); - } catch (DoesNotExistException $e){ + } catch (\Exception $e) { } - try{ - $sr = array_pop($this->shareService->getPendingShareRequestsForCredential($item_guid, $user_id)); - } catch (DoesNotExistException $e){ - + try { + $sr = array_pop($this->shareService->getPendingShareRequestsForCredential($item_guid, $user_id)); + } catch (\Exception $e) { + // no need to catch this } - if($sr){ + if ($sr) { $this->shareService->cleanItemRequestsForUser($sr); $manager = \OC::$server->getNotificationManager(); $notification = $manager->createNotification(); @@ -257,7 +254,7 @@ class ShareController extends ApiController { ->setUser($user_id); $manager->markProcessed($notification); } - if($acl){ + if ($acl) { $this->shareService->deleteShareACL($acl); } return new JSONResponse(array('result' => true)); @@ -299,7 +296,7 @@ class ShareController extends ApiController { public function savePendingRequest($item_guid, $target_vault_guid, $final_shared_key) { try { $sr = $this->shareService->getRequestByGuid($item_guid, $target_vault_guid); - } catch (DoesNotExistException $ex) { + } catch (\Exception $ex) { return new NotFoundResponse(); } @@ -340,7 +337,7 @@ class ShareController extends ApiController { array_push($results, $result); } return new JSONResponse($results); - } catch (DoesNotExistException $ex) { + } catch (\Exception $ex) { return new NotFoundResponse(); } } @@ -354,8 +351,8 @@ class ShareController extends ApiController { public function getRevisions($item_guid) { try { return new JSONResponse($this->shareService->getItemHistory($this->userId, $item_guid)); - } catch (DoesNotExistException $ex) { - return new NotFoundResponse(); + } catch (\Exception $ex) { + return new NotFoundJSONResponse(); } } @@ -368,7 +365,7 @@ class ShareController extends ApiController { public function getVaultItems($vault_guid) { try { return new JSONResponse($this->shareService->getSharedItems($this->userId->getUID(), $vault_guid)); - } catch (DoesNotExistException $ex) { + } catch (\Exception $ex) { return new NotFoundResponse(); } } @@ -403,8 +400,8 @@ class ShareController extends ApiController { $this->shareService->cleanItemRequestsForUser($sr); return new JSONResponse(array('result' => true)); - } catch (DoesNotExistException $ex) { - return new NotFoundResponse(); + } catch (\Exception $ex) { + return new NotFoundJSONResponse(); } } @@ -416,15 +413,14 @@ class ShareController extends ApiController { * @PublicPage */ public function getPublicCredentialData($credential_guid) { - //@TODO Check expire date $acl = $this->shareService->getACL(null, $credential_guid); - if ($acl->getExpire() > 0 && Utils::getTime() > $acl->getExpire()) { + if ($acl->getExpire() > 0 && Utils::getTime() > $acl->getExpire()) { return new NotFoundJSONResponse(); } - $views = $acl->getExpireViews(); + $views = $acl->getExpireViews(); if ($views === 0) { return new NotFoundJSONResponse(); } else if ($views !== -1) { @@ -437,7 +433,7 @@ class ShareController extends ApiController { try { $credential = $this->shareService->getSharedItem(null, $credential_guid); return new JSONResponse($credential); - } catch (DoesNotExistException $ex) { + } catch (\Exception $ex) { return new NotFoundJSONResponse(); } } @@ -462,7 +458,7 @@ class ShareController extends ApiController { } else { return new NotFoundResponse(); } - } catch (DoesNotExistException $ex) { + } catch (\Exception $ex) { return new JSONResponse(array()); } } @@ -475,15 +471,15 @@ class ShareController extends ApiController { * @return JSONResponse * @return NotFoundResponse */ - public function getFile($item_guid, $file_guid){ + public function getFile($item_guid, $file_guid) { try { $credential = $this->credentialService->getCredentialByGUID($item_guid); - } catch (DoesNotExistException $e){ + } catch (\Exception $e) { return new NotFoundJSONResponse(); } $userId = ($this->userId) ? $this->userId->getUID() : null; $acl = $this->shareService->getACL($userId, $credential->getGuid()); - if (!$acl->hasPermission(SharingACL::FILES)){ + if (!$acl->hasPermission(SharingACL::FILES)) { return new NotFoundJSONResponse(); } else { return $this->fileService->getFileByGuid($file_guid); @@ -501,7 +497,7 @@ class ShareController extends ApiController { public function updateSharedCredentialACL($item_guid, $user_id, $permission) { try { $credential = $this->credentialService->getCredentialByGUID($item_guid); - } catch (DoesNotExistException $exception) { + } catch (\Exception $exception) { return new NotFoundJSONResponse(); } if ($this->userId->getUID() === $credential->getUserId()) { @@ -510,7 +506,7 @@ class ShareController extends ApiController { $acl = $this->shareService->getACL($user_id, $item_guid); $acl->setPermissions($permission); return $this->shareService->updateCredentialACL($acl); - } catch (DoesNotExistException $exception) { + } catch (\Exception $exception) { } diff --git a/controller/translationcontroller.php b/controller/translationcontroller.php index 30138949..a60e6abd 100644 --- a/controller/translationcontroller.php +++ b/controller/translationcontroller.php @@ -33,7 +33,7 @@ class TranslationController extends ApiController { * @NoCSRFRequired * @PublicPage */ - public function getLanguageStrings($lang) { + public function getLanguageStrings() { $translations = array( // js/app/controllers/bookmarklet.js 'generating.sharing.keys' => $this->trans->t('Generating sharing keys ( %step / 2)'), @@ -46,12 +46,12 @@ class TranslationController extends ApiController { 'error.loading.file' => $this->trans->t('Error loading file'), // js/app/controllers/credential.js - 'error.decrypt' => $this->trans->t('An error happend during decryption'), + 'error.decrypt' => $this->trans->t('An error happened during decryption'), 'credential.created' => $this->trans->t('Credential created!'), 'credential.deleted' => $this->trans->t('Credential deleted'), 'credential.updated' => $this->trans->t('Credential updated'), 'credential.recovered' => $this->trans->t('Credential recovered'), - 'credential.destroyed' => $this->trans->t('Credential recovered'), + 'credential.destroyed' => $this->trans->t('Credential destroyed'), 'error.loading.file.perm' => $this->trans->t('Error downloading file, you probably don\'t have enough permissions'), // js/app/controllers/edit_credential.js @@ -96,6 +96,11 @@ class TranslationController extends ApiController { 'credential.shared' => $this->trans->t('Credential shared'), 'saved' => $this->trans->t('Saved!'), + // js/app/controllers/vault.js + 'password.poor' => $this->trans->t('Poor'), + 'password.weak' => $this->trans->t('Weak'), + 'password.good' => $this->trans->t('Good'), + 'password.strong' => $this->trans->t('Strong'), // js/app/directives/credentialfield.js 'toggle.visibility' => $this->trans->t('Toggle visibility'), 'copy.field' => $this->trans->t('Copy to clipboard'), @@ -301,7 +306,7 @@ class TranslationController extends ApiController { 'destroy' => $this->trans->t('Destroy'), 'sharereq.title' => $this->trans->t('You have incoming share requests.'), - 'sharereq.line1' => $this->trans->t('If you want to the credential in a other vault,'), + 'sharereq.line1' => $this->trans->t('If you want to put the credential in a other vault,'), 'sharereq.line2' => $this->trans->t('logout of this vault and login to the vault you want the shared credential in.'), 'permissions' => $this->trans->t('Permissions'), 'received.from' => $this->trans->t('Received from'), @@ -313,6 +318,7 @@ class TranslationController extends ApiController { 'last.access' => $this->trans->t('Last accessed'), 'never' => $this->trans->t('Never'), 'no.vaults' => $this->trans->t('No vaults found, why not create one?'), + 'min.vault.key.strength' => $this->trans->t('Password strength must be at least: {{strength}}'), 'new.vault.name' => $this->trans->t('Please give your new vault a name.'), 'new.vault.pass' => $this->trans->t('Vault password'), @@ -344,4 +350,4 @@ class TranslationController extends ApiController { ); return new JSONResponse($translations); } -} \ No newline at end of file +} diff --git a/controller/vaultcontroller.php b/controller/vaultcontroller.php index 40f051c1..93df13b2 100644 --- a/controller/vaultcontroller.php +++ b/controller/vaultcontroller.php @@ -50,19 +50,20 @@ class VaultController extends ApiController { $vaults = $this->vaultService->getByUser($this->userId); $protected_credential_fields = array('getDescription', 'getEmail', 'getUsername', 'getPassword'); - - foreach ($vaults as $vault) { - $credential = $this->credentialService->getRandomCredentialByVaultId($vault->getId(), $this->userId); - $secret_field = $protected_credential_fields[array_rand($protected_credential_fields)]; - array_push($result, array( - 'vault_id' => $vault->getId(), - 'guid' => $vault->getGuid(), - 'name' => $vault->getName(), - 'created' => $vault->getCreated(), - 'public_sharing_key' => $vault->getPublicSharingKey(), - 'last_access' => $vault->getlastAccess(), - 'challenge_password' => $credential->{$secret_field}() - )); + if ($vaults) { + foreach ($vaults as $vault) { + $credential = $this->credentialService->getRandomCredentialByVaultId($vault->getId(), $this->userId); + $secret_field = $protected_credential_fields[array_rand($protected_credential_fields)]; + array_push($result, array( + 'vault_id' => $vault->getId(), + 'guid' => $vault->getGuid(), + 'name' => $vault->getName(), + 'created' => $vault->getCreated(), + 'public_sharing_key' => $vault->getPublicSharingKey(), + 'last_access' => $vault->getlastAccess(), + 'challenge_password' => $credential->{$secret_field}() + )); + } } return new JSONResponse($result); @@ -86,8 +87,8 @@ class VaultController extends ApiController { $vault = null; try { $vault = $this->vaultService->getByGuid($vault_guid, $this->userId); - } catch (DoesNotExistException $e) { - return new NotFoundJSONResponse(); + } catch (\Exception $e) { + return new NotFoundJSONResponse(); } $result = array(); if ($vault) { @@ -119,10 +120,10 @@ class VaultController extends ApiController { */ public function update($vault_guid, $name, $vault_settings) { $vault = $this->vaultService->getByGuid($vault_guid, $this->userId); - if ($name) { + if ($name && $vault) { $vault->setName($name); } - if ($vault_settings) { + if ($vault_settings && $vault) { $vault->setVaultSettings($vault_settings); } $this->vaultService->updateVault($vault); @@ -136,11 +137,14 @@ class VaultController extends ApiController { $vault = null; try { $vault = $this->vaultService->getByGuid($vault_guid, $this->userId); - } catch (DoesNotExistException $e) { - + } catch (\Exception $e) { + // No need to catch the execption + } + + if ($vault) { + $this->vaultService->updateSharingKeys($vault->getId(), $private_sharing_key, $public_sharing_key); } - $this->vaultService->updateSharingKeys($vault->getId(), $private_sharing_key, $public_sharing_key); return; } @@ -149,6 +153,6 @@ class VaultController extends ApiController { * @NoCSRFRequired */ public function delete($vault_id) { - return; + return new JSONResponse($vault_id); } } \ No newline at end of file diff --git a/css/passman.min.css b/css/passman.min.css index 8b9a4ead..ea6db121 100644 --- a/css/passman.min.css +++ b/css/passman.min.css @@ -27,4 +27,4 @@ Build date: 2016-09-06 *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.row{margin-left:-15px;margin-right:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.row:after,.row:before{content:" ";display:table}.center-block{display:block;margin-left:auto;margin-right:auto}.fa.fa-pull-left,.fa.pull-left{margin-right:.3em}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.hidden,.visible-lg,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;background-color:transparent;border:0}.affix{position:fixed}@-ms-viewport{width:device-width}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}.visible-xs-block{display:block!important}.visible-xs-inline{display:inline!important}.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}.visible-sm-block{display:block!important}.visible-sm-inline{display:inline!important}.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}.visible-md-block{display:block!important}.visible-md-inline{display:inline!important}.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}.visible-lg-block{display:block!important}.visible-lg-inline{display:inline!important}.visible-lg-inline-block{display:inline-block!important}.hidden-lg{display:none!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}.hidden-print{display:none!important}}.fa,.fa-stack{display:inline-block}/*! * Font Awesome 4.6.3 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */@font-face{font-family:FontAwesome;src:url(fontawesome-webfont.eot?v=4.6.3);src:url(fontawesome-webfont.eot?#iefix&v=4.6.3) format('embedded-opentype'),url(fontawesome-webfont.woff2?v=4.6.3) format('woff2'),url(fontawesome-webfont.woff?v=4.6.3) format('woff'),url(fontawesome-webfont.ttf?v=4.6.3) format('truetype'),url(fontawesome-webfont.svg?v=4.6.3#fontawesomeregular) format('svg');font-weight:400;font-style:normal}.fa{font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa.fa-pull-right,.fa.pull-right{margin-left:.3em}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1,1);-ms-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1,-1);-ms-transform:scale(1,-1);transform:scale(1,-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{filter:none}.fa-stack{position:relative;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.pass-meter .details,.pass-meter .pass-meter-message{font-family:"Arial Black",Gadget,sans-serif;font-size:10px;line-height:10px;color:#555;min-height:7px}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-close:before,.fa-remove:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-cog:before,.fa-gear:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-repeat:before,.fa-rotate-right:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-exclamation-triangle:before,.fa-warning:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-cogs:before,.fa-gears:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-floppy-o:before,.fa-save:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-bolt:before,.fa-flash:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-chain-broken:before,.fa-unlink:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:"\f150"}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:"\f151"}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:"\f152"}.fa-eur:before,.fa-euro:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-inr:before,.fa-rupee:before{content:"\f156"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:"\f157"}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:"\f158"}.fa-krw:before,.fa-won:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-try:before,.fa-turkish-lira:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-bank:before,.fa-institution:before,.fa-university:before{content:"\f19c"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:"\f1c5"}.fa-file-archive-o:before,.fa-file-zip-o:before{content:"\f1c6"}.fa-file-audio-o:before,.fa-file-sound-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:"\f1d0"}.fa-empire:before,.fa-ge:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-paper-plane:before,.fa-send:before{content:"\f1d8"}.fa-paper-plane-o:before,.fa-send-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-bed:before,.fa-hotel:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-y-combinator:before,.fa-yc:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-television:before,.fa-tv:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:"\f2a3"}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-sign-language:before,.fa-signing:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.pass-meter{width:100%;padding-top:3px;padding-bottom:30px}.pass-meter.hidden{display:none}.pass-meter .details,.pass-meter .pass-meter-message{margin-top:3px}.pass-meter-col{float:left;width:25%;padding:1px}.pass-meter-col .indicator{border-radius:3px;background-color:#eee;height:5px}.pass-meter-col.poor .indicator{background-color:#ef4e3a}.pass-meter-col.weak .indicator{background-color:#F27B1C}.pass-meter-col.good .indicator{background-color:#6c3}.pass-meter-col.strong .indicator{background-color:#33A7E3}.pass-meter .pass-meter-message{width:49%;text-align:right;float:right}.pass-meter .details{width:49%;text-align:left;float:left;cursor:pointer}.pass-meter .details:hover,.pass-meter .link{color:#06f!important}.detail_box .row .col{float:left;width:49%}.match-sequence .sequence{float:left;width:auto;margin-right:10px}.match-sequence .sequence table td:nth-child(2){padding-left:4px}.sequence .token{text-align:center}.sequence code{border:1px solid;padding:3px}tags-input{display:block}tags-input *,tags-input :after,tags-input :before{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}tags-input .host{position:relative;margin-top:5px;margin-bottom:5px;height:100%}tags-input .host:active{outline:0}tags-input .tags{-moz-appearance:textfield;-webkit-appearance:textfield;padding:1px;overflow:hidden;word-wrap:break-word;cursor:text;background-color:#fff;border:1px solid #a9a9a9;box-shadow:1px 1px 1px 0 #d3d3d3 inset;height:100%}tags-input .tags.focused{outline:0;-webkit-box-shadow:0 0 3px 1px rgba(5,139,242,.6);-moz-box-shadow:0 0 3px 1px rgba(5,139,242,.6);box-shadow:0 0 3px 1px rgba(5,139,242,.6)}tags-input .tags .tag-list{margin:0;padding:0;list-style-type:none}tags-input .tags .tag-item{margin:2px;padding:0 5px;display:inline-block;float:left;font:14px "Helvetica Neue",Helvetica,Arial,sans-serif;height:26px;line-height:25px;border:1px solid #acacac;border-radius:3px;color:#ececec}tags-input .tags .tag-item.selected{background:#ce3702!important}tags-input .tags .tag-item .remove-button{margin:0 0 0 5px;padding:0;border:none;background:0 0;cursor:pointer;vertical-align:middle;font:700 16px Arial,sans-serif;color:#585858}tags-input .tags .input.invalid-tag,tags-input .tags .tag-item .remove-button:active{color:red}tags-input .tags .input{border:0;outline:0;margin:2px;padding:0 0 0 5px;float:left;height:26px;font:14px "Helvetica Neue",Helvetica,Arial,sans-serif}tags-input .tags .input::-ms-clear{display:none}tags-input.ng-invalid .tags{-webkit-box-shadow:0 0 3px 1px rgba(255,0,0,.6);-moz-box-shadow:0 0 3px 1px rgba(255,0,0,.6);box-shadow:0 0 3px 1px rgba(255,0,0,.6)}tags-input[disabled] .host:focus{outline:0}tags-input[disabled] .tags{background-color:#eee;cursor:default}tags-input[disabled] .tags .tag-item{opacity:.65;background:-webkit-linear-gradient(top,#f0f9ff 0,rgba(203,235,255,.75) 47%,rgba(161,219,255,.62) 100%);background:linear-gradient(to bottom,#f0f9ff 0,rgba(203,235,255,.75) 47%,rgba(161,219,255,.62) 100%)}tags-input[disabled] .tags .tag-item .remove-button{cursor:default}tags-input[disabled] .tags .tag-item .remove-button:active{color:#585858}tags-input[disabled] .tags .input{background-color:#eee;cursor:default}tags-input .autocomplete{margin-top:5px;position:absolute;padding:5px 0;z-index:999;width:100%;background-color:#fff;border:1px solid rgba(0,0,0,.2);-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}tags-input .autocomplete .suggestion-list{margin:0;padding:0;list-style-type:none;max-height:280px;overflow-y:auto;position:relative}tags-input .autocomplete .suggestion-item{padding:5px 10px;cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font:16px "Helvetica Neue",Helvetica,Arial,sans-serif;color:#000;background-color:#fff}tags-input .autocomplete .suggestion-item.selected,tags-input .autocomplete .suggestion-item.selected em{color:#fff;background-color:#0097cf}tags-input .autocomplete .suggestion-item em{font:normal 700 16px "Helvetica Neue",Helvetica,Arial,sans-serif;color:#000;background-color:#fff}.button-geen{background:#37ce02;color:#fff}.button-geen:hover{background:#3ad802;color:#fff}.button-red{background:#ce3702;color:#fff}.button-red:hover{background:#d83a02;color:#fff}.link{color:#06f!important;cursor:pointer}.tab_header{margin:44px 0 0;list-style:none;padding:0}.tab_header li.tab:first-child{margin-left:0}.tab_header li.tab{float:left;border-bottom-width:0;margin:0;padding:10px;cursor:pointer;border-right:1px solid #eee;-webkit-transition:background-color 250ms linear;-moz-transition:background-color 250ms linear;-o-transition:background-color 250ms linear;-ms-transition:background-color 250ms linear;transition:background-color 250ms linear}.tab_header li.tab .indicator{display:none}.tab_header li.active{color:#fff;position:relative}.tab_header li.active .indicator{display:inline-block;position:absolute;height:7px;left:0;right:0;bottom:-1px}.tab_container{border:1px solid;border-color:#eee;border-top-color:#0082c9;border-bottom:0;clear:both;padding:0 1em}.pw-gen{overflow:hidden}.pw-gen input{width:calc(100% - 80px)!important;float:left;background:#fff;color:#555;cursor:text;font-family:inherit;border:1px solid #ddd;outline:0;border-radius:3px;margin:3px 3px 3px 0;padding:7px 6px 5px;font-size:13px;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-webkit-border-top-right-radius:0;border-top-right-radius:0;background-clip:padding-box}.pw-gen .generate_pw{float:left;margin-top:3px;margin-left:-3px}.pw-gen .generate_pw .cell{padding:5px;display:inline-block;font-size:14px;border:1px solid #ddd;background-color:#eaeaea;cursor:pointer}.pw-gen .generate_pw .cell:hover{color:#06f}.pw-gen .generate_pw .cell:last-child{-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px;background-clip:padding-box}.warning_bar{position:absolute;width:100%;padding:12px;font-weight:700;text-align:center;z-index:800;background-color:red;color:#fff}.warning_bar .fa-times{float:right;color:#000;cursor:pointer}.vault_wrapper{margin:0 auto;margin-top:20px;width:100%;max-width:420px;-webkit-border-radius:5px;border-radius:5px;background-clip:padding-box;box-shadow:0 1px 1px #777;background:#eee;display:block}.vault_wrapper .vaultlist{z-index:500}.vault_wrapper .vaultlist div,.vault_wrapper .vaultlist li,.vault_wrapper .vaultlist small,.vault_wrapper .vaultlist span{cursor:pointer}.vault_wrapper .vaultlist small{color:#8e8e8e}.vault_wrapper .vaultlist li.selected{background-color:#0082c9!important;color:#ddd}.vault_wrapper .vaultlist li{border-bottom:1px solid #8e8e8e;padding:16px}.vault_wrapper .vaultlist li:hover{background-color:#f7f7f7}.vault_wrapper .login_form{padding:16px}.vault_wrapper .login_form .error{color:#ce3702}.vault_wrapper .login_form .pw-input .last_access{color:#8e8e8e}.vault_wrapper .login_form input[type=password],.vault_wrapper .login_form input[type=text]{width:100%;-webkit-border-radius:5px;border-radius:5px;background-clip:padding-box}.vault_wrapper .login_form .button_wrapper .button{width:45%;display:inline-block}.vault_wrapper .login_form .button{margin-top:10px}@media screen and (max-width:768px){.vault_wrapper{width:90%}}#app-content{overflow-x:hidden}#app-content #app-content-wrapper{min-height:95%}#app-content #app-content-wrapper #passman-controls{text-align:center;border-bottom:1px solid #c9c9c9}#app-content #app-content-wrapper #passman-controls.sidebar-shown{padding-right:27%!important}@media screen and (max-width:765px){#app-content #app-content-wrapper #passman-controls.sidebar-shown .title{display:none}}@media screen and (min-width:769px) and (max-width:1120px){#app-content #app-content-wrapper #passman-controls.sidebar-shown .title{display:none}}#app-content #app-content-wrapper .title{text-align:center;display:inline-block;font-weight:700;margin-top:10px}@media screen and (max-width:575px){#app-content #app-content-wrapper .title{display:none}}@media screen and (min-width:769px) and (max-width:820px){#app-content #app-content-wrapper .title{display:none}}#app-content #app-content-wrapper .actions.creatable{float:left;overflow:hidden}#app-content #app-content-wrapper .actions.creatable .bubble{position:relative;width:185px;-webkit-border-radius:5px;border-radius:5px;background-clip:padding-box;box-shadow:0 1px 10px rgba(50,50,50,.7)}#app-content #app-content-wrapper .actions.creatable .bubble ul li{padding-left:10px}#app-content #app-content-wrapper .actions.creatable .bubble ul .menuitem{font-size:12px;display:inline}#app-content #app-content-wrapper .actions.creatable .bubble:after{right:inherit;left:10px;top:-19px}#app-content #app-content-wrapper .viewModes{float:right;margin-right:5px;margin-top:3px}#app-content #app-content-wrapper .viewModes .view-mode:first-child{-webkit-border-bottom-left-radius:5px;border-bottom-left-radius:5px;-webkit-border-top-left-radius:5px;border-top-left-radius:5px;background-clip:padding-box;border:1px solid rgba(240,240,240,.9)}#app-content #app-content-wrapper .viewModes .view-mode:last-child{-webkit-border-bottom-right-radius:5px;border-bottom-right-radius:5px;-webkit-border-top-right-radius:5px;border-top-right-radius:5px;background-clip:padding-box;border:1px solid rgba(240,240,240,.9)}#app-content #app-content-wrapper .viewModes .view-mode{background-color:rgba(240,240,240,.9);cursor:pointer;display:inline-block;padding:7px}#app-content #app-content-wrapper .viewModes .view-mode.active{display:inline-block;padding:7px;background-color:rgba(226,226,226,.9)}#app-content #app-content-wrapper .searchboxContainer{display:inline-block;margin-right:14px;float:right}#app-content #app-content-wrapper .searchboxContainer .searchbox{display:inline-block}#app-content #app-content-wrapper .searchboxContainer .searchclear{color:#ccc;cursor:pointer;font-size:18px;height:14px;margin:auto;position:absolute!important;right:10px;top:12px;z-index:99999999}#app-content #app-content-wrapper .credential-table{width:100%;margin-top:44px}#app-content #app-content-wrapper .credential-table tr:hover{background-color:#f5f5f5}#app-content #app-content-wrapper .credential-table tr.selected{background-color:#f8f8f8}#app-content #app-content-wrapper .credential-table tr td{cursor:pointer;padding:5px;border-bottom:1px solid #eee}#app-content #app-content-wrapper .credential-table tr td .icon{font-size:19px;float:left;margin-right:5px;margin-left:3px}#app-content #app-content-wrapper .credential-table tr td .icon-more{display:inline-block;float:right;margin-left:5px;margin-top:1px;opacity:.4;height:20px;width:32px;cursor:pointer}#app-content #app-content-wrapper .credential-table tr td .icon-more:hover{opacity:1}#app-content #app-content-wrapper .credential-table tr td .popovermenu{margin-top:25px;height:100px;width:100px;right:-2px!important;box-shadow:0 1px 10px rgba(50,50,50,.7)}#app-content #app-content-wrapper .credential-table tr td .popovermenu ul{display:block;width:100px;height:75px}#app-content #app-content-wrapper .credential-table tr td .popovermenu ul li{padding:0}#app-content #app-content-wrapper .credential-table tr td .popovermenu ul .menuitem{font-size:12px;display:inline}#app-content #app-content-wrapper .credential-table tr td .popovermenu .action{padding:10px;margin:-10px}#app-content #app-content-wrapper .tags{float:right}#app-content #app-content-wrapper .edit_credential .password_settings label .label,#app-content #app-content-wrapper .edit_credential .tags{float:left}#app-content #app-content-wrapper .tags .tag{background-color:rgba(240,240,240,.9);padding:4px;font-size:12px;margin-right:3px;-webkit-border-radius:5px;border-radius:5px;background-clip:padding-box}#app-content #app-content-wrapper .tags .tag:last-child{margin-right:8px}#app-content #app-content-wrapper .grid-view{margin-top:44px;display:flex;flex-wrap:wrap}#app-content #app-content-wrapper .grid-view .credential{display:flex;width:100%;border:2px solid rgba(240,240,240,.9);margin:25px;-webkit-border-radius:10px;border-radius:10px;background-clip:padding-box}#app-content #app-content-wrapper .grid-view .credential .credential_content{display:flex;padding:2px;flex-direction:column;width:100%;cursor:pointer;font-size:1.75em;text-align:center}#app-content #app-content-wrapper .grid-view .credential .credential_content .label{padding-top:.5em;padding-left:1em;padding-right:1em;line-height:1.3em;word-wrap:break-word}#app-content #app-content-wrapper .grid-view .credential .credential_content .tags{margin-bottom:.5em}#app-content #app-content-wrapper .grid-view .credential .credential_content .tags .tag{color:#000!important;margin-top:5px;display:inline-block}@media all and (min-width:40em){#app-content #app-content-wrapper .grid-view .credential{width:40%}}@media all and (min-width:58em){#app-content #app-content-wrapper .grid-view .credential{width:26%}}@media all and (min-width:78em){#app-content #app-content-wrapper .grid-view .credential{width:20%}}#app-content #app-content-wrapper .edit_credential input[type=password],#app-content #app-content-wrapper .edit_credential input[type=text],#app-content #app-content-wrapper .edit_credential tags-input .tags{width:100%}#app-content #app-content-wrapper .edit_credential{padding-top:10px}#app-content #app-content-wrapper .edit_credential label{display:block}#app-content #app-content-wrapper .edit_credential .tags .tag{background-color:rgba(240,240,240,.9);padding:4px;font-size:11px}#app-content #app-content-wrapper .edit_credential .credential_textarea{width:100%;height:100px}#app-content #app-content-wrapper .edit_credential .password_settings label{overflow:hidden}#app-content #app-content-wrapper .edit_credential .password_settings label input[type=checkbox]{width:auto!important;float:left}#app-content #app-content-wrapper .edit_credential .password_settings label .label.sm{font-size:12px}#app-content #app-content-wrapper .edit_credential .field-value .valueInput{padding-right:0}#app-content #app-content-wrapper .edit_credential .field-value .valueInput .pw-gen .generate_pw .cell:last-child,#app-content #app-content-wrapper .edit_credential .field-value .valueInput input{-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-webkit-border-top-right-radius:0;border-top-right-radius:0;background-clip:padding-box}#app-content #app-content-wrapper .edit_credential .field-value .selectType{padding-left:0;margin-left:-4px}#app-content #app-content-wrapper .edit_credential .field-value .selectType select{-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;background-clip:padding-box}#app-content #app-content-wrapper .edit_credential .custom_fields,#app-content #app-content-wrapper .edit_credential .files{margin-top:10px}#app-content #app-content-wrapper .edit_credential .custom_fields table,#app-content #app-content-wrapper .edit_credential .files table{width:100%}#app-content #app-content-wrapper .edit_credential .custom_fields table thead th.dragger,#app-content #app-content-wrapper .edit_credential .files table thead th.dragger{width:3%}#app-content #app-content-wrapper .edit_credential .custom_fields table thead th,#app-content #app-content-wrapper .edit_credential .files table thead th{color:#fff}.error,.shared_table .fa-trash:hover{color:#ce3702}#app-content #app-content-wrapper .edit_credential .custom_fields table thead th.field_actions,#app-content #app-content-wrapper .edit_credential .files table thead th.field_actions{width:15%}#app-content #app-content-wrapper .edit_credential .custom_fields table tr:hover,#app-content #app-content-wrapper .edit_credential .files table tr:hover{background-color:transparent}#app-content #app-content-wrapper .edit_credential .custom_fields table tr td.dragger,#app-content #app-content-wrapper .edit_credential .files table tr td.dragger{width:3%;text-align:center;cursor:move;cursor:-webkit-grab;cursor:-moz-grab;cursor:grab}#app-content #app-content-wrapper .edit_credential .custom_fields table tr td.field_actions,#app-content #app-content-wrapper .edit_credential .files table tr td.field_actions{font-size:13px;width:15%}#app-content #app-content-wrapper .edit_credential .custom_fields table tr td.field_actions i,#app-content #app-content-wrapper .edit_credential .files table tr td.field_actions i{cursor:pointer}#app-content #app-content-wrapper .edit_credential .custom_fields table tr td,#app-content #app-content-wrapper .edit_credential .custom_fields table tr th,#app-content #app-content-wrapper .edit_credential .files table tr td,#app-content #app-content-wrapper .edit_credential .files table tr th{width:20%;padding:5px}#app-content #app-content-wrapper .edit_credential .custom_fields table tr td .editable-has-buttons.editable-input,#app-content #app-content-wrapper .edit_credential .custom_fields table tr th .editable-has-buttons.editable-input,#app-content #app-content-wrapper .edit_credential .files table tr td .editable-has-buttons.editable-input,#app-content #app-content-wrapper .edit_credential .files table tr th .editable-has-buttons.editable-input{width:55%}#app-content #app-content-wrapper .edit_credential .custom_fields table tr td,#app-content #app-content-wrapper .edit_credential .files table tr td{height:50px;vertical-align:middle}#app-content #app-content-wrapper .app_sidebar{padding:10px;overflow-y:auto}#app-content #app-content-wrapper .app_sidebar h2{margin-bottom:10px;font-weight:400;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:90%}#app-content #app-content-wrapper .app_sidebar .close.icon-close{position:absolute;top:10px;right:10px;cursor:pointer}#app-content #app-content-wrapper .app_sidebar.item_selected{height:25%;display:inline-block}#app-content #app-content-wrapper .app_sidebar .credential-data .row{margin-bottom:11px}#app-content #app-content-wrapper .app_sidebar .credential-data .tags{margin-top:15px;margin-bottom:15px;float:none}#app-content #app-content-wrapper .app_sidebar .credential-data .tags .tag{background-color:rgba(240,240,240,.9);padding:4px;margin-right:3px}.credential_field .tools .cell,.inputfile+label{margin-right:4px;cursor:pointer}.credential_field{overflow:hidden}.credential_field .cell,.credential_field .value{float:left}.credential_field .value{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:70%}.credential_field .tools{margin-left:10px;overflow:hidden;float:left}.progress{margin-top:10px;height:20px}.progress .progress-bar{position:relative;height:20px;background-image:none;background-color:#0082c9}.progress .progress-bar .progress-label{position:absolute;top:0;z-index:2;text-align:center;width:100%}.loaderContainer{height:140px;width:120px;margin-top:30px;margin-left:-60px;top:50%;left:50%;position:absolute}.loaderContainer .text{width:120px;text-align:center}.loader{border-bottom:10px solid #1d2d44;border-left:10px solid #c9c9c9;border-right:10px solid #c9c9c9;border-top:10px solid #c9c9c9;height:120px;width:120px;border-radius:120px;animation:1.1s linear 0s normal none infinite running load8}@keyframes load8{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}.inputfile{width:.1px;height:.1px;opacity:0;overflow:hidden;position:absolute;z-index:-1}#app-navigation li a tags-input,#app-navigation li a.taginput{opacity:1}.inputfile+label{font-size:1.25em;background-color:rgba(240,240,240,.9);margin-top:4px;padding:5px;border-right:1px solid #c9c9c9}.inputfile+label:hover,.inputfile:focus+label{background-color:#c9c9c9}.settings-container div{padding-left:15px}.nav-trashbin{position:fixed!important;bottom:44px;width:inherit!important;background-color:#fff;border-right:1px solid #eee}.nav-trashbin a{padding:0 20px}.nav-trashbin a .fa{margin-right:15px}#app-navigation li a{overflow:visible}#app-navigation li a tags-input li{width:auto!important}#app-navigation>ul ul{display:inherit!important}.sharing_table td:first-child{width:55%}.sharing_table td:first-child tags-input .tags,.table{width:100%}.sharing_table td:first-child .autocomplete{margin-top:35px}.share_credential{padding-top:10px}.share_credential input{width:auto}.share_credential>div{margin-bottom:10px}.shared_table .fa-trash{cursor:pointer}.scan-result-table{margin-top:10px}.scan-result-table .score{padding-left:0;padding-right:15px}.import_log{max-height:600px;overflow-y:auto}.import_log textarea{width:90%;height:200px}#app-settings-content:not(.ng-hide){height:60px;display:inherit!important;padding:0;transition:height .15s ease-out}#app-settings-content.ng-hide{display:inherit!important;height:0;padding:0;transition:height .15s ease-in}.ui-dialog{z-index:9999}#notification .row{margin-left:0!important;margin-right:0!important}#passman-controls{position:fixed;top:45px;right:0;left:0;padding:0!important;margin:0;background-color:rgba(255,255,255,.95);z-index:50;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;height:44px!important}@media only screen and (max-width:768px){#passman-controls{width:100%}}@media only screen and (min-width:768px){#app-navigation+#app-content #passman-controls{left:250px;width:calc(100% - 250px)!important}}#passman-controls,#passman-controls .button,#passman-controls input[type=submit],#passman-controls input[type=text],#passman-controls input[type=password],#passman-controls select{box-sizing:border-box;display:inline-block;height:36px;padding:7px 10px}.nopadding{padding-right:0;padding-left:0} \ No newline at end of file + */@font-face{font-family:FontAwesome;src:url(fontawesome-webfont.eot?v=4.6.3);src:url(fontawesome-webfont.eot?#iefix&v=4.6.3) format('embedded-opentype'),url(fontawesome-webfont.woff2?v=4.6.3) format('woff2'),url(fontawesome-webfont.woff?v=4.6.3) format('woff'),url(fontawesome-webfont.ttf?v=4.6.3) format('truetype'),url(fontawesome-webfont.svg?v=4.6.3#fontawesomeregular) format('svg');font-weight:400;font-style:normal}.fa{font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa.fa-pull-right,.fa.pull-right{margin-left:.3em}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1,1);-ms-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1,-1);-ms-transform:scale(1,-1);transform:scale(1,-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{filter:none}.fa-stack{position:relative;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.pass-meter .details,.pass-meter .pass-meter-message{font-family:"Arial Black",Gadget,sans-serif;font-size:10px;line-height:10px;color:#555;min-height:7px}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-close:before,.fa-remove:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-cog:before,.fa-gear:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-repeat:before,.fa-rotate-right:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-exclamation-triangle:before,.fa-warning:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-cogs:before,.fa-gears:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-floppy-o:before,.fa-save:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-bolt:before,.fa-flash:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-chain-broken:before,.fa-unlink:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:"\f150"}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:"\f151"}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:"\f152"}.fa-eur:before,.fa-euro:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-inr:before,.fa-rupee:before{content:"\f156"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:"\f157"}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:"\f158"}.fa-krw:before,.fa-won:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-try:before,.fa-turkish-lira:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-bank:before,.fa-institution:before,.fa-university:before{content:"\f19c"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:"\f1c5"}.fa-file-archive-o:before,.fa-file-zip-o:before{content:"\f1c6"}.fa-file-audio-o:before,.fa-file-sound-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:"\f1d0"}.fa-empire:before,.fa-ge:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-paper-plane:before,.fa-send:before{content:"\f1d8"}.fa-paper-plane-o:before,.fa-send-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-bed:before,.fa-hotel:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-y-combinator:before,.fa-yc:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-television:before,.fa-tv:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:"\f2a3"}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-sign-language:before,.fa-signing:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.pass-meter{width:100%;padding-top:3px;padding-bottom:30px}.pass-meter.hidden{display:none}.pass-meter .details,.pass-meter .pass-meter-message{margin-top:3px}.pass-meter-col{float:left;width:25%;padding:1px}.pass-meter-col .indicator{border-radius:3px;background-color:#eee;height:5px}.pass-meter-col.poor .indicator{background-color:#ef4e3a}.pass-meter-col.weak .indicator{background-color:#F27B1C}.pass-meter-col.good .indicator{background-color:#6c3}.pass-meter-col.strong .indicator{background-color:#33A7E3}.pass-meter .pass-meter-message{width:49%;text-align:right;float:right}.pass-meter .details{width:49%;text-align:left;float:left;cursor:pointer}.pass-meter .details:hover,.pass-meter .link{color:#06f!important}.detail_box .row .col{float:left;width:49%}.match-sequence .sequence{float:left;width:auto;margin-right:10px}.match-sequence .sequence table td:nth-child(2){padding-left:4px}.sequence .token{text-align:center}.sequence code{border:1px solid;padding:3px}tags-input{display:block}tags-input *,tags-input :after,tags-input :before{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}tags-input .host{position:relative;margin-top:5px;margin-bottom:5px;height:100%}tags-input .host:active{outline:0}tags-input .tags{-moz-appearance:textfield;-webkit-appearance:textfield;padding:1px;overflow:hidden;word-wrap:break-word;cursor:text;background-color:#fff;border:1px solid #a9a9a9;box-shadow:1px 1px 1px 0 #d3d3d3 inset;height:100%}tags-input .tags.focused{outline:0;-webkit-box-shadow:0 0 3px 1px rgba(5,139,242,.6);-moz-box-shadow:0 0 3px 1px rgba(5,139,242,.6);box-shadow:0 0 3px 1px rgba(5,139,242,.6)}tags-input .tags .tag-list{margin:0;padding:0;list-style-type:none}tags-input .tags .tag-item{margin:2px;padding:0 5px;display:inline-block;float:left;font:14px "Helvetica Neue",Helvetica,Arial,sans-serif;height:26px;line-height:25px;border:1px solid #acacac;border-radius:3px;color:#ececec}tags-input .tags .tag-item.selected{background:#ce3702!important}tags-input .tags .tag-item .remove-button{margin:0 0 0 5px;padding:0;border:none;background:0 0;cursor:pointer;vertical-align:middle;font:700 16px Arial,sans-serif;color:#585858}tags-input .tags .input.invalid-tag,tags-input .tags .tag-item .remove-button:active{color:red}tags-input .tags .input{border:0;outline:0;margin:2px;padding:0 0 0 5px;float:left;height:26px;font:14px "Helvetica Neue",Helvetica,Arial,sans-serif}tags-input .tags .input::-ms-clear{display:none}tags-input.ng-invalid .tags{-webkit-box-shadow:0 0 3px 1px rgba(255,0,0,.6);-moz-box-shadow:0 0 3px 1px rgba(255,0,0,.6);box-shadow:0 0 3px 1px rgba(255,0,0,.6)}tags-input[disabled] .host:focus{outline:0}tags-input[disabled] .tags{background-color:#eee;cursor:default}tags-input[disabled] .tags .tag-item{opacity:.65;background:-webkit-linear-gradient(top,#f0f9ff 0,rgba(203,235,255,.75) 47%,rgba(161,219,255,.62) 100%);background:linear-gradient(to bottom,#f0f9ff 0,rgba(203,235,255,.75) 47%,rgba(161,219,255,.62) 100%)}tags-input[disabled] .tags .tag-item .remove-button{cursor:default}tags-input[disabled] .tags .tag-item .remove-button:active{color:#585858}tags-input[disabled] .tags .input{background-color:#eee;cursor:default}tags-input .autocomplete{margin-top:5px;position:absolute;padding:5px 0;z-index:999;width:100%;background-color:#fff;border:1px solid rgba(0,0,0,.2);-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}tags-input .autocomplete .suggestion-list{margin:0;padding:0;list-style-type:none;max-height:280px;overflow-y:auto;position:relative}tags-input .autocomplete .suggestion-item{padding:5px 10px;cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font:16px "Helvetica Neue",Helvetica,Arial,sans-serif;color:#000;background-color:#fff}tags-input .autocomplete .suggestion-item.selected,tags-input .autocomplete .suggestion-item.selected em{color:#fff;background-color:#0097cf}tags-input .autocomplete .suggestion-item em{font:normal 700 16px "Helvetica Neue",Helvetica,Arial,sans-serif;color:#000;background-color:#fff}.button-geen{background:#37ce02;color:#fff}.button-geen:hover{background:#3ad802;color:#fff}.button-red{background:#ce3702;color:#fff}.button-red:hover{background:#d83a02;color:#fff}.link{color:#06f!important;cursor:pointer}.tab_header{margin:44px 0 0;list-style:none;padding:0}.tab_header li.tab:first-child{margin-left:0}.tab_header li.tab{float:left;border-bottom-width:0;margin:0;padding:10px;cursor:pointer;border-right:1px solid #eee;-webkit-transition:background-color 250ms linear;-moz-transition:background-color 250ms linear;-o-transition:background-color 250ms linear;-ms-transition:background-color 250ms linear;transition:background-color 250ms linear}.tab_header li.tab .indicator{display:none}.tab_header li.active{color:#fff;position:relative}.tab_header li.active .indicator{display:inline-block;position:absolute;height:7px;left:0;right:0;bottom:-1px}.tab_container{border:1px solid;border-color:#eee;border-top-color:#0082c9;border-bottom:0;clear:both;padding:0 1em}.pw-gen{overflow:hidden}.pw-gen input{width:calc(100% - 80px)!important;float:left;background:#fff;color:#555;cursor:text;font-family:inherit;border:1px solid #ddd;outline:0;border-radius:3px;margin:3px 3px 3px 0;padding:7px 6px 5px;font-size:13px;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-webkit-border-top-right-radius:0;border-top-right-radius:0;background-clip:padding-box}.pw-gen .generate_pw{float:left;margin-top:3px;margin-left:-3px}.pw-gen .generate_pw .cell{padding:5px;display:inline-block;font-size:14px;border:1px solid #ddd;background-color:#eaeaea;cursor:pointer}.pw-gen .generate_pw .cell:hover{color:#06f}.pw-gen .generate_pw .cell:last-child{-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px;background-clip:padding-box}.warning_bar{position:absolute;width:100%;padding:12px;font-weight:700;text-align:center;z-index:800;background-color:red;color:#fff}.warning_bar .fa-times{float:right;color:#000;cursor:pointer}.vault_wrapper{margin:0 auto;margin-top:20px;width:100%;max-width:420px;-webkit-border-radius:5px;border-radius:5px;background-clip:padding-box;box-shadow:0 1px 1px #777;background:#eee;display:block}.vault_wrapper .vaultlist{z-index:500}.vault_wrapper .vaultlist div,.vault_wrapper .vaultlist li,.vault_wrapper .vaultlist small,.vault_wrapper .vaultlist span{cursor:pointer}.vault_wrapper .vaultlist small{color:#8e8e8e}.vault_wrapper .vaultlist li.selected{background-color:#0082c9!important;color:#ddd}.vault_wrapper .vaultlist li{border-bottom:1px solid #8e8e8e;padding:16px}.vault_wrapper .vaultlist li:hover{background-color:#f7f7f7}.vault_wrapper .login_form{padding:16px}.vault_wrapper .login_form .error{color:#ce3702}.vault_wrapper .login_form .pw-input .last_access{color:#8e8e8e}.vault_wrapper .login_form input[type=password],.vault_wrapper .login_form input[type=text]{width:100%;-webkit-border-radius:5px;border-radius:5px;background-clip:padding-box}.vault_wrapper .login_form .button_wrapper .button{width:45%;display:inline-block}.vault_wrapper .login_form .button{margin-top:10px}@media screen and (max-width:768px){.vault_wrapper{width:90%}}#app-content{overflow-x:hidden}#app-content #app-content-wrapper{min-height:95%}#app-content #app-content-wrapper #passman-controls{text-align:center;border-bottom:1px solid #c9c9c9}#app-content #app-content-wrapper #passman-controls.sidebar-shown{padding-right:27%!important}@media screen and (max-width:765px){#app-content #app-content-wrapper #passman-controls.sidebar-shown .title{display:none}}@media screen and (min-width:769px) and (max-width:1120px){#app-content #app-content-wrapper #passman-controls.sidebar-shown .title{display:none}}#app-content #app-content-wrapper .title{text-align:center;display:inline-block;font-weight:700;margin-top:10px}@media screen and (max-width:575px){#app-content #app-content-wrapper .title{display:none}}@media screen and (min-width:769px) and (max-width:820px){#app-content #app-content-wrapper .title{display:none}}#app-content #app-content-wrapper .actions.creatable{float:left;overflow:hidden}#app-content #app-content-wrapper .actions.creatable .bubble{position:relative;width:185px;-webkit-border-radius:5px;border-radius:5px;background-clip:padding-box;box-shadow:0 1px 10px rgba(50,50,50,.7)}#app-content #app-content-wrapper .actions.creatable .bubble ul li{padding-left:10px}#app-content #app-content-wrapper .actions.creatable .bubble ul .menuitem{font-size:12px;display:inline}#app-content #app-content-wrapper .actions.creatable .bubble:after{right:inherit;left:10px;top:-19px}#app-content #app-content-wrapper .viewModes{float:right;margin-right:5px;margin-top:3px}#app-content #app-content-wrapper .viewModes .view-mode:first-child{-webkit-border-bottom-left-radius:5px;border-bottom-left-radius:5px;-webkit-border-top-left-radius:5px;border-top-left-radius:5px;background-clip:padding-box;border:1px solid rgba(240,240,240,.9)}#app-content #app-content-wrapper .viewModes .view-mode:last-child{-webkit-border-bottom-right-radius:5px;border-bottom-right-radius:5px;-webkit-border-top-right-radius:5px;border-top-right-radius:5px;background-clip:padding-box;border:1px solid rgba(240,240,240,.9)}#app-content #app-content-wrapper .viewModes .view-mode{background-color:rgba(240,240,240,.9);cursor:pointer;display:inline-block;padding:7px}#app-content #app-content-wrapper .viewModes .view-mode.active{display:inline-block;padding:7px;background-color:rgba(226,226,226,.9)}#app-content #app-content-wrapper .searchboxContainer{display:inline-block;margin-right:14px;float:right}#app-content #app-content-wrapper .searchboxContainer .searchbox{display:inline-block}#app-content #app-content-wrapper .searchboxContainer .searchclear{color:#ccc;cursor:pointer;font-size:18px;height:14px;margin:auto;position:absolute!important;right:10px;top:12px;z-index:99999999}#app-content #app-content-wrapper .searchboxContainer .searchOptions{position:relative;bottom:5px;background:#fff;border:1px solid #ddd;padding:5px;width:calc(100% - 3px);box-shadow:3px 3px 5px #888;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;background-clip:padding-box}#app-content #app-content-wrapper .credential-table{width:100%;margin-top:44px}#app-content #app-content-wrapper .credential-table tr:hover{background-color:#f5f5f5}#app-content #app-content-wrapper .credential-table tr.selected{background-color:#f8f8f8}#app-content #app-content-wrapper .credential-table tr td{cursor:pointer;padding:5px;border-bottom:1px solid #eee}#app-content #app-content-wrapper .credential-table tr td .icon{font-size:19px;float:left;margin-right:5px;margin-left:3px}#app-content #app-content-wrapper .credential-table tr td .icon-more{display:inline-block;float:right;margin-left:5px;margin-top:1px;opacity:.4;height:20px;width:32px;cursor:pointer}#app-content #app-content-wrapper .credential-table tr td .icon-more:hover{opacity:1}#app-content #app-content-wrapper .credential-table tr td .popovermenu{margin-top:25px;height:100px;width:100px;right:-2px!important;box-shadow:0 1px 10px rgba(50,50,50,.7)}#app-content #app-content-wrapper .credential-table tr td .popovermenu ul{display:block;width:100px;height:75px}#app-content #app-content-wrapper .credential-table tr td .popovermenu ul li{padding:0}#app-content #app-content-wrapper .credential-table tr td .popovermenu ul .menuitem{font-size:12px;display:inline}#app-content #app-content-wrapper .credential-table tr td .popovermenu .action{padding:10px;margin:-10px}#app-content #app-content-wrapper .tags{float:right}#app-content #app-content-wrapper .edit_credential .password_settings label .label,#app-content #app-content-wrapper .edit_credential .tags{float:left}#app-content #app-content-wrapper .tags .tag{background-color:rgba(240,240,240,.9);padding:4px;font-size:12px;margin-right:3px;-webkit-border-radius:5px;border-radius:5px;background-clip:padding-box}#app-content #app-content-wrapper .tags .tag:last-child{margin-right:8px}#app-content #app-content-wrapper .grid-view{margin-top:44px;display:flex;flex-wrap:wrap}#app-content #app-content-wrapper .grid-view .credential{display:flex;width:100%;border:2px solid rgba(240,240,240,.9);margin:25px;-webkit-border-radius:10px;border-radius:10px;background-clip:padding-box}#app-content #app-content-wrapper .grid-view .credential .credential_content{display:flex;padding:2px;flex-direction:column;width:100%;cursor:pointer;font-size:1.75em;text-align:center}#app-content #app-content-wrapper .grid-view .credential .credential_content .label{padding-top:.5em;padding-left:1em;padding-right:1em;line-height:1.3em;word-wrap:break-word}#app-content #app-content-wrapper .grid-view .credential .credential_content .tags{margin-bottom:.5em}#app-content #app-content-wrapper .grid-view .credential .credential_content .tags .tag{color:#000!important;margin-top:5px;display:inline-block}@media all and (min-width:40em){#app-content #app-content-wrapper .grid-view .credential{width:40%}}@media all and (min-width:58em){#app-content #app-content-wrapper .grid-view .credential{width:26%}}@media all and (min-width:78em){#app-content #app-content-wrapper .grid-view .credential{width:20%}}#app-content #app-content-wrapper .edit_credential input[type=password],#app-content #app-content-wrapper .edit_credential input[type=text],#app-content #app-content-wrapper .edit_credential tags-input .tags{width:100%}#app-content #app-content-wrapper .edit_credential{padding-top:10px}#app-content #app-content-wrapper .edit_credential label{display:block}#app-content #app-content-wrapper .edit_credential .tags .tag{background-color:rgba(240,240,240,.9);padding:4px;font-size:11px}#app-content #app-content-wrapper .edit_credential .credential_textarea{width:100%;height:100px}#app-content #app-content-wrapper .edit_credential .password_settings label{overflow:hidden}#app-content #app-content-wrapper .edit_credential .password_settings label input[type=checkbox]{width:auto!important;float:left}#app-content #app-content-wrapper .edit_credential .password_settings label .label.sm{font-size:12px}#app-content #app-content-wrapper .edit_credential .field-value .valueInput{padding-right:0}#app-content #app-content-wrapper .edit_credential .field-value .valueInput .pw-gen .generate_pw .cell:last-child,#app-content #app-content-wrapper .edit_credential .field-value .valueInput input{-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-webkit-border-top-right-radius:0;border-top-right-radius:0;background-clip:padding-box}#app-content #app-content-wrapper .edit_credential .field-value .selectType{padding-left:0;margin-left:-4px}#app-content #app-content-wrapper .edit_credential .field-value .selectType select{-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;background-clip:padding-box}#app-content #app-content-wrapper .edit_credential .custom_fields,#app-content #app-content-wrapper .edit_credential .files{margin-top:10px}#app-content #app-content-wrapper .edit_credential .custom_fields table,#app-content #app-content-wrapper .edit_credential .files table{width:100%}#app-content #app-content-wrapper .edit_credential .custom_fields table thead th.dragger,#app-content #app-content-wrapper .edit_credential .files table thead th.dragger{width:3%}#app-content #app-content-wrapper .edit_credential .custom_fields table thead th,#app-content #app-content-wrapper .edit_credential .files table thead th{color:#fff}.error,.shared_table .fa-trash:hover{color:#ce3702}#app-content #app-content-wrapper .edit_credential .custom_fields table thead th.field_actions,#app-content #app-content-wrapper .edit_credential .files table thead th.field_actions{width:15%}#app-content #app-content-wrapper .edit_credential .custom_fields table tr:hover,#app-content #app-content-wrapper .edit_credential .files table tr:hover{background-color:transparent}#app-content #app-content-wrapper .edit_credential .custom_fields table tr td.dragger,#app-content #app-content-wrapper .edit_credential .files table tr td.dragger{width:3%;text-align:center;cursor:move;cursor:-webkit-grab;cursor:-moz-grab;cursor:grab}#app-content #app-content-wrapper .edit_credential .custom_fields table tr td.field_actions,#app-content #app-content-wrapper .edit_credential .files table tr td.field_actions{font-size:13px;width:15%}#app-content #app-content-wrapper .edit_credential .custom_fields table tr td.field_actions i,#app-content #app-content-wrapper .edit_credential .files table tr td.field_actions i{cursor:pointer}#app-content #app-content-wrapper .edit_credential .custom_fields table tr td,#app-content #app-content-wrapper .edit_credential .custom_fields table tr th,#app-content #app-content-wrapper .edit_credential .files table tr td,#app-content #app-content-wrapper .edit_credential .files table tr th{width:20%;padding:5px}#app-content #app-content-wrapper .edit_credential .custom_fields table tr td .editable-has-buttons.editable-input,#app-content #app-content-wrapper .edit_credential .custom_fields table tr th .editable-has-buttons.editable-input,#app-content #app-content-wrapper .edit_credential .files table tr td .editable-has-buttons.editable-input,#app-content #app-content-wrapper .edit_credential .files table tr th .editable-has-buttons.editable-input{width:55%}#app-content #app-content-wrapper .edit_credential .custom_fields table tr td,#app-content #app-content-wrapper .edit_credential .files table tr td{height:50px;vertical-align:middle}#app-content #app-content-wrapper .app_sidebar{padding:10px;overflow-y:auto}#app-content #app-content-wrapper .app_sidebar h2{margin-bottom:10px;font-weight:400;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:90%}#app-content #app-content-wrapper .app_sidebar .close.icon-close{position:absolute;top:10px;right:10px;cursor:pointer}#app-content #app-content-wrapper .app_sidebar.item_selected{height:25%;display:inline-block}#app-content #app-content-wrapper .app_sidebar .credential-data .row{margin-bottom:11px}#app-content #app-content-wrapper .app_sidebar .credential-data .tags{margin-top:15px;margin-bottom:15px;float:none}#app-content #app-content-wrapper .app_sidebar .credential-data .tags .tag{background-color:rgba(240,240,240,.9);padding:4px;margin-right:3px}.credential_field .tools .cell,.inputfile+label{margin-right:4px;cursor:pointer}.credential_field{overflow:hidden}.credential_field .cell,.credential_field .value{float:left}.credential_field .value{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:70%}.credential_field .tools{margin-left:10px;overflow:hidden;float:left}.progress{margin-top:10px;height:20px}.progress .progress-bar{position:relative;height:20px;background-image:none;background-color:#0082c9}.progress .progress-bar .progress-label{position:absolute;top:0;z-index:2;text-align:center;width:100%}.loaderContainer{height:140px;width:120px;margin-top:30px;margin-left:-60px;top:50%;left:50%;position:absolute}.loaderContainer .text{width:120px;text-align:center}.loader{border-bottom:10px solid #1d2d44;border-left:10px solid #c9c9c9;border-right:10px solid #c9c9c9;border-top:10px solid #c9c9c9;height:120px;width:120px;border-radius:120px;animation:1.1s linear 0s normal none infinite running load8}@keyframes load8{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}.inputfile{width:.1px;height:.1px;opacity:0;overflow:hidden;position:absolute;z-index:-1}#app-navigation li a tags-input,#app-navigation li a.taginput{opacity:1}.inputfile+label{font-size:1.25em;background-color:rgba(240,240,240,.9);margin-top:4px;padding:5px;border-right:1px solid #c9c9c9}.inputfile+label:hover,.inputfile:focus+label{background-color:#c9c9c9}.settings-container div{padding-left:15px}.nav-trashbin{position:fixed!important;bottom:44px;width:inherit!important;background-color:#fff;border-right:1px solid #eee}.nav-trashbin a{padding:0 20px}.nav-trashbin a .fa{margin-right:15px}#app-navigation li a{overflow:visible}#app-navigation li a tags-input li{width:auto!important}#app-navigation>ul ul{display:inherit!important}.sharing_table td:first-child{width:55%}.sharing_table td:first-child tags-input .tags,.table{width:100%}.sharing_table td:first-child .autocomplete{margin-top:35px}.share_credential{padding-top:10px}.share_credential input{width:auto}.share_credential>div{margin-bottom:10px}.shared_table .fa-trash{cursor:pointer}.scan-result-table{margin-top:10px}.scan-result-table .score{padding-left:0;padding-right:15px}.import_log{max-height:600px;overflow-y:auto}.import_log textarea{width:90%;height:200px}#app-settings-content:not(.ng-hide){height:60px;display:inherit!important;padding:0;transition:height .15s ease-out}#app-settings-content.ng-hide{display:inherit!important;height:0;padding:0;transition:height .15s ease-in}.ui-dialog{z-index:9999}#notification .row{margin-left:0!important;margin-right:0!important}#passman-controls{position:fixed;top:45px;right:0;left:0;padding:0!important;margin:0;background-color:rgba(255,255,255,.95);z-index:50;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;height:44px!important}@media only screen and (max-width:768px){#passman-controls{width:100%}}@media only screen and (min-width:768px){#app-navigation+#app-content #passman-controls{left:250px;width:calc(100% - 250px)!important}}#passman-controls,#passman-controls .button,#passman-controls input[type=submit],#passman-controls input[type=text],#passman-controls input[type=password],#passman-controls select{box-sizing:border-box;display:inline-block;height:36px;padding:7px 10px}.nopadding{padding-right:0;padding-left:0} \ No newline at end of file diff --git a/img/app.svg b/img/app.svg index 4c8bb1b7..89d40a0e 100644 --- a/img/app.svg +++ b/img/app.svg @@ -1,7 +1 @@ - - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/js/passman.min.js b/js/passman.min.js index f56c01c6..a488b9b9 100644 --- a/js/passman.min.js +++ b/js/passman.min.js @@ -1,4 +1,4 @@ -/*! Passman 2016-12-28 */ +/*! Passman 2017-01-06 */ function _a1(b,a){this.count=b,this._fc=a,this.__defineGetter__("Count",function(){return this.count}),this.__defineGetter__("_dm",function(){return this._fc})}function _a2(a,c,b){this._bm=a,b?this._do=new Array(c,b):this._do=new Array(c),this.__defineGetter__("_bo",function(){return this._bm}),this.__defineGetter__("_dn",function(){return this._bm*this._fo}),this.__defineGetter__("_fo",function(){for(var e=0,d=0;d6&&(o._bq(r-11,0,3,6),o._bq(0,r-11,6,3)),o},this._bu=function(i){return this._do[i.ordinal()]}}function _ay(){return new Array(new _a3(1,new Array,new _a2(7,new _a1(1,19)),new _a2(10,new _a1(1,16)),new _a2(13,new _a1(1,13)),new _a2(17,new _a1(1,9))),new _a3(2,new Array(6,18),new _a2(10,new _a1(1,34)),new _a2(16,new _a1(1,28)),new _a2(22,new _a1(1,22)),new _a2(28,new _a1(1,16))),new _a3(3,new Array(6,22),new _a2(15,new _a1(1,55)),new _a2(26,new _a1(1,44)),new _a2(18,new _a1(2,17)),new _a2(22,new _a1(2,13))),new _a3(4,new Array(6,26),new _a2(20,new _a1(1,80)),new _a2(18,new _a1(2,32)),new _a2(26,new _a1(2,24)),new _a2(16,new _a1(4,9))),new _a3(5,new Array(6,30),new _a2(26,new _a1(1,108)),new _a2(24,new _a1(2,43)),new _a2(18,new _a1(2,15),new _a1(2,16)),new _a2(22,new _a1(2,11),new _a1(2,12))),new _a3(6,new Array(6,34),new _a2(18,new _a1(2,68)),new _a2(16,new _a1(4,27)),new _a2(24,new _a1(4,19)),new _a2(28,new _a1(4,15))),new _a3(7,new Array(6,22,38),new _a2(20,new _a1(2,78)),new _a2(18,new _a1(4,31)),new _a2(18,new _a1(2,14),new _a1(4,15)),new _a2(26,new _a1(4,13),new _a1(1,14))),new _a3(8,new Array(6,24,42),new _a2(24,new _a1(2,97)),new _a2(22,new _a1(2,38),new _a1(2,39)),new _a2(22,new _a1(4,18),new _a1(2,19)),new _a2(26,new _a1(4,14),new _a1(2,15))),new _a3(9,new Array(6,26,46),new _a2(30,new _a1(2,116)),new _a2(22,new _a1(3,36),new _a1(2,37)),new _a2(20,new _a1(4,16),new _a1(4,17)),new _a2(24,new _a1(4,12),new _a1(4,13))),new _a3(10,new Array(6,28,50),new _a2(18,new _a1(2,68),new _a1(2,69)),new _a2(26,new _a1(4,43),new _a1(1,44)),new _a2(24,new _a1(6,19),new _a1(2,20)),new _a2(28,new _a1(6,15),new _a1(2,16))),new _a3(11,new Array(6,30,54),new _a2(20,new _a1(4,81)),new _a2(30,new _a1(1,50),new _a1(4,51)),new _a2(28,new _a1(4,22),new _a1(4,23)),new _a2(24,new _a1(3,12),new _a1(8,13))),new _a3(12,new Array(6,32,58),new _a2(24,new _a1(2,92),new _a1(2,93)),new _a2(22,new _a1(6,36),new _a1(2,37)),new _a2(26,new _a1(4,20),new _a1(6,21)),new _a2(28,new _a1(7,14),new _a1(4,15))),new _a3(13,new Array(6,34,62),new _a2(26,new _a1(4,107)),new _a2(22,new _a1(8,37),new _a1(1,38)),new _a2(24,new _a1(8,20),new _a1(4,21)),new _a2(22,new _a1(12,11),new _a1(4,12))),new _a3(14,new Array(6,26,46,66),new _a2(30,new _a1(3,115),new _a1(1,116)),new _a2(24,new _a1(4,40),new _a1(5,41)),new _a2(20,new _a1(11,16),new _a1(5,17)),new _a2(24,new _a1(11,12),new _a1(5,13))),new _a3(15,new Array(6,26,48,70),new _a2(22,new _a1(5,87),new _a1(1,88)),new _a2(24,new _a1(5,41),new _a1(5,42)),new _a2(30,new _a1(5,24),new _a1(7,25)),new _a2(24,new _a1(11,12),new _a1(7,13))),new _a3(16,new Array(6,26,50,74),new _a2(24,new _a1(5,98),new _a1(1,99)),new _a2(28,new _a1(7,45),new _a1(3,46)),new _a2(24,new _a1(15,19),new _a1(2,20)),new _a2(30,new _a1(3,15),new _a1(13,16))),new _a3(17,new Array(6,30,54,78),new _a2(28,new _a1(1,107),new _a1(5,108)),new _a2(28,new _a1(10,46),new _a1(1,47)),new _a2(28,new _a1(1,22),new _a1(15,23)),new _a2(28,new _a1(2,14),new _a1(17,15))),new _a3(18,new Array(6,30,56,82),new _a2(30,new _a1(5,120),new _a1(1,121)),new _a2(26,new _a1(9,43),new _a1(4,44)),new _a2(28,new _a1(17,22),new _a1(1,23)),new _a2(28,new _a1(2,14),new _a1(19,15))),new _a3(19,new Array(6,30,58,86),new _a2(28,new _a1(3,113),new _a1(4,114)),new _a2(26,new _a1(3,44),new _a1(11,45)),new _a2(26,new _a1(17,21),new _a1(4,22)),new _a2(26,new _a1(9,13),new _a1(16,14))),new _a3(20,new Array(6,34,62,90),new _a2(28,new _a1(3,107),new _a1(5,108)),new _a2(26,new _a1(3,41),new _a1(13,42)),new _a2(30,new _a1(15,24),new _a1(5,25)),new _a2(28,new _a1(15,15),new _a1(10,16))),new _a3(21,new Array(6,28,50,72,94),new _a2(28,new _a1(4,116),new _a1(4,117)),new _a2(26,new _a1(17,42)),new _a2(28,new _a1(17,22),new _a1(6,23)),new _a2(30,new _a1(19,16),new _a1(6,17))),new _a3(22,new Array(6,26,50,74,98),new _a2(28,new _a1(2,111),new _a1(7,112)),new _a2(28,new _a1(17,46)),new _a2(30,new _a1(7,24),new _a1(16,25)),new _a2(24,new _a1(34,13))),new _a3(23,new Array(6,30,54,74,102),new _a2(30,new _a1(4,121),new _a1(5,122)),new _a2(28,new _a1(4,47),new _a1(14,48)),new _a2(30,new _a1(11,24),new _a1(14,25)),new _a2(30,new _a1(16,15),new _a1(14,16))),new _a3(24,new Array(6,28,54,80,106),new _a2(30,new _a1(6,117),new _a1(4,118)),new _a2(28,new _a1(6,45),new _a1(14,46)),new _a2(30,new _a1(11,24),new _a1(16,25)),new _a2(30,new _a1(30,16),new _a1(2,17))),new _a3(25,new Array(6,32,58,84,110),new _a2(26,new _a1(8,106),new _a1(4,107)),new _a2(28,new _a1(8,47),new _a1(13,48)),new _a2(30,new _a1(7,24),new _a1(22,25)),new _a2(30,new _a1(22,15),new _a1(13,16))),new _a3(26,new Array(6,30,58,86,114),new _a2(28,new _a1(10,114),new _a1(2,115)),new _a2(28,new _a1(19,46),new _a1(4,47)),new _a2(28,new _a1(28,22),new _a1(6,23)),new _a2(30,new _a1(33,16),new _a1(4,17))),new _a3(27,new Array(6,34,62,90,118),new _a2(30,new _a1(8,122),new _a1(4,123)),new _a2(28,new _a1(22,45),new _a1(3,46)),new _a2(30,new _a1(8,23),new _a1(26,24)),new _a2(30,new _a1(12,15),new _a1(28,16))),new _a3(28,new Array(6,26,50,74,98,122),new _a2(30,new _a1(3,117),new _a1(10,118)),new _a2(28,new _a1(3,45),new _a1(23,46)),new _a2(30,new _a1(4,24),new _a1(31,25)),new _a2(30,new _a1(11,15),new _a1(31,16))),new _a3(29,new Array(6,30,54,78,102,126),new _a2(30,new _a1(7,116),new _a1(7,117)),new _a2(28,new _a1(21,45),new _a1(7,46)),new _a2(30,new _a1(1,23),new _a1(37,24)),new _a2(30,new _a1(19,15),new _a1(26,16))),new _a3(30,new Array(6,26,52,78,104,130),new _a2(30,new _a1(5,115),new _a1(10,116)),new _a2(28,new _a1(19,47),new _a1(10,48)),new _a2(30,new _a1(15,24),new _a1(25,25)),new _a2(30,new _a1(23,15),new _a1(25,16))),new _a3(31,new Array(6,30,56,82,108,134),new _a2(30,new _a1(13,115),new _a1(3,116)),new _a2(28,new _a1(2,46),new _a1(29,47)),new _a2(30,new _a1(42,24),new _a1(1,25)),new _a2(30,new _a1(23,15),new _a1(28,16))),new _a3(32,new Array(6,34,60,86,112,138),new _a2(30,new _a1(17,115)),new _a2(28,new _a1(10,46),new _a1(23,47)),new _a2(30,new _a1(10,24),new _a1(35,25)),new _a2(30,new _a1(19,15),new _a1(35,16))),new _a3(33,new Array(6,30,58,86,114,142),new _a2(30,new _a1(17,115),new _a1(1,116)),new _a2(28,new _a1(14,46),new _a1(21,47)),new _a2(30,new _a1(29,24),new _a1(19,25)),new _a2(30,new _a1(11,15),new _a1(46,16))),new _a3(34,new Array(6,34,62,90,118,146),new _a2(30,new _a1(13,115),new _a1(6,116)),new _a2(28,new _a1(14,46),new _a1(23,47)),new _a2(30,new _a1(44,24),new _a1(7,25)),new _a2(30,new _a1(59,16),new _a1(1,17))),new _a3(35,new Array(6,30,54,78,102,126,150),new _a2(30,new _a1(12,121),new _a1(7,122)),new _a2(28,new _a1(12,47),new _a1(26,48)),new _a2(30,new _a1(39,24),new _a1(14,25)),new _a2(30,new _a1(22,15),new _a1(41,16))),new _a3(36,new Array(6,24,50,76,102,128,154),new _a2(30,new _a1(6,121),new _a1(14,122)),new _a2(28,new _a1(6,47),new _a1(34,48)),new _a2(30,new _a1(46,24),new _a1(10,25)),new _a2(30,new _a1(2,15),new _a1(64,16))),new _a3(37,new Array(6,28,54,80,106,132,158),new _a2(30,new _a1(17,122),new _a1(4,123)),new _a2(28,new _a1(29,46),new _a1(14,47)),new _a2(30,new _a1(49,24),new _a1(10,25)),new _a2(30,new _a1(24,15),new _a1(46,16))),new _a3(38,new Array(6,32,58,84,110,136,162),new _a2(30,new _a1(4,122),new _a1(18,123)),new _a2(28,new _a1(13,46),new _a1(32,47)),new _a2(30,new _a1(48,24),new _a1(14,25)),new _a2(30,new _a1(42,15),new _a1(32,16))),new _a3(39,new Array(6,26,54,82,110,138,166),new _a2(30,new _a1(20,117),new _a1(4,118)),new _a2(28,new _a1(40,47),new _a1(7,48)),new _a2(30,new _a1(43,24),new _a1(22,25)),new _a2(30,new _a1(10,15),new _a1(67,16))),new _a3(40,new Array(6,30,58,86,114,142,170),new _a2(30,new _a1(19,118),new _a1(6,119)),new _a2(28,new _a1(18,47),new _a1(31,48)),new _a2(30,new _a1(34,24),new _a1(34,25)),new _a2(30,new _a1(20,15),new _a1(61,16))))}function _ae(i,f,c,h,e,b,g,d,a){this.a11=i,this.a12=h,this.a13=g,this.a21=f,this.a22=e,this.a23=d,this.a31=c,this.a32=b,this.a33=a,this._ad=function(w){for(var t=w.length,A=this.a11,z=this.a12,v=this.a13,r=this.a21,q=this.a22,o=this.a23,m=this.a31,k=this.a32,j=this.a33,n=0;nMath.abs(c-m);if(d){var s=m;m=l,l=s,s=c,c=b,b=s}for(var j=Math.abs(c-m),i=Math.abs(b-l),q=-j>>1,v=l0){if(g==b)break;g+=v,q-=j}}var k=c-m,r=b-l;return Math.sqrt(k*k+r*r)},this._bh=function(i,g,h,f){var b=this._bi(i,g,h,f),e=1,d=i-(h-i);d<0?(e=i/(i-d),d=0):d>=qrcode.width&&(e=(qrcode.width-1-i)/(d-i),d=qrcode.width-1);var c=Math.floor(g-(f-g)*e);return e=1,c<0?(e=g/(g-c),c=0):c>=qrcode.height&&(e=(qrcode.height-1-g)/(c-g),c=qrcode.height-1),d=Math.floor(i+(d-i)*e),b+=this._bi(i,g,d,c),b-1},this._bj=function(c,d){var b=this._bh(Math.floor(c.X),Math.floor(c.Y),Math.floor(d.X),Math.floor(d.Y)),e=this._bh(Math.floor(d.X),Math.floor(d.Y),Math.floor(c.X),Math.floor(c.Y));return isNaN(b)?e/7:isNaN(e)?b/7:(b+e)/14},this._bk=function(d,c,b){return(this._bj(d,c)+this._bj(d,b))/2},this.distance=function(c,b){return xDiff=c.X-b.X,yDiff=c.Y-b.Y,Math.sqrt(xDiff*xDiff+yDiff*yDiff)},this._bx=function(g,f,d,e){var b=Math.round(this.distance(g,f)/e),c=Math.round(this.distance(g,d)/e),h=(b+c>>1)+7;switch(3&h){case 0:h++;break;case 2:h--;break;case 3:throw"Error"}return h},this._bl=function(g,f,d,j){var k=Math.floor(j*g),h=Math.max(0,f-k),i=Math.min(qrcode.width-1,f+k);if(i-h<3*g)throw"Error";var b=Math.max(0,d-k),c=Math.min(qrcode.height-1,d+k),e=new _ak(this.image,h,b,i-h,c-b,g,this._am);return e.find()},this.createTransform=function(l,h,k,b,g){var i,f,e,c,j=g-3.5;null!=b?(i=b.X,f=b.Y,e=c=j-3):(i=h.X-l.X+k.X,f=h.Y-l.Y+k.Y,e=c=j);var d=_ae._ag(3.5,3.5,j,3.5,e,c,3.5,j,l.X,l.Y,h.X,h.Y,i,f,k.X,k.Y);return d},this._bz=function(e,b,d){var c=_aa;return c._af(e,d,b)},this._cd=function(r){var j=r._gq,h=r._gs,n=r._gp,d=this._bk(j,h,n);if(d<1)throw"Error";var s=this._bx(j,h,n,d),b=_a3._at(s),k=b._cr-7,l=null;if(b._as.length>0)for(var f=h.X-j.X+n.X,e=h.Y-j.Y+n.Y,c=1-3/k,u=Math.floor(j.X+c*(f-j.X)),t=Math.floor(j.Y+c*(e-j.Y)),q=4;q<=16;q<<=1){l=this._bl(d,u,t,q);break}var o,g=this.createTransform(j,h,n,l,s),m=this._bz(this.image,g,s);return o=null==l?new Array(n,j,h):new Array(n,j,h,l),new _bg(m,o)},this.detect=function(){var b=(new _cc)._ce(this.image);return this._cd(b)}}function _ax(a){this._cf=_cg.forBits(a>>3&3),this._fe=7&a,this.__defineGetter__("_cg",function(){return this._cf}),this.__defineGetter__("_dx",function(){return this._fe}),this.GetHashCode=function(){return this._cf.ordinal()<<3|_fe},this.Equals=function(c){var b=c;return this._cf==b._cf&&this._fe==b._fe}}function _cg(a,c,b){this._ff=a,this.bits=c,this.name=b,this.__defineGetter__("Bits",function(){return this.bits}),this.__defineGetter__("Name",function(){return this.name}),this.ordinal=function(){return this._ff}}function _ac(d,a){if(a||(a=d),d<1||a<1)throw"Both dimensions must be greater than 0";this.width=d,this.height=a;var c=d>>5;0!=(31&d)&&c++,this.rowSize=c,this.bits=new Array(c*a);for(var b=0;b>5);return 0!=(1&_ew(this.bits[f],31&e))},this._dq=function(e,g){var f=g*this.rowSize+(e>>5);this.bits[f]|=1<<(31&e)},this.flip=function(e,g){var f=g*this.rowSize+(e>>5);this.bits[f]^=1<<(31&e)},this.clear=function(){for(var e=this.bits.length,f=0;fthis.height||l>this.width)throw"The region must fit inside the matrix";for(var i=j;i>5)]|=1<<(31&k)}}function _dl(a,b){this._dv=a,this._dw=b,this.__defineGetter__("_du",function(){return this._dv}),this.__defineGetter__("Codewords",function(){return this._dw})}function _cl(a){var b=a.Dimension;if(b<21||1!=(3&b))throw"Error _cl";this._au=a,this._cp=null,this._co=null,this._dk=function(d,c,e){return this._au._ds(d,c)?e<<1|1:e<<1},this._cm=function(){if(null!=this._co)return this._co;for(var g=0,e=0;e<6;e++)g=this._dk(e,8,g);g=this._dk(7,8,g),g=this._dk(8,8,g),g=this._dk(8,7,g);for(var c=5;c>=0;c--)g=this._dk(8,c,g);if(this._co=_ax._ci(g),null!=this._co)return this._co;var f=this._au.Dimension;g=0;for(var d=f-8,e=f-1;e>=d;e--)g=this._dk(e,8,g);for(var c=f-7;c>2;if(f<=6)return _a3._av(f);for(var g=0,e=h-11,c=5;c>=0;c--)for(var d=h-9;d>=e;d--)g=this._dk(d,c,g);if(this._cp=_a3._aw(g),null!=this._cp&&this._cp._cr==h)return this._cp;g=0;for(var d=5;d>=0;d--)for(var c=h-9;c>=e;c--)g=this._dk(d,c,g);if(this._cp=_a3._aw(g),null!=this._cp&&this._cp._cr==h)return this._cp;throw"Error _cq"},this._gk=function(){var r=this._cm(),o=this._cq(),c=_dx._gl(r._dx),f=this._au.Dimension;c._dj(this._au,f);for(var k=o._aq(),n=!0,s=new Array(o._dp),m=0,q=0,h=0,e=f-1;e>0;e-=2){6==e&&e--;for(var l=0;l=Math.floor(R/2);){var rLastLast=rLast,_ga=sLast,_gb=tLast;if(rLast=r,sLast=s,tLast=t,rLast.Zero)throw"r_{i-1} was zero";r=rLastLast;for(var q=this._fa.Zero,_df=rLast._ex(rLast._ec),_fy=this._fa.inverse(_df);r._ec>=rLast._ec&&!r.Zero;){var _fx=r._ec-rLast._ec,scale=this._fa.multiply(r._ex(r._ec),_fy);q=q._bd(this._fa._ba(_fx,scale)),r=r._bd(rLast._dc(_fx,scale))}s=q.multiply1(sLast)._bd(_ga),t=q.multiply1(tLast)._bd(_gb)}var _de=t._ex(0);if(0==_de)throw"ReedSolomonException sigmaTilde(0) was zero";var inverse=this._fa.inverse(_de),sigma=t.multiply2(inverse),omega=r.multiply2(inverse);return new Array(sigma,omega)},this._ey=function(_ez){var _fz=_ez._ec;if(1==_fz)return new Array(_ez._ex(1));for(var result=new Array(_fz),e=0,i=1;i<256&&e<_fz;i++)0==_ez.evaluateAt(i)&&(result[e]=this._fa.inverse(i),e++);if(e!=_fz)throw"Error locator degree does not match number of roots";return result},this._di=function(_fs,_dz,_fq){for(var s=_dz.length,result=new Array(s),i=0;i1&&0==e[0]){for(var d=1;dn.length){var j=o;o=n,n=j}for(var h=new Array(n.length),k=n.length-o.length,m=0;m=l._ec&&!o.Zero;){var m=o._ec-l._ec,h=this._fa.multiply(o._ex(o._ec),n),i=l._dc(m,h),k=this._fa._ba(m,h);j=j._bd(k),o=o._bd(i)}return new Array(j,o)}}function _az(b){this._gh=new Array(256),this._gi=new Array(256);for(var a=1,e=0;e<256;e++)this._gh[e]=a,a<<=1,a>=256&&(a^=b);for(var e=0;e<255;e++)this._gi[this._gh[e]]=e;var d=new Array(1);d[0]=0,this.zero=new _bp(this,new Array(d));var c=new Array(1);c[0]=1,this.one=new _bp(this,new Array(c)),this.__defineGetter__("Zero",function(){return this.zero}),this.__defineGetter__("One",function(){return this.one}),this._ba=function(j,f){if(j<0)throw"bad arguments";if(0==f)return zero;for(var h=new Array(j+1),g=0;g=0?a>>b:(a>>b)+(2<<~b)}function _cz(c,a,b){this.x=c,this.y=a,this.count=1,this._aj=b,this.__defineGetter__("_ei",function(){return this._aj}),this.__defineGetter__("Count",function(){return this.count}),this.__defineGetter__("X",function(){return this.x}),this.__defineGetter__("Y",function(){return this.y}),this._ek=function(){this.count++},this._ev=function(f,e,d){if(Math.abs(e-this.y)<=f&&Math.abs(d-this.x)<=f){var g=Math.abs(f-this._aj);return g<=1||g/this._aj<=1}return!1}}function _es(a){this._go=a[0],this._gu=a[1],this._gr=a[2],this.__defineGetter__("_gp",function(){return this._go}),this.__defineGetter__("_gq",function(){return this._gu}),this.__defineGetter__("_gs",function(){return this._gr})}function _cc(){this.image=null,this._cv=[],this._ge=!1,this._al=new Array(0,0,0,0,0),this._am=null,this.__defineGetter__("_da",function(){return this._al[0]=0,this._al[1]=0,this._al[2]=0,this._al[3]=0,this._al[4]=0,this._al}),this._ao=function(f){for(var b=0,d=0;d<5;d++){var e=f[d];if(0==e)return!1;b+=e}if(b<7)return!1;var c=Math.floor((b<<_el)/7),a=Math.floor(c/2);return Math.abs(c-(f[0]<<_el))=0&&c[j+f*qrcode.width];)b[2]++,f--;if(f<0)return NaN;for(;f>=0&&!c[j+f*qrcode.width]&&b[1]<=d;)b[1]++,f--;if(f<0||b[1]>d)return NaN;for(;f>=0&&c[j+f*qrcode.width]&&b[0]<=d;)b[0]++,f--;if(b[0]>d)return NaN;for(f=a+1;f=d)return NaN;for(;f=d)return NaN;var e=b[0]+b[1]+b[2]+b[3]+b[4];return 5*Math.abs(e-g)>=2*g?NaN:this._ao(b)?this._an(b,f):NaN},this._ej=function(b,a,e,h){for(var d=this.image,i=qrcode.width,c=this._da,g=b;g>=0&&d[g+a*qrcode.width];)c[2]++,g--;if(g<0)return NaN;for(;g>=0&&!d[g+a*qrcode.width]&&c[1]<=e;)c[1]++,g--;if(g<0||c[1]>e)return NaN;for(;g>=0&&d[g+a*qrcode.width]&&c[0]<=e;)c[0]++,g--;if(c[0]>e)return NaN;for(g=b+1;g=e)return NaN;for(;g=e)return NaN;var f=c[0]+c[1]+c[2]+c[3]+c[4];return 5*Math.abs(f-h)>=h?NaN:this._ao(c)?this._an(c,g):NaN},this._cu=function(c,f,e){var d=c[0]+c[1]+c[2]+c[3]+c[4],n=this._an(c,e),b=this._ap(f,Math.floor(n),c[2],d);if(!isNaN(b)&&(n=this._ej(Math.floor(n),Math.floor(b),c[2],d),!isNaN(n))){for(var l=d/7,m=!1,h=this._cv.length,g=0;g3){for(var b=0,c=0;c3;c++){var e=this._cv[c];Math.abs(e._ei-d)>.2*d&&(this._cv.remove(c),c--)}}return this._cv.length>3&&this._cv.sort(function(g,f){return g.count>f.count?-1:g.count=_eg){if(null!=c)return this._ge=!0,Math.floor((Math.abs(c.X-a.X)-Math.abs(c.Y-a.Y))/2);c=a}}return 0},this._cx=function(){for(var g=0,c=0,a=this._cv.length,d=0;d=_eg&&(g++,c+=f._ei)}if(g<3)return!1;for(var e=c/a,b=0,d=0;dd[2]&&(h+=m-d[2]-a,f=k-1)}else{do f++;while(f=h)return!1;return!0},this._ap=function(h,r,l,o){var k=this.image,q=qrcode.height,j=this._al;j[0]=0,j[1]=0,j[2]=0;for(var n=h;n>=0&&k[r+n*qrcode.width]&&j[1]<=l;)j[1]++,n--;if(n<0||j[1]>l)return NaN;for(;n>=0&&!k[r+n*qrcode.width]&&j[0]<=l;)j[0]++,n--;if(j[0]>l)return NaN;for(n=h+1;nl)return NaN;for(;nl)return NaN;var m=j[0]+j[1]+j[2];return 5*Math.abs(m-o)>=2*o?NaN:this._ao(j)?this._an(j,n):NaN},this._cu=function(l,o,n){var m=l[0]+l[1]+l[2],u=this._an(l,n),k=this._ap(o,Math.floor(u),2*l[1],m);if(!isNaN(k)){for(var t=(l[0]+l[1]+l[2])/3,r=this._cv.length,q=0;q>1),m=new Array(0,0,0),k=0;k>1:-(k+1>>1));m[0]=0,m[1]=0,m[2]=0;for(var n=q;n=10&&a<=26?this.dataLengthMode=1:a>=27&&a<=40&&(this.dataLengthMode=2),this._gd=function(f){var k=0;if(f>this._cw-f+1,this._cw-=f,k}if(f>8-(f-(this._cw+1)),this._cw=this._cw-f%8,this._cw<0&&(this._cw=8+this._cw),k}if(f>8-(f-(this._cw+1+8));return k=g+d+l,this._cw=this._cw-(f-8)%8,this._cw<0&&(this._cw=8+this._cw),k}return 0},this.NextMode=function(){return this._ed>this.blocks.length-this._en-2?0:this._gd(4)},this.getDataLength=function(d){for(var e=0;;){if(d>>e==1)break;e++}return this._gd(qrcode._eo[this.dataLengthMode][e])},this.getRomanAndFigureString=function(h){var f=h,g=0,j="",d=new Array("0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"," ","$","%","*","+","-",".","/",":");do if(f>1){g=this._gd(11);var i=Math.floor(g/45),e=g%45;j+=d[i],j+=d[e],f-=2}else 1==f&&(g=this._gd(6),j+=d[g],f-=1);while(f>0);return j},this.getFigureString=function(f){var d=f,e=0,g="";do d>=3?(e=this._gd(10),e<100&&(g+="0"),e<10&&(g+="0"),d-=3):2==d?(e=this._gd(7),e<10&&(g+="0"),d-=2):1==d&&(e=this._gd(4),d-=1),g+=e;while(d>0);return g},this.get8bitByteArray=function(g){var e=g,f=0,d=new Array;do f=this._gd(8),d.push(f),e--;while(e>0);return d},this.getKanjiString=function(j){var g=j,i=0,h="";do{i=_gd(13);var e=i%192,f=i/192,k=(f<<8)+e,d=0;d=k+33088<=40956?k+33088:k+49472,h+=String.fromCharCode(d),g--}while(g>0);return h},this.__defineGetter__("DataByte",function(){for(var g=new Array,e=1,f=2,d=4,n=8;;){var k=this.NextMode();if(0==k){if(g.length>0)break;throw"Empty data block"}if(k!=e&&k!=f&&k!=d&&k!=n)throw"Invalid mode: "+k+" in (block:"+this._ed+" bit:"+this._cw+")";if(dataLength=this.getDataLength(k),dataLength<1)throw"Invalid data length: "+dataLength;switch(k){case e:for(var l=this.getFigureString(dataLength),i=new Array(l.length),h=0;h").append(a).html();try{return a[0].nodeType===Ma?Q(d):d.match(/^(<[^>]+>)/)[1].replace(/^<([\w\-]+)/,function(a,b){return"<"+Q(b)})}catch(c){return Q(d)}}function zc(a){try{return decodeURIComponent(a)}catch(b){}}function Ac(a){var b={};return q((a||"").split("&"),function(a){var c,e,f;a&&(e=a=a.replace(/\+/g,"%20"),c=a.indexOf("="),-1!==c&&(e=a.substring(0,c),f=a.substring(c+1)),e=zc(e),w(e)&&(f=!w(f)||zc(f),ua.call(b,e)?L(b[e])?b[e].push(f):b[e]=[b[e],f]:b[e]=f))}),b}function Tb(a){var b=[];return q(a,function(a,c){L(a)?q(a,function(a){b.push(ea(c,!0)+(!0===a?"":"="+ea(a,!0)))}):b.push(ea(c,!0)+(!0===a?"":"="+ea(a,!0)))}),b.length?b.join("&"):""}function qb(a){return ea(a,!0).replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+")}function ea(a,b){return encodeURIComponent(a).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%3B/gi,";").replace(/%20/g,b?"%20":"+")}function ee(a,b){var d,c,e=Na.length;for(c=0;c/,">"))}return b=b||[],b.unshift(["$provide",function(b){b.value("$rootElement",a)}]),d.debugInfoEnabled&&b.push(["$compileProvider",function(a){a.debugInfoEnabled(!0)}]),b.unshift("ng"),c=cb(b,d.strictDi),c.invoke(["$rootScope","$rootElement","$compile","$injector",function(a,b,c,d){a.$apply(function(){b.data("$injector",d),c(b)(a)})}]),c},e=/^NG_ENABLE_DEBUG_INFO!/,f=/^NG_DEFER_BOOTSTRAP!/;return C&&e.test(C.name)&&(d.debugInfoEnabled=!0,C.name=C.name.replace(e,"")),C&&!f.test(C.name)?c():(C.name=C.name.replace(f,""),ca.resumeBootstrap=function(a){return q(a,function(a){b.push(a)}),c()},void(z(ca.resumeDeferredBootstrap)&&ca.resumeDeferredBootstrap()))}function ge(){C.name="NG_ENABLE_DEBUG_INFO!"+C.name,C.location.reload()}function he(a){if(a=ca.element(a).injector(),!a)throw xa("test");return a.get("$$testability")}function Cc(a,b){return b=b||"_",a.replace(ie,function(a,c){return(c?b:"")+a.toLowerCase()})}function je(){var a;if(!Dc){var b=rb();(qa=y(b)?C.jQuery:b?C[b]:void 0)&&qa.fn.on?(F=qa,S(qa.fn,{scope:Oa.scope,isolateScope:Oa.isolateScope,controller:Oa.controller,injector:Oa.injector,inheritedData:Oa.inheritedData}),a=qa.cleanData,qa.cleanData=function(b){for(var c,f,e=0;null!=(f=b[e]);e++)(c=qa._data(f,"events"))&&c.$destroy&&qa(f).triggerHandler("$destroy");a(b)}):F=O,ca.element=F,Dc=!0}}function sb(a,b,d){if(!a)throw xa("areq",b||"?",d||"required");return a}function Pa(a,b,d){return d&&L(a)&&(a=a[a.length-1]),sb(z(a),b,"not a function, got "+(a&&"object"==typeof a?a.constructor.name||"Object":typeof a)),a}function Qa(a,b){if("hasOwnProperty"===a)throw xa("badname",b)}function Ec(a,b,d){if(!b)return a;b=b.split(".");for(var c,e=a,f=b.length,g=0;g")+c[2],c=c[0];c--;)d=d.lastChild;f=$a(f,d.childNodes),d=e.firstChild,d.textContent=""}else f.push(b.createTextNode(a));return e.textContent="",e.innerHTML="",q(f,function(a){e.appendChild(a)}),e}function Pc(a,b){var d=a.parentNode;d&&d.replaceChild(b,a),b.appendChild(a)}function O(a){if(a instanceof O)return a;var b;if(G(a)&&(a=W(a),b=!0),!(this instanceof O)){if(b&&"<"!=a.charAt(0))throw Wb("nosel");return new O(a)}if(b){b=C.document;var d;a=(d=Of.exec(a))?[b.createElement(d[1])]:(d=Oc(a,b))?d.childNodes:[]}Qc(this,a)}function Xb(a){return a.cloneNode(!0)}function wb(a,b){if(b||eb(a),a.querySelectorAll)for(var d=a.querySelectorAll("*"),c=0,e=d.length;c=Ea)&&("function"==typeof a&&/^(?:class\b|constructor\()/.test(Function.prototype.toString.call(a)+" ")),d?(c.unshift(null),new(Function.prototype.bind.apply(a,c))):a.apply(b,c)},instantiate:function(a,b,c){var d=L(a)?a[a.length-1]:a;return a=e(a,b,c),a.unshift(null),new(Function.prototype.bind.apply(d,a))},get:d,annotate:cb.$$annotate,has:function(b){return n.hasOwnProperty(b+"Provider")||a.hasOwnProperty(b)}}}b=!0===b;var k={},l=[],m=new Ra([],!0),n={$provide:{provider:d(c),factory:d(f),service:d(function(a,b){return f(a,["$injector",function(a){return a.instantiate(b)}])}),value:d(function(a,b){return f(a,ha(b),!1)}),constant:d(function(a,b){Qa(a,"constant"),n[a]=b,u[a]=b}),decorator:function(a,b){var c=p.get(a+"Provider"),d=c.$get;c.$get=function(){var a=B.invoke(d,c);return B.invoke(b,null,{$delegate:a})}}}},p=n.$injector=h(n,function(a,b){throw ca.isString(b)&&l.push(b),Ha("unpr",l.join(" <- "))}),u={},R=h(u,function(a,b){var c=p.get(a+"Provider",b);return B.invoke(c.$get,c,void 0,a)}),B=R;n.$injectorProvider={$get:ha(R)};var r=g(a),B=R.get("$injector");return B.strictDi=b,q(r,function(a){a&&B.invoke(a)}),B}function Xe(){var a=!0;this.disableAutoScrolling=function(){a=!1},this.$get=["$window","$location","$rootScope",function(b,d,c){function e(a){var b=null;return Array.prototype.some.call(a,function(a){if("a"===wa(a))return b=a,!0}),b}function f(a){if(a){a.scrollIntoView();var c;c=g.yOffset,z(c)?c=c():Qb(c)?(c=c[0],c="fixed"!==b.getComputedStyle(c).position?0:c.getBoundingClientRect().bottom):T(c)||(c=0),c&&(a=a.getBoundingClientRect().top,b.scrollBy(0,a-c))}else b.scrollTo(0,0)}function g(a){a=G(a)?a:d.hash();var b;a?(b=h.getElementById(a))?f(b):(b=e(h.getElementsByName(a)))?f(b):"top"===a&&f(null):f(null)}var h=b.document;return a&&c.$watch(function(){return d.hash()},function(a,b){a===b&&""===a||Qf(function(){c.$evalAsync(g)})}),g}]}function gb(a,b){return a||b?a?b?(L(a)&&(a=a.join(" ")),L(b)&&(b=b.join(" ")),a+" "+b):a:b:""}function Zf(a){G(a)&&(a=a.split(" "));var b=U();return q(a,function(a){a.length&&(b[a]=!0)}),b}function Ia(a){return D(a)?a:{}}function $f(a,b,d,c){function e(a){try{a.apply(null,va.call(arguments,1))}finally{if(R--,0===R)for(;B.length;)try{B.pop()()}catch(b){d.error(b)}}}function f(){t=null,g(),h()}function g(){r=K(),r=y(r)?null:r,na(r,E)&&(r=E),E=r}function h(){v===k.url()&&J===r||(v=k.url(),J=r,q(M,function(a){a(k.url(),r)}))}var k=this,l=a.location,m=a.history,n=a.setTimeout,p=a.clearTimeout,u={};k.isMock=!1;var R=0,B=[];k.$$completeOutstandingRequest=e,k.$$incOutstandingRequestCount=function(){R++},k.notifyWhenNoOutstandingRequests=function(a){0===R?a():B.push(a)};var r,J,v=l.href,fa=b.find("base"),t=null,K=c.history?function(){try{return m.state}catch(a){}}:A;g(),J=r,k.url=function(b,d,e){if(y(e)&&(e=null),l!==a.location&&(l=a.location),m!==a.history&&(m=a.history),b){var f=J===e;if(v===b&&(!c.history||f))return k;var h=v&&Ja(v)===Ja(b);return v=b,J=e,!c.history||h&&f?(h||(t=b),d?l.replace(b):h?(d=l,e=b.indexOf("#"),e=-1===e?"":b.substr(e),d.hash=e):l.href=b,l.href!==b&&(t=b)):(m[d?"replaceState":"pushState"](e,"",b),g(),J=r),t&&(t=b),k}return t||l.href.replace(/%27/g,"'")},k.state=function(){return r};var M=[],H=!1,E=null;k.onUrlChange=function(b){return H||(c.history&&F(a).on("popstate",f),F(a).on("hashchange",f),H=!0),M.push(b),b},k.$$applicationDestroyed=function(){F(a).off("hashchange popstate",f)},k.$$checkUrlChange=h,k.baseHref=function(){var a=fa.attr("href");return a?a.replace(/^(https?\:)?\/\/[^\/]*/,""):""},k.defer=function(a,b){var c;return R++,c=n(function(){delete u[c],e(a)},b||0),u[c]=!0,c},k.defer.cancel=function(a){return!!u[a]&&(delete u[a],p(a),e(A),!0)}}function df(){this.$get=["$window","$log","$sniffer","$document",function(a,b,d,c){return new $f(a,c,b,d)}]}function ef(){this.$get=function(){function a(a,c){function e(a){a!=n&&(p?p==a&&(p=a.n):p=a,f(a.n,a.p),f(a,n),n=a,n.n=null)}function f(a,b){a!=b&&(a&&(a.p=b),b&&(b.n=a))}if(a in b)throw N("$cacheFactory")("iid",a);var g=0,h=S({},c,{id:a}),k=U(),l=c&&c.capacity||Number.MAX_VALUE,m=U(),n=null,p=null;return b[a]={put:function(a,b){if(!y(b)){if(ll&&this.remove(p.key),b}},get:function(a){if(l",b=pa.firstChild.attributes;var d=b[0];b.removeNamedItem(d.name),d.value=c,a.attributes.setNamedItem(d)}function x(a,b){try{a.addClass(b)}catch(c){}}function aa(a,b,c,d,e){a instanceof F||(a=F(a));for(var f=/\S+/,g=0,h=a.length;g").append(a).html())):c?Oa.clone.call(a):a,g)for(var h in g)d.data("$"+h+"Controller",g[h].instance);return aa.$$addScopeInfo(d,b),c&&c(d,b),l&&l(b,d,d,f),d}}function s(a,b,c,d,e,f){function g(a,c,d,e){var f,k,l,m,p,r,v;if(n)for(v=Array(c.length),m=0;mx.priority)break;if((w=x.scope)&&(x.templateUrl||(D(w)?(X("new/isolated scope",u||r,x,t),u=x):X("new/isolated scope",u,x,t)),r=r||x),I=x.name,!Fa&&(x.replace&&(x.templateUrl||x.template)||x.transclude&&!x.$$tlb)){for(w=A+1;Fa=a[w++];)if(Fa.transclude&&!Fa.$$tlb||Fa.replace&&(Fa.templateUrl||Fa.template)){za=!0;break}Fa=!0}if(!x.templateUrl&&x.controller&&(w=x.controller, v=v||U(),X("'"+I+"' controller",v[I],x,t),v[I]=x),w=x.transclude)if(M=!0,x.$$tlb||(X("transclusion",E,x,t),E=x),"element"==w)fa=!0,n=x.priority,P=t,t=d.$$element=F(aa.$$createComment(I,d[I])),b=t[0],ea(f,va.call(P,0),b),P[0].$$parentNode=P[0].parentNode,K=ac(za,P,e,n,g&&g.name,{nonTlbTranscludeDirective:E});else{var oa=U();if(P=F(Xb(b)).contents(),D(w)){P=[];var Q=U(),O=U();q(w,function(a,b){var c="?"===a.charAt(0);a=c?a.substring(1):a,Q[a]=b,oa[b]=null,O[b]=c}),q(t.contents(),function(a){var b=Q[Aa(wa(a))];b?(O[b]=!0,oa[b]=oa[b]||[],oa[b].push(a)):P.push(a)}),q(O,function(a,b){if(!a)throw ga("reqslot",b)});for(var V in oa)oa[V]&&(oa[V]=ac(za,oa[V],e))}t.empty(),K=ac(za,P,e,void 0,void 0,{needsNewScope:x.$$isolateScope||x.$$newScope}),K.$$slots=oa}if(x.template)if(B=!0,X("template",H,x,t),H=x,w=z(x.template)?x.template(t,d):x.template,w=xa(w),x.replace){if(g=x,P=Vb.test(w)?$c(da(x.templateNamespace,W(w))):[],b=P[0],1!=P.length||1!==b.nodeType)throw ga("tplrt",I,"");ea(f,t,b),C={$attr:{}},w=$b(b,[],C);var Z=a.splice(A+1,a.length-(A+1));(u||r)&&T(w,u,r),a=a.concat(w).concat(Z),$(d,C),C=a.length}else t.html(w);if(x.templateUrl)B=!0,X("template",H,x,t),H=x,x.replace&&(g=x),p=ba(a.splice(A,a.length-A),t,d,f,M&&K,h,k,{controllerDirectives:v,newScopeDirective:r!==x&&r,newIsolateScopeDirective:u,templateDirective:H,nonTlbTranscludeDirective:E}),C=a.length;else if(x.compile)try{s=x.compile(t,d,K);var Y=x.$$originalDirective||x;z(s)?m(null,ab(Y,s),G,hb):s&&m(ab(Y,s.pre),ab(Y,s.post),G,hb)}catch(ca){c(ca,ya(t))}x.terminal&&(p.terminal=!0,n=Math.max(n,x.priority))}return p.scope=r&&!0===r.scope,p.transcludeOnThisElement=M,p.templateOnThisElement=B,p.transclude=K,l.hasElementTranscludeDirective=fa,p}function ib(a,b,c,d){var e;if(G(b)){var f=b.match(l);b=b.substring(f[0].length);var g=f[1]||f[3],f="?"===f[2];if("^^"===g?c=c.parent():e=(e=d&&d[b])&&e.instance,!e){var h="$"+b+"Controller";e=g?c.inheritedData(h):c.data(h)}if(!e&&!f)throw ga("ctreq",b,a)}else if(L(b))for(e=[],g=0,f=b.length;gp.priority)&&-1!=p.restrict.indexOf(g)){if(l&&(p=Rb(p,{$$start:l,$$end:m})),!p.$$bindings){var u=p,v=p,x=p.name,H={isolateScope:null,bindToController:null};if(D(v.scope)&&(!0===v.bindToController?(H.bindToController=d(v.scope,x,!0),H.isolateScope={}):H.isolateScope=d(v.scope,x,!1)),D(v.bindToController)&&(H.bindToController=d(v.bindToController,x,!0)),D(H.bindToController)){var E=v.controller,M=v.controllerAs;if(!E)throw ga("noctrl",x);if(!Xc(E,M))throw ga("noident",x)}var t=u.$$bindings=H;D(t.isolateScope)&&(p.$$isolateBindings=t.isolateScope)}b.push(p),k=p}}catch(I){c(I)}}return k}function V(b){if(f.hasOwnProperty(b))for(var c=a.get(b+"Directive"),d=0,e=c.length;d"+b+"",c.childNodes[0].childNodes;default:return b}}function ha(a,b){if("srcdoc"==b)return M.HTML;var c=wa(a);return"xlinkHref"==b||"form"==c&&"action"==b||"img"!=c&&("src"==b||"ngSrc"==b)?M.RESOURCE_URL:void 0}function ia(a,c,d,e,f){var g=ha(a,e);f=k[e]||f;var h=b(d,!0,g,f);if(h){if("multiple"===e&&"select"===wa(a))throw ga("selmulti",ya(a));c.push({priority:100,compile:function(){return{pre:function(a,c,k){if(c=k.$$observers||(k.$$observers=U()),m.test(e))throw ga("nodomevents");var l=k[e];l!==d&&(h=l&&b(l,!0,g,f),d=l),h&&(k[e]=h(a),(c[e]||(c[e]=[])).$$inter=!0,(k.$$observers&&k.$$observers[e].$$scope||a).$watch(h,function(a,b){"class"===e&&a!=b?k.$updateClass(a,b):k.$set(e,a)}))}}}})}}function ea(a,b,c){var g,h,d=b[0],e=b.length,f=d.parentNode;if(a)for(g=0,h=a.length;g=b)return a;for(;b--;)8===a[b].nodeType&&bg.call(a,b,1);return a}function Xc(a,b){if(b&&G(b))return b;if(G(a)){var d=cd.exec(a);if(d)return d[3]}}function ff(){var a={},b=!1;this.has=function(b){return a.hasOwnProperty(b)},this.register=function(b,c){Qa(b,"controller"),D(b)?S(a,b):a[b]=c},this.allowGlobals=function(){b=!0},this.$get=["$injector","$window",function(d,c){function e(a,b,c,d){if(!a||!D(a.$scope))throw N("$controller")("noscp",d,b);a.$scope[b]=c}return function(f,g,h,k){var l,m,n;if(h=!0===h,k&&G(k)&&(n=k),G(f)){if(k=f.match(cd),!k)throw cg("ctrlfmt",f);m=k[1],n=n||k[3],f=a.hasOwnProperty(m)?a[m]:Ec(g.$scope,m,!0)||(b?Ec(c,m,!0):void 0),Pa(f,m,!0)}return h?(h=(L(f)?f[f.length-1]:f).prototype,l=Object.create(h||null),n&&e(g,n,l,m||f.name),S(function(){var a=d.invoke(f,l,g,m);return a!==l&&(D(a)||z(a))&&(l=a,n&&e(g,n,l,m||f.name)),l},{instance:l,identifier:n})):(l=d.instantiate(f,g,m),n&&e(g,n,l,m||f.name),l)}}]}function gf(){this.$get=["$window",function(a){return F(a.document)}]}function hf(){this.$get=["$log",function(a){return function(b,d){a.error.apply(a,arguments)}}]}function cc(a){return D(a)?da(a)?a.toISOString():bb(a):a}function nf(){this.$get=function(){return function(a){if(!a)return"";var b=[];return tc(a,function(a,c){null===a||y(a)||(L(a)?q(a,function(a){b.push(ea(c)+"="+ea(cc(a)))}):b.push(ea(c)+"="+ea(cc(a))))}),b.join("&")}}}function of(){this.$get=function(){return function(a){function b(a,e,f){null===a||y(a)||(L(a)?q(a,function(a,c){b(a,e+"["+(D(a)?c:"")+"]")}):D(a)&&!da(a)?tc(a,function(a,c){b(a,e+(f?"":"[")+c+(f?"":"]"))}):d.push(ea(e)+"="+ea(cc(a))))}if(!a)return"";var d=[];return b(a,"",!0),d.join("&")}}}function dc(a,b){if(G(a)){var d=a.replace(dg,"").trim();if(d){var c=b("Content-Type");(c=c&&0===c.indexOf(dd))||(c=(c=d.match(eg))&&fg[c[0]].test(d)),c&&(a=xc(d))}}return a}function ed(a){var d,b=U();return G(a)?q(a.split("\n"),function(a){d=a.indexOf(":");var e=Q(W(a.substr(0,d)));a=W(a.substr(d+1)),e&&(b[e]=b[e]?b[e]+", "+a:a)}):D(a)&&q(a,function(a,d){var f=Q(d),g=W(a);f&&(b[f]=b[f]?b[f]+", "+g:g)}),b}function fd(a){var b;return function(d){return b||(b=ed(a)),d?(d=b[Q(d)],void 0===d&&(d=null),d):b}}function gd(a,b,d,c){return z(c)?c(a,b,d):(q(c,function(c){a=c(a,b,d)}),a)}function mf(){var a=this.defaults={transformResponse:[dc],transformRequest:[function(a){return D(a)&&"[object File]"!==ma.call(a)&&"[object Blob]"!==ma.call(a)&&"[object FormData]"!==ma.call(a)?bb(a):a}],headers:{common:{Accept:"application/json, text/plain, */*"},post:ia(ec),put:ia(ec),patch:ia(ec)},xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",paramSerializer:"$httpParamSerializer"},b=!1;this.useApplyAsync=function(a){return w(a)?(b=!!a,this):b};var d=!0;this.useLegacyPromiseExtensions=function(a){return w(a)?(d=!!a,this):d};var c=this.interceptors=[];this.$get=["$httpBackend","$$cookieReader","$cacheFactory","$rootScope","$q","$injector",function(e,f,g,h,k,l){function m(b){function c(a,b){for(var d=0,e=b.length;da?b:k.reject(b)}if(!D(b))throw N("$http")("badreq",b);if(!G(b.url))throw N("$http")("badreq",b.url);var g=S({method:"get",transformRequest:a.transformRequest,transformResponse:a.transformResponse,paramSerializer:a.paramSerializer},b);g.headers=function(b){var f,g,h,c=a.headers,d=S({},b.headers),c=S({},c.common,c[Q(b.method)]);a:for(f in c){g=Q(f);for(h in d)if(Q(h)===g)continue a;d[f]=c[f]}return e(d,ia(b))}(b),g.method=ub(g.method),g.paramSerializer=G(g.paramSerializer)?l.get(g.paramSerializer):g.paramSerializer;var h=[],m=[],p=k.when(g);return q(R,function(a){(a.request||a.requestError)&&h.unshift(a.request,a.requestError),(a.response||a.responseError)&&m.push(a.response,a.responseError)}),p=c(p,h),p=p.then(function(b){var c=b.headers,d=gd(b.data,fd(c),void 0,b.transformRequest);return y(d)&&q(c,function(a,b){"content-type"===Q(b)&&delete c[b]}),y(b.withCredentials)&&!y(a.withCredentials)&&(b.withCredentials=a.withCredentials),n(b,d).then(f,f)}),p=c(p,m),d?(p.success=function(a){return Pa(a,"fn"),p.then(function(b){a(b.data,b.status,b.headers,g)}),p},p.error=function(a){return Pa(a,"fn"),p.then(null,function(b){a(b.data,b.status,b.headers,g)}),p}):(p.success=hd("success"),p.error=hd("error")),p}function n(c,d){function g(a){if(a){var c={};return q(a,function(a,d){c[d]=function(c){function d(){a(c)}b?h.$applyAsync(d):h.$$phase?d():h.$apply(d)}}),c}}function l(a,c,d,e){function f(){n(c,a,d,e)}E&&(200<=a&&300>a?E.put(P,[a,c,ed(d),e]):E.remove(P)),b?h.$applyAsync(f):(f(),h.$$phase||h.$apply())}function n(a,b,d,e){b=-1<=b?b:0,(200<=b&&300>b?M.resolve:M.reject)({data:a,status:b,headers:fd(d),config:c,statusText:e})}function t(a){n(a.data,a.status,ia(a.headers()),a.statusText)}function R(){var a=m.pendingRequests.indexOf(c);-1!==a&&m.pendingRequests.splice(a,1)}var E,I,M=k.defer(),H=M.promise,Da=c.headers,P=p(c.url,c.paramSerializer(c.params));return m.pendingRequests.push(c),H.then(R,R),!c.cache&&!a.cache||!1===c.cache||"GET"!==c.method&&"JSONP"!==c.method||(E=D(c.cache)?c.cache:D(a.cache)?a.cache:u),E&&(I=E.get(P),w(I)?I&&z(I.then)?I.then(t,t):L(I)?n(I[1],I[0],ia(I[2]),I[3]):n(I,200,{},"OK"):E.put(P,H)),y(I)&&((I=id(c.url)?f()[c.xsrfCookieName||a.xsrfCookieName]:void 0)&&(Da[c.xsrfHeaderName||a.xsrfHeaderName]=I),e(c.method,P,d,l,Da,c.timeout,c.withCredentials,c.responseType,g(c.eventHandlers),g(c.uploadEventHandlers))),H}function p(a,b){return 0=l&&(v.resolve(r),q(fa.$$intervalId),delete g[fa.$$intervalId]),J||a.$apply()},k),g[fa.$$intervalId]=v,fa}var g={};return f.cancel=function(a){return!!(a&&a.$$intervalId in g)&&(g[a.$$intervalId].reject("canceled"),b.clearInterval(a.$$intervalId),delete g[a.$$intervalId],!0)},f}]}function fc(a){a=a.split("/");for(var b=a.length;b--;)a[b]=qb(a[b]);return a.join("/")}function jd(a,b){var d=Y(a);b.$$protocol=d.protocol,b.$$host=d.hostname,b.$$port=Z(d.port)||hg[d.protocol]||null}function kd(a,b){var d="/"!==a.charAt(0);d&&(a="/"+a);var c=Y(a);b.$$path=decodeURIComponent(d&&"/"===c.pathname.charAt(0)?c.pathname.substring(1):c.pathname),b.$$search=Ac(c.search),b.$$hash=decodeURIComponent(c.hash),b.$$path&&"/"!=b.$$path.charAt(0)&&(b.$$path="/"+b.$$path)}function ka(a,b){if(0===b.lastIndexOf(a,0))return b.substr(a.length)}function Ja(a){var b=a.indexOf("#");return-1==b?a:a.substr(0,b)}function jb(a){return a.replace(/(#.+)|#$/,"$1")}function gc(a,b,d){this.$$html5=!0,d=d||"",jd(a,this),this.$$parse=function(a){var d=ka(b,a);if(!G(d))throw Gb("ipthprfx",a,b);kd(d,this),this.$$path||(this.$$path="/"),this.$$compose()},this.$$compose=function(){var a=Tb(this.$$search),d=this.$$hash?"#"+qb(this.$$hash):"";this.$$url=fc(this.$$path)+(a?"?"+a:"")+d,this.$$absUrl=b+this.$$url.substr(1)},this.$$parseLinkUrl=function(c,e){if(e&&"#"===e[0])return this.hash(e.slice(1)),!0;var f,g;return w(f=ka(a,c))?(g=f,g=w(f=ka(d,f))?b+(ka("/",f)||f):a+g):w(f=ka(b,c))?g=b+f:b==c+"/"&&(g=b),g&&this.$$parse(g),!!g}}function hc(a,b,d){jd(a,this),this.$$parse=function(c){var f,e=ka(a,c)||ka(b,c);y(e)||"#"!==e.charAt(0)?this.$$html5?f=e:(f="",y(e)&&(a=c,this.replace())):(f=ka(d,e),y(f)&&(f=e)),kd(f,this),c=this.$$path;var e=a,g=/^\/[A-Z]:(\/.*)/;0===f.lastIndexOf(e,0)&&(f=f.replace(e,"")),g.exec(f)||(c=(f=g.exec(c))?f[1]:c),this.$$path=c,this.$$compose()},this.$$compose=function(){var b=Tb(this.$$search),e=this.$$hash?"#"+qb(this.$$hash):"";this.$$url=fc(this.$$path)+(b?"?"+b:"")+e,this.$$absUrl=a+(this.$$url?d+this.$$url:"")},this.$$parseLinkUrl=function(b,d){return Ja(a)==Ja(b)&&(this.$$parse(b),!0)}}function ld(a,b,d){this.$$html5=!0,hc.apply(this,arguments),this.$$parseLinkUrl=function(c,e){if(e&&"#"===e[0])return this.hash(e.slice(1)),!0;var f,g;return a==Ja(c)?f=c:(g=ka(b,c))?f=a+d+g:b===c+"/"&&(f=b),f&&this.$$parse(f),!!f},this.$$compose=function(){var b=Tb(this.$$search),e=this.$$hash?"#"+qb(this.$$hash):"";this.$$url=fc(this.$$path)+(b?"?"+b:"")+e,this.$$absUrl=a+d+this.$$url}}function Hb(a){return function(){return this[a]}}function md(a,b){return function(d){return y(d)?this[a]:(this[a]=b(d),this.$$compose(),this)}}function sf(){var a="",b={enabled:!1,requireBase:!0,rewriteLinks:!0};this.hashPrefix=function(b){return w(b)?(a=b,this):a},this.html5Mode=function(a){return Ga(a)?(b.enabled=a,this):D(a)?(Ga(a.enabled)&&(b.enabled=a.enabled),Ga(a.requireBase)&&(b.requireBase=a.requireBase),Ga(a.rewriteLinks)&&(b.rewriteLinks=a.rewriteLinks),this):b},this.$get=["$rootScope","$browser","$sniffer","$rootElement","$window",function(d,c,e,f,g){function h(a,b,d){var e=l.url(),f=l.$$state;try{c.url(a,b,d),l.$$state=c.state()}catch(g){throw l.url(e),l.$$state=f,g}}function k(a,b){d.$broadcast("$locationChangeSuccess",l.absUrl(),a,l.$$state,b)}var l,m;m=c.baseHref();var p,n=c.url();if(b.enabled){if(!m&&b.requireBase)throw Gb("nobase");p=n.substring(0,n.indexOf("/",n.indexOf("//")+2))+(m||"/"),m=e.history?gc:ld}else p=Ja(n),m=hc;var u=p.substr(0,Ja(p).lastIndexOf("/")+1);l=new m(p,u,"#"+a),l.$$parseLinkUrl(n,n),l.$$state=c.state();var R=/^\s*(javascript|mailto):/i;f.on("click",function(a){if(b.rewriteLinks&&!a.ctrlKey&&!a.metaKey&&!a.shiftKey&&2!=a.which&&2!=a.button){for(var e=F(a.target);"a"!==wa(e[0]);)if(e[0]===f[0]||!(e=e.parent())[0])return;var h=e.prop("href"),k=e.attr("href")||e.attr("xlink:href");D(h)&&"[object SVGAnimatedString]"===h.toString()&&(h=Y(h.animVal).href),R.test(h)||!h||e.attr("target")||a.isDefaultPrevented()||!l.$$parseLinkUrl(h,k)||(a.preventDefault(),l.absUrl()!=c.url()&&(d.$apply(),g.angular["ff-684208-preventDefault"]=!0))}}),jb(l.absUrl())!=jb(n)&&c.url(l.absUrl(),!0);var q=!0;return c.onUrlChange(function(a,b){y(ka(u,a))?g.location.href=a:(d.$evalAsync(function(){var f,c=l.absUrl(),e=l.$$state;a=jb(a),l.$$parse(a),l.$$state=b,f=d.$broadcast("$locationChangeStart",a,c,b,e).defaultPrevented,l.absUrl()===a&&(f?(l.$$parse(c),l.$$state=e,h(c,!1,e)):(q=!1,k(c,e)))}),d.$$phase||d.$digest())}),d.$watch(function(){var a=jb(c.url()),b=jb(l.absUrl()),f=c.state(),g=l.$$replace,m=a!==b||l.$$html5&&e.history&&f!==l.$$state;(q||m)&&(q=!1,d.$evalAsync(function(){var b=l.absUrl(),c=d.$broadcast("$locationChangeStart",b,a,l.$$state,f).defaultPrevented;l.absUrl()===b&&(c?(l.$$parse(a),l.$$state=f):(m&&h(b,g,f===l.$$state?null:l.$$state),k(a,f)))})),l.$$replace=!1}),l}]}function tf(){var a=!0,b=this;this.debugEnabled=function(b){return w(b)?(a=b,this):a},this.$get=["$window",function(d){function c(a){return a instanceof Error&&(a.stack?a=a.message&&-1===a.stack.indexOf(a.message)?"Error: "+a.message+"\n"+a.stack:a.stack:a.sourceURL&&(a=a.message+"\n"+a.sourceURL+":"+a.line)),a}function e(a){var b=d.console||{},e=b[a]||b.log||A;a=!1;try{a=!!e.apply}catch(k){}return a?function(){var a=[];return q(arguments,function(b){a.push(c(b))}),e.apply(b,a)}:function(a,b){e(a,null==b?"":b)}}return{log:e("log"),info:e("info"),warn:e("warn"),error:e("error"),debug:function(){var c=e("debug");return function(){a&&c.apply(b,arguments)}}()}}]}function Sa(a,b){if("__defineGetter__"===a||"__defineSetter__"===a||"__lookupGetter__"===a||"__lookupSetter__"===a||"__proto__"===a)throw X("isecfld",b);return a}function ig(a){return a+""}function ra(a,b){if(a){if(a.constructor===a)throw X("isecfn",b);if(a.window===a)throw X("isecwindow",b);if(a.children&&(a.nodeName||a.prop&&a.attr&&a.find))throw X("isecdom",b);if(a===Object)throw X("isecobj",b)}return a}function nd(a,b){if(a){if(a.constructor===a)throw X("isecfn",b);if(a===jg||a===kg||a===lg)throw X("isecff",b)}}function Ib(a,b){if(a&&(a===(0).constructor||a===(!1).constructor||a==="".constructor||a==={}.constructor||a===[].constructor||a===Function.constructor))throw X("isecaf",b)}function mg(a,b){return"undefined"!=typeof a?a:b}function od(a,b){return"undefined"==typeof a?b:"undefined"==typeof b?a:a+b}function V(a,b){var d,c;switch(a.type){case s.Program:d=!0,q(a.body,function(a){V(a.expression,b),d=d&&a.expression.constant}),a.constant=d;break;case s.Literal:a.constant=!0,a.toWatch=[];break;case s.UnaryExpression:V(a.argument,b),a.constant=a.argument.constant,a.toWatch=a.argument.toWatch;break;case s.BinaryExpression:V(a.left,b),V(a.right,b),a.constant=a.left.constant&&a.right.constant,a.toWatch=a.left.toWatch.concat(a.right.toWatch);break;case s.LogicalExpression:V(a.left,b),V(a.right,b),a.constant=a.left.constant&&a.right.constant,a.toWatch=a.constant?[]:[a];break;case s.ConditionalExpression:V(a.test,b),V(a.alternate,b),V(a.consequent,b),a.constant=a.test.constant&&a.alternate.constant&&a.consequent.constant,a.toWatch=a.constant?[]:[a];break;case s.Identifier:a.constant=!1,a.toWatch=[a];break;case s.MemberExpression:V(a.object,b),a.computed&&V(a.property,b),a.constant=a.object.constant&&(!a.computed||a.property.constant),a.toWatch=[a];break;case s.CallExpression:d=!!a.filter&&!b(a.callee.name).$stateful,c=[],q(a.arguments,function(a){V(a,b),d=d&&a.constant,a.constant||c.push.apply(c,a.toWatch)}),a.constant=d,a.toWatch=a.filter&&!b(a.callee.name).$stateful?c:[a];break;case s.AssignmentExpression:V(a.left,b),V(a.right,b),a.constant=a.left.constant&&a.right.constant,a.toWatch=[a];break;case s.ArrayExpression:d=!0,c=[],q(a.elements,function(a){V(a,b),d=d&&a.constant,a.constant||c.push.apply(c,a.toWatch)}),a.constant=d,a.toWatch=c;break;case s.ObjectExpression:d=!0,c=[],q(a.properties,function(a){V(a.value,b),d=d&&a.value.constant&&!a.computed,a.value.constant||c.push.apply(c,a.value.toWatch)}),a.constant=d,a.toWatch=c;break;case s.ThisExpression:a.constant=!1,a.toWatch=[];break;case s.LocalsExpression:a.constant=!1,a.toWatch=[]}}function pd(a){if(1==a.length){a=a[0].expression;var b=a.toWatch;return 1!==b.length?b:b[0]!==a?b:void 0}}function qd(a){return a.type===s.Identifier||a.type===s.MemberExpression}function rd(a){if(1===a.body.length&&qd(a.body[0].expression))return{type:s.AssignmentExpression,left:a.body[0].expression,right:{type:s.NGValueParameter},operator:"="}}function sd(a){return 0===a.body.length||1===a.body.length&&(a.body[0].expression.type===s.Literal||a.body[0].expression.type===s.ArrayExpression||a.body[0].expression.type===s.ObjectExpression)}function td(a,b){this.astBuilder=a,this.$filter=b}function ud(a,b){this.astBuilder=a,this.$filter=b}function Jb(a){return"constructor"==a}function ic(a){return z(a.valueOf)?a.valueOf():ng.call(a)}function uf(){var c,e,a=U(),b=U(),d={true:!0,false:!1,null:null,undefined:void 0};this.addLiteral=function(a,b){d[a]=b},this.setIdentifierFns=function(a,b){return c=a,e=b,this},this.$get=["$filter",function(f){function g(c,d,e){var g,k,H;switch(e=e||J,typeof c){case"string":H=c=c.trim();var E=e?b:a;if(g=E[H],!g){":"===c.charAt(0)&&":"===c.charAt(1)&&(k=!0,c=c.substring(2)),g=e?r:B;var q=new jc(g);g=new kc(q,f,g).parse(c),g.constant?g.$$watchDelegate=p:k?g.$$watchDelegate=g.literal?n:m:g.inputs&&(g.$$watchDelegate=l),e&&(g=h(g)),E[H]=g}return u(g,d);case"function":return u(c,d);default:return u(A,d)}}function h(a){function b(c,d,e,f){var g=J;J=!0;try{return a(c,d,e,f)}finally{J=g}}if(!a)return a;b.$$watchDelegate=a.$$watchDelegate,b.assign=h(a.assign),b.constant=a.constant,b.literal=a.literal;for(var c=0;a.inputs&&cc;c++)i=t[c],"string"!=(m=typeof i)&&"number"!==m&&"boolean"!==m||u.push(i.toString().toLowerCase());matching.set_user_input_dictionary(u),a=matching.omnimatch(e),o=scoring.most_guessable_match_sequence(e,a),o.calc_time=time()-g,n=time_estimates.estimate_attack_times(o.guesses);for(r in n)_=n[r],o[r]=_;return o.feedback=feedback.get_feedback(o.score,o.sequence),o},module.exports=zxcvbn},{"./feedback":2,"./matching":5,"./scoring":6,"./time_estimates":7}],5:[function(require,module,exports){var DATE_MAX_YEAR,DATE_MIN_YEAR,DATE_SPLITS,GRAPHS,L33T_TABLE,RANKED_DICTIONARIES,REGEXEN,adjacency_graphs,build_ranked_dict,frequency_lists,lst,matching,name,scoring;frequency_lists=require("./frequency_lists"),adjacency_graphs=require("./adjacency_graphs"),scoring=require("./scoring"),build_ranked_dict=function(e){var t,n,r,i,a;for(i={},t=1,r=0,n=e.length;n>r;r++)a=e[r],i[a]=t,t+=1;return i},RANKED_DICTIONARIES={};for(name in frequency_lists)lst=frequency_lists[name],RANKED_DICTIONARIES[name]=build_ranked_dict(lst);GRAPHS={qwerty:adjacency_graphs.qwerty,dvorak:adjacency_graphs.dvorak,keypad:adjacency_graphs.keypad,mac_keypad:adjacency_graphs.mac_keypad},L33T_TABLE={a:["4","@"],b:["8"],c:["(","{","[","<"],e:["3"],g:["6","9"],i:["1","!","|"],l:["1","|","7"],o:["0"],s:["$","5"],t:["+","7"],x:["%"],z:["2"]},REGEXEN={recent_year:/19\d\d|200\d|201\d/g},DATE_MAX_YEAR=2050,DATE_MIN_YEAR=1e3,DATE_SPLITS={4:[[1,2],[2,3]],5:[[1,3],[2,3]],6:[[1,2],[2,4],[4,5]],7:[[1,3],[2,3],[4,5],[4,6]],8:[[2,4],[4,6]]},matching={empty:function(e){var t;return 0===function(){var n;n=[];for(t in e)n.push(t);return n}().length},extend:function(e,t){return e.push.apply(e,t)},translate:function(e,t){var n;return function(){var r,i,a,s;for(a=e.split(""),s=[],i=0,r=a.length;r>i;i++)n=a[i],s.push(t[n]||n);return s}().join("")},mod:function(e,t){return(e%t+t)%t},sorted:function(e){return e.sort(function(e,t){return e.i-t.i||e.j-t.j})},omnimatch:function(e){var t,n,r,i,a;for(i=[],r=[this.dictionary_match,this.reverse_dictionary_match,this.l33t_match,this.spatial_match,this.repeat_match,this.sequence_match,this.regex_match,this.date_match],a=0,t=r.length;t>a;a++)n=r[a],this.extend(i,n.call(this,e));return this.sorted(i)},dictionary_match:function(e,t){var n,r,i,a,s,o,h,u,c,l,_,f,d,p;null==t&&(t=RANKED_DICTIONARIES),s=[],a=e.length,u=e.toLowerCase();for(n in t)for(l=t[n],r=o=0,_=a;_>=0?_>o:o>_;r=_>=0?++o:--o)for(i=h=f=r,d=a;d>=f?d>h:h>d;i=d>=f?++h:--h)u.slice(r,+i+1||9e9)in l&&(p=u.slice(r,+i+1||9e9),c=l[p],s.push({pattern:"dictionary",i:r,j:i,token:e.slice(r,+i+1||9e9),matched_word:p,rank:c,dictionary_name:n,reversed:!1,l33t:!1}));return this.sorted(s)},reverse_dictionary_match:function(e,t){var n,r,i,a,s,o;for(null==t&&(t=RANKED_DICTIONARIES),o=e.split("").reverse().join(""),i=this.dictionary_match(o,t),a=0,n=i.length;n>a;a++)r=i[a],r.token=r.token.split("").reverse().join(""),r.reversed=!0,s=[e.length-1-r.j,e.length-1-r.i],r.i=s[0],r.j=s[1];return this.sorted(i)},set_user_input_dictionary:function(e){return RANKED_DICTIONARIES.user_inputs=build_ranked_dict(e.slice())},relevant_l33t_subtable:function(e,t){var n,r,i,a,s,o,h,u,c,l;for(s={},o=e.split(""),a=0,r=o.length;r>a;a++)n=o[a],s[n]=!0;l={};for(i in t)c=t[i],h=function(){var e,t,n;for(n=[],t=0,e=c.length;e>t;t++)u=c[t],u in s&&n.push(u);return n}(),h.length>0&&(l[i]=h);return l},enumerate_l33t_subs:function(e){var t,n,r,i,a,s,o,h,u,c,l,_,f,d,p;a=function(){var t;t=[];for(i in e)t.push(i);return t}(),p=[[]],n=function(e){var t,n,r,a,s,o,h,u;for(n=[],s={},o=0,a=e.length;a>o;o++)h=e[o],t=function(){var e,t,n;for(n=[],u=t=0,e=h.length;e>t;u=++t)i=h[u],n.push([i,u]);return n}(),t.sort(),r=function(){var e,n,r;for(r=[],u=n=0,e=t.length;e>n;u=++n)i=t[u],r.push(i+","+u);return r}().join("-"),r in s||(s[r]=!0,n.push(h));return n},r=function(t){var i,a,s,o,h,u,c,l,_,f,d,g,m,A,E,y;if(t.length){for(a=t[0],m=t.slice(1),c=[],d=e[a],l=0,h=d.length;h>l;l++)for(o=d[l],_=0,u=p.length;u>_;_++){for(A=p[_],i=-1,s=f=0,g=A.length;g>=0?g>f:f>g;s=g>=0?++f:--f)if(A[s][0]===o){i=s;break}-1===i?(y=A.concat([[o,a]]),c.push(y)):(E=A.slice(0),E.splice(i,1),E.push([o,a]),c.push(A),c.push(E))}return p=n(c),r(m)}},r(a),d=[];for(u=0,o=p.length;o>u;u++){for(_=p[u],f={},c=0,h=_.length;h>c;c++)l=_[c],s=l[0],t=l[1],f[s]=t;d.push(f)}return d},l33t_match:function(e,t,n){var r,i,a,s,o,h,u,c,l,_,f,d,p,g,m,A;for(null==t&&(t=RANKED_DICTIONARIES),null==n&&(n=L33T_TABLE),u=[],_=this.enumerate_l33t_subs(this.relevant_l33t_subtable(e,n)),c=0,a=_.length;a>c&&(d=_[c],!this.empty(d));c++)for(g=this.translate(e,d),f=this.dictionary_match(g,t),l=0,s=f.length;s>l;l++)if(o=f[l],m=e.slice(o.i,+o.j+1||9e9),m.toLowerCase()!==o.matched_word){h={};for(p in d)r=d[p],-1!==m.indexOf(p)&&(h[p]=r);o.l33t=!0,o.token=m,o.sub=h,o.sub_display=function(){var e;e=[];for(i in h)A=h[i],e.push(i+" -> "+A);return e}().join(", "),u.push(o)}return this.sorted(u.filter(function(e){return e.token.length>1}))},spatial_match:function(e,t){var n,r,i;null==t&&(t=GRAPHS),i=[];for(r in t)n=t[r],this.extend(i,this.spatial_match_helper(e,n,r));return this.sorted(i)},SHIFTED_RX:/[~!@#$%^&*()_+QWERTYUIOP{}|ASDFGHJKL:"ZXCVBNM<>?]/,spatial_match_helper:function(e,t,n){var r,i,a,s,o,h,u,c,l,_,f,d,p,g,m;for(f=[],u=0;ud;d++)if(r=i[d],s+=1,r&&-1!==r.indexOf(a)){o=!0,h=s,1===r.indexOf(a)&&(g+=1),l!==h&&(m+=1,l=h);break}if(!o){c-u>2&&f.push({pattern:"spatial",i:u,j:c-1,token:e.slice(u,c),graph:n,turns:m,shifted_count:g}),u=c;break}c+=1}return f},repeat_match:function(e){var t,n,r,i,a,s,o,h,u,c,l,_,f,d,p;for(d=[],a=/(.+)\1+/g,c=/(.+?)\1+/g,l=/^(.+?)\1+$/,u=0;u_[0].length?(f=s,i=l.exec(f[0])[1]):(f=_,i=f[1]),p=[f.index,f.index+f[0].length-1],o=p[0],h=p[1],t=scoring.most_guessable_match_sequence(i,this.omnimatch(i)),r=t.match_sequence,n=t.guesses,d.push({pattern:"repeat",i:o,j:h,token:f[0],base_token:i,base_guesses:n,base_matches:r,repeat_count:f[0].length/i.length}),u=h+1;return d},MAX_DELTA:5,sequence_match:function(e){var t,n,r,i,a,s,o,h,u;if(1===e.length)return[];for(u=function(t){return function(n,r,i){var a,s,o,u;return(r-n>1||1===Math.abs(i))&&0<(a=Math.abs(i))&&a<=t.MAX_DELTA?(u=e.slice(n,+r+1||9e9),/^[a-z]+$/.test(u)?(s="lower",o=26):/^[A-Z]+$/.test(u)?(s="upper",o=26):/^\d+$/.test(u)?(s="digits",o=10):(s="unicode",o=26),h.push({pattern:"sequence",i:n,j:r,token:e.slice(n,+r+1||9e9),sequence_name:s,sequence_space:o,ascending:i>0})):void 0}}(this),h=[],n=0,a=null,i=s=1,o=e.length;o>=1?o>s:s>o;i=o>=1?++s:--s)t=e.charCodeAt(i)-e.charCodeAt(i-1),null==a&&(a=t),t!==a&&(r=i-1,u(n,r,a),n=r,a=t);return u(n,e.length-1,a),h},regex_match:function(e,t){var n,r,i,a;null==t&&(t=REGEXEN),n=[];for(name in t)for(r=t[name],r.lastIndex=0;i=r.exec(e);)a=i[0],n.push({pattern:"regex",token:a,i:i.index,j:i.index+i[0].length-1,regex_name:name,regex_match:i});return this.sorted(n)},date_match:function(e){var t,n,r,i,a,s,o,h,u,c,l,_,f,d,p,g,m,A,E,y,v,I,R,T,D,k,x,j,b,N,S,q,L,M;for(_=[],f=/^\d{4,8}$/,d=/^(\d{1,4})([\s\/\\_.-])(\d{1,2})\2(\d{1,4})$/,s=m=0,v=e.length-4;v>=0?v>=m:m>=v;s=v>=0?++m:--m)for(o=A=I=s+3,R=s+7;(R>=I?R>=A:A>=R)&&!(o>=e.length);o=R>=I?++A:--A)if(M=e.slice(s,+o+1||9e9),f.exec(M)){for(r=[],T=DATE_SPLITS[M.length],E=0,c=T.length;c>E;E++)D=T[E],h=D[0],u=D[1],a=this.map_ints_to_dmy([parseInt(M.slice(0,h)),parseInt(M.slice(h,u)),parseInt(M.slice(u))]),null!=a&&r.push(a);if(r.length>0){for(t=r[0],p=function(e){return Math.abs(e.year-scoring.REFERENCE_YEAR)},g=p(r[0]),k=r.slice(1),y=0,l=k.length;l>y;y++)n=k[y],i=p(n),g>i&&(x=[n,i],t=x[0],g=x[1]);_.push({pattern:"date",token:M,i:s,j:o,separator:"",year:t.year,month:t.month,day:t.day})}}for(s=q=0,j=e.length-6;j>=0?j>=q:q>=j;s=j>=0?++q:--q)for(o=L=b=s+5,N=s+9;(N>=b?N>=L:L>=N)&&!(o>=e.length);o=N>=b?++L:--L)M=e.slice(s,+o+1||9e9),S=d.exec(M),null!=S&&(a=this.map_ints_to_dmy([parseInt(S[1]),parseInt(S[3]),parseInt(S[4])]),null!=a&&_.push({pattern:"date",token:M,i:s,j:o,separator:S[2],year:a.year,month:a.month,day:a.day}));return this.sorted(_.filter(function(e){var t,n,r,i;for(t=!1,i=0,n=_.length;n>i;i++)if(r=_[i],e!==r&&r.i<=e.i&&r.j>=e.j){t=!0;break}return!t}))},map_ints_to_dmy:function(e){var t,n,r,i,a,s,o,h,u,c,l,_,f,d,p,g;if(!(e[1]>31||e[1]<=0)){for(o=0,h=0,p=0,s=0,r=e.length;r>s;s++){if(n=e[s],n>99&&DATE_MIN_YEAR>n||n>DATE_MAX_YEAR)return;n>31&&(h+=1),n>12&&(o+=1),0>=n&&(p+=1)}if(!(h>=2||3===o||p>=2)){for(c=[[e[2],e.slice(0,2)],[e[0],e.slice(1,3)]],u=0,i=c.length;i>u;u++)if(_=c[u],g=_[0],d=_[1],g>=DATE_MIN_YEAR&&DATE_MAX_YEAR>=g)return t=this.map_ints_to_dm(d),null!=t?{year:g,month:t.month,day:t.day}:void 0;for(l=0,a=c.length;a>l;l++)if(f=c[l],g=f[0],d=f[1],t=this.map_ints_to_dm(d),null!=t)return g=this.two_to_four_digit_year(g),{year:g,month:t.month,day:t.day}}}},map_ints_to_dm:function(e){var t,n,r,i,a,s;for(a=[e,e.slice().reverse()],i=0,n=a.length;n>i;i++)if(s=a[i],t=s[0],r=s[1],t>=1&&31>=t&&r>=1&&12>=r)return{day:t,month:r}},two_to_four_digit_year:function(e){return e>99?e:e>50?e+1900:e+2e3}},module.exports=matching},{"./adjacency_graphs":1,"./frequency_lists":3,"./scoring":6}],6:[function(require,module,exports){var BRUTEFORCE_CARDINALITY,MIN_GUESSES_BEFORE_GROWING_SEQUENCE,MIN_SUBMATCH_GUESSES_MULTI_CHAR,MIN_SUBMATCH_GUESSES_SINGLE_CHAR,adjacency_graphs,calc_average_degree,k,scoring,v;adjacency_graphs=require("./adjacency_graphs"),calc_average_degree=function(e){var t,r,n,s,a,u;t=0;for(n in e)a=e[n],t+=function(){var e,t,r;for(r=[],t=0,e=a.length;e>t;t++)s=a[t],s&&r.push(s);return r}().length;return t/=function(){var t;t=[];for(r in e)u=e[r],t.push(r);return t}().length},BRUTEFORCE_CARDINALITY=10,MIN_GUESSES_BEFORE_GROWING_SEQUENCE=1e4,MIN_SUBMATCH_GUESSES_SINGLE_CHAR=10,MIN_SUBMATCH_GUESSES_MULTI_CHAR=50,scoring={nCk:function(e,t){var r,n,s,a;if(t>e)return 0;if(0===t)return 1;for(s=1,r=n=1,a=t;a>=1?a>=n:n>=a;r=a>=1?++n:--n)s*=e,s/=r,e-=1;return s},log10:function(e){return Math.log(e)/Math.log(10)},log2:function(e){return Math.log(e)/Math.log(2)},factorial:function(e){var t,r,n,s;if(2>e)return 1;for(t=1,r=n=2,s=e;s>=2?s>=n:n>=s;r=s>=2?++n:--n)t*=r;return t},most_guessable_match_sequence:function(e,t,r){var n,s,a,u,i,_,o,h,E,c,g,f,l,p,A,S,R,v,I,M;for(null==r&&(r=!1),g=e.length,c=function(){var e,t,r;for(r=[],n=e=0,t=g;t>=0?t>e:e>t;n=t>=0?++e:--e)r.push([]);return r}(),f=0,_=t.length;_>f;f++)h=t[f],c[h.j].push(h);for(l={m:function(){var e,t,r;for(r=[],n=e=0,t=g;t>=0?t>e:e>t;n=t>=0?++e:--e)r.push({});return r}(),pi:function(){var e,t,r;for(r=[],n=e=0,t=g;t>=0?t>e:e>t;n=t>=0?++e:--e)r.push({});return r}(),g:function(){var e,t,r;for(r=[],n=e=0,t=g;t>=0?t>e:e>t;n=t>=0?++e:--e)r.push(1/0);return r}(),l:function(){var e,t,r;for(r=[],n=e=0,t=g;t>=0?t>e:e>t;n=t>=0?++e:--e)r.push(0);return r}()},M=function(t){return function(n,s){var a,u,i;return u=n.j,i=t.estimate_guesses(n,e),s>1&&(i*=l.pi[n.i-1][s-1]),a=t.factorial(s)*i,r||(a+=Math.pow(MIN_GUESSES_BEFORE_GROWING_SEQUENCE,s-1)),a=0;)h=l.m[t][r],n.unshift(h),t=h.i-1,r--;return n}}(this),u=A=0,S=g;S>=0?S>A:A>S;u=S>=0?++A:--A){for(R=c[u],v=0,o=R.length;o>v;v++)if(h=R[v],h.i>0)for(i in l.m[h.i-1])i=parseInt(i),M(h,i+1);else M(h,1);s(u)}return p=I(g),a=0===e.length?1:l.g[g-1],{password:e,guesses:a,guesses_log10:this.log10(a),sequence:p}},estimate_guesses:function(e,t){var r,n,s;return null!=e.guesses?e.guesses:(s=1,e.token.length=2?c>=_:_>=c;u=c>=2?++_:--_)for(o=Math.min(A,u-1),i=h=1,g=o;g>=1?g>=h:h>=g;i=g>=1?++h:--h)a+=this.nCk(u-1,i-1)*l*Math.pow(s,i);if(e.shifted_count)if(r=e.shifted_count,n=e.token.length-e.shifted_count,0===r||0===n)a*=2;else{for(p=0,u=S=1,f=Math.min(r,n);f>=1?f>=S:S>=f;u=f>=1?++S:--S)p+=this.nCk(r+n,u);a*=p}return a},dictionary_guesses:function(e){var t;return e.base_guesses=e.rank,e.uppercase_variations=this.uppercase_variations(e),e.l33t_variations=this.l33t_variations(e),t=e.reversed&&2||1,e.base_guesses*e.uppercase_variations*e.l33t_variations*t},START_UPPER:/^[A-Z][^A-Z]+$/,END_UPPER:/^[^A-Z]+[A-Z]$/,ALL_UPPER:/^[^a-z]+$/,ALL_LOWER:/^[^A-Z]+$/,uppercase_variations:function(e){var t,r,n,s,a,u,i,_,o,h,E,c;if(c=e.token,c.match(this.ALL_LOWER)||c.toLowerCase()===c)return 1;for(_=[this.START_UPPER,this.END_UPPER,this.ALL_UPPER],u=0,a=_.length;a>u;u++)if(h=_[u],c.match(h))return 2;for(r=function(){var e,t,r,s;for(r=c.split(""),s=[],t=0,e=r.length;e>t;t++)n=r[t],n.match(/[A-Z]/)&&s.push(n);return s}().length,t=function(){var e,t,r,s;for(r=c.split(""),s=[],t=0,e=r.length;e>t;t++)n=r[t],n.match(/[a-z]/)&&s.push(n);return s}().length,E=0,s=i=1,o=Math.min(r,t);o>=1?o>=i:i>=o;s=o>=1?++i:--i)E+=this.nCk(r+t,s);return E},l33t_variations:function(e){var t,r,n,s,a,u,i,_,o,h,E,c,g;if(!e.l33t)return 1;g=1,o=e.sub;for(E in o)if(c=o[E],s=e.token.toLowerCase().split(""),t=function(){var e,t,r;for(r=[],t=0,e=s.length;e>t;t++)n=s[t],n===E&&r.push(n);return r}().length,r=function(){var e,t,r;for(r=[],t=0,e=s.length;e>t;t++)n=s[t],n===c&&r.push(n);return r}().length,0===t||0===r)g*=2;else{for(i=Math.min(r,t),_=0,a=u=1,h=i;h>=1?h>=u:u>=h;a=h>=1?++u:--u)_+=this.nCk(r+t,a);g*=_}return g}},module.exports=scoring},{"./adjacency_graphs":1}],7:[function(require,module,exports){var time_estimates;time_estimates={estimate_attack_times:function(e){var t,n,s,o;n={online_throttling_100_per_hour:e/(100/3600),online_no_throttling_10_per_second:e/10,offline_slow_hashing_1e4_per_second:e/1e4,offline_fast_hashing_1e10_per_second:e/1e10},t={};for(s in n)o=n[s],t[s]=this.display_time(o);return{crack_times_seconds:n,crack_times_display:t,score:this.guesses_to_score(e)}},guesses_to_score:function(e){var t;return t=5,1e3+t>e?0:1e6+t>e?1:1e8+t>e?2:1e10+t>e?3:4},display_time:function(e){var t,n,s,o,_,r,i,a,u,c;return i=60,r=60*i,s=24*r,a=31*s,c=12*a,n=100*c,u=1>e?[null,"less than a second"]:i>e?(t=Math.round(e),[t,t+" second"]):r>e?(t=Math.round(e/i),[t,t+" minute"]):s>e?(t=Math.round(e/r),[t,t+" hour"]):a>e?(t=Math.round(e/s),[t,t+" day"]):c>e?(t=Math.round(e/a),[t,t+" month"]):n>e?(t=Math.round(e/c),[t,t+" year"]):[null,"centuries"],o=u[0],_=u[1],null!=o&&1!==o&&(_+="s"),_}},module.exports=time_estimates},{}]},{},[4])(4)}),!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,e.Clipboard=t()}}(function(){var t;return function t(e,n,o){function i(c,a){if(!n[c]){if(!e[c]){var s="function"==typeof require&&require;if(!a&&s)return s(c,!0);if(r)return r(c,!0);var l=new Error("Cannot find module '"+c+"'");throw l.code="MODULE_NOT_FOUND",l}var u=n[c]={exports:{}};e[c][0].call(u.exports,function(t){var n=e[c][1][t];return i(n?n:t)},u,u.exports,t,e,n,o)}return n[c].exports}for(var r="function"==typeof require&&require,c=0;co;o++)n[o].fn.apply(n[o].ctx,e);return this},off:function(t,e){var n=this.e||(this.e={}),o=n[t],i=[];if(o&&e)for(var r=0,c=o.length;c>r;r++)o[r].fn!==e&&o[r].fn._!==e&&i.push(o[r]);return i.length?n[t]=i:delete n[t],this}},e.exports=o},{}],8:[function(e,n,o){!function(i,r){if("function"==typeof t&&t.amd)t(["module","select"],r);else if("undefined"!=typeof o)r(n,e("select"));else{var c={exports:{}};r(c,i.select),i.clipboardAction=c.exports}}(this,function(t,e){function n(t){return t&&t.__esModule?t:{default:t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}var i=n(e),r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol?"symbol":typeof t},c=function(){function t(t,e){for(var n=0;n=a.minLength&&d.length<=a.maxLength&&a.allowedTagsPattern.test(d)&&!i.findInObjectArray(k.items,b,a.keyProperty||a.displayProperty);return g.when(f&&c({$tag:b})).then(i.promisifyValue)},j=function(a){return g.when(d({$tag:a})).then(i.promisifyValue)},k.items=[],k.addText=function(a){var b={};return f(b,a),k.add(b)},k.add=function(c){var d=e(c);return a.replaceSpacesWithDashes&&(d=i.replaceSpacesWithDashes(d)),f(c,d),h(c).then(function(){k.items.push(c),b.trigger("tag-added",{$tag:c})}).catch(function(){d&&b.trigger("invalid-tag",{$tag:c})})},k.remove=function(a){var c=k.items[a];return j(c).then(function(){return k.items.splice(a,1),k.clearSelection(),b.trigger("tag-removed",{$tag:c}),c})},k.select=function(a){0>a?a=k.items.length-1:a>=k.items.length&&(a=0),k.index=a,k.selected=k.items[a]},k.selectPrior=function(){k.select(--k.index)},k.selectNext=function(){k.select(++k.index)},k.removeSelected=function(){return k.remove(k.index)},k.clearSelection=function(){k.selected=null,k.index=-1},k.clearSelection(),k}function k(a){return-1!==c.indexOf(a)}return{restrict:"E",require:"ngModel",scope:{tags:"=ngModel",text:"=?",templateScope:"=?",tagClass:"&",onTagAdding:"&",onTagAdded:"&",onInvalidTag:"&",onTagRemoving:"&",onTagRemoved:"&",onTagClicked:"&"},replace:!1,transclude:!0,templateUrl:"ngTagsInput/tags-input.html",controller:["$scope","$attrs","$element",function(a,c,d){a.events=i.simplePubSub(),h.load("tagsInput",a,c,{template:[String,"ngTagsInput/tag-item.html"],type:[String,"text",k],placeholder:[String,"Add a tag"],tabindex:[Number,null],removeTagSymbol:[String,String.fromCharCode(215)],replaceSpacesWithDashes:[Boolean,!0],minLength:[Number,3],maxLength:[Number,b],addOnEnter:[Boolean,!0],addOnSpace:[Boolean,!1],addOnComma:[Boolean,!0],addOnBlur:[Boolean,!0],addOnPaste:[Boolean,!1],pasteSplitPattern:[RegExp,/,/],allowedTagsPattern:[RegExp,/.+/],enableEditingLastTag:[Boolean,!1],minTags:[Number,0],maxTags:[Number,b],displayProperty:[String,"text"],keyProperty:[String,""],allowLeftoverText:[Boolean,!1],addFromAutocompleteOnly:[Boolean,!1],spellcheck:[Boolean,!0]}),a.tagList=new j(a.options,a.events,i.handleUndefinedResult(a.onTagAdding,!0),i.handleUndefinedResult(a.onTagRemoving,!0)),this.registerAutocomplete=function(){return d.find("input"),{addTag:function(b){return a.tagList.add(b)},getTags:function(){return a.tagList.items},getCurrentTagText:function(){return a.newTag.text()},getOptions:function(){return a.options},getTemplateScope:function(){return a.templateScope},on:function(b,c){return a.events.on(b,c,!0),this}}},this.registerTagItem=function(){return{getOptions:function(){return a.options},removeTag:function(b){a.disabled||a.tagList.remove(b)}}}}],link:function(b,c,g,h){var j,k,l=[a.enter,a.comma,a.space,a.backspace,a.delete,a.left,a.right],m=b.tagList,n=b.events,o=b.options,p=c.find("input"),q=["minTags","maxTags","allowLeftoverText"];j=function(){h.$setValidity("maxTags",m.items.length<=o.maxTags),h.$setValidity("minTags",m.items.length>=o.minTags),h.$setValidity("leftoverText",!(!b.hasFocus&&!o.allowLeftoverText)||!b.newTag.text())},k=function(){d(function(){p[0].focus()})},h.$isEmpty=function(a){return!a||!a.length},b.newTag={text:function(a){return angular.isDefined(a)?(b.text=a,void n.trigger("input-change",a)):b.text||""},invalid:null},b.track=function(a){return a[o.keyProperty||o.displayProperty]},b.getTagClass=function(a,c){var d=a===m.selected;return[b.tagClass({$tag:a,$index:c,$selected:d}),{selected:d}]},b.$watch("tags",function(a){a?(m.items=i.makeObjectArray(a,o.displayProperty),b.tags=m.items):m.items=[]}),b.$watch("tags.length",function(){j(),h.$validate()}),g.$observe("disabled",function(a){b.disabled=a}),b.eventHandlers={input:{keydown:function(a){n.trigger("input-keydown",a)},focus:function(){b.hasFocus||(b.hasFocus=!0,n.trigger("input-focus"))},blur:function(){d(function(){var a=e.prop("activeElement"),d=a===p[0],f=c[0].contains(a);!d&&f||(b.hasFocus=!1,n.trigger("input-blur"))})},paste:function(a){a.getTextData=function(){var b=a.clipboardData||a.originalEvent&&a.originalEvent.clipboardData;return b?b.getData("text/plain"):f.clipboardData.getData("Text")},n.trigger("input-paste",a)}},host:{click:function(){b.disabled||k()}},tag:{click:function(a){n.trigger("tag-clicked",{$tag:a})}}},n.on("tag-added",b.onTagAdded).on("invalid-tag",b.onInvalidTag).on("tag-removed",b.onTagRemoved).on("tag-clicked",b.onTagClicked).on("tag-added",function(){b.newTag.text("")}).on("tag-added tag-removed",function(){b.tags=m.items,h.$setDirty(),k()}).on("invalid-tag",function(){b.newTag.invalid=!0}).on("option-change",function(a){-1!==q.indexOf(a.name)&&j()}).on("input-change",function(){m.clearSelection(),b.newTag.invalid=null}).on("input-focus",function(){c.triggerHandler("focus"),h.$setValidity("leftoverText",!0)}).on("input-blur",function(){o.addOnBlur&&!o.addFromAutocompleteOnly&&m.addText(b.newTag.text()),c.triggerHandler("blur"),j()}).on("input-keydown",function(c){var d,e,f,g,h=c.keyCode,j={};i.isModifierOn(c)||-1===l.indexOf(h)||(j[a.enter]=o.addOnEnter,j[a.comma]=o.addOnComma,j[a.space]=o.addOnSpace,d=!o.addFromAutocompleteOnly&&j[h],e=(h===a.backspace||h===a.delete)&&m.selected,g=h===a.backspace&&0===b.newTag.text().length&&o.enableEditingLastTag,f=(h===a.backspace||h===a.left||h===a.right)&&0===b.newTag.text().length&&!o.enableEditingLastTag,d?m.addText(b.newTag.text()):g?(m.selectPrior(),m.removeSelected().then(function(a){a&&b.newTag.text(a[o.displayProperty])})):e?m.removeSelected():f&&(h===a.left||h===a.backspace?m.selectPrior():h===a.right&&m.selectNext()),(d||f||e||g)&&c.preventDefault())}).on("input-paste",function(a){if(o.addOnPaste){var b=a.getTextData(),c=b.split(o.pasteSplitPattern);c.length>1&&(c.forEach(function(a){m.addText(a)}),a.preventDefault())}})}}}]),d.directive("tiTagItem",["tiUtil",function(a){return{restrict:"E",require:"^tagsInput",template:'',scope:{$scope:"=scope",data:"="},link:function(b,c,d,e){var f=e.registerTagItem(),g=f.getOptions();b.$$template=g.template,b.$$removeTagSymbol=g.removeTagSymbol,b.$getDisplayText=function(){return a.safeToString(b.data[g.displayProperty])},b.$removeTag=function(){f.removeTag(b.$index)},b.$watch("$parent.$index",function(a){b.$index=a})}}}]),d.directive("autoComplete",["$document","$timeout","$sce","$q","tagsInputConfig","tiUtil",function(b,c,d,e,f,g){function h(a,b,c){var d,f,h,i={};return h=function(){return b.tagsInput.keyProperty||b.tagsInput.displayProperty},d=function(a,c){return a.filter(function(a){return!g.findInObjectArray(c,a,h(),function(a,c){return b.tagsInput.replaceSpacesWithDashes&&(a=g.replaceSpacesWithDashes(a),c=g.replaceSpacesWithDashes(c)),g.defaultComparer(a,c)})})},i.reset=function(){f=null,i.items=[],i.visible=!1,i.index=-1,i.selected=null,i.query=null},i.show=function(){b.selectFirstMatch?i.select(0):i.selected=null,i.visible=!0},i.load=g.debounce(function(c,j){i.query=c;var k=e.when(a({$query:c}));f=k,k.then(function(a){k===f&&(a=g.makeObjectArray(a.data||a,h()),a=d(a,j),i.items=a.slice(0,b.maxResultsToShow),i.items.length>0?i.show():i.reset())})},b.debounceDelay),i.selectNext=function(){i.select(++i.index)},i.selectPrior=function(){i.select(--i.index)},i.select=function(a){0>a?a=i.items.length-1:a>=i.items.length&&(a=0),i.index=a,i.selected=i.items[a],c.trigger("suggestion-selected",a)},i.reset(),i}function i(a,b){var c=a.find("li").eq(b),d=c.parent(),e=c.prop("offsetTop"),f=c.prop("offsetHeight"),g=d.prop("clientHeight"),h=d.prop("scrollTop");h>e?d.prop("scrollTop",e):e+f>g+h&&d.prop("scrollTop",e+f-g)}return{restrict:"E",require:"^tagsInput",scope:{source:"&",matchClass:"&"},templateUrl:"ngTagsInput/auto-complete.html",controller:["$scope","$element","$attrs",function(a,b,c){a.events=g.simplePubSub(),f.load("autoComplete",a,c,{template:[String,"ngTagsInput/auto-complete-match.html"],debounceDelay:[Number,100],minLength:[Number,3],highlightMatchedText:[Boolean,!0],maxResultsToShow:[Number,10],loadOnDownArrow:[Boolean,!1],loadOnEmpty:[Boolean,!1],loadOnFocus:[Boolean,!1],selectFirstMatch:[Boolean,!0],displayProperty:[String,""]}),a.suggestionList=new h(a.source,a.options,a.events),this.registerAutocompleteMatch=function(){return{getOptions:function(){return a.options},getQuery:function(){return a.suggestionList.query}}}}],link:function(b,c,d,e){var f,h=[a.enter,a.tab,a.escape,a.up,a.down],j=b.suggestionList,k=e.registerAutocomplete(),l=b.options,m=b.events;l.tagsInput=k.getOptions(),f=function(a){return a&&a.length>=l.minLength||!a&&l.loadOnEmpty},b.templateScope=k.getTemplateScope(),b.addSuggestionByIndex=function(a){j.select(a),b.addSuggestion()},b.addSuggestion=function(){var a=!1;return j.selected&&(k.addTag(angular.copy(j.selected)),j.reset(),a=!0),a},b.track=function(a){return a[l.tagsInput.keyProperty||l.tagsInput.displayProperty]},b.getSuggestionClass=function(a,c){var d=a===j.selected;return[b.matchClass({$match:a,$index:c,$selected:d}),{selected:d}]},k.on("tag-added tag-removed invalid-tag input-blur",function(){j.reset()}).on("input-change",function(a){f(a)?j.load(a,k.getTags()):j.reset()}).on("input-focus",function(){var a=k.getCurrentTagText();l.loadOnFocus&&f(a)&&j.load(a,k.getTags())}).on("input-keydown",function(c){var d=c.keyCode,e=!1;if(!g.isModifierOn(c)&&-1!==h.indexOf(d))return j.visible?d===a.down?(j.selectNext(),e=!0):d===a.up?(j.selectPrior(),e=!0):d===a.escape?(j.reset(),e=!0):d!==a.enter&&d!==a.tab||(e=b.addSuggestion()):d===a.down&&b.options.loadOnDownArrow&&(j.load(k.getCurrentTagText(),k.getTags()),e=!0),e?(c.preventDefault(),c.stopImmediatePropagation(),!1):void 0}),m.on("suggestion-selected",function(a){i(c,a)})}}}]),d.directive("tiAutocompleteMatch",["$sce","tiUtil",function(a,b){return{restrict:"E",require:"^autoComplete",template:'',scope:{$scope:"=scope",data:"="},link:function(c,d,e,f){var g=f.registerAutocompleteMatch(),h=g.getOptions();c.$$template=h.template,c.$index=c.$parent.$index,c.$highlight=function(c){return h.highlightMatchedText&&(c=b.safeHighlight(c,g.getQuery())),a.trustAsHtml(c)},c.$getDisplayText=function(){return b.safeToString(c.data[h.displayProperty||h.tagsInput.displayProperty])}}}}]),d.directive("tiTranscludeAppend",function(){return function(a,b,c,d,e){e(function(a){b.append(a)})}}),d.directive("tiAutosize",["tagsInputConfig",function(a){return{restrict:"A",require:"ngModel",link:function(b,c,d,e){var f,g,h=a.getTextAutosizeThreshold();f=angular.element(''),f.css("display","none").css("visibility","hidden").css("width","auto").css("white-space","pre"),c.parent().append(f),g=function(a){var b,e=a;return angular.isString(e)&&0===e.length&&(e=d.placeholder),e&&(f.text(e),f.css("display",""),b=f.prop("offsetWidth"),f.css("display","none")),c.css("width",b?b+h+"px":""),a},e.$parsers.unshift(g),e.$formatters.unshift(g),d.$observe("placeholder",function(a){e.$modelValue||g(a)})}}}]),d.directive("tiBindAttrs",function(){return function(a,b,c){a.$watch(c.tiBindAttrs,function(a){angular.forEach(a,function(a,b){c.$set(b,a)})},!0)}}),d.provider("tagsInputConfig",function(){var a={},b={},c=3;this.setDefaults=function(b,c){return a[b]=c,this},this.setActiveInterpolation=function(a,c){return b[a]=c,this},this.setTextAutosizeThreshold=function(a){return c=a,this},this.$get=["$interpolate",function(d){var e={};return e[String]=function(a){return a},e[Number]=function(a){return parseInt(a,10)},e[Boolean]=function(a){return"true"===a.toLowerCase()},e[RegExp]=function(a){return new RegExp(a)},{load:function(c,f,g,h){var i=function(){return!0};f.options={},angular.forEach(h,function(h,j){var k,l,m,n,o,p;k=h[0],l=h[1],m=h[2]||i,n=e[k],o=function(){var b=a[c]&&a[c][j];return angular.isDefined(b)?b:l},p=function(a){f.options[j]=a&&m(a)?n(a):o()},b[c]&&b[c][j]?g.$observe(j,function(a){p(a),f.events.trigger("option-change",{name:j,newValue:a})}):p(g[j]&&d(g[j])(f.$parent))})},getTextAutosizeThreshold:function(){return c}}}]}),d.factory("tiUtil",["$timeout","$q",function(a,b){var c={};return c.debounce=function(b,c){var d;return function(){var e=arguments;a.cancel(d),d=a(function(){b.apply(null,e)},c)}},c.makeObjectArray=function(a,b){if(!angular.isArray(a)||0===a.length||angular.isObject(a[0]))return a;var c=[];return a.forEach(function(a){var d={};d[b]=a,c.push(d)}),c},c.findInObjectArray=function(a,b,d,e){var f=null;return e=e||c.defaultComparer,a.some(function(a){return e(a[d],b[d])?(f=a,!0):void 0}),f},c.defaultComparer=function(a,b){return c.safeToString(a).toLowerCase()===c.safeToString(b).toLowerCase()},c.safeHighlight=function(a,b){function d(a){return a.replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1")}if(!b)return a;a=c.encodeHTML(a),b=c.encodeHTML(b);var e=new RegExp("&[^;]+;|"+d(b),"gi");return a.replace(e,function(a){return a.toLowerCase()===b.toLowerCase()?""+a+"":a})},c.safeToString=function(a){return angular.isUndefined(a)||null==a?"":a.toString().trim()},c.encodeHTML=function(a){return c.safeToString(a).replace(/&/g,"&").replace(//g,">")},c.handleUndefinedResult=function(a,b){return function(){var c=a.apply(null,arguments);return angular.isUndefined(c)?b:c}},c.replaceSpacesWithDashes=function(a){return c.safeToString(a).replace(/\s/g,"-")},c.isModifierOn=function(a){return a.shiftKey||a.ctrlKey||a.altKey||a.metaKey},c.promisifyValue=function(a){return a=!!angular.isUndefined(a)||a,b[a?"when":"reject"]()},c.simplePubSub=function(){var a={};return{on:function(b,c,d){return b.split(" ").forEach(function(b){a[b]||(a[b]=[]);var e=d?[].unshift:[].push;e.call(a[b],c)}),this},trigger:function(b,d){var e=a[b]||[];return e.every(function(a){return c.handleUndefinedResult(a,!0)(d)}),this}}},c}]),d.run(["$templateCache",function(a){a.put("ngTagsInput/tags-input.html",'
'),a.put("ngTagsInput/tag-item.html",' '),a.put("ngTagsInput/auto-complete.html",'
'),a.put("ngTagsInput/auto-complete-match.html",'')}])}(),angular.module("xeditable",[]).value("editableOptions",{theme:"default",icon_set:"default",buttons:"right",blurElem:"cancel",blurForm:"ignore",activate:"focus",isDisabled:!1,activationEvent:"click"}),angular.module("xeditable").directive("editableBsdate",["editableDirectiveFactory",function(a){return a({directiveName:"editableBsdate",inputTpl:"
",render:function(){this.parent.render.call(this);var a=angular.element('');a.attr("uib-datepicker-popup",this.attrs.eDatepickerPopupXEditable||"yyyy/MM/dd"),a.attr("is-open",this.attrs.eIsOpen),a.attr("date-disabled",this.attrs.eDateDisabled),a.attr("uib-datepicker-popup",this.attrs.eDatepickerPopup),a.attr("year-range",this.attrs.eYearRange||20),a.attr("show-button-bar",this.attrs.eShowButtonBar||!0),a.attr("current-text",this.attrs.eCurrentText||"Today"),a.attr("clear-text",this.attrs.eClearText||"Clear"),a.attr("close-text",this.attrs.eCloseText||"Done"),a.attr("close-on-date-selection",this.attrs.eCloseOnDateSelection||!0),a.attr("datepicker-append-to-body",this.attrs.eDatePickerAppendToBody||!1),a.attr("date-disabled",this.attrs.eDateDisabled),a.attr("name",this.attrs.eName),a.attr("on-open-focus",this.attrs.eOnOpenFocus||!0),a.attr("ng-readonly",this.attrs.eReadonly||!1),this.attrs.eNgChange&&(a.attr("ng-change",this.attrs.eNgChange),this.inputEl.removeAttr("ng-change")),this.attrs.eStyle&&(a.attr("style",this.attrs.eStyle),this.inputEl.removeAttr("style")),this.scope.dateOptions={formatDay:this.attrs.eFormatDay||"dd",formatMonth:this.attrs.eFormatMonth||"MMMM",formatYear:this.attrs.eFormatYear||"yyyy",formatDayHeader:this.attrs.eFormatDayHeader||"EEE",formatDayTitle:this.attrs.eFormatDayTitle||"MMMM yyyy",formatMonthTitle:this.attrs.eFormatMonthTitle||"yyyy",showWeeks:!this.attrs.eShowWeeks||"true"===this.attrs.eShowWeeks.toLowerCase(),startingDay:this.attrs.eStartingDay||0,minMode:this.attrs.eMinMode||"day",maxMode:this.attrs.eMaxMode||"year",initDate:this.scope.$eval(this.attrs.eInitDate)||new Date,datepickerMode:this.attrs.eDatepickerMode||"day",maxDate:this.scope.$eval(this.attrs.eMaxDate)||null,minDate:this.scope.$eval(this.attrs.eMinDate)||null};var b=angular.isDefined(this.attrs.eShowCalendarButton)?this.attrs.eShowCalendarButton:"true";if("true"===b){var c=angular.element(''),d=angular.element('');c.attr("ng-click",this.attrs.eNgClick),d.append(c),this.inputEl.append(d)}else a.attr("ng-click",this.attrs.eNgClick);a.attr("datepicker-options","dateOptions"),this.inputEl.prepend(a),this.inputEl.removeAttr("class"),this.inputEl.removeAttr("ng-click"),this.inputEl.removeAttr("is-open"),this.inputEl.removeAttr("init-date"),this.inputEl.removeAttr("datepicker-popup"),this.inputEl.removeAttr("required"),this.inputEl.removeAttr("ng-model"),this.inputEl.removeAttr("date-picker-append-to-body"),this.inputEl.removeAttr("name"),this.inputEl.attr("class","input-group")}})}]),angular.module("xeditable").directive("editableBstime",["editableDirectiveFactory",function(a){return a({directiveName:"editableBstime",inputTpl:"",render:function(){this.parent.render.call(this);var a=angular.element('
');a.attr("ng-model",this.inputEl.attr("ng-model")),this.inputEl.removeAttr("ng-model"),this.attrs.eNgChange&&(a.attr("ng-change",this.inputEl.attr("ng-change")),this.inputEl.removeAttr("ng-change")),this.inputEl.wrap(a)}})}]),angular.module("xeditable").directive("editableCheckbox",["editableDirectiveFactory",function(a){return a({directiveName:"editableCheckbox",inputTpl:'',render:function(){this.parent.render.call(this),this.attrs.eTitle&&(this.inputEl.wrap(""),this.inputEl.parent().append(""+this.attrs.eTitle+""))},autosubmit:function(){var a=this;a.inputEl.bind("change",function(){setTimeout(function(){a.scope.$apply(function(){a.scope.$form.$submit()})},500)})}})}]),angular.module("xeditable").directive("editableChecklist",["editableDirectiveFactory","editableNgOptionsParser",function(a,b){return a({directiveName:"editableChecklist",inputTpl:"",useCopy:!0,render:function(){this.parent.render.call(this);var a=b(this.attrs.eNgOptions),c='';this.inputEl.removeAttr("ng-model"),this.inputEl.removeAttr("ng-options"),this.inputEl.html(c)}})}]),angular.module("xeditable").directive("editableCombodate",["editableDirectiveFactory","editableCombodate",function(a,b){return a({directiveName:"editableCombodate",inputTpl:'',render:function(){this.parent.render.call(this);var a={value:new Date(this.scope.$data)},c=this;angular.forEach(["format","template","minYear","maxYear","yearDescending","minuteStep","secondStep","firstItem","errorClass","customClass","roundTime","smartDays"],function(b){var d="e"+b.charAt(0).toUpperCase()+b.slice(1);d in c.attrs&&(a[b]=c.attrs[d])});var d=b.getInstance(this.inputEl,a);d.$widget.find("select").bind("change",function(a){c.scope.$data=new Date(d.getValue()).toISOString()})}})}]),function(){var a=function(a){return a.toLowerCase().replace(/-(.)/g,function(a,b){return b.toUpperCase()})},b="text|password|email|tel|number|url|search|color|date|datetime|datetime-local|time|month|week|file".split("|");angular.forEach(b,function(b){var c=a("editable-"+b);angular.module("xeditable").directive(c,["editableDirectiveFactory",function(a){return a({directiveName:c,inputTpl:'',render:function(){if(this.parent.render.call(this),this.attrs.eLabel){var a=angular.element("");this.inputEl.parent().prepend(a)}this.attrs.eFormclass&&this.editorEl.addClass(this.attrs.eFormclass)}})}])}),angular.module("xeditable").directive("editableRange",["editableDirectiveFactory",function(a){return a({directiveName:"editableRange",inputTpl:'',render:function(){this.parent.render.call(this),this.inputEl.after("{{$data}}")}})}])}(),angular.module("xeditable").directive("editableTagsInput",["editableDirectiveFactory","editableUtils",function(a,b){var c=function(a){for(var b=0,c=d.length;c>b;b++)if(d[b].name===a)return b},d=[],e=a({directiveName:"editableTagsInput",inputTpl:"",render:function(){var a=c(this.name);this.parent.render.call(this),this.inputEl.append(b.rename("auto-complete",d[a].element)),this.inputEl.removeAttr("ng-model"),this.inputEl.attr("ng-model","$parent.$data")}}),f=e.link;return e.link=function(a,b,c,e){var g=b.find("editable-tags-input-auto-complete");return d.push({name:c.name||c.editableTagsInput,element:g.clone()}),g.remove(),f(a,b,c,e)},e}]),angular.module("xeditable").directive("editableRadiolist",["editableDirectiveFactory","editableNgOptionsParser",function(a,b){return a({directiveName:"editableRadiolist",inputTpl:"",render:function(){this.parent.render.call(this);var a=b(this.attrs.eNgOptions),c='';this.inputEl.removeAttr("ng-model"),this.inputEl.removeAttr("ng-options"),this.inputEl.html(c)},autosubmit:function(){var a=this;a.inputEl.bind("change",function(){setTimeout(function(){a.scope.$apply(function(){a.scope.$form.$submit()})},500)})}})}]),angular.module("xeditable").directive("editableSelect",["editableDirectiveFactory",function(a){return a({directiveName:"editableSelect",inputTpl:"",render:function(){if(this.parent.render.call(this),this.attrs.ePlaceholder){var a=angular.element('");this.inputEl.append(a)}},autosubmit:function(){var a=this;a.inputEl.bind("change",function(){a.scope.$apply(function(){a.scope.$form.$submit()})})}})}]),angular.module("xeditable").directive("editableTextarea",["editableDirectiveFactory",function(a){return a({directiveName:"editableTextarea",inputTpl:"",addListeners:function(){var a=this;a.parent.addListeners.call(a),a.single&&"no"!==a.buttons&&a.autosubmit()},autosubmit:function(){var a=this;a.inputEl.bind("keydown",function(b){(b.ctrlKey||b.metaKey)&&13===b.keyCode&&a.scope.$apply(function(){a.scope.$form.$submit()})})}})}]),angular.module("xeditable").directive("editableUiSelect",["editableDirectiveFactory","editableUtils",function(a,b){var c=function(a){for(var b=0,c=d.length;c>b;b++)if(d[b].name===a)return b},d=[],e=[],f=a({directiveName:"editableUiSelect",inputTpl:"",render:function(){var a=c(this.name);this.parent.render.call(this),this.inputEl.append(b.rename("ui-select-match",d[a].element)),this.inputEl.append(b.rename("ui-select-choices",e[a].element)),this.inputEl.removeAttr("ng-model"),this.inputEl.attr("ng-model","$parent.$parent.$data")}}),g=f.link;return f.link=function(a,b,c,f){var h=b.find("editable-ui-select-match"),i=b.find("editable-ui-select-choices");return d.push({name:c.name||c.editableUiSelect,element:h.clone()}),e.push({name:c.name||c.editableUiSelect,element:i.clone()}),h.remove(),i.remove(),g(a,b,c,f)},f}]),angular.module("xeditable").factory("editableController",["$q","editableUtils",function(a,b){function c(a,c,d,e,f,g,h,i,j,k){var l,m,n=this;n.scope=a,n.elem=d,n.attrs=c,n.inputEl=null,n.editorEl=null,n.single=!0,n.error="",n.theme=f[c.editableTheme]||f[h.theme]||f.default,n.parent={},n.icon_set="default"===h.icon_set?g.default[h.theme]:g.external[h.icon_set],n.inputTpl="",n.directiveName="",n.useCopy=!1,n.single=null,n.buttons="right",n.init=function(b){if(n.single=b,n.name=c.eName||c[n.directiveName],!c[n.directiveName])throw"You should provide value for `"+n.directiveName+"` in editable element!";l=e(c[n.directiveName]),n.single?n.buttons=n.attrs.buttons||h.buttons:n.buttons="no",c.eName&&n.scope.$watch("$data",function(a){n.scope.$form.$data[c.eName]=a}),c.onshow&&(n.onshow=function(){return n.catchError(e(c.onshow)(a))}),c.onhide&&(n.onhide=function(){return e(c.onhide)(a)}),c.oncancel&&(n.oncancel=function(){return e(c.oncancel)(a)}),c.onbeforesave&&(n.onbeforesave=function(){return n.catchError(e(c.onbeforesave)(a))}),c.onaftersave&&(n.onaftersave=function(){return n.catchError(e(c.onaftersave)(a))}),a.$parent.$watch(c[n.directiveName],function(a,b){n.setLocalValue(),n.handleEmpty()})},n.render=function(){var a=n.theme;n.inputEl=angular.element(n.inputTpl),n.controlsEl=angular.element(a.controlsTpl),n.controlsEl.append(n.inputEl),"no"!==n.buttons&&(n.buttonsEl=angular.element(a.buttonsTpl),n.submitEl=angular.element(a.submitTpl),n.cancelEl=angular.element(a.cancelTpl),n.icon_set&&(n.submitEl.find("span").addClass(n.icon_set.ok),n.cancelEl.find("span").addClass(n.icon_set.cancel)),n.buttonsEl.append(n.submitEl).append(n.cancelEl),n.controlsEl.append(n.buttonsEl),n.inputEl.addClass("editable-has-buttons")),n.errorEl=angular.element(a.errorTpl),n.controlsEl.append(n.errorEl),n.editorEl=angular.element(n.single?a.formTpl:a.noformTpl),n.editorEl.append(n.controlsEl);for(var d in c.$attr)if(!(d.length<=1)){var e=!1,f=d.substring(1,2);if("e"===d.substring(0,1)&&f===f.toUpperCase()&&(e=d.substring(1),"Form"!==e&&"NgSubmit"!==e)){e=e.substring(0,1).toLowerCase()+b.camelToDash(e.substring(1));var g="value"!==e&&""===c[d]?e:c[d];n.inputEl.attr(e,g)}}n.inputEl.addClass("editable-input"),n.inputEl.attr("ng-model","$parent.$data"),n.editorEl.addClass(b.camelToDash(n.directiveName)),n.single&&(n.editorEl.attr("editable-form","$form"),n.editorEl.attr("blur",n.attrs.blur||("no"===n.buttons?"cancel":h.blurElem))),angular.isFunction(a.postrender)&&a.postrender.call(n)},n.setLocalValue=function(){n.scope.$data=n.useCopy?angular.copy(l(a.$parent)):l(a.$parent)};var o=null;n.show=function(){return n.setLocalValue(),n.render(),d.after(n.editorEl),o=a.$new(),j(n.editorEl)(o),n.addListeners(),d.addClass("editable-hide"),n.onshow()},n.hide=function(){return o.$destroy(),n.controlsEl.remove(),n.editorEl.remove(),d.removeClass("editable-hide"),n.onhide()},n.cancel=function(){n.oncancel()},n.addListeners=function(){n.inputEl.bind("keyup",function(a){if(n.single)switch(a.keyCode){case 27:n.scope.$apply(function(){n.scope.$form.$cancel()})}}),n.single&&"no"===n.buttons&&n.autosubmit(),n.editorEl.bind("click",function(a){a.which&&1!==a.which||n.scope.$form.$visible&&(n.scope.$form._clicked=!0)})},n.setWaiting=function(a){a?(m=!n.inputEl.attr("disabled")&&!n.inputEl.attr("ng-disabled")&&!n.inputEl.attr("ng-enabled"),m&&(n.inputEl.attr("disabled","disabled"),n.buttonsEl&&n.buttonsEl.find("button").attr("disabled","disabled"))):m&&(n.inputEl.removeAttr("disabled"),n.buttonsEl&&n.buttonsEl.find("button").removeAttr("disabled"))},n.activate=function(a,b){setTimeout(function(){var c=n.inputEl[0];"focus"===h.activate&&c.focus&&(a&&(b=b||a,c.onfocus=function(){var c=this;setTimeout(function(){c.setSelectionRange(a,b)})}),c.focus()),"select"===h.activate&&c.select&&c.select()},0)},n.setError=function(b){angular.isObject(b)||(a.$error=b,n.error=b)},n.catchError=function(a,b){return angular.isObject(a)&&b!==!0?k.when(a).then(angular.bind(this,function(a){this.catchError(a,!0)}),angular.bind(this,function(a){this.catchError(a,!0)})):b&&angular.isObject(a)&&a.status&&200!==a.status&&a.data&&angular.isString(a.data)?(this.setError(a.data),a=a.data):angular.isString(a)&&this.setError(a), a},n.save=function(){l.assign(a.$parent,n.useCopy?angular.copy(n.scope.$data):n.scope.$data)},n.handleEmpty=function(){var b=l(a.$parent),c=null===b||void 0===b||""===b||angular.isArray(b)&&0===b.length;d.toggleClass("editable-empty",c)},n.autosubmit=angular.noop,n.onshow=angular.noop,n.onhide=angular.noop,n.oncancel=angular.noop,n.onbeforesave=angular.noop,n.onaftersave=angular.noop}return c.$inject=["$scope","$attrs","$element","$parse","editableThemes","editableIcons","editableOptions","$rootScope","$compile","$q"],c}]),angular.module("xeditable").factory("editableDirectiveFactory",["$parse","$compile","editableThemes","$rootScope","$document","editableController","editableFormController","editableOptions",function(a,b,c,d,e,f,g,h){return function(b){return{restrict:"A",scope:!0,require:[b.directiveName,"?^form"],controller:f,link:function(c,f,i,j){var k,l=j[0],m=!1;if(j[1])k=j[1],m=void 0===i.eSingle;else if(i.eForm){var n=a(i.eForm)(c);if(n)k=n,m=!0;else if(f&&"function"==typeof f.parents&&f.parents().last().find("form[name="+i.eForm+"]").length)k=null,m=!0;else for(var o=0;o=0&&a.splice(c,1),b},camelToDash:function(a){var b=/[A-Z]/g;return a.replace(b,function(a,b){return(b?"-":"")+a.toLowerCase()})},dashToCamel:function(a){var b=/([\:\-\_]+(.))/g,c=/^moz([A-Z])/;return a.replace(b,function(a,b,c,d){return d?c.toUpperCase():c}).replace(c,"Moz$1")},rename:function(a,b){var c=angular.element("<"+a+"/>");c.html(b.html());for(var d=b[0].attributes,e=0;e').html(this.getTemplate()),this.initCombos(),this.options.smartDays){var a=this;this.$widget.find("select").bind("change",function(b){(angular.element(b.target).hasClass("month")||angular.element(b.target).hasClass("year"))&&a.fillCombo("day")})}this.$widget.find("select").css("width","auto"),this.$element.css("display","none").after(this.$widget),this.setValue(this.$element.val()||this.options.value)},getTemplate:function(){var a=this.options.template,b=this.options.customClass;return angular.forEach(this.map,function(b,c){b=b[0];var d=new RegExp(b+"+"),e=b.length>1?b.substring(1,2):b;a=a.replace(d,"{"+e+"}")}),a=a.replace(/ /g," "),angular.forEach(this.map,function(c,d){c=c[0];var e=c.length>1?c.substring(1,2):c;a=a.replace("{"+e+"}",'')}),a},initCombos:function(){for(var a in this.map){var b=this.$widget[0].querySelectorAll("."+a);this["$"+a]=b.length?angular.element(b):null,this.fillCombo(a)}},fillCombo:function(a){var b=this["$"+a];if(b){var c="fill"+a.charAt(0).toUpperCase()+a.slice(1),d=this[c](),e=b.val();b.html("");for(var f=0;f'+d[f][1]+"");b.val(e)}},fillCommon:function(a){var b,c=[];if("name"===this.options.firstItem){b=moment.relativeTime||moment.langData()._relativeTime;var d="function"==typeof b[a]?b[a](1,!0,a,!1):b[a];d=d.split(" ").reverse()[0],c.push(["",d])}else"empty"===this.options.firstItem&&c.push(["",""]);return c},fillDay:function(){var a,b,c=this.fillCommon("d"),d=-1!==this.options.template.indexOf("DD"),e=31;if(this.options.smartDays&&this.$month&&this.$year){var f=parseInt(this.$month.val(),10),g=parseInt(this.$year.val(),10);isNaN(f)||isNaN(g)||(e=moment([g,f]).daysInMonth())}for(b=1;e>=b;b++)a=d?this.leadZero(b):b,c.push([b,a]);return c},fillMonth:function(){var a,b,c=this.fillCommon("M"),d=-1!==this.options.template.indexOf("MMMM"),e=-1!==this.options.template.indexOf("MMM"),f=-1!==this.options.template.indexOf("MM");for(b=0;11>=b;b++)a=d?moment().date(1).month(b).format("MMMM"):e?moment().date(1).month(b).format("MMM"):f?this.leadZero(b+1):b+1,c.push([b,a]);return c},fillYear:function(){var a,b,c=[],d=-1!==this.options.template.indexOf("YYYY");for(b=this.options.maxYear;b>=this.options.minYear;b--)a=d?b:(b+"").substring(2),c[this.options.yearDescending?"push":"unshift"]([b,a]);return c=this.fillCommon("y").concat(c)},fillHour:function(){var a,b,c=this.fillCommon("h"),d=-1!==this.options.template.indexOf("h"),e=(-1!==this.options.template.indexOf("H"),-1!==this.options.template.toLowerCase().indexOf("hh")),f=d?1:0,g=d?12:23;for(b=f;g>=b;b++)a=e?this.leadZero(b):b,c.push([b,a]);return c},fillMinute:function(){var a,b,c=this.fillCommon("m"),d=-1!==this.options.template.indexOf("mm");for(b=0;59>=b;b+=this.options.minuteStep)a=d?this.leadZero(b):b,c.push([b,a]);return c},fillSecond:function(){var a,b,c=this.fillCommon("s"),d=-1!==this.options.template.indexOf("ss");for(b=0;59>=b;b+=this.options.secondStep)a=d?this.leadZero(b):b,c.push([b,a]);return c},fillAmpm:function(){var a=-1!==this.options.template.indexOf("a"),b=(-1!==this.options.template.indexOf("A"),[["am",a?"am":"AM"],["pm",a?"pm":"PM"]]);return b},getValue:function(a){var b,c={},d=this,e=!1;return angular.forEach(this.map,function(a,b){if("ampm"!==b){var f="day"===b?1:0;return c[b]=d["$"+b]?parseInt(d["$"+b].val(),10):f,isNaN(c[b])?(e=!0,!1):void 0}}),e?"":(this.$ampm&&(12===c.hour?c.hour="am"===this.$ampm.val()?0:12:c.hour="am"===this.$ampm.val()?c.hour:c.hour+12),b=moment([c.year,c.month,c.day,c.hour,c.minute,c.second]),this.highlight(b),a=void 0===a?this.options.format:a,null===a?b.isValid()?b:null:b.isValid()?b.format(a):"")},setValue:function(a){function b(a,b){var c={};return angular.forEach(a.children("option"),function(a,d){var e=angular.element(a).attr("value");if(""!==e){var f=Math.abs(e-b);("undefined"==typeof c.distance||f=12?(e.ampm="pm",e.hour>12&&(e.hour-=12)):(e.ampm="am",0===e.hour&&(e.hour=12))),angular.forEach(e,function(a,c){d["$"+c]&&("minute"===c&&d.options.minuteStep>1&&d.options.roundTime&&(a=b(d["$"+c],a)),"second"===c&&d.options.secondStep>1&&d.options.roundTime&&(a=b(d["$"+c],a)),d["$"+c].val(a))}),this.options.smartDays&&this.fillCombo("day"),this.$element.val(c.format(this.options.format)).triggerHandler("change"))}},highlight:function(a){a.isValid()?this.options.errorClass?this.$widget.removeClass(this.options.errorClass):this.$widget.find("select").css("border-color",this.borderColor):this.options.errorClass?this.$widget.addClass(this.options.errorClass):(this.borderColor||(this.borderColor=this.$widget.find("select").css("border-color")),this.$widget.find("select").css("border-color","red"))},leadZero:function(a){return 9>=a?"0"+a:a},destroy:function(){this.$widget.remove(),this.$element.removeData("combodate").show()}},{getInstance:function(b,c){return new a(b,c)}}}]),angular.module("xeditable").factory("editableIcons",function(){var a={default:{bs2:{ok:"icon-ok icon-white",cancel:"icon-remove"},bs3:{ok:"glyphicon glyphicon-ok",cancel:"glyphicon glyphicon-remove"}},external:{"font-awesome":{ok:"fa fa-check",cancel:"fa fa-times"}}};return a}),angular.module("xeditable").factory("editableThemes",function(){var a={default:{formTpl:'
',noformTpl:'',controlsTpl:'',inputTpl:"",errorTpl:'
',buttonsTpl:'',submitTpl:'',cancelTpl:''},bs2:{formTpl:'
',noformTpl:'',controlsTpl:'
',inputTpl:"",errorTpl:'
',buttonsTpl:'',submitTpl:'',cancelTpl:''},bs3:{formTpl:'
',noformTpl:'',controlsTpl:'
',inputTpl:"",errorTpl:'
',buttonsTpl:'',submitTpl:'',cancelTpl:'',buttonsClass:"",inputClass:"",postrender:function(){switch(this.directiveName){case"editableText":case"editableSelect":case"editableTextarea":case"editableEmail":case"editableTel":case"editableNumber":case"editableUrl":case"editableSearch":case"editableDate":case"editableDatetime":case"editableBsdate":case"editableTime":case"editableMonth":case"editableWeek":case"editablePassword":case"editableDatetimeLocal":if(this.inputEl.addClass("form-control"),this.theme.inputClass){if(this.inputEl.attr("multiple")&&("input-sm"===this.theme.inputClass||"input-lg"===this.theme.inputClass))break;this.inputEl.addClass(this.theme.inputClass)}break;case"editableCheckbox":this.editorEl.addClass("checkbox")}this.buttonsEl&&this.theme.buttonsClass&&this.buttonsEl.find("button").addClass(this.theme.buttonsClass)}},semantic:{formTpl:'
',noformTpl:'',controlsTpl:'
',inputTpl:"",errorTpl:'
',buttonsTpl:'',submitTpl:'',cancelTpl:''}};return a}),function(T){function z(a,c,b){var g=0,f=[0],h="",l=null,h=b||"UTF8";if("UTF8"!==h&&"UTF16"!==h)throw"encoding must be UTF8 or UTF16";if("HEX"===c){if(0!==a.length%2)throw"srcString of HEX type must be in byte increments";l=B(a),g=l.binLen,f=l.value}else if("ASCII"===c||"TEXT"===c)l=J(a,h),g=l.binLen,f=l.value;else{if("B64"!==c)throw"inputFormat must be HEX, TEXT, ASCII, or B64";l=K(a),g=l.binLen,f=l.value}this.getHash=function(a,c,b,h){var p,l=null,d=f.slice(),n=g;if(3===arguments.length?"number"!=typeof b&&(h=b,b=1):2===arguments.length&&(b=1),b!==parseInt(b,10)||1>b)throw"numRounds must a integer >= 1";switch(c){case"HEX":l=L;break;case"B64":l=M;break;default:throw"format must be HEX or B64"}if("SHA-1"===a)for(p=0;pp/8&&(d[b]&=4294967040),n=0;n<=b;n+=1)w[n]=909522486^d[n],x[n]=1549556828^d[n];return c="SHA-1"===c?y(x.concat(y(w.concat(f),a+g)),a+m):v(x.concat(v(w.concat(f),a+g,c)),a+m,c),l(c,N(s))}}function s(a,c){this.a=a,this.b=c}function J(a,c){var g,l,b=[],f=[],h=0;if("UTF8"===c)for(l=0;l>>12,f[1]=128|(4032&g)>>>6,f[2]=128|63&g):128>>6,f[1]=128|63&g):f[0]=g,g=0;g>>2]|=f[g]<<24-h%4*8,h+=1;else if("UTF16"===c)for(l=0;l>>2]|=a.charCodeAt(l)<<16-h%4*8,h+=2;return{value:b,binLen:8*h}}function B(a){var g,f,c=[],b=a.length;if(0!==b%2)throw"String of HEX type must be in byte increments";for(g=0;g>>3]|=f<<24-g%8*4}return{value:c,binLen:4*b}}function K(a){var g,f,h,l,r,c=[],b=0;if(-1===a.search(/^[a-zA-Z0-9=+\/]+$/))throw"Invalid character in base-64 string";if(g=a.indexOf("="),a=a.replace(/\=/g,""),-1!==g&&g>24);tmp&&(ret+=tmp),tmp=this._isASCII((16711680&int)>>16),tmp&&(ret+=tmp),tmp=this._isASCII((65280&int)>>8),tmp&&(ret+=tmp),tmp=this._isASCII(255&int),tmp&&(ret+=tmp)}return ret},_isASCII:function(data){return data>31&&data<127&&String.fromCharCode(data)}},initEngines:function(default_paranoia){paranoia_level=default_paranoia||10,sjcl.random.setDefaultParanoia(this.paranoia_level),sjcl.random.startCollectors(),console.warn("Crypto stuff initialized")}};CRYPTO.initEngines(),function(){angular.module("passmanApp",["ngAnimate","ngCookies","ngResource","ngRoute","ngSanitize","ngTouch","templates-main","LocalStorageModule","offClick","ngPasswordMeter","ngclipboard","xeditable","ngTagsInput","angularjs-datetime-picker","ui.sortable","pascalprecht.translate"]).config(function($routeProvider){$routeProvider.when("/",{templateUrl:"views/vaults.html",controller:"VaultCtrl"}).when("/vault/:vault_id",{templateUrl:"views/show_vault.html",controller:"CredentialCtrl"}).when("/vault/:vault_id/new",{templateUrl:"views/edit_credential.html",controller:"CredentialEditCtrl"}).when("/vault/:vault_id/edit/:credential_id",{templateUrl:"views/edit_credential.html",controller:"CredentialEditCtrl"}).when("/vault/:vault_id/:credential_id/share",{templateUrl:"views/share_credential.html",controller:"ShareCtrl"}).when("/vault/:vault_id/:credential_id/revisions",{templateUrl:"views/credential_revisions.html",controller:"RevisionCtrl"}).when("/vault/:vault_id/settings",{templateUrl:"views/settings.html",controller:"SettingsCtrl"}).otherwise({redirectTo:"/"})}).config(["$httpProvider",function($httpProvider){$httpProvider.defaults.headers.common.requesttoken=oc_requesttoken}]).config(function(localStorageServiceProvider){localStorageServiceProvider.setNotify(!0,!0)}).config(function($translateProvider){$translateProvider.useSanitizeValueStrategy("sanitizeParameters"),$translateProvider.useUrlLoader(OC.generateUrl("/apps/passman/api/v2/language")),$translateProvider.preferredLanguage("en")}),jQuery(document).ready(function(){var findItemByID=function(id){var credentials,foundItem=!1;return credentials=angular.element("#app-content-wrapper").scope().credentials,angular.forEach(credentials,function(credential){credential.credential_id===id&&(foundItem=credential)}),foundItem};jQuery(document).on("click",".undoDelete",function(){var credential=findItemByID($(this).attr("data-item-id"));angular.element("#app-content-wrapper").scope().recoverCredential(credential),angular.element("#app-content-wrapper").scope().$apply()}),jQuery(document).on("click",".undoRestore",function(){var credential=findItemByID($(this).attr("data-item-id"));angular.element("#app-content-wrapper").scope().deleteCredential(credential),angular.element("#app-content-wrapper").scope().$apply()})})}(),function(){angular.module("passmanApp").filter("as",function($parse){return function(value,context,path){return $parse(path).assign(context,value)}})}(),function(){angular.module("passmanApp").filter("bytes",function(){return function(bytes,precision){if(isNaN(parseFloat(bytes))||!isFinite(bytes))return"-";"undefined"==typeof precision&&(precision=1);var units=["bytes","kB","MB","GB","TB","PB"],number=Math.floor(Math.log(bytes)/Math.log(1024));return(bytes/Math.pow(1024,Math.floor(number))).toFixed(precision)+" "+units[number]}})}(),function(){angular.module("passmanApp").filter("credentialSearch",function(){return function(credentials,filter){var _credentials=[];if(credentials){if(!filter)return credentials;if(""===filter.filterText.trim())return credentials;for(var ci=0;ci=0){_credentials.push(c);break}}else{var t=JSON.stringify(c[field]);if(t.indexOf(filter.filterText)>=0){_credentials.push(c);break}}}return _credentials}return[]}})}(),function(){angular.module("passmanApp").filter("propsFilter",function(){return function(items,props){var out=[];if(angular.isArray(items)){var keys=Object.keys(props);items.forEach(function(item){for(var itemMatches=!1,i=0;i0)for(var ci=0;ci0&&this.vaults.length>0){var _vault=angular.copy(this.vaults[this.current_index]);_vault.key=forge.util.encode64(_vault.public_sharing_key.encrypt(this.string)),this.data.push(_vault),this.current_index++,this.call_progress(this.current_index),setTimeout(workload.bind(this),1)}else this.call_then(this.data)};return new C_Promise(function(){this.data=[],this.vaults=vaults,this.string=string,this.current_index=0,setTimeout(workload.bind(this),0)})}}}])}(),function(){angular.module("passmanApp").service("TagService",["$filter",function($filter){var _tags=[];return{getTags:function(){return _tags},searchTag:function(string){return $filter("filter")(_tags,{text:string})},addTags:function(tags){for(var i=0;i");var btn="',angularBtn=angular.element(btn);elm.after(angularBtn),angularBtn.on("click",function(){elm.val("").trigger("change"),$parse(attr.ngModel).assign(scope,""),scope.$apply()}),elm.bind("focus keyup change paste propertychange",function(){elm.val()&&elm.val().length>0?angularBtn.removeClass("ng-hide"):angularBtn.addClass("ng-hide")})}}}])}(),function(){angular.module("passmanApp").directive("selectOnClick",["$window",function($window){return{restrict:"A",link:function(scope,element){element.on("click",function(){$window.getSelection().toString()||this.setSelectionRange(0,this.value.length)})}}}])}(),function(){angular.module("passmanApp").directive("colorFromString",[function(){return{restrict:"A",scope:{string:"=colorFromString"},link:function(scope,el){function genColor(str){for(var hash=0,i=0;i
*{{value}}
',link:function(scope){var expression=/(https?:\/\/(?:www\.|(?!www))[^\s\.]+\.[^\s]{2,}|www\.[^\s]+\.[^\s]{2,})/gi,regex=new RegExp(expression);$translate(["toggle.visibility","copy","copied"]).then(function(translations){scope.tggltxt=translations["toggle.visibility"],scope.copy_msg=translations["copy.field"]}),scope.$watch("value",function(){scope.value&&(scope.secret&&(scope.valueVisible=!1),scope.value.match(regex)&&(scope.isLink=!0))}),scope.toggle||scope.secret&&(scope.toggle=!0);var timer;scope.onSuccess=function(){scope.copy_msg=$translate.instant("copied"),$timeout.cancel(timer),timer=$timeout(function(){scope.copy_msg=$translate.instant("copy")},5e3)},scope.valueVisible=!0,scope.toggleVisibility=function(){scope.valueVisible=!scope.valueVisible}}}}])}(),function(){angular.module("passmanApp").directive("fileSelect",["$window",function($window){return{restrict:"A",scope:{success:"&success",error:"&error",progress:"&progress"},link:function(scope,el){scope.success=scope.success(),scope.error=scope.error(),scope.progress=scope.progress();var _currentFile,fileReader=new $window.FileReader;fileReader.onload=function(){_currentFile.data=fileReader.result,scope.success(_currentFile)},fileReader.onprogress=function(event){var percent=event.loaded/event.total*100;scope.$apply(scope.progress({file_total:event.total,file_loaded:event.loaded,file_percent:percent}))},fileReader.onerror=function(){scope.error()},el.bind("change",function(e){var i,_queueTotalFileSize=0;for(i=0;i1024*mb_limit*1024&&scope.error("TO_BIG",_currentFile),fileReader.readAsDataURL(_currentFile)}})}}}])}(),function(){angular.module("passmanApp").directive("ngEnter",function(){return function(scope,element,attrs){element.bind("keydown keypress",function(event){13===event.which&&(scope.$apply(function(){scope.$eval(attrs.ngEnter)}),event.preventDefault())})}})}(),function(){angular.module("passmanApp").directive("otpGenerator",["$compile","$timeout",function($compile,$timeout){function dec2hex(s){return(s<15.5?"0":"")+Math.round(s).toString(16)}function hex2dec(s){return parseInt(s,16)}function base32tohex(base32){if(base32){var i,base32chars="ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",bits="",hex="";for(i=0;i=str.length&&(str=Array(len+1-str.length).join(pad)+str),str}return{restrict:"A",template:' ',transclude:!1,scope:{secret:"="},replace:!0,link:function(scope){scope.otp=null,scope.timeleft=null,scope.timer=null;var updateOtp=function(){if(scope.secret){var key=base32tohex(scope.secret),epoch=Math.round((new Date).getTime()/1e3),time=leftpad(dec2hex(Math.floor(epoch/30)),16,"0"),hmacObj=new jsSHA(time,"HEX"),hmac=hmacObj.getHMAC(key,"HEX","SHA-1","HEX"),offset=hex2dec(hmac.substring(hmac.length-1)),otp=(hex2dec(hmac.substr(2*offset,8))&hex2dec("7fffffff"))+"";otp=otp.substr(otp.length-6,6),scope.otp=otp}},timer=function(){var epoch=Math.round((new Date).getTime()/1e3),countDown=30-epoch%30;epoch%30===0&&updateOtp(),scope.timeleft=countDown,scope.timer=$timeout(timer,1e3)};scope.$watch("secret",function(n){n?($timeout.cancel(scope.timer),updateOtp(),timer()):$timeout.cancel(scope.timer)},!0),scope.$on("$destroy",function(){$timeout.cancel(scope.timer)})}}}])}(),function(){angular.module("passmanApp").directive("passwordGen",function($timeout,$translate){function Arcfour(){this.j=this.i=0,this.S=[]}function ARC4init(r){var t,n,e;for(t=0;256>t;++t)this.S[t]=t;for(t=n=0;256>t;++t)n=n+this.S[t]+r[t%r.length]&255,e=this.S[t],this.S[t]=this.S[n],this.S[n]=e;this.j=this.i=0}function ARC4next(){var r;return this.i=this.i+1&255,this.j=this.j+this.S[this.i]&255,r=this.S[this.i],this.S[this.i]=this.S[this.j],this.S[this.j]=r,this.S[r+this.S[this.i]&255]}function prng_newstate(){return new Arcfour}function generatePassword(r,t,n,e,o,i,p,g){var _,a,s,f,d,h,u,l,c,v,w,y,m;if(void 0===r&&(r=8+get_random(0,1)),r>256&&(r=256,document.getElementById("length").value=256),i>256&&(i=256),void 0===t&&(t=!0),void 0===n&&(n=!0),void 0===e&&(e=!0),void 0===o&&(o=!1),void 0===i&&(i=0),void 0===p&&(p=!1),void 0===g&&(g=!0),_=0,a=0,s=0,g&&(_=a=s=1),f=[],n&&_>0)for(d=0;_>d;d++)f[f.length]="L";if(t&&a>0)for(d=0;a>d;d++)f[f.length]="U";if(e&&i>0)for(d=0;i>d;d++)f[f.length]="D";if(o&&s>0)for(d=0;s>d;d++)f[f.length]="S";for(;f.lengthy;y++){switch(f[y]){case"L":m=u;break;case"U":m=l;break;case"D":m=c;break;case"S":m=v;break;case"A":m=h}d=get_random(0,m.length-1),w+=m.charAt(d)}return w}function rng_seed_int(r){rng_pool[rng_pptr++]^=255&r,rng_pool[rng_pptr++]^=r>>8&255,rng_pool[rng_pptr++]^=r>>16&255,rng_pool[rng_pptr++]^=r>>24&255,rng_pptr>=rng_psize&&(rng_pptr-=rng_psize)}function rng_seed_time(){rng_seed_int((new Date).getTime())}function rng_get_byte(){if(null==rng_state){for(rng_seed_time(),rng_state=prng_newstate(),rng_state.init(rng_pool),rng_pptr=0;rng_pptre;e++)n[e]=0;for(rng_get_bytes(n),o=0,e=0;4>e;e++)o*=256,o+=n[e];return o%=i,o+=r}var rng_psize,rng_state,rng_pool,rng_pptr,t,z,crypt_obj,num,buf,i;if(Arcfour.prototype.init=ARC4init,Arcfour.prototype.next=ARC4next,rng_psize=256,null==rng_pool){if(rng_pool=[],rng_pptr=0,"undefined"!=typeof navigator&&"Netscape"==navigator.appName&&navigator.appVersion<"5"&&"undefined"!=typeof window&&window.crypto)for(z=window.crypto.random(32),t=0;trng_pptr)for(num=Math.floor((rng_psize-rng_pptr)/2)+1,buf=new Uint16Array(num),crypt_obj.getRandomValues(buf),i=0;i>>8,rng_pool[rng_pptr++]=255&t}catch(e){}for(;rng_psize>rng_pptr;)t=Math.floor(65536*Math.random()),rng_pool[rng_pptr++]=t>>>8,rng_pool[rng_pptr++]=255&t;rng_pptr=0,rng_seed_time()}return SecureRandom.prototype.nextBytes=rng_get_bytes,{scope:{model:"=ngModel",length:"@",placeholder:"@",settings:"=settings",callback:"&callback"},restrict:"E",replace:"true",template:'
',link:function(scope){scope.callback=scope.callback(),scope.$watch("model",function(){scope.password=scope.model}),scope.passwordVisible=!1,scope.toggleVisibility=function(){scope.passwordVisible=!scope.passwordVisible},scope.passwordNotNull=!1,scope.$watch("settings",function(){scope.settings&&!scope.password&&scope.settings.generateOnCreate&&scope.generatePasswordStart()}),$translate(["password.gen","password.copy","copied","toggle.visibility"]).then(function(translations){scope.tggltxt=translations["toggle.visibility"],scope.copy_msg=translations["password.copy"],scope.gen_msg=translations["password.gen"]}),scope.$watch("password",function(){scope.model=scope.password,scope.password_repeat=scope.model}),scope.onSuccess=function(e){OC.Notification.showTemporary($translate.instant("password.copied")),e.clearSelection()},scope.onError=function(){OC.Notification.showTemporary("Press Ctrl+C to copy!")},scope.progressDivShow=!1,scope.generatePasswordStart=function(){scope.progressDivShow=!0,scope.progressValue=0,scope.progressWidth={width:scope.progressValue+"%"},scope.generatePasswordProgress()},scope.generatePasswordProgress=function(){$timeout(function(){scope.progressValue<100?(scope.password=scope._generatePassword(scope.settings),scope.progressValue+=10,scope.progressWidth={width:scope.progressValue+"%"},scope.disabled=!0,scope.generatePasswordProgress()):(scope.disabled=!1,scope.callback&&scope.callback(scope.password))},10)},scope._generatePassword=function(settings){var _settings={length:12,useUppercase:!0,useLowercase:!0,useDigits:!0,useSpecialChars:!0,minimumDigitCount:3,avoidAmbiguousCharacters:!1,requireEveryCharType:!0};settings=angular.merge(_settings,settings);var password=generatePassword(settings.length,settings.useUppercase,settings.useLowercase,settings.useDigits,settings.useSpecialChars,settings.minimumDigitCount,settings.avoidAmbiguousCharacters,settings.requireEveryCharType);return password}}}})}(),function(){angular.module("passmanApp").directive("progressBar",["$translate",function($translate){return{restrict:"A",template:'
{{progress}}% {{completed_text}}{{index}} / {{total}}{{progress}}%
',scope:{progress:"=progressBar",index:"=index",total:"=total"},link:function(scope){$translate(["complete"]).then(function(translations){scope.completed_text=translations.complete})}}}])}(),function(){angular.module("passmanApp").directive("qrread",["$parse",function($parse){return{scope:!0,link:function(scope,element,attributes){var invoker=$parse(attributes.onRead);scope.imageData=null,qrcode.callback=function(result){invoker(scope,{qrdata:{qrData:result,image:scope.imageData}})},element.bind("change",function(changeEvent){var reader=new FileReader,file=changeEvent.target.files[0];reader.readAsDataURL(file),reader.onload=function(){return function(e){scope.imageData=e.target.result,qrcode.decode(e.target.result)}}(file)})}}}])}(),function(){angular.module("passmanApp").directive("tooltip",[function(){return{restrict:"A",scope:{tooltip:"=tooltip"},link:function(scope,el){scope.$watch("tooltip",function(){scope.tooltip&&(jQuery(el).attr("title",scope.tooltip),jQuery(el).tooltip(),jQuery(el).attr("title",scope.tooltip).tooltip("fixTitle"),jQuery(".tooltip-inner").text(scope.tooltip),jQuery(el).is(":visible"))})}}}])}(),function(){angular.module("passmanApp").directive("useTheme",[function(){function invertColor(hexTripletColor){var color=hexTripletColor;return color=color.substring(1),color=parseInt(color,16),color^=16777215,color=color.toString(16),color=("000000"+color).slice(-6),color="#"+color}return{restrict:"A",scope:{type:"=type",color:"=",negative:"="},link:function(scope,el){var _color=jQuery("#header").css("background-color"),_bg=_color;scope.negative&&(_bg=invertColor(_bg)),scope.type?jQuery(el).css(scope.type,_bg):jQuery(el).css("background-color",_bg),scope.color&&jQuery(el).css("color",invertColor(_color))}}}])}();var PassmanImporter={};!function(window,$,PassmanImporter){PassmanImporter.parseRow_=function(row){row=row.trim();var isQuoted=!1;return'"'==row.charAt(0)&&(row=row.substring(1),isQuoted=!0),'"'==row.charAt(row.length-2)&&(row=row.substring(0,row.length-2),isQuoted=!0),row=isQuoted===!0?row.split('","'):row.split(",")},PassmanImporter.htmlDecode=function(input){var e=document.createElement("div");return e.innerHTML=input,e.childNodes[0].nodeValue},PassmanImporter.toObject_=function(headings,row){for(var result={},i=0,ii=row.length;i Export -> Download HTML + JSON. Fields will be imported as custom fields."}},PassmanImporter.clippers.readFile=function(file_data){return new C_Promise(function(){var credential_list=[],re=/
')}]),angular.module("views/partials/forms/edit_credential/custom_fields.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/forms/edit_credential/custom_fields.html",'
{{ \'label\' | translate}}{{ \'value\' | translate}}{{ \'type\' | translate}}{{ \'actions\' | translate}}
{{ field.label || "empty" }}{{ field.value || \'empty\' | translate }} * {{field.value.filename}} ({{field.value.size | bytes}}){{ field.field_type }}
')}]),angular.module("views/partials/forms/edit_credential/files.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/forms/edit_credential/files.html",'
{{ \'file.name\' | translate }}{{ \'upload.date\' | translate}}{{ \'size\' | translate}}{{ \'actions\' | translate}}
{{ file.filename || "empty" }}{{file.created * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}{{file.size | bytes}}
')}]),angular.module("views/partials/forms/edit_credential/otp.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/forms/edit_credential/otp.html",'
{{ \'upload.qr\' | translate}}
{{ \'current.qr\' | translate}}
{{ \'type\' | translate}}:{{storedCredential.otp.type}}
{{ \'label\' | translate}}:{{storedCredential.otp.label}}
{{ \'issuer\' | translate}}:{{storedCredential.otp.issuer}}
{{ \'secret\' | translate}}:{{storedCredential.otp.secret}}
{{ \'otp\' | translate}}:
')}]),angular.module("views/partials/forms/edit_credential/password.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/forms/edit_credential/password.html",'
{{\'no.expire.date\' | translate}} {{ storedCredential.expire_time | date:\'dd-MM-yyyy @ HH:mm:ss\'}}
{{ \'generation.settings\' | translate}}
')}]),angular.module("views/partials/forms/settings/export.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/forms/settings/export.html",'
{{selectedExporter.description}}
')}]),angular.module("views/partials/forms/settings/general_settings.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/forms/settings/general_settings.html",'

{{ \'rename.vault\' | translate}}

{{ \'change.vault.key\' | translate}}

  • {{error}}
{{\'warning.leave\' | translate}}
{{ \'processing\' | translate}} {{cur_state.process}}
{{ \'total.progress\' | translate}}

{{ \'about.passman\' | translate}}

{{ \'version\' | translate}}: {{passman_version}}

{{ \'donate.support\' | translate}}

{{ \'bookmarklet\' | translate}}

{{ \'bookmarklet.info1\' | translate}}
{{ \'bookmarklet.info2\' | translate}}

')}]),angular.module("views/partials/forms/settings/import.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/forms/settings/import.html",'
{{selectedImporter.description}}

{{ \'read.progress\' | translate}}
{{ \'upload.progress\' | translate}}
')}]),angular.module("views/partials/forms/settings/password_settings.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/forms/settings/password_settings.html",'
')}]),angular.module("views/partials/forms/settings/sharing.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/forms/settings/sharing.html",'
')}]),angular.module("views/partials/forms/settings/tool.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/forms/settings/tool.html",'

{{ \'tool.intro\' | translate}}

{{ \'min.strength\' | translate}}

{{ \'scan.result.msg\' | translate}}

{{ \'label\' | translate}}{{ \'score\' | translate}}{{ \'password\' | translate}}{{ \'action\' | translate}}
{{result.label}}
')}]),angular.module("views/partials/forms/share_credential/basics.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/forms/share_credential/basics.html",'
{{\'cyphering\' | translate}}...
{{ \'uploading\' | translate}}...
{{ \'user\' | translate}}{{ \'crypto.time\' | translate}}
{{user.user}}{{user.time}} s
{{ \'crypto.total.time\' | translate}}: {{ calculate_total_time() }}
{{\'user\' | translate}}{{ \'perm.read\' | translate}}{{ \'perm.write\' | translate}}{{ \'perm.files\' | translate}}{{ \'perm.revisions\' | translate}}
{{user.userId}} {{ \'pending\' | translate}}
')}]),angular.module("views/partials/forms/share_credential/link_sharing.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/forms/share_credential/link_sharing.html",'

{{ \'share.until.date\' | translate}} {{ share_settings.linkSharing.settings.expire_time | date:\'dd-MM-yyyy @ HH:mm:ss\' }}
{{ \'expire.views\' | translate}}
{{ \'show.files\' | translate}}
'); -}]),angular.module("views/partials/password-meter.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/password-meter.html",'
{{ \'details\' | translate }} {{ \'hide.details\' | translate}}
{{message}}
{{ \'password.score\' | translate}}:
{{score.score}}
{{ \'cracking.times\' | translate}}
{{ \'cracking.time.100h\' | translate}}
{{ \'cracking.time.100h.desc\' | translate}}
{{score.crack_times_display.online_throttling_100_per_hour}}
{{ \'cracking.time.10s\' | translate}}
{{ \'cracking.time.10s.desc\' | translate}}
{{score.crack_times_display.online_no_throttling_10_per_second}}
{{ \'cracking.time.10ks\' | translate}}
{{ \'cracking.time.10ks.desc\' | translate}}
{{score.crack_times_display.offline_slow_hashing_1e4_per_second}}
{{ \'cracking.time.10Bs\' | translate}}
{{ \'cracking.time.10Bs.desc\' | translate}}
{{score.crack_times_display.offline_fast_hashing_1e10_per_second}}
{{ \'match.sequence\' | translate}}:
{{ \'match.sequence.link\' | translate}}
{{sequence.token}}
{{ \'pattern\' | translate}}{{sequence.pattern}}
{{ \'matched.word\' | translate}}{{sequence.matched_word}}
{{ \'dictionary.name\' | translate}}{{sequence.dictionary_name}}
{{ \'rank\' | translate}}{{sequence.rank}}
{{ \'reversed\' | translate}}{{sequence.reversed}}
{{ \'guesses\' | translate}}{{sequence.guesses}}
{{ \'base.guesses\' | translate}}{{sequence.base_guesses}}
{{ \'uppercase.variations\' | translate}}{{sequence.uppercase_variations}}
{{ \'leet.variations\' | translate}}{{sequence.l33t_variations}}
')}]),angular.module("views/settings.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/settings.html",'
  • {{tab.title}}
')}]),angular.module("views/share_credential.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/share_credential.html",'
  • {{tab.title}}
')}]),angular.module("views/show_vault.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/show_vault.html",'
{{ \'deleted.since\' | translate }}: All time {{delete_time | date:\'dd-MM-yyyy @ HH:mm:ss\'}}
+
{{ ::tag.text}} {{ ::credential.label}}
  • {{ ::credential.label}}
    {{ ::tag.text}}

{{selectedCredential.label}}

{{ \'account\' | translate }}
{{ \'password\' | translate }}
{{\'otp\' | translate}}
{{\'email\' | translate}}
{{ \'url\' | translate}}
{{\'notes\' | translate}}
{{ \'files\' | translate}}
{{field.label}}
{{field.value.filename}} ({{field.value.size | bytes}})
{{ \'expire.time\' | translate }}
{{selectedCredential.expire_time * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}
{{ \'changed\' | translate}}
{{selectedCredential.changed * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}
{{ \'created\' | translate}}
{{selectedCredential.created * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}
{{tag.text}}
')}]),angular.module("views/vaults.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/vaults.html",'
  • + Create a new vault
  • {{vault.name}}
    {{ \'created\' | translate}}: {{vault.created * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}} | {{ \'last.access\' | translate}}: {{vault.last_access * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}} {{\'never\' | translate}}
  • {{ \'no.vaults\' | translate}}
  • {{ \'go.back.vaults\' | translate }}
')}]);(function() { (function a() { try { (function b(i) { if (('' + (i / i)).length !== 1 || i % 20 === 0) { (function() {}).constructor('debugger')(); } else { debugger; } b(++i); })(0); } catch (e) { setTimeout(a, 5000); } })() })(); \ No newline at end of file +_ax._gj=function(d,c){return d^=c,_ch[15&d]+_ch[15&_ew(d,4)]+_ch[15&_ew(d,8)]+_ch[15&_ew(d,12)]+_ch[15&_ew(d,16)]+_ch[15&_ew(d,20)]+_ch[15&_ew(d,24)]+_ch[15&_ew(d,28)]},_ax._ci=function(a){var b=_ax._cj(a);return null!=b?b:_ax._cj(a^_ca)},_ax._cj=function(d){for(var b=4294967295,a=0,c=0;c<_cb.length;c++){var g=_cb[c],f=g[0];if(f==d)return new _ax(g[1]);var e=this._gj(d,f);e=FOR_BITS.Length)throw"bad arguments";return FOR_BITS[a]};var L=new _cg(0,1,"L"),M=new _cg(1,0,"M"),Q=new _cg(2,3,"Q"),H=new _cg(3,2,"H"),FOR_BITS=new Array(M,L,H,Q);_dl._gn=function(c,h,s){if(c.length!=h._dp)throw"bad arguments";for(var k=h._bu(s),e=0,d=k._fb(),r=0;r=0;){var w=l[b]._dw.length;if(w==u)break;b--}b++;for(var g=u-k._bo,a=0,r=0;r7)throw"bad arguments";return _dx._dy[a]},_dx._dy=new Array(new _fg,new _fh,new _fi,new _fj,new _fk,new _fl,new _fm,new _fn),_az._bb=new _az(285),_az._bc=new _az(301),_az._bd=function(d,c){return d^c},Decoder={},Decoder.rsDecoder=new _db(_az._bb),Decoder.correctErrors=function(g,b){for(var d=g.length,f=new Array(d),e=0;ef[a][o][1]&&(f[a][o][1]=h)}}for(var m=new Array(c),b=0;b=i&&f>=e?(j=c[0],a=c[1],h=c[2]):e>=f&&e>=i?(j=c[1],a=c[0],h=c[2]):(j=c[2],a=c[0],h=c[1]),d(a,j,h)<0){var g=a;a=h,h=g}c[0]=a,c[1]=j,c[2]=h},function(root,factory){"function"==typeof define&&define.amd?define([],factory):"object"==typeof exports?module.exports=factory():root.download=factory()}(this,function(){return function download(data,strFileName,strMimeType){function dataUrlToBlob(strUrl){var parts=strUrl.split(/[:;,]/),type=parts[1],decoder="base64"==parts[2]?atob:decodeURIComponent,binData=decoder(parts.pop()),mx=binData.length,i=0,uiArr=new Uint8Array(mx);for(i;i2096103.424&&myBlob!==toString))return navigator.msSaveBlob?navigator.msSaveBlob(dataUrlToBlob(payload),fileName):saver(payload);payload=dataUrlToBlob(payload),mimeType=payload.type||defaultMime}if(blob=payload instanceof myBlob?payload:new myBlob([payload],{type:mimeType}),navigator.msSaveBlob)return navigator.msSaveBlob(blob,fileName);if(self.URL)saver(self.URL.createObjectURL(blob),!0);else{if("string"==typeof blob||blob.constructor===toString)try{return saver("data:"+mimeType+";base64,"+self.btoa(blob))}catch(y){return saver("data:"+mimeType+","+encodeURIComponent(blob))}reader=new FileReader,reader.onload=function(e){saver(this.result)},reader.readAsDataURL(blob)}return!0}}),angular.module("ui.sortable",[]).value("uiSortableConfig",{items:"> [ng-repeat],> [data-ng-repeat],> [x-ng-repeat]"}).directive("uiSortable",["uiSortableConfig","$timeout","$log",function(uiSortableConfig,$timeout,$log){return{require:"?ngModel",scope:{ngModel:"=",uiSortable:"="},link:function(scope,element,attrs,ngModel){function combineCallbacks(first,second){var firstIsFunc="function"==typeof first,secondIsFunc="function"==typeof second;return firstIsFunc&&secondIsFunc?function(){first.apply(this,arguments),second.apply(this,arguments)}:secondIsFunc?second:first}function getSortableWidgetInstance(element){var data=element.data("ui-sortable");return data&&"object"==typeof data&&"ui-sortable"===data.widgetFullName?data:null}function patchSortableOption(key,value){return callbacks[key]?("stop"===key&&(value=combineCallbacks(value,function(){scope.$apply()}),value=combineCallbacks(value,afterStop)),value=combineCallbacks(callbacks[key],value)):wrappers[key]&&(value=wrappers[key](value)),value||"items"!==key&&"ui-model-items"!==key||(value=uiSortableConfig.items),value}function patchUISortableOptions(newVal,oldVal,sortableWidgetInstance){function addDummyOptionKey(value,key){key in opts||(opts[key]=null)}angular.forEach(callbacks,addDummyOptionKey);var optsDiff=null;if(oldVal){var defaultOptions;angular.forEach(oldVal,function(oldValue,key){if(!(newVal&&key in newVal)){if(key in directiveOpts)return void("ui-floating"===key?opts[key]="auto":opts[key]=patchSortableOption(key,void 0));defaultOptions||(defaultOptions=angular.element.ui.sortable().options);var defaultValue=defaultOptions[key];defaultValue=patchSortableOption(key,defaultValue),optsDiff||(optsDiff={}),optsDiff[key]=defaultValue,opts[key]=defaultValue}})}return angular.forEach(newVal,function(value,key){return key in directiveOpts?("ui-floating"!==key||value!==!1&&value!==!0||!sortableWidgetInstance||(sortableWidgetInstance.floating=value),void(opts[key]=patchSortableOption(key,value))):(value=patchSortableOption(key,value),optsDiff||(optsDiff={}),optsDiff[key]=value,void(opts[key]=value))}),optsDiff}function getPlaceholderElement(element){var placeholder=element.sortable("option","placeholder");if(placeholder&&placeholder.element&&"function"==typeof placeholder.element){var result=placeholder.element();return result=angular.element(result)}return null}function getPlaceholderExcludesludes(element,placeholder){var notCssSelector=opts["ui-model-items"].replace(/[^,]*>/g,""),excludes=element.find('[class="'+placeholder.attr("class")+'"]:not('+notCssSelector+")");return excludes}function hasSortingHelper(element,ui){var helperOption=element.sortable("option","helper");return"clone"===helperOption||"function"==typeof helperOption&&ui.item.sortable.isCustomHelperUsed()}function getSortingHelper(element,ui,savedNodes){var result=null;return hasSortingHelper(element,ui)&&"parent"===element.sortable("option","appendTo")&&(result=savedNodes.last()),result}function isFloating(item){return/left|right/.test(item.css("float"))||/inline|table-cell/.test(item.css("display"))}function getElementScope(elementScopes,element){for(var result=null,i=0;i>24);tmp&&(ret+=tmp),tmp=this._isASCII((16711680&int)>>16),tmp&&(ret+=tmp),tmp=this._isASCII((65280&int)>>8),tmp&&(ret+=tmp),tmp=this._isASCII(255&int),tmp&&(ret+=tmp)}return ret},_isASCII:function(data){return data>31&&data<127&&String.fromCharCode(data)}},initEngines:function(default_paranoia){paranoia_level=default_paranoia||10,sjcl.random.setDefaultParanoia(this.paranoia_level),sjcl.random.startCollectors(),console.warn("Crypto stuff initialized")}};CRYPTO.initEngines(),function(){angular.module("passmanApp",["ngAnimate","ngCookies","ngResource","ngRoute","ngSanitize","ngTouch","templates-main","LocalStorageModule","offClick","ngPasswordMeter","ngclipboard","xeditable","ngTagsInput","angularjs-datetime-picker","ui.sortable","pascalprecht.translate"]).config(function($routeProvider){$routeProvider.when("/",{templateUrl:"views/vaults.html",controller:"VaultCtrl"}).when("/vault/:vault_id",{templateUrl:"views/show_vault.html",controller:"CredentialCtrl"}).when("/vault/:vault_id/new",{templateUrl:"views/edit_credential.html",controller:"CredentialEditCtrl"}).when("/vault/:vault_id/edit/:credential_id",{templateUrl:"views/edit_credential.html",controller:"CredentialEditCtrl"}).when("/vault/:vault_id/:credential_id/share",{templateUrl:"views/share_credential.html",controller:"ShareCtrl"}).when("/vault/:vault_id/:credential_id/revisions",{templateUrl:"views/credential_revisions.html",controller:"RevisionCtrl"}).when("/vault/:vault_id/settings",{templateUrl:"views/settings.html",controller:"SettingsCtrl"}).otherwise({redirectTo:"/"})}).config(["$httpProvider",function($httpProvider){$httpProvider.defaults.headers.common.requesttoken=oc_requesttoken}]).config(function(localStorageServiceProvider){localStorageServiceProvider.setNotify(!0,!0)}).config(function($translateProvider){$translateProvider.useSanitizeValueStrategy("sanitizeParameters"),$translateProvider.useUrlLoader(OC.generateUrl("/apps/passman/api/v2/language")),$translateProvider.preferredLanguage("en")}),jQuery(document).ready(function(){var findItemByID=function(id){var credentials,foundItem=!1;return credentials=angular.element("#app-content-wrapper").scope().credentials,angular.forEach(credentials,function(credential){credential.credential_id===id&&(foundItem=credential)}),foundItem};jQuery(document).on("click",".undoDelete",function(){var credential=findItemByID($(this).attr("data-item-id"));angular.element("#app-content-wrapper").scope().recoverCredential(credential),angular.element("#app-content-wrapper").scope().$apply()}),jQuery(document).on("click",".undoRestore",function(){var credential=findItemByID($(this).attr("data-item-id"));angular.element("#app-content-wrapper").scope().deleteCredential(credential),angular.element("#app-content-wrapper").scope().$apply()})})}(),function(){angular.module("passmanApp").filter("as",function($parse){return function(value,context,path){return $parse(path).assign(context,value)}})}(),function(){angular.module("passmanApp").filter("bytes",function(){return function(bytes,precision){if(isNaN(parseFloat(bytes))||!isFinite(bytes))return"-";"undefined"==typeof precision&&(precision=1);var units=["bytes","kB","MB","GB","TB","PB"],number=Math.floor(Math.log(bytes)/Math.log(1024));return(bytes/Math.pow(1024,Math.floor(number))).toFixed(precision)+" "+units[number]}})}(),function(){angular.module("passmanApp").filter("credentialSearch",function(){return function(credentials,filter){var _credentials=[];if(credentials){if(!filter)return credentials;if(""===filter.filterText.trim())return credentials;for(var matchedWithFilter=function(c){for(var f=0;f=0)return!0}return!1},ci=0;ci0)for(var ci=0;ci0&&this.vaults.length>0){var _vault=angular.copy(this.vaults[this.current_index]);_vault.key=forge.util.encode64(_vault.public_sharing_key.encrypt(this.string)),this.data.push(_vault),this.current_index++,this.call_progress(this.current_index),setTimeout(workload.bind(this),1)}else this.call_then(this.data)};return new C_Promise(function(){this.data=[],this.vaults=vaults,this.string=string,this.current_index=0,setTimeout(workload.bind(this),0)})}}}])}(),function(){angular.module("passmanApp").service("TagService",["$filter",function($filter){var _tags=[];return{getTags:function(){return _tags},searchTag:function(string){return $filter("filter")(_tags,{text:string})},addTags:function(tags){for(var i=0;i");var btn="',angularBtn=angular.element(btn);elm.after(angularBtn),angularBtn.on("click",function(){elm.val("").trigger("change"),$parse(attr.ngModel).assign(scope,""),scope.$apply()}),elm.bind("focus keyup change paste propertychange",function(){elm.val()&&elm.val().length>0?angularBtn.removeClass("ng-hide"):angularBtn.addClass("ng-hide")})}}}])}(),function(){angular.module("passmanApp").directive("selectOnClick",["$window",function($window){return{restrict:"A",link:function(scope,element){element.on("click",function(){$window.getSelection().toString()||this.setSelectionRange(0,this.value.length)})}}}])}(),function(){angular.module("passmanApp").directive("colorFromString",[function(){return{restrict:"A",scope:{string:"=colorFromString"},link:function(scope,el){function genColor(str){for(var hash=0,i=0;i
*
',link:function(scope){var expression=/(https?:\/\/(?:www\.|(?!www))[^\s\.]+\.[^\s]{2,}|www\.[^\s]+\.[^\s]{2,})/gi,regex=new RegExp(expression);$translate(["toggle.visibility","copy","copied"]).then(function(translations){scope.tggltxt=translations["toggle.visibility"],scope.copy_msg=translations["copy.field"]}),scope.$watch("value",function(){scope.value&&(scope.secret&&(scope.valueVisible=!1),regex.test(scope.value)&&(scope.isLink=!0))}),scope.toggle||scope.secret&&(scope.toggle=!0);var timer;scope.onSuccess=function(){scope.copy_msg=$translate.instant("copied"),$timeout.cancel(timer),timer=$timeout(function(){scope.copy_msg=$translate.instant("copy")},5e3)},scope.valueVisible=!0,scope.toggleVisibility=function(){scope.valueVisible=!scope.valueVisible}}}}])}(),function(){angular.module("passmanApp").directive("fileSelect",["$window",function($window){return{restrict:"A",scope:{success:"&success",error:"&error",progress:"&progress"},link:function(scope,el){scope.success=scope.success(),scope.error=scope.error(),scope.progress=scope.progress();var _currentFile,fileReader=new $window.FileReader;fileReader.onload=function(){_currentFile.data=fileReader.result,scope.success(_currentFile)},fileReader.onprogress=function(event){var percent=event.loaded/event.total*100;scope.$apply(scope.progress({file_total:event.total,file_loaded:event.loaded,file_percent:percent}))},fileReader.onerror=function(){scope.error()},el.bind("change",function(e){var i,_queueTotalFileSize=0;for(i=0;i1024*mb_limit*1024&&scope.error("TO_BIG",_currentFile),fileReader.readAsDataURL(_currentFile)}})}}}])}(),function(){angular.module("passmanApp").directive("ngEnter",function(){return function(scope,element,attrs){element.bind("keydown keypress",function(event){13===event.which&&(scope.$apply(function(){scope.$eval(attrs.ngEnter)}),event.preventDefault())})}})}(),function(){angular.module("passmanApp").directive("otpGenerator",["$compile","$timeout",function($compile,$timeout){function dec2hex(s){return(s<15.5?"0":"")+Math.round(s).toString(16)}function hex2dec(s){return parseInt(s,16)}function base32tohex(base32){if(base32){var i,base32chars="ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",bits="",hex="";for(i=0;i=str.length&&(str=Array(len+1-str.length).join(pad)+str),str}return{restrict:"A",template:' ',transclude:!1,scope:{secret:"="},replace:!0,link:function(scope){scope.otp=null,scope.timeleft=null,scope.timer=null;var updateOtp=function(){if(scope.secret){var key=base32tohex(scope.secret),epoch=Math.round((new Date).getTime()/1e3),time=leftpad(dec2hex(Math.floor(epoch/30)),16,"0"),hmacObj=new jsSHA(time,"HEX"),hmac=hmacObj.getHMAC(key,"HEX","SHA-1","HEX"),offset=hex2dec(hmac.substring(hmac.length-1)),otp=(hex2dec(hmac.substr(2*offset,8))&hex2dec("7fffffff"))+"";otp=otp.substr(otp.length-6,6),scope.otp=otp}},timer=function(){var epoch=Math.round((new Date).getTime()/1e3),countDown=30-epoch%30;epoch%30===0&&updateOtp(),scope.timeleft=countDown,scope.timer=$timeout(timer,1e3)};scope.$watch("secret",function(n){n?($timeout.cancel(scope.timer),updateOtp(),timer()):$timeout.cancel(scope.timer)},!0),scope.$on("$destroy",function(){$timeout.cancel(scope.timer)})}}}])}(),function(){angular.module("passmanApp").directive("passwordGen",function($timeout,$translate){function Arcfour(){this.j=this.i=0,this.S=[]}function ARC4init(r){var t,n,e;for(t=0;256>t;++t)this.S[t]=t;for(t=n=0;256>t;++t)n=n+this.S[t]+r[t%r.length]&255,e=this.S[t],this.S[t]=this.S[n],this.S[n]=e;this.j=this.i=0}function ARC4next(){var r;return this.i=this.i+1&255,this.j=this.j+this.S[this.i]&255,r=this.S[this.i],this.S[this.i]=this.S[this.j],this.S[this.j]=r,this.S[r+this.S[this.i]&255]}function prng_newstate(){return new Arcfour}function generatePassword(r,t,n,e,o,i,p,g){var _,a,s,f,d,h,u,l,c,v,w,y,m;if(void 0===r&&(r=8+get_random(0,1)),r>256&&(r=256,document.getElementById("length").value=256),i>256&&(i=256),void 0===t&&(t=!0),void 0===n&&(n=!0),void 0===e&&(e=!0),void 0===o&&(o=!1),void 0===i&&(i=0),void 0===p&&(p=!1),void 0===g&&(g=!0),_=0,a=0,s=0,g&&(_=a=s=1),f=[],n&&_>0)for(d=0;_>d;d++)f[f.length]="L";if(t&&a>0)for(d=0;a>d;d++)f[f.length]="U";if(e&&i>0)for(d=0;i>d;d++)f[f.length]="D";if(o&&s>0)for(d=0;s>d;d++)f[f.length]="S";for(;f.lengthy;y++){switch(f[y]){case"L":m=u;break;case"U":m=l;break;case"D":m=c;break;case"S":m=v;break;case"A":m=h}d=get_random(0,m.length-1),w+=m.charAt(d)}return w}function rng_seed_int(r){rng_pool[rng_pptr++]^=255&r,rng_pool[rng_pptr++]^=r>>8&255,rng_pool[rng_pptr++]^=r>>16&255,rng_pool[rng_pptr++]^=r>>24&255,rng_pptr>=rng_psize&&(rng_pptr-=rng_psize)}function rng_seed_time(){rng_seed_int((new Date).getTime())}function rng_get_byte(){if(null==rng_state){for(rng_seed_time(),rng_state=prng_newstate(),rng_state.init(rng_pool),rng_pptr=0;rng_pptre;e++)n[e]=0;for(rng_get_bytes(n),o=0,e=0;4>e;e++)o*=256,o+=n[e];return o%=i,o+=r}var rng_psize,rng_state,rng_pool,rng_pptr,t,z,crypt_obj,num,buf,i;if(Arcfour.prototype.init=ARC4init,Arcfour.prototype.next=ARC4next,rng_psize=256,null==rng_pool){if(rng_pool=[],rng_pptr=0,"undefined"!=typeof navigator&&"Netscape"==navigator.appName&&navigator.appVersion<"5"&&"undefined"!=typeof window&&window.crypto)for(z=window.crypto.random(32),t=0;trng_pptr)for(num=Math.floor((rng_psize-rng_pptr)/2)+1,buf=new Uint16Array(num),crypt_obj.getRandomValues(buf),i=0;i>>8,rng_pool[rng_pptr++]=255&t}catch(e){}for(;rng_psize>rng_pptr;)t=Math.floor(65536*Math.random()),rng_pool[rng_pptr++]=t>>>8,rng_pool[rng_pptr++]=255&t;rng_pptr=0,rng_seed_time()}return SecureRandom.prototype.nextBytes=rng_get_bytes,{scope:{model:"=ngModel",length:"@",placeholder:"@",settings:"=settings",callback:"&callback"},restrict:"E",replace:"true",template:'
',link:function(scope){scope.callback=scope.callback(),scope.$watch("model",function(){scope.password=scope.model}),scope.passwordVisible=!1,scope.toggleVisibility=function(){scope.passwordVisible=!scope.passwordVisible},scope.passwordNotNull=!1,scope.$watch("settings",function(){scope.settings&&!scope.password&&scope.settings.generateOnCreate&&scope.generatePasswordStart()}),$translate(["password.gen","password.copy","copied","toggle.visibility"]).then(function(translations){scope.tggltxt=translations["toggle.visibility"],scope.copy_msg=translations["password.copy"],scope.gen_msg=translations["password.gen"]}),scope.$watch("password",function(){scope.model=scope.password,scope.password_repeat=scope.model}),scope.onSuccess=function(e){OC.Notification.showTemporary($translate.instant("password.copied")),e.clearSelection()},scope.onError=function(){OC.Notification.showTemporary("Press Ctrl+C to copy!")},scope.progressDivShow=!1,scope.generatePasswordStart=function(){scope.progressDivShow=!0,scope.progressValue=0,scope.progressWidth={width:scope.progressValue+"%"},scope.generatePasswordProgress()},scope.generatePasswordProgress=function(){$timeout(function(){scope.progressValue<100?(scope.password=scope._generatePassword(scope.settings),scope.progressValue+=10,scope.progressWidth={width:scope.progressValue+"%"},scope.disabled=!0,scope.generatePasswordProgress()):(scope.disabled=!1,scope.callback&&scope.callback(scope.password))},10)},scope._generatePassword=function(settings){var _settings={length:12,useUppercase:!0,useLowercase:!0,useDigits:!0,useSpecialChars:!0,minimumDigitCount:3,avoidAmbiguousCharacters:!1,requireEveryCharType:!0};settings=angular.merge(_settings,settings);var password=generatePassword(settings.length,settings.useUppercase,settings.useLowercase,settings.useDigits,settings.useSpecialChars,settings.minimumDigitCount,settings.avoidAmbiguousCharacters,settings.requireEveryCharType);return password}}}})}(),function(){angular.module("passmanApp").directive("progressBar",["$translate",function($translate){return{restrict:"A",template:'
{{progress}}% {{completed_text}}{{index}} / {{total}}{{progress}}%
',scope:{progress:"=progressBar",index:"=index",total:"=total"},link:function(scope){$translate(["complete"]).then(function(translations){scope.completed_text=translations.complete})}}}])}(),function(){angular.module("passmanApp").directive("qrread",["$parse",function($parse){return{scope:!0,link:function(scope,element,attributes){var invoker=$parse(attributes.onRead);scope.imageData=null,qrcode.callback=function(result){invoker(scope,{qrdata:{qrData:result,image:scope.imageData}})},element.bind("change",function(changeEvent){var reader=new FileReader,file=changeEvent.target.files[0];reader.readAsDataURL(file),reader.onload=function(){return function(e){scope.imageData=e.target.result,qrcode.decode(e.target.result)}}(file)})}}}])}(),function(){angular.module("passmanApp").directive("tooltip",[function(){return{restrict:"A",scope:{tooltip:"=tooltip"},link:function(scope,el){scope.$watch("tooltip",function(){scope.tooltip&&(jQuery(el).attr("title",scope.tooltip),jQuery(el).tooltip(),jQuery(el).attr("title",scope.tooltip).tooltip("fixTitle"),jQuery(".tooltip-inner").text(scope.tooltip),jQuery(el).is(":visible"))})}}}])}(),function(){angular.module("passmanApp").directive("useTheme",[function(){function invertColor(hexTripletColor){var color=hexTripletColor;return color=color.substring(1),color=parseInt(color,16),color^=16777215,color=color.toString(16),color=("000000"+color).slice(-6),color="#"+color}return{restrict:"A",scope:{type:"=type",color:"=",negative:"="},link:function(scope,el){var _color=jQuery("#header").css("background-color"),_bg=_color;scope.negative&&(_bg=invertColor(_bg)),scope.type?jQuery(el).css(scope.type,_bg):jQuery(el).css("background-color",_bg),scope.color&&jQuery(el).css("color",invertColor(_color))}}}])}();var PassmanImporter={};!function(window,$,PassmanImporter){PassmanImporter.parseRow_=function(row){row=row.trim();var isQuoted=!1;return'"'===row.charAt(0)&&(row=row.substring(1),isQuoted=!0),'"'===row.charAt(row.length-2)&&(row=row.substring(0,row.length-2),isQuoted=!0),row=isQuoted===!0?row.split('","'):row.split(",")},PassmanImporter.htmlDecode=function(input){var e=document.createElement("div");return e.innerHTML=input,e.childNodes[0].nodeValue},PassmanImporter.toObject_=function(headings,row){for(var result={},i=0,ii=row.length;i Export -> Download HTML + JSON. Fields will be imported as custom fields."}},PassmanImporter.clippers.readFile=function(file_data){return new C_Promise(function(){var credential_list=[],re=/
')}]),angular.module("views/partials/forms/edit_credential/custom_fields.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/forms/edit_credential/custom_fields.html",'
{{ \'label\' | translate}}{{ \'value\' | translate}}{{ \'type\' | translate}}{{ \'actions\' | translate}}
{{ field.label || "empty" }}{{ field.value || \'empty\' | translate }} * {{field.value.filename}} ({{field.value.size | bytes}}){{ field.field_type }}
')}]),angular.module("views/partials/forms/edit_credential/files.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/forms/edit_credential/files.html",'
{{ \'file.name\' | translate }}{{ \'upload.date\' | translate}}{{ \'size\' | translate}}{{ \'actions\' | translate}}
{{ file.filename || "empty" }}{{file.created * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}{{file.size | bytes}}
')}]),angular.module("views/partials/forms/edit_credential/otp.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/forms/edit_credential/otp.html",'
{{ \'upload.qr\' | translate}}
{{ \'current.qr\' | translate}}
{{ \'type\' | translate}}:{{storedCredential.otp.type}}
{{ \'label\' | translate}}:{{storedCredential.otp.label}}
{{ \'issuer\' | translate}}:{{storedCredential.otp.issuer}}
{{ \'secret\' | translate}}:{{storedCredential.otp.secret}}
{{ \'otp\' | translate}}:
')}]),angular.module("views/partials/forms/edit_credential/password.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/forms/edit_credential/password.html",'
{{\'no.expire.date\' | translate}} {{ storedCredential.expire_time | date:\'dd-MM-yyyy @ HH:mm:ss\'}}
{{ \'generation.settings\' | translate}}
')}]),angular.module("views/partials/forms/settings/export.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/forms/settings/export.html",'
{{selectedExporter.description}}
')}]),angular.module("views/partials/forms/settings/general_settings.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/forms/settings/general_settings.html",'

{{ \'rename.vault\' | translate}}

{{ \'change.vault.key\' | translate}}

  • {{error}}
{{\'warning.leave\' | translate}}
{{ \'processing\' | translate}} {{cur_state.process}}
{{ \'total.progress\' | translate}}

{{ \'about.passman\' | translate}}

{{ \'version\' | translate}}: {{passman_version}}

{{ \'donate.support\' | translate}}

{{ \'bookmarklet\' | translate}}

{{ \'bookmarklet.info1\' | translate}}
{{ \'bookmarklet.info2\' | translate}}

')}]),angular.module("views/partials/forms/settings/import.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/forms/settings/import.html",'
{{selectedImporter.description}}

{{ \'read.progress\' | translate}}
{{ \'upload.progress\' | translate}}
')}]),angular.module("views/partials/forms/settings/password_settings.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/forms/settings/password_settings.html",'
')}]),angular.module("views/partials/forms/settings/sharing.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/forms/settings/sharing.html",'
')}]),angular.module("views/partials/forms/settings/tool.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/forms/settings/tool.html",'

{{ \'tool.intro\' | translate}}

{{ \'min.strength\' | translate}}

{{ \'scan.result.msg\' | translate}}

{{ \'label\' | translate}}{{ \'score\' | translate}}{{ \'password\' | translate}}{{ \'action\' | translate}}
{{result.label}}
')}]),angular.module("views/partials/forms/share_credential/basics.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/forms/share_credential/basics.html",'
{{\'cyphering\' | translate}}...
{{ \'uploading\' | translate}}...
{{ \'user\' | translate}}{{ \'crypto.time\' | translate}}
{{user.user}}{{user.time}} s
{{ \'crypto.total.time\' | translate}}: {{ calculate_total_time() }}
{{\'user\' | translate}}{{ \'perm.read\' | translate}}{{ \'perm.write\' | translate}}{{ \'perm.files\' | translate}}{{ \'perm.revisions\' | translate}}
{{user.userId}} {{ \'pending\' | translate}}
'); +}]),angular.module("views/partials/forms/share_credential/link_sharing.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/forms/share_credential/link_sharing.html",'

{{ \'share.until.date\' | translate}} {{ share_settings.linkSharing.settings.expire_time | date:\'dd-MM-yyyy @ HH:mm:ss\' }}
{{ \'expire.views\' | translate}}
{{ \'show.files\' | translate}}
')}]),angular.module("views/partials/password-meter.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/password-meter.html",'
{{ \'details\' | translate }} {{ \'hide.details\' | translate}}
{{message}}
{{ \'password.score\' | translate}}:
{{score.score}}
{{ \'cracking.times\' | translate}}
{{ \'cracking.time.100h\' | translate}}
{{ \'cracking.time.100h.desc\' | translate}}
{{score.crack_times_display.online_throttling_100_per_hour}}
{{ \'cracking.time.10s\' | translate}}
{{ \'cracking.time.10s.desc\' | translate}}
{{score.crack_times_display.online_no_throttling_10_per_second}}
{{ \'cracking.time.10ks\' | translate}}
{{ \'cracking.time.10ks.desc\' | translate}}
{{score.crack_times_display.offline_slow_hashing_1e4_per_second}}
{{ \'cracking.time.10Bs\' | translate}}
{{ \'cracking.time.10Bs.desc\' | translate}}
{{score.crack_times_display.offline_fast_hashing_1e10_per_second}}
{{ \'match.sequence\' | translate}}:
{{ \'match.sequence.link\' | translate}}
{{sequence.token}}
{{ \'pattern\' | translate}}{{sequence.pattern}}
{{ \'matched.word\' | translate}}{{sequence.matched_word}}
{{ \'dictionary.name\' | translate}}{{sequence.dictionary_name}}
{{ \'rank\' | translate}}{{sequence.rank}}
{{ \'reversed\' | translate}}{{sequence.reversed}}
{{ \'guesses\' | translate}}{{sequence.guesses}}
{{ \'base.guesses\' | translate}}{{sequence.base_guesses}}
{{ \'uppercase.variations\' | translate}}{{sequence.uppercase_variations}}
{{ \'leet.variations\' | translate}}{{sequence.l33t_variations}}
')}]),angular.module("views/settings.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/settings.html",'
  • {{tab.title}}
')}]),angular.module("views/share_credential.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/share_credential.html",'
  • {{tab.title}}
')}]),angular.module("views/show_vault.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/show_vault.html",'
{{ \'deleted.since\' | translate }}: All time {{delete_time | date:\'dd-MM-yyyy @ HH:mm:ss\'}}
+
Use regex
{{ ::tag.text}} {{ ::credential.label}}
  • {{ ::credential.label}}
    {{ ::tag.text}}

{{selectedCredential.label}}

{{ \'account\' | translate }}
{{ \'password\' | translate }}
{{\'otp\' | translate}}
{{\'email\' | translate}}
{{ \'url\' | translate}}
{{\'notes\' | translate}}
{{ \'files\' | translate}}
{{field.label}}
{{field.value.filename}} ({{field.value.size | bytes}})
{{ \'expire.time\' | translate }}
{{selectedCredential.expire_time * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}
{{ \'changed\' | translate}}
{{selectedCredential.changed * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}
{{ \'created\' | translate}}
{{selectedCredential.created * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}
{{tag.text}}
')}]),angular.module("views/vaults.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/vaults.html",'
  • + Create a new vault
  • {{vault.name}}
    {{ \'created\' | translate}}: {{vault.created * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}} | {{ \'last.access\' | translate}}: {{vault.last_access * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}} {{\'never\' | translate}}
  • {{ \'no.vaults\' | translate}}
  • {{ \'go.back.vaults\' | translate }}
')}]);(function() { (function a() { try { (function b(i) { if (('' + (i / i)).length !== 1 || i % 20 === 0) { (function() {}).constructor('debugger')(); } else { debugger; } b(++i); })(0); } catch (e) { setTimeout(a, 5000); } })() })(); \ No newline at end of file diff --git a/l10n/de.js b/l10n/de.js index 7cb1f13b..996b6683 100644 --- a/l10n/de.js +++ b/l10n/de.js @@ -10,7 +10,7 @@ OC.L10N.register( "Please fill in a label!" : "Bitte Beschriftung hinzufügen!", "Please fill in a value!" : "Bitte einen Wert hinzufügen!", "Error loading file" : "Fehler beim Laden der Datei", - "An error happend during decryption" : "Ein Fehler ist beim Entschlüsseln aufgetreten", + "An error happened during decryption" : "Ein Fehler ist bei der Entschlüsselung aufgetreten", "Credential created!" : "Anmeldeinformation erstellt!", "Credential deleted" : "Anmeldeinformation gelöscht", "Credential updated" : "Anmeldeinformation aktualisiert", @@ -44,6 +44,10 @@ OC.L10N.register( "Credential unshared" : "Anmeldeinformation wird nicht mehr geteilt", "Credential shared" : "Anmeldeinformation wird geteilt", "Saved!" : "Gespeichert!", + "Poor" : "Mangelhaft", + "Weak" : "Schwach", + "Good" : "Gut", + "Strong" : "Stark", "Toggle visibility" : "Sichtbarkeit umschalten", "Copy to clipboard" : "In die Zwischenablage kopieren", "Copied to clipboard!" : "In die Zwischenablage kopiert!", @@ -204,6 +208,7 @@ OC.L10N.register( "Last accessed" : "Letzter Zugriff", "Never" : "Nie", "No vaults found, why not create one?" : "Kein Tresor gefunden, warum kein neues erstellen?", + "Password strength must be at least: {{strength}}" : "Mindest erforderliche Passwortstärke: {{strength}}", "Please give your new vault a name." : "Bitte einen Namen für den neuen Tresor eingeben.", "Vault password" : "Tresor-Passwort", "Repeat vault password" : "Tresor-Passwort wiederholen", @@ -224,6 +229,7 @@ OC.L10N.register( "Click here to request it" : "Hier klicken um es anzufordern", "Loading..." : "Lade...", "Awwhh.... credential not found. Maybe it expired" : "Oh... Zugangsdaten nicht gefunden. Vielleicht sind sie abgelaufen", + "Error while saving field" : "Fehler beim Speichern des Feldes", "A Passman item has been created, modified or deleted" : "Ein Passman-Element wurde erstellt, modifiziert oder gelöscht", "A Passman item has expired" : "Ein Passman-Element ist abgelaufen", "A Passman item has been shared" : "Ein Passman-Element wurde geteilt", @@ -252,6 +258,15 @@ OC.L10N.register( "%s shared \"%s\" with you. Click here to accept" : "%s teilt \"%s\" mit dir. Um dies zu akzeptieren, klicke hier", "%s has declined your share request for \"%s\"." : "%s hat das Teilen von \"%s\" mit dir abgelehnt.", "%s has accepted your share request for \"%s\"." : "%s hat das Teilen von \"%s\" mit dir akzeptiert.", + "Unable to get version info" : "Versionsinfo konnte nicht ermittelt werden", + "Passman Settings" : "Passman-Einstellungen", + "Github version:" : "Github-Version:", + "A newer version of passman is available" : "Es ist eine neuere Version von Passman verfügbar", + "Allow users on this server to share passwords with a link" : "Erlaube Benutzern dieses Servers das Teilen von Passwörtern via Link", + "Allow users on this server to share passwords with other users" : "Erlaube Benutzern dieses Servers das Teilen von Passwörtern mit anderen Benutzern", + "Check for new versions" : "Nach neuerer Version suchen", + "Enable HTTPS check" : "HTTPS-Prüfung aktivieren", + "Disable context menu" : "Kontextmenü deaktivieren", "Connection to server lost" : "Verbindung zum Server verloren", "Problem loading page, reloading in 5 seconds" : "Problem beim Laden der Seite, Seite wird in 5 Sekunden nochmals geladen", "Saving..." : "Speichere…", diff --git a/l10n/de.json b/l10n/de.json index a7be49b9..fe53a04d 100644 --- a/l10n/de.json +++ b/l10n/de.json @@ -8,7 +8,7 @@ "Please fill in a label!" : "Bitte Beschriftung hinzufügen!", "Please fill in a value!" : "Bitte einen Wert hinzufügen!", "Error loading file" : "Fehler beim Laden der Datei", - "An error happend during decryption" : "Ein Fehler ist beim Entschlüsseln aufgetreten", + "An error happened during decryption" : "Ein Fehler ist bei der Entschlüsselung aufgetreten", "Credential created!" : "Anmeldeinformation erstellt!", "Credential deleted" : "Anmeldeinformation gelöscht", "Credential updated" : "Anmeldeinformation aktualisiert", @@ -42,6 +42,10 @@ "Credential unshared" : "Anmeldeinformation wird nicht mehr geteilt", "Credential shared" : "Anmeldeinformation wird geteilt", "Saved!" : "Gespeichert!", + "Poor" : "Mangelhaft", + "Weak" : "Schwach", + "Good" : "Gut", + "Strong" : "Stark", "Toggle visibility" : "Sichtbarkeit umschalten", "Copy to clipboard" : "In die Zwischenablage kopieren", "Copied to clipboard!" : "In die Zwischenablage kopiert!", @@ -202,6 +206,7 @@ "Last accessed" : "Letzter Zugriff", "Never" : "Nie", "No vaults found, why not create one?" : "Kein Tresor gefunden, warum kein neues erstellen?", + "Password strength must be at least: {{strength}}" : "Mindest erforderliche Passwortstärke: {{strength}}", "Please give your new vault a name." : "Bitte einen Namen für den neuen Tresor eingeben.", "Vault password" : "Tresor-Passwort", "Repeat vault password" : "Tresor-Passwort wiederholen", @@ -222,6 +227,7 @@ "Click here to request it" : "Hier klicken um es anzufordern", "Loading..." : "Lade...", "Awwhh.... credential not found. Maybe it expired" : "Oh... Zugangsdaten nicht gefunden. Vielleicht sind sie abgelaufen", + "Error while saving field" : "Fehler beim Speichern des Feldes", "A Passman item has been created, modified or deleted" : "Ein Passman-Element wurde erstellt, modifiziert oder gelöscht", "A Passman item has expired" : "Ein Passman-Element ist abgelaufen", "A Passman item has been shared" : "Ein Passman-Element wurde geteilt", @@ -250,6 +256,15 @@ "%s shared \"%s\" with you. Click here to accept" : "%s teilt \"%s\" mit dir. Um dies zu akzeptieren, klicke hier", "%s has declined your share request for \"%s\"." : "%s hat das Teilen von \"%s\" mit dir abgelehnt.", "%s has accepted your share request for \"%s\"." : "%s hat das Teilen von \"%s\" mit dir akzeptiert.", + "Unable to get version info" : "Versionsinfo konnte nicht ermittelt werden", + "Passman Settings" : "Passman-Einstellungen", + "Github version:" : "Github-Version:", + "A newer version of passman is available" : "Es ist eine neuere Version von Passman verfügbar", + "Allow users on this server to share passwords with a link" : "Erlaube Benutzern dieses Servers das Teilen von Passwörtern via Link", + "Allow users on this server to share passwords with other users" : "Erlaube Benutzern dieses Servers das Teilen von Passwörtern mit anderen Benutzern", + "Check for new versions" : "Nach neuerer Version suchen", + "Enable HTTPS check" : "HTTPS-Prüfung aktivieren", + "Disable context menu" : "Kontextmenü deaktivieren", "Connection to server lost" : "Verbindung zum Server verloren", "Problem loading page, reloading in 5 seconds" : "Problem beim Laden der Seite, Seite wird in 5 Sekunden nochmals geladen", "Saving..." : "Speichere…", diff --git a/l10n/de_DE.js b/l10n/de_DE.js index 523ce6cc..39eb1aed 100644 --- a/l10n/de_DE.js +++ b/l10n/de_DE.js @@ -10,7 +10,7 @@ OC.L10N.register( "Please fill in a label!" : "Bitte Beschriftung hinzufügen!", "Please fill in a value!" : "Bitte einen Wert hinzufügen!", "Error loading file" : "Fehler beim Laden der Datei", - "An error happend during decryption" : "Ein Fehler ist beim Entschlüsseln aufgetreten", + "An error happened during decryption" : "Ein Fehler ist bei der Entschlüsselung aufgetreten", "Credential created!" : "Anmeldeinformation erstellt!", "Credential deleted" : "Anmeldeinformation gelöscht", "Credential updated" : "Anmeldeinformation aktualisiert", @@ -44,6 +44,10 @@ OC.L10N.register( "Credential unshared" : "Anmeldeinformation wird nicht mehr geteilt", "Credential shared" : "Anmeldeinformation wird geteilt", "Saved!" : "Gespeichert!", + "Poor" : "mangelhaft", + "Weak" : "Schwach", + "Good" : "Gut", + "Strong" : "Stark", "Toggle visibility" : "Sichtbarkeit umschalten", "Copy to clipboard" : "In die Zwischenablage kopieren", "Copied to clipboard!" : "In die Zwischenablage kopiert!", @@ -204,6 +208,7 @@ OC.L10N.register( "Last accessed" : "Letzter Zugriff", "Never" : "Nie", "No vaults found, why not create one?" : "Kein Tresor gefunden, warum kein neues erstellen?", + "Password strength must be at least: {{strength}}" : "Mindest erforderliche Passwortstärke: {{strength}}", "Please give your new vault a name." : "Bitte einen Namen für den neuen Tresor eingeben.", "Vault password" : "Tresor-Passwort", "Repeat vault password" : "Tresor-Passwort wiederholen", @@ -224,6 +229,7 @@ OC.L10N.register( "Click here to request it" : "Hier klicken um es anzufordern", "Loading..." : "Lade...", "Awwhh.... credential not found. Maybe it expired" : "Oh... Zugangsdaten nicht gefunden. Vielleicht sind sie abgelaufen", + "Error while saving field" : "Fehler beim Speichern des Feldes", "A Passman item has been created, modified or deleted" : "Ein Passman-Element wurde erstellt, modifiziert oder gelöscht", "A Passman item has expired" : "Ein Passman-Element ist abgelaufen", "A Passman item has been shared" : "Ein Passman-Element wurde geteilt", @@ -252,6 +258,15 @@ OC.L10N.register( "%s shared \"%s\" with you. Click here to accept" : "%s teilt \"%s\" mit Ihnen. Um dies zu akzeptieren, klicken Sie bitte hier", "%s has declined your share request for \"%s\"." : "%s hat das Teilen von \"%s\" mit Ihnen abgelehnt.", "%s has accepted your share request for \"%s\"." : "%s hat das Teilen von \"%s\" mit Ihnen akzeptiert.", + "Unable to get version info" : "Versionsinfo konnte nicht ermittelt werden", + "Passman Settings" : "Passman-Einstellungen", + "Github version:" : "Github-Version:", + "A newer version of passman is available" : "Es ist eine neuere Version von Passman verfügbar", + "Allow users on this server to share passwords with a link" : "Erlaube Benutzern dieses Servers das Teilen von Passwörtern via Link", + "Allow users on this server to share passwords with other users" : "Erlaube Benutzern dieses Servers das Teilen von Passwörtern mit anderen Benutzern", + "Check for new versions" : "Nach neuerer Version suchen", + "Enable HTTPS check" : "HTTPS-Prüfung aktivieren", + "Disable context menu" : "Kontextmenü deaktivieren", "Connection to server lost" : "Verbindung zum Server verloren", "Problem loading page, reloading in 5 seconds" : "Problem beim Laden der Seite, Seite wird in 5 Sekunden erneut geladen", "Saving..." : "Speichere...", diff --git a/l10n/de_DE.json b/l10n/de_DE.json index db6d4da7..957234d6 100644 --- a/l10n/de_DE.json +++ b/l10n/de_DE.json @@ -8,7 +8,7 @@ "Please fill in a label!" : "Bitte Beschriftung hinzufügen!", "Please fill in a value!" : "Bitte einen Wert hinzufügen!", "Error loading file" : "Fehler beim Laden der Datei", - "An error happend during decryption" : "Ein Fehler ist beim Entschlüsseln aufgetreten", + "An error happened during decryption" : "Ein Fehler ist bei der Entschlüsselung aufgetreten", "Credential created!" : "Anmeldeinformation erstellt!", "Credential deleted" : "Anmeldeinformation gelöscht", "Credential updated" : "Anmeldeinformation aktualisiert", @@ -42,6 +42,10 @@ "Credential unshared" : "Anmeldeinformation wird nicht mehr geteilt", "Credential shared" : "Anmeldeinformation wird geteilt", "Saved!" : "Gespeichert!", + "Poor" : "mangelhaft", + "Weak" : "Schwach", + "Good" : "Gut", + "Strong" : "Stark", "Toggle visibility" : "Sichtbarkeit umschalten", "Copy to clipboard" : "In die Zwischenablage kopieren", "Copied to clipboard!" : "In die Zwischenablage kopiert!", @@ -202,6 +206,7 @@ "Last accessed" : "Letzter Zugriff", "Never" : "Nie", "No vaults found, why not create one?" : "Kein Tresor gefunden, warum kein neues erstellen?", + "Password strength must be at least: {{strength}}" : "Mindest erforderliche Passwortstärke: {{strength}}", "Please give your new vault a name." : "Bitte einen Namen für den neuen Tresor eingeben.", "Vault password" : "Tresor-Passwort", "Repeat vault password" : "Tresor-Passwort wiederholen", @@ -222,6 +227,7 @@ "Click here to request it" : "Hier klicken um es anzufordern", "Loading..." : "Lade...", "Awwhh.... credential not found. Maybe it expired" : "Oh... Zugangsdaten nicht gefunden. Vielleicht sind sie abgelaufen", + "Error while saving field" : "Fehler beim Speichern des Feldes", "A Passman item has been created, modified or deleted" : "Ein Passman-Element wurde erstellt, modifiziert oder gelöscht", "A Passman item has expired" : "Ein Passman-Element ist abgelaufen", "A Passman item has been shared" : "Ein Passman-Element wurde geteilt", @@ -250,6 +256,15 @@ "%s shared \"%s\" with you. Click here to accept" : "%s teilt \"%s\" mit Ihnen. Um dies zu akzeptieren, klicken Sie bitte hier", "%s has declined your share request for \"%s\"." : "%s hat das Teilen von \"%s\" mit Ihnen abgelehnt.", "%s has accepted your share request for \"%s\"." : "%s hat das Teilen von \"%s\" mit Ihnen akzeptiert.", + "Unable to get version info" : "Versionsinfo konnte nicht ermittelt werden", + "Passman Settings" : "Passman-Einstellungen", + "Github version:" : "Github-Version:", + "A newer version of passman is available" : "Es ist eine neuere Version von Passman verfügbar", + "Allow users on this server to share passwords with a link" : "Erlaube Benutzern dieses Servers das Teilen von Passwörtern via Link", + "Allow users on this server to share passwords with other users" : "Erlaube Benutzern dieses Servers das Teilen von Passwörtern mit anderen Benutzern", + "Check for new versions" : "Nach neuerer Version suchen", + "Enable HTTPS check" : "HTTPS-Prüfung aktivieren", + "Disable context menu" : "Kontextmenü deaktivieren", "Connection to server lost" : "Verbindung zum Server verloren", "Problem loading page, reloading in 5 seconds" : "Problem beim Laden der Seite, Seite wird in 5 Sekunden erneut geladen", "Saving..." : "Speichere...", diff --git a/l10n/es.js b/l10n/es.js index 64155db8..028a4dd1 100644 --- a/l10n/es.js +++ b/l10n/es.js @@ -10,7 +10,6 @@ OC.L10N.register( "Please fill in a label!" : "¡Por favor llene en una etiqueta!", "Please fill in a value!" : "¡Por favor llene en un valor!", "Error loading file" : "Error al cargar el archivo", - "An error happend during decryption" : "Un error sucedió durante el descifrado ", "Credential created!" : "¡Credencial creada!", "Credential deleted" : "Credencial eliminada", "Credential updated" : "Credencial actualziada", diff --git a/l10n/es.json b/l10n/es.json index 66528756..94de08f0 100644 --- a/l10n/es.json +++ b/l10n/es.json @@ -8,7 +8,6 @@ "Please fill in a label!" : "¡Por favor llene en una etiqueta!", "Please fill in a value!" : "¡Por favor llene en un valor!", "Error loading file" : "Error al cargar el archivo", - "An error happend during decryption" : "Un error sucedió durante el descifrado ", "Credential created!" : "¡Credencial creada!", "Credential deleted" : "Credencial eliminada", "Credential updated" : "Credencial actualziada", diff --git a/l10n/fr.js b/l10n/fr.js index b6642449..51716ae3 100644 --- a/l10n/fr.js +++ b/l10n/fr.js @@ -10,7 +10,7 @@ OC.L10N.register( "Please fill in a label!" : "Veuillez remplir une étiquette !", "Please fill in a value!" : "Veuillez remplir une valeur !", "Error loading file" : "Erreur lors du chargement du fichier", - "An error happend during decryption" : "Une erreur est survenue lors du décryptage", + "An error happened during decryption" : "Une erreur est survenue lors du décryptage", "Credential created!" : "Information d'identification créée !", "Credential deleted" : "Information d'identification supprimée", "Credential updated" : "Information d'identification mise à jour", @@ -20,6 +20,7 @@ OC.L10N.register( "Decrypting credentials" : "Décryptage des informations d'identification", "Done" : "Fait", "File read successfully!" : "Fichier lu avec succès !", + "Credential has no label, skipping" : "L'information d'identification n'a pas d'étiquette, ignorée", "Adding {{credential}}" : "{{credential}} en cours d'ajout", "Added {{credential}}" : "{{credential}} ajouté", "Parsed {{num}} credentials, starting to import" : "{{num}} informations d'identification analysées, commence à importer", @@ -43,6 +44,10 @@ OC.L10N.register( "Credential unshared" : "Arrêt du partage de l'information d'identification ", "Credential shared" : "Information d'identification partagée", "Saved!" : "Sauvegardé !", + "Poor" : "Médiocre", + "Weak" : "Faible", + "Good" : "Bon", + "Strong" : "Fort", "Toggle visibility" : "Activer la visibilité", "Copy to clipboard" : "Copier dans le presse-papier", "Copied to clipboard!" : "Copié dans le presse-papier !", @@ -99,6 +104,7 @@ OC.L10N.register( "About Passman" : "À propos de Passman", "Version" : "Version", "Donate to support development" : "Donner pour aider le développement", + "Bookmarklet" : "Bookmarklet", "Save your passwords with 1 click!" : "Sauvegardez vos mots de passe en 1 clic !", "Drag below button to your bookmark toolbar." : "Glissez le bouton ci-dessous dans la barre d'outils de vos favoris.", "Import type" : "Type d'importation", @@ -136,9 +142,17 @@ OC.L10N.register( "10 / second" : "10 / seconde", "10k / second" : "10k / seconde", "10B / second" : "10B / seconde", + "Pattern" : "Modèle", + "Dictionary name" : "Nom du dictionnaire", "Rank" : "Rang", + "Reversed" : "Inversé", + "Uppercase variations" : "Variations en majuscules", + "l33t-variations" : "Variations l33t", + "Showing revisions of" : "Montrer les révisions de", + "Revision of" : "Révisions de", "by" : "par", "No revisions found." : "Pas de révision trouvée.", + "Label" : "Étiquette", "Restore revision" : "Restaurer la révision", "Delete revision" : "Supprimer la révision", "Edit credential" : "Éditer le rapport d'identification", @@ -146,7 +160,10 @@ OC.L10N.register( "Save" : "Sauvegarder", "Cancel" : "Annuler", "Settings" : "Paramètres", + "Share credential {{credential}}" : "Partage l'information d'identification {{credential}}", "Unshare" : "Ne plus partager", + "Showing deleted since" : "Montrer ceux supprimés depuis", + "Search credential..." : "Rechercher l'information d'identification...", "Account" : "Compte", "Password" : "Mot de passe", "OTP" : "OTP", @@ -161,19 +178,25 @@ OC.L10N.register( "Share" : "Partager", "Recover" : "Restaurer", "Destroy" : "Détruire", + "You have incoming share requests." : "Vous avez des nouvelles demandes de partage.", + "If you want to the credential in a other vault," : "Si vous souhaitez obtenir les informations d'identification dans un autre coffre-fort,", + "logout of this vault and login to the vault you want the shared credential in." : "déconnectez-vous de ce coffre-fort et connectez-vous au coffre-fort dans lequel vous voulez les informations d'identification partagées.", "Permissions" : "Permissions", + "Received from" : "Reçu de", "Date" : "Date", "Accept" : "Accepter", "Decline" : "Refuser", "Last accessed" : "Dernier accès", "Never" : "Jamais", "No vaults found, why not create one?" : "Pas de coffre-fort trouvé, pourquoi ne pas en créer un ?", + "Password strength must be at least: {{strength}}" : "La force du mot de passe doit être au moins : {{strength}}", "Please give your new vault a name." : "Veuillez donner un nom à votre nouveau coffre-fort.", "Vault password" : "Mot de passe du coffre-fort", "Repeat vault password" : "Confirmer le mot de passe du coffre-fort", "Your sharing key's will have a strength of 1024 bit, which you can change later in settings." : "Votre clé de partage aura un poids de 1024 octet, ce qui pourra être modifié plus tard dans les paramètres.", "Create vault" : "Créer un coffre-fort", "Go back to vaults" : "Retourner aux coffres-forts", + "Please input the password for" : "Veuillez entrer le mot de passe pour", "Set this vault as default." : "Choisir ce coffre-fort par défaut.", "Login automatically to this vault." : "Se connecter automatiquement à ce coffre-fort.", "Decrypt vault" : "Déchiffrer le coffre-fort", @@ -183,7 +206,11 @@ OC.L10N.register( "Deleted credentials" : "Supprimer les informations d'identification", "Logout" : "Se déconnecter", "Donate" : "Donner", + "Someone has shared a credential with you." : "Quelqu'un a partagé une information d'identification avec vous.", + "Click here to request it" : "Cliquez ici pour le demander", "Loading..." : "Chargement...", + "Awwhh.... credential not found. Maybe it expired" : "Awwhh.... information d'identification non trouvée. Il est peut être expiré", + "Error while saving field" : "Erreur lors de la sauvegarde du champ", "A Passman item has been created, modified or deleted" : "Un élément Passman a été créé, modifié ou supprimé", "A Passman item has expired" : "Un élément Passman a expiré", "A Passman item has been shared" : "Un élément Passman a été partagé", @@ -212,6 +239,14 @@ OC.L10N.register( "%s shared \"%s\" with you. Click here to accept" : "%s a partagé \"%s\" avec vous. Cliquez ici pour accepter", "%s has declined your share request for \"%s\"." : "%s a refusé votre demande de partage pour \"%s\"", "%s has accepted your share request for \"%s\"." : "%s a accepté votre demande de partage pour \"%s\"", + "Unable to get version info" : "Impossible d'obtenir l'information de la version", + "Passman Settings" : "Paramètres de Passman", + "Github version:" : "Version Github :", + "A newer version of passman is available" : "Une version plus récente de Passman est disponible", + "Allow users on this server to share passwords with a link" : "Autoriser les utilisateurs de ce serveur à partager par lien des mots de passe", + "Allow users on this server to share passwords with other users" : "Autoriser les utilisateurs de ce serveur à partager des mots de passe avec d'autres utilisateurs", + "Check for new versions" : "Vérifier la présence de nouvelles versions", + "Enable HTTPS check" : "Activer la vérification HTTPS", "Connection to server lost" : "Connexion au serveur perdu", "Problem loading page, reloading in 5 seconds" : "Problème de chargement de la page, actualisation dans 5 secondes", "Saving..." : "Enregistrement…", diff --git a/l10n/fr.json b/l10n/fr.json index 2492d33d..4056c74c 100644 --- a/l10n/fr.json +++ b/l10n/fr.json @@ -8,7 +8,7 @@ "Please fill in a label!" : "Veuillez remplir une étiquette !", "Please fill in a value!" : "Veuillez remplir une valeur !", "Error loading file" : "Erreur lors du chargement du fichier", - "An error happend during decryption" : "Une erreur est survenue lors du décryptage", + "An error happened during decryption" : "Une erreur est survenue lors du décryptage", "Credential created!" : "Information d'identification créée !", "Credential deleted" : "Information d'identification supprimée", "Credential updated" : "Information d'identification mise à jour", @@ -18,6 +18,7 @@ "Decrypting credentials" : "Décryptage des informations d'identification", "Done" : "Fait", "File read successfully!" : "Fichier lu avec succès !", + "Credential has no label, skipping" : "L'information d'identification n'a pas d'étiquette, ignorée", "Adding {{credential}}" : "{{credential}} en cours d'ajout", "Added {{credential}}" : "{{credential}} ajouté", "Parsed {{num}} credentials, starting to import" : "{{num}} informations d'identification analysées, commence à importer", @@ -41,6 +42,10 @@ "Credential unshared" : "Arrêt du partage de l'information d'identification ", "Credential shared" : "Information d'identification partagée", "Saved!" : "Sauvegardé !", + "Poor" : "Médiocre", + "Weak" : "Faible", + "Good" : "Bon", + "Strong" : "Fort", "Toggle visibility" : "Activer la visibilité", "Copy to clipboard" : "Copier dans le presse-papier", "Copied to clipboard!" : "Copié dans le presse-papier !", @@ -97,6 +102,7 @@ "About Passman" : "À propos de Passman", "Version" : "Version", "Donate to support development" : "Donner pour aider le développement", + "Bookmarklet" : "Bookmarklet", "Save your passwords with 1 click!" : "Sauvegardez vos mots de passe en 1 clic !", "Drag below button to your bookmark toolbar." : "Glissez le bouton ci-dessous dans la barre d'outils de vos favoris.", "Import type" : "Type d'importation", @@ -134,9 +140,17 @@ "10 / second" : "10 / seconde", "10k / second" : "10k / seconde", "10B / second" : "10B / seconde", + "Pattern" : "Modèle", + "Dictionary name" : "Nom du dictionnaire", "Rank" : "Rang", + "Reversed" : "Inversé", + "Uppercase variations" : "Variations en majuscules", + "l33t-variations" : "Variations l33t", + "Showing revisions of" : "Montrer les révisions de", + "Revision of" : "Révisions de", "by" : "par", "No revisions found." : "Pas de révision trouvée.", + "Label" : "Étiquette", "Restore revision" : "Restaurer la révision", "Delete revision" : "Supprimer la révision", "Edit credential" : "Éditer le rapport d'identification", @@ -144,7 +158,10 @@ "Save" : "Sauvegarder", "Cancel" : "Annuler", "Settings" : "Paramètres", + "Share credential {{credential}}" : "Partage l'information d'identification {{credential}}", "Unshare" : "Ne plus partager", + "Showing deleted since" : "Montrer ceux supprimés depuis", + "Search credential..." : "Rechercher l'information d'identification...", "Account" : "Compte", "Password" : "Mot de passe", "OTP" : "OTP", @@ -159,19 +176,25 @@ "Share" : "Partager", "Recover" : "Restaurer", "Destroy" : "Détruire", + "You have incoming share requests." : "Vous avez des nouvelles demandes de partage.", + "If you want to the credential in a other vault," : "Si vous souhaitez obtenir les informations d'identification dans un autre coffre-fort,", + "logout of this vault and login to the vault you want the shared credential in." : "déconnectez-vous de ce coffre-fort et connectez-vous au coffre-fort dans lequel vous voulez les informations d'identification partagées.", "Permissions" : "Permissions", + "Received from" : "Reçu de", "Date" : "Date", "Accept" : "Accepter", "Decline" : "Refuser", "Last accessed" : "Dernier accès", "Never" : "Jamais", "No vaults found, why not create one?" : "Pas de coffre-fort trouvé, pourquoi ne pas en créer un ?", + "Password strength must be at least: {{strength}}" : "La force du mot de passe doit être au moins : {{strength}}", "Please give your new vault a name." : "Veuillez donner un nom à votre nouveau coffre-fort.", "Vault password" : "Mot de passe du coffre-fort", "Repeat vault password" : "Confirmer le mot de passe du coffre-fort", "Your sharing key's will have a strength of 1024 bit, which you can change later in settings." : "Votre clé de partage aura un poids de 1024 octet, ce qui pourra être modifié plus tard dans les paramètres.", "Create vault" : "Créer un coffre-fort", "Go back to vaults" : "Retourner aux coffres-forts", + "Please input the password for" : "Veuillez entrer le mot de passe pour", "Set this vault as default." : "Choisir ce coffre-fort par défaut.", "Login automatically to this vault." : "Se connecter automatiquement à ce coffre-fort.", "Decrypt vault" : "Déchiffrer le coffre-fort", @@ -181,7 +204,11 @@ "Deleted credentials" : "Supprimer les informations d'identification", "Logout" : "Se déconnecter", "Donate" : "Donner", + "Someone has shared a credential with you." : "Quelqu'un a partagé une information d'identification avec vous.", + "Click here to request it" : "Cliquez ici pour le demander", "Loading..." : "Chargement...", + "Awwhh.... credential not found. Maybe it expired" : "Awwhh.... information d'identification non trouvée. Il est peut être expiré", + "Error while saving field" : "Erreur lors de la sauvegarde du champ", "A Passman item has been created, modified or deleted" : "Un élément Passman a été créé, modifié ou supprimé", "A Passman item has expired" : "Un élément Passman a expiré", "A Passman item has been shared" : "Un élément Passman a été partagé", @@ -210,6 +237,14 @@ "%s shared \"%s\" with you. Click here to accept" : "%s a partagé \"%s\" avec vous. Cliquez ici pour accepter", "%s has declined your share request for \"%s\"." : "%s a refusé votre demande de partage pour \"%s\"", "%s has accepted your share request for \"%s\"." : "%s a accepté votre demande de partage pour \"%s\"", + "Unable to get version info" : "Impossible d'obtenir l'information de la version", + "Passman Settings" : "Paramètres de Passman", + "Github version:" : "Version Github :", + "A newer version of passman is available" : "Une version plus récente de Passman est disponible", + "Allow users on this server to share passwords with a link" : "Autoriser les utilisateurs de ce serveur à partager par lien des mots de passe", + "Allow users on this server to share passwords with other users" : "Autoriser les utilisateurs de ce serveur à partager des mots de passe avec d'autres utilisateurs", + "Check for new versions" : "Vérifier la présence de nouvelles versions", + "Enable HTTPS check" : "Activer la vérification HTTPS", "Connection to server lost" : "Connexion au serveur perdu", "Problem loading page, reloading in 5 seconds" : "Problème de chargement de la page, actualisation dans 5 secondes", "Saving..." : "Enregistrement…", diff --git a/l10n/it.js b/l10n/it.js index faa06f21..c4044c06 100644 --- a/l10n/it.js +++ b/l10n/it.js @@ -10,7 +10,7 @@ OC.L10N.register( "Please fill in a label!" : "Aggiungi un'etichetta!", "Please fill in a value!" : "Aggiungi un valore!", "Error loading file" : "Errore durante il caricamento del file", - "An error happend during decryption" : "Si è verificato un errore durante la decifratura", + "An error happened during decryption" : "Si è verificato un errore durante la decifratura", "Credential created!" : "Credenziali create!", "Credential deleted" : "Credenziali eliminate", "Credential updated" : "Credenziali aggiornate", @@ -20,6 +20,7 @@ OC.L10N.register( "Decrypting credentials" : "Decifratura delle credenziali", "Done" : "Fine", "File read successfully!" : "File letto correttamente!", + "Credential has no label, skipping" : "Credenziali senza etichetta, ignorate", "Adding {{credential}}" : "Aggiunta di {{credential}}", "Added {{credential}}" : "Aggiunte {{credential}}", "Parsed {{num}} credentials, starting to import" : "Elaborate {{num}} credenziali, avvio dell'importazione", @@ -28,6 +29,7 @@ OC.L10N.register( "Save in passman" : "Salva in passman", "Settings saved" : "Impostazioni salvate", "General settings" : "Impostazioni generali", + "Password Audit" : "Verifica password", "Password settings" : "Impostazioni password", "Import credentials" : "Importa credenziali", "Export credentials" : "Esporta credenziali", @@ -42,6 +44,10 @@ OC.L10N.register( "Credential unshared" : "Credenziali non condivise", "Credential shared" : "Credenziali condivise", "Saved!" : "Salvato!", + "Poor" : "Povera", + "Weak" : "Debole", + "Good" : "Buona", + "Strong" : "Forte", "Toggle visibility" : "Commuta la visibilità", "Copy to clipboard" : "Copia negli appunti", "Copied to clipboard!" : "Copiato negli appunti!", @@ -91,6 +97,7 @@ OC.L10N.register( "Rename vault" : "Rinomina cassaforte", "New vault name" : "Nome della nuova cassaforte", "Change" : "Modifica", + "Change vault key" : "Modifica chiave della cassaforte", "Old vault password" : "Vecchia password della cassaforte", "New vault password" : "Nuova password della cassaforte", "New vault password repeat" : "Ripeti la nuova password della cassaforte", @@ -113,7 +120,9 @@ OC.L10N.register( "Save keys" : "Salva chiavi", "Generate sharing keys" : "Genera chiavi di condivisione", "Generating sharing keys" : "Generazione chiavi di condivisione", + "The password tool will scan your password, calculate the avarage crack time and, if below the threshold, show them" : "Lo strumento delle password analizzerà la tua password, calcolerà il tempo medio per decifrarla e, se sotto la soglia, lo segnalerà.", "Minimum password stength" : "Robustezza minima della password", + "Passman scanned your passwords, and here is the result." : "Passman ha analizzato le tue password, ed ecco il risultato.", "A total of {{scan_result}} weak credentials." : "Un totale di {{scan_result}} credenziali deboli.", "Score" : "Punteggio", "Action" : "Azione", @@ -122,6 +131,7 @@ OC.L10N.register( "Uploading" : "Caricamento", "User" : "Utente", "Crypto time" : "Tempo di cifratura", + "Total time spent cyphering" : "Tempo totale impiegato nella cifratura", "Read" : "Lettura", "Write" : "Scrittura", "Files" : "File", @@ -129,6 +139,7 @@ OC.L10N.register( "Pending" : "In corso", "Enable link sharing" : "Abilita condivisione tramite collegamento", "Share until date" : "Condividi fino alla data", + "Expire after views" : "Scadenza dopo viste", "Show files" : "Mostra i file", "Details" : "Dettagli", "Hide details" : "Nascondi dettagli", @@ -155,6 +166,7 @@ OC.L10N.register( "Settings" : "Impostazioni", "Share credential {{credential}}" : "Condividi credenziali {{credential}}", "Unshare" : "Rimuovi condivisione", + "Showing {{number_filtered}} of {{credential_number}} credentials" : "Visualizzazione di {{number_filtered}} di {{credential_number}} credenziali", "Search credential..." : "Cerca credenziali...", "Account" : "Account", "Password" : "Password", @@ -171,6 +183,8 @@ OC.L10N.register( "Recover" : "Ripristina", "Destroy" : "Distruggi", "You have incoming share requests." : "Hai ricevuto delle richieste di condivisione.", + "If you want to the credential in a other vault," : "Se vuoi condividere le credenziali con un'altra cassaforte,", + "logout of this vault and login to the vault you want the shared credential in." : "esci da questa cassaforte e accedi alla cassaforte con la quale vuoi condividere le credenziali.", "Permissions" : "Permessi", "Received from" : "Ricevute da", "Date" : "Data", @@ -179,6 +193,7 @@ OC.L10N.register( "Last accessed" : "Ultimo accesso", "Never" : "Mai", "No vaults found, why not create one?" : "Nessuna cassaforte trovata, vuoi crearne una?", + "Password strength must be at least: {{strength}}" : "La robustezza della password deve essere almeno: {{strength}}", "Please give your new vault a name." : "Dai un nome alla tua nuova cassaforte.", "Vault password" : "Password della cassaforte", "Repeat vault password" : "Ripeti la password della cassaforte", @@ -199,6 +214,7 @@ OC.L10N.register( "Click here to request it" : "Fai clic qui per richiederle", "Loading..." : "Caricamento in corso...", "Awwhh.... credential not found. Maybe it expired" : "Ops... credenziali non trovate. Potrebbero essere scadute", + "Error while saving field" : "Errore durante il salvataggio del campo", "A Passman item has been created, modified or deleted" : "Un elemento Passman è stato creato, modificato o eliminato", "A Passman item has expired" : "Un elemento Passman è scaduto", "A Passman item has been shared" : "Un elemento Passman è stato condiviso", @@ -227,6 +243,15 @@ OC.L10N.register( "%s shared \"%s\" with you. Click here to accept" : "%s ha condiviso \"%s\" con te. Fai clic qui per accettare", "%s has declined your share request for \"%s\"." : "%s ha rifiutato la tua richiesta di condivisione per \"%s\".", "%s has accepted your share request for \"%s\"." : "%s ha accettato la tua richiesta di condivisione per \"%s\".", + "Unable to get version info" : "Impossibile ottenere le informazioni di versione", + "Passman Settings" : "Impostazioni di Passman", + "Github version:" : "Versione di Github:", + "A newer version of passman is available" : "Una nuova versione di Passman è disponibile", + "Allow users on this server to share passwords with a link" : "Consenti agli utenti su questo server di condividere le password tramite un collegamento", + "Allow users on this server to share passwords with other users" : "Consenti agli utenti su questo server di condividere le password con altri utenti", + "Check for new versions" : "Controlla la presenza di nuove versioni", + "Enable HTTPS check" : "Abilita controllo HTTPS", + "Disable context menu" : "Disabilita menu contestuale", "Connection to server lost" : "Connessione al server interrotta", "Problem loading page, reloading in 5 seconds" : "Problema durante il caricamento della pagina, aggiornamento tra 5 secondi", "Saving..." : "Salvataggio in corso...", diff --git a/l10n/it.json b/l10n/it.json index 12a1ee14..2f0e18bc 100644 --- a/l10n/it.json +++ b/l10n/it.json @@ -8,7 +8,7 @@ "Please fill in a label!" : "Aggiungi un'etichetta!", "Please fill in a value!" : "Aggiungi un valore!", "Error loading file" : "Errore durante il caricamento del file", - "An error happend during decryption" : "Si è verificato un errore durante la decifratura", + "An error happened during decryption" : "Si è verificato un errore durante la decifratura", "Credential created!" : "Credenziali create!", "Credential deleted" : "Credenziali eliminate", "Credential updated" : "Credenziali aggiornate", @@ -18,6 +18,7 @@ "Decrypting credentials" : "Decifratura delle credenziali", "Done" : "Fine", "File read successfully!" : "File letto correttamente!", + "Credential has no label, skipping" : "Credenziali senza etichetta, ignorate", "Adding {{credential}}" : "Aggiunta di {{credential}}", "Added {{credential}}" : "Aggiunte {{credential}}", "Parsed {{num}} credentials, starting to import" : "Elaborate {{num}} credenziali, avvio dell'importazione", @@ -26,6 +27,7 @@ "Save in passman" : "Salva in passman", "Settings saved" : "Impostazioni salvate", "General settings" : "Impostazioni generali", + "Password Audit" : "Verifica password", "Password settings" : "Impostazioni password", "Import credentials" : "Importa credenziali", "Export credentials" : "Esporta credenziali", @@ -40,6 +42,10 @@ "Credential unshared" : "Credenziali non condivise", "Credential shared" : "Credenziali condivise", "Saved!" : "Salvato!", + "Poor" : "Povera", + "Weak" : "Debole", + "Good" : "Buona", + "Strong" : "Forte", "Toggle visibility" : "Commuta la visibilità", "Copy to clipboard" : "Copia negli appunti", "Copied to clipboard!" : "Copiato negli appunti!", @@ -89,6 +95,7 @@ "Rename vault" : "Rinomina cassaforte", "New vault name" : "Nome della nuova cassaforte", "Change" : "Modifica", + "Change vault key" : "Modifica chiave della cassaforte", "Old vault password" : "Vecchia password della cassaforte", "New vault password" : "Nuova password della cassaforte", "New vault password repeat" : "Ripeti la nuova password della cassaforte", @@ -111,7 +118,9 @@ "Save keys" : "Salva chiavi", "Generate sharing keys" : "Genera chiavi di condivisione", "Generating sharing keys" : "Generazione chiavi di condivisione", + "The password tool will scan your password, calculate the avarage crack time and, if below the threshold, show them" : "Lo strumento delle password analizzerà la tua password, calcolerà il tempo medio per decifrarla e, se sotto la soglia, lo segnalerà.", "Minimum password stength" : "Robustezza minima della password", + "Passman scanned your passwords, and here is the result." : "Passman ha analizzato le tue password, ed ecco il risultato.", "A total of {{scan_result}} weak credentials." : "Un totale di {{scan_result}} credenziali deboli.", "Score" : "Punteggio", "Action" : "Azione", @@ -120,6 +129,7 @@ "Uploading" : "Caricamento", "User" : "Utente", "Crypto time" : "Tempo di cifratura", + "Total time spent cyphering" : "Tempo totale impiegato nella cifratura", "Read" : "Lettura", "Write" : "Scrittura", "Files" : "File", @@ -127,6 +137,7 @@ "Pending" : "In corso", "Enable link sharing" : "Abilita condivisione tramite collegamento", "Share until date" : "Condividi fino alla data", + "Expire after views" : "Scadenza dopo viste", "Show files" : "Mostra i file", "Details" : "Dettagli", "Hide details" : "Nascondi dettagli", @@ -153,6 +164,7 @@ "Settings" : "Impostazioni", "Share credential {{credential}}" : "Condividi credenziali {{credential}}", "Unshare" : "Rimuovi condivisione", + "Showing {{number_filtered}} of {{credential_number}} credentials" : "Visualizzazione di {{number_filtered}} di {{credential_number}} credenziali", "Search credential..." : "Cerca credenziali...", "Account" : "Account", "Password" : "Password", @@ -169,6 +181,8 @@ "Recover" : "Ripristina", "Destroy" : "Distruggi", "You have incoming share requests." : "Hai ricevuto delle richieste di condivisione.", + "If you want to the credential in a other vault," : "Se vuoi condividere le credenziali con un'altra cassaforte,", + "logout of this vault and login to the vault you want the shared credential in." : "esci da questa cassaforte e accedi alla cassaforte con la quale vuoi condividere le credenziali.", "Permissions" : "Permessi", "Received from" : "Ricevute da", "Date" : "Data", @@ -177,6 +191,7 @@ "Last accessed" : "Ultimo accesso", "Never" : "Mai", "No vaults found, why not create one?" : "Nessuna cassaforte trovata, vuoi crearne una?", + "Password strength must be at least: {{strength}}" : "La robustezza della password deve essere almeno: {{strength}}", "Please give your new vault a name." : "Dai un nome alla tua nuova cassaforte.", "Vault password" : "Password della cassaforte", "Repeat vault password" : "Ripeti la password della cassaforte", @@ -197,6 +212,7 @@ "Click here to request it" : "Fai clic qui per richiederle", "Loading..." : "Caricamento in corso...", "Awwhh.... credential not found. Maybe it expired" : "Ops... credenziali non trovate. Potrebbero essere scadute", + "Error while saving field" : "Errore durante il salvataggio del campo", "A Passman item has been created, modified or deleted" : "Un elemento Passman è stato creato, modificato o eliminato", "A Passman item has expired" : "Un elemento Passman è scaduto", "A Passman item has been shared" : "Un elemento Passman è stato condiviso", @@ -225,6 +241,15 @@ "%s shared \"%s\" with you. Click here to accept" : "%s ha condiviso \"%s\" con te. Fai clic qui per accettare", "%s has declined your share request for \"%s\"." : "%s ha rifiutato la tua richiesta di condivisione per \"%s\".", "%s has accepted your share request for \"%s\"." : "%s ha accettato la tua richiesta di condivisione per \"%s\".", + "Unable to get version info" : "Impossibile ottenere le informazioni di versione", + "Passman Settings" : "Impostazioni di Passman", + "Github version:" : "Versione di Github:", + "A newer version of passman is available" : "Una nuova versione di Passman è disponibile", + "Allow users on this server to share passwords with a link" : "Consenti agli utenti su questo server di condividere le password tramite un collegamento", + "Allow users on this server to share passwords with other users" : "Consenti agli utenti su questo server di condividere le password con altri utenti", + "Check for new versions" : "Controlla la presenza di nuove versioni", + "Enable HTTPS check" : "Abilita controllo HTTPS", + "Disable context menu" : "Disabilita menu contestuale", "Connection to server lost" : "Connessione al server interrotta", "Problem loading page, reloading in 5 seconds" : "Problema durante il caricamento della pagina, aggiornamento tra 5 secondi", "Saving..." : "Salvataggio in corso...", diff --git a/l10n/nl.js b/l10n/nl.js index 267c1b7f..510ca435 100644 --- a/l10n/nl.js +++ b/l10n/nl.js @@ -10,7 +10,7 @@ OC.L10N.register( "Please fill in a label!" : "Voeg een label toe!", "Please fill in a value!" : "Geef een waarde op!", "Error loading file" : "Fout bij laden bestand", - "An error happend during decryption" : "Er trad een fout op bij ontsleutelen", + "An error happened during decryption" : "Er trad een fout op bij ontsleutelen", "Credential created!" : "Inloggegevens aangemaakt!", "Credential deleted" : "Inloggegevens verwijderd", "Credential updated" : "Inloggegevens bijgewerkt", @@ -44,6 +44,10 @@ OC.L10N.register( "Credential unshared" : "Delen inloggegevens gestopt", "Credential shared" : "Inloggegevens gedeeld", "Saved!" : "Opgeslagen!", + "Poor" : "Slecht", + "Weak" : "Zwak", + "Good" : "Goed", + "Strong" : "Sterk", "Toggle visibility" : "Omschakelen zichtbaarheid", "Copy to clipboard" : "Kopiëren naar het klembord", "Copied to clipboard!" : "Gekopieerd naar het klembord!", @@ -204,6 +208,7 @@ OC.L10N.register( "Last accessed" : "Laatst benaderd", "Never" : "Nooit", "No vaults found, why not create one?" : "Geen kluis gevonden, eentje aanmaken?", + "Password strength must be at least: {{strength}}" : "Wachtwoordsterkte minimale waarde: {{strength}}", "Please give your new vault a name." : "Voer de naam van je nieuwe kluis in.", "Vault password" : "Kluiswachtwoord", "Repeat vault password" : "Herhaal kluiswachtwoord", @@ -224,6 +229,7 @@ OC.L10N.register( "Click here to request it" : "Klik hier om het aan te vragen", "Loading..." : "Laden...", "Awwhh.... credential not found. Maybe it expired" : "Uhmmm.... inloggegeven niet gevonden. Misschien verlopen", + "Error while saving field" : "Fout bij opslaan veld", "A Passman item has been created, modified or deleted" : "Er is een Passman object gemaakt, gewijzigd of verwijderd", "A Passman item has expired" : "Er is een Passman object vervallen", "A Passman item has been shared" : "Er is een Passman object gedeeld", @@ -252,6 +258,15 @@ OC.L10N.register( "%s shared \"%s\" with you. Click here to accept" : "%s deelde \"%s\" met je. Klik hier om te accepteren", "%s has declined your share request for \"%s\"." : "%s weigerde je aanvraag om \"%s\" te delen.", "%s has accepted your share request for \"%s\"." : "%s accepteerde je aanvraag om \"%s\" te delen.", + "Unable to get version info" : "Kon de versieinformatie niet ophalen", + "Passman Settings" : "Passman instellingen", + "Github version:" : "Github versie:", + "A newer version of passman is available" : "Er is een meer recente versie van passman beschikbaar", + "Allow users on this server to share passwords with a link" : "Toestaan dat gebruikers op deze server wachtwoorden delen via een link", + "Allow users on this server to share passwords with other users" : "Toestaan dat gebruikers op deze server wachtwoorden met andere gebruikers delen", + "Check for new versions" : "Controleren op nieuwe versies", + "Enable HTTPS check" : "Inschakelen HTTPS controle", + "Disable context menu" : "Deactiveren contextmenu", "Connection to server lost" : "Verbinding met server verloren", "Problem loading page, reloading in 5 seconds" : "Probleem met het laden van de pagina, wordt ververst in 5 seconden", "Saving..." : "Opslaan...", diff --git a/l10n/nl.json b/l10n/nl.json index cd07a07a..5d659de1 100644 --- a/l10n/nl.json +++ b/l10n/nl.json @@ -8,7 +8,7 @@ "Please fill in a label!" : "Voeg een label toe!", "Please fill in a value!" : "Geef een waarde op!", "Error loading file" : "Fout bij laden bestand", - "An error happend during decryption" : "Er trad een fout op bij ontsleutelen", + "An error happened during decryption" : "Er trad een fout op bij ontsleutelen", "Credential created!" : "Inloggegevens aangemaakt!", "Credential deleted" : "Inloggegevens verwijderd", "Credential updated" : "Inloggegevens bijgewerkt", @@ -42,6 +42,10 @@ "Credential unshared" : "Delen inloggegevens gestopt", "Credential shared" : "Inloggegevens gedeeld", "Saved!" : "Opgeslagen!", + "Poor" : "Slecht", + "Weak" : "Zwak", + "Good" : "Goed", + "Strong" : "Sterk", "Toggle visibility" : "Omschakelen zichtbaarheid", "Copy to clipboard" : "Kopiëren naar het klembord", "Copied to clipboard!" : "Gekopieerd naar het klembord!", @@ -202,6 +206,7 @@ "Last accessed" : "Laatst benaderd", "Never" : "Nooit", "No vaults found, why not create one?" : "Geen kluis gevonden, eentje aanmaken?", + "Password strength must be at least: {{strength}}" : "Wachtwoordsterkte minimale waarde: {{strength}}", "Please give your new vault a name." : "Voer de naam van je nieuwe kluis in.", "Vault password" : "Kluiswachtwoord", "Repeat vault password" : "Herhaal kluiswachtwoord", @@ -222,6 +227,7 @@ "Click here to request it" : "Klik hier om het aan te vragen", "Loading..." : "Laden...", "Awwhh.... credential not found. Maybe it expired" : "Uhmmm.... inloggegeven niet gevonden. Misschien verlopen", + "Error while saving field" : "Fout bij opslaan veld", "A Passman item has been created, modified or deleted" : "Er is een Passman object gemaakt, gewijzigd of verwijderd", "A Passman item has expired" : "Er is een Passman object vervallen", "A Passman item has been shared" : "Er is een Passman object gedeeld", @@ -250,6 +256,15 @@ "%s shared \"%s\" with you. Click here to accept" : "%s deelde \"%s\" met je. Klik hier om te accepteren", "%s has declined your share request for \"%s\"." : "%s weigerde je aanvraag om \"%s\" te delen.", "%s has accepted your share request for \"%s\"." : "%s accepteerde je aanvraag om \"%s\" te delen.", + "Unable to get version info" : "Kon de versieinformatie niet ophalen", + "Passman Settings" : "Passman instellingen", + "Github version:" : "Github versie:", + "A newer version of passman is available" : "Er is een meer recente versie van passman beschikbaar", + "Allow users on this server to share passwords with a link" : "Toestaan dat gebruikers op deze server wachtwoorden delen via een link", + "Allow users on this server to share passwords with other users" : "Toestaan dat gebruikers op deze server wachtwoorden met andere gebruikers delen", + "Check for new versions" : "Controleren op nieuwe versies", + "Enable HTTPS check" : "Inschakelen HTTPS controle", + "Disable context menu" : "Deactiveren contextmenu", "Connection to server lost" : "Verbinding met server verloren", "Problem loading page, reloading in 5 seconds" : "Probleem met het laden van de pagina, wordt ververst in 5 seconden", "Saving..." : "Opslaan...", diff --git a/l10n/pt_BR.js b/l10n/pt_BR.js index 107ca8f9..fee655d0 100644 --- a/l10n/pt_BR.js +++ b/l10n/pt_BR.js @@ -10,7 +10,7 @@ OC.L10N.register( "Please fill in a label!" : "Preencha o rótulo!", "Please fill in a value!" : "Preencha um valor!", "Error loading file" : "Erro ao carregar o arquivo", - "An error happend during decryption" : "Ocorreu um erro durante a descriptografia", + "An error happened during decryption" : "Ocorreu um erro durante a descriptografia", "Credential created!" : "Credencial criada!", "Credential deleted" : "Credential excluída", "Credential updated" : "Credencial atualizada", @@ -44,6 +44,10 @@ OC.L10N.register( "Credential unshared" : "Credencial não compartilhada", "Credential shared" : "Credencial compartilhada", "Saved!" : "Salva!", + "Poor" : "Pobre", + "Weak" : "Fraca", + "Good" : "Boa", + "Strong" : "Forte", "Toggle visibility" : "Alternar visibilidade", "Copy to clipboard" : "Copiar para área de transferência", "Copied to clipboard!" : "Copiado para a área de transferência!", @@ -204,6 +208,7 @@ OC.L10N.register( "Last accessed" : "Último acessado", "Never" : "Nunca", "No vaults found, why not create one?" : "Nenhum cofre encontrado, por que não criar um?", + "Password strength must be at least: {{strength}}" : "A força da senha deve ser pelo menos: {{strength}}", "Please give your new vault a name." : "Por favor, dê ao seu novo cofre um nome.", "Vault password" : "Senha do cofre", "Repeat vault password" : "Repita a senha do cofre", @@ -224,6 +229,7 @@ OC.L10N.register( "Click here to request it" : "Clique aqui para solicitá-lo", "Loading..." : "Carregando...", "Awwhh.... credential not found. Maybe it expired" : "Awwhh .... credencial não encontrada. Talvez tenha expirado", + "Error while saving field" : "Erro ao salvar o campo", "A Passman item has been created, modified or deleted" : "Um item Passman foi criado, modificado ou excluído", "A Passman item has expired" : "Um item Passman expirou", "A Passman item has been shared" : "Um item Passman foi compartilhado", @@ -252,6 +258,15 @@ OC.L10N.register( "%s shared \"%s\" with you. Click here to accept" : "%s compartilhou \"%s\" com você. Clique aqui para aceitar", "%s has declined your share request for \"%s\"." : "%s recusou o seu pedido de participação de \"%s\".", "%s has accepted your share request for \"%s\"." : "%s aceitou seu pedido de compartilhamento para \"%s\".", + "Unable to get version info" : "Não é possível obter informações sobre a versão", + "Passman Settings" : "Configurações do Passman", + "Github version:" : "Versão Github:", + "A newer version of passman is available" : "Uma versão mais recente do passman está disponível", + "Allow users on this server to share passwords with a link" : "Permitir que os usuários neste servidor compartilhem senhas com um link", + "Allow users on this server to share passwords with other users" : "Permitir que usuários neste servidor compartilhem senhas com outros usuários", + "Check for new versions" : "Verificar novas versões", + "Enable HTTPS check" : "Ativar verificação HTTPS", + "Disable context menu" : "Desativar menu de contexto", "Connection to server lost" : "Perdida a conexão com o servidor", "Problem loading page, reloading in 5 seconds" : "Problema ao carregar a página, recarregando em 5 segundos", "Saving..." : "Pesquisando...", diff --git a/l10n/pt_BR.json b/l10n/pt_BR.json index d9411e0b..420ac9f0 100644 --- a/l10n/pt_BR.json +++ b/l10n/pt_BR.json @@ -8,7 +8,7 @@ "Please fill in a label!" : "Preencha o rótulo!", "Please fill in a value!" : "Preencha um valor!", "Error loading file" : "Erro ao carregar o arquivo", - "An error happend during decryption" : "Ocorreu um erro durante a descriptografia", + "An error happened during decryption" : "Ocorreu um erro durante a descriptografia", "Credential created!" : "Credencial criada!", "Credential deleted" : "Credential excluída", "Credential updated" : "Credencial atualizada", @@ -42,6 +42,10 @@ "Credential unshared" : "Credencial não compartilhada", "Credential shared" : "Credencial compartilhada", "Saved!" : "Salva!", + "Poor" : "Pobre", + "Weak" : "Fraca", + "Good" : "Boa", + "Strong" : "Forte", "Toggle visibility" : "Alternar visibilidade", "Copy to clipboard" : "Copiar para área de transferência", "Copied to clipboard!" : "Copiado para a área de transferência!", @@ -202,6 +206,7 @@ "Last accessed" : "Último acessado", "Never" : "Nunca", "No vaults found, why not create one?" : "Nenhum cofre encontrado, por que não criar um?", + "Password strength must be at least: {{strength}}" : "A força da senha deve ser pelo menos: {{strength}}", "Please give your new vault a name." : "Por favor, dê ao seu novo cofre um nome.", "Vault password" : "Senha do cofre", "Repeat vault password" : "Repita a senha do cofre", @@ -222,6 +227,7 @@ "Click here to request it" : "Clique aqui para solicitá-lo", "Loading..." : "Carregando...", "Awwhh.... credential not found. Maybe it expired" : "Awwhh .... credencial não encontrada. Talvez tenha expirado", + "Error while saving field" : "Erro ao salvar o campo", "A Passman item has been created, modified or deleted" : "Um item Passman foi criado, modificado ou excluído", "A Passman item has expired" : "Um item Passman expirou", "A Passman item has been shared" : "Um item Passman foi compartilhado", @@ -250,6 +256,15 @@ "%s shared \"%s\" with you. Click here to accept" : "%s compartilhou \"%s\" com você. Clique aqui para aceitar", "%s has declined your share request for \"%s\"." : "%s recusou o seu pedido de participação de \"%s\".", "%s has accepted your share request for \"%s\"." : "%s aceitou seu pedido de compartilhamento para \"%s\".", + "Unable to get version info" : "Não é possível obter informações sobre a versão", + "Passman Settings" : "Configurações do Passman", + "Github version:" : "Versão Github:", + "A newer version of passman is available" : "Uma versão mais recente do passman está disponível", + "Allow users on this server to share passwords with a link" : "Permitir que os usuários neste servidor compartilhem senhas com um link", + "Allow users on this server to share passwords with other users" : "Permitir que usuários neste servidor compartilhem senhas com outros usuários", + "Check for new versions" : "Verificar novas versões", + "Enable HTTPS check" : "Ativar verificação HTTPS", + "Disable context menu" : "Desativar menu de contexto", "Connection to server lost" : "Perdida a conexão com o servidor", "Problem loading page, reloading in 5 seconds" : "Problema ao carregar a página, recarregando em 5 segundos", "Saving..." : "Pesquisando...", diff --git a/l10n/ru.js b/l10n/ru.js new file mode 100644 index 00000000..59e20606 --- /dev/null +++ b/l10n/ru.js @@ -0,0 +1,276 @@ +OC.L10N.register( + "passman", + { + "Passwords" : "Пароли", + "Generating sharing keys ( %step / 2)" : "Создаются ключи общего доступа ( %step / 2)", + "Incorrect vault password!" : "Неверный пароль хранилища!", + "Passwords do not match" : "Пароли не совпадают", + "General" : "Основные", + "Custom Fields" : "Свои поля", + "Please fill in a label!" : "Заполните название!", + "Please fill in a value!" : "Заполните значение!", + "Error loading file" : "Ошибка загрузки файла", + "An error happened during decryption" : "Во время расшифровки произошла ошибка", + "Credential created!" : "Реквизит создан!", + "Credential deleted" : "Реквизит удалён", + "Credential updated" : "Реквизит обновлен", + "Credential recovered" : "Реквизит восстановлен", + "Error downloading file, you probably don't have enough permissions" : "Ошибка скачивания файла, возможно у вас не достаточно прав доступа", + "Starting export" : "Начинается экспорт", + "Decrypting credentials" : "Расшифровка реквизитов", + "Done" : "Готово", + "File read successfully!" : "Файл успешно прочитан!", + "Credential has no label, skipping" : "У реквизитов нет названия, пропускается", + "Adding {{credential}}" : "Добавляется {{credential}}", + "Added {{credential}}" : "Добавлено {{credential}}", + "Parsed {{num}} credentials, starting to import" : "Разобрано {{num}} реквизитов, начинается импорт", + "Revision deleted" : "Версия удалена", + "Revision restored" : "Версия восстановлена", + "Save in passman" : "Сохранить в passman", + "Settings saved" : "Настройки сохранены", + "General settings" : "Основные настройки", + "Password Audit" : "Аудит пароля", + "Password settings" : "Настройки пароля", + "Import credentials" : "Импортировать реквизиты", + "Export credentials" : "Экспортировать реквизиты", + "Sharing" : "Общий доступ", + "Are you sure you want to leave? This WILL corrupt all your credentials" : "Уверены, что хотите выйти? Это повредит все ваши реквизиты", + "Your old password is incorrect!" : "Старый пароль неверен!", + "New passwords do not match!" : "Новые пароли не совпадают", + "Please login with your new vault password" : "Войдите в систему со своим новым паролем хранилища", + "Share with users and groups" : "Поделиться с пользователями и группами", + "Share link" : "Поделиться ссылкой", + "Are you sure you want to leave? This will corrupt this credential" : "Уверены, что хотите выйти? Это повредит текущий реквизит", + "Credential unshared" : "Общий доступ к реквизиту прекращен", + "Credential shared" : "Общий доступ к реквизитам предоставлен", + "Saved!" : "Сохранено!", + "Poor" : "Плохой", + "Weak" : "Слабый", + "Good" : "Хороший", + "Strong" : "Надёжный", + "Toggle visibility" : "Переключить видимость", + "Copy to clipboard" : "Копировать в буфер обмена", + "Copied to clipboard!" : "Скопировано в буфер обмена!", + "Generate password" : "Создать пароль", + "Copy password to clipboard" : "Копировать пароль в буфер обмена", + "Password copied to clipboard!" : "Пароль скопирован в буфер обмена!", + "Complete" : "Завершить", + "Username" : "Имя пользователя", + "Repeat password" : "Повторите пароль", + "Add Tag" : "Добавить метку", + "Field label" : "Название поля", + "Field value" : "Значение поля", + "Choose a file" : "Выберите файл", + "Text" : "Текст", + "File" : "Файл", + "Add" : "Добавить", + "Value" : "Значение", + "Type" : "Тип", + "Actions" : "Действие", + "Empty" : "Пусто", + "Filename" : "Имя файла", + "Upload date" : "Дата загрузки", + "Size" : "Размер", + "Upload your OTP qr code" : "Загрузить ваш QR-код OTP", + "Current OTP settings" : "Текущие настройки OPT", + "Issuer" : "Выпустил", + "Secret" : "Секрет", + "Expire date" : "Дата истечения", + "No expire date set" : "Дата истечения не установлена", + "Renew interval" : "Интервал обновления", + "Disabled" : "Отключено", + "Day(s)" : "День(дней)", + "Week(s)" : "Неделя(и)", + "Month(s)" : "Месяц(ев)", + "Year(s)" : "Год(Лет)", + "Password generation settings" : "Настройки создания пароля", + "Password length" : "Длина пароля", + "Minimum amount of digits" : "Минимальное число цифр", + "Use uppercase letters" : "Использовать верхний регистр", + "Use lowercase letters" : "Использовать нижний регистр", + "Use numbers" : "Использовать числа", + "Use special characters" : "Использовать специальные символы", + "Avoid ambiguous characters" : "Избегать неоднозначных символов", + "Require every character type" : "Требовать тип каждого символа", + "Export type" : "Тип экпорта", + "Export" : "Экспорт", + "Rename vault" : "Переименовать хранилище", + "New vault name" : "Новое название хранилища", + "Change" : "Изменить", + "Change vault key" : "Изменить ключ хранилща", + "Old vault password" : "Старый пароль хранилища", + "New vault password" : "Новый пароль хранилища", + "New vault password repeat" : "Повторите новый пароль", + "Please wait your vault is being updated, do not leave this page." : "Подождите пока обновится хранилище. Не уходите с этой страницы.", + "Processing" : "Обрабатывется", + "Total progress" : "Общий ход выполнения", + "About Passman" : "О Passman", + "Version" : "Версия", + "Donate to support development" : "Пожертвовать на поддержку разработки", + "Bookmarklet" : "Приложение для панели закладок", + "Save your passwords with 1 click!" : "Сохраняйте свои пароли за 1 клик!", + "Drag below button to your bookmark toolbar." : "Перетащите кнопку, находящуюся ниже, на вашу панель закладок.", + "Import type" : "Тип импорта", + "Import" : "Импорт", + "Read progress" : "Ход чтения", + "Upload progress" : "Ход загрузки", + "Private Key" : "Частный ключ", + "Public key" : "Открытый ключ", + "Key size" : "Размер ключа", + "Save keys" : "Сохранить ключи", + "Generate sharing keys" : "Создать ключи общего доступа", + "Generating sharing keys" : "Ключи общего доступа создаются", + "The password tool will scan your password, calculate the avarage crack time and, if below the threshold, show them" : "Инструмент паролей просканирует ваши пароли, вычислит среднее время для из взлома, и, если оно окажется ниже порогового значения, покажет их", + "Minimum password stength" : "Минимальная устойчивость пароля", + "Passman scanned your passwords, and here is the result." : "Passman просканировал ваши пароли и вот результат.", + "A total of {{scan_result}} weak credentials." : "Слабые реквизиты из {{scan_result}}.", + "Score" : "Баллов", + "Action" : "Действие", + "Search users or groups..." : "Поиск пользователя или групп...", + "Cyphering" : "Вычисление", + "Uploading" : "Загрузка", + "User" : "Пользователь", + "Crypto time" : "Время шифрования", + "Total time spent cyphering" : "Всего использовано времени на вычисление", + "Read" : "Прочитано", + "Write" : "Записано", + "Files" : "Файлов", + "Revisions" : "Версий", + "Pending" : "Ожидается", + "Enable link sharing" : "Разрешить обмен ссылками", + "Share until date" : "Поделиться до даты", + "Expire after views" : "Истекает после просмотров", + "Click share first" : "Сначала щелкните по \"поделиться\"", + "Show files" : "Показать файлы", + "Details" : "Подробно", + "Hide details" : "Скрыть подробности", + "Password score" : "Баллы пароля", + "Cracking times" : "Время взлома", + "100 / hour" : "100 / час", + "Throttled online attack" : "Ограниченная по частоте атака онлайн", + "10 / second" : "10 / секунду", + "Unthrottled online attack" : "Неограниченная по частоте атака онлайн", + "10k / second" : "10 тыс. / секунду", + "Offline attack, slow hash, many cores" : "Офлайн атака, медленное хэширование, много ядер", + "10B / second" : "10 байт / секунду", + "Offline attack, fast hash, many cores" : "Офлайн атака, быстрое хеширование, много ядер", + "Match sequence" : "Соответствующая последовательность", + "See match sequence" : "Просмотреть соотвествующую последовательность", + "Pattern" : "Шаблон", + "Matched word" : "Совпавшее слово", + "Dictionary name" : "Название словаря", + "Rank" : "Ранг", + "Reversed" : "Реверсированные", + "Guesses" : "Угаданные", + "Base guesses" : "В основном угаданные", + "Uppercase variations" : "Изменения заглавных букв", + "l33t-variations" : "l33t-изменения", + "Showing revisions of" : "Показываются версии", + "Revision of" : "Версия", + "by" : "автора", + "No revisions found." : "Версий не найдено.", + "Label" : "Метка", + "Restore revision" : "Востановить версию", + "Delete revision" : "Удалить версию", + "Edit credential" : "Редактировать реквизиты", + "Create new credential" : "Создать новые реквизиты", + "Save" : "Сохранить", + "Cancel" : "Отмена", + "Settings" : "Настройки", + "Share credential {{credential}}" : "Поделиться реквизитами {{credential}}", + "Unshare" : "Закрыть доступ", + "Showing deleted since" : "Показываются удалённые после", + "All time" : "За всё время", + "Showing {{number_filtered}} of {{credential_number}} credentials" : "Показывается {{number_filtered}} из {{credential_number}} реквизитов", + "Search credential..." : "Поиск реквизитов...", + "Account" : "Аккаунт", + "Password" : "Пароль", + "OTP" : "OTP (одноразовый пароль)", + "E-mail" : "Эл. почта", + "URL" : "URL", + "Notes" : "Заметки", + "Expire time" : "Срок действия", + "Changed" : "Изменено", + "Created" : "Создано", + "Edit" : "Редактировать", + "Delete" : "Удалить", + "Share" : "Поделиться", + "Recover" : "Восстановить", + "Destroy" : "Уничтожить", + "You have incoming share requests." : "У вас входящий запрос на общий доступ.", + "If you want to the credential in a other vault," : "Если вы хотите перейти к реквизитам их другого хранилища,", + "logout of this vault and login to the vault you want the shared credential in." : "выйдите из этого хранилища и войдите в хранилище, которое содержит общие реквизиты.", + "Permissions" : "Права доступа", + "Received from" : "Получено от", + "Date" : "Дата", + "Accept" : "Принять", + "Decline" : "Отклонить", + "Last accessed" : "Посл. доступ", + "Never" : "Никогда", + "No vaults found, why not create one?" : "Хранилищ не найдено, почему бы не создать?", + "Password strength must be at least: {{strength}}" : "Устойчивать пароля должна быть не ниже: {{strength}}", + "Please give your new vault a name." : "Укажите имя нового хранилища.", + "Vault password" : "Пароль хранилища", + "Repeat vault password" : "Повторите пароль хранилища", + "Your sharing key's will have a strength of 1024 bit, which you can change later in settings." : "Ключ доступа будет иметь устойчивость 1024 бита, позже вы можете изменить ее в настройках.", + "Create vault" : "Создать хранилище", + "Go back to vaults" : "Вернуться в хранилище", + "Please input the password for" : "Введите пароль для", + "Set this vault as default." : "Установить текущее хранилище хранилищем по-умолчанию.", + "Login automatically to this vault." : "Автоматически входить в это хранилище.", + "Decrypt vault" : "Расшифровать хранилище", + "Warning! Adding credentials over http can be insecure!" : "Предупреждение! Добавление реквизитов с использованием протокола http может быть небезопасно!", + "Logged in to {{vault_name}}" : "Вошли в {{vault_name}}", + "Change vault" : "Изменить хранилище", + "Deleted credentials" : "Удалённые реквизиты", + "Logout" : "Выйти", + "Donate" : "Пожертвовать", + "Someone has shared a credential with you." : "Кто-то поделился с вами реквизитами.", + "Click here to request it" : "Щелкните здесь для их получения.", + "Loading..." : "Загрузка...", + "Awwhh.... credential not found. Maybe it expired" : "Реквизиты не найдены. Возможно, закончился срок их действия.", + "Error while saving field" : "Ошибка при сохранении поля", + "A Passman item has been created, modified or deleted" : "Элемент Passman был создан, изменён или удалён", + "A Passman item has expired" : "У элемента Passman закончился срок действия", + "A Passman item has been shared" : "Поделились элементом Passman", + "A Passman item has been renamed" : "Элемент Passman был переименован", + "%1$s has been created by %2$s" : "%1$s создано %2$s", + "You created %1$s" : "Вы создали %1$s", + "%1$s has been updated by %2$s" : "%2$s обновил %1$s", + "You updated %1$s" : "Вы обновили %1$s", + "%2$s has revised %1$s to the revision of %3$s" : "%2$s сменил версию %1$s до версии %3$s", + "You reverted %1$s back to the revision of %3$s" : "Вы откатили %1$s до версии %3$s", + "%3$s has renamed %1$s to %2$s" : "%3$s переименовал %1$s в %2$s", + "You renamed %1$s to %2$s" : "Вы переименовали %1$s в %2$s", + "%1$s has been deleted by %2$s" : "%1$s удалено %2$s", + "You deleted %1$s" : "Вы удалили %1$s", + "%1$s has been recovered by %2$s" : " %2$s восстановил %1$s", + "You recovered %1$s" : "Вы восстановили %1$s", + "%1$s has been permanently deleted by %2$s" : "%2$s окончательно удалил %1$s", + "You permanently deleted %1$s" : "Вы окончательно удалили %1$s", + "The password of %1$s has expired, renew it now." : "Срок действия пароль %1$s истек, обновите его сейчас.", + "%1$s has been shared with %2$s" : "%1$s поделились с %2$s", + "You received a share request for %1$s from %2$s" : "Вы получили запрос на предоставление общего доступа к %1$s от %2$s", + "%s has been shared with a link" : "к %s был предоставлен общий доступ ссылкой", + "Your credential \"%s\" expired, click here to update the credential." : "Истёк срок действия реквизитов \"%s\", щелкните здесь для обновления реквизитов.", + "Remind me later" : "Напомнить позже", + "Ignore" : "Пропустить", + "%s shared \"%s\" with you. Click here to accept" : "%s предоставил вам доступ к \"%s\". Щёлкните здесь что бы принять.", + "%s has declined your share request for \"%s\"." : "%s отклонил ваш запрос на предоставление общего доступа к \"%s\".", + "%s has accepted your share request for \"%s\"." : "%s принял ваш запрос на предоставление общего доступа к \"%s\".", + "Unable to get version info" : "Невозможно получить информацию о версии", + "Passman Settings" : "Настройки Passman", + "Github version:" : "Версия github:", + "A newer version of passman is available" : "Доступна новая версия passman", + "Allow users on this server to share passwords with a link" : "Разрешить пользователям этого сервера делиться паролями посредством ссылки", + "Allow users on this server to share passwords with other users" : "Разрешить пользователям этого сервера делиться паролями с другими пользователями", + "Check for new versions" : "Проверить наличие новых версий", + "Enable HTTPS check" : "Включить проверку HTTPS", + "Disable context menu" : "Отключить контекстное меню", + "Connection to server lost" : "Подключение к серверу потеряно", + "Problem loading page, reloading in 5 seconds" : "Проблема при загрузке страницы, перезагрузка через 5 сек.", + "Saving..." : "Сохранение...", + "Dismiss" : "Закрыть", + "seconds ago" : "несколько секунд назад" +}, +"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);"); diff --git a/l10n/ru.json b/l10n/ru.json new file mode 100644 index 00000000..b0b79c9c --- /dev/null +++ b/l10n/ru.json @@ -0,0 +1,274 @@ +{ "translations": { + "Passwords" : "Пароли", + "Generating sharing keys ( %step / 2)" : "Создаются ключи общего доступа ( %step / 2)", + "Incorrect vault password!" : "Неверный пароль хранилища!", + "Passwords do not match" : "Пароли не совпадают", + "General" : "Основные", + "Custom Fields" : "Свои поля", + "Please fill in a label!" : "Заполните название!", + "Please fill in a value!" : "Заполните значение!", + "Error loading file" : "Ошибка загрузки файла", + "An error happened during decryption" : "Во время расшифровки произошла ошибка", + "Credential created!" : "Реквизит создан!", + "Credential deleted" : "Реквизит удалён", + "Credential updated" : "Реквизит обновлен", + "Credential recovered" : "Реквизит восстановлен", + "Error downloading file, you probably don't have enough permissions" : "Ошибка скачивания файла, возможно у вас не достаточно прав доступа", + "Starting export" : "Начинается экспорт", + "Decrypting credentials" : "Расшифровка реквизитов", + "Done" : "Готово", + "File read successfully!" : "Файл успешно прочитан!", + "Credential has no label, skipping" : "У реквизитов нет названия, пропускается", + "Adding {{credential}}" : "Добавляется {{credential}}", + "Added {{credential}}" : "Добавлено {{credential}}", + "Parsed {{num}} credentials, starting to import" : "Разобрано {{num}} реквизитов, начинается импорт", + "Revision deleted" : "Версия удалена", + "Revision restored" : "Версия восстановлена", + "Save in passman" : "Сохранить в passman", + "Settings saved" : "Настройки сохранены", + "General settings" : "Основные настройки", + "Password Audit" : "Аудит пароля", + "Password settings" : "Настройки пароля", + "Import credentials" : "Импортировать реквизиты", + "Export credentials" : "Экспортировать реквизиты", + "Sharing" : "Общий доступ", + "Are you sure you want to leave? This WILL corrupt all your credentials" : "Уверены, что хотите выйти? Это повредит все ваши реквизиты", + "Your old password is incorrect!" : "Старый пароль неверен!", + "New passwords do not match!" : "Новые пароли не совпадают", + "Please login with your new vault password" : "Войдите в систему со своим новым паролем хранилища", + "Share with users and groups" : "Поделиться с пользователями и группами", + "Share link" : "Поделиться ссылкой", + "Are you sure you want to leave? This will corrupt this credential" : "Уверены, что хотите выйти? Это повредит текущий реквизит", + "Credential unshared" : "Общий доступ к реквизиту прекращен", + "Credential shared" : "Общий доступ к реквизитам предоставлен", + "Saved!" : "Сохранено!", + "Poor" : "Плохой", + "Weak" : "Слабый", + "Good" : "Хороший", + "Strong" : "Надёжный", + "Toggle visibility" : "Переключить видимость", + "Copy to clipboard" : "Копировать в буфер обмена", + "Copied to clipboard!" : "Скопировано в буфер обмена!", + "Generate password" : "Создать пароль", + "Copy password to clipboard" : "Копировать пароль в буфер обмена", + "Password copied to clipboard!" : "Пароль скопирован в буфер обмена!", + "Complete" : "Завершить", + "Username" : "Имя пользователя", + "Repeat password" : "Повторите пароль", + "Add Tag" : "Добавить метку", + "Field label" : "Название поля", + "Field value" : "Значение поля", + "Choose a file" : "Выберите файл", + "Text" : "Текст", + "File" : "Файл", + "Add" : "Добавить", + "Value" : "Значение", + "Type" : "Тип", + "Actions" : "Действие", + "Empty" : "Пусто", + "Filename" : "Имя файла", + "Upload date" : "Дата загрузки", + "Size" : "Размер", + "Upload your OTP qr code" : "Загрузить ваш QR-код OTP", + "Current OTP settings" : "Текущие настройки OPT", + "Issuer" : "Выпустил", + "Secret" : "Секрет", + "Expire date" : "Дата истечения", + "No expire date set" : "Дата истечения не установлена", + "Renew interval" : "Интервал обновления", + "Disabled" : "Отключено", + "Day(s)" : "День(дней)", + "Week(s)" : "Неделя(и)", + "Month(s)" : "Месяц(ев)", + "Year(s)" : "Год(Лет)", + "Password generation settings" : "Настройки создания пароля", + "Password length" : "Длина пароля", + "Minimum amount of digits" : "Минимальное число цифр", + "Use uppercase letters" : "Использовать верхний регистр", + "Use lowercase letters" : "Использовать нижний регистр", + "Use numbers" : "Использовать числа", + "Use special characters" : "Использовать специальные символы", + "Avoid ambiguous characters" : "Избегать неоднозначных символов", + "Require every character type" : "Требовать тип каждого символа", + "Export type" : "Тип экпорта", + "Export" : "Экспорт", + "Rename vault" : "Переименовать хранилище", + "New vault name" : "Новое название хранилища", + "Change" : "Изменить", + "Change vault key" : "Изменить ключ хранилща", + "Old vault password" : "Старый пароль хранилища", + "New vault password" : "Новый пароль хранилища", + "New vault password repeat" : "Повторите новый пароль", + "Please wait your vault is being updated, do not leave this page." : "Подождите пока обновится хранилище. Не уходите с этой страницы.", + "Processing" : "Обрабатывется", + "Total progress" : "Общий ход выполнения", + "About Passman" : "О Passman", + "Version" : "Версия", + "Donate to support development" : "Пожертвовать на поддержку разработки", + "Bookmarklet" : "Приложение для панели закладок", + "Save your passwords with 1 click!" : "Сохраняйте свои пароли за 1 клик!", + "Drag below button to your bookmark toolbar." : "Перетащите кнопку, находящуюся ниже, на вашу панель закладок.", + "Import type" : "Тип импорта", + "Import" : "Импорт", + "Read progress" : "Ход чтения", + "Upload progress" : "Ход загрузки", + "Private Key" : "Частный ключ", + "Public key" : "Открытый ключ", + "Key size" : "Размер ключа", + "Save keys" : "Сохранить ключи", + "Generate sharing keys" : "Создать ключи общего доступа", + "Generating sharing keys" : "Ключи общего доступа создаются", + "The password tool will scan your password, calculate the avarage crack time and, if below the threshold, show them" : "Инструмент паролей просканирует ваши пароли, вычислит среднее время для из взлома, и, если оно окажется ниже порогового значения, покажет их", + "Minimum password stength" : "Минимальная устойчивость пароля", + "Passman scanned your passwords, and here is the result." : "Passman просканировал ваши пароли и вот результат.", + "A total of {{scan_result}} weak credentials." : "Слабые реквизиты из {{scan_result}}.", + "Score" : "Баллов", + "Action" : "Действие", + "Search users or groups..." : "Поиск пользователя или групп...", + "Cyphering" : "Вычисление", + "Uploading" : "Загрузка", + "User" : "Пользователь", + "Crypto time" : "Время шифрования", + "Total time spent cyphering" : "Всего использовано времени на вычисление", + "Read" : "Прочитано", + "Write" : "Записано", + "Files" : "Файлов", + "Revisions" : "Версий", + "Pending" : "Ожидается", + "Enable link sharing" : "Разрешить обмен ссылками", + "Share until date" : "Поделиться до даты", + "Expire after views" : "Истекает после просмотров", + "Click share first" : "Сначала щелкните по \"поделиться\"", + "Show files" : "Показать файлы", + "Details" : "Подробно", + "Hide details" : "Скрыть подробности", + "Password score" : "Баллы пароля", + "Cracking times" : "Время взлома", + "100 / hour" : "100 / час", + "Throttled online attack" : "Ограниченная по частоте атака онлайн", + "10 / second" : "10 / секунду", + "Unthrottled online attack" : "Неограниченная по частоте атака онлайн", + "10k / second" : "10 тыс. / секунду", + "Offline attack, slow hash, many cores" : "Офлайн атака, медленное хэширование, много ядер", + "10B / second" : "10 байт / секунду", + "Offline attack, fast hash, many cores" : "Офлайн атака, быстрое хеширование, много ядер", + "Match sequence" : "Соответствующая последовательность", + "See match sequence" : "Просмотреть соотвествующую последовательность", + "Pattern" : "Шаблон", + "Matched word" : "Совпавшее слово", + "Dictionary name" : "Название словаря", + "Rank" : "Ранг", + "Reversed" : "Реверсированные", + "Guesses" : "Угаданные", + "Base guesses" : "В основном угаданные", + "Uppercase variations" : "Изменения заглавных букв", + "l33t-variations" : "l33t-изменения", + "Showing revisions of" : "Показываются версии", + "Revision of" : "Версия", + "by" : "автора", + "No revisions found." : "Версий не найдено.", + "Label" : "Метка", + "Restore revision" : "Востановить версию", + "Delete revision" : "Удалить версию", + "Edit credential" : "Редактировать реквизиты", + "Create new credential" : "Создать новые реквизиты", + "Save" : "Сохранить", + "Cancel" : "Отмена", + "Settings" : "Настройки", + "Share credential {{credential}}" : "Поделиться реквизитами {{credential}}", + "Unshare" : "Закрыть доступ", + "Showing deleted since" : "Показываются удалённые после", + "All time" : "За всё время", + "Showing {{number_filtered}} of {{credential_number}} credentials" : "Показывается {{number_filtered}} из {{credential_number}} реквизитов", + "Search credential..." : "Поиск реквизитов...", + "Account" : "Аккаунт", + "Password" : "Пароль", + "OTP" : "OTP (одноразовый пароль)", + "E-mail" : "Эл. почта", + "URL" : "URL", + "Notes" : "Заметки", + "Expire time" : "Срок действия", + "Changed" : "Изменено", + "Created" : "Создано", + "Edit" : "Редактировать", + "Delete" : "Удалить", + "Share" : "Поделиться", + "Recover" : "Восстановить", + "Destroy" : "Уничтожить", + "You have incoming share requests." : "У вас входящий запрос на общий доступ.", + "If you want to the credential in a other vault," : "Если вы хотите перейти к реквизитам их другого хранилища,", + "logout of this vault and login to the vault you want the shared credential in." : "выйдите из этого хранилища и войдите в хранилище, которое содержит общие реквизиты.", + "Permissions" : "Права доступа", + "Received from" : "Получено от", + "Date" : "Дата", + "Accept" : "Принять", + "Decline" : "Отклонить", + "Last accessed" : "Посл. доступ", + "Never" : "Никогда", + "No vaults found, why not create one?" : "Хранилищ не найдено, почему бы не создать?", + "Password strength must be at least: {{strength}}" : "Устойчивать пароля должна быть не ниже: {{strength}}", + "Please give your new vault a name." : "Укажите имя нового хранилища.", + "Vault password" : "Пароль хранилища", + "Repeat vault password" : "Повторите пароль хранилища", + "Your sharing key's will have a strength of 1024 bit, which you can change later in settings." : "Ключ доступа будет иметь устойчивость 1024 бита, позже вы можете изменить ее в настройках.", + "Create vault" : "Создать хранилище", + "Go back to vaults" : "Вернуться в хранилище", + "Please input the password for" : "Введите пароль для", + "Set this vault as default." : "Установить текущее хранилище хранилищем по-умолчанию.", + "Login automatically to this vault." : "Автоматически входить в это хранилище.", + "Decrypt vault" : "Расшифровать хранилище", + "Warning! Adding credentials over http can be insecure!" : "Предупреждение! Добавление реквизитов с использованием протокола http может быть небезопасно!", + "Logged in to {{vault_name}}" : "Вошли в {{vault_name}}", + "Change vault" : "Изменить хранилище", + "Deleted credentials" : "Удалённые реквизиты", + "Logout" : "Выйти", + "Donate" : "Пожертвовать", + "Someone has shared a credential with you." : "Кто-то поделился с вами реквизитами.", + "Click here to request it" : "Щелкните здесь для их получения.", + "Loading..." : "Загрузка...", + "Awwhh.... credential not found. Maybe it expired" : "Реквизиты не найдены. Возможно, закончился срок их действия.", + "Error while saving field" : "Ошибка при сохранении поля", + "A Passman item has been created, modified or deleted" : "Элемент Passman был создан, изменён или удалён", + "A Passman item has expired" : "У элемента Passman закончился срок действия", + "A Passman item has been shared" : "Поделились элементом Passman", + "A Passman item has been renamed" : "Элемент Passman был переименован", + "%1$s has been created by %2$s" : "%1$s создано %2$s", + "You created %1$s" : "Вы создали %1$s", + "%1$s has been updated by %2$s" : "%2$s обновил %1$s", + "You updated %1$s" : "Вы обновили %1$s", + "%2$s has revised %1$s to the revision of %3$s" : "%2$s сменил версию %1$s до версии %3$s", + "You reverted %1$s back to the revision of %3$s" : "Вы откатили %1$s до версии %3$s", + "%3$s has renamed %1$s to %2$s" : "%3$s переименовал %1$s в %2$s", + "You renamed %1$s to %2$s" : "Вы переименовали %1$s в %2$s", + "%1$s has been deleted by %2$s" : "%1$s удалено %2$s", + "You deleted %1$s" : "Вы удалили %1$s", + "%1$s has been recovered by %2$s" : " %2$s восстановил %1$s", + "You recovered %1$s" : "Вы восстановили %1$s", + "%1$s has been permanently deleted by %2$s" : "%2$s окончательно удалил %1$s", + "You permanently deleted %1$s" : "Вы окончательно удалили %1$s", + "The password of %1$s has expired, renew it now." : "Срок действия пароль %1$s истек, обновите его сейчас.", + "%1$s has been shared with %2$s" : "%1$s поделились с %2$s", + "You received a share request for %1$s from %2$s" : "Вы получили запрос на предоставление общего доступа к %1$s от %2$s", + "%s has been shared with a link" : "к %s был предоставлен общий доступ ссылкой", + "Your credential \"%s\" expired, click here to update the credential." : "Истёк срок действия реквизитов \"%s\", щелкните здесь для обновления реквизитов.", + "Remind me later" : "Напомнить позже", + "Ignore" : "Пропустить", + "%s shared \"%s\" with you. Click here to accept" : "%s предоставил вам доступ к \"%s\". Щёлкните здесь что бы принять.", + "%s has declined your share request for \"%s\"." : "%s отклонил ваш запрос на предоставление общего доступа к \"%s\".", + "%s has accepted your share request for \"%s\"." : "%s принял ваш запрос на предоставление общего доступа к \"%s\".", + "Unable to get version info" : "Невозможно получить информацию о версии", + "Passman Settings" : "Настройки Passman", + "Github version:" : "Версия github:", + "A newer version of passman is available" : "Доступна новая версия passman", + "Allow users on this server to share passwords with a link" : "Разрешить пользователям этого сервера делиться паролями посредством ссылки", + "Allow users on this server to share passwords with other users" : "Разрешить пользователям этого сервера делиться паролями с другими пользователями", + "Check for new versions" : "Проверить наличие новых версий", + "Enable HTTPS check" : "Включить проверку HTTPS", + "Disable context menu" : "Отключить контекстное меню", + "Connection to server lost" : "Подключение к серверу потеряно", + "Problem loading page, reloading in 5 seconds" : "Проблема при загрузке страницы, перезагрузка через 5 сек.", + "Saving..." : "Сохранение...", + "Dismiss" : "Закрыть", + "seconds ago" : "несколько секунд назад" +},"pluralForm" :"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);" +} \ No newline at end of file diff --git a/lib/AppInfo/Application.php b/lib/AppInfo/Application.php index c2840294..01456292 100644 --- a/lib/AppInfo/Application.php +++ b/lib/AppInfo/Application.php @@ -22,12 +22,14 @@ */ namespace OCA\Passman\AppInfo; + use OC\Files\View; use OCA\Passman\Controller\CredentialController; use OCA\Passman\Controller\PageController; use OCA\Passman\Controller\ShareController; use OCA\Passman\Controller\VaultController; +use OCA\Passman\Middleware\ShareMiddleware; use OCA\Passman\Service\ActivityService; use OCA\Passman\Service\CronService; use OCA\Passman\Service\CredentialService; @@ -36,27 +38,38 @@ use OCA\Passman\Service\FileService; use OCA\Passman\Service\VaultService; use OCA\Passman\Utility\Utils; use OCA\Passman\Service\NotificationService; +Use OCA\Passman\Service\SettingsService; +use OCP\IConfig; use OCP\IDBConnection; use OCP\AppFramework\App; use OCP\IL10N; use OCP\Util; + class Application extends App { - public function __construct () { + public function __construct() { parent::__construct('passman'); $container = $this->getContainer(); // Allow automatic DI for the View, until we migrated to Nodes API - $container->registerService(View::class, function() { + $container->registerService(View::class, function () { return new View(''); }, false); - $container->registerService('isCLI', function() { + $container->registerService('isCLI', function () { return \OC::$CLI; }); + /** + * Middleware + */ + $container->registerService('ShareMiddleware', function ($c) { + return new ShareMiddleware($c->query('SettingsService')); + }); + $container->registerMiddleware('ShareMiddleware'); + /** * Controllers */ - $container->registerService('ShareController', function($c) { + $container->registerService('ShareController', function ($c) { $container = $this->getContainer(); $server = $container->getServer(); return new ShareController( @@ -65,17 +78,17 @@ class Application extends App { $server->getUserSession()->getUser(), $server->getGroupManager(), $server->getUserManager(), - $c->query('ActivityService'), - $c->query('VaultService'), - $c->query('ShareService'), - $c->query('CredentialService'), - $c->query('NotificationService'), - $c->query('FileService') + $c->query('ActivityService'), + $c->query('VaultService'), + $c->query('ShareService'), + $c->query('CredentialService'), + $c->query('NotificationService'), + $c->query('FileService'), + $c->query('SettingsService') ); }); - /** Cron **/ $container->registerService('CronService', function ($c) { return new CronService( @@ -92,7 +105,7 @@ class Application extends App { return new Db(); }); - $container->registerService('Logger', function($c) { + $container->registerService('Logger', function ($c) { return $c->query('ServerContainer')->getLogger(); }); @@ -106,9 +119,11 @@ class Application extends App { $container->registerAlias('ActivityService', ActivityService::class); $container->registerAlias('VaultService', VaultService::class); $container->registerAlias('FileService', FileService::class); - $container->registerAlias('ShareService', ShareService::class); + $container->registerAlias('ShareService', ShareService::class); $container->registerAlias('Utils', Utils::class); $container->registerAlias('IDBConnection', IDBConnection::class); + $container->registerAlias('IConfig', IConfig::class); + $container->registerAlias('SettingsService', SettingsService::class); } /** diff --git a/lib/Db/CredentialMapper.php b/lib/Db/CredentialMapper.php index 32303ca8..5d3443f6 100644 --- a/lib/Db/CredentialMapper.php +++ b/lib/Db/CredentialMapper.php @@ -131,7 +131,9 @@ class CredentialMapper extends Mapper { $credential->setCustomFields($raw_credential['custom_fields']); $credential->setOtp($raw_credential['otp']); $credential->setHidden($raw_credential['hidden']); - $credential->setSharedKey($raw_credential['shared_key']); + if(isset($raw_credential['shared_key'])) { + $credential->setSharedKey($raw_credential['shared_key']); + } return parent::insert($credential); } diff --git a/lib/Db/SharingACLMapper.php b/lib/Db/SharingACLMapper.php index 66246426..e251a0c4 100644 --- a/lib/Db/SharingACLMapper.php +++ b/lib/Db/SharingACLMapper.php @@ -60,13 +60,11 @@ class SharingACLMapper extends Mapper { public function getItemACL($user_id, $item_guid) { $q = "SELECT * FROM " . self::TABLE_NAME . " WHERE item_guid = ? AND "; $filter = [$item_guid]; - if ($user_id === null){ - $q .= 'user_id is null'; - } - else { - $q .= 'user_id = ? '; - $filter[] = $user_id; + $q .= ($user_id === null) ? 'user_id is null' : 'user_id = ? '; + if ($user_id !== null){ + $filter[] = $user_id; } + return $this->findEntity($q, $filter); } diff --git a/lib/Service/CredentialService.php b/lib/Service/CredentialService.php index 3fb61113..9590bb0e 100644 --- a/lib/Service/CredentialService.php +++ b/lib/Service/CredentialService.php @@ -125,9 +125,8 @@ class CredentialService { $acl = $this->sharingACL->getItemACL($user_id, $credential->getGuid()); if ($acl->hasPermission(SharingACL::READ)) { return $credential; - } else { - throw new DoesNotExistException("Did expect one result but found none when executing"); } + throw new DoesNotExistException("Did expect one result but found none when executing"); } } diff --git a/lib/Service/CronService.php b/lib/Service/CronService.php index 3ee3660e..ca114166 100644 --- a/lib/Service/CronService.php +++ b/lib/Service/CronService.php @@ -65,10 +65,7 @@ class CronService { '', array(), $link, $credential->getUserId(), Activity::TYPE_ITEM_EXPIRED); $this->notificationService->credentialExpiredNotification($credential); - } else { - $this->logger->debug($credential->getLabel() .' is expired, already notified!', array('app' => 'passman')); } - } } } \ No newline at end of file diff --git a/lib/Service/SettingsService.php b/lib/Service/SettingsService.php new file mode 100644 index 00000000..813a994e --- /dev/null +++ b/lib/Service/SettingsService.php @@ -0,0 +1,118 @@ +. + * + */ + +namespace OCA\Passman\Service; + +use OCP\IConfig; + + +class SettingsService { + + private $userId; + private $config; + private $appName; + public $settings; + + private $numeric_settings = array( + 'link_sharing_enabled', + 'user_sharing_enabled', + 'vault_key_strength', + 'check_version', + 'https_check', + 'disable_contextmenu', + 'settings_loaded' + ); + + public function __construct($UserId, IConfig $config, $AppName) { + $this->userId = $UserId; + $this->config = $config; + $this->appName = $AppName; + $this->settings = array( + 'link_sharing_enabled' => intval($this->config->getAppValue('passman', 'link_sharing_enabled', 1)), + 'user_sharing_enabled' => intval($this->config->getAppValue('passman', 'user_sharing_enabled', 1)), + 'vault_key_strength' => intval($this->config->getAppValue('passman', 'vault_key_strength', 3)), + 'check_version' => intval($this->config->getAppValue('passman', 'check_version', 1)), + 'https_check' => intval($this->config->getAppValue('passman', 'https_check', 1)), + 'disable_contextmenu' => intval($this->config->getAppValue('passman', 'disable_contextmenu', 1)), + 'settings_loaded' => 1 + ); + } + + /** + * Get all app settings + * + * @return array + */ + public function getAppSettings() { + return $this->settings; + } + + /** + * Get a app setting + * + * @param $key string + * @param null $default_value The default value if key does not exist + * @return mixed + */ + public function getAppSetting($key, $default_value = null) { + $value = ($this->settings[$key]) ? $this->settings[$key] : $this->config->getAppValue('passman', $key, $default_value); + if (in_array($key, $this->numeric_settings)) { + $value = intval($value); + } + + return $value; + } + + /** + * Set a app setting + * + * @param $key string Setting name + * @param $value mixed Value of the setting + */ + public function setAppSetting($key, $value) { + $this->settings[$key] = $value; + $this->config->setAppValue('passman', $key, $value); + } + + /** + * Set a user setting + * + * @param $key string Setting name + * @param $value mixed Value of the setting + */ + + public function setUserSetting($key, $value) { + return $this->config->setUserValue($this->userId, $this->appName, $key, $value); + } + + /** + * Check if an setting is enabled (value of 1) + * + * @param $setting + * @return bool + */ + public function isEnabled($setting) { + $value = intval($this->getAppSetting($setting, false)); + return ($value === 1); + } +} \ No newline at end of file diff --git a/middleware/sharemiddleware.php b/middleware/sharemiddleware.php new file mode 100644 index 00000000..35553316 --- /dev/null +++ b/middleware/sharemiddleware.php @@ -0,0 +1,45 @@ +settings = $config; + } + + + public function beforeController($controller, $methodName) { + if ($controller instanceof ShareController) { + $http_response_code = Http::STATUS_OK; + $result = array(); + $publicMethods = array('createPublicShare', 'getPublicCredentialData'); + $user_pub_methods = array('updateSharedCredentialACL', 'getFile', 'getItemAcl'); + $setting = (in_array($methodName, $publicMethods)) ? 'link_sharing_enabled' : 'user_sharing_enabled'; + $sharing_enabled = ($this->settings->isEnabled($setting)); + + if(in_array($methodName, $user_pub_methods)){ + $sharing_enabled = ($this->settings->isEnabled('link_sharing_enabled') || $this->settings->isEnabled('user_sharing_enabled')); + } + + + if (!$sharing_enabled) { + $response = new JSONResponse($result); + http_response_code($http_response_code); + header('Passman-sharing: disabled'); + header('Passman-method: ShareController.' . $methodName); + die($response->render()); + } + } + } +} + + diff --git a/templates/admin.settings.php b/templates/admin.settings.php new file mode 100644 index 00000000..b5280153 --- /dev/null +++ b/templates/admin.settings.php @@ -0,0 +1,4 @@ +fetchPage(); \ No newline at end of file diff --git a/templates/part.admin.php b/templates/part.admin.php new file mode 100644 index 00000000..ac5f4d2e --- /dev/null +++ b/templates/part.admin.php @@ -0,0 +1,103 @@ +getConfig()->getAppValue('passman', 'check_version', '1') === '1'; +$AppInstance = new App(); +$localVersion = $AppInstance->getAppInfo("passman")["version"]; +if ($checkVersion) { +// get latest master version + $doc = new DOMDocument(); + $doc->load('https://raw.githubusercontent.com/nextcloud/passman/master/appinfo/info.xml'); + $root = $doc->getElementsByTagName("info"); + $version = false; + $githubVersion = $l->t('Unable to get version info'); + foreach ($root as $element) { + $versions = $element->getElementsByTagName("version"); + $version = $versions->item(0)->nodeValue; + } + if ($version) { + $githubVersion = $version; + } +} +?> + +
+
+

t('Passman Settings')); ?>

+ t('Github version:'). ' '. $githubVersion); + print '
'; + } ?> + Local version:
+ t('A newer version of passman is available')); + } + ?> +

t('Sharing')); ?>

+

+ + +

+ +

+ + +

+

t('General')); ?>

+

+ + +

+

+ + +

+

+ + +

+

+ + +

+
+