diff --git a/dev/App/User.js b/dev/App/User.js index 01a2881a7..34ab67f24 100644 --- a/dev/App/User.js +++ b/dev/App/User.js @@ -1378,7 +1378,16 @@ if ($LAB && window.crypto && window.crypto.getRandomValues && Settings.capa(Enums.Capa.OpenPGP)) { var fOpenpgpCallback = function (openpgp) { + PgpStore.openpgp = openpgp; + + if (window.Worker) + { + PgpStore.openpgp.initWorker(Links.openPgpWorkerJs()); + } + +// PgpStore.openpgp.config.useWebCrypto = false; + PgpStore.openpgpKeyring = new openpgp.Keyring(); PgpStore.capaOpenPGP(true); diff --git a/dev/Common/Links.js b/dev/Common/Links.js index 7b569bddc..62acbac17 100644 --- a/dev/Common/Links.js +++ b/dev/Common/Links.js @@ -390,7 +390,23 @@ */ Links.prototype.openPgpJs = function () { - return this.sStaticPrefix + 'js/min/openpgp.js'; + return this.sStaticPrefix + 'js/min/openpgp.min.js'; + }; + + /** + * @return {string} + */ + Links.prototype.openPgpWorkerJs = function () + { + return this.sStaticPrefix + 'js/min/openpgp.worker.min.js'; + }; + + /** + * @return {string} + */ + Links.prototype.openPgpWorkerPath = function () + { + return this.sStaticPrefix + 'js/min/'; }; /** diff --git a/dev/External/ko.js b/dev/External/ko.js index 187d0bfae..dc8161007 100644 --- a/dev/External/ko.js +++ b/dev/External/ko.js @@ -821,7 +821,7 @@ 'parseOnBlur': true, 'allowDragAndDrop': true, 'focusCallback': fFocusCallback, - 'inputDelimiters': [',', ';', '\n'], + 'inputDelimiters': [',', ';', "\n"], 'autoCompleteSource': fAutoCompleteSource, // 'elementHook': function (oEl, oItem) { // if (oEl && oItem) @@ -832,52 +832,70 @@ // }, 'parseHook': function (aInput) { - var aResult = []; - - _.each(aInput, function (sInputValue) { + return _.map(aInput, function (sInputValue) { var - aM = null, - aValues = [], sValue = Utils.trim(sInputValue), oEmail = null ; if ('' !== sValue) { - aM = sValue.match(/[@]/g); - if (aM && 0 < aM.length) - { - sValue = sValue.replace(/[\r\n]+/g, '; ').replace(/[\s]+/g, ' '); - aValues = EmailModel.splitHelper(sValue, ';'); - - _.each(aValues, function (sV) { - - oEmail = new EmailModel(); - oEmail.mailsoParse(sV); - - if (oEmail.email) - { - aResult.push([oEmail.toLine(false), oEmail]); - } - else - { - aResult.push(['', null]); - } - }); - } - else - { - aResult.push([sInputValue, null]); - } - } - else - { - aResult.push([sInputValue, null]); + oEmail = new EmailModel(); + oEmail.mailsoParse(sValue); + return [oEmail.toLine(false), oEmail]; } + + return [sValue, null]; + }); - return aResult; +// var aResult = []; +// +// _.each(aInput, function (sInputValue) { +// +// var +// aM = null, +// aValues = [], +// sValue = Utils.trim(sInputValue), +// oEmail = null +// ; +// +// if ('' !== sValue) +// { +// aM = sValue.match(/[@]/g); +// if (aM && 0 < aM.length) +// { +// sValue = sValue.replace(/[\r\n]+/g, '; ').replace(/[\s]+/g, ' '); +// aValues = EmailModel.splitHelper(sValue, ';'); +// +// _.each(aValues, function (sV) { +// +// oEmail = new EmailModel(); +// oEmail.mailsoParse(sV); +// +// if (oEmail.email) +// { +// aResult.push([oEmail.toLine(false), oEmail]); +// } +// else +// { +// aResult.push(['', null]); +// } +// }); +// } +// else +// { +// aResult.push([sInputValue, null]); +// } +// } +// else +// { +// aResult.push([sInputValue, null]); +// } +// }); +// +// return aResult; }, 'change': _.bind(function (oEvent) { $oEl.data('EmailsTagsValue', oEvent.target.value); diff --git a/dev/Settings/User/Accounts.js b/dev/Settings/User/Accounts.js index 5468d9d29..8beb9e9f6 100644 --- a/dev/Settings/User/Accounts.js +++ b/dev/Settings/User/Accounts.js @@ -33,10 +33,12 @@ this.identityForDeletion = ko.observable(null).deleteAccessHelper(); } - AccountsUserSettings.prototype.scrollableOptions = function () + AccountsUserSettings.prototype.scrollableOptions = function (sWrapper) { return { - handle: '.drag-handle' + handle: '.drag-handle', + containment: sWrapper || 'parent', + axis: 'y' }; }; diff --git a/dev/Settings/User/Filters.js b/dev/Settings/User/Filters.js index f5f133299..9ed24f23a 100644 --- a/dev/Settings/User/Filters.js +++ b/dev/Settings/User/Filters.js @@ -110,10 +110,12 @@ }, this); } - FiltersUserSettings.prototype.scrollableOptions = function () + FiltersUserSettings.prototype.scrollableOptions = function (sWrapper) { return { - handle: '.drag-handle' + handle: '.drag-handle', + containment: sWrapper || 'parent', + axis: 'y' }; }; diff --git a/dev/Settings/User/OpenPgp.js b/dev/Settings/User/OpenPgp.js index e5c6ef6b9..c302d76ef 100644 --- a/dev/Settings/User/OpenPgp.js +++ b/dev/Settings/User/OpenPgp.js @@ -6,6 +6,7 @@ var _ = require('_'), ko = require('ko'), + window = require('window'), Utils = require('Common/Utils'), @@ -24,6 +25,8 @@ this.openpgpkeysPrivate = PgpStore.openpgpkeysPrivate; this.openPgpKeyForDeletion = ko.observable(null).deleteAccessHelper(); + + this.isHttps = window.document && window.document.location ? 'https:' === window.document.location.protocol : false; } OpenPgpUserSettings.prototype.addOpenPgpKey = function () diff --git a/dev/Settings/User/Templates.js b/dev/Settings/User/Templates.js index db6991f7c..42f8baabb 100644 --- a/dev/Settings/User/Templates.js +++ b/dev/Settings/User/Templates.js @@ -31,10 +31,12 @@ this.templateForDeletion = ko.observable(null).deleteAccessHelper(); } - TemplatesUserSettings.prototype.scrollableOptions = function () + TemplatesUserSettings.prototype.scrollableOptions = function (sWrapper) { return { - handle: '.drag-handle' + handle: '.drag-handle', + containment: sWrapper || 'parent', + axis: 'y' }; }; diff --git a/dev/Styles/SettingsAccounts.less b/dev/Styles/SettingsAccounts.less index 7c6cd63f6..04aeaf132 100644 --- a/dev/Styles/SettingsAccounts.less +++ b/dev/Styles/SettingsAccounts.less @@ -40,7 +40,7 @@ cursor: pointer; color: #ccc; } - + .identity-name { display: inline-block; word-break: break-all; @@ -50,6 +50,12 @@ } } + .accounts-list-top-padding, .identities-list-top-padding { + display: inline-block; + height: 5px; + width: 5px; + } + .account-item { .e-action { diff --git a/dev/Styles/SettingsFilters.less b/dev/Styles/SettingsFilters.less index ea218b9fe..501098d52 100644 --- a/dev/Styles/SettingsFilters.less +++ b/dev/Styles/SettingsFilters.less @@ -46,6 +46,12 @@ } } + .filters-list-top-padding { + display: inline-block; + height: 5px; + width: 5px; + } + .filter-item { .e-action { diff --git a/dev/Styles/SettingsTemplates.less b/dev/Styles/SettingsTemplates.less index 09ad48c32..3495173b1 100644 --- a/dev/Styles/SettingsTemplates.less +++ b/dev/Styles/SettingsTemplates.less @@ -37,6 +37,12 @@ } } + .templates-list-top-padding { + display: inline-block; + height: 5px; + width: 5px; + } + .template-item { .e-action { diff --git a/dev/View/Popup/NewOpenPgpKey.js b/dev/View/Popup/NewOpenPgpKey.js index 99e764c34..f57ad9850 100644 --- a/dev/View/Popup/NewOpenPgpKey.js +++ b/dev/View/Popup/NewOpenPgpKey.js @@ -42,7 +42,6 @@ var self = this, sUserID = '', - mKeyPair = null, oOpenpgpKeyring = PgpStore.openpgpKeyring ; @@ -72,7 +71,7 @@ 'passphrase': Utils.trim(self.password()) }); - mPromise.then(function () { + mPromise.then(function (mKeyPair) { self.submitRequest(false); @@ -80,6 +79,7 @@ { oOpenpgpKeyring.privateKeys.importKey(mKeyPair.privateKeyArmored); oOpenpgpKeyring.publicKeys.importKey(mKeyPair.publicKeyArmored); + oOpenpgpKeyring.store(); require('App/User').reloadOpenPgpKeys(); @@ -89,8 +89,11 @@ })['catch'](function() { self.submitRequest(false); }); - - } catch (e) {} + } + catch (e) + { + self.submitRequest(false); + } }, 100); diff --git a/gulpfile.js b/gulpfile.js index 889e35164..6bce4423f 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -140,11 +140,17 @@ cfg.paths.js = { ] }, openpgp: { - name: 'openpgp.js', + name: 'openpgp.min.js', src: [ 'vendors/openpgp/openpgp-0.10.1.min.js' ] }, + openpgpworker: { + name: 'openpgp.worker.min.js', + src: [ + 'vendors/openpgp/openpgp-0.10.1.worker.min.js' + ] + }, encrypt: { name: 'bundle.js', header: '(function (window) {', @@ -294,6 +300,13 @@ gulp.task('js:openpgp', function() { .pipe(gulp.dest(cfg.paths.staticMinJS)); }); +gulp.task('js:openpgpworker', function() { + return gulp.src(cfg.paths.js.openpgpworker.src) + .pipe(rename(cfg.paths.js.openpgpworker.name)) + .pipe(eol('\n', true)) + .pipe(gulp.dest(cfg.paths.staticMinJS)); +}); + gulp.task('js:libs', function() { return gulp.src(cfg.paths.js.libs.src) .pipe(concat(cfg.paths.js.libs.name, {separator: '\n\n'})) @@ -642,7 +655,7 @@ gulp.task('rainloop:owncloud:clean', ['rainloop:owncloud:copy', 'rainloop:ownclo }); // MAIN -gulp.task('default', ['js:libs', 'js:boot', 'js:openpgp', 'js:min', 'css:main:min', 'ckeditor', 'fontastic']); +gulp.task('default', ['js:libs', 'js:boot', 'js:openpgp', 'js:openpgpworker', 'js:min', 'css:main:min', 'ckeditor', 'fontastic']); gulp.task('fast-', ['js:app', 'js:admin', 'js:chunks', 'css:main']); gulp.task('fast', ['package:community-on', 'fast-']); diff --git a/package.json b/package.json index 71feea861..643ab9c44 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "RainLoop", "title": "RainLoop Webmail", - "version": "1.9.1", - "release": "335", + "version": "1.9.2", + "release": "342", "description": "Simple, modern & fast web-based email client", "homepage": "http://rainloop.net", "main": "gulpfile.js", @@ -40,7 +40,7 @@ "plugins" ], "readmeFilename": "README.md", - "ownCloudPackageVersion": "4.3", + "ownCloudPackageVersion": "4.4", "engines": { "node": ">= 0.10.0" }, diff --git a/rainloop/v/0.0.0/app/libraries/MailSo/Base/DateTimeHelper.php b/rainloop/v/0.0.0/app/libraries/MailSo/Base/DateTimeHelper.php index caab6bdaf..5ab334e6e 100644 --- a/rainloop/v/0.0.0/app/libraries/MailSo/Base/DateTimeHelper.php +++ b/rainloop/v/0.0.0/app/libraries/MailSo/Base/DateTimeHelper.php @@ -49,7 +49,13 @@ class DateTimeHelper */ public static function ParseRFC2822DateString($sDateTime) { - $sDateTime = \trim(\preg_replace('/ \([a-zA-Z0-9]+\)$/', '', \trim($sDateTime))); + $sDateTime = \trim($sDateTime); + if (empty($sDateTime)) + { + return 0; + } + + $sDateTime = \trim(\preg_replace('/ \([a-zA-Z0-9]+\)$/', '', $sDateTime)); $oDateTime = \DateTime::createFromFormat('D, d M Y H:i:s O', $sDateTime, \MailSo\Base\DateTimeHelper::GetUtcTimeZoneObject()); return $oDateTime ? $oDateTime->getTimestamp() : 0; } @@ -65,7 +71,12 @@ class DateTimeHelper public static function ParseInternalDateString($sDateTime) { $sDateTime = \trim($sDateTime); - if (\preg_match('/^[a-z]{2,4}, /i', $sDateTime)) // RFC2822 + if (empty($sDateTime)) + { + return 0; + } + + if (\preg_match('/^[a-z]{2,4}, /i', $sDateTime)) // RFC2822 ~ "Thu, 10 Jun 2010 08:58:33 -0700 (PDT)" { return \MailSo\Base\DateTimeHelper::ParseRFC2822DateString($sDateTime); } @@ -83,7 +94,13 @@ class DateTimeHelper */ public static function ParseDateStringType1($sDateTime) { - $oDateTime = \DateTime::createFromFormat('Y-m-d H:i:s O', \trim($sDateTime), \MailSo\Base\DateTimeHelper::GetUtcTimeZoneObject()); + $sDateTime = \trim($sDateTime); + if (empty($sDateTime)) + { + return 0; + } + + $oDateTime = \DateTime::createFromFormat('Y-m-d H:i:s O', $sDateTime, \MailSo\Base\DateTimeHelper::GetUtcTimeZoneObject()); return $oDateTime ? $oDateTime->getTimestamp() : 0; } diff --git a/rainloop/v/0.0.0/app/libraries/MailSo/Base/Utils.php b/rainloop/v/0.0.0/app/libraries/MailSo/Base/Utils.php index 4fa3f1b4e..b68dea933 100644 --- a/rainloop/v/0.0.0/app/libraries/MailSo/Base/Utils.php +++ b/rainloop/v/0.0.0/app/libraries/MailSo/Base/Utils.php @@ -2368,7 +2368,8 @@ END; { $aMatch = array(); return \preg_match('/.+(\.[a-zA-Z]+)$/', $sDomain, $aMatch) && !empty($aMatch[1]) && \in_array($aMatch[1], \explode(' ', - '.aero .asia .biz .cat .com .coop .edu .gov .info .int .jobs .mil .mobi .museum .name .net .org .pro .tel .travel .xxx .ac .ad .ae .af .ag .ai .al .am .an .ao .aq .ar .as .at .au .aw .ax .az .ba .bb .bd .be .bf .bg .bh .bi .bj .bm .bn .bo .br .bs .bt .bv .bw .by .bz .ca .cc .cd .cf .cg .ch .ci .ck .cl .cm .cn .co .cr .cs .cu .cv .cx .cy .cz .dd .de .dj .dk .dm .do .dz .ec .ee .eg .er .es .et .eu .fi .fj .fk .fm .fo .fr .ga .gb .gd .ge .gf .gg .gh .gi .gl .gm .gn .gp .gq .gr .gs .gt .gu .gw .gy .hk .hm .hn .hr .ht .hu .id .ie .il .im .in .io .iq .ir .is .it .je .jm .jo .jp .ke .kg .kh .ki .km .kn .kp .kr .kw .ky .kz .la .lb .lc .li .lk .lr .ls .lt .lu .lv .ly .ma .mc .md .me .mg .mh .mk .ml .mm .mn .mo .mp .mq .mr .ms .mt .mu .mv .mw .mx .my .mz .na .nc .ne .nf .ng .ni .nl .no .np .nr .nu .nz .om .pa .pe .pf .pg .ph .pk .pl .pm .pn .pr .ps .pt .pw .py .qa .re .ro .rs .ru . .rw .sa .sb .sc .sd .se .sg .sh .si .sj .sk .sl .sm .sn .so .sr .st .su .sv .sy .sz .tc .td .tf .tg .th .tj .tk .tl .tm .tn .to .tp .tr .tt .tv .tw .tz .ua .ug .uk .us .uy .uz .va .vc .ve .vg .vi .vn .vu .wf .ws .ye .yt .za .zm .zw' + '.academy .actor .agency .audio .bar .beer .bike .blue .boutique .cab .camera .camp .capital .cards .careers .cash .catering .center .cheap .city .cleaning .clinic .clothing .club .coffee .community .company .computer .construction .consulting .contractors .cool .credit .dance .dating .democrat .dental .diamonds .digital .direct .directory .discount .domains .education .email .energy .equipment .estate .events .expert .exposed .fail .farm .fish .fitness .florist .fund .futbol .gallery .gift .glass .graphics .guru .help .holdings .holiday .host .hosting .house .institute .international .kitchen .land .life .lighting .limo .link .management .market .marketing .media .menu .moda .partners .parts .photo .photography .photos .pics .pink .press .productions .pub .red .rentals .repair .report .rest .sexy .shoes .social .solar .solutions .space .support .systems .tattoo .tax .technology .tips .today .tools .town .toys .trade .training .university .uno .vacations .vision .vodka .voyage .watch .webcam .wiki .work .works .wtf .zone .aero .asia .biz .cat .com .coop .edu .gov .info .int .jobs .mil .mobi .museum .name .net .org .pro .tel .travel .xxx '. + '.ac .ad .ae .af .ag .ai .al .am .an .ao .aq .ar .as .at .au .aw .ax .az .ba .bb .bd .be .bf .bg .bh .bi .bj .bm .bn .bo .br .bs .bt .bv .bw .by .bz .ca .cc .cd .cf .cg .ch .ci .ck .cl .cm .cn .co .cr .cs .cu .cv .cx .cy .cz .dd .de .dj .dk .dm .do .dz .ec .ee .eg .er .es .et .eu .fi .fj .fk .fm .fo .fr .ga .gb .gd .ge .gf .gg .gh .gi .gl .gm .gn .gp .gq .gr .gs .gt .gu .gw .gy .hk .hm .hn .hr .ht .hu .id .ie .il .im .in .io .iq .ir .is .it .je .jm .jo .jp .ke .kg .kh .ki .km .kn .kp .kr .kw .ky .kz .la .lb .lc .li .lk .lr .ls .lt .lu .lv .ly .ma .mc .md .me .mg .mh .mk .ml .mm .mn .mo .mp .mq .mr .ms .mt .mu .mv .mw .mx .my .mz .na .nc .ne .nf .ng .ni .nl .no .np .nr .nu .nz .om .pa .pe .pf .pg .ph .pk .pl .pm .pn .pr .ps .pt .pw .py .qa .re .ro .rs .ru . .rw .sa .sb .sc .sd .se .sg .sh .si .sj .sk .sl .sm .sn .so .sr .st .su .sv .sy .sz .tc .td .tf .tg .th .tj .tk .tl .tm .tn .to .tp .tr .tt .tv .tw .tz .ua .ug .uk .us .uy .uz .va .vc .ve .vg .vi .vn .vu .wf .ws .ye .yt .za .zm .zw' )); } diff --git a/rainloop/v/0.0.0/app/libraries/MailSo/Imap/ImapClient.php b/rainloop/v/0.0.0/app/libraries/MailSo/Imap/ImapClient.php index 45d365472..85ed08edd 100644 --- a/rainloop/v/0.0.0/app/libraries/MailSo/Imap/ImapClient.php +++ b/rainloop/v/0.0.0/app/libraries/MailSo/Imap/ImapClient.php @@ -1889,7 +1889,7 @@ class ImapClient extends \MailSo\Net\NetClient * @throws \MailSo\Net\Exceptions\Exception */ private function partialParseResponseBranch(&$oImapResponse, $iStackIndex = -1, - $bTreatAsAtom = false, $sParentToken = '') + $bTreatAsAtom = false, $sParentToken = '', $sOpenBracket = '') { $mNull = null; @@ -2020,7 +2020,7 @@ class ImapClient extends \MailSo\Net\NetClient if ($bTreatAsAtom) { $sAtomBlock = $this->partialParseResponseBranch($mNull, $iStackIndex, true, - null === $sPreviousAtomUpperCase ? '' : \strtoupper($sPreviousAtomUpperCase)); + null === $sPreviousAtomUpperCase ? '' : \strtoupper($sPreviousAtomUpperCase), $sOpenBracket); $sAtomBuilder .= $sAtomBlock; $iPos = $this->iResponseBufParsedPos; @@ -2035,7 +2035,7 @@ class ImapClient extends \MailSo\Net\NetClient else if ($bIsGotoNotAtomBracket) { $aSubItems = $this->partialParseResponseBranch($mNull, $iStackIndex, false, - null === $sPreviousAtomUpperCase ? '' : \strtoupper($sPreviousAtomUpperCase)); + null === $sPreviousAtomUpperCase ? '' : \strtoupper($sPreviousAtomUpperCase), $sOpenBracket); $aList[] = $aSubItems; $iPos = $this->iResponseBufParsedPos; @@ -2065,27 +2065,36 @@ class ImapClient extends \MailSo\Net\NetClient $sChar = $this->sResponseBuffer[$iPos]; } - switch ($sChar) + switch (true) { - case ']': - case ')': + case ']' === $sChar: $iPos++; $sPreviousAtomUpperCase = null; $bIsEndOfList = true; break; - case ' ': + case ')' === $sChar: + $iPos++; + $sPreviousAtomUpperCase = null; + $bIsEndOfList = true; + break; + case ' ' === $sChar: if ($bTreatAsAtom) { $sAtomBuilder .= ' '; } $iPos++; break; - case '[': + case '[' === $sChar: $bIsClosingBracketSquare = true; - case '(': + case '(' === $sChar: + if ('(' === $sChar) + { + $bIsClosingBracketSquare = false; + } + if ($bTreatAsAtom) { - $sAtomBuilder .= ($bIsClosingBracketSquare) ? '[' : '('; + $sAtomBuilder .= $bIsClosingBracketSquare ? '[' : '('; } $iPos++; @@ -2093,13 +2102,15 @@ class ImapClient extends \MailSo\Net\NetClient if ($bTreatAsAtom) { $bIsGotoAtomBracket = true; + $sOpenBracket = $bIsClosingBracketSquare ? '[' : '('; } else { $bIsGotoNotAtomBracket = true; + $sOpenBracket = $bIsClosingBracketSquare ? '[' : '('; } break; - case '{': + case '{' === $sChar: $bIsLiteralParsed = false; $mLiteralEndPos = \strpos($this->sResponseBuffer, '}', $iPos); if (false !== $mLiteralEndPos && $mLiteralEndPos > $iPos) @@ -2120,7 +2131,7 @@ class ImapClient extends \MailSo\Net\NetClient } $sPreviousAtomUpperCase = null; break; - case '"': + case '"' === $sChar: $bIsQuotedParsed = false; while (true) { @@ -2206,7 +2217,7 @@ class ImapClient extends \MailSo\Net\NetClient $sPreviousAtomUpperCase = null; break; - case 'GOTO_DEFAULT': + case 'GOTO_DEFAULT' === $sChar: default: $iCharBlockStartPos = $iPos; @@ -2214,7 +2225,7 @@ class ImapClient extends \MailSo\Net\NetClient { $iPos = $iBufferEndIndex; - while ($iPos > $iCharBlockStartPos && $this->sResponseBuffer[$iCharBlockStartPos] == ' ') + while ($iPos > $iCharBlockStartPos && $this->sResponseBuffer[$iCharBlockStartPos] === ' ') { $iCharBlockStartPos++; } @@ -2224,9 +2235,9 @@ class ImapClient extends \MailSo\Net\NetClient while (!$bIsAtomDone && ($iPos <= $iBufferEndIndex)) { $sCharDef = $this->sResponseBuffer[$iPos]; - switch ($sCharDef) + switch (true) { - case '[': + case '[' === $sCharDef: if (null === $sAtomBuilder) { $sAtomBuilder = ''; @@ -2238,7 +2249,7 @@ class ImapClient extends \MailSo\Net\NetClient $this->iResponseBufParsedPos = $iPos; $sListBlock = $this->partialParseResponseBranch($mNull, $iStackIndex, true, - null === $sPreviousAtomUpperCase ? '' : \strtoupper($sPreviousAtomUpperCase)); + null === $sPreviousAtomUpperCase ? '' : \strtoupper($sPreviousAtomUpperCase), '['); if (null !== $sListBlock) { @@ -2248,9 +2259,9 @@ class ImapClient extends \MailSo\Net\NetClient $iPos = $this->iResponseBufParsedPos; $iCharBlockStartPos = $iPos; break; - case ' ': - case ']': - case ')': + case ' ' === $sCharDef: + case ')' === $sCharDef && '(' === $sOpenBracket: + case ']' === $sCharDef && '[' === $sOpenBracket: $bIsAtomDone = true; break; default: diff --git a/rainloop/v/0.0.0/app/libraries/MailSo/Mail/Message.php b/rainloop/v/0.0.0/app/libraries/MailSo/Mail/Message.php index 0fe6d7551..029b5b748 100644 --- a/rainloop/v/0.0.0/app/libraries/MailSo/Mail/Message.php +++ b/rainloop/v/0.0.0/app/libraries/MailSo/Mail/Message.php @@ -622,7 +622,7 @@ class Message $this->sInReplyTo = $oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::IN_REPLY_TO); $this->sReferences = \MailSo\Base\Utils::StripSpaces( $oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::REFERENCES)); - + $sHeaderDate = $oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::DATE); $this->sHeaderDate = $sHeaderDate; $this->iHeaderTimeStampInUTC = \MailSo\Base\DateTimeHelper::ParseRFC2822DateString($sHeaderDate); diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php index d521c82a3..f1b54287b 100644 --- a/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php @@ -9411,14 +9411,23 @@ class Actions { $oAccount = \call_user_func($fGetAccount); + $iDateTimeStampInUTC = $mResponse->InternalTimeStampInUTC(); + if (0 === $iDateTimeStampInUTC || !!$this->Config()->Get('labs', 'date_from_headers', false)) + { + $iDateTimeStampInUTC = $mResponse->HeaderTimeStampInUTC(); + if (0 === $iDateTimeStampInUTC) + { + $iDateTimeStampInUTC = $mResponse->InternalTimeStampInUTC(); + } + } + $mResult = \array_merge($this->objectData($mResponse, $sParent, $aParameters), array( 'Folder' => $mResponse->Folder(), 'Uid' => (string) $mResponse->Uid(), 'Subject' => \trim(\MailSo\Base\Utils::Utf8Clear($mResponse->Subject())), 'MessageId' => $mResponse->MessageId(), 'Size' => $mResponse->Size(), - 'DateTimeStampInUTC' => !!$this->Config()->Get('labs', 'date_from_headers', false) - ? $mResponse->HeaderTimeStampInUTC() : $mResponse->InternalTimeStampInUTC(), + 'DateTimeStampInUTC' => $iDateTimeStampInUTC, 'ReplyTo' => $this->responseObject($mResponse->ReplyTo(), $sParent, $aParameters), 'From' => $this->responseObject($mResponse->From(), $sParent, $aParameters), 'To' => $this->responseObject($mResponse->To(), $sParent, $aParameters), diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/Providers/AddressBook/Classes/Property.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Providers/AddressBook/Classes/Property.php index c433f533c..78db4e428 100644 --- a/rainloop/v/0.0.0/app/libraries/RainLoop/Providers/AddressBook/Classes/Property.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Providers/AddressBook/Classes/Property.php @@ -98,6 +98,14 @@ class Property return PropertyType::WEB_PAGE === $this->Type; } + /** + * @return bool + */ + public function IsValueForLower() + { + return $this->IsEmail() || $this->IsName() || $this->IsWeb(); + } + /** * @return bool */ @@ -142,7 +150,7 @@ class Property } // lower value for searching - if (\MailSo\Base\Utils::FunctionExistsAndEnabled('mb_strtolower')) + if ($this->IsValueForLower() && \MailSo\Base\Utils::FunctionExistsAndEnabled('mb_strtolower')) { $this->ValueLower = (string) @\mb_strtolower($this->Value, 'UTF-8'); } @@ -153,6 +161,7 @@ class Property $sPhone = \trim($this->Value); $sPhone = \preg_replace('/^[+]+/', '', $sPhone); $sPhone = \preg_replace('/[^\d]/', '', $sPhone); + $this->ValueCustom = \trim($sPhone); } } diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/Providers/AddressBook/PdoAddressBook.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Providers/AddressBook/PdoAddressBook.php index 87a601fca..7ef050381 100644 --- a/rainloop/v/0.0.0/app/libraries/RainLoop/Providers/AddressBook/PdoAddressBook.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Providers/AddressBook/PdoAddressBook.php @@ -1895,6 +1895,11 @@ SQLITEINITIAL; 1 => $this->getInitialTablesArray($this->sDsnType), 2 => array( 'ALTER TABLE rainloop_ab_properties ADD prop_value_lower varchar(255) NOT NULL DEFAULT \'\' AFTER prop_value_custom;' + ), + 3 => array( +'ALTER TABLE rainloop_ab_properties CHANGE prop_value prop_value TEXT NOT NULL;', +'ALTER TABLE rainloop_ab_properties CHANGE prop_value_custom prop_value_custom TEXT NOT NULL;', +'ALTER TABLE rainloop_ab_properties CHANGE prop_value_lower prop_value_lower TEXT NOT NULL;' ) )); break; @@ -1903,7 +1908,8 @@ SQLITEINITIAL; 1 => $this->getInitialTablesArray($this->sDsnType), 2 => array( 'ALTER TABLE rainloop_ab_properties ADD prop_value_lower text NOT NULL DEFAULT \'\';' - ) + ), + 3 => array() )); break; case 'sqlite': @@ -1911,7 +1917,8 @@ SQLITEINITIAL; 1 => $this->getInitialTablesArray($this->sDsnType), 2 => array( 'ALTER TABLE rainloop_ab_properties ADD prop_value_lower text NOT NULL DEFAULT \'\';' - ) + ), + 3 => array() )); break; } diff --git a/rainloop/v/0.0.0/app/templates/Views/User/PopupsCompose.html b/rainloop/v/0.0.0/app/templates/Views/User/PopupsCompose.html index 090f4af2b..6af91975f 100644 --- a/rainloop/v/0.0.0/app/templates/Views/User/PopupsCompose.html +++ b/rainloop/v/0.0.0/app/templates/Views/User/PopupsCompose.html @@ -149,6 +149,12 @@ +
+
+
+
+
+
@@ -174,15 +180,18 @@ diff --git a/rainloop/v/0.0.0/app/templates/Views/User/PopupsNewOpenPgpKey.html b/rainloop/v/0.0.0/app/templates/Views/User/PopupsNewOpenPgpKey.html index 2a5e3de71..916de9fa1 100644 --- a/rainloop/v/0.0.0/app/templates/Views/User/PopupsNewOpenPgpKey.html +++ b/rainloop/v/0.0.0/app/templates/Views/User/PopupsNewOpenPgpKey.html @@ -36,7 +36,7 @@
- +
diff --git a/rainloop/v/0.0.0/app/templates/Views/User/SettingsAccounts.html b/rainloop/v/0.0.0/app/templates/Views/User/SettingsAccounts.html index a09dedffe..5c33118d1 100644 --- a/rainloop/v/0.0.0/app/templates/Views/User/SettingsAccounts.html +++ b/rainloop/v/0.0.0/app/templates/Views/User/SettingsAccounts.html @@ -15,34 +15,37 @@


- - - - - - - - - - - - - -
+
+
+ + + + + + + + + + + + + +
+

@@ -59,37 +62,40 @@


- - - - - - - - - - - - - -
- - -    - -    - - () - - - - - - - - - - -
+
+
+ + + + + + + + + + + + + +
+ + +    + +    + + () + + + + + + + + + + +
+
\ No newline at end of file diff --git a/rainloop/v/0.0.0/app/templates/Views/User/SettingsFilters.html b/rainloop/v/0.0.0/app/templates/Views/User/SettingsFilters.html index 36bc28e85..ea1c51dcd 100644 --- a/rainloop/v/0.0.0/app/templates/Views/User/SettingsFilters.html +++ b/rainloop/v/0.0.0/app/templates/Views/User/SettingsFilters.html @@ -60,43 +60,47 @@ data-bind="value: filterRaw, valueUpdate: 'afterkeydown'"> - - - - - - - - - - - - - - - - - -
- - - - - - - -    - - - - - - - - - -
+
+
+ + + + + + + + + + + + + + + + + +
+ + + + + + + +    + + + + + + + + + +
+
+ \ No newline at end of file diff --git a/rainloop/v/0.0.0/app/templates/Views/User/SettingsOpenPGP.html b/rainloop/v/0.0.0/app/templates/Views/User/SettingsOpenPGP.html index 52803486a..2b2c7d611 100644 --- a/rainloop/v/0.0.0/app/templates/Views/User/SettingsOpenPGP.html +++ b/rainloop/v/0.0.0/app/templates/Views/User/SettingsOpenPGP.html @@ -4,17 +4,19 @@ - + +    +
+ +



diff --git a/rainloop/v/0.0.0/app/templates/Views/User/SettingsTemplates.html b/rainloop/v/0.0.0/app/templates/Views/User/SettingsTemplates.html index 341ac972f..fdf385d41 100644 --- a/rainloop/v/0.0.0/app/templates/Views/User/SettingsTemplates.html +++ b/rainloop/v/0.0.0/app/templates/Views/User/SettingsTemplates.html @@ -14,31 +14,35 @@


- - - - - - - - - - - - - -
- - -    - - - - - - - - - -
+
+
+ + + + + + + + + + + + + +
+ + +    + + + + + + + + + +
+
+ \ No newline at end of file diff --git a/rainloop/v/0.0.0/include.php b/rainloop/v/0.0.0/include.php index f31a560e1..1d438b2e2 100644 --- a/rainloop/v/0.0.0/include.php +++ b/rainloop/v/0.0.0/include.php @@ -70,7 +70,7 @@ Options -Indexes define('APP_DATA_FOLDER_PATH_UNIX', str_replace('\\', '/', APP_DATA_FOLDER_PATH)); $sSalt = @file_get_contents(APP_DATA_FOLDER_PATH.'SALT.php'); - $sData = @file_get_contents(APP_DATA_FOLDER_PATH.'DATA.php'); + $sData = file_exists(APP_DATA_FOLDER_PATH.'DATA.php') ? @file_get_contents(APP_DATA_FOLDER_PATH.'DATA.php') : ''; $sInstalled = @file_get_contents(APP_DATA_FOLDER_PATH.'INSTALLED'); // installation checking data folder @@ -129,29 +129,20 @@ Options -Indexes unset($sCheckName, $sCheckFilePath, $sCheckFolder, $sTest); } - if (false === $sSalt || false === $sData) + if (false === $sSalt) { - if (false === $sSalt) - { - // random salt - $sSalt = '<'.'?php //' - .md5(microtime(true).rand(1000, 5000)) - .md5(microtime(true).rand(5000, 9999)) - .md5(microtime(true).rand(1000, 5000)); + // random salt + $sSalt = '<'.'?php //' + .md5(microtime(true).rand(1000, 5000)) + .md5(microtime(true).rand(5000, 9999)) + .md5(microtime(true).rand(1000, 5000)); - @file_put_contents(APP_DATA_FOLDER_PATH.'SALT.php', $sSalt); - } - - if (false === $sData) - { - // random data folder name - $sData = '<'.'?php //'.md5(microtime(true).rand(1000, 9999)); - @file_put_contents(APP_DATA_FOLDER_PATH.'DATA.php', $sData); - } + @file_put_contents(APP_DATA_FOLDER_PATH.'SALT.php', $sSalt); } define('APP_SALT', md5($sSalt.APP_PRIVATE_DATA_NAME.$sSalt)); - define('APP_PRIVATE_DATA', APP_DATA_FOLDER_PATH.'_data_'.md5($sData).'/'.APP_PRIVATE_DATA_NAME.'/'); + define('APP_PRIVATE_DATA', APP_DATA_FOLDER_PATH.'_data_'.($sData ? md5($sData) : '').'/'.APP_PRIVATE_DATA_NAME.'/'); + define('APP_PLUGINS_PATH', APP_PRIVATE_DATA.'plugins/'); if (APP_VERSION !== $sInstalled || (APP_MULTIPLY && !@is_dir(APP_PRIVATE_DATA))) diff --git a/rainloop/v/0.0.0/langs/bg.ini b/rainloop/v/0.0.0/langs/bg.ini index 68434e2ea..37b1f11c0 100644 --- a/rainloop/v/0.0.0/langs/bg.ini +++ b/rainloop/v/0.0.0/langs/bg.ini @@ -320,6 +320,12 @@ BUTTON_SIGN = "Sign" BUTTON_ENCRYPT = "Encrypt" BUTTON_SIGN_AND_ENCRYPT = "Sign and encrypt" +[POPUPS_MESSAGE_OPEN_PGP] +TITLE_MESSAGE_OPEN_PGP = "OpenPGP Decrypt" +LABEL_KEY = "Private Key" +LABEL_PASSWORD = "Password" +BUTTON_DECRYPT = "Decrypt" + [POPUPS_TWO_FACTOR_TEST] TITLE_TEST_CODE = "Двустъпков тест за удостоверяване" LABEL_CODE = "Код" @@ -601,6 +607,7 @@ BUTTON_GENERATE_OPEN_PGP_KEYS = "Generate OpenPGP Keys" TITLE_PRIVATE = "Private" TITLE_PUBLIC = "Public" DELETING_ASK = "Are you sure?" +GENERATE_ONLY_HTTPS = "HTTPS only" [SHORTCUTS_HELP] LEGEND_SHORTCUTS_HELP = "Keyboard shortcuts help" diff --git a/rainloop/v/0.0.0/langs/cs.ini b/rainloop/v/0.0.0/langs/cs.ini index e6fd362fa..42742f178 100644 --- a/rainloop/v/0.0.0/langs/cs.ini +++ b/rainloop/v/0.0.0/langs/cs.ini @@ -319,6 +319,12 @@ BUTTON_SIGN = "Podepsat" BUTTON_ENCRYPT = "Šifrovat" BUTTON_SIGN_AND_ENCRYPT = "Podepsat a šifrovat" +[POPUPS_MESSAGE_OPEN_PGP] +TITLE_MESSAGE_OPEN_PGP = "OpenPGP Decrypt" +LABEL_KEY = "Private Key" +LABEL_PASSWORD = "Password" +BUTTON_DECRYPT = "Decrypt" + [POPUPS_TWO_FACTOR_TEST] TITLE_TEST_CODE = "Dvoufázové ověření" LABEL_CODE = "Kód" @@ -600,6 +606,7 @@ BUTTON_GENERATE_OPEN_PGP_KEYS = "Generovat OpenPGP Klíče" TITLE_PRIVATE = "Soukromý" TITLE_PUBLIC = "Veřejný" DELETING_ASK = "Opravdu to chcete?" +GENERATE_ONLY_HTTPS = "HTTPS only" [SHORTCUTS_HELP] LEGEND_SHORTCUTS_HELP = "Klávesové zkratky" diff --git a/rainloop/v/0.0.0/langs/de.ini b/rainloop/v/0.0.0/langs/de.ini index e032f5428..66942ab50 100644 --- a/rainloop/v/0.0.0/langs/de.ini +++ b/rainloop/v/0.0.0/langs/de.ini @@ -320,6 +320,12 @@ BUTTON_SIGN = "Unterschreiben" BUTTON_ENCRYPT = "Verschlüsseln" BUTTON_SIGN_AND_ENCRYPT = "Unterschreiben und verschlüsseln" +[POPUPS_MESSAGE_OPEN_PGP] +TITLE_MESSAGE_OPEN_PGP = "OpenPGP Decrypt" +LABEL_KEY = "Private Key" +LABEL_PASSWORD = "Password" +BUTTON_DECRYPT = "Decrypt" + [POPUPS_TWO_FACTOR_TEST] TITLE_TEST_CODE = "Zwei-Faktor-Authentifizierung" LABEL_CODE = "Code" @@ -601,6 +607,7 @@ BUTTON_GENERATE_OPEN_PGP_KEYS = "OpenPGP-Schlüssel generieren" TITLE_PRIVATE = "Privat" TITLE_PUBLIC = "Öffentlich" DELETING_ASK = "Sind Sie sicher?" +GENERATE_ONLY_HTTPS = "HTTPS only" [SHORTCUTS_HELP] LEGEND_SHORTCUTS_HELP = "Tastaturkürzel-Hilfe" diff --git a/rainloop/v/0.0.0/langs/en-gb.ini b/rainloop/v/0.0.0/langs/en-gb.ini index d53e0a58d..299ae866c 100644 --- a/rainloop/v/0.0.0/langs/en-gb.ini +++ b/rainloop/v/0.0.0/langs/en-gb.ini @@ -320,6 +320,12 @@ BUTTON_SIGN = "Sign" BUTTON_ENCRYPT = "Encrypt" BUTTON_SIGN_AND_ENCRYPT = "Sign and encrypt" +[POPUPS_MESSAGE_OPEN_PGP] +TITLE_MESSAGE_OPEN_PGP = "OpenPGP Decrypt" +LABEL_KEY = "Private Key" +LABEL_PASSWORD = "Password" +BUTTON_DECRYPT = "Decrypt" + [POPUPS_TWO_FACTOR_TEST] TITLE_TEST_CODE = "2-Step verification test" LABEL_CODE = "Code" @@ -601,6 +607,7 @@ BUTTON_GENERATE_OPEN_PGP_KEYS = "Generate OpenPGP Keys" TITLE_PRIVATE = "Private" TITLE_PUBLIC = "Public" DELETING_ASK = "Are you sure?" +GENERATE_ONLY_HTTPS = "HTTPS only" [SHORTCUTS_HELP] LEGEND_SHORTCUTS_HELP = "Keyboard shortcuts help" diff --git a/rainloop/v/0.0.0/langs/en.ini b/rainloop/v/0.0.0/langs/en.ini index fe8aa5ca9..299ae866c 100644 --- a/rainloop/v/0.0.0/langs/en.ini +++ b/rainloop/v/0.0.0/langs/en.ini @@ -607,6 +607,7 @@ BUTTON_GENERATE_OPEN_PGP_KEYS = "Generate OpenPGP Keys" TITLE_PRIVATE = "Private" TITLE_PUBLIC = "Public" DELETING_ASK = "Are you sure?" +GENERATE_ONLY_HTTPS = "HTTPS only" [SHORTCUTS_HELP] LEGEND_SHORTCUTS_HELP = "Keyboard shortcuts help" diff --git a/rainloop/v/0.0.0/langs/es.ini b/rainloop/v/0.0.0/langs/es.ini index b47cfc1ca..1622ed3fc 100644 --- a/rainloop/v/0.0.0/langs/es.ini +++ b/rainloop/v/0.0.0/langs/es.ini @@ -320,6 +320,12 @@ BUTTON_SIGN = "Firmar" BUTTON_ENCRYPT = "Encriptar" BUTTON_SIGN_AND_ENCRYPT = "Firmar and encriptar" +[POPUPS_MESSAGE_OPEN_PGP] +TITLE_MESSAGE_OPEN_PGP = "OpenPGP Decrypt" +LABEL_KEY = "Private Key" +LABEL_PASSWORD = "Password" +BUTTON_DECRYPT = "Decrypt" + [POPUPS_TWO_FACTOR_TEST] TITLE_TEST_CODE = "Prueba de verificación de 2 pasos" LABEL_CODE = "Código" @@ -601,6 +607,7 @@ BUTTON_GENERATE_OPEN_PGP_KEYS = "Generar llaves OpenPGP" TITLE_PRIVATE = "Privado" TITLE_PUBLIC = "Público" DELETING_ASK = "¿Está usted seguro?" +GENERATE_ONLY_HTTPS = "HTTPS only" [SHORTCUTS_HELP] LEGEND_SHORTCUTS_HELP = "Ayuda de atajos de teclado" diff --git a/rainloop/v/0.0.0/langs/fr.ini b/rainloop/v/0.0.0/langs/fr.ini index 83b768154..4593a71b0 100644 --- a/rainloop/v/0.0.0/langs/fr.ini +++ b/rainloop/v/0.0.0/langs/fr.ini @@ -320,6 +320,12 @@ BUTTON_SIGN = "Signer" BUTTON_ENCRYPT = "Chiffrer" BUTTON_SIGN_AND_ENCRYPT = "Signer et chiffrer" +[POPUPS_MESSAGE_OPEN_PGP] +TITLE_MESSAGE_OPEN_PGP = "OpenPGP Decrypt" +LABEL_KEY = "Private Key" +LABEL_PASSWORD = "Password" +BUTTON_DECRYPT = "Decrypt" + [POPUPS_TWO_FACTOR_TEST] TITLE_TEST_CODE = "Test d'authentification en deux étapes" LABEL_CODE = "Code" @@ -601,6 +607,7 @@ BUTTON_GENERATE_OPEN_PGP_KEYS = "Générer les clefs OpenPGP" TITLE_PRIVATE = "Privé" TITLE_PUBLIC = "Public" DELETING_ASK = "Êtes-vous sûr ?" +GENERATE_ONLY_HTTPS = "HTTPS only" [SHORTCUTS_HELP] LEGEND_SHORTCUTS_HELP = "Aide pour les raccourcis clavier" diff --git a/rainloop/v/0.0.0/langs/hu.ini b/rainloop/v/0.0.0/langs/hu.ini index 40f65c851..21ead746c 100644 --- a/rainloop/v/0.0.0/langs/hu.ini +++ b/rainloop/v/0.0.0/langs/hu.ini @@ -320,6 +320,12 @@ BUTTON_SIGN = "Aláírás" BUTTON_ENCRYPT = "Titkosítás" BUTTON_SIGN_AND_ENCRYPT = "Aláírás és titkosítás" +[POPUPS_MESSAGE_OPEN_PGP] +TITLE_MESSAGE_OPEN_PGP = "OpenPGP Decrypt" +LABEL_KEY = "Private Key" +LABEL_PASSWORD = "Password" +BUTTON_DECRYPT = "Decrypt" + [POPUPS_TWO_FACTOR_TEST] TITLE_TEST_CODE = "2-lépés hitelesítés teszt" LABEL_CODE = "Kód" @@ -601,6 +607,7 @@ BUTTON_GENERATE_OPEN_PGP_KEYS = "OpenPGP kulcs generálás" TITLE_PRIVATE = "Private" TITLE_PUBLIC = "Public" DELETING_ASK = "Are you sure?" +GENERATE_ONLY_HTTPS = "HTTPS only" [SHORTCUTS_HELP] LEGEND_SHORTCUTS_HELP = "Keyboard shortcuts help" diff --git a/rainloop/v/0.0.0/langs/is.ini b/rainloop/v/0.0.0/langs/is.ini index f4c99a53c..9437d1ff6 100644 --- a/rainloop/v/0.0.0/langs/is.ini +++ b/rainloop/v/0.0.0/langs/is.ini @@ -320,6 +320,12 @@ BUTTON_SIGN = "Sign" BUTTON_ENCRYPT = "Encrypt" BUTTON_SIGN_AND_ENCRYPT = "Sign and encrypt" +[POPUPS_MESSAGE_OPEN_PGP] +TITLE_MESSAGE_OPEN_PGP = "OpenPGP Decrypt" +LABEL_KEY = "Private Key" +LABEL_PASSWORD = "Password" +BUTTON_DECRYPT = "Decrypt" + [POPUPS_TWO_FACTOR_TEST] TITLE_TEST_CODE = "2-Step verification test" LABEL_CODE = "Code" @@ -601,6 +607,7 @@ BUTTON_GENERATE_OPEN_PGP_KEYS = "Generate OpenPGP Keys" TITLE_PRIVATE = "Private" TITLE_PUBLIC = "Public" DELETING_ASK = "Are you sure?" +GENERATE_ONLY_HTTPS = "HTTPS only" [SHORTCUTS_HELP] LEGEND_SHORTCUTS_HELP = "Keyboard shortcuts help" diff --git a/rainloop/v/0.0.0/langs/it.ini b/rainloop/v/0.0.0/langs/it.ini index 430bac847..c5b89541a 100644 --- a/rainloop/v/0.0.0/langs/it.ini +++ b/rainloop/v/0.0.0/langs/it.ini @@ -320,6 +320,12 @@ BUTTON_SIGN = "Firma" BUTTON_ENCRYPT = "Cifra" BUTTON_SIGN_AND_ENCRYPT = "Firma e cifra" +[POPUPS_MESSAGE_OPEN_PGP] +TITLE_MESSAGE_OPEN_PGP = "OpenPGP Decrypt" +LABEL_KEY = "Private Key" +LABEL_PASSWORD = "Password" +BUTTON_DECRYPT = "Decrypt" + [POPUPS_TWO_FACTOR_TEST] TITLE_TEST_CODE = "Verifica a 2 fattori" LABEL_CODE = "Codice" @@ -601,6 +607,7 @@ BUTTON_GENERATE_OPEN_PGP_KEYS = "Genera chiave OpenPGP" TITLE_PRIVATE = "Privata" TITLE_PUBLIC = "Pubblica" DELETING_ASK = "Sei sicuro?" +GENERATE_ONLY_HTTPS = "HTTPS only" [SHORTCUTS_HELP] LEGEND_SHORTCUTS_HELP = "Aiuto sulle scorciatoie da tastiera" diff --git a/rainloop/v/0.0.0/langs/ja-jp.ini b/rainloop/v/0.0.0/langs/ja-jp.ini index f1e394e74..49b3d5630 100644 --- a/rainloop/v/0.0.0/langs/ja-jp.ini +++ b/rainloop/v/0.0.0/langs/ja-jp.ini @@ -320,6 +320,12 @@ BUTTON_SIGN = "Sign" BUTTON_ENCRYPT = "Encrypt" BUTTON_SIGN_AND_ENCRYPT = "Sign and encrypt" +[POPUPS_MESSAGE_OPEN_PGP] +TITLE_MESSAGE_OPEN_PGP = "OpenPGP Decrypt" +LABEL_KEY = "Private Key" +LABEL_PASSWORD = "Password" +BUTTON_DECRYPT = "Decrypt" + [POPUPS_TWO_FACTOR_TEST] TITLE_TEST_CODE = "2-Step verification test" LABEL_CODE = "Code" @@ -601,6 +607,7 @@ BUTTON_GENERATE_OPEN_PGP_KEYS = "Generate OpenPGP Keys" TITLE_PRIVATE = "Private" TITLE_PUBLIC = "Public" DELETING_ASK = "Are you sure?" +GENERATE_ONLY_HTTPS = "HTTPS only" [SHORTCUTS_HELP] LEGEND_SHORTCUTS_HELP = "Keyboard shortcuts help" diff --git a/rainloop/v/0.0.0/langs/ko-kr.ini b/rainloop/v/0.0.0/langs/ko-kr.ini index fa6ad1d95..3b143f22d 100644 --- a/rainloop/v/0.0.0/langs/ko-kr.ini +++ b/rainloop/v/0.0.0/langs/ko-kr.ini @@ -320,6 +320,12 @@ BUTTON_SIGN = "Sign" BUTTON_ENCRYPT = "Encrypt" BUTTON_SIGN_AND_ENCRYPT = "Sign and encrypt" +[POPUPS_MESSAGE_OPEN_PGP] +TITLE_MESSAGE_OPEN_PGP = "OpenPGP Decrypt" +LABEL_KEY = "Private Key" +LABEL_PASSWORD = "Password" +BUTTON_DECRYPT = "Decrypt" + [POPUPS_TWO_FACTOR_TEST] TITLE_TEST_CODE = "2-Step verification test" LABEL_CODE = "Code" @@ -598,6 +604,7 @@ BUTTON_GENERATE_OPEN_PGP_KEYS = "Generate OpenPGP Keys" TITLE_PRIVATE = "Private" TITLE_PUBLIC = "Public" DELETING_ASK = "Are you sure?" +GENERATE_ONLY_HTTPS = "HTTPS only" [SHORTCUTS_HELP] LEGEND_SHORTCUTS_HELP = "Keyboard shortcuts help" diff --git a/rainloop/v/0.0.0/langs/lt.ini b/rainloop/v/0.0.0/langs/lt.ini index 55d3a6ea6..9861eeb75 100644 --- a/rainloop/v/0.0.0/langs/lt.ini +++ b/rainloop/v/0.0.0/langs/lt.ini @@ -320,6 +320,12 @@ BUTTON_SIGN = "Pasirašyti" BUTTON_ENCRYPT = "Šifruoti" BUTTON_SIGN_AND_ENCRYPT = "Pasirašyti ir šifruoti" +[POPUPS_MESSAGE_OPEN_PGP] +TITLE_MESSAGE_OPEN_PGP = "OpenPGP Decrypt" +LABEL_KEY = "Private Key" +LABEL_PASSWORD = "Password" +BUTTON_DECRYPT = "Decrypt" + [POPUPS_TWO_FACTOR_TEST] TITLE_TEST_CODE = "2-jų žingsnių patikrinimo bandymas" LABEL_CODE = "Kodas" @@ -601,6 +607,7 @@ BUTTON_GENERATE_OPEN_PGP_KEYS = "Sukurti OpenPGP raktus" TITLE_PRIVATE = "Privatus" TITLE_PUBLIC = "Viešas" DELETING_ASK = "Jūs įsitikinę?" +GENERATE_ONLY_HTTPS = "HTTPS only" [SHORTCUTS_HELP] LEGEND_SHORTCUTS_HELP = "Sparčiųjų klavišų pagalba" diff --git a/rainloop/v/0.0.0/langs/lv.ini b/rainloop/v/0.0.0/langs/lv.ini index 97b32023d..c7f1a4a9b 100644 --- a/rainloop/v/0.0.0/langs/lv.ini +++ b/rainloop/v/0.0.0/langs/lv.ini @@ -320,6 +320,12 @@ BUTTON_SIGN = "Sign" BUTTON_ENCRYPT = "Encrypt" BUTTON_SIGN_AND_ENCRYPT = "Sign and encrypt" +[POPUPS_MESSAGE_OPEN_PGP] +TITLE_MESSAGE_OPEN_PGP = "OpenPGP Decrypt" +LABEL_KEY = "Private Key" +LABEL_PASSWORD = "Password" +BUTTON_DECRYPT = "Decrypt" + [POPUPS_TWO_FACTOR_TEST] TITLE_TEST_CODE = "2-Step verification test" LABEL_CODE = "Code" @@ -601,6 +607,7 @@ BUTTON_GENERATE_OPEN_PGP_KEYS = "Generate OpenPGP Keys" TITLE_PRIVATE = "Private" TITLE_PUBLIC = "Public" DELETING_ASK = "Are you sure?" +GENERATE_ONLY_HTTPS = "HTTPS only" [SHORTCUTS_HELP] LEGEND_SHORTCUTS_HELP = "Keyboard shortcuts help" diff --git a/rainloop/v/0.0.0/langs/nl.ini b/rainloop/v/0.0.0/langs/nl.ini index 6dd376ef4..52dadcc1a 100644 --- a/rainloop/v/0.0.0/langs/nl.ini +++ b/rainloop/v/0.0.0/langs/nl.ini @@ -320,6 +320,12 @@ BUTTON_SIGN = "Ondertekenen" BUTTON_ENCRYPT = "Versleutelen" BUTTON_SIGN_AND_ENCRYPT = "Ondertekenen en versleutelen" +[POPUPS_MESSAGE_OPEN_PGP] +TITLE_MESSAGE_OPEN_PGP = "OpenPGP Decrypt" +LABEL_KEY = "Private Key" +LABEL_PASSWORD = "Password" +BUTTON_DECRYPT = "Decrypt" + [POPUPS_TWO_FACTOR_TEST] TITLE_TEST_CODE = "2-Stap verificatie test" LABEL_CODE = "Code" @@ -601,6 +607,7 @@ BUTTON_GENERATE_OPEN_PGP_KEYS = "Genereer OpenPGP sleutels" TITLE_PRIVATE = "Privé sleutel" TITLE_PUBLIC = "Publieke sleutel" DELETING_ASK = "Weet u het zeker?" +GENERATE_ONLY_HTTPS = "HTTPS only" [SHORTCUTS_HELP] LEGEND_SHORTCUTS_HELP = "Hulp bij toetsenbord sneltoetsen" diff --git a/rainloop/v/0.0.0/langs/no.ini b/rainloop/v/0.0.0/langs/no.ini index 0ce87263f..b9ca5977e 100644 --- a/rainloop/v/0.0.0/langs/no.ini +++ b/rainloop/v/0.0.0/langs/no.ini @@ -319,6 +319,12 @@ BUTTON_SIGN = "Signer" BUTTON_ENCRYPT = "Krypter" BUTTON_SIGN_AND_ENCRYPT = "Signer og krypter" +[POPUPS_MESSAGE_OPEN_PGP] +TITLE_MESSAGE_OPEN_PGP = "OpenPGP Decrypt" +LABEL_KEY = "Private Key" +LABEL_PASSWORD = "Password" +BUTTON_DECRYPT = "Decrypt" + [POPUPS_TWO_FACTOR_TEST] TITLE_TEST_CODE = "2-stegs verifiseringstest" LABEL_CODE = "Kode" @@ -600,6 +606,7 @@ BUTTON_GENERATE_OPEN_PGP_KEYS = "Generer OpenPGP-nøkler" TITLE_PRIVATE = "Privat" TITLE_PUBLIC = "Offentlig" DELETING_ASK = "Er du sikker?" +GENERATE_ONLY_HTTPS = "HTTPS only" [SHORTCUTS_HELP] LEGEND_SHORTCUTS_HELP = "Tastatursnarveier" diff --git a/rainloop/v/0.0.0/langs/pl.ini b/rainloop/v/0.0.0/langs/pl.ini index 99c2410d0..27bd84a7b 100644 --- a/rainloop/v/0.0.0/langs/pl.ini +++ b/rainloop/v/0.0.0/langs/pl.ini @@ -320,6 +320,12 @@ BUTTON_SIGN = "Podpisz" BUTTON_ENCRYPT = "Szyfruj" BUTTON_SIGN_AND_ENCRYPT = "Podpisz i szyfruj" +[POPUPS_MESSAGE_OPEN_PGP] +TITLE_MESSAGE_OPEN_PGP = "OpenPGP Decrypt" +LABEL_KEY = "Private Key" +LABEL_PASSWORD = "Password" +BUTTON_DECRYPT = "Decrypt" + [POPUPS_TWO_FACTOR_TEST] TITLE_TEST_CODE = "Test autoryzacji dwuskładnikowej" LABEL_CODE = "Kod" @@ -601,6 +607,7 @@ BUTTON_GENERATE_OPEN_PGP_KEYS = "Generuj klucz OpenPGP" TITLE_PRIVATE = "Prywatny" TITLE_PUBLIC = "Publiczny" DELETING_ASK = "Czy na pewno chcesz usunąć?" +GENERATE_ONLY_HTTPS = "HTTPS only" [SHORTCUTS_HELP] LEGEND_SHORTCUTS_HELP = "Skróty klawiaturowe" diff --git a/rainloop/v/0.0.0/langs/pt-br.ini b/rainloop/v/0.0.0/langs/pt-br.ini index 95b13403d..cde182e5e 100644 --- a/rainloop/v/0.0.0/langs/pt-br.ini +++ b/rainloop/v/0.0.0/langs/pt-br.ini @@ -320,6 +320,12 @@ BUTTON_SIGN = "Assinar" BUTTON_ENCRYPT = "Criptografar" BUTTON_SIGN_AND_ENCRYPT = "Assinar e criptografar" +[POPUPS_MESSAGE_OPEN_PGP] +TITLE_MESSAGE_OPEN_PGP = "OpenPGP Decrypt" +LABEL_KEY = "Private Key" +LABEL_PASSWORD = "Password" +BUTTON_DECRYPT = "Decrypt" + [POPUPS_TWO_FACTOR_TEST] TITLE_TEST_CODE = "Testar verificação de duas etapas" LABEL_CODE = "Código" @@ -601,6 +607,7 @@ BUTTON_GENERATE_OPEN_PGP_KEYS = "Gerar chave OpenPGP" TITLE_PRIVATE = "Privado" TITLE_PUBLIC = "Público" DELETING_ASK = "Você tem certeza?" +GENERATE_ONLY_HTTPS = "HTTPS only" [SHORTCUTS_HELP] LEGEND_SHORTCUTS_HELP = "Ajuda com os atalhos de teclado" diff --git a/rainloop/v/0.0.0/langs/pt-pt.ini b/rainloop/v/0.0.0/langs/pt-pt.ini index e8389bde4..4293851cd 100644 --- a/rainloop/v/0.0.0/langs/pt-pt.ini +++ b/rainloop/v/0.0.0/langs/pt-pt.ini @@ -320,6 +320,12 @@ BUTTON_SIGN = "Assinar" BUTTON_ENCRYPT = "Encriptar" BUTTON_SIGN_AND_ENCRYPT = "Assinar e encriptar" +[POPUPS_MESSAGE_OPEN_PGP] +TITLE_MESSAGE_OPEN_PGP = "OpenPGP Decrypt" +LABEL_KEY = "Private Key" +LABEL_PASSWORD = "Password" +BUTTON_DECRYPT = "Decrypt" + [POPUPS_TWO_FACTOR_TEST] TITLE_TEST_CODE = "Teste de verificação em 2-Etapas" LABEL_CODE = "Código" @@ -601,6 +607,7 @@ BUTTON_GENERATE_OPEN_PGP_KEYS = "Gerar chaves OpenPGP" TITLE_PRIVATE = "Privada" TITLE_PUBLIC = "Pública" DELETING_ASK = "Tem a certeza?" +GENERATE_ONLY_HTTPS = "HTTPS only" [SHORTCUTS_HELP] LEGEND_SHORTCUTS_HELP = "Ajuda para atalhos de teclado" diff --git a/rainloop/v/0.0.0/langs/ro.ini b/rainloop/v/0.0.0/langs/ro.ini index ac16663fa..bf2e49f5a 100644 --- a/rainloop/v/0.0.0/langs/ro.ini +++ b/rainloop/v/0.0.0/langs/ro.ini @@ -319,6 +319,12 @@ BUTTON_SIGN = "Sign" BUTTON_ENCRYPT = "Encrypt" BUTTON_SIGN_AND_ENCRYPT = "Sign and encrypt" +[POPUPS_MESSAGE_OPEN_PGP] +TITLE_MESSAGE_OPEN_PGP = "OpenPGP Decrypt" +LABEL_KEY = "Private Key" +LABEL_PASSWORD = "Password" +BUTTON_DECRYPT = "Decrypt" + [POPUPS_TWO_FACTOR_TEST] TITLE_TEST_CODE = "2-Step verification test" LABEL_CODE = "Code" @@ -600,6 +606,7 @@ BUTTON_GENERATE_OPEN_PGP_KEYS = "Generate OpenPGP Keys" TITLE_PRIVATE = "Private" TITLE_PUBLIC = "Public" DELETING_ASK = "Are you sure?" +GENERATE_ONLY_HTTPS = "HTTPS only" [SHORTCUTS_HELP] LEGEND_SHORTCUTS_HELP = "Keyboard shortcuts help" diff --git a/rainloop/v/0.0.0/langs/ru.ini b/rainloop/v/0.0.0/langs/ru.ini index 8a4d3a81a..719c2a901 100644 --- a/rainloop/v/0.0.0/langs/ru.ini +++ b/rainloop/v/0.0.0/langs/ru.ini @@ -320,6 +320,12 @@ BUTTON_SIGN = "Подпись" BUTTON_ENCRYPT = "Шифрование" BUTTON_SIGN_AND_ENCRYPT = "Подпись и шифрование" +[POPUPS_MESSAGE_OPEN_PGP] +TITLE_MESSAGE_OPEN_PGP = "OpenPGP Decrypt" +LABEL_KEY = "Private Key" +LABEL_PASSWORD = "Password" +BUTTON_DECRYPT = "Decrypt" + [POPUPS_TWO_FACTOR_TEST] TITLE_TEST_CODE = "Тест двухфакторной верификации" LABEL_CODE = "Код" @@ -601,6 +607,7 @@ BUTTON_GENERATE_OPEN_PGP_KEYS = "Новый OpenPGP ключ" TITLE_PRIVATE = "Приватный" TITLE_PUBLIC = "Публичный" DELETING_ASK = "Точно?" +GENERATE_ONLY_HTTPS = "HTTPS only" [SHORTCUTS_HELP] LEGEND_SHORTCUTS_HELP = "Сочетания клавиш" diff --git a/rainloop/v/0.0.0/langs/sk.ini b/rainloop/v/0.0.0/langs/sk.ini index 06151f11b..fdfcf753c 100644 --- a/rainloop/v/0.0.0/langs/sk.ini +++ b/rainloop/v/0.0.0/langs/sk.ini @@ -320,6 +320,12 @@ BUTTON_SIGN = "Sign" BUTTON_ENCRYPT = "Encrypt" BUTTON_SIGN_AND_ENCRYPT = "Sign and encrypt" +[POPUPS_MESSAGE_OPEN_PGP] +TITLE_MESSAGE_OPEN_PGP = "OpenPGP Decrypt" +LABEL_KEY = "Private Key" +LABEL_PASSWORD = "Password" +BUTTON_DECRYPT = "Decrypt" + [POPUPS_TWO_FACTOR_TEST] TITLE_TEST_CODE = "2-Step verification test" LABEL_CODE = "Code" @@ -601,6 +607,7 @@ BUTTON_GENERATE_OPEN_PGP_KEYS = "Generate OpenPGP Keys" TITLE_PRIVATE = "Private" TITLE_PUBLIC = "Public" DELETING_ASK = "Are you sure?" +GENERATE_ONLY_HTTPS = "HTTPS only" [SHORTCUTS_HELP] LEGEND_SHORTCUTS_HELP = "Keyboard shortcuts help" diff --git a/rainloop/v/0.0.0/langs/sv.ini b/rainloop/v/0.0.0/langs/sv.ini index 8e7572a74..b5b34a4e1 100644 --- a/rainloop/v/0.0.0/langs/sv.ini +++ b/rainloop/v/0.0.0/langs/sv.ini @@ -320,6 +320,12 @@ BUTTON_SIGN = "Singera" BUTTON_ENCRYPT = "Kryptera" BUTTON_SIGN_AND_ENCRYPT = "Signera och kryptera" +[POPUPS_MESSAGE_OPEN_PGP] +TITLE_MESSAGE_OPEN_PGP = "OpenPGP Decrypt" +LABEL_KEY = "Private Key" +LABEL_PASSWORD = "Password" +BUTTON_DECRYPT = "Decrypt" + [POPUPS_TWO_FACTOR_TEST] TITLE_TEST_CODE = "2-Stegs verifikations test" LABEL_CODE = "Kod" @@ -601,6 +607,7 @@ BUTTON_GENERATE_OPEN_PGP_KEYS = "Skapa OpenPGP nycklar" TITLE_PRIVATE = "Privat" TITLE_PUBLIC = "Publik" DELETING_ASK = "Är du säker?" +GENERATE_ONLY_HTTPS = "HTTPS only" [SHORTCUTS_HELP] LEGEND_SHORTCUTS_HELP = "Tangentbordsgenvägar hjälp" diff --git a/rainloop/v/0.0.0/langs/tr.ini b/rainloop/v/0.0.0/langs/tr.ini index bcf71ddc0..4f39a2960 100644 --- a/rainloop/v/0.0.0/langs/tr.ini +++ b/rainloop/v/0.0.0/langs/tr.ini @@ -320,6 +320,12 @@ BUTTON_SIGN = "Giriş Yap" BUTTON_ENCRYPT = "Şifrele" BUTTON_SIGN_AND_ENCRYPT = "Giriş Yap and şifrele" +[POPUPS_MESSAGE_OPEN_PGP] +TITLE_MESSAGE_OPEN_PGP = "OpenPGP Decrypt" +LABEL_KEY = "Private Key" +LABEL_PASSWORD = "Password" +BUTTON_DECRYPT = "Decrypt" + [POPUPS_TWO_FACTOR_TEST] TITLE_TEST_CODE = "2-Basamaklı doğrulama testi" LABEL_CODE = "Kod" @@ -599,6 +605,7 @@ BUTTON_GENERATE_OPEN_PGP_KEYS = "OpenPGP Key Oluştur" TITLE_PRIVATE = "Private" TITLE_PUBLIC = "Public" DELETING_ASK = "Eminmisiniz?" +GENERATE_ONLY_HTTPS = "HTTPS only" [SHORTCUTS_HELP] LEGEND_SHORTCUTS_HELP = "Klavye kısayolları yardım" diff --git a/rainloop/v/0.0.0/langs/ua.ini b/rainloop/v/0.0.0/langs/ua.ini index 459a9aba8..224e93f22 100644 --- a/rainloop/v/0.0.0/langs/ua.ini +++ b/rainloop/v/0.0.0/langs/ua.ini @@ -320,6 +320,12 @@ BUTTON_SIGN = "Підпис" BUTTON_ENCRYPT = "Шифрування" BUTTON_SIGN_AND_ENCRYPT = "Підпис и шифрування" +[POPUPS_MESSAGE_OPEN_PGP] +TITLE_MESSAGE_OPEN_PGP = "OpenPGP Decrypt" +LABEL_KEY = "Private Key" +LABEL_PASSWORD = "Password" +BUTTON_DECRYPT = "Decrypt" + [POPUPS_TWO_FACTOR_TEST] TITLE_TEST_CODE = "Тест двофакторної верифікації" LABEL_CODE = "Код" @@ -601,6 +607,7 @@ BUTTON_GENERATE_OPEN_PGP_KEYS = "Новий OpenPGP ключ" TITLE_PRIVATE = "Приватний" TITLE_PUBLIC = "Публічний" DELETING_ASK = "Впевнені?" +GENERATE_ONLY_HTTPS = "HTTPS only" [SHORTCUTS_HELP] LEGEND_SHORTCUTS_HELP = "Сполучення клавіш" diff --git a/rainloop/v/0.0.0/langs/zh-cn.ini b/rainloop/v/0.0.0/langs/zh-cn.ini index 1fae374cc..8fad0b3f2 100644 --- a/rainloop/v/0.0.0/langs/zh-cn.ini +++ b/rainloop/v/0.0.0/langs/zh-cn.ini @@ -320,6 +320,12 @@ BUTTON_SIGN = "Sign" BUTTON_ENCRYPT = "Encrypt" BUTTON_SIGN_AND_ENCRYPT = "Sign and encrypt" +[POPUPS_MESSAGE_OPEN_PGP] +TITLE_MESSAGE_OPEN_PGP = "OpenPGP Decrypt" +LABEL_KEY = "Private Key" +LABEL_PASSWORD = "Password" +BUTTON_DECRYPT = "Decrypt" + [POPUPS_TWO_FACTOR_TEST] TITLE_TEST_CODE = "两步验证测试" LABEL_CODE = "代码" @@ -601,6 +607,7 @@ BUTTON_GENERATE_OPEN_PGP_KEYS = "生成 OpenPGP 密匙" TITLE_PRIVATE = "私有" TITLE_PUBLIC = "公开" DELETING_ASK = "你确定吗?" +GENERATE_ONLY_HTTPS = "HTTPS only" [SHORTCUTS_HELP] LEGEND_SHORTCUTS_HELP = "Keyboard shortcuts help" diff --git a/rainloop/v/0.0.0/langs/zh-tw.ini b/rainloop/v/0.0.0/langs/zh-tw.ini index d0cb7ab5f..9c4e257b2 100644 --- a/rainloop/v/0.0.0/langs/zh-tw.ini +++ b/rainloop/v/0.0.0/langs/zh-tw.ini @@ -320,6 +320,12 @@ BUTTON_SIGN = "Sign" BUTTON_ENCRYPT = "Encrypt" BUTTON_SIGN_AND_ENCRYPT = "Sign and encrypt" +[POPUPS_MESSAGE_OPEN_PGP] +TITLE_MESSAGE_OPEN_PGP = "OpenPGP Decrypt" +LABEL_KEY = "Private Key" +LABEL_PASSWORD = "Password" +BUTTON_DECRYPT = "Decrypt" + [POPUPS_TWO_FACTOR_TEST] TITLE_TEST_CODE = "兩步驗證測試" LABEL_CODE = "代碼" @@ -601,6 +607,7 @@ BUTTON_GENERATE_OPEN_PGP_KEYS = "生成 OpenPGP 密鑰" TITLE_PRIVATE = "私有" TITLE_PUBLIC = "公開" DELETING_ASK = "你確定嗎?" +GENERATE_ONLY_HTTPS = "HTTPS only" [SHORTCUTS_HELP] LEGEND_SHORTCUTS_HELP = "Keyboard shortcuts help" diff --git a/vendors/openpgp/openpgp-0.10.1.worker.min.js b/vendors/openpgp/openpgp-0.10.1.worker.min.js new file mode 100644 index 000000000..91e75f58e --- /dev/null +++ b/vendors/openpgp/openpgp-0.10.1.worker.min.js @@ -0,0 +1 @@ +/*! OpenPGPjs.org this is LGPL licensed code, see LICENSE/our website for more information.- v0.10.1 - 2015-02-13 */!function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);throw new Error("Cannot find module '"+g+"'")}var j=c[g]={exports:{}};b[g][0].call(j.exports,function(a){var c=b[g][1][a];return e(c?c:a)},j,j.exports,a,b,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;g