- Mailtrain – {{#translate}}the best newsletter app{{/translate}} -
-``` - -### Managing Translations - -* Translations are loaded from Gettext MO files. In order to generate such files you need a Gettext translations editor. [POEdit](https://poedit.net/) is a great choice. - -* To create the translation catalog run `grunt` from command line. This fetches all translatable strings from JavaScript and Handlebars files and merges these into the translation catalog located at */languages/mailtrain.pot* - -* To add a new language use this catalog file as a source. Once you want to update your translation file from the updated catalog, select "Catalogue" -> "Update from POT file..." in POEdit and select mailtrain.pot. This will merge all the new translations from the POT file to your PO file. - - *If you have saved the PO file in [./languages](./languages) then POEdit should auto generate required MO file whenever you hit save for the PO file. - -* Once you have a correct MO file in the languages folder, edit Mailtrain config and set ["language" option](https://github.com/Mailtrain-org/mailtrain/blob/ba8bd1212335cb9bd7ba094beb7b5400f35cae6c/config/default.toml#L30-L31) to your language name. If the value is "et" then Mailtrain loads translations from ./languages/et.mo - -> **NB!** For now translation settings are global, so if you have set a translation in config then this applies to all users. An user can't select another translation than the default even if there is a translation file. This is because current Mailtrain code does not provide request context to functions and the functions generating strings do not know which language to use. - -## License - - * Versions 1.22.0 and up **GPL-V3.0** - * Versions 1.21.0 and up: **EUPL-1.1** - * Versions 1.19.0 and up: **MIT** - * Up to versions 1.18.0 **GPL-V3.0** diff --git a/index.js b/index.js index 9428aaf4..0e32dc0e 100644 --- a/index.js +++ b/index.js @@ -4,59 +4,27 @@ * Module dependencies. */ -const config = require('config'); -const log = require('npmlog'); -const app = require('./app'); -const http = require('http'); -const https = require('https'); -const fs = require('fs'); -const fork = require('child_process').fork; -const triggers = require('./services/triggers'); -const importer = require('./services/importer'); -const verpServer = require('./services/verp-server'); -const testServer = require('./services/test-server'); -const postfixBounceServer = require('./services/postfix-bounce-server'); -const tzupdate = require('./services/tzupdate'); -const feedcheck = require('./services/feedcheck'); -const dbcheck = require('./lib/dbcheck'); -const tools = require('./lib/tools'); -const reportProcessor = require('./lib/report-processor'); -const executor = require('./lib/executor'); -const privilegeHelpers = require('./lib/privilege-helpers'); +let config = require('config'); +let log = require('npmlog'); +let app = require('./app'); +let http = require('http'); let port = config.www.port; -let host = config.www.host; - -if (config.title) { - process.title = config.title; -} log.level = config.log.level; app.set('port', port); /** - * Create HTTP/HTTPS server. + * Create HTTP server. */ -let server = (!config.www.https) ? http.createServer(app) : https.createServer({ - cert: fs.readFileSync(config.www.cert), - key: fs.readFileSync(config.www.key), - ca: config.www.ca ? fs.readFileSync(config.www.ca) : undefined, - dhparams: config.www.dhparams ? fs.readFileSync(config.www.dhparams) : undefined -}, app); +let server = http.createServer(app); -// Check if database needs upgrading before starting the server -dbcheck(err => { - if (err) { - log.error('DB', err.message || err); - return process.exit(1); - } - /** - * Listen on provided port, on all network interfaces. - */ - server.listen(port, host); -}); +/** + * Listen on provided port, on all network interfaces. + */ +server.listen(port); server.on('error', err => { if (err.syscall !== 'listen') { @@ -69,87 +37,24 @@ server.on('error', err => { switch (err.code) { case 'EACCES': log.error('Express', '%s requires elevated privileges', bind); - return process.exit(1); + process.exit(1); + break; case 'EADDRINUSE': log.error('Express', '%s is already in use', bind); - return process.exit(1); + process.exit(1); + break; default: throw err; } }); -function spawnSenders(callback) { - let processes = Math.max(Number(config.queue.processes) || 1, 1); - let spawned = 0; - let returned = false; - - if (processes > 1 && !config.redis.enabled) { - log.error('Queue', '%s processes requested but Redis is not enabled, spawning 1 process', processes); - processes = 1; - } - - let spawnSender = function () { - if (spawned >= processes) { - if (!returned) { - returned = true; - return callback(); - } - return false; - } - - let child = fork(__dirname + '/services/sender.js', []); - let pid = child.pid; - tools.workers.add(child); - - child.on('close', (code, signal) => { - spawned--; - tools.workers.delete(child); - log.error('Child', 'Sender process %s exited with %s', pid, code || signal); - // Respawn after 5 seconds - setTimeout(() => spawnSender(), 5 * 1000).unref(); - }); - - spawned++; - setImmediate(spawnSender); - }; - - spawnSender(); -} - server.on('listening', () => { let addr = server.address(); let bind = typeof addr === 'string' ? 'pipe ' + addr : 'port ' + addr.port; log.info('Express', 'WWW server listening on %s', bind); - // start additional services - function startNextServices() { - testServer(() => { - verpServer(() => { - - privilegeHelpers.dropRootPrivileges(); - - tzupdate(() => { - importer(() => { - triggers(() => { - spawnSenders(() => { - feedcheck(() => { - postfixBounceServer(() => { - reportProcessor.init(() => { - log.info('Service', 'All services started'); - }); - }); - }); - }); - }); - }); - }); - }); - }); - } - - if (config.reports && config.reports.enabled === true) { - executor.spawn(startNextServices); - } else { - startNextServices(); - } + // start sending loop + require('./services/sender'); // eslint-disable-line global-require + require('./services/importer'); // eslint-disable-line global-require + require('./services/testserver'); // eslint-disable-line global-require }); diff --git a/languages/de_DE.mo b/languages/de_DE.mo deleted file mode 100644 index 419808d4..00000000 Binary files a/languages/de_DE.mo and /dev/null differ diff --git a/languages/de_DE.po b/languages/de_DE.po deleted file mode 100644 index b5f10985..00000000 --- a/languages/de_DE.po +++ /dev/null @@ -1,4700 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-05-04 00:45+0200\n" -"PO-Revision-Date: 2018-03-07 14:12+0100\n" -"Last-Translator: \n" -"Language-Team: \n" -"Language: de_DE\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.0.6\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#: views/archive/layout.hbs:1 views/layout.hbs:1 -msgid "Self hosted email newsletter app" -msgstr "Selbst gehostete Newsletter-App" - -#: views/blacklist.hbs:1 views/campaigns/blacklisted.hbs:1 -#: views/campaigns/bounced.hbs:1 views/campaigns/campaigns.hbs:1 -#: views/campaigns/clicked.hbs:1 views/campaigns/complained.hbs:1 -#: views/campaigns/create-rss.hbs:1 views/campaigns/create-triggered.hbs:1 -#: views/campaigns/create.hbs:1 views/campaigns/delivered.hbs:1 -#: views/campaigns/edit-rss.hbs:1 views/campaigns/edit-triggered.hbs:1 -#: views/campaigns/edit.hbs:1 views/campaigns/opened.hbs:1 -#: views/campaigns/unsubscribed.hbs:1 views/campaigns/upload-attachment.hbs:1 -#: views/campaigns/view.hbs:1 views/lists/create.hbs:1 views/lists/edit.hbs:1 -#: views/lists/fields/create.hbs:1 views/lists/fields/edit.hbs:1 -#: views/lists/fields/fields.hbs:1 views/lists/forms/create.hbs:1 -#: views/lists/forms/edit.hbs:1 views/lists/forms/forms.hbs:1 -#: views/lists/lists.hbs:1 views/lists/segments/create.hbs:1 -#: views/lists/segments/edit.hbs:1 views/lists/segments/rule-configure.hbs:1 -#: views/lists/segments/rule-create.hbs:1 views/lists/segments/rule-edit.hbs:1 -#: views/lists/segments/segments.hbs:1 views/lists/segments/view.hbs:1 -#: views/lists/subscription/add.hbs:1 views/lists/subscription/edit.hbs:1 -#: views/lists/subscription/import-failed.hbs:1 -#: views/lists/subscription/import-preview.hbs:1 -#: views/lists/subscription/import.hbs:1 views/lists/view.hbs:1 -#: views/report-templates/create.hbs:1 views/report-templates/edit.hbs:1 -#: views/report-templates/report-templates.hbs:1 -#: views/reports/create-select-template.hbs:1 views/reports/create.hbs:1 -#: views/reports/edit.hbs:1 views/reports/output.hbs:1 -#: views/reports/reports.hbs:1 views/reports/view.hbs:1 views/settings.hbs:1 -#: views/templates/create.hbs:1 views/templates/edit.hbs:1 -#: views/templates/templates.hbs:1 views/triggers/create-select.hbs:1 -#: views/triggers/create.hbs:1 views/triggers/edit.hbs:1 -#: views/triggers/triggered.hbs:1 views/triggers/triggers.hbs:1 -#: views/users/account.hbs:1 views/users/api.hbs:1 views/users/forgot.hbs:1 -#: views/users/login.hbs:1 views/users/reset.hbs:1 app.js:169 -msgid "Home" -msgstr "Home" - -#: views/blacklist.hbs:2 views/blacklist.hbs:3 views/layout.hbs:7 -#: views/lists/subscription/edit.hbs:15 -msgid "Blacklist" -msgstr "Blacklist" - -#: views/blacklist.hbs:4 views/users/api.hbs:55 -msgid "Add email to blacklist" -msgstr "E-Mail Adresse zur Blacklist hinzufügen" - -#: views/blacklist.hbs:5 -msgid "Add" -msgstr "Hinzufügen" - -#: views/blacklist.hbs:6 -msgid "Email" -msgstr "E-Mail" - -#: views/campaigns/blacklisted.hbs:2 views/campaigns/bounced.hbs:2 -#: views/campaigns/campaigns.hbs:2 views/campaigns/campaigns.hbs:7 -#: views/campaigns/clicked.hbs:2 views/campaigns/complained.hbs:2 -#: views/campaigns/create-rss.hbs:2 views/campaigns/create-triggered.hbs:2 -#: views/campaigns/create.hbs:2 views/campaigns/delivered.hbs:2 -#: views/campaigns/edit-rss.hbs:2 views/campaigns/edit-triggered.hbs:2 -#: views/campaigns/edit.hbs:2 views/campaigns/opened.hbs:2 -#: views/campaigns/unsubscribed.hbs:2 views/campaigns/upload-attachment.hbs:2 -#: views/campaigns/view.hbs:2 lib/tools.js:126 routes/campaigns.js:35 -msgid "Campaigns" -msgstr "Kampagnen" - -#: views/campaigns/blacklisted.hbs:3 views/campaigns/blacklisted.hbs:4 -msgid "Blacklisted info" -msgstr "Blacklisted info" - -#: views/campaigns/blacklisted.hbs:5 views/campaigns/bounced.hbs:5 -#: views/campaigns/clicked.hbs:5 views/campaigns/complained.hbs:5 -#: views/campaigns/delivered.hbs:5 views/campaigns/edit-rss.hbs:5 -#: views/campaigns/edit-triggered.hbs:5 views/campaigns/edit.hbs:5 -#: views/campaigns/opened.hbs:5 views/campaigns/unsubscribed.hbs:5 -#: views/campaigns/upload-attachment.hbs:6 -msgid "View campaign" -msgstr "Kampagne ansehen" - -#: views/campaigns/blacklisted.hbs:6 -msgid "Subscribers who blacklisted by global blacklist:" -msgstr "Abonnenten, die von der globalen Blacklist aufgelistet wurden:" - -#: views/campaigns/blacklisted.hbs:7 views/campaigns/bounced.hbs:7 -#: views/campaigns/clicked.hbs:15 views/campaigns/complained.hbs:7 -#: views/campaigns/delivered.hbs:7 views/campaigns/opened.hbs:9 -#: views/campaigns/unsubscribed.hbs:7 -#: views/lists/subscription/import-failed.hbs:8 views/lists/view.hbs:19 -#: views/triggers/triggered.hbs:6 -msgid "Address" -msgstr "Adresse" - -#: views/campaigns/blacklisted.hbs:8 views/campaigns/bounced.hbs:8 -#: views/campaigns/clicked.hbs:16 views/campaigns/complained.hbs:8 -#: views/campaigns/delivered.hbs:8 views/campaigns/opened.hbs:10 -#: views/campaigns/unsubscribed.hbs:8 views/lists/subscription/add.hbs:6 -#: views/lists/subscription/edit.hbs:7 -#: views/lists/subscription/import-preview.hbs:7 views/lists/view.hbs:20 -#: views/subscription/partials/subscription-custom-fields.hbs:3 -#: views/triggers/triggered.hbs:7 -msgid "First Name" -msgstr "Vorname" - -#: views/campaigns/blacklisted.hbs:9 views/campaigns/bounced.hbs:9 -#: views/campaigns/clicked.hbs:17 views/campaigns/complained.hbs:9 -#: views/campaigns/delivered.hbs:9 views/campaigns/opened.hbs:11 -#: views/campaigns/unsubscribed.hbs:9 views/lists/subscription/add.hbs:7 -#: views/lists/subscription/edit.hbs:8 -#: views/lists/subscription/import-preview.hbs:8 views/lists/view.hbs:21 -#: views/subscription/partials/subscription-custom-fields.hbs:4 -#: views/triggers/triggered.hbs:8 -msgid "Last Name" -msgstr "Nachname" - -#: views/campaigns/blacklisted.hbs:10 -msgid "Reason" -msgstr "Grund" - -#: views/campaigns/blacklisted.hbs:11 -msgid "Time" -msgstr "Zeit" - -#: views/campaigns/bounced.hbs:3 views/campaigns/bounced.hbs:4 -msgid "Bounced info" -msgstr "Bounced Info" - -#: views/campaigns/bounced.hbs:6 -msgid "Subscribers who bounced and were unsubscribed:" -msgstr "Abonnenten, die bounced und abgemeldet wurden:" - -#: views/campaigns/bounced.hbs:10 views/campaigns/complained.hbs:10 -#: views/campaigns/delivered.hbs:10 views/campaigns/unsubscribed.hbs:10 -msgid "SMTP response" -msgstr "SMTP Antwort" - -#: views/campaigns/bounced.hbs:11 -msgid "Bounce time" -msgstr "Bounce Zeitpunkt" - -#: views/campaigns/campaigns.hbs:3 views/campaigns/create-triggered.hbs:25 -#: views/campaigns/create.hbs:3 views/campaigns/create.hbs:4 -#: views/campaigns/create.hbs:27 -msgid "Create Campaign" -msgstr "Kampagne erstellen" - -#: views/campaigns/campaigns.hbs:4 -msgid "Regular Campaign" -msgstr "Normale Kampagne" - -#: views/campaigns/campaigns.hbs:5 -msgid "RSS Campaign" -msgstr "RSS-Kampagne" - -#: views/campaigns/campaigns.hbs:6 -msgid "Triggered Campaign" -msgstr "Trigger-Kampagne" - -#: views/campaigns/campaigns.hbs:8 views/campaigns/create-rss.hbs:6 -#: views/campaigns/create-triggered.hbs:5 views/campaigns/create.hbs:5 -#: views/campaigns/edit-rss.hbs:8 views/campaigns/edit-triggered.hbs:9 -#: views/campaigns/edit.hbs:10 views/campaigns/view.hbs:73 -#: views/lists/create.hbs:5 views/lists/edit.hbs:6 -#: views/lists/fields/fields.hbs:6 views/lists/forms/forms.hbs:6 -#: views/lists/lists.hbs:5 views/lists/segments/segments.hbs:6 -#: views/report-templates/partials/report-template-fields.hbs:1 -#: views/report-templates/report-templates.hbs:10 -#: views/reports/partials/report-fields.hbs:1 -#: views/reports/partials/report-fields.hbs:5 -#: views/reports/partials/report-fields.hbs:9 views/reports/reports.hbs:6 -#: views/templates/templates.hbs:5 views/triggers/triggers.hbs:5 -msgid "Name" -msgstr "Name" - -#: views/campaigns/campaigns.hbs:9 views/campaigns/create-rss.hbs:8 -#: views/campaigns/create-triggered.hbs:7 views/campaigns/create.hbs:7 -#: views/campaigns/edit-rss.hbs:10 views/campaigns/edit-triggered.hbs:11 -#: views/campaigns/edit.hbs:12 views/campaigns/view.hbs:74 -#: views/lists/create.hbs:7 views/lists/edit.hbs:10 -#: views/lists/forms/edit.hbs:9 views/lists/forms/forms.hbs:7 -#: views/lists/lists.hbs:8 views/mosaico/editor.hbs:3 -#: views/partials/merge-tag-reference.hbs:4 -#: views/report-templates/partials/report-template-fields.hbs:3 -#: views/report-templates/report-templates.hbs:11 -#: views/reports/partials/report-fields.hbs:3 -#: views/reports/partials/report-fields.hbs:6 views/reports/reports.hbs:8 -#: views/templates/create.hbs:9 views/templates/edit.hbs:8 -#: views/templates/templates.hbs:6 views/triggers/create.hbs:7 -#: views/triggers/edit.hbs:8 views/triggers/triggers.hbs:7 -msgid "Description" -msgstr "Beschreibung" - -#: views/campaigns/campaigns.hbs:10 views/campaigns/view.hbs:75 -#: views/lists/view.hbs:22 views/lists/view.hbs:30 -#: views/triggers/triggers.hbs:6 -msgid "Status" -msgstr "Status" - -#: views/campaigns/campaigns.hbs:11 views/campaigns/view.hbs:76 -#: views/lists/view.hbs:23 views/lists/view.hbs:24 -#: views/report-templates/report-templates.hbs:12 -#: views/reports/partials/report-fields.hbs:7 views/reports/reports.hbs:9 -msgid "Created" -msgstr "Erstellt" - -#: views/campaigns/clicked.hbs:3 views/campaigns/clicked.hbs:4 -msgid "Link info" -msgstr "Link Info" - -#: views/campaigns/clicked.hbs:6 views/campaigns/view.hbs:63 -msgid "URL" -msgstr "URL" - -#: views/campaigns/clicked.hbs:7 views/campaigns/view.hbs:64 -msgid "Clicks" -msgstr "Klicks" - -#: views/campaigns/clicked.hbs:8 views/campaigns/view.hbs:65 -msgid "% of clicks" -msgstr "% der Klicks" - -#: views/campaigns/clicked.hbs:9 views/campaigns/view.hbs:66 -msgid "% of messages" -msgstr "% der Nachrichten" - -#: views/campaigns/clicked.hbs:10 views/campaigns/view.hbs:69 -msgid "Aggregated clicks" -msgstr "Aggregierte Klicks" - -#: views/campaigns/clicked.hbs:11 -msgid "Subscribers who clicked on a link:" -msgstr "Abonnenten welche einen Link geklickt haben:" - -#: views/campaigns/clicked.hbs:12 -msgid "Subscribers who clicked on this link:" -msgstr "Abonnenten welche diesen Link geklickt haben:" - -#: views/campaigns/clicked.hbs:13 views/campaigns/opened.hbs:7 -msgid "Stats by country" -msgstr "Statistik: Land" - -#: views/campaigns/clicked.hbs:14 views/campaigns/opened.hbs:8 -msgid "Stats by device type" -msgstr "Statistik: Gerätetyp" - -#: views/campaigns/clicked.hbs:18 -msgid "First click time" -msgstr "Erste Klickzeit" - -#: views/campaigns/clicked.hbs:19 -msgid "Click count" -msgstr "Anzahl Klicks" - -#: views/campaigns/complained.hbs:3 views/campaigns/complained.hbs:4 -msgid "Complained info" -msgstr "Beschwerde Info" - -#: views/campaigns/complained.hbs:6 -msgid "Subscribers who complained and were unsubscribed:" -msgstr "Abonnenten welche sich beschwert haben und deabonniert wurden:" - -#: views/campaigns/complained.hbs:11 -msgid "Complain time" -msgstr "Zeitpunkt der Beschwerde" - -#: views/campaigns/create-rss.hbs:3 views/campaigns/create-rss.hbs:4 -#: views/campaigns/create-rss.hbs:20 -msgid "Create RSS Campaign" -msgstr "RSS-Kampagne erstellen" - -#: views/campaigns/create-rss.hbs:5 views/campaigns/edit-rss.hbs:6 -msgid "" -"RSS campaign sets up a tracker against selected RSS feed address. Whenever a " -"new entry is found from this feed it is sent to selected list as an email " -"message." -msgstr "" -"Eine RSS-Kampagne setzt einen Tracker auf den gewählten RSS-Feed. Wenn ein " -"neuer Eintrag in diesem Feed gefunden wird, wird er als E-Mail an die " -"ausgewählte Liste gesendet." - -#: views/campaigns/create-rss.hbs:7 views/campaigns/create-triggered.hbs:6 -#: views/campaigns/create.hbs:6 views/campaigns/edit-rss.hbs:9 -#: views/campaigns/edit-triggered.hbs:10 views/campaigns/edit.hbs:11 -msgid "Campaign Name" -msgstr "Kampagnen Name" - -#: views/campaigns/create-rss.hbs:9 views/campaigns/create-triggered.hbs:8 -#: views/campaigns/create.hbs:8 views/campaigns/edit-rss.hbs:11 -#: views/campaigns/edit-triggered.hbs:12 views/campaigns/edit.hbs:13 -#: views/lists/create.hbs:8 views/lists/edit.hbs:11 -#: views/report-templates/partials/report-template-fields.hbs:4 -#: views/reports/partials/report-fields.hbs:4 views/templates/create.hbs:11 -#: views/templates/edit.hbs:10 views/triggers/create.hbs:9 -#: views/triggers/edit.hbs:10 -msgid "HTML is allowed" -msgstr "HTML ist erlaubt" - -#: views/campaigns/create-rss.hbs:10 views/campaigns/create-triggered.hbs:9 -#: views/campaigns/create.hbs:9 views/campaigns/edit-rss.hbs:12 -#: views/campaigns/edit-triggered.hbs:13 views/campaigns/edit.hbs:14 -#: views/campaigns/view.hbs:6 views/triggers/create-select.hbs:6 -#: views/triggers/create.hbs:10 views/triggers/edit.hbs:12 -#: views/triggers/triggers.hbs:8 -msgid "List" -msgstr "Liste" - -#: views/campaigns/create-rss.hbs:11 views/campaigns/create-triggered.hbs:10 -#: views/campaigns/create-triggered.hbs:14 views/campaigns/create.hbs:10 -#: views/campaigns/create.hbs:14 views/campaigns/edit-rss.hbs:13 -#: views/campaigns/edit-triggered.hbs:14 views/campaigns/edit.hbs:15 -#: views/lists/fields/create.hbs:27 views/lists/fields/edit.hbs:28 -#: views/lists/segments/create.hbs:9 views/lists/segments/edit.hbs:10 -#: views/lists/segments/rule-create.hbs:7 views/lists/subscription/add.hbs:10 -#: views/lists/subscription/add.hbs:12 views/lists/subscription/edit.hbs:11 -#: views/lists/subscription/import-preview.hbs:5 -#: views/reports/partials/report-select-template.hbs:2 -#: views/subscription/partials/subscription-custom-fields.hbs:9 -#: views/templates/create.hbs:8 views/triggers/create-select.hbs:7 -#: views/triggers/create.hbs:17 views/triggers/create.hbs:20 -#: views/triggers/create.hbs:22 views/triggers/create.hbs:26 -#: views/triggers/edit.hbs:19 views/triggers/edit.hbs:22 -#: views/triggers/edit.hbs:24 views/triggers/edit.hbs:28 -msgid "Select" -msgstr "Bitte wählen" - -#: views/campaigns/create-rss.hbs:12 views/campaigns/create-triggered.hbs:11 -#: views/campaigns/create.hbs:11 views/campaigns/edit-rss.hbs:14 -#: views/campaigns/edit-triggered.hbs:15 views/campaigns/edit.hbs:16 -#: views/triggers/create-select.hbs:8 views/triggers/create.hbs:11 -#: views/triggers/edit.hbs:13 -msgid "subscribers" -msgstr "Abonnenten" - -#: views/campaigns/create-rss.hbs:13 views/campaigns/edit-rss.hbs:15 -msgid "RSS Feed Url" -msgstr "RSS Feed URL" - -#: views/campaigns/create-rss.hbs:14 views/campaigns/edit-rss.hbs:16 -msgid "" -"New entries from this RSS URL are sent out to list subscribers as email " -"messages" -msgstr "" -"Neue Beiträge dieser RSS URL werden den Abonnenten als E-Mail-Nachrichten " -"zugestellt" - -#: views/campaigns/create-rss.hbs:15 views/campaigns/create-triggered.hbs:18 -#: views/campaigns/create.hbs:18 views/campaigns/edit-rss.hbs:18 -#: views/campaigns/edit-triggered.hbs:16 views/campaigns/edit.hbs:17 -#: views/campaigns/view.hbs:12 -msgid "Email \"from name\"" -msgstr "E-Mail \"von Name\"" - -#: views/campaigns/create-rss.hbs:16 views/campaigns/create-triggered.hbs:19 -#: views/campaigns/create.hbs:19 views/campaigns/edit-rss.hbs:19 -#: views/campaigns/edit-triggered.hbs:17 views/campaigns/edit.hbs:18 -#: views/settings.hbs:23 -msgid "This is the name your emails will come from" -msgstr "Dies ist der Absendername Ihrer E-Mails" - -#: views/campaigns/create-rss.hbs:17 views/campaigns/create-triggered.hbs:20 -#: views/campaigns/create.hbs:20 views/campaigns/edit-rss.hbs:20 -#: views/campaigns/edit-triggered.hbs:18 views/campaigns/edit.hbs:19 -#: views/campaigns/view.hbs:13 -msgid "Email \"from\" address" -msgstr "E-Mail \"von Adresse\"" - -#: views/campaigns/create-rss.hbs:18 views/campaigns/create-triggered.hbs:21 -#: views/campaigns/edit-rss.hbs:21 views/campaigns/edit-triggered.hbs:19 -#: views/settings.hbs:25 -msgid "This is the address people will send replies to" -msgstr "Dies ist die Reply-To Adresse" - -#: views/campaigns/create-rss.hbs:19 views/campaigns/create-triggered.hbs:24 -#: views/campaigns/create.hbs:28 views/campaigns/edit-rss.hbs:22 -#: views/campaigns/edit-triggered.hbs:22 views/campaigns/edit.hbs:27 -msgid "Disable opened tracking" -msgstr "Deaktiviere das Tracking beim Öffnen der E-Mail (Zählpixel)" - -#: views/campaigns/create-rss.hbs:20 views/campaigns/create-triggered.hbs:25 -#: views/campaigns/create.hbs:29 views/campaigns/edit-rss.hbs:23 -#: views/campaigns/edit-triggered.hbs:23 views/campaigns/edit.hbs:28 -msgid "Disable clicked tracking" -msgstr "Deaktiviere das Tracking beim Klicken von Links" - -#: views/campaigns/create-triggered.hbs:3 -#: views/campaigns/create-triggered.hbs:4 -msgid "Create Triggered Campaign" -msgstr "Trigger-Kampagne erstellen" - -#: views/campaigns/create-triggered.hbs:12 views/campaigns/create.hbs:12 -#: views/campaigns/edit-triggered.hbs:7 views/campaigns/edit.hbs:7 -#: views/lists/fields/create.hbs:31 views/lists/fields/edit.hbs:33 -#: views/reports/reports.hbs:7 views/templates/create.hbs:13 -msgid "Template" -msgstr "Vorlage" - -#: views/campaigns/create-triggered.hbs:13 views/campaigns/create.hbs:13 -msgid "Select a template:" -msgstr "Vorlage auswählen:" - -#: views/campaigns/create-triggered.hbs:15 views/campaigns/create.hbs:15 -msgid "Selecting a template creates a campaign specific copy from it" -msgstr "" -"Wenn Sie eine Vorlage auswählen, wird eine Kopie nur für diese Kampagne erstellt" - -#: views/campaigns/create-triggered.hbs:16 views/campaigns/create.hbs:16 -msgid "Or alternatively use an URL as the message content source:" -msgstr "" -"Oder alternativ können Sie eine URL als Quelle für den E-Mail Inhalt verwenden:" - -#: views/campaigns/create-triggered.hbs:17 views/campaigns/create.hbs:17 -#: views/campaigns/edit-triggered.hbs:25 views/campaigns/edit.hbs:28 -msgid "" -"If a message is sent then this URL will be POSTed to using Merge Tags as " -"POST body. Use this if you want to generate the HTML message yourself" -msgstr "" -"Wenn eine Nachricht gesendet wird, wird diese URL per POST Request " -"aufgerufen mit den Merge-Tags als POST-Body. Verwenden Sie diese Funktion, " -"wenn Sie die HTML-Nachricht selbst generieren möchten" - -#: views/campaigns/create-triggered.hbs:22 views/campaigns/create.hbs:24 -#: views/campaigns/edit-triggered.hbs:20 views/campaigns/edit.hbs:23 -#: views/campaigns/view.hbs:15 -msgid "Email \"subject line\"" -msgstr "E-Mail Betreffzeile" - -#: views/campaigns/create-triggered.hbs:23 views/campaigns/create.hbs:25 -#: views/campaigns/edit-triggered.hbs:21 views/campaigns/edit.hbs:24 -#: views/settings.hbs:27 -msgid "Keep it relevant and non-spammy" -msgstr "Halten Sie den Inhalt relevant und frei von Spam" - -#: views/campaigns/create.hbs:21 views/campaigns/edit.hbs:20 -msgid "" -"This is the address people will send replies to unless reply-to address is " -"set" -msgstr "" -"Dies ist die Adresse, an welche Antworten gesendet werden, ausser die " -"Kampagnenspezifische \"reply-to\" Adresse ist definiert" - -#: views/campaigns/create.hbs:22 views/campaigns/edit.hbs:21 -#: views/campaigns/view.hbs:14 -msgid "Email \"reply-to\" address" -msgstr "E-Mail \"reply-to\" Adresse" - -#: views/campaigns/create.hbs:23 views/campaigns/edit.hbs:22 -msgid "If set, this is the address people will send replies to" -msgstr "" -"Falls gesetzt, ist dies die Adresse an welche E-Mail-Antworten gesendet " -"werden" - -#: views/campaigns/create.hbs:26 views/campaigns/edit.hbs:25 -msgid "Custom unsubscribe (URL)" -msgstr "Benutzerdefiniertes Deabonnement (URL)" - -#: views/campaigns/create.hbs:27 views/campaigns/edit.hbs:26 -msgid "Set a custom unsubscribe url" -msgstr "Geben Sie eine eigene URL an, die den Abonnenten zum Abmelden angezeigt wird" - -#: views/campaigns/delivered.hbs:3 views/campaigns/delivered.hbs:4 -msgid "Delivered info" -msgstr "Zustellungs Info" - -#: views/campaigns/delivered.hbs:6 -msgid "Subscribers who received the message and did not bounce/unsubscribe:" -msgstr "" -"Abonnenten, welche die Nachricht erfolgreich erhalten (kein \"bounce\") und " -"nicht deabonniert haben:" - -#: views/campaigns/delivered.hbs:11 -msgid "Delivery time" -msgstr "Zugestellt am" - -#: views/campaigns/edit-rss.hbs:3 views/campaigns/edit-rss.hbs:4 -msgid "Edit RSS Campaign" -msgstr "RSS-Kampagne bearbeiten" - -#: views/campaigns/edit-rss.hbs:7 views/campaigns/edit-triggered.hbs:8 -#: views/campaigns/edit.hbs:9 views/settings.hbs:4 views/users/account.hbs:6 -msgid "General Settings" -msgstr "Allgemeine Einstellungen" - -#: views/campaigns/edit-rss.hbs:17 -msgid "" -"Use special merge tag [RSS_ENTRY] to mark the position for the RSS post " -"content. Additionally you can use any valid merge tag as well." -msgstr "" -"Verwenden Sie den speziellen Merge-Tag [RSS ENTRY], um die Position für den " -"RSS-Beitrag zu markieren. Zusätzlich können Sie auch alle gültigen Merge-" -"Tags verwenden." - -#: views/campaigns/edit-rss.hbs:23 views/campaigns/edit-triggered.hbs:26 -#: views/campaigns/edit.hbs:34 -msgid "Delete Campaign" -msgstr "Kampagne löschen" - -#: views/campaigns/edit-rss.hbs:24 views/campaigns/edit-triggered.hbs:27 -#: views/campaigns/edit.hbs:35 views/lists/edit.hbs:17 -#: views/lists/fields/edit.hbs:39 views/lists/forms/edit.hbs:29 -#: views/lists/forms/forms.hbs:12 views/lists/segments/edit.hbs:14 -#: views/lists/segments/rule-edit.hbs:38 views/lists/subscription/edit.hbs:18 -#: views/reports/edit.hbs:6 views/settings.hbs:99 views/templates/edit.hbs:12 -#: views/triggers/edit.hbs:30 views/users/account.hbs:18 -msgid "Update" -msgstr "Aktualisieren" - -#: views/campaigns/edit-triggered.hbs:3 views/campaigns/edit-triggered.hbs:4 -msgid "Edit Triggered Campaign" -msgstr "Trigger-Kampagne bearbeiten" - -#: views/campaigns/edit-triggered.hbs:6 views/campaigns/edit.hbs:6 -#: routes/forms.js:143 -msgid "General" -msgstr "Generell" - -#: views/campaigns/edit-triggered.hbs:23 views/campaigns/edit.hbs:26 -msgid "Template Settings" -msgstr "Vorlagen Einstellungen" - -#: views/campaigns/edit-triggered.hbs:24 views/campaigns/edit.hbs:27 -msgid "Template URL" -msgstr "Vorlagen URL" - -#: views/campaigns/edit.hbs:3 views/campaigns/edit.hbs:4 -#: views/campaigns/upload-attachment.hbs:3 -#: views/campaigns/upload-attachment.hbs:5 views/campaigns/view.hbs:3 -msgid "Edit Campaign" -msgstr "Kampagne bearbeiten" - -#: views/campaigns/edit.hbs:8 views/campaigns/edit.hbs:29 -msgid "Attachments" -msgstr "Anhänge" - -#: views/campaigns/edit.hbs:30 -msgid "File" -msgstr "Datei" - -#: views/campaigns/edit.hbs:31 -msgid "Size" -msgstr "Grösse" - -#: views/campaigns/edit.hbs:32 views/campaigns/view.hbs:68 -#: views/lists/fields/fields.hbs:12 views/lists/forms/forms.hbs:9 -#: views/lists/view.hbs:33 -msgid "No data available in table" -msgstr "Keine Daten verfügbar in dieser Tabelle" - -#: views/campaigns/edit.hbs:33 views/campaigns/upload-attachment.hbs:4 -msgid "Add Attachment" -msgstr "Datei hinzufügen" - -#: views/campaigns/opened.hbs:3 views/campaigns/opened.hbs:4 -msgid "Opened info" -msgstr "Öffnungs Info" - -#: views/campaigns/opened.hbs:6 -msgid "Subscribers who opened this message:" -msgstr "Abonnenten, die diese Nachricht geöffnet haben:" - -#: views/campaigns/opened.hbs:12 -msgid "First open" -msgstr "Erstmals geöffnet" - -#: views/campaigns/opened.hbs:13 -msgid "Opened count" -msgstr "Anzahl Öffnungen" - -#: views/campaigns/unsubscribed.hbs:3 views/campaigns/unsubscribed.hbs:4 -msgid "Unsubscribed info" -msgstr "Deabonnement Info" - -#: views/campaigns/unsubscribed.hbs:6 -msgid "Subscribers who unsubscribed:" -msgstr "Abonnenten welche deabonnierten:" - -#: views/campaigns/unsubscribed.hbs:11 views/campaigns/view.hbs:28 -#: views/lists/subscription/import.hbs:10 routes/lists.js:202 -msgid "Unsubscribed" -msgstr "Deabonniert" - -#: views/campaigns/upload-attachment.hbs:7 -msgid "Upload" -msgstr "Hochladen" - -#: views/campaigns/view.hbs:4 -msgid "Overview" -msgstr "Übersicht" - -#: views/campaigns/view.hbs:5 -msgid "Links" -msgstr "Links" - -#: views/campaigns/view.hbs:7 -msgid "Feed URL" -msgstr "Feed URL" - -#: views/campaigns/view.hbs:8 -msgid "Last check" -msgstr "Letzter check" - -#: views/campaigns/view.hbs:9 -msgid "Not yet checked" -msgstr "Noch nicht geprüft" - -#: views/campaigns/view.hbs:10 -msgid "activate campaign to start checking feed for new messages" -msgstr "" -"Aktivieren Sie die Kampagne, um die Überprüfung des Feeds auf neue " -"Nachrichten zu starten" - -#: views/campaigns/view.hbs:11 -msgid "RSS status" -msgstr "RSS Status" - -#: views/campaigns/view.hbs:16 -msgid "Preview campaign as" -msgstr "Kampagnen Vorschau als" - -#: views/campaigns/view.hbs:17 -msgid "Add new test user" -msgstr "Neuen Testbenutzer hinzufügen" - -#: views/campaigns/view.hbs:18 -msgid "No test users yet, create one here" -msgstr "Noch keine Testbenutzer vorhanden, erstellen Sie einen hier" - -#: views/campaigns/view.hbs:19 -msgid "Go" -msgstr "Los" - -#: views/campaigns/view.hbs:20 lib/models/triggers.js:26 -msgid "Delivered" -msgstr "Zugestellt" - -#: views/campaigns/view.hbs:21 -msgid "List subscribers who received this message" -msgstr "Abonnenten dieser Liste, die diese Nachricht erhalten haben" - -#: views/campaigns/view.hbs:22 -msgid "Blacklisted" -msgstr "Blacklisted" - -#: views/campaigns/view.hbs:23 -msgid "List subscribers who blacklisted by global blacklist" -msgstr "Abonnenten, die von der globalen Blacklist aufgelistet wurden" - -#: views/campaigns/view.hbs:24 routes/lists.js:202 -msgid "Bounced" -msgstr "Bounced" - -#: views/campaigns/view.hbs:25 -msgid "List subscribers who bounced" -msgstr "Bounced Listen Abonnenten" - -#: views/campaigns/view.hbs:26 -msgid "Complaints" -msgstr "Beschwerden" - -#: views/campaigns/view.hbs:27 -msgid "List subscribers who complained for this message" -msgstr "Abonnenten, die sich über diese Nachricht beschwert haben" - -#: views/campaigns/view.hbs:29 -msgid "List subscribers who unsubscribed after this message" -msgstr "Abonnenten, die sich nach dieser Nachricht abgemeldet haben" - -#: views/campaigns/view.hbs:30 -msgid "Opened" -msgstr "Geöffnet" - -#: views/campaigns/view.hbs:31 -msgid "List subscribers who opened this message" -msgstr "Abonnenten, die diese Nachricht geöffnet haben" - -#: views/campaigns/view.hbs:32 -msgid "Clicked" -msgstr "Geklickt" - -#: views/campaigns/view.hbs:33 views/campaigns/view.hbs:70 -msgid "List subscribers who clicked on a link" -msgstr "Abonnenten, die auf einen Link geklickt haben" - -#: views/campaigns/view.hbs:34 -msgid "" -"Are you sure? This action would start sending messages to the selected list" -msgstr "" -"Sind Sie sicher? Diese Aktion wird mit dem Senden von Nachrichten an die " -"ausgewählte Liste beginnen" - -#: views/campaigns/view.hbs:35 -msgid "Delay sending" -msgstr "Senden verzögern" - -#: views/campaigns/view.hbs:36 -msgid "hours" -msgstr "Stunden" - -#: views/campaigns/view.hbs:37 -msgid "minutes" -msgstr "Minuten" - -#: views/campaigns/view.hbs:38 -msgid "Send to subscribers:" -msgstr "An Abonnenten senden:" - -#: views/campaigns/view.hbs:39 -msgid "Are you sure? This action would reset scheduling" -msgstr "Sind Sie sicher? Diese Aktion wird die Terminierung zurücksetzen" - -#: views/campaigns/view.hbs:40 -msgid "Cancel" -msgstr "Abbrechen" - -#: views/campaigns/view.hbs:41 -msgid "Sending scheduled" -msgstr "Senden geplant" - -#: views/campaigns/view.hbs:42 views/campaigns/view.hbs:54 -msgid "Pause" -msgstr "Pause" - -#: views/campaigns/view.hbs:43 routes/campaigns.js:253 -msgid "Sending" -msgstr "Am senden" - -#: views/campaigns/view.hbs:44 views/campaigns/view.hbs:48 -msgid "" -"Are you sure? This action would resume sending messages to the selected list" -msgstr "" -"Sind Sie sicher? Diese Aktion wird das Senden von E-Mails an die " -"ausgewählte Liste fortsetzen" - -#: views/campaigns/view.hbs:45 views/campaigns/view.hbs:49 -msgid "Are you sure? This action would reset all stats about current progress" -msgstr "" -"Sind Sie sicher? Diese Aktion würde alle Statistiken über den aktuellen " -"Fortschritt zurücksetzen" - -#: views/campaigns/view.hbs:46 -msgid "Resume" -msgstr "Fortsetzen" - -#: views/campaigns/view.hbs:47 views/campaigns/view.hbs:51 -msgid "Reset" -msgstr "Zurücksetzen" - -#: views/campaigns/view.hbs:50 -msgid "Continue" -msgstr "Weiter" - -#: views/campaigns/view.hbs:52 -msgid "" -"All messages sent! Hit \"Continue\" if you you want to send this campaign to " -"new subscribers" -msgstr "" -"Alle E-Mails gesendet! Klicken Sie auf \"Weiter\", wenn Sie diese Kampagne " -"an neue Abonnenten senden möchten" - -#: views/campaigns/view.hbs:53 -msgid "" -"Are you sure? This action would pause sending new entries in RSS feed as " -"email messages to the selected list" -msgstr "" -"Sind Sie sicher? Diese Aktion wird das Senden neuer Einträge des RSS-Feed " -"als E-Mail-Nachrichten an die ausgewählte Liste pausieren" - -#: views/campaigns/view.hbs:55 views/campaigns/view.hbs:59 -msgid "Campaign status:" -msgstr "Kampagnen Status:" - -#: views/campaigns/view.hbs:56 -msgid "ACTIVE" -msgstr "AKTIV" - -#: views/campaigns/view.hbs:57 -msgid "" -"Are you sure? This action would start sending new entries in RSS feed as " -"email messages to the selected list" -msgstr "" -"Sind Sie sicher? Diese Aktion würde neue RSS Feed Einträge als E-Mail-" -"Nachrichten der ausgewählten Liste zustellen" - -#: views/campaigns/view.hbs:58 -msgid "Activate" -msgstr "Aktivieren" - -#: views/campaigns/view.hbs:60 -msgid "INACTIVE" -msgstr "INAKTIV" - -#: views/campaigns/view.hbs:61 -msgid "" -"This is a triggered campaign. Messages are only sent to subscribers that hit " -"some trigger that invokes this campaign" -msgstr "" -"Dies ist eine Trigger-Kampagne. Nachrichten werden nur an Abonnenten " -"gesendet, die einen Trigger auslösen, der diese Kampagne aufruft" - -#: views/campaigns/view.hbs:62 -msgid "see more" -msgstr "mehr anzeigen" - -#: views/campaigns/view.hbs:67 -msgid "List subscribers who clicked this link" -msgstr "Abonnenten dieser Liste, die diesen Link geklickt haben" - -#: views/campaigns/view.hbs:71 -msgid "" -"Clicks are counted as unique subscribers that clicked on a specific link or " -"on any link (in aggregated view)" -msgstr "" -"Klicks werden als eindeutige Abonnenten gezählt, die auf einen bestimmten " -"Link oder auf irgendeinen Link geklickt haben (in der aggregierter Ansicht)" - -#: views/campaigns/view.hbs:72 -msgid "" -"If a new entry is found from campaign feed a new subcampaign is created of " -"that entry and it will be listed here" -msgstr "" -"Wenn ein neuer Eintrag aus dem Kampagnen-Feed gefunden wird, wird eine neue " -"Unterkampagne von diesem Eintrag erstellt und hier aufgelistet" - -#: views/emails/password-reset-html.hbs:1 -#: views/emails/password-reset-text.hbs:1 -msgid "Change your password" -msgstr "Ändern Sie Ihr Passwort" - -#: views/emails/password-reset-html.hbs:2 -#: views/emails/password-reset-text.hbs:2 -msgid "We have received a password change request for your Mailtrain account:" -msgstr "" -"Wir haben eine Anforderung zur Passwortänderungs für Ihr Mailtrain-Konto erhalten:" - -#: views/emails/password-reset-html.hbs:3 -#: views/emails/password-reset-text.hbs:3 -msgid "Reset password" -msgstr "Passwort zurücksetzen" - -#: views/emails/password-reset-html.hbs:4 -#: views/emails/password-reset-text.hbs:4 -msgid "" -"If you did not ask to change your password, then you can ignore this email " -"and your password will not be changed." -msgstr "" -"Wenn Sie Ihr Passwort nicht ändern wollen, können Sie diese E-" -"Mail einfach ignorieren." - -#: views/emails/rss-html.hbs:1 views/emails/stationery-html.hbs:3 -#: views/emails/stationery-text.hbs:3 -msgid "Preferences" -msgstr "Persönliche Einstellungen" - -#: views/emails/rss-html.hbs:2 views/emails/stationery-html.hbs:4 -#: views/emails/stationery-text.hbs:4 views/lists/subscription/edit.hbs:16 -#: views/subscription/partials/subscription-unsubscribe-form.hbs:2 -#: views/subscription/web-manage.mjml.hbs:3 -#: views/subscription/web-unsubscribe.mjml.hbs:1 -#: views/subscription/web-unsubscribe.mjml.hbs:3 routes/forms.js:213 -#: routes/lists.js:284 -msgid "Unsubscribe" -msgstr "Newsletter abbestellen" - -#: views/emails/rss-html.hbs:3 views/emails/stationery-html.hbs:5 -#: views/emails/stationery-text.hbs:5 -msgid "View this email in your browser" -msgstr "E-Mail im Browser ansehen" - -#: views/emails/stationery-html.hbs:1 views/emails/stationery-text.hbs:1 -msgid "Hey [FIRST_NAME/Customer]," -msgstr "Hallo [FIRST_NAME/Customer]," - -#: views/emails/stationery-html.hbs:2 views/emails/stationery-text.hbs:2 -msgid "Cheers," -msgstr "Viele Grüße," - -#: views/index.hbs:1 -msgid "List Management" -msgstr "Listen Management" - -#: views/index.hbs:2 -msgid "" -"Mailtrain allows you to easily manage even very large lists. Million " -"subscribers? Not a problem. You can add subscribers manually, through the " -"API or import from a CSV file. All lists come with support for custom fields " -"and merge tags as well." -msgstr "" -"Mailtrain ermöglicht es Ihnen, auch sehr große Listen zu verwalten. Millionen von " -"Abonnenten? Kein Problem. Sie können Abonnenten manuell über die API " -"hinzufügen oder aus einer CSV-Datei importieren. Für alle Listen können " -"zusätzliche Datenfelder und Merge Tags genutzt werden." - -#: views/index.hbs:3 views/index.hbs:7 views/index.hbs:10 views/index.hbs:13 -#: views/index.hbs:16 views/index.hbs:19 views/index.hbs:22 views/index.hbs:25 -#: views/index.hbs:28 -msgid "Show more" -msgstr "Zeige mehr" - -#: views/index.hbs:4 views/lists/fields/create.hbs:3 -#: views/lists/fields/edit.hbs:3 views/lists/fields/fields.hbs:3 -#: views/lists/fields/fields.hbs:5 views/lists/view.hbs:6 -msgid "Custom Fields" -msgstr "Zusätzliche Datenfelder" - -#: views/index.hbs:5 -msgid "" -"Text fields, numbers, drop downs or checkboxes, Mailtrain has them all. " -"Every custom field can be included in the generated newsletters through " -"merge tags." -msgstr "" -"Textfelder, Nummern, Dropdowns oder Checkboxen, Mailtrain bietet all das. " -"Jedes zusätzliche Feld kann in den generierten Newslettern über " -"Merge-Tags eingebunden werden." - -#: views/index.hbs:6 -msgid "Mailtrain also supports custom forms." -msgstr "Mailtrain bietet auch benutzerdefinierte Formulare." - -#: views/index.hbs:8 -msgid "List Segmentation" -msgstr "Listen Segmentierung" - -#: views/index.hbs:9 -msgid "" -"Send messages only to list subscribers that match predefined segmentation " -"rules. No need to create separate lists with small differences." -msgstr "" -"Senden Sie nur Nachrichten an Abonnenten, welche die vordefinierten " -"Segmentierungsregeln erfüllen. Es besteht keine Notwendigkeit, separate " -"Listen mit kleinen Unterschieden zu erstellen." - -#: views/index.hbs:11 -msgid "RSS Campaigns" -msgstr "RSS-Kampagnen" - -#: views/index.hbs:12 -msgid "" -"Setup Mailtrain to track RSS feeds and if a new entry is detected in a feed " -"then Mailtrain auto-generates a new campaign using entry data as message " -"contents and sends it to selected subscribers." -msgstr "" -"Mailtrain kann RSS-Feeds verfolgen und bei neuen Einträgen automatisch " -"eine neue Kampagne mit dem RSS-Beitrag als Nachrichteninhalt an die " -"ausgewählte Liste senden." - -#: views/index.hbs:14 -msgid "GPG Encryption" -msgstr "GPG Verschlüsselung" - -#: views/index.hbs:15 -msgid "" -"If a list has a custom field for a GPG Public Key set then subscribers can " -"upload their GPG public key to receive encrypted messages from the list." -msgstr "" -"Wenn für eine Liste ein benutzerdefiniertes Feld für den GPG-Public-Key " -"vorhanden ist, können Abonnenten ihren GPG-Public-Key hochladen, um " -"alle E-Mails verschlüsselt zu erhalten." - -#: views/index.hbs:17 -msgid "Click Stats" -msgstr "Klick Statistik" - -#: views/index.hbs:18 -msgid "" -"After a campaign is sent, check individual click statistics for every link " -"included in the message." -msgstr "" -"Nachdem eine Kampagne gesendet wurde, sind Klick-Statistiken für jeden in " -"der E-Mail-Nachricht enthaltener Link verfügbar." - -#: views/index.hbs:20 -msgid "Template Editors" -msgstr "Vorlagen Editoren" - -#: views/index.hbs:21 -msgid "" -"Mailtrain ships with GrapeJS and Mosaico built in, two advanced template " -"editors. Mailtrain also offers a code editor if you prefer to handcraft the " -"HTML yourself." -msgstr "" -"Mailtrain beinhaltet GrapeJS und Mosaico, zwei Programme zum Bearbeiten der " -"E-Mail-Vorlagen. Natürlich bietet Mailtrain auch einen Code-Editor, sofern " -"Sie den HTML Code selber erstellen möchten." - -#: views/index.hbs:23 -msgid "Send via Any Provider" -msgstr "Sende mit beliebigen Anbietern" - -#: views/index.hbs:24 -msgid "" -"Mailtrain recommends SendPulse even though you " -"can use any provider that supports SMTP protocol to send out your " -"newsletters. Bounce and complaints handling via webhooks is supported for " -"SES, SparkPost, SendGrid and Mailgun, also for Postfix and ZoneMTA." -msgstr "" -"Mailtrain empfiehlt SendPulse, obwohl Sie " -"jeden Provider verwenden können, der das SMTP-Protokoll unterstützt, um Ihre " -"Newsletter zu versenden. Bounce- und Reklamationsabwicklung werden über " -"Webhooks für SES, SparkPost, SendGrid und Mailgun unterstützt, auch für " -"Postfix und ZoneMTA." - -#: views/index.hbs:26 lib/tools.js:130 -msgid "Automation" -msgstr "Automatisierung" - -#: views/index.hbs:27 -msgid "" -"Define automation triggers to send specific messages when a user activates " -"the trigger." -msgstr "" -"Definieren Sie Automatisierungs-Trigger, um bestimmte Nachrichten zu senden, " -"wenn ein Benutzer den Trigger aktiviert." - -#: views/index.hbs:29 -msgid "Donate to Author" -msgstr "Dem Autor spenden" - -#: views/index.hbs:30 -msgid "Mailtrain is available under GPLv3 license and completely open source." -msgstr "Mailtrain ist unter GPLv3 Lizenz verfügbar und komplett offen." - -#: views/index.hbs:31 -msgid "" -"If you really like Mailtrain or your business benefits from it financially " -"then I would really appreciate a small donation to keep the Mailtrain " -"development engines running. You can either use Bitcoin or PayPal for " -"donations. My Bitcoin wallet is" -msgstr "" -"Wenn Sie Mailtrain wirklich mögen oder Ihr Geschäft davon finanziell " -"profitiert, würde ich eine kleine Spende sehr schätzen, um die Mailtrain-" -"Entwicklung am laufen zu halten. Sie können entweder per Bitcoin oder PayPal " -"spenden. Meine Bitcoin Adresse ist" - -#: views/index.hbs:32 -msgid "Or Donate Using Paypal" -msgstr "Oder spenden Sie mit PayPal" - -#: views/index.hbs:33 -msgid "Official Mailtrain Partners" -msgstr "Offizielle Mailtrain Partner" - -#: views/index.hbs:34 -msgid "" -"A reliable SMTP server, easy integration, and 12,000 messages a month free" -msgstr "" -"Ein zuverlässiger SMTP-Server, einfache Integration und 12.000 Nachrichten " -"pro Monat kostenlos" - -#: views/index.hbs:35 -msgid "Free, open source mail server solution" -msgstr "Kostenlose, Open Source Mail Server Lösung" - -#: views/layout.hbs:2 -msgid "Toggle navigation" -msgstr "Navigation umschalten" - -#: views/layout.hbs:3 -msgid "Wiki" -msgstr "Wiki" - -#: views/layout.hbs:4 -msgid "Blog" -msgstr "Blog" - -#: views/layout.hbs:5 views/users/account.hbs:2 views/users/account.hbs:3 -msgid "Account" -msgstr "Account" - -#: views/layout.hbs:6 views/settings.hbs:2 views/settings.hbs:3 -msgid "Settings" -msgstr "Einstellungen" - -#: views/layout.hbs:8 views/users/api.hbs:2 views/users/api.hbs:3 -msgid "API" -msgstr "API" - -#: views/layout.hbs:9 -msgid "Log out" -msgstr "Abmelden" - -#: views/layout.hbs:10 views/users/forgot.hbs:2 views/users/login.hbs:2 -#: views/users/login.hbs:3 views/users/login.hbs:9 views/users/reset.hbs:2 -msgid "Sign in" -msgstr "Anmelden" - -#: views/layout.hbs:11 -msgid "Self Hosted Newsletter App Built on Top of Nodemailer" -msgstr "Selbst gehostete Newsletter-App basierend auf Nodemailer" - -#: views/layout.hbs:12 views/layout.hbs:14 -msgid "Source on GitHub" -msgstr "Quellcode auf Github" - -#: views/layout.hbs:13 -msgid "Subscribe to Our Newsletter" -msgstr "Abonnieren Sie unseren Newsletter" - -#: views/lists/create.hbs:2 views/lists/edit.hbs:2 -#: views/lists/fields/create.hbs:2 views/lists/fields/edit.hbs:2 -#: views/lists/fields/fields.hbs:2 views/lists/forms/create.hbs:2 -#: views/lists/forms/edit.hbs:2 views/lists/forms/forms.hbs:2 -#: views/lists/lists.hbs:2 views/lists/lists.hbs:4 -#: views/lists/segments/create.hbs:2 views/lists/segments/edit.hbs:2 -#: views/lists/segments/rule-configure.hbs:2 -#: views/lists/segments/rule-create.hbs:2 views/lists/segments/rule-edit.hbs:2 -#: views/lists/segments/segments.hbs:2 views/lists/segments/view.hbs:2 -#: views/lists/subscription/add.hbs:2 views/lists/subscription/edit.hbs:2 -#: views/lists/subscription/import-failed.hbs:2 -#: views/lists/subscription/import-preview.hbs:2 -#: views/lists/subscription/import.hbs:2 views/lists/view.hbs:2 -#: lib/tools.js:118 routes/lists.js:59 -msgid "Lists" -msgstr "Listen" - -#: views/lists/create.hbs:3 views/lists/create.hbs:4 views/lists/create.hbs:10 -#: views/lists/lists.hbs:3 -msgid "Create List" -msgstr "Liste erstellen" - -#: views/lists/create.hbs:6 views/lists/edit.hbs:7 -msgid "List Name" -msgstr "Name der Liste" - -#: views/lists/create.hbs:9 views/lists/edit.hbs:15 -msgid "Allow public users to subscribe themselves" -msgstr "Allen erlauben, diese Liste selbst zu abonnieren" - -#: views/lists/create.hbs:11 views/lists/edit.hbs:17 -msgid "Unsubscription" -msgstr "Deabonnement" - -#: views/lists/create.hbs:12 views/lists/edit.hbs:18 -msgid "Select how an unsuscription request by subscriber is handled." -msgstr "" -"Wählen Sie, welche Schritte zum Abmelden von der Liste notwendig sein sollen." - -#: views/lists/edit.hbs:3 views/lists/edit.hbs:4 views/lists/view.hbs:8 -msgid "Edit List" -msgstr "Liste bearbeiten" - -#: views/lists/edit.hbs:5 -msgid "View List" -msgstr "Liste ansehen" - -#: views/lists/edit.hbs:8 -msgid "List ID" -msgstr "Listen ID" - -#: views/lists/edit.hbs:9 -msgid "This is the list ID displayed to the subscribers" -msgstr "Diese Listen ID wird den Abonnenten dargestellt" - -#: views/lists/edit.hbs:12 -msgid "Custom Form" -msgstr "Benutzerdefiniertes Formular" - -#: views/lists/edit.hbs:13 views/lists/forms/forms.hbs:11 -msgid "Default Mailtrain Form" -msgstr "Standard Mailtrain Formular" - -#: views/lists/edit.hbs:14 -msgid "" -"The custom form used for this list. You can create a form here." -msgstr "" -"Das Standard-Formular dieser Liste. Wenn Sie ein benutzerdefiniertes Formular " -"erstellen möchten, klicken Sie hier." - -#: views/lists/edit.hbs:19 -msgid "Unsubscribe Header" -msgstr "Deabonnement Header" - -#: views/lists/edit.hbs:20 -msgid "Do not send List-Unsubscribe headers" -msgstr "Sende keine Header zum Abmelden von der Liste" - -#: views/lists/edit.hbs:16 -msgid "Delete List" -msgstr "Liste löschen" - -#: views/lists/fields/create.hbs:4 -msgid "Create Field" -msgstr "Feld erstellen" - -#: views/lists/fields/create.hbs:5 views/lists/fields/fields.hbs:4 -msgid "Create Custom Field" -msgstr "zusäzliches Feld erstellen" - -#: views/lists/fields/create.hbs:6 views/lists/fields/create.hbs:7 -#: views/lists/fields/edit.hbs:7 views/lists/fields/edit.hbs:8 -msgid "Field Name" -msgstr "Feldnamen" - -#: views/lists/fields/create.hbs:8 views/lists/fields/edit.hbs:9 -msgid "Field Type" -msgstr "Feldtyp" - -#: views/lists/fields/create.hbs:9 views/lists/fields/edit.hbs:10 -#: lib/models/fields.js:17 -msgid "Text" -msgstr "Text" - -#: views/lists/fields/create.hbs:10 views/lists/fields/edit.hbs:11 -#: lib/models/fields.js:21 -msgid "Number" -msgstr "Nummer" - -#: views/lists/fields/create.hbs:11 views/lists/fields/edit.hbs:12 -#: lib/models/fields.js:18 -msgid "Website" -msgstr "Webseite" - -#: views/lists/fields/create.hbs:12 views/lists/fields/edit.hbs:13 -#: lib/models/fields.js:20 -msgid "GPG Public Key" -msgstr "GPG Public Key" - -#: views/lists/fields/create.hbs:13 views/lists/fields/edit.hbs:14 -#: lib/models/fields.js:19 -msgid "Multi-line text" -msgstr "Mehrzeiliger Text" - -#: views/lists/fields/create.hbs:14 views/lists/fields/edit.hbs:15 -msgid "JSON" -msgstr "JSON" - -#: views/lists/fields/create.hbs:15 views/lists/fields/edit.hbs:16 -msgid "Date" -msgstr "Datum" - -#: views/lists/fields/create.hbs:16 views/lists/fields/edit.hbs:17 -msgid "Date (MM/DD/YYYY)" -msgstr "Datum (MM/DD/YYYY)" - -#: views/lists/fields/create.hbs:17 views/lists/fields/edit.hbs:18 -#: lib/models/fields.js:26 -msgid "Date (DD/MM/YYYY)" -msgstr "Datum (DD/MM/YYYY)" - -#: views/lists/fields/create.hbs:18 views/lists/fields/edit.hbs:19 -msgid "Birthday" -msgstr "Geburtstag" - -#: views/lists/fields/create.hbs:19 views/lists/fields/edit.hbs:20 -#: lib/models/fields.js:27 -msgid "Birthday (MM/DD)" -msgstr "Geburtstag (MM/DD)" - -#: views/lists/fields/create.hbs:20 views/lists/fields/edit.hbs:21 -#: lib/models/fields.js:28 -msgid "Birthday (DD/MM)" -msgstr "Geburtstag (DD/MM)" - -#: views/lists/fields/create.hbs:21 views/lists/fields/edit.hbs:22 -msgid "Grouped" -msgstr "Gruppiert" - -#: views/lists/fields/create.hbs:22 views/lists/fields/edit.hbs:23 -msgid "Drop Downs" -msgstr "Dropdown" - -#: views/lists/fields/create.hbs:23 views/lists/fields/edit.hbs:24 -#: lib/models/fields.js:22 -msgid "Radio Buttons" -msgstr "Radio Buttons" - -#: views/lists/fields/create.hbs:24 views/lists/fields/edit.hbs:25 -#: lib/models/fields.js:23 -msgid "Checkboxes" -msgstr "Checkboxen" - -#: views/lists/fields/create.hbs:25 views/lists/fields/edit.hbs:26 -msgid "Option for a group value" -msgstr "Option für einen Gruppenwert" - -#: views/lists/fields/create.hbs:26 views/lists/fields/edit.hbs:27 -msgid "Group" -msgstr "Gruppe" - -#: views/lists/fields/create.hbs:28 views/lists/fields/edit.hbs:29 -msgid "Required for group options" -msgstr "Erforderlich für Gruppenoptionen" - -#: views/lists/fields/create.hbs:29 views/lists/fields/create.hbs:30 -#: views/lists/fields/edit.hbs:35 views/lists/fields/edit.hbs:36 -#: views/lists/fields/fields.hbs:9 -msgid "Default merge tag value" -msgstr "Standard Wert für Merge-Tag" - -#: views/lists/fields/create.hbs:32 views/lists/fields/edit.hbs:34 -msgid "" -"For group elements like checkboxes you can control the appearance of the " -"merge tag with an optional template. The template uses handlebars syntax and " -"you can find all values from{{values}} array, for example "
-"{{#each values}} {{this}} {{/each}}. If template is not defined "
-"then multiple values are joined with commas. You can also use this template "
-"to render JSON values (if the JSON is an array then the array is exposed as "
-"values, otherwise you can access the JSON keys directly)."
-msgstr ""
-"Für Gruppenelemente wie Checkboxen können Sie das Aussehen des Merge-Tags "
-"mit einer optionalen Vorlage steuern. Die Vorlage verwendet die Handlebars-"
-"Syntax und Sie können alle Werte des {{values}} Array finden, "
-"zB {{#each}} {{this}} {{/each}}. Wenn die Vorlage nicht "
-"definiert ist, werden mehrere Werte mit Kommas verbunden. Sie können diese "
-"Vorlage auch verwenden, um JSON-Werte zu rendern (wenn das JSON ein Array "
-"ist, dann ist das Array als values verfügbar, ansonsten können "
-"Sie direkt auf die JSON-Keys zugreifen)."
-
-#: views/lists/fields/create.hbs:33 views/lists/fields/edit.hbs:37
-msgid "Visible"
-msgstr "Sichtbar"
-
-#: views/lists/fields/create.hbs:34
-msgid "Add Field"
-msgstr "Feld hinzufügen"
-
-#: views/lists/fields/edit.hbs:4
-msgid "Edit Field"
-msgstr "Feld bearbeiten"
-
-#: views/lists/fields/edit.hbs:5
-msgid "Edit Custom Field"
-msgstr "Zusätzliches Feld bearbeiten"
-
-#: views/lists/fields/edit.hbs:6
-msgid "Back to fields"
-msgstr "Zurück zu den Feldern"
-
-#: views/lists/fields/edit.hbs:30 views/lists/fields/fields.hbs:8
-#: views/mosaico/editor.hbs:2 views/partials/merge-tag-reference.hbs:3
-msgid "Merge tag"
-msgstr "Merge-Tag"
-
-#: views/lists/fields/edit.hbs:31
-msgid "Merge Tag"
-msgstr "Merge-Tag"
-
-#: views/lists/fields/edit.hbs:32
-msgid "Put this tag in your content:"
-msgstr "Fügen Sie diesen Tag Ihrem Inhalt hinzu:"
-
-#: views/lists/fields/edit.hbs:38
-msgid "Delete Field"
-msgstr "Feld löschen"
-
-#: views/lists/fields/fields.hbs:7 views/lists/view.hbs:26
-#: views/report-templates/partials/report-template-fields.hbs:5
-msgid "Type"
-msgstr "Typ"
-
-#: views/lists/fields/fields.hbs:10 views/lists/fields/fields.hbs:11
-#: views/lists/forms/edit.hbs:22 views/lists/forms/forms.hbs:8
-#: views/lists/segments/segments.hbs:8 views/lists/segments/view.hbs:12
-#: views/triggers/triggers.hbs:14 routes/campaigns.js:276
-#: routes/campaigns.js:568 routes/campaigns.js:657 routes/campaigns.js:706
-#: routes/lists.js:166 routes/lists.js:253 routes/report-templates.js:51
-#: routes/templates.js:170 routes/triggers.js:297
-msgid "Edit"
-msgstr "Bearbeiten"
-
-#: views/lists/forms/create.hbs:3 views/lists/forms/edit.hbs:3
-#: views/lists/forms/forms.hbs:3 views/lists/forms/forms.hbs:5
-#: views/lists/view.hbs:5
-msgid "Custom Forms"
-msgstr "Benutzerdefinierte Formulare"
-
-#: views/lists/forms/create.hbs:4
-msgid "Create Form"
-msgstr "Formular erstellen"
-
-#: views/lists/forms/create.hbs:5 views/lists/forms/forms.hbs:4
-msgid "Create Custom Form"
-msgstr "Benutzerdefiniertes Formular erstellen"
-
-#: views/lists/forms/create.hbs:6 views/lists/forms/create.hbs:7
-#: views/lists/forms/edit.hbs:7 views/lists/forms/edit.hbs:8
-msgid "Form Name"
-msgstr "Formular-Name"
-
-#: views/lists/forms/create.hbs:8
-msgid "Add Form"
-msgstr "Formular hinzufügen"
-
-#: views/lists/forms/edit.hbs:4
-msgid "Edit Form"
-msgstr "Formular bearbeiten"
-
-#: views/lists/forms/edit.hbs:5
-msgid "Edit Custom Form"
-msgstr "Formular bearbeiten"
-
-#: views/lists/forms/edit.hbs:6
-msgid "Back to forms"
-msgstr "Zurück zu Formulare"
-
-#: views/lists/forms/edit.hbs:10
-msgid "Optional comments about this form"
-msgstr "Optionale Kommentare zu diesem Formular"
-
-#: views/lists/forms/edit.hbs:11
-msgid "Form Preview"
-msgstr "Formular Vorschau"
-
-#: views/lists/forms/edit.hbs:12
-msgid ""
-"Note: These links are solely for a quick preview. If you submit a preview "
-"form you'll get redirected to the list's default form."
-msgstr ""
-"Hinweis: Diese Links dienen ausschließlich der Vorschau. Wenn Sie ein "
-"Vorschau-Formlar absenden, werden Sie auf das Standardformular der Liste "
-"umgeleitet."
-
-#: views/lists/forms/edit.hbs:13 views/lists/subscription/add.hbs:16
-#: views/subscription/mail-unsubscribe-confirmed-html.mjml.hbs:4
-#: views/subscription/mail-unsubscribe-confirmed-text.hbs:4 routes/forms.js:157
-#: routes/lists.js:284
-msgid "Subscribe"
-msgstr "Abonnieren"
-
-#: views/lists/forms/edit.hbs:14
-msgid "Confirm Notice"
-msgstr "Bestätigung erforderlich"
-
-#: views/lists/forms/edit.hbs:15
-msgid "Updated Notice"
-msgstr "Profil aktualisiert"
-
-#: views/lists/forms/edit.hbs:16
-msgid "Unsubscribed Notice"
-msgstr "Abmeldungshinweis"
-
-#: views/lists/forms/edit.hbs:17 routes/forms.js:195
-msgid "Manage"
-msgstr "Verwalten"
-
-#: views/lists/forms/edit.hbs:18
-msgid "Manage Address"
-msgstr "Adresse Verwalten"
-
-#: views/lists/forms/edit.hbs:19
-msgid "Create a test user for additional options"
-msgstr "Erstellen Sie einen Testbenutzer für zusätzliche Optionen"
-
-#: views/lists/forms/edit.hbs:20 views/report-templates/create.hbs:3
-#: views/report-templates/edit.hbs:3
-#: views/report-templates/report-templates.hbs:3 views/templates/create.hbs:2
-#: views/templates/edit.hbs:2 views/templates/templates.hbs:2
-#: views/templates/templates.hbs:4 lib/tools.js:122 routes/templates.js:27
-msgid "Templates"
-msgstr "Vorlagen"
-
-#: views/lists/forms/edit.hbs:21
-msgid "Fields"
-msgstr "Felder"
-
-#: views/lists/forms/edit.hbs:23
-msgid "Form Fields"
-msgstr "Formular Felder"
-
-#: views/lists/forms/edit.hbs:24
-msgid "Fields hidden on subscription page:"
-msgstr "Unsichtbare Felder auf der Anmeldung-Seite:"
-
-#: views/lists/forms/edit.hbs:25
-msgid "Fields shown on subscription page:"
-msgstr "Sichtbare Felder auf der Anmeldung-Seite:"
-
-#: views/lists/forms/edit.hbs:26
-msgid "Fields hidden on preferences page:"
-msgstr "Unsichtbare Felder auf der Profil-Seite:"
-
-#: views/lists/forms/edit.hbs:27
-msgid "Fields shown on preferences page:"
-msgstr "Sichtbare Felder auf der Profil-Seite:"
-
-#: views/lists/forms/edit.hbs:28
-msgid "Delete Form"
-msgstr "Formular löschen"
-
-#: views/lists/forms/forms.hbs:10
-msgid "The default form for this list is:"
-msgstr "Das Standard-Formular für diese Liste ist:"
-
-#: views/lists/lists.hbs:6
-msgid "ID"
-msgstr "ID"
-
-#: views/lists/lists.hbs:7 views/reports/partials/report-fields.hbs:10
-msgid "Subscribers"
-msgstr "Abonnenten"
-
-#: views/lists/segments/create.hbs:3 views/lists/segments/edit.hbs:3
-#: views/lists/segments/rule-configure.hbs:3
-#: views/lists/segments/rule-create.hbs:3 views/lists/segments/rule-edit.hbs:3
-#: views/lists/segments/segments.hbs:3 views/lists/segments/segments.hbs:5
-#: views/lists/segments/view.hbs:3 views/lists/view.hbs:7
-#: views/lists/view.hbs:14
-msgid "Segments"
-msgstr "Segmente"
-
-#: views/lists/segments/create.hbs:4 views/lists/segments/create.hbs:5
-#: views/lists/segments/rule-configure.hbs:4
-#: views/lists/segments/rule-create.hbs:4 views/lists/segments/rule-edit.hbs:4
-#: views/lists/segments/segments.hbs:4
-msgid "Create Segment"
-msgstr "Segment erstellen"
-
-#: views/lists/segments/create.hbs:6 views/lists/segments/create.hbs:7
-#: views/lists/segments/edit.hbs:7 views/lists/segments/edit.hbs:8
-msgid "Segment Name"
-msgstr "Segmentnamen"
-
-#: views/lists/segments/create.hbs:8 views/lists/segments/edit.hbs:9
-msgid "Rule match"
-msgstr "Regel match"
-
-#: views/lists/segments/create.hbs:10 views/lists/segments/edit.hbs:11
-msgid "All rules must match"
-msgstr "Alle Regeln müssen zutreffen"
-
-#: views/lists/segments/create.hbs:11 views/lists/segments/edit.hbs:12
-msgid "Any rule can match"
-msgstr "Irgendeine Regel kann zutreffen"
-
-#: views/lists/segments/create.hbs:12
-msgid "Add Segment"
-msgstr "Segment hinzufügen"
-
-#: views/lists/segments/edit.hbs:4 views/lists/segments/edit.hbs:5
-#: views/lists/segments/view.hbs:6 views/lists/view.hbs:12
-msgid "Edit Segment"
-msgstr "Segment bearbeiten"
-
-#: views/lists/segments/edit.hbs:6
-msgid "Back to segments"
-msgstr "Zurück zu Segmente"
-
-#: views/lists/segments/edit.hbs:13
-msgid "Delete Segment"
-msgstr "Segment löschen"
-
-#: views/lists/segments/rule-configure.hbs:5
-#: views/lists/segments/rule-create.hbs:5 views/lists/segments/rule-edit.hbs:5
-#: views/lists/segments/view.hbs:4
-msgid "Create Rule"
-msgstr "Regel erstellen"
-
-#: views/lists/segments/rule-configure.hbs:6
-#: views/lists/segments/rule-create.hbs:6 views/lists/segments/rule-edit.hbs:6
-#: views/lists/segments/view.hbs:10
-msgid "Rule"
-msgstr "Regel"
-
-#: views/lists/segments/rule-configure.hbs:7
-#: views/lists/segments/rule-configure.hbs:8
-#: views/lists/segments/rule-configure.hbs:10
-#: views/lists/segments/rule-configure.hbs:13
-#: views/lists/segments/rule-configure.hbs:25
-#: views/lists/segments/rule-configure.hbs:30
-#: views/lists/segments/rule-edit.hbs:7 views/lists/segments/rule-edit.hbs:8
-#: views/lists/segments/rule-edit.hbs:10 views/lists/segments/rule-edit.hbs:15
-#: views/lists/segments/rule-edit.hbs:29 views/lists/segments/rule-edit.hbs:34
-#: views/lists/segments/view.hbs:11
-msgid "Value"
-msgstr "Wert"
-
-#: views/lists/segments/rule-configure.hbs:9
-#: views/lists/segments/rule-edit.hbs:9
-msgid ""
-"Use % for wildcard character, e.g. \"%test\" to match all values that end "
-"with \"test\""
-msgstr ""
-"Verwenden Sie % für Platzhalterzeichen, z.B. \"%test“, um alle Werte zu "
-"matchen, die mit \"test\" enden"
-
-#: views/lists/segments/rule-configure.hbs:11
-#: views/lists/segments/rule-configure.hbs:14
-#: views/lists/segments/rule-configure.hbs:26
-#: views/lists/segments/rule-edit.hbs:11 views/lists/segments/rule-edit.hbs:16
-#: views/lists/segments/rule-edit.hbs:30
-msgid "Use exact match"
-msgstr "Exact match verwenden"
-
-#: views/lists/segments/rule-configure.hbs:12
-#: views/lists/segments/rule-configure.hbs:15
-#: views/lists/segments/rule-configure.hbs:27
-#: views/lists/segments/rule-edit.hbs:12 views/lists/segments/rule-edit.hbs:17
-#: views/lists/segments/rule-edit.hbs:31
-msgid "Use range match"
-msgstr "Range match verwenden"
-
-#: views/lists/segments/rule-configure.hbs:16
-#: views/lists/segments/rule-edit.hbs:20
-msgid "Use relative range match"
-msgstr "Relative range match verwenden"
-
-#: views/lists/segments/rule-configure.hbs:17
-#: views/lists/segments/rule-configure.hbs:28
-#: views/lists/segments/rule-edit.hbs:13 views/lists/segments/rule-edit.hbs:18
-#: views/lists/segments/rule-edit.hbs:21 views/lists/segments/rule-edit.hbs:32
-msgid "From"
-msgstr "Von"
-
-#: views/lists/segments/rule-configure.hbs:18
-#: views/lists/segments/rule-configure.hbs:22
-#: views/lists/segments/rule-edit.hbs:22 views/lists/segments/rule-edit.hbs:26
-msgid "days"
-msgstr "Tage"
-
-#: views/lists/segments/rule-configure.hbs:19
-#: views/lists/segments/rule-configure.hbs:23
-#: views/lists/segments/rule-edit.hbs:23 views/lists/segments/rule-edit.hbs:27
-msgid "before today"
-msgstr "vor heute"
-
-#: views/lists/segments/rule-configure.hbs:20
-#: views/lists/segments/rule-configure.hbs:24
-#: views/lists/segments/rule-edit.hbs:24 views/lists/segments/rule-edit.hbs:28
-msgid "after today"
-msgstr "nach heute"
-
-#: views/lists/segments/rule-configure.hbs:21
-#: views/lists/segments/rule-configure.hbs:29
-#: views/lists/segments/rule-edit.hbs:14 views/lists/segments/rule-edit.hbs:19
-#: views/lists/segments/rule-edit.hbs:25 views/lists/segments/rule-edit.hbs:33
-msgid "to"
-msgstr "an"
-
-#: views/lists/segments/rule-configure.hbs:31
-#: views/lists/segments/rule-edit.hbs:35 lib/models/segments.js:156
-#: lib/models/segments.js:418
-msgid "Selected"
-msgstr "Ausgewählt"
-
-#: views/lists/segments/rule-configure.hbs:32
-#: views/lists/segments/rule-edit.hbs:36 lib/models/segments.js:156
-#: lib/models/segments.js:418
-msgid "Not selected"
-msgstr "Nicht ausgewählt"
-
-#: views/lists/segments/rule-configure.hbs:33
-msgid "Add Rule"
-msgstr "Regel hinzufügen"
-
-#: views/lists/segments/rule-create.hbs:8
-#: views/lists/subscription/import.hbs:15
-#: views/reports/create-select-template.hbs:5
-#: views/triggers/create-select.hbs:9
-msgid "Next"
-msgstr "Weiter"
-
-#: views/lists/segments/rule-edit.hbs:37
-msgid "Delete Rule"
-msgstr "Regel löschen"
-
-#: views/lists/segments/segments.hbs:7
-msgid "Match"
-msgstr "Match"
-
-#: views/lists/segments/view.hbs:5 views/lists/view.hbs:13
-msgid "Segment"
-msgstr "Segment"
-
-#: views/lists/segments/view.hbs:7
-msgid "Match rules"
-msgstr "Regel match"
-
-#: views/lists/segments/view.hbs:8
-msgid "Matching subscribers"
-msgstr "Passende Abonnenten"
-
-#: views/lists/segments/view.hbs:9
-msgid "show"
-msgstr "zeige"
-
-#: views/lists/subscription/add.hbs:3 views/lists/subscription/add.hbs:4
-msgid "Add subscriber"
-msgstr "Abonnent hinzufügen"
-
-#: views/lists/subscription/add.hbs:5
-#: views/subscription/partials/subscription-custom-fields.hbs:1
-#: views/users/account.hbs:7
-msgid "Email Address"
-msgstr "E-Mail-Adresse"
-
-#: views/lists/subscription/add.hbs:8 views/lists/subscription/edit.hbs:9
-#: views/settings.hbs:82 views/settings.hbs:97
-#: views/subscription/partials/subscription-custom-fields.hbs:6
-msgid "Begins with"
-msgstr "Beginnt mit"
-
-#: views/lists/subscription/add.hbs:9 views/lists/subscription/edit.hbs:10
-msgid ""
-"Insert a GPG public key that will be used to encrypt messages sent this "
-"subscriber"
-msgstr ""
-"Falls Sie hier einen GPG Public Key einfügen, wird dieser verwendet um E-"
-"Mails an diesen Abonnenten zu verschlüsseln"
-
-#: views/lists/subscription/add.hbs:11 views/lists/subscription/edit.hbs:12
-#: views/lists/subscription/import-preview.hbs:9
-msgid "Timezone"
-msgstr "Zeitzone"
-
-#: views/lists/subscription/add.hbs:13 views/lists/subscription/edit.hbs:13
-msgid "Test user?"
-msgstr "Test-Benutzer?"
-
-#: views/lists/subscription/add.hbs:14 views/lists/subscription/edit.hbs:14
-msgid ""
-"If checked then this subscription can be used for previewing campaign "
-"messages"
-msgstr ""
-"Wenn diese Option aktiviert ist, kann dieser Abonnent für die Vorschau von "
-"Kampagnen verwendet werden"
-
-#: views/lists/subscription/add.hbs:15
-msgid ""
-"This person will not receive a confirmation email so make sure that you have "
-"permission to email them."
-msgstr ""
-"Diese Person wird keine Bestätigungs-E-Mail erhalten. Stellen Sie sicher, "
-"dass Sie die Erlaubnis haben, dieser Person E-Mails zu senden."
-
-#: views/lists/subscription/edit.hbs:3 views/lists/subscription/edit.hbs:4
-msgid "Edit subscriber"
-msgstr "Abonnent bearbeiten"
-
-#: views/lists/subscription/edit.hbs:5
-#: views/lists/subscription/import-failed.hbs:5
-msgid "Back to list"
-msgstr "Zurück zur Liste"
-
-#: views/lists/subscription/edit.hbs:6
-#: views/lists/subscription/import-preview.hbs:6
-#: views/subscription/partials/subscription-unsubscribe-form.hbs:1
-#: lib/helpers.js:41 lib/models/segments.js:11
-msgid "Email address"
-msgstr "E-Mail-Adresse"
-
-#: views/lists/subscription/edit.hbs:17
-msgid "Delete Subscription"
-msgstr "Abonnement löschen"
-
-#: views/lists/subscription/import-failed.hbs:3
-msgid "Import status"
-msgstr "Import status"
-
-#: views/lists/subscription/import-failed.hbs:4
-msgid "Failed addresses"
-msgstr "Fehlgeschlagene Adressen"
-
-#: views/lists/subscription/import-failed.hbs:6
-msgid ""
-"Role-based addresses like postmaster@example.com are blocked when importing. "
-"Subscribers with role-based email addresses can join your list using the "
-"subscription form"
-msgstr ""
-"Rollenbasierte Adressen wie postmaster@example.com sind beim Import "
-"gesperrt. Abonnenten mit rollenbasierten E-Mail-Adressen können sich mit dem "
-"Anmeldeformular Ihrer Liste abonnieren."
-
-#: views/lists/subscription/import-failed.hbs:7
-msgid "see here"
-msgstr "sehen Sie hier"
-
-#: views/lists/subscription/import-failed.hbs:9
-msgid "Fail reason"
-msgstr "Fehlerursache"
-
-#: views/lists/subscription/import-preview.hbs:3
-#: views/lists/subscription/import-preview.hbs:4
-#: views/lists/subscription/import.hbs:3 views/lists/subscription/import.hbs:4
-msgid "Import subscribers"
-msgstr "Abonnenten importieren"
-
-#: views/lists/subscription/import-preview.hbs:10 views/users/api.hbs:27
-#: views/users/api.hbs:35 views/users/api.hbs:43 views/users/api.hbs:54
-#: views/users/api.hbs:62 views/users/api.hbs:70
-msgid "Example"
-msgstr "Beispiel"
-
-#: views/lists/subscription/import-preview.hbs:11
-msgid "Start import"
-msgstr "Import starten"
-
-#: views/lists/subscription/import.hbs:5
-msgid "CSV File"
-msgstr "CVS Datei"
-
-#: views/lists/subscription/import.hbs:6
-msgid "CSV delimiter"
-msgstr "CSV-Trennzeichen"
-
-#: views/lists/subscription/import.hbs:7
-msgid "Categorize the imported subscribers as"
-msgstr "Kategorisiere die importierten Abonnenten als"
-
-#: views/lists/subscription/import.hbs:8 routes/lists.js:202
-msgid "Subscribed"
-msgstr "Abonniert"
-
-#: views/lists/subscription/import.hbs:9
-msgid "Regular subscriber addresses"
-msgstr "Normale Abonnenten-Adressen"
-
-#: views/lists/subscription/import.hbs:11
-msgid "Suppressed emails that will be unsubscribed from your list"
-msgstr "Unterdrückte E-Mail-Adressen, die von Ihrer Liste abgemeldet werden"
-
-#: views/lists/subscription/import.hbs:12
-msgid "Check imported emails"
-msgstr "Überprüfe die importierten E-Mail-Adressen"
-
-#: views/lists/subscription/import.hbs:13 views/triggers/triggers.hbs:12
-msgid "Enabled"
-msgstr "Aktiviert"
-
-#: views/lists/subscription/import.hbs:14 views/triggers/triggers.hbs:13
-msgid "Disabled"
-msgstr "Deaktiviert"
-
-#: views/lists/view.hbs:3
-msgid "Subscription Form"
-msgstr "Abonnement Formular"
-
-#: views/lists/view.hbs:4
-msgid "List Actions"
-msgstr "Listen Aktionen"
-
-#: views/lists/view.hbs:9 views/triggers/create-select.hbs:3
-#: views/triggers/create-select.hbs:4 views/triggers/create.hbs:3
-#: views/triggers/create.hbs:4 views/triggers/create.hbs:27
-#: views/triggers/triggers.hbs:3
-msgid "Create Trigger"
-msgstr "Trigger erstellen"
-
-#: views/lists/view.hbs:10
-msgid "Add Subscriber"
-msgstr "Abonnent hinzufügen"
-
-#: views/lists/view.hbs:11
-msgid "Import Subscribers"
-msgstr "Abonnenten importieren"
-
-#: views/lists/view.hbs:15
-msgid "Create New Segment"
-msgstr "Neues Segment erstellen"
-
-#: views/lists/view.hbs:16
-msgid "Filter"
-msgstr "Filter"
-
-#: views/lists/view.hbs:17
-msgid "Subscriptions"
-msgstr "Abonnements"
-
-#: views/lists/view.hbs:18
-msgid "Imports"
-msgstr "Importe"
-
-#: views/lists/view.hbs:25 routes/campaigns.js:255 routes/lists.js:296
-msgid "Finished"
-msgstr "Fertig"
-
-#: views/lists/view.hbs:27
-msgid "Added"
-msgstr "Hinzugefügt"
-
-#: views/lists/view.hbs:28
-msgid "Updated"
-msgstr "Aktualisiert"
-
-#: views/lists/view.hbs:29
-msgid "Failed"
-msgstr "Fehlgeschlagen"
-
-#: views/lists/view.hbs:31
-msgid ""
-"Are you sure? This action should only be called to resolve stalled imports"
-msgstr ""
-"Sind Sie sicher? Diese Aktion sollte nur ausgeführt werden, um Probleme mit "
-"hängenden Importen zu lösen"
-
-#: views/lists/view.hbs:32
-msgid "Restart"
-msgstr "Neustart"
-
-#: views/mosaico/editor.hbs:1 views/partials/merge-tag-reference.hbs:1
-msgid "Merge tag reference"
-msgstr "Merge-Tag Referenz"
-
-#: views/mosaico/editor.hbs:4
-msgid "MOSAICO Responsive Email Designer"
-msgstr "MOSAICO Responsive E-Mail-Designer"
-
-#: views/mosaico/editor.hbs:5
-msgid "Sucessfully saved"
-msgstr "Erfolgreich gespeichert"
-
-#: views/mosaico/editor.hbs:6
-msgid "An error occured while saving the document"
-msgstr "Beim Speichern des Dokuments ist ein Fehler aufgetreten"
-
-#: views/mosaico/editor.hbs:7
-msgid "Unsaved changes will be lost. Close now?"
-msgstr "Nicht gespeicherte Änderungen gehen verloren. Jetzt schließen?"
-
-#: views/mosaico/editor.hbs:8 views/mosaico/editor.hbs:9
-msgid "Tags"
-msgstr "Tags"
-
-#: views/partials/codeeditor.hbs:1 views/partials/grapejs.hbs:1
-#: views/partials/mosaico.hbs:1 views/partials/summernote.hbs:1
-msgid "Template content (HTML)"
-msgstr "Vorlagen-Inhalt (HTML)"
-
-#: views/partials/editor-navbar.hbs:1
-msgid "SAVE"
-msgstr "SPEICHERN"
-
-#: views/partials/editor-navbar.hbs:2
-msgid "SAVING"
-msgstr "AM SPEICHERN"
-
-#: views/partials/editor-navbar.hbs:3
-msgid "CLOSE"
-msgstr "SCHLIESSEN"
-
-#: views/partials/grapejs.hbs:2
-msgid "Open GrapeJS"
-msgstr "GrapeJS öffnen"
-
-#: views/partials/html-preview.hbs:1
-msgid "Toggle HTML preview"
-msgstr "HTML Vorschau anzeigen"
-
-#: views/partials/html-to-text.hbs:1
-msgid ""
-"To extract the text from HTML click here."
-msgstr ""
-"Um den Klartext aus dem HTML Dokument zu extrahieren, klicken Sie hier."
-
-#: views/partials/html-to-text.hbs:2
-msgid ""
-"Please note that your existing plaintext in the field above will be "
-"overwritten. This feature uses the Premailer API, a third party "
-"service. Their Terms of Service and Privacy Policy apply."
-msgstr ""
-"Hierbei wird Ihr bestehender Klartext im Feld oberhalb überschreiben. Diese "
-"Funktion nutzt die Premailer API. Die Verwendung unterliegt "
-"deren AGB und Datenschutzbestimmungen."
-
-#: views/partials/html-to-text.hbs:3
-msgid "An error occurred while talking to the server"
-msgstr "Beim Datenverkehr mit dem Server ist ein Fehler aufgetreten"
-
-#: views/partials/merge-tag-reference.hbs:2
-msgid ""
-"Merge tags are tags that are replaced before sending out the message. The "
-"format of the merge tag is the following: [TAG_NAME] or "
-"[TAG_NAME/fallback] where fallback is an optional "
-"text value used when TAG_NAME is empty."
-msgstr ""
-"Merge-Tags sind Tags, die vor dem Senden der Nachricht ersetzt werden. Das "
-"Format des Merge-Tags lautet wie folgt: [TAG_NAME] oder "
-"[TAG_NAME/fallback] wobei fallback ein optionaler "
-"Textwert ist, der verwendet wird, falls TAG_NAME leer ist."
-
-#: views/partials/modal-carousel.hbs:1
-msgid "{{title}}"
-msgstr "{{title}}"
-
-#: views/partials/mosaico.hbs:2
-msgid "Open Mosaico"
-msgstr "Mosaico öffnen"
-
-#: views/partials/plaintext.hbs:1
-msgid "Template content (plaintext)"
-msgstr "Vorlagen-Inhalt (Klartext)"
-
-#: views/report-templates/create.hbs:2 views/report-templates/edit.hbs:2
-#: views/report-templates/report-templates.hbs:2
-#: views/reports/create-select-template.hbs:2 views/reports/create.hbs:2
-#: views/reports/edit.hbs:2 views/reports/output.hbs:2
-#: views/reports/reports.hbs:2 views/reports/reports.hbs:5
-#: views/reports/view.hbs:2 lib/tools.js:137 routes/reports.js:31
-msgid "Reports"
-msgstr "Reporte"
-
-#: views/report-templates/create.hbs:4 views/report-templates/create.hbs:6
-#: views/report-templates/report-templates.hbs:4 views/templates/create.hbs:3
-#: views/templates/create.hbs:4 views/templates/create.hbs:12
-#: views/templates/templates.hbs:3
-msgid "Create Template"
-msgstr "Vorlage erstellen"
-
-#: views/report-templates/create.hbs:5 routes/report-templates.js:231
-msgid "Create Report Template"
-msgstr "Report-Vorlage erstellen"
-
-#: views/report-templates/edit.hbs:4 views/templates/edit.hbs:3
-#: views/templates/edit.hbs:4
-msgid "Edit Template"
-msgstr "Vorlage bearbeiten"
-
-#: views/report-templates/edit.hbs:5 routes/report-templates.js:262
-msgid "Edit Report Template"
-msgstr "Report-Vorlage bearbeiten"
-
-#: views/report-templates/edit.hbs:6 views/templates/edit.hbs:11
-msgid "Delete Template"
-msgstr "Vorlage löschen"
-
-#: views/report-templates/edit.hbs:7
-msgid "Update and Stay"
-msgstr "Aktualisieren und bleiben"
-
-#: views/report-templates/edit.hbs:8
-msgid "Update and Leave"
-msgstr "Aktualisieren und verlassen"
-
-#: views/report-templates/partials/report-template-fields.hbs:2
-msgid "Template Name"
-msgstr "Vorlagen-Name"
-
-#: views/report-templates/partials/report-template-fields.hbs:6
-msgid "User selectable fields"
-msgstr "Vom Benutzer wählbare Felder"
-
-#: views/report-templates/partials/report-template-fields.hbs:7
-msgid "Data processing code"
-msgstr "Datenverarbeitungs-Code"
-
-#: views/report-templates/partials/report-template-fields.hbs:8
-msgid "Rendering template"
-msgstr "Render-Vorlage"
-
-#: views/report-templates/report-templates.hbs:5
-msgid "Blank"
-msgstr "Leer"
-
-#: views/report-templates/report-templates.hbs:6
-msgid "All Subscribers"
-msgstr "Alle Abonnenten"
-
-#: views/report-templates/report-templates.hbs:7
-msgid "Grouped Subscribers"
-msgstr "Gruppierte Abonnenten"
-
-#: views/report-templates/report-templates.hbs:8
-msgid "Export List as CSV"
-msgstr "Liste als CSV exportieren"
-
-#: views/report-templates/report-templates.hbs:9 views/reports/reports.hbs:4
-#: routes/report-templates.js:29
-msgid "Report Templates"
-msgstr "Report-Vorlagen"
-
-#: views/reports/create-select-template.hbs:3
-#: views/reports/create-select-template.hbs:4 views/reports/create.hbs:3
-#: views/reports/create.hbs:4 views/reports/create.hbs:5
-#: views/reports/reports.hbs:3 routes/reports.js:81
-msgid "Create Report"
-msgstr "Report erstellen"
-
-#: views/reports/edit.hbs:3 views/reports/edit.hbs:4 routes/reports.js:151
-msgid "Edit Report"
-msgstr "Report bearbeiten"
-
-#: views/reports/edit.hbs:5
-msgid "Delete Report"
-msgstr "Report löschen"
-
-#: views/reports/partials/report-fields.hbs:2
-msgid "Report Name"
-msgstr "Report-Name"
-
-#: views/reports/partials/report-fields.hbs:8
-#: views/reports/partials/report-fields.hbs:11
-msgid ""
-"Select a campaign in the table above by clicking on the respective row "
-"number."
-msgstr ""
-"Wählen Sie eine Kampagne in der obigen Tabelle aus, indem Sie auf die "
-"jeweilige Zeilennummer klicken."
-
-#: views/reports/partials/report-select-template.hbs:1
-msgid "Report Template"
-msgstr "Report-Vorlage"
-
-#: views/settings.hbs:5
-msgid "Service Address (URL)"
-msgstr "Service Adresse (URL)"
-
-#: views/settings.hbs:6
-msgid "Enter the URL this service can be reached from"
-msgstr "Geben Sie die URL ein, auf welcher dieser Service verfügbar ist"
-
-#: views/settings.hbs:7
-msgid "Admin Email"
-msgstr "Admin E-Mail"
-
-#: views/settings.hbs:8
-msgid ""
-"Enter the email address that will be used as \"from\" for system messages"
-msgstr ""
-"Geben Sie hier die E-Mail-Adresse ein, die als \"von\" für Systemmeldungen "
-"verwendet wird"
-
-#: views/settings.hbs:9
-msgid "Disable WYSIWYG editor"
-msgstr "WYSIWYG Editor deaktivieren"
-
-#: views/settings.hbs:10
-msgid "If checked then message editor displays HTML code without the preview"
-msgstr "Wenn markiert zeigt der Editor HTML-Code ohne Vorschau an"
-
-#: views/settings.hbs:11
-msgid "Disable subscription confirmation messages"
-msgstr "Bestätigungsmeldungen für Abonnements deaktivieren"
-
-#: views/settings.hbs:12
-msgid ""
-"If checked then do not send a confirmation message that states the "
-"subscriber is now subscribed or unsubscribed. This does not disable double "
-"opt-in messages."
-msgstr ""
-"Wenn markiert wird keine Bestätigungsnachricht gesendet, die besagt, dass "
-"der Teilnehmer jetzt abonniert oder abgemeldet ist. Dies deaktiviert die "
-"Double-Opt-In-Nachrichten nicht."
-
-#: views/settings.hbs:13
-msgid "Tracking ID"
-msgstr "Tracking ID"
-
-#: views/settings.hbs:14
-msgid "Enter Google Analytics tracking code"
-msgstr "Google-Analytics Tracking-Code"
-
-#: views/settings.hbs:15
-msgid "Frontpage shout out"
-msgstr "Meldung auf der Startseite"
-
-#: views/settings.hbs:16
-msgid "HTML code shown in the front page header section"
-msgstr "HTML-Code im Kopfbereich der Startseite"
-
-#: views/settings.hbs:17
-msgid "Campaign defaults"
-msgstr "Kampagnenvorgaben"
-
-#: views/settings.hbs:18
-msgid "Sender name"
-msgstr "Absender Name"
-
-#: views/settings.hbs:19
-msgid "Sender name, eg. My Awesome Company Ltd."
-msgstr "Absender Name, z.B. Meine grossartige Firma"
-
-#: views/settings.hbs:20
-msgid "Default address"
-msgstr "Standardadresse"
-
-#: views/settings.hbs:21
-msgid ""
-"Contact address to provide, eg. 1234 Main Street, Anywhere, MA 01234, USA"
-msgstr "Kontakt Adresse, z.B. 1234 Hauptstrasse, 01234 Irgendwo, Deutschland"
-
-#: views/settings.hbs:22
-msgid "Default \"from name\""
-msgstr "Standard \"von\" Namen"
-
-#: views/settings.hbs:24
-msgid "Default \"from\" email"
-msgstr "Standard \"von\" E-Mail-Adresse"
-
-#: views/settings.hbs:26
-msgid "Default \"subject line\""
-msgstr "Standard \"Betreffzeile\""
-
-#: views/settings.hbs:28
-msgid "Default homepage (URL)"
-msgstr "Standard-Homepage (URL)"
-
-#: views/settings.hbs:29
-msgid "URL to redirect the subscribed users to, eg. http://example.com/"
-msgstr ""
-"URL, um die abonnierten Benutzer weiterzuleiten, z.B. http://example.com/"
-
-#: views/settings.hbs:30
-msgid "Mailer Settings"
-msgstr "Mailer-Einstellungen"
-
-#: views/settings.hbs:31
-msgid "These settings are required to send out e-mail messages"
-msgstr "Diese Einstellungen sind erforderlich, um E-Mails zu senden"
-
-#: views/settings.hbs:32
-msgid "SMTP"
-msgstr "SMTP"
-
-#: views/settings.hbs:33
-msgid "AWS SES"
-msgstr "AWS SES"
-
-#: views/settings.hbs:34
-msgid "Use SMTP for sending mail"
-msgstr "SMTP zum Senden der E-Mails verwenden"
-
-#: views/settings.hbs:35
-msgid "Hostname"
-msgstr "Hostname"
-
-#: views/settings.hbs:36
-msgid "Port"
-msgstr "Port"
-
-#: views/settings.hbs:37
-msgid "Port, eg. 465. Autodetected if left blank"
-msgstr "Port, z.B: 465. Automatisch erkannt wenn leer"
-
-#: views/settings.hbs:38
-msgid "Encryption"
-msgstr "Verschlüsseleung"
-
-#: views/settings.hbs:39
-msgid "Disable SMTP authentication"
-msgstr "SMTP Authentifizierung deaktivieren"
-
-#: views/settings.hbs:40 views/users/forgot.hbs:9 views/users/login.hbs:4
-#: views/users/login.hbs:5
-msgid "Username"
-msgstr "Benutzername"
-
-#: views/settings.hbs:41
-msgid "Username, eg. myaccount@example.com"
-msgstr "Benutzername, z.B: myaccount@example.com"
-
-#: views/settings.hbs:42 views/settings.hbs:43 views/users/login.hbs:6
-#: views/users/login.hbs:7
-msgid "Password"
-msgstr "Passwort"
-
-#: views/settings.hbs:44
-msgid "Use SES API for sending mail"
-msgstr "SES API zum Versenden der E-Mails verwenden"
-
-#: views/settings.hbs:45
-msgid "Access Key"
-msgstr "Access Key"
-
-#: views/settings.hbs:46
-msgid "AWS Access Key Id"
-msgstr "AWS Access Key Id"
-
-#: views/settings.hbs:47
-msgid "Secret Key"
-msgstr "Secret Key"
-
-#: views/settings.hbs:48
-msgid "AWS Secret Access Key"
-msgstr "AWS Secret Access Key"
-
-#: views/settings.hbs:49
-msgid "Region"
-msgstr "Region"
-
-#: views/settings.hbs:50
-msgid "Checking"
-msgstr "Am überprüfen"
-
-#: views/settings.hbs:51
-msgid "Check Mailer config"
-msgstr "Mailer-Konfiguration überprüfen"
-
-#: views/settings.hbs:52
-msgid "Don't have an SMTP account yet? Create a free SendPulse account"
-msgstr ""
-"Haben Sie noch kein SMTP-Konto? Erstellen Sie einen kostenloses SendPulse-"
-"Account"
-
-#: views/settings.hbs:53
-msgid "here"
-msgstr "hier"
-
-#: views/settings.hbs:54
-msgid "Advanced Mailer settings"
-msgstr "Erweiterte Mailer-Einstellungen"
-
-#: views/settings.hbs:55
-msgid "Log SMTP transactions"
-msgstr "SMTP-Transaktionen Loggen"
-
-#: views/settings.hbs:56
-msgid "Allow self-signed certificates"
-msgstr "Selbstsignierte Zertifikate zulassen"
-
-#: views/settings.hbs:57
-msgid "Max connections"
-msgstr "Max. Verbindungen"
-
-#: views/settings.hbs:58
-msgid "The count of max connections, eg. 10"
-msgstr "Die Anzahl maximaler Verbindungen, z.B. 10"
-
-#: views/settings.hbs:59
-msgid ""
-"The count of maximum simultaneous connections to make against the SMTP "
-"server (defaults to 5). This limit is per sending process."
-msgstr ""
-"Anzahl der maximalen parallelen Verbindungen zum SMTP-Server (standardmäßig "
-"auf 5). Diese Limite gilt per Sendungsprozess."
-
-#: views/settings.hbs:60
-msgid "Max messages"
-msgstr "Max. Nachrichten"
-
-#: views/settings.hbs:61
-msgid "The count of max messages, eg. 100"
-msgstr "Die Anzahl maximaler Nachrichten, z.B. 100"
-
-#: views/settings.hbs:62
-msgid ""
-"The number of messages to send through a single connection before the "
-"connection is closed and reopened (defaults to 100)"
-msgstr ""
-"Die Anzahl der Nachrichten, die durch eine einzige Verbindung gesendet "
-"werden sollen, bevor die Verbindung geschlossen und wieder geöffnet wird "
-"(standardmäßig 100)"
-
-#: views/settings.hbs:63
-msgid "Throttling"
-msgstr "Throttling"
-
-#: views/settings.hbs:64
-msgid "Messages per hour eg. 1000"
-msgstr "E-Mail-Nachrichten pro Stunde z.B. 1000"
-
-#: views/settings.hbs:65
-msgid ""
-"Maximum number of messages to send in an hour. Leave empty or zero for no "
-"throttling. If your provider uses a different speed limit (messages/minute "
-"or messages/second) then convert this limit into messages/hour (1m/s => "
-"3600m/h). This limit is per sending process."
-msgstr ""
-"Maximale Anzahl von E-Mails, die in einer Stunde gesendet werden sollen. "
-"Leer oder 0 bedeutet keine Drosselung. Wenn Ihr Provider eine andere "
-"Geschwindigkeitsbegrenzung (Nachrichten/Minute oder Nachrichten/Sekunde) "
-"verwendet, dann konvertieren Sie diesen Wert in Nachrichten/Stunde (1m/s => "
-"3600m/h). Diese Limite gilt pro Sendungsprozess."
-
-#: views/settings.hbs:66
-msgid "VERP bounce handling"
-msgstr "VERP bounce Handhabung"
-
-#: views/settings.hbs:67
-msgid ""
-"Mailtrain is able to use VERP based routing to detect bounces. In this case "
-"the message is sent to the recipient using a custom VERP address as the "
-"return path of the message. If the message is not accepted a bounce email is "
-"sent to this special VERP address and thus a bounce is detected."
-msgstr ""
-"Mailtrain ist in der Lage, VERP-basiertes Routing zu verwenden, um Bounces "
-"zu erkennen. In diesem Fall wird die Nachricht an den Empfänger über eine "
-"benutzerdefinierte VERP-Adresse als Return Path der Nachricht gesendet. Wenn "
-"die Nachricht nicht akzeptiert wird, wird eine Bounce-E-Mail an diese "
-"spezielle VERP-Adresse gesendet und damit ein Bounce erkannt."
-
-#: views/settings.hbs:68
-msgid ""
-"To get VERP working you need to set up a DNS MX record that points to your "
-"Mailtrain hostname. You must also ensure that Mailtrain VERP interface is "
-"available from port 25 of your server (port 25 usually requires root user "
-"privileges). This way if anyone tries to send email to someuser@verp-"
-"hostname then the email should end up to this server."
-msgstr ""
-"Damit VERP funktioniert, müssen Sie einen DNS MX Record einrichten, der auf "
-"Ihren Mailtrain Hostnamen verweist. Sie müssen auch sicherstellen, dass die "
-"Mailtrain VERP-Schnittstelle von Port 25 Ihres Servers verfügbar ist (Port "
-"25 benötigt normalerweise Root-Benutzerberechtigung). Folglich landen E-"
-"Mails an someuser@verp-hostname auf diesem Server."
-
-#: views/settings.hbs:69
-msgid ""
-"VERP usually only works if you are using your own SMTP server. Regular relay "
-"services (SES, SparkPost, Gmail etc.) tend to remove the VERP address from "
-"the message."
-msgstr ""
-"VERP funktioniert in der Regel nur, wenn Sie Ihren eigenen SMTP-Server "
-"verwenden. Reguläre Relay Services (SES, SparkPost, Gmail etc.) neigen dazu, "
-"die VERP-Adresse aus der Nachricht zu entfernen."
-
-#: views/settings.hbs:70
-msgid "Use VERP to catch bounces"
-msgstr "VERP verwenden um bounces zu erfassen"
-
-#: views/settings.hbs:71
-msgid "Server hostname"
-msgstr "Hostname"
-
-#: views/settings.hbs:72
-msgid "The VERP server hostname, eg. bounces.example.com"
-msgstr "VERP Server Hostname, z.B. bounces.example.com"
-
-#: views/settings.hbs:73
-msgid ""
-"VERP bounce handling server hostname. This hostname is used in the SMTP "
-"envelope FROM address and the MX DNS records should point to this server"
-msgstr ""
-"VERP bounce handling Server Hostname. Dieser Hostname wird in der SMTP "
-"envelope FROM Adresse verwendet. Die MX DNS Records sollten auf diesen "
-"Server verweisen"
-
-#: views/settings.hbs:74
-msgid ""
-"VERP bounce handling server is not enabled. Modify your server configuration "
-"file and restart server to enable it"
-msgstr ""
-"VERP Bounce handling Server ist nicht aktiviert. Ändern Sie die Server-"
-"Konfigurationsdatei und starten Sie den Server neu, um ihn zu aktivieren."
-
-#: views/settings.hbs:75
-msgid "GPG Signing"
-msgstr "GPG Signierung"
-
-#: views/settings.hbs:76
-msgid ""
-"Only messages that are encrypted can be signed. Subsribers who have not set "
-"up a GPG public key in their profile receive normal email messages. Users "
-"with GPG key set receive encrypted messages and if you have signing key also "
-"set, the messages are signed with this key."
-msgstr ""
-"Nur verschlüsselte Nachrichten können signiert werden. Abonnenten, die "
-"keinen GPG Public Key in ihrem Profil hinterlegt haben, erhalten normale E-"
-"Mails. Benutzer mit hinterlegtem GPG Key erhalten verschlüsselte Nachrichten "
-"und wenn Sie den Signing Key auch gesetzt haben, werden die Nachrichten mit "
-"diesem Schlüssel signiert."
-
-#: views/settings.hbs:77
-msgid ""
-"Do not use sensitive keys here. The private key and passphrase are not "
-"encrypted in the database."
-msgstr ""
-"Verwenden Sie hier keine sensiblen Keys. Der private Key und Passphrase "
-"werden in der Datenbank nicht verschlüsselt."
-
-#: views/settings.hbs:78
-msgid "Private Key Passphrase"
-msgstr "Private Key Passphrase"
-
-#: views/settings.hbs:79
-msgid "Passphrase for the key if set"
-msgstr "Passwort für den Key falls gesetzt"
-
-#: views/settings.hbs:80
-msgid "Only fill this if your private key is encrypted with a passphrase"
-msgstr ""
-"Füllen Sie dies nur aus, wenn Ihr privater Schlüssel mit einer Passphrase "
-"verschlüsselt ist"
-
-#: views/settings.hbs:81
-msgid "GPG Private Key"
-msgstr "GPG Private Key"
-
-#: views/settings.hbs:83
-msgid ""
-"This value is optional. If you do not provide a private key GPG encrypted "
-"messages are sent without signing."
-msgstr ""
-"Dieser Wert ist optional. Wenn Sie keinen private Key zur Verfügung stellen "
-"werden GPG verschlüsselte Nachrichten ohne Signierung gesendet."
-
-#: views/settings.hbs:84
-msgid "DKIM Signing by ZoneMTA"
-msgstr "DKIM Signing durch ZoneMTA"
-
-#: views/settings.hbs:85
-msgid ""
-"If you are using ZoneMTA then Mailtrain can provide a DKIM key for signing "
-"all outgoing messages. Other services usually provide their own means to "
-"DKIM sign your messages"
-msgstr ""
-"Wenn Sie ZoneMTA verwenden, kann Mailtrain einen DKIM-Key zur Signierung "
-"aller ausgehenden Nachrichten bereitstellen. Andere Dienste bieten in der "
-"Regel ihre eigenen Mittel an um Ihre E-mails per DKIM zu signieren"
-
-#: views/settings.hbs:86
-msgid ""
-"Do not use sensitive keys here. The private key is not encrypted in the "
-"database."
-msgstr ""
-"Verwenden Sie hier keine sensiblen Keys. Der private Key wird in der "
-"Datenbank nicht verschlüsselt."
-
-#: views/settings.hbs:87
-msgid "ZoneMTA DKIM API Key"
-msgstr "ZoneMTA DKIM API Key"
-
-#: views/settings.hbs:88
-msgid "Some secret value"
-msgstr "Ein geheimer Wert"
-
-#: views/settings.hbs:89
-msgid ""
-"Secret value known to ZoneMTA for requesting DKIM key information. If this "
-"value was generated by the Mailtrain installation script then you can keep "
-"it as it is"
-msgstr ""
-"Geheimer Wert, der ZoneMTA für die Anforderung von DKIM-"
-"Schlüsselinformationen bekannt ist. Wenn dieser Wert vom Mailtrain-"
-"Installationsskript generiert wurde, können Sie diese Einstellung so "
-"behalten, wie sie ist"
-
-#: views/settings.hbs:90
-msgid "DKIM domain"
-msgstr "DKIM Domain"
-
-#: views/settings.hbs:91
-msgid "Domain name for the DKIM key"
-msgstr "Domain-Name für den DKIM-Key"
-
-#: views/settings.hbs:92
-msgid "Leave blank to use the sender email address domain"
-msgstr "Leer lassen, um die Domain der Sender-E-Mail-Adresse zu verwenden"
-
-#: views/settings.hbs:93 views/settings.hbs:94
-msgid "DKIM key selector"
-msgstr "DKIM Key Selector"
-
-#: views/settings.hbs:95
-msgid "Signing is disabled without a valid selector value"
-msgstr "Signierung ist ohne gültigen Wert deaktiviert"
-
-#: views/settings.hbs:96
-msgid "DKIM Private Key"
-msgstr "DKIM Private Key"
-
-#: views/settings.hbs:98
-msgid ""
-"This value is optional. If you do not provide a private key then messages "
-"are not signed."
-msgstr ""
-"Dieser Wert ist optional. Wenn Sie keinen privaten Schlüssel bereitstellen, "
-"werden Nachrichten nicht signiert."
-
-#: views/subscription/mail-confirm-html.mjml.hbs:1
-#: views/subscription/mail-confirm-text.hbs:1 routes/subscription.js:551
-msgid "Please Confirm Subscription"
-msgstr "Bitte bestätigen Sie ihr Abonnement"
-
-#: views/subscription/mail-confirm-html.mjml.hbs:2
-#: views/subscription/mail-confirm-text.hbs:2
-msgid "Yes, subscribe me to this list"
-msgstr "Ja, tragen Sie mich in diese Liste ein"
-
-#: views/subscription/mail-confirm-html.mjml.hbs:3
-msgid ""
-"If you received this email by mistake, simply delete it. You won't be "
-"subscribed if you don't click the confirmation link above."
-msgstr ""
-"Wenn Sie diese E-Mail versehentlich erhalten haben, löschen Sie sie einfach. "
-"Sie werden nicht abonniert, wenn Sie nicht auf den Bestätigungslink oben "
-"klicken."
-
-#: views/subscription/mail-confirm-html.mjml.hbs:4
-#: views/subscription/mail-confirm-text.hbs:4
-#: views/subscription/mail-subscription-confirmed-html.mjml.hbs:8
-#: views/subscription/mail-subscription-confirmed-text.hbs:7
-#: views/subscription/mail-unsubscribe-confirmed-html.mjml.hbs:5
-#: views/subscription/mail-unsubscribe-confirmed-text.hbs:5
-msgid "For questions about this list, please contact:"
-msgstr "Bei Fragen zu dieser Liste wenden Sie sich bitte an:"
-
-#: views/subscription/mail-confirm-text.hbs:3
-msgid ""
-"If you received this email by mistake, simply delete it. You won't be "
-"subscribed unless you click the confirmation link above."
-msgstr ""
-"Wenn Sie diese E-Mail versehentlich erhalten haben, löschen Sie sie einfach. "
-"Sie werden nicht abonniert, es sei denn, Sie klicken auf den "
-"Bestätigungslink oben."
-
-#: views/subscription/mail-subscription-confirmed-html.mjml.hbs:1
-#: views/subscription/mail-subscription-confirmed-text.hbs:1
-#: views/subscription/web-subscribed.mjml.hbs:1
-msgid "Subscription Confirmed"
-msgstr "Abonnement bestätigt"
-
-#: views/subscription/mail-subscription-confirmed-html.mjml.hbs:2
-msgid "Your subscription to our list has been confirmed"
-msgstr "Ihr Abonnement für unsere Liste wurde bestätigt"
-
-#: views/subscription/mail-subscription-confirmed-html.mjml.hbs:3
-msgid "If you want to modify your subscription then you can "
-msgstr "Wenn Sie Ihr Abonnement ändern möchten, dann können Sie "
-
-#: views/subscription/mail-subscription-confirmed-html.mjml.hbs:4
-#: views/subscription/mail-subscription-confirmed-text.hbs:4
-msgid "manage your preferences"
-msgstr "Ihre Einstellungen bearbeiten"
-
-#: views/subscription/mail-subscription-confirmed-html.mjml.hbs:5
-#: views/subscription/mail-subscription-confirmed-text.hbs:5
-#: views/users/login.hbs:10
-msgid "or"
-msgstr "oder"
-
-#: views/subscription/mail-subscription-confirmed-html.mjml.hbs:6
-#: views/subscription/mail-subscription-confirmed-text.hbs:6
-msgid "unsubscribe here"
-msgstr "diesen Newsletter abbestellen"
-
-#: views/subscription/mail-subscription-confirmed-html.mjml.hbs:7
-#: views/subscription/web-confirm-notice.mjml.hbs:3
-#: views/subscription/web-subscribed.mjml.hbs:4
-#: views/subscription/web-unsubscribe-notice.mjml.hbs:3
-#: views/subscription/web-updated-notice.mjml.hbs:3
-msgid "Return to our website"
-msgstr "Zurück zu unserer Website"
-
-#: views/subscription/mail-subscription-confirmed-text.hbs:2
-#: views/subscription/web-subscribed.mjml.hbs:2
-msgid "Your subscription to our list has been confirmed."
-msgstr "Sie wurden erfolgreich in unsere Liste eingetragen."
-
-#: views/subscription/mail-subscription-confirmed-text.hbs:3
-msgid "If you want to modify your subscription then you can:"
-msgstr "Wenn Sie Ihr Abonnement ändern möchten, können Sie:"
-
-#: views/subscription/mail-unsubscribe-confirmed-html.mjml.hbs:1
-#: views/subscription/mail-unsubscribe-confirmed-text.hbs:1
-msgid "You Are Now Unsubscribed"
-msgstr "Sie Sind Nun Abgemeldet"
-
-#: views/subscription/mail-unsubscribe-confirmed-html.mjml.hbs:2
-msgid "We have removed your email address from our list"
-msgstr "Ihre E-Mail-Adresse wurde aus unserer Liste entfernt"
-
-#: views/subscription/mail-unsubscribe-confirmed-html.mjml.hbs:3
-#: views/subscription/mail-unsubscribe-confirmed-text.hbs:3
-msgid "If you unsubscribed by mistake, you can re-subscribe at:"
-msgstr ""
-"Wenn Sie sich versehentlich ausgetragen haben, können Sie sich erneut "
-"eintragen:"
-
-#: views/subscription/mail-unsubscribe-confirmed-text.hbs:2
-msgid "We have removed your email address from our list."
-msgstr "Wir haben Ihre E-Mail-Adresse aus unserer Liste entfernt."
-
-#: views/subscription/partials/subscription-custom-fields.hbs:2
-msgid "want to change it?"
-msgstr "Möchten Sie diese ändern?"
-
-#: views/subscription/partials/subscription-custom-fields.hbs:5
-msgid "Download signature verification key"
-msgstr "Signature-Verification-Key herunterladen"
-
-#: views/subscription/partials/subscription-custom-fields.hbs:7
-msgid ""
-"Insert your GPG public key here to encrypt messages sent to your address"
-msgstr ""
-"Fügen Sie hier Ihren GPG-Public Key ein, um Nachrichten zu verschlüsseln, "
-"die an Ihre Adresse gesendet werden"
-
-#: views/subscription/partials/subscription-custom-fields.hbs:8
-msgid "optional"
-msgstr "optional"
-
-#: views/subscription/partials/subscription-flash-messages.hbs:1
-#: views/subscription/partials/subscription-flash-messages.hbs:3
-msgid "Warning!"
-msgstr "Warnung!"
-
-#: views/subscription/partials/subscription-flash-messages.hbs:2
-msgid "If JavaScript was not enabled then no confirmation message was sent"
-msgstr ""
-"Wenn JavaScript nicht aktiviert war, wurde keine Bestätigungs-E-Mail gesendet"
-
-#: views/subscription/partials/subscription-flash-messages.hbs:4
-msgid "JavaScript must be enabled in order for this form to work"
-msgstr "JavaScript muss aktiviert sein, damit dieses Formular funktioniert"
-
-#: views/subscription/partials/subscription-manage-address-form.hbs:1
-msgid "Existing Email Address"
-msgstr "Aktuelle E-Mail-Adresse"
-
-#: views/subscription/partials/subscription-manage-address-form.hbs:2
-msgid "New Email Address"
-msgstr "Neue E-Mail-Adresse"
-
-#: views/subscription/partials/subscription-manage-address-form.hbs:3
-msgid "Your new email address"
-msgstr "Ihre neue E-Mail-Adresse"
-
-#: views/subscription/partials/subscription-manage-address-form.hbs:4
-msgid ""
-"You will receive a confirmation request to your new email address that you "
-"need to accept before your email is actually changed"
-msgstr ""
-"Sie erhalten eine Bestätigungsanforderung an Ihre neue E-Mail-Adresse, die "
-"Sie akzeptieren müssen, bevor Ihre E-Mail tatsächlich geändert wird"
-
-#: views/subscription/partials/subscription-manage-address-form.hbs:5
-#: views/subscription/web-manage-address.mjml.hbs:2
-msgid "Update Email Address"
-msgstr "E-Mail-Adresse aktualisieren"
-
-#: views/subscription/partials/subscription-manage-form.hbs:1
-#: views/subscription/web-manage.mjml.hbs:2
-msgid "Update Profile"
-msgstr "Einstellungen aktualisieren"
-
-#: views/subscription/partials/subscription-subscribe-form.hbs:1
-#: views/subscription/web-subscribe.mjml.hbs:2
-#: views/subscription/widget-subscribe.hbs:1
-msgid "Subscribe to list"
-msgstr "Newsletter abonnieren"
-
-#: views/subscription/web-confirm-notice.mjml.hbs:1
-#: views/subscription/widget-subscribe.hbs:4
-msgid "Almost Finished"
-msgstr "Fast Fertig"
-
-#: views/subscription/web-confirm-notice.mjml.hbs:2
-#: views/subscription/widget-subscribe.hbs:5
-msgid ""
-"We need to confirm your email address. To complete the subscription process, "
-"please click the link in the email we just sent you."
-msgstr ""
-"Wir müssen Ihre E-Mail-Adresse bestätigen. Um den Abo-Prozess abzuschließen, "
-"klicken Sie bitte auf den Link in der E-Mail, die wir Ihnen gerade geschickt "
-"haben."
-
-#: views/subscription/web-manage-address.mjml.hbs:1
-msgid "Update Your Email Address"
-msgstr "E-Mail-Adresse aktualisieren"
-
-#: views/subscription/web-manage.mjml.hbs:1
-msgid "Update Your Preferences"
-msgstr "Einstellungen aktualisieren"
-
-#: views/subscription/web-subscribe.mjml.hbs:1
-msgid "Subscribe to List"
-msgstr "Diese Liste abonnieren"
-
-#: views/subscription/web-subscribed.mjml.hbs:3
-msgid "Thank you for subscribing!"
-msgstr "Danke fürs Abonnieren!"
-
-#: views/subscription/web-unsubscribe-notice.mjml.hbs:1
-msgid "Unsubscribe Successful"
-msgstr "Erfolgreich Deabonniert"
-
-#: views/subscription/web-unsubscribe-notice.mjml.hbs:2
-msgid "You have been removed from:"
-msgstr "Sie wurden entfernt von:"
-
-#: views/subscription/web-unsubscribe.mjml.hbs:2
-msgid "Enter your email address to unsubscribe from:"
-msgstr "Geben Sie Ihre E-Mail-Adresse ein, um sich abzumelden von:"
-
-#: views/subscription/web-updated-notice.mjml.hbs:1
-msgid "Profile Updated"
-msgstr "Einstellungen aktualisiert"
-
-#: views/subscription/web-updated-notice.mjml.hbs:2
-msgid "Your profile information has been updated."
-msgstr "Ihre Profilinformationen wurden aktualisiert."
-
-#: views/subscription/widget-subscribe.hbs:2
-msgid "Sending ..."
-msgstr "Am senden …"
-
-#: views/subscription/widget-subscribe.hbs:3
-msgid "It looks like you are already subscribed to this list."
-msgstr "Es sieht so aus, als hätten Sie diese Liste bereits abonniert."
-
-#: views/templates/create.hbs:5 views/templates/edit.hbs:6
-msgid "Template name"
-msgstr "Vorlagen-Name"
-
-#: views/templates/create.hbs:6 views/templates/edit.hbs:7
-msgid "Name for this template, eg. Newsletter"
-msgstr "Name für diese Vorlage, z.B. Newsletter"
-
-#: views/templates/create.hbs:7
-msgid "HTML Editor"
-msgstr "HTML Editor"
-
-#: views/templates/create.hbs:10 views/templates/edit.hbs:9
-msgid "Optional comments about this template"
-msgstr "Optionale Kommentare zu dieser Vorlage"
-
-#: views/templates/edit.hbs:5
-msgid "Back to templates"
-msgstr "Zurück zu Vorlagen"
-
-#: views/templates/edit.hbs:11
-msgid "Duplicate"
-msgstr "Duplizieren"
-
-#: views/triggers/create-select.hbs:2 views/triggers/create.hbs:2
-#: views/triggers/edit.hbs:2 views/triggers/triggered.hbs:2
-#: views/triggers/triggers.hbs:2 views/triggers/triggers.hbs:4
-msgid "Automation Triggers"
-msgstr "Automatisierungs-Trigger"
-
-#: views/triggers/create-select.hbs:5
-msgid "Select a list for the trigger"
-msgstr "Wählen Sie eine Liste für diesen Trigger"
-
-#: views/triggers/create.hbs:5 views/triggers/edit.hbs:6
-msgid "Trigger name"
-msgstr "Trigger-Name"
-
-#: views/triggers/create.hbs:6 views/triggers/edit.hbs:7
-msgid "Name for this trigger, eg. Inactive subscribers"
-msgstr "Name für diesen Trigger, z.B. Inaktive Abonnenten"
-
-#: views/triggers/create.hbs:8 views/triggers/edit.hbs:9
-msgid "Optional comments about this trigger"
-msgstr "Optionale Kommentare zu diesem Trigger"
-
-#: views/triggers/create.hbs:12 views/triggers/edit.hbs:14
-msgid "Trigger rule"
-msgstr "Trigger-Regel"
-
-#: views/triggers/create.hbs:13 views/triggers/edit.hbs:15
-msgid "Trigger fires"
-msgstr "Trigger löst aus"
-
-#: views/triggers/create.hbs:14 views/triggers/edit.hbs:16
-msgid "days after:"
-msgstr "Tage nach:"
-
-#: views/triggers/create.hbs:15 views/triggers/edit.hbs:17
-msgid "Subscription"
-msgstr "Abonnement"
-
-#: views/triggers/create.hbs:16 views/triggers/create.hbs:21
-#: views/triggers/edit.hbs:18 views/triggers/edit.hbs:23
-msgid "Event"
-msgstr "Ereignis"
-
-#: views/triggers/create.hbs:18 views/triggers/create.hbs:19
-#: views/triggers/create.hbs:25 views/triggers/edit.hbs:20
-#: views/triggers/edit.hbs:21 views/triggers/edit.hbs:27
-msgid "Campaign"
-msgstr "Kampagne"
-
-#: views/triggers/create.hbs:23 views/triggers/edit.hbs:25
-msgid "Trigger action"
-msgstr "Trigger-Aktion"
-
-#: views/triggers/create.hbs:24 views/triggers/edit.hbs:26
-msgid "Send campaign"
-msgstr "Kampagne senden"
-
-#: views/triggers/edit.hbs:3 views/triggers/edit.hbs:4
-msgid "Edit Trigger"
-msgstr "Trigger bearbeiten"
-
-#: views/triggers/edit.hbs:5
-msgid "Back to triggers"
-msgstr "Zurück zu Triggers"
-
-#: views/triggers/edit.hbs:11
-msgid "Trigger is enabled"
-msgstr "Trigger ist aktiviert"
-
-#: views/triggers/edit.hbs:29
-msgid "Delete Trigger"
-msgstr "Trigger löschen"
-
-#: views/triggers/triggered.hbs:3
-msgid "Triggered"
-msgstr "Ausgelöst"
-
-#: views/triggers/triggered.hbs:4
-msgid "Triggered subscribers"
-msgstr "Triggered Abonnenten"
-
-#: views/triggers/triggered.hbs:5
-msgid "Subscribers who caused this trigger to fire"
-msgstr "Abonnenten, die diesen Trigger ausgelöst haben"
-
-#: views/triggers/triggered.hbs:9
-msgid "Triggered time"
-msgstr "Auslösungszeit"
-
-#: views/triggers/triggers.hbs:9
-msgid "Trigger"
-msgstr "Trigger"
-
-#: views/triggers/triggers.hbs:10
-msgid "Target Campaign"
-msgstr "Ziel-Kampagne"
-
-#: views/triggers/triggers.hbs:11
-msgid "Triggered count"
-msgstr "Anzahl Auslösungen"
-
-#: views/users/account.hbs:4
-msgid "This account is managed through LDAP."
-msgstr "Dieses Konto wird über LDAP verwaltet."
-
-#: views/users/account.hbs:5
-msgid "Associated Email Address"
-msgstr "Zugehörige E-Mail-Adresse"
-
-#: views/users/account.hbs:8
-msgid "Your e-mail address"
-msgstr "Ihre E-Mail-Adresse"
-
-#: views/users/account.hbs:9
-msgid ""
-"This address is used for account recovery in case you lose your password"
-msgstr ""
-"Diese Adresse wird für die Wiederherstellung des Kontos verwendet, falls Sie "
-"Ihr Passwort vergessen haben"
-
-#: views/users/account.hbs:10
-msgid "Password change"
-msgstr "Passwortänderung"
-
-#: views/users/account.hbs:11
-msgid ""
-"You only need to fill out this form if you want to change your current "
-"password"
-msgstr ""
-"Sie müssen dieses Formular nur ausfüllen, wenn Sie Ihr aktuelles Passwort "
-"ändern möchten"
-
-#: views/users/account.hbs:12 views/users/account.hbs:13
-msgid "Current Password"
-msgstr "Aktuelles Passwort"
-
-#: views/users/account.hbs:14 views/users/account.hbs:15
-#: views/users/reset.hbs:6 views/users/reset.hbs:7
-msgid "New Password"
-msgstr "Neues Passwort"
-
-#: views/users/account.hbs:16 views/users/reset.hbs:8
-msgid "Confirm Password"
-msgstr "Passwort bestätigen"
-
-#: views/users/account.hbs:17 views/users/reset.hbs:9
-msgid "Confirm New Password"
-msgstr "Neues Passwort bestätigen"
-
-#: views/users/api.hbs:4
-msgid "Are you sure? Resetting would invalidate the currently existing token."
-msgstr ""
-"Sind Sie sicher? Das Zurücksetzen würde das aktuell vorhandene Token "
-"ungültig machen."
-
-#: views/users/api.hbs:5
-msgid "Are you sure?"
-msgstr "Sind Sie sicher?"
-
-#: views/users/api.hbs:6
-msgid "Reset Access Token"
-msgstr "Access Token zurücksetzen"
-
-#: views/users/api.hbs:7
-msgid "Generate Access Token"
-msgstr "Access Token erstellen"
-
-#: views/users/api.hbs:8
-msgid "Personal access token:"
-msgstr "Persönlicher Access Token:"
-
-#: views/users/api.hbs:9
-msgid "Access token not yet generated"
-msgstr "Access Token noch nicht erstellt"
-
-#: views/users/api.hbs:10
-msgid "Notes about the API"
-msgstr "Notizen zur API"
-
-#: views/users/api.hbs:11
-msgid ""
-"API response is a JSON structure with error and data"
-"code> properties. If the response error has a value set then "
-"the request failed."
-msgstr ""
-"API-Antwort ist eine JSON-Struktur mit error und data"
-"code> properties. Wenn die Antwort error einen Wert hat, ist "
-"die Anfrage fehlgeschlagen."
-
-#: views/users/api.hbs:12
-msgid ""
-"You need to define proper Content-Type when making a request. "
-"You can either use application/x-www-form-urlencoded for normal "
-"form data or application/json for a JSON payload. Using "
-"multipart/form-data is not supported."
-msgstr ""
-"Sie müssen bei der Anfrage einen korrekten Content-Type "
-"definieren. Sie können entweder application/x-www-form-urlencoded"
-"code> für normale Formulardaten oder application/json für eine "
-"JSON-Payload verwenden. Nicht unterstützt wird multipart/form-data"
-"code>."
-
-#: views/users/api.hbs:13
-msgid "Add subscription"
-msgstr "Abonnement hinzufügen"
-
-#: views/users/api.hbs:14
-msgid ""
-"This API call either inserts a new subscription or updates existing. Fields "
-"not included are left as is, so if you update only LAST_NAME value, then "
-"FIRST_NAME is kept untouched for an existing subscription."
-msgstr ""
-"Dieser API-Aufruf fügt entweder ein neues Abonnement hinzu oder aktualisiert "
-"ein bereits vorhandenes Abonnement. Felder, die nicht enthalten sind, "
-"bleiben unverändert. Wenn Sie also nur den Wert LAST_NAME aktualisieren, "
-"bleibt FIRST_NAME für ein bestehendes Abonnement unverändert."
-
-#: views/users/api.hbs:15 views/users/api.hbs:17 views/users/api.hbs:30
-#: views/users/api.hbs:32 views/users/api.hbs:38 views/users/api.hbs:40
-#: views/users/api.hbs:46 views/users/api.hbs:57 views/users/api.hbs:59
-#: views/users/api.hbs:65 views/users/api.hbs:67
-msgid "arguments"
-msgstr "Argumente"
-
-#: views/users/api.hbs:16 views/users/api.hbs:31 views/users/api.hbs:39
-#: views/users/api.hbs:47 views/users/api.hbs:58 views/users/api.hbs:66
-msgid "your personal access token"
-msgstr "Ihr persönlicher Access Token"
-
-#: views/users/api.hbs:18 views/users/api.hbs:33 views/users/api.hbs:41
-msgid "subscriber's email address"
-msgstr "E-Mail-Adresse des Abonnenten"
-
-#: views/users/api.hbs:19 views/users/api.hbs:34 views/users/api.hbs:42
-#: views/users/api.hbs:61 views/users/api.hbs:69
-msgid "required"
-msgstr "erforderlich"
-
-#: views/users/api.hbs:20
-msgid "subscriber's first name"
-msgstr "Vorname des Abonnenten"
-
-#: views/users/api.hbs:21
-msgid "subscriber's last name"
-msgstr "Nachname des Abonnenten"
-
-#: views/users/api.hbs:22
-msgid ""
-"subscriber's timezone (eg. \"Europe/Tallinn\", \"PST\" or \"UTC\"). If not "
-"set defaults to \"UTC\""
-msgstr ""
-"Zeitzone des Abonnenten (zB \"Europa/Berlin“, \"PST\" oder \"UTC\"). Falls "
-"nicht gesetzt wird \"UTC\" verwendet."
-
-#: views/users/api.hbs:23
-msgid ""
-"custom field value. Use yes/no for option group values (checkboxes, radios, "
-"drop downs)"
-msgstr ""
-"Benutzerdefinierter Feldwert. Verwenden Sie Ja/Nein für Optionsgruppenwerte "
-"(Checkboxen, Radios-Buttons, Dropdowns)"
-
-#: views/users/api.hbs:24
-msgid "Additional POST arguments"
-msgstr "Weitere POST-Argumente"
-
-#: views/users/api.hbs:25
-msgid ""
-"set to \"yes\" if you want to make sure the email is marked as subscribed "
-"even if it was previously marked as unsubscribed. If the email was already "
-"unsubscribed/blocked then subscription status is not changed"
-msgstr ""
-"Markieren Sie \"Ja\", wenn Sie sicherstellen möchten, dass die E-Mail als "
-"abonniert markiert ist, auch wenn sie zuvor als abgemeldet markiert wurde. "
-"Wenn die E-Mail-Adresse bereits abbestellt/gesperrt ist, wird der "
-"Abonnementstatus nicht geändert"
-
-#: views/users/api.hbs:26
-msgid ""
-"set to \"yes\" if you want to send confirmation email to the subscriber "
-"before actually marking as subscribed"
-msgstr ""
-"Markieren Sie \"Ja\", wenn Sie eine Bestätigungs-E-Mail an den Abonnenten "
-"senden möchten, bevor der Abonnent tatsächlich als abonniert markiert wird"
-
-#: views/users/api.hbs:28
-msgid "Remove subscription"
-msgstr "Abonnement entfernen"
-
-#: views/users/api.hbs:29
-msgid "This API call marks a subscription as unsubscribed"
-msgstr "Dieser API-Aufruf markiert ein Abonnement als abbestellt"
-
-#: views/users/api.hbs:36
-msgid "Delete subscription"
-msgstr "Abonnement löschen"
-
-#: views/users/api.hbs:37
-msgid "This API call deletes a subscription"
-msgstr "Dieser API-Aufruf löscht ein Abonnement"
-
-#: views/users/api.hbs:44
-msgid "Get list of blacklisted emails"
-msgstr ""
-
-#: views/users/api.hbs:45
-msgid "This API call get list of blacklisted emails."
-msgstr ""
-
-#: views/users/api.hbs:48
-msgid "Start position"
-msgstr "Startposition"
-
-#: views/users/api.hbs:49
-msgid "optional, default 0"
-msgstr "optional, standard 0"
-
-#: views/users/api.hbs:50
-msgid "limit emails count in response"
-msgstr ""
-
-#: views/users/api.hbs:51
-msgid "optional, default 10000"
-msgstr "optional, standard 10000"
-
-#: views/users/api.hbs:52
-msgid "filter by part of email"
-msgstr ""
-
-#: views/users/api.hbs:53
-msgid "optional, default ''"
-msgstr "optional, standard ''"
-
-#: views/users/api.hbs:56
-msgid "This API call either add emails to blacklist"
-msgstr ""
-
-#: views/users/api.hbs:60 views/users/api.hbs:68
-msgid "email address"
-msgstr "E-Mail-Adresse"
-
-#: views/users/api.hbs:63
-msgid "Delete email from blacklist"
-msgstr "E-Mail aus der Blacklist löschen"
-
-#: views/users/api.hbs:64
-msgid "This API call either delete emails from blacklist"
-msgstr ""
-
-#: views/users/forgot.hbs:3 views/users/reset.hbs:3
-msgid "Password Reset"
-msgstr "Passwort zurücksetzen"
-
-#: views/users/forgot.hbs:4
-msgid "Reset your password?"
-msgstr "Ihr Passwort zurücksetzen?"
-
-#: views/users/forgot.hbs:5
-msgid "Accounts are managed through LDAP."
-msgstr "Accounts werden über LDAP verwaltet."
-
-#: views/users/forgot.hbs:6 views/users/reset.hbs:10
-msgid "Reset Password"
-msgstr "Passwort zurücksetzen"
-
-#: views/users/forgot.hbs:7
-msgid ""
-"Please provide the username or email address that you used when you signed "
-"up for your Mailtrain account."
-msgstr ""
-"Bitte geben Sie den Benutzernamen oder die E-Mail-Adresse an, die Sie bei "
-"der Anmeldung für Ihr Mailtrain-Konto verwendet haben."
-
-#: views/users/forgot.hbs:8
-msgid "We will send you an email that will allow you to reset your password."
-msgstr ""
-"Wir senden Ihnen eine E-Mail, mit der Sie Ihr Passwort zurücksetzen können."
-
-#: views/users/forgot.hbs:10
-msgid "Username or email address"
-msgstr "Benutzername oder E-Mail-Adresse"
-
-#: views/users/forgot.hbs:11
-msgid "Send verification email"
-msgstr "Verifizierung E-Mail senden"
-
-#: views/users/login.hbs:8
-msgid "Remember me"
-msgstr "Angemeldet bleiben"
-
-#: views/users/login.hbs:11 views/users/login.hbs:12
-msgid "Forgot password?"
-msgstr "Passwort vergessen?"
-
-#: views/users/reset.hbs:4
-msgid "Choose your new password"
-msgstr "Wähle Sie Ihr neues Passwort"
-
-#: views/users/reset.hbs:5
-msgid "Please enter a new password."
-msgstr "Bitte geben Sie ein neues Passwort ein."
-
-#: lib/editor-helpers.js:17 routes/templates.js:95
-msgid "Could not find template with specified ID"
-msgstr "Konnte keine Vorlage mit angegebener ID finden"
-
-#: lib/editor-helpers.js:33 routes/archive.js:145 routes/campaigns.js:131
-#: routes/campaigns.js:284 routes/campaigns.js:379 routes/campaigns.js:427
-#: routes/campaigns.js:467 routes/campaigns.js:844 routes/campaigns.js:867
-#: routes/campaigns.js:886 routes/campaigns.js:908 routes/triggers.js:146
-msgid "Could not find campaign with specified ID"
-msgstr "Konnte keine Kampagne mit dieser ID finden"
-
-#: lib/editor-helpers.js:47 routes/editorapi.js:308
-msgid "Invalid resource type"
-msgstr "Ungültiger Ressourcentyp"
-
-#: lib/feed.js:31
-msgid "Bad status code %s"
-msgstr "Bad Statuscode %s"
-
-#: lib/helpers.js:32
-msgid "URL that points to the unsubscribe page"
-msgstr "URL, die auf die Abmeldungsseite verweist"
-
-#: lib/helpers.js:35
-msgid "URL that points to the preferences page of the subscriber"
-msgstr ""
-"URL, die auf die Persönliche-Einstellungs-Seite des Teilnehmers verweist"
-
-#: lib/helpers.js:38
-msgid "URL to preview the message in a browser"
-msgstr "URL zur Vorschau der E-Mail im Browser"
-
-#: lib/helpers.js:44 lib/models/segments.js:31
-msgid "First name"
-msgstr "Vorname"
-
-#: lib/helpers.js:47 lib/models/segments.js:35
-msgid "Last name"
-msgstr "Nachname"
-
-#: lib/helpers.js:50
-msgid "Full name (first and last name combined)"
-msgstr "Vollständiger Name (Vor- und Nachname kombiniert)"
-
-#: lib/helpers.js:53
-msgid "Unique ID that identifies the recipient"
-msgstr "Eindeutige ID, die den Empfänger identifiziert"
-
-#: lib/helpers.js:56
-msgid "Unique ID that identifies the list used for this campaign"
-msgstr ""
-"Eindeutige ID, welche die für diese Kampagne verwendete Liste identifiziert"
-
-#: lib/helpers.js:59
-msgid "Unique ID that identifies current campaign"
-msgstr "Eindeutige ID, welche die aktuelle Kampagne identifiziert"
-
-#: lib/helpers.js:67 lib/helpers.js:79
-msgid "content from an RSS entry"
-msgstr "Inhalt aus einem RSS-Eintrag"
-
-#: lib/helpers.js:70
-msgid "RSS entry title"
-msgstr ""
-
-#: lib/helpers.js:73
-msgid "RSS entry date"
-msgstr ""
-
-#: lib/helpers.js:76
-msgid "RSS entry link"
-msgstr ""
-
-#: lib/helpers.js:82
-msgid "RSS entry summary"
-msgstr ""
-
-#: lib/helpers.js:85
-msgid "RSS entry image URL"
-msgstr ""
-
-#: lib/mailer.js:245
-msgid "Invalid mail transport"
-msgstr "Ungültiger Mail-Transport"
-
-#: lib/models/campaigns.js:105 lib/models/campaigns.js:132
-#: lib/models/campaigns.js:205 lib/models/campaigns.js:328
-#: lib/models/campaigns.js:589 lib/models/campaigns.js:721
-msgid "Missing Campaign ID"
-msgstr "Kampagnen-ID fehlt"
-
-#: lib/models/campaigns.js:241
-msgid "Emtpy or too large attahcment"
-msgstr "Leere oder zu große Anhangsdatei"
-
-#: lib/models/campaigns.js:407 lib/models/campaigns.js:598
-msgid "Campaign Name must be set"
-msgstr "Kampagnenname ist erforderlich"
-
-#: lib/models/campaigns.js:411
-msgid "RSS URL must be set and needs to be a valid URL"
-msgstr "RSS URL ist erforderlich und muss eine gültige URL sein"
-
-#: lib/models/campaigns.js:567
-msgid "Selected template not found"
-msgstr "Ausgewählte Vorlage nicht gefunden"
-
-#: lib/models/campaigns.js:922
-msgid "Invalid or missing message ID"
-msgstr "Ungültige oder fehlende Nachrichten-ID"
-
-#: lib/models/fields.js:24
-msgid "Drop Down"
-msgstr "Dropdown-Liste"
-
-#: lib/models/fields.js:25
-msgid "Date (MM/DD/YYY)"
-msgstr "Datum (MM/DD/YYY)"
-
-#: lib/models/fields.js:29
-msgid "JSON value for custom rendering"
-msgstr "JSON-Wert für benutzerdefiniertes Rendering"
-
-#: lib/models/fields.js:30
-msgid "Option"
-msgstr "Option"
-
-#: lib/models/fields.js:53 lib/models/fields.js:98 lib/models/fields.js:123
-#: lib/models/forms.js:37 lib/models/lists.js:72 lib/models/lists.js:172
-#: lib/models/lists.js:212 lib/models/segments.js:43 lib/models/segments.js:176
-#: lib/models/subscriptions.js:74 lib/models/subscriptions.js:574
-#: lib/models/subscriptions.js:637 lib/models/subscriptions.js:823
-#: lib/models/subscriptions.js:926 lib/models/subscriptions.js:980
-#: lib/models/subscriptions.js:1043 lib/models/subscriptions.js:1086
-msgid "Missing List ID"
-msgstr "Listen-ID fehlt"
-
-#: lib/models/fields.js:129
-msgid "Option field requires a group to be selected"
-msgstr "Ein Optionsfeld erfordert eine ausgewählte Gruppe"
-
-#: lib/models/fields.js:149 lib/models/fields.js:199
-msgid "Missing Field ID"
-msgstr "Feld-ID fehlt"
-
-#: lib/models/fields.js:153 lib/models/segments.js:185
-#: lib/models/segments.js:225
-msgid "Field Name must be set"
-msgstr "Feldname ist erforderlich"
-
-#: lib/models/fields.js:216
-msgid "Custom field not found"
-msgstr "Feld nicht gefunden"
-
-#: lib/models/fields.js:289
-msgid "Unknown column type %s"
-msgstr "Unbekannter Spaltentyp %s"
-
-#: lib/models/fields.js:293
-msgid "Missing column name"
-msgstr "Spaltenname fehlt"
-
-#: lib/models/fields.js:297
-msgid "Missing list ID"
-msgstr "Listen-ID fehlt"
-
-#: lib/models/fields.js:305
-msgid "Provided List ID not found"
-msgstr "Die Listen-ID wurde nicht gefunden"
-
-#: lib/models/forms.js:61 lib/models/forms.js:104 lib/models/forms.js:192
-#: lib/models/forms.js:282
-msgid "Missing Form ID"
-msgstr "Formular ID fehlt"
-
-#: lib/models/forms.js:112 lib/models/forms.js:196
-msgid "Form Name must be set"
-msgstr "Formular-Name ist erforderlich"
-
-#: lib/models/forms.js:298
-msgid "Custom form not found"
-msgstr "Formular nicht gefunden"
-
-#: lib/models/links.js:329 routes/campaigns.js:533 routes/campaigns.js:581
-#: routes/campaigns.js:621 routes/campaigns.js:671 services/sender.js:305
-msgid "Campaign not found"
-msgstr "Kampagne nicht gefunden"
-
-#: lib/models/links.js:337 routes/lists.js:177 services/sender.js:312
-msgid "List not found"
-msgstr "Liste nicht gefunden"
-
-#: lib/models/links.js:345
-msgid "Subscription not found"
-msgstr "Abonnement nicht gefunden"
-
-#: lib/models/lists.js:110 lib/models/lists.js:176
-msgid "List Name must be set"
-msgstr "Listennamen ist erforderlich"
-
-#: lib/models/lists.js:241
-msgid "Missing List CID"
-msgstr "Listen CID fehlt"
-
-#: lib/models/report-templates.js:26 lib/models/report-templates.js:70
-#: lib/models/report-templates.js:142
-msgid "Missing report template ID"
-msgstr "Report-Vorlagen-ID fehlt"
-
-#: lib/models/report-templates.js:77
-msgid "Report template name must be set"
-msgstr "Report-Vorlagen-Name ist erforderlich"
-
-#: lib/models/reports.js:39 lib/models/reports.js:109 lib/models/reports.js:187
-msgid "Missing report ID"
-msgstr "Report-ID fehlt"
-
-#: lib/models/reports.js:115
-msgid "Report name must be set"
-msgstr "Report-Name ist erforderlich"
-
-#: lib/models/segments.js:15
-msgid "Signup country"
-msgstr "Anmeldungs-Land"
-
-#: lib/models/segments.js:19 lib/models/triggers.js:12
-msgid "Sign up date"
-msgstr "Anmeldungs-Datum"
-
-#: lib/models/segments.js:23 lib/models/triggers.js:16
-msgid "Latest open"
-msgstr "Letzte Öffnung"
-
-#: lib/models/segments.js:27 lib/models/triggers.js:20
-msgid "Latest click"
-msgstr "Letzter Klick"
-
-#: lib/models/segments.js:69 lib/models/segments.js:216
-#: lib/models/segments.js:256 lib/models/segments.js:278
-msgid "Missing Segment ID"
-msgstr "Segment ID fehlt"
-
-#: lib/models/segments.js:85 lib/models/segments.js:549
-#: lib/models/segments.js:658
-msgid "Segment not found"
-msgstr "Segment nicht gefunden"
-
-#: lib/models/segments.js:146 lib/models/segments.js:147
-#: lib/models/segments.js:408 lib/models/segments.js:409
-msgid "%s days after today"
-msgstr "%s Tage nach heute"
-
-#: lib/models/segments.js:146 lib/models/segments.js:147
-#: lib/models/segments.js:408 lib/models/segments.js:409
-msgid "%s days before today"
-msgstr "%s Tage vor heute"
-
-#: lib/models/segments.js:148 lib/models/segments.js:410
-msgid "today"
-msgstr "heute"
-
-#: lib/models/segments.js:189 lib/models/segments.js:229
-msgid "Invalid segment rule type"
-msgstr "Ungültiger Segment-Regel-Typ"
-
-#: lib/models/segments.js:289 lib/models/segments.js:454 routes/segments.js:266
-#: routes/segments.js:300 routes/segments.js:370 routes/segments.js:381
-msgid "Selected segment not found"
-msgstr "Ausgewähltes Segment nicht gefunden"
-
-#: lib/models/segments.js:294 lib/models/segments.js:459 routes/segments.js:272
-#: routes/segments.js:306 routes/segments.js:387
-msgid "Invalid rule type"
-msgstr "Ungültiger Regel-Typ"
-
-#: lib/models/segments.js:358 lib/models/segments.js:434
-#: lib/models/segments.js:524
-msgid "Missing Rule ID"
-msgstr "Regel-ID fehlt"
-
-#: lib/models/segments.js:374
-msgid "Specified rule not found"
-msgstr "Die Regel wurde nicht gefunden"
-
-#: lib/models/segments.js:385
-msgid "Specified segment not found"
-msgstr "Das Segment wurde nicht gefunden"
-
-#: lib/models/segments.js:445
-msgid "Selected rule not found"
-msgstr "Ausgewählte Regel nicht gefunden"
-
-#: lib/models/subscriptions.js:148
-msgid "%s: Please Confirm Subscription"
-msgstr "%s: Bitte bestätigen Sie Ihr Abonnement"
-
-#: lib/models/subscriptions.js:258
-msgid "Could not save subscription"
-msgstr "Abonnement konnte nicht gespeichert werden"
-
-#: lib/models/subscriptions.js:441 lib/models/subscriptions.js:471
-msgid "Missing Subscription ID"
-msgstr "Abonnement-ID fehlt"
-
-#: lib/models/subscriptions.js:499
-msgid "Missing Subscription email address"
-msgstr "Abonnement E-Mail Adresse fehlt"
-
-#: lib/models/subscriptions.js:578 lib/models/subscriptions.js:827
-#: lib/models/subscriptions.js:1090
-msgid "Missing subscription ID"
-msgstr "Abonnement-ID fehlt"
-
-#: lib/models/subscriptions.js:641
-msgid "Missing email address"
-msgstr "E-Mail-Adresse fehlt"
-
-#: lib/models/subscriptions.js:930 lib/models/subscriptions.js:984
-#: lib/models/subscriptions.js:1020
-msgid "Missing Import ID"
-msgstr "Import-ID fehlt"
-
-#: lib/models/subscriptions.js:1112
-msgid "Unknown subscription ID"
-msgstr "Unbekannte Abonnement-ID"
-
-#: lib/models/subscriptions.js:1117
-msgid "Nothing seems to be changed"
-msgstr "Nichts scheint sich geändert zu haben"
-
-#: lib/models/subscriptions.js:1131
-msgid "This address is already registered by someone else"
-msgstr "Diese Adresse ist bereits von jemand anderem registriert"
-
-#: lib/models/templates.js:26 lib/models/templates.js:100
-#: lib/models/templates.js:144
-msgid "Missing Template ID"
-msgstr "Vorlagen ID fehlt"
-
-#: lib/models/templates.js:55 lib/models/templates.js:104
-msgid "Template Name must be set"
-msgstr "Vorlagen-Name ist erforderlich"
-
-#: lib/models/triggers.js:29
-msgid "Has Opened"
-msgstr "Hat geöffnet"
-
-#: lib/models/triggers.js:32
-msgid "Has Clicked"
-msgstr "Hat geklickt"
-
-#: lib/models/triggers.js:35
-msgid "Not Opened"
-msgstr "Nicht geöffnet"
-
-#: lib/models/triggers.js:38
-msgid "Not Clicked"
-msgstr "Nicht geklickt"
-
-#: lib/models/triggers.js:175 lib/models/triggers.js:212
-msgid "Missing or invalid list ID"
-msgstr "Fehlende oder ungültige Listen ID"
-
-#: lib/models/triggers.js:179 lib/models/triggers.js:264
-msgid "Days in the past are not allowed"
-msgstr "Tage in der Vergangenheit sind nicht erlaubt"
-
-#: lib/models/triggers.js:183 lib/models/triggers.js:204
-#: lib/models/triggers.js:268 lib/models/triggers.js:289
-msgid "Missing or invalid trigger rule"
-msgstr "Fehlende oder ungültige Trigger-Regel"
-
-#: lib/models/triggers.js:190 lib/models/triggers.js:275
-msgid "Invalid subscription configuration"
-msgstr "Ungültige Abonnement-Konfiguration"
-
-#: lib/models/triggers.js:197 lib/models/triggers.js:282
-msgid "Invalid campaign configuration"
-msgstr "Kampagnen Konfiguration ungültig"
-
-#: lib/models/triggers.js:200 lib/models/triggers.js:285
-msgid "A campaing can not be a target for itself"
-msgstr "Eine Kampagne kann kein Ziel für sich selbst sein"
-
-#: lib/models/triggers.js:233
-msgid "Could not store trigger row"
-msgstr "Trigger-Zeile konnte nicht gespeichert werden"
-
-#: lib/models/triggers.js:250
-msgid "Missing or invalid Trigger ID"
-msgstr "Trigger-ID fehlt oder ist ungültig"
-
-#: lib/models/triggers.js:317
-msgid "Missing Trigger ID"
-msgstr "Trigger-ID fehlt"
-
-#: lib/models/users.js:103
-msgid "Could not store user row"
-msgstr "Der Benutzer konnte nicht gespeichert werden"
-
-#: lib/models/users.js:173
-msgid "Email Address must be set"
-msgstr "E-Mail-Adresse ist erforderlich"
-
-#: lib/models/users.js:184
-msgid "Failed to check user data"
-msgstr "Fehler beim Überprüfen der Benutzerdaten"
-
-#: lib/models/users.js:195
-msgid ""
-"Can't change email as another user with the same email address already exists"
-msgstr ""
-"E-Mail-Adresse konnte nicht geändert werden, da ein anderer Benutzer mit "
-"derselben E-Mail-Adresse bereits existiert"
-
-#: lib/models/users.js:212
-msgid "Incorrect current password"
-msgstr "Aktuelles Passwort inkorrekt"
-
-#: lib/models/users.js:216
-msgid "New password not set"
-msgstr "Neues Passwort fehlt"
-
-#: lib/models/users.js:220
-msgid "Passwords do not match"
-msgstr "Passwörter stimmen nicht überein"
-
-#: lib/models/users.js:258
-msgid "User ID not set"
-msgstr "Benutzer-ID nicht vorhanden"
-
-#: lib/models/users.js:286
-msgid "Username must be set"
-msgstr "Benutzername ist erforderlich"
-
-#: lib/models/users.js:323
-msgid "Mailer password change request"
-msgstr "Mailer Passwort Änderungsanfrage"
-
-#: lib/models/users.js:347 lib/models/users.js:367
-msgid "Missing username or reset token"
-msgstr "Fehlender Benutzername oder Reset-Token"
-
-#: lib/models/users.js:371
-msgid "Invalid new password"
-msgstr "Neues Passwort ist ungültig"
-
-#: lib/passport.js:40
-msgid "%s logged out"
-msgstr "%s hat sich abgemeldet"
-
-#: lib/passport.js:53
-msgid "Failed to authenticate user"
-msgstr "Der Benutzer konnte nicht authentifiziert werden"
-
-#: lib/passport.js:69
-msgid "Logged in as %s"
-msgstr "Eingeloggt als %s"
-
-#: lib/passport.js:128
-msgid "Incorrect username or password"
-msgstr "Falscher Benutzername oder Passwort"
-
-#: lib/subscription-mail-helpers.js:39
-msgid "%s: Email Address Already Registered"
-msgstr "%s: Email-Adresse bereits registriert"
-
-#: lib/subscription-mail-helpers.js:49
-msgid "%s: Please Confirm Email Change in Subscription"
-msgstr "%s: Bitte bestätigen Sie die Änderung der Email-Adresse"
-
-#: lib/subscription-mail-helpers.js:69
-msgid "%s: Please Confirm Unsubscription"
-msgstr "%s: Bitte bestätigen Sie die Kündigung des Abonnements"
-
-#: lib/subscription-mail-helpers.js:76
-msgid "%s: Unsubscription Confirmed"
-msgstr "%s: Kündigung des Abonnements bestätigt"
-
-#: lib/tools.js:148
-msgid "Blocked email address \"%s\""
-msgstr "Gesperrte E-Mail-Adresse \"%s\""
-
-#: lib/tools.js:157
-msgid "Invalid email address \"%s\"."
-msgstr "Ungültige E-Mail-Adresse \"%s\"."
-
-#: lib/tools.js:160
-msgid "MX record not found for domain"
-msgstr "MX-Record für die Domäne nicht gefunden"
-
-#: lib/tools.js:163
-msgid "Address domain not found"
-msgstr "Address-Domain nicht gefunden"
-
-#: lib/tools.js:166
-msgid "Address domain name is required"
-msgstr "Address-Domain-Name ist erforderlich"
-
-#: routes/archive.js:31 routes/archive.js:43 routes/archive.js:55 app.js:224
-msgid "Not Found"
-msgstr "Nicht gefunden"
-
-#: routes/archive.js:121 services/sender.js:449
-msgid "Received status code %s from %s"
-msgstr "Empfangener Statuscode %s von %s"
-
-#: routes/archive.js:153 routes/campaigns.js:894
-msgid "Attachment not found"
-msgstr "Anhangs-Datei nicht gefunden"
-
-#: routes/blacklist.js:13 routes/campaigns.js:26 routes/editorapi.js:35
-#: routes/fields.js:13 routes/forms.js:16 routes/grapejs.js:13
-#: routes/lists.js:50 routes/mosaico.js:14 routes/report-templates.js:20
-#: routes/reports.js:22 routes/segments.js:13 routes/settings.js:23
-#: routes/templates.js:18 routes/triggers.js:18 routes/users.js:75
-#: routes/users.js:120
-msgid "Need to be logged in to access restricted content"
-msgstr "Sie müssen angemeldet sein, um auf geschützte Inhalte zuzugreifen."
-
-#: routes/campaigns.js:117
-msgid "Could not create campaign"
-msgstr "Kampagne konnte nicht erstellt werden"
-
-#: routes/campaigns.js:120
-msgid "Campaign “%s” created"
-msgstr "Die Kampagne “%s” wurde erstellt"
-
-#: routes/campaigns.js:209
-msgid "Campaign settings updated"
-msgstr "Kampagnen-Einstellungen aktualisiert"
-
-#: routes/campaigns.js:211
-msgid "Campaign settings not updated"
-msgstr "Kampagnen-Einstellungen nicht aktualisiert"
-
-#: routes/campaigns.js:227 routes/campaigns.js:744
-msgid "Campaign deleted"
-msgstr "Kampagne gelöscht"
-
-#: routes/campaigns.js:229 routes/campaigns.js:746
-msgid "Could not delete specified campaign"
-msgstr "Die Kampagne konnte nicht gelöscht werden"
-
-#: routes/campaigns.js:248
-msgid "Idling"
-msgstr "Ruhend"
-
-#: routes/campaigns.js:251
-msgid "Scheduled"
-msgstr "Geplant"
-
-#: routes/campaigns.js:257
-msgid "Paused"
-msgstr "Pausiert"
-
-#: routes/campaigns.js:259
-msgid "Inactive"
-msgstr "Inaktiv"
-
-#: routes/campaigns.js:261
-msgid "Active"
-msgstr "Aktiv"
-
-#: routes/campaigns.js:263
-msgid "Other"
-msgstr "Andere"
-
-#: routes/campaigns.js:421
-msgid "Unknown status selector"
-msgstr "Unbekannter Status-Selektor"
-
-#: routes/campaigns.js:762
-msgid "Scheduled sending"
-msgstr "Senden geplant"
-
-#: routes/campaigns.js:764
-msgid "Could not schedule sending"
-msgstr "Versand konnte nicht geplant werden"
-
-#: routes/campaigns.js:776
-msgid "Sending resumed"
-msgstr "Versand wieder aufgenommen"
-
-#: routes/campaigns.js:778
-msgid "Could not resume sending"
-msgstr "Versand konnte nicht fortgesetzt werden"
-
-#: routes/campaigns.js:790
-msgid "Sending reset"
-msgstr "Versand zurückgesetzt"
-
-#: routes/campaigns.js:792
-msgid "Could not reset sending"
-msgstr "Versand konnte nicht zurückgesetzt werden"
-
-#: routes/campaigns.js:804 routes/campaigns.js:832
-msgid "Sending paused"
-msgstr "Versand pausiert"
-
-#: routes/campaigns.js:806 routes/campaigns.js:834
-msgid "Could not pause sending"
-msgstr "Versand konnte nicht pausiert werden"
-
-#: routes/campaigns.js:818
-msgid "Sending activated"
-msgstr "Versand aktiviert"
-
-#: routes/campaigns.js:820
-msgid "Could not activate sending"
-msgstr "Versand konnte nicht aktiviert werden"
-
-#: routes/campaigns.js:855
-msgid "Attachment uploaded"
-msgstr "Anhang hochgeladen"
-
-#: routes/campaigns.js:857
-msgid "Could not store attachment"
-msgstr "Anhang konnte nicht gespeichert werden"
-
-#: routes/campaigns.js:874
-msgid "Attachment deleted"
-msgstr "Anhang gelöscht"
-
-#: routes/campaigns.js:876
-msgid "Could not delete attachment"
-msgstr "Anhang konnte nicht gelöscht werden"
-
-#: routes/editorapi.js:41
-msgid "Invalid editor name"
-msgstr "Ungültiger Editorname"
-
-#: routes/editorapi.js:237 routes/editorapi.js:275
-msgid "Method not supported"
-msgstr "Methode wird nicht unterstützt"
-
-#: routes/editorapi.js:352
-msgid "Invalid resource type or ID"
-msgstr "Ungültiger Ressourcentyp oder ID"
-
-#: routes/fields.js:28 routes/fields.js:64 routes/fields.js:118
-#: routes/forms.js:31 routes/forms.js:63 routes/forms.js:94
-#: routes/segments.js:28 routes/segments.js:59 routes/segments.js:102
-#: routes/segments.js:151 routes/segments.js:223 routes/segments.js:255
-#: routes/segments.js:289 routes/segments.js:336 routes/segments.js:359
-msgid "Selected list ID not found"
-msgstr "Ausgewählte Listen ID nicht gefunden"
-
-#: routes/fields.js:102
-msgid "Could not create custom field"
-msgstr "Feld konnte nicht erstellt werden"
-
-#: routes/fields.js:129
-msgid "Selected field not found"
-msgstr "Ausgewähltes Feld nicht gefunden"
-
-#: routes/fields.js:165
-msgid "Field settings updated"
-msgstr "Feld Einstellungen aktualisiert"
-
-#: routes/fields.js:167
-msgid "Field settings not updated"
-msgstr "Feld Einstellungen nicht aktualisiert"
-
-#: routes/fields.js:183
-msgid "Custom field deleted"
-msgstr "Benutzerdefiniertes Feld gelöscht"
-
-#: routes/fields.js:185
-msgid "Could not delete specified field"
-msgstr "Das angegebene Feld konnte nicht gelöscht werden"
-
-#: routes/forms.js:78
-msgid "Could not create custom form"
-msgstr "Formular konnte nicht erstellt werden"
-
-#: routes/forms.js:105
-msgid "Selected form not found"
-msgstr "Das Formular wurde nicht gefunden"
-
-#: routes/forms.js:136
-msgid "The plaintext version for this email"
-msgstr "Die Textversion für dieses E-Mail"
-
-#: routes/forms.js:137
-msgid "Custom forms use MJML for formatting"
-msgstr "Formulare verwenden MJML zur formatierung"
-
-#: routes/forms.js:138
-msgid "See the MJML documentation here"
-msgstr ""
-"Die MJML Dokumentation finden Sie hier"
-
-#: routes/forms.js:146
-msgid "Layout"
-msgstr "Layout"
-
-#: routes/forms.js:152
-msgid "Form Input Style"
-msgstr "Formular Input Style"
-
-#: routes/forms.js:154
-msgid ""
-"This CSS stylesheet defines the appearance of form input elements and alerts"
-msgstr ""
-"Dieses CSS-Stylesheet definiert das Aussehen von Formulareingabeelementen "
-"und Warnungen"
-
-#: routes/forms.js:160
-msgid "Web - Subscribe"
-msgstr "Web - Abonnieren"
-
-#: routes/forms.js:165
-msgid "Web - Confirm Notice"
-msgstr "Web - Bestätigung erforderlich"
-
-#: routes/forms.js:170
-msgid "Mail - Confirm Subscription (MJML)"
-msgstr "Mail - Bestätigung erforderlich (MJML)"
-
-#: routes/forms.js:175
-msgid "Mail - Confirm Subscription (Text)"
-msgstr "Mail - Bestätigung erforderlich (Text)"
-
-#: routes/forms.js:180
-msgid "Web - Subscribed Notice"
-msgstr "Web - Notiz: Abonnement bestätigt"
-
-#: routes/forms.js:185
-msgid "Mail - Subscription Confirmed (MJML)"
-msgstr "Mail - Abonnement bestätigt (MJML)"
-
-#: routes/forms.js:190
-msgid "Mail - Subscription Confirmed (Text)"
-msgstr "Mail - Abonnement bestätigt (Text)"
-
-#: routes/forms.js:198
-msgid "Web - Manage Preferences"
-msgstr "Web - Profil bearbeiten"
-
-#: routes/forms.js:203
-msgid "Web - Manage Address"
-msgstr "Web - E-Mail-Adresse bearbeiten"
-
-#: routes/forms.js:208
-msgid "Web - Updated Notice"
-msgstr "Web - Aktualisiert"
-
-#: routes/forms.js:216
-msgid "Web - Unsubscribe"
-msgstr "Web - Abmelden"
-
-#: routes/forms.js:221
-msgid "Web - Unsubscribe Notice"
-msgstr "Web - Abmelden"
-
-#: routes/forms.js:226
-msgid "Mail - Unsubscribe Confirmed (MJML)"
-msgstr "Mail - Abmeldung bestätigt (MJML)"
-
-#: routes/forms.js:231
-msgid "Mail - Unsubscribe Confirmed (Text)"
-msgstr "Mail - Abmeldung bestätigt (Text)"
-
-#: routes/forms.js:269
-msgid "Form settings updated"
-msgstr "Formular-Einstellungen aktualisiert"
-
-#: routes/forms.js:271
-msgid "Form settings not updated"
-msgstr "Formular-Einstellungen nicht aktualisiert"
-
-#: routes/forms.js:287
-msgid "Custom form deleted"
-msgstr "Formular wurde gelöscht"
-
-#: routes/forms.js:289
-msgid "Could not delete specified form"
-msgstr "Das Formular konnte nicht gelöscht werden"
-
-#: routes/index.js:11
-msgid "Self Hosted Newsletter App"
-msgstr "Selbst gehostete Newsletter-App"
-
-#: routes/links.js:39
-msgid "Oops, we couldn't find a link for the URL you clicked"
-msgstr ""
-"Ups, wir konnten keinen Link für die URL finden, die Sie geklickt haben"
-
-#: routes/lists.js:80
-msgid "Could not create list"
-msgstr "Die Liste konnte nicht erstellt werden"
-
-#: routes/lists.js:83
-msgid "List created"
-msgstr "Liste erstellt"
-
-#: routes/lists.js:91 routes/lists.js:267 routes/lists.js:332
-#: routes/lists.js:371 routes/lists.js:440 routes/lists.js:465
-#: routes/lists.js:510 routes/lists.js:532 routes/lists.js:561
-#: routes/lists.js:640 routes/lists.js:697 routes/lists.js:724
-msgid "Could not find list with specified ID"
-msgstr "Die Liste mit angegebener ID konnte nicht gefunden werden"
-
-#: routes/lists.js:118
-msgid "List settings updated"
-msgstr "Listeneinstellungen aktualisiert"
-
-#: routes/lists.js:120
-msgid "List settings not updated"
-msgstr "Listeneinstellungen nicht aktualisiert"
-
-#: routes/lists.js:138
-msgid "List deleted"
-msgstr "Liste gelöscht"
-
-#: routes/lists.js:140
-msgid "Could not delete specified list"
-msgstr "Die Liste konnte nicht gelöscht werden"
-
-#: routes/lists.js:202
-msgid "Unknown"
-msgstr "Unbekannt"
-
-#: routes/lists.js:202
-msgid "Complained"
-msgstr "Beschwert"
-
-#: routes/lists.js:233
-msgid "Invalid key"
-msgstr "Ungültiger Key"
-
-#: routes/lists.js:235
-msgid "Expired key"
-msgstr "Abgelaufener Key"
-
-#: routes/lists.js:237
-msgid "Revoked key"
-msgstr "Widerrufener Key"
-
-#: routes/lists.js:287
-msgid "Initializing"
-msgstr "Initialisierung"
-
-#: routes/lists.js:290
-msgid "Initialized"
-msgstr "Initialisiert"
-
-#: routes/lists.js:293
-msgid "Importing"
-msgstr "Importieren"
-
-#: routes/lists.js:299
-msgid "Errored"
-msgstr "Fehlerhaft"
-
-#: routes/lists.js:377 routes/lists.js:446 routes/lists.js:471
-msgid "Could not find subscriber with specified ID"
-msgstr "Der Abonnent mit angegebenen ID konnte nicht gefunden werden"
-
-#: routes/lists.js:423
-msgid "Could not add subscription"
-msgstr "Das Abonnement konnte nicht hinzugefügt werden"
-
-#: routes/lists.js:428
-msgid "%s was successfully added to your list"
-msgstr "%s wurde Ihrer Liste erfolgreich hinzugefügt"
-
-#: routes/lists.js:430
-msgid "%s was not added to your list"
-msgstr "%s wurde nicht zu Ihrer Liste hinzugefügt"
-
-#: routes/lists.js:452
-msgid "Could not unsubscribe user"
-msgstr "Der Benutzer konnte nicht deabonniert werden"
-
-#: routes/lists.js:455
-msgid "%s was successfully unsubscribed from your list"
-msgstr "%s wurde erfolgreich von Ihrer Liste entfernt"
-
-#: routes/lists.js:475
-msgid "%s was successfully removed from your list"
-msgstr "%s wurde erfolgreich aus Ihrer Liste entfernt"
-
-#: routes/lists.js:487
-msgid "Another subscriber with email address %s already exists"
-msgstr "Ein anderer Abonnent mit der E-Mail-Adresse %s existiert bereits"
-
-#: routes/lists.js:494
-msgid "Subscription settings updated"
-msgstr "Abonnementeinstellungen aktualisiert"
-
-#: routes/lists.js:496
-msgid "Subscription settings not updated"
-msgstr "Abonnementeinstellungen nicht aktualisiert"
-
-#: routes/lists.js:538 routes/lists.js:646 routes/lists.js:682
-#: routes/lists.js:710 routes/lists.js:730
-msgid "Could not find import data with specified ID"
-msgstr "Keine Importdaten für diese ID gefunden"
-
-#: routes/lists.js:569
-msgid "Could not process CSV"
-msgstr "CSV-Datei konnte nicht verarbeitet werden"
-
-#: routes/lists.js:578
-msgid "Could not create importer"
-msgstr "Importer konnte nicht erstellt werden"
-
-#: routes/lists.js:629
-msgid "Empty file"
-msgstr "Leere Datei"
-
-#: routes/lists.js:686
-msgid "Import started"
-msgstr "Import gestartet"
-
-#: routes/lists.js:714
-msgid "Import restarted"
-msgstr "Import neu gestartet"
-
-#: routes/lists.js:797
-msgid "One-step (i.e. no email with confirmation link)"
-msgstr "Ein Schritt ohne Formular (direkt nach dem Klicken auf den Link erfolgt die Abmeldung)"
-
-#: routes/lists.js:803
-msgid ""
-"One-step with unsubscription form (i.e. no email with confirmation link)"
-msgstr ""
-"Ein Schritt mit Formular (nach dem Klick wird ein Formular mit der E-Mail Adresse angezeigt)"
-
-#: routes/lists.js:809
-msgid "Two-step (i.e. an email with confirmation link will be sent)"
-msgstr "Zwei Schritte ohne Formular (direkt nach dem Klick auf den Link wird eine E-Mail mit Bestätigungslink versendet)"
-
-#: routes/lists.js:815
-msgid ""
-"Two-step with unsubscription form (i.e. an email with confirmation link will "
-"be sent)"
-msgstr ""
-"Zwei Schritte mit Formular (nach dem Klick wird ein Formular mit der E-Mail Adresse " "angezeigt, dann wird eine E-Mail mit Bestätigungslink versendet)"
-
-#: routes/lists.js:821
-msgid ""
-"Manual (i.e. unsubscription has to be performed by the list administrator)"
-msgstr ""
-"Manuell (die Abmeldung muss durch den Listen Admin vorgenommen werden)"
-
-#: routes/report-templates.js:246
-msgid "Could not create report template"
-msgstr "Report-Vorlage konnte nicht erstellt werden"
-
-#: routes/report-templates.js:249
-msgid "Report template “%s” created"
-msgstr "Die Report-Vorlage “%s” wurde erstellt"
-
-#: routes/report-templates.js:257
-msgid "Could not find report template with specified ID"
-msgstr "Report-Vorlage mit angegebener ID konnte nicht gefunden werden"
-
-#: routes/report-templates.js:280
-msgid "Report template updated"
-msgstr "Report-Vorlage aktualisiert"
-
-#: routes/report-templates.js:282
-msgid "Report template not updated"
-msgstr "Report-Vorlage wurde nicht aktualisiert"
-
-#: routes/report-templates.js:298
-msgid "Report template deleted"
-msgstr "Report-Vorlage gelöscht"
-
-#: routes/report-templates.js:300
-msgid "Could not delete specified report template"
-msgstr "Die Report-Vorlage konnte nicht gelöscht werden"
-
-#: routes/reports.js:124 routes/reports.js:130
-msgid "Could not create report"
-msgstr "Der Report konnte nicht erstellt werden"
-
-#: routes/reports.js:135
-msgid "Report “%s” created"
-msgstr "Report “%s” erstellt"
-
-#: routes/reports.js:146 routes/reports.js:224 routes/reports.js:239
-#: routes/reports.js:265 routes/reports.js:275
-msgid "Could not find report with specified ID"
-msgstr "Der Report mit dieser ID konnte nicht gefunden werden"
-
-#: routes/reports.js:188 routes/reports.js:194
-msgid "Could not update report"
-msgstr "Der Report konnte nicht aktualisiert werden"
-
-#: routes/reports.js:197
-msgid "Report updated"
-msgstr "Report aktualisiert"
-
-#: routes/reports.js:199
-msgid "Report not updated"
-msgstr "Report nicht aktualisiert"
-
-#: routes/reports.js:212
-msgid "Report deleted"
-msgstr "Report gelöscht"
-
-#: routes/reports.js:214
-msgid "Could not delete specified report"
-msgstr "Der Report konnte nicht gelöscht werden"
-
-#: routes/reports.js:230
-msgid "Could not find report template"
-msgstr "Report-Vorlage konnte nicht gefunden werden"
-
-#: routes/reports.js:260
-msgid "Unknown type of template"
-msgstr "Unbekannter Mime-Type des Template"
-
-#: routes/segments.js:86
-msgid "Could not create segment"
-msgstr "Segment konnte nicht erstellt werden"
-
-#: routes/segments.js:89
-msgid "Segment created"
-msgstr "Segment erstellt"
-
-#: routes/segments.js:113
-msgid "Selected segment ID not found"
-msgstr "Ausgewählte Segment-ID wurde nicht gefunden"
-
-#: routes/segments.js:188
-msgid "Segment settings updated"
-msgstr "Segmenteinstellungen aktualisiert"
-
-#: routes/segments.js:190
-msgid "Segment settings not updated"
-msgstr "Segmenteinstellungen nicht aktualisiert"
-
-#: routes/segments.js:206
-msgid "Segment deleted"
-msgstr "Segment gelöscht"
-
-#: routes/segments.js:208
-msgid "Could not delete specified segment"
-msgstr "Das angegebene Segment konnte nicht gelöscht werden"
-
-#: routes/segments.js:342
-msgid "Could not create rule"
-msgstr "Regel konnte nicht erstellt werden"
-
-#: routes/segments.js:345
-msgid "Rule created"
-msgstr "Regel erstellt"
-
-#: routes/segments.js:410
-msgid "Rule settings updated"
-msgstr "Regeleinstellungen aktualisiert"
-
-#: routes/segments.js:412
-msgid "Rule settings not updated"
-msgstr "Regeleinstellungen nicht aktualisiert"
-
-#: routes/segments.js:428
-msgid "Rule deleted"
-msgstr "Regel gelöscht"
-
-#: routes/segments.js:430
-msgid "Could not delete specified rule"
-msgstr "Die Regel konnte nicht gelöscht werden"
-
-#: routes/settings.js:39
-msgid "Use TLS"
-msgstr "TLS verwenden"
-
-#: routes/settings.js:40
-msgid "usually selected for port 465"
-msgstr "Normalerweise ausgewählt für Port 465"
-
-#: routes/settings.js:44
-msgid "Use STARTTLS"
-msgstr "STARTTLS verwenden"
-
-#: routes/settings.js:45
-msgid "usually selected for port 587 and 25"
-msgstr "normalerweise ausgewählt für Port 587 und 25"
-
-#: routes/settings.js:49
-msgid "Do not use encryption"
-msgstr "Keine Verschlüsselung verwenden"
-
-#: routes/settings.js:115
-msgid "Settings updated"
-msgstr "Einstellungen aktualisiert"
-
-#: routes/settings.js:173
-msgid "Invalid mail transport type"
-msgstr "Ungültiger Mail Transport Type"
-
-#: routes/settings.js:184
-msgid "Invalid Access Key"
-msgstr "Ungültiger Access Key"
-
-#: routes/settings.js:187
-msgid "Invalid AWS credentials"
-msgstr "Ungültige AWS Zugangsdaten"
-
-#: routes/settings.js:190
-msgid "Connection refused, check hostname and port."
-msgstr "Verbindung abgelehnt, überprüfen Sie Hostname und Port."
-
-#: routes/settings.js:195
-msgid ""
-"Did not receive greeting message from server. This might happen when "
-"connecting to a TLS port without using TLS."
-msgstr ""
-"Keine Grußnachricht vom Server erhalten. Dies kann bei der Verbindung zu "
-"einem TLS-Port ohne TLS auftreten."
-
-#: routes/settings.js:197
-msgid "Did not receive greeting message from server."
-msgstr "Keine Grußnachricht vom Server erhalten."
-
-#: routes/settings.js:200
-msgid ""
-"Connection timed out. Check your firewall settings, destination port is "
-"probably blocked."
-msgstr ""
-"Zeitüberschreitung der Verbindung. Überprüfen Sie Ihre Firewall-"
-"Einstellungen, der Ziel-Port ist wahrscheinlich blockiert."
-
-#: routes/settings.js:205
-msgid "Authentication not accepted, server expects STARTTLS to be used."
-msgstr ""
-"Authentifizierung nicht akzeptiert, Server erwartet die Verwendung von "
-"STARTTLS."
-
-#: routes/settings.js:207
-msgid "Authentication failed, check username and password."
-msgstr ""
-"Authentifizierung fehlgeschlagen, Benutzername und Passwort überprüfen."
-
-#: routes/settings.js:217
-msgid "Failed Mailer verification."
-msgstr "Mailer Überprüfung fehlgeschlagen."
-
-#: routes/settings.js:217
-msgid "Server responded with: \"%s\""
-msgstr "Server antwortete mit: \"%s\""
-
-#: routes/settings.js:221
-msgid "Mailer settings verified, ready to send some mail!"
-msgstr "Mailer-Einstellungen überprüft, bereit zum Senden!"
-
-#: routes/subscription.js:32
-msgid "Not allowed by CORS"
-msgstr "Nicht erlaubt von CORS"
-
-#: routes/subscription.js:50
-msgid "Selected subscription not found"
-msgstr "Ausgewähltes Abonnement nicht gefunden"
-
-#: routes/subscription.js:60 routes/subscription.js:181
-#: routes/subscription.js:266 routes/subscription.js:324
-#: routes/subscription.js:377 routes/subscription.js:429
-#: routes/subscription.js:511 routes/subscription.js:562
-#: routes/subscription.js:638 routes/subscription.js:660
-#: routes/subscription.js:720 routes/subscription.js:744
-#: routes/subscription.js:809
-msgid "Selected list not found"
-msgstr "Ausgewählte Liste nicht gefunden"
-
-#: routes/subscription.js:134
-msgid "%s: Subscription Confirmed"
-msgstr "%s: Abonnement bestätigt"
-
-#: routes/subscription.js:184 routes/subscription.js:514
-msgid "The list does not allow public subscriptions."
-msgstr "Die Liste erlaubt keine öffentlichen Abonnements."
-
-#: routes/subscription.js:493 routes/subscription.js:495
-msgid "Email address not set"
-msgstr "E-Mail-Adresse nicht gesetzt"
-
-#: routes/subscription.js:538
-msgid "Could not store confirmation data"
-msgstr "Die Bestätigungsdaten konnten nicht gespeichert werden"
-
-#: routes/subscription.js:576 routes/subscription.js:675
-#: routes/subscription.js:759
-msgid "Subscription not found from this list"
-msgstr "Abonnement konnte in dieser Liste nicht gefunden werden"
-
-#: routes/subscription.js:735
-msgid "Email address updated, check your mailbox for verification instructions"
-msgstr ""
-"Die E-Mail-Adresse wurde aktualisiert. Bitte überprüfen Sie Ihre Mailbox zur "
-"Bestätigung"
-
-#: routes/subscription.js:858
-msgid "%s: Unsubscribe Confirmed"
-msgstr "%s: Abmeldungen Bestätigt"
-
-#: routes/subscription.js:905 routes/subscription.js:921
-msgid "Public key is not set"
-msgstr "Public-Key ist nicht gesetzt"
-
-#: routes/templates.js:84
-msgid "Could not create template"
-msgstr "Vorlage konnte nicht erstellt werden"
-
-#: routes/templates.js:87
-msgid "Template created"
-msgstr "Vorlage erstellt"
-
-#: routes/templates.js:126
-msgid "Template settings updated"
-msgstr "Vorlageneinstellungen aktualisiert"
-
-#: routes/templates.js:128
-msgid "Template settings not updated"
-msgstr "Template Einstellungen wurden nicht aktualisiert"
-
-#: routes/templates.js:144
-msgid "Template deleted"
-msgstr "Vorlage gelöscht"
-
-#: routes/templates.js:146
-msgid "Could not delete specified template"
-msgstr "Die Vorlage konnte nicht gelöscht werden"
-
-#: routes/triggers.js:62 routes/triggers.js:79 routes/triggers.js:154
-msgid "Could not find selected list"
-msgstr "Die ausgewählte Liste konnte nicht gefunden werden"
-
-#: routes/triggers.js:131
-msgid "Could not create trigger"
-msgstr "Trigger konnte nicht erstellt werden"
-
-#: routes/triggers.js:138
-msgid "Trigger “%s” created"
-msgstr "Trigger “%s” erstellt"
-
-#: routes/triggers.js:214
-msgid "Trigger settings updated"
-msgstr "Trigger-Einstellungen aktualisiert"
-
-#: routes/triggers.js:216
-msgid "Trigger settings not updated"
-msgstr "Trigger-Einstellungen nicht aktualisiert"
-
-#: routes/triggers.js:228
-msgid "Trigger deleted"
-msgstr "Trigger gelöscht"
-
-#: routes/triggers.js:230
-msgid "Could not delete specified trigger"
-msgstr "Der Trigger konnte nicht gelöscht werden"
-
-#: routes/triggers.js:242
-msgid "Could not find trigger with specified ID"
-msgstr "Der Trigger mit dieser ID konnte nicht gefunden werden"
-
-#: routes/triggers.js:255
-msgid "Trigger not found"
-msgstr "Trigger nicht gefunden"
-
-#: routes/users.js:32
-msgid ""
-"An email with password reset instructions has been sent to your email "
-"address, if it exists on our system."
-msgstr ""
-"Eine E-Mail mit Passwort-Reset-Anweisungen wurde an Ihre E-Mail-Adresse "
-"gesendet, wenn die E-Mail-Adresse auf unserem System existiert."
-
-#: routes/users.js:46 routes/users.js:64
-msgid "Unknown or expired reset token"
-msgstr "Unbekanntes oder abgelaufenes Reset-Token"
-
-#: routes/users.js:66
-msgid "Your password has been changed successfully"
-msgstr "Ihr Passwort wurde erfolgreich geändert"
-
-#: routes/users.js:87
-msgid "User data not found"
-msgstr "Benutzerdaten nicht gefunden"
-
-#: routes/users.js:110
-msgid "Access token updated"
-msgstr "Access Token aktualisiert"
-
-#: routes/users.js:112
-msgid "Access token not updated"
-msgstr "Access Token nicht aktualisiert"
-
-#: routes/users.js:139
-msgid "Account information updated"
-msgstr "Account-Informationen aktualisiert"
-
-#: routes/users.js:141
-msgid "Account information not updated"
-msgstr "Account-Informationen nicht aktualisiert"
-
-#: services/feedcheck.js:51
-msgid "Feed error: %s"
-msgstr "Feed Fehler: %s"
-
-#: services/feedcheck.js:54
-msgid "Found %s new campaign messages from feed"
-msgstr "Fand %s neue Kampagnen-Nachrichten im Feed"
-
-#: services/feedcheck.js:56
-msgid "Found nothing new from the feed"
-msgstr "Im Feed wurde nichts neues gefunden"
-
-#: services/feedcheck.js:146
-msgid "RSS entry %s"
-msgstr "RSS Eintrag %s"
-
-#: services/importer.js:249
-msgid "Could not access import file"
-msgstr "Auf die Importdatei konnte nicht zugegriffen werden"
-
-#: services/triggers.js:51
-msgid "Unknown trigger type %s"
-msgstr "Unbekannter Trigger-Typ %s"
-
-#~ msgid "Add new custom field"
-#~ msgstr "Neues benutzerdefiniertes Feld hinzufügen"
-
-#~ msgid "field name"
-#~ msgstr "Feldname"
-
-#~ msgid "one of the following types:"
-#~ msgstr "Einer der folgenden Typen:"
-
-#~ msgid ""
-#~ "If the type is 'option' then you also need to specify the parent element "
-#~ "ID"
-#~ msgstr ""
-#~ "Wenn der Typ 'Option' ist, dann müssen Sie auch die übergeordnete Element-"
-#~ "ID angeben"
-
-#~ msgid ""
-#~ "Template for the group element. If not set, then values of the elements "
-#~ "are joined with commas"
-#~ msgstr ""
-#~ "Vorlage für das Gruppenelement. Wenn nicht gesetzt, dann werden die Werte "
-#~ "der Elemente mit Kommas verbunden"
-
-#~ msgid ""
-#~ "if not visible then the subscriber can not view or modify this value at "
-#~ "the profile page"
-#~ msgstr ""
-#~ "Wenn nicht sichtbar, kann der Abonnent diesen Wert auf der Profilseite "
-#~ "weder sehen noch bearbeiten"
-
-#~ msgid "You are now unsubscribed"
-#~ msgstr "Sie sind jetzt aus dieser Liste ausgetragen"
-
-#~ msgid "List management"
-#~ msgstr "Listenverwaltung"
-
-#~ msgid "Custom fields"
-#~ msgstr "Benutzerdefinierte Felder"
-
-#~ msgid "List segmentation"
-#~ msgstr "Listensegmentierung"
-
-#~ msgid "Donate to author"
-#~ msgstr "Spenden willkommen"
-
-#~ msgid "or donate using PayPal"
-#~ msgstr "Oder spenden Sie mit PayPal"
-
-#~ msgid "Click stats"
-#~ msgstr "Klick Statistiken"
-
-#~ msgid "Open source"
-#~ msgstr "Open source"
-
-#~ msgid "Send via any provider"
-#~ msgstr "Senden Sie über jeden Anbieter"
-
-#~ msgid "Trigger based automation"
-#~ msgstr "Triggerbasierte Automatisierung"
-
-#~ msgid "Self hosted newsletter app built on top of Nodemailer"
-#~ msgstr "Selbst gehostete Newsletter-App basierend auf Nodemailer"
-
-#~ msgid "Subscribe to our newsletter"
-#~ msgstr "Abonnieren Sie unseren Newsletter"
-
-#~ msgid "To extract the text from HTML click"
-#~ msgstr "Um den Klartext aus dem HTML Dokument zu extrahieren, klicken Sie"
-
-#~ msgid "Almost finished."
-#~ msgstr "Fast fertig."
-
-#~ msgid "return to our website"
-#~ msgstr "zurück zu unserer Webseite"
-
-#~ msgid "Update your Email Address"
-#~ msgstr "E-Mail-Adresse aktualisieren"
-
-#~ msgid "Update your preferences"
-#~ msgstr "Einstellungen aktualisieren"
-
-#~ msgid ""
-#~ "JavaScript must be enabled in order for the subscription form to work"
-#~ msgstr ""
-#~ "JavaScript muss aktiviert sein, damit das Anmeldeformular funktionieren "
-#~ "kann"
-
-#~ msgid "continue to our website"
-#~ msgstr "weiter zu unserer Webseite"
-
-#~ msgid ""
-#~ "If you really like Mailtrain or your business benefits from it "
-#~ "financially then I would really appreciate a small donation to keep the "
-#~ "Mailtrain development engines running. You can either use Bitcoin or "
-#~ "PayPal for donations. My Bitcoin wallet is "
-#~ "15Z8ADxhssKUiwP3jbbqJwA21744KMCfTM"
-#~ msgstr ""
-#~ "Loren Ipsum it financially then I would really appreciate a small "
-#~ "donation to keep the Mailtrain development engines running. You can "
-#~ "either use Bitcoin or PayPal for donations. My Bitcoin wallet is "
-#~ "15Z8ADxhssKUiwP3jbbqJwA21744KMCfTM"
-
-#~ msgid ""
-#~ "We have received a password change request for your Mailtrain account"
-#~ msgstr ""
-#~ "Wir haben eine Passwortänderungsanfrage für Ihr Mailtrain-Konto erhalten"
-
-#~ msgid "Reset password:"
-#~ msgstr "Passwort zurücksetzen:"
-
-#~ msgid "(optional)"
-#~ msgstr "(optional)"
-
-#~ msgid "–– Select ––"
-#~ msgstr "— Bitte wählen —"
-
-#~ msgid "You have been removed from"
-#~ msgstr "Sie wurden aus dieser Liste ausgetragen:"
-
-#~ msgid "Enter your email address to unsubscribe from"
-#~ msgstr "Geben Sie Ihre E-Mail-Adresse ein, um sich abzumelden von"
-
-#~ msgid "Yes, subscribe me to this list:"
-#~ msgstr "Ja, tragen Sie mich in diese Liste ein:"
-
-#: lib/models/subscriptions.js:910 routes/subscription.js:472
-#: routes/subscription.js:544 routes/subscription.js:580
-#: routes/subscription.js:696 routes/subscription.js:771
-msgid "Subscription not found in this list"
-msgstr "Das Abonnement wurde in dieser Liste nicht gefunden"
-
-#: views/subscription/web-confirm-unsubscription-notice.mjml.hbs:2
-msgid ""
-"We need to confirm your email address. To complete the unsubscription "
-"process, please click the link in the email we just sent you."
-msgstr ""
-"Wir müssen Ihre E-Mail-Adresse bestätigen. Um die Kündigung Ihres Abonnements abzuschließen, "
-"klicken Sie bitte auf den Link in der E-Mail, die wir Ihnen gerade geschickt "
-"haben."
-
-msgid "Please Confirm Unsubscription"
-msgstr "Bitte bestätigen Sie die Kündigung Ihres Abonnements"
-
-msgid "Yes, unsubscribe me from this list"
-msgstr "Ja, ich möchte dieses Abonnement kündigen"
-
-msgid ""
-"If you received this email by mistake, simply delete it. You won't be "
-"unsubscribed if you don't click the confirmation link above."
-msgstr ""
-"Wenn Sie diese E-Mail versehentlich erhalten haben, löschen Sie sie einfach. "
-"Ihr Abonnement wird nicht gekündigt, wenn Sie nicht auf den Bestätigungslink oben klicken."
diff --git a/languages/es_ES.mo b/languages/es_ES.mo
deleted file mode 100644
index 214acc8a..00000000
Binary files a/languages/es_ES.mo and /dev/null differ
diff --git a/languages/es_ES.po b/languages/es_ES.po
deleted file mode 100644
index 8abe4590..00000000
--- a/languages/es_ES.po
+++ /dev/null
@@ -1,4664 +0,0 @@
-msgid ""
-msgstr ""
-"Project-Id-Version: \n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-06-08 10:55+0200\n"
-"PO-Revision-Date: 2017-06-14 15:40+0200\n"
-"Last-Translator: \n"
-"Language-Team: \n"
-"Language: es_ES\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Poedit 2.0.2\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-#: views/archive/layout.hbs:1 views/layout.hbs:1
-msgid "Self hosted email newsletter app"
-msgstr "Aplicación de boletín de correo electrónico alojado por usted mismo"
-
-#: views/blacklist.hbs:1 views/campaigns/blacklisted.hbs:1
-#: views/campaigns/bounced.hbs:1 views/campaigns/campaigns.hbs:1
-#: views/campaigns/clicked.hbs:1 views/campaigns/complained.hbs:1
-#: views/campaigns/create-rss.hbs:1 views/campaigns/create-triggered.hbs:1
-#: views/campaigns/create.hbs:1 views/campaigns/delivered.hbs:1
-#: views/campaigns/edit-rss.hbs:1 views/campaigns/edit-triggered.hbs:1
-#: views/campaigns/edit.hbs:1 views/campaigns/opened.hbs:1
-#: views/campaigns/unsubscribed.hbs:1 views/campaigns/upload-attachment.hbs:1
-#: views/campaigns/view.hbs:1 views/lists/create.hbs:1 views/lists/edit.hbs:1
-#: views/lists/fields/create.hbs:1 views/lists/fields/edit.hbs:1
-#: views/lists/fields/fields.hbs:1 views/lists/forms/create.hbs:1
-#: views/lists/forms/edit.hbs:1 views/lists/forms/forms.hbs:1
-#: views/lists/lists.hbs:1 views/lists/segments/create.hbs:1
-#: views/lists/segments/edit.hbs:1 views/lists/segments/rule-configure.hbs:1
-#: views/lists/segments/rule-create.hbs:1 views/lists/segments/rule-edit.hbs:1
-#: views/lists/segments/segments.hbs:1 views/lists/segments/view.hbs:1
-#: views/lists/subscription/add.hbs:1 views/lists/subscription/edit.hbs:1
-#: views/lists/subscription/import-failed.hbs:1
-#: views/lists/subscription/import-preview.hbs:1
-#: views/lists/subscription/import.hbs:1 views/lists/view.hbs:1
-#: views/report-templates/create.hbs:1 views/report-templates/edit.hbs:1
-#: views/report-templates/report-templates.hbs:1
-#: views/reports/create-select-template.hbs:1 views/reports/create.hbs:1
-#: views/reports/edit.hbs:1 views/reports/output.hbs:1
-#: views/reports/reports.hbs:1 views/reports/view.hbs:1 views/settings.hbs:1
-#: views/templates/create.hbs:1 views/templates/edit.hbs:1
-#: views/templates/templates.hbs:1 views/triggers/create-select.hbs:1
-#: views/triggers/create.hbs:1 views/triggers/edit.hbs:1
-#: views/triggers/triggered.hbs:1 views/triggers/triggers.hbs:1
-#: views/users/account.hbs:1 views/users/api.hbs:1 views/users/forgot.hbs:1
-#: views/users/login.hbs:1 views/users/reset.hbs:1 app.js:169
-msgid "Home"
-msgstr "Inicio"
-
-#: views/blacklist.hbs:2 views/blacklist.hbs:3 views/layout.hbs:7
-#: views/lists/subscription/edit.hbs:15
-msgid "Blacklist"
-msgstr "Lista negra"
-
-#: views/blacklist.hbs:4 views/users/api.hbs:55
-msgid "Add email to blacklist"
-msgstr "Añadir correo a la lista negra"
-
-#: views/blacklist.hbs:5
-msgid "Add"
-msgstr "Añadir"
-
-#: views/blacklist.hbs:6
-msgid "Email"
-msgstr "Correo eléctronico"
-
-#: views/campaigns/blacklisted.hbs:2 views/campaigns/bounced.hbs:2
-#: views/campaigns/campaigns.hbs:2 views/campaigns/campaigns.hbs:7
-#: views/campaigns/clicked.hbs:2 views/campaigns/complained.hbs:2
-#: views/campaigns/create-rss.hbs:2 views/campaigns/create-triggered.hbs:2
-#: views/campaigns/create.hbs:2 views/campaigns/delivered.hbs:2
-#: views/campaigns/edit-rss.hbs:2 views/campaigns/edit-triggered.hbs:2
-#: views/campaigns/edit.hbs:2 views/campaigns/opened.hbs:2
-#: views/campaigns/unsubscribed.hbs:2 views/campaigns/upload-attachment.hbs:2
-#: views/campaigns/view.hbs:2 lib/tools.js:133 routes/campaigns.js:35
-msgid "Campaigns"
-msgstr "Campañas"
-
-#: views/campaigns/blacklisted.hbs:3 views/campaigns/blacklisted.hbs:4
-msgid "Blacklisted info"
-msgstr "Información de la lista negra"
-
-#: views/campaigns/blacklisted.hbs:5 views/campaigns/bounced.hbs:5
-#: views/campaigns/clicked.hbs:5 views/campaigns/complained.hbs:5
-#: views/campaigns/delivered.hbs:5 views/campaigns/edit-rss.hbs:5
-#: views/campaigns/edit-triggered.hbs:5 views/campaigns/edit.hbs:5
-#: views/campaigns/opened.hbs:5 views/campaigns/unsubscribed.hbs:5
-#: views/campaigns/upload-attachment.hbs:6
-msgid "View campaign"
-msgstr "Ver campaña"
-
-#: views/campaigns/blacklisted.hbs:6
-msgid "Subscribers who blacklisted by global blacklist:"
-msgstr "Suscriptores que han sido incluidos en la lista negra global:"
-
-#: views/campaigns/blacklisted.hbs:7 views/campaigns/bounced.hbs:7
-#: views/campaigns/clicked.hbs:15 views/campaigns/complained.hbs:7
-#: views/campaigns/delivered.hbs:7 views/campaigns/opened.hbs:9
-#: views/campaigns/unsubscribed.hbs:7
-#: views/lists/subscription/import-failed.hbs:8 views/lists/view.hbs:19
-#: views/triggers/triggered.hbs:6
-msgid "Address"
-msgstr "Dirección"
-
-#: views/campaigns/blacklisted.hbs:8 views/campaigns/bounced.hbs:8
-#: views/campaigns/clicked.hbs:16 views/campaigns/complained.hbs:8
-#: views/campaigns/delivered.hbs:8 views/campaigns/opened.hbs:10
-#: views/campaigns/unsubscribed.hbs:8 views/lists/subscription/add.hbs:6
-#: views/lists/subscription/edit.hbs:7
-#: views/lists/subscription/import-preview.hbs:7 views/lists/view.hbs:20
-#: views/subscription/partials/subscription-custom-fields.hbs:3
-#: views/triggers/triggered.hbs:7
-msgid "First Name"
-msgstr "Nombre"
-
-#: views/campaigns/blacklisted.hbs:9 views/campaigns/bounced.hbs:9
-#: views/campaigns/clicked.hbs:17 views/campaigns/complained.hbs:9
-#: views/campaigns/delivered.hbs:9 views/campaigns/opened.hbs:11
-#: views/campaigns/unsubscribed.hbs:9 views/lists/subscription/add.hbs:7
-#: views/lists/subscription/edit.hbs:8
-#: views/lists/subscription/import-preview.hbs:8 views/lists/view.hbs:21
-#: views/subscription/partials/subscription-custom-fields.hbs:4
-#: views/triggers/triggered.hbs:8
-msgid "Last Name"
-msgstr "Apellidos"
-
-#: views/campaigns/blacklisted.hbs:10
-msgid "Reason"
-msgstr "Motivo"
-
-#: views/campaigns/blacklisted.hbs:11
-msgid "Time"
-msgstr "Fecha"
-
-#: views/campaigns/bounced.hbs:3 views/campaigns/bounced.hbs:4
-msgid "Bounced info"
-msgstr "Información del bounce"
-
-#: views/campaigns/bounced.hbs:6
-msgid "Subscribers who bounced and were unsubscribed:"
-msgstr "Suscriptores que fueron bounce y unsuscritos:"
-
-#: views/campaigns/bounced.hbs:10 views/campaigns/complained.hbs:10
-#: views/campaigns/delivered.hbs:10 views/campaigns/unsubscribed.hbs:10
-msgid "SMTP response"
-msgstr "Respuesta del SMTP"
-
-#: views/campaigns/bounced.hbs:11
-msgid "Bounce time"
-msgstr "Fecha"
-
-#: views/campaigns/campaigns.hbs:3 views/campaigns/create-triggered.hbs:26
-#: views/campaigns/create.hbs:3 views/campaigns/create.hbs:4
-#: views/campaigns/create.hbs:28
-msgid "Create Campaign"
-msgstr "Crear Campaña"
-
-#: views/campaigns/campaigns.hbs:4
-msgid "Regular Campaign"
-msgstr "Campaña normal"
-
-#: views/campaigns/campaigns.hbs:5
-msgid "RSS Campaign"
-msgstr "Campaña de RSS"
-
-#: views/campaigns/campaigns.hbs:6
-msgid "Triggered Campaign"
-msgstr "Campaña encadenada"
-
-#: views/campaigns/campaigns.hbs:8 views/campaigns/create-rss.hbs:6
-#: views/campaigns/create-triggered.hbs:5 views/campaigns/create.hbs:5
-#: views/campaigns/edit-rss.hbs:8 views/campaigns/edit-triggered.hbs:9
-#: views/campaigns/edit.hbs:10 views/campaigns/view.hbs:73
-#: views/lists/create.hbs:5 views/lists/edit.hbs:6
-#: views/lists/fields/fields.hbs:6 views/lists/forms/forms.hbs:6
-#: views/lists/lists.hbs:5 views/lists/segments/segments.hbs:6
-#: views/report-templates/partials/report-template-fields.hbs:1
-#: views/report-templates/report-templates.hbs:10
-#: views/reports/partials/report-fields.hbs:1
-#: views/reports/partials/report-fields.hbs:5
-#: views/reports/partials/report-fields.hbs:9 views/reports/reports.hbs:6
-#: views/templates/templates.hbs:5 views/triggers/triggers.hbs:5
-msgid "Name"
-msgstr "Nombre"
-
-#: views/campaigns/campaigns.hbs:9 views/campaigns/create-rss.hbs:8
-#: views/campaigns/create-triggered.hbs:7 views/campaigns/create.hbs:7
-#: views/campaigns/edit-rss.hbs:10 views/campaigns/edit-triggered.hbs:11
-#: views/campaigns/edit.hbs:12 views/campaigns/view.hbs:74
-#: views/lists/create.hbs:7 views/lists/edit.hbs:10
-#: views/lists/forms/edit.hbs:9 views/lists/forms/forms.hbs:7
-#: views/lists/lists.hbs:8 views/mosaico/editor.hbs:3
-#: views/partials/merge-tag-reference.hbs:4
-#: views/report-templates/partials/report-template-fields.hbs:3
-#: views/report-templates/report-templates.hbs:11
-#: views/reports/partials/report-fields.hbs:3
-#: views/reports/partials/report-fields.hbs:6 views/reports/reports.hbs:8
-#: views/templates/create.hbs:9 views/templates/edit.hbs:8
-#: views/templates/templates.hbs:6 views/triggers/create.hbs:7
-#: views/triggers/edit.hbs:8 views/triggers/triggers.hbs:7
-msgid "Description"
-msgstr "Descripción"
-
-#: views/campaigns/campaigns.hbs:10 views/campaigns/view.hbs:75
-#: views/lists/view.hbs:22 views/lists/view.hbs:30
-#: views/triggers/triggers.hbs:6
-msgid "Status"
-msgstr "Estado"
-
-#: views/campaigns/campaigns.hbs:11 views/campaigns/view.hbs:76
-#: views/lists/view.hbs:23 views/lists/view.hbs:24
-#: views/report-templates/report-templates.hbs:12
-#: views/reports/partials/report-fields.hbs:7 views/reports/reports.hbs:9
-msgid "Created"
-msgstr "Fecha de Creación"
-
-#: views/campaigns/clicked.hbs:3 views/campaigns/clicked.hbs:4
-msgid "Link info"
-msgstr "Información del enlace"
-
-#: views/campaigns/clicked.hbs:6 views/campaigns/view.hbs:63
-msgid "URL"
-msgstr "URL"
-
-#: views/campaigns/clicked.hbs:7 views/campaigns/view.hbs:64
-msgid "Clicks"
-msgstr "Clicks"
-
-#: views/campaigns/clicked.hbs:8 views/campaigns/view.hbs:65
-msgid "% of clicks"
-msgstr "% de clicks"
-
-#: views/campaigns/clicked.hbs:9 views/campaigns/view.hbs:66
-msgid "% of messages"
-msgstr "% de mensajes"
-
-#: views/campaigns/clicked.hbs:10 views/campaigns/view.hbs:69
-msgid "Aggregated clicks"
-msgstr "Clics agregados"
-
-#: views/campaigns/clicked.hbs:11
-msgid "Subscribers who clicked on a link:"
-msgstr "Suscriptores que hicieron click en un enlace:"
-
-#: views/campaigns/clicked.hbs:12
-msgid "Subscribers who clicked on this link:"
-msgstr "Suscriptores que hicieron click en este enlace:"
-
-#: views/campaigns/clicked.hbs:13 views/campaigns/opened.hbs:7
-msgid "Stats by country"
-msgstr "Estadísticas por país"
-
-#: views/campaigns/clicked.hbs:14 views/campaigns/opened.hbs:8
-msgid "Stats by device type"
-msgstr "Estadísticas por dispositivo"
-
-#: views/campaigns/clicked.hbs:18
-msgid "First click time"
-msgstr "Fecha del primer click"
-
-#: views/campaigns/clicked.hbs:19
-msgid "Click count"
-msgstr "Número de clicks"
-
-#: views/campaigns/complained.hbs:3 views/campaigns/complained.hbs:4
-msgid "Complained info"
-msgstr "Información de quejas"
-
-#: views/campaigns/complained.hbs:6
-msgid "Subscribers who complained and were unsubscribed:"
-msgstr "Suscriptores que se quejaron y fueron unsuscritos:"
-
-#: views/campaigns/complained.hbs:11
-msgid "Complain time"
-msgstr "Fecha de la queja"
-
-#: views/campaigns/create-rss.hbs:3 views/campaigns/create-rss.hbs:4
-#: views/campaigns/create-rss.hbs:21
-msgid "Create RSS Campaign"
-msgstr "Crear Campaña de RSS"
-
-#: views/campaigns/create-rss.hbs:5 views/campaigns/edit-rss.hbs:6
-msgid ""
-"RSS campaign sets up a tracker against selected RSS feed address. Whenever a "
-"new entry is found from this feed it is sent to selected list as an email "
-"message."
-msgstr ""
-"Una campaña RSS detecta los cambios en el Canal RSS configurado. Cuando se "
-"encuentra una nueva entrada de este canal es enviado a la lista seleccionada "
-"como un mensaje de correo electrónico."
-
-#: views/campaigns/create-rss.hbs:7 views/campaigns/create-triggered.hbs:6
-#: views/campaigns/create.hbs:6 views/campaigns/edit-rss.hbs:9
-#: views/campaigns/edit-triggered.hbs:10 views/campaigns/edit.hbs:11
-msgid "Campaign Name"
-msgstr "Nombre de la campaña"
-
-#: views/campaigns/create-rss.hbs:9 views/campaigns/create-triggered.hbs:8
-#: views/campaigns/create.hbs:8 views/campaigns/edit-rss.hbs:11
-#: views/campaigns/edit-triggered.hbs:12 views/campaigns/edit.hbs:13
-#: views/lists/create.hbs:8 views/lists/edit.hbs:11
-#: views/report-templates/partials/report-template-fields.hbs:4
-#: views/reports/partials/report-fields.hbs:4 views/templates/create.hbs:11
-#: views/templates/edit.hbs:10 views/triggers/create.hbs:9
-#: views/triggers/edit.hbs:10
-msgid "HTML is allowed"
-msgstr "Se permite HTML"
-
-#: views/campaigns/create-rss.hbs:10 views/campaigns/create-triggered.hbs:9
-#: views/campaigns/create.hbs:9 views/campaigns/edit-rss.hbs:12
-#: views/campaigns/edit-triggered.hbs:13 views/campaigns/edit.hbs:14
-#: views/campaigns/view.hbs:6 views/triggers/create-select.hbs:6
-#: views/triggers/create.hbs:10 views/triggers/edit.hbs:12
-#: views/triggers/triggers.hbs:8
-msgid "List"
-msgstr "Lista"
-
-#: views/campaigns/create-rss.hbs:11 views/campaigns/create-triggered.hbs:10
-#: views/campaigns/create-triggered.hbs:14 views/campaigns/create.hbs:10
-#: views/campaigns/create.hbs:14 views/campaigns/edit-rss.hbs:13
-#: views/campaigns/edit-triggered.hbs:14 views/campaigns/edit.hbs:15
-#: views/lists/fields/create.hbs:27 views/lists/fields/edit.hbs:28
-#: views/lists/segments/create.hbs:9 views/lists/segments/edit.hbs:10
-#: views/lists/segments/rule-create.hbs:7 views/lists/subscription/add.hbs:10
-#: views/lists/subscription/add.hbs:12 views/lists/subscription/edit.hbs:11
-#: views/lists/subscription/import-preview.hbs:5
-#: views/reports/partials/report-select-template.hbs:2
-#: views/subscription/partials/subscription-custom-fields.hbs:9
-#: views/templates/create.hbs:8 views/triggers/create-select.hbs:7
-#: views/triggers/create.hbs:17 views/triggers/create.hbs:20
-#: views/triggers/create.hbs:22 views/triggers/create.hbs:26
-#: views/triggers/edit.hbs:19 views/triggers/edit.hbs:22
-#: views/triggers/edit.hbs:24 views/triggers/edit.hbs:28
-msgid "Select"
-msgstr "Seleccionar"
-
-#: views/campaigns/create-rss.hbs:12 views/campaigns/create-triggered.hbs:11
-#: views/campaigns/create.hbs:11 views/campaigns/edit-rss.hbs:14
-#: views/campaigns/edit-triggered.hbs:15 views/campaigns/edit.hbs:16
-#: views/triggers/create-select.hbs:8 views/triggers/create.hbs:11
-#: views/triggers/edit.hbs:13
-msgid "subscribers"
-msgstr "suscriptores"
-
-#: views/campaigns/create-rss.hbs:13 views/campaigns/edit-rss.hbs:15
-msgid "RSS Feed Url"
-msgstr "RSS Feed URL"
-
-#: views/campaigns/create-rss.hbs:14 views/campaigns/edit-rss.hbs:16
-msgid ""
-"New entries from this RSS URL are sent out to list subscribers as email "
-"messages"
-msgstr ""
-"Las nuevas entradas de esta dirección de URL de RSS se envían a los "
-"suscriptores de la lista como mensajes de correo electrónico"
-
-#: views/campaigns/create-rss.hbs:15 views/campaigns/create-triggered.hbs:18
-#: views/campaigns/create.hbs:18 views/campaigns/edit-rss.hbs:18
-#: views/campaigns/edit-triggered.hbs:16 views/campaigns/edit.hbs:17
-#: views/campaigns/view.hbs:12
-msgid "Email \"from name\""
-msgstr "Email \"en nombre de (from)\""
-
-#: views/campaigns/create-rss.hbs:16 views/campaigns/create-triggered.hbs:19
-#: views/campaigns/create.hbs:19 views/campaigns/edit-rss.hbs:19
-#: views/campaigns/edit-triggered.hbs:17 views/campaigns/edit.hbs:18
-#: views/settings.hbs:23
-msgid "This is the name your emails will come from"
-msgstr "Este es el nombre con el que se enviaran sus correos electrónicos"
-
-#: views/campaigns/create-rss.hbs:17 views/campaigns/create-triggered.hbs:20
-#: views/campaigns/create.hbs:20 views/campaigns/edit-rss.hbs:20
-#: views/campaigns/edit-triggered.hbs:18 views/campaigns/edit.hbs:19
-#: views/campaigns/view.hbs:13
-msgid "Email \"from\" address"
-msgstr "Correo electrónico \"De/From\""
-
-#: views/campaigns/create-rss.hbs:18 views/campaigns/create-triggered.hbs:21
-#: views/campaigns/edit-rss.hbs:21 views/campaigns/edit-triggered.hbs:19
-#: views/settings.hbs:25
-msgid "This is the address people will send replies to"
-msgstr "Este es el correo al que los contactos responderán"
-
-#: views/campaigns/create-rss.hbs:19 views/campaigns/create-triggered.hbs:24
-#: views/campaigns/create.hbs:26 views/campaigns/edit-rss.hbs:22
-#: views/campaigns/edit-triggered.hbs:22 views/campaigns/edit.hbs:25
-msgid "Disable opened tracking"
-msgstr "Desactivar el seguimiento de Aperturas"
-
-#: views/campaigns/create-rss.hbs:20 views/campaigns/create-triggered.hbs:25
-#: views/campaigns/create.hbs:27 views/campaigns/edit-rss.hbs:23
-#: views/campaigns/edit-triggered.hbs:23 views/campaigns/edit.hbs:26
-msgid "Disable clicked tracking"
-msgstr "Desactivar el seguimiento de Clics"
-
-#: views/campaigns/create-triggered.hbs:3
-#: views/campaigns/create-triggered.hbs:4
-msgid "Create Triggered Campaign"
-msgstr "Campaña Trigger creada"
-
-#: views/campaigns/create-triggered.hbs:12 views/campaigns/create.hbs:12
-#: views/campaigns/edit-triggered.hbs:7 views/campaigns/edit.hbs:7
-#: views/lists/fields/create.hbs:31 views/lists/fields/edit.hbs:33
-#: views/reports/reports.hbs:7 views/templates/create.hbs:13
-msgid "Template"
-msgstr "Plantilla"
-
-#: views/campaigns/create-triggered.hbs:13 views/campaigns/create.hbs:13
-msgid "Select a template:"
-msgstr "Seleccionar plantilla"
-
-#: views/campaigns/create-triggered.hbs:15 views/campaigns/create.hbs:15
-msgid "Selecting a template creates a campaign specific copy from it"
-msgstr "Selección de una plantilla para crear una copia de campaña de ella"
-
-#: views/campaigns/create-triggered.hbs:16 views/campaigns/create.hbs:16
-msgid "Or alternatively use an URL as the message content source:"
-msgstr ""
-"O, alternativamente, utilizar una URL como la fuente de contenido del "
-"mensaje:"
-
-#: views/campaigns/create-triggered.hbs:17 views/campaigns/create.hbs:17
-#: views/campaigns/edit-triggered.hbs:26 views/campaigns/edit.hbs:29
-msgid ""
-"If a message is sent then this URL will be POSTed to using Merge Tags as "
-"POST body. Use this if you want to generate the HTML message yourself"
-msgstr ""
-"Si el mensaje es enviado, se realizará una petición POST a esta URL "
-"utilizando los Merge Tags como parámetros. Utiliza esta opción si quieres "
-"generar el mensaje HTML tu mismo"
-
-#: views/campaigns/create-triggered.hbs:22 views/campaigns/create.hbs:24
-#: views/campaigns/edit-triggered.hbs:20 views/campaigns/edit.hbs:23
-#: views/campaigns/view.hbs:15
-msgid "Email \"subject line\""
-msgstr "Email \"asunto\""
-
-#: views/campaigns/create-triggered.hbs:23 views/campaigns/create.hbs:25
-#: views/campaigns/edit-triggered.hbs:21 views/campaigns/edit.hbs:24
-#: views/settings.hbs:27
-msgid "Keep it relevant and non-spammy"
-msgstr "Mantener relevancia y no spam"
-
-#: views/campaigns/create.hbs:21 views/campaigns/edit.hbs:20
-msgid ""
-"This is the address people will send replies to unless reply-to address is "
-"set"
-msgstr ""
-"Esta es la dirección donde los usuarios enviarán respuestas a menos que "
-"\"mail de respuesta\" sea establecido"
-
-#: views/campaigns/create.hbs:22 views/campaigns/edit.hbs:21
-#: views/campaigns/view.hbs:14
-msgid "Email \"reply-to\" address"
-msgstr "Dirección de correo \"de respuesta\""
-
-#: views/campaigns/create.hbs:23 views/campaigns/edit.hbs:22
-msgid "If set, this is the address people will send replies to"
-msgstr ""
-"Si se establece, esta es la dirección donde los usuarios enviarán respuestas"
-
-#: views/campaigns/delivered.hbs:3 views/campaigns/delivered.hbs:4
-msgid "Delivered info"
-msgstr "Información tiempo de entrega"
-
-#: views/campaigns/delivered.hbs:6
-msgid "Subscribers who received the message and did not bounce/unsubscribe:"
-msgstr ""
-"Los suscriptores que recibieron el mensaje y no han sido bounces ni bajas:"
-
-#: views/campaigns/delivered.hbs:11
-msgid "Delivery time"
-msgstr "Tiempo de entrega"
-
-#: views/campaigns/edit-rss.hbs:3 views/campaigns/edit-rss.hbs:4
-msgid "Edit RSS Campaign"
-msgstr "Editar Campaña RSS"
-
-#: views/campaigns/edit-rss.hbs:7 views/campaigns/edit-triggered.hbs:8
-#: views/campaigns/edit.hbs:9 views/settings.hbs:4 views/users/account.hbs:6
-msgid "General Settings"
-msgstr "Configuración general"
-
-#: views/campaigns/edit-rss.hbs:17
-msgid ""
-"Use special merge tag [RSS_ENTRY] to mark the position for the RSS post "
-"content. Additionally you can use any valid merge tag as well."
-msgstr ""
-"Usar especial tag [RSS_ENTRY] para marcar la posición del contenido del post "
-"RSS. Además puedes utilizas más tags"
-
-#: views/campaigns/edit-rss.hbs:24 views/campaigns/edit-triggered.hbs:27
-#: views/campaigns/edit.hbs:35
-msgid "Delete Campaign"
-msgstr "Eliminar Camppaña"
-
-#: views/campaigns/edit-rss.hbs:25 views/campaigns/edit-triggered.hbs:28
-#: views/campaigns/edit.hbs:36 views/lists/edit.hbs:20
-#: views/lists/fields/edit.hbs:39 views/lists/forms/edit.hbs:33
-#: views/lists/forms/forms.hbs:12 views/lists/segments/edit.hbs:14
-#: views/lists/segments/rule-edit.hbs:38 views/lists/subscription/edit.hbs:18
-#: views/reports/edit.hbs:6 views/settings.hbs:99 views/templates/edit.hbs:12
-#: views/triggers/edit.hbs:30 views/users/account.hbs:18
-msgid "Update"
-msgstr "Actualizar"
-
-#: views/campaigns/edit-triggered.hbs:3 views/campaigns/edit-triggered.hbs:4
-msgid "Edit Triggered Campaign"
-msgstr "Editar Campaña Activadas"
-
-#: views/campaigns/edit-triggered.hbs:6 views/campaigns/edit.hbs:6
-#: routes/forms.js:143
-msgid "General"
-msgstr "General"
-
-#: views/campaigns/edit-triggered.hbs:24 views/campaigns/edit.hbs:27
-msgid "Template Settings"
-msgstr "Configuración de plantilla"
-
-#: views/campaigns/edit-triggered.hbs:25 views/campaigns/edit.hbs:28
-msgid "Template URL"
-msgstr "URL de la plantilla"
-
-#: views/campaigns/edit.hbs:3 views/campaigns/edit.hbs:4
-#: views/campaigns/upload-attachment.hbs:3
-#: views/campaigns/upload-attachment.hbs:5 views/campaigns/view.hbs:3
-msgid "Edit Campaign"
-msgstr "Modificar campaña"
-
-#: views/campaigns/edit.hbs:8 views/campaigns/edit.hbs:30
-msgid "Attachments"
-msgstr "Archivos adjuntos"
-
-#: views/campaigns/edit.hbs:31
-msgid "File"
-msgstr "Archivo"
-
-#: views/campaigns/edit.hbs:32
-msgid "Size"
-msgstr "Tamaño"
-
-#: views/campaigns/edit.hbs:33 views/campaigns/view.hbs:68
-#: views/lists/fields/fields.hbs:12 views/lists/forms/forms.hbs:9
-#: views/lists/view.hbs:33
-msgid "No data available in table"
-msgstr "No hay datos disponibles en la tabla"
-
-#: views/campaigns/edit.hbs:34 views/campaigns/upload-attachment.hbs:4
-msgid "Add Attachment"
-msgstr "Añadir un adjunto"
-
-#: views/campaigns/opened.hbs:3 views/campaigns/opened.hbs:4
-msgid "Opened info"
-msgstr "Información apertura"
-
-#: views/campaigns/opened.hbs:6
-msgid "Subscribers who opened this message:"
-msgstr "Los suscriptores que abrieron este mensaje:"
-
-#: views/campaigns/opened.hbs:12
-msgid "First open"
-msgstr "Primera apertura"
-
-#: views/campaigns/opened.hbs:13
-msgid "Opened count"
-msgstr "Recuento de aperturas"
-
-#: views/campaigns/unsubscribed.hbs:3 views/campaigns/unsubscribed.hbs:4
-msgid "Unsubscribed info"
-msgstr "Información de bajas"
-
-#: views/campaigns/unsubscribed.hbs:6
-msgid "Subscribers who unsubscribed:"
-msgstr "Suscriptores que se han dado de baja"
-
-#: views/campaigns/unsubscribed.hbs:11 views/campaigns/view.hbs:28
-#: views/lists/subscription/import.hbs:10 routes/lists.js:206
-msgid "Unsubscribed"
-msgstr "Dado de baja"
-
-#: views/campaigns/upload-attachment.hbs:7
-msgid "Upload"
-msgstr "Subir"
-
-#: views/campaigns/view.hbs:4
-msgid "Overview"
-msgstr "Visión de conjunto"
-
-#: views/campaigns/view.hbs:5
-msgid "Links"
-msgstr "Links"
-
-#: views/campaigns/view.hbs:7
-msgid "Feed URL"
-msgstr "URL de Feed"
-
-#: views/campaigns/view.hbs:8
-msgid "Last check"
-msgstr "Último control"
-
-#: views/campaigns/view.hbs:9
-msgid "Not yet checked"
-msgstr "No revisado aún"
-
-#: views/campaigns/view.hbs:10
-msgid "activate campaign to start checking feed for new messages"
-msgstr ""
-"Activar la campaña para empezar a comprobar si hay nuevos mensajes de Feed"
-
-#: views/campaigns/view.hbs:11
-msgid "RSS status"
-msgstr "Estatus RSS"
-
-#: views/campaigns/view.hbs:16
-msgid "Preview campaign as"
-msgstr "Campaña de vista previa como"
-
-#: views/campaigns/view.hbs:17
-msgid "Add new test user"
-msgstr "Añadir un nuevo usuario de prueba"
-
-#: views/campaigns/view.hbs:18
-msgid "No test users yet, create one here"
-msgstr "Ningún miembro de la prueba aún, crear uno aquí"
-
-#: views/campaigns/view.hbs:19
-msgid "Go"
-msgstr "Ir"
-
-#: views/campaigns/view.hbs:20 lib/models/triggers.js:26
-msgid "Delivered"
-msgstr "Entregado"
-
-#: views/campaigns/view.hbs:21
-msgid "List subscribers who received this message"
-msgstr "Lista de Suscriptores que recibieron este boletín"
-
-#: views/campaigns/view.hbs:22
-msgid "Blacklisted"
-msgstr "Lista negra"
-
-#: views/campaigns/view.hbs:23
-msgid "List subscribers who blacklisted by global blacklist"
-msgstr "Lista de suscriptores que sin lista negra de lista negra mundial"
-
-#: views/campaigns/view.hbs:24 routes/lists.js:206
-msgid "Bounced"
-msgstr "Rebotado"
-
-#: views/campaigns/view.hbs:25
-msgid "List subscribers who bounced"
-msgstr "Lista de suscriptores que ha rebotado"
-
-#: views/campaigns/view.hbs:26
-msgid "Complaints"
-msgstr "Quejas"
-
-#: views/campaigns/view.hbs:27
-msgid "List subscribers who complained for this message"
-msgstr "Lista de suscriptores que se ha quejado por este boletín"
-
-#: views/campaigns/view.hbs:29
-msgid "List subscribers who unsubscribed after this message"
-msgstr "Lista de suscriptores que se han dado de baja tras este boletín"
-
-#: views/campaigns/view.hbs:30
-msgid "Opened"
-msgstr "Aperturas"
-
-#: views/campaigns/view.hbs:31
-msgid "List subscribers who opened this message"
-msgstr "Lista de suscriptores que han abierto este boletín"
-
-#: views/campaigns/view.hbs:32
-msgid "Clicked"
-msgstr "Clics"
-
-#: views/campaigns/view.hbs:33 views/campaigns/view.hbs:70
-msgid "List subscribers who clicked on a link"
-msgstr "Lista de suscriptores que han hecho clic en este boletín"
-
-#: views/campaigns/view.hbs:34
-msgid ""
-"Are you sure? This action would start sending messages to the selected list"
-msgstr ""
-"¿Estás seguro? Esta acción empezará a enviar el boletín a la lista "
-"seleccionada"
-
-#: views/campaigns/view.hbs:35
-msgid "Delay sending"
-msgstr "Envío retrasado"
-
-#: views/campaigns/view.hbs:36
-msgid "hours"
-msgstr "horas"
-
-#: views/campaigns/view.hbs:37
-msgid "minutes"
-msgstr "minutos"
-
-#: views/campaigns/view.hbs:38
-msgid "Send to subscribers:"
-msgstr "Enviar a suscriptores:"
-
-#: views/campaigns/view.hbs:39
-msgid "Are you sure? This action would reset scheduling"
-msgstr "¿Estás seguro? Esta acción restablecerá la programación"
-
-#: views/campaigns/view.hbs:40
-msgid "Cancel"
-msgstr "Cancelado"
-
-#: views/campaigns/view.hbs:41
-msgid "Sending scheduled"
-msgstr "Envío programado"
-
-#: views/campaigns/view.hbs:42 views/campaigns/view.hbs:54
-msgid "Pause"
-msgstr "Pausa"
-
-#: views/campaigns/view.hbs:43 routes/campaigns.js:253
-msgid "Sending"
-msgstr "Enviando"
-
-#: views/campaigns/view.hbs:44 views/campaigns/view.hbs:48
-msgid ""
-"Are you sure? This action would resume sending messages to the selected list"
-msgstr ""
-"¿Estás seguro? Esta acción reanudará el envío del boletín a la lista "
-"seleccionada"
-
-#: views/campaigns/view.hbs:45 views/campaigns/view.hbs:49
-msgid "Are you sure? This action would reset all stats about current progress"
-msgstr ""
-"¿Estás seguro? Esta acción reiniciará todas las estadísticas de progreso "
-"actual"
-
-#: views/campaigns/view.hbs:46
-msgid "Resume"
-msgstr "Reanudar"
-
-#: views/campaigns/view.hbs:47 views/campaigns/view.hbs:51
-msgid "Reset"
-msgstr "Reiniciar"
-
-#: views/campaigns/view.hbs:50
-msgid "Continue"
-msgstr "Continuar"
-
-#: views/campaigns/view.hbs:52
-msgid ""
-"All messages sent! Hit \"Continue\" if you you want to send this campaign to "
-"new subscribers"
-msgstr ""
-"¡Todos los mensajes han sido enviados! Haz clic en \"Continuar\" si quieres "
-"enviar la campaña a nuevos suscriptores"
-
-#: views/campaigns/view.hbs:53
-msgid ""
-"Are you sure? This action would pause sending new entries in RSS feed as "
-"email messages to the selected list"
-msgstr ""
-"¿Estás seguro? Esta acción pausará el envío de nuevas entradas RSS a la "
-"lista seleccionada"
-
-#: views/campaigns/view.hbs:55 views/campaigns/view.hbs:59
-msgid "Campaign status:"
-msgstr "Estado de la campaña:"
-
-#: views/campaigns/view.hbs:56
-msgid "ACTIVE"
-msgstr "ACTIVO"
-
-#: views/campaigns/view.hbs:57
-msgid ""
-"Are you sure? This action would start sending new entries in RSS feed as "
-"email messages to the selected list"
-msgstr ""
-"¿Estás seguro? Esta acción empezará el envío del boletín a la lista "
-"seleccionada"
-
-#: views/campaigns/view.hbs:58
-msgid "Activate"
-msgstr "Activar"
-
-#: views/campaigns/view.hbs:60
-msgid "INACTIVE"
-msgstr "INACTIVO"
-
-#: views/campaigns/view.hbs:61
-msgid ""
-"This is a triggered campaign. Messages are only sent to subscribers that hit "
-"some trigger that invokes this campaign"
-msgstr ""
-"Esta es una campaña encadenada (Trigger). Los boletines son enviados a "
-"suscriptores que han desencadenado alguna acción de esta campaña."
-
-#: views/campaigns/view.hbs:62
-msgid "see more"
-msgstr "ver más"
-
-#: views/campaigns/view.hbs:67
-msgid "List subscribers who clicked this link"
-msgstr "Lista de suscriptores que ha hecho clic en este link"
-
-#: views/campaigns/view.hbs:71
-msgid ""
-"Clicks are counted as unique subscribers that clicked on a specific link or "
-"on any link (in aggregated view)"
-msgstr ""
-"Clics únicos, contados como único suscriptores hace clic en link específico "
-"o en ningún link (vista agregada)"
-
-#: views/campaigns/view.hbs:72
-msgid ""
-"If a new entry is found from campaign feed a new subcampaign is created of "
-"that entry and it will be listed here"
-msgstr ""
-"Si una nueva entrada es en la campaña Feed, una nueva subcampaña de esta "
-"entrada es creada y será listada aquí"
-
-#: views/emails/password-reset-html.hbs:1
-#: views/emails/password-reset-text.hbs:1
-msgid "Change your password"
-msgstr "Cambiar contraseña"
-
-#: views/emails/password-reset-html.hbs:2
-#: views/emails/password-reset-text.hbs:2
-msgid "We have received a password change request for your Mailtrain account:"
-msgstr ""
-"Hemos recibido una solicitud de cambio de contraseña de su cuenta Mailtrain:"
-
-#: views/emails/password-reset-html.hbs:3
-#: views/emails/password-reset-text.hbs:3
-msgid "Reset password"
-msgstr "Restablecer la contraseña"
-
-#: views/emails/password-reset-html.hbs:4
-#: views/emails/password-reset-text.hbs:4
-msgid ""
-"If you did not ask to change your password, then you can ignore this email "
-"and your password will not be changed."
-msgstr ""
-"Si usted no pidió que cambie su contraseña, entonces puede ignorar este "
-"mensaje y no se cambiará la contraseña."
-
-#: views/emails/rss-html.hbs:1 views/emails/stationery-html.hbs:3
-#: views/emails/stationery-text.hbs:3
-msgid "Preferences"
-msgstr "Preferencias"
-
-#: views/emails/rss-html.hbs:2 views/emails/stationery-html.hbs:4
-#: views/emails/stationery-text.hbs:4 views/lists/forms/edit.hbs:20
-#: views/lists/subscription/edit.hbs:16
-#: views/subscription/partials/subscription-unsubscribe-form.hbs:2
-#: views/subscription/web-manage.mjml.hbs:3
-#: views/subscription/web-unsubscribe.mjml.hbs:1
-#: views/subscription/web-unsubscribe.mjml.hbs:2 routes/forms.js:223
-#: routes/lists.js:288
-msgid "Unsubscribe"
-msgstr "Darse de baja"
-
-#: views/emails/rss-html.hbs:3 views/emails/stationery-html.hbs:5
-#: views/emails/stationery-text.hbs:5
-msgid "View this email in your browser"
-msgstr "Ver este correo electrónico en su navegador"
-
-#: views/emails/stationery-html.hbs:1 views/emails/stationery-text.hbs:1
-msgid "Hey [FIRST_NAME/Customer],"
-msgstr "Hola [FIRST_NAME/Customer],"
-
-#: views/emails/stationery-html.hbs:2 views/emails/stationery-text.hbs:2
-msgid "Cheers,"
-msgstr "Gracias,"
-
-#: views/index.hbs:1
-msgid "List Management"
-msgstr "Gestión de la lista"
-
-#: views/index.hbs:2
-msgid ""
-"Mailtrain allows you to easily manage even very large lists. Million "
-"subscribers? Not a problem. You can add subscribers manually, through the "
-"API or import from a CSV file. All lists come with support for custom fields "
-"and merge tags as well."
-msgstr ""
-"Mailtrain le permite administrar fácilmente listas muy grandes. ¿Millones de "
-"suscriptores? No es un problema. Puede añadir manualmente los suscriptores, "
-"a través de la API o importación de un archivo CSV. Todas las listas vienen "
-"con soporte para los campos personalizados y se fusionan las etiquetas "
-"también."
-
-#: views/index.hbs:3 views/index.hbs:7 views/index.hbs:10 views/index.hbs:13
-#: views/index.hbs:16 views/index.hbs:19 views/index.hbs:22 views/index.hbs:25
-#: views/index.hbs:28
-msgid "Show more"
-msgstr "Mostrar más"
-
-#: views/index.hbs:4 views/lists/fields/create.hbs:3
-#: views/lists/fields/edit.hbs:3 views/lists/fields/fields.hbs:3
-#: views/lists/fields/fields.hbs:5 views/lists/view.hbs:6
-msgid "Custom Fields"
-msgstr "Campos Personalizados"
-
-#: views/index.hbs:5
-msgid ""
-"Text fields, numbers, drop downs or checkboxes, Mailtrain has them all. "
-"Every custom field can be included in the generated newsletters through "
-"merge tags."
-msgstr ""
-"Mailtrain tiene campos de texto, números, menús desplegables y casillas de "
-"verificación. Cada campo personalizado se puede incluir en los boletines "
-"generados a través de las etiquetas."
-
-#: views/index.hbs:6
-msgid "Mailtrain also supports custom forms."
-msgstr "Mailtrain soporta formularios personalizados también."
-
-#: views/index.hbs:8
-msgid "List Segmentation"
-msgstr "Lista Segmentada"
-
-#: views/index.hbs:9
-msgid ""
-"Send messages only to list subscribers that match predefined segmentation "
-"rules. No need to create separate lists with small differences."
-msgstr ""
-"Enviar mensajes sólo a la lista de suscriptores que cumple las de "
-"segmentación predefinidas. No hay necesidad de crear listas separadas con "
-"pequeñas diferencias."
-
-#: views/index.hbs:11
-msgid "RSS Campaigns"
-msgstr "Campañas RSS"
-
-#: views/index.hbs:12
-msgid ""
-"Setup Mailtrain to track RSS feeds and if a new entry is detected in a feed "
-"then Mailtrain auto-generates a new campaign using entry data as message "
-"contents and sends it to selected subscribers."
-msgstr ""
-"Configura Mailtrain para seguir el Fedd de RSS y si se detecta una nueva "
-"entrada del feed, Mailtrain generará automáticamente una nueva campaña a "
-"partir de los datos de la entrada como contenido del mensaje y lo enviará a "
-"los suscriptores seleccionados."
-
-#: views/index.hbs:14
-msgid "GPG Encryption"
-msgstr "Cifrado GPG"
-
-#: views/index.hbs:15
-msgid ""
-"If a list has a custom field for a GPG Public Key set then subscribers can "
-"upload their GPG public key to receive encrypted messages from the list."
-msgstr ""
-"Si una lista tiene un campo personalizado para una clave pública GPG "
-"establecida, los suscriptores pueden actualizar su clave pública GPG para "
-"recibir mensajes cifrados de la lista."
-
-#: views/index.hbs:17
-msgid "Click Stats"
-msgstr "Estadísticas de clics"
-
-#: views/index.hbs:18
-msgid ""
-"After a campaign is sent, check individual click statistics for every link "
-"included in the message."
-msgstr ""
-"Tras enviar una campaña, comprobar las estadísticas de clic individuales "
-"para cada enlace incluido en el mensaje."
-
-#: views/index.hbs:20
-msgid "Template Editors"
-msgstr "Editores plantilla"
-
-#: views/index.hbs:21
-msgid ""
-"Mailtrain ships with GrapeJS and Mosaico built in, two advanced template "
-"editors. Mailtrain also offers a code editor if you prefer to handcraft the "
-"HTML yourself."
-msgstr ""
-"Mailtrain envía con los incorporados GrapeJS y Mosaico, dos editores "
-"avanzados de plantillas . Mailtrain también ofrece un editor de código, por "
-"si prefieres modificar HTML."
-
-#: views/index.hbs:23
-msgid "Send via Any Provider"
-msgstr "Enviar a través de cualquier proveedor"
-
-#: views/index.hbs:24
-msgid ""
-"Mailtrain recommends SendPulse even though you "
-"can use any provider that supports SMTP protocol to send out your "
-"newsletters. Bounce and complaints handling via webhooks is supported for "
-"SES, SparkPost, SendGrid and Mailgun, also for Postfix and ZoneMTA."
-msgstr ""
-"Mailtrain recomienda SendPulseaunque se puede "
-"utilizar cualquier proveedor que soporte el protocolo SMTP para enviar sus "
-"boletines de noticias. El manejo de rebotes y de quejas a través de WebHooks "
-"es compatible para SES, SparkPost, SendGrid y Mailgun, también para Postfix "
-"y ZoneMTA."
-
-#: views/index.hbs:26 lib/tools.js:137
-msgid "Automation"
-msgstr "Automatización"
-
-#: views/index.hbs:27
-msgid ""
-"Define automation triggers to send specific messages when a user activates "
-"the trigger."
-msgstr ""
-"Definir los factores desencadenantes de automatización para enviar boletines "
-"específicos cuando un usuario activa el Trigger."
-
-#: views/index.hbs:29
-msgid "Donate to Author"
-msgstr "Donar al autor"
-
-#: views/index.hbs:30
-msgid "Mailtrain is available under GPLv3 license and completely open source."
-msgstr ""
-"Mailtrain está disponible bajo licencia GPLv3 y la fuente es completamente "
-"abierta (Open source)."
-
-#: views/index.hbs:31
-msgid ""
-"If you really like Mailtrain or your business benefits from it financially "
-"then I would really appreciate a small donation to keep the Mailtrain "
-"development engines running. You can either use Bitcoin or PayPal for "
-"donations. My Bitcoin wallet is"
-msgstr ""
-"Si realmente te gusta Mailtrain o su negocio se beneficia de ella "
-"financieramente entonces yo realmente apreciaría una pequeña donación para "
-"mantener los motores de desarrollo Mailtrain. También se puede usar Bitcoin "
-"o PayPal para donaciones. Bitcoin es mi monedero."
-
-#: views/index.hbs:32
-msgid "Or Donate Using Paypal"
-msgstr "O donar usando Paypal"
-
-#: views/index.hbs:33
-msgid "Official Mailtrain Partners"
-msgstr "Socios oficiales de Mailtrain"
-
-#: views/index.hbs:34
-msgid ""
-"A reliable SMTP server, easy integration, and 12,000 messages a month free"
-msgstr ""
-"Un servidor SMTP fiable, de fácil integración y envío de 12.000 mensajes "
-"durante un mes gratis"
-
-#: views/index.hbs:35
-msgid "Free, open source mail server solution"
-msgstr ""
-"Gratis, solución de código abierto (open source) de servidor de correo "
-
-#: views/layout.hbs:2
-msgid "Toggle navigation"
-msgstr "Interruptor de navegación"
-
-#: views/layout.hbs:3
-msgid "Wiki"
-msgstr "Wiki"
-
-#: views/layout.hbs:4
-msgid "Blog"
-msgstr "Blog"
-
-#: views/layout.hbs:5 views/users/account.hbs:2 views/users/account.hbs:3
-msgid "Account"
-msgstr "Cuenta"
-
-#: views/layout.hbs:6 views/settings.hbs:2 views/settings.hbs:3
-msgid "Settings"
-msgstr "Ajustes"
-
-#: views/layout.hbs:8 views/users/api.hbs:2 views/users/api.hbs:3
-msgid "API"
-msgstr "API"
-
-#: views/layout.hbs:9
-msgid "Log out"
-msgstr "Cerrar sesión"
-
-#: views/layout.hbs:10 views/users/forgot.hbs:2 views/users/login.hbs:2
-#: views/users/login.hbs:3 views/users/login.hbs:9 views/users/reset.hbs:2
-msgid "Sign in"
-msgstr "Registrarse"
-
-#: views/layout.hbs:11
-msgid "Self Hosted Newsletter App Built on Top of Nodemailer"
-msgstr "Applicación de Newsletter \"autoalojada\" creada en base a Nodemailer?"
-
-#: views/layout.hbs:12 views/layout.hbs:14
-msgid "Source on GitHub"
-msgstr "Fuente en GitHub"
-
-#: views/layout.hbs:13
-msgid "Subscribe to Our Newsletter"
-msgstr "Suscríbete a nuestro boletín"
-
-#: views/lists/create.hbs:2 views/lists/edit.hbs:2
-#: views/lists/fields/create.hbs:2 views/lists/fields/edit.hbs:2
-#: views/lists/fields/fields.hbs:2 views/lists/forms/create.hbs:2
-#: views/lists/forms/edit.hbs:2 views/lists/forms/forms.hbs:2
-#: views/lists/lists.hbs:2 views/lists/lists.hbs:4
-#: views/lists/segments/create.hbs:2 views/lists/segments/edit.hbs:2
-#: views/lists/segments/rule-configure.hbs:2
-#: views/lists/segments/rule-create.hbs:2 views/lists/segments/rule-edit.hbs:2
-#: views/lists/segments/segments.hbs:2 views/lists/segments/view.hbs:2
-#: views/lists/subscription/add.hbs:2 views/lists/subscription/edit.hbs:2
-#: views/lists/subscription/import-failed.hbs:2
-#: views/lists/subscription/import-preview.hbs:2
-#: views/lists/subscription/import.hbs:2 views/lists/view.hbs:2
-#: lib/tools.js:125 routes/lists.js:59
-msgid "Lists"
-msgstr "Listas"
-
-#: views/lists/create.hbs:3 views/lists/create.hbs:4 views/lists/create.hbs:13
-#: views/lists/lists.hbs:3
-msgid "Create List"
-msgstr "Crear lista"
-
-#: views/lists/create.hbs:6 views/lists/edit.hbs:7
-msgid "List Name"
-msgstr "Nombre de Lista"
-
-#: views/lists/create.hbs:9 views/lists/edit.hbs:15
-#: views/triggers/create.hbs:15 views/triggers/edit.hbs:17
-msgid "Subscription"
-msgstr "Suscripción"
-
-#: views/lists/create.hbs:10 views/lists/edit.hbs:16
-msgid "Allow public users to subscribe themselves"
-msgstr "Permitir que los usuarios públicos se suscriban a sí mismos "
-
-#: views/lists/create.hbs:11 views/lists/edit.hbs:17
-msgid "Unsubscription"
-msgstr "Darse de baja"
-
-#: views/lists/create.hbs:12 views/lists/edit.hbs:18
-msgid "Select how an unsuscription request by subscriber is handled."
-msgstr "Seleccionar como el suscriptor maneja la solicitud de baja."
-
-#: views/lists/edit.hbs:3 views/lists/edit.hbs:4 views/lists/view.hbs:8
-msgid "Edit List"
-msgstr "Editar lista"
-
-#: views/lists/edit.hbs:5
-msgid "View List"
-msgstr "Ver lista"
-
-#: views/lists/edit.hbs:8
-msgid "List ID"
-msgstr "ID de lista"
-
-#: views/lists/edit.hbs:9
-msgid "This is the list ID displayed to the subscribers"
-msgstr "Este es el ID de la lista que se muestra a los suscriptores"
-
-#: views/lists/edit.hbs:12
-msgid "Custom Form"
-msgstr "Formulario personalizado"
-
-#: views/lists/edit.hbs:13 views/lists/forms/forms.hbs:11
-msgid "Default Mailtrain Form"
-msgstr "Formulario por defecto de Mailtrain"
-
-#: views/lists/edit.hbs:14
-msgid ""
-"The custom form used for this list. You can create a form here."
-msgstr ""
-"El formulario personalizado que se utiliza para esta lista. Puedes crear un "
-"formulario aquí ."
-
-#: views/lists/edit.hbs:19
-msgid "Delete List"
-msgstr "Eliminar lista"
-
-#: views/lists/fields/create.hbs:4
-msgid "Create Field"
-msgstr "Crear campo"
-
-#: views/lists/fields/create.hbs:5 views/lists/fields/fields.hbs:4
-msgid "Create Custom Field"
-msgstr "Crear campo personalizado"
-
-#: views/lists/fields/create.hbs:6 views/lists/fields/create.hbs:7
-#: views/lists/fields/edit.hbs:7 views/lists/fields/edit.hbs:8
-msgid "Field Name"
-msgstr "Nombre de campo"
-
-#: views/lists/fields/create.hbs:8 views/lists/fields/edit.hbs:9
-msgid "Field Type"
-msgstr "Tipo de campo"
-
-#: views/lists/fields/create.hbs:9 views/lists/fields/edit.hbs:10
-#: lib/models/fields.js:17
-msgid "Text"
-msgstr "Texto"
-
-#: views/lists/fields/create.hbs:10 views/lists/fields/edit.hbs:11
-#: lib/models/fields.js:21
-msgid "Number"
-msgstr "Número"
-
-#: views/lists/fields/create.hbs:11 views/lists/fields/edit.hbs:12
-#: lib/models/fields.js:18
-msgid "Website"
-msgstr "Web"
-
-#: views/lists/fields/create.hbs:12 views/lists/fields/edit.hbs:13
-#: lib/models/fields.js:20
-msgid "GPG Public Key"
-msgstr "Clave pública GPG"
-
-#: views/lists/fields/create.hbs:13 views/lists/fields/edit.hbs:14
-#: lib/models/fields.js:19
-msgid "Multi-line text"
-msgstr "Texto de varias líneas"
-
-#: views/lists/fields/create.hbs:14 views/lists/fields/edit.hbs:15
-msgid "JSON"
-msgstr "JSON"
-
-#: views/lists/fields/create.hbs:15 views/lists/fields/edit.hbs:16
-msgid "Date"
-msgstr "Fecha"
-
-#: views/lists/fields/create.hbs:16 views/lists/fields/edit.hbs:17
-msgid "Date (MM/DD/YYYY)"
-msgstr "Fecha (MM/DD/YYYY)"
-
-#: views/lists/fields/create.hbs:17 views/lists/fields/edit.hbs:18
-#: lib/models/fields.js:26
-msgid "Date (DD/MM/YYYY)"
-msgstr "Fecha (DD/MM/YYYY)"
-
-#: views/lists/fields/create.hbs:18 views/lists/fields/edit.hbs:19
-msgid "Birthday"
-msgstr "Cumpleaños"
-
-#: views/lists/fields/create.hbs:19 views/lists/fields/edit.hbs:20
-#: lib/models/fields.js:27
-msgid "Birthday (MM/DD)"
-msgstr "Cumpleaños (MM/DD)"
-
-#: views/lists/fields/create.hbs:20 views/lists/fields/edit.hbs:21
-#: lib/models/fields.js:28
-msgid "Birthday (DD/MM)"
-msgstr "Cumpleaños (DD/MM)"
-
-#: views/lists/fields/create.hbs:21 views/lists/fields/edit.hbs:22
-msgid "Grouped"
-msgstr "Agrupado"
-
-#: views/lists/fields/create.hbs:22 views/lists/fields/edit.hbs:23
-msgid "Drop Downs"
-msgstr "Listas deplegables"
-
-#: views/lists/fields/create.hbs:23 views/lists/fields/edit.hbs:24
-#: lib/models/fields.js:22
-msgid "Radio Buttons"
-msgstr "Botones Radio "
-
-#: views/lists/fields/create.hbs:24 views/lists/fields/edit.hbs:25
-#: lib/models/fields.js:23
-msgid "Checkboxes"
-msgstr "Checkboxes"
-
-#: views/lists/fields/create.hbs:25 views/lists/fields/edit.hbs:26
-msgid "Option for a group value"
-msgstr "Opción para un valor de grupo"
-
-#: views/lists/fields/create.hbs:26 views/lists/fields/edit.hbs:27
-msgid "Group"
-msgstr "Grupo"
-
-#: views/lists/fields/create.hbs:28 views/lists/fields/edit.hbs:29
-msgid "Required for group options"
-msgstr "Requerido para Opciones de Grupo"
-
-#: views/lists/fields/create.hbs:29 views/lists/fields/create.hbs:30
-#: views/lists/fields/edit.hbs:35 views/lists/fields/edit.hbs:36
-#: views/lists/fields/fields.hbs:9
-msgid "Default merge tag value"
-msgstr "Valor de la etiqueta Merge por defecto"
-
-#: views/lists/fields/create.hbs:32 views/lists/fields/edit.hbs:34
-msgid ""
-"For group elements like checkboxes you can control the appearance of the "
-"merge tag with an optional template. The template uses handlebars syntax and "
-"you can find all values from {{values}} array, for example "
-"{{#each values}} {{this}} {{/each}}. If template is not defined "
-"then multiple values are joined with commas. You can also use this template "
-"to render JSON values (if the JSON is an array then the array is exposed as "
-"values, otherwise you can access the JSON keys directly)."
-msgstr ""
-"Para los elementos de grupo como checkboxes tu puedes controlar la "
-"apariencia de la etiqueta merge con una plantilla opcional. La plantilla "
-"utiliza la sintaxis Handlebars y se pueden encontrar todos los valores de "
-"{{values}} array, por ejemplo {{#each values}} {{this}} "
-"{{/each}}. Si la plantilla no se define, varios valores se unen con "
-"comas. También puedes utilizar esta plantilla para rederizar valores JSON "
-"(si el JSON es un array, el array es expuesto como values, de "
-"lo contrario puedes acceder directamente a las claves JSON)."
-
-#: views/lists/fields/create.hbs:33 views/lists/fields/edit.hbs:37
-msgid "Visible"
-msgstr "Visible"
-
-#: views/lists/fields/create.hbs:34
-msgid "Add Field"
-msgstr "Añadir Campo"
-
-#: views/lists/fields/edit.hbs:4
-msgid "Edit Field"
-msgstr "Editar Campo"
-
-#: views/lists/fields/edit.hbs:5
-msgid "Edit Custom Field"
-msgstr "Editar campo personalizado"
-
-#: views/lists/fields/edit.hbs:6
-msgid "Back to fields"
-msgstr "Volver a campos"
-
-#: views/lists/fields/edit.hbs:30 views/lists/fields/fields.hbs:8
-#: views/mosaico/editor.hbs:2 views/partials/merge-tag-reference.hbs:3
-msgid "Merge tag"
-msgstr "Etiqueta Merge"
-
-#: views/lists/fields/edit.hbs:31
-msgid "Merge Tag"
-msgstr "Etiqueta Merge"
-
-#: views/lists/fields/edit.hbs:32
-msgid "Put this tag in your content:"
-msgstr "Pon esta etiqueta en tu contenido:"
-
-#: views/lists/fields/edit.hbs:38
-msgid "Delete Field"
-msgstr "Eliminar campo"
-
-#: views/lists/fields/fields.hbs:7 views/lists/view.hbs:26
-#: views/report-templates/partials/report-template-fields.hbs:5
-msgid "Type"
-msgstr "Tipo"
-
-#: views/lists/fields/fields.hbs:10 views/lists/fields/fields.hbs:11
-#: views/lists/forms/edit.hbs:26 views/lists/forms/forms.hbs:8
-#: views/lists/segments/segments.hbs:8 views/lists/segments/view.hbs:12
-#: views/triggers/triggers.hbs:14 routes/campaigns.js:276
-#: routes/campaigns.js:568 routes/campaigns.js:657 routes/campaigns.js:706
-#: routes/lists.js:170 routes/lists.js:257 routes/report-templates.js:51
-#: routes/templates.js:170 routes/triggers.js:297
-msgid "Edit"
-msgstr "Editar"
-
-#: views/lists/forms/create.hbs:3 views/lists/forms/edit.hbs:3
-#: views/lists/forms/forms.hbs:3 views/lists/forms/forms.hbs:5
-#: views/lists/view.hbs:5
-msgid "Custom Forms"
-msgstr "Formularios personalizados"
-
-#: views/lists/forms/create.hbs:4
-msgid "Create Form"
-msgstr "Crear formulario"
-
-#: views/lists/forms/create.hbs:5 views/lists/forms/forms.hbs:4
-msgid "Create Custom Form"
-msgstr "Crear formulario personalizado"
-
-#: views/lists/forms/create.hbs:6 views/lists/forms/create.hbs:7
-#: views/lists/forms/edit.hbs:7 views/lists/forms/edit.hbs:8
-msgid "Form Name"
-msgstr "Nombre de Formulario"
-
-#: views/lists/forms/create.hbs:8
-msgid "Add Form"
-msgstr "Añadir Formulario"
-
-#: views/lists/forms/edit.hbs:4
-msgid "Edit Form"
-msgstr "Editar formulario"
-
-#: views/lists/forms/edit.hbs:5
-msgid "Edit Custom Form"
-msgstr "Editar Formulario personalizado"
-
-#: views/lists/forms/edit.hbs:6
-msgid "Back to forms"
-msgstr "Volver a Formularios"
-
-#: views/lists/forms/edit.hbs:10
-msgid "Optional comments about this form"
-msgstr "Compentarios opcionales sobre el formulario"
-
-#: views/lists/forms/edit.hbs:11
-msgid "Form Preview"
-msgstr "Vista previa del formulario"
-
-#: views/lists/forms/edit.hbs:12
-msgid ""
-"Note: These links are solely for a quick preview. If you submit a preview "
-"form you'll get redirected to the list's default form."
-msgstr ""
-"Nota: Estos enlaces son únicamente para una vista rápida. Si seleccionas la "
-"vista previa de un formulario se te redirecciona a la lista por defecto del "
-"formulario."
-
-#: views/lists/forms/edit.hbs:13 views/lists/subscription/add.hbs:16
-#: views/subscription/mail-unsubscription-confirmed-html.mjml.hbs:4
-#: views/subscription/mail-unsubscription-confirmed-text.hbs:4
-#: routes/forms.js:157 routes/lists.js:288
-msgid "Subscribe"
-msgstr "Suscribirse"
-
-#: views/lists/forms/edit.hbs:14
-msgid "Confirm Subscription Notice"
-msgstr "Aviso de Confirmación de suscripción"
-
-#: views/lists/forms/edit.hbs:15
-msgid "Confirm Unsubscription Notice"
-msgstr "Aviso de Confirmación de baja"
-
-#: views/lists/forms/edit.hbs:16
-msgid "Subscribed Notice"
-msgstr "Aviso Suscripción"
-
-#: views/lists/forms/edit.hbs:17
-msgid "Updated Notice"
-msgstr "Aviso Actualización"
-
-#: views/lists/forms/edit.hbs:18
-msgid "Unsubscribed Notice"
-msgstr "Aviso Baja"
-
-#: views/lists/forms/edit.hbs:19
-msgid "Manual Unsubscribe Notice"
-msgstr "Aviso Manual de baja"
-
-#: views/lists/forms/edit.hbs:21 routes/forms.js:205
-msgid "Manage"
-msgstr "Gestión"
-
-#: views/lists/forms/edit.hbs:22
-msgid "Manage Address"
-msgstr "Gestión de dirección"
-
-#: views/lists/forms/edit.hbs:23
-msgid "Create a test user for additional options"
-msgstr "Crear un usuario de prueba para opciones adicionales"
-
-#: views/lists/forms/edit.hbs:24 views/report-templates/create.hbs:3
-#: views/report-templates/edit.hbs:3
-#: views/report-templates/report-templates.hbs:3 views/templates/create.hbs:2
-#: views/templates/edit.hbs:2 views/templates/templates.hbs:2
-#: views/templates/templates.hbs:4 lib/tools.js:129 routes/templates.js:27
-msgid "Templates"
-msgstr "Plantillas"
-
-#: views/lists/forms/edit.hbs:25
-msgid "Fields"
-msgstr "Campos"
-
-#: views/lists/forms/edit.hbs:27
-msgid "Form Fields"
-msgstr "Campos de formulario"
-
-#: views/lists/forms/edit.hbs:28
-msgid "Fields hidden on subscription page:"
-msgstr "Campos ocultos de página de suscripción"
-
-#: views/lists/forms/edit.hbs:29
-msgid "Fields shown on subscription page:"
-msgstr "Campos no ocultos de página de suscripción"
-
-#: views/lists/forms/edit.hbs:30
-msgid "Fields hidden on preferences page:"
-msgstr "Campos ocultos de página de preferencias"
-
-#: views/lists/forms/edit.hbs:31
-msgid "Fields shown on preferences page:"
-msgstr "Campos no ocultos de páginas de preferencias"
-
-#: views/lists/forms/edit.hbs:32
-msgid "Delete Form"
-msgstr "Eliminar Formulario"
-
-#: views/lists/forms/forms.hbs:10
-msgid "The default form for this list is:"
-msgstr "El formulario por defecto de esta lista es:"
-
-#: views/lists/lists.hbs:6
-msgid "ID"
-msgstr "ID"
-
-#: views/lists/lists.hbs:7 views/reports/partials/report-fields.hbs:10
-msgid "Subscribers"
-msgstr "Suscriptores"
-
-#: views/lists/segments/create.hbs:3 views/lists/segments/edit.hbs:3
-#: views/lists/segments/rule-configure.hbs:3
-#: views/lists/segments/rule-create.hbs:3 views/lists/segments/rule-edit.hbs:3
-#: views/lists/segments/segments.hbs:3 views/lists/segments/segments.hbs:5
-#: views/lists/segments/view.hbs:3 views/lists/view.hbs:7
-#: views/lists/view.hbs:14
-msgid "Segments"
-msgstr "Segmentos"
-
-#: views/lists/segments/create.hbs:4 views/lists/segments/create.hbs:5
-#: views/lists/segments/rule-configure.hbs:4
-#: views/lists/segments/rule-create.hbs:4 views/lists/segments/rule-edit.hbs:4
-#: views/lists/segments/segments.hbs:4
-msgid "Create Segment"
-msgstr "Crear Segmento"
-
-#: views/lists/segments/create.hbs:6 views/lists/segments/create.hbs:7
-#: views/lists/segments/edit.hbs:7 views/lists/segments/edit.hbs:8
-msgid "Segment Name"
-msgstr "Nombre del Segmento"
-
-#: views/lists/segments/create.hbs:8 views/lists/segments/edit.hbs:9
-msgid "Rule match"
-msgstr "Combinación de reglas"
-
-#: views/lists/segments/create.hbs:10 views/lists/segments/edit.hbs:11
-msgid "All rules must match"
-msgstr "Todas las reglas deben combinar"
-
-#: views/lists/segments/create.hbs:11 views/lists/segments/edit.hbs:12
-msgid "Any rule can match"
-msgstr "Ninguna regla debe combinar"
-
-#: views/lists/segments/create.hbs:12
-msgid "Add Segment"
-msgstr "Añadir segmento"
-
-#: views/lists/segments/edit.hbs:4 views/lists/segments/edit.hbs:5
-#: views/lists/segments/view.hbs:6 views/lists/view.hbs:12
-msgid "Edit Segment"
-msgstr "Editar segmento"
-
-#: views/lists/segments/edit.hbs:6
-msgid "Back to segments"
-msgstr "Volver a segmentos"
-
-#: views/lists/segments/edit.hbs:13
-msgid "Delete Segment"
-msgstr "Eliminar segmento"
-
-#: views/lists/segments/rule-configure.hbs:5
-#: views/lists/segments/rule-create.hbs:5 views/lists/segments/rule-edit.hbs:5
-#: views/lists/segments/view.hbs:4
-msgid "Create Rule"
-msgstr "Crear regla"
-
-#: views/lists/segments/rule-configure.hbs:6
-#: views/lists/segments/rule-create.hbs:6 views/lists/segments/rule-edit.hbs:6
-#: views/lists/segments/view.hbs:10
-msgid "Rule"
-msgstr "Regla"
-
-#: views/lists/segments/rule-configure.hbs:7
-#: views/lists/segments/rule-configure.hbs:8
-#: views/lists/segments/rule-configure.hbs:10
-#: views/lists/segments/rule-configure.hbs:13
-#: views/lists/segments/rule-configure.hbs:25
-#: views/lists/segments/rule-configure.hbs:30
-#: views/lists/segments/rule-edit.hbs:7 views/lists/segments/rule-edit.hbs:8
-#: views/lists/segments/rule-edit.hbs:10 views/lists/segments/rule-edit.hbs:15
-#: views/lists/segments/rule-edit.hbs:29 views/lists/segments/rule-edit.hbs:34
-#: views/lists/segments/view.hbs:11
-msgid "Value"
-msgstr "Valor"
-
-#: views/lists/segments/rule-configure.hbs:9
-#: views/lists/segments/rule-edit.hbs:9
-msgid ""
-"Use % for wildcard character, e.g. \"%test\" to match all values that end "
-"with \"test\""
-msgstr ""
-"Usar % para carácter comodín, por ejemplo \"%test\" para combinar todos los "
-"valores que terminen en \"test\""
-
-#: views/lists/segments/rule-configure.hbs:11
-#: views/lists/segments/rule-configure.hbs:14
-#: views/lists/segments/rule-configure.hbs:26
-#: views/lists/segments/rule-edit.hbs:11 views/lists/segments/rule-edit.hbs:16
-#: views/lists/segments/rule-edit.hbs:30
-msgid "Use exact match"
-msgstr "Usar combinación exacta"
-
-#: views/lists/segments/rule-configure.hbs:12
-#: views/lists/segments/rule-configure.hbs:15
-#: views/lists/segments/rule-configure.hbs:27
-#: views/lists/segments/rule-edit.hbs:12 views/lists/segments/rule-edit.hbs:17
-#: views/lists/segments/rule-edit.hbs:31
-msgid "Use range match"
-msgstr "Usar rango de combinación"
-
-#: views/lists/segments/rule-configure.hbs:16
-#: views/lists/segments/rule-edit.hbs:20
-msgid "Use relative range match"
-msgstr "Usar rango relativo de combinación"
-
-#: views/lists/segments/rule-configure.hbs:17
-#: views/lists/segments/rule-configure.hbs:28
-#: views/lists/segments/rule-edit.hbs:13 views/lists/segments/rule-edit.hbs:18
-#: views/lists/segments/rule-edit.hbs:21 views/lists/segments/rule-edit.hbs:32
-msgid "From"
-msgstr "De"
-
-#: views/lists/segments/rule-configure.hbs:18
-#: views/lists/segments/rule-configure.hbs:22
-#: views/lists/segments/rule-edit.hbs:22 views/lists/segments/rule-edit.hbs:26
-msgid "days"
-msgstr "días"
-
-#: views/lists/segments/rule-configure.hbs:19
-#: views/lists/segments/rule-configure.hbs:23
-#: views/lists/segments/rule-edit.hbs:23 views/lists/segments/rule-edit.hbs:27
-msgid "before today"
-msgstr "antes de hoy"
-
-#: views/lists/segments/rule-configure.hbs:20
-#: views/lists/segments/rule-configure.hbs:24
-#: views/lists/segments/rule-edit.hbs:24 views/lists/segments/rule-edit.hbs:28
-msgid "after today"
-msgstr "después de hoy"
-
-#: views/lists/segments/rule-configure.hbs:21
-#: views/lists/segments/rule-configure.hbs:29
-#: views/lists/segments/rule-edit.hbs:14 views/lists/segments/rule-edit.hbs:19
-#: views/lists/segments/rule-edit.hbs:25 views/lists/segments/rule-edit.hbs:33
-msgid "to"
-msgstr "para"
-
-#: views/lists/segments/rule-configure.hbs:31
-#: views/lists/segments/rule-edit.hbs:35 lib/models/segments.js:156
-#: lib/models/segments.js:418
-msgid "Selected"
-msgstr "Seleccionado"
-
-#: views/lists/segments/rule-configure.hbs:32
-#: views/lists/segments/rule-edit.hbs:36 lib/models/segments.js:156
-#: lib/models/segments.js:418
-msgid "Not selected"
-msgstr "No Seleccionado"
-
-#: views/lists/segments/rule-configure.hbs:33
-msgid "Add Rule"
-msgstr "Añadir regla"
-
-#: views/lists/segments/rule-create.hbs:8
-#: views/lists/subscription/import.hbs:15
-#: views/reports/create-select-template.hbs:5
-#: views/triggers/create-select.hbs:9
-msgid "Next"
-msgstr "Siguiente"
-
-#: views/lists/segments/rule-edit.hbs:37
-msgid "Delete Rule"
-msgstr "Eliminar regla"
-
-#: views/lists/segments/segments.hbs:7
-msgid "Match"
-msgstr "Combinar"
-
-#: views/lists/segments/view.hbs:5 views/lists/view.hbs:13
-msgid "Segment"
-msgstr "Segmento"
-
-#: views/lists/segments/view.hbs:7
-msgid "Match rules"
-msgstr "Combinar reglas"
-
-#: views/lists/segments/view.hbs:8
-msgid "Matching subscribers"
-msgstr "Conjunto de suscriptores"
-
-#: views/lists/segments/view.hbs:9
-msgid "show"
-msgstr "mostrar"
-
-#: views/lists/subscription/add.hbs:3 views/lists/subscription/add.hbs:4
-msgid "Add subscriber"
-msgstr "Añadir suscriptor"
-
-#: views/lists/subscription/add.hbs:5
-#: views/subscription/partials/subscription-custom-fields.hbs:1
-#: views/users/account.hbs:7
-msgid "Email Address"
-msgstr "Dirección Email"
-
-#: views/lists/subscription/add.hbs:8 views/lists/subscription/edit.hbs:9
-#: views/settings.hbs:82 views/settings.hbs:97
-#: views/subscription/partials/subscription-custom-fields.hbs:6
-msgid "Begins with"
-msgstr "Empieza por"
-
-#: views/lists/subscription/add.hbs:9 views/lists/subscription/edit.hbs:10
-msgid ""
-"Insert a GPG public key that will be used to encrypt messages sent this "
-"subscriber"
-msgstr ""
-"Insertar una clave pública GPG que será usada para encriptar mensajes "
-"enviados a este suscriptor"
-
-#: views/lists/subscription/add.hbs:11 views/lists/subscription/edit.hbs:12
-#: views/lists/subscription/import-preview.hbs:9
-msgid "Timezone"
-msgstr "Zona horaria"
-
-#: views/lists/subscription/add.hbs:13 views/lists/subscription/edit.hbs:13
-msgid "Test user?"
-msgstr "¿Es un usuario test?"
-
-#: views/lists/subscription/add.hbs:14 views/lists/subscription/edit.hbs:14
-msgid ""
-"If checked then this subscription can be used for previewing campaign "
-"messages"
-msgstr ""
-"Si está marcado, esta suscripción puede ser usada para previsualizar los "
-"boletines"
-
-#: views/lists/subscription/add.hbs:15
-msgid ""
-"This person will not receive a confirmation email so make sure that you have "
-"permission to email them."
-msgstr ""
-"Esta persona no recibirá correo de confirmación para asegurarse de que tiene "
-"permiso para enviarle boletines."
-
-#: views/lists/subscription/edit.hbs:3 views/lists/subscription/edit.hbs:4
-msgid "Edit subscriber"
-msgstr "Editar suscriptor"
-
-#: views/lists/subscription/edit.hbs:5
-#: views/lists/subscription/import-failed.hbs:5
-msgid "Back to list"
-msgstr "Volver a la lista"
-
-#: views/lists/subscription/edit.hbs:6
-#: views/lists/subscription/import-preview.hbs:6
-#: views/subscription/partials/subscription-unsubscribe-form.hbs:1
-#: lib/helpers.js:42 lib/models/segments.js:11
-msgid "Email address"
-msgstr "Dirección Email"
-
-#: views/lists/subscription/edit.hbs:17
-msgid "Delete Subscription"
-msgstr "Eliminar suscripción"
-
-#: views/lists/subscription/import-failed.hbs:3
-msgid "Import status"
-msgstr "Importar estatus"
-
-#: views/lists/subscription/import-failed.hbs:4
-msgid "Failed addresses"
-msgstr "Direcciones fallidas"
-
-#: views/lists/subscription/import-failed.hbs:6
-msgid ""
-"Role-based addresses like postmaster@example.com are blocked when importing. "
-"Subscribers with role-based email addresses can join your list using the "
-"subscription form"
-msgstr ""
-"Direcciones basadas en roles como postmaster@example.com se bloquean cuando "
-"se importan. Los suscriptores con correos electrónicos basados en roles "
-"pueden unirse a la lista utilizando el formulario de suscripción."
-
-#: views/lists/subscription/import-failed.hbs:7
-msgid "see here"
-msgstr "ver aquí"
-
-#: views/lists/subscription/import-failed.hbs:9
-msgid "Fail reason"
-msgstr "Razón fallida"
-
-#: views/lists/subscription/import-preview.hbs:3
-#: views/lists/subscription/import-preview.hbs:4
-#: views/lists/subscription/import.hbs:3 views/lists/subscription/import.hbs:4
-msgid "Import subscribers"
-msgstr "Importar suscriptores"
-
-#: views/lists/subscription/import-preview.hbs:10 views/users/api.hbs:27
-#: views/users/api.hbs:35 views/users/api.hbs:43 views/users/api.hbs:54
-#: views/users/api.hbs:62 views/users/api.hbs:70
-msgid "Example"
-msgstr "Ejemplo"
-
-#: views/lists/subscription/import-preview.hbs:11
-msgid "Start import"
-msgstr "Empezar importación"
-
-#: views/lists/subscription/import.hbs:5
-msgid "CSV File"
-msgstr "Archivo CSV"
-
-#: views/lists/subscription/import.hbs:6
-msgid "CSV delimiter"
-msgstr "Delimitador CSV"
-
-#: views/lists/subscription/import.hbs:7
-msgid "Categorize the imported subscribers as"
-msgstr "Categorizar los suscriptores importados como"
-
-#: views/lists/subscription/import.hbs:8 routes/lists.js:206
-msgid "Subscribed"
-msgstr "Suscritos"
-
-#: views/lists/subscription/import.hbs:9
-msgid "Regular subscriber addresses"
-msgstr "Correos de suscriptores regulares"
-
-#: views/lists/subscription/import.hbs:11
-msgid "Suppressed emails that will be unsubscribed from your list"
-msgstr "Correos suprimidos que serán dados de baja en tu lista"
-
-#: views/lists/subscription/import.hbs:12
-msgid "Check imported emails"
-msgstr "Revisar los correos importados"
-
-#: views/lists/subscription/import.hbs:13 views/triggers/triggers.hbs:12
-msgid "Enabled"
-msgstr "Activado"
-
-#: views/lists/subscription/import.hbs:14 views/triggers/triggers.hbs:13
-msgid "Disabled"
-msgstr "Desactivado"
-
-#: views/lists/view.hbs:3
-msgid "Subscription Form"
-msgstr "Formulario de suscripción"
-
-#: views/lists/view.hbs:4
-msgid "List Actions"
-msgstr "Acciones de Lista"
-
-#: views/lists/view.hbs:9 views/triggers/create-select.hbs:3
-#: views/triggers/create-select.hbs:4 views/triggers/create.hbs:3
-#: views/triggers/create.hbs:4 views/triggers/create.hbs:27
-#: views/triggers/triggers.hbs:3
-msgid "Create Trigger"
-msgstr "Crear Trigger"
-
-#: views/lists/view.hbs:10
-msgid "Add Subscriber"
-msgstr "Añadir suscriptor"
-
-#: views/lists/view.hbs:11
-msgid "Import Subscribers"
-msgstr "Importar suscriptores"
-
-#: views/lists/view.hbs:15
-msgid "Create New Segment"
-msgstr "Crear nuevo segmento"
-
-#: views/lists/view.hbs:16
-msgid "Filter"
-msgstr "Filtrar"
-
-#: views/lists/view.hbs:17
-msgid "Subscriptions"
-msgstr "Sucriptores"
-
-#: views/lists/view.hbs:18
-msgid "Imports"
-msgstr "Importaciones"
-
-#: views/lists/view.hbs:25 routes/campaigns.js:255 routes/lists.js:300
-msgid "Finished"
-msgstr "Terminado"
-
-#: views/lists/view.hbs:27
-msgid "Added"
-msgstr "Añadido"
-
-#: views/lists/view.hbs:28
-msgid "Updated"
-msgstr "Actualizado"
-
-#: views/lists/view.hbs:29
-msgid "Failed"
-msgstr "Fallido"
-
-#: views/lists/view.hbs:31
-msgid ""
-"Are you sure? This action should only be called to resolve stalled imports"
-msgstr ""
-"¿Estás seguro? Esta acción sólo será llamada para resolver importaciones "
-"estancadas"
-
-#: views/lists/view.hbs:32
-msgid "Restart"
-msgstr "Reiniciar"
-
-#: views/mosaico/editor.hbs:1 views/partials/merge-tag-reference.hbs:1
-msgid "Merge tag reference"
-msgstr "Etiqueta referencia Merge"
-
-#: views/mosaico/editor.hbs:4
-msgid "MOSAICO Responsive Email Designer"
-msgstr "Diseñador de boletines responsive MOSAICO"
-
-#: views/mosaico/editor.hbs:5
-msgid "Sucessfully saved"
-msgstr "Guardado con éxito"
-
-#: views/mosaico/editor.hbs:6
-msgid "An error occured while saving the document"
-msgstr "Un error ocurrió mientras se guardaban los documentos"
-
-#: views/mosaico/editor.hbs:7
-msgid "Unsaved changes will be lost. Close now?"
-msgstr "Los cambios no guardados se perderán. ¿Cerrar ahora?"
-
-#: views/mosaico/editor.hbs:8 views/mosaico/editor.hbs:9
-msgid "Tags"
-msgstr "Etiquetas"
-
-#: views/partials/codeeditor.hbs:1 views/partials/grapejs.hbs:1
-#: views/partials/mosaico.hbs:1 views/partials/summernote.hbs:1
-msgid "Template content (HTML)"
-msgstr "Contenido de plantilla (HTML)"
-
-#: views/partials/editor-navbar.hbs:1
-msgid "SAVE"
-msgstr "GUARDAR"
-
-#: views/partials/editor-navbar.hbs:2
-msgid "SAVING"
-msgstr "GUARDANDO"
-
-#: views/partials/editor-navbar.hbs:3
-msgid "CLOSE"
-msgstr "CERRAR"
-
-#: views/partials/grapejs.hbs:2
-msgid "Open GrapeJS"
-msgstr "Abrir GrapeJS"
-
-#: views/partials/html-preview.hbs:1
-msgid "Toggle HTML preview"
-msgstr "Vista previa de Toggle HTML"
-
-#: views/partials/html-to-text.hbs:1
-msgid ""
-"To extract the text from HTML click here."
-msgstr ""
-"Para extraer el texto de HTML, haga clic aquí."
-
-#: views/partials/html-to-text.hbs:2
-msgid ""
-"Please note that your existing plaintext in the field above will be "
-"overwritten. This feature uses the Premailer API, a third party "
-"service. Their Terms of Service and Privacy Policy apply."
-msgstr ""
-"Por favor, tenga en cuenta que el texto plano del campo superior será "
-"sobreescrito. Esta función utiliza Premailer API, como servicio de "
-"terceros. Sus Condiciones de servicio y política de privacidad se aplican."
-
-#: views/partials/html-to-text.hbs:3
-msgid "An error occurred while talking to the server"
-msgstr "Ha ocurrido un error mientras se comunicaba con el servidor"
-
-#: views/partials/merge-tag-reference.hbs:2
-msgid ""
-"Merge tags are tags that are replaced before sending out the message. The "
-"format of the merge tag is the following: [TAG_NAME] or "
-"[TAG_NAME/fallback] where fallback is an optional "
-"text value used when TAG_NAME is empty."
-msgstr ""
-"Merge Tags son etiquetas que son remplazadas antes de enviar el boletín. El "
-"formato de las etiquetas Merge es el siguiente [TAG_NAME] o "
-"[TAG_NAME/fallback] donde fallback es el valor de "
-"un texto opcional usado cuando TAG_NAME está vacío."
-
-#: views/partials/modal-carousel.hbs:1
-msgid "{{title}}"
-msgstr "{{title}}"
-
-#: views/partials/mosaico.hbs:2
-msgid "Open Mosaico"
-msgstr "Abrir Mosaico"
-
-#: views/partials/plaintext.hbs:1
-msgid "Template content (plaintext)"
-msgstr "Contenido de la plantilla (texto plano)"
-
-#: views/report-templates/create.hbs:2 views/report-templates/edit.hbs:2
-#: views/report-templates/report-templates.hbs:2
-#: views/reports/create-select-template.hbs:2 views/reports/create.hbs:2
-#: views/reports/edit.hbs:2 views/reports/output.hbs:2
-#: views/reports/reports.hbs:2 views/reports/reports.hbs:5
-#: views/reports/view.hbs:2 lib/tools.js:144 routes/reports.js:31
-msgid "Reports"
-msgstr "Informes"
-
-#: views/report-templates/create.hbs:4 views/report-templates/create.hbs:6
-#: views/report-templates/report-templates.hbs:4 views/templates/create.hbs:3
-#: views/templates/create.hbs:4 views/templates/create.hbs:12
-#: views/templates/templates.hbs:3
-msgid "Create Template"
-msgstr "Crear plantilla"
-
-#: views/report-templates/create.hbs:5 routes/report-templates.js:231
-msgid "Create Report Template"
-msgstr "Crear informe de plantilla"
-
-#: views/report-templates/edit.hbs:4 views/templates/edit.hbs:3
-#: views/templates/edit.hbs:4
-msgid "Edit Template"
-msgstr "Editar plantilla"
-
-#: views/report-templates/edit.hbs:5 routes/report-templates.js:262
-msgid "Edit Report Template"
-msgstr "Editar informe de plantilla"
-
-#: views/report-templates/edit.hbs:6 views/templates/edit.hbs:11
-msgid "Delete Template"
-msgstr "Eliminar plantilla"
-
-#: views/report-templates/edit.hbs:7
-msgid "Update and Stay"
-msgstr "Actualizar y permanecer"
-
-#: views/report-templates/edit.hbs:8
-msgid "Update and Leave"
-msgstr "Actualizar y salir"
-
-#: views/report-templates/partials/report-template-fields.hbs:2
-msgid "Template Name"
-msgstr "Nombre de plantilla"
-
-#: views/report-templates/partials/report-template-fields.hbs:6
-msgid "User selectable fields"
-msgstr "Usar campos seleccionables"
-
-#: views/report-templates/partials/report-template-fields.hbs:7
-msgid "Data processing code"
-msgstr "Código de procesamiento de datos"
-
-#: views/report-templates/partials/report-template-fields.hbs:8
-msgid "Rendering template"
-msgstr "Plantilla de renderizado"
-
-#: views/report-templates/report-templates.hbs:5
-msgid "Blank"
-msgstr "Vacío/En blanco"
-
-#: views/report-templates/report-templates.hbs:6
-msgid "All Subscribers"
-msgstr "Todos los suscriptores"
-
-#: views/report-templates/report-templates.hbs:7
-msgid "Grouped Subscribers"
-msgstr "Suscriptores agrupados"
-
-#: views/report-templates/report-templates.hbs:8
-msgid "Export List as CSV"
-msgstr "Exportar lista como CSV"
-
-#: views/report-templates/report-templates.hbs:9 views/reports/reports.hbs:4
-#: routes/report-templates.js:29
-msgid "Report Templates"
-msgstr "Plantillas de informes"
-
-#: views/reports/create-select-template.hbs:3
-#: views/reports/create-select-template.hbs:4 views/reports/create.hbs:3
-#: views/reports/create.hbs:4 views/reports/create.hbs:5
-#: views/reports/reports.hbs:3 routes/reports.js:81
-msgid "Create Report"
-msgstr "Crear informe"
-
-#: views/reports/edit.hbs:3 views/reports/edit.hbs:4 routes/reports.js:151
-msgid "Edit Report"
-msgstr "Editar informe"
-
-#: views/reports/edit.hbs:5
-msgid "Delete Report"
-msgstr "Eliminar informe"
-
-#: views/reports/partials/report-fields.hbs:2
-msgid "Report Name"
-msgstr "Nombre de informe"
-
-#: views/reports/partials/report-fields.hbs:8
-#: views/reports/partials/report-fields.hbs:11
-msgid ""
-"Select a campaign in the table above by clicking on the respective row "
-"number."
-msgstr ""
-"Seleccionar una campaña en la tabla superior haciendo clic en el respectivo "
-"número de columna"
-
-#: views/reports/partials/report-select-template.hbs:1
-msgid "Report Template"
-msgstr "Plantilla informe"
-
-#: views/settings.hbs:5
-msgid "Service Address (URL)"
-msgstr "Dirección de servicio (URL)"
-
-#: views/settings.hbs:6
-msgid "Enter the URL this service can be reached from"
-msgstr "Introduzca la URL a la que puede acceder este servicio desde"
-
-#: views/settings.hbs:7
-msgid "Admin Email"
-msgstr "Email Admin"
-
-#: views/settings.hbs:8
-msgid ""
-"Enter the email address that will be used as \"from\" for system messages"
-msgstr ""
-"Introduce la dirección email que será usada como \"From\" para los envíos"
-
-#: views/settings.hbs:9
-msgid "Disable WYSIWYG editor"
-msgstr "Desactivar editor WYSIWYG"
-
-#: views/settings.hbs:10
-msgid "If checked then message editor displays HTML code without the preview"
-msgstr ""
-"Si está marcado, el editor de mensajes muestra el código HTML sin la vista "
-"previa"
-
-#: views/settings.hbs:11
-msgid "Disable subscription confirmation messages"
-msgstr "Desactivar los mensajes de confirmación de suscripción"
-
-#: views/settings.hbs:12
-msgid ""
-"If checked then do not send a confirmation message that states the "
-"subscriber is now subscribed or unsubscribed. This does not disable double "
-"opt-in messages."
-msgstr ""
-"Si está marcado, no envía mensaje de confirmación que indica que el abonado "
-"está suscrito o dado de baja. Esto no deshabilita dobles mensajes opt-in."
-
-#: views/settings.hbs:13
-msgid "Tracking ID"
-msgstr "ID restreo"
-
-#: views/settings.hbs:14
-msgid "Enter Google Analytics tracking code"
-msgstr "Introduzca un código de seguimiento de Google Analytics"
-
-#: views/settings.hbs:15
-msgid "Frontpage shout out"
-msgstr "Reconocimiento de portada"
-
-#: views/settings.hbs:16
-msgid "HTML code shown in the front page header section"
-msgstr "Código HTML es mostrado en la sección de encabezado de la portada"
-
-#: views/settings.hbs:17
-msgid "Campaign defaults"
-msgstr "Fallos en la campaña"
-
-#: views/settings.hbs:18
-msgid "Sender name"
-msgstr "Nombre de Remitente"
-
-#: views/settings.hbs:19
-msgid "Sender name, eg. My Awesome Company Ltd."
-msgstr "Nombre de Remitente, por ejemplo: Compañía Asombrosa SL."
-
-#: views/settings.hbs:20
-msgid "Default address"
-msgstr "Dirección por defecto"
-
-#: views/settings.hbs:21
-msgid ""
-"Contact address to provide, eg. 1234 Main Street, Anywhere, MA 01234, USA"
-msgstr ""
-"Dirección de contacto proporcionada, por ejemplo. Calle lugar cualquiera 1, "
-"Madrid, España"
-
-#: views/settings.hbs:22
-msgid "Default \"from name\""
-msgstr "Nombre \"From\" por defecto"
-
-#: views/settings.hbs:24
-msgid "Default \"from\" email"
-msgstr "Email \"From\" por defecto"
-
-#: views/settings.hbs:26
-msgid "Default \"subject line\""
-msgstr "\"Asunto\" por defecto"
-
-#: views/settings.hbs:28
-msgid "Default homepage (URL)"
-msgstr "Home por defecto (URL)"
-
-#: views/settings.hbs:29
-msgid "URL to redirect the subscribed users to, eg. http://example.com/"
-msgstr ""
-"URL para redireccionar a los usuarios suscritos, por ejemplo http://example."
-"com/"
-
-#: views/settings.hbs:30
-msgid "Mailer Settings"
-msgstr "Ajustes Remitente"
-
-#: views/settings.hbs:31
-msgid "These settings are required to send out e-mail messages"
-msgstr "Estos ajustes son requeridos para enviar boletines"
-
-#: views/settings.hbs:32
-msgid "SMTP"
-msgstr "SMTP"
-
-#: views/settings.hbs:33
-msgid "AWS SES"
-msgstr "AWS SES"
-
-#: views/settings.hbs:34
-msgid "Use SMTP for sending mail"
-msgstr "Utiliza SMTP para enviar boletines"
-
-#: views/settings.hbs:35
-msgid "Hostname"
-msgstr "Nombre Host"
-
-#: views/settings.hbs:36
-msgid "Port"
-msgstr "Puerto"
-
-#: views/settings.hbs:37
-msgid "Port, eg. 465. Autodetected if left blank"
-msgstr "Puerto, por ejemplo 465. Autodetecta si es vacio"
-
-#: views/settings.hbs:38
-msgid "Encryption"
-msgstr "Codificación"
-
-#: views/settings.hbs:39
-msgid "Disable SMTP authentication"
-msgstr "Desactivar la autenticación SMTP"
-
-#: views/settings.hbs:40 views/users/forgot.hbs:9 views/users/login.hbs:4
-#: views/users/login.hbs:5
-msgid "Username"
-msgstr "Nombre de usuario"
-
-#: views/settings.hbs:41
-msgid "Username, eg. myaccount@example.com"
-msgstr "Nombre de usuario, por ejemplo. nombre@ejemplo.com"
-
-#: views/settings.hbs:42 views/settings.hbs:43 views/users/login.hbs:6
-#: views/users/login.hbs:7
-msgid "Password"
-msgstr "Contraseña"
-
-#: views/settings.hbs:44
-msgid "Use SES API for sending mail"
-msgstr "Utilizar la API de SES para enviar correo"
-
-#: views/settings.hbs:45
-msgid "Access Key"
-msgstr "Clave de acceso"
-
-#: views/settings.hbs:46
-msgid "AWS Access Key Id"
-msgstr "ID Clave de acceso AWS"
-
-#: views/settings.hbs:47
-msgid "Secret Key"
-msgstr "Clave secreta"
-
-#: views/settings.hbs:48
-msgid "AWS Secret Access Key"
-msgstr "Clave de acceso secreta AWS"
-
-#: views/settings.hbs:49
-msgid "Region"
-msgstr "Región"
-
-#: views/settings.hbs:50
-msgid "Checking"
-msgstr "Comprobación"
-
-#: views/settings.hbs:51
-msgid "Check Mailer config"
-msgstr "Compruebe configuración de Remitente"
-
-#: views/settings.hbs:52
-msgid "Don't have an SMTP account yet? Create a free SendPulse account"
-msgstr ""
-"¿No tienes una cuenta SMTP todavía? Crear una cuenta gratuita en SendPulse"
-
-#: views/settings.hbs:53
-msgid "here"
-msgstr "aquí"
-
-#: views/settings.hbs:54
-msgid "Advanced Mailer settings"
-msgstr "Ajustes avanzados de Remitente"
-
-#: views/settings.hbs:55
-msgid "Log SMTP transactions"
-msgstr "Registrar transacciones SMTP"
-
-#: views/settings.hbs:56
-msgid "Allow self-signed certificates"
-msgstr "Permitir certificados con firma propia"
-
-#: views/settings.hbs:57
-msgid "Max connections"
-msgstr "Número máximo de conexiones"
-
-#: views/settings.hbs:58
-msgid "The count of max connections, eg. 10"
-msgstr "Recuento de conexiones máximo, por ejemplo. 10"
-
-#: views/settings.hbs:59
-msgid ""
-"The count of maximum simultaneous connections to make against the SMTP "
-"server (defaults to 5). This limit is per sending process."
-msgstr ""
-"Recuento del número máximo de conexiones simultáneas para hacer frente al "
-"servidor SMTP (por defecto 5). Este límite es por proceso de envío."
-
-#: views/settings.hbs:60
-msgid "Max messages"
-msgstr "Número máximo de mensajes"
-
-#: views/settings.hbs:61
-msgid "The count of max messages, eg. 100"
-msgstr "El recuento de mensajes máximo, por ejemplo. 100"
-
-#: views/settings.hbs:62
-msgid ""
-"The number of messages to send through a single connection before the "
-"connection is closed and reopened (defaults to 100)"
-msgstr ""
-"El número de mensajes a enviar a través de una única conexión antes de la "
-"conexión se cierra y se vuelve a abrir (por defecto 100)"
-
-#: views/settings.hbs:63
-msgid "Throttling"
-msgstr "Regulador "
-
-#: views/settings.hbs:64
-msgid "Messages per hour eg. 1000"
-msgstr "Mensajes por hora, por ejemplo 1000"
-
-#: views/settings.hbs:65
-msgid ""
-"Maximum number of messages to send in an hour. Leave empty or zero for no "
-"throttling. If your provider uses a different speed limit (messages/minute "
-"or messages/second) then convert this limit into messages/hour (1m/s => "
-"3600m/h). This limit is per sending process."
-msgstr ""
-"Número máximo de mensajes que se envían en una hora. Dejar en blanco o nulo "
-"sin regulación. Si su proveedor utiliza un límite de velocidad diferente "
-"(mensajes / minuto o mensajes / segundo) a continuación, convertir este "
-"límite en mensajes/hora (1m/s => 3600m/h). Este límite es por proceso de "
-"envío."
-
-#: views/settings.hbs:66
-msgid "VERP bounce handling"
-msgstr "Manejo de rebote VERP"
-
-#: views/settings.hbs:67
-msgid ""
-"Mailtrain is able to use VERP based routing to detect bounces. In this case "
-"the message is sent to the recipient using a custom VERP address as the "
-"return path of the message. If the message is not accepted a bounce email is "
-"sent to this special VERP address and thus a bounce is detected."
-msgstr ""
-"Mailtrain es capaz de utilizar el enrutamiento basado VERP para detectar "
-"rebotes. En este caso el mensaje se envía al destinatario mediante una "
-"dirección VERP personalizada como la vía de retorno del mensaje. Si el "
-"mensaje no se acepta un correo electrónico de rebote es enviado a esta "
-"dirección especial VERP y por lo tanto se detecta un rebote."
-
-#: views/settings.hbs:68
-msgid ""
-"To get VERP working you need to set up a DNS MX record that points to your "
-"Mailtrain hostname. You must also ensure that Mailtrain VERP interface is "
-"available from port 25 of your server (port 25 usually requires root user "
-"privileges). This way if anyone tries to send email to someuser@verp-"
-"hostname then the email should end up to this server."
-msgstr ""
-"ePara obtener el trabajo de VERP, necesitas crear un registro DNS MX que "
-"apunta a su nombre de host Mailtrain. También debe asegurarse de que la "
-"interfaz Mailtrain VERP está disponible desde el puerto 25 del servidor "
-"(puerto 25 por lo general requiere privilegios de usuario root). De esta "
-"manera si alguien trata de enviar un correo electrónico a someuser@verp-"
-"hostname, el correo electrónico debe terminar en este servidor."
-
-#: views/settings.hbs:69
-msgid ""
-"VERP usually only works if you are using your own SMTP server. Regular relay "
-"services (SES, SparkPost, Gmail etc.) tend to remove the VERP address from "
-"the message."
-msgstr ""
-"Por lo general VERP sólo funciona si está utilizando su propio servidor "
-"SMTP. Servicios de transmisión regulares (SES, SparkPost, Gmail, etc.) "
-"tienden a eliminar la dirección VERP del mensaje."
-
-#: views/settings.hbs:70
-msgid "Use VERP to catch bounces"
-msgstr "Utilice VERP para rebotes"
-
-#: views/settings.hbs:71
-msgid "Server hostname"
-msgstr "Nombre de Host del servidor"
-
-#: views/settings.hbs:72
-msgid "The VERP server hostname, eg. bounces.example.com"
-msgstr "El nombre de host del servidor VERP, por ejemplo. bounces.ejemplo.com"
-
-#: views/settings.hbs:73
-msgid ""
-"VERP bounce handling server hostname. This hostname is used in the SMTP "
-"envelope FROM address and the MX DNS records should point to this server"
-msgstr ""
-"Nombre de Servidor Host que maneja rebotes VERP. Este nombre de host se "
-"utiliza en el FROM del sobre SMTP y los registros DNS MX deben señalar a "
-"este servidor"
-
-#: views/settings.hbs:74
-msgid ""
-"VERP bounce handling server is not enabled. Modify your server configuration "
-"file and restart server to enable it"
-msgstr ""
-"Servidor Host VERP que maneja rebotes no esta activado. Modifica el archivo "
-"de configuración de tu servidor y reinicia el servidor para activarlo."
-
-#: views/settings.hbs:75
-msgid "GPG Signing"
-msgstr "Firma GPG"
-
-#: views/settings.hbs:76
-msgid ""
-"Only messages that are encrypted can be signed. Subsribers who have not set "
-"up a GPG public key in their profile receive normal email messages. Users "
-"with GPG key set receive encrypted messages and if you have signing key also "
-"set, the messages are signed with this key."
-msgstr ""
-"Sólo los mensajes cifrados pueden ser firmados. Los suscriptores que no han "
-"establecido una clave pública GPG en su perfil de recibirán mensajes de "
-"correo electrónico normales. Los usuarios con claves GPG establecidad, "
-"recibirán mensajes cifrados y si tiene clave de firma también establecida, "
-"los mensajes estarán firmados con esa clave."
-
-#: views/settings.hbs:77
-msgid ""
-"Do not use sensitive keys here. The private key and passphrase are not "
-"encrypted in the database."
-msgstr ""
-"No utilice las teclas susceptibles aquí. La clave privada y la frase de "
-"contraseña no están cifrados en la base de datos."
-
-#: views/settings.hbs:78
-msgid "Private Key Passphrase"
-msgstr "Frase clave privada"
-
-#: views/settings.hbs:79
-msgid "Passphrase for the key if set"
-msgstr "Frase de contraseña para la clave si se establece"
-
-#: views/settings.hbs:80
-msgid "Only fill this if your private key is encrypted with a passphrase"
-msgstr ""
-"Sólo rellene esto si su clave privada se cifra con una frase de contraseña"
-
-#: views/settings.hbs:81
-msgid "GPG Private Key"
-msgstr "Clave privada GPG"
-
-#: views/settings.hbs:83
-msgid ""
-"This value is optional. If you do not provide a private key GPG encrypted "
-"messages are sent without signing."
-msgstr ""
-"Este valor es opcional. Si usted no proporciona una clave privada GPG los "
-"mensajes cifrados se envían sin firma."
-
-#: views/settings.hbs:84
-msgid "DKIM Signing by ZoneMTA"
-msgstr "Firma DKIM por ZoneMTA"
-
-#: views/settings.hbs:85
-msgid ""
-"If you are using ZoneMTA then Mailtrain can provide a DKIM key for signing "
-"all outgoing messages. Other services usually provide their own means to "
-"DKIM sign your messages"
-msgstr ""
-"Si está utilizando ZoneMTA, Mailtrain puede proporcionar una clave DKIM para "
-"la firma de todos los mensajes salientes. Otros servicios suelen "
-"proporcionar sus propios medios para firmar sus mensajes DKIM"
-
-#: views/settings.hbs:86
-msgid ""
-"Do not use sensitive keys here. The private key is not encrypted in the "
-"database."
-msgstr ""
-"No utilice las teclas susceptibles aquí. La clave privada no está cifrada en "
-"la base de datos."
-
-#: views/settings.hbs:87
-msgid "ZoneMTA DKIM API Key"
-msgstr "CLAVE de API DKIM ZoneMTA"
-
-#: views/settings.hbs:88
-msgid "Some secret value"
-msgstr "Algunos valores secretos"
-
-#: views/settings.hbs:89
-msgid ""
-"Secret value known to ZoneMTA for requesting DKIM key information. If this "
-"value was generated by the Mailtrain installation script then you can keep "
-"it as it is"
-msgstr ""
-"Valor secreto conocido a ZoneMTA para solicitar información clave DKIM. Si "
-"este valor se genera mediante el script de instalación Mailtrain entonces se "
-"puede mantener como está"
-
-#: views/settings.hbs:90
-msgid "DKIM domain"
-msgstr "dominio DKIM"
-
-#: views/settings.hbs:91
-msgid "Domain name for the DKIM key"
-msgstr "nombre de dominio para la clave DKIM"
-
-#: views/settings.hbs:92
-msgid "Leave blank to use the sender email address domain"
-msgstr ""
-"Dejar en blanco para usar el dominio de dirección de correo electrónico del "
-"remitente"
-
-#: views/settings.hbs:93 views/settings.hbs:94
-msgid "DKIM key selector"
-msgstr "Selector Clave de DKIM"
-
-#: views/settings.hbs:95
-msgid "Signing is disabled without a valid selector value"
-msgstr "Firma está desactivada y sin un valor de selección válido"
-
-#: views/settings.hbs:96
-msgid "DKIM Private Key"
-msgstr "Clave privada DKIM"
-
-#: views/settings.hbs:98
-msgid ""
-"This value is optional. If you do not provide a private key then messages "
-"are not signed."
-msgstr ""
-"Este valor es opcional. Si usted no proporciona una clave privada a "
-"continuación, los mensajes no se firman."
-
-#: views/subscription/mail-already-subscribed-html.mjml.hbs:1
-#: views/subscription/mail-already-subscribed-text.hbs:1
-#: lib/models/subscriptions.js:171 lib/models/subscriptions.js:892
-msgid "Email address already registered"
-msgstr "Dirección de correo ya registrada"
-
-#: views/subscription/mail-already-subscribed-html.mjml.hbs:2
-#: views/subscription/mail-already-subscribed-text.hbs:2
-msgid ""
-"We have received a subscription request. Your email address is however "
-"already registered."
-msgstr ""
-"Hemos recibido una solicitud de suscripción. Su dirección de correo "
-"electrónico está sin embargo ya registrada."
-
-#: views/subscription/mail-already-subscribed-html.mjml.hbs:3
-#: views/subscription/mail-already-subscribed-text.hbs:3
-msgid ""
-"If you received this email by mistake, simply delete it. Your existing "
-"subscription won't be affected."
-msgstr ""
-"Si ha recibido este mensaje por error, simplemente elimínalo. Su "
-"subscripción no se verá afectada."
-
-#: views/subscription/mail-already-subscribed-html.mjml.hbs:4
-#: views/subscription/mail-subscription-confirmed-html.mjml.hbs:3
-msgid "If you want to modify your subscription then you can "
-msgstr "Si desea modificar su suscripción, puedes"
-
-#: views/subscription/mail-already-subscribed-html.mjml.hbs:5
-#: views/subscription/mail-already-subscribed-text.hbs:5
-#: views/subscription/mail-subscription-confirmed-html.mjml.hbs:4
-#: views/subscription/mail-subscription-confirmed-text.hbs:4
-msgid "manage your preferences"
-msgstr "administrar tus preferencias"
-
-#: views/subscription/mail-already-subscribed-html.mjml.hbs:6
-#: views/subscription/mail-already-subscribed-text.hbs:6
-#: views/subscription/mail-subscription-confirmed-html.mjml.hbs:5
-#: views/subscription/mail-subscription-confirmed-text.hbs:5
-#: views/users/login.hbs:10
-msgid "or"
-msgstr "o"
-
-#: views/subscription/mail-already-subscribed-html.mjml.hbs:7
-#: views/subscription/mail-already-subscribed-text.hbs:7
-#: views/subscription/mail-subscription-confirmed-html.mjml.hbs:6
-#: views/subscription/mail-subscription-confirmed-text.hbs:6
-msgid "unsubscribe here"
-msgstr "darte de baja aquí"
-
-#: views/subscription/mail-already-subscribed-html.mjml.hbs:8
-#: views/subscription/mail-subscription-confirmed-html.mjml.hbs:7
-#: views/subscription/web-confirm-subscription-notice.mjml.hbs:3
-#: views/subscription/web-confirm-unsubscription-notice.mjml.hbs:3
-#: views/subscription/web-manual-unsubscribe-notice.mjml.hbs:4
-#: views/subscription/web-subscribed-notice.mjml.hbs:4
-#: views/subscription/web-unsubscribed-notice.mjml.hbs:3
-#: views/subscription/web-updated-notice.mjml.hbs:3
-msgid "Return to our website"
-msgstr "Vuelvea nuestra web"
-
-#: views/subscription/mail-already-subscribed-html.mjml.hbs:9
-#: views/subscription/mail-already-subscribed-text.hbs:8
-#: views/subscription/mail-confirm-address-change-html.mjml.hbs:4
-#: views/subscription/mail-confirm-address-change-text.hbs:4
-#: views/subscription/mail-confirm-subscription-html.mjml.hbs:4
-#: views/subscription/mail-confirm-subscription-text.hbs:4
-#: views/subscription/mail-confirm-unsubscription-html.mjml.hbs:4
-#: views/subscription/mail-confirm-unsubscription-text.hbs:4
-#: views/subscription/mail-subscription-confirmed-html.mjml.hbs:8
-#: views/subscription/mail-subscription-confirmed-text.hbs:7
-#: views/subscription/mail-unsubscription-confirmed-html.mjml.hbs:5
-#: views/subscription/mail-unsubscription-confirmed-text.hbs:5
-msgid "For questions about this list, please contact:"
-msgstr ""
-"Para preguntas acerca de esta lista, por favor, póngase en contacto con "
-"nosotros en:"
-
-#: views/subscription/mail-already-subscribed-text.hbs:4
-#: views/subscription/mail-subscription-confirmed-text.hbs:3
-msgid "If you want to modify your subscription then you can:"
-msgstr "Si desea modificar su suscripción a continuación, puedes:"
-
-#: views/subscription/mail-confirm-address-change-html.mjml.hbs:1
-#: views/subscription/mail-confirm-address-change-text.hbs:1
-msgid "Please Confirm Subscription Address Change"
-msgstr "Por favor, confirma el campo de Dirección de correo de Suscripción"
-
-#: views/subscription/mail-confirm-address-change-html.mjml.hbs:2
-#: views/subscription/mail-confirm-address-change-text.hbs:2
-msgid "Yes, subscribe this email address to the list"
-msgstr "Sí, suscribir esta dirección de correo electrónico a la lista"
-
-#: views/subscription/mail-confirm-address-change-html.mjml.hbs:3
-#: views/subscription/mail-confirm-subscription-html.mjml.hbs:3
-msgid ""
-"If you received this email by mistake, simply delete it. You won't be "
-"subscribed if you don't click the confirmation link above."
-msgstr ""
-"Si ha recibido este mensaje por error, simplemente elimínalo. No será "
-"suscrito si no hace clic en el enlace de confirmación anterior."
-
-#: views/subscription/mail-confirm-address-change-text.hbs:3
-#: views/subscription/mail-confirm-subscription-text.hbs:3
-msgid ""
-"If you received this email by mistake, simply delete it. You won't be "
-"subscribed unless you click the confirmation link above."
-msgstr ""
-"Si ha recibido este mensaje por error, simplemente elimínalo. No va a estar "
-"suscrito a menos que haga clic en el enlace de confirmación anterior."
-
-#: views/subscription/mail-confirm-subscription-html.mjml.hbs:1
-#: views/subscription/mail-confirm-subscription-text.hbs:1
-#: views/subscription/mail-confirm-unsubscription-text.hbs:1
-#: routes/subscription.js:431
-msgid "Please Confirm Subscription"
-msgstr "Por favor, confirme la suscripción"
-
-#: views/subscription/mail-confirm-subscription-html.mjml.hbs:2
-#: views/subscription/mail-confirm-subscription-text.hbs:2
-msgid "Yes, subscribe me to this list"
-msgstr "Sí, suscribirme a la lista"
-
-#: views/subscription/mail-confirm-unsubscription-html.mjml.hbs:1
-msgid "Please Confirm Unsubscription"
-msgstr "Por favor, confirma la baja"
-
-#: views/subscription/mail-confirm-unsubscription-html.mjml.hbs:2
-#: views/subscription/mail-confirm-unsubscription-text.hbs:2
-msgid "Yes, unsubscribe me from this list"
-msgstr "Sí, darme de baja de esta lista"
-
-#: views/subscription/mail-confirm-unsubscription-html.mjml.hbs:3
-msgid ""
-"If you received this email by mistake, simply delete it. You won't be "
-"unsubscribed if you don't click the confirmation link above."
-msgstr ""
-"Si ha recibido este mensaje por error, simplemente elimínalo. No será dado "
-"de baja si no hace clic en el enlace de confirmación anterior."
-
-#: views/subscription/mail-confirm-unsubscription-text.hbs:3
-msgid ""
-"If you received this email by mistake, simply delete it. You won't be "
-"unsubscribed unless you click the confirmation link above."
-msgstr ""
-"Si ha recibido este mensaje por error, simplemente elimínalo. No será dado "
-"de baja a menos de hacer clic en el enlace de confirmación anterior."
-
-#: views/subscription/mail-subscription-confirmed-html.mjml.hbs:1
-#: views/subscription/mail-subscription-confirmed-text.hbs:1
-#: views/subscription/web-subscribed-notice.mjml.hbs:1
-msgid "Subscription Confirmed"
-msgstr "Suscripción confirmada"
-
-#: views/subscription/mail-subscription-confirmed-html.mjml.hbs:2
-msgid "Your subscription to our list has been confirmed"
-msgstr "Su suscripción a nuestra lista ha sido confirmada"
-
-#: views/subscription/mail-subscription-confirmed-text.hbs:2
-#: views/subscription/web-subscribed-notice.mjml.hbs:2
-msgid "Your subscription to our list has been confirmed."
-msgstr "Su suscripción a nuestra lista ha sido confirmada."
-
-#: views/subscription/mail-unsubscription-confirmed-html.mjml.hbs:1
-#: views/subscription/mail-unsubscription-confirmed-text.hbs:1
-msgid "You Are Now Unsubscribed"
-msgstr "Tu estás dado de baja ahora"
-
-#: views/subscription/mail-unsubscription-confirmed-html.mjml.hbs:2
-msgid "We have removed your email address from our list"
-msgstr "Hemos eliminado su correo electrónico de nuestra lista"
-
-#: views/subscription/mail-unsubscription-confirmed-html.mjml.hbs:3
-#: views/subscription/mail-unsubscription-confirmed-text.hbs:3
-msgid "If you unsubscribed by mistake, you can re-subscribe at:"
-msgstr "Si te has dado de baja por error, puedes volverte a suscribir en:"
-
-#: views/subscription/mail-unsubscription-confirmed-text.hbs:2
-msgid "We have removed your email address from our list."
-msgstr "Hemos eliminado su correo electrónico de nuestra lista."
-
-#: views/subscription/partials/subscription-custom-fields.hbs:2
-msgid "want to change it?"
-msgstr "quieres cambiarla?"
-
-#: views/subscription/partials/subscription-custom-fields.hbs:5
-msgid "Download signature verification key"
-msgstr "Descargar clave de verificación de firma"
-
-#: views/subscription/partials/subscription-custom-fields.hbs:7
-msgid ""
-"Insert your GPG public key here to encrypt messages sent to your address"
-msgstr ""
-"Inserta tu clave GPG pública aquí para encriptar mensajes enviados a tu "
-"dirección"
-
-#: views/subscription/partials/subscription-custom-fields.hbs:8
-msgid "optional"
-msgstr "opcional"
-
-#: views/subscription/partials/subscription-flash-messages.hbs:1
-#: views/subscription/partials/subscription-flash-messages.hbs:3
-msgid "Warning!"
-msgstr "¡Advertencia!"
-
-#: views/subscription/partials/subscription-flash-messages.hbs:2
-msgid "If JavaScript was not enabled then no confirmation message was sent"
-msgstr ""
-"Si JavaScript no está activada, no se envia ningún mensaje de confirmación"
-
-#: views/subscription/partials/subscription-flash-messages.hbs:4
-msgid "JavaScript must be enabled in order for this form to work"
-msgstr "JavaScript debe estar habilitado para esta forma de funcionamiento"
-
-#: views/subscription/partials/subscription-manage-address-form.hbs:1
-msgid "Existing Email Address"
-msgstr "Correo electrónico existente"
-
-#: views/subscription/partials/subscription-manage-address-form.hbs:2
-msgid "New Email Address"
-msgstr "Nuevo Correo electrónico"
-
-#: views/subscription/partials/subscription-manage-address-form.hbs:3
-msgid "Your new email address"
-msgstr "Tu nuevo correo electrónico"
-
-#: views/subscription/partials/subscription-manage-address-form.hbs:4
-msgid ""
-"You will receive a confirmation request to your new email address that you "
-"need to accept before your email is actually changed"
-msgstr ""
-"Recibirás un email a tu nuevo correo electrónico con una solicitud de "
-"confirmación. Tras aceptarla el correo será cambiado definitivamente."
-
-#: views/subscription/partials/subscription-manage-address-form.hbs:5
-#: views/subscription/web-manage-address.mjml.hbs:2
-msgid "Update Email Address"
-msgstr "Actualizar el correo electrónico"
-
-#: views/subscription/partials/subscription-manage-form.hbs:1
-#: views/subscription/web-manage.mjml.hbs:2
-msgid "Update Profile"
-msgstr "Actualizar perfil"
-
-#: views/subscription/partials/subscription-subscribe-form.hbs:1
-#: views/subscription/web-subscribe.mjml.hbs:2
-#: views/subscription/widget-subscribe.hbs:1
-msgid "Subscribe to list"
-msgstr "Suscrito a la lista"
-
-#: views/subscription/web-confirm-subscription-notice.mjml.hbs:1
-#: views/subscription/web-confirm-unsubscription-notice.mjml.hbs:1
-#: views/subscription/widget-subscribe.hbs:4
-msgid "Almost Finished"
-msgstr "Casi terminado"
-
-#: views/subscription/web-confirm-subscription-notice.mjml.hbs:2
-#: views/subscription/widget-subscribe.hbs:5
-msgid ""
-"We need to confirm your email address. To complete the subscription process, "
-"please click the link in the email we just sent you."
-msgstr ""
-"Necesitamos confirmar tu dirección de correo electrónico. Para completar el "
-"proceso de suscripción, por favor haz clic en el enlace del correo "
-"electrónico que acabamos de enviarte."
-
-#: views/subscription/web-confirm-unsubscription-notice.mjml.hbs:2
-msgid ""
-"We need to confirm your email address. To complete the unsubscription "
-"process, please click the link in the email we just sent you."
-msgstr ""
-"Necesitamos confirmar tu dirección de correo electrónico. Para completar el "
-"proceso de darse de baja, por favor haga clic en el enlace del correo "
-"electrónico que acabamos de enviarte."
-
-#: views/subscription/web-manage-address.mjml.hbs:1
-msgid "Update Your Email Address"
-msgstr "Actualizar su correo electrónico"
-
-#: views/subscription/web-manage.mjml.hbs:1
-msgid "Update Your Preferences"
-msgstr "Actualizar sus preferencias"
-
-#: views/subscription/web-manual-unsubscribe-notice.mjml.hbs:1
-msgid "Online Unsubscription Is Not Possible"
-msgstr "Darse de baja online no es posible"
-
-#: views/subscription/web-manual-unsubscribe-notice.mjml.hbs:2
-msgid "Please contact us at"
-msgstr "Por favor, contácta con nosotros en"
-
-#: views/subscription/web-manual-unsubscribe-notice.mjml.hbs:3
-msgid "to get removed from the list"
-msgstr "ser eliminado de la lista"
-
-#: views/subscription/web-subscribe.mjml.hbs:1
-msgid "Subscribe to List"
-msgstr "Suscribirse a la lista"
-
-#: views/subscription/web-subscribed-notice.mjml.hbs:3
-msgid "Thank you for subscribing!"
-msgstr "¡Gracias por suscribirte!"
-
-#: views/subscription/web-unsubscribed-notice.mjml.hbs:1
-msgid "Unsubscribe Successful"
-msgstr "Dado de baja con éxito"
-
-#: views/subscription/web-unsubscribed-notice.mjml.hbs:2
-msgid "You have been removed from:"
-msgstr "Has sido eliminado de:"
-
-#: views/subscription/web-updated-notice.mjml.hbs:1
-msgid "Profile Updated"
-msgstr "Perfeil actualizado"
-
-#: views/subscription/web-updated-notice.mjml.hbs:2
-msgid "Your profile information has been updated."
-msgstr "La información de tu perfil ha sido actualizada"
-
-#: views/subscription/widget-subscribe.hbs:2
-msgid "Sending ..."
-msgstr "Enviando"
-
-#: views/subscription/widget-subscribe.hbs:3
-msgid "It looks like you are already subscribed to this list."
-msgstr "Parece que tu ya estabas suscrito a esta lista"
-
-#: views/templates/create.hbs:5 views/templates/edit.hbs:6
-msgid "Template name"
-msgstr "Nombre de plantilla"
-
-#: views/templates/create.hbs:6 views/templates/edit.hbs:7
-msgid "Name for this template, eg. Newsletter"
-msgstr "Nombre de esta plantilla, por ejemplo Newsletter"
-
-#: views/templates/create.hbs:7
-msgid "HTML Editor"
-msgstr "Editor HTML"
-
-#: views/templates/create.hbs:10 views/templates/edit.hbs:9
-msgid "Optional comments about this template"
-msgstr "Comentario opcional sobre esta plantilla"
-
-#: views/templates/edit.hbs:5
-msgid "Back to templates"
-msgstr "Volver a plantillas"
-
-#: views/triggers/create-select.hbs:2 views/triggers/create.hbs:2
-#: views/triggers/edit.hbs:2 views/triggers/triggered.hbs:2
-#: views/triggers/triggers.hbs:2 views/triggers/triggers.hbs:4
-msgid "Automation Triggers"
-msgstr "Automatización Trigger "
-
-#: views/triggers/create-select.hbs:5
-msgid "Select a list for the trigger"
-msgstr "Seleccionar una lista para el Trigger"
-
-#: views/triggers/create.hbs:5 views/triggers/edit.hbs:6
-msgid "Trigger name"
-msgstr "Nombre de Trigger"
-
-#: views/triggers/create.hbs:6 views/triggers/edit.hbs:7
-msgid "Name for this trigger, eg. Inactive subscribers"
-msgstr "Nombre para este Trigger, por ejemplo: Suscritores inactivos"
-
-#: views/triggers/create.hbs:8 views/triggers/edit.hbs:9
-msgid "Optional comments about this trigger"
-msgstr "Comentarios opcionales sobre el Trigger"
-
-#: views/triggers/create.hbs:12 views/triggers/edit.hbs:14
-msgid "Trigger rule"
-msgstr "Regla Trigger"
-
-#: views/triggers/create.hbs:13 views/triggers/edit.hbs:15
-msgid "Trigger fires"
-msgstr "Trigger encendido"
-
-#: views/triggers/create.hbs:14 views/triggers/edit.hbs:16
-msgid "days after:"
-msgstr "días después:"
-
-#: views/triggers/create.hbs:16 views/triggers/create.hbs:21
-#: views/triggers/edit.hbs:18 views/triggers/edit.hbs:23
-msgid "Event"
-msgstr "Evento"
-
-#: views/triggers/create.hbs:18 views/triggers/create.hbs:19
-#: views/triggers/create.hbs:25 views/triggers/edit.hbs:20
-#: views/triggers/edit.hbs:21 views/triggers/edit.hbs:27
-msgid "Campaign"
-msgstr "Campaña"
-
-#: views/triggers/create.hbs:23 views/triggers/edit.hbs:25
-msgid "Trigger action"
-msgstr "Acción Trigger"
-
-#: views/triggers/create.hbs:24 views/triggers/edit.hbs:26
-msgid "Send campaign"
-msgstr "Enviar campaña"
-
-#: views/triggers/edit.hbs:3 views/triggers/edit.hbs:4
-msgid "Edit Trigger"
-msgstr "Edit Trigger"
-
-#: views/triggers/edit.hbs:5
-msgid "Back to triggers"
-msgstr "Volver a Triggers"
-
-#: views/triggers/edit.hbs:11
-msgid "Trigger is enabled"
-msgstr "Trigger está activado"
-
-#: views/triggers/edit.hbs:29
-msgid "Delete Trigger"
-msgstr "Eliminar Trigger"
-
-#: views/triggers/triggered.hbs:3
-msgid "Triggered"
-msgstr "Encadenados (Triggered)"
-
-#: views/triggers/triggered.hbs:4
-msgid "Triggered subscribers"
-msgstr "Suscriptores Encadenados (Triggered)"
-
-#: views/triggers/triggered.hbs:5
-msgid "Subscribers who caused this trigger to fire"
-msgstr "Suscriptores que han provocado que este Trigger se encienda"
-
-#: views/triggers/triggered.hbs:9
-msgid "Triggered time"
-msgstr "Hora de Trigger"
-
-#: views/triggers/triggers.hbs:9
-msgid "Trigger"
-msgstr "Trigger"
-
-#: views/triggers/triggers.hbs:10
-msgid "Target Campaign"
-msgstr "Camapaña Objetivo"
-
-#: views/triggers/triggers.hbs:11
-msgid "Triggered count"
-msgstr "Cuenta Trigger"
-
-#: views/users/account.hbs:4
-msgid "This account is managed through LDAP."
-msgstr "Esta cuenta esta gestionada mediante LDAP."
-
-#: views/users/account.hbs:5
-msgid "Associated Email Address"
-msgstr "Dirección mail asociada"
-
-#: views/users/account.hbs:8
-msgid "Your e-mail address"
-msgstr "Tu dirección email"
-
-#: views/users/account.hbs:9
-msgid ""
-"This address is used for account recovery in case you lose your password"
-msgstr ""
-"Este email es usado para recuperar una cuenta en caso de que no recuerdes la "
-"contraseña"
-
-#: views/users/account.hbs:10
-msgid "Password change"
-msgstr "Cambio de contraseña"
-
-#: views/users/account.hbs:11
-msgid ""
-"You only need to fill out this form if you want to change your current "
-"password"
-msgstr ""
-"Tu sólo necesitas completar este formulario si quieres cambiar la contraseña "
-"actual"
-
-#: views/users/account.hbs:12 views/users/account.hbs:13
-msgid "Current Password"
-msgstr "Contraseña actual"
-
-#: views/users/account.hbs:14 views/users/account.hbs:15
-#: views/users/reset.hbs:6 views/users/reset.hbs:7
-msgid "New Password"
-msgstr "Nueva contraseña"
-
-#: views/users/account.hbs:16 views/users/reset.hbs:8
-msgid "Confirm Password"
-msgstr "Confirmar contraseña"
-
-#: views/users/account.hbs:17 views/users/reset.hbs:9
-msgid "Confirm New Password"
-msgstr "Confirmar nueva contraseña"
-
-#: views/users/api.hbs:4
-msgid "Are you sure? Resetting would invalidate the currently existing token."
-msgstr ""
-"¿Estás seguro? El reinicio invalidará el token existente en este momento."
-
-#: views/users/api.hbs:5
-msgid "Are you sure?"
-msgstr "¿Estás seguro?"
-
-#: views/users/api.hbs:6
-msgid "Reset Access Token"
-msgstr "Restablecer token de Acceso"
-
-#: views/users/api.hbs:7
-msgid "Generate Access Token"
-msgstr "Token de Acceso generado"
-
-#: views/users/api.hbs:8
-msgid "Personal access token:"
-msgstr "Token de acceso personal:"
-
-#: views/users/api.hbs:9
-msgid "Access token not yet generated"
-msgstr "Token de Acceso no generado aún"
-
-#: views/users/api.hbs:10
-msgid "Notes about the API"
-msgstr "Notas sobre la API"
-
-#: views/users/api.hbs:11
-msgid ""
-"API response is a JSON structure with error and data"
-"code> properties. If the response error has a value set then "
-"the request failed."
-msgstr ""
-"Respuesta API es una estructura JSON con error y data"
-"code> propiedades. Si la respuesta error tiene un valor "
-"establecido la petición ha fallado."
-
-#: views/users/api.hbs:12
-msgid ""
-"You need to define proper Content-Type when making a request. "
-"You can either use application/x-www-form-urlencoded for normal "
-"form data or application/json for a JSON payload. Using "
-"multipart/form-data is not supported."
-msgstr ""
-"Necesitas definir correctamente Content-Type cuando se hace una "
-"petición. Tu puedes usar application/x-www-form-urlencoded para "
-"formulario de datos normal o application/json para carga JSON. "
-"El uso de multipart/form-data no es soportado."
-
-#: views/users/api.hbs:13
-msgid "Add subscription"
-msgstr "Añadir suscriptción"
-
-#: views/users/api.hbs:14
-msgid ""
-"This API call either inserts a new subscription or updates existing. Fields "
-"not included are left as is, so if you update only LAST_NAME value, then "
-"FIRST_NAME is kept untouched for an existing subscription."
-msgstr ""
-"Esta API llama a insertar un nuevo suscriptor o actualizar existente. Campos "
-"no incluidos no se modifican, pero si quieres actualizar solo el valor de "
-"LAST_NAME, FIRST_NAME no se modifica para suscripciones existentes."
-
-#: views/users/api.hbs:15 views/users/api.hbs:17 views/users/api.hbs:30
-#: views/users/api.hbs:32 views/users/api.hbs:38 views/users/api.hbs:40
-#: views/users/api.hbs:46 views/users/api.hbs:57 views/users/api.hbs:59
-#: views/users/api.hbs:65 views/users/api.hbs:67
-msgid "arguments"
-msgstr "razón/argumento"
-
-#: views/users/api.hbs:16 views/users/api.hbs:31 views/users/api.hbs:39
-#: views/users/api.hbs:47 views/users/api.hbs:58 views/users/api.hbs:66
-msgid "your personal access token"
-msgstr "tu token personal de acceso"
-
-#: views/users/api.hbs:18 views/users/api.hbs:33 views/users/api.hbs:41
-msgid "subscriber's email address"
-msgstr "Correo de Suscriptor"
-
-#: views/users/api.hbs:19 views/users/api.hbs:34 views/users/api.hbs:42
-#: views/users/api.hbs:61 views/users/api.hbs:69
-msgid "required"
-msgstr "Obligatorio"
-
-#: views/users/api.hbs:20
-msgid "subscriber's first name"
-msgstr "Nombre de suscriptor"
-
-#: views/users/api.hbs:21
-msgid "subscriber's last name"
-msgstr "Apellidos de suscriptor"
-
-#: views/users/api.hbs:22
-msgid ""
-"subscriber's timezone (eg. \"Europe/Tallinn\", \"PST\" or \"UTC\"). If not "
-"set defaults to \"UTC\""
-msgstr ""
-"la zona horaria del suscriptor (por ejemplo. \"Europa / Tallin\", \"PST\" o "
-"\"UTC\"). Si no se establece, por defecto es \"UTC\""
-
-#: views/users/api.hbs:23
-msgid ""
-"custom field value. Use yes/no for option group values (checkboxes, radios, "
-"drop downs)"
-msgstr ""
-"Valor de campo personalizado. Utilice sí / no para la opción de los valores "
-"del grupo (casillas de verificación, radios, menús desplegables)"
-
-#: views/users/api.hbs:24
-msgid "Additional POST arguments"
-msgstr "Los argumentos adicionales del POST"
-
-#: views/users/api.hbs:25
-msgid ""
-"set to \"yes\" if you want to make sure the email is marked as subscribed "
-"even if it was previously marked as unsubscribed. If the email was already "
-"unsubscribed/blocked then subscription status is not changed"
-msgstr ""
-"Marca \"Sí\" si desea asegurarse de que el correo electrónico se marca como "
-"suscrito incluso si fue previamente marcado como baja. Si el correo "
-"electrónico ya fue dado de baja o bloqueado, el estado de suscripción no se "
-"cambia"
-
-#: views/users/api.hbs:26
-msgid ""
-"set to \"yes\" if you want to send confirmation email to the subscriber "
-"before actually marking as subscribed"
-msgstr ""
-"Marca \"Sí\" si desea enviar un correo electrónico de confirmación al "
-"suscriptor antes de que realmente se marque como suscrito"
-
-#: views/users/api.hbs:28
-msgid "Remove subscription"
-msgstr "Eliminar suscripción"
-
-#: views/users/api.hbs:29
-msgid "This API call marks a subscription as unsubscribed"
-msgstr "Esta llamada a la API marca una suscripción como dado de baja"
-
-#: views/users/api.hbs:36
-msgid "Delete subscription"
-msgstr "Eliminar suscripción"
-
-#: views/users/api.hbs:37
-msgid "This API call deletes a subscription"
-msgstr "Esta llamada a la API elimina una suscripción"
-
-#: views/users/api.hbs:44
-msgid "Get list of blacklisted emails"
-msgstr "Obtener la lista de correos electrónicos de la lista negra"
-
-#: views/users/api.hbs:45
-msgid "This API call get list of blacklisted emails."
-msgstr ""
-"Esta llamada a la API consigue la lista de correos electrónicos de la lista "
-"negra."
-
-#: views/users/api.hbs:48
-msgid "Start position"
-msgstr "Posición de salida"
-
-#: views/users/api.hbs:49
-msgid "optional, default 0"
-msgstr "opcional, por defecto 0"
-
-#: views/users/api.hbs:50
-msgid "limit emails count in response"
-msgstr "cantidad límite de emails en la respuesta"
-
-#: views/users/api.hbs:51
-msgid "optional, default 10000"
-msgstr "opcional, por defecto 10000"
-
-#: views/users/api.hbs:52
-msgid "filter by part of email"
-msgstr "filtrar por correo electrónico"
-
-#: views/users/api.hbs:53
-msgid "optional, default ''"
-msgstr "opcional, por defecto ''"
-
-#: views/users/api.hbs:56
-msgid "This API call either add emails to blacklist"
-msgstr "Esta llamada a la API añade correos electrónicos a la lista negra"
-
-#: views/users/api.hbs:60 views/users/api.hbs:68
-msgid "email address"
-msgstr "Correo electrónico"
-
-#: views/users/api.hbs:63
-msgid "Delete email from blacklist"
-msgstr "Eliminar correo electrónico de la lista negra"
-
-#: views/users/api.hbs:64
-msgid "This API call either delete emails from blacklist"
-msgstr ""
-"Esta llamada a la API ya sea borrado mensajes de correo electrónico de la "
-"lista negra"
-
-#: views/users/forgot.hbs:3 views/users/reset.hbs:3
-msgid "Password Reset"
-msgstr "Restablecimiento de contraseña"
-
-#: views/users/forgot.hbs:4
-msgid "Reset your password?"
-msgstr "¿Quieres restablecer tu contraseña?"
-
-#: views/users/forgot.hbs:5
-msgid "Accounts are managed through LDAP."
-msgstr "Las cuentas se gestionan a través de LDAP."
-
-#: views/users/forgot.hbs:6 views/users/reset.hbs:10
-msgid "Reset Password"
-msgstr "Restablecer la contraseña"
-
-#: views/users/forgot.hbs:7
-msgid ""
-"Please provide the username or email address that you used when you signed "
-"up for your Mailtrain account."
-msgstr ""
-"Por favor proporcione el nombre de usuario o correo electrónico que utilizó "
-"cuando se inscribió en su cuenta Mailtrain."
-
-#: views/users/forgot.hbs:8
-msgid "We will send you an email that will allow you to reset your password."
-msgstr ""
-"Te enviaremos un correo electrónico que te permitirá restablecer tu "
-"contraseña."
-
-#: views/users/forgot.hbs:10
-msgid "Username or email address"
-msgstr "Nombre de usuario o correo electrónico"
-
-#: views/users/forgot.hbs:11
-msgid "Send verification email"
-msgstr "Envía un correo electrónico de verificación"
-
-#: views/users/login.hbs:8
-msgid "Remember me"
-msgstr "Recuérdame"
-
-#: views/users/login.hbs:11 views/users/login.hbs:12
-msgid "Forgot password?"
-msgstr "¿Se te olvidó tu contraseña?"
-
-#: views/users/reset.hbs:4
-msgid "Choose your new password"
-msgstr "Cambiar la contraseña nueva"
-
-#: views/users/reset.hbs:5
-msgid "Please enter a new password."
-msgstr "Por favor, introduzca una contraseña nueva."
-
-#: lib/editor-helpers.js:17 routes/templates.js:95
-msgid "Could not find template with specified ID"
-msgstr "No se pudo encontrar la plantilla con el ID especificado"
-
-#: lib/editor-helpers.js:33 routes/archive.js:145 routes/campaigns.js:131
-#: routes/campaigns.js:284 routes/campaigns.js:379 routes/campaigns.js:427
-#: routes/campaigns.js:467 routes/campaigns.js:844 routes/campaigns.js:867
-#: routes/campaigns.js:886 routes/campaigns.js:908 routes/triggers.js:146
-msgid "Could not find campaign with specified ID"
-msgstr "No se pudo encontrar campaña con el ID especificado"
-
-#: lib/editor-helpers.js:47 routes/editorapi.js:308
-msgid "Invalid resource type"
-msgstr "Tipo de recurso no válido"
-
-#: lib/feed.js:31
-msgid "Bad status code %s"
-msgstr "Mal código de estado %s"
-
-#: lib/helpers.js:33
-msgid "URL that points to the unsubscribe page"
-msgstr "URL que apunta a la página de darse de baja"
-
-#: lib/helpers.js:36
-msgid "URL that points to the preferences page of the subscriber"
-msgstr "URL que apunta a la página de preferencias del suscriptor"
-
-#: lib/helpers.js:39
-msgid "URL to preview the message in a browser"
-msgstr "URL para obtener una vista previa del mensaje en un navegador"
-
-#: lib/helpers.js:45 lib/models/segments.js:31
-msgid "First name"
-msgstr "Nombre"
-
-#: lib/helpers.js:48 lib/models/segments.js:35
-msgid "Last name"
-msgstr "Apellidos"
-
-#: lib/helpers.js:51
-msgid "Full name (first and last name combined)"
-msgstr "Nombre completo (nombre y apellidos)"
-
-#: lib/helpers.js:54
-msgid "Unique ID that identifies the recipient"
-msgstr "ID único que identifica al destinatario"
-
-#: lib/helpers.js:57
-msgid "Unique ID that identifies the list used for this campaign"
-msgstr "ID único que identifica la lista prevista para esta campaña"
-
-#: lib/helpers.js:60
-msgid "Unique ID that identifies current campaign"
-msgstr "ID único que identifica la campaña actual"
-
-#: lib/helpers.js:68 lib/helpers.js:80
-msgid "content from an RSS entry"
-msgstr "Contenido de una entrada RSS"
-
-#: lib/helpers.js:71
-msgid "RSS entry title"
-msgstr "Título de la entrada RSS"
-
-#: lib/helpers.js:74
-msgid "RSS entry date"
-msgstr "Fecha de entrada RSS"
-
-#: lib/helpers.js:77
-msgid "RSS entry link"
-msgstr "Enlace de entrada RSS"
-
-#: lib/helpers.js:83
-msgid "RSS entry summary"
-msgstr "Resumen de entrada RSS"
-
-#: lib/helpers.js:86
-msgid "RSS entry image URL"
-msgstr "URL de la imagen de entrada RSS"
-
-#: lib/mailer.js:245
-msgid "Invalid mail transport"
-msgstr "Modo fe envío de correo no válido"
-
-#: lib/models/campaigns.js:105 lib/models/campaigns.js:132
-#: lib/models/campaigns.js:205 lib/models/campaigns.js:328
-#: lib/models/campaigns.js:590 lib/models/campaigns.js:723
-msgid "Missing Campaign ID"
-msgstr "Falta el ID de campaña"
-
-#: lib/models/campaigns.js:241
-msgid "Emtpy or too large attahcment"
-msgstr "Adjunto vacío o de tamaño superior al posible"
-
-#: lib/models/campaigns.js:408 lib/models/campaigns.js:600
-msgid "Campaign Name must be set"
-msgstr "El nombre de la campaña se debe ajustar"
-
-#: lib/models/campaigns.js:412
-msgid "RSS URL must be set and needs to be a valid URL"
-msgstr "La URL del RSS se debe establecer y debe ser una URL válida"
-
-#: lib/models/campaigns.js:568
-msgid "Selected template not found"
-msgstr "La plantilla seleccionada no se encuentra"
-
-#: lib/models/campaigns.js:924
-msgid "Invalid or missing message ID"
-msgstr "Falta ID del mensaje o es inválido"
-
-#: lib/models/campaigns.js:1065
-msgid "Unrecognized message status"
-msgstr "Estado del mensaje no reconocido"
-
-#: lib/models/confirmations.js:27
-msgid "Could not store confirmation data"
-msgstr "No se pudo almacenar datos de confirmación"
-
-#: lib/models/fields.js:24
-msgid "Drop Down"
-msgstr "Desplegable"
-
-#: lib/models/fields.js:25
-msgid "Date (MM/DD/YYY)"
-msgstr "Fecha (MM/DD/YYY)"
-
-#: lib/models/fields.js:29
-msgid "JSON value for custom rendering"
-msgstr "valor para la representación personalizada JSON"
-
-#: lib/models/fields.js:30
-msgid "Option"
-msgstr "Opción"
-
-#: lib/models/fields.js:53 lib/models/fields.js:98 lib/models/fields.js:123
-#: lib/models/forms.js:46 lib/models/lists.js:83 lib/models/lists.js:118
-#: lib/models/lists.js:232 lib/models/segments.js:43 lib/models/segments.js:176
-#: lib/models/subscriptions.js:79 lib/models/subscriptions.js:387
-#: lib/models/subscriptions.js:563 lib/models/subscriptions.js:654
-#: lib/models/subscriptions.js:707 lib/models/subscriptions.js:770
-#: lib/models/subscriptions.js:813
-msgid "Missing List ID"
-msgstr "Falta el ID de la lista"
-
-#: lib/models/fields.js:129
-msgid "Option field requires a group to be selected"
-msgstr "El campo Opción requiere que un grupo está seleccionado"
-
-#: lib/models/fields.js:149 lib/models/fields.js:199
-msgid "Missing Field ID"
-msgstr "Falta el campo ID"
-
-#: lib/models/fields.js:153 lib/models/segments.js:185
-#: lib/models/segments.js:225
-msgid "Field Name must be set"
-msgstr "El campo Nombre debe establecerse"
-
-#: lib/models/fields.js:216
-msgid "Custom field not found"
-msgstr "Campo personalizado no encontrado"
-
-#: lib/models/fields.js:289
-msgid "Unknown column type %s"
-msgstr "Desconocido el tipo de columna %s"
-
-#: lib/models/fields.js:293
-msgid "Missing column name"
-msgstr "Falta el nombre de la columna"
-
-#: lib/models/fields.js:297
-msgid "Missing list ID"
-msgstr "Falta el ID de la lista"
-
-#: lib/models/fields.js:305
-msgid "Provided List ID not found"
-msgstr "ID proporcionado de la lista no es encontrado"
-
-#: lib/models/forms.js:70 lib/models/forms.js:113 lib/models/forms.js:201
-#: lib/models/forms.js:291
-msgid "Missing Form ID"
-msgstr "Falta ID del Formulario"
-
-#: lib/models/forms.js:121 lib/models/forms.js:205
-msgid "Form Name must be set"
-msgstr "El Nombre del Formulario se debe ajustar"
-
-#: lib/models/forms.js:307
-msgid "Custom form not found"
-msgstr "Formulario personalizado no encontrado"
-
-#: lib/models/links.js:337 routes/campaigns.js:533 routes/campaigns.js:581
-#: routes/campaigns.js:621 routes/campaigns.js:671 services/sender.js:305
-msgid "Campaign not found"
-msgstr "Campaña no encontrada"
-
-#: lib/models/links.js:345 routes/lists.js:181 services/sender.js:312
-msgid "List not found"
-msgstr "Lista no encontrada"
-
-#: lib/models/links.js:353
-msgid "Subscription not found"
-msgstr "Suscripción no encontrada"
-
-#: lib/models/lists.js:134 lib/models/lists.js:178
-msgid "List Name must be set"
-msgstr "El nombre de la lista debe ser ajustado"
-
-#: lib/models/lists.js:261
-msgid "Missing List CID"
-msgstr "Falta CID de la lista"
-
-#: lib/models/report-templates.js:26 lib/models/report-templates.js:70
-#: lib/models/report-templates.js:142
-msgid "Missing report template ID"
-msgstr "Falta ID de plantilla informe"
-
-#: lib/models/report-templates.js:77
-msgid "Report template name must be set"
-msgstr "El nombre de la plantilla informe se debe ajustar"
-
-#: lib/models/reports.js:40 lib/models/reports.js:110 lib/models/reports.js:188
-msgid "Missing report ID"
-msgstr "Falta ID de informe "
-
-#: lib/models/reports.js:116
-msgid "Report name must be set"
-msgstr "Nombre del informe se debe ajustar"
-
-#: lib/models/segments.js:15
-msgid "Signup country"
-msgstr "País de registro"
-
-#: lib/models/segments.js:19 lib/models/triggers.js:12
-msgid "Sign up date"
-msgstr "Fecha de inscripción"
-
-#: lib/models/segments.js:23 lib/models/triggers.js:16
-msgid "Latest open"
-msgstr "Última apertura"
-
-#: lib/models/segments.js:27 lib/models/triggers.js:20
-msgid "Latest click"
-msgstr "Último clic"
-
-#: lib/models/segments.js:69 lib/models/segments.js:216
-#: lib/models/segments.js:256 lib/models/segments.js:278
-msgid "Missing Segment ID"
-msgstr "Falta el ID de segmento"
-
-#: lib/models/segments.js:85 lib/models/segments.js:549
-#: lib/models/segments.js:658
-msgid "Segment not found"
-msgstr "El segmento no se encuentra"
-
-#: lib/models/segments.js:146 lib/models/segments.js:147
-#: lib/models/segments.js:408 lib/models/segments.js:409
-msgid "%s days after today"
-msgstr "%s días después de hoy"
-
-#: lib/models/segments.js:146 lib/models/segments.js:147
-#: lib/models/segments.js:408 lib/models/segments.js:409
-msgid "%s days before today"
-msgstr "%s días antes de hoy"
-
-#: lib/models/segments.js:148 lib/models/segments.js:410
-msgid "today"
-msgstr "hoy"
-
-#: lib/models/segments.js:189 lib/models/segments.js:229
-msgid "Invalid segment rule type"
-msgstr "Tipo de regla de segmento no válido"
-
-#: lib/models/segments.js:289 lib/models/segments.js:454 routes/segments.js:266
-#: routes/segments.js:300 routes/segments.js:370 routes/segments.js:381
-msgid "Selected segment not found"
-msgstr "El segmento seleccionado no se encuentra"
-
-#: lib/models/segments.js:294 lib/models/segments.js:459 routes/segments.js:272
-#: routes/segments.js:306 routes/segments.js:387
-msgid "Invalid rule type"
-msgstr "Tipo de regla no válida"
-
-#: lib/models/segments.js:358 lib/models/segments.js:434
-#: lib/models/segments.js:524
-msgid "Missing Rule ID"
-msgstr "Falta el ID de la regla"
-
-#: lib/models/segments.js:374
-msgid "Specified rule not found"
-msgstr "La regla especificada no se encontra"
-
-#: lib/models/segments.js:385
-msgid "Specified segment not found"
-msgstr "El segmento especificado no se encontra"
-
-#: lib/models/segments.js:445
-msgid "Selected rule not found"
-msgstr "La regla seleccionada no se encontra"
-
-#: lib/models/subscriptions.js:254 lib/models/subscriptions.js:284 lib/models/subscriptions.js:391
-msgid "Missing Subscription ID"
-msgstr "Falta el ID de Suscripción"
-
-#: lib/models/subscriptions.js:312
-msgid "Missing Subscription email address"
-msgstr "Falta el correo electrónico de suscripción"
-
-#: lib/models/subscriptions.js:567 lib/models/subscriptions.js:817
-msgid "Missing subscription ID"
-msgstr "Falta el ID de suscripción"
-
-#: lib/models/subscriptions.js:658 lib/models/subscriptions.js:711
-#: lib/models/subscriptions.js:747
-msgid "Missing Import ID"
-msgstr "Falta el ID de importación"
-
-#: lib/models/subscriptions.js:839
-msgid "Unknown subscription ID"
-msgstr "No se conoce el ID de suscripción"
-
-#: lib/models/subscriptions.js:844 routes/subscription.js:638
-msgid "Nothing seems to be changed"
-msgstr "Nada parece haber sido cambiado"
-
-#: lib/models/subscriptions.js:910 routes/subscription.js:472
-#: routes/subscription.js:544 routes/subscription.js:580
-#: routes/subscription.js:696 routes/subscription.js:771
-msgid "Subscription not found in this list"
-msgstr "La suscripción no se encuentra en esta lista"
-
-#: lib/models/templates.js:26 lib/models/templates.js:100
-#: lib/models/templates.js:144
-msgid "Missing Template ID"
-msgstr "Falta el ID de plantilla"
-
-#: lib/models/templates.js:55 lib/models/templates.js:104
-msgid "Template Name must be set"
-msgstr "El nombre de la plantilla se debe ajustar"
-
-#: lib/models/triggers.js:29
-msgid "Has Opened"
-msgstr "Ha abierto"
-
-#: lib/models/triggers.js:32
-msgid "Has Clicked"
-msgstr "Ha hecho clic"
-
-#: lib/models/triggers.js:35
-msgid "Not Opened"
-msgstr "No ha abierto"
-
-#: lib/models/triggers.js:38
-msgid "Not Clicked"
-msgstr "No ha hecho clic"
-
-#: lib/models/triggers.js:175 lib/models/triggers.js:212
-msgid "Missing or invalid list ID"
-msgstr "Falta ID de lista o es inválido"
-
-#: lib/models/triggers.js:179 lib/models/triggers.js:264
-msgid "Days in the past are not allowed"
-msgstr "No se permiten días pasados"
-
-#: lib/models/triggers.js:183 lib/models/triggers.js:204
-#: lib/models/triggers.js:268 lib/models/triggers.js:289
-msgid "Missing or invalid trigger rule"
-msgstr "Falta Regla encadenante o es inválida"
-
-#: lib/models/triggers.js:190 lib/models/triggers.js:275
-msgid "Invalid subscription configuration"
-msgstr "La configuración de suscripción no es válida"
-
-#: lib/models/triggers.js:197 lib/models/triggers.js:282
-msgid "Invalid campaign configuration"
-msgstr "Configuración de la campaña no es válida"
-
-#: lib/models/triggers.js:200 lib/models/triggers.js:285
-msgid "A campaing can not be a target for itself"
-msgstr "Una campaña no puede ser un objetivo por sí mismo"
-
-#: lib/models/triggers.js:233
-msgid "Could not store trigger row"
-msgstr "No se pudo almacenar el trigger"
-
-#: lib/models/triggers.js:250
-msgid "Missing or invalid Trigger ID"
-msgstr "Falta ID de Trigger o es inválido"
-
-#: lib/models/triggers.js:317
-msgid "Missing Trigger ID"
-msgstr "Falta ID de Trigger"
-
-#: lib/models/users.js:103
-msgid "Could not store user row"
-msgstr "No se pudo almacenar fila de usuario"
-
-#: lib/models/users.js:173
-msgid "Email Address must be set"
-msgstr "El correo electrónico debe estar configurado"
-
-#: lib/models/users.js:184
-msgid "Failed to check user data"
-msgstr "No se ha podido comprobar los datos de usuario"
-
-#: lib/models/users.js:195
-msgid ""
-"Can't change email as another user with the same email address already exists"
-msgstr ""
-"No se puede cambiar el correo electrónico como otro usuario con la misma "
-"dirección de correo electrónico que ya existe"
-
-#: lib/models/users.js:212
-msgid "Incorrect current password"
-msgstr "Contraseña actual incorrecta"
-
-#: lib/models/users.js:216
-msgid "New password not set"
-msgstr "La nueva contraseña no se ha establecido"
-
-#: lib/models/users.js:220
-msgid "Passwords do not match"
-msgstr "Las contraseñas no coinciden"
-
-#: lib/models/users.js:258
-msgid "User ID not set"
-msgstr "El ID de usuario no se ha establecido"
-
-#: lib/models/users.js:286
-msgid "Username must be set"
-msgstr "El nombre de usuario debe configurarse"
-
-#: lib/models/users.js:323
-msgid "Mailer password change request"
-msgstr "Solicitud de cambio de contraseña de correo electrónico"
-
-#: lib/models/users.js:347 lib/models/users.js:367
-msgid "Missing username or reset token"
-msgstr "Falta el nombre de usuario o restablecer Token"
-
-#: lib/models/users.js:371
-msgid "Invalid new password"
-msgstr "Nueva contraseña inválida"
-
-#: lib/passport.js:40
-msgid "%s logged out"
-msgstr "%s desconectado"
-
-#: lib/passport.js:53
-msgid "Failed to authenticate user"
-msgstr "Error de autenticación de usuario"
-
-#: lib/passport.js:69
-msgid "Logged in as %s"
-msgstr "Conectado como %s"
-
-#: lib/passport.js:128
-msgid "Incorrect username or password"
-msgstr "Nombre de usuario o contraseña incorrecta"
-
-#: lib/subscription-mail-helpers.js:28
-msgid "%s: Subscription Confirmed"
-msgstr "%s: Suscripción Confirmada"
-
-#: lib/subscription-mail-helpers.js:39
-msgid "%s: Email Address Already Registered"
-msgstr "%s: Correo electrónico registrado"
-
-#: lib/subscription-mail-helpers.js:49
-msgid "%s: Please Confirm Email Change in Subscription"
-msgstr "%s: Por favor confirma el cambio de correo electrónico de suscripción"
-
-#: lib/subscription-mail-helpers.js:59
-msgid "%s: Please Confirm Subscription"
-msgstr "%s: Por favor confirma la Suscripción"
-
-#: lib/subscription-mail-helpers.js:69
-msgid "%s: Please Confirm Unsubscription"
-msgstr "%s: Por favor confirma la Baja"
-
-#: lib/subscription-mail-helpers.js:76
-msgid "%s: Unsubscription Confirmed"
-msgstr "%s: Baja confirmada :("
-
-#: lib/tools.js:154
-msgid "Blocked email address \"%s\""
-msgstr "Correo electrónico bloqueado \"%s\""
-
-#: lib/tools.js:163
-msgid "Invalid email address \"%s\"."
-msgstr "Correo electrónico inválido \"%s\"."
-
-#: lib/tools.js:166
-msgid "MX record not found for domain"
-msgstr "Registro MX para el dominio no encontrado"
-
-#: lib/tools.js:169
-msgid "Address domain not found"
-msgstr "No se ha encontrado dominio de la dirección"
-
-#: lib/tools.js:172
-msgid "Address domain name is required"
-msgstr "Se requiere el nombre de dominio"
-
-#: routes/archive.js:31 routes/archive.js:43 routes/archive.js:55 app.js:230
-msgid "Not Found"
-msgstr "No encontrado"
-
-#: routes/archive.js:121 services/sender.js:451
-msgid "Received status code %s from %s"
-msgstr "Código de estado recibido %s de %s"
-
-#: routes/archive.js:153 routes/campaigns.js:894
-msgid "Attachment not found"
-msgstr "Adjunto no encontrado"
-
-#: routes/blacklist.js:13 routes/campaigns.js:26 routes/editorapi.js:35
-#: routes/fields.js:13 routes/forms.js:16 routes/grapejs.js:14
-#: routes/lists.js:50 routes/mosaico.js:14 routes/report-templates.js:20
-#: routes/reports.js:22 routes/segments.js:13 routes/settings.js:23
-#: routes/templates.js:18 routes/triggers.js:18 routes/users.js:75
-#: routes/users.js:120
-msgid "Need to be logged in to access restricted content"
-msgstr "Tienes que estar registrado para acceder a contenido restringido"
-
-#: routes/campaigns.js:117
-msgid "Could not create campaign"
-msgstr "No se pudo crear la campaña"
-
-#: routes/campaigns.js:120
-msgid "Campaign “%s” created"
-msgstr "Campaña “%s” creada"
-
-#: routes/campaigns.js:209
-msgid "Campaign settings updated"
-msgstr "Configuración de la campaña actualizada"
-
-#: routes/campaigns.js:211
-msgid "Campaign settings not updated"
-msgstr "La configuración de la campaña no se ha actualizado"
-
-#: routes/campaigns.js:227 routes/campaigns.js:744
-msgid "Campaign deleted"
-msgstr "Campaña eliminada"
-
-#: routes/campaigns.js:229 routes/campaigns.js:746
-msgid "Could not delete specified campaign"
-msgstr "No se pudo eliminar la campaña especificada"
-
-#: routes/campaigns.js:248
-msgid "Idling"
-msgstr "Inactivo/No usado"
-
-#: routes/campaigns.js:251
-msgid "Scheduled"
-msgstr "Programado"
-
-#: routes/campaigns.js:257
-msgid "Paused"
-msgstr "Pausado"
-
-#: routes/campaigns.js:259
-msgid "Inactive"
-msgstr "Inactivo"
-
-#: routes/campaigns.js:261
-msgid "Active"
-msgstr "Activo"
-
-#: routes/campaigns.js:263
-msgid "Other"
-msgstr "Otros"
-
-#: routes/campaigns.js:421
-msgid "Unknown status selector"
-msgstr "Estado seleccionado no conocido"
-
-#: routes/campaigns.js:762
-msgid "Scheduled sending"
-msgstr "Envío programado"
-
-#: routes/campaigns.js:764
-msgid "Could not schedule sending"
-msgstr "No se puede programar el envío"
-
-#: routes/campaigns.js:776
-msgid "Sending resumed"
-msgstr "Envío reanudado"
-
-#: routes/campaigns.js:778
-msgid "Could not resume sending"
-msgstr "No se pudo reanudar el envío"
-
-#: routes/campaigns.js:790
-msgid "Sending reset"
-msgstr "Envío reiniciado"
-
-#: routes/campaigns.js:792
-msgid "Could not reset sending"
-msgstr "No se ha podido reiniciar el envío"
-
-#: routes/campaigns.js:804 routes/campaigns.js:832
-msgid "Sending paused"
-msgstr "Envío pausado"
-
-#: routes/campaigns.js:806 routes/campaigns.js:834
-msgid "Could not pause sending"
-msgstr "No se ha podido pausar el envío"
-
-#: routes/campaigns.js:818
-msgid "Sending activated"
-msgstr "Envío activado"
-
-#: routes/campaigns.js:820
-msgid "Could not activate sending"
-msgstr "No se ha podido activar el envío"
-
-#: routes/campaigns.js:855
-msgid "Attachment uploaded"
-msgstr "Adjunto subido"
-
-#: routes/campaigns.js:857
-msgid "Could not store attachment"
-msgstr "No se ha podido almacenar el adjunto"
-
-#: routes/campaigns.js:874
-msgid "Attachment deleted"
-msgstr "Adjunto eliminado"
-
-#: routes/campaigns.js:876
-msgid "Could not delete attachment"
-msgstr "No se ha podido eliminar el adjunto"
-
-#: routes/editorapi.js:41
-msgid "Invalid editor name"
-msgstr "Nombre de Editor inválido"
-
-#: routes/editorapi.js:237 routes/editorapi.js:275
-msgid "Method not supported"
-msgstr "Método no soportado"
-
-#: routes/editorapi.js:352
-msgid "Invalid resource type or ID"
-msgstr "Tipo de recurso o ID no válido"
-
-#: routes/fields.js:28 routes/fields.js:64 routes/fields.js:118
-#: routes/forms.js:31 routes/forms.js:63 routes/forms.js:94
-#: routes/segments.js:28 routes/segments.js:59 routes/segments.js:102
-#: routes/segments.js:151 routes/segments.js:223 routes/segments.js:255
-#: routes/segments.js:289 routes/segments.js:336 routes/segments.js:359
-msgid "Selected list ID not found"
-msgstr "ID de lista seleccionado no encontado"
-
-#: routes/fields.js:102
-msgid "Could not create custom field"
-msgstr "No se ha podido crear campo personalizado"
-
-#: routes/fields.js:129
-msgid "Selected field not found"
-msgstr "Campo seleccionado no encontrado"
-
-#: routes/fields.js:165
-msgid "Field settings updated"
-msgstr "Configuración del campo actualizado"
-
-#: routes/fields.js:167
-msgid "Field settings not updated"
-msgstr "Configuración del campo no actualizado"
-
-#: routes/fields.js:183
-msgid "Custom field deleted"
-msgstr "Campo personalizado eliminado"
-
-#: routes/fields.js:185
-msgid "Could not delete specified field"
-msgstr "No se pudo eliminar el campo especificado"
-
-#: routes/forms.js:78
-msgid "Could not create custom form"
-msgstr "No se pudo crear el formulario personalizado"
-
-#: routes/forms.js:105
-msgid "Selected form not found"
-msgstr "El formulario seleccionado no se encuentra"
-
-#: routes/forms.js:136
-msgid "The plaintext version for this email"
-msgstr "Versión en formato texto para este correo electrónico"
-
-#: routes/forms.js:137
-msgid "Custom forms use MJML for formatting"
-msgstr "Formularios personalizados utilizan MJML para dar formato"
-
-#: routes/forms.js:138
-msgid "See the MJML documentation here"
-msgstr ""
-"Consulte la documentación de MJML aquí "
-
-#: routes/forms.js:146
-msgid "Layout"
-msgstr "Diseño"
-
-#: routes/forms.js:152
-msgid "Form Input Style"
-msgstr "Estilo de entrada de Formulario"
-
-#: routes/forms.js:154
-msgid ""
-"This CSS stylesheet defines the appearance of form input elements and alerts"
-msgstr ""
-"Esta hoja de estilo CSS define el aspecto de los elementos de entrada de "
-"formulario y alertas"
-
-#: routes/forms.js:160
-msgid "Web - Subscribe"
-msgstr "Web - Suscribirse"
-
-#: routes/forms.js:165
-msgid "Web - Confirm Subscription Notice"
-msgstr "Web - Aviso Confirmar suscripción"
-
-#: routes/forms.js:170
-msgid "Mail - Confirm Subscription (MJML)"
-msgstr "Mail - Confirmar suscripción (MJML)"
-
-#: routes/forms.js:175
-msgid "Mail - Confirm Subscription (Text)"
-msgstr "Mail - Confirmar suscripción (texto)"
-
-#: routes/forms.js:180
-msgid "Mail - Already Subscribed (MJML)"
-msgstr "Mail - Ya suscrito (MJML)"
-
-#: routes/forms.js:185
-msgid "Mail - Already Subscribed (Text)"
-msgstr "Mail - Ya Suscrito (texto)"
-
-#: routes/forms.js:190
-msgid "Web - Subscribed Notice"
-msgstr "Web - Aviso Suscripción"
-
-#: routes/forms.js:195
-msgid "Mail - Subscription Confirmed (MJML)"
-msgstr "Mail - Suscripción confirmada (MJML)"
-
-#: routes/forms.js:200
-msgid "Mail - Subscription Confirmed (Text)"
-msgstr "Mail - Suscripción confirmada (texto)"
-
-#: routes/forms.js:208
-msgid "Web - Manage Preferences"
-msgstr "Web - Gestión de Preferencias"
-
-#: routes/forms.js:213
-msgid "Web - Manage Address"
-msgstr "Web - Gestión de Dirección"
-
-#: routes/forms.js:218
-msgid "Web - Updated Notice"
-msgstr "Web - Aviso actualizado"
-
-#: routes/forms.js:226
-msgid "Web - Unsubscribe"
-msgstr "Web - Darse de baja"
-
-#: routes/forms.js:231
-msgid "Web - Confirm Unsubscription Notice"
-msgstr "Web - Confirmar Aviso de baja"
-
-#: routes/forms.js:236
-msgid "Mail - Confirm Unsubscription (MJML)"
-msgstr "Mail - Confirmar baja (MJML)"
-
-#: routes/forms.js:241
-msgid "Mail - Confirm Unsubscription (Text)"
-msgstr "Mail - Confirmar baja (MJML)"
-
-#: routes/forms.js:246
-msgid "Mail - Confirm Address Change (MJML)"
-msgstr "Mail - Confirmar Cambio de dirección (MJML)"
-
-#: routes/forms.js:251
-msgid "Mail - Confirm Address Change (Text)"
-msgstr "Mail - Confirmar Cambio de dirección (texto)"
-
-#: routes/forms.js:256
-msgid "Web - Unsubscribed Notice"
-msgstr "Web - Aviso Baja realizada"
-
-#: routes/forms.js:261
-msgid "Mail - Unsubscription Confirmed (MJML)"
-msgstr "Mail - Baja Confirmada (MJML)"
-
-#: routes/forms.js:266
-msgid "Mail - Unsubscription Confirmed (Text)"
-msgstr "Mail - Baja Confirmada (texto)"
-
-#: routes/forms.js:271
-msgid "Web - Manual Unsubscribe Notice"
-msgstr "Web - Aviso de Manual de Baja"
-
-#: routes/forms.js:309
-msgid "Form settings updated"
-msgstr "Configuración de formulario Actualizada"
-
-#: routes/forms.js:311
-msgid "Form settings not updated"
-msgstr "Configuración de formulario No Actualizada"
-
-#: routes/forms.js:327
-msgid "Custom form deleted"
-msgstr "Formulario Personalizado eliminado"
-
-#: routes/forms.js:329
-msgid "Could not delete specified form"
-msgstr "No se ha podido eliminar Formulario especificado"
-
-#: routes/index.js:11
-msgid "Self Hosted Newsletter App"
-msgstr "Auto alojamiento de Aplicación de Boletín "
-
-#: routes/links.js:39
-msgid "Oops, we couldn't find a link for the URL you clicked"
-msgstr ""
-"Vaya, no hemos podido encontrar un vínculo para la URL que ha hecho clic"
-
-#: routes/lists.js:82
-msgid "Could not create list"
-msgstr "No se ha podido crear la lista"
-
-#: routes/lists.js:85
-msgid "List created"
-msgstr "Lista creada"
-
-#: routes/lists.js:93 routes/lists.js:271 routes/lists.js:336
-#: routes/lists.js:375 routes/lists.js:444 routes/lists.js:469
-#: routes/lists.js:514 routes/lists.js:536 routes/lists.js:565
-#: routes/lists.js:644 routes/lists.js:701 routes/lists.js:728
-msgid "Could not find list with specified ID"
-msgstr "No se ha podido encontrar la lista con el ID especificado"
-
-#: routes/lists.js:122
-msgid "List settings updated"
-msgstr "Configuración de la lista actualizado"
-
-#: routes/lists.js:124
-msgid "List settings not updated"
-msgstr "Configuración de la lista no actualizado"
-
-#: routes/lists.js:142
-msgid "List deleted"
-msgstr "Lista eliminada"
-
-#: routes/lists.js:144
-msgid "Could not delete specified list"
-msgstr "No se ha eliminado la lista especificada"
-
-#: routes/lists.js:206
-msgid "Unknown"
-msgstr "desconocido"
-
-#: routes/lists.js:206
-msgid "Complained"
-msgstr "Queja"
-
-#: routes/lists.js:237
-msgid "Invalid key"
-msgstr "Clave inválida"
-
-#: routes/lists.js:239
-msgid "Expired key"
-msgstr "Clave caducada"
-
-#: routes/lists.js:241
-msgid "Revoked key"
-msgstr "Clave anulada"
-
-#: routes/lists.js:291
-msgid "Initializing"
-msgstr "Iniciando"
-
-#: routes/lists.js:294
-msgid "Initialized"
-msgstr "Iniciado"
-
-#: routes/lists.js:297
-msgid "Importing"
-msgstr "Importando"
-
-#: routes/lists.js:303
-msgid "Errored"
-msgstr "Erróneo"
-
-#: routes/lists.js:381 routes/lists.js:450 routes/lists.js:475
-msgid "Could not find subscriber with specified ID"
-msgstr "No se pudo encontrar el Suscriptor con el especificado ID"
-
-#: routes/lists.js:427
-msgid "Could not add subscription"
-msgstr "No se pudo añadir la suscripción"
-
-#: routes/lists.js:432
-msgid "%s was successfully added to your list"
-msgstr "%s ha sido añadido a su lista con éxito"
-
-#: routes/lists.js:434
-msgid "%s was not added to your list"
-msgstr "%s no ha sido añadido a su lista"
-
-#: routes/lists.js:456
-msgid "Could not unsubscribe user"
-msgstr "No se ha dado de baja al usuario"
-
-#: routes/lists.js:459
-msgid "%s was successfully unsubscribed from your list"
-msgstr "%s ha sido dado de baja de su lista con éxito"
-
-#: routes/lists.js:479
-msgid "%s was successfully removed from your list"
-msgstr "%s ha sido eliminado de su lista con éxito"
-
-#: routes/lists.js:491
-msgid "Another subscriber with email address %s already exists"
-msgstr "Otro suscriptor con correo electrónico %s ya existe"
-
-#: routes/lists.js:498
-msgid "Subscription settings updated"
-msgstr "Configuración de suscripción actualizada"
-
-#: routes/lists.js:500
-msgid "Subscription settings not updated"
-msgstr "Configuración de suscripción no actualizada"
-
-#: routes/lists.js:542 routes/lists.js:650 routes/lists.js:686
-#: routes/lists.js:714 routes/lists.js:734
-msgid "Could not find import data with specified ID"
-msgstr "No se pudo encontrar datos de importación con especificado ID"
-
-#: routes/lists.js:573
-msgid "Could not process CSV"
-msgstr "No se pudo procesar CSV"
-
-#: routes/lists.js:582
-msgid "Could not create importer"
-msgstr "No se pudo crear importación"
-
-#: routes/lists.js:633
-msgid "Empty file"
-msgstr "Archivo vacío"
-
-#: routes/lists.js:690
-msgid "Import started"
-msgstr "Importación empezada"
-
-#: routes/lists.js:718
-msgid "Import restarted"
-msgstr "Importación reiniciada"
-
-#: routes/lists.js:784
-msgid "One-step (i.e. no email with confirmation link)"
-msgstr "Un paso (es decir, no email de confirmación)"
-
-#: routes/lists.js:790
-msgid ""
-"One-step with unsubscription form (i.e. no email with confirmation link)"
-msgstr "Un paso con formulario de baja (es decir, no email de confirmación)"
-
-#: routes/lists.js:796
-msgid "Two-step (i.e. an email with confirmation link will be sent)"
-msgstr "Dos pasos (es decir, se envía email de confirmación)"
-
-#: routes/lists.js:802
-msgid ""
-"Two-step with unsubscription form (i.e. an email with confirmation link will "
-"be sent)"
-msgstr ""
-"Dos pasos con formulario de baja (es decir, se envía email de confirmación)"
-
-#: routes/lists.js:808
-msgid ""
-"Manual (i.e. unsubscription has to be performed by the list administrator)"
-msgstr "Manual (es decir, baja realizada por administrador)"
-
-#: routes/report-templates.js:246
-msgid "Could not create report template"
-msgstr "No se pudo crear informe de plantillas"
-
-#: routes/report-templates.js:249
-msgid "Report template “%s” created"
-msgstr "Informe de plantilla “%s” creado"
-
-#: routes/report-templates.js:257
-msgid "Could not find report template with specified ID"
-msgstr "No se encuentra informe de plantilla con ID especificado"
-
-#: routes/report-templates.js:280
-msgid "Report template updated"
-msgstr "Informe de plantilla actualizada"
-
-#: routes/report-templates.js:282
-msgid "Report template not updated"
-msgstr "Informe de plantilla no actualizada"
-
-#: routes/report-templates.js:298
-msgid "Report template deleted"
-msgstr "Informe de plantilla eliminada"
-
-#: routes/report-templates.js:300
-msgid "Could not delete specified report template"
-msgstr "No se pudo eliminar Informe de plantilla especificado"
-
-#: routes/reports.js:124 routes/reports.js:130
-msgid "Could not create report"
-msgstr "No se pudo crear informe"
-
-#: routes/reports.js:135
-msgid "Report “%s” created"
-msgstr "Informe \"%s\" creado"
-
-#: routes/reports.js:146 routes/reports.js:224 routes/reports.js:239
-#: routes/reports.js:265 routes/reports.js:275
-msgid "Could not find report with specified ID"
-msgstr "No se pudo encontrar el informe con el ID especificado"
-
-#: routes/reports.js:188 routes/reports.js:194
-msgid "Could not update report"
-msgstr "No se pudo actualizar el informe"
-
-#: routes/reports.js:197
-msgid "Report updated"
-msgstr "Informe actualizado"
-
-#: routes/reports.js:199
-msgid "Report not updated"
-msgstr "Informe no actualizado"
-
-#: routes/reports.js:212
-msgid "Report deleted"
-msgstr "Informe eliminado"
-
-#: routes/reports.js:214
-msgid "Could not delete specified report"
-msgstr "No se pudo eliminar informe especificado"
-
-#: routes/reports.js:230
-msgid "Could not find report template"
-msgstr "No se pudo encontrar informe especificado"
-
-#: routes/reports.js:260
-msgid "Unknown type of template"
-msgstr "Tipo desconocido de la plantilla"
-
-#: routes/segments.js:86
-msgid "Could not create segment"
-msgstr "No se pudo crear el segmento"
-
-#: routes/segments.js:89
-msgid "Segment created"
-msgstr "Segmento creado"
-
-#: routes/segments.js:113
-msgid "Selected segment ID not found"
-msgstr "ID de segmento seleccionado no encontrado"
-
-#: routes/segments.js:188
-msgid "Segment settings updated"
-msgstr "Ajustes de segmento actualizados"
-
-#: routes/segments.js:190
-msgid "Segment settings not updated"
-msgstr "Ajustes de segmento no actualizados"
-
-#: routes/segments.js:206
-msgid "Segment deleted"
-msgstr "Segmento eliminado"
-
-#: routes/segments.js:208
-msgid "Could not delete specified segment"
-msgstr "No se pudo eliminar segmento especificado"
-
-#: routes/segments.js:342
-msgid "Could not create rule"
-msgstr "No se pudo crear la regla"
-
-#: routes/segments.js:345
-msgid "Rule created"
-msgstr "Regla creada"
-
-#: routes/segments.js:410
-msgid "Rule settings updated"
-msgstr "Ajustes de regla actualizados"
-
-#: routes/segments.js:412
-msgid "Rule settings not updated"
-msgstr "Ajustes de regla no actualizados"
-
-#: routes/segments.js:428
-msgid "Rule deleted"
-msgstr "Regla eliminada"
-
-#: routes/segments.js:430
-msgid "Could not delete specified rule"
-msgstr "No se pudo eliminar regla especificada"
-
-#: routes/settings.js:39
-msgid "Use TLS"
-msgstr "Usar TLS"
-
-#: routes/settings.js:40
-msgid "usually selected for port 465"
-msgstr "Normalmente seleccionado para el puerto 465"
-
-#: routes/settings.js:44
-msgid "Use STARTTLS"
-msgstr "Usar STARTTLS"
-
-#: routes/settings.js:45
-msgid "usually selected for port 587 and 25"
-msgstr "Generalmente seleccionado por el puerto 587 y 25"
-
-#: routes/settings.js:49
-msgid "Do not use encryption"
-msgstr "No utilice el cifrado"
-
-#: routes/settings.js:115
-msgid "Settings updated"
-msgstr "Ajustes actualizados"
-
-#: routes/settings.js:173
-msgid "Invalid mail transport type"
-msgstr "Tipo de Correo Transporte no válido"
-
-#: routes/settings.js:184
-msgid "Invalid Access Key"
-msgstr "Clave de acceso inválido"
-
-#: routes/settings.js:187
-msgid "Invalid AWS credentials"
-msgstr "Credenciales AWS inválidas"
-
-#: routes/settings.js:190
-msgid "Connection refused, check hostname and port."
-msgstr "Conexión rechazada, verificar nombre de host y puerto "
-
-#: routes/settings.js:195
-msgid ""
-"Did not receive greeting message from server. This might happen when "
-"connecting to a TLS port without using TLS."
-msgstr ""
-"No se recibió el mensaje de saludo de servidor. Esto puede ocurrir cuando se "
-"conecta a un puerto TLS sin utilizar TLS."
-
-#: routes/settings.js:197
-msgid "Did not receive greeting message from server."
-msgstr "No se recibió el mensaje de saludo de servidor."
-
-#: routes/settings.js:200
-msgid ""
-"Connection timed out. Check your firewall settings, destination port is "
-"probably blocked."
-msgstr ""
-"Tiempo de conexión agotado. Comprobar la configuración del firewall, puerto "
-"de destino probablemente está bloqueado."
-
-#: routes/settings.js:205
-msgid "Authentication not accepted, server expects STARTTLS to be used."
-msgstr "Autenticación no aceptada, servidor STARTTLS espera a ser utilizados."
-
-#: routes/settings.js:207
-msgid "Authentication failed, check username and password."
-msgstr "Error de autenticación, compruebe nombre de usuario y contraseña."
-
-#: routes/settings.js:217
-msgid "Failed Mailer verification."
-msgstr "Verificación Remitente fallido."
-
-#: routes/settings.js:217
-msgid "Server responded with: \"%s\""
-msgstr "Servidor respondió con: \"%s\""
-
-#: routes/settings.js:221
-msgid "Mailer settings verified, ready to send some mail!"
-msgstr "Ajustes de remitente verificados, listo para enviar algún correo!"
-
-#: routes/subscription.js:33
-msgid "Not allowed by CORS"
-msgstr "No es permitido por CORS"
-
-#: routes/subscription.js:61 routes/subscription.js:175
-#: routes/subscription.js:285 routes/subscription.js:381
-#: routes/subscription.js:458 routes/subscription.js:534
-#: routes/subscription.js:565 routes/subscription.js:625
-#: routes/subscription.js:681 routes/subscription.js:759
-#: routes/subscription.js:896
-msgid "Selected list not found"
-msgstr "La lista seleccionada no se encuentra"
-
-#: routes/subscription.js:92
-msgid "Could not save subscription"
-msgstr "No se pudo guardar la suscripción"
-
-#: routes/subscription.js:117
-msgid "Subscriber info corrupted or missing"
-msgstr "Datos de Suscripción dañados o perdidos"
-
-#: routes/subscription.js:135
-msgid "Email address changed"
-msgstr "Correo electrónico ha cambiado"
-
-#: routes/subscription.js:178 routes/subscription.js:384
-msgid "The list does not allow public subscriptions."
-msgstr "La lista no permite suscripciones públicas."
-
-#: routes/subscription.js:354 routes/subscription.js:356
-msgid "Email address not set"
-msgstr "Correo electrónico no establecido"
-
-#: routes/subscription.js:652
-msgid ""
-"An email with further instructions has been sent to the provided address"
-msgstr ""
-"Un correo electrónico con más instrucciones ha sido enviado a la dirección "
-"proporcionada"
-
-#: routes/subscription.js:860 routes/subscription.js:876
-msgid "Public key is not set"
-msgstr "La clave pública no se ha establecido"
-
-#: routes/templates.js:84
-msgid "Could not create template"
-msgstr "No se pudo crear la plantilla"
-
-#: routes/templates.js:87
-msgid "Template created"
-msgstr "Planilla creada"
-
-#: routes/templates.js:126
-msgid "Template settings updated"
-msgstr "Configuración de plantilla actualizada"
-
-#: routes/templates.js:128
-msgid "Template settings not updated"
-msgstr "Configuración de plantilla no actualizada"
-
-#: routes/templates.js:144
-msgid "Template deleted"
-msgstr "Plantilla eliminada"
-
-#: routes/templates.js:146
-msgid "Could not delete specified template"
-msgstr "No se pudo eliminar la plantilla especificada"
-
-#: routes/triggers.js:62 routes/triggers.js:79 routes/triggers.js:154
-msgid "Could not find selected list"
-msgstr "No se pudo encontrar lista seleccionada"
-
-#: routes/triggers.js:131
-msgid "Could not create trigger"
-msgstr "No se pudo crear el Trigger"
-
-#: routes/triggers.js:138
-msgid "Trigger “%s” created"
-msgstr "Trigger “%s” creado"
-
-#: routes/triggers.js:214
-msgid "Trigger settings updated"
-msgstr "Ajustes de Trigger actualizados"
-
-#: routes/triggers.js:216
-msgid "Trigger settings not updated"
-msgstr "Ajustes de Trigger no actualizados"
-
-#: routes/triggers.js:228
-msgid "Trigger deleted"
-msgstr "Trigger eliminado"
-
-#: routes/triggers.js:230
-msgid "Could not delete specified trigger"
-msgstr "No se pudo eliminar el Trigger especificado"
-
-#: routes/triggers.js:242
-msgid "Could not find trigger with specified ID"
-msgstr "No se pudo encontrar el Trigger con el ID especificado"
-
-#: routes/triggers.js:255
-msgid "Trigger not found"
-msgstr "Trigger no encontrado"
-
-#: routes/users.js:32
-msgid ""
-"An email with password reset instructions has been sent to your email "
-"address, if it exists on our system."
-msgstr ""
-"Un correo electrónico con instrucciones para restablecer la contraseña ha "
-"sido enviada a su dirección de correo electrónico, si existe en nuestro "
-"sistema."
-
-#: routes/users.js:46 routes/users.js:64
-msgid "Unknown or expired reset token"
-msgstr "Reinicio de Token desconocido o caducado"
-
-#: routes/users.js:66
-msgid "Your password has been changed successfully"
-msgstr "Tu contraseña ha sido cambiada exitosamente"
-
-#: routes/users.js:87
-msgid "User data not found"
-msgstr "Datos de usuario no encontrados"
-
-#: routes/users.js:110
-msgid "Access token updated"
-msgstr "Token de acceso actualizado"
-
-#: routes/users.js:112
-msgid "Access token not updated"
-msgstr "Token de acceso no actualizado"
-
-#: routes/users.js:139
-msgid "Account information updated"
-msgstr "Información de cuenta actualizada"
-
-#: routes/users.js:141
-msgid "Account information not updated"
-msgstr "Información de cuenta no actualizada"
-
-#: services/feedcheck.js:51
-msgid "Feed error: %s"
-msgstr "Error de Feed: %s"
-
-#: services/feedcheck.js:54
-msgid "Found %s new campaign messages from feed"
-msgstr "Encontrado %s nueva campaña de mensajes desde Feed"
-
-#: services/feedcheck.js:56
-msgid "Found nothing new from the feed"
-msgstr "No se ha encontrado nada nuevo en el Feed"
-
-#: services/feedcheck.js:146
-msgid "RSS entry %s"
-msgstr "Entrada RSS %s"
-
-#: services/importer.js:249
-msgid "Could not access import file"
-msgstr "No se pudo acceder al archivo de importación"
-
-#: services/triggers.js:51
-msgid "Unknown trigger type %s"
-msgstr "Desconocido tipo de Trigger %s"
diff --git a/languages/et.mo b/languages/et.mo
deleted file mode 100644
index 18e5f344..00000000
Binary files a/languages/et.mo and /dev/null differ
diff --git a/languages/et.po b/languages/et.po
deleted file mode 100644
index 88ad5bdb..00000000
--- a/languages/et.po
+++ /dev/null
@@ -1,3551 +0,0 @@
-msgid ""
-msgstr ""
-"Project-Id-Version: \n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-03-07 21:44+0200\n"
-"PO-Revision-Date: 2017-03-08 20:25+0200\n"
-"Last-Translator: \n"
-"Language-Team: \n"
-"Language: et\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Poedit 1.8.12\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-#: views/archive/layout.hbs:1 views/layout.hbs:1
-#: views/subscription/layout.hbs:1 routes/index.js:11
-msgid "Self hosted email newsletter app"
-msgstr "Enda majutatud e-posti uudiskirjade rakendus"
-
-#: views/campaigns/bounced.hbs:1 views/campaigns/campaigns.hbs:1
-#: views/campaigns/clicked.hbs:1 views/campaigns/complained.hbs:1
-#: views/campaigns/create-rss.hbs:1 views/campaigns/create-triggered.hbs:1
-#: views/campaigns/create.hbs:1 views/campaigns/delivered.hbs:1
-#: views/campaigns/edit-rss.hbs:1 views/campaigns/edit-triggered.hbs:1
-#: views/campaigns/edit.hbs:1 views/campaigns/opened.hbs:1
-#: views/campaigns/unsubscribed.hbs:1 views/campaigns/upload-attachment.hbs:1
-#: views/campaigns/view.hbs:1 views/lists/create.hbs:1 views/lists/edit.hbs:1
-#: views/lists/fields/create.hbs:1 views/lists/fields/edit.hbs:1
-#: views/lists/fields/fields.hbs:1 views/lists/lists.hbs:1
-#: views/lists/segments/create.hbs:1 views/lists/segments/edit.hbs:1
-#: views/lists/segments/rule-configure.hbs:1
-#: views/lists/segments/rule-create.hbs:1 views/lists/segments/rule-edit.hbs:1
-#: views/lists/segments/segments.hbs:1 views/lists/segments/view.hbs:1
-#: views/lists/subscription/add.hbs:1 views/lists/subscription/edit.hbs:1
-#: views/lists/subscription/import-failed.hbs:1
-#: views/lists/subscription/import-preview.hbs:1
-#: views/lists/subscription/import.hbs:1 views/lists/view.hbs:1
-#: views/settings.hbs:1 views/templates/create.hbs:1 views/templates/edit.hbs:1
-#: views/templates/templates.hbs:1 views/triggers/create-select.hbs:1
-#: views/triggers/create.hbs:1 views/triggers/edit.hbs:1
-#: views/triggers/triggered.hbs:1 views/triggers/triggers.hbs:1
-#: views/users/account.hbs:1 views/users/api.hbs:1 views/users/forgot.hbs:1
-#: views/users/login.hbs:1 views/users/reset.hbs:1 app.js:169
-msgid "Home"
-msgstr "Esileht"
-
-#: views/campaigns/bounced.hbs:2 views/campaigns/campaigns.hbs:2
-#: views/campaigns/campaigns.hbs:7 views/campaigns/clicked.hbs:2
-#: views/campaigns/complained.hbs:2 views/campaigns/create-rss.hbs:2
-#: views/campaigns/create-triggered.hbs:2 views/campaigns/create.hbs:2
-#: views/campaigns/delivered.hbs:2 views/campaigns/edit-rss.hbs:2
-#: views/campaigns/edit-triggered.hbs:2 views/campaigns/edit.hbs:2
-#: views/campaigns/opened.hbs:2 views/campaigns/unsubscribed.hbs:2
-#: views/campaigns/upload-attachment.hbs:2 views/campaigns/view.hbs:2
-#: lib/tools.js:119 routes/campaigns.js:35
-msgid "Campaigns"
-msgstr "Kampaaniad"
-
-#: views/campaigns/bounced.hbs:3 views/campaigns/bounced.hbs:4
-msgid "Bounced info"
-msgstr "Tagasipõrgete info"
-
-#: views/campaigns/bounced.hbs:5 views/campaigns/clicked.hbs:5
-#: views/campaigns/complained.hbs:5 views/campaigns/delivered.hbs:5
-#: views/campaigns/edit-rss.hbs:5 views/campaigns/edit-triggered.hbs:5
-#: views/campaigns/edit.hbs:5 views/campaigns/opened.hbs:5
-#: views/campaigns/unsubscribed.hbs:5 views/campaigns/upload-attachment.hbs:6
-msgid "View campaign"
-msgstr "Vaata kampaaniat"
-
-#: views/campaigns/bounced.hbs:6
-msgid "Subscribers who bounced and were unsubscribed:"
-msgstr "Liikmed, kes põrkusid tagasi:"
-
-#: views/campaigns/bounced.hbs:7 views/campaigns/clicked.hbs:13
-#: views/campaigns/complained.hbs:7 views/campaigns/delivered.hbs:7
-#: views/campaigns/opened.hbs:7 views/campaigns/unsubscribed.hbs:7
-#: views/lists/subscription/import-failed.hbs:9 views/lists/view.hbs:18
-#: views/triggers/triggered.hbs:6
-msgid "Address"
-msgstr "Aadress"
-
-#: views/campaigns/bounced.hbs:8 views/campaigns/clicked.hbs:14
-#: views/campaigns/complained.hbs:8 views/campaigns/delivered.hbs:8
-#: views/campaigns/opened.hbs:8 views/campaigns/unsubscribed.hbs:8
-#: views/lists/subscription/add.hbs:6 views/lists/subscription/edit.hbs:7
-#: views/lists/subscription/import-preview.hbs:7 views/lists/view.hbs:19
-#: views/subscription/manage.hbs:4 views/subscription/subscribe.hbs:4
-#: views/triggers/triggered.hbs:7
-msgid "First Name"
-msgstr "Eesnimi"
-
-#: views/campaigns/bounced.hbs:9 views/campaigns/clicked.hbs:15
-#: views/campaigns/complained.hbs:9 views/campaigns/delivered.hbs:9
-#: views/campaigns/opened.hbs:9 views/campaigns/unsubscribed.hbs:9
-#: views/lists/subscription/add.hbs:7 views/lists/subscription/edit.hbs:8
-#: views/lists/subscription/import-preview.hbs:8 views/lists/view.hbs:20
-#: views/subscription/manage.hbs:5 views/subscription/subscribe.hbs:5
-#: views/triggers/triggered.hbs:8
-msgid "Last Name"
-msgstr "Perekonnanimi"
-
-#: views/campaigns/bounced.hbs:10 views/campaigns/complained.hbs:10
-#: views/campaigns/delivered.hbs:10 views/campaigns/unsubscribed.hbs:10
-msgid "SMTP response"
-msgstr "SMTP vastus"
-
-#: views/campaigns/bounced.hbs:11
-msgid "Bounce time"
-msgstr "Tagasipõrke aeg"
-
-#: views/campaigns/campaigns.hbs:3 views/campaigns/create-triggered.hbs:24
-#: views/campaigns/create.hbs:3 views/campaigns/create.hbs:4
-#: views/campaigns/create.hbs:27
-msgid "Create Campaign"
-msgstr "Loo kampaania"
-
-#: views/campaigns/campaigns.hbs:4
-msgid "Regular Campaign"
-msgstr "Tavaline kampaania"
-
-#: views/campaigns/campaigns.hbs:5
-msgid "RSS Campaign"
-msgstr "RSS kampaania"
-
-#: views/campaigns/campaigns.hbs:6
-msgid "Triggered Campaign"
-msgstr "Automaatkampaania"
-
-#: views/campaigns/campaigns.hbs:8 views/campaigns/create-rss.hbs:6
-#: views/campaigns/create-triggered.hbs:5 views/campaigns/create.hbs:5
-#: views/campaigns/edit-rss.hbs:8 views/campaigns/edit-triggered.hbs:9
-#: views/campaigns/edit.hbs:10 views/campaigns/view.hbs:71
-#: views/lists/create.hbs:5 views/lists/edit.hbs:6
-#: views/lists/fields/fields.hbs:6 views/lists/lists.hbs:5
-#: views/lists/segments/segments.hbs:6 views/templates/templates.hbs:5
-#: views/triggers/triggers.hbs:5
-msgid "Name"
-msgstr "Nimi"
-
-#: views/campaigns/campaigns.hbs:9 views/campaigns/create-rss.hbs:8
-#: views/campaigns/create-triggered.hbs:7 views/campaigns/create.hbs:7
-#: views/campaigns/edit-rss.hbs:10 views/campaigns/edit-triggered.hbs:11
-#: views/campaigns/edit.hbs:12 views/campaigns/view.hbs:72
-#: views/lists/create.hbs:7 views/lists/edit.hbs:10 views/lists/lists.hbs:8
-#: views/partials/merge-tag-reference.hbs:4 views/templates/create.hbs:9
-#: views/templates/edit.hbs:8 views/templates/templates.hbs:6
-#: views/triggers/create.hbs:7 views/triggers/edit.hbs:8
-#: views/triggers/triggers.hbs:7
-msgid "Description"
-msgstr "Kirjeldus"
-
-#: views/campaigns/campaigns.hbs:10 views/campaigns/view.hbs:73
-#: views/lists/view.hbs:21 views/lists/view.hbs:29
-#: views/triggers/triggers.hbs:6
-msgid "Status"
-msgstr "Staatus"
-
-#: views/campaigns/campaigns.hbs:11 views/campaigns/view.hbs:74
-#: views/lists/view.hbs:22 views/lists/view.hbs:23
-msgid "Created"
-msgstr "Loodud"
-
-#: views/campaigns/clicked.hbs:3 views/campaigns/clicked.hbs:4
-msgid "Link info"
-msgstr "Lingi info"
-
-#: views/campaigns/clicked.hbs:6 views/campaigns/view.hbs:61
-msgid "URL"
-msgstr "URL"
-
-#: views/campaigns/clicked.hbs:7 views/campaigns/view.hbs:62
-msgid "Clicks"
-msgstr "Klikke"
-
-#: views/campaigns/clicked.hbs:8 views/campaigns/view.hbs:63
-msgid "% of clicks"
-msgstr "% klikkidest"
-
-#: views/campaigns/clicked.hbs:9 views/campaigns/view.hbs:64
-msgid "% of messages"
-msgstr "% kirjadest"
-
-#: views/campaigns/clicked.hbs:10 views/campaigns/view.hbs:67
-msgid "Aggregated clicks"
-msgstr "Agregeeritud klikid"
-
-#: views/campaigns/clicked.hbs:11
-msgid "Subscribers who clicked on a link:"
-msgstr "Liikmes, kes klikkisid lingile"
-
-#: views/campaigns/clicked.hbs:12
-msgid "Subscribers who clicked on this link:"
-msgstr "Liikmed, kes klikkisid sellele lingile"
-
-#: views/campaigns/clicked.hbs:16
-msgid "First click time"
-msgstr "Esimese kliki aeg"
-
-#: views/campaigns/clicked.hbs:17
-msgid "Click count"
-msgstr "Klikkide arv"
-
-#: views/campaigns/complained.hbs:3 views/campaigns/complained.hbs:4
-msgid "Complained info"
-msgstr "Kaebuste info"
-
-#: views/campaigns/complained.hbs:6
-msgid "Subscribers who complained and were unsubscribed:"
-msgstr "Liikmed, kes kaebasid ja kes eemaldati listist:"
-
-#: views/campaigns/complained.hbs:11
-msgid "Complain time"
-msgstr "Kaebuse aeg"
-
-#: views/campaigns/create-rss.hbs:3 views/campaigns/create-rss.hbs:4
-#: views/campaigns/create-rss.hbs:20
-msgid "Create RSS Campaign"
-msgstr "Loo RSS kampaania"
-
-#: views/campaigns/create-rss.hbs:5 views/campaigns/edit-rss.hbs:6
-msgid ""
-"RSS campaign sets up a tracker against selected RSS feed address. Whenever a "
-"new entry is found from this feed it is sent to selected list as an email "
-"message."
-msgstr ""
-"RSS kampaania seab üles träkkeri RSS aadressi pihta. Kui sellest leitakse "
-"uus postitus, siis see saadetakse valitud listile uue kirjana"
-
-#: views/campaigns/create-rss.hbs:7 views/campaigns/create-triggered.hbs:6
-#: views/campaigns/create.hbs:6 views/campaigns/edit-rss.hbs:9
-#: views/campaigns/edit-triggered.hbs:10 views/campaigns/edit.hbs:11
-msgid "Campaign Name"
-msgstr "Kampaania nimi"
-
-#: views/campaigns/create-rss.hbs:9 views/campaigns/create-triggered.hbs:8
-#: views/campaigns/create.hbs:8 views/campaigns/edit-rss.hbs:11
-#: views/campaigns/edit-triggered.hbs:12 views/campaigns/edit.hbs:13
-#: views/lists/create.hbs:8 views/lists/edit.hbs:11
-#: views/templates/create.hbs:11 views/templates/edit.hbs:10
-#: views/triggers/create.hbs:9 views/triggers/edit.hbs:10
-msgid "HTML is allowed"
-msgstr "HTML kasutamine on lubatud"
-
-#: views/campaigns/create-rss.hbs:10 views/campaigns/create-triggered.hbs:9
-#: views/campaigns/create.hbs:9 views/campaigns/edit-rss.hbs:12
-#: views/campaigns/edit-triggered.hbs:13 views/campaigns/edit.hbs:14
-#: views/campaigns/view.hbs:6 views/triggers/create-select.hbs:6
-#: views/triggers/create.hbs:10 views/triggers/edit.hbs:12
-#: views/triggers/triggers.hbs:8
-msgid "List"
-msgstr "List"
-
-#: views/campaigns/create-rss.hbs:11 views/campaigns/create-triggered.hbs:10
-#: views/campaigns/create-triggered.hbs:13 views/campaigns/create.hbs:10
-#: views/campaigns/create.hbs:14 views/campaigns/edit-rss.hbs:13
-#: views/campaigns/edit-triggered.hbs:14 views/campaigns/edit.hbs:15
-#: views/lists/fields/create.hbs:27 views/lists/fields/edit.hbs:28
-#: views/lists/segments/create.hbs:9 views/lists/segments/edit.hbs:10
-#: views/lists/segments/rule-create.hbs:7 views/lists/subscription/add.hbs:10
-#: views/lists/subscription/add.hbs:12 views/lists/subscription/edit.hbs:11
-#: views/lists/subscription/import-preview.hbs:5
-#: views/subscription/manage.hbs:10 views/subscription/subscribe.hbs:10
-#: views/templates/create.hbs:8 views/triggers/create-select.hbs:7
-#: views/triggers/create.hbs:17 views/triggers/create.hbs:20
-#: views/triggers/create.hbs:22 views/triggers/create.hbs:26
-#: views/triggers/edit.hbs:19 views/triggers/edit.hbs:22
-#: views/triggers/edit.hbs:24 views/triggers/edit.hbs:28
-msgid "Select"
-msgstr "Vali"
-
-#: views/campaigns/create-rss.hbs:12 views/campaigns/create-triggered.hbs:11
-#: views/campaigns/create.hbs:11 views/campaigns/edit-rss.hbs:14
-#: views/campaigns/edit-triggered.hbs:15 views/campaigns/edit.hbs:16
-#: views/triggers/create-select.hbs:8 views/triggers/create.hbs:11
-#: views/triggers/edit.hbs:13
-msgid "subscribers"
-msgstr "liiget"
-
-#: views/campaigns/create-rss.hbs:13 views/campaigns/edit-rss.hbs:15
-msgid "RSS Feed Url"
-msgstr "RSS voo aadress"
-
-#: views/campaigns/create-rss.hbs:14 views/campaigns/edit-rss.hbs:16
-msgid ""
-"New entries from this RSS URL are sent out to list subscribers as email "
-"messages"
-msgstr ""
-"Uued postitused sellest RSS voost saadetakse listi liikmete uue kirjana"
-
-#: views/campaigns/create-rss.hbs:15 views/campaigns/create-triggered.hbs:17
-#: views/campaigns/create.hbs:18 views/campaigns/edit-rss.hbs:18
-#: views/campaigns/edit-triggered.hbs:16 views/campaigns/edit.hbs:17
-#: views/campaigns/view.hbs:12
-msgid "Email \"from name\""
-msgstr "E-posti “saatja nimi”"
-
-#: views/campaigns/create-rss.hbs:16 views/campaigns/create-triggered.hbs:18
-#: views/campaigns/create.hbs:19 views/campaigns/edit-rss.hbs:19
-#: views/campaigns/edit.hbs:18 views/settings.hbs:23
-msgid "This is the name your emails will come from"
-msgstr "Seda nime näidatakse kirja saatja nimena"
-
-#: views/campaigns/create-rss.hbs:17 views/campaigns/create-triggered.hbs:19
-#: views/campaigns/create.hbs:20 views/campaigns/edit-rss.hbs:20
-#: views/campaigns/edit-triggered.hbs:18 views/campaigns/edit.hbs:19
-#: views/campaigns/view.hbs:13
-msgid "Email \"from\" address"
-msgstr "E-posti “saatja” aadress"
-
-#: views/campaigns/create-rss.hbs:18 views/campaigns/create-triggered.hbs:20
-#: views/campaigns/edit-rss.hbs:21 views/campaigns/edit-triggered.hbs:19
-#: views/settings.hbs:25
-msgid "This is the address people will send replies to"
-msgstr "Sellele aadressile saadavad inimesed vastuseid"
-
-#: views/campaigns/create-rss.hbs:19 views/campaigns/create-triggered.hbs:23
-#: views/campaigns/create.hbs:26 views/campaigns/edit-rss.hbs:22
-#: views/campaigns/edit-triggered.hbs:22 views/campaigns/edit.hbs:25
-msgid "Disable clicked/opened tracking"
-msgstr "Lülita välja klikkide ja avamiste träkkimine"
-
-#: views/campaigns/create-triggered.hbs:3
-#: views/campaigns/create-triggered.hbs:4
-msgid "Create Triggered Campaign"
-msgstr "Loo automaatkampaania"
-
-#: views/campaigns/create-triggered.hbs:12 views/campaigns/create.hbs:12
-#: views/campaigns/edit-triggered.hbs:7 views/campaigns/edit.hbs:7
-#: views/lists/fields/create.hbs:31 views/lists/fields/edit.hbs:33
-#: views/templates/create.hbs:13
-msgid "Template"
-msgstr "Templiit"
-
-#: views/campaigns/create-triggered.hbs:14 views/campaigns/create.hbs:15
-msgid "Selecting a template creates a campaign specific copy from it"
-msgstr "Templiidi valimine tekitab sellest kampaania jaoks eraldi koopia"
-
-#: views/campaigns/create-triggered.hbs:15 views/campaigns/create.hbs:16
-msgid "Or alternatively use an URL as the message content source:"
-msgstr "Või alternatiivselt kasuta veebiaadressi kirja sisu jaoks"
-
-#: views/campaigns/create-triggered.hbs:16 views/campaigns/create.hbs:17
-#: views/campaigns/edit-triggered.hbs:25 views/campaigns/edit.hbs:28
-msgid ""
-"If a message is sent then this URL will be POSTed to using Merge Tags as "
-"POST body. Use this if you want to generate the HTML message yourself"
-msgstr ""
-"Kirja saatmiselt tehakse selle aadressi pihta POST päring koos "
-"täiteväljadega. Kasuta seda võimalust, kui soovid HTML sisu genereerida "
-"omaenda skriptiga"
-
-#: views/campaigns/create-triggered.hbs:21 views/campaigns/create.hbs:24
-#: views/campaigns/edit-triggered.hbs:20 views/campaigns/edit.hbs:23
-#: views/campaigns/view.hbs:15
-msgid "Email \"subject line\""
-msgstr ""
-
-#: views/campaigns/create-triggered.hbs:22 views/campaigns/create.hbs:25
-#: views/campaigns/edit-triggered.hbs:21 views/campaigns/edit.hbs:24
-#: views/settings.hbs:27
-msgid "Keep it relevant and non-spammy"
-msgstr ""
-
-#: views/campaigns/create.hbs:13
-msgid "Select a template:"
-msgstr ""
-
-#: views/campaigns/create.hbs:21 views/campaigns/edit.hbs:20
-msgid ""
-"This is the address people will send replies to unless reply-to address is "
-"set"
-msgstr ""
-
-#: views/campaigns/create.hbs:22 views/campaigns/edit.hbs:21
-#: views/campaigns/view.hbs:14
-msgid "Email \"reply-to\" address"
-msgstr ""
-
-#: views/campaigns/create.hbs:23 views/campaigns/edit.hbs:22
-msgid "If set, this is the address people will send replies to"
-msgstr ""
-
-#: views/campaigns/delivered.hbs:3 views/campaigns/delivered.hbs:4
-msgid "Delivered info"
-msgstr ""
-
-#: views/campaigns/delivered.hbs:6
-msgid "Subscribers who received the message and did not bounce/unsubscribe:"
-msgstr ""
-
-#: views/campaigns/delivered.hbs:11
-msgid "Delivery time"
-msgstr ""
-
-#: views/campaigns/edit-rss.hbs:3 views/campaigns/edit-rss.hbs:4
-msgid "Edit RSS Campaign"
-msgstr ""
-
-#: views/campaigns/edit-rss.hbs:7 views/campaigns/edit-triggered.hbs:8
-#: views/campaigns/edit.hbs:9 views/settings.hbs:4 views/users/account.hbs:6
-msgid "General Settings"
-msgstr ""
-
-#: views/campaigns/edit-rss.hbs:17
-msgid ""
-"Use special merge tag [RSS_ENTRY] to mark the position for the RSS post "
-"content. Additionally you can use any valid merge tag as well."
-msgstr ""
-
-#: views/campaigns/edit-rss.hbs:23 views/campaigns/edit-triggered.hbs:26
-#: views/campaigns/edit.hbs:34
-msgid "Delete Campaign"
-msgstr ""
-
-#: views/campaigns/edit-rss.hbs:24 views/campaigns/edit-triggered.hbs:27
-#: views/campaigns/edit.hbs:35 views/lists/edit.hbs:13
-#: views/lists/fields/edit.hbs:39 views/lists/segments/edit.hbs:14
-#: views/lists/segments/rule-edit.hbs:38 views/lists/subscription/edit.hbs:17
-#: views/settings.hbs:99 views/templates/edit.hbs:12 views/triggers/edit.hbs:30
-#: views/users/account.hbs:18
-msgid "Update"
-msgstr ""
-
-#: views/campaigns/edit-triggered.hbs:3 views/campaigns/edit-triggered.hbs:4
-msgid "Edit Triggered Campaign"
-msgstr ""
-
-#: views/campaigns/edit-triggered.hbs:6 views/campaigns/edit.hbs:6
-msgid "General"
-msgstr ""
-
-#: views/campaigns/edit-triggered.hbs:17
-msgid "his is the name your emails will come from"
-msgstr ""
-
-#: views/campaigns/edit-triggered.hbs:23 views/campaigns/edit.hbs:26
-msgid "Template Settings"
-msgstr ""
-
-#: views/campaigns/edit-triggered.hbs:24 views/campaigns/edit.hbs:27
-msgid "Template URL"
-msgstr ""
-
-#: views/campaigns/edit.hbs:3 views/campaigns/edit.hbs:4
-#: views/campaigns/upload-attachment.hbs:3
-#: views/campaigns/upload-attachment.hbs:5 views/campaigns/view.hbs:3
-msgid "Edit Campaign"
-msgstr ""
-
-#: views/campaigns/edit.hbs:8 views/campaigns/edit.hbs:29
-msgid "Attachments"
-msgstr ""
-
-#: views/campaigns/edit.hbs:30
-msgid "File"
-msgstr ""
-
-#: views/campaigns/edit.hbs:31
-msgid "Size"
-msgstr ""
-
-#: views/campaigns/edit.hbs:32 views/campaigns/view.hbs:66
-#: views/lists/fields/fields.hbs:12 views/lists/view.hbs:32
-msgid "No data available in table"
-msgstr ""
-
-#: views/campaigns/edit.hbs:33 views/campaigns/upload-attachment.hbs:4
-msgid "Add Attachment"
-msgstr ""
-
-#: views/campaigns/opened.hbs:3 views/campaigns/opened.hbs:4
-msgid "Opened info"
-msgstr ""
-
-#: views/campaigns/opened.hbs:6
-msgid "Subscribers who opened this message:"
-msgstr ""
-
-#: views/campaigns/opened.hbs:10
-msgid "First open"
-msgstr ""
-
-#: views/campaigns/opened.hbs:11
-msgid "Opened count"
-msgstr ""
-
-#: views/campaigns/unsubscribed.hbs:3 views/campaigns/unsubscribed.hbs:4
-msgid "Unsubscribed info"
-msgstr ""
-
-#: views/campaigns/unsubscribed.hbs:6
-msgid "Subscribers who unsubscribed:"
-msgstr ""
-
-#: views/campaigns/unsubscribed.hbs:11 views/campaigns/view.hbs:26
-#: views/lists/subscription/import.hbs:10 routes/lists.js:171
-msgid "Unsubscribed"
-msgstr ""
-
-#: views/campaigns/upload-attachment.hbs:7
-msgid "Upload"
-msgstr ""
-
-#: views/campaigns/view.hbs:4
-msgid "Overview"
-msgstr ""
-
-#: views/campaigns/view.hbs:5
-msgid "Links"
-msgstr ""
-
-#: views/campaigns/view.hbs:7
-msgid "Feed URL"
-msgstr ""
-
-#: views/campaigns/view.hbs:8
-msgid "Last check"
-msgstr ""
-
-#: views/campaigns/view.hbs:9
-msgid "Not yet checked"
-msgstr ""
-
-#: views/campaigns/view.hbs:10
-msgid "activate campaign to start checking feed for new messages"
-msgstr ""
-
-#: views/campaigns/view.hbs:11
-msgid "RSS status"
-msgstr ""
-
-#: views/campaigns/view.hbs:16
-msgid "Preview campaign as"
-msgstr ""
-
-#: views/campaigns/view.hbs:17
-msgid "Add new test user"
-msgstr ""
-
-#: views/campaigns/view.hbs:18
-msgid "No test users yet, create one here"
-msgstr ""
-
-#: views/campaigns/view.hbs:19
-msgid "Go"
-msgstr ""
-
-#: views/campaigns/view.hbs:20 lib/models/triggers.js:25
-msgid "Delivered"
-msgstr ""
-
-#: views/campaigns/view.hbs:21
-msgid "List subscribers who received this message"
-msgstr ""
-
-#: views/campaigns/view.hbs:22 routes/lists.js:171
-msgid "Bounced"
-msgstr ""
-
-#: views/campaigns/view.hbs:23
-msgid "List subscribers who bounced"
-msgstr ""
-
-#: views/campaigns/view.hbs:24
-msgid "Complaints"
-msgstr ""
-
-#: views/campaigns/view.hbs:25
-msgid "List subscribers who complained for this message"
-msgstr ""
-
-#: views/campaigns/view.hbs:27
-msgid "List subscribers who unsubscribed after this message"
-msgstr ""
-
-#: views/campaigns/view.hbs:28
-msgid "Opened"
-msgstr ""
-
-#: views/campaigns/view.hbs:29
-msgid "List subscribers who opened this message"
-msgstr ""
-
-#: views/campaigns/view.hbs:30
-msgid "Clicked"
-msgstr ""
-
-#: views/campaigns/view.hbs:31 views/campaigns/view.hbs:68
-msgid "List subscribers who clicked on a link"
-msgstr ""
-
-#: views/campaigns/view.hbs:32
-msgid ""
-"Are you sure? This action would start sending messages to the selected list"
-msgstr ""
-
-#: views/campaigns/view.hbs:33
-msgid "Delay sending"
-msgstr ""
-
-#: views/campaigns/view.hbs:34
-msgid "hours"
-msgstr ""
-
-#: views/campaigns/view.hbs:35
-msgid "minutes"
-msgstr ""
-
-#: views/campaigns/view.hbs:36
-msgid "Send to subscribers:"
-msgstr ""
-
-#: views/campaigns/view.hbs:37
-msgid "Are you sure? This action would reset scheduling"
-msgstr ""
-
-#: views/campaigns/view.hbs:38
-msgid "Cancel"
-msgstr ""
-
-#: views/campaigns/view.hbs:39
-msgid "Sending scheduled"
-msgstr ""
-
-#: views/campaigns/view.hbs:40 views/campaigns/view.hbs:52
-msgid "Pause"
-msgstr ""
-
-#: views/campaigns/view.hbs:41 routes/campaigns.js:264
-msgid "Sending"
-msgstr ""
-
-#: views/campaigns/view.hbs:42 views/campaigns/view.hbs:46
-msgid ""
-"Are you sure? This action would resume sending messages to the selected list"
-msgstr ""
-
-#: views/campaigns/view.hbs:43 views/campaigns/view.hbs:47
-msgid "Are you sure? This action would reset all stats about current progress"
-msgstr ""
-
-#: views/campaigns/view.hbs:44
-msgid "Resume"
-msgstr ""
-
-#: views/campaigns/view.hbs:45 views/campaigns/view.hbs:49
-msgid "Reset"
-msgstr ""
-
-#: views/campaigns/view.hbs:48
-msgid "Continue"
-msgstr ""
-
-#: views/campaigns/view.hbs:50
-msgid ""
-"All messages sent! Hit \"Continue\" if you you want to send this campaign to "
-"new subscribers"
-msgstr ""
-
-#: views/campaigns/view.hbs:51
-msgid ""
-"Are you sure? This action would pause sending new entries in RSS feed as "
-"email messages to the selected list"
-msgstr ""
-
-#: views/campaigns/view.hbs:53 views/campaigns/view.hbs:57
-msgid "Campaign status:"
-msgstr ""
-
-#: views/campaigns/view.hbs:54
-msgid "ACTIVE"
-msgstr ""
-
-#: views/campaigns/view.hbs:55
-msgid ""
-"Are you sure? This action would start sending new entries in RSS feed as "
-"email messages to the selected list"
-msgstr ""
-
-#: views/campaigns/view.hbs:56
-msgid "Activate"
-msgstr ""
-
-#: views/campaigns/view.hbs:58
-msgid "INACTIVE"
-msgstr ""
-
-#: views/campaigns/view.hbs:59
-msgid ""
-"This is a triggered campaign. Messages are only sent to subscribers that hit "
-"some trigger that invokes this campaign"
-msgstr ""
-
-#: views/campaigns/view.hbs:60
-msgid "see more"
-msgstr ""
-
-#: views/campaigns/view.hbs:65
-msgid "List subscribers who clicked this link"
-msgstr ""
-
-#: views/campaigns/view.hbs:69
-msgid ""
-"Clicks are counted as unique subscribers that clicked on a specific link or "
-"on any link (in aggregated view)"
-msgstr ""
-
-#: views/campaigns/view.hbs:70
-msgid ""
-"If a new entry is found from campaign feed a new subcampaign is created of "
-"that entry and it will be listed here"
-msgstr ""
-
-#: views/emails/confirm-html.hbs:1 views/emails/confirm-html.hbs:2
-#: views/emails/confirm-text.hbs:1
-msgid "Please Confirm Subscription"
-msgstr "Palun kinnita oma liitumissoov"
-
-#: views/emails/confirm-html.hbs:3 views/emails/confirm-text.hbs:2
-msgid "Yes, subscribe me to this list"
-msgstr "Jah, soovin liituda selle listiga"
-
-#: views/emails/confirm-html.hbs:4
-msgid ""
-"If you received this email by mistake, simply delete it. You won't be "
-"subscribed if you don't click the confirmation link above."
-msgstr ""
-"Kui said selle kirja kogemata, siis lihtsalt kustuta see. Sind ei lisata "
-"listi, kui sa ei kliki allolevale kinnituslingile"
-
-#: views/emails/confirm-html.hbs:5 views/emails/confirm-text.hbs:4
-#: views/emails/subscription-confirmed-html.hbs:7
-#: views/emails/subscription-confirmed-text.hbs:7
-#: views/emails/unsubscribe-confirmed-html.hbs:5
-#: views/emails/unsubscribe-confirmed-text.hbs:5
-msgid "For questions about this list, please contact:"
-msgstr "Küsimustega seoses selle listiga võta ühendust järgmisel aadressil:"
-
-#: views/emails/confirm-text.hbs:3
-msgid ""
-"If you received this email by mistake, simply delete it. You won't be "
-"subscribed unless you click the confirmation link above."
-msgstr ""
-
-#: views/emails/password-reset-html.hbs:1
-#: views/emails/password-reset-html.hbs:2
-#: views/emails/password-reset-text.hbs:1
-msgid "Change your password"
-msgstr ""
-
-#: views/emails/password-reset-html.hbs:3
-#: views/emails/password-reset-text.hbs:2
-msgid "We have received a password change request for your Mailtrain account:"
-msgstr ""
-
-#: views/emails/password-reset-html.hbs:4
-#: views/emails/password-reset-text.hbs:3
-msgid "Reset password"
-msgstr ""
-
-#: views/emails/password-reset-html.hbs:5
-#: views/emails/password-reset-text.hbs:4
-msgid ""
-"If you did not ask to change your password, then you can ignore this email "
-"and your password will not be changed."
-msgstr ""
-
-#: views/emails/rss-html.hbs:1 views/emails/stationery-html.hbs:3
-#: views/emails/stationery-text.hbs:3
-msgid "Preferences"
-msgstr ""
-
-#: views/emails/rss-html.hbs:2 views/emails/stationery-html.hbs:4
-#: views/emails/stationery-text.hbs:4 views/lists/subscription/edit.hbs:15
-#: views/subscription/manage.hbs:12 views/subscription/unsubscribe.hbs:1
-#: views/subscription/unsubscribe.hbs:4 routes/lists.js:253
-msgid "Unsubscribe"
-msgstr ""
-
-#: views/emails/rss-html.hbs:3 views/emails/stationery-html.hbs:5
-#: views/emails/stationery-text.hbs:5
-msgid "View this email in your browser"
-msgstr ""
-
-#: views/emails/stationery-html.hbs:1 views/emails/stationery-text.hbs:1
-msgid "Hey [FIRST_NAME/Customer],"
-msgstr ""
-
-#: views/emails/stationery-html.hbs:2 views/emails/stationery-text.hbs:2
-msgid "Cheers,"
-msgstr ""
-
-#: views/emails/subscription-confirmed-html.hbs:1
-#: views/emails/subscription-confirmed-text.hbs:1
-#: views/subscription/subscribed.hbs:1
-msgid "Subscription Confirmed"
-msgstr ""
-
-#: views/emails/subscription-confirmed-html.hbs:2
-#: views/emails/subscription-confirmed-text.hbs:2
-#: views/subscription/subscribed.hbs:2
-msgid "Your subscription to our list has been confirmed."
-msgstr ""
-
-#: views/emails/subscription-confirmed-html.hbs:3
-#: views/emails/subscription-confirmed-text.hbs:3
-msgid "If you want to modify your subscription then you can:"
-msgstr ""
-
-#: views/emails/subscription-confirmed-html.hbs:4
-#: views/emails/subscription-confirmed-text.hbs:4
-#: views/subscription/subscribed.hbs:6
-msgid "manage your preferences"
-msgstr ""
-
-#: views/emails/subscription-confirmed-html.hbs:5
-#: views/emails/subscription-confirmed-text.hbs:5
-#: views/subscription/subscribed.hbs:5 views/users/login.hbs:10
-msgid "or"
-msgstr ""
-
-#: views/emails/subscription-confirmed-html.hbs:6
-#: views/emails/subscription-confirmed-text.hbs:6
-msgid "unsubscribe here"
-msgstr ""
-
-#: views/emails/unsubscribe-confirmed-html.hbs:1
-#: views/emails/unsubscribe-confirmed-text.hbs:1
-msgid "You are now unsubscribed"
-msgstr ""
-
-#: views/emails/unsubscribe-confirmed-html.hbs:2
-#: views/emails/unsubscribe-confirmed-text.hbs:2
-msgid "We have removed your email address from our list."
-msgstr ""
-
-#: views/emails/unsubscribe-confirmed-html.hbs:3
-#: views/emails/unsubscribe-confirmed-text.hbs:3
-msgid "If you unsubscribed by mistake, you can re-subscribe at:"
-msgstr ""
-
-#: views/emails/unsubscribe-confirmed-html.hbs:4
-#: views/emails/unsubscribe-confirmed-text.hbs:4
-#: views/lists/subscription/add.hbs:16 routes/lists.js:253
-msgid "Subscribe"
-msgstr ""
-
-#: views/index.hbs:1
-msgid "Official Mailtrain Partners"
-msgstr "Ametlikud Mailtraini partnerid"
-
-#: views/index.hbs:2
-msgid "Free, open source mail server solution"
-msgstr ""
-
-#: views/index.hbs:3
-msgid ""
-"A reliable SMTP server, easy integration, and 12,000 messages a month free"
-msgstr ""
-
-#: views/index.hbs:4
-msgid "List management"
-msgstr ""
-
-#: views/index.hbs:5
-msgid ""
-"Mailtrain allows you to easily manage even very large lists. Million "
-"subscribers? Not a problem. You can add subscribers manually, through the "
-"API or import from a CSV file. All lists come with support for custom fields "
-"and merge tags as well."
-msgstr ""
-
-#: views/index.hbs:6
-msgid "Custom fields"
-msgstr ""
-
-#: views/index.hbs:7
-msgid ""
-"Text fields, numbers, drop downs or checkboxes, Mailtrain has them all. "
-"Every custom field can be included in the generated newsletters through "
-"merge tags."
-msgstr ""
-
-#: views/index.hbs:8
-msgid "List segmentation"
-msgstr ""
-
-#: views/index.hbs:9
-msgid ""
-"Send messages only to list subscribers that match predefined segmentation "
-"rules. No need to create separate lists with small differences."
-msgstr ""
-
-#: views/index.hbs:10
-msgid "Donate to author"
-msgstr ""
-
-#: views/index.hbs:11
-msgid ""
-"If you really like Mailtrain or your business benefits from it financially "
-"then I would really appreciate a small donation to keep the Mailtrain "
-"development engines running. You can either use Bitcoin or PayPal for "
-"donations. My Bitcoin wallet is 15Z8ADxhssKUiwP3jbbqJwA21744KMCfTM"
-"code>"
-msgstr ""
-
-#: views/index.hbs:12
-msgid "or donate using PayPal"
-msgstr ""
-
-#: views/index.hbs:13
-msgid "RSS Campaigns"
-msgstr ""
-
-#: views/index.hbs:14
-msgid ""
-"Setup Mailtrain to track RSS feeds and if a new entry is detected in a feed "
-"then Mailtrain auto-generates a new campaign using entry data as message "
-"contents and sends it to selected subscribers."
-msgstr ""
-
-#: views/index.hbs:15
-msgid "GPG Encryption"
-msgstr ""
-
-#: views/index.hbs:16
-msgid ""
-"If a list has a custom field for a GPG Public Key set then subscribers can "
-"upload their GPG public key to receive encrypted messages from the list."
-msgstr ""
-
-#: views/index.hbs:17
-msgid "Click stats"
-msgstr ""
-
-#: views/index.hbs:18
-msgid ""
-"After a campaign is sent, check individual click statistics for every link "
-"included in the message."
-msgstr ""
-
-#: views/index.hbs:19
-msgid "Open source"
-msgstr ""
-
-#: views/index.hbs:20
-msgid "Mailtrain is available under GPLv3 license and completely open source."
-msgstr ""
-
-#: views/index.hbs:21
-msgid "Send via any provider"
-msgstr ""
-
-#: views/index.hbs:22
-msgid ""
-"Mailtrain recommends SendPulse even though you "
-"can use any provider that supports SMTP protocol to send out your "
-"newsletters. Bounce and complaints handling via webhooks is supported for "
-"SES, SparkPost, SendGrid and Mailgun, also for Postfix and ZoneMTA."
-msgstr ""
-
-#: views/index.hbs:23
-msgid "Trigger based automation"
-msgstr ""
-
-#: views/index.hbs:24
-msgid ""
-"Define automation triggers to send specific messages when a user activates "
-"the trigger."
-msgstr ""
-
-#: views/layout.hbs:2
-msgid "Toggle navigation"
-msgstr ""
-
-#: views/layout.hbs:3
-msgid "Wiki"
-msgstr ""
-
-#: views/layout.hbs:4
-msgid "Blog"
-msgstr ""
-
-#: views/layout.hbs:5 views/users/account.hbs:2 views/users/account.hbs:3
-msgid "Account"
-msgstr ""
-
-#: views/layout.hbs:6 views/settings.hbs:2 views/settings.hbs:3
-msgid "Settings"
-msgstr ""
-
-#: views/layout.hbs:7 views/users/api.hbs:2 views/users/api.hbs:3
-msgid "API"
-msgstr ""
-
-#: views/layout.hbs:8
-msgid "Log out"
-msgstr ""
-
-#: views/layout.hbs:9 views/users/forgot.hbs:2 views/users/login.hbs:2
-#: views/users/login.hbs:3 views/users/login.hbs:9 views/users/reset.hbs:2
-msgid "Sign in"
-msgstr ""
-
-#: views/layout.hbs:10
-msgid "Self hosted newsletter app built on top of Nodemailer"
-msgstr ""
-
-#: views/layout.hbs:11 views/layout.hbs:13
-msgid "Source on GitHub"
-msgstr ""
-
-#: views/layout.hbs:12
-msgid "Subscribe to our newsletter"
-msgstr ""
-
-#: views/lists/create.hbs:2 views/lists/edit.hbs:2
-#: views/lists/fields/create.hbs:2 views/lists/fields/edit.hbs:2
-#: views/lists/fields/fields.hbs:2 views/lists/lists.hbs:2
-#: views/lists/lists.hbs:4 views/lists/segments/create.hbs:2
-#: views/lists/segments/edit.hbs:2 views/lists/segments/rule-configure.hbs:2
-#: views/lists/segments/rule-create.hbs:2 views/lists/segments/rule-edit.hbs:2
-#: views/lists/segments/segments.hbs:2 views/lists/segments/view.hbs:2
-#: views/lists/subscription/add.hbs:2 views/lists/subscription/edit.hbs:2
-#: views/lists/subscription/import-failed.hbs:2
-#: views/lists/subscription/import-preview.hbs:2
-#: views/lists/subscription/import.hbs:2 views/lists/view.hbs:2
-#: lib/tools.js:111
-msgid "Lists"
-msgstr ""
-
-#: views/lists/create.hbs:3 views/lists/create.hbs:4 views/lists/create.hbs:9
-#: views/lists/lists.hbs:3
-msgid "Create List"
-msgstr ""
-
-#: views/lists/create.hbs:6 views/lists/edit.hbs:7
-msgid "List Name"
-msgstr ""
-
-#: views/lists/edit.hbs:3 views/lists/edit.hbs:4 views/lists/view.hbs:7
-msgid "Edit List"
-msgstr ""
-
-#: views/lists/edit.hbs:5
-msgid "View List"
-msgstr ""
-
-#: views/lists/edit.hbs:8
-msgid "List ID"
-msgstr ""
-
-#: views/lists/edit.hbs:9
-msgid "This is the list ID displayed to the subscribers"
-msgstr ""
-
-#: views/lists/edit.hbs:12
-msgid "Delete List"
-msgstr ""
-
-#: views/lists/fields/create.hbs:3 views/lists/fields/edit.hbs:3
-#: views/lists/fields/fields.hbs:3 views/lists/fields/fields.hbs:5
-#: views/lists/view.hbs:5
-msgid "Custom Fields"
-msgstr ""
-
-#: views/lists/fields/create.hbs:4
-msgid "Create Field"
-msgstr ""
-
-#: views/lists/fields/create.hbs:5 views/lists/fields/fields.hbs:4
-msgid "Create Custom Field"
-msgstr ""
-
-#: views/lists/fields/create.hbs:6 views/lists/fields/create.hbs:7
-#: views/lists/fields/edit.hbs:7 views/lists/fields/edit.hbs:8
-msgid "Field Name"
-msgstr ""
-
-#: views/lists/fields/create.hbs:8 views/lists/fields/edit.hbs:9
-msgid "Field Type"
-msgstr ""
-
-#: views/lists/fields/create.hbs:9 views/lists/fields/edit.hbs:10
-#: lib/models/fields.js:17
-msgid "Text"
-msgstr ""
-
-#: views/lists/fields/create.hbs:10 views/lists/fields/edit.hbs:11
-#: lib/models/fields.js:21
-msgid "Number"
-msgstr ""
-
-#: views/lists/fields/create.hbs:11 views/lists/fields/edit.hbs:12
-#: lib/models/fields.js:18
-msgid "Website"
-msgstr ""
-
-#: views/lists/fields/create.hbs:12 views/lists/fields/edit.hbs:13
-#: lib/models/fields.js:20
-msgid "GPG Public Key"
-msgstr ""
-
-#: views/lists/fields/create.hbs:13 views/lists/fields/edit.hbs:14
-#: lib/models/fields.js:19
-msgid "Multi-line text"
-msgstr ""
-
-#: views/lists/fields/create.hbs:14 views/lists/fields/edit.hbs:15
-msgid "JSON"
-msgstr ""
-
-#: views/lists/fields/create.hbs:15 views/lists/fields/edit.hbs:16
-msgid "Date"
-msgstr ""
-
-#: views/lists/fields/create.hbs:16 views/lists/fields/edit.hbs:17
-msgid "Date (MM/DD/YYYY)"
-msgstr ""
-
-#: views/lists/fields/create.hbs:17 views/lists/fields/edit.hbs:18
-#: lib/models/fields.js:26
-msgid "Date (DD/MM/YYYY)"
-msgstr ""
-
-#: views/lists/fields/create.hbs:18 views/lists/fields/edit.hbs:19
-msgid "Birthday"
-msgstr ""
-
-#: views/lists/fields/create.hbs:19 views/lists/fields/edit.hbs:20
-#: lib/models/fields.js:27
-msgid "Birthday (MM/DD)"
-msgstr ""
-
-#: views/lists/fields/create.hbs:20 views/lists/fields/edit.hbs:21
-#: lib/models/fields.js:28
-msgid "Birthday (DD/MM)"
-msgstr ""
-
-#: views/lists/fields/create.hbs:21 views/lists/fields/edit.hbs:22
-msgid "Grouped"
-msgstr ""
-
-#: views/lists/fields/create.hbs:22 views/lists/fields/edit.hbs:23
-msgid "Drop Downs"
-msgstr ""
-
-#: views/lists/fields/create.hbs:23 views/lists/fields/edit.hbs:24
-#: lib/models/fields.js:22
-msgid "Radio Buttons"
-msgstr ""
-
-#: views/lists/fields/create.hbs:24 views/lists/fields/edit.hbs:25
-#: lib/models/fields.js:23
-msgid "Checkboxes"
-msgstr ""
-
-#: views/lists/fields/create.hbs:25 views/lists/fields/edit.hbs:26
-msgid "Option for a group value"
-msgstr ""
-
-#: views/lists/fields/create.hbs:26 views/lists/fields/edit.hbs:27
-msgid "Group"
-msgstr ""
-
-#: views/lists/fields/create.hbs:28 views/lists/fields/edit.hbs:29
-msgid "Required for group options"
-msgstr ""
-
-#: views/lists/fields/create.hbs:29 views/lists/fields/create.hbs:30
-#: views/lists/fields/edit.hbs:35 views/lists/fields/edit.hbs:36
-#: views/lists/fields/fields.hbs:9
-msgid "Default merge tag value"
-msgstr ""
-
-#: views/lists/fields/create.hbs:32 views/lists/fields/edit.hbs:34
-msgid ""
-"For group elements like checkboxes you can control the appearance of the "
-"merge tag with an optional template. The template uses handlebars syntax and "
-"you can find all values from {{values}} array, for example "
-"{{#each values}} {{this}} {{/each}}. If template is not defined "
-"then multiple values are joined with commas. You can also use this template "
-"to render JSON values (if the JSON is an array then the array is exposed as "
-"values, otherwise you can access the JSON keys directly)."
-msgstr ""
-
-#: views/lists/fields/create.hbs:33 views/lists/fields/edit.hbs:37
-msgid "Visible"
-msgstr ""
-
-#: views/lists/fields/create.hbs:34
-msgid "Add Field"
-msgstr ""
-
-#: views/lists/fields/edit.hbs:4
-msgid "Edit Field"
-msgstr ""
-
-#: views/lists/fields/edit.hbs:5
-msgid "Edit Custom Field"
-msgstr ""
-
-#: views/lists/fields/edit.hbs:6
-msgid "Back to fields"
-msgstr ""
-
-#: views/lists/fields/edit.hbs:30 views/lists/fields/fields.hbs:8
-#: views/partials/merge-tag-reference.hbs:3
-msgid "Merge tag"
-msgstr ""
-
-#: views/lists/fields/edit.hbs:31
-msgid "Merge Tag"
-msgstr ""
-
-#: views/lists/fields/edit.hbs:32
-msgid "Put this tag in your content:"
-msgstr ""
-
-#: views/lists/fields/edit.hbs:38
-msgid "Delete Field"
-msgstr ""
-
-#: views/lists/fields/fields.hbs:7 views/lists/view.hbs:25
-msgid "Type"
-msgstr ""
-
-#: views/lists/fields/fields.hbs:10 views/lists/fields/fields.hbs:11
-#: views/lists/lists.hbs:9 views/lists/segments/segments.hbs:8
-#: views/lists/segments/view.hbs:12 views/templates/templates.hbs:7
-#: views/triggers/triggers.hbs:14 routes/campaigns.js:287
-#: routes/campaigns.js:576 routes/campaigns.js:626 routes/lists.js:222
-#: routes/triggers.js:297
-msgid "Edit"
-msgstr ""
-
-#: views/lists/lists.hbs:6
-msgid "ID"
-msgstr ""
-
-#: views/lists/lists.hbs:7
-msgid "Subscribers"
-msgstr ""
-
-#: views/lists/segments/create.hbs:3 views/lists/segments/edit.hbs:3
-#: views/lists/segments/rule-configure.hbs:3
-#: views/lists/segments/rule-create.hbs:3 views/lists/segments/rule-edit.hbs:3
-#: views/lists/segments/segments.hbs:3 views/lists/segments/segments.hbs:5
-#: views/lists/segments/view.hbs:3 views/lists/view.hbs:6
-#: views/lists/view.hbs:13
-msgid "Segments"
-msgstr ""
-
-#: views/lists/segments/create.hbs:4 views/lists/segments/create.hbs:5
-#: views/lists/segments/rule-configure.hbs:4
-#: views/lists/segments/rule-create.hbs:4 views/lists/segments/rule-edit.hbs:4
-#: views/lists/segments/segments.hbs:4
-msgid "Create Segment"
-msgstr ""
-
-#: views/lists/segments/create.hbs:6 views/lists/segments/create.hbs:7
-#: views/lists/segments/edit.hbs:7 views/lists/segments/edit.hbs:8
-msgid "Segment Name"
-msgstr ""
-
-#: views/lists/segments/create.hbs:8 views/lists/segments/edit.hbs:9
-msgid "Rule match"
-msgstr ""
-
-#: views/lists/segments/create.hbs:10 views/lists/segments/edit.hbs:11
-msgid "All rules must match"
-msgstr ""
-
-#: views/lists/segments/create.hbs:11 views/lists/segments/edit.hbs:12
-msgid "Any rule can match"
-msgstr ""
-
-#: views/lists/segments/create.hbs:12
-msgid "Add Segment"
-msgstr ""
-
-#: views/lists/segments/edit.hbs:4 views/lists/segments/edit.hbs:5
-#: views/lists/segments/view.hbs:6 views/lists/view.hbs:11
-msgid "Edit Segment"
-msgstr ""
-
-#: views/lists/segments/edit.hbs:6
-msgid "Back to segments"
-msgstr ""
-
-#: views/lists/segments/edit.hbs:13
-msgid "Delete Segment"
-msgstr ""
-
-#: views/lists/segments/rule-configure.hbs:5
-#: views/lists/segments/rule-create.hbs:5 views/lists/segments/rule-edit.hbs:5
-#: views/lists/segments/view.hbs:4
-msgid "Create Rule"
-msgstr ""
-
-#: views/lists/segments/rule-configure.hbs:6
-#: views/lists/segments/rule-create.hbs:6 views/lists/segments/rule-edit.hbs:6
-#: views/lists/segments/view.hbs:10
-msgid "Rule"
-msgstr ""
-
-#: views/lists/segments/rule-configure.hbs:7
-#: views/lists/segments/rule-configure.hbs:8
-#: views/lists/segments/rule-configure.hbs:10
-#: views/lists/segments/rule-configure.hbs:13
-#: views/lists/segments/rule-configure.hbs:25
-#: views/lists/segments/rule-configure.hbs:30
-#: views/lists/segments/rule-edit.hbs:7 views/lists/segments/rule-edit.hbs:8
-#: views/lists/segments/rule-edit.hbs:10 views/lists/segments/rule-edit.hbs:15
-#: views/lists/segments/rule-edit.hbs:29 views/lists/segments/rule-edit.hbs:34
-#: views/lists/segments/view.hbs:11
-msgid "Value"
-msgstr ""
-
-#: views/lists/segments/rule-configure.hbs:9
-#: views/lists/segments/rule-edit.hbs:9
-msgid ""
-"Use % for wildcard character, e.g. \"%test\" to match all values that end "
-"with \"test\""
-msgstr ""
-
-#: views/lists/segments/rule-configure.hbs:11
-#: views/lists/segments/rule-configure.hbs:14
-#: views/lists/segments/rule-configure.hbs:26
-#: views/lists/segments/rule-edit.hbs:11 views/lists/segments/rule-edit.hbs:16
-#: views/lists/segments/rule-edit.hbs:30
-msgid "Use exact match"
-msgstr ""
-
-#: views/lists/segments/rule-configure.hbs:12
-#: views/lists/segments/rule-configure.hbs:15
-#: views/lists/segments/rule-configure.hbs:27
-#: views/lists/segments/rule-edit.hbs:12 views/lists/segments/rule-edit.hbs:17
-#: views/lists/segments/rule-edit.hbs:31
-msgid "Use range match"
-msgstr ""
-
-#: views/lists/segments/rule-configure.hbs:16
-#: views/lists/segments/rule-edit.hbs:20
-msgid "Use relative range match"
-msgstr ""
-
-#: views/lists/segments/rule-configure.hbs:17
-#: views/lists/segments/rule-configure.hbs:28
-#: views/lists/segments/rule-edit.hbs:13 views/lists/segments/rule-edit.hbs:18
-#: views/lists/segments/rule-edit.hbs:21 views/lists/segments/rule-edit.hbs:32
-msgid "From"
-msgstr ""
-
-#: views/lists/segments/rule-configure.hbs:18
-#: views/lists/segments/rule-configure.hbs:22
-#: views/lists/segments/rule-edit.hbs:22 views/lists/segments/rule-edit.hbs:26
-msgid "days"
-msgstr ""
-
-#: views/lists/segments/rule-configure.hbs:19
-#: views/lists/segments/rule-configure.hbs:23
-#: views/lists/segments/rule-edit.hbs:23 views/lists/segments/rule-edit.hbs:27
-msgid "before today"
-msgstr ""
-
-#: views/lists/segments/rule-configure.hbs:20
-#: views/lists/segments/rule-configure.hbs:24
-#: views/lists/segments/rule-edit.hbs:24 views/lists/segments/rule-edit.hbs:28
-msgid "after today"
-msgstr ""
-
-#: views/lists/segments/rule-configure.hbs:21
-#: views/lists/segments/rule-configure.hbs:29
-#: views/lists/segments/rule-edit.hbs:14 views/lists/segments/rule-edit.hbs:19
-#: views/lists/segments/rule-edit.hbs:25 views/lists/segments/rule-edit.hbs:33
-msgid "to"
-msgstr ""
-
-#: views/lists/segments/rule-configure.hbs:31
-#: views/lists/segments/rule-edit.hbs:35 lib/models/segments.js:156
-#: lib/models/segments.js:418
-msgid "Selected"
-msgstr ""
-
-#: views/lists/segments/rule-configure.hbs:32
-#: views/lists/segments/rule-edit.hbs:36 lib/models/segments.js:156
-#: lib/models/segments.js:418
-msgid "Not selected"
-msgstr ""
-
-#: views/lists/segments/rule-configure.hbs:33
-msgid "Add Rule"
-msgstr ""
-
-#: views/lists/segments/rule-create.hbs:8
-#: views/lists/subscription/import.hbs:12 views/triggers/create-select.hbs:9
-msgid "Next"
-msgstr ""
-
-#: views/lists/segments/rule-edit.hbs:37
-msgid "Delete Rule"
-msgstr ""
-
-#: views/lists/segments/segments.hbs:7
-msgid "Match"
-msgstr ""
-
-#: views/lists/segments/view.hbs:5 views/lists/view.hbs:12
-msgid "Segment"
-msgstr ""
-
-#: views/lists/segments/view.hbs:7
-msgid "Match rules"
-msgstr ""
-
-#: views/lists/segments/view.hbs:8
-msgid "Matching subscribers"
-msgstr ""
-
-#: views/lists/segments/view.hbs:9
-msgid "show"
-msgstr ""
-
-#: views/lists/subscription/add.hbs:3 views/lists/subscription/add.hbs:4
-msgid "Add subscriber"
-msgstr ""
-
-#: views/lists/subscription/add.hbs:5 views/subscription/manage.hbs:2
-#: views/subscription/subscribe.hbs:3 views/users/account.hbs:7
-msgid "Email Address"
-msgstr ""
-
-#: views/lists/subscription/add.hbs:8 views/lists/subscription/edit.hbs:9
-#: views/settings.hbs:82 views/settings.hbs:97 views/subscription/manage.hbs:7
-#: views/subscription/subscribe.hbs:7
-msgid "Begins with"
-msgstr ""
-
-#: views/lists/subscription/add.hbs:9 views/lists/subscription/edit.hbs:10
-msgid ""
-"Insert a GPG public key that will be used to encrypt messages sent this "
-"subscriber"
-msgstr ""
-
-#: views/lists/subscription/add.hbs:11 views/lists/subscription/edit.hbs:12
-#: views/lists/subscription/import-preview.hbs:9
-msgid "Timezone"
-msgstr ""
-
-#: views/lists/subscription/add.hbs:13 views/lists/subscription/edit.hbs:13
-msgid "Test user?"
-msgstr ""
-
-#: views/lists/subscription/add.hbs:14 views/lists/subscription/edit.hbs:14
-msgid ""
-"If checked then this subscription can be used for previewing campaign "
-"messages"
-msgstr ""
-
-#: views/lists/subscription/add.hbs:15
-msgid ""
-"This person will not receive a confirmation email so make sure that you have "
-"permission to email them."
-msgstr ""
-
-#: views/lists/subscription/edit.hbs:3 views/lists/subscription/edit.hbs:4
-msgid "Edit subscriber"
-msgstr ""
-
-#: views/lists/subscription/edit.hbs:5
-#: views/lists/subscription/import-failed.hbs:5
-msgid "Back to list"
-msgstr ""
-
-#: views/lists/subscription/edit.hbs:6
-#: views/lists/subscription/import-preview.hbs:6
-#: views/subscription/unsubscribe.hbs:3 lib/helpers.js:26
-#: lib/models/segments.js:11
-msgid "Email address"
-msgstr ""
-
-#: views/lists/subscription/edit.hbs:16
-msgid "Delete Subscription"
-msgstr ""
-
-#: views/lists/subscription/import-failed.hbs:3
-msgid "Import status"
-msgstr ""
-
-#: views/lists/subscription/import-failed.hbs:4
-msgid "Failed addresses"
-msgstr ""
-
-#: views/lists/subscription/import-failed.hbs:6
-msgid "see here"
-msgstr ""
-
-#: views/lists/subscription/import-failed.hbs:10
-msgid "Fail reason"
-msgstr ""
-
-#: views/lists/subscription/import-preview.hbs:3
-#: views/lists/subscription/import-preview.hbs:4
-#: views/lists/subscription/import.hbs:3 views/lists/subscription/import.hbs:4
-msgid "Import subscribers"
-msgstr ""
-
-#: views/lists/subscription/import-preview.hbs:10 views/users/api.hbs:27
-#: views/users/api.hbs:35 views/users/api.hbs:43 views/users/api.hbs:55
-msgid "Example"
-msgstr ""
-
-#: views/lists/subscription/import-preview.hbs:11
-msgid "Start import"
-msgstr ""
-
-#: views/lists/subscription/import.hbs:5
-msgid "CSV File"
-msgstr ""
-
-#: views/lists/subscription/import.hbs:6
-msgid "CSV delimiter"
-msgstr ""
-
-#: views/lists/subscription/import.hbs:7
-msgid "Categorize the imported subscribers as"
-msgstr ""
-
-#: views/lists/subscription/import.hbs:8 routes/lists.js:171
-msgid "Subscribed"
-msgstr ""
-
-#: views/lists/subscription/import.hbs:9
-msgid "Regular subscriber addresses"
-msgstr ""
-
-#: views/lists/subscription/import.hbs:11
-msgid "Suppressed emails that will be unsubscribed from your list"
-msgstr ""
-
-#: views/lists/view.hbs:3
-msgid "Subscription Form"
-msgstr ""
-
-#: views/lists/view.hbs:4
-msgid "List Actions"
-msgstr ""
-
-#: views/lists/view.hbs:8 views/triggers/create-select.hbs:3
-#: views/triggers/create-select.hbs:4 views/triggers/create.hbs:3
-#: views/triggers/create.hbs:4 views/triggers/create.hbs:27
-#: views/triggers/triggers.hbs:3
-msgid "Create Trigger"
-msgstr ""
-
-#: views/lists/view.hbs:9
-msgid "Add Subscriber"
-msgstr ""
-
-#: views/lists/view.hbs:10
-msgid "Import Subscribers"
-msgstr ""
-
-#: views/lists/view.hbs:14
-msgid "Create New Segment"
-msgstr ""
-
-#: views/lists/view.hbs:15
-msgid "Filter"
-msgstr ""
-
-#: views/lists/view.hbs:16
-msgid "Subscriptions"
-msgstr ""
-
-#: views/lists/view.hbs:17
-msgid "Imports"
-msgstr ""
-
-#: views/lists/view.hbs:24 routes/campaigns.js:266 routes/lists.js:265
-msgid "Finished"
-msgstr ""
-
-#: views/lists/view.hbs:26
-msgid "Added"
-msgstr ""
-
-#: views/lists/view.hbs:27
-msgid "Updated"
-msgstr ""
-
-#: views/lists/view.hbs:28
-msgid "Failed"
-msgstr ""
-
-#: views/lists/view.hbs:30
-msgid ""
-"Are you sure? This action should only be called to resolve stalled imports"
-msgstr ""
-
-#: views/lists/view.hbs:31
-msgid "Restart"
-msgstr ""
-
-#: views/partials/codeeditor.hbs:1 views/partials/summernote.hbs:1
-msgid "Template content (HTML)"
-msgstr ""
-
-#: views/partials/html-preview.hbs:1
-msgid "Toggle HTML preview"
-msgstr ""
-
-#: views/partials/merge-tag-reference.hbs:1
-msgid "Merge tag reference"
-msgstr ""
-
-#: views/partials/merge-tag-reference.hbs:2
-msgid ""
-"Merge tags are tags that are replaced before sending out the message. The "
-"format of the merge tag is the following: [TAG_NAME] or "
-"[TAG_NAME/fallback] where fallback is an optional "
-"text value used when TAG_NAME is empty."
-msgstr ""
-
-#: views/partials/plaintext.hbs:1
-msgid "Template content (plaintext)"
-msgstr ""
-
-#: views/settings.hbs:5
-msgid "Service Address (URL)"
-msgstr ""
-
-#: views/settings.hbs:6
-msgid "Enter the URL this service can be reached from"
-msgstr ""
-
-#: views/settings.hbs:7
-msgid "Admin Email"
-msgstr ""
-
-#: views/settings.hbs:8
-msgid ""
-"Enter the email address that will be used as \"from\" for system messages"
-msgstr ""
-
-#: views/settings.hbs:9
-msgid "Disable WYSIWYG editor"
-msgstr ""
-
-#: views/settings.hbs:10
-msgid "If checked then message editor displays HTML code without the preview"
-msgstr ""
-
-#: views/settings.hbs:11
-msgid "Disable subscription confirmation messages"
-msgstr ""
-
-#: views/settings.hbs:12
-msgid ""
-"If checked then do not send a confirmation message that states the "
-"subscriber is now subscribed or unsubscribed. This does not disable double "
-"opt-in messages."
-msgstr ""
-
-#: views/settings.hbs:13
-msgid "Tracking ID"
-msgstr ""
-
-#: views/settings.hbs:14
-msgid "Enter Google Analytics tracking code"
-msgstr ""
-
-#: views/settings.hbs:15
-msgid "Frontpage shout out"
-msgstr ""
-
-#: views/settings.hbs:16
-msgid "HTML code shown in the front page header section"
-msgstr ""
-
-#: views/settings.hbs:17
-msgid "Campaign defaults"
-msgstr ""
-
-#: views/settings.hbs:18
-msgid "Sender name"
-msgstr ""
-
-#: views/settings.hbs:19
-msgid "Sender name, eg. My Awesome Company Ltd."
-msgstr ""
-
-#: views/settings.hbs:20
-msgid "Default address"
-msgstr ""
-
-#: views/settings.hbs:21
-msgid ""
-"Contact address to provide, eg. 1234 Main Street, Anywhere, MA 01234, USA"
-msgstr ""
-
-#: views/settings.hbs:22
-msgid "Default \"from name\""
-msgstr ""
-
-#: views/settings.hbs:24
-msgid "Default \"from\" email"
-msgstr ""
-
-#: views/settings.hbs:26
-msgid "Default \"subject line\""
-msgstr ""
-
-#: views/settings.hbs:28
-msgid "Default homepage (URL)"
-msgstr ""
-
-#: views/settings.hbs:29
-msgid "URL to redirect the subscribed users to, eg. http://example.com/"
-msgstr ""
-
-#: views/settings.hbs:30
-msgid "Mailer Settings"
-msgstr ""
-
-#: views/settings.hbs:31
-msgid "These settings are required to send out e-mail messages"
-msgstr ""
-
-#: views/settings.hbs:32
-msgid "SMTP"
-msgstr ""
-
-#: views/settings.hbs:33
-msgid "AWS SES"
-msgstr ""
-
-#: views/settings.hbs:34
-msgid "Use SMTP for sending mail"
-msgstr ""
-
-#: views/settings.hbs:35
-msgid "Hostname"
-msgstr ""
-
-#: views/settings.hbs:36
-msgid "Port"
-msgstr ""
-
-#: views/settings.hbs:37
-msgid "Port, eg. 465. Autodetected if left blank"
-msgstr ""
-
-#: views/settings.hbs:38
-msgid "Encryption"
-msgstr ""
-
-#: views/settings.hbs:39
-msgid "Disable SMTP authentication"
-msgstr ""
-
-#: views/settings.hbs:40 views/users/forgot.hbs:9 views/users/login.hbs:4
-#: views/users/login.hbs:5
-msgid "Username"
-msgstr ""
-
-#: views/settings.hbs:41
-msgid "Username, eg. myaccount@example.com"
-msgstr ""
-
-#: views/settings.hbs:42 views/settings.hbs:43 views/users/login.hbs:6
-#: views/users/login.hbs:7
-msgid "Password"
-msgstr ""
-
-#: views/settings.hbs:44
-msgid "Use SES API for sending mail"
-msgstr ""
-
-#: views/settings.hbs:45
-msgid "Access Key"
-msgstr ""
-
-#: views/settings.hbs:46
-msgid "AWS Access Key Id"
-msgstr ""
-
-#: views/settings.hbs:47
-msgid "Secret Key"
-msgstr ""
-
-#: views/settings.hbs:48
-msgid "AWS Secret Access Key"
-msgstr ""
-
-#: views/settings.hbs:49
-msgid "Region"
-msgstr ""
-
-#: views/settings.hbs:50
-msgid "Checking"
-msgstr ""
-
-#: views/settings.hbs:51
-msgid "Check Mailer config"
-msgstr ""
-
-#: views/settings.hbs:52
-msgid "Don't have an SMTP account yet? Create a free SendPulse account"
-msgstr ""
-
-#: views/settings.hbs:53
-msgid "here"
-msgstr ""
-
-#: views/settings.hbs:54
-msgid "Advanced Mailer settings"
-msgstr ""
-
-#: views/settings.hbs:55
-msgid "Log SMTP transactions"
-msgstr ""
-
-#: views/settings.hbs:56
-msgid "Allow self-signed certificates"
-msgstr ""
-
-#: views/settings.hbs:57
-msgid "Max connections"
-msgstr ""
-
-#: views/settings.hbs:58
-msgid "The count of max connections, eg. 10"
-msgstr ""
-
-#: views/settings.hbs:59
-msgid ""
-"The count of maximum simultaneous connections to make against the SMTP "
-"server (defaults to 5). This limit is per sending process."
-msgstr ""
-
-#: views/settings.hbs:60
-msgid "Max messages"
-msgstr ""
-
-#: views/settings.hbs:61
-msgid "The count of max messages, eg. 100"
-msgstr ""
-
-#: views/settings.hbs:62
-msgid ""
-"he number of messages to send through a single connection before the "
-"connection is closed and reopened (defaults to 100)"
-msgstr ""
-
-#: views/settings.hbs:63
-msgid "Throttling"
-msgstr ""
-
-#: views/settings.hbs:64
-msgid "Messages per hour eg. 1000"
-msgstr ""
-
-#: views/settings.hbs:65
-msgid ""
-"Maximum number of messages to send in an hour. Leave empty or zero for no "
-"throttling. If your provider uses a different speed limit (messages/minute "
-"or messages/second) then convert this limit into messages/hour (1m/s => "
-"3600m/h). This limit is per sending process."
-msgstr ""
-
-#: views/settings.hbs:66
-msgid "VERP bounce handling"
-msgstr ""
-
-#: views/settings.hbs:67
-msgid ""
-"Mailtrain is able to use VERP based routing to detect bounces. In this case "
-"the message is sent to the recipient using a custom VERP address as the "
-"return path of the message. If the message is not accepted a bounce email is "
-"sent to this special VERP address and thus a bounce is detected."
-msgstr ""
-
-#: views/settings.hbs:68
-msgid ""
-"To get VERP working you need to set up a DNS MX record that points to your "
-"Mailtrain hostname. You must also ensure that Mailtrain VERP interface is "
-"available from port 25 of your server (port 25 usually requires root user "
-"privileges). This way if anyone tries to send email to someuser@verp-"
-"hostname then the email should end up to this server."
-msgstr ""
-
-#: views/settings.hbs:69
-msgid ""
-"VERP usually only works if you are using your own SMTP server. Regular relay "
-"services (SES, SparkPost, Gmail etc.) tend to remove the VERP address from "
-"the message."
-msgstr ""
-
-#: views/settings.hbs:70
-msgid "Use VERP to catch bounces"
-msgstr ""
-
-#: views/settings.hbs:71
-msgid "Server hostname"
-msgstr ""
-
-#: views/settings.hbs:72
-msgid "The VERP server hostname, eg. bounces.example.com"
-msgstr ""
-
-#: views/settings.hbs:73
-msgid ""
-"VERP bounce handling server hostname. This hostname is used in the SMTP "
-"envelope FROM address and the MX DNS records should point to this server"
-msgstr ""
-
-#: views/settings.hbs:74
-msgid ""
-"VERP bounce handling server is not enabled. Modify your server configuration "
-"file and restart server to enable it"
-msgstr ""
-
-#: views/settings.hbs:75
-msgid "GPG Signing"
-msgstr ""
-
-#: views/settings.hbs:76
-msgid ""
-"Only messages that are encrypted can be signed. Subsribers who have not set "
-"up a GPG public key in their profile receive normal email messages. Users "
-"with GPG key set receive encrypted messages and if you have signing key also "
-"set, the messages are signed with this key."
-msgstr ""
-
-#: views/settings.hbs:77
-msgid ""
-"Do not use sensitive keys here. The private key and passphrase are not "
-"encrypted in the database."
-msgstr ""
-
-#: views/settings.hbs:78
-msgid "Private Key Passphrase"
-msgstr ""
-
-#: views/settings.hbs:79
-msgid "Passphrase for the key if set"
-msgstr ""
-
-#: views/settings.hbs:80
-msgid "Only fill this if your private key is encrypted with a passphrase"
-msgstr ""
-
-#: views/settings.hbs:81
-msgid "GPG Private Key"
-msgstr ""
-
-#: views/settings.hbs:83
-msgid ""
-"This value is optional. If you do not provide a private key GPG encrypted "
-"messages are sent without signing."
-msgstr ""
-
-#: views/settings.hbs:84
-msgid "DKIM Signing by ZoneMTA"
-msgstr ""
-
-#: views/settings.hbs:85
-msgid ""
-"If you are using ZoneMTA then Mailtrain can provide a DKIM key for signing "
-"all outgoing messages. Other services usually provide their own means to "
-"DKIM sign your messages"
-msgstr ""
-
-#: views/settings.hbs:86
-msgid ""
-"Do not use sensitive keys here. The private key is not encrypted in the "
-"database."
-msgstr ""
-
-#: views/settings.hbs:87
-msgid "ZoneMTA DKIM API Key"
-msgstr ""
-
-#: views/settings.hbs:88
-msgid "Some secret value"
-msgstr ""
-
-#: views/settings.hbs:89
-msgid ""
-"Secret value known to ZoneMTA for requesting DKIM key information. If this "
-"value was generated by the Mailtrain installation script then you can keep "
-"it as it is"
-msgstr ""
-
-#: views/settings.hbs:90
-msgid "DKIM domain"
-msgstr ""
-
-#: views/settings.hbs:91
-msgid "Domain name for the DKIM key"
-msgstr ""
-
-#: views/settings.hbs:92
-msgid "Leave blank to use the sender email address domain"
-msgstr ""
-
-#: views/settings.hbs:93 views/settings.hbs:94
-msgid "DKIM key selector"
-msgstr ""
-
-#: views/settings.hbs:95
-msgid "Signing is disabled without a valid selector value"
-msgstr ""
-
-#: views/settings.hbs:96
-msgid "DKIM Private Key"
-msgstr ""
-
-#: views/settings.hbs:98
-msgid ""
-"This value is optional. If you do not provide a private key then messages "
-"are not signed."
-msgstr ""
-
-#: views/subscription/confirm-notice.hbs:1 views/subscription/subscribe.hbs:1
-msgid "Warning!"
-msgstr ""
-
-#: views/subscription/confirm-notice.hbs:2
-msgid "If JavaScript was not enabled then no confirmation message was sent"
-msgstr ""
-
-#: views/subscription/confirm-notice.hbs:3
-msgid "Almost finished."
-msgstr ""
-
-#: views/subscription/confirm-notice.hbs:4
-msgid ""
-"We need to confirm your email address. To complete the subscription process, "
-"please click the link in the email we just sent you."
-msgstr ""
-
-#: views/subscription/confirm-notice.hbs:5
-#: views/subscription/unsubscribe-notice.hbs:3
-#: views/subscription/updated-notice.hbs:3
-msgid "return to our website"
-msgstr ""
-
-#: views/subscription/manage-address.hbs:1
-msgid "Update your Email Address"
-msgstr ""
-
-#: views/subscription/manage-address.hbs:2
-msgid "Existing Email Address"
-msgstr ""
-
-#: views/subscription/manage-address.hbs:3
-msgid "New Email Address"
-msgstr ""
-
-#: views/subscription/manage-address.hbs:4
-msgid "Your new email address"
-msgstr ""
-
-#: views/subscription/manage-address.hbs:5
-msgid ""
-"You will receive a confirmation request to your new email address that you "
-"need to accept before your email is actually changed"
-msgstr ""
-
-#: views/subscription/manage-address.hbs:6
-msgid "Update Email Address"
-msgstr ""
-
-#: views/subscription/manage.hbs:1
-msgid "Update your preferences"
-msgstr ""
-
-#: views/subscription/manage.hbs:3
-msgid "want to change it?"
-msgstr ""
-
-#: views/subscription/manage.hbs:6 views/subscription/subscribe.hbs:6
-msgid "Download signature verification key"
-msgstr ""
-
-#: views/subscription/manage.hbs:8 views/subscription/subscribe.hbs:8
-msgid ""
-"Insert your GPG public key here to encrypt messages sent to your address"
-msgstr ""
-
-#: views/subscription/manage.hbs:9 views/subscription/subscribe.hbs:9
-msgid "optional"
-msgstr ""
-
-#: views/subscription/manage.hbs:11
-msgid "Update Profile"
-msgstr ""
-
-#: views/subscription/subscribe.hbs:2
-msgid "JavaScript must be enabled in order for the subscription form to work"
-msgstr ""
-
-#: views/subscription/subscribe.hbs:11
-msgid "Subscribe to list"
-msgstr ""
-
-#: views/subscription/subscribed.hbs:3
-msgid "Thank you for subscribing!"
-msgstr ""
-
-#: views/subscription/subscribed.hbs:4
-msgid "continue to our website"
-msgstr ""
-
-#: views/subscription/unsubscribe-notice.hbs:1
-msgid "Unsubscribe Successful"
-msgstr ""
-
-#: views/subscription/unsubscribe-notice.hbs:2
-msgid "You have been removed from:"
-msgstr ""
-
-#: views/subscription/unsubscribe.hbs:2
-msgid "Enter your email address to unsubscribe from:"
-msgstr ""
-
-#: views/subscription/updated-notice.hbs:1
-msgid "Profile Updated"
-msgstr ""
-
-#: views/subscription/updated-notice.hbs:2
-msgid "Your profile information has been updated."
-msgstr ""
-
-#: views/templates/create.hbs:2 views/templates/edit.hbs:2
-#: views/templates/templates.hbs:2 views/templates/templates.hbs:4
-#: lib/tools.js:115
-msgid "Templates"
-msgstr ""
-
-#: views/templates/create.hbs:3 views/templates/create.hbs:4
-#: views/templates/create.hbs:12 views/templates/templates.hbs:3
-msgid "Create Template"
-msgstr ""
-
-#: views/templates/create.hbs:5 views/templates/edit.hbs:6
-msgid "Template name"
-msgstr ""
-
-#: views/templates/create.hbs:6 views/templates/edit.hbs:7
-msgid "Name for this template, eg. Newsletter"
-msgstr ""
-
-#: views/templates/create.hbs:7
-msgid "HTML Editor"
-msgstr ""
-
-#: views/templates/create.hbs:10 views/templates/edit.hbs:9
-msgid "Optional comments about this template"
-msgstr ""
-
-#: views/templates/edit.hbs:3 views/templates/edit.hbs:4
-msgid "Edit Template"
-msgstr ""
-
-#: views/templates/edit.hbs:5
-msgid "Back to templates"
-msgstr ""
-
-#: views/templates/edit.hbs:11
-msgid "Delete Template"
-msgstr ""
-
-#: views/triggers/create-select.hbs:2 views/triggers/create.hbs:2
-#: views/triggers/edit.hbs:2 views/triggers/triggered.hbs:2
-#: views/triggers/triggers.hbs:2 views/triggers/triggers.hbs:4
-msgid "Automation Triggers"
-msgstr ""
-
-#: views/triggers/create-select.hbs:5
-msgid "Select a list for the trigger"
-msgstr ""
-
-#: views/triggers/create.hbs:5 views/triggers/edit.hbs:6
-msgid "Trigger name"
-msgstr ""
-
-#: views/triggers/create.hbs:6 views/triggers/edit.hbs:7
-msgid "Name for this trigger, eg. Inactive subscribers"
-msgstr ""
-
-#: views/triggers/create.hbs:8 views/triggers/edit.hbs:9
-msgid "Optional comments about this trigger"
-msgstr ""
-
-#: views/triggers/create.hbs:12 views/triggers/edit.hbs:14
-msgid "Trigger rule"
-msgstr ""
-
-#: views/triggers/create.hbs:13 views/triggers/edit.hbs:15
-msgid "Trigger fires"
-msgstr ""
-
-#: views/triggers/create.hbs:14 views/triggers/edit.hbs:16
-msgid "days after:"
-msgstr ""
-
-#: views/triggers/create.hbs:15 views/triggers/edit.hbs:17
-msgid "Subscription"
-msgstr ""
-
-#: views/triggers/create.hbs:16 views/triggers/create.hbs:21
-#: views/triggers/edit.hbs:18 views/triggers/edit.hbs:23
-msgid "Event"
-msgstr ""
-
-#: views/triggers/create.hbs:18 views/triggers/create.hbs:19
-#: views/triggers/create.hbs:25 views/triggers/edit.hbs:20
-#: views/triggers/edit.hbs:21 views/triggers/edit.hbs:27
-msgid "Campaign"
-msgstr ""
-
-#: views/triggers/create.hbs:23 views/triggers/edit.hbs:25
-msgid "Trigger action"
-msgstr ""
-
-#: views/triggers/create.hbs:24 views/triggers/edit.hbs:26
-msgid "Send campaign"
-msgstr ""
-
-#: views/triggers/edit.hbs:3 views/triggers/edit.hbs:4
-msgid "Edit Trigger"
-msgstr ""
-
-#: views/triggers/edit.hbs:5
-msgid "Back to triggers"
-msgstr ""
-
-#: views/triggers/edit.hbs:11
-msgid "Trigger is enabled"
-msgstr ""
-
-#: views/triggers/edit.hbs:29
-msgid "Delete Trigger"
-msgstr ""
-
-#: views/triggers/triggered.hbs:3
-msgid "Triggered"
-msgstr ""
-
-#: views/triggers/triggered.hbs:4
-msgid "Triggered subscribers"
-msgstr ""
-
-#: views/triggers/triggered.hbs:5
-msgid "Subscribers who caused this trigger to fire"
-msgstr ""
-
-#: views/triggers/triggered.hbs:9
-msgid "Triggered time"
-msgstr ""
-
-#: views/triggers/triggers.hbs:9
-msgid "Trigger"
-msgstr ""
-
-#: views/triggers/triggers.hbs:10
-msgid "Target Campaign"
-msgstr ""
-
-#: views/triggers/triggers.hbs:11
-msgid "Triggered count"
-msgstr ""
-
-#: views/triggers/triggers.hbs:12
-msgid "Enabled"
-msgstr ""
-
-#: views/triggers/triggers.hbs:13
-msgid "Disabled"
-msgstr ""
-
-#: views/users/account.hbs:4
-msgid "This account is managed through LDAP."
-msgstr ""
-
-#: views/users/account.hbs:5
-msgid "Associated Email Address"
-msgstr ""
-
-#: views/users/account.hbs:8
-msgid "Your e-mail address"
-msgstr ""
-
-#: views/users/account.hbs:9
-msgid ""
-"This address is used for account recovery in case you lose your password"
-msgstr ""
-
-#: views/users/account.hbs:10
-msgid "Password change"
-msgstr ""
-
-#: views/users/account.hbs:11
-msgid ""
-"You only need to fill out this form if you want to change your current "
-"password"
-msgstr ""
-
-#: views/users/account.hbs:12 views/users/account.hbs:13
-msgid "Current Password"
-msgstr ""
-
-#: views/users/account.hbs:14 views/users/account.hbs:15
-#: views/users/reset.hbs:6 views/users/reset.hbs:7
-msgid "New Password"
-msgstr ""
-
-#: views/users/account.hbs:16
-msgid "Confirm Password"
-msgstr ""
-
-#: views/users/account.hbs:17 views/users/reset.hbs:8
-msgid "Confirm New Password"
-msgstr ""
-
-#: views/users/api.hbs:4
-msgid "Are you sure? Resetting would invalidate the currently existing token."
-msgstr ""
-
-#: views/users/api.hbs:5
-msgid "Are you sure?"
-msgstr ""
-
-#: views/users/api.hbs:6
-msgid "Reset Access Token"
-msgstr ""
-
-#: views/users/api.hbs:7
-msgid "Generate Access Token"
-msgstr ""
-
-#: views/users/api.hbs:8
-msgid "Personal access token:"
-msgstr ""
-
-#: views/users/api.hbs:9
-msgid "Access token not yet generated"
-msgstr ""
-
-#: views/users/api.hbs:10
-msgid "Notes about the API"
-msgstr ""
-
-#: views/users/api.hbs:11
-msgid ""
-"API response is a JSON structure with error and data"
-"code> properties. If the response error has a value set then "
-"the request failed."
-msgstr ""
-
-#: views/users/api.hbs:12
-msgid ""
-"You need to define proper Content-Type when making a request. "
-"You can either use application/x-www-form-urlencoded for normal "
-"form data or application/json for a JSON payload. Using "
-"multipart/form-data is not supported."
-msgstr ""
-
-#: views/users/api.hbs:13
-msgid "Add subscription"
-msgstr ""
-
-#: views/users/api.hbs:14
-msgid ""
-"This API call either inserts a new subscription or updates existing. Fields "
-"not included are left as is, so if you update only LAST_NAME value, then "
-"FIRST_NAME is kept untouched for an existing subscription."
-msgstr ""
-
-#: views/users/api.hbs:15 views/users/api.hbs:17 views/users/api.hbs:30
-#: views/users/api.hbs:32 views/users/api.hbs:38 views/users/api.hbs:40
-#: views/users/api.hbs:46 views/users/api.hbs:48
-msgid "arguments"
-msgstr ""
-
-#: views/users/api.hbs:16 views/users/api.hbs:31 views/users/api.hbs:39
-#: views/users/api.hbs:47
-msgid "your personal access token"
-msgstr ""
-
-#: views/users/api.hbs:18 views/users/api.hbs:33 views/users/api.hbs:41
-msgid "subscriber's email address"
-msgstr ""
-
-#: views/users/api.hbs:19 views/users/api.hbs:34 views/users/api.hbs:42
-#: views/users/api.hbs:50
-msgid "required"
-msgstr ""
-
-#: views/users/api.hbs:20
-msgid "subscriber's first name"
-msgstr ""
-
-#: views/users/api.hbs:21
-msgid "subscriber's last name"
-msgstr ""
-
-#: views/users/api.hbs:22
-msgid ""
-"subscriber's timezone (eg. \"Europe/Tallinn\", \"PST\" or \"UTC\"). If not "
-"set defaults to \"UTC\""
-msgstr ""
-
-#: views/users/api.hbs:23
-msgid ""
-"custom field value. Use yes/no for option group values (checkboxes, radios, "
-"drop downs)"
-msgstr ""
-
-#: views/users/api.hbs:24
-msgid "Additional POST arguments"
-msgstr ""
-
-#: views/users/api.hbs:25
-msgid ""
-"set to \"yes\" if you want to make sure the email is marked as subscribed "
-"even if it was previously marked as unsubscribed. If the email was already "
-"unsubscribed/blocked then subscription status is not changed"
-msgstr ""
-
-#: views/users/api.hbs:26
-msgid ""
-"set to \"yes\" if you want to send confirmation email to the subscriber "
-"before actually marking as subscribed"
-msgstr ""
-
-#: views/users/api.hbs:28
-msgid "Remove subscription"
-msgstr ""
-
-#: views/users/api.hbs:29
-msgid "This API call marks a subscription as unsubscribed"
-msgstr ""
-
-#: views/users/api.hbs:36
-msgid "Delete subscription"
-msgstr ""
-
-#: views/users/api.hbs:37
-msgid "This API call deletes a subscription"
-msgstr ""
-
-#: views/users/api.hbs:44
-msgid "Add new custom field"
-msgstr ""
-
-#: views/users/api.hbs:45
-msgid "This API call creates a new custom field for a list."
-msgstr ""
-
-#: views/users/api.hbs:49
-msgid "field name"
-msgstr ""
-
-#: views/users/api.hbs:51
-msgid "one of the following types:"
-msgstr ""
-
-#: views/users/api.hbs:52
-msgid ""
-"If the type is 'option' then you also need to specify the parent element ID"
-msgstr ""
-
-#: views/users/api.hbs:53
-msgid ""
-"Template for the group element. If not set, then values of the elements are "
-"joined with commas"
-msgstr ""
-
-#: views/users/api.hbs:54
-msgid ""
-"if not visible then the subscriber can not view or modify this value at the "
-"profile page"
-msgstr ""
-
-#: views/users/forgot.hbs:3 views/users/reset.hbs:3
-msgid "Password Reset"
-msgstr ""
-
-#: views/users/forgot.hbs:4
-msgid "Reset your password?"
-msgstr ""
-
-#: views/users/forgot.hbs:5
-msgid "Accounts are managed through LDAP."
-msgstr ""
-
-#: views/users/forgot.hbs:6 views/users/reset.hbs:10
-msgid "Reset Password"
-msgstr ""
-
-#: views/users/forgot.hbs:7
-msgid ""
-"Please provide the username or email address that you used when you signed "
-"up for your Mailtrain account."
-msgstr ""
-
-#: views/users/forgot.hbs:8
-msgid "We will send you an email that will allow you to reset your password."
-msgstr ""
-
-#: views/users/forgot.hbs:10
-msgid "Username or email address"
-msgstr ""
-
-#: views/users/forgot.hbs:11
-msgid "Send verification email"
-msgstr ""
-
-#: views/users/login.hbs:8
-msgid "Remember me"
-msgstr ""
-
-#: views/users/login.hbs:11 views/users/login.hbs:12
-msgid "Forgot password?"
-msgstr ""
-
-#: views/users/reset.hbs:4
-msgid "Choose your new password"
-msgstr ""
-
-#: views/users/reset.hbs:5
-msgid "Please enter a new password."
-msgstr ""
-
-#: lib/feed.js:31
-msgid "Bad status code %s"
-msgstr ""
-
-#: lib/helpers.js:17
-msgid "URL that points to the unsubscribe page"
-msgstr ""
-
-#: lib/helpers.js:20
-msgid "URL that points to the preferences page of the subscriber"
-msgstr ""
-
-#: lib/helpers.js:23
-msgid "URL to preview the message in a browser"
-msgstr ""
-
-#: lib/helpers.js:29 lib/models/segments.js:31
-msgid "First name"
-msgstr ""
-
-#: lib/helpers.js:32 lib/models/segments.js:35
-msgid "Last name"
-msgstr ""
-
-#: lib/helpers.js:35
-msgid "Full name (first and last name combined)"
-msgstr ""
-
-#: lib/helpers.js:38
-msgid "Unique ID that identifies the recipient"
-msgstr ""
-
-#: lib/helpers.js:41
-msgid "Unique ID that identifies the list used for this campaign"
-msgstr ""
-
-#: lib/helpers.js:44
-msgid "Unique ID that identifies current campaign"
-msgstr ""
-
-#: lib/mailer.js:215
-msgid "Invalid mail transport"
-msgstr "Vigane maili transport"
-
-#: lib/models/campaigns.js:271 lib/models/campaigns.js:298
-#: lib/models/campaigns.js:371 lib/models/campaigns.js:494
-#: lib/models/campaigns.js:752 lib/models/campaigns.js:881
-msgid "Missing Campaign ID"
-msgstr ""
-
-#: lib/models/campaigns.js:407
-msgid "Emtpy or too large attahcment"
-msgstr ""
-
-#: lib/models/campaigns.js:573 lib/models/campaigns.js:761
-msgid "Campaign Name must be set"
-msgstr ""
-
-#: lib/models/campaigns.js:577
-msgid "RSS URL must be set and needs to be a valid URL"
-msgstr ""
-
-#: lib/models/campaigns.js:730
-msgid "Selected template not found"
-msgstr ""
-
-#: lib/models/campaigns.js:1082
-msgid "Invalid or missing message ID"
-msgstr ""
-
-#: lib/models/fields.js:24
-msgid "Drop Down"
-msgstr ""
-
-#: lib/models/fields.js:25
-msgid "Date (MM/DD/YYY)"
-msgstr ""
-
-#: lib/models/fields.js:29
-msgid "JSON value for custom rendering"
-msgstr ""
-
-#: lib/models/fields.js:30
-msgid "Option"
-msgstr ""
-
-#: lib/models/fields.js:53 lib/models/fields.js:98 lib/models/fields.js:123
-#: lib/models/lists.js:81 lib/models/lists.js:175 lib/models/lists.js:212
-#: lib/models/segments.js:43 lib/models/segments.js:176
-#: lib/models/subscriptions.js:88 lib/models/subscriptions.js:640
-#: lib/models/subscriptions.js:703 lib/models/subscriptions.js:889
-#: lib/models/subscriptions.js:992 lib/models/subscriptions.js:1046
-#: lib/models/subscriptions.js:1109 lib/models/subscriptions.js:1152
-msgid "Missing List ID"
-msgstr ""
-
-#: lib/models/fields.js:129
-msgid "Option field requires a group to be selected"
-msgstr ""
-
-#: lib/models/fields.js:149 lib/models/fields.js:199
-msgid "Missing Field ID"
-msgstr ""
-
-#: lib/models/fields.js:153 lib/models/segments.js:185
-#: lib/models/segments.js:225
-msgid "Field Name must be set"
-msgstr ""
-
-#: lib/models/fields.js:216
-msgid "Custom field not found"
-msgstr ""
-
-#: lib/models/fields.js:289
-msgid "Unknown column type %s"
-msgstr ""
-
-#: lib/models/fields.js:293
-msgid "Missing column name"
-msgstr ""
-
-#: lib/models/fields.js:297
-msgid "Missing list ID"
-msgstr ""
-
-#: lib/models/fields.js:305
-msgid "Provided List ID not found"
-msgstr ""
-
-#: lib/models/links.js:328 routes/campaigns.js:541 routes/campaigns.js:590
-#: services/sender.js:304
-msgid "Campaign not found"
-msgstr ""
-
-#: lib/models/links.js:336 routes/lists.js:146 services/sender.js:311
-msgid "List not found"
-msgstr ""
-
-#: lib/models/links.js:344
-msgid "Subscription not found"
-msgstr ""
-
-#: lib/models/lists.js:117 lib/models/lists.js:179
-msgid "List Name must be set"
-msgstr ""
-
-#: lib/models/lists.js:241
-msgid "Missing List CID"
-msgstr ""
-
-#: lib/models/segments.js:15
-msgid "Signup country"
-msgstr ""
-
-#: lib/models/segments.js:19 lib/models/triggers.js:11
-msgid "Sign up date"
-msgstr ""
-
-#: lib/models/segments.js:23 lib/models/triggers.js:15
-msgid "Latest open"
-msgstr ""
-
-#: lib/models/segments.js:27 lib/models/triggers.js:19
-msgid "Latest click"
-msgstr ""
-
-#: lib/models/segments.js:69 lib/models/segments.js:216
-#: lib/models/segments.js:256 lib/models/segments.js:278
-msgid "Missing Segment ID"
-msgstr ""
-
-#: lib/models/segments.js:85 lib/models/segments.js:549
-#: lib/models/segments.js:658
-msgid "Segment not found"
-msgstr ""
-
-#: lib/models/segments.js:146 lib/models/segments.js:147
-#: lib/models/segments.js:408 lib/models/segments.js:409
-msgid "%s days after today"
-msgstr ""
-
-#: lib/models/segments.js:146 lib/models/segments.js:147
-#: lib/models/segments.js:408 lib/models/segments.js:409
-msgid "%s days before today"
-msgstr ""
-
-#: lib/models/segments.js:148 lib/models/segments.js:410
-msgid "today"
-msgstr ""
-
-#: lib/models/segments.js:189 lib/models/segments.js:229
-msgid "Invalid segment rule type"
-msgstr ""
-
-#: lib/models/segments.js:289 lib/models/segments.js:454 routes/segments.js:266
-#: routes/segments.js:300 routes/segments.js:370 routes/segments.js:381
-msgid "Selected segment not found"
-msgstr ""
-
-#: lib/models/segments.js:294 lib/models/segments.js:459 routes/segments.js:272
-#: routes/segments.js:306 routes/segments.js:387
-msgid "Invalid rule type"
-msgstr ""
-
-#: lib/models/segments.js:358 lib/models/segments.js:434
-#: lib/models/segments.js:524
-msgid "Missing Rule ID"
-msgstr ""
-
-#: lib/models/segments.js:374
-msgid "Specified rule not found"
-msgstr ""
-
-#: lib/models/segments.js:385
-msgid "Specified segment not found"
-msgstr ""
-
-#: lib/models/segments.js:445
-msgid "Selected rule not found"
-msgstr ""
-
-#: lib/models/subscriptions.js:233
-msgid "%s: Please Confirm Subscription"
-msgstr ""
-
-#: lib/models/subscriptions.js:324
-msgid "Could not save subscription"
-msgstr ""
-
-#: lib/models/subscriptions.js:507 lib/models/subscriptions.js:537
-msgid "Missing Subscription ID"
-msgstr ""
-
-#: lib/models/subscriptions.js:565
-msgid "Missing Subscription email address"
-msgstr ""
-
-#: lib/models/subscriptions.js:644 lib/models/subscriptions.js:893
-#: lib/models/subscriptions.js:1156
-msgid "Missing subscription ID"
-msgstr ""
-
-#: lib/models/subscriptions.js:707
-msgid "Missing email address"
-msgstr ""
-
-#: lib/models/subscriptions.js:996 lib/models/subscriptions.js:1050
-#: lib/models/subscriptions.js:1086
-msgid "Missing Import ID"
-msgstr ""
-
-#: lib/models/subscriptions.js:1178
-msgid "Unknown subscription ID"
-msgstr ""
-
-#: lib/models/subscriptions.js:1183
-msgid "Nothing seems to be changed"
-msgstr ""
-
-#: lib/models/subscriptions.js:1197
-msgid "This address is already registered by someone else"
-msgstr ""
-
-#: lib/models/templates.js:51 lib/models/templates.js:122
-#: lib/models/templates.js:163
-msgid "Missing Template ID"
-msgstr ""
-
-#: lib/models/templates.js:80 lib/models/templates.js:126
-msgid "Template Name must be set"
-msgstr ""
-
-#: lib/models/triggers.js:28
-msgid "Has Opened"
-msgstr ""
-
-#: lib/models/triggers.js:31
-msgid "Has Clicked"
-msgstr ""
-
-#: lib/models/triggers.js:34
-msgid "Not Opened"
-msgstr ""
-
-#: lib/models/triggers.js:37
-msgid "Not Clicked"
-msgstr ""
-
-#: lib/models/triggers.js:174 lib/models/triggers.js:211
-msgid "Missing or invalid list ID"
-msgstr ""
-
-#: lib/models/triggers.js:178 lib/models/triggers.js:263
-msgid "Days in the past are not allowed"
-msgstr ""
-
-#: lib/models/triggers.js:182 lib/models/triggers.js:203
-#: lib/models/triggers.js:267 lib/models/triggers.js:288
-msgid "Missing or invalid trigger rule"
-msgstr ""
-
-#: lib/models/triggers.js:189 lib/models/triggers.js:274
-msgid "Invalid subscription configuration"
-msgstr ""
-
-#: lib/models/triggers.js:196 lib/models/triggers.js:281
-msgid "Invalid campaign configuration"
-msgstr ""
-
-#: lib/models/triggers.js:199 lib/models/triggers.js:284
-msgid "A campaing can not be a target for itself"
-msgstr ""
-
-#: lib/models/triggers.js:232
-msgid "Could not store trigger row"
-msgstr ""
-
-#: lib/models/triggers.js:249
-msgid "Missing or invalid Trigger ID"
-msgstr ""
-
-#: lib/models/triggers.js:316
-msgid "Missing Trigger ID"
-msgstr ""
-
-#: lib/models/users.js:103
-msgid "Could not store user row"
-msgstr ""
-
-#: lib/models/users.js:173
-msgid "Email Address must be set"
-msgstr ""
-
-#: lib/models/users.js:184
-msgid "Failed to check user data"
-msgstr ""
-
-#: lib/models/users.js:195
-msgid ""
-"Can't change email as another user with the same email address already exists"
-msgstr ""
-
-#: lib/models/users.js:212
-msgid "Incorrect current password"
-msgstr ""
-
-#: lib/models/users.js:216
-msgid "New password not set"
-msgstr ""
-
-#: lib/models/users.js:220
-msgid "Passwords do not match"
-msgstr ""
-
-#: lib/models/users.js:258
-msgid "User ID not set"
-msgstr ""
-
-#: lib/models/users.js:286
-msgid "Username must be set"
-msgstr ""
-
-#: lib/models/users.js:323
-msgid "Mailer password change request"
-msgstr ""
-
-#: lib/models/users.js:347 lib/models/users.js:367
-msgid "Missing username or reset token"
-msgstr ""
-
-#: lib/models/users.js:371
-msgid "Invalid new password"
-msgstr ""
-
-#: lib/passport.js:38
-msgid "%s logged out"
-msgstr ""
-
-#: lib/passport.js:51
-msgid "Failed to authenticate user"
-msgstr ""
-
-#: lib/passport.js:67
-msgid "Logged in as %s"
-msgstr ""
-
-#: lib/passport.js:125
-msgid "Incorrect username or password"
-msgstr ""
-
-#: lib/tools.js:123
-msgid "Automation"
-msgstr ""
-
-#: lib/tools.js:133
-msgid "Blocked email address \"%s\""
-msgstr ""
-
-#: lib/tools.js:142
-msgid "Invalid email address \"%s\"."
-msgstr ""
-
-#: lib/tools.js:145
-msgid "MX record not found for domain"
-msgstr ""
-
-#: lib/tools.js:148
-msgid "Address domain not found"
-msgstr ""
-
-#: lib/tools.js:151
-msgid "Address domain name is required"
-msgstr ""
-
-#: routes/archive.js:31 routes/archive.js:43 routes/archive.js:55 app.js:211
-msgid "Not Found"
-msgstr "Lehekülge ei leitud :("
-
-#: routes/archive.js:110 services/sender.js:447
-msgid "Received status code %s from %s"
-msgstr ""
-
-#: routes/archive.js:134 routes/campaigns.js:131 routes/campaigns.js:295
-#: routes/campaigns.js:390 routes/campaigns.js:435 routes/campaigns.js:475
-#: routes/campaigns.js:739 routes/campaigns.js:762 routes/campaigns.js:781
-#: routes/campaigns.js:803 routes/triggers.js:146
-msgid "Could not find campaign with specified ID"
-msgstr ""
-
-#: routes/archive.js:142 routes/campaigns.js:789
-msgid "Attachment not found"
-msgstr ""
-
-#: routes/campaigns.js:26 routes/fields.js:13 routes/lists.js:49
-#: routes/segments.js:13 routes/settings.js:23 routes/templates.js:17
-#: routes/triggers.js:18 routes/users.js:75 routes/users.js:120
-msgid "Need to be logged in to access restricted content"
-msgstr "Pead olema sisse logitud, et näha peidetud sisu"
-
-#: routes/campaigns.js:117
-msgid "Could not create campaign"
-msgstr ""
-
-#: routes/campaigns.js:120
-msgid "Campaign “%s” created"
-msgstr ""
-
-#: routes/campaigns.js:204
-msgid "content from an RSS entry"
-msgstr ""
-
-#: routes/campaigns.js:220
-msgid "Campaign settings updated"
-msgstr ""
-
-#: routes/campaigns.js:222
-msgid "Campaign settings not updated"
-msgstr ""
-
-#: routes/campaigns.js:238 routes/campaigns.js:639
-msgid "Campaign deleted"
-msgstr ""
-
-#: routes/campaigns.js:240 routes/campaigns.js:641
-msgid "Could not delete specified campaign"
-msgstr ""
-
-#: routes/campaigns.js:259
-msgid "Idling"
-msgstr ""
-
-#: routes/campaigns.js:262
-msgid "Scheduled"
-msgstr ""
-
-#: routes/campaigns.js:268
-msgid "Paused"
-msgstr ""
-
-#: routes/campaigns.js:270
-msgid "Inactive"
-msgstr ""
-
-#: routes/campaigns.js:272
-msgid "Active"
-msgstr ""
-
-#: routes/campaigns.js:274
-msgid "Other"
-msgstr ""
-
-#: routes/campaigns.js:429
-msgid "Unknown status selector"
-msgstr ""
-
-#: routes/campaigns.js:657
-msgid "Scheduled sending"
-msgstr ""
-
-#: routes/campaigns.js:659
-msgid "Could not schedule sending"
-msgstr ""
-
-#: routes/campaigns.js:671
-msgid "Sending resumed"
-msgstr ""
-
-#: routes/campaigns.js:673
-msgid "Could not resume sending"
-msgstr ""
-
-#: routes/campaigns.js:685
-msgid "Sending reset"
-msgstr ""
-
-#: routes/campaigns.js:687
-msgid "Could not reset sending"
-msgstr ""
-
-#: routes/campaigns.js:699 routes/campaigns.js:727
-msgid "Sending paused"
-msgstr ""
-
-#: routes/campaigns.js:701 routes/campaigns.js:729
-msgid "Could not pause sending"
-msgstr ""
-
-#: routes/campaigns.js:713
-msgid "Sending activated"
-msgstr ""
-
-#: routes/campaigns.js:715
-msgid "Could not activate sending"
-msgstr ""
-
-#: routes/campaigns.js:750
-msgid "Attachment uploaded"
-msgstr ""
-
-#: routes/campaigns.js:752
-msgid "Could not store attachment"
-msgstr ""
-
-#: routes/campaigns.js:769
-msgid "Attachment deleted"
-msgstr ""
-
-#: routes/campaigns.js:771
-msgid "Could not delete attachment"
-msgstr ""
-
-#: routes/fields.js:28 routes/fields.js:64 routes/fields.js:118
-#: routes/segments.js:28 routes/segments.js:59 routes/segments.js:102
-#: routes/segments.js:151 routes/segments.js:223 routes/segments.js:255
-#: routes/segments.js:289 routes/segments.js:336 routes/segments.js:359
-msgid "Selected list ID not found"
-msgstr ""
-
-#: routes/fields.js:102
-msgid "Could not create custom field"
-msgstr ""
-
-#: routes/fields.js:129
-msgid "Selected field not found"
-msgstr ""
-
-#: routes/fields.js:165
-msgid "Field settings updated"
-msgstr ""
-
-#: routes/fields.js:167
-msgid "Field settings not updated"
-msgstr ""
-
-#: routes/fields.js:183
-msgid "Custom field deleted"
-msgstr ""
-
-#: routes/fields.js:185
-msgid "Could not delete specified field"
-msgstr ""
-
-#: routes/links.js:40
-msgid "Oops, we couldn't find a link for the URL you clicked"
-msgstr ""
-
-#: routes/lists.js:90
-msgid "Could not create list"
-msgstr ""
-
-#: routes/lists.js:93
-msgid "List created"
-msgstr ""
-
-#: routes/lists.js:101 routes/lists.js:236 routes/lists.js:301
-#: routes/lists.js:340 routes/lists.js:409 routes/lists.js:434
-#: routes/lists.js:479 routes/lists.js:501 routes/lists.js:530
-#: routes/lists.js:609 routes/lists.js:666 routes/lists.js:693
-msgid "Could not find list with specified ID"
-msgstr ""
-
-#: routes/lists.js:115
-msgid "List settings updated"
-msgstr ""
-
-#: routes/lists.js:117
-msgid "List settings not updated"
-msgstr ""
-
-#: routes/lists.js:133
-msgid "List deleted"
-msgstr ""
-
-#: routes/lists.js:135
-msgid "Could not delete specified list"
-msgstr ""
-
-#: routes/lists.js:171
-msgid "Unknown"
-msgstr ""
-
-#: routes/lists.js:171
-msgid "Complained"
-msgstr ""
-
-#: routes/lists.js:202
-msgid "Invalid key"
-msgstr ""
-
-#: routes/lists.js:204
-msgid "Expired key"
-msgstr ""
-
-#: routes/lists.js:206
-msgid "Revoked key"
-msgstr ""
-
-#: routes/lists.js:256
-msgid "Initializing"
-msgstr ""
-
-#: routes/lists.js:259
-msgid "Initialized"
-msgstr ""
-
-#: routes/lists.js:262
-msgid "Importing"
-msgstr ""
-
-#: routes/lists.js:268
-msgid "Errored"
-msgstr ""
-
-#: routes/lists.js:346 routes/lists.js:415 routes/lists.js:440
-msgid "Could not find subscriber with specified ID"
-msgstr ""
-
-#: routes/lists.js:392
-msgid "Could not add subscription"
-msgstr ""
-
-#: routes/lists.js:397
-msgid "%s was successfully added to your list"
-msgstr ""
-
-#: routes/lists.js:399
-msgid "%s was not added to your list"
-msgstr ""
-
-#: routes/lists.js:421
-msgid "Could not unsubscribe user"
-msgstr ""
-
-#: routes/lists.js:424
-msgid "%s was successfully unsubscribed from your list"
-msgstr ""
-
-#: routes/lists.js:444
-msgid "%s was successfully removed from your list"
-msgstr ""
-
-#: routes/lists.js:456
-msgid "Another subscriber with email address %s already exists"
-msgstr ""
-
-#: routes/lists.js:463
-msgid "Subscription settings updated"
-msgstr ""
-
-#: routes/lists.js:465
-msgid "Subscription settings not updated"
-msgstr ""
-
-#: routes/lists.js:507 routes/lists.js:615 routes/lists.js:651
-#: routes/lists.js:679 routes/lists.js:699
-msgid "Could not find import data with specified ID"
-msgstr ""
-
-#: routes/lists.js:538
-msgid "Could not process CSV"
-msgstr ""
-
-#: routes/lists.js:547
-msgid "Could not create importer"
-msgstr ""
-
-#: routes/lists.js:598
-msgid "Empty file"
-msgstr ""
-
-#: routes/lists.js:655
-msgid "Import started"
-msgstr ""
-
-#: routes/lists.js:683
-msgid "Import restarted"
-msgstr ""
-
-#: routes/segments.js:86
-msgid "Could not create segment"
-msgstr ""
-
-#: routes/segments.js:89
-msgid "Segment created"
-msgstr ""
-
-#: routes/segments.js:113
-msgid "Selected segment ID not found"
-msgstr ""
-
-#: routes/segments.js:188
-msgid "Segment settings updated"
-msgstr ""
-
-#: routes/segments.js:190
-msgid "Segment settings not updated"
-msgstr ""
-
-#: routes/segments.js:206
-msgid "Segment deleted"
-msgstr ""
-
-#: routes/segments.js:208
-msgid "Could not delete specified segment"
-msgstr ""
-
-#: routes/segments.js:342
-msgid "Could not create rule"
-msgstr ""
-
-#: routes/segments.js:345
-msgid "Rule created"
-msgstr ""
-
-#: routes/segments.js:410
-msgid "Rule settings updated"
-msgstr ""
-
-#: routes/segments.js:412
-msgid "Rule settings not updated"
-msgstr ""
-
-#: routes/segments.js:428
-msgid "Rule deleted"
-msgstr ""
-
-#: routes/segments.js:430
-msgid "Could not delete specified rule"
-msgstr ""
-
-#: routes/settings.js:39
-msgid "Use TLS"
-msgstr "Kasuta TLSi"
-
-#: routes/settings.js:40
-msgid "usually selected for port 465"
-msgstr "tavaliselt valitakse, kui port on 465"
-
-#: routes/settings.js:44
-msgid "Use STARTTLS"
-msgstr "Kasuta STARTTLSi"
-
-#: routes/settings.js:45
-msgid "usually selected for port 587 and 25"
-msgstr "tavaliselt valitakse, kui port on 587 või 25"
-
-#: routes/settings.js:49
-msgid "Do not use encryption"
-msgstr "Ära kasuta ühenduse krüpteerimist"
-
-#: routes/settings.js:115
-msgid "Settings updated"
-msgstr "Seaded uuendatud"
-
-#: routes/settings.js:173
-msgid "Invalid mail transport type"
-msgstr "Viga maili transpordi tüüp"
-
-#: routes/settings.js:184
-msgid "Invalid Access Key"
-msgstr "Vigae ligipääsuvõti"
-
-#: routes/settings.js:187
-msgid "Invalid AWS credentials"
-msgstr "VIgased AWS võtmed"
-
-#: routes/settings.js:190
-msgid "Connection refused, check hostname and port."
-msgstr "Ühendusest keelduti, kontrolli domeeninime ja porti"
-
-#: routes/settings.js:195
-msgid ""
-"Did not receive greeting message from server. This might happen when "
-"connecting to a TLS port without using TLS."
-msgstr ""
-"Ei saanud serverilt vastust, see juhtub tavaliselt kui ühendus TLS "
-"serverisse ilma TLS kasutamata"
-
-#: routes/settings.js:197
-msgid "Did not receive greeting message from server."
-msgstr "Ei saanud serverilt vastust"
-
-#: routes/settings.js:200
-msgid ""
-"Connection timed out. Check your firewall settings, destination port is "
-"probably blocked."
-msgstr ""
-"Ühendus aegus. Kontrolli oma tulemüüri seadeid, tõenäoliselt on serveir port "
-"blokeeritud"
-
-#: routes/settings.js:205
-msgid "Authentication not accepted, server expects STARTTLS to be used."
-msgstr "Autentimist ei lubatud, server nõuab STARTTLS kasutamist"
-
-#: routes/settings.js:207
-msgid "Authentication failed, check username and password."
-msgstr "Autentimine ebaõnnestus, kontrolli kasutajanime ja parooli"
-
-#: routes/settings.js:217
-msgid "Failed Mailer verification."
-msgstr "E-posti seadistuse kontroll ebaõnnestus"
-
-#: routes/settings.js:217
-msgid "Server responded with: \"%s\""
-msgstr "Server vastas \"%s\""
-
-#: routes/settings.js:221
-msgid "Mailer settings verified, ready to send some mail!"
-msgstr "E-posti seaded on kontrollitud, võid hakata kirju saatma"
-
-#: routes/subscription.js:22
-msgid "Selected subscription not found"
-msgstr ""
-
-#: routes/subscription.js:32 routes/subscription.js:103
-#: routes/subscription.js:141 routes/subscription.js:166
-#: routes/subscription.js:191 routes/subscription.js:232
-#: routes/subscription.js:270 routes/subscription.js:317
-#: routes/subscription.js:339 routes/subscription.js:368
-#: routes/subscription.js:392 routes/subscription.js:424
-msgid "Selected list not found"
-msgstr ""
-
-#: routes/subscription.js:78 routes/subscription.js:472
-msgid "%s: Subscription Confirmed"
-msgstr ""
-
-#: routes/subscription.js:217
-msgid "Email address not set"
-msgstr ""
-
-#: routes/subscription.js:255
-msgid "Could not store confirmation data"
-msgstr ""
-
-#: routes/subscription.js:284 routes/subscription.js:349
-#: routes/subscription.js:402
-msgid "Subscription not found from this list"
-msgstr ""
-
-#: routes/subscription.js:383
-msgid "Email address updated, check your mailbox for verification instructions"
-msgstr ""
-
-#: routes/subscription.js:499 routes/subscription.js:515
-msgid "Public key is not set"
-msgstr ""
-
-#: routes/templates.js:98
-msgid "Could not create template"
-msgstr ""
-
-#: routes/templates.js:101
-msgid "Template created"
-msgstr ""
-
-#: routes/templates.js:109
-msgid "Could not find template with specified ID"
-msgstr ""
-
-#: routes/templates.js:140
-msgid "Template settings updated"
-msgstr ""
-
-#: routes/templates.js:142
-msgid "Template settings not updated"
-msgstr ""
-
-#: routes/templates.js:158
-msgid "Template deleted"
-msgstr ""
-
-#: routes/templates.js:160
-msgid "Could not delete specified template"
-msgstr ""
-
-#: routes/triggers.js:62 routes/triggers.js:79 routes/triggers.js:154
-msgid "Could not find selected list"
-msgstr ""
-
-#: routes/triggers.js:131
-msgid "Could not create trigger"
-msgstr ""
-
-#: routes/triggers.js:138
-msgid "Trigger “%s” created"
-msgstr ""
-
-#: routes/triggers.js:214
-msgid "Trigger settings updated"
-msgstr ""
-
-#: routes/triggers.js:216
-msgid "Trigger settings not updated"
-msgstr ""
-
-#: routes/triggers.js:228
-msgid "Trigger deleted"
-msgstr ""
-
-#: routes/triggers.js:230
-msgid "Could not delete specified trigger"
-msgstr ""
-
-#: routes/triggers.js:242
-msgid "Could not find trigger with specified ID"
-msgstr ""
-
-#: routes/triggers.js:255
-msgid "Trigger not found"
-msgstr ""
-
-#: routes/users.js:32
-msgid ""
-"An email with password reset instructions has been sent to your email "
-"address, if it exists on our system."
-msgstr ""
-
-#: routes/users.js:46 routes/users.js:64
-msgid "Unknown or expired reset token"
-msgstr ""
-
-#: routes/users.js:66
-msgid "Your password has been changed successfully"
-msgstr ""
-
-#: routes/users.js:87
-msgid "User data not found"
-msgstr ""
-
-#: routes/users.js:110
-msgid "Access token updated"
-msgstr ""
-
-#: routes/users.js:112
-msgid "Access token not updated"
-msgstr ""
-
-#: routes/users.js:139
-msgid "Account information updated"
-msgstr ""
-
-#: routes/users.js:141
-msgid "Account information not updated"
-msgstr ""
-
-#: services/feedcheck.js:51
-msgid "Feed error: %s"
-msgstr ""
-
-#: services/feedcheck.js:54
-msgid "Found %s new campaign messages from feed"
-msgstr ""
-
-#: services/feedcheck.js:56
-msgid "Found nothing new from the feed"
-msgstr ""
-
-#: services/feedcheck.js:143
-msgid "RSS entry %s"
-msgstr ""
-
-#: services/importer.js:243
-msgid "Could not access import file"
-msgstr ""
-
-#: services/triggers.js:51
-msgid "Unknown trigger type %s"
-msgstr ""
diff --git a/languages/fr_FR.mo b/languages/fr_FR.mo
deleted file mode 100644
index 8ffb0982..00000000
Binary files a/languages/fr_FR.mo and /dev/null differ
diff --git a/languages/fr_FR.po b/languages/fr_FR.po
deleted file mode 100644
index 0b493f3b..00000000
--- a/languages/fr_FR.po
+++ /dev/null
@@ -1,4796 +0,0 @@
-msgid ""
-msgstr ""
-"Project-Id-Version: \n"
-"Language-Team: \n"
-"Report-Msgid-Bugs-To: \n"
-"PO-Revision-Date: 2018-08-11 13:55+0200\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"POT-Creation-Date: 2018-08-09 16:59+0200\n"
-"X-Generator: Poedit 1.8.7.1\n"
-"Last-Translator: \n"
-"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-"Language: fr_FR\n"
-"X-Poedit-Basepath: .\n"
-"X-Poedit-SearchPath-0: .\n"
-
-#: views/archive/layout.hbs:1 views/layout.hbs:1
-msgid "Self hosted email newsletter app"
-msgstr "Solution de Newsletter auto-hébergée"
-
-#: views/blacklist.hbs:1 views/campaigns/blacklisted.hbs:1
-#: views/campaigns/bounced.hbs:1 views/campaigns/campaigns.hbs:1
-#: views/campaigns/clicked.hbs:1 views/campaigns/complained.hbs:1
-#: views/campaigns/create-rss.hbs:1 views/campaigns/create-triggered.hbs:1
-#: views/campaigns/create.hbs:1 views/campaigns/delivered.hbs:1
-#: views/campaigns/edit-rss.hbs:1 views/campaigns/edit-triggered.hbs:1
-#: views/campaigns/edit.hbs:1 views/campaigns/opened.hbs:1
-#: views/campaigns/unsubscribed.hbs:1 views/campaigns/upload-attachment.hbs:1
-#: views/campaigns/view.hbs:1 views/lists/create.hbs:1 views/lists/edit.hbs:1
-#: views/lists/fields/create.hbs:1 views/lists/fields/edit.hbs:1
-#: views/lists/fields/fields.hbs:1 views/lists/forms/create.hbs:1
-#: views/lists/forms/edit.hbs:1 views/lists/forms/forms.hbs:1
-#: views/lists/lists.hbs:1 views/lists/segments/create.hbs:1
-#: views/lists/segments/edit.hbs:1 views/lists/segments/rule-configure.hbs:1
-#: views/lists/segments/rule-create.hbs:1 views/lists/segments/rule-edit.hbs:1
-#: views/lists/segments/segments.hbs:1 views/lists/segments/view.hbs:1
-#: views/lists/subscription/add.hbs:1 views/lists/subscription/edit.hbs:1
-#: views/lists/subscription/import-failed.hbs:1
-#: views/lists/subscription/import-preview.hbs:1
-#: views/lists/subscription/import.hbs:1 views/lists/view.hbs:1
-#: views/report-templates/create.hbs:1 views/report-templates/edit.hbs:1
-#: views/report-templates/report-templates.hbs:1
-#: views/reports/create-select-template.hbs:1 views/reports/create.hbs:1
-#: views/reports/edit.hbs:1 views/reports/output.hbs:1
-#: views/reports/reports.hbs:1 views/reports/view.hbs:1 views/settings.hbs:1
-#: views/templates/create.hbs:1 views/templates/edit.hbs:1
-#: views/templates/templates.hbs:1 views/triggers/create-select.hbs:1
-#: views/triggers/create.hbs:1 views/triggers/edit.hbs:1
-#: views/triggers/triggered.hbs:1 views/triggers/triggers.hbs:1
-#: views/users/account.hbs:1 views/users/api.hbs:1 views/users/forgot.hbs:1
-#: views/users/login.hbs:1 views/users/reset.hbs:1 app.js:169
-msgid "Home"
-msgstr "Accueil"
-
-#: views/blacklist.hbs:2 views/blacklist.hbs:3 views/layout.hbs:7
-#: views/lists/subscription/edit.hbs:15
-msgid "Blacklist"
-msgstr "Liste noire"
-
-#: views/blacklist.hbs:4 views/users/api.hbs:76
-msgid "Add email to blacklist"
-msgstr "Ajouter à la liste noire"
-
-#: views/blacklist.hbs:5
-msgid "Add"
-msgstr "Ajouter"
-
-#: views/blacklist.hbs:6
-msgid "Email"
-msgstr "Email"
-
-#: views/campaigns/blacklisted.hbs:2 views/campaigns/bounced.hbs:2
-#: views/campaigns/campaigns.hbs:2 views/campaigns/campaigns.hbs:7
-#: views/campaigns/clicked.hbs:2 views/campaigns/complained.hbs:2
-#: views/campaigns/create-rss.hbs:2 views/campaigns/create-triggered.hbs:2
-#: views/campaigns/create.hbs:2 views/campaigns/delivered.hbs:2
-#: views/campaigns/edit-rss.hbs:2 views/campaigns/edit-triggered.hbs:2
-#: views/campaigns/edit.hbs:2 views/campaigns/opened.hbs:2
-#: views/campaigns/unsubscribed.hbs:2 views/campaigns/upload-attachment.hbs:2
-#: views/campaigns/view.hbs:2 lib/tools.js:133 routes/campaigns.js:35
-msgid "Campaigns"
-msgstr "Campagnes"
-
-#: views/campaigns/blacklisted.hbs:3 views/campaigns/blacklisted.hbs:4
-msgid "Blacklisted info"
-msgstr "Information de liste noire"
-
-#: views/campaigns/blacklisted.hbs:5 views/campaigns/bounced.hbs:5
-#: views/campaigns/clicked.hbs:5 views/campaigns/complained.hbs:5
-#: views/campaigns/delivered.hbs:5 views/campaigns/edit-rss.hbs:5
-#: views/campaigns/edit-triggered.hbs:5 views/campaigns/edit.hbs:5
-#: views/campaigns/opened.hbs:5 views/campaigns/unsubscribed.hbs:5
-#: views/campaigns/upload-attachment.hbs:6
-msgid "View campaign"
-msgstr "Voir la campagne"
-
-#: views/campaigns/blacklisted.hbs:6
-msgid "Subscribers who blacklisted by global blacklist:"
-msgstr "Listes des abonnés faisant partie de la liste noire globale :"
-
-#: views/campaigns/blacklisted.hbs:7 views/campaigns/bounced.hbs:7
-#: views/campaigns/clicked.hbs:15 views/campaigns/complained.hbs:7
-#: views/campaigns/delivered.hbs:7 views/campaigns/opened.hbs:9
-#: views/campaigns/unsubscribed.hbs:7
-#: views/lists/subscription/import-failed.hbs:8 views/lists/view.hbs:19
-#: views/triggers/triggered.hbs:6
-msgid "Address"
-msgstr "Adresse"
-
-#: views/campaigns/blacklisted.hbs:8 views/campaigns/bounced.hbs:8
-#: views/campaigns/clicked.hbs:16 views/campaigns/complained.hbs:8
-#: views/campaigns/delivered.hbs:8 views/campaigns/opened.hbs:10
-#: views/campaigns/unsubscribed.hbs:8 views/lists/subscription/add.hbs:6
-#: views/lists/subscription/edit.hbs:7
-#: views/lists/subscription/import-preview.hbs:7 views/lists/view.hbs:20
-#: views/subscription/partials/subscription-custom-fields.hbs:3
-#: views/triggers/triggered.hbs:7
-msgid "First Name"
-msgstr "Prénom"
-
-#: views/campaigns/blacklisted.hbs:9 views/campaigns/bounced.hbs:9
-#: views/campaigns/clicked.hbs:17 views/campaigns/complained.hbs:9
-#: views/campaigns/delivered.hbs:9 views/campaigns/opened.hbs:11
-#: views/campaigns/unsubscribed.hbs:9 views/lists/subscription/add.hbs:7
-#: views/lists/subscription/edit.hbs:8
-#: views/lists/subscription/import-preview.hbs:8 views/lists/view.hbs:21
-#: views/subscription/partials/subscription-custom-fields.hbs:4
-#: views/triggers/triggered.hbs:8
-msgid "Last Name"
-msgstr "Nom"
-
-#: views/campaigns/blacklisted.hbs:10
-msgid "Reason"
-msgstr "Raison"
-
-#: views/campaigns/blacklisted.hbs:11
-msgid "Time"
-msgstr "Heure"
-
-#: views/campaigns/bounced.hbs:3 views/campaigns/bounced.hbs:4
-msgid "Bounced info"
-msgstr "Informations sur les rejets"
-
-#: views/campaigns/bounced.hbs:6
-msgid "Subscribers who bounced and were unsubscribed:"
-msgstr "Abonnés en erreur qui ont été désinscrits :"
-
-#: views/campaigns/bounced.hbs:10 views/campaigns/complained.hbs:10
-#: views/campaigns/delivered.hbs:10 views/campaigns/unsubscribed.hbs:10
-msgid "SMTP response"
-msgstr "Réponse SMTP"
-
-#: views/campaigns/bounced.hbs:11
-msgid "Bounce time"
-msgstr "Heure du rejet"
-
-#: views/campaigns/campaigns.hbs:3 views/campaigns/create-triggered.hbs:26
-#: views/campaigns/create.hbs:3 views/campaigns/create.hbs:4
-#: views/campaigns/create.hbs:30
-msgid "Create Campaign"
-msgstr "Créer une campagne"
-
-#: views/campaigns/campaigns.hbs:4
-msgid "Regular Campaign"
-msgstr "Campagne ordinaire"
-
-#: views/campaigns/campaigns.hbs:5
-msgid "RSS Campaign"
-msgstr "Campagne RSS"
-
-#: views/campaigns/campaigns.hbs:6
-msgid "Triggered Campaign"
-msgstr "Campagne pilotée par déclencheurs"
-
-#: views/campaigns/campaigns.hbs:8 views/campaigns/create-rss.hbs:6
-#: views/campaigns/create-triggered.hbs:5 views/campaigns/create.hbs:5
-#: views/campaigns/edit-rss.hbs:8 views/campaigns/edit-triggered.hbs:9
-#: views/campaigns/edit.hbs:10 views/campaigns/view.hbs:73
-#: views/lists/create.hbs:5 views/lists/edit.hbs:6
-#: views/lists/fields/fields.hbs:6 views/lists/forms/forms.hbs:6
-#: views/lists/lists.hbs:5 views/lists/segments/segments.hbs:6
-#: views/report-templates/partials/report-template-fields.hbs:1
-#: views/report-templates/report-templates.hbs:10
-#: views/reports/partials/report-fields.hbs:1
-#: views/reports/partials/report-fields.hbs:5
-#: views/reports/partials/report-fields.hbs:9 views/reports/reports.hbs:6
-#: views/templates/templates.hbs:5 views/triggers/triggers.hbs:5
-msgid "Name"
-msgstr "Nom"
-
-#: views/campaigns/campaigns.hbs:9 views/campaigns/create-rss.hbs:8
-#: views/campaigns/create-triggered.hbs:7 views/campaigns/create.hbs:7
-#: views/campaigns/edit-rss.hbs:10 views/campaigns/edit-triggered.hbs:11
-#: views/campaigns/edit.hbs:12 views/campaigns/view.hbs:74
-#: views/lists/create.hbs:7 views/lists/edit.hbs:10
-#: views/lists/forms/edit.hbs:9 views/lists/forms/forms.hbs:7
-#: views/lists/lists.hbs:8 views/mosaico/editor.hbs:3
-#: views/partials/merge-tag-reference.hbs:4
-#: views/report-templates/partials/report-template-fields.hbs:3
-#: views/report-templates/report-templates.hbs:11
-#: views/reports/partials/report-fields.hbs:3
-#: views/reports/partials/report-fields.hbs:6 views/reports/reports.hbs:8
-#: views/templates/create.hbs:9 views/templates/edit.hbs:8
-#: views/templates/templates.hbs:6 views/triggers/create.hbs:7
-#: views/triggers/edit.hbs:8 views/triggers/triggers.hbs:7
-msgid "Description"
-msgstr "Description"
-
-#: views/campaigns/campaigns.hbs:10 views/campaigns/view.hbs:75
-#: views/lists/view.hbs:22 views/lists/view.hbs:30
-#: views/triggers/triggers.hbs:6
-msgid "Status"
-msgstr "Statut"
-
-#: views/campaigns/campaigns.hbs:11 views/campaigns/view.hbs:76
-#: views/lists/view.hbs:23 views/lists/view.hbs:24
-#: views/report-templates/report-templates.hbs:12
-#: views/reports/partials/report-fields.hbs:7 views/reports/reports.hbs:9
-msgid "Created"
-msgstr "Créé"
-
-#: views/campaigns/clicked.hbs:3 views/campaigns/clicked.hbs:4
-msgid "Link info"
-msgstr "Information sur les liens"
-
-#: views/campaigns/clicked.hbs:6 views/campaigns/view.hbs:63
-msgid "URL"
-msgstr "URL"
-
-#: views/campaigns/clicked.hbs:7 views/campaigns/view.hbs:64
-msgid "Clicks"
-msgstr "Clics"
-
-#: views/campaigns/clicked.hbs:8 views/campaigns/view.hbs:65
-msgid "% of clicks"
-msgstr "% de clics"
-
-#: views/campaigns/clicked.hbs:9 views/campaigns/view.hbs:66
-msgid "% of messages"
-msgstr "% de messages"
-
-#: views/campaigns/clicked.hbs:10 views/campaigns/view.hbs:69
-msgid "Aggregated clicks"
-msgstr "Clics agrégés"
-
-#: views/campaigns/clicked.hbs:11
-msgid "Subscribers who clicked on a link:"
-msgstr "Abonnés ayant cliqué sur un lien :"
-
-#: views/campaigns/clicked.hbs:12
-msgid "Subscribers who clicked on this link:"
-msgstr "Abonnés ayant cliqué sur ce lien :"
-
-#: views/campaigns/clicked.hbs:13 views/campaigns/opened.hbs:7
-msgid "Stats by country"
-msgstr "Statistiques par pays"
-
-#: views/campaigns/clicked.hbs:14 views/campaigns/opened.hbs:8
-msgid "Stats by device type"
-msgstr "Statistiques par type d'équipement"
-
-#: views/campaigns/clicked.hbs:18
-msgid "First click time"
-msgstr "Heure du premier clic"
-
-#: views/campaigns/clicked.hbs:19
-msgid "Click count"
-msgstr "Nombre de clics"
-
-#: views/campaigns/complained.hbs:3 views/campaigns/complained.hbs:4
-msgid "Complained info"
-msgstr "Information de plainte"
-
-#: views/campaigns/complained.hbs:6
-msgid "Subscribers who complained and were unsubscribed:"
-msgstr "Abonnés s'étant plaint et ayant été désinscrits :"
-
-#: views/campaigns/complained.hbs:11
-msgid "Complain time"
-msgstr "Heure de la plainte"
-
-#: views/campaigns/create-rss.hbs:3 views/campaigns/create-rss.hbs:4
-#: views/campaigns/create-rss.hbs:21
-msgid "Create RSS Campaign"
-msgstr "Créer une campagne RSS"
-
-#: views/campaigns/create-rss.hbs:5 views/campaigns/edit-rss.hbs:6
-msgid ""
-"RSS campaign sets up a tracker against selected RSS feed address. Whenever a "
-"new entry is found from this feed it is sent to selected list as an email "
-"message."
-msgstr ""
-"Une campagne RSS met en place un traqueur de flux RSS. Dès qu'une nouvelle "
-"entrée est trouvée dans le flux, elle est envoyée à la liste sous forme mail."
-
-#: views/campaigns/create-rss.hbs:7 views/campaigns/create-triggered.hbs:6
-#: views/campaigns/create.hbs:6 views/campaigns/edit-rss.hbs:9
-#: views/campaigns/edit-triggered.hbs:10 views/campaigns/edit.hbs:11
-msgid "Campaign Name"
-msgstr "Nom de la campagne"
-
-#: views/campaigns/create-rss.hbs:9 views/campaigns/create-triggered.hbs:8
-#: views/campaigns/create.hbs:8 views/campaigns/edit-rss.hbs:11
-#: views/campaigns/edit-triggered.hbs:12 views/campaigns/edit.hbs:13
-#: views/lists/create.hbs:8 views/lists/edit.hbs:11
-#: views/report-templates/partials/report-template-fields.hbs:4
-#: views/reports/partials/report-fields.hbs:4 views/templates/create.hbs:11
-#: views/templates/edit.hbs:10 views/triggers/create.hbs:9
-#: views/triggers/edit.hbs:10
-msgid "HTML is allowed"
-msgstr "Le HTML est autorisé"
-
-#: views/campaigns/create-rss.hbs:10 views/campaigns/create-triggered.hbs:9
-#: views/campaigns/create.hbs:9 views/campaigns/edit-rss.hbs:12
-#: views/campaigns/edit-triggered.hbs:13 views/campaigns/edit.hbs:14
-#: views/campaigns/view.hbs:6 views/triggers/create-select.hbs:6
-#: views/triggers/create.hbs:10 views/triggers/edit.hbs:12
-#: views/triggers/triggers.hbs:8
-msgid "List"
-msgstr "Liste"
-
-#: views/campaigns/create-rss.hbs:11 views/campaigns/create-triggered.hbs:10
-#: views/campaigns/create-triggered.hbs:14 views/campaigns/create.hbs:10
-#: views/campaigns/create.hbs:14 views/campaigns/edit-rss.hbs:13
-#: views/campaigns/edit-triggered.hbs:14 views/campaigns/edit.hbs:15
-#: views/lists/fields/create.hbs:27 views/lists/fields/edit.hbs:28
-#: views/lists/segments/create.hbs:9 views/lists/segments/edit.hbs:10
-#: views/lists/segments/rule-create.hbs:7 views/lists/subscription/add.hbs:10
-#: views/lists/subscription/add.hbs:12 views/lists/subscription/edit.hbs:11
-#: views/lists/subscription/import-preview.hbs:5
-#: views/reports/partials/report-select-template.hbs:2
-#: views/subscription/partials/subscription-custom-fields.hbs:9
-#: views/templates/create.hbs:8 views/triggers/create-select.hbs:7
-#: views/triggers/create.hbs:17 views/triggers/create.hbs:20
-#: views/triggers/create.hbs:22 views/triggers/create.hbs:26
-#: views/triggers/edit.hbs:19 views/triggers/edit.hbs:22
-#: views/triggers/edit.hbs:24 views/triggers/edit.hbs:28
-msgid "Select"
-msgstr "Sélectionner"
-
-#: views/campaigns/create-rss.hbs:12 views/campaigns/create-triggered.hbs:11
-#: views/campaigns/create.hbs:11 views/campaigns/edit-rss.hbs:14
-#: views/campaigns/edit-triggered.hbs:15 views/campaigns/edit.hbs:16
-#: views/triggers/create-select.hbs:8 views/triggers/create.hbs:11
-#: views/triggers/edit.hbs:13
-msgid "subscribers"
-msgstr "abonnés"
-
-#: views/campaigns/create-rss.hbs:13 views/campaigns/edit-rss.hbs:15
-msgid "RSS Feed Url"
-msgstr "URL du flux RSS"
-
-#: views/campaigns/create-rss.hbs:14 views/campaigns/edit-rss.hbs:16
-msgid ""
-"New entries from this RSS URL are sent out to list subscribers as email "
-"messages"
-msgstr ""
-"Les nouvelles entrées de ce flux RSS seront envoyées aux abonnés sous forme "
-"de messages mail"
-
-#: views/campaigns/create-rss.hbs:15 views/campaigns/create-triggered.hbs:18
-#: views/campaigns/create.hbs:18 views/campaigns/edit-rss.hbs:18
-#: views/campaigns/edit-triggered.hbs:16 views/campaigns/edit.hbs:17
-#: views/campaigns/view.hbs:12
-msgid "Email \"from name\""
-msgstr "Nom de l'émetteur du message"
-
-#: views/campaigns/create-rss.hbs:16 views/campaigns/create-triggered.hbs:19
-#: views/campaigns/create.hbs:19 views/campaigns/edit-rss.hbs:19
-#: views/campaigns/edit-triggered.hbs:17 views/campaigns/edit.hbs:18
-#: views/settings.hbs:25
-msgid "This is the name your emails will come from"
-msgstr "Il s'agit du nom d'émetteur utilisé pour les messages de la liste"
-
-#: views/campaigns/create-rss.hbs:17 views/campaigns/create-triggered.hbs:20
-#: views/campaigns/create.hbs:20 views/campaigns/edit-rss.hbs:20
-#: views/campaigns/edit-triggered.hbs:18 views/campaigns/edit.hbs:19
-#: views/campaigns/view.hbs:13
-msgid "Email \"from\" address"
-msgstr "Adresse de l'émetteur du message"
-
-#: views/campaigns/create-rss.hbs:18 views/campaigns/create-triggered.hbs:21
-#: views/campaigns/edit-rss.hbs:21 views/campaigns/edit-triggered.hbs:19
-#: views/settings.hbs:27
-msgid "This is the address people will send replies to"
-msgstr "L'adresse à laquelle les utilisateurs enverront leurs réponses"
-
-#: views/campaigns/create-rss.hbs:19 views/campaigns/create-triggered.hbs:24
-#: views/campaigns/create.hbs:28 views/campaigns/edit-rss.hbs:22
-#: views/campaigns/edit-triggered.hbs:22 views/campaigns/edit.hbs:27
-msgid "Disable opened tracking"
-msgstr "Désactiver le suivi des ouvertures"
-
-#: views/campaigns/create-rss.hbs:20 views/campaigns/create-triggered.hbs:25
-#: views/campaigns/create.hbs:29 views/campaigns/edit-rss.hbs:23
-#: views/campaigns/edit-triggered.hbs:23 views/campaigns/edit.hbs:28
-msgid "Disable clicked tracking"
-msgstr "Désactiver le suivi des clics"
-
-#: views/campaigns/create-triggered.hbs:3
-#: views/campaigns/create-triggered.hbs:4
-msgid "Create Triggered Campaign"
-msgstr "Créer une campagne programmée"
-
-#: views/campaigns/create-triggered.hbs:12 views/campaigns/create.hbs:12
-#: views/campaigns/edit-triggered.hbs:7 views/campaigns/edit.hbs:7
-#: views/lists/fields/create.hbs:31 views/lists/fields/edit.hbs:33
-#: views/reports/reports.hbs:7 views/templates/create.hbs:13
-msgid "Template"
-msgstr "Modèle"
-
-#: views/campaigns/create-triggered.hbs:13 views/campaigns/create.hbs:13
-msgid "Select a template:"
-msgstr "Sélectionnez un modèle :"
-
-#: views/campaigns/create-triggered.hbs:15 views/campaigns/create.hbs:15
-msgid "Selecting a template creates a campaign specific copy from it"
-msgstr "Modèle de base pour la création de la campagne"
-
-#: views/campaigns/create-triggered.hbs:16 views/campaigns/create.hbs:16
-msgid "Or alternatively use an URL as the message content source:"
-msgstr ""
-"Ou bien utiliser à la place une URL pour récupérer le contenu du message :"
-
-#: views/campaigns/create-triggered.hbs:17 views/campaigns/create.hbs:17
-#: views/campaigns/edit-triggered.hbs:26 views/campaigns/edit.hbs:31
-msgid ""
-"If a message is sent then this URL will be POSTed to using Merge Tags as "
-"POST body. Use this if you want to generate the HTML message yourself"
-msgstr ""
-"Lorsqu'un message est envoyé, cette URL sera POSTée avec les champs de "
-"publipostage dans le corps de la requête. Utilisez cette fonctionnalité si "
-"vous voulez générer le message HTML par vous-même"
-
-#: views/campaigns/create-triggered.hbs:22 views/campaigns/create.hbs:24
-#: views/campaigns/edit-triggered.hbs:20 views/campaigns/edit.hbs:23
-#: views/campaigns/view.hbs:15
-msgid "Email \"subject line\""
-msgstr "Objet du message"
-
-#: views/campaigns/create-triggered.hbs:23 views/campaigns/create.hbs:25
-#: views/campaigns/edit-triggered.hbs:21 views/campaigns/edit.hbs:24
-#: views/settings.hbs:29
-msgid "Keep it relevant and non-spammy"
-msgstr "Adéquat et non raccoleur"
-
-#: views/campaigns/create.hbs:21 views/campaigns/edit.hbs:20
-msgid ""
-"This is the address people will send replies to unless reply-to address is "
-"set"
-msgstr ""
-"L'adresse à laquelle les utilisateurs enverront leurs réponses, sauf si une "
-"autre adresse Reply-to a été précisée"
-
-#: views/campaigns/create.hbs:22 views/campaigns/edit.hbs:21
-#: views/campaigns/view.hbs:14
-msgid "Email \"reply-to\" address"
-msgstr "Adresse de réponse Reply-to du message"
-
-#: views/campaigns/create.hbs:23 views/campaigns/edit.hbs:22
-msgid "If set, this is the address people will send replies to"
-msgstr ""
-"Si renseignée, les utilisateurs enverront leurs réponses à cette adresse"
-
-#: views/campaigns/create.hbs:26 views/campaigns/edit.hbs:25
-msgid "Custom unsubscribe (URL)"
-msgstr "Désabonnement personnalisé (URL)"
-
-#: views/campaigns/create.hbs:27 views/campaigns/edit.hbs:26
-msgid "Set a custom unsubscribe url"
-msgstr "Renseignez une URL de désabonnement personnalisée"
-
-#: views/campaigns/delivered.hbs:3 views/campaigns/delivered.hbs:4
-msgid "Delivered info"
-msgstr "Information de remise"
-
-#: views/campaigns/delivered.hbs:6
-msgid "Subscribers who received the message and did not bounce/unsubscribe:"
-msgstr ""
-"Abonnés ayant reçu le message sans erreur, et ne s'étant pas désinscrit :"
-
-#: views/campaigns/delivered.hbs:11
-msgid "Delivery time"
-msgstr "Heure de remise"
-
-#: views/campaigns/edit-rss.hbs:3 views/campaigns/edit-rss.hbs:4
-msgid "Edit RSS Campaign"
-msgstr "Modifier la campagne RSS"
-
-#: views/campaigns/edit-rss.hbs:7 views/campaigns/edit-triggered.hbs:8
-#: views/campaigns/edit.hbs:9 views/settings.hbs:4 views/users/account.hbs:6
-msgid "General Settings"
-msgstr "Paramètres généraux"
-
-#: views/campaigns/edit-rss.hbs:17
-msgid ""
-"Use special merge tag [RSS_ENTRY] to mark the position for the RSS post "
-"content. Additionally you can use any valid merge tag as well."
-msgstr ""
-"Utiliser le champ de publipostage spécial [RSS_ENTRY] pour désigner "
-"l'emplacement où sera inséré le contenu venant du RSS. Vous pouvez utiliser "
-"par ailleurs tout autre champ disponible."
-
-#: views/campaigns/edit-rss.hbs:24 views/campaigns/edit-triggered.hbs:27
-#: views/campaigns/edit.hbs:37
-msgid "Delete Campaign"
-msgstr "Supprimer la campagne"
-
-#: views/campaigns/edit-rss.hbs:25 views/campaigns/edit-triggered.hbs:28
-#: views/campaigns/edit.hbs:38 views/lists/edit.hbs:22
-#: views/lists/fields/edit.hbs:39 views/lists/forms/edit.hbs:33
-#: views/lists/forms/forms.hbs:12 views/lists/segments/edit.hbs:14
-#: views/lists/segments/rule-edit.hbs:41 views/lists/subscription/edit.hbs:18
-#: views/reports/edit.hbs:6 views/settings.hbs:102 views/templates/edit.hbs:13
-#: views/triggers/edit.hbs:30 views/users/account.hbs:18
-msgid "Update"
-msgstr "Enregistrer"
-
-#: views/campaigns/edit-triggered.hbs:3 views/campaigns/edit-triggered.hbs:4
-msgid "Edit Triggered Campaign"
-msgstr "Modifier la campagne programmée"
-
-#: views/campaigns/edit-triggered.hbs:6 views/campaigns/edit.hbs:6
-#: routes/forms.js:143
-msgid "General"
-msgstr "Général"
-
-#: views/campaigns/edit-triggered.hbs:24 views/campaigns/edit.hbs:29
-msgid "Template Settings"
-msgstr "Paramètres du modèle"
-
-#: views/campaigns/edit-triggered.hbs:25 views/campaigns/edit.hbs:30
-msgid "Template URL"
-msgstr "URL du modèle"
-
-#: views/campaigns/edit.hbs:3 views/campaigns/edit.hbs:4
-#: views/campaigns/upload-attachment.hbs:3
-#: views/campaigns/upload-attachment.hbs:5 views/campaigns/view.hbs:3
-msgid "Edit Campaign"
-msgstr "Modifier la campagne"
-
-#: views/campaigns/edit.hbs:8 views/campaigns/edit.hbs:32
-msgid "Attachments"
-msgstr "Pièces jointes"
-
-#: views/campaigns/edit.hbs:33
-msgid "File"
-msgstr "Fichier"
-
-#: views/campaigns/edit.hbs:34
-msgid "Size"
-msgstr "Taille"
-
-#: views/campaigns/edit.hbs:35 views/campaigns/view.hbs:68
-#: views/lists/fields/fields.hbs:12 views/lists/forms/forms.hbs:9
-#: views/lists/view.hbs:33
-msgid "No data available in table"
-msgstr "Aucune donnée dans cette table"
-
-#: views/campaigns/edit.hbs:36 views/campaigns/upload-attachment.hbs:4
-msgid "Add Attachment"
-msgstr "Ajouter une pièce jointe"
-
-#: views/campaigns/opened.hbs:3 views/campaigns/opened.hbs:4
-msgid "Opened info"
-msgstr "Informations d'ouverture"
-
-#: views/campaigns/opened.hbs:6
-msgid "Subscribers who opened this message:"
-msgstr "Abonnés ayant ouvert ce message :"
-
-#: views/campaigns/opened.hbs:12
-msgid "First open"
-msgstr "Première ouverture"
-
-#: views/campaigns/opened.hbs:13
-msgid "Opened count"
-msgstr "Nombre d'ouverture"
-
-#: views/campaigns/unsubscribed.hbs:3 views/campaigns/unsubscribed.hbs:4
-msgid "Unsubscribed info"
-msgstr "Informations de désabonnement"
-
-#: views/campaigns/unsubscribed.hbs:6
-msgid "Subscribers who unsubscribed:"
-msgstr "Abonnés s'étant désinscrits"
-
-#: views/campaigns/unsubscribed.hbs:11 views/campaigns/view.hbs:28
-#: views/lists/subscription/import.hbs:13 routes/lists.js:206
-msgid "Unsubscribed"
-msgstr "Désabonnés"
-
-#: views/campaigns/upload-attachment.hbs:7
-msgid "Upload"
-msgstr "Télécharger"
-
-#: views/campaigns/view.hbs:4
-msgid "Overview"
-msgstr "Aperçu"
-
-#: views/campaigns/view.hbs:5
-msgid "Links"
-msgstr "Liens"
-
-#: views/campaigns/view.hbs:7
-msgid "Feed URL"
-msgstr "URL du flux"
-
-#: views/campaigns/view.hbs:8
-msgid "Last check"
-msgstr "Dernière vérification"
-
-#: views/campaigns/view.hbs:9
-msgid "Not yet checked"
-msgstr "Pas encore vérifié"
-
-#: views/campaigns/view.hbs:10
-msgid "activate campaign to start checking feed for new messages"
-msgstr ""
-"Activer la campagne pour commencer à surveiller l'arrivée de nouveaux "
-"messages dans le flux"
-
-#: views/campaigns/view.hbs:11
-msgid "RSS status"
-msgstr "Statut RSS"
-
-#: views/campaigns/view.hbs:16
-msgid "Preview campaign as"
-msgstr "Prévisualiser la campagne comme"
-
-#: views/campaigns/view.hbs:17
-msgid "Add new test user"
-msgstr "Ajouter un nouvel utilisateur de test"
-
-#: views/campaigns/view.hbs:18
-msgid "No test users yet, create one here"
-msgstr "Aucun utilisateur de test, créez-en un ici"
-
-#: views/campaigns/view.hbs:19
-msgid "Go"
-msgstr "Lancer"
-
-#: views/campaigns/view.hbs:20 lib/models/triggers.js:28
-msgid "Delivered"
-msgstr "Remis"
-
-#: views/campaigns/view.hbs:21
-msgid "List subscribers who received this message"
-msgstr "Abonnés ayant reçu ce message"
-
-#: views/campaigns/view.hbs:22
-msgid "Blacklisted"
-msgstr "Mis en liste noire"
-
-#: views/campaigns/view.hbs:23
-msgid "List subscribers who blacklisted by global blacklist"
-msgstr "Listes des abonnés faisant partie de la liste noire globale"
-
-#: views/campaigns/view.hbs:24 routes/lists.js:206
-msgid "Bounced"
-msgstr "Erreurs de distribution"
-
-#: views/campaigns/view.hbs:25
-msgid "List subscribers who bounced"
-msgstr "Abonnés en erreur"
-
-#: views/campaigns/view.hbs:26
-msgid "Complaints"
-msgstr "Plaintes"
-
-#: views/campaigns/view.hbs:27
-msgid "List subscribers who complained for this message"
-msgstr "Abonnés s'étant plaint après ce message"
-
-#: views/campaigns/view.hbs:29
-msgid "List subscribers who unsubscribed after this message"
-msgstr "Abonnés s'étant désinscrits après ce message"
-
-#: views/campaigns/view.hbs:30
-msgid "Opened"
-msgstr "Ouvert"
-
-#: views/campaigns/view.hbs:31
-msgid "List subscribers who opened this message"
-msgstr "Abonnés ayant ouvert ce message"
-
-#: views/campaigns/view.hbs:32
-msgid "Clicked"
-msgstr "Cliqué"
-
-#: views/campaigns/view.hbs:33 views/campaigns/view.hbs:70
-msgid "List subscribers who clicked on a link"
-msgstr "Abonnés ayant cliqué sur un lien"
-
-#: views/campaigns/view.hbs:34
-msgid ""
-"Are you sure? This action would start sending messages to the selected list"
-msgstr ""
-"Êtes-vous sûr ? Cette action va débuter l'envoi de messages à la liste "
-"sélectionnée"
-
-#: views/campaigns/view.hbs:35
-msgid "Delay sending"
-msgstr "Envoi programmé"
-
-#: views/campaigns/view.hbs:36
-msgid "hours"
-msgstr "heures"
-
-#: views/campaigns/view.hbs:37
-msgid "minutes"
-msgstr "minutes"
-
-#: views/campaigns/view.hbs:38
-msgid "Send to subscribers:"
-msgstr "Envoyer aux abonnés"
-
-#: views/campaigns/view.hbs:39
-msgid "Are you sure? This action would reset scheduling"
-msgstr "Êtes-vous sûr ? Cette action va réinitialiser les tâches programmées"
-
-#: views/campaigns/view.hbs:40
-msgid "Cancel"
-msgstr "Annuler"
-
-#: views/campaigns/view.hbs:41
-msgid "Sending scheduled"
-msgstr "Envoi programmé"
-
-#: views/campaigns/view.hbs:42 views/campaigns/view.hbs:54
-msgid "Pause"
-msgstr "Pause"
-
-#: views/campaigns/view.hbs:43 routes/campaigns.js:254
-msgid "Sending"
-msgstr "Envoi"
-
-#: views/campaigns/view.hbs:44 views/campaigns/view.hbs:48
-msgid ""
-"Are you sure? This action would resume sending messages to the selected list"
-msgstr ""
-"Êtes-vous sûr ? Cette action va suspendre l'envoi de messages à la liste "
-"sélectionnée"
-
-#: views/campaigns/view.hbs:45 views/campaigns/view.hbs:49
-msgid "Are you sure? This action would reset all stats about current progress"
-msgstr ""
-"Êtes-vous sûr ? Cette action va supprimer toutes les statistiques sur les "
-"tâches en cours"
-
-#: views/campaigns/view.hbs:46
-msgid "Resume"
-msgstr "Reprendre"
-
-#: views/campaigns/view.hbs:47 views/campaigns/view.hbs:51
-msgid "Reset"
-msgstr "Réinitialiser"
-
-#: views/campaigns/view.hbs:50
-msgid "Continue"
-msgstr "Continuer"
-
-#: views/campaigns/view.hbs:52
-msgid ""
-"All messages sent! Hit \"Continue\" if you you want to send this campaign to "
-"new subscribers"
-msgstr ""
-"Tous les messages ont été envoyés ! Choisissez \"Continuer\" si vous voulez "
-"envoyer cette campagne aux nouveaux abonnés"
-
-#: views/campaigns/view.hbs:53
-msgid ""
-"Are you sure? This action would pause sending new entries in RSS feed as "
-"email messages to the selected list"
-msgstr ""
-"Êtes-vous sûr ? Cette action va suspendre l'envoi de mail depuis un flux RSS "
-"pour cette liste"
-
-#: views/campaigns/view.hbs:55 views/campaigns/view.hbs:59
-msgid "Campaign status:"
-msgstr "État de la campagne :"
-
-#: views/campaigns/view.hbs:56
-msgid "ACTIVE"
-msgstr "ACTIF"
-
-#: views/campaigns/view.hbs:57
-msgid ""
-"Are you sure? This action would start sending new entries in RSS feed as "
-"email messages to the selected list"
-msgstr ""
-"Êtes-vous sûr ? Cette action va débuter l'envoi de messages depuis les "
-"nouvelles entrées du flux RSS à la liste sélectionnée"
-
-#: views/campaigns/view.hbs:58
-msgid "Activate"
-msgstr "Activer"
-
-#: views/campaigns/view.hbs:60
-msgid "INACTIVE"
-msgstr "INACTIVE"
-
-#: views/campaigns/view.hbs:61
-msgid ""
-"This is a triggered campaign. Messages are only sent to subscribers that hit "
-"some trigger that invokes this campaign"
-msgstr ""
-"Il s'agit d'une campagne programmée. Les messages ne sont envoyés qu'aux "
-"abonnés dont un événement active un déclencheur."
-
-#: views/campaigns/view.hbs:62
-msgid "see more"
-msgstr "voir plus"
-
-#: views/campaigns/view.hbs:67
-msgid "List subscribers who clicked this link"
-msgstr "Abonnés ayant cliqué ce lien"
-
-#: views/campaigns/view.hbs:71
-msgid ""
-"Clicks are counted as unique subscribers that clicked on a specific link or "
-"on any link (in aggregated view)"
-msgstr ""
-"Les clics représentent le nombre d'abonnés uniques qui ont cliqué sur un "
-"lien spécifique, ou sur n'importe quel lien en vue aggrégée."
-
-#: views/campaigns/view.hbs:72
-msgid ""
-"If a new entry is found from campaign feed a new subcampaign is created of "
-"that entry and it will be listed here"
-msgstr ""
-"Lorsqu'une nouvelle entrée est trouvée dans un flux RSS, une nouvelle "
-"campagne est créée à partir de cette entrée et sera listée ici"
-
-#: views/emails/password-reset-html.hbs:1
-#: views/emails/password-reset-text.hbs:1
-msgid "Change your password"
-msgstr "Changez votre mot de passe"
-
-#: views/emails/password-reset-html.hbs:2
-#: views/emails/password-reset-text.hbs:2
-msgid "We have received a password change request for your Mailtrain account:"
-msgstr ""
-"Nous avons reçu une demande de changement de mot de passe pour votre compte "
-"Mailtrain :"
-
-#: views/emails/password-reset-html.hbs:3
-#: views/emails/password-reset-text.hbs:3
-msgid "Reset password"
-msgstr "Réinitialiser le mot de passe"
-
-#: views/emails/password-reset-html.hbs:4
-#: views/emails/password-reset-text.hbs:4
-msgid ""
-"If you did not ask to change your password, then you can ignore this email "
-"and your password will not be changed."
-msgstr ""
-"Si vous n'avez pas demandé le changement de votre mot de passe, vous pouvez "
-"ignorer ce message et votre mot de passe restera inchangé."
-
-#: views/emails/rss-html.hbs:1 views/emails/stationery-html.hbs:3
-#: views/emails/stationery-text.hbs:3
-msgid "Preferences"
-msgstr "Préférences"
-
-#: views/emails/rss-html.hbs:2 views/emails/stationery-html.hbs:4
-#: views/emails/stationery-text.hbs:4 views/lists/forms/edit.hbs:20
-#: views/lists/subscription/edit.hbs:16
-#: views/subscription/partials/subscription-unsubscribe-form.hbs:2
-#: views/subscription/web-manage.mjml.hbs:3
-#: views/subscription/web-unsubscribe.mjml.hbs:1
-#: views/subscription/web-unsubscribe.mjml.hbs:2 routes/forms.js:223
-#: routes/lists.js:288
-msgid "Unsubscribe"
-msgstr "Se désabonner"
-
-#: views/emails/rss-html.hbs:3 views/emails/stationery-html.hbs:5
-#: views/emails/stationery-text.hbs:5
-msgid "View this email in your browser"
-msgstr "Consulter dans votre navigateur"
-
-#: views/emails/stationery-html.hbs:1 views/emails/stationery-text.hbs:1
-msgid "Hey [FIRST_NAME/Customer],"
-msgstr "Bonjour [FIRST_NAME/Customer],"
-
-#: views/emails/stationery-html.hbs:2 views/emails/stationery-text.hbs:2
-msgid "Cheers,"
-msgstr "Cordialement,"
-
-#: views/index.hbs:1
-msgid "List Management"
-msgstr "Gestion de listes"
-
-#: views/index.hbs:2
-msgid ""
-"Mailtrain allows you to easily manage even very large lists. Million "
-"subscribers? Not a problem. You can add subscribers manually, through the "
-"API or import from a CSV file. All lists come with support for custom fields "
-"and merge tags as well."
-msgstr ""
-"Mailtrain vous permet de gérer facilement vos listes, même très grandes. Des "
-"millions d'abonnés ? Aucun problème. Vous pouvez ajouter des abonnés "
-"manuellement, via l'API ou en les important depuis un fichier CSV. Toutes "
-"les listes disposent de champs de publipostage personnalisables."
-
-#: views/index.hbs:3 views/index.hbs:7 views/index.hbs:10 views/index.hbs:13
-#: views/index.hbs:16 views/index.hbs:19 views/index.hbs:22 views/index.hbs:25
-#: views/index.hbs:28
-msgid "Show more"
-msgstr "Voir plus"
-
-#: views/index.hbs:4 views/lists/fields/create.hbs:3
-#: views/lists/fields/edit.hbs:3 views/lists/fields/fields.hbs:3
-#: views/lists/fields/fields.hbs:5 views/lists/view.hbs:6
-msgid "Custom Fields"
-msgstr "Champs personnalisés"
-
-#: views/index.hbs:5
-msgid ""
-"Text fields, numbers, drop downs or checkboxes, Mailtrain has them all. "
-"Every custom field can be included in the generated newsletters through "
-"merge tags."
-msgstr ""
-"Champs texte, nombres, menus déroulants ou cases à cocher, Mailtrain dispose "
-"de tout. N'importe quel champ personnalisé peut être inclus dans la "
-"newsletter grâce à des étiquettes de fusionnement."
-
-#: views/index.hbs:6
-msgid "Mailtrain also supports custom forms."
-msgstr "Mailtrain permet également de personnaliser les formulaires."
-
-#: views/index.hbs:8
-msgid "List Segmentation"
-msgstr "Segmentation de liste"
-
-#: views/index.hbs:9
-msgid ""
-"Send messages only to list subscribers that match predefined segmentation "
-"rules. No need to create separate lists with small differences."
-msgstr ""
-"Envoyer des messages aux abonnés correspondant à des règles de segmentation "
-"prédéfinies. Nul besoin de créer plusieurs listes présentant peu de "
-"différences."
-
-#: views/index.hbs:11
-msgid "RSS Campaigns"
-msgstr "Campagnes RSS"
-
-#: views/index.hbs:12
-msgid ""
-"Setup Mailtrain to track RSS feeds and if a new entry is detected in a feed "
-"then Mailtrain auto-generates a new campaign using entry data as message "
-"contents and sends it to selected subscribers."
-msgstr ""
-"Configurer Mailtrain pour surveiller des flux RSS, et, dès qu'une nouvelle "
-"entrée est détectée dans un flux, auto-générer une nouvelle campagne en "
-"utilisant les donnée de la nouvelle entrée comme contenu du message, et "
-"l'envoyer aux abonnés sélectionnés"
-
-#: views/index.hbs:14
-msgid "GPG Encryption"
-msgstr "Chiffrement GPG"
-
-#: views/index.hbs:15
-msgid ""
-"If a list has a custom field for a GPG Public Key set then subscribers can "
-"upload their GPG public key to receive encrypted messages from the list."
-msgstr ""
-"Si une liste est paramétrée avec un champ personnalisé pour les clés "
-"publiques GPG, alors les utilisateurs pourront télécharger la leur pour "
-"recevoir les messages sous forme chiffrée."
-
-#: views/index.hbs:17
-msgid "Click Stats"
-msgstr "Statistiques de clics"
-
-#: views/index.hbs:18
-msgid ""
-"After a campaign is sent, check individual click statistics for every link "
-"included in the message."
-msgstr ""
-"Après l'envoi d'une campagne, consultez les statistiques individuelles de "
-"clics pour chaque lien inclus dans le message."
-
-#: views/index.hbs:20
-msgid "Template Editors"
-msgstr "Éditeur de modèle"
-
-#: views/index.hbs:21
-msgid ""
-"Mailtrain ships with GrapeJS and Mosaico built in, two advanced template "
-"editors. Mailtrain also offers a code editor if you prefer to handcraft the "
-"HTML yourself."
-msgstr ""
-"Mailtrain inclut GrapeJS et Mosaico, deux éditeurs de templates avancés. "
-"Mailtrain offre également un éditeur de code si vous préférez créer le HTML "
-"par vous-même."
-
-#: views/index.hbs:23
-msgid "Send via Any Provider"
-msgstr "Envoyer via Any Provider"
-
-#: views/index.hbs:24
-msgid ""
-"You can use any provider that supports SMTP protocol to send out your "
-"newsletters. Bounce and complaints handling via webhooks is supported for "
-"SES, SparkPost, SendGrid and Mailgun, also for Postfix and ZoneMTA."
-msgstr ""
-"Vous pouvez utiliser n'importe quel fournisseur supportant le protocole SMTP "
-"pour envoyer votre newletter. Le traitement des rejets et retours via appels "
-"web est supporté avec SES, SparkPost, SendGrid et Mailgun, ainsi qu'avec "
-"Postfix et ZoneMTA."
-
-#: views/index.hbs:26 lib/tools.js:137
-msgid "Automation"
-msgstr "Automatisation"
-
-#: views/index.hbs:27
-msgid ""
-"Define automation triggers to send specific messages when a user activates "
-"the trigger."
-msgstr ""
-"Définissez des triggers pour envoyer des messages spécifiques lorsqu'une "
-"action utilisateur active le déclencheur."
-
-#: views/layout.hbs:2
-msgid "Toggle navigation"
-msgstr "Basculer la navigation"
-
-#: views/layout.hbs:3
-msgid "Wiki"
-msgstr "Wiki"
-
-#: views/layout.hbs:4
-msgid "Blog"
-msgstr "Blog"
-
-#: views/layout.hbs:5 views/users/account.hbs:2 views/users/account.hbs:3
-msgid "Account"
-msgstr "Compte"
-
-#: views/layout.hbs:6 views/settings.hbs:2 views/settings.hbs:3
-msgid "Settings"
-msgstr "Configuration"
-
-#: views/layout.hbs:8 views/users/api.hbs:2 views/users/api.hbs:3
-msgid "API"
-msgstr "API"
-
-#: views/layout.hbs:9
-msgid "Log out"
-msgstr "Déconnexion"
-
-#: views/layout.hbs:10 views/users/forgot.hbs:2 views/users/login.hbs:2
-#: views/users/login.hbs:3 views/users/login.hbs:9 views/users/reset.hbs:2
-msgid "Sign in"
-msgstr "Se connecter"
-
-#: views/layout.hbs:11
-msgid "Self Hosted Newsletter App Built on Top of Nodemailer"
-msgstr "Solution de Newsletter auto-hébergée construite autour de Nodemailer"
-
-#: views/layout.hbs:12 views/layout.hbs:14
-msgid "Source on GitHub"
-msgstr "Source sur GitHub"
-
-#: views/layout.hbs:13
-msgid "Subscribe to Our Newsletter"
-msgstr "S'abonner à notre lettre d'information"
-
-#: views/lists/create.hbs:2 views/lists/edit.hbs:2
-#: views/lists/fields/create.hbs:2 views/lists/fields/edit.hbs:2
-#: views/lists/fields/fields.hbs:2 views/lists/forms/create.hbs:2
-#: views/lists/forms/edit.hbs:2 views/lists/forms/forms.hbs:2
-#: views/lists/lists.hbs:2 views/lists/lists.hbs:4
-#: views/lists/segments/create.hbs:2 views/lists/segments/edit.hbs:2
-#: views/lists/segments/rule-configure.hbs:2
-#: views/lists/segments/rule-create.hbs:2 views/lists/segments/rule-edit.hbs:2
-#: views/lists/segments/segments.hbs:2 views/lists/segments/view.hbs:2
-#: views/lists/subscription/add.hbs:2 views/lists/subscription/edit.hbs:2
-#: views/lists/subscription/import-failed.hbs:2
-#: views/lists/subscription/import-preview.hbs:2
-#: views/lists/subscription/import.hbs:2 views/lists/view.hbs:2
-#: lib/tools.js:125 routes/lists.js:59
-msgid "Lists"
-msgstr "Listes"
-
-#: views/lists/create.hbs:3 views/lists/create.hbs:4 views/lists/create.hbs:13
-#: views/lists/lists.hbs:3
-msgid "Create List"
-msgstr "Créer une liste"
-
-#: views/lists/create.hbs:6 views/lists/edit.hbs:7
-msgid "List Name"
-msgstr "Nom de la liste"
-
-#: views/lists/create.hbs:9 views/lists/edit.hbs:15
-#: views/triggers/create.hbs:15 views/triggers/edit.hbs:17
-msgid "Subscription"
-msgstr "Abonnement"
-
-#: views/lists/create.hbs:10 views/lists/edit.hbs:16
-msgid "Allow public users to subscribe themselves"
-msgstr "Permettre à tous les utilisateurs de s'abonner par eux-mêmes"
-
-#: views/lists/create.hbs:11 views/lists/edit.hbs:17
-msgid "Unsubscription"
-msgstr "Désabonnement"
-
-#: views/lists/create.hbs:12 views/lists/edit.hbs:18
-msgid "Select how an unsuscription request by subscriber is handled."
-msgstr ""
-"Choisissez comment une demande de désabonnement doit être prise en compte."
-
-#: views/lists/edit.hbs:3 views/lists/edit.hbs:4 views/lists/view.hbs:8
-msgid "Edit List"
-msgstr "Éditer la liste"
-
-#: views/lists/edit.hbs:5
-msgid "View List"
-msgstr "Voir la liste"
-
-#: views/lists/edit.hbs:8
-msgid "List ID"
-msgstr "Identifiant de liste"
-
-#: views/lists/edit.hbs:9
-msgid "This is the list ID displayed to the subscribers"
-msgstr "Il s'agit de l'identifiant de liste présenté aux utilisateurs"
-
-#: views/lists/edit.hbs:12
-msgid "Custom Form"
-msgstr "Formulaire personnalisé"
-
-#: views/lists/edit.hbs:13 views/lists/forms/forms.hbs:11
-msgid "Default Mailtrain Form"
-msgstr "Formulaire de Mailtrain par défaut"
-
-#: views/lists/edit.hbs:14
-msgid ""
-"The custom form used for this list. You can create a form here."
-msgstr ""
-"Le formulaire personnalisé utilisé pour cette liste. Vous pouvez créer un "
-"formulaire ici."
-
-#: views/lists/edit.hbs:19
-msgid "Unsubscribe Header"
-msgstr "Entête de désabonnement"
-
-#: views/lists/edit.hbs:20
-msgid "Do not send List-Unsubscribe headers"
-msgstr "Ne pas envoyer les entêtes List-Unsubscribe"
-
-#: views/lists/edit.hbs:21
-msgid "Delete List"
-msgstr "Supprimer la liste"
-
-#: views/lists/fields/create.hbs:4
-msgid "Create Field"
-msgstr "Créer un champ"
-
-#: views/lists/fields/create.hbs:5 views/lists/fields/fields.hbs:4
-msgid "Create Custom Field"
-msgstr "Créer un champ personnalisé"
-
-#: views/lists/fields/create.hbs:6 views/lists/fields/create.hbs:7
-#: views/lists/fields/edit.hbs:7 views/lists/fields/edit.hbs:8
-msgid "Field Name"
-msgstr "Nom du champ"
-
-#: views/lists/fields/create.hbs:8 views/lists/fields/edit.hbs:9
-msgid "Field Type"
-msgstr "Type de champ"
-
-#: views/lists/fields/create.hbs:9 views/lists/fields/edit.hbs:10
-#: lib/models/fields.js:17
-msgid "Text"
-msgstr "Texte"
-
-#: views/lists/fields/create.hbs:10 views/lists/fields/edit.hbs:11
-#: lib/models/fields.js:21
-msgid "Number"
-msgstr "Nombre"
-
-#: views/lists/fields/create.hbs:11 views/lists/fields/edit.hbs:12
-#: lib/models/fields.js:18
-msgid "Website"
-msgstr "Site web"
-
-#: views/lists/fields/create.hbs:12 views/lists/fields/edit.hbs:13
-#: lib/models/fields.js:20
-msgid "GPG Public Key"
-msgstr "Clé publique GPG"
-
-#: views/lists/fields/create.hbs:13 views/lists/fields/edit.hbs:14
-#: lib/models/fields.js:19
-msgid "Multi-line text"
-msgstr "Texte multi-lignes"
-
-#: views/lists/fields/create.hbs:14 views/lists/fields/edit.hbs:15
-msgid "JSON"
-msgstr "JSON"
-
-#: views/lists/fields/create.hbs:15 views/lists/fields/edit.hbs:16
-msgid "Date"
-msgstr "Date"
-
-#: views/lists/fields/create.hbs:16 views/lists/fields/edit.hbs:17
-msgid "Date (MM/DD/YYYY)"
-msgstr "Date (MM/JJ/AAAA)"
-
-#: views/lists/fields/create.hbs:17 views/lists/fields/edit.hbs:18
-#: lib/models/fields.js:26
-msgid "Date (DD/MM/YYYY)"
-msgstr "Date (JJ/MM/AAAA)"
-
-#: views/lists/fields/create.hbs:18 views/lists/fields/edit.hbs:19
-msgid "Birthday"
-msgstr "Date de naissance"
-
-#: views/lists/fields/create.hbs:19 views/lists/fields/edit.hbs:20
-#: lib/models/fields.js:27
-msgid "Birthday (MM/DD)"
-msgstr "Date de naissance (MM/JJ)"
-
-#: views/lists/fields/create.hbs:20 views/lists/fields/edit.hbs:21
-#: lib/models/fields.js:28
-msgid "Birthday (DD/MM)"
-msgstr "Date de naissance (JJ/MM)"
-
-#: views/lists/fields/create.hbs:21 views/lists/fields/edit.hbs:22
-msgid "Grouped"
-msgstr "Groupé"
-
-#: views/lists/fields/create.hbs:22 views/lists/fields/edit.hbs:23
-msgid "Drop Downs"
-msgstr "Menus déroulants"
-
-#: views/lists/fields/create.hbs:23 views/lists/fields/edit.hbs:24
-#: lib/models/fields.js:22
-msgid "Radio Buttons"
-msgstr "Boutons radio"
-
-#: views/lists/fields/create.hbs:24 views/lists/fields/edit.hbs:25
-#: lib/models/fields.js:23
-msgid "Checkboxes"
-msgstr "Cases à cocher"
-
-#: views/lists/fields/create.hbs:25 views/lists/fields/edit.hbs:26
-msgid "Option for a group value"
-msgstr "Option pour un groupe de valeurs"
-
-#: views/lists/fields/create.hbs:26 views/lists/fields/edit.hbs:27
-msgid "Group"
-msgstr "Groupe"
-
-#: views/lists/fields/create.hbs:28 views/lists/fields/edit.hbs:29
-msgid "Required for group options"
-msgstr "Options de groupe requis"
-
-#: views/lists/fields/create.hbs:29 views/lists/fields/create.hbs:30
-#: views/lists/fields/edit.hbs:35 views/lists/fields/edit.hbs:36
-#: views/lists/fields/fields.hbs:9
-msgid "Default merge tag value"
-msgstr "Valeur par défaut pour ce champ de publipostage"
-
-#: views/lists/fields/create.hbs:32 views/lists/fields/edit.hbs:34
-msgid ""
-"For group elements like checkboxes you can control the appearance of the "
-"merge tag with an optional template. The template uses handlebars syntax and "
-"you can find all values from {{values}} array, for example "
-"{{#each values}} {{this}} {{/each}}. If template is not defined "
-"then multiple values are joined with commas. You can also use this template "
-"to render JSON values (if the JSON is an array then the array is exposed as "
-"values, otherwise you can access the JSON keys directly)."
-msgstr ""
-"Pour les éléments groupés comme les cases à cocher, vous pouvez contrôler "
-"l'apparence du champ de publipostage avec une template optionnelle. La "
-"template utilise la syntaxe Handlebars et vous trouvez les valeurs dans le "
-"tableau {{values}}, par exemple {{#each values}} {{this}} "
-"{{/each}}. Si aucune template n'est définie, alors les valeurs sont "
-"concaténnées avec des virgules. Vous pouvez également utiliser la template "
-"pour présenter des valeurs JSON (si le JSON est un tableau, alors le tableau "
-"est accessible dans values, sinon vous accédez aux clés JSON "
-"directement)."
-
-#: views/lists/fields/create.hbs:33 views/lists/fields/edit.hbs:37
-msgid "Visible"
-msgstr "Visible"
-
-#: views/lists/fields/create.hbs:34
-msgid "Add Field"
-msgstr "Ajouter un champ"
-
-#: views/lists/fields/edit.hbs:4
-msgid "Edit Field"
-msgstr "Modifier le champ"
-
-#: views/lists/fields/edit.hbs:5
-msgid "Edit Custom Field"
-msgstr "Modifier le champ personnalisé"
-
-#: views/lists/fields/edit.hbs:6
-msgid "Back to fields"
-msgstr "Retour aux champs"
-
-#: views/lists/fields/edit.hbs:30 views/lists/fields/fields.hbs:8
-#: views/mosaico/editor.hbs:2 views/partials/merge-tag-reference.hbs:3
-msgid "Merge tag"
-msgstr "Champ de publipostage"
-
-#: views/lists/fields/edit.hbs:31
-msgid "Merge Tag"
-msgstr "Champ de publipostage"
-
-#: views/lists/fields/edit.hbs:32
-msgid "Put this tag in your content:"
-msgstr "Utilisez ce mot-clé dans votre contenu :"
-
-#: views/lists/fields/edit.hbs:38
-msgid "Delete Field"
-msgstr "Supprimer le champ"
-
-#: views/lists/fields/fields.hbs:7 views/lists/view.hbs:26
-#: views/report-templates/partials/report-template-fields.hbs:5
-msgid "Type"
-msgstr "Type"
-
-#: views/lists/fields/fields.hbs:10 views/lists/fields/fields.hbs:11
-#: views/lists/forms/edit.hbs:26 views/lists/forms/forms.hbs:8
-#: views/lists/segments/segments.hbs:8 views/lists/segments/view.hbs:12
-#: views/triggers/triggers.hbs:14 routes/campaigns.js:277
-#: routes/campaigns.js:569 routes/campaigns.js:658 routes/campaigns.js:707
-#: routes/lists.js:170 routes/lists.js:257 routes/report-templates.js:51
-#: routes/templates.js:183 routes/triggers.js:345
-msgid "Edit"
-msgstr "Modifier"
-
-#: views/lists/forms/create.hbs:3 views/lists/forms/edit.hbs:3
-#: views/lists/forms/forms.hbs:3 views/lists/forms/forms.hbs:5
-#: views/lists/view.hbs:5
-msgid "Custom Forms"
-msgstr "Formulaires personnalisés"
-
-#: views/lists/forms/create.hbs:4
-msgid "Create Form"
-msgstr "Créer un formulaire"
-
-#: views/lists/forms/create.hbs:5 views/lists/forms/forms.hbs:4
-msgid "Create Custom Form"
-msgstr "Créer un formulaire personnalisé"
-
-#: views/lists/forms/create.hbs:6 views/lists/forms/create.hbs:7
-#: views/lists/forms/edit.hbs:7 views/lists/forms/edit.hbs:8
-msgid "Form Name"
-msgstr "Nom du formulaire"
-
-#: views/lists/forms/create.hbs:8
-msgid "Add Form"
-msgstr "Ajouter un formulaire"
-
-#: views/lists/forms/edit.hbs:4
-msgid "Edit Form"
-msgstr "Modifier le formulaire"
-
-#: views/lists/forms/edit.hbs:5
-msgid "Edit Custom Form"
-msgstr "Modifier le formulaire personnalisé"
-
-#: views/lists/forms/edit.hbs:6
-msgid "Back to forms"
-msgstr "Retour aux formulaires"
-
-#: views/lists/forms/edit.hbs:10
-msgid "Optional comments about this form"
-msgstr "Commentaire optionnel sur ce formulaire"
-
-#: views/lists/forms/edit.hbs:11
-msgid "Form Preview"
-msgstr "Prévisualisation du formulaire"
-
-#: views/lists/forms/edit.hbs:12
-msgid ""
-"Note: These links are solely for a quick preview. If you submit a preview "
-"form you'll get redirected to the list's default form."
-msgstr ""
-"NB : Ces liens sont fournis uniquement pour un avoir aperçu rapide. Si vous "
-"utilisez ces formulaires vous serez redirigés vers les formulaires par "
-"défaut."
-
-#: views/lists/forms/edit.hbs:13 views/lists/subscription/add.hbs:16
-#: views/subscription/mail-unsubscription-confirmed-html.mjml.hbs:4
-#: views/subscription/mail-unsubscription-confirmed-text.hbs:4
-#: routes/forms.js:157 routes/lists.js:288
-msgid "Subscribe"
-msgstr "Abonnement"
-
-#: views/lists/forms/edit.hbs:14
-msgid "Confirm Subscription Notice"
-msgstr "Confirmation d'abonnement"
-
-#: views/lists/forms/edit.hbs:15
-msgid "Confirm Unsubscription Notice"
-msgstr "Confirmation de désabonnement"
-
-#: views/lists/forms/edit.hbs:16
-msgid "Subscribed Notice"
-msgstr "Confirmation d'abonnement"
-
-#: views/lists/forms/edit.hbs:17
-msgid "Updated Notice"
-msgstr "Notification enregistrée"
-
-#: views/lists/forms/edit.hbs:18
-msgid "Unsubscribed Notice"
-msgstr "Notification de désabonnement"
-
-#: views/lists/forms/edit.hbs:19
-msgid "Manual Unsubscribe Notice"
-msgstr "Notification de désabonnement manuel"
-
-#: views/lists/forms/edit.hbs:21 routes/forms.js:205
-msgid "Manage"
-msgstr "Gérer"
-
-#: views/lists/forms/edit.hbs:22
-msgid "Manage Address"
-msgstr "Gestion des adresses"
-
-#: views/lists/forms/edit.hbs:23
-msgid "Create a test user for additional options"
-msgstr "Créer un utilisateur test pour les options additionnelles"
-
-#: views/lists/forms/edit.hbs:24 views/report-templates/create.hbs:3
-#: views/report-templates/edit.hbs:3
-#: views/report-templates/report-templates.hbs:3 views/templates/create.hbs:2
-#: views/templates/edit.hbs:2 views/templates/templates.hbs:2
-#: views/templates/templates.hbs:4 lib/tools.js:129 routes/templates.js:27
-msgid "Templates"
-msgstr "Modèles"
-
-#: views/lists/forms/edit.hbs:25
-msgid "Fields"
-msgstr "Champs"
-
-#: views/lists/forms/edit.hbs:27
-msgid "Form Fields"
-msgstr "Champs de formulaire"
-
-#: views/lists/forms/edit.hbs:28
-msgid "Fields hidden on subscription page:"
-msgstr "Champs masqués sur la page d'abonnement :"
-
-#: views/lists/forms/edit.hbs:29
-msgid "Fields shown on subscription page:"
-msgstr "Champs affichés sur la page d'abonnement :"
-
-#: views/lists/forms/edit.hbs:30
-msgid "Fields hidden on preferences page:"
-msgstr "Champs masqués sur la page de préférences :"
-
-#: views/lists/forms/edit.hbs:31
-msgid "Fields shown on preferences page:"
-msgstr "Champs affichés sur la page de préférences :"
-
-#: views/lists/forms/edit.hbs:32
-msgid "Delete Form"
-msgstr "Supprimer le formulaire"
-
-#: views/lists/forms/forms.hbs:10
-msgid "The default form for this list is:"
-msgstr "Le formulaire par défaut pour cette liste est :"
-
-#: views/lists/lists.hbs:6
-msgid "ID"
-msgstr "ID"
-
-#: views/lists/lists.hbs:7 views/reports/partials/report-fields.hbs:10
-msgid "Subscribers"
-msgstr "Abonnés"
-
-#: views/lists/segments/create.hbs:3 views/lists/segments/edit.hbs:3
-#: views/lists/segments/rule-configure.hbs:3
-#: views/lists/segments/rule-create.hbs:3 views/lists/segments/rule-edit.hbs:3
-#: views/lists/segments/segments.hbs:3 views/lists/segments/segments.hbs:5
-#: views/lists/segments/view.hbs:3 views/lists/view.hbs:7
-#: views/lists/view.hbs:14
-msgid "Segments"
-msgstr "Segments"
-
-#: views/lists/segments/create.hbs:4 views/lists/segments/create.hbs:5
-#: views/lists/segments/rule-configure.hbs:4
-#: views/lists/segments/rule-create.hbs:4 views/lists/segments/rule-edit.hbs:4
-#: views/lists/segments/segments.hbs:4
-msgid "Create Segment"
-msgstr "Créer un segment"
-
-#: views/lists/segments/create.hbs:6 views/lists/segments/create.hbs:7
-#: views/lists/segments/edit.hbs:7 views/lists/segments/edit.hbs:8
-msgid "Segment Name"
-msgstr "Nom du segment"
-
-#: views/lists/segments/create.hbs:8 views/lists/segments/edit.hbs:9
-msgid "Rule match"
-msgstr "Correspondance des règles"
-
-#: views/lists/segments/create.hbs:10 views/lists/segments/edit.hbs:11
-msgid "All rules must match"
-msgstr "Toutes les règles doivent correspondre"
-
-#: views/lists/segments/create.hbs:11 views/lists/segments/edit.hbs:12
-msgid "Any rule can match"
-msgstr "Au moins une des règles doit correspondre"
-
-#: views/lists/segments/create.hbs:12
-msgid "Add Segment"
-msgstr "Ajouter un segment"
-
-#: views/lists/segments/edit.hbs:4 views/lists/segments/edit.hbs:5
-#: views/lists/segments/view.hbs:6 views/lists/view.hbs:12
-msgid "Edit Segment"
-msgstr "Modifier le segment"
-
-#: views/lists/segments/edit.hbs:6
-msgid "Back to segments"
-msgstr "Retour aux segments"
-
-#: views/lists/segments/edit.hbs:13
-msgid "Delete Segment"
-msgstr "Supprimer le segment"
-
-#: views/lists/segments/rule-configure.hbs:5
-#: views/lists/segments/rule-create.hbs:5 views/lists/segments/rule-edit.hbs:5
-#: views/lists/segments/view.hbs:4
-msgid "Create Rule"
-msgstr "Créer une règle"
-
-#: views/lists/segments/rule-configure.hbs:6
-#: views/lists/segments/rule-create.hbs:6 views/lists/segments/rule-edit.hbs:6
-#: views/lists/segments/view.hbs:10
-msgid "Rule"
-msgstr "Règle"
-
-#: views/lists/segments/rule-configure.hbs:7
-#: views/lists/segments/rule-edit.hbs:7
-msgid "Condition"
-msgstr "Condition"
-
-#: views/lists/segments/rule-configure.hbs:8
-#: views/lists/segments/rule-edit.hbs:8
-msgid "Equals"
-msgstr "vaut"
-
-#: views/lists/segments/rule-configure.hbs:9
-#: views/lists/segments/rule-edit.hbs:9
-msgid "Not equals"
-msgstr "Différent"
-
-#: views/lists/segments/rule-configure.hbs:10
-#: views/lists/segments/rule-configure.hbs:11
-#: views/lists/segments/rule-configure.hbs:13
-#: views/lists/segments/rule-configure.hbs:16
-#: views/lists/segments/rule-configure.hbs:28
-#: views/lists/segments/rule-configure.hbs:33
-#: views/lists/segments/rule-edit.hbs:10 views/lists/segments/rule-edit.hbs:11
-#: views/lists/segments/rule-edit.hbs:13 views/lists/segments/rule-edit.hbs:18
-#: views/lists/segments/rule-edit.hbs:32 views/lists/segments/rule-edit.hbs:37
-#: views/lists/segments/view.hbs:11
-msgid "Value"
-msgstr "Valeur"
-
-#: views/lists/segments/rule-configure.hbs:12
-#: views/lists/segments/rule-edit.hbs:12
-msgid ""
-"Use % for wildcard character, e.g. \"%test\" to match all values that end "
-"with \"test\""
-msgstr ""
-"Utiliser % comme caractère joker, par ex. \"%test\" correspond à toutes les "
-"valeurs qui finissent par \"test\""
-
-#: views/lists/segments/rule-configure.hbs:14
-#: views/lists/segments/rule-configure.hbs:17
-#: views/lists/segments/rule-configure.hbs:29
-#: views/lists/segments/rule-edit.hbs:14 views/lists/segments/rule-edit.hbs:19
-#: views/lists/segments/rule-edit.hbs:33
-msgid "Use exact match"
-msgstr "Correspondance exacte"
-
-#: views/lists/segments/rule-configure.hbs:15
-#: views/lists/segments/rule-configure.hbs:18
-#: views/lists/segments/rule-configure.hbs:30
-#: views/lists/segments/rule-edit.hbs:15 views/lists/segments/rule-edit.hbs:20
-#: views/lists/segments/rule-edit.hbs:34
-msgid "Use range match"
-msgstr "Correspondance par plage"
-
-#: views/lists/segments/rule-configure.hbs:19
-#: views/lists/segments/rule-edit.hbs:23
-msgid "Use relative range match"
-msgstr "Correspondance par plages relatives"
-
-#: views/lists/segments/rule-configure.hbs:20
-#: views/lists/segments/rule-configure.hbs:31
-#: views/lists/segments/rule-edit.hbs:16 views/lists/segments/rule-edit.hbs:21
-#: views/lists/segments/rule-edit.hbs:24 views/lists/segments/rule-edit.hbs:35
-msgid "From"
-msgstr "De"
-
-#: views/lists/segments/rule-configure.hbs:21
-#: views/lists/segments/rule-configure.hbs:25
-#: views/lists/segments/rule-edit.hbs:25 views/lists/segments/rule-edit.hbs:29
-msgid "days"
-msgstr "jours"
-
-#: views/lists/segments/rule-configure.hbs:22
-#: views/lists/segments/rule-configure.hbs:26
-#: views/lists/segments/rule-edit.hbs:26 views/lists/segments/rule-edit.hbs:30
-msgid "before today"
-msgstr "avant aujourd'hui"
-
-#: views/lists/segments/rule-configure.hbs:23
-#: views/lists/segments/rule-configure.hbs:27
-#: views/lists/segments/rule-edit.hbs:27 views/lists/segments/rule-edit.hbs:31
-msgid "after today"
-msgstr "après aujourd'hui"
-
-#: views/lists/segments/rule-configure.hbs:24
-#: views/lists/segments/rule-configure.hbs:32
-#: views/lists/segments/rule-edit.hbs:17 views/lists/segments/rule-edit.hbs:22
-#: views/lists/segments/rule-edit.hbs:28 views/lists/segments/rule-edit.hbs:36
-msgid "to"
-msgstr "à"
-
-#: views/lists/segments/rule-configure.hbs:34
-#: views/lists/segments/rule-edit.hbs:38 lib/models/segments.js:156
-#: lib/models/segments.js:419
-msgid "Selected"
-msgstr "Sélectionné"
-
-#: views/lists/segments/rule-configure.hbs:35
-#: views/lists/segments/rule-edit.hbs:39 lib/models/segments.js:156
-#: lib/models/segments.js:419
-msgid "Not selected"
-msgstr "Non sélectionné"
-
-#: views/lists/segments/rule-configure.hbs:36
-msgid "Add Rule"
-msgstr "Ajouter une règle"
-
-#: views/lists/segments/rule-create.hbs:8
-#: views/lists/subscription/import.hbs:18
-#: views/reports/create-select-template.hbs:5
-#: views/triggers/create-select.hbs:9
-msgid "Next"
-msgstr "Suivant"
-
-#: views/lists/segments/rule-edit.hbs:40
-msgid "Delete Rule"
-msgstr "Supprimer la règle"
-
-#: views/lists/segments/segments.hbs:7
-msgid "Match"
-msgstr "Correspondance"
-
-#: views/lists/segments/view.hbs:5 views/lists/view.hbs:13
-msgid "Segment"
-msgstr "Segment"
-
-#: views/lists/segments/view.hbs:7
-msgid "Match rules"
-msgstr "Règles de correspondance"
-
-#: views/lists/segments/view.hbs:8
-msgid "Matching subscribers"
-msgstr "Abonnés en correspondance"
-
-#: views/lists/segments/view.hbs:9
-msgid "show"
-msgstr "voir"
-
-#: views/lists/subscription/add.hbs:3 views/lists/subscription/add.hbs:4
-msgid "Add subscriber"
-msgstr "Ajouter un abonné"
-
-#: views/lists/subscription/add.hbs:5
-#: views/subscription/partials/subscription-custom-fields.hbs:1
-#: views/users/account.hbs:7
-msgid "Email Address"
-msgstr "Adresse mail"
-
-#: views/lists/subscription/add.hbs:8 views/lists/subscription/edit.hbs:9
-#: views/settings.hbs:85 views/settings.hbs:100
-#: views/subscription/partials/subscription-custom-fields.hbs:6
-msgid "Begins with"
-msgstr "qui commence par"
-
-#: views/lists/subscription/add.hbs:9 views/lists/subscription/edit.hbs:10
-msgid ""
-"Insert a GPG public key that will be used to encrypt messages sent this "
-"subscriber"
-msgstr ""
-"Insérez une clé publique GPG pour chiffrer les messages envoyés à cet abonné"
-
-#: views/lists/subscription/add.hbs:11 views/lists/subscription/edit.hbs:12
-#: views/lists/subscription/import-preview.hbs:9
-msgid "Timezone"
-msgstr "Fuseau horaire"
-
-#: views/lists/subscription/add.hbs:13 views/lists/subscription/edit.hbs:13
-msgid "Test user?"
-msgstr "Utilisateur pour tests ?"
-
-#: views/lists/subscription/add.hbs:14 views/lists/subscription/edit.hbs:14
-msgid ""
-"If checked then this subscription can be used for previewing campaign "
-"messages"
-msgstr ""
-"Si activé, cet abonnement peut être utilisé pour prévisualiser les message "
-"des campagnes"
-
-#: views/lists/subscription/add.hbs:15
-msgid ""
-"This person will not receive a confirmation email so make sure that you have "
-"permission to email them."
-msgstr ""
-"Cette personne ne recevra pas de mail de confirmation, aussi assurez-vous "
-"que vous avez le droit de lui envoyer des messages."
-
-#: views/lists/subscription/edit.hbs:3 views/lists/subscription/edit.hbs:4
-msgid "Edit subscriber"
-msgstr "Modifier l'abonné"
-
-#: views/lists/subscription/edit.hbs:5
-#: views/lists/subscription/import-failed.hbs:5
-msgid "Back to list"
-msgstr "Retour à la liste"
-
-#: views/lists/subscription/edit.hbs:6
-#: views/lists/subscription/import-preview.hbs:6
-#: views/subscription/partials/subscription-unsubscribe-form.hbs:1
-#: lib/helpers.js:42 lib/models/segments.js:11
-msgid "Email address"
-msgstr "Adresse mail"
-
-#: views/lists/subscription/edit.hbs:17
-msgid "Delete Subscription"
-msgstr "Supprimer l'abonnement"
-
-#: views/lists/subscription/import-failed.hbs:3
-msgid "Import status"
-msgstr "Statut de l'import"
-
-#: views/lists/subscription/import-failed.hbs:4
-msgid "Failed addresses"
-msgstr "Adresses en erreur"
-
-#: views/lists/subscription/import-failed.hbs:6
-msgid ""
-"Role-based addresses like postmaster@example.com are blocked when importing. "
-"Subscribers with role-based email addresses can join your list using the "
-"subscription form"
-msgstr ""
-"Les adresse administratives comme postmaster@example.com sont supprimées "
-"lors des imports. Les utilisateurs disposant d'adresses administrativves "
-"doivent utiliser le formulaire d'abonnement"
-
-#: views/lists/subscription/import-failed.hbs:7
-msgid "see here"
-msgstr "voir ici"
-
-#: views/lists/subscription/import-failed.hbs:9
-msgid "Fail reason"
-msgstr "Raison de l'échec"
-
-#: views/lists/subscription/import-preview.hbs:3
-#: views/lists/subscription/import-preview.hbs:4
-#: views/lists/subscription/import.hbs:3 views/lists/subscription/import.hbs:4
-msgid "Import subscribers"
-msgstr "Importer des abonnés"
-
-#: views/lists/subscription/import-preview.hbs:10 views/users/api.hbs:21
-#: views/users/api.hbs:36 views/users/api.hbs:44 views/users/api.hbs:52
-#: views/users/api.hbs:64 views/users/api.hbs:75 views/users/api.hbs:83
-#: views/users/api.hbs:91 views/users/api.hbs:96 views/users/api.hbs:101
-#: views/users/api.hbs:106
-msgid "Example"
-msgstr "Exemple"
-
-#: views/lists/subscription/import-preview.hbs:11
-msgid "Start import"
-msgstr "Lancer l'importation"
-
-#: views/lists/subscription/import.hbs:5
-msgid "CSV File"
-msgstr "Fichier CSV"
-
-#: views/lists/subscription/import.hbs:6
-msgid "The first line must contain column headings"
-msgstr "La première ligne doit contenir les entêtes de colonnes"
-
-#: views/lists/subscription/import.hbs:7
-msgid "CSV delimiter"
-msgstr "Délimiteur CSV"
-
-#: views/lists/subscription/import.hbs:8
-msgid "Categorize the imported subscribers as"
-msgstr "Catégoriser les abonnés importés comme"
-
-#: views/lists/subscription/import.hbs:9 routes/lists.js:206
-msgid "Subscribed"
-msgstr "Abonné"
-
-#: views/lists/subscription/import.hbs:10
-msgid "Regular subscriber addresses"
-msgstr "Abonnés ordinaires"
-
-#: views/lists/subscription/import.hbs:11
-msgid "Subscribed (Force)"
-msgstr "Abonné (forcé)"
-
-#: views/lists/subscription/import.hbs:12
-msgid "Regular subscriber addresses, resubscribe users that have unsubscribed"
-msgstr ""
-"Abonnés ordinaires, et réabonner les utilisateurs qui s'étaient désabonnés"
-
-#: views/lists/subscription/import.hbs:14
-msgid "Suppressed emails that will be unsubscribed from your list"
-msgstr "Désabonnements. Les adresses seront désabonnées de la liste"
-
-#: views/lists/subscription/import.hbs:15
-msgid "Check imported emails"
-msgstr "Vérifier les adresses mail importées"
-
-#: views/lists/subscription/import.hbs:16 views/triggers/triggers.hbs:12
-msgid "Enabled"
-msgstr "Activé"
-
-#: views/lists/subscription/import.hbs:17 views/triggers/triggers.hbs:13
-msgid "Disabled"
-msgstr "Désactivé"
-
-#: views/lists/view.hbs:3
-msgid "Subscription Form"
-msgstr "Formulaire d'abonnement"
-
-#: views/lists/view.hbs:4
-msgid "List Actions"
-msgstr "Actions sur la liste"
-
-#: views/lists/view.hbs:9 views/triggers/create-select.hbs:3
-#: views/triggers/create-select.hbs:4 views/triggers/create.hbs:3
-#: views/triggers/create.hbs:4 views/triggers/create.hbs:27
-#: views/triggers/triggers.hbs:3
-msgid "Create Trigger"
-msgstr "Créer un déclencheur"
-
-#: views/lists/view.hbs:10
-msgid "Add Subscriber"
-msgstr "Ajouter un abonné"
-
-#: views/lists/view.hbs:11
-msgid "Import Subscribers"
-msgstr "Importer des abonnés"
-
-#: views/lists/view.hbs:15
-msgid "Create New Segment"
-msgstr "Créer un nouveau segment"
-
-#: views/lists/view.hbs:16
-msgid "Filter"
-msgstr "Filtre"
-
-#: views/lists/view.hbs:17
-msgid "Subscriptions"
-msgstr "Abonnements"
-
-#: views/lists/view.hbs:18
-msgid "Imports"
-msgstr "Imports"
-
-#: views/lists/view.hbs:25 routes/campaigns.js:256 routes/lists.js:300
-msgid "Finished"
-msgstr "Terminé"
-
-#: views/lists/view.hbs:27
-msgid "Added"
-msgstr "Ajouté"
-
-#: views/lists/view.hbs:28
-msgid "Updated"
-msgstr "Mis à jour"
-
-#: views/lists/view.hbs:29
-msgid "Failed"
-msgstr "Echec"
-
-#: views/lists/view.hbs:31
-msgid ""
-"Are you sure? This action should only be called to resolve stalled imports"
-msgstr ""
-"Êtes-vous sûr ? Cette action ne doit être appelée que pour interrompre les "
-"imports bloqués"
-
-#: views/lists/view.hbs:32
-msgid "Restart"
-msgstr "Redémarrer"
-
-#: views/mosaico/editor.hbs:1 views/partials/merge-tag-reference.hbs:1
-msgid "Merge tag reference"
-msgstr "Lexique des champs de publipostage"
-
-#: views/mosaico/editor.hbs:4
-msgid "MOSAICO Responsive Email Designer"
-msgstr "Editeur de mail responsive MOSAICO"
-
-#: views/mosaico/editor.hbs:5
-msgid "Sucessfully saved"
-msgstr "Enregistré"
-
-#: views/mosaico/editor.hbs:6
-msgid "An error occured while saving the document"
-msgstr "Une erreur est survenue lors de l\\'enregistrement du document"
-
-#: views/mosaico/editor.hbs:7
-msgid "Unsaved changes will be lost. Close now?"
-msgstr ""
-"Les éventuelles modifications non sauvegardées seront perdues. Fermer "
-"maintenant ?"
-
-#: views/mosaico/editor.hbs:8 views/mosaico/editor.hbs:9
-msgid "Tags"
-msgstr "Champs de publipostage"
-
-#: views/partials/codeeditor.hbs:1 views/partials/grapejs.hbs:1
-#: views/partials/mosaico.hbs:1 views/partials/summernote.hbs:1
-msgid "Template content (HTML)"
-msgstr "Contenu du modèle (HTML)"
-
-#: views/partials/editor-navbar.hbs:1
-msgid "SAVE"
-msgstr "ENREGISTRER"
-
-#: views/partials/editor-navbar.hbs:2
-msgid "SAVING"
-msgstr "ENREGISTRE"
-
-#: views/partials/editor-navbar.hbs:3
-msgid "CLOSE"
-msgstr "FERMER"
-
-#: views/partials/grapejs.hbs:2
-msgid "Open GrapeJS"
-msgstr "Ouvrir GrapeJS"
-
-#: views/partials/html-preview.hbs:1
-msgid "Toggle HTML preview"
-msgstr "Basculer la prévisualisation HTML"
-
-#: views/partials/html-to-text.hbs:1
-msgid ""
-"To extract the text from HTML click here."
-msgstr ""
-"Pour extraire le texte du HTML, cliquez ici."
-
-#: views/partials/html-to-text.hbs:2
-msgid ""
-"Please note that your existing plaintext in the field above will be "
-"overwritten. This feature uses the Premailer API, a third party "
-"service. Their Terms of Service and Privacy Policy apply."
-msgstr ""
-"Notez bien que le texte présent dans le champ ci-dessus sera remplacé. Cette "
-"fonctionnalité utilisePremailer API, un service tiers. Merci de "
-"vérifier leurs Conditions générales d'utilisation et de vie privée, qui "
-"s'appliquent en ce cas."
-
-#: views/partials/html-to-text.hbs:3
-msgid "An error occurred while talking to the server"
-msgstr "Une erreur est intervenue lors du dialogue avec le serveur"
-
-#: views/partials/merge-tag-reference.hbs:2
-msgid ""
-"Merge tags are tags that are replaced before sending out the message. The "
-"format of the merge tag is the following: [TAG_NAME] or "
-"[TAG_NAME/fallback] where fallback is an optional "
-"text value used when TAG_NAME is empty."
-msgstr ""
-"Les champs de publipostage sont des champs qui sont remplacés avant l'envoi "
-"du message. Le format du champ de publipostage est le suivant : "
-"[ETIQUETTE] ou [ETIQUETTE/defaut] où defaut"
-"code> est une valeur textuelle optionnelle utilisée lorsque ETIQUETTE"
-"code> est vide."
-
-#: views/partials/modal-carousel.hbs:1
-msgid "{{title}}"
-msgstr "{{title}}"
-
-#: views/partials/mosaico.hbs:2
-msgid "Open Mosaico"
-msgstr "Ouvrir Mosaico"
-
-#: views/partials/plaintext.hbs:1
-msgid "Template content (plaintext)"
-msgstr "Contenu du modèle (Texte)"
-
-#: views/report-templates/create.hbs:2 views/report-templates/edit.hbs:2
-#: views/report-templates/report-templates.hbs:2
-#: views/reports/create-select-template.hbs:2 views/reports/create.hbs:2
-#: views/reports/edit.hbs:2 views/reports/output.hbs:2
-#: views/reports/reports.hbs:2 views/reports/reports.hbs:5
-#: views/reports/view.hbs:2 lib/tools.js:144 routes/reports.js:31
-msgid "Reports"
-msgstr "Rapports"
-
-#: views/report-templates/create.hbs:4 views/report-templates/create.hbs:6
-#: views/report-templates/report-templates.hbs:4 views/templates/create.hbs:3
-#: views/templates/create.hbs:4 views/templates/create.hbs:12
-#: views/templates/templates.hbs:3
-msgid "Create Template"
-msgstr "Créer un modèle"
-
-#: views/report-templates/create.hbs:5 routes/report-templates.js:231
-msgid "Create Report Template"
-msgstr "Créer un modèle de rapport"
-
-#: views/report-templates/edit.hbs:4 views/templates/edit.hbs:3
-#: views/templates/edit.hbs:4
-msgid "Edit Template"
-msgstr "Modifier le modèle"
-
-#: views/report-templates/edit.hbs:5 routes/report-templates.js:262
-msgid "Edit Report Template"
-msgstr "Modifier le modèle de rapport"
-
-#: views/report-templates/edit.hbs:6 views/templates/edit.hbs:12
-msgid "Delete Template"
-msgstr "Supprimer le modèle"
-
-#: views/report-templates/edit.hbs:7
-msgid "Update and Stay"
-msgstr "Mettre à jour et poursuivre"
-
-#: views/report-templates/edit.hbs:8
-msgid "Update and Leave"
-msgstr "Mettre à jour et quitter"
-
-#: views/report-templates/partials/report-template-fields.hbs:2
-msgid "Template Name"
-msgstr "Nom du modèle"
-
-#: views/report-templates/partials/report-template-fields.hbs:6
-msgid "User selectable fields"
-msgstr "Champs utilisateur utilisables"
-
-#: views/report-templates/partials/report-template-fields.hbs:7
-msgid "Data processing code"
-msgstr "Code de traitement des données"
-
-#: views/report-templates/partials/report-template-fields.hbs:8
-msgid "Rendering template"
-msgstr "Modèle de rendu"
-
-#: views/report-templates/report-templates.hbs:5
-msgid "Blank"
-msgstr "Vide"
-
-#: views/report-templates/report-templates.hbs:6
-msgid "All Subscribers"
-msgstr "Tous les abonnés"
-
-#: views/report-templates/report-templates.hbs:7
-msgid "Grouped Subscribers"
-msgstr "Abonnements groupés"
-
-#: views/report-templates/report-templates.hbs:8
-msgid "Export List as CSV"
-msgstr "Exporter la liste au format CSV"
-
-#: views/report-templates/report-templates.hbs:9 views/reports/reports.hbs:4
-#: routes/report-templates.js:29
-msgid "Report Templates"
-msgstr "Modèles de rapport"
-
-#: views/reports/create-select-template.hbs:3
-#: views/reports/create-select-template.hbs:4 views/reports/create.hbs:3
-#: views/reports/create.hbs:4 views/reports/create.hbs:5
-#: views/reports/reports.hbs:3 routes/reports.js:81
-msgid "Create Report"
-msgstr "Créer un rapport"
-
-#: views/reports/edit.hbs:3 views/reports/edit.hbs:4 routes/reports.js:151
-msgid "Edit Report"
-msgstr "Modifier le rapport"
-
-#: views/reports/edit.hbs:5
-msgid "Delete Report"
-msgstr "Supprimer le rapport"
-
-#: views/reports/partials/report-fields.hbs:2
-msgid "Report Name"
-msgstr "Nom du rapport"
-
-#: views/reports/partials/report-fields.hbs:8
-#: views/reports/partials/report-fields.hbs:11
-msgid ""
-"Select a campaign in the table above by clicking on the respective row "
-"number."
-msgstr ""
-"Sélectionnez une campagne dans la table ci-dessus en cliquant sur son numéro "
-"de ligne."
-
-#: views/reports/partials/report-select-template.hbs:1
-msgid "Report Template"
-msgstr "Modèle de rapport"
-
-#: views/settings.hbs:5
-msgid "Service Address (URL)"
-msgstr "Adresse du service (URL)"
-
-#: views/settings.hbs:6
-msgid "Enter the URL this service can be reached from"
-msgstr "Entrez l'URL à laquelle ce service peut être joint"
-
-#: views/settings.hbs:7
-msgid "Admin Email"
-msgstr "Email de l'administrateur"
-
-#: views/settings.hbs:8
-msgid ""
-"Enter the email address that will be used as \"from\" for system messages"
-msgstr "Entrez l'adresse mail d'émission des messages système"
-
-#: views/settings.hbs:9
-msgid "Disable WYSIWYG editor"
-msgstr "Désactiver l'éditeur WYSIWYG"
-
-#: views/settings.hbs:10
-msgid "If checked then message editor displays HTML code without the preview"
-msgstr ""
-"Si activé, l'editeur HTML affiche le code HTML sans la prévisualisation"
-
-#: views/settings.hbs:11
-msgid "Disable subscription confirmation messages"
-msgstr "Désactiver les messages de confirmation d'abonnement"
-
-#: views/settings.hbs:12
-msgid ""
-"If checked then do not send a confirmation message that states the "
-"subscriber is now subscribed or unsubscribed. This does not disable double "
-"opt-in messages."
-msgstr ""
-"Si activé, aucun message de confirmation suivant lequel un utilisateur a été "
-"abonné ou désabonné ne sera envoyé. Cela ne désactive pas les messages de "
-"confirmation d'abonnement."
-
-#: views/settings.hbs:13
-msgid "Tracking ID"
-msgstr "Identifiant de suivi"
-
-#: views/settings.hbs:14
-msgid "Enter Google Analytics tracking code"
-msgstr "Entrez le code de suivi Google Analytics"
-
-#: views/settings.hbs:15
-msgid "Frontpage shout out"
-msgstr "Annonce de la page d'accueil"
-
-#: views/settings.hbs:16
-msgid "HTML code shown in the front page header section"
-msgstr "Code HTML présent sur l'entête de la page d'accueil"
-
-#: views/settings.hbs:17
-msgid "X-Mailer header"
-msgstr "Entête X-Mailer"
-
-#: views/settings.hbs:18
-msgid "Set a custom X-Mailer header value or leave empty to disable it"
-msgstr ""
-"Renseignez un entête X-Mailer personnalisé, et laissez vide pour désactiver"
-
-#: views/settings.hbs:19
-msgid "Campaign defaults"
-msgstr "Paramètres par défaut de la campagne"
-
-#: views/settings.hbs:20
-msgid "Sender name"
-msgstr "Nom de l'émetteur"
-
-#: views/settings.hbs:21
-msgid "Sender name, eg. My Awesome Company Ltd."
-msgstr "Nom de l'émetteur, par ex. My Awesome Company Ltd."
-
-#: views/settings.hbs:22
-msgid "Default address"
-msgstr "Adresse mail par défaut"
-
-#: views/settings.hbs:23
-msgid ""
-"Contact address to provide, eg. 1234 Main Street, Anywhere, MA 01234, USA"
-msgstr ""
-"Adresse de contact à fournir, par ex. 1234 Main Street, Anywhere, MA 01234, "
-"USA"
-
-#: views/settings.hbs:24
-msgid "Default \"from name\""
-msgstr "Nom d'émetteur par défaut"
-
-#: views/settings.hbs:26
-msgid "Default \"from\" email"
-msgstr "Adresse mail d'émetteur par défaut"
-
-#: views/settings.hbs:28
-msgid "Default \"subject line\""
-msgstr "Objet du mail par défaut"
-
-#: views/settings.hbs:30
-msgid "Default homepage (URL)"
-msgstr "Page d'accueil par défaut (URL)"
-
-#: views/settings.hbs:31
-msgid "URL to redirect the subscribed users to, eg. http://example.com/"
-msgstr "URL où rediriger les utilisateurs abonnés, par ex. http://example.com/"
-
-#: views/settings.hbs:32
-msgid "Default custom unsubscribe (URL))"
-msgstr "URL de désabonnement personnalisable par défaut"
-
-#: views/settings.hbs:33
-msgid "Custom unsubscribe URL, eg. http://example.com/unsubscribe/[EMAIL]"
-msgstr ""
-"URL personnalisée de désabonnement, par ex. http://example.com/unsubscribe/"
-"[EMAIL]"
-
-#: views/settings.hbs:34
-msgid "Set a custom unsubscribe url."
-msgstr "Renseignez une URL de désabonnement personnalisée."
-
-#: views/settings.hbs:35
-msgid "Mailer Settings"
-msgstr "Paramètres mailer"
-
-#: views/settings.hbs:36
-msgid "These settings are required to send out e-mail messages"
-msgstr "Ces paramètres sont obligatoires pour envoyer des messages"
-
-#: views/settings.hbs:37
-msgid "SMTP"
-msgstr "SMTP"
-
-#: views/settings.hbs:38
-msgid "AWS SES"
-msgstr "AWS SES"
-
-#: views/settings.hbs:39
-msgid "Use SMTP for sending mail"
-msgstr "Utiliser SMTP pour envoyer les mails"
-
-#: views/settings.hbs:40
-msgid "Hostname"
-msgstr "Nom de machine"
-
-#: views/settings.hbs:41
-msgid "Port"
-msgstr "Port"
-
-#: views/settings.hbs:42
-msgid "Port, eg. 465. Autodetected if left blank"
-msgstr "Port, par ex. 465. Autodétecté si vide"
-
-#: views/settings.hbs:43
-msgid "Encryption"
-msgstr "Chiffrement"
-
-#: views/settings.hbs:44
-msgid "Disable SMTP authentication"
-msgstr "Désactiver l'authentification SMTP"
-
-#: views/settings.hbs:45 views/users/forgot.hbs:9 views/users/login.hbs:4
-#: views/users/login.hbs:5
-msgid "Username"
-msgstr "Utilisateur"
-
-#: views/settings.hbs:46
-msgid "Username, eg. myaccount@example.com"
-msgstr "Nom d'utilisateur, par ex. myaccount@example.com"
-
-#: views/settings.hbs:47 views/settings.hbs:48 views/users/login.hbs:6
-#: views/users/login.hbs:7
-msgid "Password"
-msgstr "Mot de passe"
-
-#: views/settings.hbs:49
-msgid "Use SES API for sending mail"
-msgstr "Utiliser l'API SES pour envoyer les mails"
-
-#: views/settings.hbs:50
-msgid "Access Key"
-msgstr "Clé d'accès"
-
-#: views/settings.hbs:51
-msgid "AWS Access Key Id"
-msgstr "ID de la clé d'accès AWS"
-
-#: views/settings.hbs:52
-msgid "Secret Key"
-msgstr "Clé secrète"
-
-#: views/settings.hbs:53
-msgid "AWS Secret Access Key"
-msgstr "Secret de la clé d'accès AWS"
-
-#: views/settings.hbs:54
-msgid "Region"
-msgstr "Région"
-
-#: views/settings.hbs:55
-msgid "Checking"
-msgstr "Vérification"
-
-#: views/settings.hbs:56
-msgid "Check Mailer config"
-msgstr "Vérifier la configuration du serveur mail"
-
-#: views/settings.hbs:57
-msgid "Advanced Mailer settings"
-msgstr "Paramètres avancés du serveur mail"
-
-#: views/settings.hbs:58
-msgid "Log SMTP transactions"
-msgstr "Log des transactions SMTP"
-
-#: views/settings.hbs:59
-msgid "Allow self-signed certificates"
-msgstr "Autoriser les certificats autosignés"
-
-#: views/settings.hbs:60
-msgid "Max connections"
-msgstr "Nombre maximum de connections"
-
-#: views/settings.hbs:61
-msgid "The count of max connections, eg. 10"
-msgstr "Le nombre maximum de connexions, par ex. 10"
-
-#: views/settings.hbs:62
-msgid ""
-"The count of maximum simultaneous connections to make against the SMTP "
-"server (defaults to 5). This limit is per sending process."
-msgstr ""
-"Le nombre maximum de connexions simultannées vers le serveur SMTP (par "
-"défaut 5). Cette limite s'entend par process d'envoi"
-
-#: views/settings.hbs:63
-msgid "Max messages"
-msgstr "Nombre maximum de messages"
-
-#: views/settings.hbs:64
-msgid "The count of max messages, eg. 100"
-msgstr "Le nombre maximum de messages, par ex. 100"
-
-#: views/settings.hbs:65
-msgid ""
-"The number of messages to send through a single connection before the "
-"connection is closed and reopened (defaults to 100)"
-msgstr ""
-"Le nombre de messages à envoyer au travers d'une connexion unique avant "
-"qu'elle ne soit fermée puis réouverte (par défaut 100)"
-
-#: views/settings.hbs:66
-msgid "Throttling"
-msgstr "Restrictions"
-
-#: views/settings.hbs:67
-msgid "Messages per hour eg. 1000"
-msgstr "Messages par heure ex: 1000"
-
-#: views/settings.hbs:68
-msgid ""
-"Maximum number of messages to send in an hour. Leave empty or zero for no "
-"throttling. If your provider uses a different speed limit (messages/minute "
-"or messages/second) then convert this limit into messages/hour (1m/s => "
-"3600m/h). This limit is per sending process."
-msgstr ""
-"Nombre maximum de messages envoyés par heure. Laissez vide pour ne pas "
-"restreindre. Si votre fournisseur utilise une unité différente (messages/"
-"minute ou messages/seconde) convertissez cette limite en messages/heure (1 m/"
-"s => 3600 m/h). Cette limite se comprend par process d'émission."
-
-#: views/settings.hbs:69
-msgid "VERP bounce handling"
-msgstr "Traitement VERP des rejets"
-
-#: views/settings.hbs:70
-msgid ""
-"Mailtrain is able to use VERP based routing to detect bounces. In this case "
-"the message is sent to the recipient using a custom VERP address as the "
-"return path of the message. If the message is not accepted a bounce email is "
-"sent to this special VERP address and thus a bounce is detected."
-msgstr ""
-"Mailtrain peut utiliser un routage VERP de façon à détecter les adresses en "
-"erreur. Pour cela le message est envoyé avec un adresse de retour VERP "
-"spécifique. Si le message est rejeté, un message de rejet est renvoyé à "
-"cette adresse VERP, permettant de détecter l'adresse en erreur."
-
-#: views/settings.hbs:71
-msgid ""
-"To get VERP working you need to set up a DNS MX record that points to your "
-"Mailtrain hostname. You must also ensure that Mailtrain VERP interface is "
-"available from port 25 of your server (port 25 usually requires root user "
-"privileges). This way if anyone tries to send email to someuser@verp-"
-"hostname then the email should end up to this server."
-msgstr ""
-"Pour que le VERP fonctionne, vous devez renseigner un enregistrement DNS MX "
-"qui pointe vers le nom de domaine de votre Mailtrain. Vérifiez également que "
-"l'interface VERP est disponible sur le port 25 de votre serveur (le port 25 "
-"nécessite habituellement les privilèges root). Si quelqu'un envoie un mail à "
-"someuser@verp-hostname, le mail doit atteindre ce serveur."
-
-#: views/settings.hbs:72
-msgid ""
-"VERP usually only works if you are using your own SMTP server. Regular relay "
-"services (SES, SparkPost, Gmail etc.) tend to remove the VERP address from "
-"the message."
-msgstr ""
-"Le VERP ne fonctionne habituellement que si vous utilisez votre propre "
-"serveur SMTP. Les services de relai ordinaires (SES, SparkPost, Gmail, etc.) "
-"tendent à supprimer les adresses VERP des messages."
-
-#: views/settings.hbs:73
-msgid "Use VERP to catch bounces"
-msgstr "Utiliser le VERP pour récupérer les rejets"
-
-#: views/settings.hbs:74
-msgid "Server hostname"
-msgstr "Nom de machine du serveur"
-
-#: views/settings.hbs:75
-msgid "The VERP server hostname, eg. bounces.example.com"
-msgstr "Le nom du serveur VERP, par ex. bouces.example.com"
-
-#: views/settings.hbs:76
-msgid ""
-"VERP bounce handling server hostname. This hostname is used in the SMTP "
-"envelope FROM address and the MX DNS records should point to this server"
-msgstr ""
-"Nom du serveur de traitement VERP. Ce nom d'hôte est habituellement utilisée "
-"dans l'entête SMTP FROM d'enveloppe, et est pointé par l'enregistrement DNS "
-"MX."
-
-#: views/settings.hbs:77
-msgid ""
-"VERP bounce handling server is not enabled. Modify your server configuration "
-"file and restart server to enable it"
-msgstr ""
-"Le serveur de traitement VERP n'est pas activé. Modifier le fichier de "
-"configuration et redémarrer le serveur pour l'activer"
-
-#: views/settings.hbs:78
-msgid "GPG Signing"
-msgstr "Signature GPG"
-
-#: views/settings.hbs:79
-msgid ""
-"Only messages that are encrypted can be signed. Subsribers who have not set "
-"up a GPG public key in their profile receive normal email messages. Users "
-"with GPG key set receive encrypted messages and if you have signing key also "
-"set, the messages are signed with this key."
-msgstr ""
-"Seuls les messages chiffrés peuvent être signés. Les abonnés qui n'ont pas "
-"fourni dans leur profil de clé publique GPG reçoivent normalement les mails. "
-"Les utilisateurs qui ont fourni leur clé GPG recevront les mails sous forme "
-"chiffrée, et si vous avez fourni une clé de signature, les messages seront "
-"en plus signés avec cette clé."
-
-#: views/settings.hbs:80
-msgid ""
-"Do not use sensitive keys here. The private key and passphrase are not "
-"encrypted in the database."
-msgstr ""
-"Ne pas utiliser de clé sensible ici. La clé privée et la phrase de "
-"déchiffrement ne sont pas chiffrées dans la base de données."
-
-#: views/settings.hbs:81
-msgid "Private Key Passphrase"
-msgstr "Phrase de déchiffrement de la clé privée"
-
-#: views/settings.hbs:82
-msgid "Passphrase for the key if set"
-msgstr "Phrase de déchiffrement de la clé si fournie"
-
-#: views/settings.hbs:83
-msgid "Only fill this if your private key is encrypted with a passphrase"
-msgstr ""
-"Renseignez uniquement si votre clé privée est protégée par un mot de passe"
-
-#: views/settings.hbs:84
-msgid "GPG Private Key"
-msgstr "Clé privée GPG"
-
-#: views/settings.hbs:86
-msgid ""
-"This value is optional. If you do not provide a private key GPG encrypted "
-"messages are sent without signing."
-msgstr ""
-"Cette valeur est optionnelle. Si vous ne fournissez pas de clé privé GPG, "
-"les messages chiffrés sont envoyés sans signature."
-
-#: views/settings.hbs:87
-msgid "DKIM Signing by ZoneMTA"
-msgstr "Signature DKIM par ZoneMTA"
-
-#: views/settings.hbs:88
-msgid ""
-"If you are using ZoneMTA then Mailtrain can provide a DKIM key for signing "
-"all outgoing messages. Other services usually provide their own means to "
-"DKIM sign your messages"
-msgstr ""
-"Si vous utilisez ZoneMTA, Mailtrain peut fournir une clé DKIM pour signer "
-"les messages sortants. Les autres services fournissent habituellement leurs "
-"propres moyens pour signer vos messages avec DKIM"
-
-#: views/settings.hbs:89
-msgid ""
-"Do not use sensitive keys here. The private key is not encrypted in the "
-"database."
-msgstr ""
-"Ne pas utiliser de clé sensible ici. La clé privée n'est pas chiffrée dans "
-"la base de données."
-
-#: views/settings.hbs:90
-msgid "ZoneMTA DKIM API Key"
-msgstr "Clé de l'API DKIM ZoneMTA"
-
-#: views/settings.hbs:91
-msgid "Some secret value"
-msgstr "Valeur secrète"
-
-#: views/settings.hbs:92
-msgid ""
-"Secret value known to ZoneMTA for requesting DKIM key information. If this "
-"value was generated by the Mailtrain installation script then you can keep "
-"it as it is"
-msgstr ""
-"Valeur secrète connue de ZoneMTA pour les requêtes d'informations de clés "
-"DKIM. Si cette valeur a été générée lors de l'installation Mailtrain, elle "
-"peut être conservée."
-
-#: views/settings.hbs:93
-msgid "DKIM domain"
-msgstr "Domaine DKIM"
-
-#: views/settings.hbs:94
-msgid "Domain name for the DKIM key"
-msgstr "Nom de domaine pour la clé DKIM"
-
-#: views/settings.hbs:95
-msgid "Leave blank to use the sender email address domain"
-msgstr "Laissez vide pour utiliser le domaine de l'adresse mail de l'émetteur"
-
-#: views/settings.hbs:96 views/settings.hbs:97
-msgid "DKIM key selector"
-msgstr "Sélecteur de clé DKIM"
-
-#: views/settings.hbs:98
-msgid "Signing is disabled without a valid selector value"
-msgstr "L'abonnement est désactivé en l'absence de valeur de sélection valide"
-
-#: views/settings.hbs:99
-msgid "DKIM Private Key"
-msgstr "Clé privée DKIM"
-
-#: views/settings.hbs:101
-msgid ""
-"This value is optional. If you do not provide a private key then messages "
-"are not signed."
-msgstr ""
-"Cette valeur est optionnelle. Si vous ne fournissez pas de clé privée, les "
-"messages ne seront pas signés."
-
-#: views/subscription/mail-already-subscribed-html.mjml.hbs:1
-#: views/subscription/mail-already-subscribed-text.hbs:1
-#: lib/models/subscriptions.js:174 lib/models/subscriptions.js:895
-msgid "Email address already registered"
-msgstr "Adresse mail déjà enregistrée"
-
-#: views/subscription/mail-already-subscribed-html.mjml.hbs:2
-#: views/subscription/mail-already-subscribed-text.hbs:2
-msgid ""
-"We have received a subscription request. Your email address is however "
-"already registered."
-msgstr ""
-"Nous avons reçu une demande d'abonnement. Cependant votre adresse mail est "
-"déjà enregistrée."
-
-#: views/subscription/mail-already-subscribed-html.mjml.hbs:3
-#: views/subscription/mail-already-subscribed-text.hbs:3
-msgid ""
-"If you received this email by mistake, simply delete it. Your existing "
-"subscription won't be affected."
-msgstr ""
-"Si vous avez reçu ce message par erreur, vous pouvez simplement le "
-"supprimer. Votre abonnement ne sera pas modifié."
-
-#: views/subscription/mail-already-subscribed-html.mjml.hbs:4
-#: views/subscription/mail-subscription-confirmed-html.mjml.hbs:3
-msgid "If you want to modify your subscription then you can "
-msgstr "Si vous voulez modifier votre abonnement vous pouvez"
-
-#: views/subscription/mail-already-subscribed-html.mjml.hbs:5
-#: views/subscription/mail-already-subscribed-text.hbs:5
-#: views/subscription/mail-subscription-confirmed-html.mjml.hbs:4
-#: views/subscription/mail-subscription-confirmed-text.hbs:4
-msgid "manage your preferences"
-msgstr "gestion de vos préférences"
-
-#: views/subscription/mail-already-subscribed-html.mjml.hbs:6
-#: views/subscription/mail-already-subscribed-text.hbs:6
-#: views/subscription/mail-subscription-confirmed-html.mjml.hbs:5
-#: views/subscription/mail-subscription-confirmed-text.hbs:5
-#: views/users/login.hbs:10
-msgid "or"
-msgstr "ou"
-
-#: views/subscription/mail-already-subscribed-html.mjml.hbs:7
-#: views/subscription/mail-already-subscribed-text.hbs:7
-#: views/subscription/mail-subscription-confirmed-html.mjml.hbs:6
-#: views/subscription/mail-subscription-confirmed-text.hbs:6
-msgid "unsubscribe here"
-msgstr "désabonnement ici"
-
-#: views/subscription/mail-already-subscribed-html.mjml.hbs:8
-#: views/subscription/mail-subscription-confirmed-html.mjml.hbs:7
-#: views/subscription/web-confirm-subscription-notice.mjml.hbs:3
-#: views/subscription/web-confirm-unsubscription-notice.mjml.hbs:3
-#: views/subscription/web-manual-unsubscribe-notice.mjml.hbs:4
-#: views/subscription/web-subscribed-notice.mjml.hbs:4
-#: views/subscription/web-unsubscribed-notice.mjml.hbs:3
-#: views/subscription/web-updated-notice.mjml.hbs:3
-msgid "Return to our website"
-msgstr "Retour à notre site web"
-
-#: views/subscription/mail-already-subscribed-html.mjml.hbs:9
-#: views/subscription/mail-already-subscribed-text.hbs:8
-#: views/subscription/mail-confirm-address-change-html.mjml.hbs:4
-#: views/subscription/mail-confirm-address-change-text.hbs:4
-#: views/subscription/mail-confirm-subscription-html.mjml.hbs:4
-#: views/subscription/mail-confirm-subscription-text.hbs:4
-#: views/subscription/mail-confirm-unsubscription-html.mjml.hbs:4
-#: views/subscription/mail-confirm-unsubscription-text.hbs:4
-#: views/subscription/mail-subscription-confirmed-html.mjml.hbs:8
-#: views/subscription/mail-subscription-confirmed-text.hbs:7
-#: views/subscription/mail-unsubscription-confirmed-html.mjml.hbs:5
-#: views/subscription/mail-unsubscription-confirmed-text.hbs:5
-msgid "For questions about this list, please contact:"
-msgstr "Pour les questions à ce sujet, contactez :"
-
-#: views/subscription/mail-already-subscribed-text.hbs:4
-#: views/subscription/mail-subscription-confirmed-text.hbs:3
-msgid "If you want to modify your subscription then you can:"
-msgstr "Si vous voulez modifier votre abonnement vous pouvez :"
-
-#: views/subscription/mail-confirm-address-change-html.mjml.hbs:1
-#: views/subscription/mail-confirm-address-change-text.hbs:1
-msgid "Please Confirm Subscription Address Change"
-msgstr "Merci de confirmer votre changement d'adresse mail"
-
-#: views/subscription/mail-confirm-address-change-html.mjml.hbs:2
-#: views/subscription/mail-confirm-address-change-text.hbs:2
-msgid "Yes, subscribe this email address to the list"
-msgstr "Oui, abonner cette adresse mail à cette liste"
-
-#: views/subscription/mail-confirm-address-change-html.mjml.hbs:3
-#: views/subscription/mail-confirm-subscription-html.mjml.hbs:3
-msgid ""
-"If you received this email by mistake, simply delete it. You won't be "
-"subscribed if you don't click the confirmation link above."
-msgstr ""
-"Si vous avez reçu ce message par erreur, vous pouvez simplement le "
-"supprimer. Vous ne serez pas abonné tant que vous ne cliquez pas le lien ci-"
-"dessus."
-
-#: views/subscription/mail-confirm-address-change-text.hbs:3
-#: views/subscription/mail-confirm-subscription-text.hbs:3
-msgid ""
-"If you received this email by mistake, simply delete it. You won't be "
-"subscribed unless you click the confirmation link above."
-msgstr ""
-"Si vous avez reçu ce message par erreur, vous pouvez simplement le "
-"supprimer. Vous ne serez pas abonné tant que vous ne cliquez pas le lien ci-"
-"dessus."
-
-#: views/subscription/mail-confirm-subscription-html.mjml.hbs:1
-#: views/subscription/mail-confirm-subscription-text.hbs:1
-#: views/subscription/mail-confirm-unsubscription-text.hbs:1
-#: routes/subscription.js:432
-msgid "Please Confirm Subscription"
-msgstr "Merci de confirmer votre abonnement"
-
-#: views/subscription/mail-confirm-subscription-html.mjml.hbs:2
-#: views/subscription/mail-confirm-subscription-text.hbs:2
-msgid "Yes, subscribe me to this list"
-msgstr "Oui, je m'abonne à cette liste"
-
-#: views/subscription/mail-confirm-unsubscription-html.mjml.hbs:1
-msgid "Please Confirm Unsubscription"
-msgstr "Merci de confirmer votre désabonnement"
-
-#: views/subscription/mail-confirm-unsubscription-html.mjml.hbs:2
-#: views/subscription/mail-confirm-unsubscription-text.hbs:2
-msgid "Yes, unsubscribe me from this list"
-msgstr "Oui, je me désabonne de cette liste"
-
-#: views/subscription/mail-confirm-unsubscription-html.mjml.hbs:3
-msgid ""
-"If you received this email by mistake, simply delete it. You won't be "
-"unsubscribed if you don't click the confirmation link above."
-msgstr ""
-"Si vous avez reçu ce message par erreur, vous pouvez simplement le "
-"supprimer. Vous ne serez pas désabonné tant que vous ne cliquez pas le lien "
-"ci-dessus."
-
-#: views/subscription/mail-confirm-unsubscription-text.hbs:3
-msgid ""
-"If you received this email by mistake, simply delete it. You won't be "
-"unsubscribed unless you click the confirmation link above."
-msgstr ""
-"Si vous avez reçu ce message par erreur, vous pouvez simplement le "
-"supprimer. Vous ne serez pas abonné tant que vous ne cliquez pas le lien ci-"
-"dessus."
-
-#: views/subscription/mail-subscription-confirmed-html.mjml.hbs:1
-#: views/subscription/mail-subscription-confirmed-text.hbs:1
-#: views/subscription/web-subscribed-notice.mjml.hbs:1
-msgid "Subscription Confirmed"
-msgstr "Abonnement confirmé"
-
-#: views/subscription/mail-subscription-confirmed-html.mjml.hbs:2
-msgid "Your subscription to our list has been confirmed"
-msgstr "Votre abonnement à la liste a été confirmé"
-
-#: views/subscription/mail-subscription-confirmed-text.hbs:2
-#: views/subscription/web-subscribed-notice.mjml.hbs:2
-msgid "Your subscription to our list has been confirmed."
-msgstr "Votre abonnement à la liste a été confirmé."
-
-#: views/subscription/mail-unsubscription-confirmed-html.mjml.hbs:1
-#: views/subscription/mail-unsubscription-confirmed-text.hbs:1
-msgid "You Are Now Unsubscribed"
-msgstr "Vous êtes désormais désabonné"
-
-#: views/subscription/mail-unsubscription-confirmed-html.mjml.hbs:2
-msgid "We have removed your email address from our list"
-msgstr "Nous avons retiré votre adresse mail de notre liste"
-
-#: views/subscription/mail-unsubscription-confirmed-html.mjml.hbs:3
-#: views/subscription/mail-unsubscription-confirmed-text.hbs:3
-msgid "If you unsubscribed by mistake, you can re-subscribe at:"
-msgstr ""
-"Si vous vous êtes désabonné par erreur, vous pouvez à nouveau vous abonner "
-"ici :"
-
-#: views/subscription/mail-unsubscription-confirmed-text.hbs:2
-msgid "We have removed your email address from our list."
-msgstr "Nous avons retiré votre adresse mail de notre liste."
-
-#: views/subscription/partials/subscription-custom-fields.hbs:2
-msgid "want to change it?"
-msgstr "Voulez-vous le changer ?"
-
-#: views/subscription/partials/subscription-custom-fields.hbs:5
-msgid "Download signature verification key"
-msgstr "Télécharger la clé de vérification de signature"
-
-#: views/subscription/partials/subscription-custom-fields.hbs:7
-msgid ""
-"Insert your GPG public key here to encrypt messages sent to your address"
-msgstr ""
-"Insérez ici votre clé publique GPG pour chiffrer les messages envoyés à "
-"votre adresse"
-
-#: views/subscription/partials/subscription-custom-fields.hbs:8
-msgid "optional"
-msgstr "optionnel"
-
-#: views/subscription/partials/subscription-flash-messages.hbs:1
-#: views/subscription/partials/subscription-flash-messages.hbs:3
-msgid "Warning!"
-msgstr "Attention !"
-
-#: views/subscription/partials/subscription-flash-messages.hbs:2
-msgid "If JavaScript was not enabled then no confirmation message was sent"
-msgstr ""
-"Si javascript n'était pas activé, aucun message de confirmation n'a été "
-"envoyé"
-
-#: views/subscription/partials/subscription-flash-messages.hbs:4
-msgid "JavaScript must be enabled in order for this form to work"
-msgstr "JavaScript doit être activé pour utiliser ce formulaire"
-
-#: views/subscription/partials/subscription-manage-address-form.hbs:1
-msgid "Existing Email Address"
-msgstr "Adresse mail existante"
-
-#: views/subscription/partials/subscription-manage-address-form.hbs:2
-msgid "New Email Address"
-msgstr "Nouvelle adresse mail"
-
-#: views/subscription/partials/subscription-manage-address-form.hbs:3
-msgid "Your new email address"
-msgstr "Votre nouvelle adresse mail"
-
-#: views/subscription/partials/subscription-manage-address-form.hbs:4
-msgid ""
-"You will receive a confirmation request to your new email address that you "
-"need to accept before your email is actually changed"
-msgstr ""
-"Vous allez recevoir une demande de confirmation à votre nouvelle adresse "
-"mail, que vous devrez acceptez pour que votre nouvelle adresse soit prise en "
-"compte"
-
-#: views/subscription/partials/subscription-manage-address-form.hbs:5
-#: views/subscription/web-manage-address.mjml.hbs:2
-msgid "Update Email Address"
-msgstr "Mettre à jour l'adresse mail"
-
-#: views/subscription/partials/subscription-manage-form.hbs:1
-#: views/subscription/web-manage.mjml.hbs:2
-msgid "Update Profile"
-msgstr "Mettre à jour le profil"
-
-#: views/subscription/partials/subscription-subscribe-form.hbs:1
-#: views/subscription/web-subscribe.mjml.hbs:2
-#: views/subscription/widget-subscribe.hbs:1
-msgid "Subscribe to list"
-msgstr "S'abonner à la liste"
-
-#: views/subscription/web-confirm-subscription-notice.mjml.hbs:1
-#: views/subscription/web-confirm-unsubscription-notice.mjml.hbs:1
-#: views/subscription/widget-subscribe.hbs:4
-msgid "Almost Finished"
-msgstr "Presque terminé"
-
-#: views/subscription/web-confirm-subscription-notice.mjml.hbs:2
-#: views/subscription/widget-subscribe.hbs:5
-msgid ""
-"We need to confirm your email address. To complete the subscription process, "
-"please click the link in the email we just sent you."
-msgstr ""
-"Nous devons confirmer votre adresse mail. Pour terminer la procédure "
-"d'abonnement, merci de cliquer sur le lien présent dans le mail que nous "
-"venons de vous envoyer."
-
-#: views/subscription/web-confirm-unsubscription-notice.mjml.hbs:2
-msgid ""
-"We need to confirm your email address. To complete the unsubscription "
-"process, please click the link in the email we just sent you."
-msgstr ""
-"Nous devons confirmer votre adresse mail. Pour terminer la procédure de "
-"désabonnement, merci de cliquer sur le lien présent dans le mail que nous "
-"venons de vous envoyer."
-
-#: views/subscription/web-manage-address.mjml.hbs:1
-msgid "Update Your Email Address"
-msgstr "Mettre à jour votre adresse mail"
-
-#: views/subscription/web-manage.mjml.hbs:1
-msgid "Update Your Preferences"
-msgstr "Mettre à jour vos préférences"
-
-#: views/subscription/web-manual-unsubscribe-notice.mjml.hbs:1
-msgid "Online Unsubscription Is Not Possible"
-msgstr "Le désabonnement en ligne n'est pas autorisé"
-
-#: views/subscription/web-manual-unsubscribe-notice.mjml.hbs:2
-msgid "Please contact us at"
-msgstr "Merci de nous contacter à"
-
-#: views/subscription/web-manual-unsubscribe-notice.mjml.hbs:3
-msgid "to get removed from the list"
-msgstr "pour être retiré de la liste"
-
-#: views/subscription/web-subscribe.mjml.hbs:1
-msgid "Subscribe to List"
-msgstr "S'abonner à la liste"
-
-#: views/subscription/web-subscribed-notice.mjml.hbs:3
-msgid "Thank you for subscribing!"
-msgstr "Merci de votre abonnement !"
-
-#: views/subscription/web-unsubscribed-notice.mjml.hbs:1
-msgid "Unsubscribe Successful"
-msgstr "Désabonnement pris en compte"
-
-#: views/subscription/web-unsubscribed-notice.mjml.hbs:2
-msgid "You have been removed from:"
-msgstr "Vous avez été retiré de :"
-
-#: views/subscription/web-updated-notice.mjml.hbs:1
-msgid "Profile Updated"
-msgstr "Profil mis à jour"
-
-#: views/subscription/web-updated-notice.mjml.hbs:2
-msgid "Your profile information has been updated."
-msgstr "Vos informations de profil ont été enregistrées"
-
-#: views/subscription/widget-subscribe.hbs:2
-msgid "Sending ..."
-msgstr "Envoi ..."
-
-#: views/subscription/widget-subscribe.hbs:3
-msgid "It looks like you are already subscribed to this list."
-msgstr "Il semble que vous soyez déjà abonné à cette liste."
-
-#: views/templates/create.hbs:5 views/templates/edit.hbs:6
-msgid "Template name"
-msgstr "Nom du modèle"
-
-#: views/templates/create.hbs:6 views/templates/edit.hbs:7
-msgid "Name for this template, eg. Newsletter"
-msgstr "Nom de ce modèle, par ex. Newsletter"
-
-#: views/templates/create.hbs:7
-msgid "HTML Editor"
-msgstr "Éditeur HTML"
-
-#: views/templates/create.hbs:10 views/templates/edit.hbs:9
-msgid "Optional comments about this template"
-msgstr "Commentaire optionnel sur ce modèle"
-
-#: views/templates/edit.hbs:5
-msgid "Back to templates"
-msgstr "Retour aux modèles"
-
-#: views/templates/edit.hbs:11
-msgid "Duplicate"
-msgstr "Dupliquer"
-
-#: views/triggers/create-select.hbs:2 views/triggers/create.hbs:2
-#: views/triggers/edit.hbs:2 views/triggers/triggered.hbs:2
-#: views/triggers/triggers.hbs:2 views/triggers/triggers.hbs:4
-msgid "Automation Triggers"
-msgstr "Déclencheurs des automatismes"
-
-#: views/triggers/create-select.hbs:5
-msgid "Select a list for the trigger"
-msgstr "Sélectionnez une liste pour le déclencheur"
-
-#: views/triggers/create.hbs:5 views/triggers/edit.hbs:6
-msgid "Trigger name"
-msgstr "Nom du déclencheur"
-
-#: views/triggers/create.hbs:6 views/triggers/edit.hbs:7
-msgid "Name for this trigger, eg. Inactive subscribers"
-msgstr "Nom de ce déclencheur, par ex. Abonnés inactifs"
-
-#: views/triggers/create.hbs:8 views/triggers/edit.hbs:9
-msgid "Optional comments about this trigger"
-msgstr "Commentaire optionnel sur ce déclencheur"
-
-#: views/triggers/create.hbs:12 views/triggers/edit.hbs:14
-msgid "Trigger rule"
-msgstr "Règle du déclencheur"
-
-#: views/triggers/create.hbs:13 views/triggers/edit.hbs:15
-msgid "Trigger fires"
-msgstr "Déclencheur lancé"
-
-#: views/triggers/create.hbs:14 views/triggers/edit.hbs:16
-msgid "days after:"
-msgstr "jours suivants :"
-
-#: views/triggers/create.hbs:16 views/triggers/create.hbs:21
-#: views/triggers/edit.hbs:18 views/triggers/edit.hbs:23
-msgid "Event"
-msgstr "Évènement"
-
-#: views/triggers/create.hbs:18 views/triggers/create.hbs:19
-#: views/triggers/create.hbs:25 views/triggers/edit.hbs:20
-#: views/triggers/edit.hbs:21 views/triggers/edit.hbs:27
-msgid "Campaign"
-msgstr "Campagne"
-
-#: views/triggers/create.hbs:23 views/triggers/edit.hbs:25
-msgid "Trigger action"
-msgstr "Action du déclencheur"
-
-#: views/triggers/create.hbs:24 views/triggers/edit.hbs:26
-msgid "Send campaign"
-msgstr "Envoyer la campagne"
-
-#: views/triggers/edit.hbs:3 views/triggers/edit.hbs:4
-msgid "Edit Trigger"
-msgstr "Modifier le déclencheur"
-
-#: views/triggers/edit.hbs:5
-msgid "Back to triggers"
-msgstr "Retour aux déclencheurs"
-
-#: views/triggers/edit.hbs:11
-msgid "Trigger is enabled"
-msgstr "Le déclencheur est activé"
-
-#: views/triggers/edit.hbs:29
-msgid "Delete Trigger"
-msgstr "Supprimer le déclencheur"
-
-#: views/triggers/triggered.hbs:3
-msgid "Triggered"
-msgstr "Déclenché"
-
-#: views/triggers/triggered.hbs:4
-msgid "Triggered subscribers"
-msgstr "Abonnés déclenchés"
-
-#: views/triggers/triggered.hbs:5
-msgid "Subscribers who caused this trigger to fire"
-msgstr "Abonnés ayant activé ce déclencheur"
-
-#: views/triggers/triggered.hbs:9
-msgid "Triggered time"
-msgstr "Heure du déclenchement"
-
-#: views/triggers/triggers.hbs:9
-msgid "Trigger"
-msgstr "Déclencheur"
-
-#: views/triggers/triggers.hbs:10
-msgid "Target Campaign"
-msgstr "Campagne cible"
-
-#: views/triggers/triggers.hbs:11
-msgid "Triggered count"
-msgstr "Nombre de déclencheurs"
-
-#: views/users/account.hbs:4
-msgid "This account is managed through LDAP."
-msgstr "Ce compte est géré par le LDAP."
-
-#: views/users/account.hbs:5
-msgid "Associated Email Address"
-msgstr "Adresse mail associée"
-
-#: views/users/account.hbs:8
-msgid "Your e-mail address"
-msgstr "Votre adresse mail"
-
-#: views/users/account.hbs:9
-msgid ""
-"This address is used for account recovery in case you lose your password"
-msgstr "Cette adresse vous permet de réinitialiser un mot de passe perdu"
-
-#: views/users/account.hbs:10
-msgid "Password change"
-msgstr "Changement du mot de passe"
-
-#: views/users/account.hbs:11
-msgid ""
-"You only need to fill out this form if you want to change your current "
-"password"
-msgstr ""
-"Vous avez uniquement ce formulaire à remplir pour changer votre mot de passe"
-
-#: views/users/account.hbs:12 views/users/account.hbs:13
-msgid "Current Password"
-msgstr "Mot de passe actuel"
-
-#: views/users/account.hbs:14 views/users/account.hbs:15
-#: views/users/reset.hbs:6 views/users/reset.hbs:7
-msgid "New Password"
-msgstr "Nouveau mot de passe"
-
-#: views/users/account.hbs:16 views/users/reset.hbs:8
-msgid "Confirm Password"
-msgstr "Confirmation du mot de passe"
-
-#: views/users/account.hbs:17 views/users/reset.hbs:9
-msgid "Confirm New Password"
-msgstr "Confirmez le nouveau mot de passe"
-
-#: views/users/api.hbs:4
-msgid "Are you sure? Resetting would invalidate the currently existing token."
-msgstr "Êtes-vous sûr ? La réinitialisation invaliderait les jetons existants."
-
-#: views/users/api.hbs:5
-msgid "Are you sure?"
-msgstr "Êtes-vous sûr ?"
-
-#: views/users/api.hbs:6
-msgid "Reset Access Token"
-msgstr "Réinitialiser le jeton d'accès"
-
-#: views/users/api.hbs:7
-msgid "Generate Access Token"
-msgstr "Générer un jeton d'accès"
-
-#: views/users/api.hbs:8
-msgid "Personal access token:"
-msgstr "Jeton d'accès privé :"
-
-#: views/users/api.hbs:9
-msgid "Access token not yet generated"
-msgstr "Le jeton d'accès n'est pas encore généré"
-
-#: views/users/api.hbs:10
-msgid "Notes about the API"
-msgstr "Notes à propos de l'API"
-
-#: views/users/api.hbs:11
-msgid ""
-"API response is a JSON structure with error and data"
-"code> properties. If the response error has a value set then "
-"the request failed."
-msgstr ""
-"La réponse de l'API est un document JSON avec les propriétés error"
-"code> et data. Si la propriété error est "
-"renseignée, alors la requête a échoué."
-
-#: views/users/api.hbs:12
-msgid ""
-"You need to define proper Content-Type when making a request. "
-"You can either use application/x-www-form-urlencoded for normal "
-"form data or application/json for a JSON payload. Using "
-"multipart/form-data is not supported."
-msgstr ""
-"Vous devez définir le bon Content-Type lors de vos requêtes. "
-"Vous pouvez utiliser soit application/x-www-form-urlencoded "
-"pour des données de formulaire, ou application/json pour une "
-"requête JSON. Vous ne pouvez pas utiliser multipart/form-data."
-
-#: views/users/api.hbs:13
-msgid "Get list of subscriptions"
-msgstr "Obtenir la liste des abonnés"
-
-#: views/users/api.hbs:14
-msgid ""
-"Retrieve a list of subscriptions to the list referenced by :listId. All "
-"fields of the subscribers will be returned. Note that custom fields will "
-"have generated names."
-msgstr ""
-"Récupérer l'ensemble des abonnements à la liste référencée :listId. Tous les "
-"champs des abonnés seront renvoyés. Notez que les champs personnalisés "
-"auront des noms générés automatiquement."
-
-#: views/users/api.hbs:15 views/users/api.hbs:24 views/users/api.hbs:26
-#: views/users/api.hbs:39 views/users/api.hbs:41 views/users/api.hbs:47
-#: views/users/api.hbs:49 views/users/api.hbs:55 views/users/api.hbs:57
-#: views/users/api.hbs:67 views/users/api.hbs:78 views/users/api.hbs:80
-#: views/users/api.hbs:86 views/users/api.hbs:88 views/users/api.hbs:94
-#: views/users/api.hbs:99 views/users/api.hbs:104
-msgid "arguments"
-msgstr "arguments"
-
-#: views/users/api.hbs:16 views/users/api.hbs:25 views/users/api.hbs:40
-#: views/users/api.hbs:48 views/users/api.hbs:56 views/users/api.hbs:68
-#: views/users/api.hbs:79 views/users/api.hbs:87 views/users/api.hbs:95
-#: views/users/api.hbs:100 views/users/api.hbs:105
-msgid "your personal access token"
-msgstr "votre token d'accès personnel"
-
-#: views/users/api.hbs:17 views/users/api.hbs:69
-msgid "Start position"
-msgstr "Position de démarrage"
-
-#: views/users/api.hbs:18 views/users/api.hbs:70
-msgid "optional, default 0"
-msgstr "optionnel, par défaut 0"
-
-#: views/users/api.hbs:19
-msgid "limit subscription count in response"
-msgstr "nombre maximal d'abonnements retournés"
-
-#: views/users/api.hbs:20 views/users/api.hbs:72
-msgid "optional, default 10000"
-msgstr "optionnel, par défaut 10000"
-
-#: views/users/api.hbs:22
-msgid "Add subscription"
-msgstr "Ajouter un abonnement"
-
-#: views/users/api.hbs:23
-msgid ""
-"This API call either inserts a new subscription or updates existing. Fields "
-"not included are left as is, so if you update only LAST_NAME value, then "
-"FIRST_NAME is kept untouched for an existing subscription."
-msgstr ""
-"Ce service de l'API insère ou met à jour un abonnement. Les champs non "
-"fournis sont laissés tels quels. Ainsi, pour un abonnement existant, si vous "
-"ne mettez à jour que la valeur de LAST_NAME, FIRST_NAME ne sera pas modifié."
-
-#: views/users/api.hbs:27 views/users/api.hbs:42 views/users/api.hbs:50
-msgid "subscriber's email address"
-msgstr "adresse mail de l'abonné"
-
-#: views/users/api.hbs:28 views/users/api.hbs:43 views/users/api.hbs:51
-#: views/users/api.hbs:59 views/users/api.hbs:82 views/users/api.hbs:90
-msgid "required"
-msgstr "obligatoire"
-
-#: views/users/api.hbs:29
-msgid "subscriber's first name"
-msgstr "prénom de l'abonné"
-
-#: views/users/api.hbs:30
-msgid "subscriber's last name"
-msgstr "nom de l'abonné"
-
-#: views/users/api.hbs:31
-msgid ""
-"subscriber's timezone (eg. \"Europe/Tallinn\", \"PST\" or \"UTC\"). If not "
-"set defaults to \"UTC\""
-msgstr ""
-"Fuseau horaire de l'abonné (par ex. \"Europe/Paris\", \"CEST\" ou \"UTC\"). "
-"Par défaut \"UTC\""
-
-#: views/users/api.hbs:32
-msgid ""
-"custom field value. Use yes/no for option group values (checkboxes, radios, "
-"drop downs)"
-msgstr ""
-"valeur du champ personnalisé. Utiliser yes/no pour des valeurs d'options "
-"groupées (cases à cocher, choix sur listes, menus déroulants)"
-
-#: views/users/api.hbs:33
-msgid "Additional POST arguments"
-msgstr "Arguments POST additionnels"
-
-#: views/users/api.hbs:34
-msgid ""
-"set to \"yes\" if you want to make sure the email is marked as subscribed "
-"even if it was previously marked as unsubscribed. If the email was already "
-"unsubscribed/blocked then subscription status is not changed"
-msgstr ""
-"choisir \"oui\" si vous voulez être sur que l'adresse mail soit marquée "
-"comme abonnée, même si elle était précédemment marquée désabonnée. Si "
-"l'adresse mail était déjà désabonnée/bloquée, alors le statut d'abonnement "
-"n'est pas changé"
-
-#: views/users/api.hbs:35
-msgid ""
-"set to \"yes\" if you want to send confirmation email to the subscriber "
-"before actually marking as subscribed"
-msgstr ""
-"choisir \"oui\" si vous voulez envoyer un mail de confirmation aux nouveaux "
-"abonnés avant de marquer leur abonnement comme actif"
-
-#: views/users/api.hbs:37
-msgid "Remove subscription"
-msgstr "Retirer l'abonnement"
-
-#: views/users/api.hbs:38
-msgid "This API call marks a subscription as unsubscribed"
-msgstr "Ce service de l'API marque un abonnement comme désabonné"
-
-#: views/users/api.hbs:45
-msgid "Delete subscription"
-msgstr "Supprimer l'abonnement"
-
-#: views/users/api.hbs:46
-msgid "This API call deletes a subscription"
-msgstr "Ce service de l'API supprime un abonnement"
-
-#: views/users/api.hbs:53
-msgid "Add new custom field"
-msgstr "Ajouter un champ personnalisé"
-
-#: views/users/api.hbs:54
-msgid "This API call creates a new custom field for a list."
-msgstr "Ce service de l'API crée un nouveau champ personnalisé pour une liste."
-
-#: views/users/api.hbs:58
-msgid "field name"
-msgstr "nom du champ"
-
-#: views/users/api.hbs:60
-msgid "one of the following types:"
-msgstr "Un des types suivants :"
-
-#: views/users/api.hbs:61
-msgid ""
-"If the type is 'option' then you also need to specify the parent element ID"
-msgstr ""
-"Si le type est 'option', vous devez également spécifier l'ID de l'élément "
-"parent"
-
-#: views/users/api.hbs:62
-msgid ""
-"Template for the group element. If not set, then values of the elements are "
-"joined with commas"
-msgstr ""
-"Modèle pour le groupe d'éléments. Si vide, les valeurs seront concatennées "
-"avec des virgules"
-
-#: views/users/api.hbs:63
-msgid ""
-"if not visible then the subscriber can not view or modify this value at the "
-"profile page"
-msgstr ""
-"Si masqué, l'abonné ne peut pas voir ni modifier la valeur depuis sa page de "
-"profil"
-
-#: views/users/api.hbs:65
-msgid "Get list of blacklisted emails"
-msgstr "Obtenir les adresses mail en liste noire"
-
-#: views/users/api.hbs:66
-msgid "This API call get list of blacklisted emails."
-msgstr "Ce service de l'API renvoie la liste des mails dans la liste noire."
-
-#: views/users/api.hbs:71
-msgid "limit emails count in response"
-msgstr "nombre maximal d'adresses mail retournées"
-
-#: views/users/api.hbs:73
-msgid "filter by part of email"
-msgstr "Filtre sur partie d'adresse mail"
-
-#: views/users/api.hbs:74
-msgid "optional, default ''"
-msgstr "optionnel, par défaut ''"
-
-#: views/users/api.hbs:77
-msgid "This API call either add emails to blacklist"
-msgstr "Ce service de l'API ajoute des mails à la liste noire"
-
-#: views/users/api.hbs:81 views/users/api.hbs:89
-msgid "email address"
-msgstr "adresse mail"
-
-#: views/users/api.hbs:84
-msgid "Delete email from blacklist"
-msgstr "Supprimer le mail de la liste noire"
-
-#: views/users/api.hbs:85
-msgid "This API call either delete emails from blacklist"
-msgstr "Ce service de l'API supprime des mails de la liste noire"
-
-#: views/users/api.hbs:92
-msgid "Get the lists a user has subscribed to"
-msgstr "Obtenir la liste des listes auxquelles un utilisateur est abonné"
-
-#: views/users/api.hbs:93
-msgid "Retrieve the lists that the user with :email has subscribed to. "
-msgstr "Récupérer les listes auxquelles l'utilisateur :email est abonné. "
-
-#: views/users/api.hbs:97
-msgid "Get all lists"
-msgstr "Obtenir toutes les listes"
-
-#: views/users/api.hbs:98
-msgid "Retrieve every list. "
-msgstr "Récupérer toutes les listes. "
-
-#: views/users/api.hbs:102
-msgid "Get list by id"
-msgstr "Obtenir une liste via son id"
-
-#: views/users/api.hbs:103
-msgid "Retrieve the list with :id "
-msgstr "Récupérer la liste avec :id "
-
-#: views/users/forgot.hbs:3 views/users/reset.hbs:3
-msgid "Password Reset"
-msgstr "Réinitialisation du mot de passe"
-
-#: views/users/forgot.hbs:4
-msgid "Reset your password?"
-msgstr "Réinitialiser votre mot de passe ?"
-
-#: views/users/forgot.hbs:5
-msgid "Accounts are managed through LDAP."
-msgstr "Les comptes sont gérés par le LDAP."
-
-#: views/users/forgot.hbs:6 views/users/reset.hbs:10
-msgid "Reset Password"
-msgstr "Réinitialiser le mot de passe"
-
-#: views/users/forgot.hbs:7
-msgid ""
-"Please provide the username or email address that you used when you signed "
-"up for your Mailtrain account."
-msgstr ""
-"Merci d'entrer le nom d'utilisateur et l'adresse mail que vous avez "
-"fournis lors de votre inscription au service."
-
-#: views/users/forgot.hbs:8
-msgid "We will send you an email that will allow you to reset your password."
-msgstr ""
-"Nous allons vous envoyer un mail qui vous permettra de réinitialiser votre "
-"mot de passe."
-
-#: views/users/forgot.hbs:10
-msgid "Username or email address"
-msgstr "Nom d'utilisateur ou adresse mail"
-
-#: views/users/forgot.hbs:11
-msgid "Send verification email"
-msgstr "Envoyer un mail de vérification"
-
-#: views/users/login.hbs:8
-msgid "Remember me"
-msgstr "Se souvenir de moi"
-
-#: views/users/login.hbs:11 views/users/login.hbs:12
-msgid "Forgot password?"
-msgstr "Mot de passe oublié ?"
-
-#: views/users/reset.hbs:4
-msgid "Choose your new password"
-msgstr "Choisissez votre nouveau mot de passe"
-
-#: views/users/reset.hbs:5
-msgid "Please enter a new password."
-msgstr "Merci de saisir un nouveau mot de passe."
-
-#: lib/editor-helpers.js:17 routes/templates.js:95
-msgid "Could not find template with specified ID"
-msgstr "Ne peut trouver de modèle avec cet identifiant"
-
-#: lib/editor-helpers.js:33 routes/archive.js:145 routes/campaigns.js:132
-#: routes/campaigns.js:285 routes/campaigns.js:380 routes/campaigns.js:428
-#: routes/campaigns.js:468 routes/campaigns.js:845 routes/campaigns.js:868
-#: routes/campaigns.js:887 routes/campaigns.js:909 routes/triggers.js:172
-msgid "Could not find campaign with specified ID"
-msgstr "Aucune campagne ne correspond à cet identifiant"
-
-#: lib/editor-helpers.js:47 routes/editorapi.js:320
-msgid "Invalid resource type"
-msgstr "Type de ressource invalide"
-
-#: lib/feed.js:31
-msgid "Bad status code %s"
-msgstr "Code de statut d'erreur %s"
-
-#: lib/helpers.js:33
-msgid "URL that points to the unsubscribe page"
-msgstr "URL vers la page de désabonnement"
-
-#: lib/helpers.js:36
-msgid "URL that points to the preferences page of the subscriber"
-msgstr "URL vers la page de préférences de l'abonné"
-
-#: lib/helpers.js:39
-msgid "URL to preview the message in a browser"
-msgstr "URL de visualisation du message dans le navigateur"
-
-#: lib/helpers.js:45 lib/models/segments.js:31
-msgid "First name"
-msgstr "Prénom"
-
-#: lib/helpers.js:48 lib/models/segments.js:35
-msgid "Last name"
-msgstr "Nom"
-
-#: lib/helpers.js:51
-msgid "Full name (first and last name combined)"
-msgstr "Nom complet (Prénom et nom combinés)"
-
-#: lib/helpers.js:54
-msgid "Unique ID that identifies the recipient"
-msgstr "Identifiant unique du destinataire"
-
-#: lib/helpers.js:57
-msgid "Unique ID that identifies the list used for this campaign"
-msgstr "Identifiant unique de la liste utilisée pour cette campagne"
-
-#: lib/helpers.js:60
-msgid "Unique ID that identifies current campaign"
-msgstr "Identifiant unique de cette campagne"
-
-#: lib/helpers.js:68 lib/helpers.js:80
-msgid "content from an RSS entry"
-msgstr "Contenu d'une entrée RSS"
-
-#: lib/helpers.js:71
-msgid "RSS entry title"
-msgstr "Titre de l'entrée RSS"
-
-#: lib/helpers.js:74
-msgid "RSS entry date"
-msgstr "Date de l'entrée RSS"
-
-#: lib/helpers.js:77
-msgid "RSS entry link"
-msgstr "Lien de l'entrée RSS"
-
-#: lib/helpers.js:83
-msgid "RSS entry summary"
-msgstr "Résumé de l'entrée RSS"
-
-#: lib/helpers.js:86
-msgid "RSS entry image URL"
-msgstr "URL de l'image de l'entrée RSS"
-
-#: lib/mailer.js:245
-msgid "Invalid mail transport"
-msgstr "Transport mail invalide"
-
-#: lib/models/campaigns.js:105 lib/models/campaigns.js:132
-#: lib/models/campaigns.js:205 lib/models/campaigns.js:328
-#: lib/models/campaigns.js:590 lib/models/campaigns.js:723
-msgid "Missing Campaign ID"
-msgstr "Identifiant de campagne manquant"
-
-#: lib/models/campaigns.js:241
-msgid "Emtpy or too large attahcment"
-msgstr "Pièce jointe vide ou trop grande"
-
-#: lib/models/campaigns.js:408 lib/models/campaigns.js:600
-msgid "Campaign Name must be set"
-msgstr "Le nom de la campagne est obligatoire"
-
-#: lib/models/campaigns.js:412
-msgid "RSS URL must be set and needs to be a valid URL"
-msgstr "L'URL du flux RSS doit être renseignée et valide"
-
-#: lib/models/campaigns.js:568
-msgid "Selected template not found"
-msgstr "Modèle inconnu"
-
-#: lib/models/campaigns.js:924
-msgid "Invalid or missing message ID"
-msgstr "Message ID invalide ou manquant"
-
-#: lib/models/campaigns.js:1065
-msgid "Unrecognized message status"
-msgstr "Message de statut non reconnu"
-
-#: lib/models/confirmations.js:27
-msgid "Could not store confirmation data"
-msgstr "Les confirmation n'a pas pu être enregistrée"
-
-#: lib/models/fields.js:24
-msgid "Drop Down"
-msgstr "Menu déroulant"
-
-#: lib/models/fields.js:25
-msgid "Date (MM/DD/YYY)"
-msgstr "Date (MM/JJ/YYY)"
-
-#: lib/models/fields.js:29
-msgid "JSON value for custom rendering"
-msgstr "Valeur JSON pour un affichage personnalisé"
-
-#: lib/models/fields.js:30
-msgid "Option"
-msgstr "Option"
-
-#: lib/models/fields.js:53 lib/models/fields.js:98 lib/models/fields.js:123
-#: lib/models/forms.js:46 lib/models/lists.js:115 lib/models/lists.js:150
-#: lib/models/lists.js:265 lib/models/segments.js:43 lib/models/segments.js:176
-#: lib/models/subscriptions.js:79 lib/models/subscriptions.js:390
-#: lib/models/subscriptions.js:566 lib/models/subscriptions.js:657
-#: lib/models/subscriptions.js:710 lib/models/subscriptions.js:773
-#: lib/models/subscriptions.js:816
-msgid "Missing List ID"
-msgstr "Identifiant de liste manquant"
-
-#: lib/models/fields.js:129
-msgid "Option field requires a group to be selected"
-msgstr "Les champs Option nécessitent le choix d'un groupe"
-
-#: lib/models/fields.js:149 lib/models/fields.js:199
-msgid "Missing Field ID"
-msgstr "Identifiant de champ manquant"
-
-#: lib/models/fields.js:153 lib/models/segments.js:185
-#: lib/models/segments.js:225
-msgid "Field Name must be set"
-msgstr "Le nom du champ est obligatoire"
-
-#: lib/models/fields.js:216
-msgid "Custom field not found"
-msgstr "Champ personnalisé introuvable"
-
-#: lib/models/fields.js:289
-msgid "Unknown column type %s"
-msgstr "Type de colonne \"%s\" inconnu"
-
-#: lib/models/fields.js:293
-msgid "Missing column name"
-msgstr "Nom de colonne manquant"
-
-#: lib/models/fields.js:297
-msgid "Missing list ID"
-msgstr "Identifiant de liste manquant"
-
-#: lib/models/fields.js:305
-msgid "Provided List ID not found"
-msgstr "Identifiant de la liste inconnu"
-
-#: lib/models/forms.js:70 lib/models/forms.js:113 lib/models/forms.js:201
-#: lib/models/forms.js:291
-msgid "Missing Form ID"
-msgstr "Identifiant de fomulaire manquant"
-
-#: lib/models/forms.js:121 lib/models/forms.js:205
-msgid "Form Name must be set"
-msgstr "Le nom du formulaire est obligatoire"
-
-#: lib/models/forms.js:307
-msgid "Custom form not found"
-msgstr "Formulaire personnalisé introuvable"
-
-#: lib/models/links.js:337 routes/campaigns.js:534 routes/campaigns.js:582
-#: routes/campaigns.js:622 routes/campaigns.js:672 services/sender.js:305
-msgid "Campaign not found"
-msgstr "Campagne introuvable"
-
-#: lib/models/links.js:345 routes/lists.js:181 services/sender.js:312
-msgid "List not found"
-msgstr "Liste non trouvée"
-
-#: lib/models/links.js:353
-msgid "Subscription not found"
-msgstr "Abonnement non trouvé"
-
-#: lib/models/lists.js:167 lib/models/lists.js:211
-msgid "List Name must be set"
-msgstr "Le nom de la liste est obligatoire"
-
-#: lib/models/lists.js:294
-msgid "Missing List CID"
-msgstr "Identifiant CID de liste manquant"
-
-#: lib/models/report-templates.js:26 lib/models/report-templates.js:70
-#: lib/models/report-templates.js:142
-msgid "Missing report template ID"
-msgstr "Identifiant de modèle de rapport manquant"
-
-#: lib/models/report-templates.js:77
-msgid "Report template name must be set"
-msgstr "Le nom du modèle de rapport est obligatoire"
-
-#: lib/models/reports.js:40 lib/models/reports.js:110 lib/models/reports.js:188
-msgid "Missing report ID"
-msgstr "Identifiant de rapport manquant"
-
-#: lib/models/reports.js:116
-msgid "Report name must be set"
-msgstr "Nom de rapport obligatoire"
-
-#: lib/models/segments.js:15
-msgid "Signup country"
-msgstr "Pays d'inscription"
-
-#: lib/models/segments.js:19 lib/models/triggers.js:14
-msgid "Sign up date"
-msgstr "Date d'inscription"
-
-#: lib/models/segments.js:23 lib/models/triggers.js:18
-msgid "Latest open"
-msgstr "Dernière ouverture"
-
-#: lib/models/segments.js:27 lib/models/triggers.js:22
-msgid "Latest click"
-msgstr "Dernier clic"
-
-#: lib/models/segments.js:69 lib/models/segments.js:216
-#: lib/models/segments.js:256 lib/models/segments.js:278
-msgid "Missing Segment ID"
-msgstr "Identifiant de segment manquant"
-
-#: lib/models/segments.js:85 lib/models/segments.js:551
-#: lib/models/segments.js:661
-msgid "Segment not found"
-msgstr "Segment introuvable"
-
-#: lib/models/segments.js:146 lib/models/segments.js:147
-#: lib/models/segments.js:409 lib/models/segments.js:410
-msgid "%s days after today"
-msgstr "%s jours à partir d'aujourd'hui"
-
-#: lib/models/segments.js:146 lib/models/segments.js:147
-#: lib/models/segments.js:409 lib/models/segments.js:410
-msgid "%s days before today"
-msgstr "%s days avant aujourd'hui"
-
-#: lib/models/segments.js:148 lib/models/segments.js:411
-msgid "today"
-msgstr "aujourd'hui"
-
-#: lib/models/segments.js:189 lib/models/segments.js:229
-msgid "Invalid segment rule type"
-msgstr "Règle de segmentation invalide"
-
-#: lib/models/segments.js:289 lib/models/segments.js:455 routes/segments.js:266
-#: routes/segments.js:300 routes/segments.js:370 routes/segments.js:381
-msgid "Selected segment not found"
-msgstr "Segment inconnu"
-
-#: lib/models/segments.js:294 lib/models/segments.js:460 routes/segments.js:272
-#: routes/segments.js:306 routes/segments.js:387
-msgid "Invalid rule type"
-msgstr "Type de règle invalide"
-
-#: lib/models/segments.js:359 lib/models/segments.js:435
-#: lib/models/segments.js:526
-msgid "Missing Rule ID"
-msgstr "Identifiant de règle manquant"
-
-#: lib/models/segments.js:375
-msgid "Specified rule not found"
-msgstr "La ègle demandée est introuvable"
-
-#: lib/models/segments.js:386
-msgid "Specified segment not found"
-msgstr "Le segment spécifié est introuvable"
-
-#: lib/models/segments.js:446
-msgid "Selected rule not found"
-msgstr "Règle inconnue"
-
-#: lib/models/subscriptions.js:257 lib/models/subscriptions.js:287
-#: lib/models/subscriptions.js:394
-msgid "Missing Subscription ID"
-msgstr "Identifiant d'abonnement manquant"
-
-#: lib/models/subscriptions.js:315
-msgid "Missing Subscription email address"
-msgstr "Adresse mail d'abonnement manquante"
-
-#: lib/models/subscriptions.js:570 lib/models/subscriptions.js:820
-msgid "Missing subscription ID"
-msgstr "Identifiant d'abonnement manquant"
-
-#: lib/models/subscriptions.js:661 lib/models/subscriptions.js:714
-#: lib/models/subscriptions.js:750
-msgid "Missing Import ID"
-msgstr "Identifiant d'import manquant"
-
-#: lib/models/subscriptions.js:842
-msgid "Unknown subscription ID"
-msgstr "ID d'abonnement inconnu"
-
-#: lib/models/subscriptions.js:847 routes/subscription.js:639
-msgid "Nothing seems to be changed"
-msgstr "Rien ne semble avoir été modifié"
-
-#: lib/models/subscriptions.js:913 routes/subscription.js:473
-#: routes/subscription.js:545 routes/subscription.js:581
-#: routes/subscription.js:697 routes/subscription.js:772
-msgid "Subscription not found in this list"
-msgstr "Abonnement introuvable dans cette liste"
-
-#: lib/models/templates.js:26 lib/models/templates.js:102
-#: lib/models/templates.js:157
-msgid "Missing Template ID"
-msgstr "Identifiant de modèle manquant"
-
-#: lib/models/templates.js:55 lib/models/templates.js:106
-msgid "Template Name must be set"
-msgstr "Le nom du modèle est obligatoire"
-
-#: lib/models/templates.js:147
-msgid "Template does not exist"
-msgstr "Le modèle n'existe pas"
-
-#: lib/models/triggers.js:31
-msgid "Has Opened"
-msgstr "A ouvert"
-
-#: lib/models/triggers.js:34
-msgid "Has Clicked"
-msgstr "A cliqué"
-
-#: lib/models/triggers.js:37
-msgid "Not Opened"
-msgstr "Non ouvert"
-
-#: lib/models/triggers.js:40
-msgid "Not Clicked"
-msgstr "Non cliqué"
-
-#: lib/models/triggers.js:221 lib/models/triggers.js:258
-msgid "Missing or invalid list ID"
-msgstr "Identifiant de liste manquant ou invalide"
-
-#: lib/models/triggers.js:225 lib/models/triggers.js:310
-msgid "Days in the past are not allowed"
-msgstr "Jours dans le passé interdits"
-
-#: lib/models/triggers.js:229 lib/models/triggers.js:250
-#: lib/models/triggers.js:314 lib/models/triggers.js:335
-msgid "Missing or invalid trigger rule"
-msgstr "Règle de déclenchement manquante ou invalide"
-
-#: lib/models/triggers.js:236 lib/models/triggers.js:321
-msgid "Invalid subscription configuration"
-msgstr "Configuration d'abonnement invalide"
-
-#: lib/models/triggers.js:243 lib/models/triggers.js:328
-msgid "Invalid campaign configuration"
-msgstr "Configuration incorrecte de la campagne"
-
-#: lib/models/triggers.js:246 lib/models/triggers.js:331
-msgid "A campaing can not be a target for itself"
-msgstr "Une campagne ne peut pas être envoyée à elle-même"
-
-#: lib/models/triggers.js:279
-msgid "Could not store trigger row"
-msgstr "Le déclencheur n'a pas pu être enregistré"
-
-#: lib/models/triggers.js:296
-msgid "Missing or invalid Trigger ID"
-msgstr "Identifiant de déclencheur manquant ou invalide"
-
-#: lib/models/triggers.js:363
-msgid "Missing Trigger ID"
-msgstr "Identifiant de déclencheur manquant"
-
-#: lib/models/users.js:103
-msgid "Could not store user row"
-msgstr "L'utilisateur n'a pas pu être enregistré"
-
-#: lib/models/users.js:173
-msgid "Email Address must be set"
-msgstr "L'adresse mail est obligatoire"
-
-#: lib/models/users.js:184
-msgid "Failed to check user data"
-msgstr "Échec à la vérification des données utilisateur"
-
-#: lib/models/users.js:195
-msgid ""
-"Can't change email as another user with the same email address already exists"
-msgstr ""
-"Ne peut changer l'adresse mail, car un autre utilisateur avec la même "
-"adresse existe déjà"
-
-#: lib/models/users.js:212
-msgid "Incorrect current password"
-msgstr "Mot de passe actuel incorrect"
-
-#: lib/models/users.js:216
-msgid "New password not set"
-msgstr "Nouveau mot de passe non enregistré"
-
-#: lib/models/users.js:220
-msgid "Passwords do not match"
-msgstr "Les mots de passe ne correspondent pas"
-
-#: lib/models/users.js:258
-msgid "User ID not set"
-msgstr "Identifiant utilisateur non fourni"
-
-#: lib/models/users.js:286
-msgid "Username must be set"
-msgstr "Nom d'utilisateur obligatoire"
-
-#: lib/models/users.js:323
-msgid "Mailer password change request"
-msgstr "Demande de changement de mot de passe"
-
-#: lib/models/users.js:347 lib/models/users.js:367
-msgid "Missing username or reset token"
-msgstr "Token de réinitialisation ou nom d'utilisateur manquant"
-
-#: lib/models/users.js:371
-msgid "Invalid new password"
-msgstr "Nouveau mot de passe invalide"
-
-#: lib/passport.js:50
-msgid "%s logged out"
-msgstr "%s déconnecté"
-
-#: lib/passport.js:65
-msgid "Failed to authenticate user"
-msgstr "Échec à l'authentification de l'utilisateur"
-
-#: lib/passport.js:81
-msgid "Logged in as %s"
-msgstr "Connecté comme %s"
-
-#: lib/passport.js:191
-msgid "Incorrect username or password"
-msgstr "Nom d'utilisateur ou mot de passe incorrect"
-
-#: lib/subscription-mail-helpers.js:28
-msgid "%s: Subscription Confirmed"
-msgstr "%s: Abonnement confirmé"
-
-#: lib/subscription-mail-helpers.js:39
-msgid "%s: Email Address Already Registered"
-msgstr "%s: Adresse mail déjà enregistrée"
-
-#: lib/subscription-mail-helpers.js:49
-msgid "%s: Please Confirm Email Change in Subscription"
-msgstr "%s: Merci de confirmer le changement de mail de l'abonnement"
-
-#: lib/subscription-mail-helpers.js:59
-msgid "%s: Please Confirm Subscription"
-msgstr "%: Merci de confirmer l'abonnement"
-
-#: lib/subscription-mail-helpers.js:69
-msgid "%s: Please Confirm Unsubscription"
-msgstr "%: Merci de confirmer le désabonnement"
-
-#: lib/subscription-mail-helpers.js:76
-msgid "%s: Unsubscription Confirmed"
-msgstr "%s: Désabonnement confirmé"
-
-#: lib/tools.js:154
-msgid "Blocked email address \"%s\""
-msgstr "Adresse mail bloquée \"%s\""
-
-#: lib/tools.js:163
-msgid "Invalid email address \"%s\"."
-msgstr "Adresse mail \"%s\" invalide."
-
-#: lib/tools.js:166
-msgid "MX record not found for domain"
-msgstr "Enregistrement MX introuvable pour le domaine"
-
-#: lib/tools.js:169
-msgid "Address domain not found"
-msgstr "Le nom de domaine de l'adresse est inconnu"
-
-#: lib/tools.js:172
-msgid "Address domain name is required"
-msgstr "Le nom de domaine de l'adresse est requis"
-
-#: routes/archive.js:31 routes/archive.js:43 routes/archive.js:55 app.js:230
-msgid "Not Found"
-msgstr "Non trouvé"
-
-#: routes/archive.js:121 services/sender.js:454
-msgid "Received status code %s from %s"
-msgstr "Le code de statut %s a été reçu de %s"
-
-#: routes/archive.js:153 routes/campaigns.js:895
-msgid "Attachment not found"
-msgstr "Pièce jointe introuvable"
-
-#: routes/blacklist.js:13 routes/campaigns.js:26 routes/editorapi.js:32
-#: routes/fields.js:13 routes/forms.js:16 routes/grapejs.js:15
-#: routes/lists.js:50 routes/mosaico.js:14 routes/report-templates.js:20
-#: routes/reports.js:22 routes/segments.js:13 routes/settings.js:23
-#: routes/templates.js:18 routes/triggers.js:19 routes/users.js:75
-#: routes/users.js:120
-msgid "Need to be logged in to access restricted content"
-msgstr "Vous devez être connecté pour accéder à cet espace"
-
-#: routes/campaigns.js:118
-msgid "Could not create campaign"
-msgstr "La campagne n'a pas pu être créée"
-
-#: routes/campaigns.js:121
-msgid "Campaign “%s” created"
-msgstr "Campagne \"%s\" créée"
-
-#: routes/campaigns.js:210
-msgid "Campaign settings updated"
-msgstr "Les paramètres de la campagne ont été mis à jour"
-
-#: routes/campaigns.js:212
-msgid "Campaign settings not updated"
-msgstr "Les paramètres de la campagne n'ont pas pu être mis à jour"
-
-#: routes/campaigns.js:228 routes/campaigns.js:745
-msgid "Campaign deleted"
-msgstr "Campagne supprimée"
-
-#: routes/campaigns.js:230 routes/campaigns.js:747
-msgid "Could not delete specified campaign"
-msgstr "La campagne n'a pas pu être supprimée"
-
-#: routes/campaigns.js:249
-msgid "Idling"
-msgstr "Inactif"
-
-#: routes/campaigns.js:252
-msgid "Scheduled"
-msgstr "Programmé"
-
-#: routes/campaigns.js:258
-msgid "Paused"
-msgstr "En pause"
-
-#: routes/campaigns.js:260
-msgid "Inactive"
-msgstr "Inactif"
-
-#: routes/campaigns.js:262
-msgid "Active"
-msgstr "Actif"
-
-#: routes/campaigns.js:264
-msgid "Other"
-msgstr "Autre"
-
-#: routes/campaigns.js:422
-msgid "Unknown status selector"
-msgstr "Sélecteur de statut inconnu"
-
-#: routes/campaigns.js:763
-msgid "Scheduled sending"
-msgstr "Envoi programmé"
-
-#: routes/campaigns.js:765
-msgid "Could not schedule sending"
-msgstr "L'envoi n'a pas pu être programmé"
-
-#: routes/campaigns.js:777
-msgid "Sending resumed"
-msgstr "Envoi relancé"
-
-#: routes/campaigns.js:779
-msgid "Could not resume sending"
-msgstr "L'envoi n'a pas pu être relancé"
-
-#: routes/campaigns.js:791
-msgid "Sending reset"
-msgstr "Envoi réinitialisé"
-
-#: routes/campaigns.js:793
-msgid "Could not reset sending"
-msgstr "L'envoi n'a pas pu être réinitialisé"
-
-#: routes/campaigns.js:805 routes/campaigns.js:833
-msgid "Sending paused"
-msgstr "Envoi mis en pause"
-
-#: routes/campaigns.js:807 routes/campaigns.js:835
-msgid "Could not pause sending"
-msgstr "L'envoi n'a pas pu être interrompu"
-
-#: routes/campaigns.js:819
-msgid "Sending activated"
-msgstr "Envoi activé"
-
-#: routes/campaigns.js:821
-msgid "Could not activate sending"
-msgstr "Impossible d'activer l'envoi"
-
-#: routes/campaigns.js:856
-msgid "Attachment uploaded"
-msgstr "Pièce jointe téléchargée"
-
-#: routes/campaigns.js:858
-msgid "Could not store attachment"
-msgstr "La pièce jointe n'a pas pu être enregistrée"
-
-#: routes/campaigns.js:875
-msgid "Attachment deleted"
-msgstr "Pièce jointe supprimée"
-
-#: routes/campaigns.js:877
-msgid "Could not delete attachment"
-msgstr "La pièce jointe n'a pas pu être supprimée"
-
-#: routes/editorapi.js:38
-msgid "Invalid editor name"
-msgstr "Nom d'éditeur invalide"
-
-#: routes/editorapi.js:146
-msgid "Method not supported"
-msgstr "Méthode non supportée"
-
-#: routes/editorapi.js:381
-msgid "Invalid resource type or ID"
-msgstr "Type ou ID de ressource invalide"
-
-#: routes/fields.js:28 routes/fields.js:64 routes/fields.js:118
-#: routes/forms.js:31 routes/forms.js:63 routes/forms.js:94
-#: routes/segments.js:28 routes/segments.js:59 routes/segments.js:102
-#: routes/segments.js:151 routes/segments.js:223 routes/segments.js:255
-#: routes/segments.js:289 routes/segments.js:336 routes/segments.js:359
-msgid "Selected list ID not found"
-msgstr "Identifiant de liste inconnu"
-
-#: routes/fields.js:102
-msgid "Could not create custom field"
-msgstr "Le champ personnalisé n'a pas pu être créé"
-
-#: routes/fields.js:129
-msgid "Selected field not found"
-msgstr "Champ inconnu"
-
-#: routes/fields.js:165
-msgid "Field settings updated"
-msgstr "Les paramètres du champ ont été enregistrés"
-
-#: routes/fields.js:167
-msgid "Field settings not updated"
-msgstr "Les paramètres du champ n'ont pas pu être mis à jour"
-
-#: routes/fields.js:183
-msgid "Custom field deleted"
-msgstr "Champ personnalisé supprimé"
-
-#: routes/fields.js:185
-msgid "Could not delete specified field"
-msgstr "Le champ n'a pas pu être supprimé"
-
-#: routes/forms.js:78
-msgid "Could not create custom form"
-msgstr "Le formulaire n'a pas pu être créé"
-
-#: routes/forms.js:105
-msgid "Selected form not found"
-msgstr "Formulaire inconnu"
-
-#: routes/forms.js:136
-msgid "The plaintext version for this email"
-msgstr "Version texte de ce mail"
-
-#: routes/forms.js:137
-msgid "Custom forms use MJML for formatting"
-msgstr "Les formulaires personnalisés utilisent le formatage MJML"
-
-#: routes/forms.js:138
-msgid "See the MJML documentation here"
-msgstr "Voir ici la documentation MJML"
-
-#: routes/forms.js:146
-msgid "Layout"
-msgstr "Format"
-
-#: routes/forms.js:152
-msgid "Form Input Style"
-msgstr "Style des zones Input de formulaire"
-
-#: routes/forms.js:154
-msgid ""
-"This CSS stylesheet defines the appearance of form input elements and alerts"
-msgstr ""
-"Cette feuille de style CSS définit l'apparence des zones de saisie et des "
-"alertes du formulaire"
-
-#: routes/forms.js:160
-msgid "Web - Subscribe"
-msgstr "Web - Abonnement"
-
-#: routes/forms.js:165
-msgid "Web - Confirm Subscription Notice"
-msgstr "Web - Information de confirmation d'abonnement"
-
-#: routes/forms.js:170
-msgid "Mail - Confirm Subscription (MJML)"
-msgstr "Mail - Confirmation d'abonnement (MJML)"
-
-#: routes/forms.js:175
-msgid "Mail - Confirm Subscription (Text)"
-msgstr "Mail - Confirmation d'abonnement (Texte)"
-
-#: routes/forms.js:180
-msgid "Mail - Already Subscribed (MJML)"
-msgstr "Mail - Déjà abonné (MJML)"
-
-#: routes/forms.js:185
-msgid "Mail - Already Subscribed (Text)"
-msgstr "Mail - Déjà abonné (Texte)"
-
-#: routes/forms.js:190
-msgid "Web - Subscribed Notice"
-msgstr "Web - Information d'abonné"
-
-#: routes/forms.js:195
-msgid "Mail - Subscription Confirmed (MJML)"
-msgstr "Mail - Abonnement confirmé (MJML)"
-
-#: routes/forms.js:200
-msgid "Mail - Subscription Confirmed (Text)"
-msgstr "Mail - Abonnement confirmé (Texte)"
-
-#: routes/forms.js:208
-msgid "Web - Manage Preferences"
-msgstr "Web - Gestion des préférences"
-
-#: routes/forms.js:213
-msgid "Web - Manage Address"
-msgstr "Web - Gestion de l'adresse"
-
-#: routes/forms.js:218
-msgid "Web - Updated Notice"
-msgstr "Web - Information enregistrée"
-
-#: routes/forms.js:226
-msgid "Web - Unsubscribe"
-msgstr "Web - Désabonnement"
-
-#: routes/forms.js:231
-msgid "Web - Confirm Unsubscription Notice"
-msgstr "Web - Information de confirmation de désabonnement"
-
-#: routes/forms.js:236
-msgid "Mail - Confirm Unsubscription (MJML)"
-msgstr "Mail - Confirmation de désabonnement (MJML)"
-
-#: routes/forms.js:241
-msgid "Mail - Confirm Unsubscription (Text)"
-msgstr "Mail - Confirmation de désabonnement (Texte)"
-
-#: routes/forms.js:246
-msgid "Mail - Confirm Address Change (MJML)"
-msgstr "Mail - Confirmation de changement d'adresse (MJML)"
-
-#: routes/forms.js:251
-msgid "Mail - Confirm Address Change (Text)"
-msgstr "Mail - Confirmation de changement d'adresse (Texte)"
-
-#: routes/forms.js:256
-msgid "Web - Unsubscribed Notice"
-msgstr "Web - Information de confirmation de désabonnement"
-
-#: routes/forms.js:261
-msgid "Mail - Unsubscription Confirmed (MJML)"
-msgstr "Mail - Désbonnement confirmé (MJML)"
-
-#: routes/forms.js:266
-msgid "Mail - Unsubscription Confirmed (Text)"
-msgstr "Mail - Désbonnement confirmé (Texte)"
-
-#: routes/forms.js:271
-msgid "Web - Manual Unsubscribe Notice"
-msgstr "Web - Information de désabonnement manuel"
-
-#: routes/forms.js:309
-msgid "Form settings updated"
-msgstr "Les paramètres du formulaire ont été enregistrés"
-
-#: routes/forms.js:311
-msgid "Form settings not updated"
-msgstr "Les paramètres du formulaire n'ont pas pu être modifiés"
-
-#: routes/forms.js:327
-msgid "Custom form deleted"
-msgstr "Formulaire personnalisé supprimé"
-
-#: routes/forms.js:329
-msgid "Could not delete specified form"
-msgstr "Le formulaire n'a pas pu être supprimé"
-
-#: routes/index.js:11
-msgid "Self Hosted Newsletter App"
-msgstr "Solution de Newsletter auto-hébergée"
-
-#: routes/links.js:39
-msgid "Oops, we couldn't find a link for the URL you clicked"
-msgstr "Oups, nous n'avons pas trouvé le lien sur lequel vous avez cliqué"
-
-#: routes/lists.js:82
-msgid "Could not create list"
-msgstr "La liste n'a pas pu être créée"
-
-#: routes/lists.js:85
-msgid "List created"
-msgstr "Liste créée"
-
-#: routes/lists.js:93 routes/lists.js:271 routes/lists.js:336
-#: routes/lists.js:375 routes/lists.js:444 routes/lists.js:469
-#: routes/lists.js:514 routes/lists.js:536 routes/lists.js:565
-#: routes/lists.js:657 routes/lists.js:714 routes/lists.js:741
-msgid "Could not find list with specified ID"
-msgstr "Ne peut trouver la liste avec cet identifiant"
-
-#: routes/lists.js:122
-msgid "List settings updated"
-msgstr "Les paramètres de la liste ont été mis à jour"
-
-#: routes/lists.js:124
-msgid "List settings not updated"
-msgstr "Les paramètres de la liste n'ont pu être enregistrés"
-
-#: routes/lists.js:142
-msgid "List deleted"
-msgstr "Liste supprimée"
-
-#: routes/lists.js:144
-msgid "Could not delete specified list"
-msgstr "La liste n'a pas pu être supprimée"
-
-#: routes/lists.js:206
-msgid "Unknown"
-msgstr "Inconnu"
-
-#: routes/lists.js:206
-msgid "Complained"
-msgstr "Plainte"
-
-#: routes/lists.js:237
-msgid "Invalid key"
-msgstr "Clé invalide"
-
-#: routes/lists.js:239
-msgid "Expired key"
-msgstr "Clé expirée"
-
-#: routes/lists.js:241
-msgid "Revoked key"
-msgstr "Clé révoquée"
-
-#: routes/lists.js:288
-msgid "Force Subscribe"
-msgstr "Forcer l'abonnement"
-
-#: routes/lists.js:291
-msgid "Initializing"
-msgstr "Initialisation"
-
-#: routes/lists.js:294
-msgid "Initialized"
-msgstr "Initialisé"
-
-#: routes/lists.js:297
-msgid "Importing"
-msgstr "Import en cours"
-
-#: routes/lists.js:303
-msgid "Errored"
-msgstr "En erreur"
-
-#: routes/lists.js:381 routes/lists.js:450 routes/lists.js:475
-msgid "Could not find subscriber with specified ID"
-msgstr "Ne peut trouver d'abonné avec cet identifiant"
-
-#: routes/lists.js:427
-msgid "Could not add subscription"
-msgstr "L'abonnement n'a pas pu être ajouté"
-
-#: routes/lists.js:432
-msgid "%s was successfully added to your list"
-msgstr "%s a été ajouté à votre liste"
-
-#: routes/lists.js:434
-msgid "%s was not added to your list"
-msgstr "%s n'a pas été ajouté à votre liste"
-
-#: routes/lists.js:456
-msgid "Could not unsubscribe user"
-msgstr "L'utilisateur n'a pas pu être désabonné"
-
-#: routes/lists.js:459
-msgid "%s was successfully unsubscribed from your list"
-msgstr "%s a été désabonné de votre liste"
-
-#: routes/lists.js:479
-msgid "%s was successfully removed from your list"
-msgstr "%s a été retiré de votre liste"
-
-#: routes/lists.js:491
-msgid "Another subscriber with email address %s already exists"
-msgstr "Un autre abonné avec l'adresse mail %s existe déjà"
-
-#: routes/lists.js:498
-msgid "Subscription settings updated"
-msgstr "Les paramètres de l'abonnement ont été enregitrés"
-
-#: routes/lists.js:500
-msgid "Subscription settings not updated"
-msgstr "Les paramètres de l'abonnement n'ont pas pu être mis à jour"
-
-#: routes/lists.js:542 routes/lists.js:663 routes/lists.js:699
-#: routes/lists.js:727 routes/lists.js:747
-msgid "Could not find import data with specified ID"
-msgstr "Ne peut trouver l'import de données avec cet identifiant"
-
-#: routes/lists.js:573
-msgid "Could not process CSV"
-msgstr "Le CSV n'a pas pu être traité"
-
-#: routes/lists.js:589
-msgid "Could not create importer"
-msgstr "L'import n'a pas pu être créé"
-
-#: routes/lists.js:643
-msgid "Empty file"
-msgstr "Fichier vide"
-
-#: routes/lists.js:646
-msgid "Too few rows"
-msgstr "Trop peu de lignes"
-
-#: routes/lists.js:703
-msgid "Import started"
-msgstr "Import démarré"
-
-#: routes/lists.js:731
-msgid "Import restarted"
-msgstr "Import relancé"
-
-#: routes/lists.js:797
-msgid "One-step (i.e. no email with confirmation link)"
-msgstr "En une étape (pas d'envoi de mail avec lien de confirmation)"
-
-#: routes/lists.js:803
-msgid ""
-"One-step with unsubscription form (i.e. no email with confirmation link)"
-msgstr ""
-"En une étape avec formulaire de désabonnement (pas d'envoi de mail avec lien "
-"de confirmation)"
-
-#: routes/lists.js:809
-msgid "Two-step (i.e. an email with confirmation link will be sent)"
-msgstr "En deux étapes (envoi d'un mail avec avec lien de confirmation)"
-
-#: routes/lists.js:815
-msgid ""
-"Two-step with unsubscription form (i.e. an email with confirmation link will "
-"be sent)"
-msgstr ""
-"En deux étapes avec formulaire de désabonnement (envoi d'un mail avec avec "
-"lien de confirmation)"
-
-#: routes/lists.js:821
-msgid ""
-"Manual (i.e. unsubscription has to be performed by the list administrator)"
-msgstr ""
-"Manuel (le désabonnement doit être fait par l'administrateur de la liste)"
-
-#: routes/report-templates.js:246
-msgid "Could not create report template"
-msgstr "Le modèle de rapport n'a pas pu être créé"
-
-#: routes/report-templates.js:249
-msgid "Report template “%s” created"
-msgstr "Modèle de rapport \"%s\" créé"
-
-#: routes/report-templates.js:257
-msgid "Could not find report template with specified ID"
-msgstr "Ne peut trouver le modèle de rapport avec cet identifiant"
-
-#: routes/report-templates.js:280
-msgid "Report template updated"
-msgstr "Modèle de rapport enregistré"
-
-#: routes/report-templates.js:282
-msgid "Report template not updated"
-msgstr "Le modèle de rapport n'a pas pu être enregistré"
-
-#: routes/report-templates.js:298
-msgid "Report template deleted"
-msgstr "Modèle de rapport supprimé"
-
-#: routes/report-templates.js:300
-msgid "Could not delete specified report template"
-msgstr "Le modèle de rapport n'a pas pu être supprimé"
-
-#: routes/reports.js:124 routes/reports.js:130
-msgid "Could not create report"
-msgstr "Le rapport n'a pas pu être créé"
-
-#: routes/reports.js:135
-msgid "Report “%s” created"
-msgstr "Rapport \"%s\" créé"
-
-#: routes/reports.js:146 routes/reports.js:224 routes/reports.js:239
-#: routes/reports.js:265 routes/reports.js:275
-msgid "Could not find report with specified ID"
-msgstr "Ne peut trouver le rapport avec cet identifiant"
-
-#: routes/reports.js:188 routes/reports.js:194
-msgid "Could not update report"
-msgstr "Le rapport n'a pas pu être mis à jour"
-
-#: routes/reports.js:197
-msgid "Report updated"
-msgstr "Rapport enregistré"
-
-#: routes/reports.js:199
-msgid "Report not updated"
-msgstr "Le rapport n'a pas pu être enregistré"
-
-#: routes/reports.js:212
-msgid "Report deleted"
-msgstr "Rapport supprimé"
-
-#: routes/reports.js:214
-msgid "Could not delete specified report"
-msgstr "Le rapport n'a pas pu être supprimé"
-
-#: routes/reports.js:230
-msgid "Could not find report template"
-msgstr "Le modèle de rapport associé n'a pas pu être trouvé"
-
-#: routes/reports.js:260
-msgid "Unknown type of template"
-msgstr "Type de modèle inconnu"
-
-#: routes/segments.js:86
-msgid "Could not create segment"
-msgstr "Le segment n'a pas pu être créé"
-
-#: routes/segments.js:89
-msgid "Segment created"
-msgstr "Segment créé"
-
-#: routes/segments.js:113
-msgid "Selected segment ID not found"
-msgstr "Identifiant de segment inconnu"
-
-#: routes/segments.js:188
-msgid "Segment settings updated"
-msgstr "Configuration du segment enregistrée"
-
-#: routes/segments.js:190
-msgid "Segment settings not updated"
-msgstr "Configuration du segment non enregistrée"
-
-#: routes/segments.js:206
-msgid "Segment deleted"
-msgstr "Segment supprimé"
-
-#: routes/segments.js:208
-msgid "Could not delete specified segment"
-msgstr "Le segment n'a pas pu être supprimé"
-
-#: routes/segments.js:342
-msgid "Could not create rule"
-msgstr "La règle n'a pas pu être créée"
-
-#: routes/segments.js:345
-msgid "Rule created"
-msgstr "Règle créée"
-
-#: routes/segments.js:410
-msgid "Rule settings updated"
-msgstr "Paramètres de la règle enregistrés"
-
-#: routes/segments.js:412
-msgid "Rule settings not updated"
-msgstr "Paramètres de la règle non mis à jour"
-
-#: routes/segments.js:428
-msgid "Rule deleted"
-msgstr "Règle supprimée"
-
-#: routes/segments.js:430
-msgid "Could not delete specified rule"
-msgstr "La règle n'a pas pu être supprimée"
-
-#: routes/settings.js:39
-msgid "Use TLS"
-msgstr "Utiliser TLS"
-
-#: routes/settings.js:40
-msgid "usually selected for port 465"
-msgstr "Utilisé habituellement pour le port 465"
-
-#: routes/settings.js:44
-msgid "Use STARTTLS"
-msgstr "Utiliser STARTTLS"
-
-#: routes/settings.js:45
-msgid "usually selected for port 587 and 25"
-msgstr "Utilisé habituellement pour les ports 587 et 25"
-
-#: routes/settings.js:49
-msgid "Do not use encryption"
-msgstr "Ne pas utiliser le chiffrement"
-
-#: routes/settings.js:115
-msgid "Settings updated"
-msgstr "Configuration mise à jour"
-
-#: routes/settings.js:173
-msgid "Invalid mail transport type"
-msgstr "Type de transport mail invalide"
-
-#: routes/settings.js:184
-msgid "Invalid Access Key"
-msgstr "Clé d'accès invalide"
-
-#: routes/settings.js:187
-msgid "Invalid AWS credentials"
-msgstr "Credentials AWS invalides"
-
-#: routes/settings.js:190
-msgid "Connection refused, check hostname and port."
-msgstr "Connexion refusée, vérifiez l'adresse du serveur et le port."
-
-#: routes/settings.js:195
-msgid ""
-"Did not receive greeting message from server. This might happen when "
-"connecting to a TLS port without using TLS."
-msgstr ""
-"N'a pas reçu le message de présentation du serveur. Cela peut survenir lors "
-"d'une connexion à port TLS sans utiliser TLS"
-
-#: routes/settings.js:197
-msgid "Did not receive greeting message from server."
-msgstr "N'a pas reçu le message de présentation du serveur."
-
-#: routes/settings.js:200
-msgid ""
-"Connection timed out. Check your firewall settings, destination port is "
-"probably blocked."
-msgstr ""
-"Connexion expirée. Vérifiez vos règles de firewall, le port de destination "
-"est certainement bloqué."
-
-#: routes/settings.js:205
-msgid "Authentication not accepted, server expects STARTTLS to be used."
-msgstr ""
-"La tentative d'authentification est rejetée. Le serveur impose l'utilisation "
-"de STARTTLS."
-
-#: routes/settings.js:207
-msgid "Authentication failed, check username and password."
-msgstr ""
-"Échec de l'authentification, vérifiez le nom d'utilisateur et le mot de "
-"passe."
-
-#: routes/settings.js:217
-msgid "Failed Mailer verification."
-msgstr "Echec à la vérification du serveur mail."
-
-#: routes/settings.js:217
-msgid "Server responded with: \"%s\""
-msgstr "Le serveur a répondu : \"%s\""
-
-#: routes/settings.js:221
-msgid "Mailer settings verified, ready to send some mail!"
-msgstr "Paramètres mailer vérifiés, prêt à envoyer du mail !"
-
-#: routes/subscription.js:33
-msgid "Not allowed by CORS"
-msgstr "Interdit par CORS"
-
-#: routes/subscription.js:61 routes/subscription.js:176
-#: routes/subscription.js:286 routes/subscription.js:382
-#: routes/subscription.js:459 routes/subscription.js:535
-#: routes/subscription.js:566 routes/subscription.js:626
-#: routes/subscription.js:682 routes/subscription.js:760
-#: routes/subscription.js:897
-msgid "Selected list not found"
-msgstr "Liste inconnue"
-
-#: routes/subscription.js:93
-msgid "Could not save subscription"
-msgstr "L'abonnement n'a pas pu être enregistré"
-
-#: routes/subscription.js:118
-msgid "Subscriber info corrupted or missing"
-msgstr "Information sur l'abonné manquante ou corrompue"
-
-#: routes/subscription.js:136
-msgid "Email address changed"
-msgstr "Adresse mail changée"
-
-#: routes/subscription.js:179 routes/subscription.js:385
-msgid "The list does not allow public subscriptions."
-msgstr "La liste ne permet pas les abonnements libres."
-
-#: routes/subscription.js:355 routes/subscription.js:357
-msgid "Email address not set"
-msgstr "L'adresse mail n'est pas précisée"
-
-#: routes/subscription.js:653
-msgid ""
-"An email with further instructions has been sent to the provided address"
-msgstr "Un mail avec des instructions a été envoyé à l'adresse fournie"
-
-#: routes/subscription.js:861 routes/subscription.js:877
-msgid "Public key is not set"
-msgstr "La clé publique n'est pas renseignée"
-
-#: routes/templates.js:84
-msgid "Could not create template"
-msgstr "Le modèle n'a pas pu être créé"
-
-#: routes/templates.js:87
-msgid "Template created"
-msgstr "Modèle créé"
-
-#: routes/templates.js:126
-msgid "Template settings updated"
-msgstr "Paramètres du modèle enregistrés"
-
-#: routes/templates.js:128
-msgid "Template settings not updated"
-msgstr "Les paramètres du modèle n'ont pas pu être mis à jour"
-
-#: routes/templates.js:144
-msgid "Template duplicated"
-msgstr "Modèle dupliqué"
-
-#: routes/templates.js:146
-msgid "Could not duplicate specified template"
-msgstr "Le modèle n'a pas pu être dupliqué"
-
-#: routes/templates.js:157
-msgid "Template deleted"
-msgstr "Modèle supprimé"
-
-#: routes/templates.js:159
-msgid "Could not delete specified template"
-msgstr "Le modèle n'a pas pu être supprimé"
-
-#: routes/triggers.js:64 routes/triggers.js:88 routes/triggers.js:180
-msgid "Could not find selected list"
-msgstr "La liste sélectionnée n'a pas pu être trouvée"
-
-#: routes/triggers.js:94 routes/triggers.js:100 routes/triggers.js:186
-msgid "Error while finding selected segment"
-msgstr "Erreur à la recherche du segment sélectionné"
-
-#: routes/triggers.js:157
-msgid "Could not create trigger"
-msgstr "Le déclencheur n'a pas pu être créé"
-
-#: routes/triggers.js:164
-msgid "Trigger “%s” created"
-msgstr "Déclencheur \"%s\" créé"
-
-#: routes/triggers.js:197
-msgid "Error while finding selected segment subscribers"
-msgstr "Erreur lors de la recherche des abonnés du segment"
-
-#: routes/triggers.js:262
-msgid "Trigger settings updated"
-msgstr "Paramètres du déclencheur enregistrés"
-
-#: routes/triggers.js:264
-msgid "Trigger settings not updated"
-msgstr "Les paramètres du déclencheur n'ont pas pu être enregistrés"
-
-#: routes/triggers.js:276
-msgid "Trigger deleted"
-msgstr "Déclencheur supprimé"
-
-#: routes/triggers.js:278
-msgid "Could not delete specified trigger"
-msgstr "Le déclencheur n'a pas pu être supprimé"
-
-#: routes/triggers.js:290
-msgid "Could not find trigger with specified ID"
-msgstr "Ne peut trouver de déclencheur avec cet identifiant"
-
-#: routes/triggers.js:303
-msgid "Trigger not found"
-msgstr "Déclencheur inconnu"
-
-#: routes/users.js:32
-msgid ""
-"An email with password reset instructions has been sent to your email "
-"address, if it exists on our system."
-msgstr ""
-"Un mail avec les instructions de réinitialisation du mot de passe à été "
-"envoyée à votre adresse, si elle est enregistrée dans notre système."
-
-#: routes/users.js:46 routes/users.js:64
-msgid "Unknown or expired reset token"
-msgstr "Token de réinitialisation inconnu ou expiré"
-
-#: routes/users.js:66
-msgid "Your password has been changed successfully"
-msgstr "Votre mot de passe a bien été changé"
-
-#: routes/users.js:87
-msgid "User data not found"
-msgstr "Données utilisateurs non trouvées"
-
-#: routes/users.js:110
-msgid "Access token updated"
-msgstr "Le jeton d'accès a été mis à jour"
-
-#: routes/users.js:112
-msgid "Access token not updated"
-msgstr "Le jeton d'accès n'a pas été mis à jour"
-
-#: routes/users.js:139
-msgid "Account information updated"
-msgstr "Les informations sur le compte ont été mises à jour"
-
-#: routes/users.js:141
-msgid "Account information not updated"
-msgstr "Les informations sur le compte n'ont pas été mises à jour"
-
-#: services/feedcheck.js:51
-msgid "Feed error: %s"
-msgstr "Erreur du flux : %s"
-
-#: services/feedcheck.js:54
-msgid "Found %s new campaign messages from feed"
-msgstr "%s nouveau(x) message(s) ont été trouvés dans le flux RSS"
-
-#: services/feedcheck.js:56
-msgid "Found nothing new from the feed"
-msgstr "Aucun nouvel élément dans le flux RSS"
-
-#: services/feedcheck.js:146
-msgid "RSS entry %s"
-msgstr "Entrée RSS %s"
-
-#: services/importer.js:249
-msgid "Could not access import file"
-msgstr "Ne peut ouvrir le fichier d'import"
-
-#: services/triggers.js:51
-msgid "Unknown trigger type %s"
-msgstr "Type de déclencheur %s inconnu"
diff --git a/languages/hu_HU.mo b/languages/hu_HU.mo
deleted file mode 100644
index 524af8aa..00000000
Binary files a/languages/hu_HU.mo and /dev/null differ
diff --git a/languages/hu_HU.po b/languages/hu_HU.po
deleted file mode 100644
index 8d42cfe9..00000000
--- a/languages/hu_HU.po
+++ /dev/null
@@ -1,4521 +0,0 @@
-msgid ""
-msgstr ""
-"Project-Id-Version: \n"
-"Language-Team: \n"
-"Report-Msgid-Bugs-To: \n"
-"PO-Revision-Date: 2018-09-10 16:02+0200\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"POT-Creation-Date: 2018-07-29 01:47+0200\n"
-"X-Generator: Poedit 1.8.7.1\n"
-"Last-Translator: \n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"Language: hu_HU\n"
-
-#: views/archive/layout.hbs:1 views/layout.hbs:1
-msgid "Self hosted email newsletter app"
-msgstr "Saját üzemeltetésű hírlevél-program"
-
-#: views/blacklist.hbs:1 views/campaigns/blacklisted.hbs:1
-#: views/campaigns/bounced.hbs:1 views/campaigns/campaigns.hbs:1
-#: views/campaigns/clicked.hbs:1 views/campaigns/complained.hbs:1
-#: views/campaigns/create-rss.hbs:1 views/campaigns/create-triggered.hbs:1
-#: views/campaigns/create.hbs:1 views/campaigns/delivered.hbs:1
-#: views/campaigns/edit-rss.hbs:1 views/campaigns/edit-triggered.hbs:1
-#: views/campaigns/edit.hbs:1 views/campaigns/opened.hbs:1
-#: views/campaigns/unsubscribed.hbs:1 views/campaigns/upload-attachment.hbs:1
-#: views/campaigns/view.hbs:1 views/lists/create.hbs:1 views/lists/edit.hbs:1
-#: views/lists/fields/create.hbs:1 views/lists/fields/edit.hbs:1
-#: views/lists/fields/fields.hbs:1 views/lists/forms/create.hbs:1
-#: views/lists/forms/edit.hbs:1 views/lists/forms/forms.hbs:1
-#: views/lists/lists.hbs:1 views/lists/segments/create.hbs:1
-#: views/lists/segments/edit.hbs:1 views/lists/segments/rule-configure.hbs:1
-#: views/lists/segments/rule-create.hbs:1 views/lists/segments/rule-edit.hbs:1
-#: views/lists/segments/segments.hbs:1 views/lists/segments/view.hbs:1
-#: views/lists/subscription/add.hbs:1 views/lists/subscription/edit.hbs:1
-#: views/lists/subscription/import-failed.hbs:1
-#: views/lists/subscription/import-preview.hbs:1
-#: views/lists/subscription/import.hbs:1 views/lists/view.hbs:1
-#: views/report-templates/create.hbs:1 views/report-templates/edit.hbs:1
-#: views/report-templates/report-templates.hbs:1
-#: views/reports/create-select-template.hbs:1 views/reports/create.hbs:1
-#: views/reports/edit.hbs:1 views/reports/output.hbs:1
-#: views/reports/reports.hbs:1 views/reports/view.hbs:1 views/settings.hbs:1
-#: views/templates/create.hbs:1 views/templates/edit.hbs:1
-#: views/templates/templates.hbs:1 views/triggers/create-select.hbs:1
-#: views/triggers/create.hbs:1 views/triggers/edit.hbs:1
-#: views/triggers/triggered.hbs:1 views/triggers/triggers.hbs:1
-#: views/users/account.hbs:1 views/users/api.hbs:1 views/users/forgot.hbs:1
-#: views/users/login.hbs:1 views/users/reset.hbs:1 app.js:169
-msgid "Home"
-msgstr "Nyitólap"
-
-#: views/blacklist.hbs:2 views/blacklist.hbs:3 views/layout.hbs:7
-#: views/lists/subscription/edit.hbs:15
-msgid "Blacklist"
-msgstr "Feketelista"
-
-#: views/blacklist.hbs:4 views/users/api.hbs:76
-msgid "Add email to blacklist"
-msgstr "Email feketelistázása"
-
-#: views/blacklist.hbs:5
-msgid "Add"
-msgstr "Hozzáadás"
-
-#: views/blacklist.hbs:6
-msgid "Email"
-msgstr "Email"
-
-#: views/campaigns/blacklisted.hbs:2 views/campaigns/bounced.hbs:2
-#: views/campaigns/campaigns.hbs:2 views/campaigns/campaigns.hbs:7
-#: views/campaigns/clicked.hbs:2 views/campaigns/complained.hbs:2
-#: views/campaigns/create-rss.hbs:2 views/campaigns/create-triggered.hbs:2
-#: views/campaigns/create.hbs:2 views/campaigns/delivered.hbs:2
-#: views/campaigns/edit-rss.hbs:2 views/campaigns/edit-triggered.hbs:2
-#: views/campaigns/edit.hbs:2 views/campaigns/opened.hbs:2
-#: views/campaigns/unsubscribed.hbs:2 views/campaigns/upload-attachment.hbs:2
-#: views/campaigns/view.hbs:2 lib/tools.js:133 routes/campaigns.js:35
-msgid "Campaigns"
-msgstr "Kampányok"
-
-#: views/campaigns/blacklisted.hbs:3 views/campaigns/blacklisted.hbs:4
-msgid "Blacklisted info"
-msgstr "Feketelista info"
-
-#: views/campaigns/blacklisted.hbs:5 views/campaigns/bounced.hbs:5
-#: views/campaigns/clicked.hbs:5 views/campaigns/complained.hbs:5
-#: views/campaigns/delivered.hbs:5 views/campaigns/edit-rss.hbs:5
-#: views/campaigns/edit-triggered.hbs:5 views/campaigns/edit.hbs:5
-#: views/campaigns/opened.hbs:5 views/campaigns/unsubscribed.hbs:5
-#: views/campaigns/upload-attachment.hbs:6
-msgid "View campaign"
-msgstr "Kampány megtekintése"
-
-#: views/campaigns/blacklisted.hbs:6
-msgid "Subscribers who blacklisted by global blacklist:"
-msgstr "Feliratkozók, akik szerepelnek a globális feketelistán"
-
-#: views/campaigns/blacklisted.hbs:7 views/campaigns/bounced.hbs:7
-#: views/campaigns/clicked.hbs:15 views/campaigns/complained.hbs:7
-#: views/campaigns/delivered.hbs:7 views/campaigns/opened.hbs:9
-#: views/campaigns/unsubscribed.hbs:7
-#: views/lists/subscription/import-failed.hbs:8 views/lists/view.hbs:19
-#: views/triggers/triggered.hbs:6
-msgid "Address"
-msgstr "Cím"
-
-#: views/campaigns/blacklisted.hbs:8 views/campaigns/bounced.hbs:8
-#: views/campaigns/clicked.hbs:16 views/campaigns/complained.hbs:8
-#: views/campaigns/delivered.hbs:8 views/campaigns/opened.hbs:10
-#: views/campaigns/unsubscribed.hbs:8 views/lists/subscription/add.hbs:6
-#: views/lists/subscription/edit.hbs:7
-#: views/lists/subscription/import-preview.hbs:7 views/lists/view.hbs:20
-#: views/subscription/partials/subscription-custom-fields.hbs:3
-#: views/triggers/triggered.hbs:7
-msgid "First Name"
-msgstr "Keresztnév"
-
-#: views/campaigns/blacklisted.hbs:9 views/campaigns/bounced.hbs:9
-#: views/campaigns/clicked.hbs:17 views/campaigns/complained.hbs:9
-#: views/campaigns/delivered.hbs:9 views/campaigns/opened.hbs:11
-#: views/campaigns/unsubscribed.hbs:9 views/lists/subscription/add.hbs:7
-#: views/lists/subscription/edit.hbs:8
-#: views/lists/subscription/import-preview.hbs:8 views/lists/view.hbs:21
-#: views/subscription/partials/subscription-custom-fields.hbs:4
-#: views/triggers/triggered.hbs:8
-msgid "Last Name"
-msgstr "Vezetéknév"
-
-#: views/campaigns/blacklisted.hbs:10
-msgid "Reason"
-msgstr "Ok"
-
-#: views/campaigns/blacklisted.hbs:11
-msgid "Time"
-msgstr "Időpont"
-
-#: views/campaigns/bounced.hbs:3 views/campaigns/bounced.hbs:4
-msgid "Bounced info"
-msgstr "Visszapattanás info"
-
-#: views/campaigns/bounced.hbs:6
-msgid "Subscribers who bounced and were unsubscribed:"
-msgstr "Feliratkozók, akik visszapattanás miatt le lettek íratva:"
-
-#: views/campaigns/bounced.hbs:10 views/campaigns/complained.hbs:10
-#: views/campaigns/delivered.hbs:10 views/campaigns/unsubscribed.hbs:10
-msgid "SMTP response"
-msgstr "SMTP válasz"
-
-#: views/campaigns/bounced.hbs:11
-msgid "Bounce time"
-msgstr "Visszapattanás ideje"
-
-#: views/campaigns/campaigns.hbs:3 views/campaigns/create-triggered.hbs:26
-#: views/campaigns/create.hbs:3 views/campaigns/create.hbs:4
-#: views/campaigns/create.hbs:28
-msgid "Create Campaign"
-msgstr "Kampány létrehozása"
-
-#: views/campaigns/campaigns.hbs:4
-msgid "Regular Campaign"
-msgstr "Sima kampány"
-
-#: views/campaigns/campaigns.hbs:5
-msgid "RSS Campaign"
-msgstr "RSS kampány"
-
-#: views/campaigns/campaigns.hbs:6
-msgid "Triggered Campaign"
-msgstr ""
-
-#: views/campaigns/campaigns.hbs:8 views/campaigns/create-rss.hbs:6
-#: views/campaigns/create-triggered.hbs:5 views/campaigns/create.hbs:5
-#: views/campaigns/edit-rss.hbs:8 views/campaigns/edit-triggered.hbs:9
-#: views/campaigns/edit.hbs:10 views/campaigns/view.hbs:73
-#: views/lists/create.hbs:5 views/lists/edit.hbs:6
-#: views/lists/fields/fields.hbs:6 views/lists/forms/forms.hbs:6
-#: views/lists/lists.hbs:5 views/lists/segments/segments.hbs:6
-#: views/report-templates/partials/report-template-fields.hbs:1
-#: views/report-templates/report-templates.hbs:10
-#: views/reports/partials/report-fields.hbs:1
-#: views/reports/partials/report-fields.hbs:5
-#: views/reports/partials/report-fields.hbs:9 views/reports/reports.hbs:6
-#: views/templates/templates.hbs:5 views/triggers/triggers.hbs:5
-msgid "Name"
-msgstr "Név"
-
-#: views/campaigns/campaigns.hbs:9 views/campaigns/create-rss.hbs:8
-#: views/campaigns/create-triggered.hbs:7 views/campaigns/create.hbs:7
-#: views/campaigns/edit-rss.hbs:10 views/campaigns/edit-triggered.hbs:11
-#: views/campaigns/edit.hbs:12 views/campaigns/view.hbs:74
-#: views/lists/create.hbs:7 views/lists/edit.hbs:10
-#: views/lists/forms/edit.hbs:9 views/lists/forms/forms.hbs:7
-#: views/lists/lists.hbs:8 views/mosaico/editor.hbs:3
-#: views/partials/merge-tag-reference.hbs:4
-#: views/report-templates/partials/report-template-fields.hbs:3
-#: views/report-templates/report-templates.hbs:11
-#: views/reports/partials/report-fields.hbs:3
-#: views/reports/partials/report-fields.hbs:6 views/reports/reports.hbs:8
-#: views/templates/create.hbs:9 views/templates/edit.hbs:8
-#: views/templates/templates.hbs:6 views/triggers/create.hbs:7
-#: views/triggers/edit.hbs:8 views/triggers/triggers.hbs:7
-msgid "Description"
-msgstr "Leírás"
-
-#: views/campaigns/campaigns.hbs:10 views/campaigns/view.hbs:75
-#: views/lists/view.hbs:22 views/lists/view.hbs:30
-#: views/triggers/triggers.hbs:6
-msgid "Status"
-msgstr "Státusz"
-
-#: views/campaigns/campaigns.hbs:11 views/campaigns/view.hbs:76
-#: views/lists/view.hbs:23 views/lists/view.hbs:24
-#: views/report-templates/report-templates.hbs:12
-#: views/reports/partials/report-fields.hbs:7 views/reports/reports.hbs:9
-msgid "Created"
-msgstr "Létrehozva"
-
-#: views/campaigns/clicked.hbs:3 views/campaigns/clicked.hbs:4
-msgid "Link info"
-msgstr "Link információ"
-
-#: views/campaigns/clicked.hbs:6 views/campaigns/view.hbs:63
-msgid "URL"
-msgstr "URL"
-
-#: views/campaigns/clicked.hbs:7 views/campaigns/view.hbs:64
-msgid "Clicks"
-msgstr "Kattintások"
-
-#: views/campaigns/clicked.hbs:8 views/campaigns/view.hbs:65
-msgid "% of clicks"
-msgstr "%-a a kattintásoknak"
-
-#: views/campaigns/clicked.hbs:9 views/campaigns/view.hbs:66
-msgid "% of messages"
-msgstr "%-a az üzeneteknek"
-
-#: views/campaigns/clicked.hbs:10 views/campaigns/view.hbs:69
-msgid "Aggregated clicks"
-msgstr "Összesített kattintások"
-
-#: views/campaigns/clicked.hbs:11
-msgid "Subscribers who clicked on a link:"
-msgstr "Feliratkozók, akik rákattintottak egy linkre:"
-
-#: views/campaigns/clicked.hbs:12
-msgid "Subscribers who clicked on this link:"
-msgstr "Feliratkozók, akik rákattintottak erre a linkre:"
-
-#: views/campaigns/clicked.hbs:13 views/campaigns/opened.hbs:7
-msgid "Stats by country"
-msgstr "Országok szerinti statisztika"
-
-#: views/campaigns/clicked.hbs:14 views/campaigns/opened.hbs:8
-msgid "Stats by device type"
-msgstr "Eszköz szerinti statisztika"
-
-#: views/campaigns/clicked.hbs:18
-msgid "First click time"
-msgstr ""
-
-#: views/campaigns/clicked.hbs:19
-msgid "Click count"
-msgstr "Kattintások száma"
-
-#: views/campaigns/complained.hbs:3 views/campaigns/complained.hbs:4
-msgid "Complained info"
-msgstr "Reklamálások info"
-
-#: views/campaigns/complained.hbs:6
-msgid "Subscribers who complained and were unsubscribed:"
-msgstr "Felhasználók, akik reklamáltak, ezért le lettek íratva"
-
-#: views/campaigns/complained.hbs:11
-msgid "Complain time"
-msgstr "Reklamálás ideje"
-
-#: views/campaigns/create-rss.hbs:3 views/campaigns/create-rss.hbs:4
-#: views/campaigns/create-rss.hbs:21
-msgid "Create RSS Campaign"
-msgstr "RSS kampány létrehozása"
-
-#: views/campaigns/create-rss.hbs:5 views/campaigns/edit-rss.hbs:6
-msgid ""
-"RSS campaign sets up a tracker against selected RSS feed address. Whenever a "
-"new entry is found from this feed it is sent to selected list as an email "
-"message."
-msgstr ""
-
-#: views/campaigns/create-rss.hbs:7 views/campaigns/create-triggered.hbs:6
-#: views/campaigns/create.hbs:6 views/campaigns/edit-rss.hbs:9
-#: views/campaigns/edit-triggered.hbs:10 views/campaigns/edit.hbs:11
-msgid "Campaign Name"
-msgstr "Kampány neve"
-
-#: views/campaigns/create-rss.hbs:9 views/campaigns/create-triggered.hbs:8
-#: views/campaigns/create.hbs:8 views/campaigns/edit-rss.hbs:11
-#: views/campaigns/edit-triggered.hbs:12 views/campaigns/edit.hbs:13
-#: views/lists/create.hbs:8 views/lists/edit.hbs:11
-#: views/report-templates/partials/report-template-fields.hbs:4
-#: views/reports/partials/report-fields.hbs:4 views/templates/create.hbs:11
-#: views/templates/edit.hbs:10 views/triggers/create.hbs:9
-#: views/triggers/edit.hbs:10
-msgid "HTML is allowed"
-msgstr "HTML megengedett"
-
-#: views/campaigns/create-rss.hbs:10 views/campaigns/create-triggered.hbs:9
-#: views/campaigns/create.hbs:9 views/campaigns/edit-rss.hbs:12
-#: views/campaigns/edit-triggered.hbs:13 views/campaigns/edit.hbs:14
-#: views/campaigns/view.hbs:6 views/triggers/create-select.hbs:6
-#: views/triggers/create.hbs:10 views/triggers/edit.hbs:12
-#: views/triggers/triggers.hbs:8
-msgid "List"
-msgstr "Lista"
-
-#: views/campaigns/create-rss.hbs:11 views/campaigns/create-triggered.hbs:10
-#: views/campaigns/create-triggered.hbs:14 views/campaigns/create.hbs:10
-#: views/campaigns/create.hbs:14 views/campaigns/edit-rss.hbs:13
-#: views/campaigns/edit-triggered.hbs:14 views/campaigns/edit.hbs:15
-#: views/lists/fields/create.hbs:27 views/lists/fields/edit.hbs:28
-#: views/lists/segments/create.hbs:9 views/lists/segments/edit.hbs:10
-#: views/lists/segments/rule-create.hbs:7 views/lists/subscription/add.hbs:10
-#: views/lists/subscription/add.hbs:12 views/lists/subscription/edit.hbs:11
-#: views/lists/subscription/import-preview.hbs:5
-#: views/reports/partials/report-select-template.hbs:2
-#: views/subscription/partials/subscription-custom-fields.hbs:9
-#: views/templates/create.hbs:8 views/triggers/create-select.hbs:7
-#: views/triggers/create.hbs:17 views/triggers/create.hbs:20
-#: views/triggers/create.hbs:22 views/triggers/create.hbs:26
-#: views/triggers/edit.hbs:19 views/triggers/edit.hbs:22
-#: views/triggers/edit.hbs:24 views/triggers/edit.hbs:28
-msgid "Select"
-msgstr "Kiválasztás"
-
-#: views/campaigns/create-rss.hbs:12 views/campaigns/create-triggered.hbs:11
-#: views/campaigns/create.hbs:11 views/campaigns/edit-rss.hbs:14
-#: views/campaigns/edit-triggered.hbs:15 views/campaigns/edit.hbs:16
-#: views/triggers/create-select.hbs:8 views/triggers/create.hbs:11
-#: views/triggers/edit.hbs:13
-msgid "subscribers"
-msgstr "feliratkozók"
-
-#: views/campaigns/create-rss.hbs:13 views/campaigns/edit-rss.hbs:15
-msgid "RSS Feed Url"
-msgstr "RSS URL-je"
-
-#: views/campaigns/create-rss.hbs:14 views/campaigns/edit-rss.hbs:16
-msgid ""
-"New entries from this RSS URL are sent out to list subscribers as email "
-"messages"
-msgstr ""
-
-#: views/campaigns/create-rss.hbs:15 views/campaigns/create-triggered.hbs:18
-#: views/campaigns/create.hbs:18 views/campaigns/edit-rss.hbs:18
-#: views/campaigns/edit-triggered.hbs:16 views/campaigns/edit.hbs:17
-#: views/campaigns/view.hbs:12
-msgid "Email \"from name\""
-msgstr "Email feladó neve"
-
-#: views/campaigns/create-rss.hbs:16 views/campaigns/create-triggered.hbs:19
-#: views/campaigns/create.hbs:19 views/campaigns/edit-rss.hbs:19
-#: views/campaigns/edit-triggered.hbs:17 views/campaigns/edit.hbs:18
-#: views/settings.hbs:23
-msgid "This is the name your emails will come from"
-msgstr "Ez az a név, ami alatt az emailek meg fognak jelenni"
-
-#: views/campaigns/create-rss.hbs:17 views/campaigns/create-triggered.hbs:20
-#: views/campaigns/create.hbs:20 views/campaigns/edit-rss.hbs:20
-#: views/campaigns/edit-triggered.hbs:18 views/campaigns/edit.hbs:19
-#: views/campaigns/view.hbs:13
-msgid "Email \"from\" address"
-msgstr "Email feladó címe"
-
-#: views/campaigns/create-rss.hbs:18 views/campaigns/create-triggered.hbs:21
-#: views/campaigns/edit-rss.hbs:21 views/campaigns/edit-triggered.hbs:19
-#: views/settings.hbs:25
-msgid "This is the address people will send replies to"
-msgstr "Ez a cím, amiről érkezni látják majd a leveleket"
-
-#: views/campaigns/create-rss.hbs:19 views/campaigns/create-triggered.hbs:24
-#: views/campaigns/create.hbs:26 views/campaigns/edit-rss.hbs:22
-#: views/campaigns/edit-triggered.hbs:22 views/campaigns/edit.hbs:25
-msgid "Disable opened tracking"
-msgstr "Megnyitások követésének letiltása"
-
-#: views/campaigns/create-rss.hbs:20 views/campaigns/create-triggered.hbs:25
-#: views/campaigns/create.hbs:27 views/campaigns/edit-rss.hbs:23
-#: views/campaigns/edit-triggered.hbs:23 views/campaigns/edit.hbs:26
-msgid "Disable clicked tracking"
-msgstr "Kattintások követésének letiltása"
-
-#: views/campaigns/create-triggered.hbs:3
-#: views/campaigns/create-triggered.hbs:4
-msgid "Create Triggered Campaign"
-msgstr ""
-
-#: views/campaigns/create-triggered.hbs:12 views/campaigns/create.hbs:12
-#: views/campaigns/edit-triggered.hbs:7 views/campaigns/edit.hbs:7
-#: views/lists/fields/create.hbs:31 views/lists/fields/edit.hbs:33
-#: views/reports/reports.hbs:7 views/templates/create.hbs:13
-msgid "Template"
-msgstr "Sablon"
-
-#: views/campaigns/create-triggered.hbs:13 views/campaigns/create.hbs:13
-msgid "Select a template:"
-msgstr "Sablon kiválasztása:"
-
-#: views/campaigns/create-triggered.hbs:15 views/campaigns/create.hbs:15
-msgid "Selecting a template creates a campaign specific copy from it"
-msgstr ""
-
-#: views/campaigns/create-triggered.hbs:16 views/campaigns/create.hbs:16
-msgid "Or alternatively use an URL as the message content source:"
-msgstr ""
-
-#: views/campaigns/create-triggered.hbs:17 views/campaigns/create.hbs:17
-#: views/campaigns/edit-triggered.hbs:26 views/campaigns/edit.hbs:29
-msgid ""
-"If a message is sent then this URL will be POSTed to using Merge Tags as "
-"POST body. Use this if you want to generate the HTML message yourself"
-msgstr ""
-
-#: views/campaigns/create-triggered.hbs:22 views/campaigns/create.hbs:24
-#: views/campaigns/edit-triggered.hbs:20 views/campaigns/edit.hbs:23
-#: views/campaigns/view.hbs:15
-msgid "Email \"subject line\""
-msgstr "Email tárgya"
-
-#: views/campaigns/create-triggered.hbs:23 views/campaigns/create.hbs:25
-#: views/campaigns/edit-triggered.hbs:21 views/campaigns/edit.hbs:24
-#: views/settings.hbs:27
-msgid "Keep it relevant and non-spammy"
-msgstr ""
-
-#: views/campaigns/create.hbs:21 views/campaigns/edit.hbs:20
-msgid ""
-"This is the address people will send replies to unless reply-to address is "
-"set"
-msgstr ""
-
-#: views/campaigns/create.hbs:22 views/campaigns/edit.hbs:21
-#: views/campaigns/view.hbs:14
-msgid "Email \"reply-to\" address"
-msgstr ""
-
-#: views/campaigns/create.hbs:23 views/campaigns/edit.hbs:22
-msgid "If set, this is the address people will send replies to"
-msgstr ""
-
-#: views/campaigns/delivered.hbs:3 views/campaigns/delivered.hbs:4
-msgid "Delivered info"
-msgstr ""
-
-#: views/campaigns/delivered.hbs:6
-msgid "Subscribers who received the message and did not bounce/unsubscribe:"
-msgstr ""
-
-#: views/campaigns/delivered.hbs:11
-msgid "Delivery time"
-msgstr ""
-
-#: views/campaigns/edit-rss.hbs:3 views/campaigns/edit-rss.hbs:4
-msgid "Edit RSS Campaign"
-msgstr "RSS kampány szerkesztése"
-
-#: views/campaigns/edit-rss.hbs:7 views/campaigns/edit-triggered.hbs:8
-#: views/campaigns/edit.hbs:9 views/settings.hbs:4 views/users/account.hbs:6
-msgid "General Settings"
-msgstr "Általános beállítások"
-
-#: views/campaigns/edit-rss.hbs:17
-msgid ""
-"Use special merge tag [RSS_ENTRY] to mark the position for the RSS post "
-"content. Additionally you can use any valid merge tag as well."
-msgstr ""
-
-#: views/campaigns/edit-rss.hbs:24 views/campaigns/edit-triggered.hbs:27
-#: views/campaigns/edit.hbs:35
-msgid "Delete Campaign"
-msgstr "Kampány törlése"
-
-#: views/campaigns/edit-rss.hbs:25 views/campaigns/edit-triggered.hbs:28
-#: views/campaigns/edit.hbs:36 views/lists/edit.hbs:22
-#: views/lists/fields/edit.hbs:39 views/lists/forms/edit.hbs:33
-#: views/lists/forms/forms.hbs:12 views/lists/segments/edit.hbs:14
-#: views/lists/segments/rule-edit.hbs:38 views/lists/subscription/edit.hbs:18
-#: views/reports/edit.hbs:6 views/settings.hbs:97 views/templates/edit.hbs:13
-#: views/triggers/edit.hbs:30 views/users/account.hbs:18
-msgid "Update"
-msgstr "Frissítés"
-
-#: views/campaigns/edit-triggered.hbs:3 views/campaigns/edit-triggered.hbs:4
-msgid "Edit Triggered Campaign"
-msgstr ""
-
-#: views/campaigns/edit-triggered.hbs:6 views/campaigns/edit.hbs:6
-#: routes/forms.js:143
-msgid "General"
-msgstr ""
-
-#: views/campaigns/edit-triggered.hbs:24 views/campaigns/edit.hbs:27
-msgid "Template Settings"
-msgstr "Sablon beállítások"
-
-#: views/campaigns/edit-triggered.hbs:25 views/campaigns/edit.hbs:28
-msgid "Template URL"
-msgstr "Sablon URL"
-
-#: views/campaigns/edit.hbs:3 views/campaigns/edit.hbs:4
-#: views/campaigns/upload-attachment.hbs:3
-#: views/campaigns/upload-attachment.hbs:5 views/campaigns/view.hbs:3
-msgid "Edit Campaign"
-msgstr "Kampány szerkesztése"
-
-#: views/campaigns/edit.hbs:8 views/campaigns/edit.hbs:30
-msgid "Attachments"
-msgstr "Csatolmányok"
-
-#: views/campaigns/edit.hbs:31
-msgid "File"
-msgstr "File"
-
-#: views/campaigns/edit.hbs:32
-msgid "Size"
-msgstr "Méret"
-
-#: views/campaigns/edit.hbs:33 views/campaigns/view.hbs:68
-#: views/lists/fields/fields.hbs:12 views/lists/forms/forms.hbs:9
-#: views/lists/view.hbs:33
-msgid "No data available in table"
-msgstr "Nincs adat a táblázatban."
-
-#: views/campaigns/edit.hbs:34 views/campaigns/upload-attachment.hbs:4
-msgid "Add Attachment"
-msgstr "Csatolmány hozzáadása"
-
-#: views/campaigns/opened.hbs:3 views/campaigns/opened.hbs:4
-msgid "Opened info"
-msgstr "Megnyitásokról információ"
-
-#: views/campaigns/opened.hbs:6
-msgid "Subscribers who opened this message:"
-msgstr "Feliratkozók, akik megnyitották ezt az üzenetet:"
-
-#: views/campaigns/opened.hbs:12
-msgid "First open"
-msgstr "Első megnyitás"
-
-#: views/campaigns/opened.hbs:13
-msgid "Opened count"
-msgstr "Megnyitások száma"
-
-#: views/campaigns/unsubscribed.hbs:3 views/campaigns/unsubscribed.hbs:4
-msgid "Unsubscribed info"
-msgstr "Leiratkozásokról információ:"
-
-#: views/campaigns/unsubscribed.hbs:6
-msgid "Subscribers who unsubscribed:"
-msgstr "Feliratkozók, akik leiratkoztak:"
-
-#: views/campaigns/unsubscribed.hbs:11 views/campaigns/view.hbs:28
-#: views/lists/subscription/import.hbs:13 routes/lists.js:206
-msgid "Unsubscribed"
-msgstr ""
-
-#: views/campaigns/upload-attachment.hbs:7
-msgid "Upload"
-msgstr "Feltöltés"
-
-#: views/campaigns/view.hbs:4
-msgid "Overview"
-msgstr "Áttekintés"
-
-#: views/campaigns/view.hbs:5
-msgid "Links"
-msgstr "Linkek"
-
-#: views/campaigns/view.hbs:7
-msgid "Feed URL"
-msgstr ""
-
-#: views/campaigns/view.hbs:8
-msgid "Last check"
-msgstr ""
-
-#: views/campaigns/view.hbs:9
-msgid "Not yet checked"
-msgstr ""
-
-#: views/campaigns/view.hbs:10
-msgid "activate campaign to start checking feed for new messages"
-msgstr ""
-
-#: views/campaigns/view.hbs:11
-msgid "RSS status"
-msgstr "RSS státusz"
-
-#: views/campaigns/view.hbs:16
-msgid "Preview campaign as"
-msgstr "Kampány előnezete, mint"
-
-#: views/campaigns/view.hbs:17
-msgid "Add new test user"
-msgstr "Teszt felhasználó hozzáadása"
-
-#: views/campaigns/view.hbs:18
-msgid "No test users yet, create one here"
-msgstr "Nincs még teszt felhasználó, hozzon létre egyet itt"
-
-#: views/campaigns/view.hbs:19
-msgid "Go"
-msgstr ""
-
-#: views/campaigns/view.hbs:20 lib/models/triggers.js:26
-msgid "Delivered"
-msgstr "Készbesítve"
-
-#: views/campaigns/view.hbs:21
-msgid "List subscribers who received this message"
-msgstr "Azon felhasználók listázása, akik megkapták ezt az üzenetet"
-
-#: views/campaigns/view.hbs:22
-msgid "Blacklisted"
-msgstr "Feketelistán szereplők"
-
-#: views/campaigns/view.hbs:23
-msgid "List subscribers who blacklisted by global blacklist"
-msgstr ""
-"Azon felhasználók listázása, akik feketelistára kerültek, mert a globális "
-"feketelistán szerepeltek"
-
-#: views/campaigns/view.hbs:24 routes/lists.js:206
-msgid "Bounced"
-msgstr "Visszapattant"
-
-#: views/campaigns/view.hbs:25
-msgid "List subscribers who bounced"
-msgstr ""
-
-#: views/campaigns/view.hbs:26
-msgid "Complaints"
-msgstr ""
-
-#: views/campaigns/view.hbs:27
-msgid "List subscribers who complained for this message"
-msgstr ""
-
-#: views/campaigns/view.hbs:29
-msgid "List subscribers who unsubscribed after this message"
-msgstr ""
-
-#: views/campaigns/view.hbs:30
-msgid "Opened"
-msgstr ""
-
-#: views/campaigns/view.hbs:31
-msgid "List subscribers who opened this message"
-msgstr ""
-
-#: views/campaigns/view.hbs:32
-msgid "Clicked"
-msgstr ""
-
-#: views/campaigns/view.hbs:33 views/campaigns/view.hbs:70
-msgid "List subscribers who clicked on a link"
-msgstr ""
-
-#: views/campaigns/view.hbs:34
-msgid ""
-"Are you sure? This action would start sending messages to the selected list"
-msgstr ""
-
-#: views/campaigns/view.hbs:35
-msgid "Delay sending"
-msgstr ""
-
-#: views/campaigns/view.hbs:36
-msgid "hours"
-msgstr "óra"
-
-#: views/campaigns/view.hbs:37
-msgid "minutes"
-msgstr "perc"
-
-#: views/campaigns/view.hbs:38
-msgid "Send to subscribers:"
-msgstr ""
-
-#: views/campaigns/view.hbs:39
-msgid "Are you sure? This action would reset scheduling"
-msgstr ""
-
-#: views/campaigns/view.hbs:40
-msgid "Cancel"
-msgstr "Mégse"
-
-#: views/campaigns/view.hbs:41
-msgid "Sending scheduled"
-msgstr "Küldés időzítve"
-
-#: views/campaigns/view.hbs:42 views/campaigns/view.hbs:54
-msgid "Pause"
-msgstr ""
-
-#: views/campaigns/view.hbs:43 routes/campaigns.js:253
-msgid "Sending"
-msgstr "Küldés folyamatban"
-
-#: views/campaigns/view.hbs:44 views/campaigns/view.hbs:48
-msgid ""
-"Are you sure? This action would resume sending messages to the selected list"
-msgstr ""
-
-#: views/campaigns/view.hbs:45 views/campaigns/view.hbs:49
-msgid "Are you sure? This action would reset all stats about current progress"
-msgstr ""
-
-#: views/campaigns/view.hbs:46
-msgid "Resume"
-msgstr "Folytatás"
-
-#: views/campaigns/view.hbs:47 views/campaigns/view.hbs:51
-msgid "Reset"
-msgstr ""
-
-#: views/campaigns/view.hbs:50
-msgid "Continue"
-msgstr "Tovább"
-
-#: views/campaigns/view.hbs:52
-msgid ""
-"All messages sent! Hit \"Continue\" if you you want to send this campaign to "
-"new subscribers"
-msgstr ""
-
-#: views/campaigns/view.hbs:53
-msgid ""
-"Are you sure? This action would pause sending new entries in RSS feed as "
-"email messages to the selected list"
-msgstr ""
-
-#: views/campaigns/view.hbs:55 views/campaigns/view.hbs:59
-msgid "Campaign status:"
-msgstr "Kampány státusza"
-
-#: views/campaigns/view.hbs:56
-msgid "ACTIVE"
-msgstr "AKTÍV"
-
-#: views/campaigns/view.hbs:57
-msgid ""
-"Are you sure? This action would start sending new entries in RSS feed as "
-"email messages to the selected list"
-msgstr ""
-
-#: views/campaigns/view.hbs:58
-msgid "Activate"
-msgstr "Aktív"
-
-#: views/campaigns/view.hbs:60
-msgid "INACTIVE"
-msgstr "INAKTÍV"
-
-#: views/campaigns/view.hbs:61
-msgid ""
-"This is a triggered campaign. Messages are only sent to subscribers that hit "
-"some trigger that invokes this campaign"
-msgstr ""
-
-#: views/campaigns/view.hbs:62
-msgid "see more"
-msgstr ""
-
-#: views/campaigns/view.hbs:67
-msgid "List subscribers who clicked this link"
-msgstr ""
-
-#: views/campaigns/view.hbs:71
-msgid ""
-"Clicks are counted as unique subscribers that clicked on a specific link or "
-"on any link (in aggregated view)"
-msgstr ""
-
-#: views/campaigns/view.hbs:72
-msgid ""
-"If a new entry is found from campaign feed a new subcampaign is created of "
-"that entry and it will be listed here"
-msgstr ""
-
-#: views/emails/password-reset-html.hbs:1
-#: views/emails/password-reset-text.hbs:1
-msgid "Change your password"
-msgstr "Jelszó megváltoztatása"
-
-#: views/emails/password-reset-html.hbs:2
-#: views/emails/password-reset-text.hbs:2
-msgid "We have received a password change request for your Mailtrain account:"
-msgstr ""
-
-#: views/emails/password-reset-html.hbs:3
-#: views/emails/password-reset-text.hbs:3
-msgid "Reset password"
-msgstr ""
-
-#: views/emails/password-reset-html.hbs:4
-#: views/emails/password-reset-text.hbs:4
-msgid ""
-"If you did not ask to change your password, then you can ignore this email "
-"and your password will not be changed."
-msgstr ""
-
-#: views/emails/rss-html.hbs:1 views/emails/stationery-html.hbs:3
-#: views/emails/stationery-text.hbs:3
-msgid "Preferences"
-msgstr "Beállítások"
-
-#: views/emails/rss-html.hbs:2 views/emails/stationery-html.hbs:4
-#: views/emails/stationery-text.hbs:4 views/lists/forms/edit.hbs:20
-#: views/lists/subscription/edit.hbs:16
-#: views/subscription/partials/subscription-unsubscribe-form.hbs:2
-#: views/subscription/web-manage.mjml.hbs:3
-#: views/subscription/web-unsubscribe.mjml.hbs:1
-#: views/subscription/web-unsubscribe.mjml.hbs:2 routes/forms.js:223
-#: routes/lists.js:288
-msgid "Unsubscribe"
-msgstr "Leiratkozás"
-
-#: views/emails/rss-html.hbs:3 views/emails/stationery-html.hbs:5
-#: views/emails/stationery-text.hbs:5
-msgid "View this email in your browser"
-msgstr "Üzenet megtekintése böngészőben"
-
-#: views/emails/stationery-html.hbs:1 views/emails/stationery-text.hbs:1
-msgid "Hey [FIRST_NAME/Customer],"
-msgstr "Kedves [FIRST_NAME/Customer]!"
-
-#: views/emails/stationery-html.hbs:2 views/emails/stationery-text.hbs:2
-msgid "Cheers,"
-msgstr "Üdvözlettel,"
-
-#: views/index.hbs:1
-msgid "List Management"
-msgstr "A lista kezelői"
-
-#: views/index.hbs:2
-msgid ""
-"Mailtrain allows you to easily manage even very large lists. Million "
-"subscribers? Not a problem. You can add subscribers manually, through the "
-"API or import from a CSV file. All lists come with support for custom fields "
-"and merge tags as well."
-msgstr ""
-
-#: views/index.hbs:3 views/index.hbs:7 views/index.hbs:10 views/index.hbs:13
-#: views/index.hbs:16 views/index.hbs:19 views/index.hbs:22 views/index.hbs:25
-#: views/index.hbs:28
-msgid "Show more"
-msgstr ""
-
-#: views/index.hbs:4 views/lists/fields/create.hbs:3
-#: views/lists/fields/edit.hbs:3 views/lists/fields/fields.hbs:3
-#: views/lists/fields/fields.hbs:5 views/lists/view.hbs:6
-msgid "Custom Fields"
-msgstr "Egyedi mezők"
-
-#: views/index.hbs:5
-msgid ""
-"Text fields, numbers, drop downs or checkboxes, Mailtrain has them all. "
-"Every custom field can be included in the generated newsletters through "
-"merge tags."
-msgstr ""
-
-#: views/index.hbs:6
-msgid "Mailtrain also supports custom forms."
-msgstr ""
-
-#: views/index.hbs:8
-msgid "List Segmentation"
-msgstr ""
-
-#: views/index.hbs:9
-msgid ""
-"Send messages only to list subscribers that match predefined segmentation "
-"rules. No need to create separate lists with small differences."
-msgstr ""
-
-#: views/index.hbs:11
-msgid "RSS Campaigns"
-msgstr "RSS kampányok"
-
-#: views/index.hbs:12
-msgid ""
-"Setup Mailtrain to track RSS feeds and if a new entry is detected in a feed "
-"then Mailtrain auto-generates a new campaign using entry data as message "
-"contents and sends it to selected subscribers."
-msgstr ""
-
-#: views/index.hbs:14
-msgid "GPG Encryption"
-msgstr "GPG titkosítás"
-
-#: views/index.hbs:15
-msgid ""
-"If a list has a custom field for a GPG Public Key set then subscribers can "
-"upload their GPG public key to receive encrypted messages from the list."
-msgstr ""
-
-#: views/index.hbs:17
-msgid "Click Stats"
-msgstr ""
-
-#: views/index.hbs:18
-msgid ""
-"After a campaign is sent, check individual click statistics for every link "
-"included in the message."
-msgstr ""
-
-#: views/index.hbs:20
-msgid "Template Editors"
-msgstr ""
-
-#: views/index.hbs:21
-msgid ""
-"Mailtrain ships with GrapeJS and Mosaico built in, two advanced template "
-"editors. Mailtrain also offers a code editor if you prefer to handcraft the "
-"HTML yourself."
-msgstr ""
-
-#: views/index.hbs:23
-msgid "Send via Any Provider"
-msgstr ""
-
-#: views/index.hbs:24
-msgid ""
-"You can use any provider that supports SMTP protocol to send out your "
-"newsletters. Bounce and complaints handling via webhooks is supported for "
-"SES, SparkPost, SendGrid and Mailgun, also for Postfix and ZoneMTA."
-msgstr ""
-
-#: views/index.hbs:26 lib/tools.js:137
-msgid "Automation"
-msgstr ""
-
-#: views/index.hbs:27
-msgid ""
-"Define automation triggers to send specific messages when a user activates "
-"the trigger."
-msgstr ""
-
-#: views/layout.hbs:2
-msgid "Toggle navigation"
-msgstr ""
-
-#: views/layout.hbs:3
-msgid "Wiki"
-msgstr "Wiki"
-
-#: views/layout.hbs:4
-msgid "Blog"
-msgstr "Blog"
-
-#: views/layout.hbs:5 views/users/account.hbs:2 views/users/account.hbs:3
-msgid "Account"
-msgstr "Fiók"
-
-#: views/layout.hbs:6 views/settings.hbs:2 views/settings.hbs:3
-msgid "Settings"
-msgstr "Beállítások"
-
-#: views/layout.hbs:8 views/users/api.hbs:2 views/users/api.hbs:3
-msgid "API"
-msgstr "API"
-
-#: views/layout.hbs:9
-msgid "Log out"
-msgstr "Kijelentkezés"
-
-#: views/layout.hbs:10 views/users/forgot.hbs:2 views/users/login.hbs:2
-#: views/users/login.hbs:3 views/users/login.hbs:9 views/users/reset.hbs:2
-msgid "Sign in"
-msgstr "Bejelentkezés"
-
-#: views/layout.hbs:11
-msgid "Self Hosted Newsletter App Built on Top of Nodemailer"
-msgstr ""
-
-#: views/layout.hbs:12 views/layout.hbs:14
-msgid "Source on GitHub"
-msgstr "Forráskód a GitHub-on"
-
-#: views/layout.hbs:13
-msgid "Subscribe to Our Newsletter"
-msgstr "Feliratkozás hírlevelünkre"
-
-#: views/lists/create.hbs:2 views/lists/edit.hbs:2
-#: views/lists/fields/create.hbs:2 views/lists/fields/edit.hbs:2
-#: views/lists/fields/fields.hbs:2 views/lists/forms/create.hbs:2
-#: views/lists/forms/edit.hbs:2 views/lists/forms/forms.hbs:2
-#: views/lists/lists.hbs:2 views/lists/lists.hbs:4
-#: views/lists/segments/create.hbs:2 views/lists/segments/edit.hbs:2
-#: views/lists/segments/rule-configure.hbs:2
-#: views/lists/segments/rule-create.hbs:2 views/lists/segments/rule-edit.hbs:2
-#: views/lists/segments/segments.hbs:2 views/lists/segments/view.hbs:2
-#: views/lists/subscription/add.hbs:2 views/lists/subscription/edit.hbs:2
-#: views/lists/subscription/import-failed.hbs:2
-#: views/lists/subscription/import-preview.hbs:2
-#: views/lists/subscription/import.hbs:2 views/lists/view.hbs:2
-#: lib/tools.js:125 routes/lists.js:59
-msgid "Lists"
-msgstr "Listák"
-
-#: views/lists/create.hbs:3 views/lists/create.hbs:4 views/lists/create.hbs:13
-#: views/lists/lists.hbs:3
-msgid "Create List"
-msgstr "Lista létrehozása"
-
-#: views/lists/create.hbs:6 views/lists/edit.hbs:7
-msgid "List Name"
-msgstr "Lista neve"
-
-#: views/lists/create.hbs:9 views/lists/edit.hbs:15
-#: views/triggers/create.hbs:15 views/triggers/edit.hbs:17
-msgid "Subscription"
-msgstr "Feliratkozás"
-
-#: views/lists/create.hbs:10 views/lists/edit.hbs:16
-msgid "Allow public users to subscribe themselves"
-msgstr "Nyilvános űrlapról való feliratkozás engedélyezése"
-
-#: views/lists/create.hbs:11 views/lists/edit.hbs:17
-msgid "Unsubscription"
-msgstr "Leiratkozás"
-
-#: views/lists/create.hbs:12 views/lists/edit.hbs:18
-msgid "Select how an unsuscription request by subscriber is handled."
-msgstr ""
-
-#: views/lists/edit.hbs:3 views/lists/edit.hbs:4 views/lists/view.hbs:8
-msgid "Edit List"
-msgstr "Lista szerkesztése"
-
-#: views/lists/edit.hbs:5
-msgid "View List"
-msgstr "Lista megtekintése"
-
-#: views/lists/edit.hbs:8
-msgid "List ID"
-msgstr "Lista ID"
-
-#: views/lists/edit.hbs:9
-msgid "This is the list ID displayed to the subscribers"
-msgstr ""
-
-#: views/lists/edit.hbs:12
-msgid "Custom Form"
-msgstr "Egyedi űrlap"
-
-#: views/lists/edit.hbs:13 views/lists/forms/forms.hbs:11
-msgid "Default Mailtrain Form"
-msgstr "Alapértelmezett Mailtrain űrlap"
-
-#: views/lists/edit.hbs:14
-msgid ""
-"The custom form used for this list. You can create a form here."
-msgstr ""
-"Egyedi űrlap ehhez a listához. Itt "
-"hozhat létre új űrlapot."
-
-#: views/lists/edit.hbs:19
-msgid "Unsubscribe Header"
-msgstr "Leiratkozás fejléc"
-
-#: views/lists/edit.hbs:20
-msgid "Do not send List-Unsubscribe headers"
-msgstr "Leiratkozás fejléc küldésének letiltása"
-
-#: views/lists/edit.hbs:21
-msgid "Delete List"
-msgstr "Lista törlése"
-
-#: views/lists/fields/create.hbs:4
-msgid "Create Field"
-msgstr "Mező létrehozása"
-
-#: views/lists/fields/create.hbs:5 views/lists/fields/fields.hbs:4
-msgid "Create Custom Field"
-msgstr "Egyedi mező létrehozása"
-
-#: views/lists/fields/create.hbs:6 views/lists/fields/create.hbs:7
-#: views/lists/fields/edit.hbs:7 views/lists/fields/edit.hbs:8
-msgid "Field Name"
-msgstr "Mező neve"
-
-#: views/lists/fields/create.hbs:8 views/lists/fields/edit.hbs:9
-msgid "Field Type"
-msgstr "Mező típusa"
-
-#: views/lists/fields/create.hbs:9 views/lists/fields/edit.hbs:10
-#: lib/models/fields.js:17
-msgid "Text"
-msgstr "Szöveg"
-
-#: views/lists/fields/create.hbs:10 views/lists/fields/edit.hbs:11
-#: lib/models/fields.js:21
-msgid "Number"
-msgstr "Szám"
-
-#: views/lists/fields/create.hbs:11 views/lists/fields/edit.hbs:12
-#: lib/models/fields.js:18
-msgid "Website"
-msgstr "Weboldal"
-
-#: views/lists/fields/create.hbs:12 views/lists/fields/edit.hbs:13
-#: lib/models/fields.js:20
-msgid "GPG Public Key"
-msgstr "GPG publikus kulcs"
-
-#: views/lists/fields/create.hbs:13 views/lists/fields/edit.hbs:14
-#: lib/models/fields.js:19
-msgid "Multi-line text"
-msgstr "Többsoros szöveg"
-
-#: views/lists/fields/create.hbs:14 views/lists/fields/edit.hbs:15
-msgid "JSON"
-msgstr "JSON"
-
-#: views/lists/fields/create.hbs:15 views/lists/fields/edit.hbs:16
-msgid "Date"
-msgstr "Dátum"
-
-#: views/lists/fields/create.hbs:16 views/lists/fields/edit.hbs:17
-msgid "Date (MM/DD/YYYY)"
-msgstr "Dátum (HH/NN/ÉÉÉÉ)"
-
-#: views/lists/fields/create.hbs:17 views/lists/fields/edit.hbs:18
-#: lib/models/fields.js:26
-msgid "Date (DD/MM/YYYY)"
-msgstr "Dátum (NN/HH/ÉÉÉÉ)"
-
-#: views/lists/fields/create.hbs:18 views/lists/fields/edit.hbs:19
-msgid "Birthday"
-msgstr "Születésnap"
-
-#: views/lists/fields/create.hbs:19 views/lists/fields/edit.hbs:20
-#: lib/models/fields.js:27
-msgid "Birthday (MM/DD)"
-msgstr "Születésnap (HH/NN)"
-
-#: views/lists/fields/create.hbs:20 views/lists/fields/edit.hbs:21
-#: lib/models/fields.js:28
-msgid "Birthday (DD/MM)"
-msgstr "Születésnap (NN/HH)"
-
-#: views/lists/fields/create.hbs:21 views/lists/fields/edit.hbs:22
-msgid "Grouped"
-msgstr "Csoportosított"
-
-#: views/lists/fields/create.hbs:22 views/lists/fields/edit.hbs:23
-msgid "Drop Downs"
-msgstr "Lenyíló menük"
-
-#: views/lists/fields/create.hbs:23 views/lists/fields/edit.hbs:24
-#: lib/models/fields.js:22
-msgid "Radio Buttons"
-msgstr "Rádió gombok"
-
-#: views/lists/fields/create.hbs:24 views/lists/fields/edit.hbs:25
-#: lib/models/fields.js:23
-msgid "Checkboxes"
-msgstr "Jelölőmezők"
-
-#: views/lists/fields/create.hbs:25 views/lists/fields/edit.hbs:26
-msgid "Option for a group value"
-msgstr ""
-
-#: views/lists/fields/create.hbs:26 views/lists/fields/edit.hbs:27
-msgid "Group"
-msgstr "Csoport"
-
-#: views/lists/fields/create.hbs:28 views/lists/fields/edit.hbs:29
-msgid "Required for group options"
-msgstr ""
-
-#: views/lists/fields/create.hbs:29 views/lists/fields/create.hbs:30
-#: views/lists/fields/edit.hbs:35 views/lists/fields/edit.hbs:36
-#: views/lists/fields/fields.hbs:9
-msgid "Default merge tag value"
-msgstr ""
-
-#: views/lists/fields/create.hbs:32 views/lists/fields/edit.hbs:34
-msgid ""
-"For group elements like checkboxes you can control the appearance of the "
-"merge tag with an optional template. The template uses handlebars syntax and "
-"you can find all values from {{values}} array, for example "
-"{{#each values}} {{this}} {{/each}}. If template is not defined "
-"then multiple values are joined with commas. You can also use this template "
-"to render JSON values (if the JSON is an array then the array is exposed as "
-"values, otherwise you can access the JSON keys directly)."
-msgstr ""
-
-#: views/lists/fields/create.hbs:33 views/lists/fields/edit.hbs:37
-msgid "Visible"
-msgstr "Látható"
-
-#: views/lists/fields/create.hbs:34
-msgid "Add Field"
-msgstr "Mező hozzáadása"
-
-#: views/lists/fields/edit.hbs:4
-msgid "Edit Field"
-msgstr "Mező szerkesztése"
-
-#: views/lists/fields/edit.hbs:5
-msgid "Edit Custom Field"
-msgstr ""
-
-#: views/lists/fields/edit.hbs:6
-msgid "Back to fields"
-msgstr ""
-
-#: views/lists/fields/edit.hbs:30 views/lists/fields/fields.hbs:8
-#: views/mosaico/editor.hbs:2 views/partials/merge-tag-reference.hbs:3
-msgid "Merge tag"
-msgstr ""
-
-#: views/lists/fields/edit.hbs:31
-msgid "Merge Tag"
-msgstr ""
-
-#: views/lists/fields/edit.hbs:32
-msgid "Put this tag in your content:"
-msgstr ""
-
-#: views/lists/fields/edit.hbs:38
-msgid "Delete Field"
-msgstr "Mező törlése"
-
-#: views/lists/fields/fields.hbs:7 views/lists/view.hbs:26
-#: views/report-templates/partials/report-template-fields.hbs:5
-msgid "Type"
-msgstr "Típus"
-
-#: views/lists/fields/fields.hbs:10 views/lists/fields/fields.hbs:11
-#: views/lists/forms/edit.hbs:26 views/lists/forms/forms.hbs:8
-#: views/lists/segments/segments.hbs:8 views/lists/segments/view.hbs:12
-#: views/triggers/triggers.hbs:14 routes/campaigns.js:276
-#: routes/campaigns.js:568 routes/campaigns.js:657 routes/campaigns.js:706
-#: routes/lists.js:170 routes/lists.js:257 routes/report-templates.js:51
-#: routes/templates.js:183 routes/triggers.js:297
-msgid "Edit"
-msgstr "Szerkesztés"
-
-#: views/lists/forms/create.hbs:3 views/lists/forms/edit.hbs:3
-#: views/lists/forms/forms.hbs:3 views/lists/forms/forms.hbs:5
-#: views/lists/view.hbs:5
-msgid "Custom Forms"
-msgstr ""
-
-#: views/lists/forms/create.hbs:4
-msgid "Create Form"
-msgstr ""
-
-#: views/lists/forms/create.hbs:5 views/lists/forms/forms.hbs:4
-msgid "Create Custom Form"
-msgstr ""
-
-#: views/lists/forms/create.hbs:6 views/lists/forms/create.hbs:7
-#: views/lists/forms/edit.hbs:7 views/lists/forms/edit.hbs:8
-msgid "Form Name"
-msgstr ""
-
-#: views/lists/forms/create.hbs:8
-msgid "Add Form"
-msgstr ""
-
-#: views/lists/forms/edit.hbs:4
-msgid "Edit Form"
-msgstr ""
-
-#: views/lists/forms/edit.hbs:5
-msgid "Edit Custom Form"
-msgstr ""
-
-#: views/lists/forms/edit.hbs:6
-msgid "Back to forms"
-msgstr ""
-
-#: views/lists/forms/edit.hbs:10
-msgid "Optional comments about this form"
-msgstr ""
-
-#: views/lists/forms/edit.hbs:11
-msgid "Form Preview"
-msgstr "Űrlap előnézete"
-
-#: views/lists/forms/edit.hbs:12
-msgid ""
-"Note: These links are solely for a quick preview. If you submit a preview "
-"form you'll get redirected to the list's default form."
-msgstr ""
-
-#: views/lists/forms/edit.hbs:13 views/lists/subscription/add.hbs:16
-#: views/subscription/mail-unsubscription-confirmed-html.mjml.hbs:4
-#: views/subscription/mail-unsubscription-confirmed-text.hbs:4
-#: routes/forms.js:157 routes/lists.js:288
-msgid "Subscribe"
-msgstr "Feliratkozás"
-
-#: views/lists/forms/edit.hbs:14
-msgid "Confirm Subscription Notice"
-msgstr ""
-
-#: views/lists/forms/edit.hbs:15
-msgid "Confirm Unsubscription Notice"
-msgstr ""
-
-#: views/lists/forms/edit.hbs:16
-msgid "Subscribed Notice"
-msgstr ""
-
-#: views/lists/forms/edit.hbs:17
-msgid "Updated Notice"
-msgstr ""
-
-#: views/lists/forms/edit.hbs:18
-msgid "Unsubscribed Notice"
-msgstr ""
-
-#: views/lists/forms/edit.hbs:19
-msgid "Manual Unsubscribe Notice"
-msgstr ""
-
-#: views/lists/forms/edit.hbs:21 routes/forms.js:205
-msgid "Manage"
-msgstr ""
-
-#: views/lists/forms/edit.hbs:22
-msgid "Manage Address"
-msgstr ""
-
-#: views/lists/forms/edit.hbs:23
-msgid "Create a test user for additional options"
-msgstr ""
-
-#: views/lists/forms/edit.hbs:24 views/report-templates/create.hbs:3
-#: views/report-templates/edit.hbs:3
-#: views/report-templates/report-templates.hbs:3 views/templates/create.hbs:2
-#: views/templates/edit.hbs:2 views/templates/templates.hbs:2
-#: views/templates/templates.hbs:4 lib/tools.js:129 routes/templates.js:27
-msgid "Templates"
-msgstr "Sablonok"
-
-#: views/lists/forms/edit.hbs:25
-msgid "Fields"
-msgstr "Mezők"
-
-#: views/lists/forms/edit.hbs:27
-msgid "Form Fields"
-msgstr "Űrlap mezők"
-
-#: views/lists/forms/edit.hbs:28
-msgid "Fields hidden on subscription page:"
-msgstr ""
-
-#: views/lists/forms/edit.hbs:29
-msgid "Fields shown on subscription page:"
-msgstr ""
-
-#: views/lists/forms/edit.hbs:30
-msgid "Fields hidden on preferences page:"
-msgstr ""
-
-#: views/lists/forms/edit.hbs:31
-msgid "Fields shown on preferences page:"
-msgstr ""
-
-#: views/lists/forms/edit.hbs:32
-msgid "Delete Form"
-msgstr "Űrlap törlése"
-
-#: views/lists/forms/forms.hbs:10
-msgid "The default form for this list is:"
-msgstr ""
-
-#: views/lists/lists.hbs:6
-msgid "ID"
-msgstr "ID"
-
-#: views/lists/lists.hbs:7 views/reports/partials/report-fields.hbs:10
-msgid "Subscribers"
-msgstr "Feliratkozók"
-
-#: views/lists/segments/create.hbs:3 views/lists/segments/edit.hbs:3
-#: views/lists/segments/rule-configure.hbs:3
-#: views/lists/segments/rule-create.hbs:3 views/lists/segments/rule-edit.hbs:3
-#: views/lists/segments/segments.hbs:3 views/lists/segments/segments.hbs:5
-#: views/lists/segments/view.hbs:3 views/lists/view.hbs:7
-#: views/lists/view.hbs:14
-msgid "Segments"
-msgstr ""
-
-#: views/lists/segments/create.hbs:4 views/lists/segments/create.hbs:5
-#: views/lists/segments/rule-configure.hbs:4
-#: views/lists/segments/rule-create.hbs:4 views/lists/segments/rule-edit.hbs:4
-#: views/lists/segments/segments.hbs:4
-msgid "Create Segment"
-msgstr ""
-
-#: views/lists/segments/create.hbs:6 views/lists/segments/create.hbs:7
-#: views/lists/segments/edit.hbs:7 views/lists/segments/edit.hbs:8
-msgid "Segment Name"
-msgstr ""
-
-#: views/lists/segments/create.hbs:8 views/lists/segments/edit.hbs:9
-msgid "Rule match"
-msgstr ""
-
-#: views/lists/segments/create.hbs:10 views/lists/segments/edit.hbs:11
-msgid "All rules must match"
-msgstr ""
-
-#: views/lists/segments/create.hbs:11 views/lists/segments/edit.hbs:12
-msgid "Any rule can match"
-msgstr ""
-
-#: views/lists/segments/create.hbs:12
-msgid "Add Segment"
-msgstr ""
-
-#: views/lists/segments/edit.hbs:4 views/lists/segments/edit.hbs:5
-#: views/lists/segments/view.hbs:6 views/lists/view.hbs:12
-msgid "Edit Segment"
-msgstr ""
-
-#: views/lists/segments/edit.hbs:6
-msgid "Back to segments"
-msgstr ""
-
-#: views/lists/segments/edit.hbs:13
-msgid "Delete Segment"
-msgstr ""
-
-#: views/lists/segments/rule-configure.hbs:5
-#: views/lists/segments/rule-create.hbs:5 views/lists/segments/rule-edit.hbs:5
-#: views/lists/segments/view.hbs:4
-msgid "Create Rule"
-msgstr "Szabály létrehozása"
-
-#: views/lists/segments/rule-configure.hbs:6
-#: views/lists/segments/rule-create.hbs:6 views/lists/segments/rule-edit.hbs:6
-#: views/lists/segments/view.hbs:10
-msgid "Rule"
-msgstr "Szabály"
-
-#: views/lists/segments/rule-configure.hbs:7
-#: views/lists/segments/rule-configure.hbs:8
-#: views/lists/segments/rule-configure.hbs:10
-#: views/lists/segments/rule-configure.hbs:13
-#: views/lists/segments/rule-configure.hbs:25
-#: views/lists/segments/rule-configure.hbs:30
-#: views/lists/segments/rule-edit.hbs:7 views/lists/segments/rule-edit.hbs:8
-#: views/lists/segments/rule-edit.hbs:10 views/lists/segments/rule-edit.hbs:15
-#: views/lists/segments/rule-edit.hbs:29 views/lists/segments/rule-edit.hbs:34
-#: views/lists/segments/view.hbs:11
-msgid "Value"
-msgstr "Érték"
-
-#: views/lists/segments/rule-configure.hbs:9
-#: views/lists/segments/rule-edit.hbs:9
-msgid ""
-"Use % for wildcard character, e.g. \"%test\" to match all values that end "
-"with \"test\""
-msgstr ""
-
-#: views/lists/segments/rule-configure.hbs:11
-#: views/lists/segments/rule-configure.hbs:14
-#: views/lists/segments/rule-configure.hbs:26
-#: views/lists/segments/rule-edit.hbs:11 views/lists/segments/rule-edit.hbs:16
-#: views/lists/segments/rule-edit.hbs:30
-msgid "Use exact match"
-msgstr "Pontos találat használata"
-
-#: views/lists/segments/rule-configure.hbs:12
-#: views/lists/segments/rule-configure.hbs:15
-#: views/lists/segments/rule-configure.hbs:27
-#: views/lists/segments/rule-edit.hbs:12 views/lists/segments/rule-edit.hbs:17
-#: views/lists/segments/rule-edit.hbs:31
-msgid "Use range match"
-msgstr "Tartomány találat használata"
-
-#: views/lists/segments/rule-configure.hbs:16
-#: views/lists/segments/rule-edit.hbs:20
-msgid "Use relative range match"
-msgstr "Relatív tartomány találat használata"
-
-#: views/lists/segments/rule-configure.hbs:17
-#: views/lists/segments/rule-configure.hbs:28
-#: views/lists/segments/rule-edit.hbs:13 views/lists/segments/rule-edit.hbs:18
-#: views/lists/segments/rule-edit.hbs:21 views/lists/segments/rule-edit.hbs:32
-msgid "From"
-msgstr ""
-
-#: views/lists/segments/rule-configure.hbs:18
-#: views/lists/segments/rule-configure.hbs:22
-#: views/lists/segments/rule-edit.hbs:22 views/lists/segments/rule-edit.hbs:26
-msgid "days"
-msgstr ""
-
-#: views/lists/segments/rule-configure.hbs:19
-#: views/lists/segments/rule-configure.hbs:23
-#: views/lists/segments/rule-edit.hbs:23 views/lists/segments/rule-edit.hbs:27
-msgid "before today"
-msgstr ""
-
-#: views/lists/segments/rule-configure.hbs:20
-#: views/lists/segments/rule-configure.hbs:24
-#: views/lists/segments/rule-edit.hbs:24 views/lists/segments/rule-edit.hbs:28
-msgid "after today"
-msgstr ""
-
-#: views/lists/segments/rule-configure.hbs:21
-#: views/lists/segments/rule-configure.hbs:29
-#: views/lists/segments/rule-edit.hbs:14 views/lists/segments/rule-edit.hbs:19
-#: views/lists/segments/rule-edit.hbs:25 views/lists/segments/rule-edit.hbs:33
-msgid "to"
-msgstr ""
-
-#: views/lists/segments/rule-configure.hbs:31
-#: views/lists/segments/rule-edit.hbs:35 lib/models/segments.js:156
-#: lib/models/segments.js:418
-msgid "Selected"
-msgstr ""
-
-#: views/lists/segments/rule-configure.hbs:32
-#: views/lists/segments/rule-edit.hbs:36 lib/models/segments.js:156
-#: lib/models/segments.js:418
-msgid "Not selected"
-msgstr ""
-
-#: views/lists/segments/rule-configure.hbs:33
-msgid "Add Rule"
-msgstr ""
-
-#: views/lists/segments/rule-create.hbs:8
-#: views/lists/subscription/import.hbs:18
-#: views/reports/create-select-template.hbs:5
-#: views/triggers/create-select.hbs:9
-msgid "Next"
-msgstr "Következő"
-
-#: views/lists/segments/rule-edit.hbs:37
-msgid "Delete Rule"
-msgstr ""
-
-#: views/lists/segments/segments.hbs:7
-msgid "Match"
-msgstr ""
-
-#: views/lists/segments/view.hbs:5 views/lists/view.hbs:13
-msgid "Segment"
-msgstr ""
-
-#: views/lists/segments/view.hbs:7
-msgid "Match rules"
-msgstr ""
-
-#: views/lists/segments/view.hbs:8
-msgid "Matching subscribers"
-msgstr ""
-
-#: views/lists/segments/view.hbs:9
-msgid "show"
-msgstr ""
-
-#: views/lists/subscription/add.hbs:3 views/lists/subscription/add.hbs:4
-msgid "Add subscriber"
-msgstr "Feliratkozó hozzáadása"
-
-#: views/lists/subscription/add.hbs:5
-#: views/subscription/partials/subscription-custom-fields.hbs:1
-#: views/users/account.hbs:7
-msgid "Email Address"
-msgstr "Email cím"
-
-#: views/lists/subscription/add.hbs:8 views/lists/subscription/edit.hbs:9
-#: views/settings.hbs:80 views/settings.hbs:95
-#: views/subscription/partials/subscription-custom-fields.hbs:6
-msgid "Begins with"
-msgstr ""
-
-#: views/lists/subscription/add.hbs:9 views/lists/subscription/edit.hbs:10
-msgid ""
-"Insert a GPG public key that will be used to encrypt messages sent this "
-"subscriber"
-msgstr ""
-"Adjon meg egy GPG publikus kulcsot, amivel az üzenetek titkosítva lesznek "
-"küldéskor"
-
-#: views/lists/subscription/add.hbs:11 views/lists/subscription/edit.hbs:12
-#: views/lists/subscription/import-preview.hbs:9
-msgid "Timezone"
-msgstr "Időzóna"
-
-#: views/lists/subscription/add.hbs:13 views/lists/subscription/edit.hbs:13
-msgid "Test user?"
-msgstr "Teszt felhasználó?"
-
-#: views/lists/subscription/add.hbs:14 views/lists/subscription/edit.hbs:14
-msgid ""
-"If checked then this subscription can be used for previewing campaign "
-"messages"
-msgstr ""
-
-#: views/lists/subscription/add.hbs:15
-msgid ""
-"This person will not receive a confirmation email so make sure that you have "
-"permission to email them."
-msgstr ""
-
-#: views/lists/subscription/edit.hbs:3 views/lists/subscription/edit.hbs:4
-msgid "Edit subscriber"
-msgstr "Feliratkozó szerkesztése"
-
-#: views/lists/subscription/edit.hbs:5
-#: views/lists/subscription/import-failed.hbs:5
-msgid "Back to list"
-msgstr "Vissza a listához"
-
-#: views/lists/subscription/edit.hbs:6
-#: views/lists/subscription/import-preview.hbs:6
-#: views/subscription/partials/subscription-unsubscribe-form.hbs:1
-#: lib/helpers.js:42 lib/models/segments.js:11
-msgid "Email address"
-msgstr "Email cím"
-
-#: views/lists/subscription/edit.hbs:17
-msgid "Delete Subscription"
-msgstr "Feliratkozás törlése"
-
-#: views/lists/subscription/import-failed.hbs:3
-msgid "Import status"
-msgstr "Importálás státusza"
-
-#: views/lists/subscription/import-failed.hbs:4
-msgid "Failed addresses"
-msgstr "Hibás címek"
-
-#: views/lists/subscription/import-failed.hbs:6
-msgid ""
-"Role-based addresses like postmaster@example.com are blocked when importing. "
-"Subscribers with role-based email addresses can join your list using the "
-"subscription form"
-msgstr ""
-
-#: views/lists/subscription/import-failed.hbs:7
-msgid "see here"
-msgstr ""
-
-#: views/lists/subscription/import-failed.hbs:9
-msgid "Fail reason"
-msgstr "Hiba oka"
-
-#: views/lists/subscription/import-preview.hbs:3
-#: views/lists/subscription/import-preview.hbs:4
-#: views/lists/subscription/import.hbs:3 views/lists/subscription/import.hbs:4
-msgid "Import subscribers"
-msgstr "Feliratkozók imprtálása"
-
-#: views/lists/subscription/import-preview.hbs:10 views/users/api.hbs:21
-#: views/users/api.hbs:36 views/users/api.hbs:44 views/users/api.hbs:52
-#: views/users/api.hbs:64 views/users/api.hbs:75 views/users/api.hbs:83
-#: views/users/api.hbs:91 views/users/api.hbs:96 views/users/api.hbs:101
-#: views/users/api.hbs:106
-msgid "Example"
-msgstr "Példa"
-
-#: views/lists/subscription/import-preview.hbs:11
-msgid "Start import"
-msgstr "Importálás megkezdése"
-
-#: views/lists/subscription/import.hbs:5
-msgid "CSV File"
-msgstr "CSV file"
-
-#: views/lists/subscription/import.hbs:6
-msgid "The first line must contain column headings"
-msgstr "Az első sor fejlécet kell, hogy tartalmazzon"
-
-#: views/lists/subscription/import.hbs:7
-msgid "CSV delimiter"
-msgstr "CSV elválasztó"
-
-#: views/lists/subscription/import.hbs:8
-msgid "Categorize the imported subscribers as"
-msgstr ""
-
-#: views/lists/subscription/import.hbs:9 routes/lists.js:206
-msgid "Subscribed"
-msgstr ""
-
-#: views/lists/subscription/import.hbs:10
-msgid "Regular subscriber addresses"
-msgstr ""
-
-#: views/lists/subscription/import.hbs:11
-msgid "Subscribed (Force)"
-msgstr ""
-
-#: views/lists/subscription/import.hbs:12
-msgid "Regular subscriber addresses, resubscribe users that have unsubscribed"
-msgstr ""
-
-#: views/lists/subscription/import.hbs:14
-msgid "Suppressed emails that will be unsubscribed from your list"
-msgstr ""
-
-#: views/lists/subscription/import.hbs:15
-msgid "Check imported emails"
-msgstr ""
-
-#: views/lists/subscription/import.hbs:16 views/triggers/triggers.hbs:12
-msgid "Enabled"
-msgstr ""
-
-#: views/lists/subscription/import.hbs:17 views/triggers/triggers.hbs:13
-msgid "Disabled"
-msgstr ""
-
-#: views/lists/view.hbs:3
-msgid "Subscription Form"
-msgstr "Feliratkozós űrlap"
-
-#: views/lists/view.hbs:4
-msgid "List Actions"
-msgstr "Lista műveletek"
-
-#: views/lists/view.hbs:9 views/triggers/create-select.hbs:3
-#: views/triggers/create-select.hbs:4 views/triggers/create.hbs:3
-#: views/triggers/create.hbs:4 views/triggers/create.hbs:27
-#: views/triggers/triggers.hbs:3
-msgid "Create Trigger"
-msgstr ""
-
-#: views/lists/view.hbs:10
-msgid "Add Subscriber"
-msgstr "Feliratkozó hozzáadása"
-
-#: views/lists/view.hbs:11
-msgid "Import Subscribers"
-msgstr "Feliratkozók importálása"
-
-#: views/lists/view.hbs:15
-msgid "Create New Segment"
-msgstr ""
-
-#: views/lists/view.hbs:16
-msgid "Filter"
-msgstr "Szűrés"
-
-#: views/lists/view.hbs:17
-msgid "Subscriptions"
-msgstr ""
-
-#: views/lists/view.hbs:18
-msgid "Imports"
-msgstr ""
-
-#: views/lists/view.hbs:25 routes/campaigns.js:255 routes/lists.js:300
-msgid "Finished"
-msgstr "Befejezve"
-
-#: views/lists/view.hbs:27
-msgid "Added"
-msgstr "Hozzáadva"
-
-#: views/lists/view.hbs:28
-msgid "Updated"
-msgstr "Frissítve"
-
-#: views/lists/view.hbs:29
-msgid "Failed"
-msgstr ""
-
-#: views/lists/view.hbs:31
-msgid ""
-"Are you sure? This action should only be called to resolve stalled imports"
-msgstr ""
-
-#: views/lists/view.hbs:32
-msgid "Restart"
-msgstr "Újrakezdés"
-
-#: views/mosaico/editor.hbs:1 views/partials/merge-tag-reference.hbs:1
-msgid "Merge tag reference"
-msgstr ""
-
-#: views/mosaico/editor.hbs:4
-msgid "MOSAICO Responsive Email Designer"
-msgstr ""
-
-#: views/mosaico/editor.hbs:5
-msgid "Sucessfully saved"
-msgstr "Sikeres mentés"
-
-#: views/mosaico/editor.hbs:6
-msgid "An error occured while saving the document"
-msgstr "A dokumentum mentése közben hiba lépett fel."
-
-#: views/mosaico/editor.hbs:7
-msgid "Unsaved changes will be lost. Close now?"
-msgstr "Az el nem mentett változtatások el fognak veszni. Bezárja?"
-
-#: views/mosaico/editor.hbs:8 views/mosaico/editor.hbs:9
-msgid "Tags"
-msgstr "Címkék"
-
-#: views/partials/codeeditor.hbs:1 views/partials/grapejs.hbs:1
-#: views/partials/mosaico.hbs:1 views/partials/summernote.hbs:1
-msgid "Template content (HTML)"
-msgstr "Sablon tartalma (HTML)"
-
-#: views/partials/editor-navbar.hbs:1
-msgid "SAVE"
-msgstr "MENTÉS"
-
-#: views/partials/editor-navbar.hbs:2
-msgid "SAVING"
-msgstr "MENTÉS FOLYMATBAN"
-
-#: views/partials/editor-navbar.hbs:3
-msgid "CLOSE"
-msgstr "BEZÁRÁS"
-
-#: views/partials/grapejs.hbs:2
-msgid "Open GrapeJS"
-msgstr "GrapeJS megnyitása"
-
-#: views/partials/html-preview.hbs:1
-msgid "Toggle HTML preview"
-msgstr "HTML előnézet átváltása"
-
-#: views/partials/html-to-text.hbs:1
-msgid ""
-"To extract the text from HTML click here."
-msgstr ""
-
-#: views/partials/html-to-text.hbs:2
-msgid ""
-"Please note that your existing plaintext in the field above will be "
-"overwritten. This feature uses the Premailer API, a third party "
-"service. Their Terms of Service and Privacy Policy apply."
-msgstr ""
-
-#: views/partials/html-to-text.hbs:3
-msgid "An error occurred while talking to the server"
-msgstr ""
-
-#: views/partials/merge-tag-reference.hbs:2
-msgid ""
-"Merge tags are tags that are replaced before sending out the message. The "
-"format of the merge tag is the following: [TAG_NAME] or "
-"[TAG_NAME/fallback] where fallback is an optional "
-"text value used when TAG_NAME is empty."
-msgstr ""
-
-#: views/partials/modal-carousel.hbs:1
-msgid "{{title}}"
-msgstr ""
-
-#: views/partials/mosaico.hbs:2
-msgid "Open Mosaico"
-msgstr "Mosaico megnyitása"
-
-#: views/partials/plaintext.hbs:1
-msgid "Template content (plaintext)"
-msgstr "Sablon tartalma (sima szöveg)"
-
-#: views/report-templates/create.hbs:2 views/report-templates/edit.hbs:2
-#: views/report-templates/report-templates.hbs:2
-#: views/reports/create-select-template.hbs:2 views/reports/create.hbs:2
-#: views/reports/edit.hbs:2 views/reports/output.hbs:2
-#: views/reports/reports.hbs:2 views/reports/reports.hbs:5
-#: views/reports/view.hbs:2 lib/tools.js:144 routes/reports.js:31
-msgid "Reports"
-msgstr "Jelentések"
-
-#: views/report-templates/create.hbs:4 views/report-templates/create.hbs:6
-#: views/report-templates/report-templates.hbs:4 views/templates/create.hbs:3
-#: views/templates/create.hbs:4 views/templates/create.hbs:12
-#: views/templates/templates.hbs:3
-msgid "Create Template"
-msgstr "Sablon létrehozása"
-
-#: views/report-templates/create.hbs:5 routes/report-templates.js:231
-msgid "Create Report Template"
-msgstr "Jelentés sablon létrehozása"
-
-#: views/report-templates/edit.hbs:4 views/templates/edit.hbs:3
-#: views/templates/edit.hbs:4
-msgid "Edit Template"
-msgstr "Sablon szerkesztése"
-
-#: views/report-templates/edit.hbs:5 routes/report-templates.js:262
-msgid "Edit Report Template"
-msgstr "Jelentés sablon szerkesztése"
-
-#: views/report-templates/edit.hbs:6 views/templates/edit.hbs:12
-msgid "Delete Template"
-msgstr "Sablon törlése"
-
-#: views/report-templates/edit.hbs:7
-msgid "Update and Stay"
-msgstr ""
-
-#: views/report-templates/edit.hbs:8
-msgid "Update and Leave"
-msgstr ""
-
-#: views/report-templates/partials/report-template-fields.hbs:2
-msgid "Template Name"
-msgstr "Sablon neve"
-
-#: views/report-templates/partials/report-template-fields.hbs:6
-msgid "User selectable fields"
-msgstr ""
-
-#: views/report-templates/partials/report-template-fields.hbs:7
-msgid "Data processing code"
-msgstr ""
-
-#: views/report-templates/partials/report-template-fields.hbs:8
-msgid "Rendering template"
-msgstr ""
-
-#: views/report-templates/report-templates.hbs:5
-msgid "Blank"
-msgstr ""
-
-#: views/report-templates/report-templates.hbs:6
-msgid "All Subscribers"
-msgstr "Összes feliratkozó"
-
-#: views/report-templates/report-templates.hbs:7
-msgid "Grouped Subscribers"
-msgstr ""
-
-#: views/report-templates/report-templates.hbs:8
-msgid "Export List as CSV"
-msgstr "Lista exportálása CSV-be"
-
-#: views/report-templates/report-templates.hbs:9 views/reports/reports.hbs:4
-#: routes/report-templates.js:29
-msgid "Report Templates"
-msgstr "Jelentés sablonok"
-
-#: views/reports/create-select-template.hbs:3
-#: views/reports/create-select-template.hbs:4 views/reports/create.hbs:3
-#: views/reports/create.hbs:4 views/reports/create.hbs:5
-#: views/reports/reports.hbs:3 routes/reports.js:81
-msgid "Create Report"
-msgstr "Jelentés létrehozása"
-
-#: views/reports/edit.hbs:3 views/reports/edit.hbs:4 routes/reports.js:151
-msgid "Edit Report"
-msgstr "Jelentés szerkesztése"
-
-#: views/reports/edit.hbs:5
-msgid "Delete Report"
-msgstr "Jelentés törlése"
-
-#: views/reports/partials/report-fields.hbs:2
-msgid "Report Name"
-msgstr "Jelentés neve"
-
-#: views/reports/partials/report-fields.hbs:8
-#: views/reports/partials/report-fields.hbs:11
-msgid ""
-"Select a campaign in the table above by clicking on the respective row "
-"number."
-msgstr ""
-
-#: views/reports/partials/report-select-template.hbs:1
-msgid "Report Template"
-msgstr "Jelentés sablon"
-
-#: views/settings.hbs:5
-msgid "Service Address (URL)"
-msgstr "Szolgáltatás címe (URL)"
-
-#: views/settings.hbs:6
-msgid "Enter the URL this service can be reached from"
-msgstr "Adja meg az URL-t, amiről ez a szolgáltatás elérhető"
-
-#: views/settings.hbs:7
-msgid "Admin Email"
-msgstr "Admin email"
-
-#: views/settings.hbs:8
-msgid ""
-"Enter the email address that will be used as \"from\" for system messages"
-msgstr ""
-
-#: views/settings.hbs:9
-msgid "Disable WYSIWYG editor"
-msgstr ""
-
-#: views/settings.hbs:10
-msgid "If checked then message editor displays HTML code without the preview"
-msgstr ""
-
-#: views/settings.hbs:11
-msgid "Disable subscription confirmation messages"
-msgstr ""
-
-#: views/settings.hbs:12
-msgid ""
-"If checked then do not send a confirmation message that states the "
-"subscriber is now subscribed or unsubscribed. This does not disable double "
-"opt-in messages."
-msgstr ""
-
-#: views/settings.hbs:13
-msgid "Tracking ID"
-msgstr "Követő ID"
-
-#: views/settings.hbs:14
-msgid "Enter Google Analytics tracking code"
-msgstr "Google Analytics követőkód megadása"
-
-#: views/settings.hbs:15
-msgid "Frontpage shout out"
-msgstr ""
-
-#: views/settings.hbs:16
-msgid "HTML code shown in the front page header section"
-msgstr ""
-
-#: views/settings.hbs:17
-msgid "Campaign defaults"
-msgstr ""
-
-#: views/settings.hbs:18
-msgid "Sender name"
-msgstr "Küldő neve"
-
-#: views/settings.hbs:19
-msgid "Sender name, eg. My Awesome Company Ltd."
-msgstr "Küldő neve, pl.: Éncégem Kft."
-
-#: views/settings.hbs:20
-msgid "Default address"
-msgstr "Alapértelmezett postai cím"
-
-#: views/settings.hbs:21
-msgid ""
-"Contact address to provide, eg. 1234 Main Street, Anywhere, MA 01234, USA"
-msgstr ""
-
-#: views/settings.hbs:22
-msgid "Default \"from name\""
-msgstr ""
-
-#: views/settings.hbs:24
-msgid "Default \"from\" email"
-msgstr ""
-
-#: views/settings.hbs:26
-msgid "Default \"subject line\""
-msgstr ""
-
-#: views/settings.hbs:28
-msgid "Default homepage (URL)"
-msgstr ""
-
-#: views/settings.hbs:29
-msgid "URL to redirect the subscribed users to, eg. http://example.com/"
-msgstr ""
-
-#: views/settings.hbs:30
-msgid "Mailer Settings"
-msgstr ""
-
-#: views/settings.hbs:31
-msgid "These settings are required to send out e-mail messages"
-msgstr ""
-
-#: views/settings.hbs:32
-msgid "SMTP"
-msgstr "SMTP"
-
-#: views/settings.hbs:33
-msgid "AWS SES"
-msgstr "AWS SES"
-
-#: views/settings.hbs:34
-msgid "Use SMTP for sending mail"
-msgstr "SMTP használata levélküldéshez"
-
-#: views/settings.hbs:35
-msgid "Hostname"
-msgstr ""
-
-#: views/settings.hbs:36
-msgid "Port"
-msgstr "Port"
-
-#: views/settings.hbs:37
-msgid "Port, eg. 465. Autodetected if left blank"
-msgstr ""
-
-#: views/settings.hbs:38
-msgid "Encryption"
-msgstr "Titkosítás"
-
-#: views/settings.hbs:39
-msgid "Disable SMTP authentication"
-msgstr "SMTP azonosítás letiltása"
-
-#: views/settings.hbs:40 views/users/forgot.hbs:9 views/users/login.hbs:4
-#: views/users/login.hbs:5
-msgid "Username"
-msgstr "Felhasználónév"
-
-#: views/settings.hbs:41
-msgid "Username, eg. myaccount@example.com"
-msgstr "Felhasználónév, pl.: myaccount@example.com"
-
-#: views/settings.hbs:42 views/settings.hbs:43 views/users/login.hbs:6
-#: views/users/login.hbs:7
-msgid "Password"
-msgstr "Jelszó"
-
-#: views/settings.hbs:44
-msgid "Use SES API for sending mail"
-msgstr "SES API használata levélküldéshez"
-
-#: views/settings.hbs:45
-msgid "Access Key"
-msgstr ""
-
-#: views/settings.hbs:46
-msgid "AWS Access Key Id"
-msgstr ""
-
-#: views/settings.hbs:47
-msgid "Secret Key"
-msgstr ""
-
-#: views/settings.hbs:48
-msgid "AWS Secret Access Key"
-msgstr ""
-
-#: views/settings.hbs:49
-msgid "Region"
-msgstr "Régió"
-
-#: views/settings.hbs:50
-msgid "Checking"
-msgstr ""
-
-#: views/settings.hbs:51
-msgid "Check Mailer config"
-msgstr ""
-
-#: views/settings.hbs:52
-msgid "Advanced Mailer settings"
-msgstr ""
-
-#: views/settings.hbs:53
-msgid "Log SMTP transactions"
-msgstr "SMTP tranzakciók naplózása"
-
-#: views/settings.hbs:54
-msgid "Allow self-signed certificates"
-msgstr ""
-
-#: views/settings.hbs:55
-msgid "Max connections"
-msgstr ""
-
-#: views/settings.hbs:56
-msgid "The count of max connections, eg. 10"
-msgstr ""
-
-#: views/settings.hbs:57
-msgid ""
-"The count of maximum simultaneous connections to make against the SMTP "
-"server (defaults to 5). This limit is per sending process."
-msgstr ""
-
-#: views/settings.hbs:58
-msgid "Max messages"
-msgstr ""
-
-#: views/settings.hbs:59
-msgid "The count of max messages, eg. 100"
-msgstr ""
-
-#: views/settings.hbs:60
-msgid ""
-"The number of messages to send through a single connection before the "
-"connection is closed and reopened (defaults to 100)"
-msgstr ""
-
-#: views/settings.hbs:61
-msgid "Throttling"
-msgstr ""
-
-#: views/settings.hbs:62
-msgid "Messages per hour eg. 1000"
-msgstr ""
-
-#: views/settings.hbs:63
-msgid ""
-"Maximum number of messages to send in an hour. Leave empty or zero for no "
-"throttling. If your provider uses a different speed limit (messages/minute "
-"or messages/second) then convert this limit into messages/hour (1m/s => "
-"3600m/h). This limit is per sending process."
-msgstr ""
-
-#: views/settings.hbs:64
-msgid "VERP bounce handling"
-msgstr ""
-
-#: views/settings.hbs:65
-msgid ""
-"Mailtrain is able to use VERP based routing to detect bounces. In this case "
-"the message is sent to the recipient using a custom VERP address as the "
-"return path of the message. If the message is not accepted a bounce email is "
-"sent to this special VERP address and thus a bounce is detected."
-msgstr ""
-
-#: views/settings.hbs:66
-msgid ""
-"To get VERP working you need to set up a DNS MX record that points to your "
-"Mailtrain hostname. You must also ensure that Mailtrain VERP interface is "
-"available from port 25 of your server (port 25 usually requires root user "
-"privileges). This way if anyone tries to send email to someuser@verp-"
-"hostname then the email should end up to this server."
-msgstr ""
-
-#: views/settings.hbs:67
-msgid ""
-"VERP usually only works if you are using your own SMTP server. Regular relay "
-"services (SES, SparkPost, Gmail etc.) tend to remove the VERP address from "
-"the message."
-msgstr ""
-
-#: views/settings.hbs:68
-msgid "Use VERP to catch bounces"
-msgstr ""
-
-#: views/settings.hbs:69
-msgid "Server hostname"
-msgstr ""
-
-#: views/settings.hbs:70
-msgid "The VERP server hostname, eg. bounces.example.com"
-msgstr ""
-
-#: views/settings.hbs:71
-msgid ""
-"VERP bounce handling server hostname. This hostname is used in the SMTP "
-"envelope FROM address and the MX DNS records should point to this server"
-msgstr ""
-
-#: views/settings.hbs:72
-msgid ""
-"VERP bounce handling server is not enabled. Modify your server configuration "
-"file and restart server to enable it"
-msgstr ""
-
-#: views/settings.hbs:73
-msgid "GPG Signing"
-msgstr "GPG aláírás"
-
-#: views/settings.hbs:74
-msgid ""
-"Only messages that are encrypted can be signed. Subsribers who have not set "
-"up a GPG public key in their profile receive normal email messages. Users "
-"with GPG key set receive encrypted messages and if you have signing key also "
-"set, the messages are signed with this key."
-msgstr ""
-
-#: views/settings.hbs:75
-msgid ""
-"Do not use sensitive keys here. The private key and passphrase are not "
-"encrypted in the database."
-msgstr ""
-
-#: views/settings.hbs:76
-msgid "Private Key Passphrase"
-msgstr ""
-
-#: views/settings.hbs:77
-msgid "Passphrase for the key if set"
-msgstr ""
-
-#: views/settings.hbs:78
-msgid "Only fill this if your private key is encrypted with a passphrase"
-msgstr ""
-
-#: views/settings.hbs:79
-msgid "GPG Private Key"
-msgstr "GPG privát kulcs"
-
-#: views/settings.hbs:81
-msgid ""
-"This value is optional. If you do not provide a private key GPG encrypted "
-"messages are sent without signing."
-msgstr ""
-
-#: views/settings.hbs:82
-msgid "DKIM Signing by ZoneMTA"
-msgstr ""
-
-#: views/settings.hbs:83
-msgid ""
-"If you are using ZoneMTA then Mailtrain can provide a DKIM key for signing "
-"all outgoing messages. Other services usually provide their own means to "
-"DKIM sign your messages"
-msgstr ""
-
-#: views/settings.hbs:84
-msgid ""
-"Do not use sensitive keys here. The private key is not encrypted in the "
-"database."
-msgstr ""
-
-#: views/settings.hbs:85
-msgid "ZoneMTA DKIM API Key"
-msgstr ""
-
-#: views/settings.hbs:86
-msgid "Some secret value"
-msgstr ""
-
-#: views/settings.hbs:87
-msgid ""
-"Secret value known to ZoneMTA for requesting DKIM key information. If this "
-"value was generated by the Mailtrain installation script then you can keep "
-"it as it is"
-msgstr ""
-
-#: views/settings.hbs:88
-msgid "DKIM domain"
-msgstr ""
-
-#: views/settings.hbs:89
-msgid "Domain name for the DKIM key"
-msgstr ""
-
-#: views/settings.hbs:90
-msgid "Leave blank to use the sender email address domain"
-msgstr ""
-
-#: views/settings.hbs:91 views/settings.hbs:92
-msgid "DKIM key selector"
-msgstr ""
-
-#: views/settings.hbs:93
-msgid "Signing is disabled without a valid selector value"
-msgstr ""
-
-#: views/settings.hbs:94
-msgid "DKIM Private Key"
-msgstr ""
-
-#: views/settings.hbs:96
-msgid ""
-"This value is optional. If you do not provide a private key then messages "
-"are not signed."
-msgstr ""
-
-#: views/subscription/mail-already-subscribed-html.mjml.hbs:1
-#: views/subscription/mail-already-subscribed-text.hbs:1
-#: lib/models/subscriptions.js:174 lib/models/subscriptions.js:895
-msgid "Email address already registered"
-msgstr "Ezt az email címet már regisztrálták."
-
-#: views/subscription/mail-already-subscribed-html.mjml.hbs:2
-#: views/subscription/mail-already-subscribed-text.hbs:2
-msgid ""
-"We have received a subscription request. Your email address is however "
-"already registered."
-msgstr ""
-"Megkaptuk a feliratkozási kérelmét, viszont címe már eddig is regisztrálva "
-"volt."
-
-#: views/subscription/mail-already-subscribed-html.mjml.hbs:3
-#: views/subscription/mail-already-subscribed-text.hbs:3
-msgid ""
-"If you received this email by mistake, simply delete it. Your existing "
-"subscription won't be affected."
-msgstr ""
-"Ha véletlenül kapta ezt a levelet, egyszerűen törölje. A feliratkozás "
-"státusza nem fog változni."
-
-#: views/subscription/mail-already-subscribed-html.mjml.hbs:4
-#: views/subscription/mail-subscription-confirmed-html.mjml.hbs:3
-msgid "If you want to modify your subscription then you can "
-msgstr "Ha szeretné megváltoztatni feliratkozását, akkor"
-
-#: views/subscription/mail-already-subscribed-html.mjml.hbs:5
-#: views/subscription/mail-already-subscribed-text.hbs:5
-#: views/subscription/mail-subscription-confirmed-html.mjml.hbs:4
-#: views/subscription/mail-subscription-confirmed-text.hbs:4
-msgid "manage your preferences"
-msgstr "módosíthatja beállításait"
-
-#: views/subscription/mail-already-subscribed-html.mjml.hbs:6
-#: views/subscription/mail-already-subscribed-text.hbs:6
-#: views/subscription/mail-subscription-confirmed-html.mjml.hbs:5
-#: views/subscription/mail-subscription-confirmed-text.hbs:5
-#: views/users/login.hbs:10
-msgid "or"
-msgstr "vagy"
-
-#: views/subscription/mail-already-subscribed-html.mjml.hbs:7
-#: views/subscription/mail-already-subscribed-text.hbs:7
-#: views/subscription/mail-subscription-confirmed-html.mjml.hbs:6
-#: views/subscription/mail-subscription-confirmed-text.hbs:6
-msgid "unsubscribe here"
-msgstr "leiratkozhat itt"
-
-#: views/subscription/mail-already-subscribed-html.mjml.hbs:8
-#: views/subscription/mail-subscription-confirmed-html.mjml.hbs:7
-#: views/subscription/web-confirm-subscription-notice.mjml.hbs:3
-#: views/subscription/web-confirm-unsubscription-notice.mjml.hbs:3
-#: views/subscription/web-manual-unsubscribe-notice.mjml.hbs:4
-#: views/subscription/web-subscribed-notice.mjml.hbs:4
-#: views/subscription/web-unsubscribed-notice.mjml.hbs:3
-#: views/subscription/web-updated-notice.mjml.hbs:3
-msgid "Return to our website"
-msgstr "Visszatérés az odalunkra"
-
-#: views/subscription/mail-already-subscribed-html.mjml.hbs:9
-#: views/subscription/mail-already-subscribed-text.hbs:8
-#: views/subscription/mail-confirm-address-change-html.mjml.hbs:4
-#: views/subscription/mail-confirm-address-change-text.hbs:4
-#: views/subscription/mail-confirm-subscription-html.mjml.hbs:4
-#: views/subscription/mail-confirm-subscription-text.hbs:4
-#: views/subscription/mail-confirm-unsubscription-html.mjml.hbs:4
-#: views/subscription/mail-confirm-unsubscription-text.hbs:4
-#: views/subscription/mail-subscription-confirmed-html.mjml.hbs:8
-#: views/subscription/mail-subscription-confirmed-text.hbs:7
-#: views/subscription/mail-unsubscription-confirmed-html.mjml.hbs:5
-#: views/subscription/mail-unsubscription-confirmed-text.hbs:5
-msgid "For questions about this list, please contact:"
-msgstr "A listával kapcsolatos kérdéseivel itt tud megkeresni minket:"
-
-#: views/subscription/mail-already-subscribed-text.hbs:4
-#: views/subscription/mail-subscription-confirmed-text.hbs:3
-msgid "If you want to modify your subscription then you can:"
-msgstr "Ha szeretné megváltoztatni feliratkozását, akkor"
-
-#: views/subscription/mail-confirm-address-change-html.mjml.hbs:1
-#: views/subscription/mail-confirm-address-change-text.hbs:1
-msgid "Please Confirm Subscription Address Change"
-msgstr "Kérjük erősítse meg a feliratkozáshoz használt emailcímének változását"
-
-#: views/subscription/mail-confirm-address-change-html.mjml.hbs:2
-#: views/subscription/mail-confirm-address-change-text.hbs:2
-msgid "Yes, subscribe this email address to the list"
-msgstr "Igen, szeretnék feliratkozni a listára ezzel az email-lel."
-
-#: views/subscription/mail-confirm-address-change-html.mjml.hbs:3
-#: views/subscription/mail-confirm-subscription-html.mjml.hbs:3
-msgid ""
-"If you received this email by mistake, simply delete it. You won't be "
-"subscribed if you don't click the confirmation link above."
-msgstr ""
-"Ha nem ön kérte ezt a levelet, nyugodtan törölheti. Ha nem kattint a fenti "
-"linkre, továbbra is feliratkozva marad."
-
-#: views/subscription/mail-confirm-address-change-text.hbs:3
-#: views/subscription/mail-confirm-subscription-text.hbs:3
-msgid ""
-"If you received this email by mistake, simply delete it. You won't be "
-"subscribed unless you click the confirmation link above."
-msgstr ""
-"Ha nem ön kérte ezt a levelet, nyugodtan törölheti. Ha nem kattint a fenti "
-"linkre, nem vesszük fel a listára."
-
-#: views/subscription/mail-confirm-subscription-html.mjml.hbs:1
-#: views/subscription/mail-confirm-subscription-text.hbs:1
-#: views/subscription/mail-confirm-unsubscription-text.hbs:1
-#: routes/subscription.js:432
-msgid "Please Confirm Subscription"
-msgstr "Erősítse meg a feliratkozást"
-
-#: views/subscription/mail-confirm-subscription-html.mjml.hbs:2
-#: views/subscription/mail-confirm-subscription-text.hbs:2
-msgid "Yes, subscribe me to this list"
-msgstr "Igen, szeretnék feliratkozni a listára."
-
-#: views/subscription/mail-confirm-unsubscription-html.mjml.hbs:1
-msgid "Please Confirm Unsubscription"
-msgstr "Erősítse meg a leiratkozást"
-
-#: views/subscription/mail-confirm-unsubscription-html.mjml.hbs:2
-#: views/subscription/mail-confirm-unsubscription-text.hbs:2
-msgid "Yes, unsubscribe me from this list"
-msgstr "Igen, szeretnék leiratkozni a listáról."
-
-#: views/subscription/mail-confirm-unsubscription-html.mjml.hbs:3
-msgid ""
-"If you received this email by mistake, simply delete it. You won't be "
-"unsubscribed if you don't click the confirmation link above."
-msgstr ""
-"Ha nem ön kérte ezt a levelet, nyugodtan törölheti. Ha nem kattint a fenti "
-"linkre, továbbra is feliratkozva marad."
-
-#: views/subscription/mail-confirm-unsubscription-text.hbs:3
-msgid ""
-"If you received this email by mistake, simply delete it. You won't be "
-"unsubscribed unless you click the confirmation link above."
-msgstr ""
-"Ha nem ön kérte ezt a levelet, nyugodtan törölheti. Ha nem kattint a fenti "
-"linkre, továbbra is feliratkozva marad."
-
-#: views/subscription/mail-subscription-confirmed-html.mjml.hbs:1
-#: views/subscription/mail-subscription-confirmed-text.hbs:1
-#: views/subscription/web-subscribed-notice.mjml.hbs:1
-msgid "Subscription Confirmed"
-msgstr "Feliratkozás megerősítve"
-
-#: views/subscription/mail-subscription-confirmed-html.mjml.hbs:2
-msgid "Your subscription to our list has been confirmed"
-msgstr "A listára való feliratkozása megerősítve."
-
-#: views/subscription/mail-subscription-confirmed-text.hbs:2
-#: views/subscription/web-subscribed-notice.mjml.hbs:2
-msgid "Your subscription to our list has been confirmed."
-msgstr "A listára való feliratkozása megerősítve."
-
-#: views/subscription/mail-unsubscription-confirmed-html.mjml.hbs:1
-#: views/subscription/mail-unsubscription-confirmed-text.hbs:1
-msgid "You Are Now Unsubscribed"
-msgstr "Leiratkozott a listáról."
-
-#: views/subscription/mail-unsubscription-confirmed-html.mjml.hbs:2
-msgid "We have removed your email address from our list"
-msgstr "Email címét eltávolítottuk a listánkról."
-
-#: views/subscription/mail-unsubscription-confirmed-html.mjml.hbs:3
-#: views/subscription/mail-unsubscription-confirmed-text.hbs:3
-msgid "If you unsubscribed by mistake, you can re-subscribe at:"
-msgstr "Ha véletlenül iratkozott le, újra feliratkozhat itt:"
-
-#: views/subscription/mail-unsubscription-confirmed-text.hbs:2
-msgid "We have removed your email address from our list."
-msgstr "Email címét eltávolítottuk a listánkról."
-
-#: views/subscription/partials/subscription-custom-fields.hbs:2
-msgid "want to change it?"
-msgstr "meg akarja változtatni?"
-
-#: views/subscription/partials/subscription-custom-fields.hbs:5
-msgid "Download signature verification key"
-msgstr ""
-
-#: views/subscription/partials/subscription-custom-fields.hbs:7
-msgid ""
-"Insert your GPG public key here to encrypt messages sent to your address"
-msgstr "Adja meg publikus GPG kulcsát, hogy kódolt üzeneteket küldhessünk"
-
-#: views/subscription/partials/subscription-custom-fields.hbs:8
-msgid "optional"
-msgstr "nem kötelező"
-
-#: views/subscription/partials/subscription-flash-messages.hbs:1
-#: views/subscription/partials/subscription-flash-messages.hbs:3
-msgid "Warning!"
-msgstr "Figyelem!"
-
-#: views/subscription/partials/subscription-flash-messages.hbs:2
-msgid "If JavaScript was not enabled then no confirmation message was sent"
-msgstr ""
-"Ha a JavaScript nem volt engedélyezve, akkor nem küldünk megerősítő levelet."
-
-#: views/subscription/partials/subscription-flash-messages.hbs:4
-msgid "JavaScript must be enabled in order for this form to work"
-msgstr "Engedélyezni kell a JavaScriptet az űrlap használatához."
-
-#: views/subscription/partials/subscription-manage-address-form.hbs:1
-msgid "Existing Email Address"
-msgstr "Eddigi email cím"
-
-#: views/subscription/partials/subscription-manage-address-form.hbs:2
-msgid "New Email Address"
-msgstr "Új email cím"
-
-#: views/subscription/partials/subscription-manage-address-form.hbs:3
-msgid "Your new email address"
-msgstr "Az ön új email címe"
-
-#: views/subscription/partials/subscription-manage-address-form.hbs:4
-msgid ""
-"You will receive a confirmation request to your new email address that you "
-"need to accept before your email is actually changed"
-msgstr ""
-"Küldünk egy megerősítést kérő üzenetet az új email címére. Az új cím csak "
-"akkor lép érvénybe, ha az üzenetben rákattint a megerősítésre."
-
-#: views/subscription/partials/subscription-manage-address-form.hbs:5
-#: views/subscription/web-manage-address.mjml.hbs:2
-msgid "Update Email Address"
-msgstr "Email cím cseréje"
-
-#: views/subscription/partials/subscription-manage-form.hbs:1
-#: views/subscription/web-manage.mjml.hbs:2
-msgid "Update Profile"
-msgstr "Profil frissítése"
-
-#: views/subscription/partials/subscription-subscribe-form.hbs:1
-#: views/subscription/web-subscribe.mjml.hbs:2
-#: views/subscription/widget-subscribe.hbs:1
-msgid "Subscribe to list"
-msgstr "Feliratkozás"
-
-#: views/subscription/web-confirm-subscription-notice.mjml.hbs:1
-#: views/subscription/web-confirm-unsubscription-notice.mjml.hbs:1
-#: views/subscription/widget-subscribe.hbs:4
-msgid "Almost Finished"
-msgstr "Majdnem kész"
-
-#: views/subscription/web-confirm-subscription-notice.mjml.hbs:2
-#: views/subscription/widget-subscribe.hbs:5
-msgid ""
-"We need to confirm your email address. To complete the subscription process, "
-"please click the link in the email we just sent you."
-msgstr ""
-"Meg kell erősítenie email címét. A feliratkozás befejezéséhez kattintson a "
-"linkre, amit a megerősítést kérő üzenetben küldtünk."
-
-#: views/subscription/web-confirm-unsubscription-notice.mjml.hbs:2
-msgid ""
-"We need to confirm your email address. To complete the unsubscription "
-"process, please click the link in the email we just sent you."
-msgstr ""
-"Meg kell erősítenie email címét. A leiratkozás befejezéséhez kattintson a "
-"linkre, amit a megerősítést kérő üzenetben küldtünk."
-
-#: views/subscription/web-manage-address.mjml.hbs:1
-msgid "Update Your Email Address"
-msgstr "Email cím frissítése"
-
-#: views/subscription/web-manage.mjml.hbs:1
-msgid "Update Your Preferences"
-msgstr "Beállítások frissítése"
-
-#: views/subscription/web-manual-unsubscribe-notice.mjml.hbs:1
-msgid "Online Unsubscription Is Not Possible"
-msgstr "Nem lehetséges az online feliratkozás."
-
-#: views/subscription/web-manual-unsubscribe-notice.mjml.hbs:2
-msgid "Please contact us at"
-msgstr "Vegye fel velünk a kapcsolatot itt:"
-
-#: views/subscription/web-manual-unsubscribe-notice.mjml.hbs:3
-msgid "to get removed from the list"
-msgstr "hogy eltávolítsuk a listáról."
-
-#: views/subscription/web-subscribe.mjml.hbs:1
-msgid "Subscribe to List"
-msgstr "Feliratkozás a listára"
-
-#: views/subscription/web-subscribed-notice.mjml.hbs:3
-msgid "Thank you for subscribing!"
-msgstr "Köszönjük, hogy feliratkozott!"
-
-#: views/subscription/web-unsubscribed-notice.mjml.hbs:1
-msgid "Unsubscribe Successful"
-msgstr "Sikeresen leiratkozott."
-
-#: views/subscription/web-unsubscribed-notice.mjml.hbs:2
-msgid "You have been removed from:"
-msgstr "El lett távolítva innen:"
-
-#: views/subscription/web-updated-notice.mjml.hbs:1
-msgid "Profile Updated"
-msgstr "Profil frissítve."
-
-#: views/subscription/web-updated-notice.mjml.hbs:2
-msgid "Your profile information has been updated."
-msgstr "A profilja frissült."
-
-#: views/subscription/widget-subscribe.hbs:2
-msgid "Sending ..."
-msgstr "Küldés..."
-
-#: views/subscription/widget-subscribe.hbs:3
-msgid "It looks like you are already subscribed to this list."
-msgstr "Úgy tűnik, korábban már feliratkozott a listára."
-
-#: views/templates/create.hbs:5 views/templates/edit.hbs:6
-msgid "Template name"
-msgstr "Sablon neve"
-
-#: views/templates/create.hbs:6 views/templates/edit.hbs:7
-msgid "Name for this template, eg. Newsletter"
-msgstr ""
-
-#: views/templates/create.hbs:7
-msgid "HTML Editor"
-msgstr "HTML szerkesztő"
-
-#: views/templates/create.hbs:10 views/templates/edit.hbs:9
-msgid "Optional comments about this template"
-msgstr ""
-
-#: views/templates/edit.hbs:5
-msgid "Back to templates"
-msgstr ""
-
-#: views/templates/edit.hbs:11
-msgid "Duplicate"
-msgstr "Duplikálás"
-
-#: views/triggers/create-select.hbs:2 views/triggers/create.hbs:2
-#: views/triggers/edit.hbs:2 views/triggers/triggered.hbs:2
-#: views/triggers/triggers.hbs:2 views/triggers/triggers.hbs:4
-msgid "Automation Triggers"
-msgstr ""
-
-#: views/triggers/create-select.hbs:5
-msgid "Select a list for the trigger"
-msgstr ""
-
-#: views/triggers/create.hbs:5 views/triggers/edit.hbs:6
-msgid "Trigger name"
-msgstr ""
-
-#: views/triggers/create.hbs:6 views/triggers/edit.hbs:7
-msgid "Name for this trigger, eg. Inactive subscribers"
-msgstr ""
-
-#: views/triggers/create.hbs:8 views/triggers/edit.hbs:9
-msgid "Optional comments about this trigger"
-msgstr ""
-
-#: views/triggers/create.hbs:12 views/triggers/edit.hbs:14
-msgid "Trigger rule"
-msgstr ""
-
-#: views/triggers/create.hbs:13 views/triggers/edit.hbs:15
-msgid "Trigger fires"
-msgstr ""
-
-#: views/triggers/create.hbs:14 views/triggers/edit.hbs:16
-msgid "days after:"
-msgstr ""
-
-#: views/triggers/create.hbs:16 views/triggers/create.hbs:21
-#: views/triggers/edit.hbs:18 views/triggers/edit.hbs:23
-msgid "Event"
-msgstr "Esemény"
-
-#: views/triggers/create.hbs:18 views/triggers/create.hbs:19
-#: views/triggers/create.hbs:25 views/triggers/edit.hbs:20
-#: views/triggers/edit.hbs:21 views/triggers/edit.hbs:27
-msgid "Campaign"
-msgstr "Kampány"
-
-#: views/triggers/create.hbs:23 views/triggers/edit.hbs:25
-msgid "Trigger action"
-msgstr ""
-
-#: views/triggers/create.hbs:24 views/triggers/edit.hbs:26
-msgid "Send campaign"
-msgstr ""
-
-#: views/triggers/edit.hbs:3 views/triggers/edit.hbs:4
-msgid "Edit Trigger"
-msgstr ""
-
-#: views/triggers/edit.hbs:5
-msgid "Back to triggers"
-msgstr ""
-
-#: views/triggers/edit.hbs:11
-msgid "Trigger is enabled"
-msgstr ""
-
-#: views/triggers/edit.hbs:29
-msgid "Delete Trigger"
-msgstr ""
-
-#: views/triggers/triggered.hbs:3
-msgid "Triggered"
-msgstr ""
-
-#: views/triggers/triggered.hbs:4
-msgid "Triggered subscribers"
-msgstr ""
-
-#: views/triggers/triggered.hbs:5
-msgid "Subscribers who caused this trigger to fire"
-msgstr ""
-
-#: views/triggers/triggered.hbs:9
-msgid "Triggered time"
-msgstr ""
-
-#: views/triggers/triggers.hbs:9
-msgid "Trigger"
-msgstr ""
-
-#: views/triggers/triggers.hbs:10
-msgid "Target Campaign"
-msgstr ""
-
-#: views/triggers/triggers.hbs:11
-msgid "Triggered count"
-msgstr ""
-
-#: views/users/account.hbs:4
-msgid "This account is managed through LDAP."
-msgstr ""
-
-#: views/users/account.hbs:5
-msgid "Associated Email Address"
-msgstr ""
-
-#: views/users/account.hbs:8
-msgid "Your e-mail address"
-msgstr ""
-
-#: views/users/account.hbs:9
-msgid ""
-"This address is used for account recovery in case you lose your password"
-msgstr ""
-
-#: views/users/account.hbs:10
-msgid "Password change"
-msgstr ""
-
-#: views/users/account.hbs:11
-msgid ""
-"You only need to fill out this form if you want to change your current "
-"password"
-msgstr ""
-
-#: views/users/account.hbs:12 views/users/account.hbs:13
-msgid "Current Password"
-msgstr ""
-
-#: views/users/account.hbs:14 views/users/account.hbs:15
-#: views/users/reset.hbs:6 views/users/reset.hbs:7
-msgid "New Password"
-msgstr ""
-
-#: views/users/account.hbs:16 views/users/reset.hbs:8
-msgid "Confirm Password"
-msgstr ""
-
-#: views/users/account.hbs:17 views/users/reset.hbs:9
-msgid "Confirm New Password"
-msgstr ""
-
-#: views/users/api.hbs:4
-msgid "Are you sure? Resetting would invalidate the currently existing token."
-msgstr ""
-
-#: views/users/api.hbs:5
-msgid "Are you sure?"
-msgstr ""
-
-#: views/users/api.hbs:6
-msgid "Reset Access Token"
-msgstr ""
-
-#: views/users/api.hbs:7
-msgid "Generate Access Token"
-msgstr ""
-
-#: views/users/api.hbs:8
-msgid "Personal access token:"
-msgstr ""
-
-#: views/users/api.hbs:9
-msgid "Access token not yet generated"
-msgstr ""
-
-#: views/users/api.hbs:10
-msgid "Notes about the API"
-msgstr ""
-
-#: views/users/api.hbs:11
-msgid ""
-"API response is a JSON structure with error and data"
-"code> properties. If the response error has a value set then "
-"the request failed."
-msgstr ""
-
-#: views/users/api.hbs:12
-msgid ""
-"You need to define proper Content-Type when making a request. "
-"You can either use application/x-www-form-urlencoded for normal "
-"form data or application/json for a JSON payload. Using "
-"multipart/form-data is not supported."
-msgstr ""
-
-#: views/users/api.hbs:13
-msgid "Get list of subscriptions"
-msgstr ""
-
-#: views/users/api.hbs:14
-msgid ""
-"Retrieve a list of subscriptions to the list referenced by :listId. All "
-"fields of the subscribers will be returned. Note that custom fields will "
-"have generated names."
-msgstr ""
-
-#: views/users/api.hbs:15 views/users/api.hbs:24 views/users/api.hbs:26
-#: views/users/api.hbs:39 views/users/api.hbs:41 views/users/api.hbs:47
-#: views/users/api.hbs:49 views/users/api.hbs:55 views/users/api.hbs:57
-#: views/users/api.hbs:67 views/users/api.hbs:78 views/users/api.hbs:80
-#: views/users/api.hbs:86 views/users/api.hbs:88 views/users/api.hbs:94
-#: views/users/api.hbs:99 views/users/api.hbs:104
-msgid "arguments"
-msgstr ""
-
-#: views/users/api.hbs:16 views/users/api.hbs:25 views/users/api.hbs:40
-#: views/users/api.hbs:48 views/users/api.hbs:56 views/users/api.hbs:68
-#: views/users/api.hbs:79 views/users/api.hbs:87 views/users/api.hbs:95
-#: views/users/api.hbs:100 views/users/api.hbs:105
-msgid "your personal access token"
-msgstr ""
-
-#: views/users/api.hbs:17 views/users/api.hbs:69
-msgid "Start position"
-msgstr ""
-
-#: views/users/api.hbs:18 views/users/api.hbs:70
-msgid "optional, default 0"
-msgstr ""
-
-#: views/users/api.hbs:19
-msgid "limit subscription count in response"
-msgstr ""
-
-#: views/users/api.hbs:20 views/users/api.hbs:72
-msgid "optional, default 10000"
-msgstr ""
-
-#: views/users/api.hbs:22
-msgid "Add subscription"
-msgstr ""
-
-#: views/users/api.hbs:23
-msgid ""
-"This API call either inserts a new subscription or updates existing. Fields "
-"not included are left as is, so if you update only LAST_NAME value, then "
-"FIRST_NAME is kept untouched for an existing subscription."
-msgstr ""
-
-#: views/users/api.hbs:27 views/users/api.hbs:42 views/users/api.hbs:50
-msgid "subscriber's email address"
-msgstr ""
-
-#: views/users/api.hbs:28 views/users/api.hbs:43 views/users/api.hbs:51
-#: views/users/api.hbs:59 views/users/api.hbs:82 views/users/api.hbs:90
-msgid "required"
-msgstr ""
-
-#: views/users/api.hbs:29
-msgid "subscriber's first name"
-msgstr "feliratkozó keresztneve"
-
-#: views/users/api.hbs:30
-msgid "subscriber's last name"
-msgstr "feliratkozó vezetékneve"
-
-#: views/users/api.hbs:31
-msgid ""
-"subscriber's timezone (eg. \"Europe/Tallinn\", \"PST\" or \"UTC\"). If not "
-"set defaults to \"UTC\""
-msgstr ""
-"Feliratkozó időzónája (pl.: \"Europe/Budapest\", \"CEST\", \"UTC\"). "
-"Alapértelmezés szerint \"UTC\"."
-
-#: views/users/api.hbs:32
-msgid ""
-"custom field value. Use yes/no for option group values (checkboxes, radios, "
-"drop downs)"
-msgstr ""
-
-#: views/users/api.hbs:33
-msgid "Additional POST arguments"
-msgstr ""
-
-#: views/users/api.hbs:34
-msgid ""
-"set to \"yes\" if you want to make sure the email is marked as subscribed "
-"even if it was previously marked as unsubscribed. If the email was already "
-"unsubscribed/blocked then subscription status is not changed"
-msgstr ""
-
-#: views/users/api.hbs:35
-msgid ""
-"set to \"yes\" if you want to send confirmation email to the subscriber "
-"before actually marking as subscribed"
-msgstr ""
-
-#: views/users/api.hbs:37
-msgid "Remove subscription"
-msgstr ""
-
-#: views/users/api.hbs:38
-msgid "This API call marks a subscription as unsubscribed"
-msgstr ""
-
-#: views/users/api.hbs:45
-msgid "Delete subscription"
-msgstr ""
-
-#: views/users/api.hbs:46
-msgid "This API call deletes a subscription"
-msgstr ""
-
-#: views/users/api.hbs:53
-msgid "Add new custom field"
-msgstr ""
-
-#: views/users/api.hbs:54
-msgid "This API call creates a new custom field for a list."
-msgstr ""
-
-#: views/users/api.hbs:58
-msgid "field name"
-msgstr ""
-
-#: views/users/api.hbs:60
-msgid "one of the following types:"
-msgstr ""
-
-#: views/users/api.hbs:61
-msgid ""
-"If the type is 'option' then you also need to specify the parent element ID"
-msgstr ""
-
-#: views/users/api.hbs:62
-msgid ""
-"Template for the group element. If not set, then values of the elements are "
-"joined with commas"
-msgstr ""
-
-#: views/users/api.hbs:63
-msgid ""
-"if not visible then the subscriber can not view or modify this value at the "
-"profile page"
-msgstr ""
-
-#: views/users/api.hbs:65
-msgid "Get list of blacklisted emails"
-msgstr ""
-
-#: views/users/api.hbs:66
-msgid "This API call get list of blacklisted emails."
-msgstr ""
-
-#: views/users/api.hbs:71
-msgid "limit emails count in response"
-msgstr ""
-
-#: views/users/api.hbs:73
-msgid "filter by part of email"
-msgstr ""
-
-#: views/users/api.hbs:74
-msgid "optional, default ''"
-msgstr ""
-
-#: views/users/api.hbs:77
-msgid "This API call either add emails to blacklist"
-msgstr ""
-
-#: views/users/api.hbs:81 views/users/api.hbs:89
-msgid "email address"
-msgstr ""
-
-#: views/users/api.hbs:84
-msgid "Delete email from blacklist"
-msgstr ""
-
-#: views/users/api.hbs:85
-msgid "This API call either delete emails from blacklist"
-msgstr ""
-
-#: views/users/api.hbs:92
-msgid "Get the lists a user has subscribed to"
-msgstr ""
-
-#: views/users/api.hbs:93
-msgid "Retrieve the lists that the user with :email has subscribed to. "
-msgstr ""
-
-#: views/users/api.hbs:97
-msgid "Get all lists"
-msgstr ""
-
-#: views/users/api.hbs:98
-msgid "Retrieve every list. "
-msgstr ""
-
-#: views/users/api.hbs:102
-msgid "Get list by id"
-msgstr ""
-
-#: views/users/api.hbs:103
-msgid "Retrieve the list with :id "
-msgstr ""
-
-#: views/users/forgot.hbs:3 views/users/reset.hbs:3
-msgid "Password Reset"
-msgstr ""
-
-#: views/users/forgot.hbs:4
-msgid "Reset your password?"
-msgstr ""
-
-#: views/users/forgot.hbs:5
-msgid "Accounts are managed through LDAP."
-msgstr ""
-
-#: views/users/forgot.hbs:6 views/users/reset.hbs:10
-msgid "Reset Password"
-msgstr ""
-
-#: views/users/forgot.hbs:7
-msgid ""
-"Please provide the username or email address that you used when you signed "
-"up for your Mailtrain account."
-msgstr ""
-
-#: views/users/forgot.hbs:8
-msgid "We will send you an email that will allow you to reset your password."
-msgstr ""
-
-#: views/users/forgot.hbs:10
-msgid "Username or email address"
-msgstr ""
-
-#: views/users/forgot.hbs:11
-msgid "Send verification email"
-msgstr ""
-
-#: views/users/login.hbs:8
-msgid "Remember me"
-msgstr "Emlékezzen rám"
-
-#: views/users/login.hbs:11 views/users/login.hbs:12
-msgid "Forgot password?"
-msgstr "Elfelejtett jelszó"
-
-#: views/users/reset.hbs:4
-msgid "Choose your new password"
-msgstr ""
-
-#: views/users/reset.hbs:5
-msgid "Please enter a new password."
-msgstr ""
-
-#: lib/editor-helpers.js:17 routes/templates.js:95
-msgid "Could not find template with specified ID"
-msgstr ""
-
-#: lib/editor-helpers.js:33 routes/archive.js:145 routes/campaigns.js:131
-#: routes/campaigns.js:284 routes/campaigns.js:379 routes/campaigns.js:427
-#: routes/campaigns.js:467 routes/campaigns.js:844 routes/campaigns.js:867
-#: routes/campaigns.js:886 routes/campaigns.js:908 routes/triggers.js:146
-msgid "Could not find campaign with specified ID"
-msgstr ""
-
-#: lib/editor-helpers.js:47 routes/editorapi.js:320
-msgid "Invalid resource type"
-msgstr ""
-
-#: lib/feed.js:31
-msgid "Bad status code %s"
-msgstr ""
-
-#: lib/helpers.js:33
-msgid "URL that points to the unsubscribe page"
-msgstr ""
-
-#: lib/helpers.js:36
-msgid "URL that points to the preferences page of the subscriber"
-msgstr ""
-
-#: lib/helpers.js:39
-msgid "URL to preview the message in a browser"
-msgstr ""
-
-#: lib/helpers.js:45 lib/models/segments.js:31
-msgid "First name"
-msgstr "Keresztnév"
-
-#: lib/helpers.js:48 lib/models/segments.js:35
-msgid "Last name"
-msgstr "Vezetéknév"
-
-#: lib/helpers.js:51
-msgid "Full name (first and last name combined)"
-msgstr "Teljes név (vezetéknév + keresztnév)"
-
-#: lib/helpers.js:54
-msgid "Unique ID that identifies the recipient"
-msgstr ""
-
-#: lib/helpers.js:57
-msgid "Unique ID that identifies the list used for this campaign"
-msgstr ""
-
-#: lib/helpers.js:60
-msgid "Unique ID that identifies current campaign"
-msgstr ""
-
-#: lib/helpers.js:68 lib/helpers.js:80
-msgid "content from an RSS entry"
-msgstr ""
-
-#: lib/helpers.js:71
-msgid "RSS entry title"
-msgstr ""
-
-#: lib/helpers.js:74
-msgid "RSS entry date"
-msgstr ""
-
-#: lib/helpers.js:77
-msgid "RSS entry link"
-msgstr ""
-
-#: lib/helpers.js:83
-msgid "RSS entry summary"
-msgstr ""
-
-#: lib/helpers.js:86
-msgid "RSS entry image URL"
-msgstr ""
-
-#: lib/mailer.js:245
-msgid "Invalid mail transport"
-msgstr ""
-
-#: lib/models/campaigns.js:105 lib/models/campaigns.js:132
-#: lib/models/campaigns.js:205 lib/models/campaigns.js:328
-#: lib/models/campaigns.js:590 lib/models/campaigns.js:723
-msgid "Missing Campaign ID"
-msgstr ""
-
-#: lib/models/campaigns.js:241
-msgid "Emtpy or too large attahcment"
-msgstr ""
-
-#: lib/models/campaigns.js:408 lib/models/campaigns.js:600
-msgid "Campaign Name must be set"
-msgstr ""
-
-#: lib/models/campaigns.js:412
-msgid "RSS URL must be set and needs to be a valid URL"
-msgstr ""
-
-#: lib/models/campaigns.js:568
-msgid "Selected template not found"
-msgstr ""
-
-#: lib/models/campaigns.js:924
-msgid "Invalid or missing message ID"
-msgstr ""
-
-#: lib/models/campaigns.js:1065
-msgid "Unrecognized message status"
-msgstr ""
-
-#: lib/models/confirmations.js:27
-msgid "Could not store confirmation data"
-msgstr ""
-
-#: lib/models/fields.js:24
-msgid "Drop Down"
-msgstr ""
-
-#: lib/models/fields.js:25
-msgid "Date (MM/DD/YYY)"
-msgstr "Dátum (NN/HH/ÉÉÉÉ)"
-
-#: lib/models/fields.js:29
-msgid "JSON value for custom rendering"
-msgstr ""
-
-#: lib/models/fields.js:30
-msgid "Option"
-msgstr ""
-
-#: lib/models/fields.js:53 lib/models/fields.js:98 lib/models/fields.js:123
-#: lib/models/forms.js:46 lib/models/lists.js:115 lib/models/lists.js:150
-#: lib/models/lists.js:265 lib/models/segments.js:43 lib/models/segments.js:176
-#: lib/models/subscriptions.js:79 lib/models/subscriptions.js:390
-#: lib/models/subscriptions.js:566 lib/models/subscriptions.js:657
-#: lib/models/subscriptions.js:710 lib/models/subscriptions.js:773
-#: lib/models/subscriptions.js:816
-msgid "Missing List ID"
-msgstr ""
-
-#: lib/models/fields.js:129
-msgid "Option field requires a group to be selected"
-msgstr ""
-
-#: lib/models/fields.js:149 lib/models/fields.js:199
-msgid "Missing Field ID"
-msgstr ""
-
-#: lib/models/fields.js:153 lib/models/segments.js:185
-#: lib/models/segments.js:225
-msgid "Field Name must be set"
-msgstr ""
-
-#: lib/models/fields.js:216
-msgid "Custom field not found"
-msgstr ""
-
-#: lib/models/fields.js:289
-msgid "Unknown column type %s"
-msgstr ""
-
-#: lib/models/fields.js:293
-msgid "Missing column name"
-msgstr ""
-
-#: lib/models/fields.js:297
-msgid "Missing list ID"
-msgstr ""
-
-#: lib/models/fields.js:305
-msgid "Provided List ID not found"
-msgstr ""
-
-#: lib/models/forms.js:70 lib/models/forms.js:113 lib/models/forms.js:201
-#: lib/models/forms.js:291
-msgid "Missing Form ID"
-msgstr ""
-
-#: lib/models/forms.js:121 lib/models/forms.js:205
-msgid "Form Name must be set"
-msgstr ""
-
-#: lib/models/forms.js:307
-msgid "Custom form not found"
-msgstr ""
-
-#: lib/models/links.js:337 routes/campaigns.js:533 routes/campaigns.js:581
-#: routes/campaigns.js:621 routes/campaigns.js:671 services/sender.js:305
-msgid "Campaign not found"
-msgstr ""
-
-#: lib/models/links.js:345 routes/lists.js:181 services/sender.js:312
-msgid "List not found"
-msgstr "Lista nem található."
-
-#: lib/models/links.js:353
-msgid "Subscription not found"
-msgstr ""
-
-#: lib/models/lists.js:167 lib/models/lists.js:211
-msgid "List Name must be set"
-msgstr ""
-
-#: lib/models/lists.js:294
-msgid "Missing List CID"
-msgstr ""
-
-#: lib/models/report-templates.js:26 lib/models/report-templates.js:70
-#: lib/models/report-templates.js:142
-msgid "Missing report template ID"
-msgstr ""
-
-#: lib/models/report-templates.js:77
-msgid "Report template name must be set"
-msgstr ""
-
-#: lib/models/reports.js:40 lib/models/reports.js:110 lib/models/reports.js:188
-msgid "Missing report ID"
-msgstr ""
-
-#: lib/models/reports.js:116
-msgid "Report name must be set"
-msgstr ""
-
-#: lib/models/segments.js:15
-msgid "Signup country"
-msgstr ""
-
-#: lib/models/segments.js:19 lib/models/triggers.js:12
-msgid "Sign up date"
-msgstr "Feliratkozás ideje"
-
-#: lib/models/segments.js:23 lib/models/triggers.js:16
-msgid "Latest open"
-msgstr ""
-
-#: lib/models/segments.js:27 lib/models/triggers.js:20
-msgid "Latest click"
-msgstr ""
-
-#: lib/models/segments.js:69 lib/models/segments.js:216
-#: lib/models/segments.js:256 lib/models/segments.js:278
-msgid "Missing Segment ID"
-msgstr ""
-
-#: lib/models/segments.js:85 lib/models/segments.js:549
-#: lib/models/segments.js:658
-msgid "Segment not found"
-msgstr ""
-
-#: lib/models/segments.js:146 lib/models/segments.js:147
-#: lib/models/segments.js:408 lib/models/segments.js:409
-msgid "%s days after today"
-msgstr ""
-
-#: lib/models/segments.js:146 lib/models/segments.js:147
-#: lib/models/segments.js:408 lib/models/segments.js:409
-msgid "%s days before today"
-msgstr ""
-
-#: lib/models/segments.js:148 lib/models/segments.js:410
-msgid "today"
-msgstr ""
-
-#: lib/models/segments.js:189 lib/models/segments.js:229
-msgid "Invalid segment rule type"
-msgstr ""
-
-#: lib/models/segments.js:289 lib/models/segments.js:454 routes/segments.js:266
-#: routes/segments.js:300 routes/segments.js:370 routes/segments.js:381
-msgid "Selected segment not found"
-msgstr ""
-
-#: lib/models/segments.js:294 lib/models/segments.js:459 routes/segments.js:272
-#: routes/segments.js:306 routes/segments.js:387
-msgid "Invalid rule type"
-msgstr ""
-
-#: lib/models/segments.js:358 lib/models/segments.js:434
-#: lib/models/segments.js:524
-msgid "Missing Rule ID"
-msgstr ""
-
-#: lib/models/segments.js:374
-msgid "Specified rule not found"
-msgstr ""
-
-#: lib/models/segments.js:385
-msgid "Specified segment not found"
-msgstr ""
-
-#: lib/models/segments.js:445
-msgid "Selected rule not found"
-msgstr ""
-
-#: lib/models/subscriptions.js:257 lib/models/subscriptions.js:287
-#: lib/models/subscriptions.js:394
-msgid "Missing Subscription ID"
-msgstr ""
-
-#: lib/models/subscriptions.js:315
-msgid "Missing Subscription email address"
-msgstr ""
-
-#: lib/models/subscriptions.js:570 lib/models/subscriptions.js:820
-msgid "Missing subscription ID"
-msgstr ""
-
-#: lib/models/subscriptions.js:661 lib/models/subscriptions.js:714
-#: lib/models/subscriptions.js:750
-msgid "Missing Import ID"
-msgstr ""
-
-#: lib/models/subscriptions.js:842
-msgid "Unknown subscription ID"
-msgstr ""
-
-#: lib/models/subscriptions.js:847 routes/subscription.js:639
-msgid "Nothing seems to be changed"
-msgstr ""
-
-#: lib/models/subscriptions.js:913 routes/subscription.js:473
-#: routes/subscription.js:545 routes/subscription.js:581
-#: routes/subscription.js:697 routes/subscription.js:772
-msgid "Subscription not found in this list"
-msgstr ""
-
-#: lib/models/templates.js:26 lib/models/templates.js:102
-#: lib/models/templates.js:157
-msgid "Missing Template ID"
-msgstr ""
-
-#: lib/models/templates.js:55 lib/models/templates.js:106
-msgid "Template Name must be set"
-msgstr ""
-
-#: lib/models/templates.js:147
-msgid "Template does not exist"
-msgstr ""
-
-#: lib/models/triggers.js:29
-msgid "Has Opened"
-msgstr ""
-
-#: lib/models/triggers.js:32
-msgid "Has Clicked"
-msgstr ""
-
-#: lib/models/triggers.js:35
-msgid "Not Opened"
-msgstr ""
-
-#: lib/models/triggers.js:38
-msgid "Not Clicked"
-msgstr ""
-
-#: lib/models/triggers.js:178 lib/models/triggers.js:215
-msgid "Missing or invalid list ID"
-msgstr ""
-
-#: lib/models/triggers.js:182 lib/models/triggers.js:267
-msgid "Days in the past are not allowed"
-msgstr ""
-
-#: lib/models/triggers.js:186 lib/models/triggers.js:207
-#: lib/models/triggers.js:271 lib/models/triggers.js:292
-msgid "Missing or invalid trigger rule"
-msgstr ""
-
-#: lib/models/triggers.js:193 lib/models/triggers.js:278
-msgid "Invalid subscription configuration"
-msgstr ""
-
-#: lib/models/triggers.js:200 lib/models/triggers.js:285
-msgid "Invalid campaign configuration"
-msgstr ""
-
-#: lib/models/triggers.js:203 lib/models/triggers.js:288
-msgid "A campaing can not be a target for itself"
-msgstr ""
-
-#: lib/models/triggers.js:236
-msgid "Could not store trigger row"
-msgstr ""
-
-#: lib/models/triggers.js:253
-msgid "Missing or invalid Trigger ID"
-msgstr ""
-
-#: lib/models/triggers.js:320
-msgid "Missing Trigger ID"
-msgstr ""
-
-#: lib/models/users.js:103
-msgid "Could not store user row"
-msgstr ""
-
-#: lib/models/users.js:173
-msgid "Email Address must be set"
-msgstr ""
-
-#: lib/models/users.js:184
-msgid "Failed to check user data"
-msgstr ""
-
-#: lib/models/users.js:195
-msgid ""
-"Can't change email as another user with the same email address already exists"
-msgstr ""
-
-#: lib/models/users.js:212
-msgid "Incorrect current password"
-msgstr ""
-
-#: lib/models/users.js:216
-msgid "New password not set"
-msgstr ""
-
-#: lib/models/users.js:220
-msgid "Passwords do not match"
-msgstr ""
-
-#: lib/models/users.js:258
-msgid "User ID not set"
-msgstr ""
-
-#: lib/models/users.js:286
-msgid "Username must be set"
-msgstr ""
-
-#: lib/models/users.js:323
-msgid "Mailer password change request"
-msgstr ""
-
-#: lib/models/users.js:347 lib/models/users.js:367
-msgid "Missing username or reset token"
-msgstr ""
-
-#: lib/models/users.js:371
-msgid "Invalid new password"
-msgstr "Érvénytelen új jelszó"
-
-#: lib/passport.js:49
-msgid "%s logged out"
-msgstr "%s kijelentkezett"
-
-#: lib/passport.js:64
-msgid "Failed to authenticate user"
-msgstr "Felhasználó azonosítása nem sikerült"
-
-#: lib/passport.js:80
-msgid "Logged in as %s"
-msgstr "Bejelenetezve, mint %s"
-
-#: lib/passport.js:180
-msgid "Incorrect username or password"
-msgstr "Helytelen felhasználónév vagy jelszó"
-
-#: lib/subscription-mail-helpers.js:28
-msgid "%s: Subscription Confirmed"
-msgstr "%s: Feliratkozás megerősítve"
-
-#: lib/subscription-mail-helpers.js:39
-msgid "%s: Email Address Already Registered"
-msgstr "%s: Emailcím már regisztrálva van"
-
-#: lib/subscription-mail-helpers.js:49
-msgid "%s: Please Confirm Email Change in Subscription"
-msgstr "%s: Kérjük erősítse meg email címének megváltoztatását"
-
-#: lib/subscription-mail-helpers.js:59
-msgid "%s: Please Confirm Subscription"
-msgstr "%s: Kérjük erősítse meg a feliratkozást"
-
-#: lib/subscription-mail-helpers.js:69
-msgid "%s: Please Confirm Unsubscription"
-msgstr "%s: Kérjük erősítse meg a leiratkozást"
-
-#: lib/subscription-mail-helpers.js:76
-msgid "%s: Unsubscription Confirmed"
-msgstr "%s: Leiratkozás megerősítve"
-
-#: lib/tools.js:154
-msgid "Blocked email address \"%s\""
-msgstr "Blokkolt email cím \"%s\""
-
-#: lib/tools.js:163
-msgid "Invalid email address \"%s\"."
-msgstr "Érvénytelen email cím \"%s\""
-
-#: lib/tools.js:166
-msgid "MX record not found for domain"
-msgstr "MX rekord nem található a domain-hez"
-
-#: lib/tools.js:169
-msgid "Address domain not found"
-msgstr ""
-
-#: lib/tools.js:172
-msgid "Address domain name is required"
-msgstr ""
-
-#: routes/archive.js:31 routes/archive.js:43 routes/archive.js:55 app.js:230
-msgid "Not Found"
-msgstr "Nem található"
-
-#: routes/archive.js:121 services/sender.js:454
-msgid "Received status code %s from %s"
-msgstr ""
-
-#: routes/archive.js:153 routes/campaigns.js:894
-msgid "Attachment not found"
-msgstr "Csatolmány nem található"
-
-#: routes/blacklist.js:13 routes/campaigns.js:26 routes/editorapi.js:32
-#: routes/fields.js:13 routes/forms.js:16 routes/grapejs.js:15
-#: routes/lists.js:50 routes/mosaico.js:14 routes/report-templates.js:20
-#: routes/reports.js:22 routes/segments.js:13 routes/settings.js:23
-#: routes/templates.js:18 routes/triggers.js:18 routes/users.js:75
-#: routes/users.js:120
-msgid "Need to be logged in to access restricted content"
-msgstr ""
-
-#: routes/campaigns.js:117
-msgid "Could not create campaign"
-msgstr ""
-
-#: routes/campaigns.js:120
-msgid "Campaign “%s” created"
-msgstr ""
-
-#: routes/campaigns.js:209
-msgid "Campaign settings updated"
-msgstr ""
-
-#: routes/campaigns.js:211
-msgid "Campaign settings not updated"
-msgstr ""
-
-#: routes/campaigns.js:227 routes/campaigns.js:744
-msgid "Campaign deleted"
-msgstr "Kampány törölve"
-
-#: routes/campaigns.js:229 routes/campaigns.js:746
-msgid "Could not delete specified campaign"
-msgstr "Kampány törlése nem sikerült"
-
-#: routes/campaigns.js:248
-msgid "Idling"
-msgstr ""
-
-#: routes/campaigns.js:251
-msgid "Scheduled"
-msgstr "Időzítve"
-
-#: routes/campaigns.js:257
-msgid "Paused"
-msgstr ""
-
-#: routes/campaigns.js:259
-msgid "Inactive"
-msgstr "Inaktív"
-
-#: routes/campaigns.js:261
-msgid "Active"
-msgstr "Aktív"
-
-#: routes/campaigns.js:263
-msgid "Other"
-msgstr ""
-
-#: routes/campaigns.js:421
-msgid "Unknown status selector"
-msgstr ""
-
-#: routes/campaigns.js:762
-msgid "Scheduled sending"
-msgstr ""
-
-#: routes/campaigns.js:764
-msgid "Could not schedule sending"
-msgstr ""
-
-#: routes/campaigns.js:776
-msgid "Sending resumed"
-msgstr ""
-
-#: routes/campaigns.js:778
-msgid "Could not resume sending"
-msgstr ""
-
-#: routes/campaigns.js:790
-msgid "Sending reset"
-msgstr ""
-
-#: routes/campaigns.js:792
-msgid "Could not reset sending"
-msgstr ""
-
-#: routes/campaigns.js:804 routes/campaigns.js:832
-msgid "Sending paused"
-msgstr ""
-
-#: routes/campaigns.js:806 routes/campaigns.js:834
-msgid "Could not pause sending"
-msgstr ""
-
-#: routes/campaigns.js:818
-msgid "Sending activated"
-msgstr ""
-
-#: routes/campaigns.js:820
-msgid "Could not activate sending"
-msgstr ""
-
-#: routes/campaigns.js:855
-msgid "Attachment uploaded"
-msgstr ""
-
-#: routes/campaigns.js:857
-msgid "Could not store attachment"
-msgstr ""
-
-#: routes/campaigns.js:874
-msgid "Attachment deleted"
-msgstr ""
-
-#: routes/campaigns.js:876
-msgid "Could not delete attachment"
-msgstr ""
-
-#: routes/editorapi.js:38
-msgid "Invalid editor name"
-msgstr ""
-
-#: routes/editorapi.js:146
-msgid "Method not supported"
-msgstr ""
-
-#: routes/editorapi.js:381
-msgid "Invalid resource type or ID"
-msgstr ""
-
-#: routes/fields.js:28 routes/fields.js:64 routes/fields.js:118
-#: routes/forms.js:31 routes/forms.js:63 routes/forms.js:94
-#: routes/segments.js:28 routes/segments.js:59 routes/segments.js:102
-#: routes/segments.js:151 routes/segments.js:223 routes/segments.js:255
-#: routes/segments.js:289 routes/segments.js:336 routes/segments.js:359
-msgid "Selected list ID not found"
-msgstr ""
-
-#: routes/fields.js:102
-msgid "Could not create custom field"
-msgstr ""
-
-#: routes/fields.js:129
-msgid "Selected field not found"
-msgstr ""
-
-#: routes/fields.js:165
-msgid "Field settings updated"
-msgstr ""
-
-#: routes/fields.js:167
-msgid "Field settings not updated"
-msgstr ""
-
-#: routes/fields.js:183
-msgid "Custom field deleted"
-msgstr ""
-
-#: routes/fields.js:185
-msgid "Could not delete specified field"
-msgstr ""
-
-#: routes/forms.js:78
-msgid "Could not create custom form"
-msgstr ""
-
-#: routes/forms.js:105
-msgid "Selected form not found"
-msgstr ""
-
-#: routes/forms.js:136
-msgid "The plaintext version for this email"
-msgstr ""
-
-#: routes/forms.js:137
-msgid "Custom forms use MJML for formatting"
-msgstr ""
-
-#: routes/forms.js:138
-msgid "See the MJML documentation here"
-msgstr ""
-
-#: routes/forms.js:146
-msgid "Layout"
-msgstr ""
-
-#: routes/forms.js:152
-msgid "Form Input Style"
-msgstr ""
-
-#: routes/forms.js:154
-msgid ""
-"This CSS stylesheet defines the appearance of form input elements and alerts"
-msgstr ""
-
-#: routes/forms.js:160
-msgid "Web - Subscribe"
-msgstr ""
-
-#: routes/forms.js:165
-msgid "Web - Confirm Subscription Notice"
-msgstr ""
-
-#: routes/forms.js:170
-msgid "Mail - Confirm Subscription (MJML)"
-msgstr ""
-
-#: routes/forms.js:175
-msgid "Mail - Confirm Subscription (Text)"
-msgstr ""
-
-#: routes/forms.js:180
-msgid "Mail - Already Subscribed (MJML)"
-msgstr ""
-
-#: routes/forms.js:185
-msgid "Mail - Already Subscribed (Text)"
-msgstr ""
-
-#: routes/forms.js:190
-msgid "Web - Subscribed Notice"
-msgstr ""
-
-#: routes/forms.js:195
-msgid "Mail - Subscription Confirmed (MJML)"
-msgstr ""
-
-#: routes/forms.js:200
-msgid "Mail - Subscription Confirmed (Text)"
-msgstr ""
-
-#: routes/forms.js:208
-msgid "Web - Manage Preferences"
-msgstr ""
-
-#: routes/forms.js:213
-msgid "Web - Manage Address"
-msgstr ""
-
-#: routes/forms.js:218
-msgid "Web - Updated Notice"
-msgstr ""
-
-#: routes/forms.js:226
-msgid "Web - Unsubscribe"
-msgstr ""
-
-#: routes/forms.js:231
-msgid "Web - Confirm Unsubscription Notice"
-msgstr ""
-
-#: routes/forms.js:236
-msgid "Mail - Confirm Unsubscription (MJML)"
-msgstr ""
-
-#: routes/forms.js:241
-msgid "Mail - Confirm Unsubscription (Text)"
-msgstr ""
-
-#: routes/forms.js:246
-msgid "Mail - Confirm Address Change (MJML)"
-msgstr ""
-
-#: routes/forms.js:251
-msgid "Mail - Confirm Address Change (Text)"
-msgstr ""
-
-#: routes/forms.js:256
-msgid "Web - Unsubscribed Notice"
-msgstr ""
-
-#: routes/forms.js:261
-msgid "Mail - Unsubscription Confirmed (MJML)"
-msgstr ""
-
-#: routes/forms.js:266
-msgid "Mail - Unsubscription Confirmed (Text)"
-msgstr ""
-
-#: routes/forms.js:271
-msgid "Web - Manual Unsubscribe Notice"
-msgstr ""
-
-#: routes/forms.js:309
-msgid "Form settings updated"
-msgstr ""
-
-#: routes/forms.js:311
-msgid "Form settings not updated"
-msgstr ""
-
-#: routes/forms.js:327
-msgid "Custom form deleted"
-msgstr ""
-
-#: routes/forms.js:329
-msgid "Could not delete specified form"
-msgstr ""
-
-#: routes/index.js:11
-msgid "Self Hosted Newsletter App"
-msgstr ""
-
-#: routes/links.js:39
-msgid "Oops, we couldn't find a link for the URL you clicked"
-msgstr ""
-
-#: routes/lists.js:82
-msgid "Could not create list"
-msgstr ""
-
-#: routes/lists.js:85
-msgid "List created"
-msgstr "Lista létrehozva"
-
-#: routes/lists.js:93 routes/lists.js:271 routes/lists.js:336
-#: routes/lists.js:375 routes/lists.js:444 routes/lists.js:469
-#: routes/lists.js:514 routes/lists.js:536 routes/lists.js:565
-#: routes/lists.js:657 routes/lists.js:714 routes/lists.js:741
-msgid "Could not find list with specified ID"
-msgstr ""
-
-#: routes/lists.js:122
-msgid "List settings updated"
-msgstr ""
-
-#: routes/lists.js:124
-msgid "List settings not updated"
-msgstr ""
-
-#: routes/lists.js:142
-msgid "List deleted"
-msgstr "Lista törölve"
-
-#: routes/lists.js:144
-msgid "Could not delete specified list"
-msgstr ""
-
-#: routes/lists.js:206
-msgid "Unknown"
-msgstr ""
-
-#: routes/lists.js:206
-msgid "Complained"
-msgstr ""
-
-#: routes/lists.js:237
-msgid "Invalid key"
-msgstr ""
-
-#: routes/lists.js:239
-msgid "Expired key"
-msgstr ""
-
-#: routes/lists.js:241
-msgid "Revoked key"
-msgstr ""
-
-#: routes/lists.js:288
-msgid "Force Subscribe"
-msgstr ""
-
-#: routes/lists.js:291
-msgid "Initializing"
-msgstr ""
-
-#: routes/lists.js:294
-msgid "Initialized"
-msgstr ""
-
-#: routes/lists.js:297
-msgid "Importing"
-msgstr ""
-
-#: routes/lists.js:303
-msgid "Errored"
-msgstr ""
-
-#: routes/lists.js:381 routes/lists.js:450 routes/lists.js:475
-msgid "Could not find subscriber with specified ID"
-msgstr ""
-
-#: routes/lists.js:427
-msgid "Could not add subscription"
-msgstr ""
-
-#: routes/lists.js:432
-msgid "%s was successfully added to your list"
-msgstr ""
-
-#: routes/lists.js:434
-msgid "%s was not added to your list"
-msgstr ""
-
-#: routes/lists.js:456
-msgid "Could not unsubscribe user"
-msgstr ""
-
-#: routes/lists.js:459
-msgid "%s was successfully unsubscribed from your list"
-msgstr ""
-
-#: routes/lists.js:479
-msgid "%s was successfully removed from your list"
-msgstr ""
-
-#: routes/lists.js:491
-msgid "Another subscriber with email address %s already exists"
-msgstr ""
-
-#: routes/lists.js:498
-msgid "Subscription settings updated"
-msgstr ""
-
-#: routes/lists.js:500
-msgid "Subscription settings not updated"
-msgstr ""
-
-#: routes/lists.js:542 routes/lists.js:663 routes/lists.js:699
-#: routes/lists.js:727 routes/lists.js:747
-msgid "Could not find import data with specified ID"
-msgstr ""
-
-#: routes/lists.js:573
-msgid "Could not process CSV"
-msgstr ""
-
-#: routes/lists.js:589
-msgid "Could not create importer"
-msgstr ""
-
-#: routes/lists.js:643
-msgid "Empty file"
-msgstr ""
-
-#: routes/lists.js:646
-msgid "Too few rows"
-msgstr ""
-
-#: routes/lists.js:703
-msgid "Import started"
-msgstr ""
-
-#: routes/lists.js:731
-msgid "Import restarted"
-msgstr ""
-
-#: routes/lists.js:797
-msgid "One-step (i.e. no email with confirmation link)"
-msgstr ""
-
-#: routes/lists.js:803
-msgid ""
-"One-step with unsubscription form (i.e. no email with confirmation link)"
-msgstr ""
-
-#: routes/lists.js:809
-msgid "Two-step (i.e. an email with confirmation link will be sent)"
-msgstr ""
-
-#: routes/lists.js:815
-msgid ""
-"Two-step with unsubscription form (i.e. an email with confirmation link will "
-"be sent)"
-msgstr ""
-
-#: routes/lists.js:821
-msgid ""
-"Manual (i.e. unsubscription has to be performed by the list administrator)"
-msgstr ""
-
-#: routes/report-templates.js:246
-msgid "Could not create report template"
-msgstr ""
-
-#: routes/report-templates.js:249
-msgid "Report template “%s” created"
-msgstr ""
-
-#: routes/report-templates.js:257
-msgid "Could not find report template with specified ID"
-msgstr ""
-
-#: routes/report-templates.js:280
-msgid "Report template updated"
-msgstr ""
-
-#: routes/report-templates.js:282
-msgid "Report template not updated"
-msgstr ""
-
-#: routes/report-templates.js:298
-msgid "Report template deleted"
-msgstr ""
-
-#: routes/report-templates.js:300
-msgid "Could not delete specified report template"
-msgstr ""
-
-#: routes/reports.js:124 routes/reports.js:130
-msgid "Could not create report"
-msgstr ""
-
-#: routes/reports.js:135
-msgid "Report “%s” created"
-msgstr ""
-
-#: routes/reports.js:146 routes/reports.js:224 routes/reports.js:239
-#: routes/reports.js:265 routes/reports.js:275
-msgid "Could not find report with specified ID"
-msgstr ""
-
-#: routes/reports.js:188 routes/reports.js:194
-msgid "Could not update report"
-msgstr ""
-
-#: routes/reports.js:197
-msgid "Report updated"
-msgstr ""
-
-#: routes/reports.js:199
-msgid "Report not updated"
-msgstr ""
-
-#: routes/reports.js:212
-msgid "Report deleted"
-msgstr ""
-
-#: routes/reports.js:214
-msgid "Could not delete specified report"
-msgstr ""
-
-#: routes/reports.js:230
-msgid "Could not find report template"
-msgstr ""
-
-#: routes/reports.js:260
-msgid "Unknown type of template"
-msgstr ""
-
-#: routes/segments.js:86
-msgid "Could not create segment"
-msgstr ""
-
-#: routes/segments.js:89
-msgid "Segment created"
-msgstr ""
-
-#: routes/segments.js:113
-msgid "Selected segment ID not found"
-msgstr ""
-
-#: routes/segments.js:188
-msgid "Segment settings updated"
-msgstr ""
-
-#: routes/segments.js:190
-msgid "Segment settings not updated"
-msgstr ""
-
-#: routes/segments.js:206
-msgid "Segment deleted"
-msgstr ""
-
-#: routes/segments.js:208
-msgid "Could not delete specified segment"
-msgstr ""
-
-#: routes/segments.js:342
-msgid "Could not create rule"
-msgstr ""
-
-#: routes/segments.js:345
-msgid "Rule created"
-msgstr ""
-
-#: routes/segments.js:410
-msgid "Rule settings updated"
-msgstr ""
-
-#: routes/segments.js:412
-msgid "Rule settings not updated"
-msgstr ""
-
-#: routes/segments.js:428
-msgid "Rule deleted"
-msgstr ""
-
-#: routes/segments.js:430
-msgid "Could not delete specified rule"
-msgstr ""
-
-#: routes/settings.js:39
-msgid "Use TLS"
-msgstr ""
-
-#: routes/settings.js:40
-msgid "usually selected for port 465"
-msgstr ""
-
-#: routes/settings.js:44
-msgid "Use STARTTLS"
-msgstr ""
-
-#: routes/settings.js:45
-msgid "usually selected for port 587 and 25"
-msgstr ""
-
-#: routes/settings.js:49
-msgid "Do not use encryption"
-msgstr ""
-
-#: routes/settings.js:115
-msgid "Settings updated"
-msgstr ""
-
-#: routes/settings.js:173
-msgid "Invalid mail transport type"
-msgstr ""
-
-#: routes/settings.js:184
-msgid "Invalid Access Key"
-msgstr ""
-
-#: routes/settings.js:187
-msgid "Invalid AWS credentials"
-msgstr ""
-
-#: routes/settings.js:190
-msgid "Connection refused, check hostname and port."
-msgstr ""
-
-#: routes/settings.js:195
-msgid ""
-"Did not receive greeting message from server. This might happen when "
-"connecting to a TLS port without using TLS."
-msgstr ""
-
-#: routes/settings.js:197
-msgid "Did not receive greeting message from server."
-msgstr ""
-
-#: routes/settings.js:200
-msgid ""
-"Connection timed out. Check your firewall settings, destination port is "
-"probably blocked."
-msgstr ""
-
-#: routes/settings.js:205
-msgid "Authentication not accepted, server expects STARTTLS to be used."
-msgstr ""
-
-#: routes/settings.js:207
-msgid "Authentication failed, check username and password."
-msgstr ""
-
-#: routes/settings.js:217
-msgid "Failed Mailer verification."
-msgstr ""
-
-#: routes/settings.js:217
-msgid "Server responded with: \"%s\""
-msgstr ""
-
-#: routes/settings.js:221
-msgid "Mailer settings verified, ready to send some mail!"
-msgstr ""
-
-#: routes/subscription.js:33
-msgid "Not allowed by CORS"
-msgstr ""
-
-#: routes/subscription.js:61 routes/subscription.js:176
-#: routes/subscription.js:286 routes/subscription.js:382
-#: routes/subscription.js:459 routes/subscription.js:535
-#: routes/subscription.js:566 routes/subscription.js:626
-#: routes/subscription.js:682 routes/subscription.js:760
-#: routes/subscription.js:897
-msgid "Selected list not found"
-msgstr "Lista nem található"
-
-#: routes/subscription.js:93
-msgid "Could not save subscription"
-msgstr "Feliratkozás mentése nem sikerült"
-
-#: routes/subscription.js:118
-msgid "Subscriber info corrupted or missing"
-msgstr ""
-
-#: routes/subscription.js:136
-msgid "Email address changed"
-msgstr "Email cím megváltoztatva."
-
-#: routes/subscription.js:179 routes/subscription.js:385
-msgid "The list does not allow public subscriptions."
-msgstr "A lista nem fogad nyilvános feliratkozásokat."
-
-#: routes/subscription.js:355 routes/subscription.js:357
-msgid "Email address not set"
-msgstr "Email cím nincs megadva."
-
-#: routes/subscription.js:653
-msgid ""
-"An email with further instructions has been sent to the provided address"
-msgstr "A további teendőket tartalmazó levelet kiküldtük a megadott címre. "
-
-#: routes/subscription.js:861 routes/subscription.js:877
-msgid "Public key is not set"
-msgstr "Publikus kulcs nincs megadva."
-
-#: routes/templates.js:84
-msgid "Could not create template"
-msgstr "Sablon létrehozása nem sikerült"
-
-#: routes/templates.js:87
-msgid "Template created"
-msgstr "Sablon létrehozva."
-
-#: routes/templates.js:126
-msgid "Template settings updated"
-msgstr "Sablon beállításai frissítve"
-
-#: routes/templates.js:128
-msgid "Template settings not updated"
-msgstr ""
-
-#: routes/templates.js:144
-msgid "Template duplicated"
-msgstr ""
-
-#: routes/templates.js:146
-msgid "Could not duplicate specified template"
-msgstr ""
-
-#: routes/templates.js:157
-msgid "Template deleted"
-msgstr "Sablon törölve."
-
-#: routes/templates.js:159
-msgid "Could not delete specified template"
-msgstr ""
-
-#: routes/triggers.js:62 routes/triggers.js:79 routes/triggers.js:154
-msgid "Could not find selected list"
-msgstr ""
-
-#: routes/triggers.js:131
-msgid "Could not create trigger"
-msgstr ""
-
-#: routes/triggers.js:138
-msgid "Trigger “%s” created"
-msgstr ""
-
-#: routes/triggers.js:214
-msgid "Trigger settings updated"
-msgstr ""
-
-#: routes/triggers.js:216
-msgid "Trigger settings not updated"
-msgstr ""
-
-#: routes/triggers.js:228
-msgid "Trigger deleted"
-msgstr ""
-
-#: routes/triggers.js:230
-msgid "Could not delete specified trigger"
-msgstr ""
-
-#: routes/triggers.js:242
-msgid "Could not find trigger with specified ID"
-msgstr ""
-
-#: routes/triggers.js:255
-msgid "Trigger not found"
-msgstr ""
-
-#: routes/users.js:32
-msgid ""
-"An email with password reset instructions has been sent to your email "
-"address, if it exists on our system."
-msgstr ""
-
-#: routes/users.js:46 routes/users.js:64
-msgid "Unknown or expired reset token"
-msgstr ""
-
-#: routes/users.js:66
-msgid "Your password has been changed successfully"
-msgstr "A jelszava sikeresen megváltoztatva."
-
-#: routes/users.js:87
-msgid "User data not found"
-msgstr ""
-
-#: routes/users.js:110
-msgid "Access token updated"
-msgstr ""
-
-#: routes/users.js:112
-msgid "Access token not updated"
-msgstr ""
-
-#: routes/users.js:139
-msgid "Account information updated"
-msgstr ""
-
-#: routes/users.js:141
-msgid "Account information not updated"
-msgstr ""
-
-#: services/feedcheck.js:51
-msgid "Feed error: %s"
-msgstr ""
-
-#: services/feedcheck.js:54
-msgid "Found %s new campaign messages from feed"
-msgstr ""
-
-#: services/feedcheck.js:56
-msgid "Found nothing new from the feed"
-msgstr ""
-
-#: services/feedcheck.js:146
-msgid "RSS entry %s"
-msgstr "RSS bejegyzés %s"
-
-#: services/importer.js:249
-msgid "Could not access import file"
-msgstr "Import file nem érhető el"
-
-#: services/triggers.js:51
-msgid "Unknown trigger type %s"
-msgstr ""
diff --git a/languages/it_IT.mo b/languages/it_IT.mo
deleted file mode 100644
index 7e5a8f97..00000000
Binary files a/languages/it_IT.mo and /dev/null differ
diff --git a/languages/it_IT.po b/languages/it_IT.po
deleted file mode 100644
index b35ef79f..00000000
--- a/languages/it_IT.po
+++ /dev/null
@@ -1,4661 +0,0 @@
-msgid ""
-msgstr ""
-"Project-Id-Version: \n"
-"Language-Team: \n"
-"Report-Msgid-Bugs-To: \n"
-"PO-Revision-Date: 2018-04-11 12:42+0200\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"POT-Creation-Date: 2018-04-05 15:43+0200\n"
-"X-Generator: Poedit 1.8.7.1\n"
-"Last-Translator: \n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"Language: it\n"
-
-#: views/archive/layout.hbs:1 views/layout.hbs:1
-msgid "Self hosted email newsletter app"
-msgstr "Applicazione di newsletter self-hosted"
-
-#: views/blacklist.hbs:1 views/campaigns/blacklisted.hbs:1
-#: views/campaigns/bounced.hbs:1 views/campaigns/campaigns.hbs:1
-#: views/campaigns/clicked.hbs:1 views/campaigns/complained.hbs:1
-#: views/campaigns/create-rss.hbs:1 views/campaigns/create-triggered.hbs:1
-#: views/campaigns/create.hbs:1 views/campaigns/delivered.hbs:1
-#: views/campaigns/edit-rss.hbs:1 views/campaigns/edit-triggered.hbs:1
-#: views/campaigns/edit.hbs:1 views/campaigns/opened.hbs:1
-#: views/campaigns/unsubscribed.hbs:1 views/campaigns/upload-attachment.hbs:1
-#: views/campaigns/view.hbs:1 views/lists/create.hbs:1 views/lists/edit.hbs:1
-#: views/lists/fields/create.hbs:1 views/lists/fields/edit.hbs:1
-#: views/lists/fields/fields.hbs:1 views/lists/forms/create.hbs:1
-#: views/lists/forms/edit.hbs:1 views/lists/forms/forms.hbs:1
-#: views/lists/lists.hbs:1 views/lists/segments/create.hbs:1
-#: views/lists/segments/edit.hbs:1 views/lists/segments/rule-configure.hbs:1
-#: views/lists/segments/rule-create.hbs:1 views/lists/segments/rule-edit.hbs:1
-#: views/lists/segments/segments.hbs:1 views/lists/segments/view.hbs:1
-#: views/lists/subscription/add.hbs:1 views/lists/subscription/edit.hbs:1
-#: views/lists/subscription/import-failed.hbs:1
-#: views/lists/subscription/import-preview.hbs:1
-#: views/lists/subscription/import.hbs:1 views/lists/view.hbs:1
-#: views/report-templates/create.hbs:1 views/report-templates/edit.hbs:1
-#: views/report-templates/report-templates.hbs:1
-#: views/reports/create-select-template.hbs:1 views/reports/create.hbs:1
-#: views/reports/edit.hbs:1 views/reports/output.hbs:1
-#: views/reports/reports.hbs:1 views/reports/view.hbs:1 views/settings.hbs:1
-#: views/templates/create.hbs:1 views/templates/edit.hbs:1
-#: views/templates/templates.hbs:1 views/triggers/create-select.hbs:1
-#: views/triggers/create.hbs:1 views/triggers/edit.hbs:1
-#: views/triggers/triggered.hbs:1 views/triggers/triggers.hbs:1
-#: views/users/account.hbs:1 views/users/api.hbs:1 views/users/forgot.hbs:1
-#: views/users/login.hbs:1 views/users/reset.hbs:1 app.js:169
-msgid "Home"
-msgstr "Home"
-
-#: views/blacklist.hbs:2 views/blacklist.hbs:3 views/layout.hbs:7
-#: views/lists/subscription/edit.hbs:15
-msgid "Blacklist"
-msgstr "Lista nera"
-
-#: views/blacklist.hbs:4 views/users/api.hbs:76
-msgid "Add email to blacklist"
-msgstr "Aggiungi email alla lista nera"
-
-#: views/blacklist.hbs:5
-msgid "Add"
-msgstr "Aggiungi"
-
-#: views/blacklist.hbs:6
-msgid "Email"
-msgstr "Email"
-
-#: views/campaigns/blacklisted.hbs:2 views/campaigns/bounced.hbs:2
-#: views/campaigns/campaigns.hbs:2 views/campaigns/campaigns.hbs:7
-#: views/campaigns/clicked.hbs:2 views/campaigns/complained.hbs:2
-#: views/campaigns/create-rss.hbs:2 views/campaigns/create-triggered.hbs:2
-#: views/campaigns/create.hbs:2 views/campaigns/delivered.hbs:2
-#: views/campaigns/edit-rss.hbs:2 views/campaigns/edit-triggered.hbs:2
-#: views/campaigns/edit.hbs:2 views/campaigns/opened.hbs:2
-#: views/campaigns/unsubscribed.hbs:2 views/campaigns/upload-attachment.hbs:2
-#: views/campaigns/view.hbs:2 lib/tools.js:133 routes/campaigns.js:35
-msgid "Campaigns"
-msgstr "Campagne"
-
-#: views/campaigns/blacklisted.hbs:3 views/campaigns/blacklisted.hbs:4
-msgid "Blacklisted info"
-msgstr "Informazioni lista nera"
-
-#: views/campaigns/blacklisted.hbs:5 views/campaigns/bounced.hbs:5
-#: views/campaigns/clicked.hbs:5 views/campaigns/complained.hbs:5
-#: views/campaigns/delivered.hbs:5 views/campaigns/edit-rss.hbs:5
-#: views/campaigns/edit-triggered.hbs:5 views/campaigns/edit.hbs:5
-#: views/campaigns/opened.hbs:5 views/campaigns/unsubscribed.hbs:5
-#: views/campaigns/upload-attachment.hbs:6
-msgid "View campaign"
-msgstr "Vedi campagna"
-
-#: views/campaigns/blacklisted.hbs:6
-msgid "Subscribers who blacklisted by global blacklist:"
-msgstr "Iscritti in lista nera derivati dalla lista nera globale:"
-
-#: views/campaigns/blacklisted.hbs:7 views/campaigns/bounced.hbs:7
-#: views/campaigns/clicked.hbs:15 views/campaigns/complained.hbs:7
-#: views/campaigns/delivered.hbs:7 views/campaigns/opened.hbs:9
-#: views/campaigns/unsubscribed.hbs:7
-#: views/lists/subscription/import-failed.hbs:8 views/lists/view.hbs:19
-#: views/triggers/triggered.hbs:6
-msgid "Address"
-msgstr "Indirizzo"
-
-#: views/campaigns/blacklisted.hbs:8 views/campaigns/bounced.hbs:8
-#: views/campaigns/clicked.hbs:16 views/campaigns/complained.hbs:8
-#: views/campaigns/delivered.hbs:8 views/campaigns/opened.hbs:10
-#: views/campaigns/unsubscribed.hbs:8 views/lists/subscription/add.hbs:6
-#: views/lists/subscription/edit.hbs:7
-#: views/lists/subscription/import-preview.hbs:7 views/lists/view.hbs:20
-#: views/subscription/partials/subscription-custom-fields.hbs:3
-#: views/triggers/triggered.hbs:7
-msgid "First Name"
-msgstr "Nome"
-
-#: views/campaigns/blacklisted.hbs:9 views/campaigns/bounced.hbs:9
-#: views/campaigns/clicked.hbs:17 views/campaigns/complained.hbs:9
-#: views/campaigns/delivered.hbs:9 views/campaigns/opened.hbs:11
-#: views/campaigns/unsubscribed.hbs:9 views/lists/subscription/add.hbs:7
-#: views/lists/subscription/edit.hbs:8
-#: views/lists/subscription/import-preview.hbs:8 views/lists/view.hbs:21
-#: views/subscription/partials/subscription-custom-fields.hbs:4
-#: views/triggers/triggered.hbs:8
-msgid "Last Name"
-msgstr "Cognome"
-
-#: views/campaigns/blacklisted.hbs:10
-msgid "Reason"
-msgstr "Ragione"
-
-#: views/campaigns/blacklisted.hbs:11
-msgid "Time"
-msgstr "Tempo"
-
-#: views/campaigns/bounced.hbs:3 views/campaigns/bounced.hbs:4
-msgid "Bounced info"
-msgstr "Informazioni rimbalzo"
-
-#: views/campaigns/bounced.hbs:6
-msgid "Subscribers who bounced and were unsubscribed:"
-msgstr "Iscritti che hanno rimbalzato e sono stati rimossi:"
-
-#: views/campaigns/bounced.hbs:10 views/campaigns/complained.hbs:10
-#: views/campaigns/delivered.hbs:10 views/campaigns/unsubscribed.hbs:10
-msgid "SMTP response"
-msgstr "Risposta SMTP"
-
-#: views/campaigns/bounced.hbs:11
-msgid "Bounce time"
-msgstr "Tempo di rimbalzo"
-
-#: views/campaigns/campaigns.hbs:3 views/campaigns/create-triggered.hbs:26
-#: views/campaigns/create.hbs:3 views/campaigns/create.hbs:4
-#: views/campaigns/create.hbs:28
-msgid "Create Campaign"
-msgstr "Crea Campagna"
-
-#: views/campaigns/campaigns.hbs:4
-msgid "Regular Campaign"
-msgstr "Campagna regolare"
-
-#: views/campaigns/campaigns.hbs:5
-msgid "RSS Campaign"
-msgstr "Campagna RSS"
-
-#: views/campaigns/campaigns.hbs:6
-msgid "Triggered Campaign"
-msgstr "Campagna attivabile"
-
-#: views/campaigns/campaigns.hbs:8 views/campaigns/create-rss.hbs:6
-#: views/campaigns/create-triggered.hbs:5 views/campaigns/create.hbs:5
-#: views/campaigns/edit-rss.hbs:8 views/campaigns/edit-triggered.hbs:9
-#: views/campaigns/edit.hbs:10 views/campaigns/view.hbs:73
-#: views/lists/create.hbs:5 views/lists/edit.hbs:6
-#: views/lists/fields/fields.hbs:6 views/lists/forms/forms.hbs:6
-#: views/lists/lists.hbs:5 views/lists/segments/segments.hbs:6
-#: views/report-templates/partials/report-template-fields.hbs:1
-#: views/report-templates/report-templates.hbs:10
-#: views/reports/partials/report-fields.hbs:1
-#: views/reports/partials/report-fields.hbs:5
-#: views/reports/partials/report-fields.hbs:9 views/reports/reports.hbs:6
-#: views/templates/templates.hbs:5 views/triggers/triggers.hbs:5
-msgid "Name"
-msgstr "Nome"
-
-#: views/campaigns/campaigns.hbs:9 views/campaigns/create-rss.hbs:8
-#: views/campaigns/create-triggered.hbs:7 views/campaigns/create.hbs:7
-#: views/campaigns/edit-rss.hbs:10 views/campaigns/edit-triggered.hbs:11
-#: views/campaigns/edit.hbs:12 views/campaigns/view.hbs:74
-#: views/lists/create.hbs:7 views/lists/edit.hbs:10
-#: views/lists/forms/edit.hbs:9 views/lists/forms/forms.hbs:7
-#: views/lists/lists.hbs:8 views/mosaico/editor.hbs:3
-#: views/partials/merge-tag-reference.hbs:4
-#: views/report-templates/partials/report-template-fields.hbs:3
-#: views/report-templates/report-templates.hbs:11
-#: views/reports/partials/report-fields.hbs:3
-#: views/reports/partials/report-fields.hbs:6 views/reports/reports.hbs:8
-#: views/templates/create.hbs:9 views/templates/edit.hbs:8
-#: views/templates/templates.hbs:6 views/triggers/create.hbs:7
-#: views/triggers/edit.hbs:8 views/triggers/triggers.hbs:7
-msgid "Description"
-msgstr "Descrizione"
-
-#: views/campaigns/campaigns.hbs:10 views/campaigns/view.hbs:75
-#: views/lists/view.hbs:22 views/lists/view.hbs:30
-#: views/triggers/triggers.hbs:6
-msgid "Status"
-msgstr "Stato"
-
-#: views/campaigns/campaigns.hbs:11 views/campaigns/view.hbs:76
-#: views/lists/view.hbs:23 views/lists/view.hbs:24
-#: views/report-templates/report-templates.hbs:12
-#: views/reports/partials/report-fields.hbs:7 views/reports/reports.hbs:9
-msgid "Created"
-msgstr "Creato"
-
-#: views/campaigns/clicked.hbs:3 views/campaigns/clicked.hbs:4
-msgid "Link info"
-msgstr "Informazioni link"
-
-#: views/campaigns/clicked.hbs:6 views/campaigns/view.hbs:63
-msgid "URL"
-msgstr "URL"
-
-#: views/campaigns/clicked.hbs:7 views/campaigns/view.hbs:64
-msgid "Clicks"
-msgstr "Clicks"
-
-#: views/campaigns/clicked.hbs:8 views/campaigns/view.hbs:65
-msgid "% of clicks"
-msgstr "% di clicks"
-
-#: views/campaigns/clicked.hbs:9 views/campaigns/view.hbs:66
-msgid "% of messages"
-msgstr "% di messagi"
-
-#: views/campaigns/clicked.hbs:10 views/campaigns/view.hbs:69
-msgid "Aggregated clicks"
-msgstr "Clicks aggregati"
-
-#: views/campaigns/clicked.hbs:11
-msgid "Subscribers who clicked on a link:"
-msgstr "Iscritti che hanno cliccato un link:"
-
-#: views/campaigns/clicked.hbs:12
-msgid "Subscribers who clicked on this link:"
-msgstr "Iscritti che hanno cliccato questo link:"
-
-#: views/campaigns/clicked.hbs:13 views/campaigns/opened.hbs:7
-msgid "Stats by country"
-msgstr "Statistiche per nazione"
-
-#: views/campaigns/clicked.hbs:14 views/campaigns/opened.hbs:8
-msgid "Stats by device type"
-msgstr "Statistiche per tipo di dispositivo"
-
-#: views/campaigns/clicked.hbs:18
-msgid "First click time"
-msgstr "Tempo primo click"
-
-#: views/campaigns/clicked.hbs:19
-msgid "Click count"
-msgstr "Conteggio clicks"
-
-#: views/campaigns/complained.hbs:3 views/campaigns/complained.hbs:4
-msgid "Complained info"
-msgstr "Informazioni reclamo"
-
-#: views/campaigns/complained.hbs:6
-msgid "Subscribers who complained and were unsubscribed:"
-msgstr "Iscritti che hanno reclamato e sono stati rimossi"
-
-#: views/campaigns/complained.hbs:11
-msgid "Complain time"
-msgstr "Tempo reclamo"
-
-#: views/campaigns/create-rss.hbs:3 views/campaigns/create-rss.hbs:4
-#: views/campaigns/create-rss.hbs:21
-msgid "Create RSS Campaign"
-msgstr "Crea campagna RSS"
-
-#: views/campaigns/create-rss.hbs:5 views/campaigns/edit-rss.hbs:6
-msgid ""
-"RSS campaign sets up a tracker against selected RSS feed address. Whenever a "
-"new entry is found from this feed it is sent to selected list as an email "
-"message."
-msgstr ""
-"Le campagne RSS configurano un registratore per gli indirizzi dei feed RSS. "
-"Qualvolta un nuovo elemento venga trovato per il feed, viene inviato alle "
-"liste selezionate come una email."
-
-#: views/campaigns/create-rss.hbs:7 views/campaigns/create-triggered.hbs:6
-#: views/campaigns/create.hbs:6 views/campaigns/edit-rss.hbs:9
-#: views/campaigns/edit-triggered.hbs:10 views/campaigns/edit.hbs:11
-msgid "Campaign Name"
-msgstr "Nome campagna"
-
-#: views/campaigns/create-rss.hbs:9 views/campaigns/create-triggered.hbs:8
-#: views/campaigns/create.hbs:8 views/campaigns/edit-rss.hbs:11
-#: views/campaigns/edit-triggered.hbs:12 views/campaigns/edit.hbs:13
-#: views/lists/create.hbs:8 views/lists/edit.hbs:11
-#: views/report-templates/partials/report-template-fields.hbs:4
-#: views/reports/partials/report-fields.hbs:4 views/templates/create.hbs:11
-#: views/templates/edit.hbs:10 views/triggers/create.hbs:9
-#: views/triggers/edit.hbs:10
-msgid "HTML is allowed"
-msgstr "HTML è consentito"
-
-#: views/campaigns/create-rss.hbs:10 views/campaigns/create-triggered.hbs:9
-#: views/campaigns/create.hbs:9 views/campaigns/edit-rss.hbs:12
-#: views/campaigns/edit-triggered.hbs:13 views/campaigns/edit.hbs:14
-#: views/campaigns/view.hbs:6 views/triggers/create-select.hbs:6
-#: views/triggers/create.hbs:10 views/triggers/edit.hbs:12
-#: views/triggers/triggers.hbs:8
-msgid "List"
-msgstr "Lista"
-
-#: views/campaigns/create-rss.hbs:11 views/campaigns/create-triggered.hbs:10
-#: views/campaigns/create-triggered.hbs:14 views/campaigns/create.hbs:10
-#: views/campaigns/create.hbs:14 views/campaigns/edit-rss.hbs:13
-#: views/campaigns/edit-triggered.hbs:14 views/campaigns/edit.hbs:15
-#: views/lists/fields/create.hbs:27 views/lists/fields/edit.hbs:28
-#: views/lists/segments/create.hbs:9 views/lists/segments/edit.hbs:10
-#: views/lists/segments/rule-create.hbs:7 views/lists/subscription/add.hbs:10
-#: views/lists/subscription/add.hbs:12 views/lists/subscription/edit.hbs:11
-#: views/lists/subscription/import-preview.hbs:5
-#: views/reports/partials/report-select-template.hbs:2
-#: views/subscription/partials/subscription-custom-fields.hbs:9
-#: views/templates/create.hbs:8 views/triggers/create-select.hbs:7
-#: views/triggers/create.hbs:17 views/triggers/create.hbs:20
-#: views/triggers/create.hbs:22 views/triggers/create.hbs:26
-#: views/triggers/edit.hbs:19 views/triggers/edit.hbs:22
-#: views/triggers/edit.hbs:24 views/triggers/edit.hbs:28
-msgid "Select"
-msgstr "Seleziona"
-
-#: views/campaigns/create-rss.hbs:12 views/campaigns/create-triggered.hbs:11
-#: views/campaigns/create.hbs:11 views/campaigns/edit-rss.hbs:14
-#: views/campaigns/edit-triggered.hbs:15 views/campaigns/edit.hbs:16
-#: views/triggers/create-select.hbs:8 views/triggers/create.hbs:11
-#: views/triggers/edit.hbs:13
-msgid "subscribers"
-msgstr "Iscritti"
-
-#: views/campaigns/create-rss.hbs:13 views/campaigns/edit-rss.hbs:15
-msgid "RSS Feed Url"
-msgstr "URL del feed RSS"
-
-#: views/campaigns/create-rss.hbs:14 views/campaigns/edit-rss.hbs:16
-msgid ""
-"New entries from this RSS URL are sent out to list subscribers as email "
-"messages"
-msgstr ""
-"I nuovi elementi per questo feed RSS sono inviati agli iscritti come "
-"messaggi email."
-
-#: views/campaigns/create-rss.hbs:15 views/campaigns/create-triggered.hbs:18
-#: views/campaigns/create.hbs:18 views/campaigns/edit-rss.hbs:18
-#: views/campaigns/edit-triggered.hbs:16 views/campaigns/edit.hbs:17
-#: views/campaigns/view.hbs:12
-msgid "Email \"from name\""
-msgstr "Email da \"Nome\""
-
-#: views/campaigns/create-rss.hbs:16 views/campaigns/create-triggered.hbs:19
-#: views/campaigns/create.hbs:19 views/campaigns/edit-rss.hbs:19
-#: views/campaigns/edit-triggered.hbs:17 views/campaigns/edit.hbs:18
-#: views/settings.hbs:23
-msgid "This is the name your emails will come from"
-msgstr "Questo è il nome che verrà' visualizzato come mittente"
-
-#: views/campaigns/create-rss.hbs:17 views/campaigns/create-triggered.hbs:20
-#: views/campaigns/create.hbs:20 views/campaigns/edit-rss.hbs:20
-#: views/campaigns/edit-triggered.hbs:18 views/campaigns/edit.hbs:19
-#: views/campaigns/view.hbs:13
-msgid "Email \"from\" address"
-msgstr "Email dall'indirizzo"
-
-#: views/campaigns/create-rss.hbs:18 views/campaigns/create-triggered.hbs:21
-#: views/campaigns/edit-rss.hbs:21 views/campaigns/edit-triggered.hbs:19
-#: views/settings.hbs:25
-msgid "This is the address people will send replies to"
-msgstr "Questo è l'indirizzo a cui gli iscritti risponderanno"
-
-#: views/campaigns/create-rss.hbs:19 views/campaigns/create-triggered.hbs:24
-#: views/campaigns/create.hbs:26 views/campaigns/edit-rss.hbs:22
-#: views/campaigns/edit-triggered.hbs:22 views/campaigns/edit.hbs:25
-msgid "Disable opened tracking"
-msgstr "Disabilita tracciamento aperture"
-
-#: views/campaigns/create-rss.hbs:20 views/campaigns/create-triggered.hbs:25
-#: views/campaigns/create.hbs:27 views/campaigns/edit-rss.hbs:23
-#: views/campaigns/edit-triggered.hbs:23 views/campaigns/edit.hbs:26
-msgid "Disable clicked tracking"
-msgstr "Disabilita tracciamento clicks"
-
-#: views/campaigns/create-triggered.hbs:3
-#: views/campaigns/create-triggered.hbs:4
-msgid "Create Triggered Campaign"
-msgstr "Crea una campagna attivabile"
-
-#: views/campaigns/create-triggered.hbs:12 views/campaigns/create.hbs:12
-#: views/campaigns/edit-triggered.hbs:7 views/campaigns/edit.hbs:7
-#: views/lists/fields/create.hbs:31 views/lists/fields/edit.hbs:33
-#: views/reports/reports.hbs:7 views/templates/create.hbs:13
-msgid "Template"
-msgstr "Template"
-
-#: views/campaigns/create-triggered.hbs:13 views/campaigns/create.hbs:13
-msgid "Select a template:"
-msgstr "Seleziona un template:"
-
-#: views/campaigns/create-triggered.hbs:15 views/campaigns/create.hbs:15
-msgid "Selecting a template creates a campaign specific copy from it"
-msgstr "Selezionando un template, si crea una copia su cui andare a lavorare"
-
-#: views/campaigns/create-triggered.hbs:16 views/campaigns/create.hbs:16
-msgid "Or alternatively use an URL as the message content source:"
-msgstr "In alternativa utilizza un URL per il contenuto del messaggio:"
-
-#: views/campaigns/create-triggered.hbs:17 views/campaigns/create.hbs:17
-#: views/campaigns/edit-triggered.hbs:26 views/campaigns/edit.hbs:29
-msgid ""
-"If a message is sent then this URL will be POSTed to using Merge Tags as "
-"POST body. Use this if you want to generate the HTML message yourself"
-msgstr ""
-"Se un messaggio viene inviato questa URL verrà' richiamata assorbendo i "
-"merge tags come body del messaggio. Utilizza questa opzione se vuoi scrivere "
-"tu l'HTML del messaggio"
-
-#: views/campaigns/create-triggered.hbs:22 views/campaigns/create.hbs:24
-#: views/campaigns/edit-triggered.hbs:20 views/campaigns/edit.hbs:23
-#: views/campaigns/view.hbs:15
-msgid "Email \"subject line\""
-msgstr "Oggetto dell'email"
-
-#: views/campaigns/create-triggered.hbs:23 views/campaigns/create.hbs:25
-#: views/campaigns/edit-triggered.hbs:21 views/campaigns/edit.hbs:24
-#: views/settings.hbs:27
-msgid "Keep it relevant and non-spammy"
-msgstr "Ricordati di mantenerla rilevante e non creare spam"
-
-#: views/campaigns/create.hbs:21 views/campaigns/edit.hbs:20
-msgid ""
-"This is the address people will send replies to unless reply-to address is "
-"set"
-msgstr ""
-"Questo è l'indirizzo a cui gli iscritti risponderanno se non specifichi un "
-"indirizzo email 'reply-to'"
-
-#: views/campaigns/create.hbs:22 views/campaigns/edit.hbs:21
-#: views/campaigns/view.hbs:14
-msgid "Email \"reply-to\" address"
-msgstr "Indirizzo email 'reply-to'"
-
-#: views/campaigns/create.hbs:23 views/campaigns/edit.hbs:22
-msgid "If set, this is the address people will send replies to"
-msgstr "Se impostato, questo sarà' l'indirizzo a cui le persone risponderanno"
-
-#: views/campaigns/delivered.hbs:3 views/campaigns/delivered.hbs:4
-msgid "Delivered info"
-msgstr "Informazioni della consegna"
-
-#: views/campaigns/delivered.hbs:6
-msgid "Subscribers who received the message and did not bounce/unsubscribe:"
-msgstr ""
-"Iscritti che hanno ricevuto il messaggio e non hanno reclamato e non si sono "
-"rimossi"
-
-#: views/campaigns/delivered.hbs:11
-msgid "Delivery time"
-msgstr "Ora di consegna"
-
-#: views/campaigns/edit-rss.hbs:3 views/campaigns/edit-rss.hbs:4
-msgid "Edit RSS Campaign"
-msgstr "Modifica campagna RSS"
-
-#: views/campaigns/edit-rss.hbs:7 views/campaigns/edit-triggered.hbs:8
-#: views/campaigns/edit.hbs:9 views/settings.hbs:4 views/users/account.hbs:6
-msgid "General Settings"
-msgstr "Impostazioni generali"
-
-#: views/campaigns/edit-rss.hbs:17
-msgid ""
-"Use special merge tag [RSS_ENTRY] to mark the position for the RSS post "
-"content. Additionally you can use any valid merge tag as well."
-msgstr ""
-"Utilizza tag di assorbimento speciali [RSS_ENTRY] per evidenziare il "
-"contenuto del messaggio all'interno del RSS. Puoi inoltre utilizzare "
-"qualsiasi tag di merge valido."
-
-#: views/campaigns/edit-rss.hbs:24 views/campaigns/edit-triggered.hbs:27
-#: views/campaigns/edit.hbs:35
-msgid "Delete Campaign"
-msgstr "Cancella "
-
-#: views/campaigns/edit-rss.hbs:25 views/campaigns/edit-triggered.hbs:28
-#: views/campaigns/edit.hbs:36 views/lists/edit.hbs:20
-#: views/lists/fields/edit.hbs:39 views/lists/forms/edit.hbs:33
-#: views/lists/forms/forms.hbs:12 views/lists/segments/edit.hbs:14
-#: views/lists/segments/rule-edit.hbs:38 views/lists/subscription/edit.hbs:18
-#: views/reports/edit.hbs:6 views/settings.hbs:97 views/templates/edit.hbs:13
-#: views/triggers/edit.hbs:30 views/users/account.hbs:18
-msgid "Update"
-msgstr "Aggiorna"
-
-#: views/campaigns/edit-triggered.hbs:3 views/campaigns/edit-triggered.hbs:4
-msgid "Edit Triggered Campaign"
-msgstr "Modifica campagna azionabile"
-
-#: views/campaigns/edit-triggered.hbs:6 views/campaigns/edit.hbs:6
-#: routes/forms.js:143
-msgid "General"
-msgstr "Generale"
-
-#: views/campaigns/edit-triggered.hbs:24 views/campaigns/edit.hbs:27
-msgid "Template Settings"
-msgstr "Impostazioni Template"
-
-#: views/campaigns/edit-triggered.hbs:25 views/campaigns/edit.hbs:28
-msgid "Template URL"
-msgstr "URL Template"
-
-#: views/campaigns/edit.hbs:3 views/campaigns/edit.hbs:4
-#: views/campaigns/upload-attachment.hbs:3
-#: views/campaigns/upload-attachment.hbs:5 views/campaigns/view.hbs:3
-msgid "Edit Campaign"
-msgstr "Modifica Campagna"
-
-#: views/campaigns/edit.hbs:8 views/campaigns/edit.hbs:30
-msgid "Attachments"
-msgstr "Allegati"
-
-#: views/campaigns/edit.hbs:31
-msgid "File"
-msgstr "File"
-
-#: views/campaigns/edit.hbs:32
-msgid "Size"
-msgstr "Dimensione"
-
-#: views/campaigns/edit.hbs:33 views/campaigns/view.hbs:68
-#: views/lists/fields/fields.hbs:12 views/lists/forms/forms.hbs:9
-#: views/lists/view.hbs:33
-msgid "No data available in table"
-msgstr "Non ci sono dati disponibili nella tabella"
-
-#: views/campaigns/edit.hbs:34 views/campaigns/upload-attachment.hbs:4
-msgid "Add Attachment"
-msgstr "Aggiungi allegato"
-
-#: views/campaigns/opened.hbs:3 views/campaigns/opened.hbs:4
-msgid "Opened info"
-msgstr "Informazioni apertura"
-
-#: views/campaigns/opened.hbs:6
-msgid "Subscribers who opened this message:"
-msgstr "Iscritti che hanno aperto il messaggio:"
-
-#: views/campaigns/opened.hbs:12
-msgid "First open"
-msgstr "Prima apertura"
-
-#: views/campaigns/opened.hbs:13
-msgid "Opened count"
-msgstr "Numero di aperture"
-
-#: views/campaigns/unsubscribed.hbs:3 views/campaigns/unsubscribed.hbs:4
-msgid "Unsubscribed info"
-msgstr "Informazioni utenti rimossi"
-
-#: views/campaigns/unsubscribed.hbs:6
-msgid "Subscribers who unsubscribed:"
-msgstr "Iscritti che si sono rimossi:"
-
-#: views/campaigns/unsubscribed.hbs:11 views/campaigns/view.hbs:28
-#: views/lists/subscription/import.hbs:13 routes/lists.js:206
-msgid "Unsubscribed"
-msgstr "Rimossi"
-
-#: views/campaigns/upload-attachment.hbs:7
-msgid "Upload"
-msgstr "Carica"
-
-#: views/campaigns/view.hbs:4
-msgid "Overview"
-msgstr "Panoramica"
-
-#: views/campaigns/view.hbs:5
-msgid "Links"
-msgstr "Links"
-
-#: views/campaigns/view.hbs:7
-msgid "Feed URL"
-msgstr "Feed URL"
-
-#: views/campaigns/view.hbs:8
-msgid "Last check"
-msgstr "Ultimo controllo"
-
-#: views/campaigns/view.hbs:9
-msgid "Not yet checked"
-msgstr "Non ancora controllati"
-
-#: views/campaigns/view.hbs:10
-msgid "activate campaign to start checking feed for new messages"
-msgstr "attiva la campagna per controllare il feed per nuovi messaggi"
-
-#: views/campaigns/view.hbs:11
-msgid "RSS status"
-msgstr "Stato RSS"
-
-#: views/campaigns/view.hbs:16
-msgid "Preview campaign as"
-msgstr "Guarda l'anteprima come"
-
-#: views/campaigns/view.hbs:17
-msgid "Add new test user"
-msgstr "Aggiungi un utente di test"
-
-#: views/campaigns/view.hbs:18
-msgid "No test users yet, create one here"
-msgstr "Non sono presenti utenti di test, creane uno qui"
-
-#: views/campaigns/view.hbs:19
-msgid "Go"
-msgstr "Vai"
-
-#: views/campaigns/view.hbs:20 lib/models/triggers.js:26
-msgid "Delivered"
-msgstr "Consegnato"
-
-#: views/campaigns/view.hbs:21
-msgid "List subscribers who received this message"
-msgstr "Elenca iscritti che hanno ricevuto il messaggio"
-
-#: views/campaigns/view.hbs:22
-msgid "Blacklisted"
-msgstr "In lista nera"
-
-#: views/campaigns/view.hbs:23
-msgid "List subscribers who blacklisted by global blacklist"
-msgstr "Lista degli iscritti in lista nera per la lista nera globale"
-
-#: views/campaigns/view.hbs:24 routes/lists.js:206
-msgid "Bounced"
-msgstr "Rimbalzato"
-
-#: views/campaigns/view.hbs:25
-msgid "List subscribers who bounced"
-msgstr "Lista utenti che hanno rimbalzato"
-
-#: views/campaigns/view.hbs:26
-msgid "Complaints"
-msgstr "Reclami"
-
-#: views/campaigns/view.hbs:27
-msgid "List subscribers who complained for this message"
-msgstr "Lista degli iscritti che hanno fatto un reclamo per questo messaggio"
-
-#: views/campaigns/view.hbs:29
-msgid "List subscribers who unsubscribed after this message"
-msgstr ""
-"Lista degli utenti che si sono cancellati in seguito a questo messaggio"
-
-#: views/campaigns/view.hbs:30
-msgid "Opened"
-msgstr "Aperta"
-
-#: views/campaigns/view.hbs:31
-msgid "List subscribers who opened this message"
-msgstr "Lista degli iscritti che hanno aperto questo messaggio"
-
-#: views/campaigns/view.hbs:32
-msgid "Clicked"
-msgstr "Cliccate"
-
-#: views/campaigns/view.hbs:33 views/campaigns/view.hbs:70
-msgid "List subscribers who clicked on a link"
-msgstr "Lista degli iscritti che hanno cliccato su di un link"
-
-#: views/campaigns/view.hbs:34
-msgid ""
-"Are you sure? This action would start sending messages to the selected list"
-msgstr ""
-"Sei sicuro? Questa azione farà iniziare l'invio dei messaggi alla lista "
-"selezionata"
-
-#: views/campaigns/view.hbs:35
-msgid "Delay sending"
-msgstr "Ritarda invio"
-
-#: views/campaigns/view.hbs:36
-msgid "hours"
-msgstr "ore"
-
-#: views/campaigns/view.hbs:37
-msgid "minutes"
-msgstr "minuti"
-
-#: views/campaigns/view.hbs:38
-msgid "Send to subscribers:"
-msgstr "Invia agli iscritti:"
-
-#: views/campaigns/view.hbs:39
-msgid "Are you sure? This action would reset scheduling"
-msgstr "Sei sicuro? Questa azione resetterà la programmazione"
-
-#: views/campaigns/view.hbs:40
-msgid "Cancel"
-msgstr "Annulla"
-
-#: views/campaigns/view.hbs:41
-msgid "Sending scheduled"
-msgstr "Invio programmato"
-
-#: views/campaigns/view.hbs:42 views/campaigns/view.hbs:54
-msgid "Pause"
-msgstr "Pausa"
-
-#: views/campaigns/view.hbs:43 routes/campaigns.js:253
-msgid "Sending"
-msgstr "Invio in corso"
-
-#: views/campaigns/view.hbs:44 views/campaigns/view.hbs:48
-msgid ""
-"Are you sure? This action would resume sending messages to the selected list"
-msgstr ""
-"Sei sicuro? Questa azione riprenderà l'invio dei messaggi alla lista "
-"selzionata"
-
-#: views/campaigns/view.hbs:45 views/campaigns/view.hbs:49
-msgid "Are you sure? This action would reset all stats about current progress"
-msgstr ""
-"Sei sicuro? Questa azione resetterà tutte le statistiche riguardanti il "
-"progresso attuale"
-
-#: views/campaigns/view.hbs:46
-msgid "Resume"
-msgstr "Riprendi"
-
-#: views/campaigns/view.hbs:47 views/campaigns/view.hbs:51
-msgid "Reset"
-msgstr "Resetta"
-
-#: views/campaigns/view.hbs:50
-msgid "Continue"
-msgstr "Continua"
-
-#: views/campaigns/view.hbs:52
-msgid ""
-"All messages sent! Hit \"Continue\" if you you want to send this campaign to "
-"new subscribers"
-msgstr ""
-"Tutti i messaggi inviati! Premi \"Continua\" se vuoi inviare questa campagna "
-"ai nuovi iscritti"
-
-#: views/campaigns/view.hbs:53
-msgid ""
-"Are you sure? This action would pause sending new entries in RSS feed as "
-"email messages to the selected list"
-msgstr ""
-"Sei sicuro? Questa azione metterà in pausa l'invio dei nuovi ingressi dal "
-"feed RSS come email alla lista selezionata"
-
-#: views/campaigns/view.hbs:55 views/campaigns/view.hbs:59
-msgid "Campaign status:"
-msgstr "Stato campagna:"
-
-#: views/campaigns/view.hbs:56
-msgid "ACTIVE"
-msgstr "ATTIVA"
-
-#: views/campaigns/view.hbs:57
-msgid ""
-"Are you sure? This action would start sending new entries in RSS feed as "
-"email messages to the selected list"
-msgstr ""
-"Sei sicuro? Questa azione iniziera ad inviare i nuovi ingressi dal feed RSS "
-"come email alla lista selezionata"
-
-#: views/campaigns/view.hbs:58
-msgid "Activate"
-msgstr "Attiva"
-
-#: views/campaigns/view.hbs:60
-msgid "INACTIVE"
-msgstr "INATTIVA"
-
-#: views/campaigns/view.hbs:61
-msgid ""
-"This is a triggered campaign. Messages are only sent to subscribers that hit "
-"some trigger that invokes this campaign"
-msgstr ""
-"Questa e' una campagna innescabile. I messaggi sono inviati solo agli "
-"iscritti che hanno innescato questa campagna"
-
-#: views/campaigns/view.hbs:62
-msgid "see more"
-msgstr "guarda di più"
-
-#: views/campaigns/view.hbs:67
-msgid "List subscribers who clicked this link"
-msgstr "Lista iscritti che hanno cliccato questo link"
-
-#: views/campaigns/view.hbs:71
-msgid ""
-"Clicks are counted as unique subscribers that clicked on a specific link or "
-"on any link (in aggregated view)"
-msgstr ""
-"I clicks sono contati come iscritti unici che hanno cliccato un link "
-"specifico o (nella vista aggregata) su di un qualsiasi link"
-
-#: views/campaigns/view.hbs:72
-msgid ""
-"If a new entry is found from campaign feed a new subcampaign is created of "
-"that entry and it will be listed here"
-msgstr ""
-"Se un nuovo ingresso è trovato nel feed della campagna, una nuova sotto-"
-"campagna verrà creata per quella entry e sarà visualizzata ui"
-
-#: views/emails/password-reset-html.hbs:1
-#: views/emails/password-reset-text.hbs:1
-msgid "Change your password"
-msgstr "Cambia la tua password"
-
-#: views/emails/password-reset-html.hbs:2
-#: views/emails/password-reset-text.hbs:2
-msgid "We have received a password change request for your Mailtrain account:"
-msgstr ""
-"Abbiamo ricevuto una richiesta di cambio password per il tuo account "
-"Mailtrain"
-
-#: views/emails/password-reset-html.hbs:3
-#: views/emails/password-reset-text.hbs:3
-msgid "Reset password"
-msgstr "Cambia password"
-
-#: views/emails/password-reset-html.hbs:4
-#: views/emails/password-reset-text.hbs:4
-msgid ""
-"If you did not ask to change your password, then you can ignore this email "
-"and your password will not be changed."
-msgstr ""
-"Se non hai chiesto tu di cambiare password, puoi ignorare questa email e la "
-"tua password resterà la stessa."
-
-#: views/emails/rss-html.hbs:1 views/emails/stationery-html.hbs:3
-#: views/emails/stationery-text.hbs:3
-msgid "Preferences"
-msgstr "Preferenze"
-
-#: views/emails/rss-html.hbs:2 views/emails/stationery-html.hbs:4
-#: views/emails/stationery-text.hbs:4 views/lists/forms/edit.hbs:20
-#: views/lists/subscription/edit.hbs:16
-#: views/subscription/partials/subscription-unsubscribe-form.hbs:2
-#: views/subscription/web-manage.mjml.hbs:3
-#: views/subscription/web-unsubscribe.mjml.hbs:1
-#: views/subscription/web-unsubscribe.mjml.hbs:2 routes/forms.js:223
-#: routes/lists.js:288
-msgid "Unsubscribe"
-msgstr "Cancella iscrizione"
-
-#: views/emails/rss-html.hbs:3 views/emails/stationery-html.hbs:5
-#: views/emails/stationery-text.hbs:5
-msgid "View this email in your browser"
-msgstr "Guarda questa email nel tuo browser"
-
-#: views/emails/stationery-html.hbs:1 views/emails/stationery-text.hbs:1
-msgid "Hey [FIRST_NAME/Customer],"
-msgstr "Ciao [FIRST_NAME/Customer],"
-
-#: views/emails/stationery-html.hbs:2 views/emails/stationery-text.hbs:2
-msgid "Cheers,"
-msgstr "Ringraziandoti"
-
-#: views/index.hbs:1
-msgid "List Management"
-msgstr "Gestione lista"
-
-#: views/index.hbs:2
-msgid ""
-"Mailtrain allows you to easily manage even very large lists. Million "
-"subscribers? Not a problem. You can add subscribers manually, through the "
-"API or import from a CSV file. All lists come with support for custom fields "
-"and merge tags as well."
-msgstr ""
-"Mailtrain ti permette di gestire facilmente grosse liste. Milioni di "
-"iscritti? Nessun problema. Puoi aggiungere iscritti manualmente, via API "
-"oppure importarli tramite CSV. Tutte le liste hanno la possibilità di "
-"aggiungere campi personalizzati e tag di merge."
-
-#: views/index.hbs:3 views/index.hbs:7 views/index.hbs:10 views/index.hbs:13
-#: views/index.hbs:16 views/index.hbs:19 views/index.hbs:22 views/index.hbs:25
-#: views/index.hbs:28
-msgid "Show more"
-msgstr "Guarda di più"
-
-#: views/index.hbs:4 views/lists/fields/create.hbs:3
-#: views/lists/fields/edit.hbs:3 views/lists/fields/fields.hbs:3
-#: views/lists/fields/fields.hbs:5 views/lists/view.hbs:6
-msgid "Custom Fields"
-msgstr "Campi personalizzati"
-
-#: views/index.hbs:5
-msgid ""
-"Text fields, numbers, drop downs or checkboxes, Mailtrain has them all. "
-"Every custom field can be included in the generated newsletters through "
-"merge tags."
-msgstr ""
-"Campi di testo, numeri, drop downs o segni di spunta, Mailtrain li "
-"implementa tutti. Ogni campo personalizzato può essere incluso nella "
-"newsletter generata tramite i tag di merge."
-
-#: views/index.hbs:6
-msgid "Mailtrain also supports custom forms."
-msgstr "Mailtrain supporta form personalizzati"
-
-#: views/index.hbs:8
-msgid "List Segmentation"
-msgstr "Segmentazione della lista"
-
-#: views/index.hbs:9
-msgid ""
-"Send messages only to list subscribers that match predefined segmentation "
-"rules. No need to create separate lists with small differences."
-msgstr ""
-"Invia messaggi solo agli iscritti che rientrano in una regola di "
-"segmentazione predefinita. Non c'è bisogno di creare liste separate con "
-"piccole differenze."
-
-#: views/index.hbs:11
-msgid "RSS Campaigns"
-msgstr "Campagne RSS"
-
-#: views/index.hbs:12
-msgid ""
-"Setup Mailtrain to track RSS feeds and if a new entry is detected in a feed "
-"then Mailtrain auto-generates a new campaign using entry data as message "
-"contents and sends it to selected subscribers."
-msgstr ""
-"Configura Mailtrain per tracciare i feed RSS e se viene identificato un "
-"nuovo ingresso Mailtrain auto genera una nuova campagna utilizzando i dati "
-"del contenuto del messaggio del feed e lo invia agli iscritti selezionati."
-
-#: views/index.hbs:14
-msgid "GPG Encryption"
-msgstr "Crittografia GPG"
-
-#: views/index.hbs:15
-msgid ""
-"If a list has a custom field for a GPG Public Key set then subscribers can "
-"upload their GPG public key to receive encrypted messages from the list."
-msgstr ""
-"Se una lista ha un campo personalizzato per un set di chiave pubblica GPG "
-"allora gli iscritti possono caricare la loro chiave GPG pubblica per "
-"ricevere messaggi criptati dalla lista."
-
-#: views/index.hbs:17
-msgid "Click Stats"
-msgstr "Statistiche click"
-
-#: views/index.hbs:18
-msgid ""
-"After a campaign is sent, check individual click statistics for every link "
-"included in the message."
-msgstr ""
-"Dopo che una campagna è stata inviata, controlla le statistiche di ogni "
-"click per ogni link incluso nel messaggio."
-
-#: views/index.hbs:20
-msgid "Template Editors"
-msgstr "Editors dei templates"
-
-#: views/index.hbs:21
-msgid ""
-"Mailtrain ships with GrapeJS and Mosaico built in, two advanced template "
-"editors. Mailtrain also offers a code editor if you prefer to handcraft the "
-"HTML yourself."
-msgstr ""
-"Mailtrain include GrapeJS e Mosaico, due editors di template avanzati. "
-"Mailtrain offre inoltre un editor di codice se preferisci scrivere tu l'HTML."
-
-#: views/index.hbs:23
-msgid "Send via Any Provider"
-msgstr "Invia tramite qualsiasi provider"
-
-#: views/index.hbs:24
-msgid ""
-"You can use any provider that supports SMTP protocol to send out your "
-"newsletters. Bounce and complaints handling via webhooks is supported for "
-"SES, SparkPost, SendGrid and Mailgun, also for Postfix and ZoneMTA."
-msgstr ""
-"Puoi utilizzare qualsiasi provider che supporti SMTP per inviare la tua "
-"newsletter. La gestione di rimbalzi e reclami via webhooks è supportata per "
-"SES, SparkPost, SendGrid, Mailgun, Postfix e ZoneMTA."
-
-#: views/index.hbs:26 lib/tools.js:137
-msgid "Automation"
-msgstr "Automazione"
-
-#: views/index.hbs:27
-msgid ""
-"Define automation triggers to send specific messages when a user activates "
-"the trigger."
-msgstr ""
-"Definisci gli inneschi di automazione per l'invio di messaggi specifici "
-"quando un utente innesca una azione specifica."
-
-#: views/layout.hbs:2
-msgid "Toggle navigation"
-msgstr "Attiva navigazione"
-
-#: views/layout.hbs:3
-msgid "Wiki"
-msgstr "Wiki"
-
-#: views/layout.hbs:4
-msgid "Blog"
-msgstr "Blog"
-
-#: views/layout.hbs:5 views/users/account.hbs:2 views/users/account.hbs:3
-msgid "Account"
-msgstr "Account"
-
-#: views/layout.hbs:6 views/settings.hbs:2 views/settings.hbs:3
-msgid "Settings"
-msgstr "Impostazioni"
-
-#: views/layout.hbs:8 views/users/api.hbs:2 views/users/api.hbs:3
-msgid "API"
-msgstr "API"
-
-#: views/layout.hbs:9
-msgid "Log out"
-msgstr "Esci"
-
-#: views/layout.hbs:10 views/users/forgot.hbs:2 views/users/login.hbs:2
-#: views/users/login.hbs:3 views/users/login.hbs:9 views/users/reset.hbs:2
-msgid "Sign in"
-msgstr "Log in"
-
-#: views/layout.hbs:11
-msgid "Self Hosted Newsletter App Built on Top of Nodemailer"
-msgstr ""
-"Applicazione per newsletter self hosted costruita sulla base di Nodemailer"
-
-#: views/layout.hbs:12 views/layout.hbs:14
-msgid "Source on GitHub"
-msgstr "Sorgenti su GitHub"
-
-#: views/layout.hbs:13
-msgid "Subscribe to Our Newsletter"
-msgstr "Iscriviti alla nostra Newsletter"
-
-#: views/lists/create.hbs:2 views/lists/edit.hbs:2
-#: views/lists/fields/create.hbs:2 views/lists/fields/edit.hbs:2
-#: views/lists/fields/fields.hbs:2 views/lists/forms/create.hbs:2
-#: views/lists/forms/edit.hbs:2 views/lists/forms/forms.hbs:2
-#: views/lists/lists.hbs:2 views/lists/lists.hbs:4
-#: views/lists/segments/create.hbs:2 views/lists/segments/edit.hbs:2
-#: views/lists/segments/rule-configure.hbs:2
-#: views/lists/segments/rule-create.hbs:2 views/lists/segments/rule-edit.hbs:2
-#: views/lists/segments/segments.hbs:2 views/lists/segments/view.hbs:2
-#: views/lists/subscription/add.hbs:2 views/lists/subscription/edit.hbs:2
-#: views/lists/subscription/import-failed.hbs:2
-#: views/lists/subscription/import-preview.hbs:2
-#: views/lists/subscription/import.hbs:2 views/lists/view.hbs:2
-#: lib/tools.js:125 routes/lists.js:59
-msgid "Lists"
-msgstr "Liste"
-
-#: views/lists/create.hbs:3 views/lists/create.hbs:4 views/lists/create.hbs:13
-#: views/lists/lists.hbs:3
-msgid "Create List"
-msgstr "Crea Lista"
-
-#: views/lists/create.hbs:6 views/lists/edit.hbs:7
-msgid "List Name"
-msgstr "Nome lista"
-
-#: views/lists/create.hbs:9 views/lists/edit.hbs:15
-#: views/triggers/create.hbs:15 views/triggers/edit.hbs:17
-msgid "Subscription"
-msgstr "Iscrizione"
-
-#: views/lists/create.hbs:10 views/lists/edit.hbs:16
-msgid "Allow public users to subscribe themselves"
-msgstr "Permetti utenti pubblici di iscriversi da soli"
-
-#: views/lists/create.hbs:11 views/lists/edit.hbs:17
-msgid "Unsubscription"
-msgstr "Cancellazione iscrizione"
-
-#: views/lists/create.hbs:12 views/lists/edit.hbs:18
-msgid "Select how an unsuscription request by subscriber is handled."
-msgstr ""
-"Seleziona come una richiesta di rimozione dell'iscrizione viene gestita."
-
-#: views/lists/edit.hbs:3 views/lists/edit.hbs:4 views/lists/view.hbs:8
-msgid "Edit List"
-msgstr "Modifica lista"
-
-#: views/lists/edit.hbs:5
-msgid "View List"
-msgstr "Guarda Lista"
-
-#: views/lists/edit.hbs:8
-msgid "List ID"
-msgstr "ID lista"
-
-#: views/lists/edit.hbs:9
-msgid "This is the list ID displayed to the subscribers"
-msgstr "Questo è l'ID della lista mostrato agli iscritti"
-
-#: views/lists/edit.hbs:12
-msgid "Custom Form"
-msgstr "Form personalizzato"
-
-#: views/lists/edit.hbs:13 views/lists/forms/forms.hbs:11
-msgid "Default Mailtrain Form"
-msgstr "Form predefinito di Mailtrain"
-
-#: views/lists/edit.hbs:14
-msgid ""
-"The custom form used for this list. You can create a form here."
-msgstr ""
-"Il form personalizzato per questa lista. Puoi creare un form qui."
-
-#: views/lists/edit.hbs:19
-msgid "Delete List"
-msgstr "Cancella lista"
-
-#: views/lists/fields/create.hbs:4
-msgid "Create Field"
-msgstr "Crea campo"
-
-#: views/lists/fields/create.hbs:5 views/lists/fields/fields.hbs:4
-msgid "Create Custom Field"
-msgstr "Crea campo personalizzato"
-
-#: views/lists/fields/create.hbs:6 views/lists/fields/create.hbs:7
-#: views/lists/fields/edit.hbs:7 views/lists/fields/edit.hbs:8
-msgid "Field Name"
-msgstr "Nome campo"
-
-#: views/lists/fields/create.hbs:8 views/lists/fields/edit.hbs:9
-msgid "Field Type"
-msgstr "Tipo campo"
-
-#: views/lists/fields/create.hbs:9 views/lists/fields/edit.hbs:10
-#: lib/models/fields.js:17
-msgid "Text"
-msgstr "Testo"
-
-#: views/lists/fields/create.hbs:10 views/lists/fields/edit.hbs:11
-#: lib/models/fields.js:21
-msgid "Number"
-msgstr "Numero"
-
-#: views/lists/fields/create.hbs:11 views/lists/fields/edit.hbs:12
-#: lib/models/fields.js:18
-msgid "Website"
-msgstr "Sito web"
-
-#: views/lists/fields/create.hbs:12 views/lists/fields/edit.hbs:13
-#: lib/models/fields.js:20
-msgid "GPG Public Key"
-msgstr "Chiave pubblica GPG"
-
-#: views/lists/fields/create.hbs:13 views/lists/fields/edit.hbs:14
-#: lib/models/fields.js:19
-msgid "Multi-line text"
-msgstr "Testo multi linea"
-
-#: views/lists/fields/create.hbs:14 views/lists/fields/edit.hbs:15
-msgid "JSON"
-msgstr "JSON"
-
-#: views/lists/fields/create.hbs:15 views/lists/fields/edit.hbs:16
-msgid "Date"
-msgstr "Data"
-
-#: views/lists/fields/create.hbs:16 views/lists/fields/edit.hbs:17
-msgid "Date (MM/DD/YYYY)"
-msgstr "Data (MM/GG/ANNO)"
-
-#: views/lists/fields/create.hbs:17 views/lists/fields/edit.hbs:18
-#: lib/models/fields.js:26
-msgid "Date (DD/MM/YYYY)"
-msgstr "Data (GG/MM/ANNO)"
-
-#: views/lists/fields/create.hbs:18 views/lists/fields/edit.hbs:19
-msgid "Birthday"
-msgstr "Compleanno"
-
-#: views/lists/fields/create.hbs:19 views/lists/fields/edit.hbs:20
-#: lib/models/fields.js:27
-msgid "Birthday (MM/DD)"
-msgstr "Compleanno (MM/GG)"
-
-#: views/lists/fields/create.hbs:20 views/lists/fields/edit.hbs:21
-#: lib/models/fields.js:28
-msgid "Birthday (DD/MM)"
-msgstr "Compleanno (GG/MM)"
-
-#: views/lists/fields/create.hbs:21 views/lists/fields/edit.hbs:22
-msgid "Grouped"
-msgstr "Raggruppati"
-
-#: views/lists/fields/create.hbs:22 views/lists/fields/edit.hbs:23
-msgid "Drop Downs"
-msgstr "Drop Downs"
-
-#: views/lists/fields/create.hbs:23 views/lists/fields/edit.hbs:24
-#: lib/models/fields.js:22
-msgid "Radio Buttons"
-msgstr "Radio Buttons"
-
-#: views/lists/fields/create.hbs:24 views/lists/fields/edit.hbs:25
-#: lib/models/fields.js:23
-msgid "Checkboxes"
-msgstr "Checkboxes"
-
-#: views/lists/fields/create.hbs:25 views/lists/fields/edit.hbs:26
-msgid "Option for a group value"
-msgstr "Option for group value"
-
-#: views/lists/fields/create.hbs:26 views/lists/fields/edit.hbs:27
-msgid "Group"
-msgstr "Group"
-
-#: views/lists/fields/create.hbs:28 views/lists/fields/edit.hbs:29
-msgid "Required for group options"
-msgstr "Richiesto per le group options"
-
-#: views/lists/fields/create.hbs:29 views/lists/fields/create.hbs:30
-#: views/lists/fields/edit.hbs:35 views/lists/fields/edit.hbs:36
-#: views/lists/fields/fields.hbs:9
-msgid "Default merge tag value"
-msgstr "Valore di merge tag di default"
-
-#: views/lists/fields/create.hbs:32 views/lists/fields/edit.hbs:34
-msgid ""
-"For group elements like checkboxes you can control the appearance of the "
-"merge tag with an optional template. The template uses handlebars syntax and "
-"you can find all values from {{values}} array, for example "
-"{{#each values}} {{this}} {{/each}}. If template is not defined "
-"then multiple values are joined with commas. You can also use this template "
-"to render JSON values (if the JSON is an array then the array is exposed as "
-"values, otherwise you can access the JSON keys directly)."
-msgstr ""
-"Per i gruppi di elementi come i checkboxes, puoi controllare l'aspetto "
-"visivo del merge tag con un template opzionale. Il template usa la sintassi "
-"di handlebars e puoi trovare tutti i valori dall'array {{values}}"
-"code>, per esempio {{#each values}} {{this}} {{/each}}. Se il "
-"template non è definito allora i valori multipli vengono uniti dalla "
-"virgola. Puoi anche utilizzare questo template per visualizzare valori JSON "
-"(se il valore JSON è un array allora l'array viene esposto come "
-"values, altrimenti puoi accedere direttamente alle keys del "
-"JSON)."
-
-#: views/lists/fields/create.hbs:33 views/lists/fields/edit.hbs:37
-msgid "Visible"
-msgstr "Visibile"
-
-#: views/lists/fields/create.hbs:34
-msgid "Add Field"
-msgstr "Aggiungi campo"
-
-#: views/lists/fields/edit.hbs:4
-msgid "Edit Field"
-msgstr "Modifica campo"
-
-#: views/lists/fields/edit.hbs:5
-msgid "Edit Custom Field"
-msgstr "Modifica campo personalizzato"
-
-#: views/lists/fields/edit.hbs:6
-msgid "Back to fields"
-msgstr "Indietro ai campi"
-
-#: views/lists/fields/edit.hbs:30 views/lists/fields/fields.hbs:8
-#: views/mosaico/editor.hbs:2 views/partials/merge-tag-reference.hbs:3
-msgid "Merge tag"
-msgstr "Merge tag"
-
-#: views/lists/fields/edit.hbs:31
-msgid "Merge Tag"
-msgstr "Merge Tag"
-
-#: views/lists/fields/edit.hbs:32
-msgid "Put this tag in your content:"
-msgstr "Metti questo tag nel tuo contenuto:"
-
-#: views/lists/fields/edit.hbs:38
-msgid "Delete Field"
-msgstr "Elimina campo"
-
-#: views/lists/fields/fields.hbs:7 views/lists/view.hbs:26
-#: views/report-templates/partials/report-template-fields.hbs:5
-msgid "Type"
-msgstr "Tipo"
-
-#: views/lists/fields/fields.hbs:10 views/lists/fields/fields.hbs:11
-#: views/lists/forms/edit.hbs:26 views/lists/forms/forms.hbs:8
-#: views/lists/segments/segments.hbs:8 views/lists/segments/view.hbs:12
-#: views/triggers/triggers.hbs:14 routes/campaigns.js:276
-#: routes/campaigns.js:568 routes/campaigns.js:657 routes/campaigns.js:706
-#: routes/lists.js:170 routes/lists.js:257 routes/report-templates.js:51
-#: routes/templates.js:183 routes/triggers.js:297
-msgid "Edit"
-msgstr "Modifica"
-
-#: views/lists/forms/create.hbs:3 views/lists/forms/edit.hbs:3
-#: views/lists/forms/forms.hbs:3 views/lists/forms/forms.hbs:5
-#: views/lists/view.hbs:5
-msgid "Custom Forms"
-msgstr "Form personalizzati"
-
-#: views/lists/forms/create.hbs:4
-msgid "Create Form"
-msgstr "Crea form"
-
-#: views/lists/forms/create.hbs:5 views/lists/forms/forms.hbs:4
-msgid "Create Custom Form"
-msgstr "Crea form personalizzato"
-
-#: views/lists/forms/create.hbs:6 views/lists/forms/create.hbs:7
-#: views/lists/forms/edit.hbs:7 views/lists/forms/edit.hbs:8
-msgid "Form Name"
-msgstr "Nome form"
-
-#: views/lists/forms/create.hbs:8
-msgid "Add Form"
-msgstr "Aggiungi form"
-
-#: views/lists/forms/edit.hbs:4
-msgid "Edit Form"
-msgstr "Modifica Form"
-
-#: views/lists/forms/edit.hbs:5
-msgid "Edit Custom Form"
-msgstr "Modifica form personalizzato"
-
-#: views/lists/forms/edit.hbs:6
-msgid "Back to forms"
-msgstr "Indietro ai forms"
-
-#: views/lists/forms/edit.hbs:10
-msgid "Optional comments about this form"
-msgstr "Commenti opzionali per questo form"
-
-#: views/lists/forms/edit.hbs:11
-msgid "Form Preview"
-msgstr "Anteprima Form"
-
-#: views/lists/forms/edit.hbs:12
-msgid ""
-"Note: These links are solely for a quick preview. If you submit a preview "
-"form you'll get redirected to the list's default form."
-msgstr ""
-"Nota: Questi links sono solo per un'anteprima veloce. Se confermi l'invio di "
-"un form in anteprima verrai rediretto al form di default della lista."
-
-#: views/lists/forms/edit.hbs:13 views/lists/subscription/add.hbs:16
-#: views/subscription/mail-unsubscription-confirmed-html.mjml.hbs:4
-#: views/subscription/mail-unsubscription-confirmed-text.hbs:4
-#: routes/forms.js:157 routes/lists.js:288
-msgid "Subscribe"
-msgstr "Iscriviti"
-
-#: views/lists/forms/edit.hbs:14
-msgid "Confirm Subscription Notice"
-msgstr "Notifica iscrizione confermata"
-
-#: views/lists/forms/edit.hbs:15
-msgid "Confirm Unsubscription Notice"
-msgstr "Conferma notifica di cancellazione iscrizione"
-
-#: views/lists/forms/edit.hbs:16
-msgid "Subscribed Notice"
-msgstr "Notifica iscrizione"
-
-#: views/lists/forms/edit.hbs:17
-msgid "Updated Notice"
-msgstr "Notifica di aggiornamento"
-
-#: views/lists/forms/edit.hbs:18
-msgid "Unsubscribed Notice"
-msgstr "Notifica di cancellazione di iscrizione"
-
-#: views/lists/forms/edit.hbs:19
-msgid "Manual Unsubscribe Notice"
-msgstr "Notifica di cancellazione iscrizione manuale"
-
-#: views/lists/forms/edit.hbs:21 routes/forms.js:205
-msgid "Manage"
-msgstr "Gestisci"
-
-#: views/lists/forms/edit.hbs:22
-msgid "Manage Address"
-msgstr "Gestisci indirizzo"
-
-#: views/lists/forms/edit.hbs:23
-msgid "Create a test user for additional options"
-msgstr "Crea un utente di test per le opzioni aggiuntive"
-
-#: views/lists/forms/edit.hbs:24 views/report-templates/create.hbs:3
-#: views/report-templates/edit.hbs:3
-#: views/report-templates/report-templates.hbs:3 views/templates/create.hbs:2
-#: views/templates/edit.hbs:2 views/templates/templates.hbs:2
-#: views/templates/templates.hbs:4 lib/tools.js:129 routes/templates.js:27
-msgid "Templates"
-msgstr "Templates"
-
-#: views/lists/forms/edit.hbs:25
-msgid "Fields"
-msgstr "Campi"
-
-#: views/lists/forms/edit.hbs:27
-msgid "Form Fields"
-msgstr "Campi del form"
-
-#: views/lists/forms/edit.hbs:28
-msgid "Fields hidden on subscription page:"
-msgstr "Campi nascosti sulla pagina di iscrizione:"
-
-#: views/lists/forms/edit.hbs:29
-msgid "Fields shown on subscription page:"
-msgstr "Campi mostrati sulla pagina di iscrizione:"
-
-#: views/lists/forms/edit.hbs:30
-msgid "Fields hidden on preferences page:"
-msgstr "Campi nascosti sulla pagina delle preferenze:"
-
-#: views/lists/forms/edit.hbs:31
-msgid "Fields shown on preferences page:"
-msgstr "Campi mostrati sulla pagina delle preferenze:"
-
-#: views/lists/forms/edit.hbs:32
-msgid "Delete Form"
-msgstr "Cancella form"
-
-#: views/lists/forms/forms.hbs:10
-msgid "The default form for this list is:"
-msgstr "Il form di default per questa lista:"
-
-#: views/lists/lists.hbs:6
-msgid "ID"
-msgstr "ID"
-
-#: views/lists/lists.hbs:7 views/reports/partials/report-fields.hbs:10
-msgid "Subscribers"
-msgstr "Iscritti"
-
-#: views/lists/segments/create.hbs:3 views/lists/segments/edit.hbs:3
-#: views/lists/segments/rule-configure.hbs:3
-#: views/lists/segments/rule-create.hbs:3 views/lists/segments/rule-edit.hbs:3
-#: views/lists/segments/segments.hbs:3 views/lists/segments/segments.hbs:5
-#: views/lists/segments/view.hbs:3 views/lists/view.hbs:7
-#: views/lists/view.hbs:14
-msgid "Segments"
-msgstr "Segmenti"
-
-#: views/lists/segments/create.hbs:4 views/lists/segments/create.hbs:5
-#: views/lists/segments/rule-configure.hbs:4
-#: views/lists/segments/rule-create.hbs:4 views/lists/segments/rule-edit.hbs:4
-#: views/lists/segments/segments.hbs:4
-msgid "Create Segment"
-msgstr "Crea segmento"
-
-#: views/lists/segments/create.hbs:6 views/lists/segments/create.hbs:7
-#: views/lists/segments/edit.hbs:7 views/lists/segments/edit.hbs:8
-msgid "Segment Name"
-msgstr "Nome segmento"
-
-#: views/lists/segments/create.hbs:8 views/lists/segments/edit.hbs:9
-msgid "Rule match"
-msgstr "Regola di corrispondenza"
-
-#: views/lists/segments/create.hbs:10 views/lists/segments/edit.hbs:11
-msgid "All rules must match"
-msgstr "Tutte le regole devono corrispondere con"
-
-#: views/lists/segments/create.hbs:11 views/lists/segments/edit.hbs:12
-msgid "Any rule can match"
-msgstr "Qualsiasi regola può corrispondere con"
-
-#: views/lists/segments/create.hbs:12
-msgid "Add Segment"
-msgstr "Aggiungi segmento"
-
-#: views/lists/segments/edit.hbs:4 views/lists/segments/edit.hbs:5
-#: views/lists/segments/view.hbs:6 views/lists/view.hbs:12
-msgid "Edit Segment"
-msgstr "Modifica segmento"
-
-#: views/lists/segments/edit.hbs:6
-msgid "Back to segments"
-msgstr "Indietro ai segmenti"
-
-#: views/lists/segments/edit.hbs:13
-msgid "Delete Segment"
-msgstr "Elimina segmento"
-
-#: views/lists/segments/rule-configure.hbs:5
-#: views/lists/segments/rule-create.hbs:5 views/lists/segments/rule-edit.hbs:5
-#: views/lists/segments/view.hbs:4
-msgid "Create Rule"
-msgstr "Crea regola"
-
-#: views/lists/segments/rule-configure.hbs:6
-#: views/lists/segments/rule-create.hbs:6 views/lists/segments/rule-edit.hbs:6
-#: views/lists/segments/view.hbs:10
-msgid "Rule"
-msgstr "Regola"
-
-#: views/lists/segments/rule-configure.hbs:7
-#: views/lists/segments/rule-configure.hbs:8
-#: views/lists/segments/rule-configure.hbs:10
-#: views/lists/segments/rule-configure.hbs:13
-#: views/lists/segments/rule-configure.hbs:25
-#: views/lists/segments/rule-configure.hbs:30
-#: views/lists/segments/rule-edit.hbs:7 views/lists/segments/rule-edit.hbs:8
-#: views/lists/segments/rule-edit.hbs:10 views/lists/segments/rule-edit.hbs:15
-#: views/lists/segments/rule-edit.hbs:29 views/lists/segments/rule-edit.hbs:34
-#: views/lists/segments/view.hbs:11
-msgid "Value"
-msgstr "Valore"
-
-#: views/lists/segments/rule-configure.hbs:9
-#: views/lists/segments/rule-edit.hbs:9
-msgid ""
-"Use % for wildcard character, e.g. \"%test\" to match all values that end "
-"with \"test\""
-msgstr ""
-"Usa % come carattere jolly, per esempio \"%test\" fa passare tutti i valori "
-"che finiscono con \"test\""
-
-#: views/lists/segments/rule-configure.hbs:11
-#: views/lists/segments/rule-configure.hbs:14
-#: views/lists/segments/rule-configure.hbs:26
-#: views/lists/segments/rule-edit.hbs:11 views/lists/segments/rule-edit.hbs:16
-#: views/lists/segments/rule-edit.hbs:30
-msgid "Use exact match"
-msgstr "Usa corrispondenza esatta"
-
-#: views/lists/segments/rule-configure.hbs:12
-#: views/lists/segments/rule-configure.hbs:15
-#: views/lists/segments/rule-configure.hbs:27
-#: views/lists/segments/rule-edit.hbs:12 views/lists/segments/rule-edit.hbs:17
-#: views/lists/segments/rule-edit.hbs:31
-msgid "Use range match"
-msgstr "Usa range di corrispondenza"
-
-#: views/lists/segments/rule-configure.hbs:16
-#: views/lists/segments/rule-edit.hbs:20
-msgid "Use relative range match"
-msgstr "Usa range di corrispondenza relativo"
-
-#: views/lists/segments/rule-configure.hbs:17
-#: views/lists/segments/rule-configure.hbs:28
-#: views/lists/segments/rule-edit.hbs:13 views/lists/segments/rule-edit.hbs:18
-#: views/lists/segments/rule-edit.hbs:21 views/lists/segments/rule-edit.hbs:32
-msgid "From"
-msgstr "Da"
-
-#: views/lists/segments/rule-configure.hbs:18
-#: views/lists/segments/rule-configure.hbs:22
-#: views/lists/segments/rule-edit.hbs:22 views/lists/segments/rule-edit.hbs:26
-msgid "days"
-msgstr "giorni"
-
-#: views/lists/segments/rule-configure.hbs:19
-#: views/lists/segments/rule-configure.hbs:23
-#: views/lists/segments/rule-edit.hbs:23 views/lists/segments/rule-edit.hbs:27
-msgid "before today"
-msgstr "prima di oggi"
-
-#: views/lists/segments/rule-configure.hbs:20
-#: views/lists/segments/rule-configure.hbs:24
-#: views/lists/segments/rule-edit.hbs:24 views/lists/segments/rule-edit.hbs:28
-msgid "after today"
-msgstr "dopo di oggi"
-
-#: views/lists/segments/rule-configure.hbs:21
-#: views/lists/segments/rule-configure.hbs:29
-#: views/lists/segments/rule-edit.hbs:14 views/lists/segments/rule-edit.hbs:19
-#: views/lists/segments/rule-edit.hbs:25 views/lists/segments/rule-edit.hbs:33
-msgid "to"
-msgstr "a"
-
-#: views/lists/segments/rule-configure.hbs:31
-#: views/lists/segments/rule-edit.hbs:35 lib/models/segments.js:156
-#: lib/models/segments.js:418
-msgid "Selected"
-msgstr "Selezionati"
-
-#: views/lists/segments/rule-configure.hbs:32
-#: views/lists/segments/rule-edit.hbs:36 lib/models/segments.js:156
-#: lib/models/segments.js:418
-msgid "Not selected"
-msgstr "Non selezionati"
-
-#: views/lists/segments/rule-configure.hbs:33
-msgid "Add Rule"
-msgstr "Aggiungi regola"
-
-#: views/lists/segments/rule-create.hbs:8
-#: views/lists/subscription/import.hbs:18
-#: views/reports/create-select-template.hbs:5
-#: views/triggers/create-select.hbs:9
-msgid "Next"
-msgstr "Avanti"
-
-#: views/lists/segments/rule-edit.hbs:37
-msgid "Delete Rule"
-msgstr "Cancella regola"
-
-#: views/lists/segments/segments.hbs:7
-msgid "Match"
-msgstr "Corrispondi"
-
-#: views/lists/segments/view.hbs:5 views/lists/view.hbs:13
-msgid "Segment"
-msgstr "Segmento"
-
-#: views/lists/segments/view.hbs:7
-msgid "Match rules"
-msgstr "Corrisponde alla regola"
-
-#: views/lists/segments/view.hbs:8
-msgid "Matching subscribers"
-msgstr "Iscritti corrispondenti"
-
-#: views/lists/segments/view.hbs:9
-msgid "show"
-msgstr "mostra"
-
-#: views/lists/subscription/add.hbs:3 views/lists/subscription/add.hbs:4
-msgid "Add subscriber"
-msgstr "Aggiungi iscritto"
-
-#: views/lists/subscription/add.hbs:5
-#: views/subscription/partials/subscription-custom-fields.hbs:1
-#: views/users/account.hbs:7
-msgid "Email Address"
-msgstr "Indirizzo Email"
-
-#: views/lists/subscription/add.hbs:8 views/lists/subscription/edit.hbs:9
-#: views/settings.hbs:80 views/settings.hbs:95
-#: views/subscription/partials/subscription-custom-fields.hbs:6
-msgid "Begins with"
-msgstr "Inizia con"
-
-#: views/lists/subscription/add.hbs:9 views/lists/subscription/edit.hbs:10
-msgid ""
-"Insert a GPG public key that will be used to encrypt messages sent this "
-"subscriber"
-msgstr ""
-"Inserisci chiave pubblica GPG che verrà usata per crittografare i messaggi "
-"per questo iscritto"
-
-#: views/lists/subscription/add.hbs:11 views/lists/subscription/edit.hbs:12
-#: views/lists/subscription/import-preview.hbs:9
-msgid "Timezone"
-msgstr "Fuso orario"
-
-#: views/lists/subscription/add.hbs:13 views/lists/subscription/edit.hbs:13
-msgid "Test user?"
-msgstr "Utente di test?"
-
-#: views/lists/subscription/add.hbs:14 views/lists/subscription/edit.hbs:14
-msgid ""
-"If checked then this subscription can be used for previewing campaign "
-"messages"
-msgstr ""
-"Se selezionato, questa iscrizione può essere usata per l'anteprima dei "
-"messaggi della campagna"
-
-#: views/lists/subscription/add.hbs:15
-msgid ""
-"This person will not receive a confirmation email so make sure that you have "
-"permission to email them."
-msgstr ""
-"Questa persona non riceverà una email di conferma, quindi assicurati di "
-"avere il permesso di inviargli emails."
-
-#: views/lists/subscription/edit.hbs:3 views/lists/subscription/edit.hbs:4
-msgid "Edit subscriber"
-msgstr "Modifica iscrizione"
-
-#: views/lists/subscription/edit.hbs:5
-#: views/lists/subscription/import-failed.hbs:5
-msgid "Back to list"
-msgstr "Indietro alla lista"
-
-#: views/lists/subscription/edit.hbs:6
-#: views/lists/subscription/import-preview.hbs:6
-#: views/subscription/partials/subscription-unsubscribe-form.hbs:1
-#: lib/helpers.js:42 lib/models/segments.js:11
-msgid "Email address"
-msgstr "Indirizzo email"
-
-#: views/lists/subscription/edit.hbs:17
-msgid "Delete Subscription"
-msgstr "Elimina iscrizione"
-
-#: views/lists/subscription/import-failed.hbs:3
-msgid "Import status"
-msgstr "Stato dell' Import"
-
-#: views/lists/subscription/import-failed.hbs:4
-msgid "Failed addresses"
-msgstr "Indiirizzi falliti"
-
-#: views/lists/subscription/import-failed.hbs:6
-msgid ""
-"Role-based addresses like postmaster@example.com are blocked when importing. "
-"Subscribers with role-based email addresses can join your list using the "
-"subscription form"
-msgstr ""
-"Gli indirizzi di ruolo come postmaster@example.com sono bloccati durante "
-"l'import. Questi indirizzi possono iscriversi alla tua lista con il form di "
-"iscrizione online."
-
-#: views/lists/subscription/import-failed.hbs:7
-msgid "see here"
-msgstr "guarda qui"
-
-#: views/lists/subscription/import-failed.hbs:9
-msgid "Fail reason"
-msgstr "Motivo di errore"
-
-#: views/lists/subscription/import-preview.hbs:3
-#: views/lists/subscription/import-preview.hbs:4
-#: views/lists/subscription/import.hbs:3 views/lists/subscription/import.hbs:4
-msgid "Import subscribers"
-msgstr "Importa iscritti"
-
-#: views/lists/subscription/import-preview.hbs:10 views/users/api.hbs:21
-#: views/users/api.hbs:36 views/users/api.hbs:44 views/users/api.hbs:52
-#: views/users/api.hbs:64 views/users/api.hbs:75 views/users/api.hbs:83
-#: views/users/api.hbs:91 views/users/api.hbs:96
-msgid "Example"
-msgstr "Esempio"
-
-#: views/lists/subscription/import-preview.hbs:11
-msgid "Start import"
-msgstr "Inizia import"
-
-#: views/lists/subscription/import.hbs:5
-msgid "CSV File"
-msgstr "File CSV"
-
-#: views/lists/subscription/import.hbs:6
-msgid "The first line must contain column headings"
-msgstr "La prima linea deve contenere le intestazioni di colonna"
-
-#: views/lists/subscription/import.hbs:7
-msgid "CSV delimiter"
-msgstr "Delimitatore file CSV"
-
-#: views/lists/subscription/import.hbs:8
-msgid "Categorize the imported subscribers as"
-msgstr "Categorizza gli iscritti importati come"
-
-#: views/lists/subscription/import.hbs:9 routes/lists.js:206
-msgid "Subscribed"
-msgstr "Iscritto"
-
-#: views/lists/subscription/import.hbs:10
-msgid "Regular subscriber addresses"
-msgstr "Indirizzi regolari degli iscritti"
-
-#: views/lists/subscription/import.hbs:11
-msgid "Subscribed (Force)"
-msgstr "Iscrizione (Forzata)"
-
-#: views/lists/subscription/import.hbs:12
-msgid "Regular subscriber addresses, resubscribe users that have unsubscribed"
-msgstr ""
-"Indirizzi regolari degli utenti registrati, riscrizione utenti che hanno "
-"cancellato l'iscrizione"
-
-#: views/lists/subscription/import.hbs:14
-msgid "Suppressed emails that will be unsubscribed from your list"
-msgstr "Email soppresse che saranno cancellate dalla tua lista"
-
-#: views/lists/subscription/import.hbs:15
-msgid "Check imported emails"
-msgstr "Controlla le emails importate"
-
-#: views/lists/subscription/import.hbs:16 views/triggers/triggers.hbs:12
-msgid "Enabled"
-msgstr "Abilitato"
-
-#: views/lists/subscription/import.hbs:17 views/triggers/triggers.hbs:13
-msgid "Disabled"
-msgstr "Disabilitato"
-
-#: views/lists/view.hbs:3
-msgid "Subscription Form"
-msgstr "Form di iscrizione"
-
-#: views/lists/view.hbs:4
-msgid "List Actions"
-msgstr "Lista azioni"
-
-#: views/lists/view.hbs:9 views/triggers/create-select.hbs:3
-#: views/triggers/create-select.hbs:4 views/triggers/create.hbs:3
-#: views/triggers/create.hbs:4 views/triggers/create.hbs:27
-#: views/triggers/triggers.hbs:3
-msgid "Create Trigger"
-msgstr "Crea innesco"
-
-#: views/lists/view.hbs:10
-msgid "Add Subscriber"
-msgstr "Aggiungi iscrizione"
-
-#: views/lists/view.hbs:11
-msgid "Import Subscribers"
-msgstr "Importa iscrizioni"
-
-#: views/lists/view.hbs:15
-msgid "Create New Segment"
-msgstr "Crea nuovo segmento"
-
-#: views/lists/view.hbs:16
-msgid "Filter"
-msgstr "Filtra"
-
-#: views/lists/view.hbs:17
-msgid "Subscriptions"
-msgstr "Iscrizioni"
-
-#: views/lists/view.hbs:18
-msgid "Imports"
-msgstr "Importazioni"
-
-#: views/lists/view.hbs:25 routes/campaigns.js:255 routes/lists.js:300
-msgid "Finished"
-msgstr "Finito"
-
-#: views/lists/view.hbs:27
-msgid "Added"
-msgstr "Aggiunto"
-
-#: views/lists/view.hbs:28
-msgid "Updated"
-msgstr "Aggiornato"
-
-#: views/lists/view.hbs:29
-msgid "Failed"
-msgstr "Errore"
-
-#: views/lists/view.hbs:31
-msgid ""
-"Are you sure? This action should only be called to resolve stalled imports"
-msgstr ""
-"Sei sicuro? Questa azione deve essere chiamata solo per risolvere "
-"importazioni in stato di stallo"
-
-#: views/lists/view.hbs:32
-msgid "Restart"
-msgstr "Riavvia"
-
-#: views/mosaico/editor.hbs:1 views/partials/merge-tag-reference.hbs:1
-msgid "Merge tag reference"
-msgstr "Referenza dei tag di merge"
-
-#: views/mosaico/editor.hbs:4
-msgid "MOSAICO Responsive Email Designer"
-msgstr "MOSAICO REsponsive Email Designer"
-
-#: views/mosaico/editor.hbs:5
-msgid "Sucessfully saved"
-msgstr "Salvato con successo"
-
-#: views/mosaico/editor.hbs:6
-msgid "An error occured while saving the document"
-msgstr "Errore durante il salvataggio del documento"
-
-#: views/mosaico/editor.hbs:7
-msgid "Unsaved changes will be lost. Close now?"
-msgstr "Le modifiche non salvate andranno perdute, Chiudere ora?"
-
-#: views/mosaico/editor.hbs:8 views/mosaico/editor.hbs:9
-msgid "Tags"
-msgstr "Tags"
-
-#: views/partials/codeeditor.hbs:1 views/partials/grapejs.hbs:1
-#: views/partials/mosaico.hbs:1 views/partials/summernote.hbs:1
-msgid "Template content (HTML)"
-msgstr "Contenuto template (HTML)"
-
-#: views/partials/editor-navbar.hbs:1
-msgid "SAVE"
-msgstr "SALVA"
-
-#: views/partials/editor-navbar.hbs:2
-msgid "SAVING"
-msgstr "STO SALVANDO"
-
-#: views/partials/editor-navbar.hbs:3
-msgid "CLOSE"
-msgstr "CHIUDI"
-
-#: views/partials/grapejs.hbs:2
-msgid "Open GrapeJS"
-msgstr "Apri GrapeJS"
-
-#: views/partials/html-preview.hbs:1
-msgid "Toggle HTML preview"
-msgstr "Attiva anteprima HTML"
-
-#: views/partials/html-to-text.hbs:1
-msgid ""
-"To extract the text from HTML click here."
-msgstr ""
-"Per estrarre il testo dal codice HTML clicca qui."
-
-#: views/partials/html-to-text.hbs:2
-msgid ""
-"Please note that your existing plaintext in the field above will be "
-"overwritten. This feature uses the Premailer API, a third party "
-"service. Their Terms of Service and Privacy Policy apply."
-msgstr ""
-"Per favore nota che il tuo testo nel campo qui sopra verrà sovrascritto. "
-"Questa caratteristica usa le Premailer API, un servizio di "
-"terzi. I loro Termini per il servizio e la loro Privacy Policy è applicato."
-
-#: views/partials/html-to-text.hbs:3
-msgid "An error occurred while talking to the server"
-msgstr "C'è stato un errore nel comunicare con il server"
-
-#: views/partials/merge-tag-reference.hbs:2
-msgid ""
-"Merge tags are tags that are replaced before sending out the message. The "
-"format of the merge tag is the following: [TAG_NAME] or "
-"[TAG_NAME/fallback] where fallback is an optional "
-"text value used when TAG_NAME is empty."
-msgstr ""
-"Merge tags sono tags che sono sostituiti prima dell'invio del messaggio. Il "
-"formato del merge tag è il seguente [TAG_NAME] oppure "
-"[TAG_NAME/fallback] dove fallback è un valore "
-"opzionale di testo utilizzato quando TAG_NAME è vuoto."
-
-#: views/partials/modal-carousel.hbs:1
-msgid "{{title}}"
-msgstr "{{}}"
-
-#: views/partials/mosaico.hbs:2
-msgid "Open Mosaico"
-msgstr "Apri Mosaico"
-
-#: views/partials/plaintext.hbs:1
-msgid "Template content (plaintext)"
-msgstr "Contenuto del template (test semplice)"
-
-#: views/report-templates/create.hbs:2 views/report-templates/edit.hbs:2
-#: views/report-templates/report-templates.hbs:2
-#: views/reports/create-select-template.hbs:2 views/reports/create.hbs:2
-#: views/reports/edit.hbs:2 views/reports/output.hbs:2
-#: views/reports/reports.hbs:2 views/reports/reports.hbs:5
-#: views/reports/view.hbs:2 lib/tools.js:144 routes/reports.js:31
-msgid "Reports"
-msgstr "Reports"
-
-#: views/report-templates/create.hbs:4 views/report-templates/create.hbs:6
-#: views/report-templates/report-templates.hbs:4 views/templates/create.hbs:3
-#: views/templates/create.hbs:4 views/templates/create.hbs:12
-#: views/templates/templates.hbs:3
-msgid "Create Template"
-msgstr "Crea template"
-
-#: views/report-templates/create.hbs:5 routes/report-templates.js:231
-msgid "Create Report Template"
-msgstr "Crea Template di report"
-
-#: views/report-templates/edit.hbs:4 views/templates/edit.hbs:3
-#: views/templates/edit.hbs:4
-msgid "Edit Template"
-msgstr "Modifica Template"
-
-#: views/report-templates/edit.hbs:5 routes/report-templates.js:262
-msgid "Edit Report Template"
-msgstr "Modifica template report"
-
-#: views/report-templates/edit.hbs:6 views/templates/edit.hbs:12
-msgid "Delete Template"
-msgstr "Elimina template"
-
-#: views/report-templates/edit.hbs:7
-msgid "Update and Stay"
-msgstr "Salva e continua"
-
-#: views/report-templates/edit.hbs:8
-msgid "Update and Leave"
-msgstr "Salva ed esci"
-
-#: views/report-templates/partials/report-template-fields.hbs:2
-msgid "Template Name"
-msgstr "Nome template"
-
-#: views/report-templates/partials/report-template-fields.hbs:6
-msgid "User selectable fields"
-msgstr "Campi selezionabili dagli utenti"
-
-#: views/report-templates/partials/report-template-fields.hbs:7
-msgid "Data processing code"
-msgstr "Codice che processa data"
-
-#: views/report-templates/partials/report-template-fields.hbs:8
-msgid "Rendering template"
-msgstr "Template di rendering"
-
-#: views/report-templates/report-templates.hbs:5
-msgid "Blank"
-msgstr "Vuoto"
-
-#: views/report-templates/report-templates.hbs:6
-msgid "All Subscribers"
-msgstr "Tutti gli iscritti"
-
-#: views/report-templates/report-templates.hbs:7
-msgid "Grouped Subscribers"
-msgstr "Iscritti raggruppati"
-
-#: views/report-templates/report-templates.hbs:8
-msgid "Export List as CSV"
-msgstr "Esporta lista come CSV"
-
-#: views/report-templates/report-templates.hbs:9 views/reports/reports.hbs:4
-#: routes/report-templates.js:29
-msgid "Report Templates"
-msgstr "Templates di report"
-
-#: views/reports/create-select-template.hbs:3
-#: views/reports/create-select-template.hbs:4 views/reports/create.hbs:3
-#: views/reports/create.hbs:4 views/reports/create.hbs:5
-#: views/reports/reports.hbs:3 routes/reports.js:81
-msgid "Create Report"
-msgstr "Crea report"
-
-#: views/reports/edit.hbs:3 views/reports/edit.hbs:4 routes/reports.js:151
-msgid "Edit Report"
-msgstr "Modifica Report"
-
-#: views/reports/edit.hbs:5
-msgid "Delete Report"
-msgstr "Elimina report"
-
-#: views/reports/partials/report-fields.hbs:2
-msgid "Report Name"
-msgstr "Nome report"
-
-#: views/reports/partials/report-fields.hbs:8
-#: views/reports/partials/report-fields.hbs:11
-msgid ""
-"Select a campaign in the table above by clicking on the respective row "
-"number."
-msgstr ""
-"Seleziona una campagna nella tabella qui sopra cliccando sul numero della "
-"riga."
-
-#: views/reports/partials/report-select-template.hbs:1
-msgid "Report Template"
-msgstr "Template del report"
-
-#: views/settings.hbs:5
-msgid "Service Address (URL)"
-msgstr "Indirizzo del servizio (URL)"
-
-#: views/settings.hbs:6
-msgid "Enter the URL this service can be reached from"
-msgstr "Inserisci l'URL a cui puoi accedere a questo servizio"
-
-#: views/settings.hbs:7
-msgid "Admin Email"
-msgstr "Email amministratore"
-
-#: views/settings.hbs:8
-msgid ""
-"Enter the email address that will be used as \"from\" for system messages"
-msgstr ""
-"Inserisci l'indirizzo mail che verra' utilizzato nel campo \"Da\" per i "
-"messaggi di sistemi"
-
-#: views/settings.hbs:9
-msgid "Disable WYSIWYG editor"
-msgstr "Disabilita l'editor avanzato WYSIWYG"
-
-#: views/settings.hbs:10
-msgid "If checked then message editor displays HTML code without the preview"
-msgstr ""
-"Se selezionato l'editor del messaggio visualizza il codice HTML senza "
-"anteprima"
-
-#: views/settings.hbs:11
-msgid "Disable subscription confirmation messages"
-msgstr "Disabilita i messaggi di conferma iscrizione"
-
-#: views/settings.hbs:12
-msgid ""
-"If checked then do not send a confirmation message that states the "
-"subscriber is now subscribed or unsubscribed. This does not disable double "
-"opt-in messages."
-msgstr ""
-"Se selezionato il software non invia messaggi di avvenuta iscrizione e "
-"cancellazione. Questo non disabilita l'invio di messaggi per i link di "
-"conferma delle azioni."
-
-#: views/settings.hbs:13
-msgid "Tracking ID"
-msgstr "ID Tracciamento"
-
-#: views/settings.hbs:14
-msgid "Enter Google Analytics tracking code"
-msgstr "Inserisci il codice di tracciamento di Google Analytics"
-
-#: views/settings.hbs:15
-msgid "Frontpage shout out"
-msgstr "Annuncio pagina iniziale"
-
-#: views/settings.hbs:16
-msgid "HTML code shown in the front page header section"
-msgstr "Codice HTML visualizzato nell'header dell'home page"
-
-#: views/settings.hbs:17
-msgid "Campaign defaults"
-msgstr "Valori predefiniti campagna"
-
-#: views/settings.hbs:18
-msgid "Sender name"
-msgstr "Nome mittente"
-
-#: views/settings.hbs:19
-msgid "Sender name, eg. My Awesome Company Ltd."
-msgstr "Nome mittente, per esempio : Super Compagnia S.r.l."
-
-#: views/settings.hbs:20
-msgid "Default address"
-msgstr "Indirizzo predefinito"
-
-#: views/settings.hbs:21
-msgid ""
-"Contact address to provide, eg. 1234 Main Street, Anywhere, MA 01234, USA"
-msgstr ""
-"Indirizzo fisico di contatto, per esempio: via Duomo 71, Milano, 20100 (MI)"
-
-#: views/settings.hbs:22
-msgid "Default \"from name\""
-msgstr "Valore predefinito nome mittente"
-
-#: views/settings.hbs:24
-msgid "Default \"from\" email"
-msgstr "Valore predefinito email mittente"
-
-#: views/settings.hbs:26
-msgid "Default \"subject line\""
-msgstr "Valore predefinito oggetto"
-
-#: views/settings.hbs:28
-msgid "Default homepage (URL)"
-msgstr "Valore predefinito sito (URL)"
-
-#: views/settings.hbs:29
-msgid "URL to redirect the subscribed users to, eg. http://example.com/"
-msgstr ""
-"URL a cui reindirizzare gli utenti iscritti alla newsletter, per esempio "
-"http://example.com"
-
-#: views/settings.hbs:30
-msgid "Mailer Settings"
-msgstr "Impostazioni mailer"
-
-#: views/settings.hbs:31
-msgid "These settings are required to send out e-mail messages"
-msgstr "Queste impostazioni sono richieste per inviare messaggi email"
-
-#: views/settings.hbs:32
-msgid "SMTP"
-msgstr ""
-
-#: views/settings.hbs:33
-msgid "AWS SES"
-msgstr ""
-
-#: views/settings.hbs:34
-msgid "Use SMTP for sending mail"
-msgstr "Usa SMTP per spedire le email"
-
-#: views/settings.hbs:35
-msgid "Hostname"
-msgstr ""
-
-#: views/settings.hbs:36
-msgid "Port"
-msgstr ""
-
-#: views/settings.hbs:37
-msgid "Port, eg. 465. Autodetected if left blank"
-msgstr ""
-
-#: views/settings.hbs:38
-msgid "Encryption"
-msgstr "Crittografia"
-
-#: views/settings.hbs:39
-msgid "Disable SMTP authentication"
-msgstr "Disabilita autenticazione SMTP"
-
-#: views/settings.hbs:40 views/users/forgot.hbs:9 views/users/login.hbs:4
-#: views/users/login.hbs:5
-msgid "Username"
-msgstr "Nome utente"
-
-#: views/settings.hbs:41
-msgid "Username, eg. myaccount@example.com"
-msgstr "Nome utente (per esempio account@example.com)"
-
-#: views/settings.hbs:42 views/settings.hbs:43 views/users/login.hbs:6
-#: views/users/login.hbs:7
-msgid "Password"
-msgstr ""
-
-#: views/settings.hbs:44
-msgid "Use SES API for sending mail"
-msgstr ""
-
-#: views/settings.hbs:45
-msgid "Access Key"
-msgstr ""
-
-#: views/settings.hbs:46
-msgid "AWS Access Key Id"
-msgstr ""
-
-#: views/settings.hbs:47
-msgid "Secret Key"
-msgstr ""
-
-#: views/settings.hbs:48
-msgid "AWS Secret Access Key"
-msgstr ""
-
-#: views/settings.hbs:49
-msgid "Region"
-msgstr "Regione"
-
-#: views/settings.hbs:50
-msgid "Checking"
-msgstr "Controllo"
-
-#: views/settings.hbs:51
-msgid "Check Mailer config"
-msgstr "Controlla la configurazione del mailer"
-
-#: views/settings.hbs:52
-msgid "Advanced Mailer settings"
-msgstr "Impostazioni Mailer avanzate"
-
-#: views/settings.hbs:53
-msgid "Log SMTP transactions"
-msgstr ""
-
-#: views/settings.hbs:54
-msgid "Allow self-signed certificates"
-msgstr ""
-
-#: views/settings.hbs:55
-msgid "Max connections"
-msgstr "Massime connessioni"
-
-#: views/settings.hbs:56
-msgid "The count of max connections, eg. 10"
-msgstr "Numero massimo di connessioni (per esempio 10)"
-
-#: views/settings.hbs:57
-msgid ""
-"The count of maximum simultaneous connections to make against the SMTP "
-"server (defaults to 5). This limit is per sending process."
-msgstr ""
-
-#: views/settings.hbs:58
-msgid "Max messages"
-msgstr "Massimo messaggi"
-
-#: views/settings.hbs:59
-msgid "The count of max messages, eg. 100"
-msgstr "Il numero dei messaggi massimi, per esempio 1000"
-
-#: views/settings.hbs:60
-msgid ""
-"The number of messages to send through a single connection before the "
-"connection is closed and reopened (defaults to 100)"
-msgstr ""
-
-#: views/settings.hbs:61
-msgid "Throttling"
-msgstr ""
-
-#: views/settings.hbs:62
-msgid "Messages per hour eg. 1000"
-msgstr "Messaggi all'ora"
-
-#: views/settings.hbs:63
-msgid ""
-"Maximum number of messages to send in an hour. Leave empty or zero for no "
-"throttling. If your provider uses a different speed limit (messages/minute "
-"or messages/second) then convert this limit into messages/hour (1m/s => "
-"3600m/h). This limit is per sending process."
-msgstr ""
-"Numero di messaggi massimo da inviare all'ora. Lascia il campo vuoto o con 0 "
-"per non rallentare. Se il tuo provider usa diversi limiti di velocità di "
-"invio (messaggi al minuto o al secondo), converti il valore per adattarlo (1 "
-"mail / secondo => 3600 mail / ora ). Questo valore è per ogni singolo "
-"processo di invio."
-
-#: views/settings.hbs:64
-msgid "VERP bounce handling"
-msgstr ""
-
-#: views/settings.hbs:65
-msgid ""
-"Mailtrain is able to use VERP based routing to detect bounces. In this case "
-"the message is sent to the recipient using a custom VERP address as the "
-"return path of the message. If the message is not accepted a bounce email is "
-"sent to this special VERP address and thus a bounce is detected."
-msgstr ""
-
-#: views/settings.hbs:66
-msgid ""
-"To get VERP working you need to set up a DNS MX record that points to your "
-"Mailtrain hostname. You must also ensure that Mailtrain VERP interface is "
-"available from port 25 of your server (port 25 usually requires root user "
-"privileges). This way if anyone tries to send email to someuser@verp-"
-"hostname then the email should end up to this server."
-msgstr ""
-
-#: views/settings.hbs:67
-msgid ""
-"VERP usually only works if you are using your own SMTP server. Regular relay "
-"services (SES, SparkPost, Gmail etc.) tend to remove the VERP address from "
-"the message."
-msgstr ""
-
-#: views/settings.hbs:68
-msgid "Use VERP to catch bounces"
-msgstr ""
-
-#: views/settings.hbs:69
-msgid "Server hostname"
-msgstr ""
-
-#: views/settings.hbs:70
-msgid "The VERP server hostname, eg. bounces.example.com"
-msgstr ""
-
-#: views/settings.hbs:71
-msgid ""
-"VERP bounce handling server hostname. This hostname is used in the SMTP "
-"envelope FROM address and the MX DNS records should point to this server"
-msgstr ""
-
-#: views/settings.hbs:72
-msgid ""
-"VERP bounce handling server is not enabled. Modify your server configuration "
-"file and restart server to enable it"
-msgstr ""
-
-#: views/settings.hbs:73
-msgid "GPG Signing"
-msgstr ""
-
-#: views/settings.hbs:74
-msgid ""
-"Only messages that are encrypted can be signed. Subsribers who have not set "
-"up a GPG public key in their profile receive normal email messages. Users "
-"with GPG key set receive encrypted messages and if you have signing key also "
-"set, the messages are signed with this key."
-msgstr ""
-
-#: views/settings.hbs:75
-msgid ""
-"Do not use sensitive keys here. The private key and passphrase are not "
-"encrypted in the database."
-msgstr ""
-
-#: views/settings.hbs:76
-msgid "Private Key Passphrase"
-msgstr ""
-
-#: views/settings.hbs:77
-msgid "Passphrase for the key if set"
-msgstr ""
-
-#: views/settings.hbs:78
-msgid "Only fill this if your private key is encrypted with a passphrase"
-msgstr ""
-
-#: views/settings.hbs:79
-msgid "GPG Private Key"
-msgstr ""
-
-#: views/settings.hbs:81
-msgid ""
-"This value is optional. If you do not provide a private key GPG encrypted "
-"messages are sent without signing."
-msgstr ""
-
-#: views/settings.hbs:82
-msgid "DKIM Signing by ZoneMTA"
-msgstr ""
-
-#: views/settings.hbs:83
-msgid ""
-"If you are using ZoneMTA then Mailtrain can provide a DKIM key for signing "
-"all outgoing messages. Other services usually provide their own means to "
-"DKIM sign your messages"
-msgstr ""
-
-#: views/settings.hbs:84
-msgid ""
-"Do not use sensitive keys here. The private key is not encrypted in the "
-"database."
-msgstr ""
-
-#: views/settings.hbs:85
-msgid "ZoneMTA DKIM API Key"
-msgstr ""
-
-#: views/settings.hbs:86
-msgid "Some secret value"
-msgstr ""
-
-#: views/settings.hbs:87
-msgid ""
-"Secret value known to ZoneMTA for requesting DKIM key information. If this "
-"value was generated by the Mailtrain installation script then you can keep "
-"it as it is"
-msgstr ""
-
-#: views/settings.hbs:88
-msgid "DKIM domain"
-msgstr ""
-
-#: views/settings.hbs:89
-msgid "Domain name for the DKIM key"
-msgstr ""
-
-#: views/settings.hbs:90
-msgid "Leave blank to use the sender email address domain"
-msgstr ""
-
-#: views/settings.hbs:91 views/settings.hbs:92
-msgid "DKIM key selector"
-msgstr ""
-
-#: views/settings.hbs:93
-msgid "Signing is disabled without a valid selector value"
-msgstr ""
-
-#: views/settings.hbs:94
-msgid "DKIM Private Key"
-msgstr ""
-
-#: views/settings.hbs:96
-msgid ""
-"This value is optional. If you do not provide a private key then messages "
-"are not signed."
-msgstr ""
-
-#: views/subscription/mail-already-subscribed-html.mjml.hbs:1
-#: views/subscription/mail-already-subscribed-text.hbs:1
-#: lib/models/subscriptions.js:174 lib/models/subscriptions.js:895
-msgid "Email address already registered"
-msgstr "Indirizzo email già registrato"
-
-#: views/subscription/mail-already-subscribed-html.mjml.hbs:2
-#: views/subscription/mail-already-subscribed-text.hbs:2
-msgid ""
-"We have received a subscription request. Your email address is however "
-"already registered."
-msgstr ""
-"Abbiamo ricevuto una richiesta di iscrizione alla nostra newsletter. La tua "
-"email è già registrata."
-
-#: views/subscription/mail-already-subscribed-html.mjml.hbs:3
-#: views/subscription/mail-already-subscribed-text.hbs:3
-msgid ""
-"If you received this email by mistake, simply delete it. Your existing "
-"subscription won't be affected."
-msgstr ""
-"Se tu ricevi questa email per errore, cancellala semplicemente. La tua "
-"registrazione non subirà alcuna modifica."
-
-#: views/subscription/mail-already-subscribed-html.mjml.hbs:4
-#: views/subscription/mail-subscription-confirmed-html.mjml.hbs:3
-msgid "If you want to modify your subscription then you can "
-msgstr "Se vuoi modificare la tua iscrizione allora puoi"
-
-#: views/subscription/mail-already-subscribed-html.mjml.hbs:5
-#: views/subscription/mail-already-subscribed-text.hbs:5
-#: views/subscription/mail-subscription-confirmed-html.mjml.hbs:4
-#: views/subscription/mail-subscription-confirmed-text.hbs:4
-msgid "manage your preferences"
-msgstr "gestire le tue preferenze"
-
-#: views/subscription/mail-already-subscribed-html.mjml.hbs:6
-#: views/subscription/mail-already-subscribed-text.hbs:6
-#: views/subscription/mail-subscription-confirmed-html.mjml.hbs:5
-#: views/subscription/mail-subscription-confirmed-text.hbs:5
-#: views/users/login.hbs:10
-msgid "or"
-msgstr "oppure"
-
-#: views/subscription/mail-already-subscribed-html.mjml.hbs:7
-#: views/subscription/mail-already-subscribed-text.hbs:7
-#: views/subscription/mail-subscription-confirmed-html.mjml.hbs:6
-#: views/subscription/mail-subscription-confirmed-text.hbs:6
-msgid "unsubscribe here"
-msgstr "cancellare l'iscrizione qui"
-
-#: views/subscription/mail-already-subscribed-html.mjml.hbs:8
-#: views/subscription/mail-subscription-confirmed-html.mjml.hbs:7
-#: views/subscription/web-confirm-subscription-notice.mjml.hbs:3
-#: views/subscription/web-confirm-unsubscription-notice.mjml.hbs:3
-#: views/subscription/web-manual-unsubscribe-notice.mjml.hbs:4
-#: views/subscription/web-subscribed-notice.mjml.hbs:4
-#: views/subscription/web-unsubscribed-notice.mjml.hbs:3
-#: views/subscription/web-updated-notice.mjml.hbs:3
-msgid "Return to our website"
-msgstr "Torna sul nostro sito"
-
-#: views/subscription/mail-already-subscribed-html.mjml.hbs:9
-#: views/subscription/mail-already-subscribed-text.hbs:8
-#: views/subscription/mail-confirm-address-change-html.mjml.hbs:4
-#: views/subscription/mail-confirm-address-change-text.hbs:4
-#: views/subscription/mail-confirm-subscription-html.mjml.hbs:4
-#: views/subscription/mail-confirm-subscription-text.hbs:4
-#: views/subscription/mail-confirm-unsubscription-html.mjml.hbs:4
-#: views/subscription/mail-confirm-unsubscription-text.hbs:4
-#: views/subscription/mail-subscription-confirmed-html.mjml.hbs:8
-#: views/subscription/mail-subscription-confirmed-text.hbs:7
-#: views/subscription/mail-unsubscription-confirmed-html.mjml.hbs:5
-#: views/subscription/mail-unsubscription-confirmed-text.hbs:5
-msgid "For questions about this list, please contact:"
-msgstr "Per domande riguardanti questa newsletter, contatta:"
-
-#: views/subscription/mail-already-subscribed-text.hbs:4
-#: views/subscription/mail-subscription-confirmed-text.hbs:3
-msgid "If you want to modify your subscription then you can:"
-msgstr "Se vuoi modificare la tua iscrizione allora puoi:"
-
-#: views/subscription/mail-confirm-address-change-html.mjml.hbs:1
-#: views/subscription/mail-confirm-address-change-text.hbs:1
-msgid "Please Confirm Subscription Address Change"
-msgstr "Per favore conferma il cambio dell'indirizzo dell'iscrizione"
-
-#: views/subscription/mail-confirm-address-change-html.mjml.hbs:2
-#: views/subscription/mail-confirm-address-change-text.hbs:2
-msgid "Yes, subscribe this email address to the list"
-msgstr "Sì, iscrivimi alla lista"
-
-#: views/subscription/mail-confirm-address-change-html.mjml.hbs:3
-#: views/subscription/mail-confirm-subscription-html.mjml.hbs:3
-msgid ""
-"If you received this email by mistake, simply delete it. You won't be "
-"subscribed if you don't click the confirmation link above."
-msgstr ""
-"Se ricevi questa email per errore, semplicemente cancellala. Non verrai "
-"registrato se non clicchi sul link di conferma qui sopra."
-
-#: views/subscription/mail-confirm-address-change-text.hbs:3
-#: views/subscription/mail-confirm-subscription-text.hbs:3
-msgid ""
-"If you received this email by mistake, simply delete it. You won't be "
-"subscribed unless you click the confirmation link above."
-msgstr ""
-"Se ricevi questa email per errore, semplicemente cancellala. Non verrai "
-"registrato se non clicchi sul link di conferma qui sopra."
-
-#: views/subscription/mail-confirm-subscription-html.mjml.hbs:1
-#: views/subscription/mail-confirm-subscription-text.hbs:1
-#: views/subscription/mail-confirm-unsubscription-text.hbs:1
-#: routes/subscription.js:432
-msgid "Please Confirm Subscription"
-msgstr "Per favore conferma la tua iscrizione"
-
-#: views/subscription/mail-confirm-subscription-html.mjml.hbs:2
-#: views/subscription/mail-confirm-subscription-text.hbs:2
-msgid "Yes, subscribe me to this list"
-msgstr "Sì, iscrivimi a questa lista"
-
-#: views/subscription/mail-confirm-unsubscription-html.mjml.hbs:1
-msgid "Please Confirm Unsubscription"
-msgstr "Per favore conferma la cancellazione dell'iscrizione"
-
-#: views/subscription/mail-confirm-unsubscription-html.mjml.hbs:2
-#: views/subscription/mail-confirm-unsubscription-text.hbs:2
-msgid "Yes, unsubscribe me from this list"
-msgstr "Sì, cancella la mia iscrizione alla lista"
-
-#: views/subscription/mail-confirm-unsubscription-html.mjml.hbs:3
-msgid ""
-"If you received this email by mistake, simply delete it. You won't be "
-"unsubscribed if you don't click the confirmation link above."
-msgstr ""
-"Se ricevi questo messaggio per errore, cancellalo pure. Non sarai cancellato "
-"dalla tua iscrizione se non clicchi sul link di conferma."
-
-#: views/subscription/mail-confirm-unsubscription-text.hbs:3
-msgid ""
-"If you received this email by mistake, simply delete it. You won't be "
-"unsubscribed unless you click the confirmation link above."
-msgstr ""
-"Se ricevi questo messaggio per errore, cancellalo pure. Non sarai cancellato "
-"dalla tua iscrizione se non clicchi sul link di conferma."
-
-#: views/subscription/mail-subscription-confirmed-html.mjml.hbs:1
-#: views/subscription/mail-subscription-confirmed-text.hbs:1
-#: views/subscription/web-subscribed-notice.mjml.hbs:1
-msgid "Subscription Confirmed"
-msgstr "Iscrizione confermata"
-
-#: views/subscription/mail-subscription-confirmed-html.mjml.hbs:2
-msgid "Your subscription to our list has been confirmed"
-msgstr "La tua iscrizione alla nostra lista è stata confermata"
-
-#: views/subscription/mail-subscription-confirmed-text.hbs:2
-#: views/subscription/web-subscribed-notice.mjml.hbs:2
-msgid "Your subscription to our list has been confirmed."
-msgstr "La tua iscrizione alla nostra lista è stata confermata."
-
-#: views/subscription/mail-unsubscription-confirmed-html.mjml.hbs:1
-#: views/subscription/mail-unsubscription-confirmed-text.hbs:1
-msgid "You Are Now Unsubscribed"
-msgstr "La tua iscrizione è stata cancellata"
-
-#: views/subscription/mail-unsubscription-confirmed-html.mjml.hbs:2
-msgid "We have removed your email address from our list"
-msgstr "Ti abbiamo rimosso dalla nostra lista"
-
-#: views/subscription/mail-unsubscription-confirmed-html.mjml.hbs:3
-#: views/subscription/mail-unsubscription-confirmed-text.hbs:3
-msgid "If you unsubscribed by mistake, you can re-subscribe at:"
-msgstr "Se ti sei cancellato per sbaglio, puoi iscriverti nuovamente qui:"
-
-#: views/subscription/mail-unsubscription-confirmed-text.hbs:2
-msgid "We have removed your email address from our list."
-msgstr "Abbiamo rimosso la tua email dalla nostra lista."
-
-#: views/subscription/partials/subscription-custom-fields.hbs:2
-msgid "want to change it?"
-msgstr "vuoi cambiarlo?"
-
-#: views/subscription/partials/subscription-custom-fields.hbs:5
-msgid "Download signature verification key"
-msgstr "Scarica la chiave di verifica"
-
-#: views/subscription/partials/subscription-custom-fields.hbs:7
-msgid ""
-"Insert your GPG public key here to encrypt messages sent to your address"
-msgstr ""
-"Inserisci la tua chiave pubblica GPG qui per cifrare i messaggi inviati al "
-"tuo server"
-
-#: views/subscription/partials/subscription-custom-fields.hbs:8
-msgid "optional"
-msgstr "opzionale"
-
-#: views/subscription/partials/subscription-flash-messages.hbs:1
-#: views/subscription/partials/subscription-flash-messages.hbs:3
-msgid "Warning!"
-msgstr "Attenzione!"
-
-#: views/subscription/partials/subscription-flash-messages.hbs:2
-msgid "If JavaScript was not enabled then no confirmation message was sent"
-msgstr ""
-"Se JavaScript non è abilitato, non verrà inviato alcun messaggio di conferma"
-
-#: views/subscription/partials/subscription-flash-messages.hbs:4
-msgid "JavaScript must be enabled in order for this form to work"
-msgstr ""
-"JavaScript deve essere abilitato per il funzionamento di questo modulo da "
-"compilare"
-
-#: views/subscription/partials/subscription-manage-address-form.hbs:1
-msgid "Existing Email Address"
-msgstr "Indirizzo email esistente"
-
-#: views/subscription/partials/subscription-manage-address-form.hbs:2
-msgid "New Email Address"
-msgstr "Nuovo indirizzo email"
-
-#: views/subscription/partials/subscription-manage-address-form.hbs:3
-msgid "Your new email address"
-msgstr "Il tuo nuovo indirizzo email"
-
-#: views/subscription/partials/subscription-manage-address-form.hbs:4
-msgid ""
-"You will receive a confirmation request to your new email address that you "
-"need to accept before your email is actually changed"
-msgstr ""
-"Riceverai una richiesta di conferma al tuo nuovo indirizzo di posta e devi "
-"confermarlo per far sì che la modifica abbia effetto"
-
-#: views/subscription/partials/subscription-manage-address-form.hbs:5
-#: views/subscription/web-manage-address.mjml.hbs:2
-msgid "Update Email Address"
-msgstr "Aggiorna indirizzo email"
-
-#: views/subscription/partials/subscription-manage-form.hbs:1
-#: views/subscription/web-manage.mjml.hbs:2
-msgid "Update Profile"
-msgstr "Aggiorna profilo"
-
-#: views/subscription/partials/subscription-subscribe-form.hbs:1
-#: views/subscription/web-subscribe.mjml.hbs:2
-#: views/subscription/widget-subscribe.hbs:1
-msgid "Subscribe to list"
-msgstr "Iscrivita alla lista"
-
-#: views/subscription/web-confirm-subscription-notice.mjml.hbs:1
-#: views/subscription/web-confirm-unsubscription-notice.mjml.hbs:1
-#: views/subscription/widget-subscribe.hbs:4
-msgid "Almost Finished"
-msgstr "Quasi finito"
-
-#: views/subscription/web-confirm-subscription-notice.mjml.hbs:2
-#: views/subscription/widget-subscribe.hbs:5
-msgid ""
-"We need to confirm your email address. To complete the subscription process, "
-"please click the link in the email we just sent you."
-msgstr ""
-"Dobbiamo confermare il tuo indirizzo email. Per completare l'iscrizione, "
-"clicca sul link che ti abbiamo inviato al tuo indirizzo email."
-
-#: views/subscription/web-confirm-unsubscription-notice.mjml.hbs:2
-msgid ""
-"We need to confirm your email address. To complete the unsubscription "
-"process, please click the link in the email we just sent you."
-msgstr ""
-"Abbiamo bisogno che confermi il tuo indirizzo email. Per completare il "
-"processo di rimossione, si prega di cliccare il link che ti abbiamo appena "
-"spedito."
-
-#: views/subscription/web-manage-address.mjml.hbs:1
-msgid "Update Your Email Address"
-msgstr "Aggiorna il tuo indirizzo email"
-
-#: views/subscription/web-manage.mjml.hbs:1
-msgid "Update Your Preferences"
-msgstr "Aggiorna le tue preferenze"
-
-#: views/subscription/web-manual-unsubscribe-notice.mjml.hbs:1
-msgid "Online Unsubscription Is Not Possible"
-msgstr "La rimozione dell'iscrizione non è fattibile online"
-
-#: views/subscription/web-manual-unsubscribe-notice.mjml.hbs:2
-msgid "Please contact us at"
-msgstr "Puoi contattarci all'indirizzo "
-
-#: views/subscription/web-manual-unsubscribe-notice.mjml.hbs:3
-msgid "to get removed from the list"
-msgstr "per essere rimosso dalla lista"
-
-#: views/subscription/web-subscribe.mjml.hbs:1
-msgid "Subscribe to List"
-msgstr "Iscriviti alla lista"
-
-#: views/subscription/web-subscribed-notice.mjml.hbs:3
-msgid "Thank you for subscribing!"
-msgstr "Grazie per la tua iscrizione!"
-
-#: views/subscription/web-unsubscribed-notice.mjml.hbs:1
-msgid "Unsubscribe Successful"
-msgstr "Rimozione eseguita con successo"
-
-#: views/subscription/web-unsubscribed-notice.mjml.hbs:2
-msgid "You have been removed from:"
-msgstr "Se stato rimosso da:"
-
-#: views/subscription/web-updated-notice.mjml.hbs:1
-msgid "Profile Updated"
-msgstr "Profilo Aggiornato"
-
-#: views/subscription/web-updated-notice.mjml.hbs:2
-msgid "Your profile information has been updated."
-msgstr "Le informazioni del tuo profilo sono stato aggiornate."
-
-#: views/subscription/widget-subscribe.hbs:2
-msgid "Sending ..."
-msgstr "Invio ..."
-
-#: views/subscription/widget-subscribe.hbs:3
-msgid "It looks like you are already subscribed to this list."
-msgstr "Sembra che tu ti sia già iscritto a questa lista."
-
-#: views/templates/create.hbs:5 views/templates/edit.hbs:6
-msgid "Template name"
-msgstr "Nome Template"
-
-#: views/templates/create.hbs:6 views/templates/edit.hbs:7
-msgid "Name for this template, eg. Newsletter"
-msgstr "Nome di questo template eg. Newsletter promozioni"
-
-#: views/templates/create.hbs:7
-msgid "HTML Editor"
-msgstr "Editor HTML"
-
-#: views/templates/create.hbs:10 views/templates/edit.hbs:9
-msgid "Optional comments about this template"
-msgstr "Commenti opzionali per questo template"
-
-#: views/templates/edit.hbs:5
-msgid "Back to templates"
-msgstr "Indietro ai templates"
-
-#: views/templates/edit.hbs:11
-msgid "Duplicate"
-msgstr "Duplica"
-
-#: views/triggers/create-select.hbs:2 views/triggers/create.hbs:2
-#: views/triggers/edit.hbs:2 views/triggers/triggered.hbs:2
-#: views/triggers/triggers.hbs:2 views/triggers/triggers.hbs:4
-msgid "Automation Triggers"
-msgstr "Trigger di automazione"
-
-#: views/triggers/create-select.hbs:5
-msgid "Select a list for the trigger"
-msgstr "Seleziona una lista per questo trigger"
-
-#: views/triggers/create.hbs:5 views/triggers/edit.hbs:6
-msgid "Trigger name"
-msgstr "Nome trigger"
-
-#: views/triggers/create.hbs:6 views/triggers/edit.hbs:7
-msgid "Name for this trigger, eg. Inactive subscribers"
-msgstr "Nome per questo trigger, per esempio: iscritti inattivi"
-
-#: views/triggers/create.hbs:8 views/triggers/edit.hbs:9
-msgid "Optional comments about this trigger"
-msgstr "Commenti opzionali per questo trigger"
-
-#: views/triggers/create.hbs:12 views/triggers/edit.hbs:14
-msgid "Trigger rule"
-msgstr "Regola trigger"
-
-#: views/triggers/create.hbs:13 views/triggers/edit.hbs:15
-msgid "Trigger fires"
-msgstr "Attivazione trigger"
-
-#: views/triggers/create.hbs:14 views/triggers/edit.hbs:16
-msgid "days after:"
-msgstr "dopo giorni:"
-
-#: views/triggers/create.hbs:16 views/triggers/create.hbs:21
-#: views/triggers/edit.hbs:18 views/triggers/edit.hbs:23
-msgid "Event"
-msgstr "Evento"
-
-#: views/triggers/create.hbs:18 views/triggers/create.hbs:19
-#: views/triggers/create.hbs:25 views/triggers/edit.hbs:20
-#: views/triggers/edit.hbs:21 views/triggers/edit.hbs:27
-msgid "Campaign"
-msgstr "Campagna"
-
-#: views/triggers/create.hbs:23 views/triggers/edit.hbs:25
-msgid "Trigger action"
-msgstr "Azione trigger"
-
-#: views/triggers/create.hbs:24 views/triggers/edit.hbs:26
-msgid "Send campaign"
-msgstr "Invia campagna"
-
-#: views/triggers/edit.hbs:3 views/triggers/edit.hbs:4
-msgid "Edit Trigger"
-msgstr "Modifica trigger"
-
-#: views/triggers/edit.hbs:5
-msgid "Back to triggers"
-msgstr "Indietro ai triggers"
-
-#: views/triggers/edit.hbs:11
-msgid "Trigger is enabled"
-msgstr "Il trigger è abilitato"
-
-#: views/triggers/edit.hbs:29
-msgid "Delete Trigger"
-msgstr "Elimina trigger"
-
-#: views/triggers/triggered.hbs:3
-msgid "Triggered"
-msgstr "Trigger azionato"
-
-#: views/triggers/triggered.hbs:4
-msgid "Triggered subscribers"
-msgstr "Iscritti con trigger azionati"
-
-#: views/triggers/triggered.hbs:5
-msgid "Subscribers who caused this trigger to fire"
-msgstr "Iscritti che hanno azionato questo trigger"
-
-#: views/triggers/triggered.hbs:9
-msgid "Triggered time"
-msgstr "Ora azionamento Trigger"
-
-#: views/triggers/triggers.hbs:9
-msgid "Trigger"
-msgstr ""
-
-#: views/triggers/triggers.hbs:10
-msgid "Target Campaign"
-msgstr "Campagna targetizzata"
-
-#: views/triggers/triggers.hbs:11
-msgid "Triggered count"
-msgstr "Conteggio trigger azionati"
-
-#: views/users/account.hbs:4
-msgid "This account is managed through LDAP."
-msgstr "Questo account è controllato tramite LDAP."
-
-#: views/users/account.hbs:5
-msgid "Associated Email Address"
-msgstr "Indirizzo email associato"
-
-#: views/users/account.hbs:8
-msgid "Your e-mail address"
-msgstr "Il tuo indirizzo email"
-
-#: views/users/account.hbs:9
-msgid ""
-"This address is used for account recovery in case you lose your password"
-msgstr "Questo indirizzo è utilizzato per il recupero della password"
-
-#: views/users/account.hbs:10
-msgid "Password change"
-msgstr "Cambia password"
-
-#: views/users/account.hbs:11
-msgid ""
-"You only need to fill out this form if you want to change your current "
-"password"
-msgstr ""
-"Hai bisogno di completare questo form solo se vuoi cambiare la tua password "
-"attuale"
-
-#: views/users/account.hbs:12 views/users/account.hbs:13
-msgid "Current Password"
-msgstr "Password attuale"
-
-#: views/users/account.hbs:14 views/users/account.hbs:15
-#: views/users/reset.hbs:6 views/users/reset.hbs:7
-msgid "New Password"
-msgstr "Nuova password"
-
-#: views/users/account.hbs:16 views/users/reset.hbs:8
-msgid "Confirm Password"
-msgstr "Conferma password"
-
-#: views/users/account.hbs:17 views/users/reset.hbs:9
-msgid "Confirm New Password"
-msgstr "Conferma nuova password"
-
-#: views/users/api.hbs:4
-msgid "Are you sure? Resetting would invalidate the currently existing token."
-msgstr "Sei sicuro? Il reset invaliderà i tokens che esistono al momento"
-
-#: views/users/api.hbs:5
-msgid "Are you sure?"
-msgstr "Sei sicuro?"
-
-#: views/users/api.hbs:6
-msgid "Reset Access Token"
-msgstr "Resetta token di accesso"
-
-#: views/users/api.hbs:7
-msgid "Generate Access Token"
-msgstr "Genera token di accesso"
-
-#: views/users/api.hbs:8
-msgid "Personal access token:"
-msgstr "Token di accesso personale:"
-
-#: views/users/api.hbs:9
-msgid "Access token not yet generated"
-msgstr "Token di accesso non generato"
-
-#: views/users/api.hbs:10
-msgid "Notes about the API"
-msgstr "Note sull'API"
-
-#: views/users/api.hbs:11
-msgid ""
-"API response is a JSON structure with error and data"
-"code> properties. If the response error has a value set then "
-"the request failed."
-msgstr ""
-"La risposta API è una struttura JSON con proprietà error e "
-"data. Se la risposta ha il valore error impostato, "
-"la richiesta è fallita."
-
-#: views/users/api.hbs:12
-msgid ""
-"You need to define proper Content-Type when making a request. "
-"You can either use application/x-www-form-urlencoded for normal "
-"form data or application/json for a JSON payload. Using "
-"multipart/form-data is not supported."
-msgstr ""
-"Devi definire il giusto Content-Type quando esegui una "
-"richiesta. Puoi usare application/x-www-form-urlencoded per i "
-"dati dei form normali, oppure application/json per JSON "
-"payload. Non è supportato multipart/form-data."
-
-#: views/users/api.hbs:13
-msgid "Get list of subscriptions"
-msgstr "Ottieni lista delle iscrizioni"
-
-#: views/users/api.hbs:14
-msgid ""
-"Retrieve a list of subscriptions to the list referenced by :listId. All "
-"fields of the subscribers will be returned. Note that custom fields will "
-"have generated names."
-msgstr ""
-"Ottieni una lista delle iscrizioni alla lista :listId. Tutti i campi degli "
-"iscritti saranno restituiti. Nota che i campi personalizzati avranno dei "
-"nomi automaticamente generati."
-
-#: views/users/api.hbs:15 views/users/api.hbs:24 views/users/api.hbs:26
-#: views/users/api.hbs:39 views/users/api.hbs:41 views/users/api.hbs:47
-#: views/users/api.hbs:49 views/users/api.hbs:55 views/users/api.hbs:57
-#: views/users/api.hbs:67 views/users/api.hbs:78 views/users/api.hbs:80
-#: views/users/api.hbs:86 views/users/api.hbs:88 views/users/api.hbs:94
-msgid "arguments"
-msgstr "argomenti"
-
-#: views/users/api.hbs:16 views/users/api.hbs:25 views/users/api.hbs:40
-#: views/users/api.hbs:48 views/users/api.hbs:56 views/users/api.hbs:68
-#: views/users/api.hbs:79 views/users/api.hbs:87 views/users/api.hbs:95
-msgid "your personal access token"
-msgstr "il tuo token di accesso personale"
-
-#: views/users/api.hbs:17 views/users/api.hbs:69
-msgid "Start position"
-msgstr "Posizionale di inizio"
-
-#: views/users/api.hbs:18 views/users/api.hbs:70
-msgid "optional, default 0"
-msgstr "opzionale, 0 di default"
-
-#: views/users/api.hbs:19
-msgid "limit subscription count in response"
-msgstr "limita il numero di iscrizioni in risposta"
-
-#: views/users/api.hbs:20 views/users/api.hbs:72
-msgid "optional, default 10000"
-msgstr "opzionale, default 10000"
-
-#: views/users/api.hbs:22
-msgid "Add subscription"
-msgstr "Aggiungi iscrizione"
-
-#: views/users/api.hbs:23
-msgid ""
-"This API call either inserts a new subscription or updates existing. Fields "
-"not included are left as is, so if you update only LAST_NAME value, then "
-"FIRST_NAME is kept untouched for an existing subscription."
-msgstr ""
-"Questa chiamata API aggiunge o aggiorna una iscrizione. I campi non inclusi "
-"saranno lasciati come erano, quindi se si aggiorna LAST_NAME, FIRST_NAME "
-"rimarrà invariato per quella iscrizione."
-
-#: views/users/api.hbs:27 views/users/api.hbs:42 views/users/api.hbs:50
-msgid "subscriber's email address"
-msgstr "indirizzo email dell'iscritto"
-
-#: views/users/api.hbs:28 views/users/api.hbs:43 views/users/api.hbs:51
-#: views/users/api.hbs:59 views/users/api.hbs:82 views/users/api.hbs:90
-msgid "required"
-msgstr "richiesto"
-
-#: views/users/api.hbs:29
-msgid "subscriber's first name"
-msgstr "nome dell'iscritto"
-
-#: views/users/api.hbs:30
-msgid "subscriber's last name"
-msgstr "cognome dell'iscritto"
-
-#: views/users/api.hbs:31
-msgid ""
-"subscriber's timezone (eg. \"Europe/Tallinn\", \"PST\" or \"UTC\"). If not "
-"set defaults to \"UTC\""
-msgstr ""
-"timezone dell'iscritto (esempio: \"Europe/Tallinn\", \"PST\" or \"UTC\"). Se "
-"non impostato il valore di default è \"UTC\""
-
-#: views/users/api.hbs:32
-msgid ""
-"custom field value. Use yes/no for option group values (checkboxes, radios, "
-"drop downs)"
-msgstr ""
-"valore dei campi personalizzati. Usa si/no per i valori dei gruppi di "
-"opzioni (checkboxes, radios, drop downs) "
-
-#: views/users/api.hbs:33
-msgid "Additional POST arguments"
-msgstr ""
-
-#: views/users/api.hbs:34
-msgid ""
-"set to \"yes\" if you want to make sure the email is marked as subscribed "
-"even if it was previously marked as unsubscribed. If the email was already "
-"unsubscribed/blocked then subscription status is not changed"
-msgstr ""
-"selezionare \"sì\" se vuoi essere sicuro che la mail venga salvata come "
-"iscritta anche se precedentemente cancellata. Se la mail si era già "
-"cancellata o bloccata, lo stato di iscrizione non cambierà."
-
-#: views/users/api.hbs:35
-msgid ""
-"set to \"yes\" if you want to send confirmation email to the subscriber "
-"before actually marking as subscribed"
-msgstr ""
-"selezionare \"sì\" se vuoi inviare la mail di conferma all'email "
-"delliscrizione prima di salvarlo come iscritto"
-
-#: views/users/api.hbs:37
-msgid "Remove subscription"
-msgstr "Rimuovi iscrizione"
-
-#: views/users/api.hbs:38
-msgid "This API call marks a subscription as unsubscribed"
-msgstr "Questa chiamata API segna una iscrizione come rimossa."
-
-#: views/users/api.hbs:45
-msgid "Delete subscription"
-msgstr "Cancella iscrizione"
-
-#: views/users/api.hbs:46
-msgid "This API call deletes a subscription"
-msgstr "Questa API cancella una iscrizione"
-
-#: views/users/api.hbs:53
-msgid "Add new custom field"
-msgstr "Aggiungi un campo personalizzato"
-
-#: views/users/api.hbs:54
-msgid "This API call creates a new custom field for a list."
-msgstr "Questa chiamata API crea un nuovo campo personalizzato per una lista."
-
-#: views/users/api.hbs:58
-msgid "field name"
-msgstr "nome campo"
-
-#: views/users/api.hbs:60
-msgid "one of the following types:"
-msgstr "uno dei seguenti tipi:"
-
-#: views/users/api.hbs:61
-msgid ""
-"If the type is 'option' then you also need to specify the parent element ID"
-msgstr ""
-"Se il tipo è 'option' devi anche specificare l'ID dell'elemento parente"
-
-#: views/users/api.hbs:62
-msgid ""
-"Template for the group element. If not set, then values of the elements are "
-"joined with commas"
-msgstr ""
-"Template per il gruppo di elementi. Se non impostato, allora i valori "
-"verranno separati da una virgola"
-
-#: views/users/api.hbs:63
-msgid ""
-"if not visible then the subscriber can not view or modify this value at the "
-"profile page"
-msgstr ""
-"se non visibile l'iscritto non potrà modificare questo valore nella pagina "
-"del profilo"
-
-#: views/users/api.hbs:65
-msgid "Get list of blacklisted emails"
-msgstr "Ottieni emails in lista nera"
-
-#: views/users/api.hbs:66
-msgid "This API call get list of blacklisted emails."
-msgstr "Questa chiamata API ottiene una lista delle email in lista nera."
-
-#: views/users/api.hbs:71
-msgid "limit emails count in response"
-msgstr "limita il numero di emails nella risposta"
-
-#: views/users/api.hbs:73
-msgid "filter by part of email"
-msgstr "filtra per parte della email"
-
-#: views/users/api.hbs:74
-msgid "optional, default ''"
-msgstr "opzionale, default ''"
-
-#: views/users/api.hbs:77
-msgid "This API call either add emails to blacklist"
-msgstr "Questa chiamata API aggiunge emails alla lista nera"
-
-#: views/users/api.hbs:81 views/users/api.hbs:89
-msgid "email address"
-msgstr "indirizzo email"
-
-#: views/users/api.hbs:84
-msgid "Delete email from blacklist"
-msgstr "Cancella email dalla lista nera."
-
-#: views/users/api.hbs:85
-msgid "This API call either delete emails from blacklist"
-msgstr "Questa chiamata API cancella emails dalla lista nera"
-
-#: views/users/api.hbs:92
-msgid "Get the lists a user has subscribed to"
-msgstr "Ottini le listi a cui un utente si è iscritto"
-
-#: views/users/api.hbs:93
-msgid "Retrieve the lists that the user with :email has subscribed to. "
-msgstr "Ottieni le liste a cui l'utente con :email si è iscritto"
-
-#: views/users/forgot.hbs:3 views/users/reset.hbs:3
-msgid "Password Reset"
-msgstr "Resetta password"
-
-#: views/users/forgot.hbs:4
-msgid "Reset your password?"
-msgstr "Resettare la password?"
-
-#: views/users/forgot.hbs:5
-msgid "Accounts are managed through LDAP."
-msgstr "Gli accounts sono gestiti tramite LDAP."
-
-#: views/users/forgot.hbs:6 views/users/reset.hbs:10
-msgid "Reset Password"
-msgstr "Resetta password"
-
-#: views/users/forgot.hbs:7
-msgid ""
-"Please provide the username or email address that you used when you signed "
-"up for your Mailtrain account."
-msgstr ""
-"Si prega di inserire lo username o la email inserita al momento della "
-"registrazione."
-
-#: views/users/forgot.hbs:8
-msgid "We will send you an email that will allow you to reset your password."
-msgstr "Ti invieremo una email che ti permetterà di cambiare password."
-
-#: views/users/forgot.hbs:10
-msgid "Username or email address"
-msgstr "Username o email"
-
-#: views/users/forgot.hbs:11
-msgid "Send verification email"
-msgstr "Invia email di verifica"
-
-#: views/users/login.hbs:8
-msgid "Remember me"
-msgstr "Ricordati di me"
-
-#: views/users/login.hbs:11 views/users/login.hbs:12
-msgid "Forgot password?"
-msgstr "Password dimenticata?"
-
-#: views/users/reset.hbs:4
-msgid "Choose your new password"
-msgstr "Scegli la tua nuova password"
-
-#: views/users/reset.hbs:5
-msgid "Please enter a new password."
-msgstr "Inserire una nuova password."
-
-#: lib/editor-helpers.js:17 routes/templates.js:95
-msgid "Could not find template with specified ID"
-msgstr "Template con l'ID specificato non trovato"
-
-#: lib/editor-helpers.js:33 routes/archive.js:145 routes/campaigns.js:131
-#: routes/campaigns.js:284 routes/campaigns.js:379 routes/campaigns.js:427
-#: routes/campaigns.js:467 routes/campaigns.js:844 routes/campaigns.js:867
-#: routes/campaigns.js:886 routes/campaigns.js:908 routes/triggers.js:146
-msgid "Could not find campaign with specified ID"
-msgstr "Campagna con l'ID specificato non trovata"
-
-#: lib/editor-helpers.js:47 routes/editorapi.js:320
-msgid "Invalid resource type"
-msgstr "Tipo di risorsa invalida"
-
-#: lib/feed.js:31
-msgid "Bad status code %s"
-msgstr "Codice %s di stato sbagliato "
-
-#: lib/helpers.js:33
-msgid "URL that points to the unsubscribe page"
-msgstr "URL per la pagina di rimozione dall'iscrizione"
-
-#: lib/helpers.js:36
-msgid "URL that points to the preferences page of the subscriber"
-msgstr "URL per la pagina delle preferenze dell'iscritto"
-
-#: lib/helpers.js:39
-msgid "URL to preview the message in a browser"
-msgstr "URL per l'anteprima del messaggio nel browser"
-
-#: lib/helpers.js:45 lib/models/segments.js:31
-msgid "First name"
-msgstr "Nome"
-
-#: lib/helpers.js:48 lib/models/segments.js:35
-msgid "Last name"
-msgstr "Cognome"
-
-#: lib/helpers.js:51
-msgid "Full name (first and last name combined)"
-msgstr "Nome e Cognome"
-
-#: lib/helpers.js:54
-msgid "Unique ID that identifies the recipient"
-msgstr "ID unico che identifica il destinatario"
-
-#: lib/helpers.js:57
-msgid "Unique ID that identifies the list used for this campaign"
-msgstr "ID unico che identifica la lista usata per questa campagna"
-
-#: lib/helpers.js:60
-msgid "Unique ID that identifies current campaign"
-msgstr "ID unico che identifica la campagna corrente"
-
-#: lib/helpers.js:68 lib/helpers.js:80
-msgid "content from an RSS entry"
-msgstr "contenuto dal messaggio RSS"
-
-#: lib/helpers.js:71
-msgid "RSS entry title"
-msgstr "Titolo RSS entry"
-
-#: lib/helpers.js:74
-msgid "RSS entry date"
-msgstr ""
-
-#: lib/helpers.js:77
-msgid "RSS entry link"
-msgstr ""
-
-#: lib/helpers.js:83
-msgid "RSS entry summary"
-msgstr ""
-
-#: lib/helpers.js:86
-msgid "RSS entry image URL"
-msgstr ""
-
-#: lib/mailer.js:245
-msgid "Invalid mail transport"
-msgstr "Trasporto mail invalido"
-
-#: lib/models/campaigns.js:105 lib/models/campaigns.js:132
-#: lib/models/campaigns.js:205 lib/models/campaigns.js:328
-#: lib/models/campaigns.js:590 lib/models/campaigns.js:723
-msgid "Missing Campaign ID"
-msgstr "ID campagna mancante"
-
-#: lib/models/campaigns.js:241
-msgid "Emtpy or too large attahcment"
-msgstr "Allegato troppo grande o mancante"
-
-#: lib/models/campaigns.js:408 lib/models/campaigns.js:600
-msgid "Campaign Name must be set"
-msgstr "Il nome della campagna è obbligatorio"
-
-#: lib/models/campaigns.js:412
-msgid "RSS URL must be set and needs to be a valid URL"
-msgstr ""
-
-#: lib/models/campaigns.js:568
-msgid "Selected template not found"
-msgstr "Template selezionato non trovato"
-
-#: lib/models/campaigns.js:924
-msgid "Invalid or missing message ID"
-msgstr "ID messaggio mancante o invalido"
-
-#: lib/models/campaigns.js:1065
-msgid "Unrecognized message status"
-msgstr "Stato del messaggio non riconosciuto"
-
-#: lib/models/confirmations.js:27
-msgid "Could not store confirmation data"
-msgstr "Impossibile salvare i dati di conferma"
-
-#: lib/models/fields.js:24
-msgid "Drop Down"
-msgstr "Drop Down"
-
-#: lib/models/fields.js:25
-msgid "Date (MM/DD/YYY)"
-msgstr "Data (MM/GG/AAAA)"
-
-#: lib/models/fields.js:29
-msgid "JSON value for custom rendering"
-msgstr "Valore JSON per visualizzazione personalizzata"
-
-#: lib/models/fields.js:30
-msgid "Option"
-msgstr "Opzione"
-
-#: lib/models/fields.js:53 lib/models/fields.js:98 lib/models/fields.js:123
-#: lib/models/forms.js:46 lib/models/lists.js:115 lib/models/lists.js:150
-#: lib/models/lists.js:264 lib/models/segments.js:43 lib/models/segments.js:176
-#: lib/models/subscriptions.js:79 lib/models/subscriptions.js:390
-#: lib/models/subscriptions.js:566 lib/models/subscriptions.js:657
-#: lib/models/subscriptions.js:710 lib/models/subscriptions.js:773
-#: lib/models/subscriptions.js:816
-msgid "Missing List ID"
-msgstr "ID lista mancante"
-
-#: lib/models/fields.js:129
-msgid "Option field requires a group to be selected"
-msgstr "Il campo Option richiede la selezione di un gruppo"
-
-#: lib/models/fields.js:149 lib/models/fields.js:199
-msgid "Missing Field ID"
-msgstr "ID campo manvante"
-
-#: lib/models/fields.js:153 lib/models/segments.js:185
-#: lib/models/segments.js:225
-msgid "Field Name must be set"
-msgstr "Il nome del campo deve essere impostato"
-
-#: lib/models/fields.js:216
-msgid "Custom field not found"
-msgstr "Campo personalizzato non trovato"
-
-#: lib/models/fields.js:289
-msgid "Unknown column type %s"
-msgstr "Tipo di colonna %s non riconosciuto"
-
-#: lib/models/fields.js:293
-msgid "Missing column name"
-msgstr "nome colonna mancante"
-
-#: lib/models/fields.js:297
-msgid "Missing list ID"
-msgstr "ID lista mancante"
-
-#: lib/models/fields.js:305
-msgid "Provided List ID not found"
-msgstr "ID lista non trovato"
-
-#: lib/models/forms.js:70 lib/models/forms.js:113 lib/models/forms.js:201
-#: lib/models/forms.js:291
-msgid "Missing Form ID"
-msgstr "ID Form mancante"
-
-#: lib/models/forms.js:121 lib/models/forms.js:205
-msgid "Form Name must be set"
-msgstr "Il nome del form è obbligatorio"
-
-#: lib/models/forms.js:307
-msgid "Custom form not found"
-msgstr "Form personalizzato non trovato"
-
-#: lib/models/links.js:337 routes/campaigns.js:533 routes/campaigns.js:581
-#: routes/campaigns.js:621 routes/campaigns.js:671 services/sender.js:305
-msgid "Campaign not found"
-msgstr "Campagna non trovata"
-
-#: lib/models/links.js:345 routes/lists.js:181 services/sender.js:312
-msgid "List not found"
-msgstr "Lista non trovat"
-
-#: lib/models/links.js:353
-msgid "Subscription not found"
-msgstr "Iscrizione non trovata"
-
-#: lib/models/lists.js:166 lib/models/lists.js:210
-msgid "List Name must be set"
-msgstr "Il nome della lista è obbligatorio"
-
-#: lib/models/lists.js:293
-msgid "Missing List CID"
-msgstr "CID lista mancante"
-
-#: lib/models/report-templates.js:26 lib/models/report-templates.js:70
-#: lib/models/report-templates.js:142
-msgid "Missing report template ID"
-msgstr "ID template di reportistica mancante"
-
-#: lib/models/report-templates.js:77
-msgid "Report template name must be set"
-msgstr "Il nome del template di report è obbligatorio"
-
-#: lib/models/reports.js:40 lib/models/reports.js:110 lib/models/reports.js:188
-msgid "Missing report ID"
-msgstr "ID report mancante"
-
-#: lib/models/reports.js:116
-msgid "Report name must be set"
-msgstr "Il nome del report è obblicatorio"
-
-#: lib/models/segments.js:15
-msgid "Signup country"
-msgstr "Nazione di registrazione"
-
-#: lib/models/segments.js:19 lib/models/triggers.js:12
-msgid "Sign up date"
-msgstr "Data registrazione"
-
-#: lib/models/segments.js:23 lib/models/triggers.js:16
-msgid "Latest open"
-msgstr "Ultima apertura"
-
-#: lib/models/segments.js:27 lib/models/triggers.js:20
-msgid "Latest click"
-msgstr "Ultimo click"
-
-#: lib/models/segments.js:69 lib/models/segments.js:216
-#: lib/models/segments.js:256 lib/models/segments.js:278
-msgid "Missing Segment ID"
-msgstr "ID segmento mancante"
-
-#: lib/models/segments.js:85 lib/models/segments.js:549
-#: lib/models/segments.js:658
-msgid "Segment not found"
-msgstr "Segmento non trovato"
-
-#: lib/models/segments.js:146 lib/models/segments.js:147
-#: lib/models/segments.js:408 lib/models/segments.js:409
-msgid "%s days after today"
-msgstr "%s giorni a partire da oggi"
-
-#: lib/models/segments.js:146 lib/models/segments.js:147
-#: lib/models/segments.js:408 lib/models/segments.js:409
-msgid "%s days before today"
-msgstr "$s giorni fa"
-
-#: lib/models/segments.js:148 lib/models/segments.js:410
-msgid "today"
-msgstr "oggi"
-
-#: lib/models/segments.js:189 lib/models/segments.js:229
-msgid "Invalid segment rule type"
-msgstr "Tipo di regola del segmento non valido"
-
-#: lib/models/segments.js:289 lib/models/segments.js:454 routes/segments.js:266
-#: routes/segments.js:300 routes/segments.js:370 routes/segments.js:381
-msgid "Selected segment not found"
-msgstr "Segmento selezionato non trovato"
-
-#: lib/models/segments.js:294 lib/models/segments.js:459 routes/segments.js:272
-#: routes/segments.js:306 routes/segments.js:387
-msgid "Invalid rule type"
-msgstr "Tipo di regola non valida"
-
-#: lib/models/segments.js:358 lib/models/segments.js:434
-#: lib/models/segments.js:524
-msgid "Missing Rule ID"
-msgstr "ID regola mancante"
-
-#: lib/models/segments.js:374
-msgid "Specified rule not found"
-msgstr "Regola specificata non trovata"
-
-#: lib/models/segments.js:385
-msgid "Specified segment not found"
-msgstr "Segmento selezionato non trovato"
-
-#: lib/models/segments.js:445
-msgid "Selected rule not found"
-msgstr "Regola selezionata non trovata"
-
-#: lib/models/subscriptions.js:257 lib/models/subscriptions.js:287
-#: lib/models/subscriptions.js:394
-msgid "Missing Subscription ID"
-msgstr "ID iscrizione mancante"
-
-#: lib/models/subscriptions.js:315
-msgid "Missing Subscription email address"
-msgstr "Indirizzo email di iscrizione mancante"
-
-#: lib/models/subscriptions.js:570 lib/models/subscriptions.js:820
-msgid "Missing subscription ID"
-msgstr "ID di iscrizione mancante"
-
-#: lib/models/subscriptions.js:661 lib/models/subscriptions.js:714
-#: lib/models/subscriptions.js:750
-msgid "Missing Import ID"
-msgstr "ID di import mancante"
-
-#: lib/models/subscriptions.js:842
-msgid "Unknown subscription ID"
-msgstr "ID iscrizione sconosciuto"
-
-#: lib/models/subscriptions.js:847 routes/subscription.js:639
-msgid "Nothing seems to be changed"
-msgstr "Nulla sembra essere cambiato"
-
-#: lib/models/subscriptions.js:913 routes/subscription.js:473
-#: routes/subscription.js:545 routes/subscription.js:581
-#: routes/subscription.js:697 routes/subscription.js:772
-msgid "Subscription not found in this list"
-msgstr "Iscrizione non trovata nella lista"
-
-#: lib/models/templates.js:26 lib/models/templates.js:102
-#: lib/models/templates.js:157
-msgid "Missing Template ID"
-msgstr "ID template mancante"
-
-#: lib/models/templates.js:55 lib/models/templates.js:106
-msgid "Template Name must be set"
-msgstr "Nome template obbligatorio"
-
-#: lib/models/templates.js:147
-msgid "Template does not exist"
-msgstr "Il template non esiste"
-
-#: lib/models/triggers.js:29
-msgid "Has Opened"
-msgstr "Ha aperto"
-
-#: lib/models/triggers.js:32
-msgid "Has Clicked"
-msgstr "Ha cliccato"
-
-#: lib/models/triggers.js:35
-msgid "Not Opened"
-msgstr "Non aperto"
-
-#: lib/models/triggers.js:38
-msgid "Not Clicked"
-msgstr "Non cliccato"
-
-#: lib/models/triggers.js:178 lib/models/triggers.js:215
-msgid "Missing or invalid list ID"
-msgstr "ID Lista mancante on non valido"
-
-#: lib/models/triggers.js:182 lib/models/triggers.js:267
-msgid "Days in the past are not allowed"
-msgstr "Giorni nel passato non sono permessi"
-
-#: lib/models/triggers.js:186 lib/models/triggers.js:207
-#: lib/models/triggers.js:271 lib/models/triggers.js:292
-msgid "Missing or invalid trigger rule"
-msgstr "Regola di trigger mancante o non valido"
-
-#: lib/models/triggers.js:193 lib/models/triggers.js:278
-msgid "Invalid subscription configuration"
-msgstr "Configurazione di iscrizione non valida"
-
-#: lib/models/triggers.js:200 lib/models/triggers.js:285
-msgid "Invalid campaign configuration"
-msgstr "Configurazione della campagna non valid"
-
-#: lib/models/triggers.js:203 lib/models/triggers.js:288
-msgid "A campaing can not be a target for itself"
-msgstr "Una campagna non può' essere il target di sè stessa"
-
-#: lib/models/triggers.js:236
-msgid "Could not store trigger row"
-msgstr "Impossibile salvare la riga di trigger"
-
-#: lib/models/triggers.js:253
-msgid "Missing or invalid Trigger ID"
-msgstr "ID trigger mancante o non valido"
-
-#: lib/models/triggers.js:320
-msgid "Missing Trigger ID"
-msgstr "ID trigger mancante"
-
-#: lib/models/users.js:103
-msgid "Could not store user row"
-msgstr "Impossibile salvare riga utente"
-
-#: lib/models/users.js:173
-msgid "Email Address must be set"
-msgstr "Indirizzo email obbligatorio"
-
-#: lib/models/users.js:184
-msgid "Failed to check user data"
-msgstr "Controllo dati inseriti fallito"
-
-#: lib/models/users.js:195
-msgid ""
-"Can't change email as another user with the same email address already exists"
-msgstr ""
-"Impossibile cambiare indirizzo email poiché esiste un account già associato "
-"all'indirizzo"
-
-#: lib/models/users.js:212
-msgid "Incorrect current password"
-msgstr "Password corrente errata"
-
-#: lib/models/users.js:216
-msgid "New password not set"
-msgstr "Nuova password non impostata"
-
-#: lib/models/users.js:220
-msgid "Passwords do not match"
-msgstr "Le password non corrispondono"
-
-#: lib/models/users.js:258
-msgid "User ID not set"
-msgstr "ID utente non impostato"
-
-#: lib/models/users.js:286
-msgid "Username must be set"
-msgstr "Il nome utente è obbligatorio"
-
-#: lib/models/users.js:323
-msgid "Mailer password change request"
-msgstr "Richiesta cambio password del Mailer"
-
-#: lib/models/users.js:347 lib/models/users.js:367
-msgid "Missing username or reset token"
-msgstr "nome utente o tocken di accesso invalido"
-
-#: lib/models/users.js:371
-msgid "Invalid new password"
-msgstr "Nuova password non valida"
-
-#: lib/passport.js:49
-msgid "%s logged out"
-msgstr "%s è uscito"
-
-#: lib/passport.js:63
-msgid "Failed to authenticate user"
-msgstr "Impossibile verificare utente"
-
-#: lib/passport.js:79
-msgid "Logged in as %s"
-msgstr "Connesso come %s"
-
-#: lib/passport.js:179
-msgid "Incorrect username or password"
-msgstr "Nome utente o password errata"
-
-#: lib/subscription-mail-helpers.js:28
-msgid "%s: Subscription Confirmed"
-msgstr "%s: Iscrizione confermata"
-
-#: lib/subscription-mail-helpers.js:39
-msgid "%s: Email Address Already Registered"
-msgstr "%s: Indirizzo email già iscritto"
-
-#: lib/subscription-mail-helpers.js:49
-msgid "%s: Please Confirm Email Change in Subscription"
-msgstr "%s: Per favore conferma il cambio di indirizzo email nell'iscrizione"
-
-#: lib/subscription-mail-helpers.js:59
-msgid "%s: Please Confirm Subscription"
-msgstr "%s: Per favore conferma la tua iscrizione"
-
-#: lib/subscription-mail-helpers.js:69
-msgid "%s: Please Confirm Unsubscription"
-msgstr "%s: Per favore conferma l'intenzione di rimuovere l'iscrizione"
-
-#: lib/subscription-mail-helpers.js:76
-msgid "%s: Unsubscription Confirmed"
-msgstr "%s: Rimozione dell'iscrizione confermata"
-
-#: lib/tools.js:154
-msgid "Blocked email address \"%s\""
-msgstr "Email \"%s\" bloccata"
-
-#: lib/tools.js:163
-msgid "Invalid email address \"%s\"."
-msgstr "Email \"%s\" invalida."
-
-#: lib/tools.js:166
-msgid "MX record not found for domain"
-msgstr "Non trovo gli MX records per il dominio"
-
-#: lib/tools.js:169
-msgid "Address domain not found"
-msgstr "Dominio dell'indirizzo non trovato"
-
-#: lib/tools.js:172
-msgid "Address domain name is required"
-msgstr "Il dominio dell'indirizzo è obbligatorio"
-
-#: routes/archive.js:31 routes/archive.js:43 routes/archive.js:55 app.js:230
-msgid "Not Found"
-msgstr "Non trovato"
-
-#: routes/archive.js:121 services/sender.js:449
-msgid "Received status code %s from %s"
-msgstr "Ricevuto codice di stato %s da %s"
-
-#: routes/archive.js:153 routes/campaigns.js:894
-msgid "Attachment not found"
-msgstr "Allegato non trovato"
-
-#: routes/blacklist.js:13 routes/campaigns.js:26 routes/editorapi.js:32
-#: routes/fields.js:13 routes/forms.js:16 routes/grapejs.js:15
-#: routes/lists.js:50 routes/mosaico.js:14 routes/report-templates.js:20
-#: routes/reports.js:22 routes/segments.js:13 routes/settings.js:23
-#: routes/templates.js:18 routes/triggers.js:18 routes/users.js:75
-#: routes/users.js:120
-msgid "Need to be logged in to access restricted content"
-msgstr "Devi aver effettuato l'accesso per accedere ai contenuti riservati"
-
-#: routes/campaigns.js:117
-msgid "Could not create campaign"
-msgstr "Impossibile creare la campagna"
-
-#: routes/campaigns.js:120
-msgid "Campaign “%s” created"
-msgstr "Campagna \"%s\" creata"
-
-#: routes/campaigns.js:209
-msgid "Campaign settings updated"
-msgstr "Impostazioni della campagna aggiornate"
-
-#: routes/campaigns.js:211
-msgid "Campaign settings not updated"
-msgstr "Impostazioni della campagna non aggiornata"
-
-#: routes/campaigns.js:227 routes/campaigns.js:744
-msgid "Campaign deleted"
-msgstr "Campagna eliminata"
-
-#: routes/campaigns.js:229 routes/campaigns.js:746
-msgid "Could not delete specified campaign"
-msgstr "Impossibile cancellare la campagna selezionata"
-
-#: routes/campaigns.js:248
-msgid "Idling"
-msgstr "Aspettando"
-
-#: routes/campaigns.js:251
-msgid "Scheduled"
-msgstr "In programma"
-
-#: routes/campaigns.js:257
-msgid "Paused"
-msgstr "In pausa"
-
-#: routes/campaigns.js:259
-msgid "Inactive"
-msgstr "Inattiva"
-
-#: routes/campaigns.js:261
-msgid "Active"
-msgstr "Attiva"
-
-#: routes/campaigns.js:263
-msgid "Other"
-msgstr "Altro"
-
-#: routes/campaigns.js:421
-msgid "Unknown status selector"
-msgstr "Selettore di stato non trovato"
-
-#: routes/campaigns.js:762
-msgid "Scheduled sending"
-msgstr "Invio programmato"
-
-#: routes/campaigns.js:764
-msgid "Could not schedule sending"
-msgstr "Impossibile programmare l'invio"
-
-#: routes/campaigns.js:776
-msgid "Sending resumed"
-msgstr "Invio ripreso"
-
-#: routes/campaigns.js:778
-msgid "Could not resume sending"
-msgstr "Impossibile riprendere invio"
-
-#: routes/campaigns.js:790
-msgid "Sending reset"
-msgstr "Reset invio"
-
-#: routes/campaigns.js:792
-msgid "Could not reset sending"
-msgstr "Impossibile resettare l'invio"
-
-#: routes/campaigns.js:804 routes/campaigns.js:832
-msgid "Sending paused"
-msgstr "Invio in pausa"
-
-#: routes/campaigns.js:806 routes/campaigns.js:834
-msgid "Could not pause sending"
-msgstr "Impossibile mettere in pausa l'invio"
-
-#: routes/campaigns.js:818
-msgid "Sending activated"
-msgstr "Invio attivato"
-
-#: routes/campaigns.js:820
-msgid "Could not activate sending"
-msgstr "Impossibile attivare l'invio"
-
-#: routes/campaigns.js:855
-msgid "Attachment uploaded"
-msgstr "Allegato caricato"
-
-#: routes/campaigns.js:857
-msgid "Could not store attachment"
-msgstr "Impossibile salvare allegato"
-
-#: routes/campaigns.js:874
-msgid "Attachment deleted"
-msgstr "Allegato eliminato"
-
-#: routes/campaigns.js:876
-msgid "Could not delete attachment"
-msgstr "Impossibile eliminare allegato"
-
-#: routes/editorapi.js:38
-msgid "Invalid editor name"
-msgstr "Nome editor invalido"
-
-#: routes/editorapi.js:146
-msgid "Method not supported"
-msgstr "Metodo non supportato"
-
-#: routes/editorapi.js:381
-msgid "Invalid resource type or ID"
-msgstr "ID o tipo di risorsa invalido"
-
-#: routes/fields.js:28 routes/fields.js:64 routes/fields.js:118
-#: routes/forms.js:31 routes/forms.js:63 routes/forms.js:94
-#: routes/segments.js:28 routes/segments.js:59 routes/segments.js:102
-#: routes/segments.js:151 routes/segments.js:223 routes/segments.js:255
-#: routes/segments.js:289 routes/segments.js:336 routes/segments.js:359
-msgid "Selected list ID not found"
-msgstr "ID lista selezionata non trovata"
-
-#: routes/fields.js:102
-msgid "Could not create custom field"
-msgstr "Impossibile creare campo personalizzato"
-
-#: routes/fields.js:129
-msgid "Selected field not found"
-msgstr "Campo selezionato non trovato"
-
-#: routes/fields.js:165
-msgid "Field settings updated"
-msgstr "Impostazioni campo aggiornate"
-
-#: routes/fields.js:167
-msgid "Field settings not updated"
-msgstr "Impostazioni campo non aggiornate"
-
-#: routes/fields.js:183
-msgid "Custom field deleted"
-msgstr "Campo personalizzato eliminato"
-
-#: routes/fields.js:185
-msgid "Could not delete specified field"
-msgstr "Impossibile eliminare campo specificato"
-
-#: routes/forms.js:78
-msgid "Could not create custom form"
-msgstr "Impossibile creare campo personalizzato"
-
-#: routes/forms.js:105
-msgid "Selected form not found"
-msgstr "Form selezionato non trovato"
-
-#: routes/forms.js:136
-msgid "The plaintext version for this email"
-msgstr "La versione di solo testo della mail"
-
-#: routes/forms.js:137
-msgid "Custom forms use MJML for formatting"
-msgstr "I form personalizzati usano MJML per la formattazione"
-
-#: routes/forms.js:138
-msgid "See the MJML documentation here"
-msgstr ""
-"Guarda la documentazione di MJML qui"
-
-#: routes/forms.js:146
-msgid "Layout"
-msgstr "Layout"
-
-#: routes/forms.js:152
-msgid "Form Input Style"
-msgstr "Stile input del form"
-
-#: routes/forms.js:154
-msgid ""
-"This CSS stylesheet defines the appearance of form input elements and alerts"
-msgstr ""
-"Questo stylesheet CSS definisce lo stile degli elementi di input dei form e "
-"degli alert"
-
-#: routes/forms.js:160
-msgid "Web - Subscribe"
-msgstr "Web - Iscriviti"
-
-#: routes/forms.js:165
-msgid "Web - Confirm Subscription Notice"
-msgstr "Web - Notifica di conferma dell'iscrizione"
-
-#: routes/forms.js:170
-msgid "Mail - Confirm Subscription (MJML)"
-msgstr "Mail - Conferma di iscrizione (MJML)"
-
-#: routes/forms.js:175
-msgid "Mail - Confirm Subscription (Text)"
-msgstr "Mail - Conferma di iscrizione (Testo)"
-
-#: routes/forms.js:180
-msgid "Mail - Already Subscribed (MJML)"
-msgstr "Mail - Già iscritto (MJML)"
-
-#: routes/forms.js:185
-msgid "Mail - Already Subscribed (Text)"
-msgstr "Mail - Già iscritto (Testo)"
-
-#: routes/forms.js:190
-msgid "Web - Subscribed Notice"
-msgstr "Web - Notifica di iscrizione"
-
-#: routes/forms.js:195
-msgid "Mail - Subscription Confirmed (MJML)"
-msgstr "Mail - Conferma di iscrizione (MJML)"
-
-#: routes/forms.js:200
-msgid "Mail - Subscription Confirmed (Text)"
-msgstr "Mail - Conferma di iscrizione (Testo)"
-
-#: routes/forms.js:208
-msgid "Web - Manage Preferences"
-msgstr "Web - Gestisci l preferenze"
-
-#: routes/forms.js:213
-msgid "Web - Manage Address"
-msgstr "Web - Gestisci indirizzo"
-
-#: routes/forms.js:218
-msgid "Web - Updated Notice"
-msgstr "Web - Notifica di aggiornamento"
-
-#: routes/forms.js:226
-msgid "Web - Unsubscribe"
-msgstr "Web - Rimozione iscrizione"
-
-#: routes/forms.js:231
-msgid "Web - Confirm Unsubscription Notice"
-msgstr "Web - Conferma la notifica di rimozione dell'iscrizione"
-
-#: routes/forms.js:236
-msgid "Mail - Confirm Unsubscription (MJML)"
-msgstr "Mail - Conferma la rimozione dell'iscrizione (MJML)"
-
-#: routes/forms.js:241
-msgid "Mail - Confirm Unsubscription (Text)"
-msgstr "Mail - Conferma la rimozione dell'iscrizione (Text)"
-
-#: routes/forms.js:246
-msgid "Mail - Confirm Address Change (MJML)"
-msgstr "Mail - Conferma il cambio di indirizzo (MJML)"
-
-#: routes/forms.js:251
-msgid "Mail - Confirm Address Change (Text)"
-msgstr "Mail - Conferma il cambio di indirizzo (Testo)"
-
-#: routes/forms.js:256
-msgid "Web - Unsubscribed Notice"
-msgstr "Web - Notifica di rimozione"
-
-#: routes/forms.js:261
-msgid "Mail - Unsubscription Confirmed (MJML)"
-msgstr "Mail - Rimozione confermata (MJML)"
-
-#: routes/forms.js:266
-msgid "Mail - Unsubscription Confirmed (Text)"
-msgstr "Mail - Rimozione confermata (Text)"
-
-#: routes/forms.js:271
-msgid "Web - Manual Unsubscribe Notice"
-msgstr "Web - Notifica di rimozione manuale"
-
-#: routes/forms.js:309
-msgid "Form settings updated"
-msgstr "Impostazioni form aggiornate"
-
-#: routes/forms.js:311
-msgid "Form settings not updated"
-msgstr "Impostazioni form non aggiornate"
-
-#: routes/forms.js:327
-msgid "Custom form deleted"
-msgstr "Form personalizzato non cancellato"
-
-#: routes/forms.js:329
-msgid "Could not delete specified form"
-msgstr "Impossibile eliminare il form specificato"
-
-#: routes/index.js:11
-msgid "Self Hosted Newsletter App"
-msgstr "Applicazione di newsletter self-hosted"
-
-#: routes/links.js:39
-msgid "Oops, we couldn't find a link for the URL you clicked"
-msgstr "Oops, non riusciamo a trovare un link per l'URL che hai cliccato"
-
-#: routes/lists.js:82
-msgid "Could not create list"
-msgstr "Impossibile creare lista"
-
-#: routes/lists.js:85
-msgid "List created"
-msgstr "Lista creata"
-
-#: routes/lists.js:93 routes/lists.js:271 routes/lists.js:336
-#: routes/lists.js:375 routes/lists.js:444 routes/lists.js:469
-#: routes/lists.js:514 routes/lists.js:536 routes/lists.js:565
-#: routes/lists.js:657 routes/lists.js:714 routes/lists.js:741
-msgid "Could not find list with specified ID"
-msgstr "Impossibile trovare la lista dell'ID specificato"
-
-#: routes/lists.js:122
-msgid "List settings updated"
-msgstr "Impostazioni lista aggiornate"
-
-#: routes/lists.js:124
-msgid "List settings not updated"
-msgstr "Impostazioni lista non aggiornate"
-
-#: routes/lists.js:142
-msgid "List deleted"
-msgstr "Lista cancellata"
-
-#: routes/lists.js:144
-msgid "Could not delete specified list"
-msgstr "Impossibile cancellare la lista specificata"
-
-#: routes/lists.js:206
-msgid "Unknown"
-msgstr "Sconosciuto"
-
-#: routes/lists.js:206
-msgid "Complained"
-msgstr "Reclamato"
-
-#: routes/lists.js:237
-msgid "Invalid key"
-msgstr "Chiave invalida"
-
-#: routes/lists.js:239
-msgid "Expired key"
-msgstr "Chiave scaduta"
-
-#: routes/lists.js:241
-msgid "Revoked key"
-msgstr "Chiave revocate"
-
-#: routes/lists.js:288
-msgid "Force Subscribe"
-msgstr "Forza iscrizione"
-
-#: routes/lists.js:291
-msgid "Initializing"
-msgstr "Inizializzando"
-
-#: routes/lists.js:294
-msgid "Initialized"
-msgstr "Inizializzato"
-
-#: routes/lists.js:297
-msgid "Importing"
-msgstr "Importando"
-
-#: routes/lists.js:303
-msgid "Errored"
-msgstr "Errore"
-
-#: routes/lists.js:381 routes/lists.js:450 routes/lists.js:475
-msgid "Could not find subscriber with specified ID"
-msgstr "Iscritto con ID specificato non trovato"
-
-#: routes/lists.js:427
-msgid "Could not add subscription"
-msgstr "Impossibile aggiungere iscrizione"
-
-#: routes/lists.js:432
-msgid "%s was successfully added to your list"
-msgstr "%s aggiunto alla lista con successo"
-
-#: routes/lists.js:434
-msgid "%s was not added to your list"
-msgstr "%s non aggiunto alla lista"
-
-#: routes/lists.js:456
-msgid "Could not unsubscribe user"
-msgstr "Impossibile rimuovere iscrizione utente"
-
-#: routes/lists.js:459
-msgid "%s was successfully unsubscribed from your list"
-msgstr "Rimozione iscrizione % dalla lista avvenuta con successo"
-
-#: routes/lists.js:479
-msgid "%s was successfully removed from your list"
-msgstr "Iscrizione %s cancellata con successo"
-
-#: routes/lists.js:491
-msgid "Another subscriber with email address %s already exists"
-msgstr "Una iscrizione con l'email %s esiste già"
-
-#: routes/lists.js:498
-msgid "Subscription settings updated"
-msgstr "Impostazioni di iscrizione aggiornate"
-
-#: routes/lists.js:500
-msgid "Subscription settings not updated"
-msgstr "Impostazioni di iscrizione non aggiornate"
-
-#: routes/lists.js:542 routes/lists.js:663 routes/lists.js:699
-#: routes/lists.js:727 routes/lists.js:747
-msgid "Could not find import data with specified ID"
-msgstr "Impossibile trovare dati di importo per l'ID specificato"
-
-#: routes/lists.js:573
-msgid "Could not process CSV"
-msgstr "Impossibile elaborare CSV"
-
-#: routes/lists.js:589
-msgid "Could not create importer"
-msgstr "Impossibile creare una importazione"
-
-#: routes/lists.js:643
-msgid "Empty file"
-msgstr "File vuoto"
-
-#: routes/lists.js:646
-msgid "Too few rows"
-msgstr "Troppe poche righe"
-
-#: routes/lists.js:703
-msgid "Import started"
-msgstr "Importazione iniziato"
-
-#: routes/lists.js:731
-msgid "Import restarted"
-msgstr "Importazione riniziato"
-
-#: routes/lists.js:797
-msgid "One-step (i.e. no email with confirmation link)"
-msgstr "Uno step (no email con link di conferma)"
-
-#: routes/lists.js:803
-msgid ""
-"One-step with unsubscription form (i.e. no email with confirmation link)"
-msgstr "Uno step con form di cancellazione (no email con link di conferma)"
-
-#: routes/lists.js:809
-msgid "Two-step (i.e. an email with confirmation link will be sent)"
-msgstr "Due step (una email con link di conferma viene inviata)"
-
-#: routes/lists.js:815
-msgid ""
-"Two-step with unsubscription form (i.e. an email with confirmation link will "
-"be sent)"
-msgstr ""
-"Form di cancellazione a due step (una mail con link di conferma viene "
-"inviata)"
-
-#: routes/lists.js:821
-msgid ""
-"Manual (i.e. unsubscription has to be performed by the list administrator)"
-msgstr ""
-"Manuale (p.es. la cancellazione deve essere eseguita dall'amministratore "
-"della lista)"
-
-#: routes/report-templates.js:246
-msgid "Could not create report template"
-msgstr "Impossibile creare il template di report"
-
-#: routes/report-templates.js:249
-msgid "Report template “%s” created"
-msgstr "Template report \"%s\" creato"
-
-#: routes/report-templates.js:257
-msgid "Could not find report template with specified ID"
-msgstr "Impossibile trovare il template del report specificato"
-
-#: routes/report-templates.js:280
-msgid "Report template updated"
-msgstr "Template report aggiornato"
-
-#: routes/report-templates.js:282
-msgid "Report template not updated"
-msgstr "Template report non aggiornato"
-
-#: routes/report-templates.js:298
-msgid "Report template deleted"
-msgstr "Template report eliminato"
-
-#: routes/report-templates.js:300
-msgid "Could not delete specified report template"
-msgstr "Impossibile eliminare il template del report"
-
-#: routes/reports.js:124 routes/reports.js:130
-msgid "Could not create report"
-msgstr "Impossibile creare il report"
-
-#: routes/reports.js:135
-msgid "Report “%s” created"
-msgstr "Creato report \"%s\""
-
-#: routes/reports.js:146 routes/reports.js:224 routes/reports.js:239
-#: routes/reports.js:265 routes/reports.js:275
-msgid "Could not find report with specified ID"
-msgstr "Impossibile trovare il report con l'ID specificato"
-
-#: routes/reports.js:188 routes/reports.js:194
-msgid "Could not update report"
-msgstr "Impossibile aggiornare il report"
-
-#: routes/reports.js:197
-msgid "Report updated"
-msgstr "Report aggiornato"
-
-#: routes/reports.js:199
-msgid "Report not updated"
-msgstr "Report non aggiornato"
-
-#: routes/reports.js:212
-msgid "Report deleted"
-msgstr "Report eliminato"
-
-#: routes/reports.js:214
-msgid "Could not delete specified report"
-msgstr "Impossibile eliminare il report specificato"
-
-#: routes/reports.js:230
-msgid "Could not find report template"
-msgstr "Template di reportistica non trovato"
-
-#: routes/reports.js:260
-msgid "Unknown type of template"
-msgstr "Tipo di template sconosciuto"
-
-#: routes/segments.js:86
-msgid "Could not create segment"
-msgstr "Impossibile creare segmento"
-
-#: routes/segments.js:89
-msgid "Segment created"
-msgstr "Segmento creato"
-
-#: routes/segments.js:113
-msgid "Selected segment ID not found"
-msgstr "Segmento selezionato non trovato"
-
-#: routes/segments.js:188
-msgid "Segment settings updated"
-msgstr "Impostazioni segmento aggiornate"
-
-#: routes/segments.js:190
-msgid "Segment settings not updated"
-msgstr "Impostazioni segmento non aggiornate"
-
-#: routes/segments.js:206
-msgid "Segment deleted"
-msgstr "Segmento cancellato"
-
-#: routes/segments.js:208
-msgid "Could not delete specified segment"
-msgstr "Impossibile eliminare il segmento specifcato"
-
-#: routes/segments.js:342
-msgid "Could not create rule"
-msgstr "Impossibile creare la regola"
-
-#: routes/segments.js:345
-msgid "Rule created"
-msgstr "Regola creata"
-
-#: routes/segments.js:410
-msgid "Rule settings updated"
-msgstr "Impostazioni regola aggiornate"
-
-#: routes/segments.js:412
-msgid "Rule settings not updated"
-msgstr "Impostazioni regola non aggiornate"
-
-#: routes/segments.js:428
-msgid "Rule deleted"
-msgstr "Regola cancellata"
-
-#: routes/segments.js:430
-msgid "Could not delete specified rule"
-msgstr "Impossibile eliminare la regola specificata"
-
-#: routes/settings.js:39
-msgid "Use TLS"
-msgstr "Usa TLS"
-
-#: routes/settings.js:40
-msgid "usually selected for port 465"
-msgstr "usualmente selezionata per la porta 465"
-
-#: routes/settings.js:44
-msgid "Use STARTTLS"
-msgstr "Usa STARTTLS"
-
-#: routes/settings.js:45
-msgid "usually selected for port 587 and 25"
-msgstr "usualmente selezionate per le porte 587 e 25"
-
-#: routes/settings.js:49
-msgid "Do not use encryption"
-msgstr "Non usare crittografia"
-
-#: routes/settings.js:115
-msgid "Settings updated"
-msgstr "Impostazioni aggiornate"
-
-#: routes/settings.js:173
-msgid "Invalid mail transport type"
-msgstr "Tipo di trasporto mail invalido"
-
-#: routes/settings.js:184
-msgid "Invalid Access Key"
-msgstr "Chiave di accesso invalida"
-
-#: routes/settings.js:187
-msgid "Invalid AWS credentials"
-msgstr "Credenziali AWS invalide"
-
-#: routes/settings.js:190
-msgid "Connection refused, check hostname and port."
-msgstr "Connessione rifiutata, controlla hostname e porta."
-
-#: routes/settings.js:195
-msgid ""
-"Did not receive greeting message from server. This might happen when "
-"connecting to a TLS port without using TLS."
-msgstr ""
-"Non ho ricevuto il messaggio di saluto dal server. Questo può succedere "
-"quando ci si connette ad una porta TLS senza utilizzare TLS."
-
-#: routes/settings.js:197
-msgid "Did not receive greeting message from server."
-msgstr "Non ho ricevuto il messaggio di saluto dal server."
-
-#: routes/settings.js:200
-msgid ""
-"Connection timed out. Check your firewall settings, destination port is "
-"probably blocked."
-msgstr ""
-"Tempo di connessione scaduto. Controlla il tuo firewall, le porte sono "
-"probabilmente chiuse."
-
-#: routes/settings.js:205
-msgid "Authentication not accepted, server expects STARTTLS to be used."
-msgstr ""
-"Autenticazione non accettata, il server richiede l'utilizzo di STARTTLS."
-
-#: routes/settings.js:207
-msgid "Authentication failed, check username and password."
-msgstr "Autenticazione fallita, controlla il nome utente e la password."
-
-#: routes/settings.js:217
-msgid "Failed Mailer verification."
-msgstr "Verifica delle impostazioni di invio mail fallita."
-
-#: routes/settings.js:217
-msgid "Server responded with: \"%s\""
-msgstr "Il Server ha risposto con: \"%s\""
-
-#: routes/settings.js:221
-msgid "Mailer settings verified, ready to send some mail!"
-msgstr ""
-"Impostazioni di invio mail verificate, il software è pronto per inviare "
-"delle mail!"
-
-#: routes/subscription.js:33
-msgid "Not allowed by CORS"
-msgstr "Non permesso dalle impostazioni CORS"
-
-#: routes/subscription.js:61 routes/subscription.js:176
-#: routes/subscription.js:286 routes/subscription.js:382
-#: routes/subscription.js:459 routes/subscription.js:535
-#: routes/subscription.js:566 routes/subscription.js:626
-#: routes/subscription.js:682 routes/subscription.js:760
-#: routes/subscription.js:897
-msgid "Selected list not found"
-msgstr "Lista selezionata non trovata"
-
-#: routes/subscription.js:93
-msgid "Could not save subscription"
-msgstr "Impossibile salvare l'iscrizione"
-
-#: routes/subscription.js:118
-msgid "Subscriber info corrupted or missing"
-msgstr "Informazioni iscritto corrotte o mancanti"
-
-#: routes/subscription.js:136
-msgid "Email address changed"
-msgstr "Indirizzo email aggiornato"
-
-#: routes/subscription.js:179 routes/subscription.js:385
-msgid "The list does not allow public subscriptions."
-msgstr "L'iscrizione alla lista non è pubblica."
-
-#: routes/subscription.js:355 routes/subscription.js:357
-msgid "Email address not set"
-msgstr "Indirizzo email non impostato"
-
-#: routes/subscription.js:653
-msgid ""
-"An email with further instructions has been sent to the provided address"
-msgstr ""
-"Una email con ulteriori istruzioni è stata inviata all'indirizzo fornito"
-
-#: routes/subscription.js:861 routes/subscription.js:877
-msgid "Public key is not set"
-msgstr "la chiave pubblica non è impostata"
-
-#: routes/templates.js:84
-msgid "Could not create template"
-msgstr "Impossibile creare template"
-
-#: routes/templates.js:87
-msgid "Template created"
-msgstr "Template creato"
-
-#: routes/templates.js:126
-msgid "Template settings updated"
-msgstr "Impostazioni template aggiornate"
-
-#: routes/templates.js:128
-msgid "Template settings not updated"
-msgstr "Impostazioni template non aggiornate"
-
-#: routes/templates.js:144
-msgid "Template duplicated"
-msgstr "Template duplicato"
-
-#: routes/templates.js:146
-msgid "Could not duplicate specified template"
-msgstr "Impossibile duplicare il template specificato"
-
-#: routes/templates.js:157
-msgid "Template deleted"
-msgstr "Template cancellato"
-
-#: routes/templates.js:159
-msgid "Could not delete specified template"
-msgstr "Impossibile eliminare il template selezionato"
-
-#: routes/triggers.js:62 routes/triggers.js:79 routes/triggers.js:154
-msgid "Could not find selected list"
-msgstr "Lista selezionata non trovata"
-
-#: routes/triggers.js:131
-msgid "Could not create trigger"
-msgstr "Impossibile creare il trigger"
-
-#: routes/triggers.js:138
-msgid "Trigger “%s” created"
-msgstr "Trigger \"%s\" creato"
-
-#: routes/triggers.js:214
-msgid "Trigger settings updated"
-msgstr "Impostazioni trigger aggiornate"
-
-#: routes/triggers.js:216
-msgid "Trigger settings not updated"
-msgstr "Impostazioni trigger non aggiornate"
-
-#: routes/triggers.js:228
-msgid "Trigger deleted"
-msgstr "Trigger cancellato"
-
-#: routes/triggers.js:230
-msgid "Could not delete specified trigger"
-msgstr "Impossibile eliminare il trigger specificato"
-
-#: routes/triggers.js:242
-msgid "Could not find trigger with specified ID"
-msgstr "Trigger non trovato con l'ID specificato"
-
-#: routes/triggers.js:255
-msgid "Trigger not found"
-msgstr "Trigger non trovato"
-
-#: routes/users.js:32
-msgid ""
-"An email with password reset instructions has been sent to your email "
-"address, if it exists on our system."
-msgstr ""
-"Una mail con le istruzioni di ripristino password sono state inviate alla "
-"tua mail, se esiste nel sistema."
-
-#: routes/users.js:46 routes/users.js:64
-msgid "Unknown or expired reset token"
-msgstr "Token sconosciuto o scaduto"
-
-#: routes/users.js:66
-msgid "Your password has been changed successfully"
-msgstr "La tua password è stata cambiata con successo"
-
-#: routes/users.js:87
-msgid "User data not found"
-msgstr "Dati utente non trovati"
-
-#: routes/users.js:110
-msgid "Access token updated"
-msgstr "Token di accesso aggiornati"
-
-#: routes/users.js:112
-msgid "Access token not updated"
-msgstr "Token di access non aggiornati"
-
-#: routes/users.js:139
-msgid "Account information updated"
-msgstr "Informazioni account aggiornate"
-
-#: routes/users.js:141
-msgid "Account information not updated"
-msgstr "Informazioni account non aggiornate"
-
-#: services/feedcheck.js:51
-msgid "Feed error: %s"
-msgstr "Errore feed %s"
-
-#: services/feedcheck.js:54
-msgid "Found %s new campaign messages from feed"
-msgstr "Trovato un nuovo messaggio %s per la campagna dal feed"
-
-#: services/feedcheck.js:56
-msgid "Found nothing new from the feed"
-msgstr "Nulla di nuovo dal feed"
-
-#: services/feedcheck.js:146
-msgid "RSS entry %s"
-msgstr "RSS %s"
-
-#: services/importer.js:249
-msgid "Could not access import file"
-msgstr "Impossibile accedere al file da importare"
-
-#: services/triggers.js:51
-msgid "Unknown trigger type %s"
-msgstr "Trigger %s sconosciuto"
diff --git a/languages/pl_PL.mo b/languages/pl_PL.mo
deleted file mode 100644
index 87fc07e4..00000000
Binary files a/languages/pl_PL.mo and /dev/null differ
diff --git a/languages/pl_PL.po b/languages/pl_PL.po
deleted file mode 100644
index 4e164b2f..00000000
--- a/languages/pl_PL.po
+++ /dev/null
@@ -1,3739 +0,0 @@
-msgid ""
-msgstr ""
-"Project-Id-Version: \n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-03-07 21:44+0200\n"
-"PO-Revision-Date: 2019-05-09 14:02+0200\n"
-"Language-Team: \n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Poedit 2.2.1\n"
-"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 "
-"|| n%100>14) ? 1 : 2);\n"
-"Last-Translator: \n"
-"Language: pl_PL\n"
-
-#: views/archive/layout.hbs:1 views/layout.hbs:1
-#: views/subscription/layout.hbs:1 routes/index.js:11
-msgid "Self hosted email newsletter app"
-msgstr "Samodzielnie hostowana aplikacja e-mail newsletter"
-
-#: views/campaigns/bounced.hbs:1 views/campaigns/campaigns.hbs:1
-#: views/campaigns/clicked.hbs:1 views/campaigns/complained.hbs:1
-#: views/campaigns/create-rss.hbs:1 views/campaigns/create-triggered.hbs:1
-#: views/campaigns/create.hbs:1 views/campaigns/delivered.hbs:1
-#: views/campaigns/edit-rss.hbs:1 views/campaigns/edit-triggered.hbs:1
-#: views/campaigns/edit.hbs:1 views/campaigns/opened.hbs:1
-#: views/campaigns/unsubscribed.hbs:1 views/campaigns/upload-attachment.hbs:1
-#: views/campaigns/view.hbs:1 views/lists/create.hbs:1 views/lists/edit.hbs:1
-#: views/lists/fields/create.hbs:1 views/lists/fields/edit.hbs:1
-#: views/lists/fields/fields.hbs:1 views/lists/lists.hbs:1
-#: views/lists/segments/create.hbs:1 views/lists/segments/edit.hbs:1
-#: views/lists/segments/rule-configure.hbs:1
-#: views/lists/segments/rule-create.hbs:1 views/lists/segments/rule-edit.hbs:1
-#: views/lists/segments/segments.hbs:1 views/lists/segments/view.hbs:1
-#: views/lists/subscription/add.hbs:1 views/lists/subscription/edit.hbs:1
-#: views/lists/subscription/import-failed.hbs:1
-#: views/lists/subscription/import-preview.hbs:1
-#: views/lists/subscription/import.hbs:1 views/lists/view.hbs:1
-#: views/settings.hbs:1 views/templates/create.hbs:1 views/templates/edit.hbs:1
-#: views/templates/templates.hbs:1 views/triggers/create-select.hbs:1
-#: views/triggers/create.hbs:1 views/triggers/edit.hbs:1
-#: views/triggers/triggered.hbs:1 views/triggers/triggers.hbs:1
-#: views/users/account.hbs:1 views/users/api.hbs:1 views/users/forgot.hbs:1
-#: views/users/login.hbs:1 views/users/reset.hbs:1 app.js:169
-msgid "Home"
-msgstr "Strona główna"
-
-#: views/campaigns/bounced.hbs:2 views/campaigns/campaigns.hbs:2
-#: views/campaigns/campaigns.hbs:7 views/campaigns/clicked.hbs:2
-#: views/campaigns/complained.hbs:2 views/campaigns/create-rss.hbs:2
-#: views/campaigns/create-triggered.hbs:2 views/campaigns/create.hbs:2
-#: views/campaigns/delivered.hbs:2 views/campaigns/edit-rss.hbs:2
-#: views/campaigns/edit-triggered.hbs:2 views/campaigns/edit.hbs:2
-#: views/campaigns/opened.hbs:2 views/campaigns/unsubscribed.hbs:2
-#: views/campaigns/upload-attachment.hbs:2 views/campaigns/view.hbs:2
-#: lib/tools.js:119 routes/campaigns.js:35
-msgid "Campaigns"
-msgstr "Kampanie"
-
-#: views/campaigns/bounced.hbs:3 views/campaigns/bounced.hbs:4
-msgid "Bounced info"
-msgstr "Informacje o odrzuconych/odbiciach"
-
-#: views/campaigns/bounced.hbs:5 views/campaigns/clicked.hbs:5
-#: views/campaigns/complained.hbs:5 views/campaigns/delivered.hbs:5
-#: views/campaigns/edit-rss.hbs:5 views/campaigns/edit-triggered.hbs:5
-#: views/campaigns/edit.hbs:5 views/campaigns/opened.hbs:5
-#: views/campaigns/unsubscribed.hbs:5 views/campaigns/upload-attachment.hbs:6
-msgid "View campaign"
-msgstr "Zobacz kampanię"
-
-#: views/campaigns/bounced.hbs:6
-msgid "Subscribers who bounced and were unsubscribed:"
-msgstr "Subskrybenci, którzy odbili wiadomość i zrezygnowali z subskrypcji:"
-
-#: views/campaigns/bounced.hbs:7 views/campaigns/clicked.hbs:13
-#: views/campaigns/complained.hbs:7 views/campaigns/delivered.hbs:7
-#: views/campaigns/opened.hbs:7 views/campaigns/unsubscribed.hbs:7
-#: views/lists/subscription/import-failed.hbs:9 views/lists/view.hbs:18
-#: views/triggers/triggered.hbs:6
-msgid "Address"
-msgstr "Adres"
-
-#: views/campaigns/bounced.hbs:8 views/campaigns/clicked.hbs:14
-#: views/campaigns/complained.hbs:8 views/campaigns/delivered.hbs:8
-#: views/campaigns/opened.hbs:8 views/campaigns/unsubscribed.hbs:8
-#: views/lists/subscription/add.hbs:6 views/lists/subscription/edit.hbs:7
-#: views/lists/subscription/import-preview.hbs:7 views/lists/view.hbs:19
-#: views/subscription/manage.hbs:4 views/subscription/subscribe.hbs:4
-#: views/triggers/triggered.hbs:7
-msgid "First Name"
-msgstr "Imię"
-
-#: views/campaigns/bounced.hbs:9 views/campaigns/clicked.hbs:15
-#: views/campaigns/complained.hbs:9 views/campaigns/delivered.hbs:9
-#: views/campaigns/opened.hbs:9 views/campaigns/unsubscribed.hbs:9
-#: views/lists/subscription/add.hbs:7 views/lists/subscription/edit.hbs:8
-#: views/lists/subscription/import-preview.hbs:8 views/lists/view.hbs:20
-#: views/subscription/manage.hbs:5 views/subscription/subscribe.hbs:5
-#: views/triggers/triggered.hbs:8
-msgid "Last Name"
-msgstr "Nazwisko"
-
-#: views/campaigns/bounced.hbs:10 views/campaigns/complained.hbs:10
-#: views/campaigns/delivered.hbs:10 views/campaigns/unsubscribed.hbs:10
-msgid "SMTP response"
-msgstr "Odpowiedź SMTP"
-
-#: views/campaigns/bounced.hbs:11
-msgid "Bounce time"
-msgstr "Czas odbicia"
-
-#: views/campaigns/campaigns.hbs:3 views/campaigns/create-triggered.hbs:24
-#: views/campaigns/create.hbs:3 views/campaigns/create.hbs:4
-#: views/campaigns/create.hbs:27
-msgid "Create Campaign"
-msgstr "Utwórz Kampanię"
-
-#: views/campaigns/campaigns.hbs:4
-msgid "Regular Campaign"
-msgstr "Zwykła kampania"
-
-#: views/campaigns/campaigns.hbs:5
-msgid "RSS Campaign"
-msgstr "Kampania RSS"
-
-#: views/campaigns/campaigns.hbs:6
-msgid "Triggered Campaign"
-msgstr "Wywołana kampania"
-
-#: views/campaigns/campaigns.hbs:8 views/campaigns/create-rss.hbs:6
-#: views/campaigns/create-triggered.hbs:5 views/campaigns/create.hbs:5
-#: views/campaigns/edit-rss.hbs:8 views/campaigns/edit-triggered.hbs:9
-#: views/campaigns/edit.hbs:10 views/campaigns/view.hbs:71
-#: views/lists/create.hbs:5 views/lists/edit.hbs:6
-#: views/lists/fields/fields.hbs:6 views/lists/lists.hbs:5
-#: views/lists/segments/segments.hbs:6 views/templates/templates.hbs:5
-#: views/triggers/triggers.hbs:5
-msgid "Name"
-msgstr "Nazwa"
-
-#: views/campaigns/campaigns.hbs:9 views/campaigns/create-rss.hbs:8
-#: views/campaigns/create-triggered.hbs:7 views/campaigns/create.hbs:7
-#: views/campaigns/edit-rss.hbs:10 views/campaigns/edit-triggered.hbs:11
-#: views/campaigns/edit.hbs:12 views/campaigns/view.hbs:72
-#: views/lists/create.hbs:7 views/lists/edit.hbs:10 views/lists/lists.hbs:8
-#: views/partials/merge-tag-reference.hbs:4 views/templates/create.hbs:9
-#: views/templates/edit.hbs:8 views/templates/templates.hbs:6
-#: views/triggers/create.hbs:7 views/triggers/edit.hbs:8
-#: views/triggers/triggers.hbs:7
-msgid "Description"
-msgstr "Opis"
-
-#: views/campaigns/campaigns.hbs:10 views/campaigns/view.hbs:73
-#: views/lists/view.hbs:21 views/lists/view.hbs:29
-#: views/triggers/triggers.hbs:6
-msgid "Status"
-msgstr "Status"
-
-#: views/campaigns/campaigns.hbs:11 views/campaigns/view.hbs:74
-#: views/lists/view.hbs:22 views/lists/view.hbs:23
-msgid "Created"
-msgstr "Utworzono"
-
-#: views/campaigns/clicked.hbs:3 views/campaigns/clicked.hbs:4
-msgid "Link info"
-msgstr "Informacje o linkach"
-
-#: views/campaigns/clicked.hbs:6 views/campaigns/view.hbs:61
-msgid "URL"
-msgstr "URL"
-
-#: views/campaigns/clicked.hbs:7 views/campaigns/view.hbs:62
-msgid "Clicks"
-msgstr "Kliknięcia"
-
-#: views/campaigns/clicked.hbs:8 views/campaigns/view.hbs:63
-msgid "% of clicks"
-msgstr "% kliknięć"
-
-#: views/campaigns/clicked.hbs:9 views/campaigns/view.hbs:64
-msgid "% of messages"
-msgstr "% wiadomości"
-
-#: views/campaigns/clicked.hbs:10 views/campaigns/view.hbs:67
-msgid "Aggregated clicks"
-msgstr "Zagregowane kliknięcia"
-
-#: views/campaigns/clicked.hbs:11
-msgid "Subscribers who clicked on a link:"
-msgstr "Subskrybenci, którzy kliknęli link:"
-
-#: views/campaigns/clicked.hbs:12
-msgid "Subscribers who clicked on this link:"
-msgstr "Subskrybenci, którzy kliknęli ten link:"
-
-#: views/campaigns/clicked.hbs:16
-msgid "First click time"
-msgstr "Czas pierwszego kliknięcia"
-
-#: views/campaigns/clicked.hbs:17
-msgid "Click count"
-msgstr "Liczba kliknięć"
-
-#: views/campaigns/complained.hbs:3 views/campaigns/complained.hbs:4
-msgid "Complained info"
-msgstr "Informacje o skargach"
-
-#: views/campaigns/complained.hbs:6
-msgid "Subscribers who complained and were unsubscribed:"
-msgstr "Subskrybenci, którzy złożyli skargę i wypisali się:"
-
-#: views/campaigns/complained.hbs:11
-msgid "Complain time"
-msgstr "Czas skargi"
-
-#: views/campaigns/create-rss.hbs:3 views/campaigns/create-rss.hbs:4
-#: views/campaigns/create-rss.hbs:20
-msgid "Create RSS Campaign"
-msgstr "Utwórz kampanię RSS"
-
-#: views/campaigns/create-rss.hbs:5 views/campaigns/edit-rss.hbs:6
-msgid ""
-"RSS campaign sets up a tracker against selected RSS feed address. Whenever a "
-"new entry is found from this feed it is sent to selected list as an email "
-"message."
-msgstr ""
-"Kampania RSS ustawia moduł śledzący na wybrany adres RSS. Za każdym razem, "
-"gdy nowy wpis zostanie znaleziony z tego kanału, zostanie wysłany na wybraną "
-"listę jako wiadomość e-mail."
-
-#: views/campaigns/create-rss.hbs:7 views/campaigns/create-triggered.hbs:6
-#: views/campaigns/create.hbs:6 views/campaigns/edit-rss.hbs:9
-#: views/campaigns/edit-triggered.hbs:10 views/campaigns/edit.hbs:11
-msgid "Campaign Name"
-msgstr "Nazwa kampanii"
-
-#: views/campaigns/create-rss.hbs:9 views/campaigns/create-triggered.hbs:8
-#: views/campaigns/create.hbs:8 views/campaigns/edit-rss.hbs:11
-#: views/campaigns/edit-triggered.hbs:12 views/campaigns/edit.hbs:13
-#: views/lists/create.hbs:8 views/lists/edit.hbs:11
-#: views/templates/create.hbs:11 views/templates/edit.hbs:10
-#: views/triggers/create.hbs:9 views/triggers/edit.hbs:10
-msgid "HTML is allowed"
-msgstr "HTML dozwolony"
-
-#: views/campaigns/create-rss.hbs:10 views/campaigns/create-triggered.hbs:9
-#: views/campaigns/create.hbs:9 views/campaigns/edit-rss.hbs:12
-#: views/campaigns/edit-triggered.hbs:13 views/campaigns/edit.hbs:14
-#: views/campaigns/view.hbs:6 views/triggers/create-select.hbs:6
-#: views/triggers/create.hbs:10 views/triggers/edit.hbs:12
-#: views/triggers/triggers.hbs:8
-msgid "List"
-msgstr "Lista"
-
-#: views/campaigns/create-rss.hbs:11 views/campaigns/create-triggered.hbs:10
-#: views/campaigns/create-triggered.hbs:13 views/campaigns/create.hbs:10
-#: views/campaigns/create.hbs:14 views/campaigns/edit-rss.hbs:13
-#: views/campaigns/edit-triggered.hbs:14 views/campaigns/edit.hbs:15
-#: views/lists/fields/create.hbs:27 views/lists/fields/edit.hbs:28
-#: views/lists/segments/create.hbs:9 views/lists/segments/edit.hbs:10
-#: views/lists/segments/rule-create.hbs:7 views/lists/subscription/add.hbs:10
-#: views/lists/subscription/add.hbs:12 views/lists/subscription/edit.hbs:11
-#: views/lists/subscription/import-preview.hbs:5
-#: views/subscription/manage.hbs:10 views/subscription/subscribe.hbs:10
-#: views/templates/create.hbs:8 views/triggers/create-select.hbs:7
-#: views/triggers/create.hbs:17 views/triggers/create.hbs:20
-#: views/triggers/create.hbs:22 views/triggers/create.hbs:26
-#: views/triggers/edit.hbs:19 views/triggers/edit.hbs:22
-#: views/triggers/edit.hbs:24 views/triggers/edit.hbs:28
-msgid "Select"
-msgstr "Wybierz"
-
-#: views/campaigns/create-rss.hbs:12 views/campaigns/create-triggered.hbs:11
-#: views/campaigns/create.hbs:11 views/campaigns/edit-rss.hbs:14
-#: views/campaigns/edit-triggered.hbs:15 views/campaigns/edit.hbs:16
-#: views/triggers/create-select.hbs:8 views/triggers/create.hbs:11
-#: views/triggers/edit.hbs:13
-msgid "subscribers"
-msgstr "subskrybenci"
-
-#: views/campaigns/create-rss.hbs:13 views/campaigns/edit-rss.hbs:15
-msgid "RSS Feed Url"
-msgstr "Adres URL kanału RSS"
-
-#: views/campaigns/create-rss.hbs:14 views/campaigns/edit-rss.hbs:16
-msgid ""
-"New entries from this RSS URL are sent out to list subscribers as email "
-"messages"
-msgstr ""
-"Nowe wpisy z tego adresu RSS są wysyłane do listy subskrybentów, jak "
-"wiadomości e-mail"
-
-#: views/campaigns/create-rss.hbs:15 views/campaigns/create-triggered.hbs:17
-#: views/campaigns/create.hbs:18 views/campaigns/edit-rss.hbs:18
-#: views/campaigns/edit-triggered.hbs:16 views/campaigns/edit.hbs:17
-#: views/campaigns/view.hbs:12
-msgid "Email \"from name\""
-msgstr "E-mail nazwa \"from\""
-
-#: views/campaigns/create-rss.hbs:16 views/campaigns/create-triggered.hbs:18
-#: views/campaigns/create.hbs:19 views/campaigns/edit-rss.hbs:19
-#: views/campaigns/edit.hbs:18 views/settings.hbs:23
-msgid "This is the name your emails will come from"
-msgstr "This is the name your emails will come from"
-
-#: views/campaigns/create-rss.hbs:17 views/campaigns/create-triggered.hbs:19
-#: views/campaigns/create.hbs:20 views/campaigns/edit-rss.hbs:20
-#: views/campaigns/edit-triggered.hbs:18 views/campaigns/edit.hbs:19
-#: views/campaigns/view.hbs:13
-msgid "Email \"from\" address"
-msgstr "E-mail adres \"from\""
-
-#: views/campaigns/create-rss.hbs:18 views/campaigns/create-triggered.hbs:20
-#: views/campaigns/edit-rss.hbs:21 views/campaigns/edit-triggered.hbs:19
-#: views/settings.hbs:25
-msgid "This is the address people will send replies to"
-msgstr "To jest adres na który ludzie będą wysyłać odpowiedzi"
-
-#: views/campaigns/create-rss.hbs:19 views/campaigns/create-triggered.hbs:23
-#: views/campaigns/create.hbs:26 views/campaigns/edit-rss.hbs:22
-#: views/campaigns/edit-triggered.hbs:22 views/campaigns/edit.hbs:25
-msgid "Disable clicked/opened tracking"
-msgstr "Wyłącz kliknięte/otwarte śledzenie"
-
-#: views/campaigns/create-triggered.hbs:3
-#: views/campaigns/create-triggered.hbs:4
-msgid "Create Triggered Campaign"
-msgstr "Utwórz uruchamianą kampanię"
-
-#: views/campaigns/create-triggered.hbs:12 views/campaigns/create.hbs:12
-#: views/campaigns/edit-triggered.hbs:7 views/campaigns/edit.hbs:7
-#: views/lists/fields/create.hbs:31 views/lists/fields/edit.hbs:33
-#: views/templates/create.hbs:13
-msgid "Template"
-msgstr "Szablon"
-
-#: views/campaigns/create-triggered.hbs:14 views/campaigns/create.hbs:15
-msgid "Selecting a template creates a campaign specific copy from it"
-msgstr "Wybranie szablonu powoduje utworzenie z niego kopii dla kampanii"
-
-#: views/campaigns/create-triggered.hbs:15 views/campaigns/create.hbs:16
-msgid "Or alternatively use an URL as the message content source:"
-msgstr "Lub alternatywnie użyj adresu URL jako źródło treści wiadomości:"
-
-#: views/campaigns/create-triggered.hbs:16 views/campaigns/create.hbs:17
-#: views/campaigns/edit-triggered.hbs:25 views/campaigns/edit.hbs:28
-msgid ""
-"If a message is sent then this URL will be POSTed to using Merge Tags as "
-"POST body. Use this if you want to generate the HTML message yourself"
-msgstr ""
-"Jeśli wiadomość zostanie wysłana, ten adres URL zostanie wysłany POST do "
-"używania merge tagów jako treść POST. Użyj tej opcji, jeśli chcesz "
-"samodzielnie wygenerować wiadomość HTML"
-
-#: views/campaigns/create-triggered.hbs:21 views/campaigns/create.hbs:24
-#: views/campaigns/edit-triggered.hbs:20 views/campaigns/edit.hbs:23
-#: views/campaigns/view.hbs:15
-msgid "Email \"subject line\""
-msgstr "E-mail temat \"from\""
-
-#: views/campaigns/create-triggered.hbs:22 views/campaigns/create.hbs:25
-#: views/campaigns/edit-triggered.hbs:21 views/campaigns/edit.hbs:24
-#: views/settings.hbs:27
-msgid "Keep it relevant and non-spammy"
-msgstr "Zachowaj to, co istotne i nie spamuj"
-
-#: views/campaigns/create.hbs:13
-msgid "Select a template:"
-msgstr "Wybierz szablon:"
-
-#: views/campaigns/create.hbs:21 views/campaigns/edit.hbs:20
-msgid ""
-"This is the address people will send replies to unless reply-to address is "
-"set"
-msgstr ""
-"To jest adres, na który ludzie będą wysyłać odpowiedzi, chyba że ustawiono "
-"adres zwrotny"
-
-#: views/campaigns/create.hbs:22 views/campaigns/edit.hbs:21
-#: views/campaigns/view.hbs:14
-msgid "Email \"reply-to\" address"
-msgstr "Email \"Odpowiedz do\""
-
-#: views/campaigns/create.hbs:23 views/campaigns/edit.hbs:22
-msgid "If set, this is the address people will send replies to"
-msgstr ""
-"Jeśli jest ustawiony, jest to adres, na który ludzie będą wysyłać odpowiedzi"
-
-#: views/campaigns/delivered.hbs:3 views/campaigns/delivered.hbs:4
-msgid "Delivered info"
-msgstr "Informacje o dostarczonych"
-
-#: views/campaigns/delivered.hbs:6
-msgid "Subscribers who received the message and did not bounce/unsubscribe:"
-msgstr ""
-"Subskrybenci, którzy otrzymali wiadomość i nie odrzucili/nie anulowali "
-"subskrypcji:"
-
-#: views/campaigns/delivered.hbs:11
-msgid "Delivery time"
-msgstr "Czas dostarczenia"
-
-#: views/campaigns/edit-rss.hbs:3 views/campaigns/edit-rss.hbs:4
-msgid "Edit RSS Campaign"
-msgstr "Edytuj kampanię RSS"
-
-#: views/campaigns/edit-rss.hbs:7 views/campaigns/edit-triggered.hbs:8
-#: views/campaigns/edit.hbs:9 views/settings.hbs:4 views/users/account.hbs:6
-msgid "General Settings"
-msgstr "Ustawienia główne"
-
-#: views/campaigns/edit-rss.hbs:17
-msgid ""
-"Use special merge tag [RSS_ENTRY] to mark the position for the RSS post "
-"content. Additionally you can use any valid merge tag as well."
-msgstr ""
-"Użyj specjalnego merge tagu [RSS_ENTRY], aby oznaczyć pozycję treści "
-"wiadomości RSS. Dodatkowo mżesz użyć dowolnego innego merge tagu."
-
-#: views/campaigns/edit-rss.hbs:23 views/campaigns/edit-triggered.hbs:26
-#: views/campaigns/edit.hbs:34
-msgid "Delete Campaign"
-msgstr "Usuń kampanię"
-
-#: views/campaigns/edit-rss.hbs:24 views/campaigns/edit-triggered.hbs:27
-#: views/campaigns/edit.hbs:35 views/lists/edit.hbs:13
-#: views/lists/fields/edit.hbs:39 views/lists/segments/edit.hbs:14
-#: views/lists/segments/rule-edit.hbs:38 views/lists/subscription/edit.hbs:17
-#: views/settings.hbs:99 views/templates/edit.hbs:12 views/triggers/edit.hbs:30
-#: views/users/account.hbs:18
-msgid "Update"
-msgstr "Zaktualizuj"
-
-#: views/campaigns/edit-triggered.hbs:3 views/campaigns/edit-triggered.hbs:4
-msgid "Edit Triggered Campaign"
-msgstr "Edytuj kampanię uruchamianą"
-
-#: views/campaigns/edit-triggered.hbs:6 views/campaigns/edit.hbs:6
-msgid "General"
-msgstr "Główne"
-
-#: views/campaigns/edit-triggered.hbs:17
-msgid "his is the name your emails will come from"
-msgstr "Nazwa, z której będą wysyłane wszystkie e-maile."
-
-#: views/campaigns/edit-triggered.hbs:23 views/campaigns/edit.hbs:26
-msgid "Template Settings"
-msgstr "Ustawienia szablonu"
-
-#: views/campaigns/edit-triggered.hbs:24 views/campaigns/edit.hbs:27
-msgid "Template URL"
-msgstr "Adres URL szablonu"
-
-#: views/campaigns/edit.hbs:3 views/campaigns/edit.hbs:4
-#: views/campaigns/upload-attachment.hbs:3
-#: views/campaigns/upload-attachment.hbs:5 views/campaigns/view.hbs:3
-msgid "Edit Campaign"
-msgstr "Edytuj kampanie"
-
-#: views/campaigns/edit.hbs:8 views/campaigns/edit.hbs:29
-msgid "Attachments"
-msgstr "Załączniki"
-
-#: views/campaigns/edit.hbs:30
-msgid "File"
-msgstr "Plik"
-
-#: views/campaigns/edit.hbs:31
-msgid "Size"
-msgstr "Rozmiar"
-
-#: views/campaigns/edit.hbs:32 views/campaigns/view.hbs:66
-#: views/lists/fields/fields.hbs:12 views/lists/view.hbs:32
-msgid "No data available in table"
-msgstr "Brak danych w tabeli"
-
-#: views/campaigns/edit.hbs:33 views/campaigns/upload-attachment.hbs:4
-msgid "Add Attachment"
-msgstr "Dodaj załącznik"
-
-#: views/campaigns/opened.hbs:3 views/campaigns/opened.hbs:4
-msgid "Opened info"
-msgstr "Informacje o otwarciach"
-
-#: views/campaigns/opened.hbs:6
-msgid "Subscribers who opened this message:"
-msgstr "Subskrybenci, którzy otworzyli tę wiadomość:"
-
-#: views/campaigns/opened.hbs:10
-msgid "First open"
-msgstr "Pierwsze otwarcie"
-
-#: views/campaigns/opened.hbs:11
-msgid "Opened count"
-msgstr "Liczba otwarć"
-
-#: views/campaigns/unsubscribed.hbs:3 views/campaigns/unsubscribed.hbs:4
-msgid "Unsubscribed info"
-msgstr "Informacje o anulowaniach subskrypcji"
-
-#: views/campaigns/unsubscribed.hbs:6
-msgid "Subscribers who unsubscribed:"
-msgstr "Subskrybenci, którzy anulowali subskrypcję:"
-
-#: views/campaigns/unsubscribed.hbs:11 views/campaigns/view.hbs:26
-#: views/lists/subscription/import.hbs:10 routes/lists.js:171
-msgid "Unsubscribed"
-msgstr "Anulowano subskrypcję"
-
-#: views/campaigns/upload-attachment.hbs:7
-msgid "Upload"
-msgstr "Prześlij"
-
-#: views/campaigns/view.hbs:4
-msgid "Overview"
-msgstr "Przegląd"
-
-#: views/campaigns/view.hbs:5
-msgid "Links"
-msgstr "Linków"
-
-#: views/campaigns/view.hbs:7
-msgid "Feed URL"
-msgstr "Url czytnika"
-
-#: views/campaigns/view.hbs:8
-msgid "Last check"
-msgstr "Ostatnie sprawdzenie"
-
-#: views/campaigns/view.hbs:9
-msgid "Not yet checked"
-msgstr "Jeszcze nie sprawdzone"
-
-#: views/campaigns/view.hbs:10
-msgid "activate campaign to start checking feed for new messages"
-msgstr ""
-"aktywuj kampanię, aby rozpocząć sprawdzanie kanału dla nowych wiadomości"
-
-#: views/campaigns/view.hbs:11
-msgid "RSS status"
-msgstr "Status RSS"
-
-#: views/campaigns/view.hbs:16
-msgid "Preview campaign as"
-msgstr "Podgląd kampanii jako"
-
-#: views/campaigns/view.hbs:17
-msgid "Add new test user"
-msgstr "Dodaj użytkownika testowego"
-
-#: views/campaigns/view.hbs:18
-msgid "No test users yet, create one here"
-msgstr "Brak użytkowników testowych, utwórz je tutaj"
-
-#: views/campaigns/view.hbs:19
-msgid "Go"
-msgstr "Dalej"
-
-#: views/campaigns/view.hbs:20 lib/models/triggers.js:25
-msgid "Delivered"
-msgstr "Dostarczone"
-
-#: views/campaigns/view.hbs:21
-msgid "List subscribers who received this message"
-msgstr "Lista subskrybentów, którzy otrzymali tę wiadomość"
-
-#: views/campaigns/view.hbs:22 routes/lists.js:171
-msgid "Bounced"
-msgstr "Odbite"
-
-#: views/campaigns/view.hbs:23
-msgid "List subscribers who bounced"
-msgstr "Lista użytkowników którzy odbili"
-
-#: views/campaigns/view.hbs:24
-msgid "Complaints"
-msgstr "Skargi"
-
-#: views/campaigns/view.hbs:25
-msgid "List subscribers who complained for this message"
-msgstr "Lista subskrybentów, którzy złożyli skargę na tę wiadomość"
-
-#: views/campaigns/view.hbs:27
-msgid "List subscribers who unsubscribed after this message"
-msgstr "Lista subskrybentów, którzy anulowali subskrypcję po tej wiadomości"
-
-#: views/campaigns/view.hbs:28
-msgid "Opened"
-msgstr "Otwarto"
-
-#: views/campaigns/view.hbs:29
-msgid "List subscribers who opened this message"
-msgstr "Lista subskrybentów, którzy otworzyli tę wiadomość"
-
-#: views/campaigns/view.hbs:30
-msgid "Clicked"
-msgstr "Kliknięto"
-
-#: views/campaigns/view.hbs:31 views/campaigns/view.hbs:68
-msgid "List subscribers who clicked on a link"
-msgstr "Lista subskrybentów, którzy kliknęli w link"
-
-#: views/campaigns/view.hbs:32
-msgid ""
-"Are you sure? This action would start sending messages to the selected list"
-msgstr ""
-"Jesteś pewny? Ta czynność rozpocznie wysyłanie wiadomości do wybranej listy"
-
-#: views/campaigns/view.hbs:33
-msgid "Delay sending"
-msgstr "Opóźnienie wysyłania"
-
-#: views/campaigns/view.hbs:34
-msgid "hours"
-msgstr "godziny"
-
-#: views/campaigns/view.hbs:35
-msgid "minutes"
-msgstr "minuty"
-
-#: views/campaigns/view.hbs:36
-msgid "Send to subscribers:"
-msgstr "Wyślij do subskrybentów:"
-
-#: views/campaigns/view.hbs:37
-msgid "Are you sure? This action would reset scheduling"
-msgstr "Jesteś pewny? Ta czynność zresetuje harmonogram"
-
-#: views/campaigns/view.hbs:38
-msgid "Cancel"
-msgstr "Anuluj"
-
-#: views/campaigns/view.hbs:39
-msgid "Sending scheduled"
-msgstr "Wysyłanie harmonogramu"
-
-#: views/campaigns/view.hbs:40 views/campaigns/view.hbs:52
-msgid "Pause"
-msgstr "Pauza"
-
-#: views/campaigns/view.hbs:41 routes/campaigns.js:264
-msgid "Sending"
-msgstr "Wysyłanie"
-
-#: views/campaigns/view.hbs:42 views/campaigns/view.hbs:46
-msgid ""
-"Are you sure? This action would resume sending messages to the selected list"
-msgstr ""
-"Jesteś pewny? Ta czynność wznowi wysyłanie wiadomości do wybranej listy"
-
-#: views/campaigns/view.hbs:43 views/campaigns/view.hbs:47
-msgid "Are you sure? This action would reset all stats about current progress"
-msgstr ""
-"Jesteś pewny? Ta czynność zresetuje wszystkie statystyki dotyczące bieżącego "
-"postępu"
-
-#: views/campaigns/view.hbs:44
-msgid "Resume"
-msgstr "Wznów"
-
-#: views/campaigns/view.hbs:45 views/campaigns/view.hbs:49
-msgid "Reset"
-msgstr "Resetuj"
-
-#: views/campaigns/view.hbs:48
-msgid "Continue"
-msgstr "Kontynuuj"
-
-#: views/campaigns/view.hbs:50
-msgid ""
-"All messages sent! Hit \"Continue\" if you you want to send this campaign to "
-"new subscribers"
-msgstr ""
-"Wszystkie wiadomości wysłane! Kliknij \"Kontynuuj\", jeśli chcesz wysłać tę "
-"kampanię do nowych subskrybentów"
-
-#: views/campaigns/view.hbs:51
-msgid ""
-"Are you sure? This action would pause sending new entries in RSS feed as "
-"email messages to the selected list"
-msgstr ""
-"Jesteś pewny? Ta czynność wstrzyma wysyłanie wiadomości o nowych wpisach w "
-"kanale RSS do wybranej listy"
-
-#: views/campaigns/view.hbs:53 views/campaigns/view.hbs:57
-msgid "Campaign status:"
-msgstr "Status kampanii:"
-
-#: views/campaigns/view.hbs:54
-msgid "ACTIVE"
-msgstr "AKTYWNE"
-
-#: views/campaigns/view.hbs:55
-msgid ""
-"Are you sure? This action would start sending new entries in RSS feed as "
-"email messages to the selected list"
-msgstr ""
-"Jesteś pewny? Ta czynność rozpocznie wysyłanie wiadomości o nowych wpisach w "
-"kanale RSS do wybranej listy"
-
-#: views/campaigns/view.hbs:56
-msgid "Activate"
-msgstr "Aktywuj"
-
-#: views/campaigns/view.hbs:58
-msgid "INACTIVE"
-msgstr "NIEAKTYWNE"
-
-#: views/campaigns/view.hbs:59
-msgid ""
-"This is a triggered campaign. Messages are only sent to subscribers that hit "
-"some trigger that invokes this campaign"
-msgstr ""
-"To jest kampania wyzwalana. Wiadomości są wysyłane tylko do subskrybentów, "
-"którzy natrafili na jakiś wyzwalacz, który wywołuje tę kampanię"
-
-#: views/campaigns/view.hbs:60
-msgid "see more"
-msgstr "zobacz więcej"
-
-#: views/campaigns/view.hbs:65
-msgid "List subscribers who clicked this link"
-msgstr "Lista subskrybentów, którzy kliknęli link"
-
-#: views/campaigns/view.hbs:69
-msgid ""
-"Clicks are counted as unique subscribers that clicked on a specific link or "
-"on any link (in aggregated view)"
-msgstr ""
-"Kliknięcia są liczone jako unikalni subskrybenci, którzy kliknęli określony "
-"link lub dowolny link (w widoku zbiorczym)"
-
-#: views/campaigns/view.hbs:70
-msgid ""
-"If a new entry is found from campaign feed a new subcampaign is created of "
-"that entry and it will be listed here"
-msgstr ""
-"Jeśli zostanie znaleziony nowy wpis z kanału kampanii, zostanie utworzona "
-"nowa kampania podrzędna dla tego wpisu i zostanie ona tutaj wymieniona"
-
-#: views/emails/confirm-html.hbs:1 views/emails/confirm-html.hbs:2
-#: views/emails/confirm-text.hbs:1
-msgid "Please Confirm Subscription"
-msgstr "Proszę potwierdź subskrypcję"
-
-#: views/emails/confirm-html.hbs:3 views/emails/confirm-text.hbs:2
-msgid "Yes, subscribe me to this list"
-msgstr "Tak, zapisz mnie na listę"
-
-#: views/emails/confirm-html.hbs:4
-msgid ""
-"If you received this email by mistake, simply delete it. You won't be "
-"subscribed if you don't click the confirmation link above."
-msgstr ""
-"Jeśli przez pomyłkę otrzymałeś tego e-maila, po prostu go usuń. Nie będziesz "
-"subskrybowany, jeśli nie klikniesz w link potwierdzający."
-
-#: views/emails/confirm-html.hbs:5 views/emails/confirm-text.hbs:4
-#: views/emails/subscription-confirmed-html.hbs:7
-#: views/emails/subscription-confirmed-text.hbs:7
-#: views/emails/unsubscribe-confirmed-html.hbs:5
-#: views/emails/unsubscribe-confirmed-text.hbs:5
-msgid "For questions about this list, please contact:"
-msgstr "W przypadku pytań dotyczących tej listy, prosimy o kontakt:"
-
-#: views/emails/confirm-text.hbs:3
-msgid ""
-"If you received this email by mistake, simply delete it. You won't be "
-"subscribed unless you click the confirmation link above."
-msgstr ""
-"Jeśli przez pomyłkę otrzymałeś tego e-maila, po prostu go usuń. Nie będziesz "
-"subskrybowany, chyba że klikniesz link powyżej."
-
-#: views/emails/password-reset-html.hbs:1
-#: views/emails/password-reset-html.hbs:2
-#: views/emails/password-reset-text.hbs:1
-msgid "Change your password"
-msgstr "Zmień hasło"
-
-#: views/emails/password-reset-html.hbs:3
-#: views/emails/password-reset-text.hbs:2
-msgid "We have received a password change request for your Mailtrain account:"
-msgstr "Otrzymaliśmy prośbę o zmianę hasła dla Twojego konta Mailtrain:"
-
-#: views/emails/password-reset-html.hbs:4
-#: views/emails/password-reset-text.hbs:3
-msgid "Reset password"
-msgstr "Zresetuj hasło"
-
-#: views/emails/password-reset-html.hbs:5
-#: views/emails/password-reset-text.hbs:4
-msgid ""
-"If you did not ask to change your password, then you can ignore this email "
-"and your password will not be changed."
-msgstr ""
-"Jeśli nie poprosiłeś o zmianę hasła, możesz zignorować ten e-mail, a Twoje "
-"hasło nie zostanie zmienione."
-
-#: views/emails/rss-html.hbs:1 views/emails/stationery-html.hbs:3
-#: views/emails/stationery-text.hbs:3
-msgid "Preferences"
-msgstr "Preferencje"
-
-#: views/emails/rss-html.hbs:2 views/emails/stationery-html.hbs:4
-#: views/emails/stationery-text.hbs:4 views/lists/subscription/edit.hbs:15
-#: views/subscription/manage.hbs:12 views/subscription/unsubscribe.hbs:1
-#: views/subscription/unsubscribe.hbs:4 routes/lists.js:253
-msgid "Unsubscribe"
-msgstr "Anuluj subskrypcję"
-
-#: views/emails/rss-html.hbs:3 views/emails/stationery-html.hbs:5
-#: views/emails/stationery-text.hbs:5
-msgid "View this email in your browser"
-msgstr "Zobacz ten email w Twojej przeglądarce"
-
-#: views/emails/stationery-html.hbs:1 views/emails/stationery-text.hbs:1
-msgid "Hey [FIRST_NAME/Customer],"
-msgstr "Cześć [FIRST_NAME/Customer],"
-
-#: views/emails/stationery-html.hbs:2 views/emails/stationery-text.hbs:2
-msgid "Cheers,"
-msgstr "Pozdrowienia,"
-
-#: views/emails/subscription-confirmed-html.hbs:1
-#: views/emails/subscription-confirmed-text.hbs:1
-#: views/subscription/subscribed.hbs:1
-msgid "Subscription Confirmed"
-msgstr "Subskrypcja została potwierdzona"
-
-#: views/emails/subscription-confirmed-html.hbs:2
-#: views/emails/subscription-confirmed-text.hbs:2
-#: views/subscription/subscribed.hbs:2
-msgid "Your subscription to our list has been confirmed."
-msgstr "Twoja subskrypcja naszej listy została potwierdzona."
-
-#: views/emails/subscription-confirmed-html.hbs:3
-#: views/emails/subscription-confirmed-text.hbs:3
-msgid "If you want to modify your subscription then you can:"
-msgstr "Jeśli chcesz zmodyfikować swoją subskrypcję, możesz:"
-
-#: views/emails/subscription-confirmed-html.hbs:4
-#: views/emails/subscription-confirmed-text.hbs:4
-#: views/subscription/subscribed.hbs:6
-msgid "manage your preferences"
-msgstr "zarządzaj swoimi preferencjami"
-
-#: views/emails/subscription-confirmed-html.hbs:5
-#: views/emails/subscription-confirmed-text.hbs:5
-#: views/subscription/subscribed.hbs:5 views/users/login.hbs:10
-msgid "or"
-msgstr "lub"
-
-#: views/emails/subscription-confirmed-html.hbs:6
-#: views/emails/subscription-confirmed-text.hbs:6
-msgid "unsubscribe here"
-msgstr "anuluj subskrypcję tutaj"
-
-#: views/emails/unsubscribe-confirmed-html.hbs:1
-#: views/emails/unsubscribe-confirmed-text.hbs:1
-msgid "You are now unsubscribed"
-msgstr "Anulowałeś subskrypcję"
-
-#: views/emails/unsubscribe-confirmed-html.hbs:2
-#: views/emails/unsubscribe-confirmed-text.hbs:2
-msgid "We have removed your email address from our list."
-msgstr "Usunęliśmy Twój adres e-mail z naszej listy."
-
-#: views/emails/unsubscribe-confirmed-html.hbs:3
-#: views/emails/unsubscribe-confirmed-text.hbs:3
-msgid "If you unsubscribed by mistake, you can re-subscribe at:"
-msgstr ""
-"Jeśli anulujesz subskrypcję przez pomyłkę, możesz ponownie zasubskrybować na:"
-
-#: views/emails/unsubscribe-confirmed-html.hbs:4
-#: views/emails/unsubscribe-confirmed-text.hbs:4
-#: views/lists/subscription/add.hbs:16 routes/lists.js:253
-msgid "Subscribe"
-msgstr "Subskrybuj"
-
-#: views/index.hbs:1
-msgid "Official Mailtrain Partners"
-msgstr "Oficjalni partnerzy Mailtrain"
-
-#: views/index.hbs:2
-msgid "Free, open source mail server solution"
-msgstr "Darmowe, o otwartym kodzie źródłowym rozwiązanie serwera poczty"
-
-#: views/index.hbs:3
-msgid ""
-"A reliable SMTP server, easy integration, and 12,000 messages a month free"
-msgstr ""
-"Niezawodny serwer SMTP, łatwa integracja i 12 000 wiadomości miesięcznie za "
-"darmo"
-
-#: views/index.hbs:4
-msgid "List management"
-msgstr "Zarządzanie listamie"
-
-#: views/index.hbs:5
-msgid ""
-"Mailtrain allows you to easily manage even very large lists. Million "
-"subscribers? Not a problem. You can add subscribers manually, through the "
-"API or import from a CSV file. All lists come with support for custom fields "
-"and merge tags as well."
-msgstr ""
-"Mailtrain pozwala w łatwy sposób zarządzać nawet bardzo dużymi listami. "
-"Milion subskrybentów? Żaden problem. Możesz dodawać subskrybentów ręcznie, "
-"za pośrednictwem interfejsu API lub importować z pliku CSV. Wszystkie listy "
-"zawierają również obsługę pól niestandardowych i znaczników scalających."
-
-#: views/index.hbs:6
-msgid "Custom fields"
-msgstr "Pola niestandardowe"
-
-#: views/index.hbs:7
-msgid ""
-"Text fields, numbers, drop downs or checkboxes, Mailtrain has them all. "
-"Every custom field can be included in the generated newsletters through "
-"merge tags."
-msgstr ""
-"Pola tekstowe, cyfry, listy rozwijane lub pola wyboru, Mailtrain ma je "
-"wszystkie. Każde niestandardowe pole może być zawarte w wygenerowanych "
-"newsletterach za pomocą merge tagów."
-
-#: views/index.hbs:8
-msgid "List segmentation"
-msgstr "Segmentacja listy"
-
-#: views/index.hbs:9
-msgid ""
-"Send messages only to list subscribers that match predefined segmentation "
-"rules. No need to create separate lists with small differences."
-msgstr ""
-"Wysyłaj wiadomości tylko dla subskrybentów, którzy pasują do "
-"predefiniowanych reguł segmentacji. Nie trzeba tworzyć oddzielnych list z "
-"małymi różnicami."
-
-#: views/index.hbs:10
-msgid "Donate to author"
-msgstr "Przekaż darowiznę autorowi"
-
-#: views/index.hbs:11
-msgid ""
-"If you really like Mailtrain or your business benefits from it financially "
-"then I would really appreciate a small donation to keep the Mailtrain "
-"development engines running. You can either use Bitcoin or PayPal for "
-"donations. My Bitcoin wallet is 15Z8ADxhssKUiwP3jbbqJwA21744KMCfTM"
-"code>"
-msgstr ""
-"Jeśli naprawdę lubisz Mailtrain lub Twoja firma czerpie z teg korzyści "
-"finansowe będę naprawdę wdzięczny za niewielką darowiznę, aby utrzymać "
-"rozwój Mailtrain. Możesz użyć Bitcoin lub PayPal do darowizn. Mój portfel "
-"Bitcoin to 15Z8ADxhssKUiwP3jbbqJwA21744KMCfTM"
-
-#: views/index.hbs:12
-msgid "or donate using PayPal"
-msgstr "lub przekaż darowiznę za pomocą PayPal"
-
-#: views/index.hbs:13
-msgid "RSS Campaigns"
-msgstr "Kampanie RSS"
-
-#: views/index.hbs:14
-msgid ""
-"Setup Mailtrain to track RSS feeds and if a new entry is detected in a feed "
-"then Mailtrain auto-generates a new campaign using entry data as message "
-"contents and sends it to selected subscribers."
-msgstr ""
-"Przygotuj Mailtrain do śledzenia kanałów RSS i jeśli wykryty zostanie nowy "
-"wpis w kanale, Mailtrain automatycznie generuje nową kampanię, wykorzystując "
-"dane wejściowe jako treść wiadomości i wysyła je do wybranych subskrybentów."
-
-#: views/index.hbs:15
-msgid "GPG Encryption"
-msgstr "Szyfrowanie GPG"
-
-#: views/index.hbs:16
-msgid ""
-"If a list has a custom field for a GPG Public Key set then subscribers can "
-"upload their GPG public key to receive encrypted messages from the list."
-msgstr ""
-"Jeśli lista ma niestandardowe pole dla zestawu kluczy publicznych GPG, "
-"subskrybenci mogą przesłać swój klucz publiczny GPG, aby otrzymywać "
-"zaszyfrowane wiadomości z listy."
-
-#: views/index.hbs:17
-msgid "Click stats"
-msgstr "Statystyki kliknięć"
-
-#: views/index.hbs:18
-msgid ""
-"After a campaign is sent, check individual click statistics for every link "
-"included in the message."
-msgstr ""
-"Po wysłaniu kampanii sprawdź statystyki poszczególnych kliknięć dla każdego "
-"linku zawartego w wiadomości."
-
-#: views/index.hbs:19
-msgid "Open source"
-msgstr "Open source"
-
-#: views/index.hbs:20
-msgid "Mailtrain is available under GPLv3 license and completely open source."
-msgstr "Mailtrain jest dostępny na licencji GPLv3 i całkowicie open source."
-
-#: views/index.hbs:21
-msgid "Send via any provider"
-msgstr "Wyślij przez dowolnego dostawcę"
-
-#: views/index.hbs:22
-msgid ""
-"Mailtrain recommends SendPulse even though you "
-"can use any provider that supports SMTP protocol to send out your "
-"newsletters. Bounce and complaints handling via webhooks is supported for "
-"SES, SparkPost, SendGrid and Mailgun, also for Postfix and ZoneMTA."
-msgstr ""
-"Mailtrain recommends SendPulse even though you "
-"can use any provider that supports SMTP protocol to send out your "
-"newsletters. Bounce and complaints handling via webhooks is supported for "
-"SES, SparkPost, SendGrid and Mailgun, also for Postfix and ZoneMTA."
-"Odbieranie i obsługa skarg za pośrednictwem webhooków jest obsługiwane dla "
-"SES, SparkPost, SendGrid i Mailgun, także dla Postfix i ZoneMTA."
-
-#: views/index.hbs:23
-msgid "Trigger based automation"
-msgstr "Automatyzacja oparta na wyzwalaczach"
-
-#: views/index.hbs:24
-msgid ""
-"Define automation triggers to send specific messages when a user activates "
-"the trigger."
-msgstr ""
-"Zdefiniuj wyzwalacze automatyzacji, aby wysłać określone komunikaty, gdy "
-"użytkownik aktywuje wyzwalacz."
-
-#: views/layout.hbs:2
-msgid "Toggle navigation"
-msgstr "Przełącz nawigację"
-
-#: views/layout.hbs:3
-msgid "Wiki"
-msgstr "Wiki"
-
-#: views/layout.hbs:4
-msgid "Blog"
-msgstr "Blog"
-
-#: views/layout.hbs:5 views/users/account.hbs:2 views/users/account.hbs:3
-msgid "Account"
-msgstr "Konto"
-
-#: views/layout.hbs:6 views/settings.hbs:2 views/settings.hbs:3
-msgid "Settings"
-msgstr "Ustawienia"
-
-#: views/layout.hbs:7 views/users/api.hbs:2 views/users/api.hbs:3
-msgid "API"
-msgstr "API"
-
-#: views/layout.hbs:8
-msgid "Log out"
-msgstr "Wyloguj"
-
-#: views/layout.hbs:9 views/users/forgot.hbs:2 views/users/login.hbs:2
-#: views/users/login.hbs:3 views/users/login.hbs:9 views/users/reset.hbs:2
-msgid "Sign in"
-msgstr "Zaloguj się"
-
-#: views/layout.hbs:10
-msgid "Self hosted newsletter app built on top of Nodemailer"
-msgstr ""
-"Samodzielnie hostowana aplikacja e-mail newsletter zbudowana na bazie "
-"Nodemailera"
-
-#: views/layout.hbs:11 views/layout.hbs:13
-msgid "Source on GitHub"
-msgstr "Źródło na GitHub"
-
-#: views/layout.hbs:12
-msgid "Subscribe to our newsletter"
-msgstr "Zapisz się do naszego newslettera"
-
-#: views/lists/create.hbs:2 views/lists/edit.hbs:2
-#: views/lists/fields/create.hbs:2 views/lists/fields/edit.hbs:2
-#: views/lists/fields/fields.hbs:2 views/lists/lists.hbs:2
-#: views/lists/lists.hbs:4 views/lists/segments/create.hbs:2
-#: views/lists/segments/edit.hbs:2 views/lists/segments/rule-configure.hbs:2
-#: views/lists/segments/rule-create.hbs:2 views/lists/segments/rule-edit.hbs:2
-#: views/lists/segments/segments.hbs:2 views/lists/segments/view.hbs:2
-#: views/lists/subscription/add.hbs:2 views/lists/subscription/edit.hbs:2
-#: views/lists/subscription/import-failed.hbs:2
-#: views/lists/subscription/import-preview.hbs:2
-#: views/lists/subscription/import.hbs:2 views/lists/view.hbs:2
-#: lib/tools.js:111
-msgid "Lists"
-msgstr "Listy"
-
-#: views/lists/create.hbs:3 views/lists/create.hbs:4 views/lists/create.hbs:9
-#: views/lists/lists.hbs:3
-msgid "Create List"
-msgstr "Utwórz listę"
-
-#: views/lists/create.hbs:6 views/lists/edit.hbs:7
-msgid "List Name"
-msgstr "Nazwa listy"
-
-#: views/lists/edit.hbs:3 views/lists/edit.hbs:4 views/lists/view.hbs:7
-msgid "Edit List"
-msgstr "Edytuj listę"
-
-#: views/lists/edit.hbs:5
-msgid "View List"
-msgstr "Wyświetl listę"
-
-#: views/lists/edit.hbs:8
-msgid "List ID"
-msgstr "ID listy"
-
-#: views/lists/edit.hbs:9
-msgid "This is the list ID displayed to the subscribers"
-msgstr "To jest ID listy wyświetlany dla subskrybentów"
-
-#: views/lists/edit.hbs:12
-msgid "Delete List"
-msgstr "Usuń listę"
-
-#: views/lists/fields/create.hbs:3 views/lists/fields/edit.hbs:3
-#: views/lists/fields/fields.hbs:3 views/lists/fields/fields.hbs:5
-#: views/lists/view.hbs:5
-msgid "Custom Fields"
-msgstr "Pola niestandardowe"
-
-#: views/lists/fields/create.hbs:4
-msgid "Create Field"
-msgstr "Utwórz pole"
-
-#: views/lists/fields/create.hbs:5 views/lists/fields/fields.hbs:4
-msgid "Create Custom Field"
-msgstr "Utwórz pole niestandardowe"
-
-#: views/lists/fields/create.hbs:6 views/lists/fields/create.hbs:7
-#: views/lists/fields/edit.hbs:7 views/lists/fields/edit.hbs:8
-msgid "Field Name"
-msgstr "Nazwa pola"
-
-#: views/lists/fields/create.hbs:8 views/lists/fields/edit.hbs:9
-msgid "Field Type"
-msgstr "Typ pola"
-
-#: views/lists/fields/create.hbs:9 views/lists/fields/edit.hbs:10
-#: lib/models/fields.js:17
-msgid "Text"
-msgstr "Tekst"
-
-#: views/lists/fields/create.hbs:10 views/lists/fields/edit.hbs:11
-#: lib/models/fields.js:21
-msgid "Number"
-msgstr "Numer"
-
-#: views/lists/fields/create.hbs:11 views/lists/fields/edit.hbs:12
-#: lib/models/fields.js:18
-msgid "Website"
-msgstr "Strona www"
-
-#: views/lists/fields/create.hbs:12 views/lists/fields/edit.hbs:13
-#: lib/models/fields.js:20
-msgid "GPG Public Key"
-msgstr "Klucz publiczny GPG"
-
-#: views/lists/fields/create.hbs:13 views/lists/fields/edit.hbs:14
-#: lib/models/fields.js:19
-msgid "Multi-line text"
-msgstr "Tekst wielowierszowy"
-
-#: views/lists/fields/create.hbs:14 views/lists/fields/edit.hbs:15
-msgid "JSON"
-msgstr "JSON"
-
-#: views/lists/fields/create.hbs:15 views/lists/fields/edit.hbs:16
-msgid "Date"
-msgstr "Data"
-
-#: views/lists/fields/create.hbs:16 views/lists/fields/edit.hbs:17
-msgid "Date (MM/DD/YYYY)"
-msgstr "Data (MM/DD/YYYY)"
-
-#: views/lists/fields/create.hbs:17 views/lists/fields/edit.hbs:18
-#: lib/models/fields.js:26
-msgid "Date (DD/MM/YYYY)"
-msgstr "Data (DD/MM/YYYY)"
-
-#: views/lists/fields/create.hbs:18 views/lists/fields/edit.hbs:19
-msgid "Birthday"
-msgstr "Urodziny"
-
-#: views/lists/fields/create.hbs:19 views/lists/fields/edit.hbs:20
-#: lib/models/fields.js:27
-msgid "Birthday (MM/DD)"
-msgstr "Urodziny (MM/DD)"
-
-#: views/lists/fields/create.hbs:20 views/lists/fields/edit.hbs:21
-#: lib/models/fields.js:28
-msgid "Birthday (DD/MM)"
-msgstr "Urodziny (DD/MM)"
-
-#: views/lists/fields/create.hbs:21 views/lists/fields/edit.hbs:22
-msgid "Grouped"
-msgstr "Grouped."
-
-#: views/lists/fields/create.hbs:22 views/lists/fields/edit.hbs:23
-msgid "Drop Downs"
-msgstr "Listy rozwijane"
-
-#: views/lists/fields/create.hbs:23 views/lists/fields/edit.hbs:24
-#: lib/models/fields.js:22
-msgid "Radio Buttons"
-msgstr "Radio Buttons"
-
-#: views/lists/fields/create.hbs:24 views/lists/fields/edit.hbs:25
-#: lib/models/fields.js:23
-msgid "Checkboxes"
-msgstr "Checkboxes"
-
-#: views/lists/fields/create.hbs:25 views/lists/fields/edit.hbs:26
-msgid "Option for a group value"
-msgstr "Opcja dla wartości grupy"
-
-#: views/lists/fields/create.hbs:26 views/lists/fields/edit.hbs:27
-msgid "Group"
-msgstr "Grupa"
-
-#: views/lists/fields/create.hbs:28 views/lists/fields/edit.hbs:29
-msgid "Required for group options"
-msgstr "Wymagane w przypadku opcji grupowych"
-
-#: views/lists/fields/create.hbs:29 views/lists/fields/create.hbs:30
-#: views/lists/fields/edit.hbs:35 views/lists/fields/edit.hbs:36
-#: views/lists/fields/fields.hbs:9
-msgid "Default merge tag value"
-msgstr "Domyślna wartość merge tag"
-
-#: views/lists/fields/create.hbs:32 views/lists/fields/edit.hbs:34
-msgid ""
-"For group elements like checkboxes you can control the appearance of the "
-"merge tag with an optional template. The template uses handlebars syntax and "
-"you can find all values from {{values}} array, for example "
-"{{#each values}} {{this}} {{/each}}. If template is not defined "
-"then multiple values are joined with commas. You can also use this template "
-"to render JSON values (if the JSON is an array then the array is exposed as "
-"values, otherwise you can access the JSON keys directly)."
-msgstr ""
-"W przypadku elementów grupy, takich jak checkboxy, można kontrolować wygląd "
-"merge tagów za pomocą opcjonalnego szablonu. Szablon używa składni "
-"handlebars i możesz znaleźć wszystkie wartości z tablicy {{values}}"
-"code>, na przykład {{#each values}} {{this}} {{/each}} . Jeśli "
-"szablon nie jest zdefiniowany, wiele wartości jest łączonych przecinkami. "
-"Możesz również użyć tego szablonu do renderowania wartości JSON (jeśli JSON "
-"jest tablicą, wtedy tablica jest wyświetlana jako values, w "
-"przeciwnym razie możesz uzyskać bezpośredni dostęp do kluczy JSON)."
-
-#: views/lists/fields/create.hbs:33 views/lists/fields/edit.hbs:37
-msgid "Visible"
-msgstr "Widoczny"
-
-#: views/lists/fields/create.hbs:34
-msgid "Add Field"
-msgstr "Dodaj pole"
-
-#: views/lists/fields/edit.hbs:4
-msgid "Edit Field"
-msgstr "Edytuj pole"
-
-#: views/lists/fields/edit.hbs:5
-msgid "Edit Custom Field"
-msgstr "Edytuj pole niestandardowe"
-
-#: views/lists/fields/edit.hbs:6
-msgid "Back to fields"
-msgstr "Powrót do pól"
-
-#: views/lists/fields/edit.hbs:30 views/lists/fields/fields.hbs:8
-#: views/partials/merge-tag-reference.hbs:3
-msgid "Merge tag"
-msgstr "Merge tag"
-
-#: views/lists/fields/edit.hbs:31
-msgid "Merge Tag"
-msgstr "Merge Tag"
-
-#: views/lists/fields/edit.hbs:32
-msgid "Put this tag in your content:"
-msgstr "Umieść ten tag w swojej treści:"
-
-#: views/lists/fields/edit.hbs:38
-msgid "Delete Field"
-msgstr "Usuń pole"
-
-#: views/lists/fields/fields.hbs:7 views/lists/view.hbs:25
-msgid "Type"
-msgstr "Typ"
-
-#: views/lists/fields/fields.hbs:10 views/lists/fields/fields.hbs:11
-#: views/lists/lists.hbs:9 views/lists/segments/segments.hbs:8
-#: views/lists/segments/view.hbs:12 views/templates/templates.hbs:7
-#: views/triggers/triggers.hbs:14 routes/campaigns.js:287
-#: routes/campaigns.js:576 routes/campaigns.js:626 routes/lists.js:222
-#: routes/triggers.js:297
-msgid "Edit"
-msgstr "Edytuj"
-
-#: views/lists/lists.hbs:6
-msgid "ID"
-msgstr "ID"
-
-#: views/lists/lists.hbs:7
-msgid "Subscribers"
-msgstr "Subskrybenci"
-
-#: views/lists/segments/create.hbs:3 views/lists/segments/edit.hbs:3
-#: views/lists/segments/rule-configure.hbs:3
-#: views/lists/segments/rule-create.hbs:3 views/lists/segments/rule-edit.hbs:3
-#: views/lists/segments/segments.hbs:3 views/lists/segments/segments.hbs:5
-#: views/lists/segments/view.hbs:3 views/lists/view.hbs:6
-#: views/lists/view.hbs:13
-msgid "Segments"
-msgstr "Segmenty"
-
-#: views/lists/segments/create.hbs:4 views/lists/segments/create.hbs:5
-#: views/lists/segments/rule-configure.hbs:4
-#: views/lists/segments/rule-create.hbs:4 views/lists/segments/rule-edit.hbs:4
-#: views/lists/segments/segments.hbs:4
-msgid "Create Segment"
-msgstr "Utwórz segment"
-
-#: views/lists/segments/create.hbs:6 views/lists/segments/create.hbs:7
-#: views/lists/segments/edit.hbs:7 views/lists/segments/edit.hbs:8
-msgid "Segment Name"
-msgstr "Nazwa segmentu"
-
-#: views/lists/segments/create.hbs:8 views/lists/segments/edit.hbs:9
-msgid "Rule match"
-msgstr "Dopasowanie reguł"
-
-#: views/lists/segments/create.hbs:10 views/lists/segments/edit.hbs:11
-msgid "All rules must match"
-msgstr "Wszystkie reguły muszą się zgadzać"
-
-#: views/lists/segments/create.hbs:11 views/lists/segments/edit.hbs:12
-msgid "Any rule can match"
-msgstr "Każda reguła może się zgadzać"
-
-#: views/lists/segments/create.hbs:12
-msgid "Add Segment"
-msgstr "Dodaj segment"
-
-#: views/lists/segments/edit.hbs:4 views/lists/segments/edit.hbs:5
-#: views/lists/segments/view.hbs:6 views/lists/view.hbs:11
-msgid "Edit Segment"
-msgstr "Edytuj segment"
-
-#: views/lists/segments/edit.hbs:6
-msgid "Back to segments"
-msgstr "Powrót do segmentów"
-
-#: views/lists/segments/edit.hbs:13
-msgid "Delete Segment"
-msgstr "Usuń segment"
-
-#: views/lists/segments/rule-configure.hbs:5
-#: views/lists/segments/rule-create.hbs:5 views/lists/segments/rule-edit.hbs:5
-#: views/lists/segments/view.hbs:4
-msgid "Create Rule"
-msgstr "Utwórz regułę"
-
-#: views/lists/segments/rule-configure.hbs:6
-#: views/lists/segments/rule-create.hbs:6 views/lists/segments/rule-edit.hbs:6
-#: views/lists/segments/view.hbs:10
-msgid "Rule"
-msgstr "Reguła"
-
-#: views/lists/segments/rule-configure.hbs:7
-#: views/lists/segments/rule-configure.hbs:8
-#: views/lists/segments/rule-configure.hbs:10
-#: views/lists/segments/rule-configure.hbs:13
-#: views/lists/segments/rule-configure.hbs:25
-#: views/lists/segments/rule-configure.hbs:30
-#: views/lists/segments/rule-edit.hbs:7 views/lists/segments/rule-edit.hbs:8
-#: views/lists/segments/rule-edit.hbs:10 views/lists/segments/rule-edit.hbs:15
-#: views/lists/segments/rule-edit.hbs:29 views/lists/segments/rule-edit.hbs:34
-#: views/lists/segments/view.hbs:11
-msgid "Value"
-msgstr "Wartość"
-
-#: views/lists/segments/rule-configure.hbs:9
-#: views/lists/segments/rule-edit.hbs:9
-msgid ""
-"Use % for wildcard character, e.g. \"%test\" to match all values that end "
-"with \"test\""
-msgstr ""
-"Użyj % dla znaku wieloznacznego, np. \"%test\", aby dopasować wszystkie "
-"wartości, które kończą się na \"test\""
-
-#: views/lists/segments/rule-configure.hbs:11
-#: views/lists/segments/rule-configure.hbs:14
-#: views/lists/segments/rule-configure.hbs:26
-#: views/lists/segments/rule-edit.hbs:11 views/lists/segments/rule-edit.hbs:16
-#: views/lists/segments/rule-edit.hbs:30
-msgid "Use exact match"
-msgstr "Użyj ścisłego dopasowania"
-
-#: views/lists/segments/rule-configure.hbs:12
-#: views/lists/segments/rule-configure.hbs:15
-#: views/lists/segments/rule-configure.hbs:27
-#: views/lists/segments/rule-edit.hbs:12 views/lists/segments/rule-edit.hbs:17
-#: views/lists/segments/rule-edit.hbs:31
-msgid "Use range match"
-msgstr "Użyj dopasowania zakresu"
-
-#: views/lists/segments/rule-configure.hbs:16
-#: views/lists/segments/rule-edit.hbs:20
-msgid "Use relative range match"
-msgstr "Użyj względnego dopasowania zakresu"
-
-#: views/lists/segments/rule-configure.hbs:17
-#: views/lists/segments/rule-configure.hbs:28
-#: views/lists/segments/rule-edit.hbs:13 views/lists/segments/rule-edit.hbs:18
-#: views/lists/segments/rule-edit.hbs:21 views/lists/segments/rule-edit.hbs:32
-msgid "From"
-msgstr "Od"
-
-#: views/lists/segments/rule-configure.hbs:18
-#: views/lists/segments/rule-configure.hbs:22
-#: views/lists/segments/rule-edit.hbs:22 views/lists/segments/rule-edit.hbs:26
-msgid "days"
-msgstr "dni"
-
-#: views/lists/segments/rule-configure.hbs:19
-#: views/lists/segments/rule-configure.hbs:23
-#: views/lists/segments/rule-edit.hbs:23 views/lists/segments/rule-edit.hbs:27
-msgid "before today"
-msgstr "przed dzisiaj"
-
-#: views/lists/segments/rule-configure.hbs:20
-#: views/lists/segments/rule-configure.hbs:24
-#: views/lists/segments/rule-edit.hbs:24 views/lists/segments/rule-edit.hbs:28
-msgid "after today"
-msgstr "po dzisiaj"
-
-#: views/lists/segments/rule-configure.hbs:21
-#: views/lists/segments/rule-configure.hbs:29
-#: views/lists/segments/rule-edit.hbs:14 views/lists/segments/rule-edit.hbs:19
-#: views/lists/segments/rule-edit.hbs:25 views/lists/segments/rule-edit.hbs:33
-msgid "to"
-msgstr "do"
-
-#: views/lists/segments/rule-configure.hbs:31
-#: views/lists/segments/rule-edit.hbs:35 lib/models/segments.js:156
-#: lib/models/segments.js:418
-msgid "Selected"
-msgstr "Wybrano"
-
-#: views/lists/segments/rule-configure.hbs:32
-#: views/lists/segments/rule-edit.hbs:36 lib/models/segments.js:156
-#: lib/models/segments.js:418
-msgid "Not selected"
-msgstr "Nie wybrano"
-
-#: views/lists/segments/rule-configure.hbs:33
-msgid "Add Rule"
-msgstr "Dodaj regułę"
-
-#: views/lists/segments/rule-create.hbs:8
-#: views/lists/subscription/import.hbs:12 views/triggers/create-select.hbs:9
-msgid "Next"
-msgstr "Dalej"
-
-#: views/lists/segments/rule-edit.hbs:37
-msgid "Delete Rule"
-msgstr "Usuń regułę"
-
-#: views/lists/segments/segments.hbs:7
-msgid "Match"
-msgstr "Dopasowanie"
-
-#: views/lists/segments/view.hbs:5 views/lists/view.hbs:12
-msgid "Segment"
-msgstr "Segment"
-
-#: views/lists/segments/view.hbs:7
-msgid "Match rules"
-msgstr "Reguły dopasowania"
-
-#: views/lists/segments/view.hbs:8
-msgid "Matching subscribers"
-msgstr "Dopasowani subskrybenci"
-
-#: views/lists/segments/view.hbs:9
-msgid "show"
-msgstr "pokaż"
-
-#: views/lists/subscription/add.hbs:3 views/lists/subscription/add.hbs:4
-msgid "Add subscriber"
-msgstr "Dodaj subskrybenta"
-
-#: views/lists/subscription/add.hbs:5 views/subscription/manage.hbs:2
-#: views/subscription/subscribe.hbs:3 views/users/account.hbs:7
-msgid "Email Address"
-msgstr "Adres e-mail"
-
-#: views/lists/subscription/add.hbs:8 views/lists/subscription/edit.hbs:9
-#: views/settings.hbs:82 views/settings.hbs:97 views/subscription/manage.hbs:7
-#: views/subscription/subscribe.hbs:7
-msgid "Begins with"
-msgstr "Zaczyna się"
-
-#: views/lists/subscription/add.hbs:9 views/lists/subscription/edit.hbs:10
-msgid ""
-"Insert a GPG public key that will be used to encrypt messages sent this "
-"subscriber"
-msgstr ""
-"Wstaw klucz publiczny GPG, który będzie używany do szyfrowania wiadomości "
-"wysłanych przez tego subskrybenta"
-
-#: views/lists/subscription/add.hbs:11 views/lists/subscription/edit.hbs:12
-#: views/lists/subscription/import-preview.hbs:9
-msgid "Timezone"
-msgstr "Strefa czasowa"
-
-#: views/lists/subscription/add.hbs:13 views/lists/subscription/edit.hbs:13
-msgid "Test user?"
-msgstr "Użytkownik testowy?"
-
-#: views/lists/subscription/add.hbs:14 views/lists/subscription/edit.hbs:14
-msgid ""
-"If checked then this subscription can be used for previewing campaign "
-"messages"
-msgstr ""
-"Jeśli ta opcja jest zaznaczona, można użyć tej subskrypcji do przeglądania "
-"wiadomości kampanii"
-
-#: views/lists/subscription/add.hbs:15
-msgid ""
-"This person will not receive a confirmation email so make sure that you have "
-"permission to email them."
-msgstr ""
-"Ta osoba nie otrzyma e-maila z potwierdzeniem, więc upewnij się, że masz "
-"uprawnienia do e-maila."
-
-#: views/lists/subscription/edit.hbs:3 views/lists/subscription/edit.hbs:4
-msgid "Edit subscriber"
-msgstr "Edytuj subskrybenta"
-
-#: views/lists/subscription/edit.hbs:5
-#: views/lists/subscription/import-failed.hbs:5
-msgid "Back to list"
-msgstr "Powrót do listy"
-
-#: views/lists/subscription/edit.hbs:6
-#: views/lists/subscription/import-preview.hbs:6
-#: views/subscription/unsubscribe.hbs:3 lib/helpers.js:26
-#: lib/models/segments.js:11
-msgid "Email address"
-msgstr "Adres e-mail"
-
-#: views/lists/subscription/edit.hbs:16
-msgid "Delete Subscription"
-msgstr "Usuń subskrypcję"
-
-#: views/lists/subscription/import-failed.hbs:3
-msgid "Import status"
-msgstr "Status importu"
-
-#: views/lists/subscription/import-failed.hbs:4
-msgid "Failed addresses"
-msgstr "Nieudane adresy"
-
-#: views/lists/subscription/import-failed.hbs:6
-msgid "see here"
-msgstr "zobacz tutaj"
-
-#: views/lists/subscription/import-failed.hbs:10
-msgid "Fail reason"
-msgstr "Przyczyna niepowodzenia"
-
-#: views/lists/subscription/import-preview.hbs:3
-#: views/lists/subscription/import-preview.hbs:4
-#: views/lists/subscription/import.hbs:3 views/lists/subscription/import.hbs:4
-msgid "Import subscribers"
-msgstr "Zaimportuj subskrybentów"
-
-#: views/lists/subscription/import-preview.hbs:10 views/users/api.hbs:27
-#: views/users/api.hbs:35 views/users/api.hbs:43 views/users/api.hbs:55
-msgid "Example"
-msgstr "Przykład"
-
-#: views/lists/subscription/import-preview.hbs:11
-msgid "Start import"
-msgstr "Rozpocznij importowanie"
-
-#: views/lists/subscription/import.hbs:5
-msgid "CSV File"
-msgstr "Plik CSV"
-
-#: views/lists/subscription/import.hbs:6
-msgid "CSV delimiter"
-msgstr "Separator CSV"
-
-#: views/lists/subscription/import.hbs:7
-msgid "Categorize the imported subscribers as"
-msgstr "Skategoryzuj importowanych subskrybentów jako"
-
-#: views/lists/subscription/import.hbs:8 routes/lists.js:171
-msgid "Subscribed"
-msgstr "Subskrybuje"
-
-#: views/lists/subscription/import.hbs:9
-msgid "Regular subscriber addresses"
-msgstr "Regularne adresy subskrybentów"
-
-#: views/lists/subscription/import.hbs:11
-msgid "Suppressed emails that will be unsubscribed from your list"
-msgstr "Pomijane e-maile, które zostaną wypisane z listy"
-
-#: views/lists/view.hbs:3
-msgid "Subscription Form"
-msgstr "Formularz subskrypcji"
-
-#: views/lists/view.hbs:4
-msgid "List Actions"
-msgstr "Lista akcji"
-
-#: views/lists/view.hbs:8 views/triggers/create-select.hbs:3
-#: views/triggers/create-select.hbs:4 views/triggers/create.hbs:3
-#: views/triggers/create.hbs:4 views/triggers/create.hbs:27
-#: views/triggers/triggers.hbs:3
-msgid "Create Trigger"
-msgstr "Utwórz wyzwalacz"
-
-#: views/lists/view.hbs:9
-msgid "Add Subscriber"
-msgstr "Dodaj subskrybenta"
-
-#: views/lists/view.hbs:10
-msgid "Import Subscribers"
-msgstr "Importuj subskrybentów"
-
-#: views/lists/view.hbs:14
-msgid "Create New Segment"
-msgstr "Utwórz nowy segment"
-
-#: views/lists/view.hbs:15
-msgid "Filter"
-msgstr "Filtr"
-
-#: views/lists/view.hbs:16
-msgid "Subscriptions"
-msgstr "Subskrypcje"
-
-#: views/lists/view.hbs:17
-msgid "Imports"
-msgstr "Import"
-
-#: views/lists/view.hbs:24 routes/campaigns.js:266 routes/lists.js:265
-msgid "Finished"
-msgstr "Skończone"
-
-#: views/lists/view.hbs:26
-msgid "Added"
-msgstr "Dodany"
-
-#: views/lists/view.hbs:27
-msgid "Updated"
-msgstr "Zaktualizowano"
-
-#: views/lists/view.hbs:28
-msgid "Failed"
-msgstr "Nie powiodło się"
-
-#: views/lists/view.hbs:30
-msgid ""
-"Are you sure? This action should only be called to resolve stalled imports"
-msgstr ""
-"Jesteś pewny? Ta czynność powinna byś wywołana tylko w celu rozwiązania "
-"impasu importu."
-
-#: views/lists/view.hbs:31
-msgid "Restart"
-msgstr "Uruchom ponownie"
-
-#: views/partials/codeeditor.hbs:1 views/partials/summernote.hbs:1
-msgid "Template content (HTML)"
-msgstr "Zawartość szablonu (HTML)"
-
-#: views/partials/html-preview.hbs:1
-msgid "Toggle HTML preview"
-msgstr "Przełącz podgląd HTML"
-
-#: views/partials/merge-tag-reference.hbs:1
-msgid "Merge tag reference"
-msgstr "Odniesienie merge tag"
-
-#: views/partials/merge-tag-reference.hbs:2
-msgid ""
-"Merge tags are tags that are replaced before sending out the message. The "
-"format of the merge tag is the following: [TAG_NAME] or "
-"[TAG_NAME/fallback] where fallback is an optional "
-"text value used when TAG_NAME is empty."
-msgstr ""
-"Merge tagi są tagami, które są zastępowane przed wysłaniem wiadomości. "
-"Format merge tagu jest następujący: [TAG_NAME] lub "
-"[TAG_NAME/fallback] gdzie fallback jest opcjonalną "
-"wartością tekstową używaną, gdy TAG_NAME jest pusty."
-
-#: views/partials/plaintext.hbs:1
-msgid "Template content (plaintext)"
-msgstr "Treść szablonu (zwykły tekst)"
-
-#: views/settings.hbs:5
-msgid "Service Address (URL)"
-msgstr "Adres usługi (URL)"
-
-#: views/settings.hbs:6
-msgid "Enter the URL this service can be reached from"
-msgstr "Wprowadź adres URL, z którego można uzyskać tę usługę"
-
-#: views/settings.hbs:7
-msgid "Admin Email"
-msgstr "E-mail Administratora"
-
-#: views/settings.hbs:8
-msgid ""
-"Enter the email address that will be used as \"from\" for system messages"
-msgstr ""
-"Wprowadź adres e-mail, który będzie używany jako \"from \" dla wiadomości "
-"systemowych"
-
-#: views/settings.hbs:9
-msgid "Disable WYSIWYG editor"
-msgstr "Wyłącz edytor WYSIWYG"
-
-#: views/settings.hbs:10
-msgid "If checked then message editor displays HTML code without the preview"
-msgstr "Jeśli zaznaczone, edytor wiadomości wyświetla kod HTML bez podglądu"
-
-#: views/settings.hbs:11
-msgid "Disable subscription confirmation messages"
-msgstr "Wyłącz wiadomości potwierdzające subskrypcję"
-
-#: views/settings.hbs:12
-msgid ""
-"If checked then do not send a confirmation message that states the "
-"subscriber is now subscribed or unsubscribed. This does not disable double "
-"opt-in messages."
-msgstr ""
-"Jeśli jest zaznaczone, nie wysyłaj wiadomości potwierdzającej, że "
-"subskrybent jest teraz subskrybowany lub nie subskrybowany. Nie wyłącza to "
-"podwójnych wiadomości opt-in."
-
-#: views/settings.hbs:13
-msgid "Tracking ID"
-msgstr "Identyfikator śledzenia"
-
-#: views/settings.hbs:14
-msgid "Enter Google Analytics tracking code"
-msgstr "Wpisz kod śledzenia Google Analytics"
-
-#: views/settings.hbs:15
-msgid "Frontpage shout out"
-msgstr ""
-
-#: views/settings.hbs:16
-msgid "HTML code shown in the front page header section"
-msgstr "Kod HTML wyświetlany w sekcji nagłówka na pierwszej stronie"
-
-#: views/settings.hbs:17
-msgid "Campaign defaults"
-msgstr "Domyślne ustawienia kampanii"
-
-#: views/settings.hbs:18
-msgid "Sender name"
-msgstr "Nazwa nadawcy"
-
-#: views/settings.hbs:19
-msgid "Sender name, eg. My Awesome Company Ltd."
-msgstr "Nazwa nadawcy, np. My Awesome Company Ltd."
-
-#: views/settings.hbs:20
-msgid "Default address"
-msgstr "Domyślny adres"
-
-#: views/settings.hbs:21
-msgid ""
-"Contact address to provide, eg. 1234 Main Street, Anywhere, MA 01234, USA"
-msgstr ""
-"Adres kontaktowy do dostarczenia, np. 1234 Main Street, Anywhere, MA 01234, "
-"USA"
-
-#: views/settings.hbs:22
-msgid "Default \"from name\""
-msgstr "Domyślna nazwa \"from\""
-
-#: views/settings.hbs:24
-msgid "Default \"from\" email"
-msgstr "Domyślny e-mail \"from\""
-
-#: views/settings.hbs:26
-msgid "Default \"subject line\""
-msgstr "Domyślny temat \"from\""
-
-#: views/settings.hbs:28
-msgid "Default homepage (URL)"
-msgstr "Domyślna strona główna (URL)"
-
-#: views/settings.hbs:29
-msgid "URL to redirect the subscribed users to, eg. http://example.com/"
-msgstr "Adres URL do przekierowania subskrybentów do, np. http://example.com/"
-
-#: views/settings.hbs:30
-msgid "Mailer Settings"
-msgstr "Ustawienia Mailera"
-
-#: views/settings.hbs:31
-msgid "These settings are required to send out e-mail messages"
-msgstr "Te ustawienia są wymagane do wysyłania wiadomości e-mail"
-
-#: views/settings.hbs:32
-msgid "SMTP"
-msgstr "SMTP"
-
-#: views/settings.hbs:33
-msgid "AWS SES"
-msgstr "AWS SES"
-
-#: views/settings.hbs:34
-msgid "Use SMTP for sending mail"
-msgstr "Użyj SMTP do wysyłania poczty"
-
-#: views/settings.hbs:35
-msgid "Hostname"
-msgstr "Nazwa hosta"
-
-#: views/settings.hbs:36
-msgid "Port"
-msgstr "Port"
-
-#: views/settings.hbs:37
-msgid "Port, eg. 465. Autodetected if left blank"
-msgstr "Port, np. 465. Autodetekcja, jeśli pozostanie pusta"
-
-#: views/settings.hbs:38
-msgid "Encryption"
-msgstr "Szyfrowanie"
-
-#: views/settings.hbs:39
-msgid "Disable SMTP authentication"
-msgstr "Wyłącz uwierzytelnianie SMTP"
-
-#: views/settings.hbs:40 views/users/forgot.hbs:9 views/users/login.hbs:4
-#: views/users/login.hbs:5
-msgid "Username"
-msgstr "Nazwa użytkownika"
-
-#: views/settings.hbs:41
-msgid "Username, eg. myaccount@example.com"
-msgstr "Nazwa użytkownika, np. myaccount@example.com"
-
-#: views/settings.hbs:42 views/settings.hbs:43 views/users/login.hbs:6
-#: views/users/login.hbs:7
-msgid "Password"
-msgstr "Hasło"
-
-#: views/settings.hbs:44
-msgid "Use SES API for sending mail"
-msgstr "Użyj interfejsu API SES do wysyłania poczty"
-
-#: views/settings.hbs:45
-msgid "Access Key"
-msgstr "Access Key"
-
-#: views/settings.hbs:46
-msgid "AWS Access Key Id"
-msgstr "AWS Access Key Id"
-
-#: views/settings.hbs:47
-msgid "Secret Key"
-msgstr "Secret Key"
-
-#: views/settings.hbs:48
-msgid "AWS Secret Access Key"
-msgstr "AWS Secret Access Key"
-
-#: views/settings.hbs:49
-msgid "Region"
-msgstr "Region"
-
-#: views/settings.hbs:50
-msgid "Checking"
-msgstr "Sprawdzanie"
-
-#: views/settings.hbs:51
-msgid "Check Mailer config"
-msgstr "Sprawdź konfigurację Mailera"
-
-#: views/settings.hbs:52
-msgid "Don't have an SMTP account yet? Create a free SendPulse account"
-msgstr "Nie masz jeszcze konta SMTP? Utwórz darmowe konto SendPulse"
-
-#: views/settings.hbs:53
-msgid "here"
-msgstr "tutaj"
-
-#: views/settings.hbs:54
-msgid "Advanced Mailer settings"
-msgstr "Zaawansowane ustawienia Mailera"
-
-#: views/settings.hbs:55
-msgid "Log SMTP transactions"
-msgstr "Loguj transakcje SMTP"
-
-#: views/settings.hbs:56
-msgid "Allow self-signed certificates"
-msgstr "Zezwalaj na certyfikaty z podpisem własnym"
-
-#: views/settings.hbs:57
-msgid "Max connections"
-msgstr "Maks. połączeń"
-
-#: views/settings.hbs:58
-msgid "The count of max connections, eg. 10"
-msgstr "Liczba maksymalnych połączeń, np. 10"
-
-#: views/settings.hbs:59
-msgid ""
-"The count of maximum simultaneous connections to make against the SMTP "
-"server (defaults to 5). This limit is per sending process."
-msgstr ""
-"Liczba maksymalnych równoczesnych połączeń z serwerem SMTP (domyślnie 5). "
-"Ten limit dotyczy procesu wysyłania."
-
-#: views/settings.hbs:60
-msgid "Max messages"
-msgstr "Maks. wiadomości"
-
-#: views/settings.hbs:61
-msgid "The count of max messages, eg. 100"
-msgstr "Liczba maksymalnych wiadomości, np. 100"
-
-#: views/settings.hbs:62
-msgid ""
-"he number of messages to send through a single connection before the "
-"connection is closed and reopened (defaults to 100)"
-msgstr ""
-"Liczba wiadomości do wysłania za pośrednictwem jednego połączenia, zanim "
-"połączenie zostanie zamknięty i ponownie otwarty (domyślnie 100)"
-
-#: views/settings.hbs:63
-msgid "Throttling"
-msgstr "Dławienie (Throttling)"
-
-#: views/settings.hbs:64
-msgid "Messages per hour eg. 1000"
-msgstr "Wiadomości na godzinę, np. 1000"
-
-#: views/settings.hbs:65
-msgid ""
-"Maximum number of messages to send in an hour. Leave empty or zero for no "
-"throttling. If your provider uses a different speed limit (messages/minute "
-"or messages/second) then convert this limit into messages/hour (1m/s => "
-"3600m/h). This limit is per sending process."
-msgstr ""
-"Maksymalna liczba wiadomości do wysłania w ciągu godziny. Pozostaw puste lub "
-"zero dla barku dławienia. Jeśli Twój dostawca wykorzystuje inny limit "
-"prędkości (wiadomości/minutę lub wiadomości/sekundę), zamień ten limit na "
-"wiadomości/godzinę (1m/s => 3600m/h). Ten limit dotyczy procesu wysyłania."
-
-#: views/settings.hbs:66
-msgid "VERP bounce handling"
-msgstr "Obsługa odbijania VERP"
-
-#: views/settings.hbs:67
-msgid ""
-"Mailtrain is able to use VERP based routing to detect bounces. In this case "
-"the message is sent to the recipient using a custom VERP address as the "
-"return path of the message. If the message is not accepted a bounce email is "
-"sent to this special VERP address and thus a bounce is detected."
-msgstr ""
-"Mailtrain może wykorzystywać routing oparty na VERP do wykrywania odbić. W "
-"takim przypadku wiadomość zostanie wysłana do adresata przy użyciu "
-"niestandardowego adresu VERP jako ścieżki powrotnej wiadomości. Jeśli "
-"wiadomość nie zostanie przyjęta, wiadomość odrzucona wiadomość zostanie "
-"wysłana na specjalny adres VERP, a tym samym wykryte zostanie odrzucenie."
-
-#: views/settings.hbs:68
-msgid ""
-"To get VERP working you need to set up a DNS MX record that points to your "
-"Mailtrain hostname. You must also ensure that Mailtrain VERP interface is "
-"available from port 25 of your server (port 25 usually requires root user "
-"privileges). This way if anyone tries to send email to someuser@verp-"
-"hostname then the email should end up to this server."
-msgstr ""
-"Aby uruchomić działanie VERP, musisz skonfigurować rekord MX DNS, który "
-"wskazuje twoją nazwę hosta Mailtrain. Musisz także upewnić się, że interfejs "
-"Mailtrain VERP jest dostępny z portu 25 serwera (port 25 zwykle wymaga "
-"uprawnień użytkownika root). W ten sposób, jeśli ktoś spróbuje wysłać "
-"wiadomość e-mail do someuser@verp-hostname, wówczas wiadomość e-mail powinna "
-"dotrzeć do tego serwera."
-
-#: views/settings.hbs:69
-msgid ""
-"VERP usually only works if you are using your own SMTP server. Regular relay "
-"services (SES, SparkPost, Gmail etc.) tend to remove the VERP address from "
-"the message."
-msgstr ""
-"VERP zwykle działa tylko wtedy, gdy używasz własnego serwera SMTP. Regularne "
-"usługi przekazywania (SES, SparkPost, Gmail itp.) Mają tendencję do usuwania "
-"adresu VERP z wiadomości."
-
-#: views/settings.hbs:70
-msgid "Use VERP to catch bounces"
-msgstr "Użyj VERP do wykrycia odbicia"
-
-#: views/settings.hbs:71
-msgid "Server hostname"
-msgstr "Nazwa hosta serwera"
-
-#: views/settings.hbs:72
-msgid "The VERP server hostname, eg. bounces.example.com"
-msgstr "Nazwa hosta serwera VERP, np. bounces.example.com"
-
-#: views/settings.hbs:73
-msgid ""
-"VERP bounce handling server hostname. This hostname is used in the SMTP "
-"envelope FROM address and the MX DNS records should point to this server"
-msgstr ""
-"Nazwa hosta serwera obsługi odrzutów VERP. Ta nazwa hosta jest używana w "
-"SMTP jako \"od\", a rekordy MX DNS powinny wskazywać na ten serwer"
-
-#: views/settings.hbs:74
-msgid ""
-"VERP bounce handling server is not enabled. Modify your server configuration "
-"file and restart server to enable it"
-msgstr ""
-"Serwer obsługi odrzutów VERP nie jest włączony. Zmodyfikuj plik "
-"konfiguracyjny serwera i zrestartuj serwer, aby go włączyć."
-
-#: views/settings.hbs:75
-msgid "GPG Signing"
-msgstr "Podpis GPG"
-
-#: views/settings.hbs:76
-msgid ""
-"Only messages that are encrypted can be signed. Subsribers who have not set "
-"up a GPG public key in their profile receive normal email messages. Users "
-"with GPG key set receive encrypted messages and if you have signing key also "
-"set, the messages are signed with this key."
-msgstr ""
-"Tylko wiadomości, które są zaszyfrowane, mogą być podpisane. Subskrybenci, "
-"którzy nie ustawili klucza publicznego GPG w swoim profilu, otrzymują zwykłe "
-"wiadomości e-mail. Użytkownicy z zestawem kluczy GPG otrzymują zaszyfrowane "
-"wiadomości i jeśli masz ustawiony również klucz podpisu, wiadomości są "
-"podpisywane tym kluczem."
-
-#: views/settings.hbs:77
-msgid ""
-"Do not use sensitive keys here. The private key and passphrase are not "
-"encrypted in the database."
-msgstr ""
-"Nie używaj tutaj wrażliwych kluczy. Klucz prywatny i hasło nie są szyfrowane "
-"w bazie danych."
-
-#: views/settings.hbs:78
-msgid "Private Key Passphrase"
-msgstr "Hasło klucza prywatnego"
-
-#: views/settings.hbs:79
-msgid "Passphrase for the key if set"
-msgstr "Hasło dla klucza, jeśli jest ustawione"
-
-#: views/settings.hbs:80
-msgid "Only fill this if your private key is encrypted with a passphrase"
-msgstr "Wypełnij to tylko, jeśli Twój klucz prywatny jest zaszyfrowany hasłem"
-
-#: views/settings.hbs:81
-msgid "GPG Private Key"
-msgstr "Klucz prywatny GPG"
-
-#: views/settings.hbs:83
-msgid ""
-"This value is optional. If you do not provide a private key GPG encrypted "
-"messages are sent without signing."
-msgstr ""
-"Ta wartość jest opcjonalna. Jeśli nie podasz klucza prywatnego GPG, "
-"zaszyfrowane wiadomości są wysyłane bez podpisu."
-
-#: views/settings.hbs:84
-msgid "DKIM Signing by ZoneMTA"
-msgstr "Podpisywanie DKIM przez ZoneMTA"
-
-#: views/settings.hbs:85
-msgid ""
-"If you are using ZoneMTA then Mailtrain can provide a DKIM key for signing "
-"all outgoing messages. Other services usually provide their own means to "
-"DKIM sign your messages"
-msgstr ""
-"Jeśli używasz ZoneMTA, Mailtrain może dostarczyć klucz DKIM do podpisania "
-"wszystkich wychodzących wiadomości. Inne usługi zwykle zapewniają własne "
-"środki do podpisywania wiadomości przez DKIM"
-
-#: views/settings.hbs:86
-msgid ""
-"Do not use sensitive keys here. The private key is not encrypted in the "
-"database."
-msgstr ""
-"Nie używaj tutaj wrażliwych kluczy. Klucz prywatny nie jest zaszyfrowany w "
-"bazie danych."
-
-#: views/settings.hbs:87
-msgid "ZoneMTA DKIM API Key"
-msgstr "Klucz API ZoneMTA DKIM"
-
-#: views/settings.hbs:88
-msgid "Some secret value"
-msgstr "Tajna wartość"
-
-#: views/settings.hbs:89
-msgid ""
-"Secret value known to ZoneMTA for requesting DKIM key information. If this "
-"value was generated by the Mailtrain installation script then you can keep "
-"it as it is"
-msgstr ""
-"Tajna wartość znana ZoneMTA dla żądań klucza DKIM. Jeśli ta wartość została "
-"wygenerowana przez skrypt instalacyjny Mailtrain, możesz zachować ją w "
-"niezmienionym stanie"
-
-#: views/settings.hbs:90
-msgid "DKIM domain"
-msgstr "Domena DKIM"
-
-#: views/settings.hbs:91
-msgid "Domain name for the DKIM key"
-msgstr "Nazwa domeny dla klucza DKIM"
-
-#: views/settings.hbs:92
-msgid "Leave blank to use the sender email address domain"
-msgstr "Pozostaw puste, aby użyć domeny adresu e-mail nadawcy"
-
-#: views/settings.hbs:93 views/settings.hbs:94
-msgid "DKIM key selector"
-msgstr "Selektor klucza DKIM"
-
-#: views/settings.hbs:95
-msgid "Signing is disabled without a valid selector value"
-msgstr "Podpisywanie jest wyłączone bez prawidłowej wartości selektora"
-
-#: views/settings.hbs:96
-msgid "DKIM Private Key"
-msgstr "Klucz prywatny DKIM"
-
-#: views/settings.hbs:98
-msgid ""
-"This value is optional. If you do not provide a private key then messages "
-"are not signed."
-msgstr ""
-"Ta wartość jest opcjonalna. Jeśli nie dostarczysz klucza prywatnego, "
-"wiadomości nie będą podpisane."
-
-#: views/subscription/confirm-notice.hbs:1 views/subscription/subscribe.hbs:1
-msgid "Warning!"
-msgstr "Ostrzeżenie!"
-
-#: views/subscription/confirm-notice.hbs:2
-msgid "If JavaScript was not enabled then no confirmation message was sent"
-msgstr "Jeśli JavaScript nie był włączony, nie wysłano żadnego potwierdzenia"
-
-#: views/subscription/confirm-notice.hbs:3
-msgid "Almost finished."
-msgstr "Prawie gotowe."
-
-#: views/subscription/confirm-notice.hbs:4
-msgid ""
-"We need to confirm your email address. To complete the subscription process, "
-"please click the link in the email we just sent you."
-msgstr ""
-"Musimy potwierdzić swój adres e-mail. Aby zakończyć proces subskrypcji, "
-"kliknij link w wiadomości e-mail, którą właśnie wysłaliśmy."
-
-#: views/subscription/confirm-notice.hbs:5
-#: views/subscription/unsubscribe-notice.hbs:3
-#: views/subscription/updated-notice.hbs:3
-msgid "return to our website"
-msgstr "powrót do strony"
-
-#: views/subscription/manage-address.hbs:1
-msgid "Update your Email Address"
-msgstr "Zaktualizuj swój adres e-mail"
-
-#: views/subscription/manage-address.hbs:2
-msgid "Existing Email Address"
-msgstr "Istniejący adres e-mail"
-
-#: views/subscription/manage-address.hbs:3
-msgid "New Email Address"
-msgstr "Nowy adres e-mail"
-
-#: views/subscription/manage-address.hbs:4
-msgid "Your new email address"
-msgstr "Twój nowy adres e-mail"
-
-#: views/subscription/manage-address.hbs:5
-msgid ""
-"You will receive a confirmation request to your new email address that you "
-"need to accept before your email is actually changed"
-msgstr ""
-"Otrzymasz prośbę o potwierdzenie na nowy adres e-mail, który musisz "
-"zaakceptować przed faktyczną zmianą adresu e-mail"
-
-#: views/subscription/manage-address.hbs:6
-msgid "Update Email Address"
-msgstr "Zaktualizuj adres e-mail"
-
-#: views/subscription/manage.hbs:1
-msgid "Update your preferences"
-msgstr "Zaktualizuj swoje preferencje"
-
-#: views/subscription/manage.hbs:3
-msgid "want to change it?"
-msgstr "chcesz to zmienić?"
-
-#: views/subscription/manage.hbs:6 views/subscription/subscribe.hbs:6
-msgid "Download signature verification key"
-msgstr "Pobierz klucz weryfikacji podpisu"
-
-#: views/subscription/manage.hbs:8 views/subscription/subscribe.hbs:8
-msgid ""
-"Insert your GPG public key here to encrypt messages sent to your address"
-msgstr ""
-"Wstaw tutaj swój publiczny klucz GPG, aby zaszyfrować wiadomości wysłane na "
-"Twój adres"
-
-#: views/subscription/manage.hbs:9 views/subscription/subscribe.hbs:9
-msgid "optional"
-msgstr "opcjonalny"
-
-#: views/subscription/manage.hbs:11
-msgid "Update Profile"
-msgstr "Zaktualizuj profil"
-
-#: views/subscription/subscribe.hbs:2
-msgid "JavaScript must be enabled in order for the subscription form to work"
-msgstr ""
-"Aby formularz subskrypcji działał, musi być włączona obsługa JavaScript"
-
-#: views/subscription/subscribe.hbs:11
-msgid "Subscribe to list"
-msgstr "Zapisz się do listy"
-
-#: views/subscription/subscribed.hbs:3
-msgid "Thank you for subscribing!"
-msgstr "Dziękujemy za subskrypcję!"
-
-#: views/subscription/subscribed.hbs:4
-msgid "continue to our website"
-msgstr "przejdź na naszą stronę internetową"
-
-#: views/subscription/unsubscribe-notice.hbs:1
-msgid "Unsubscribe Successful"
-msgstr "Anulowanie subskrypcji przebiegło pomyślnie"
-
-#: views/subscription/unsubscribe-notice.hbs:2
-msgid "You have been removed from:"
-msgstr "Zostałeś usunięty z:"
-
-#: views/subscription/unsubscribe.hbs:2
-msgid "Enter your email address to unsubscribe from:"
-msgstr "Wpisz swój adres e-mail, aby zrezygnować z subskrypcji:"
-
-#: views/subscription/updated-notice.hbs:1
-msgid "Profile Updated"
-msgstr "Profil zaktualizowany"
-
-#: views/subscription/updated-notice.hbs:2
-msgid "Your profile information has been updated."
-msgstr "Twoje informacje profilowe zostały zaktualizowane."
-
-#: views/templates/create.hbs:2 views/templates/edit.hbs:2
-#: views/templates/templates.hbs:2 views/templates/templates.hbs:4
-#: lib/tools.js:115
-msgid "Templates"
-msgstr "Szablony"
-
-#: views/templates/create.hbs:3 views/templates/create.hbs:4
-#: views/templates/create.hbs:12 views/templates/templates.hbs:3
-msgid "Create Template"
-msgstr "Utwórz szablon"
-
-#: views/templates/create.hbs:5 views/templates/edit.hbs:6
-msgid "Template name"
-msgstr "Nazwa szablonu"
-
-#: views/templates/create.hbs:6 views/templates/edit.hbs:7
-msgid "Name for this template, eg. Newsletter"
-msgstr "Nazwa tego szablonu, np. Newsletter"
-
-#: views/templates/create.hbs:7
-msgid "HTML Editor"
-msgstr "Edytor HTML"
-
-#: views/templates/create.hbs:10 views/templates/edit.hbs:9
-msgid "Optional comments about this template"
-msgstr "Opcjonalne komentarze na temat tego szablonu"
-
-#: views/templates/edit.hbs:3 views/templates/edit.hbs:4
-msgid "Edit Template"
-msgstr "Edytuj szablon"
-
-#: views/templates/edit.hbs:5
-msgid "Back to templates"
-msgstr "Powrót do szablonów"
-
-#: views/templates/edit.hbs:11
-msgid "Delete Template"
-msgstr "Usuń Szablon"
-
-#: views/triggers/create-select.hbs:2 views/triggers/create.hbs:2
-#: views/triggers/edit.hbs:2 views/triggers/triggered.hbs:2
-#: views/triggers/triggers.hbs:2 views/triggers/triggers.hbs:4
-msgid "Automation Triggers"
-msgstr "Automatyczne wyzwalacze"
-
-#: views/triggers/create-select.hbs:5
-msgid "Select a list for the trigger"
-msgstr "Wybierz listę dla wyzwalacza"
-
-#: views/triggers/create.hbs:5 views/triggers/edit.hbs:6
-msgid "Trigger name"
-msgstr "Nazwa wyzwalacza"
-
-#: views/triggers/create.hbs:6 views/triggers/edit.hbs:7
-msgid "Name for this trigger, eg. Inactive subscribers"
-msgstr "Nazwa tego wyzwalacza, np. Nieaktywni subskrybenci"
-
-#: views/triggers/create.hbs:8 views/triggers/edit.hbs:9
-msgid "Optional comments about this trigger"
-msgstr "Opcjonalne komentarze na temat tego wyzwalacza"
-
-#: views/triggers/create.hbs:12 views/triggers/edit.hbs:14
-msgid "Trigger rule"
-msgstr "Reguła wyzwalacza"
-
-#: views/triggers/create.hbs:13 views/triggers/edit.hbs:15
-msgid "Trigger fires"
-msgstr "Aktywacja wyzwalacza"
-
-#: views/triggers/create.hbs:14 views/triggers/edit.hbs:16
-msgid "days after:"
-msgstr "dni po:"
-
-#: views/triggers/create.hbs:15 views/triggers/edit.hbs:17
-msgid "Subscription"
-msgstr "Subskrypcja"
-
-#: views/triggers/create.hbs:16 views/triggers/create.hbs:21
-#: views/triggers/edit.hbs:18 views/triggers/edit.hbs:23
-msgid "Event"
-msgstr "Zdarzenie"
-
-#: views/triggers/create.hbs:18 views/triggers/create.hbs:19
-#: views/triggers/create.hbs:25 views/triggers/edit.hbs:20
-#: views/triggers/edit.hbs:21 views/triggers/edit.hbs:27
-msgid "Campaign"
-msgstr "Kampania"
-
-#: views/triggers/create.hbs:23 views/triggers/edit.hbs:25
-msgid "Trigger action"
-msgstr "Czynność wyzwalacza"
-
-#: views/triggers/create.hbs:24 views/triggers/edit.hbs:26
-msgid "Send campaign"
-msgstr "Wyślij kampanię"
-
-#: views/triggers/edit.hbs:3 views/triggers/edit.hbs:4
-msgid "Edit Trigger"
-msgstr "Edycja wyzwalacza"
-
-#: views/triggers/edit.hbs:5
-msgid "Back to triggers"
-msgstr "Powrót do wyzwalaczy"
-
-#: views/triggers/edit.hbs:11
-msgid "Trigger is enabled"
-msgstr "Wyzwalacz jest włączony"
-
-#: views/triggers/edit.hbs:29
-msgid "Delete Trigger"
-msgstr "Usuń wyzwalacz"
-
-#: views/triggers/triggered.hbs:3
-msgid "Triggered"
-msgstr "Wywołany"
-
-#: views/triggers/triggered.hbs:4
-msgid "Triggered subscribers"
-msgstr "Wywołani subskrybenci"
-
-#: views/triggers/triggered.hbs:5
-msgid "Subscribers who caused this trigger to fire"
-msgstr "Subskrybenci, którzy spowodowali uruchomienie tego wyzwalacza"
-
-#: views/triggers/triggered.hbs:9
-msgid "Triggered time"
-msgstr "Czas wywołanych"
-
-#: views/triggers/triggers.hbs:9
-msgid "Trigger"
-msgstr "Wyzwalacz"
-
-#: views/triggers/triggers.hbs:10
-msgid "Target Campaign"
-msgstr "Cel kampanii"
-
-#: views/triggers/triggers.hbs:11
-msgid "Triggered count"
-msgstr "Liczba wyzwoleń"
-
-#: views/triggers/triggers.hbs:12
-msgid "Enabled"
-msgstr "Włączone"
-
-#: views/triggers/triggers.hbs:13
-msgid "Disabled"
-msgstr "Wyłączone"
-
-#: views/users/account.hbs:4
-msgid "This account is managed through LDAP."
-msgstr "To konto jest zarządzane przez LDAP."
-
-#: views/users/account.hbs:5
-msgid "Associated Email Address"
-msgstr "Powiązany adres e-mail"
-
-#: views/users/account.hbs:8
-msgid "Your e-mail address"
-msgstr "Twój adres e-mail"
-
-#: views/users/account.hbs:9
-msgid ""
-"This address is used for account recovery in case you lose your password"
-msgstr "Ten adres służy do odzyskiwania konta na wypadek utraty hasła"
-
-#: views/users/account.hbs:10
-msgid "Password change"
-msgstr "Zmiana hasła"
-
-#: views/users/account.hbs:11
-msgid ""
-"You only need to fill out this form if you want to change your current "
-"password"
-msgstr "Wypełnij ten formularz, jeśli chcesz zmienić swoje obecne hasło"
-
-#: views/users/account.hbs:12 views/users/account.hbs:13
-msgid "Current Password"
-msgstr "Aktualne hasło"
-
-#: views/users/account.hbs:14 views/users/account.hbs:15
-#: views/users/reset.hbs:6 views/users/reset.hbs:7
-msgid "New Password"
-msgstr "Nowe hasło"
-
-#: views/users/account.hbs:16
-msgid "Confirm Password"
-msgstr "Powtórz hasło"
-
-#: views/users/account.hbs:17 views/users/reset.hbs:8
-msgid "Confirm New Password"
-msgstr "Potwierdź nowe hasło"
-
-#: views/users/api.hbs:4
-msgid "Are you sure? Resetting would invalidate the currently existing token."
-msgstr "Jesteś pewny? Zresetowanie unieważni istniejący token."
-
-#: views/users/api.hbs:5
-msgid "Are you sure?"
-msgstr "Jesteś pewny?"
-
-#: views/users/api.hbs:6
-msgid "Reset Access Token"
-msgstr "Zresetuj Access Token"
-
-#: views/users/api.hbs:7
-msgid "Generate Access Token"
-msgstr "Wygeneruj Access Token"
-
-#: views/users/api.hbs:8
-msgid "Personal access token:"
-msgstr "Osobisty Access Token:"
-
-#: views/users/api.hbs:9
-msgid "Access token not yet generated"
-msgstr "Access token nie został jeszcze wygenerowany"
-
-#: views/users/api.hbs:10
-msgid "Notes about the API"
-msgstr "Uwagi na temat interfejsu API"
-
-#: views/users/api.hbs:11
-msgid ""
-"API response is a JSON structure with error and data"
-"code> properties. If the response error has a value set then "
-"the request failed."
-msgstr ""
-"Odpowiedź API to struktura JSON z właściwościami error code> i "
-"data code>. Jeśli odpowiedź error code> ma ustawioną "
-"wartość, to żądanie nie powiodło się."
-
-#: views/users/api.hbs:12
-msgid ""
-"You need to define proper Content-Type when making a request. "
-"You can either use application/x-www-form-urlencoded for normal "
-"form data or application/json for a JSON payload. Using "
-"multipart/form-data is not supported."
-msgstr ""
-"Musisz zdefiniować właściwy Content-Type podczas wysyłania "
-"zapytania. Możesz użyć application/x-www-form-urlencoded dla "
-"normalnych danych formularza lub application/json dla JSON "
-"payload. Używanie multipart/form-data nie jest obsługiwane."
-
-#: views/users/api.hbs:13
-msgid "Add subscription"
-msgstr "Dodaj subskrypcję"
-
-#: views/users/api.hbs:14
-msgid ""
-"This API call either inserts a new subscription or updates existing. Fields "
-"not included are left as is, so if you update only LAST_NAME value, then "
-"FIRST_NAME is kept untouched for an existing subscription."
-msgstr ""
-"To wywołanie API wprowadza nową subskrypcję lub aktualizacje istniejące. "
-"Pola nieuwzględnione pozostają bez zmian, więc jeśli zaktualizujesz tylko "
-"wartość LAST_NAME, to FIRST_NAME pozostanie nietknięte dla istniejącej "
-"subskrypcji."
-
-#: views/users/api.hbs:15 views/users/api.hbs:17 views/users/api.hbs:30
-#: views/users/api.hbs:32 views/users/api.hbs:38 views/users/api.hbs:40
-#: views/users/api.hbs:46 views/users/api.hbs:48
-msgid "arguments"
-msgstr "argumenty"
-
-#: views/users/api.hbs:16 views/users/api.hbs:31 views/users/api.hbs:39
-#: views/users/api.hbs:47
-msgid "your personal access token"
-msgstr "twój osobisty token dostępu"
-
-#: views/users/api.hbs:18 views/users/api.hbs:33 views/users/api.hbs:41
-msgid "subscriber's email address"
-msgstr "subscriber's email addressadres e-mail subskrybenta"
-
-#: views/users/api.hbs:19 views/users/api.hbs:34 views/users/api.hbs:42
-#: views/users/api.hbs:50
-msgid "required"
-msgstr "wymagany"
-
-#: views/users/api.hbs:20
-msgid "subscriber's first name"
-msgstr "imię subskrybenta"
-
-#: views/users/api.hbs:21
-msgid "subscriber's last name"
-msgstr "nazwisko subskrybenta"
-
-#: views/users/api.hbs:22
-msgid ""
-"subscriber's timezone (eg. \"Europe/Tallinn\", \"PST\" or \"UTC\"). If not "
-"set defaults to \"UTC\""
-msgstr ""
-"strefa czasowa subskrybenta (np. \"Europa/Tallinn\", \"PST\" lub \"UTC\"). "
-"Jeśli nie jest ustawiony domyślnie „UTC”"
-
-#: views/users/api.hbs:23
-msgid ""
-"custom field value. Use yes/no for option group values (checkboxes, radios, "
-"drop downs)"
-msgstr ""
-"niestandardowa wartość pola. Użyj wartości tak/nie dla wartości grup opcji "
-"(checkbox, radio, lista rozwijana)"
-
-#: views/users/api.hbs:24
-msgid "Additional POST arguments"
-msgstr "Dodatkowe argumenty POST"
-
-#: views/users/api.hbs:25
-msgid ""
-"set to \"yes\" if you want to make sure the email is marked as subscribed "
-"even if it was previously marked as unsubscribed. If the email was already "
-"unsubscribed/blocked then subscription status is not changed"
-msgstr ""
-"ustawić na \"tak \", jeśli chcesz się upewnić, że wiadomość e-mail została "
-"oznaczona jako zasubskrybowana, nawet jeśli została wcześniej oznaczona jako "
-"niesubskrybowana. Jeśli e-mail został już wypisany/zablokowane, status "
-"subskrypcji nie zostanie zmieniony"
-
-#: views/users/api.hbs:26
-msgid ""
-"set to \"yes\" if you want to send confirmation email to the subscriber "
-"before actually marking as subscribed"
-msgstr ""
-"ustaw na \"tak\", jeśli chcesz wysłać wiadomość e-mail z potwierdzeniem do "
-"subskrybenta, zanim faktycznie zostaniesz oznaczony jako zasubskrybowany"
-
-#: views/users/api.hbs:28
-msgid "Remove subscription"
-msgstr "Usuń subskrypcję"
-
-#: views/users/api.hbs:29
-msgid "This API call marks a subscription as unsubscribed"
-msgstr "To wywołanie API oznacza subskrypcję jako niesubskrybowaną"
-
-#: views/users/api.hbs:36
-msgid "Delete subscription"
-msgstr "Usuń subskrypcję"
-
-#: views/users/api.hbs:37
-msgid "This API call deletes a subscription"
-msgstr "To wywołanie API usuwa subskrypcję"
-
-#: views/users/api.hbs:44
-msgid "Add new custom field"
-msgstr "Dodaj nowe niestandardowe pole"
-
-#: views/users/api.hbs:45
-msgid "This API call creates a new custom field for a list."
-msgstr "To wywołanie API tworzy nowe niestandardowe pole dla listy."
-
-#: views/users/api.hbs:49
-msgid "field name"
-msgstr "nazwa pola"
-
-#: views/users/api.hbs:51
-msgid "one of the following types:"
-msgstr "jeden z następujących typów:"
-
-#: views/users/api.hbs:52
-msgid ""
-"If the type is 'option' then you also need to specify the parent element ID"
-msgstr "Jeśli typ to \"option\", musisz również podać ID elementu nadrzędnego"
-
-#: views/users/api.hbs:53
-msgid ""
-"Template for the group element. If not set, then values of the elements are "
-"joined with commas"
-msgstr ""
-"Szablon dla elementu grupy. Jeśli nie jest ustawione, wartości elementów są "
-"połączone przecinkami"
-
-#: views/users/api.hbs:54
-msgid ""
-"if not visible then the subscriber can not view or modify this value at the "
-"profile page"
-msgstr ""
-"jeśli niewidoczny, subskrybent nie może wyświetlić ani zmodyfikować tej "
-"wartości na stronie profilu"
-
-#: views/users/forgot.hbs:3 views/users/reset.hbs:3
-msgid "Password Reset"
-msgstr "Resetowanie hasła"
-
-#: views/users/forgot.hbs:4
-msgid "Reset your password?"
-msgstr "Nie pamiętasz hasła?"
-
-#: views/users/forgot.hbs:5
-msgid "Accounts are managed through LDAP."
-msgstr "Konta są zarządzane przez LDAP."
-
-#: views/users/forgot.hbs:6 views/users/reset.hbs:10
-msgid "Reset Password"
-msgstr "Resetuj hasło"
-
-#: views/users/forgot.hbs:7
-msgid ""
-"Please provide the username or email address that you used when you signed "
-"up for your Mailtrain account."
-msgstr ""
-"Podaj nazwę użytkownika lub adres e-mail użyty podczas rejestracji konta "
-"Mailtrain."
-
-#: views/users/forgot.hbs:8
-msgid "We will send you an email that will allow you to reset your password."
-msgstr "Wyślemy Ci wiadomość e-mail, która pozwoli Ci zresetować hasło."
-
-#: views/users/forgot.hbs:10
-msgid "Username or email address"
-msgstr "Nazwa użytkownika lub adres e-mail"
-
-#: views/users/forgot.hbs:11
-msgid "Send verification email"
-msgstr "Wyślij email weryfikacyjny"
-
-#: views/users/login.hbs:8
-msgid "Remember me"
-msgstr "Zapamiętaj mnie"
-
-#: views/users/login.hbs:11 views/users/login.hbs:12
-msgid "Forgot password?"
-msgstr "Zapomniałeś hasła?"
-
-#: views/users/reset.hbs:4
-msgid "Choose your new password"
-msgstr "Wybierz nowe hasło"
-
-#: views/users/reset.hbs:5
-msgid "Please enter a new password."
-msgstr "Wprowadź nowe hasło."
-
-#: lib/feed.js:31
-msgid "Bad status code %s"
-msgstr "Nieprawidłowy kod statusu %s"
-
-#: lib/helpers.js:17
-msgid "URL that points to the unsubscribe page"
-msgstr "Adres URL wskazujący stronę rezygnacji z subskrypcji"
-
-#: lib/helpers.js:20
-msgid "URL that points to the preferences page of the subscriber"
-msgstr "Adres URL wskazujący stronę preferencji subskrybenta"
-
-#: lib/helpers.js:23
-msgid "URL to preview the message in a browser"
-msgstr "URL, aby wyświetlić podgląd wiadomości w przeglądarce"
-
-#: lib/helpers.js:29 lib/models/segments.js:31
-msgid "First name"
-msgstr "Imię"
-
-#: lib/helpers.js:32 lib/models/segments.js:35
-msgid "Last name"
-msgstr "Nazwisko"
-
-#: lib/helpers.js:35
-msgid "Full name (first and last name combined)"
-msgstr "Imię i nazwisko"
-
-#: lib/helpers.js:38
-msgid "Unique ID that identifies the recipient"
-msgstr "Unikalny identyfikator identyfikujący odbiorcę"
-
-#: lib/helpers.js:41
-msgid "Unique ID that identifies the list used for this campaign"
-msgstr "Unikalny identyfikator identyfikujący listę użytą w tej kampanii"
-
-#: lib/helpers.js:44
-msgid "Unique ID that identifies current campaign"
-msgstr "Unikalny identyfikator identyfikujący bieżącą kampanię"
-
-#: lib/mailer.js:215
-msgid "Invalid mail transport"
-msgstr "Nieprawidłowy transport poczty"
-
-#: lib/models/campaigns.js:271 lib/models/campaigns.js:298
-#: lib/models/campaigns.js:371 lib/models/campaigns.js:494
-#: lib/models/campaigns.js:752 lib/models/campaigns.js:881
-msgid "Missing Campaign ID"
-msgstr "Brakujący identyfikator kampanii"
-
-#: lib/models/campaigns.js:407
-msgid "Emtpy or too large attahcment"
-msgstr "Pusty lub zbyt duży załącznik"
-
-#: lib/models/campaigns.js:573 lib/models/campaigns.js:761
-msgid "Campaign Name must be set"
-msgstr "Nazwa kampanii musi być ustawiona"
-
-#: lib/models/campaigns.js:577
-msgid "RSS URL must be set and needs to be a valid URL"
-msgstr ""
-"Adres URL kanału RSS musi być ustawiony i musi być prawidłowym adresem URL"
-
-#: lib/models/campaigns.js:730
-msgid "Selected template not found"
-msgstr "Nie znaleziono wybranego szablonu"
-
-#: lib/models/campaigns.js:1082
-msgid "Invalid or missing message ID"
-msgstr "Nieprawidłowy lub brakujący ID wiadomości"
-
-#: lib/models/fields.js:24
-msgid "Drop Down"
-msgstr "Lista rozwijana"
-
-#: lib/models/fields.js:25
-msgid "Date (MM/DD/YYY)"
-msgstr "Data (MM/DD/YYYY)"
-
-#: lib/models/fields.js:29
-msgid "JSON value for custom rendering"
-msgstr "Wartość JSON dla renderowania niestandardowego"
-
-#: lib/models/fields.js:30
-msgid "Option"
-msgstr "Opcja"
-
-#: lib/models/fields.js:53 lib/models/fields.js:98 lib/models/fields.js:123
-#: lib/models/lists.js:81 lib/models/lists.js:175 lib/models/lists.js:212
-#: lib/models/segments.js:43 lib/models/segments.js:176
-#: lib/models/subscriptions.js:88 lib/models/subscriptions.js:640
-#: lib/models/subscriptions.js:703 lib/models/subscriptions.js:889
-#: lib/models/subscriptions.js:992 lib/models/subscriptions.js:1046
-#: lib/models/subscriptions.js:1109 lib/models/subscriptions.js:1152
-msgid "Missing List ID"
-msgstr "Brakujący ID listy"
-
-#: lib/models/fields.js:129
-msgid "Option field requires a group to be selected"
-msgstr "Pole opcji wymaga wyboru grupy"
-
-#: lib/models/fields.js:149 lib/models/fields.js:199
-msgid "Missing Field ID"
-msgstr "Brakujący ID pola"
-
-#: lib/models/fields.js:153 lib/models/segments.js:185
-#: lib/models/segments.js:225
-msgid "Field Name must be set"
-msgstr "Nazwa pola musi być ustawiona"
-
-#: lib/models/fields.js:216
-msgid "Custom field not found"
-msgstr "Nie znaleziono pola niestandardowego"
-
-#: lib/models/fields.js:289
-msgid "Unknown column type %s"
-msgstr "Nieznany typ kolumny %s"
-
-#: lib/models/fields.js:293
-msgid "Missing column name"
-msgstr "Brakująca nazwa kolumny"
-
-#: lib/models/fields.js:297
-msgid "Missing list ID"
-msgstr "Brakujący ID listy"
-
-#: lib/models/fields.js:305
-msgid "Provided List ID not found"
-msgstr "Nie znaleziono ID listy dostarczonych"
-
-#: lib/models/links.js:328 routes/campaigns.js:541 routes/campaigns.js:590
-#: services/sender.js:304
-msgid "Campaign not found"
-msgstr "Nie znaleziono kampanii"
-
-#: lib/models/links.js:336 routes/lists.js:146 services/sender.js:311
-msgid "List not found"
-msgstr "Nie znaleziono listy"
-
-#: lib/models/links.js:344
-msgid "Subscription not found"
-msgstr "Nie znaleziono subskrypcji"
-
-#: lib/models/lists.js:117 lib/models/lists.js:179
-msgid "List Name must be set"
-msgstr "Nazwa listy musi być ustawiona"
-
-#: lib/models/lists.js:241
-msgid "Missing List CID"
-msgstr "Brakujący CID listy"
-
-#: lib/models/segments.js:15
-msgid "Signup country"
-msgstr "Kraj rejestracji"
-
-#: lib/models/segments.js:19 lib/models/triggers.js:11
-msgid "Sign up date"
-msgstr "Data rejestracji"
-
-#: lib/models/segments.js:23 lib/models/triggers.js:15
-msgid "Latest open"
-msgstr "Ostatnie otwarcie"
-
-#: lib/models/segments.js:27 lib/models/triggers.js:19
-msgid "Latest click"
-msgstr "Ostatnie kliknięcie"
-
-#: lib/models/segments.js:69 lib/models/segments.js:216
-#: lib/models/segments.js:256 lib/models/segments.js:278
-msgid "Missing Segment ID"
-msgstr "Brakujący ID segmentu"
-
-#: lib/models/segments.js:85 lib/models/segments.js:549
-#: lib/models/segments.js:658
-msgid "Segment not found"
-msgstr "Nie znaleziono segmentu"
-
-#: lib/models/segments.js:146 lib/models/segments.js:147
-#: lib/models/segments.js:408 lib/models/segments.js:409
-msgid "%s days after today"
-msgstr "%s dni po dzisiejszym dniu"
-
-#: lib/models/segments.js:146 lib/models/segments.js:147
-#: lib/models/segments.js:408 lib/models/segments.js:409
-msgid "%s days before today"
-msgstr "%s dni przed dzisiejszym dniem"
-
-#: lib/models/segments.js:148 lib/models/segments.js:410
-msgid "today"
-msgstr "dziś"
-
-#: lib/models/segments.js:189 lib/models/segments.js:229
-msgid "Invalid segment rule type"
-msgstr "Nieprawidłowy typ reguły segmentu"
-
-#: lib/models/segments.js:289 lib/models/segments.js:454 routes/segments.js:266
-#: routes/segments.js:300 routes/segments.js:370 routes/segments.js:381
-msgid "Selected segment not found"
-msgstr "Nie znaleziono wybranego segmentu"
-
-#: lib/models/segments.js:294 lib/models/segments.js:459 routes/segments.js:272
-#: routes/segments.js:306 routes/segments.js:387
-msgid "Invalid rule type"
-msgstr "Nieprawidłowy typ reguły"
-
-#: lib/models/segments.js:358 lib/models/segments.js:434
-#: lib/models/segments.js:524
-msgid "Missing Rule ID"
-msgstr "Brakujący ID reguły"
-
-#: lib/models/segments.js:374
-msgid "Specified rule not found"
-msgstr "Nie znaleziono określonej reguły"
-
-#: lib/models/segments.js:385
-msgid "Specified segment not found"
-msgstr "Nie znaleziono określonego segmentu"
-
-#: lib/models/segments.js:445
-msgid "Selected rule not found"
-msgstr "Nie znaleziono wybranej reguły"
-
-#: lib/models/subscriptions.js:233
-msgid "%s: Please Confirm Subscription"
-msgstr "%s: Potwierdź subskrypcję"
-
-#: lib/models/subscriptions.js:324
-msgid "Could not save subscription"
-msgstr "Nie można zapisać subskrypcji"
-
-#: lib/models/subscriptions.js:507 lib/models/subscriptions.js:537
-msgid "Missing Subscription ID"
-msgstr "Brakujący ID subskrypcji"
-
-#: lib/models/subscriptions.js:565
-msgid "Missing Subscription email address"
-msgstr "Brak adresu e-mail subskrypcji"
-
-#: lib/models/subscriptions.js:644 lib/models/subscriptions.js:893
-#: lib/models/subscriptions.js:1156
-msgid "Missing subscription ID"
-msgstr "Brakujący ID subskrypcji"
-
-#: lib/models/subscriptions.js:707
-msgid "Missing email address"
-msgstr "Brakujący adres e-mail"
-
-#: lib/models/subscriptions.js:996 lib/models/subscriptions.js:1050
-#: lib/models/subscriptions.js:1086
-msgid "Missing Import ID"
-msgstr "Brakujący ID importu"
-
-#: lib/models/subscriptions.js:1178
-msgid "Unknown subscription ID"
-msgstr "Nieznany ID subskrypcji"
-
-#: lib/models/subscriptions.js:1183
-msgid "Nothing seems to be changed"
-msgstr "Wydaje się, że nic nie zostało zmienione"
-
-#: lib/models/subscriptions.js:1197
-msgid "This address is already registered by someone else"
-msgstr "Ten adres jest już zarejestrowany przez inną osobę"
-
-#: lib/models/templates.js:51 lib/models/templates.js:122
-#: lib/models/templates.js:163
-msgid "Missing Template ID"
-msgstr "Brakujący ID szablonu"
-
-#: lib/models/templates.js:80 lib/models/templates.js:126
-msgid "Template Name must be set"
-msgstr "Nazwa szablonu musi być ustawiona"
-
-#: lib/models/triggers.js:28
-msgid "Has Opened"
-msgstr "Otwarte"
-
-#: lib/models/triggers.js:31
-msgid "Has Clicked"
-msgstr "Kliknięte"
-
-#: lib/models/triggers.js:34
-msgid "Not Opened"
-msgstr "Nie otwarte"
-
-#: lib/models/triggers.js:37
-msgid "Not Clicked"
-msgstr "Nie kliknięte"
-
-#: lib/models/triggers.js:174 lib/models/triggers.js:211
-msgid "Missing or invalid list ID"
-msgstr "Brakujący lub nieprawidłowy ID listy"
-
-#: lib/models/triggers.js:178 lib/models/triggers.js:263
-msgid "Days in the past are not allowed"
-msgstr "Dni w przeszłości są niedozwolone"
-
-#: lib/models/triggers.js:182 lib/models/triggers.js:203
-#: lib/models/triggers.js:267 lib/models/triggers.js:288
-msgid "Missing or invalid trigger rule"
-msgstr "Brakująca lub nieprawidłowa reguła wyzwalacza"
-
-#: lib/models/triggers.js:189 lib/models/triggers.js:274
-msgid "Invalid subscription configuration"
-msgstr "ieprawidłowa konfiguracja subskrypcji"
-
-#: lib/models/triggers.js:196 lib/models/triggers.js:281
-msgid "Invalid campaign configuration"
-msgstr "Nieprawidłowa konfiguracja kampanii"
-
-#: lib/models/triggers.js:199 lib/models/triggers.js:284
-msgid "A campaing can not be a target for itself"
-msgstr "Kampania nie może być celem samym w sobie"
-
-#: lib/models/triggers.js:232
-msgid "Could not store trigger row"
-msgstr "Nie można zapisać wiersza wyzwalacza"
-
-#: lib/models/triggers.js:249
-msgid "Missing or invalid Trigger ID"
-msgstr "Brakujący lub nieprawidłowy ID wyzwalacza"
-
-#: lib/models/triggers.js:316
-msgid "Missing Trigger ID"
-msgstr "Brakujący ID wyzwalacza"
-
-#: lib/models/users.js:103
-msgid "Could not store user row"
-msgstr "Nie można zapisać wiersza użytkownika"
-
-#: lib/models/users.js:173
-msgid "Email Address must be set"
-msgstr "Adres e-mail musi być ustawiony"
-
-#: lib/models/users.js:184
-msgid "Failed to check user data"
-msgstr "Nie można sprawdzić danych użytkownika"
-
-#: lib/models/users.js:195
-msgid ""
-"Can't change email as another user with the same email address already exists"
-msgstr ""
-"Nie można zmienić adresu e-mail, ponieważ inny użytkownik o tym samym "
-"adresie e-mail już istnieje"
-
-#: lib/models/users.js:212
-msgid "Incorrect current password"
-msgstr "Nieprawidłowe aktualne hasło"
-
-#: lib/models/users.js:216
-msgid "New password not set"
-msgstr "Nowe hasło nie zostało ustawione"
-
-#: lib/models/users.js:220
-msgid "Passwords do not match"
-msgstr "Hasła nie pasują do siebie"
-
-#: lib/models/users.js:258
-msgid "User ID not set"
-msgstr "Nie ustawiono ID użytkownika"
-
-#: lib/models/users.js:286
-msgid "Username must be set"
-msgstr "Nazwa użytkownika musi być ustawiona"
-
-#: lib/models/users.js:323
-msgid "Mailer password change request"
-msgstr "Żądanie zmiany hasła Mailera"
-
-#: lib/models/users.js:347 lib/models/users.js:367
-msgid "Missing username or reset token"
-msgstr "Brakująca nazwa użytkownika lub token reset"
-
-#: lib/models/users.js:371
-msgid "Invalid new password"
-msgstr "Nieprawidłowe nowe hasło"
-
-#: lib/passport.js:38
-msgid "%s logged out"
-msgstr "%s Wylogowany"
-
-#: lib/passport.js:51
-msgid "Failed to authenticate user"
-msgstr "Nie udało się uwierzytelnić użytkownika"
-
-#: lib/passport.js:67
-msgid "Logged in as %s"
-msgstr "Zalogowano jako %s"
-
-#: lib/passport.js:125
-msgid "Incorrect username or password"
-msgstr "Nieprawidłowa nazwa użytkownika lub hasło"
-
-#: lib/tools.js:123
-msgid "Automation"
-msgstr "Automatyzacja"
-
-#: lib/tools.js:133
-msgid "Blocked email address \"%s\""
-msgstr "Zablokowany adres e-mail \"%s\""
-
-#: lib/tools.js:142
-msgid "Invalid email address \"%s\"."
-msgstr "Nieprawidłowy adres e-mail \"%s\"."
-
-#: lib/tools.js:145
-msgid "MX record not found for domain"
-msgstr "Nie znaleziono rekordu MX dla domeny"
-
-#: lib/tools.js:148
-msgid "Address domain not found"
-msgstr "Nie znaleziono domeny"
-
-#: lib/tools.js:151
-msgid "Address domain name is required"
-msgstr "Nazwa domeny adresu jest wymagana"
-
-#: routes/archive.js:31 routes/archive.js:43 routes/archive.js:55 app.js:211
-msgid "Not Found"
-msgstr "Nie znaleziono"
-
-#: routes/archive.js:110 services/sender.js:447
-msgid "Received status code %s from %s"
-msgstr "Otrzymano kod statusu %s z %s"
-
-#: routes/archive.js:134 routes/campaigns.js:131 routes/campaigns.js:295
-#: routes/campaigns.js:390 routes/campaigns.js:435 routes/campaigns.js:475
-#: routes/campaigns.js:739 routes/campaigns.js:762 routes/campaigns.js:781
-#: routes/campaigns.js:803 routes/triggers.js:146
-msgid "Could not find campaign with specified ID"
-msgstr "Nie można znaleźć kampanii z określonym ID"
-
-#: routes/archive.js:142 routes/campaigns.js:789
-msgid "Attachment not found"
-msgstr "Załącznik nie znaleziony"
-
-#: routes/campaigns.js:26 routes/fields.js:13 routes/lists.js:49
-#: routes/segments.js:13 routes/settings.js:23 routes/templates.js:17
-#: routes/triggers.js:18 routes/users.js:75 routes/users.js:120
-msgid "Need to be logged in to access restricted content"
-msgstr "Musisz być zalogowany, aby uzyskać dostęp do zastrzeżonych treści"
-
-#: routes/campaigns.js:117
-msgid "Could not create campaign"
-msgstr "Nie można utworzyć kampanii"
-
-#: routes/campaigns.js:120
-msgid "Campaign “%s” created"
-msgstr "Kampania “%s” utworzona"
-
-#: routes/campaigns.js:204
-msgid "content from an RSS entry"
-msgstr "treść z wpisu RSS"
-
-#: routes/campaigns.js:220
-msgid "Campaign settings updated"
-msgstr "Zaktualizowano ustawienia kampanii"
-
-#: routes/campaigns.js:222
-msgid "Campaign settings not updated"
-msgstr "Ustawienia kampanii nie zostały zaktualizowane"
-
-#: routes/campaigns.js:238 routes/campaigns.js:639
-msgid "Campaign deleted"
-msgstr "Kampania usunięta"
-
-#: routes/campaigns.js:240 routes/campaigns.js:641
-msgid "Could not delete specified campaign"
-msgstr "Nie można usunąć określonej kampanii"
-
-#: routes/campaigns.js:259
-msgid "Idling"
-msgstr "Bezczynność"
-
-#: routes/campaigns.js:262
-msgid "Scheduled"
-msgstr "Planowane"
-
-#: routes/campaigns.js:268
-msgid "Paused"
-msgstr "Wstrzymane"
-
-#: routes/campaigns.js:270
-msgid "Inactive"
-msgstr "Nieaktywny"
-
-#: routes/campaigns.js:272
-msgid "Active"
-msgstr "Aktywny"
-
-#: routes/campaigns.js:274
-msgid "Other"
-msgstr "Inny"
-
-#: routes/campaigns.js:429
-msgid "Unknown status selector"
-msgstr "Nieznany status selektora"
-
-#: routes/campaigns.js:657
-msgid "Scheduled sending"
-msgstr "Wysyłanie zaplanowanych"
-
-#: routes/campaigns.js:659
-msgid "Could not schedule sending"
-msgstr "Nie można zaplanować wysyłania"
-
-#: routes/campaigns.js:671
-msgid "Sending resumed"
-msgstr "Wysyłanie zostało wznowione"
-
-#: routes/campaigns.js:673
-msgid "Could not resume sending"
-msgstr "Nie można wznowić wysyłania"
-
-#: routes/campaigns.js:685
-msgid "Sending reset"
-msgstr "Wysyłam reset"
-
-#: routes/campaigns.js:687
-msgid "Could not reset sending"
-msgstr "Nie można zresetować wysyłania"
-
-#: routes/campaigns.js:699 routes/campaigns.js:727
-msgid "Sending paused"
-msgstr "Wysyłanie wstrzymane"
-
-#: routes/campaigns.js:701 routes/campaigns.js:729
-msgid "Could not pause sending"
-msgstr "Nie można wstrzymać wysyłania"
-
-#: routes/campaigns.js:713
-msgid "Sending activated"
-msgstr "Wysyłanie aktywowane"
-
-#: routes/campaigns.js:715
-msgid "Could not activate sending"
-msgstr "Nie można aktywować wysyłania"
-
-#: routes/campaigns.js:750
-msgid "Attachment uploaded"
-msgstr "Przesłano załącznik"
-
-#: routes/campaigns.js:752
-msgid "Could not store attachment"
-msgstr "Nie można zapisać załącznika"
-
-#: routes/campaigns.js:769
-msgid "Attachment deleted"
-msgstr "Załącznik usunięty"
-
-#: routes/campaigns.js:771
-msgid "Could not delete attachment"
-msgstr "Nie można usunąć załącznika"
-
-#: routes/fields.js:28 routes/fields.js:64 routes/fields.js:118
-#: routes/segments.js:28 routes/segments.js:59 routes/segments.js:102
-#: routes/segments.js:151 routes/segments.js:223 routes/segments.js:255
-#: routes/segments.js:289 routes/segments.js:336 routes/segments.js:359
-msgid "Selected list ID not found"
-msgstr "Nie znaleziono wybranego ID listy"
-
-#: routes/fields.js:102
-msgid "Could not create custom field"
-msgstr "Nie można utworzyć pola niestandardowego"
-
-#: routes/fields.js:129
-msgid "Selected field not found"
-msgstr "Nie znaleziono wybranego pola"
-
-#: routes/fields.js:165
-msgid "Field settings updated"
-msgstr "Zaktualizowano ustawienia pola"
-
-#: routes/fields.js:167
-msgid "Field settings not updated"
-msgstr "Ustawienia pola nie zostały zaktualizowane"
-
-#: routes/fields.js:183
-msgid "Custom field deleted"
-msgstr "Pole niestandardowe usunięte"
-
-#: routes/fields.js:185
-msgid "Could not delete specified field"
-msgstr "Nie można usunąć określonego pola"
-
-#: routes/links.js:40
-msgid "Oops, we couldn't find a link for the URL you clicked"
-msgstr "Ups, nie mogliśmy znaleźć linku dla URL który kliknąłeś"
-
-#: routes/lists.js:90
-msgid "Could not create list"
-msgstr "Nie można utworzyć listy"
-
-#: routes/lists.js:93
-msgid "List created"
-msgstr "Utworzono listę"
-
-#: routes/lists.js:101 routes/lists.js:236 routes/lists.js:301
-#: routes/lists.js:340 routes/lists.js:409 routes/lists.js:434
-#: routes/lists.js:479 routes/lists.js:501 routes/lists.js:530
-#: routes/lists.js:609 routes/lists.js:666 routes/lists.js:693
-msgid "Could not find list with specified ID"
-msgstr "Nie można znaleźć listy o określonym ID"
-
-#: routes/lists.js:115
-msgid "List settings updated"
-msgstr "Zaktualizowano ustawienia listy"
-
-#: routes/lists.js:117
-msgid "List settings not updated"
-msgstr "Nie zaktualizowano ustawień listy"
-
-#: routes/lists.js:133
-msgid "List deleted"
-msgstr "Lista usunięta"
-
-#: routes/lists.js:135
-msgid "Could not delete specified list"
-msgstr "Nie można usunąć określonej listy"
-
-#: routes/lists.js:171
-msgid "Unknown"
-msgstr "Nieznany"
-
-#: routes/lists.js:171
-msgid "Complained"
-msgstr "Skarżący"
-
-#: routes/lists.js:202
-msgid "Invalid key"
-msgstr "Klucz niewłaściwy"
-
-#: routes/lists.js:204
-msgid "Expired key"
-msgstr "Klucz wygasł"
-
-#: routes/lists.js:206
-msgid "Revoked key"
-msgstr "Klucz odwołany"
-
-#: routes/lists.js:256
-msgid "Initializing"
-msgstr "Inicjowanie"
-
-#: routes/lists.js:259
-msgid "Initialized"
-msgstr "Zainicjowano"
-
-#: routes/lists.js:262
-msgid "Importing"
-msgstr "Importowanie"
-
-#: routes/lists.js:268
-msgid "Errored"
-msgstr "Błędne"
-
-#: routes/lists.js:346 routes/lists.js:415 routes/lists.js:440
-msgid "Could not find subscriber with specified ID"
-msgstr "Nie można znaleźć subskrybenta o podanym ID"
-
-#: routes/lists.js:392
-msgid "Could not add subscription"
-msgstr "Nie można dodać subskrypcji"
-
-#: routes/lists.js:397
-msgid "%s was successfully added to your list"
-msgstr "%s został pomyślnie dodany do twojej listy"
-
-#: routes/lists.js:399
-msgid "%s was not added to your list"
-msgstr "%s nie został dodany do Twojej listy"
-
-#: routes/lists.js:421
-msgid "Could not unsubscribe user"
-msgstr "Nie można anulować subskrypcji użytkownika"
-
-#: routes/lists.js:424
-msgid "%s was successfully unsubscribed from your list"
-msgstr "%s został pomyślnie wypisany z listy"
-
-#: routes/lists.js:444
-msgid "%s was successfully removed from your list"
-msgstr "%s został pomyślnie usunięty z Twojej listy"
-
-#: routes/lists.js:456
-msgid "Another subscriber with email address %s already exists"
-msgstr "Inny subskrybent z adresem e-mail %s już istnieje"
-
-#: routes/lists.js:463
-msgid "Subscription settings updated"
-msgstr "Zaktualizowano ustawienia subskrypcji"
-
-#: routes/lists.js:465
-msgid "Subscription settings not updated"
-msgstr "Ustawienia subskrypcji nie zostały zaktualizowane"
-
-#: routes/lists.js:507 routes/lists.js:615 routes/lists.js:651
-#: routes/lists.js:679 routes/lists.js:699
-msgid "Could not find import data with specified ID"
-msgstr "Nie można znaleźć danych importu o podanym ID"
-
-#: routes/lists.js:538
-msgid "Could not process CSV"
-msgstr "Nie można przetworzyć pliku CSV"
-
-#: routes/lists.js:547
-msgid "Could not create importer"
-msgstr "Nie można utworzyć importera"
-
-#: routes/lists.js:598
-msgid "Empty file"
-msgstr "Pusty plik"
-
-#: routes/lists.js:655
-msgid "Import started"
-msgstr "Rozpoczęto importowanie"
-
-#: routes/lists.js:683
-msgid "Import restarted"
-msgstr "Import został zrestartowany"
-
-#: routes/segments.js:86
-msgid "Could not create segment"
-msgstr "Nie można utworzyć segmentu"
-
-#: routes/segments.js:89
-msgid "Segment created"
-msgstr "Utworzono segment"
-
-#: routes/segments.js:113
-msgid "Selected segment ID not found"
-msgstr "Nie znaleziono ID wybranego segmentu"
-
-#: routes/segments.js:188
-msgid "Segment settings updated"
-msgstr "Zaktualizowane ustawienia segmentów"
-
-#: routes/segments.js:190
-msgid "Segment settings not updated"
-msgstr "Ustawienia segmentu nie zostały zaktualizowane"
-
-#: routes/segments.js:206
-msgid "Segment deleted"
-msgstr "Segment usunięty"
-
-#: routes/segments.js:208
-msgid "Could not delete specified segment"
-msgstr "Nie można usunąć określonego segmentu"
-
-#: routes/segments.js:342
-msgid "Could not create rule"
-msgstr "Nie można utworzyć reguły"
-
-#: routes/segments.js:345
-msgid "Rule created"
-msgstr "Dodano regułę"
-
-#: routes/segments.js:410
-msgid "Rule settings updated"
-msgstr "Zaktualizowano ustawienia reguły"
-
-#: routes/segments.js:412
-msgid "Rule settings not updated"
-msgstr "Nie zaktualizowano ustawień reguły"
-
-#: routes/segments.js:428
-msgid "Rule deleted"
-msgstr "Usunięto regułę"
-
-#: routes/segments.js:430
-msgid "Could not delete specified rule"
-msgstr "Nie można usunąć określonej reguły"
-
-#: routes/settings.js:39
-msgid "Use TLS"
-msgstr "Użyj TLS"
-
-#: routes/settings.js:40
-msgid "usually selected for port 465"
-msgstr "zazwyczaj wybierany port 465"
-
-#: routes/settings.js:44
-msgid "Use STARTTLS"
-msgstr "Użyj STARTTLS"
-
-#: routes/settings.js:45
-msgid "usually selected for port 587 and 25"
-msgstr "zazwyczaj wybierany port 587 i 25"
-
-#: routes/settings.js:49
-msgid "Do not use encryption"
-msgstr "Nie używaj szyfrowania"
-
-#: routes/settings.js:115
-msgid "Settings updated"
-msgstr "Zaktualizowano ustawienia"
-
-#: routes/settings.js:173
-msgid "Invalid mail transport type"
-msgstr "Nieprawidłowy typ transportu poczty"
-
-#: routes/settings.js:184
-msgid "Invalid Access Key"
-msgstr "Nieprawidłowy klucz dostępu"
-
-#: routes/settings.js:187
-msgid "Invalid AWS credentials"
-msgstr "Nieprawidłowe dane uwierzytelniające AWS"
-
-#: routes/settings.js:190
-msgid "Connection refused, check hostname and port."
-msgstr "Połączenie odrzucone, sprawdź nazwę hosta i port."
-
-#: routes/settings.js:195
-msgid ""
-"Did not receive greeting message from server. This might happen when "
-"connecting to a TLS port without using TLS."
-msgstr ""
-"Nie otrzymano wiadomości powitalnej z serwera. Może się to zdarzyć podczas "
-"łączenia się z portem TLS bez korzystania z TLS."
-
-#: routes/settings.js:197
-msgid "Did not receive greeting message from server."
-msgstr "Nie otrzymano wiadomości powitalnej z serwera."
-
-#: routes/settings.js:200
-msgid ""
-"Connection timed out. Check your firewall settings, destination port is "
-"probably blocked."
-msgstr ""
-"Przekroczono limit czasu połączenia. Sprawdź ustawienia zapory, port "
-"docelowy jest prawdopodobnie zablokowany."
-
-#: routes/settings.js:205
-msgid "Authentication not accepted, server expects STARTTLS to be used."
-msgstr ""
-"Uwierzytelnianie nie jest akceptowane, serwer oczekuje, że zostanie użyty "
-"STARTTLS."
-
-#: routes/settings.js:207
-msgid "Authentication failed, check username and password."
-msgstr "Uwierzytelnianie nie powiodło się, sprawdź nazwę użytkownika i hasło."
-
-#: routes/settings.js:217
-msgid "Failed Mailer verification."
-msgstr "Weryfikacja Mailera nie powiodła się."
-
-#: routes/settings.js:217
-msgid "Server responded with: \"%s\""
-msgstr "Odpowiedź serwera: \"%s\""
-
-#: routes/settings.js:221
-msgid "Mailer settings verified, ready to send some mail!"
-msgstr "Ustawienia Mailera zweryfikowane, gotowe do wysłania wiadomości!"
-
-#: routes/subscription.js:22
-msgid "Selected subscription not found"
-msgstr "Nie znaleziono wybranej subskrypcji"
-
-#: routes/subscription.js:32 routes/subscription.js:103
-#: routes/subscription.js:141 routes/subscription.js:166
-#: routes/subscription.js:191 routes/subscription.js:232
-#: routes/subscription.js:270 routes/subscription.js:317
-#: routes/subscription.js:339 routes/subscription.js:368
-#: routes/subscription.js:392 routes/subscription.js:424
-msgid "Selected list not found"
-msgstr "Nie znaleziono wybranej listy"
-
-#: routes/subscription.js:78 routes/subscription.js:472
-msgid "%s: Subscription Confirmed"
-msgstr "%s: Potwierdzono subskrypcję"
-
-#: routes/subscription.js:217
-msgid "Email address not set"
-msgstr "Adres e-mail nie jest ustawiony"
-
-#: routes/subscription.js:255
-msgid "Could not store confirmation data"
-msgstr "Nie można zapisać danych potwierdzających"
-
-#: routes/subscription.js:284 routes/subscription.js:349
-#: routes/subscription.js:402
-msgid "Subscription not found from this list"
-msgstr "Nie znaleziono subskrypcji z tej listy"
-
-#: routes/subscription.js:383
-msgid "Email address updated, check your mailbox for verification instructions"
-msgstr ""
-"Adres e-mail zaktualizowany, sprawdź skrzynkę pocztową, aby uzyskać "
-"instrukcje dotyczące weryfikacji"
-
-#: routes/subscription.js:499 routes/subscription.js:515
-msgid "Public key is not set"
-msgstr "Klucz publiczny nie jest ustawiony"
-
-#: routes/templates.js:98
-msgid "Could not create template"
-msgstr "Nie można utworzyć szablonu"
-
-#: routes/templates.js:101
-msgid "Template created"
-msgstr "Szablon utworzony"
-
-#: routes/templates.js:109
-msgid "Could not find template with specified ID"
-msgstr "Nie można znaleźć szablonu z określonym ID"
-
-#: routes/templates.js:140
-msgid "Template settings updated"
-msgstr "Zaktualizowano ustawienia szablonu"
-
-#: routes/templates.js:142
-msgid "Template settings not updated"
-msgstr "Ustawienia szablonów nie zostały zaktualizowane"
-
-#: routes/templates.js:158
-msgid "Template deleted"
-msgstr "Szablon usunięty"
-
-#: routes/templates.js:160
-msgid "Could not delete specified template"
-msgstr "Nie można usunąć określonego szablonu"
-
-#: routes/triggers.js:62 routes/triggers.js:79 routes/triggers.js:154
-msgid "Could not find selected list"
-msgstr "Nie można znaleźć wybranej listy"
-
-#: routes/triggers.js:131
-msgid "Could not create trigger"
-msgstr "Nie można utworzyć wyzwalacza"
-
-#: routes/triggers.js:138
-msgid "Trigger “%s” created"
-msgstr "Wyzwalacz “%s” został utworzony"
-
-#: routes/triggers.js:214
-msgid "Trigger settings updated"
-msgstr "Zaktualizowano ustawienia wyzwalacza"
-
-#: routes/triggers.js:216
-msgid "Trigger settings not updated"
-msgstr "Ustawienia wyzwalacza nie zostały zaktualizowane"
-
-#: routes/triggers.js:228
-msgid "Trigger deleted"
-msgstr "Wyzwalacz został usunięty"
-
-#: routes/triggers.js:230
-msgid "Could not delete specified trigger"
-msgstr "Nie można usunąć określonego wyzwalacza"
-
-#: routes/triggers.js:242
-msgid "Could not find trigger with specified ID"
-msgstr "Nie można znaleźć wyzwalacza z określonym ID"
-
-#: routes/triggers.js:255
-msgid "Trigger not found"
-msgstr "Wyzwalacz nie został znaleziony"
-
-#: routes/users.js:32
-msgid ""
-"An email with password reset instructions has been sent to your email "
-"address, if it exists on our system."
-msgstr ""
-"E-mail z instrukcjami resetowania hasła został wysłany na Twój adres e-mail, "
-"jeśli istnieje w naszym systemie."
-
-#: routes/users.js:46 routes/users.js:64
-msgid "Unknown or expired reset token"
-msgstr "Token resetowania nieznany lub wygasł"
-
-#: routes/users.js:66
-msgid "Your password has been changed successfully"
-msgstr "Twoje hasło zostało zmienione"
-
-#: routes/users.js:87
-msgid "User data not found"
-msgstr "Nie znaleziono danych użytkownika"
-
-#: routes/users.js:110
-msgid "Access token updated"
-msgstr "Zaktualizowano token dostępu"
-
-#: routes/users.js:112
-msgid "Access token not updated"
-msgstr "Nie zaktualizowano tokenu dostępu"
-
-#: routes/users.js:139
-msgid "Account information updated"
-msgstr "Informacje o koncie zostały zaktualizowane"
-
-#: routes/users.js:141
-msgid "Account information not updated"
-msgstr "Informacje o koncie nie zostały zaktualizowane"
-
-#: services/feedcheck.js:51
-msgid "Feed error: %s"
-msgstr "RSS błąd: %s"
-
-#: services/feedcheck.js:54
-msgid "Found %s new campaign messages from feed"
-msgstr "Znaleziono %s nowych wiadomości kampanii z kanału"
-
-#: services/feedcheck.js:56
-msgid "Found nothing new from the feed"
-msgstr "Nie znaleziono nic nowego w kanale"
-
-#: services/feedcheck.js:143
-msgid "RSS entry %s"
-msgstr "Wpis RSS %s"
-
-#: services/importer.js:243
-msgid "Could not access import file"
-msgstr "Nie można uzyskać dostępu do pliku importu"
-
-#: services/triggers.js:51
-msgid "Unknown trigger type %s"
-msgstr "Nieznany typ wyzwalacza %s"
-
-#: views/subscription/widget-subscribe.hbs:3
-msgid "It looks like you are already subscribed to this list."
-msgstr "Wygląda na to, że już jesteś zapisany/a."
diff --git a/lib/db.js b/lib/db.js
index 44f17b0f..2c3a7b21 100644
--- a/lib/db.js
+++ b/lib/db.js
@@ -2,113 +2,5 @@
let config = require('config');
let mysql = require('mysql');
-let redis = require('redis');
-let Lock = require('redfour');
-let stringifyDate = require('json-stringify-date');
-let tools = require('./tools');
module.exports = mysql.createPool(config.mysql);
-if (config.redis && config.redis.enabled) {
-
- module.exports.redis = redis.createClient(config.redis);
-
- let queueLock = new Lock({
- redis: config.redis,
- namespace: 'mailtrain:lock'
- });
-
- module.exports.getLock = (id, callback) => {
- queueLock.waitAcquireLock(id, 60 * 1000 /* Lock expires after 60sec */ , 10 * 1000 /* Wait for lock for up to 10sec */ , (err, lock) => {
- if (err) {
- return callback(err);
- }
- if (!lock) {
- return callback(null, false);
- }
- return callback(null, {
- lock,
- release(done) {
- queueLock.releaseLock(lock, done);
- }
- });
- });
- };
-
- module.exports.clearCache = (key, callback) => {
- module.exports.redis.del('mailtrain:cache:' + key, err => callback(err));
- };
-
- module.exports.addToCache = (key, value, callback) => {
- if (!value) {
- return setImmediate(() => callback());
- }
- module.exports.redis.multi().
- lpush('mailtrain:cache:' + key, stringifyDate.stringify(value)).
- expire('mailtrain:cache:' + key, 24 * 3600).
- exec(err => callback(err));
- };
-
- module.exports.getFromCache = (key, callback) => {
- module.exports.redis.rpop('mailtrain:cache:' + key, (err, value) => {
- if (err) {
- return callback(err);
- }
- try {
- value = stringifyDate.parse(value);
- } catch (E) {
- return callback(E);
- }
-
- return callback(null, value);
- });
- };
-
-} else {
- // fakelock. does not lock anything
- module.exports.getLock = (id, callback) => {
- setImmediate(() => callback(null, {
- lock: false,
- release(done) {
- setImmediate(done);
- }
- }));
- };
-
- let caches = new Map();
-
- module.exports.clearCache = (key, callback) => {
- caches.delete(key);
- tools.workers.forEach(child => {
- child.send({
- cmd: 'db.clearCache',
- key
- });
- });
- setImmediate(() => callback());
- };
-
- process.on('message', m => {
- if (m && m.cmd === 'db.clearCache' && m.key) {
- caches.delete(m.key);
- }
- });
-
- module.exports.addToCache = (key, value, callback) => {
- if (!caches.has(key)) {
- caches.set(key, []);
- }
- caches.get(key).push(value);
- setImmediate(() => callback());
- };
-
- module.exports.getFromCache = (key, callback) => {
- let value;
- if (caches.has(key)) {
- value = caches.get(key).shift();
- if (!caches.get(key).length) {
- caches.delete(key);
- }
- }
- setImmediate(() => callback(null, value));
- };
-}
diff --git a/lib/dbcheck.js b/lib/dbcheck.js
deleted file mode 100644
index 93264800..00000000
--- a/lib/dbcheck.js
+++ /dev/null
@@ -1,218 +0,0 @@
-'use strict';
-
-/*
-This module handles Mailtrain database initialization and upgrades
-*/
-
-let config = require('config');
-let mysql = require('mysql');
-let log = require('npmlog');
-let fs = require('fs');
-let pathlib = require('path');
-let Handlebars = require('handlebars');
-let meta = require('../meta.json');
-
-let mysqlConfig = {
- multipleStatements: true
-};
-Object.keys(config.mysql).forEach(key => mysqlConfig[key] = config.mysql[key]);
-let db = mysql.createPool(mysqlConfig);
-
-function listTables(callback) {
- db.getConnection((err, connection) => {
- if (err) {
- if (err.code === 'ER_ACCESS_DENIED_ERROR') {
- err = new Error('Could not access the database. Check MySQL config and authentication credentials');
- }
- if (err.code === 'ECONNREFUSED' || err.code === 'PROTOCOL_SEQUENCE_TIMEOUT') {
- err = new Error('Could not connect to the database. Check MySQL host and port configuration');
- }
- return callback(err);
- }
- let query = 'SHOW TABLES';
- connection.query(query, (err, rows) => {
- connection.release();
- if (err) {
- return callback(err);
- }
- let tables = {};
- [].concat(rows || []).forEach(row => {
- let name;
- let table;
- Object.keys(row).forEach(key => {
- if (/^Tables_in_/i.test(key)) {
- table = name = row[key];
- }
- });
- if (/__\d+$/.test(name)) {
- let parts = name.split('__');
- parts.pop();
- table = parts.join('__');
- }
- if (tables.hasOwnProperty(table)) {
- tables[table].push(name);
- } else {
- tables[table] = [name];
- }
- return table;
- });
- return callback(null, tables);
- });
- });
-}
-
-function getSchemaVersion(callback) {
- db.getConnection((err, connection) => {
- if (err) {
- return callback(err);
- }
- connection.query('SELECT `value` FROM `settings` WHERE `key`=?', ['db_schema_version'], (err, rows) => {
- connection.release();
- if (err) {
- return callback(err);
- }
-
- let dbSchemaVersion = rows && rows[0] && Number(rows[0].value) || 0;
- callback(null, dbSchemaVersion);
- });
- });
-}
-
-function listUpdates(current, callback) {
- current = current || 0;
- fs.readdir(pathlib.join(__dirname, '..', 'setup', 'sql'), (err, list) => {
- if (err) {
- return callback(err);
- }
-
- let updates = [];
- [].concat(list || []).forEach(row => {
- if (/^upgrade-\d+\.sql$/i.test(row)) {
- let seq = row.match(/\d+/)[0];
- if (seq > current) {
- updates.push({
- seq: Number(seq),
- path: pathlib.join(__dirname, '..', 'setup', 'sql', row)
- });
- }
- }
- });
-
- return callback(null, updates);
- });
-}
-
-function getSql(path, data, callback) {
- fs.readFile(path, 'utf-8', (err, source) => {
- if (err) {
- return callback(err);
- }
- const rendered = data ? Handlebars.compile(source)(data) : source;
- return callback(null, rendered);
- });
-}
-
-function runInitial(callback) {
- let dump = process.env.NODE_ENV === 'test' ? 'mailtrain-test.sql' : 'mailtrain.sql';
- let fname = process.env.DB_FROM_START ? 'base.sql' : dump;
- let path = pathlib.join(__dirname, '..', 'setup', 'sql', fname);
- log.info('sql', 'Loading tables from %s', fname);
- applyUpdate({
- path
- }, callback);
-}
-
-function runUpdates(callback, runCount) {
- runCount = Number(runCount) || 0;
- listTables((err, tables) => {
- if (err) {
- return callback(err);
- }
-
- if (!tables.settings) {
- if (runCount) {
- return callback(new Error('Settings table not found from database'));
- }
- log.info('sql', 'SQL not set up, initializing');
- return runInitial(runUpdates.bind(null, callback, ++runCount));
- }
-
- getSchemaVersion((err, schemaVersion) => {
- if (err) {
- return callback(err);
- }
-
- if (schemaVersion >= meta.schemaVersion) {
- // nothing to do here, already updated
- return callback(null, false);
- }
-
- listUpdates(schemaVersion, (err, updates) => {
- if (err) {
- return callback(err);
- }
-
- let pos = 0;
- let runNext = () => {
- if (pos >= updates.length) {
- return callback(null, pos);
- }
- let update = updates[pos++];
- update.data = {
- tables
- };
- applyUpdate(update, (err, status) => {
- if (err) {
- return callback(err);
- }
- if (status) {
- log.info('sql', 'Update %s applied', update.seq);
- } else {
- log.info('sql', 'Update %s not applied', update.seq);
- }
-
- runNext();
- });
- };
-
- runNext();
- });
- });
-
- });
-}
-
-function applyUpdate(update, callback) {
- getSql(update.path, update.data, (err, sql) => {
- if (err) {
- return callback(err);
- }
-
- db.getConnection((err, connection) => {
- if (err) {
- return callback(err);
- }
-
- connection.query(sql, err => {
- connection.release();
- if (err) {
- return callback(err);
- }
-
- return callback(null, true);
- });
- });
- });
-}
-
-module.exports = callback => {
- runUpdates(err => {
- if (err) {
- return callback(err);
- }
- db.end(() => {
- log.info('sql', 'Database check completed');
- return callback(null, true);
- });
- });
-};
diff --git a/lib/editor-helpers.js b/lib/editor-helpers.js
deleted file mode 100644
index e4c4e79f..00000000
--- a/lib/editor-helpers.js
+++ /dev/null
@@ -1,79 +0,0 @@
-'use strict';
-
-let _ = require('../lib/translate')._;
-let helpers = require('../lib/helpers');
-let templates = require('../lib/models/templates');
-let campaigns = require('../lib/models/campaigns');
-
-module.exports = {
- getResource,
- getMergeTagsForResource
-};
-
-function getResource(type, id, callback) {
- if (type === 'template') {
- templates.get(id, (err, template) => {
- if (err || !template) {
- return callback(err && err.message || err || _('Could not find template with specified ID'));
- }
-
- getMergeTagsForResource(template, (err, mergeTags) => {
- if (err) {
- return callback(err.message || err);
- }
-
- template.mergeTags = mergeTags;
- return callback(null, template);
- });
- });
-
- } else if (type === 'campaign') {
- campaigns.get(id, false, (err, campaign) => {
- if (err || !campaign) {
- return callback(err && err.message || err || _('Could not find campaign with specified ID'));
- }
-
- getMergeTagsForResource(campaign, (err, mergeTags) => {
- if (err) {
- return callback(err.message || err);
- }
-
- campaign.mergeTags = mergeTags;
- return callback(null, campaign);
- });
- });
-
- } else {
- return callback(_('Invalid resource type'));
- }
-}
-
-function getMergeTagsForResource(resource, callback) {
- helpers.getDefaultMergeTags((err, defaultMergeTags) => {
- if (err) {
- return callback(err.message || err);
- }
-
- if (!Number(resource.list)) {
- return callback(null, defaultMergeTags);
- }
-
- helpers.getListMergeTags(resource.list, (err, listMergeTags) => {
- if (err) {
- return callback(err.message || err);
- }
-
- if (resource.type !== 2) {
- return callback(null, defaultMergeTags.concat(listMergeTags));
- }
-
- helpers.getRSSMergeTags((err, rssMergeTags) => {
- if (err) {
- return callback(err.message || err);
- }
-
- callback(null, defaultMergeTags.concat(listMergeTags, rssMergeTags));
- });
- });
- });
-}
diff --git a/lib/executor.js b/lib/executor.js
deleted file mode 100644
index 1cf1d959..00000000
--- a/lib/executor.js
+++ /dev/null
@@ -1,83 +0,0 @@
-'use strict';
-
-const fork = require('child_process').fork;
-const log = require('npmlog');
-const path = require('path');
-
-const requestCallbacks = {};
-let messageTid = 0;
-let executorProcess;
-
-module.exports = {
- spawn,
- start,
- stop
-};
-
-function spawn(callback) {
- log.info('Executor', 'Spawning executor process.');
-
- executorProcess = fork(path.join(__dirname, '..', 'services', 'executor.js'), [], {
- cwd: path.join(__dirname, '..'),
- env: {NODE_ENV: process.env.NODE_ENV}
- });
-
- executorProcess.on('message', msg => {
- if (msg) {
- if (msg.type === 'process-started') {
- let requestCallback = requestCallbacks[msg.tid];
- if (requestCallback && requestCallback.startedCallback) {
- requestCallback.startedCallback(msg.tid);
- }
-
- } else if (msg.type === 'process-failed') {
- let requestCallback = requestCallbacks[msg.tid];
- if (requestCallback && requestCallback.failedCallback) {
- requestCallback.failedCallback(msg.msg);
- }
-
- delete requestCallbacks[msg.tid];
-
- } else if (msg.type === 'process-finished') {
- let requestCallback = requestCallbacks[msg.tid];
- if (requestCallback && requestCallback.startedCallback) {
- requestCallback.finishedCallback(msg.code, msg.signal);
- }
-
- delete requestCallbacks[msg.tid];
-
- } else if (msg.type === 'executor-started') {
- log.info('Executor', 'Executor process started.');
- return callback();
- }
- }
- });
-
- executorProcess.on('close', (code, signal) => {
- log.info('Executor', 'Executor process exited with code %s signal %s.', code, signal);
- });
-}
-
-function start(type, data, startedCallback, finishedCallback, failedCallback) {
- requestCallbacks[messageTid] = {
- startedCallback,
- finishedCallback,
- failedCallback
- };
-
- executorProcess.send({
- type: 'start-' + type,
- data,
- tid: messageTid
- });
-
- messageTid++;
-}
-
-function stop(tid) {
- executorProcess.send({
- type: 'stop-process',
- tid
- });
-}
-
diff --git a/lib/fakelang.js b/lib/fakelang.js
deleted file mode 100644
index 7a6027a1..00000000
--- a/lib/fakelang.js
+++ /dev/null
@@ -1,26 +0,0 @@
-'use strict';
-
-/* lloyd|2012|http://wtfpl.org */
-
-/* eslint-disable */
-
-module.exports = str => {
- let from = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_=+\\|`~[{]};:'\",<.>/?";
- let to = "ɐqɔpǝɟƃɥıɾʞʅɯuodbɹsʇnʌʍxʎz∀ԐↃᗡƎℲ⅁HIſӼ⅂WNOԀÒᴚS⊥∩ɅMX⅄Z0123456789¡@#$%ᵥ⅋⁎()-_=+\\|,~[{]};:,„´<.>/¿";
-
- return str.replace(/(\{\{[^\}]+\}\}|%s)/g, '\x00\x04$1\x00').split('\x00').map(c => {
- if (c.charAt(0) === '\x04') {
- return c;
- }
- let r = '';
- for (let i = 0, len = c.length; i < len; i++) {
- let pos = from.indexOf(c.charAt(i));
- if (pos < 0) {
- r += c.charAt(i);
- } else {
- r += to.charAt(pos);
- }
- }
- return r;
- }).join('\x00').replace(/[\x00\x04]/g, '');
-}
diff --git a/lib/feed.js b/lib/feed.js
deleted file mode 100644
index 66bd2f20..00000000
--- a/lib/feed.js
+++ /dev/null
@@ -1,68 +0,0 @@
-'use strict';
-
-let FeedParser = require('feedparser');
-let request = require('request');
-let _ = require('./translate')._;
-let util = require('util');
-
-module.exports.fetch = (url, callback) => {
- let req = request(url);
- let feedparser = new FeedParser();
- let returned = false;
- let entries = [];
-
- req.setHeader('user-agent', 'Mailtrain');
- req.setHeader('accept', 'text/html,application/xhtml+xml');
-
- req.on('error', err => {
- if (returned) {
- return;
- }
- returned = true;
- callback(err);
- });
-
- req.on('response', res => {
- if (returned) {
- return;
- }
-
- if (res.statusCode !== 200) {
- return req.emit('error', new Error(util.format(_('Bad status code %s'), res.statusCode)));
- }
-
- req.pipe(feedparser);
- });
-
- feedparser.on('error', err => {
- if (returned) {
- return;
- }
- returned = true;
- callback(err);
- });
-
- feedparser.on('readable', () => {
- let item;
- while ((item = feedparser.read())) {
- let entry = {
- title: item.title,
- date: item.date || item.pubdate || item.pubDate || new Date(),
- guid: item.guid || item.link,
- link: item.link,
- content: item.description || item.summary,
- summary: item.summary || item.description,
- image_url: item.image.url
- };
- entries.push(entry);
- }
- });
-
- feedparser.on('end', () => {
- if (returned) {
- return;
- }
- returned = true;
- callback(null, entries);
- });
-};
diff --git a/lib/file-helpers.js b/lib/file-helpers.js
deleted file mode 100644
index deee31e1..00000000
--- a/lib/file-helpers.js
+++ /dev/null
@@ -1,32 +0,0 @@
-'use strict';
-
-const path = require('path');
-
-function nameToFileName(name) {
- return name.
- trim().
- toLowerCase().
- replace(/[ .+/]/g, '-').
- replace(/[^a-z0-9\-_]/gi, '').
- replace(/--*/g, '-');
-}
-
-
-function getReportFileBase(report) {
- return path.join(__dirname, '..', 'protected', 'reports', report.id + '-' + nameToFileName(report.name));
-}
-
-function getReportContentFile(report) {
- return getReportFileBase(report) + '.out';
-}
-
-function getReportOutputFile(report) {
- return getReportFileBase(report) + '.err';
-}
-
-
-module.exports = {
- getReportContentFile,
- getReportOutputFile,
- nameToFileName
-};
diff --git a/lib/handlebars-helpers.js b/lib/handlebars-helpers.js
deleted file mode 100644
index 10a38741..00000000
--- a/lib/handlebars-helpers.js
+++ /dev/null
@@ -1,49 +0,0 @@
-'use strict';
-
-const util = require('util');
-
-const _ = require('../lib/translate')._;
-
-module.exports.registerHelpers = handlebars => {
- // {{#translate}}abc{{/translate}}
- handlebars.registerHelper('translate', function (context, options) { // eslint-disable-line prefer-arrow-callback
- if (typeof options === 'undefined' && context) {
- options = context;
- context = false;
- }
-
- let result = _(options.fn(this)); // eslint-disable-line no-invalid-this
-
- if (Array.isArray(context)) {
- result = util.format(result, ...context);
- }
- return new handlebars.SafeString(result);
- });
-
-
- /* Credits to http://chrismontrois.net/2016/01/30/handlebars-switch/
-
- {{#switch letter}}
- {{#case "a"}}
- A is for alpaca
- {{/case}}
- {{#case "b"}}
- B is for bluebird
- {{/case}}
- {{/switch}}
- */
- /* eslint no-invalid-this: "off" */
- handlebars.registerHelper('switch', function(value, options) {
- this._switch_value_ = value;
- const html = options.fn(this); // Process the body of the switch block
- delete this._switch_value_;
- return html;
- });
-
- handlebars.registerHelper('case', function(value, options) {
- if (value === this._switch_value_) {
- return options.fn(this);
- }
- });
-
-};
diff --git a/lib/helpers.js b/lib/helpers.js
deleted file mode 100644
index 786e3473..00000000
--- a/lib/helpers.js
+++ /dev/null
@@ -1,295 +0,0 @@
-'use strict';
-
-let config = require('config');
-let path = require('path');
-let fs = require('fs');
-let tools = require('./tools');
-let settings = require('./models/settings');
-let lists = require('./models/lists');
-let fields = require('./models/fields');
-let forms = require('./models/forms');
-let _ = require('./translate')._;
-let objectHash = require('object-hash');
-let mjml = require('mjml');
-let mjmlTemplates = new Map();
-let hbs = require('hbs');
-
-module.exports = {
- getDefaultMergeTags,
- getRSSMergeTags,
- getListMergeTags,
- captureFlashMessages,
- injectCustomFormData,
- injectCustomFormTemplates,
- filterCustomFields,
- getMjmlTemplate,
- rollbackAndReleaseConnection
-};
-
-function getDefaultMergeTags(callback) {
- // Using a callback for the sake of future-proofness
- callback(null, [{
- key: 'LINK_UNSUBSCRIBE',
- value: _('URL that points to the unsubscribe page')
- }, {
- key: 'LINK_PREFERENCES',
- value: _('URL that points to the preferences page of the subscriber')
- }, {
- key: 'LINK_BROWSER',
- value: _('URL to preview the message in a browser')
- }, {
- key: 'EMAIL',
- value: _('Email address')
- }, {
- key: 'FIRST_NAME',
- value: _('First name')
- }, {
- key: 'LAST_NAME',
- value: _('Last name')
- }, {
- key: 'FULL_NAME',
- value: _('Full name (first and last name combined)')
- }, {
- key: 'SUBSCRIPTION_ID',
- value: _('Unique ID that identifies the recipient')
- }, {
- key: 'LIST_ID',
- value: _('Unique ID that identifies the list used for this campaign')
- }, {
- key: 'CAMPAIGN_ID',
- value: _('Unique ID that identifies current campaign')
- }]);
-}
-
-function getRSSMergeTags(callback) {
- // Using a callback for the sake of future-proofness
- callback(null, [{
- key: 'RSS_ENTRY',
- value: _('content from an RSS entry')
- }, {
- key: 'RSS_ENTRY_TITLE',
- value: _('RSS entry title')
- }, {
- key: 'RSS_ENTRY_DATE',
- value: _('RSS entry date')
- }, {
- key: 'RSS_ENTRY_LINK',
- value: _('RSS entry link')
- }, {
- key: 'RSS_ENTRY_CONTENT',
- value: _('content from an RSS entry')
- }, {
- key: 'RSS_ENTRY_SUMMARY',
- value: _('RSS entry summary')
- }, {
- key: 'RSS_ENTRY_IMAGE_URL',
- value: _('RSS entry image URL')
- }]);
-}
-
-function getListMergeTags(listId, callback) {
- lists.get(listId, (err, list) => {
- if (err) {
- return callback(err);
- }
- if (!list) {
- list = {
- id: listId
- };
- }
-
- fields.list(list.id, (err, fieldList) => {
- if (err && !fieldList) {
- fieldList = [];
- }
-
- let mergeTags = [];
-
- fieldList.forEach(field => {
- mergeTags.push({
- key: field.key,
- value: field.name
- });
- });
-
- return callback(null, mergeTags);
- });
- });
-}
-
-function filterCustomFields(customFieldsIn = [], fieldIds = [], method = 'include') {
- let customFields = customFieldsIn.slice();
- fieldIds = typeof fieldIds === 'string' ? fieldIds.split(',') : fieldIds;
-
- customFields.unshift({
- id: 'email',
- name: 'Email Address',
- type: 'Email',
- typeSubscriptionEmail: true
- }, {
- id: 'firstname',
- name: 'First Name',
- type: 'Text',
- typeFirstName: true
- }, {
- id: 'lastname',
- name: 'Last Name',
- type: 'Text',
- typeLastName: true
- });
-
- let filtered = [];
-
- if (method === 'include') {
- fieldIds.forEach(id => {
- let field = customFields.find(f => f.id.toString() === id);
- field && filtered.push(field);
- });
- } else {
- customFields.forEach(field => {
- !fieldIds.includes(field.id.toString()) && filtered.push(field);
- });
- }
-
- return filtered;
-}
-
-function injectCustomFormData(customFormId, viewPath, data, callback) {
-
- let injectDefaultData = data => {
- data.customFields = filterCustomFields(data.customFields, [], 'exclude');
- data.formInputStyle = '@import url(/subscription/form-input-style.css);';
- return data;
- };
-
- if (Number(customFormId) < 1) {
- return callback(null, injectDefaultData(data));
- }
-
- forms.get(customFormId, (err, form) => {
- if (err) {
- return callback(null, injectDefaultData(data));
- }
-
- let view = viewPath.split('/')[1];
-
- if (view === 'web-subscribe') {
- data.customFields = form.fieldsShownOnSubscribe
- ? filterCustomFields(data.customFields, form.fieldsShownOnSubscribe)
- : filterCustomFields(data.customFields, [], 'exclude');
- } else if (view === 'web-manage') {
- data.customFields = form.fieldsShownOnManage
- ? filterCustomFields(data.customFields, form.fieldsShownOnManage)
- : filterCustomFields(data.customFields, [], 'exclude');
- }
-
- let key = tools.fromDbKey(view);
- data.template.template = form[key] || data.template.template;
- data.template.layout = form.layout || data.template.layout;
- data.formInputStyle = form.formInputStyle || '@import url(/subscription/form-input-style.css);';
-
- settings.list(['ua_code'], (err, configItems) => {
- if (err) {
- return callback(err);
- }
-
- data.uaCode = configItems.uaCode;
- data.customSubscriptionScripts = config.customsubscriptionscripts || [];
- callback(null, data);
- });
- });
-}
-
-function injectCustomFormTemplates(customFormId, templates, callback) {
- if (Number(customFormId) < 1) {
- return callback(null, templates);
- }
-
- forms.get(customFormId, (err, form) => {
- if (err) {
- return callback(null, templates);
- }
-
- let lookUp = name => {
- let key = tools.fromDbKey(
- /subscription\/([^.]*)/.exec(name)[1]
- );
- return form[key] || name;
- };
-
- Object.keys(templates).forEach(key => {
- let value = templates[key];
-
- if (typeof value === 'string') {
- templates[key] = lookUp(value);
- }
- if (typeof value === 'object' && value.template) {
- templates[key].template = lookUp(value.template);
- }
- if (typeof value === 'object' && value.layout) {
- templates[key].layout = lookUp(value.layout);
- }
- });
-
- callback(null, templates);
- });
-}
-
-function getMjmlTemplate(template, callback) {
- if (!template) {
- return callback(null, false);
- }
-
- let key = (typeof template === 'object') ? objectHash(template) : template;
-
- if (mjmlTemplates.has(key)) {
- return callback(null, mjmlTemplates.get(key));
- }
-
- let done = source => {
- let compiled;
- try {
- compiled = mjml.mjml2html(source);
- } catch (err) {
- return callback(err);
- }
- if (compiled.errors.length) {
- return callback(compiled.errors[0].message || compiled.errors[0]);
- }
- let renderer = hbs.handlebars.compile(compiled.html);
- mjmlTemplates.set(key, renderer);
- callback(null, renderer);
- };
-
- if (typeof template === 'object') {
- tools.mergeTemplateIntoLayout(template.template, template.layout, (err, source) => {
- if (err) {
- return callback(err);
- }
- done(source);
- });
- } else {
- fs.readFile(path.join(__dirname, '..', 'views', template), 'utf-8', (err, source) => {
- if (err) {
- return callback(err);
- }
- done(source);
- });
- }
-}
-
-function captureFlashMessages(req, res, callback) {
- res.render('subscription/capture-flash-messages', { layout: null }, (err, flash) => {
- if (err) {
- return callback(err);
- }
- callback(null, flash);
- });
-}
-
-function rollbackAndReleaseConnection(connection, callback) {
- connection.rollback(() => {
- connection.release();
- return callback();
- });
-}
diff --git a/lib/mailer.js b/lib/mailer.js
index 4ef5ad0a..b5eb38af 100644
--- a/lib/mailer.js
+++ b/lib/mailer.js
@@ -1,40 +1,17 @@
'use strict';
let log = require('npmlog');
-let config = require('config');
+
let nodemailer = require('nodemailer');
-let openpgpEncrypt = require('nodemailer-openpgp').openpgpEncrypt;
let settings = require('./models/settings');
-let tools = require('./tools');
-let db = require('./db');
let Handlebars = require('handlebars');
let fs = require('fs');
let path = require('path');
let templates = new Map();
-let htmlToText = require('html-to-text');
-let aws = require('aws-sdk');
-let objectHash = require('object-hash');
-let mjml = require('mjml');
-
-let _ = require('./translate')._;
-let util = require('util');
-
-Handlebars.registerHelper('translate', function (context, options) { // eslint-disable-line prefer-arrow-callback
- if (typeof options === 'undefined' && context) {
- options = context;
- context = false;
- }
-
- let result = _(options.fn(this)); // eslint-disable-line no-invalid-this
-
- if (Array.isArray(context)) {
- result = util.format(result, ...context);
- }
- return new Handlebars.SafeString(result);
-});
module.exports.transport = false;
+
module.exports.update = () => {
createMailer(() => false);
};
@@ -61,11 +38,6 @@ module.exports.sendMail = (mail, template, callback) => {
});
}
- if (!mail.headers) {
- mail.headers = {};
- }
- mail.headers['X-Sending-Zone'] = 'transactional';
-
getTemplate(template.html, (err, htmlRenderer) => {
if (err) {
return callback(err);
@@ -75,47 +47,16 @@ module.exports.sendMail = (mail, template, callback) => {
mail.html = htmlRenderer(template.data || {});
}
- tools.prepareHtml(mail.html, (err, prepareHtml) => {
+ getTemplate(template.text, (err, textRenderer) => {
if (err) {
- // ignore
+ return callback(err);
}
- if (prepareHtml) {
- mail.html = prepareHtml;
+ if (textRenderer) {
+ mail.text = textRenderer(template.data || {});
}
- getTemplate(template.text, (err, textRenderer) => {
- if (err) {
- return callback(err);
- }
-
- if (textRenderer) {
- mail.text = textRenderer(template.data || {});
- } else if (mail.html) {
- mail.text = htmlToText.fromString(mail.html, {
- wordwrap: 130
- });
- }
-
- let tryCount = 0;
- let trySend = () => {
- tryCount++;
-
- module.exports.transport.sendMail(mail, (err, info) => {
- if (err) {
- log.error('Mail', err);
- if (err.responseCode && err.responseCode >= 400 && err.responseCode < 500 && tryCount <= 5) {
- // temporary error, try again
- log.verbose('Mail', 'Retrying after %s sec. ...', tryCount);
- return setTimeout(trySend, tryCount * 1000);
- }
- return callback(err);
- }
- return callback(null, info);
- });
- };
- setImmediate(trySend);
- });
+ module.exports.transport.sendMail(mail, callback);
});
});
@@ -126,171 +67,46 @@ function getTemplate(template, callback) {
return callback(null, false);
}
- let key = (typeof template === 'object') ? objectHash(template) : template;
-
- if (templates.has(key)) {
- return callback(null, templates.get(key));
+ if (templates.has(template)) {
+ return callback(null, templates.get(template));
}
- let done = (source, isMjml = false) => {
- if (isMjml) {
- let compiled;
- try {
- compiled = mjml.mjml2html(source);
- } catch (err) {
- return callback(err);
- }
- if (compiled.errors.length) {
- return callback(compiled.errors[0].message || compiled.errors[0]);
- }
- source = compiled.html;
- }
- let renderer = Handlebars.compile(source);
- templates.set(key, renderer);
- callback(null, renderer);
- };
-
- if (typeof template === 'object') {
- tools.mergeTemplateIntoLayout(template.template, template.layout, (err, source) => {
- if (err) {
- return callback(err);
- }
- let isMjml = template.type === 'mjml';
- done(source, isMjml);
- });
- } else {
- fs.readFile(path.join(__dirname, '..', 'views', template), 'utf-8', (err, source) => {
- if (err) {
- return callback(err);
- }
- done(source);
- });
- }
-}
-
-function createMailer(callback) {
- settings.list(['smtpHostname', 'smtpPort', 'smtpEncryption', 'smtpUser', 'smtpPass', 'smtpLog', 'smtpDisableAuth', 'smtpMaxConnections', 'smtpMaxMessages', 'smtpSelfSigned', 'pgpPrivateKey', 'pgpPassphrase', 'smtpThrottling', 'mailTransport', 'sesKey', 'sesSecret', 'sesRegion'], (err, configItems) => {
+ fs.readFile(path.join(__dirname, '..', 'views', template), 'utf-8', (err, source) => {
if (err) {
return callback(err);
}
+ let renderer = Handlebars.compile(source);
+ templates.set(template, renderer);
+ return callback(null, renderer);
+ });
+}
- let oldListeners = [];
- if (module.exports.transport) {
- oldListeners = module.exports.transport.listeners('idle');
- module.exports.transport.removeAllListeners('idle');
- module.exports.transport.removeAllListeners('stream');
- module.exports.transport.checkThrottling = null;
+function createMailer(callback) {
+ settings.list(['smtpHostname', 'smtpPort', 'smtpEncryption', 'smtpUser', 'smtpPass', 'smtpLog', 'smtpMaxConnections', 'smtpMaxMessages'], (err, configItems) => {
+ if (err) {
+ return callback(err);
}
-
- let sendingRate = Number(configItems.smtpThrottling) || 0;
- if (sendingRate) {
- // convert to messages/second
- sendingRate = sendingRate / 3600;
- }
-
- let transportOptions;
-
- let logfunc = function () {
- let args = [].slice.call(arguments);
- let level = args.shift();
- args.shift();
- args.unshift('Mail');
- log[level](...args);
- };
-
- if (configItems.mailTransport === 'smtp' || !configItems.mailTransport) {
- transportOptions = {
- pool: true,
- host: configItems.smtpHostname,
- port: Number(configItems.smtpPort) || false,
- secure: configItems.smtpEncryption === 'TLS',
- ignoreTLS: configItems.smtpEncryption === 'NONE',
- auth: configItems.smtpDisableAuth ? false : {
- user: configItems.smtpUser,
- pass: configItems.smtpPass
- },
- debug: !!configItems.smtpLog,
- logger: !configItems.smtpLog ? false : {
- debug: logfunc.bind(null, 'verbose'),
- info: logfunc.bind(null, 'info'),
- error: logfunc.bind(null, 'error')
- },
- maxConnections: Number(configItems.smtpMaxConnections),
- maxMessages: Number(configItems.smtpMaxMessages),
- tls: {
- rejectUnauthorized: !configItems.smtpSelfSigned
- }
- };
- } else if (configItems.mailTransport === 'ses') {
- transportOptions = {
- SES: new aws.SES({
- apiVersion: '2010-12-01',
- accessKeyId: configItems.sesKey,
- secretAccessKey: configItems.sesSecret,
- region: configItems.sesRegion
- }),
- debug: !!configItems.smtpLog,
- logger: !configItems.smtpLog ? false : {
- debug: logfunc.bind(null, 'verbose'),
- info: logfunc.bind(null, 'info'),
- error: logfunc.bind(null, 'error')
- },
- maxConnections: Number(configItems.smtpMaxConnections),
- sendingRate,
- tls: {
- rejectUnauthorized: !configItems.smtpSelfSigned
- }
- };
- } else {
- return callback(new Error(_('Invalid mail transport')));
- }
-
- module.exports.transport = nodemailer.createTransport(transportOptions, config.nodemailer);
-
- module.exports.transport.use('stream', openpgpEncrypt({
- signingKey: configItems.pgpPrivateKey,
- passphrase: configItems.pgpPassphrase
- }));
-
- if (oldListeners.length) {
- log.info('Mail', 'Reattaching %s idle listeners', oldListeners.length);
- oldListeners.forEach(listener => module.exports.transport.on('idle', listener));
- }
-
-
- if (configItems.mailTransport === 'smtp' || !configItems.mailTransport) {
-
- let throttling = Number(configItems.smtpThrottling) || 0;
- if (throttling) {
- throttling = 1 / (throttling / (3600 * 1000));
- }
-
- let lastCheck = Date.now();
-
- module.exports.transport.checkThrottling = function (next) {
- if (!throttling) {
- return next();
- }
- let nextCheck = Date.now();
- let checkDiff = (nextCheck - lastCheck);
- if (checkDiff < throttling) {
- log.verbose('Mail', 'Throttling next message in %s sec.', (throttling - checkDiff) / 1000);
- setTimeout(() => {
- lastCheck = Date.now();
- next();
- }, throttling - checkDiff);
- } else {
- lastCheck = nextCheck;
- next();
- }
- };
- } else {
- module.exports.transport.checkThrottling = next => next();
- }
-
- db.clearCache('sender', () => {
- callback(null, module.exports.transport);
+ module.exports.transport = nodemailer.createTransport({
+ pool: true,
+ host: configItems.smtpHostname,
+ port: Number(configItems.smtpPort) || false,
+ secure: configItems.smtpEncryption === 'TLS',
+ ignoreTLS: configItems.smtpEncryption === 'NONE',
+ auth: {
+ user: configItems.smtpUser,
+ pass: configItems.smtpPass
+ },
+ debug: !!configItems.smtpLog,
+ logger: !configItems.smtpLog ? false : {
+ debug: log.info.bind(log, 'Mail'),
+ info: log.verbose.bind(log, 'Mail'),
+ error: log.info.bind(log, 'Mail')
+ },
+ maxConnections: Number(configItems.smtpMaxConnections),
+ maxMessages: Number(configItems.smtpMaxMessages)
});
+
+ return callback(null, module.exports.transport);
});
}
diff --git a/lib/models/blacklist.js b/lib/models/blacklist.js
deleted file mode 100644
index 5aae8ccc..00000000
--- a/lib/models/blacklist.js
+++ /dev/null
@@ -1,86 +0,0 @@
-'use strict';
-
-let db = require('../db');
-
-module.exports.get = (start, limit, search, callback) => {
- db.getConnection((err, connection) => {
- if (err) {
- return callback(err);
- }
- search = '%' + search + '%';
- connection.query('SELECT SQL_CALC_FOUND_ROWS `email` FROM blacklist WHERE `email` LIKE ? ORDER BY `email` LIMIT ? OFFSET ?', [search, limit, start], (err, rows) => {
- if (err) {
- return callback(err);
- }
-
- connection.query('SELECT FOUND_ROWS() AS total', (err, total) => {
- connection.release();
- if (err) {
- return callback(err);
- }
- let emails = [];
- rows.forEach(email => {
- emails.push(email.email);
- });
- return callback(null, emails, total && total[0] && total[0].total);
- });
- });
- });
-};
-
-module.exports.add = (email, callback) => {
- db.getConnection((err, connection) => {
- if (err) {
- return callback(err);
- }
-
- connection.query('INSERT IGNORE INTO `blacklist` (`email`) VALUES(?)', email, err => {
- if (err) {
- return callback(err);
- }
-
- connection.release();
- return callback(null, null);
-
- });
- });
-};
-
-module.exports.delete = (email, callback) => {
- db.getConnection((err, connection) => {
- if (err) {
- return callback(err);
- }
-
- connection.query('DELETE FROM `blacklist` WHERE `email`=?', email, err => {
- if (err) {
- return callback(err);
- }
-
- connection.release();
- return callback(null, null);
-
- });
- });
-};
-
-module.exports.isblacklisted = (email, callback) => {
- db.getConnection((err, connection) => {
- if (err) {
- return callback(err);
- }
-
- connection.query('SELECT `email` FROM blacklist WHERE `email`=?', email, (err, rows) => {
- if (err) {
- return callback(err);
- }
-
- connection.release();
- if (rows.length > 0) {
- return callback(null, true);
- } else {
- return callback(null, false);
- }
- });
- });
-};
diff --git a/lib/models/campaigns.js b/lib/models/campaigns.js
index 2db3a8d8..92b55fac 100644
--- a/lib/models/campaigns.js
+++ b/lib/models/campaigns.js
@@ -5,104 +5,36 @@ let db = require('../db');
let lists = require('./lists');
let templates = require('./templates');
let segments = require('./segments');
-let subscriptions = require('./subscriptions');
let shortid = require('shortid');
-let isUrl = require('is-url');
-let feed = require('../feed');
-let log = require('npmlog');
-let mailer = require('../mailer');
-let humanize = require('humanize');
-let _ = require('../translate')._;
-let util = require('util');
-let tableHelpers = require('../table-helpers');
-let allowedKeys = ['description', 'from', 'address', 'reply_to', 'subject', 'editor_name', 'editor_data', 'template', 'source_url', 'list', 'segment', 'html', 'text', 'click_tracking_disabled', 'open_tracking_disabled', 'unsubscribe'];
+let allowedKeys = ['description', 'from', 'address', 'subject', 'template', 'list', 'segment', 'html', 'text'];
module.exports.list = (start, limit, callback) => {
- tableHelpers.list('campaigns', ['*'], 'scheduled', null, start, limit, callback);
-};
-
-module.exports.filter = (request, parent, callback) => {
- let queryData;
- if (parent) {
- queryData = {
- // only find normal and RSS parent campaigns at this point
- where: '`parent`=?',
- values: [parent]
- };
- } else {
- queryData = {
- // only find normal and RSS parent campaigns at this point
- where: '`type` IN (?,?,?)',
- values: [1, 2, 4]
- };
- }
-
- tableHelpers.filter('campaigns', ['*'], request, ['#', 'name', 'description', 'status', 'created'], ['name'], 'created DESC', queryData, callback);
-};
-
-module.exports.filterQuicklist = (request, callback) => {
- tableHelpers.filter('campaigns', ['id', 'name', 'description', 'created'], request, ['#', 'name', 'description', 'created'], ['name'], 'name ASC', null, callback);
-};
-
-module.exports.filterClickedSubscribers = (campaign, linkId, request, columns, callback) => {
- let queryData = {
- where: 'campaign_tracker__' + campaign.id + '.list=? AND campaign_tracker__' + campaign.id + '.link=?',
- values: [campaign.list, linkId]
- };
-
- tableHelpers.filter('subscription__' + campaign.list + ' JOIN campaign_tracker__' + campaign.id + ' ON campaign_tracker__' + campaign.id + '.subscriber=subscription__' + campaign.list + '.id', ['*'], request, columns, ['email', 'first_name', 'last_name'], 'email ASC', queryData, callback);
-};
-
-module.exports.statsClickedSubscribersByColumn = (campaign, linkId, request, column, limit, callback) => {
db.getConnection((err, connection) => {
if (err) {
return callback(err);
}
- let query_template = 'SELECT ?? AS data, COUNT(*) AS cnt FROM `subscription__%d` JOIN `campaign_tracker__%d` ON `campaign_tracker__%d`.`list`=%d AND `campaign_tracker__%d`.`subscriber`=`subscription__%d`.`id` AND `campaign_tracker__%d`.`link`=%d GROUP BY ?? ORDER BY COUNT(??) DESC, ??';
- let query = util.format(query_template, campaign.list, campaign.id, campaign.id, campaign.list, campaign.id, campaign.list, campaign.id, linkId);
-
- connection.query(query, [column, column, column, column], (err, rows) => {
- connection.release();
+ connection.query('SELECT SQL_CALC_FOUND_ROWS * FROM campaigns ORDER BY name LIMIT ? OFFSET ?', [limit, start], (err, rows) => {
if (err) {
+ connection.release();
return callback(err);
}
-
- let data = {};
- let dataList = [];
- let total = 0;
-
- rows.forEach((row, index) => {
- if (index < limit) {
- data[row.data] = row.cnt;
- } else {
- data.other = (data.other ? data.other : 0) + row.cnt;
+ connection.query('SELECT FOUND_ROWS() AS total', (err, total) => {
+ connection.release();
+ if (err) {
+ return callback(err);
}
- total += row.cnt;
+ return callback(null, rows, total && total[0] && total[0].total);
});
- Object.keys(data).forEach(key => {
- let name = key + ': ' + data[key];
- dataList.push([name, data[key]]);
- });
- return callback(null, dataList, total);
});
});
};
-module.exports.filterStatusSubscribers = (campaign, status, request, columns, callback) => {
- let queryData = {
- where: 'campaign__' + campaign.id + '.list=? AND campaign__' + campaign.id + '.segment=? AND campaign__' + campaign.id + '.status=?',
- values: [campaign.list, campaign.segment && campaign.segment.id || 0, status]
- };
-
- tableHelpers.filter('subscription__' + campaign.list + ' JOIN campaign__' + campaign.id + ' ON campaign__' + campaign.id + '.subscription=subscription__' + campaign.list + '.id', ['*'], request, columns, ['email', 'first_name', 'last_name'], 'email ASC', queryData, callback);
-};
-
module.exports.getByCid = (cid, callback) => {
cid = (cid || '').toString().trim();
if (!cid) {
- return callback(new Error(_('Missing Campaign ID')));
+ return callback(new Error('Missing Campaign ID'));
}
db.getConnection((err, connection) => {
if (err) {
@@ -129,7 +61,7 @@ module.exports.get = (id, withSegment, callback) => {
id = Number(id) || 0;
if (id < 1) {
- return callback(new Error(_('Missing Campaign ID')));
+ return callback(new Error('Missing Campaign ID'));
}
db.getConnection((err, connection) => {
@@ -149,243 +81,34 @@ module.exports.get = (id, withSegment, callback) => {
let campaign = tools.convertKeys(rows[0]);
- let handleSegment = () => {
-
- if (!campaign.segment || !withSegment) {
- return callback(null, campaign);
- } else {
- segments.get(campaign.segment, (err, segment) => {
- if (err || !segment) {
- // ignore
- return callback(null, campaign);
- }
- segments.subscribers(segment.id, true, (err, subscribers) => {
- if (err || !subscribers) {
- segment.subscribers = 0;
- } else {
- segment.subscribers = subscribers;
- }
- campaign.segment = segment;
- return callback(null, campaign);
- });
- });
- }
- };
-
- if (!campaign.parent) {
- return handleSegment();
- }
-
- db.getConnection((err, connection) => {
- if (err) {
- return callback(err);
- }
- connection.query('SELECT `id`, `cid`, `name` FROM campaigns WHERE id=?', [campaign.parent], (err, rows) => {
- connection.release();
- if (err) {
- return callback(err);
- }
-
- if (!rows || !rows.length) {
- return handleSegment();
- }
-
- campaign.parent = tools.convertKeys(rows[0]);
- return handleSegment();
- });
- });
- });
- });
-};
-
-module.exports.getAttachments = (campaign, callback) => {
- campaign = Number(campaign) || 0;
-
- if (campaign < 1) {
- return callback(new Error(_('Missing Campaign ID')));
- }
-
- db.getConnection((err, connection) => {
- if (err) {
- return callback(err);
- }
-
- let keys = ['id', 'filename', 'content_type', 'size', 'created'];
-
- connection.query('SELECT `' + keys.join('`, `') + '` FROM `attachments` WHERE `campaign`=?', [campaign], (err, rows) => {
- connection.release();
- if (err) {
- return callback(err);
- }
-
- if (!rows || !rows.length) {
- return callback(null, []);
- }
-
- let attachments = rows.map((row, i) => {
- row = tools.convertKeys(row);
- row.index = i + 1;
- row.size = humanize.filesize(Number(row.size) || 0);
- return row;
- });
- return callback(null, attachments);
- });
- });
-};
-
-module.exports.addAttachment = (id, attachment, callback) => {
-
- let size = attachment.content ? attachment.content.length : 0;
-
- if (!size) {
- return callback(new Error(_('Emtpy or too large attahcment')));
- }
- db.getConnection((err, connection) => {
- if (err) {
- return callback(err);
- }
-
- let keys = ['campaign', 'size'];
- let values = [id, size];
-
- Object.keys(attachment).forEach(key => {
- let value;
- if (Buffer.isBuffer(attachment[key])) {
- value = attachment[key];
+ if (!campaign.segment || !withSegment) {
+ return callback(null, campaign);
} else {
- value = typeof attachment[key] === 'number' ? attachment[key] : (attachment[key] || '').toString().trim();
+ segments.get(campaign.segment, (err, segment) => {
+ if (err || !segment) {
+ // ignore
+ return callback(null, campaign);
+ }
+ segments.subscribers(segment.id, true, (err, subscribers) => {
+ if (err || !subscribers) {
+ segment.subscribers = 0;
+ } else {
+ segment.subscribers = subscribers;
+ }
+ campaign.segment = segment;
+ return callback(null, campaign);
+ });
+ });
}
-
- key = tools.toDbKey(key);
- keys.push(key);
- values.push(value);
- });
-
- let query = 'INSERT INTO `attachments` (`' + keys.join('`, `') + '`) VALUES (' + values.map(() => '?').join(',') + ')';
- connection.query(query, values, (err, result) => {
- connection.release();
- if (err) {
- return callback(err);
- }
-
- let attachmentId = result && result.insertId || false;
- return callback(null, attachmentId);
});
});
};
-module.exports.deleteAttachment = (id, attachment, callback) => {
- db.getConnection((err, connection) => {
- if (err) {
- return callback(err);
- }
-
- let query = 'DELETE FROM `attachments` WHERE `id`=? AND `campaign`=? LIMIT 1';
- connection.query(query, [attachment, id], (err, result) => {
- connection.release();
- if (err) {
- return callback(err);
- }
-
- let deleted = result && result.affectedRows || false;
- return callback(null, deleted);
- });
- });
-};
-
-module.exports.getAttachment = (campaign, attachment, callback) => {
- db.getConnection((err, connection) => {
- if (err) {
- return callback(err);
- }
-
- let query = 'SELECT * FROM `attachments` WHERE `id`=? AND `campaign`=? LIMIT 1';
- connection.query(query, [attachment, campaign], (err, rows) => {
- connection.release();
- if (err) {
- return callback(err);
- }
- if (!rows || !rows.length) {
- return callback(null, false);
- }
-
- let attachment = tools.convertKeys(rows[0]);
- return callback(null, attachment);
- });
- });
-};
-
-module.exports.getLinks = (id, linkId, callback) => {
- if (!callback && typeof linkId === 'function') {
- callback = linkId;
- linkId = false;
- }
-
- id = Number(id) || 0;
- linkId = Number(linkId) || 0;
-
- if (id < 1) {
- return callback(new Error(_('Missing Campaign ID')));
- }
-
- db.getConnection((err, connection) => {
- if (err) {
- return callback(err);
- }
-
- let query;
- let values;
-
- if (!linkId) {
- query = 'SELECT `id`, `url`, `clicks` FROM links WHERE `campaign`=? LIMIT 1000';
- values = [id];
- } else {
- query = 'SELECT `id`, `url`, `clicks` FROM links WHERE `id`=? AND `campaign`=? LIMIT 1';
- values = [linkId, id];
- }
-
- connection.query(query, values, (err, rows) => {
- connection.release();
- if (err) {
- return callback(err);
- }
-
- if (!rows || !rows.length) {
- return callback(null, []);
- }
-
- let links = rows.map(
- row => tools.convertKeys(row)
- ).sort((a, b) => (
- a.url.replace(/^https?:\/\/(www.)?/, '').toLowerCase()).localeCompare(b.url.replace(/^https?:\/\/(www.)?/, '').toLowerCase()));
-
- return callback(null, links);
- });
-
- });
-};
-
-module.exports.duplicate = (id, callback) => module.exports.get(id, true, (err, campaign) => {
- if (err) {
- return callback(err);
- }
- if (!campaign) {
- return callback(new Error(_('Campaign does not exist')));
- }
- campaign.name = campaign.name + ' Copy';
- return module.exports.create(campaign, false, callback);
-});
-
-module.exports.create = (campaign, opts, callback) => {
+module.exports.create = (campaign, callback) => {
campaign = tools.convertKeys(campaign);
let name = (campaign.name || '').toString().trim();
- campaign.openTrackingDisabled = campaign.openTrackingDisabled ? 1 : 0;
- campaign.clickTrackingDisabled = campaign.clickTrackingDisabled ? 1 : 0;
-
- opts = opts || {};
-
if (/^\d+:\d+$/.test(campaign.list)) {
campaign.segment = Number(campaign.list.split(':').pop());
campaign.list = Number(campaign.list.split(':').shift());
@@ -394,80 +117,27 @@ module.exports.create = (campaign, opts, callback) => {
campaign.segment = 0;
}
- switch ((campaign.type || '').toString().trim().toLowerCase()) {
- case 'triggered':
- campaign.type = 4;
- break;
- case 'rss':
- campaign.type = 2;
- break;
- case 'entry':
- if (opts.parent) {
- campaign.type = 3;
- } else {
- campaign.type = 1;
- }
- break;
- case 'normal':
- default:
- campaign.type = 1;
- }
-
campaign.template = Number(campaign.template) || 0;
if (!name) {
- return callback(new Error(_('Campaign Name must be set')));
+ return callback(new Error('Campaign Name must be set'));
}
- if (campaign.type === 2 && (!campaign.sourceUrl || !isUrl(campaign.sourceUrl))) {
- return callback(new Error(_('RSS URL must be set and needs to be a valid URL')));
- }
-
- let getList = (listId, callback) => {
- if (campaign.type === 4) {
- return callback(null, false);
- }
-
- lists.get(listId, (err, list) => {
- if (err) {
- return callback(err);
- }
- return callback(null, list || {
- id: listId
- });
- });
- };
-
- getList(campaign.list, err => {
+ lists.get(campaign.list, (err, list) => {
if (err) {
return callback(err);
}
-
- let keys = ['name', 'type'];
- let values = [name, campaign.type];
-
- if (campaign.type === 2) {
- keys.push('status');
- values.push(5); // inactive
+ if (!list) {
+ return callback(new Error('Selected list not found'));
}
- if (campaign.type === 3) {
- keys.push('status', 'parent');
- values.push(2, opts.parent);
- }
+ let keys = ['name'];
+ let values = [name];
- if (campaign.type === 4) {
- keys.push('status');
- values.push(6); // active
- }
-
- let create = next => {
+ let create = () => {
Object.keys(campaign).forEach(key => {
let value = typeof campaign[key] === 'number' ? campaign[key] : (campaign[key] || '').toString().trim();
key = tools.toDbKey(key);
- if (key === 'description') {
- value = tools.purifyHTML(value);
- }
if (allowedKeys.indexOf(key) >= 0 && keys.indexOf(key) < 0) {
keys.push(key);
values.push(value);
@@ -478,117 +148,52 @@ module.exports.create = (campaign, opts, callback) => {
keys.push('cid');
values.push(cid);
- tools.prepareHtml(campaign.html, (err, preparedHtml) => {
+ db.getConnection((err, connection) => {
if (err) {
- log.error('jsdom', err);
+ return callback(err);
}
- if (!preparedHtml) {
- preparedHtml = campaign.html;
- }
-
- keys.push('html_prepared');
- values.push(preparedHtml);
-
- db.getConnection((err, connection) => {
+ let query = 'INSERT INTO campaigns (`' + keys.join('`, `') + '`) VALUES (' + values.map(() => '?').join(',') + ')';
+ connection.query(query, values, (err, result) => {
+ connection.release();
if (err) {
- return next(err);
+ return callback(err);
}
- let query = 'INSERT INTO campaigns (`' + keys.join('`, `') + '`) VALUES (' + values.map(() => '?').join(',') + ')';
- connection.query(query, values, (err, result) => {
- connection.release();
+ let campaignId = result && result.insertId || false;
+ if (!campaignId) {
+ return callback(null, false);
+ }
+
+ // we are going to aqcuire a lot of log info, so we are putting
+ // sending logs into separate tables
+ createCampaignTables(campaignId, err => {
if (err) {
- return next(err);
+ // FIXME: rollback
+ return callback(err);
}
-
- let campaignId = result && result.insertId || false;
- if (!campaignId) {
- return next(null, false);
- }
-
- // we are going to aqcuire a lot of log info, so we are putting
- // sending logs into separate tables
- createCampaignTables(campaignId, err => {
- if (err) {
- // FIXME: rollback
- return next(err);
- }
- return next(null, campaignId);
- });
+ return callback(null, campaignId);
});
});
});
};
- if (campaign.type === 2) {
- feed.fetch(campaign.sourceUrl, (err, entries) => {
- if (err) {
- return callback(err);
- }
-
- mailer.getTemplate('emails/rss-html.hbs', (err, rendererHtml) => {
- if (err) {
- return callback(err);
- }
-
- campaign.html = rendererHtml();
-
- create((err, campaignId) => {
- if (err) {
- return callback(err);
- }
- if (!campaignId || !entries.length) {
- return callback(null, campaignId);
- }
-
- db.getConnection((err, connection) => {
- if (err) {
- return callback(err);
- }
-
- // store references to already existing feed entries
- // this is needed to detect new entries
- let query = 'INSERT IGNORE INTO `rss` (`parent`,`guid`,`pubdate`) VALUES ' + entries.map(() => '(?,?,?)').join(',');
-
- values = [];
- entries.forEach(entry => {
- values.push(campaignId, entry.guid, entry.date);
- });
-
- connection.query(query, values, err => {
- connection.release();
- if (err) {
- // too late to report as failed
- log.error('RSS', err);
- }
-
- return callback(null, campaignId);
- });
- });
- });
- });
- });
- return;
- } else if (campaign.template) {
+ if (campaign.template) {
templates.get(campaign.template, (err, template) => {
if (err) {
return callback(err);
}
if (!template) {
- return callback(new Error(_('Selected template not found')));
+ return callback(new Error('Selected template not found'));
}
- campaign.editorName = template.editorName;
- campaign.editorData = template.editorData;
- campaign.html = template.html;
- campaign.text = template.text;
+ keys = keys.concat(['html', 'text']);
+ values = values.concat([template.html, template.text]);
- create(callback);
+ create();
});
- return;
} else {
- return create(callback);
+ create();
}
});
};
@@ -598,17 +203,14 @@ module.exports.update = (id, updates, callback) => {
id = Number(id) || 0;
if (id < 1) {
- return callback(new Error(_('Missing Campaign ID')));
+ return callback(new Error('Missing Campaign ID'));
}
let campaign = tools.convertKeys(updates);
let name = (campaign.name || '').toString().trim();
- campaign.openTrackingDisabled = campaign.openTrackingDisabled ? 1 : 0;
- campaign.clickTrackingDisabled = campaign.clickTrackingDisabled ? 1 : 0;
-
if (!name) {
- return callback(new Error(_('Campaign Name must be set')));
+ return callback(new Error('Campaign Name must be set'));
}
if (/^\d+:\d+$/.test(campaign.list)) {
@@ -619,21 +221,13 @@ module.exports.update = (id, updates, callback) => {
campaign.segment = 0;
}
- let getList = (listId, callback) => {
- lists.get(listId, (err, list) => {
- if (err) {
- return callback(err);
- }
- return callback(null, list || {
- id: listId
- });
- });
- };
-
- getList(campaign.list, err => {
+ lists.get(campaign.list, (err, list) => {
if (err) {
return callback(err);
}
+ if (!list) {
+ return callback(new Error('Selected list not found'));
+ }
let keys = ['name'];
let values = [name];
@@ -641,87 +235,25 @@ module.exports.update = (id, updates, callback) => {
Object.keys(campaign).forEach(key => {
let value = typeof campaign[key] === 'number' ? campaign[key] : (campaign[key] || '').toString().trim();
key = tools.toDbKey(key);
- if (key === 'description') {
- value = tools.purifyHTML(value);
- }
if (allowedKeys.indexOf(key) >= 0 && keys.indexOf(key) < 0) {
keys.push(key);
values.push(value);
}
});
- tools.prepareHtml(campaign.html, (err, preparedHtml) => {
+ db.getConnection((err, connection) => {
if (err) {
- log.error('jsdom', err);
+ return callback(err);
}
- if (!preparedHtml) {
- preparedHtml = campaign.html;
- }
+ values.push(id);
- keys.push('html_prepared');
- values.push(preparedHtml);
-
- db.getConnection((err, connection) => {
+ connection.query('UPDATE campaigns SET ' + keys.map(key => '`' + key + '`=?').join(', ') + ' WHERE id=? LIMIT 1', values, (err, result) => {
+ connection.release();
if (err) {
return callback(err);
}
-
- values.push(id);
-
- connection.query('UPDATE campaigns SET ' + keys.map(key => '`' + key + '`=?').join(', ') + ' WHERE id=? LIMIT 1', values, (err, result) => {
- if (err) {
- connection.release();
- return callback(err);
- }
- let affected = result && result.affectedRows || false;
-
- if (!affected) {
- connection.release();
- return callback(null, affected);
- }
-
- connection.query('SELECT `type`, `source_url` FROM campaigns WHERE id=? LIMIT 1', [id], (err, rows) => {
- connection.release();
- if (err) {
- return callback(err);
- }
-
- if (!rows || !rows[0] || rows[0].type !== 2) {
- // if not RSS, then nothing to do here
- return callback(null, affected);
- }
-
- // update seen rss entries to avoid sending old entries to subscribers
- feed.fetch(rows[0].source_url, (err, entries) => {
- if (err) {
- return callback(err);
- }
-
- db.getConnection((err, connection) => {
- if (err) {
- return callback(err);
- }
-
- let query = 'INSERT IGNORE INTO `rss` (`parent`,`guid`,`pubdate`) VALUES ' + entries.map(() => '(?,?,?)').join(',');
-
- values = [];
- entries.forEach(entry => {
- values.push(id, entry.guid, entry.date);
- });
-
- connection.query(query, values, err => {
- connection.release();
- if (err) {
- // too late to report as failed
- log.error('RSS', err);
- }
- return callback(null, affected);
- });
- });
- });
- });
- });
+ return callback(null, result && result.affectedRows || false);
});
});
});
@@ -731,7 +263,7 @@ module.exports.delete = (id, callback) => {
id = Number(id) || 0;
if (id < 1) {
- return callback(new Error(_('Missing Campaign ID')));
+ return callback(new Error('Missing Campaign ID'));
}
db.getConnection((err, connection) => {
@@ -740,26 +272,31 @@ module.exports.delete = (id, callback) => {
}
connection.query('DELETE FROM campaigns WHERE id=? LIMIT 1', [id], (err, result) => {
- connection.release();
if (err) {
+ connection.release();
return callback(err);
}
let affected = result && result.affectedRows || 0;
- removeCampaignTables(id, err => {
+
+ connection.query('DELETE FROM links WHERE campaign=?', [id], err => {
+ connection.release();
if (err) {
return callback(err);
}
- db.clearCache('sender', () => {
- callback(null, affected);
+ removeCampaignTables(id, err => {
+ if (err) {
+ return callback(err);
+ }
+ return callback(null, affected);
});
});
});
});
};
-module.exports.send = (id, scheduled, callback) => {
+module.exports.send = (id, callback) => {
module.exports.get(id, false, (err, campaign) => {
if (err) {
return callback(err);
@@ -774,18 +311,8 @@ module.exports.send = (id, scheduled, callback) => {
return callback(err);
}
- let query;
- let values;
- if (scheduled) {
- query = 'UPDATE campaigns SET `status`=2, `scheduled`=?, `status_change`=NOW() WHERE id=? LIMIT 1';
- values = [scheduled, id];
- } else {
- query = 'UPDATE campaigns SET `status`=2, `status_change`=NOW() WHERE id=? LIMIT 1';
- values = [id];
- }
-
// campaigns marked as status=2 should be picked up by the sending processes
- connection.query(query, values, err => {
+ connection.query('UPDATE campaigns SET `status`=2, `status_change`=NOW() WHERE id=? LIMIT 1', [id], err => {
connection.release();
if (err) {
return callback(err);
@@ -813,13 +340,11 @@ module.exports.pause = (id, callback) => {
// campaigns marked as status=4 are paused
connection.query('UPDATE campaigns SET `status`=4, `status_change`=NOW() WHERE id=? LIMIT 1', [id], err => {
- connection.release();
if (err) {
+ connection.release();
return callback(err);
}
- db.clearCache('sender', () => {
- callback(null, true);
- });
+ return callback(null, true);
});
});
});
@@ -831,7 +356,7 @@ module.exports.reset = (id, callback) => {
return callback(err);
}
- if (campaign.status !== 3 && campaign.status !== 4 && !(campaign.status === 2 && campaign.scheduled > new Date())) {
+ if (campaign.status !== 3) {
return callback(null, false);
}
@@ -840,30 +365,27 @@ module.exports.reset = (id, callback) => {
return callback(err);
}
- connection.query('UPDATE campaigns SET `status`=1, `status_change`=NULL, `delivered`=0, `opened`=0, `clicks`=0, `bounced`=0, `complained`=0, `unsubscribed`=0, `blacklisted`=0 WHERE id=? LIMIT 1', [id], err => {
+ connection.query('UPDATE campaigns SET `status`=1, `status_change`=NULL, `delivered`=0, `opened`=0, `clicks`=0, `bounced`=0, `complained`=0, `unsubscribed`=0 WHERE id=? LIMIT 1', [id], err => {
if (err) {
connection.release();
return callback(err);
}
-
- db.clearCache('sender', () => {
- connection.query('UPDATE links SET `clicks`=0 WHERE campaign=?', [id], err => {
+ connection.query('DELETE FROM links WHERE campaign=?', [id], err => {
+ if (err) {
+ connection.release();
+ return callback(err);
+ }
+ connection.query('TRUNCATE TABLE `campaign__' + id + '`', [id], err => {
if (err) {
connection.release();
return callback(err);
}
- connection.query('TRUNCATE TABLE `campaign__' + id + '`', [id], err => {
+ connection.query('TRUNCATE TABLE `campaign_tracker__' + id + '`', [id], err => {
+ connection.release();
if (err) {
- connection.release();
return callback(err);
}
- connection.query('TRUNCATE TABLE `campaign_tracker__' + id + '`', [id], err => {
- connection.release();
- if (err) {
- return callback(err);
- }
- return callback(null, true);
- });
+ return callback(null, true);
});
});
});
@@ -872,67 +394,13 @@ module.exports.reset = (id, callback) => {
});
};
-module.exports.activate = (id, callback) => {
- module.exports.get(id, false, (err, campaign) => {
- if (err) {
- return callback(err);
- }
-
- if (campaign.status !== 5) {
- return callback(null, false);
- }
-
- db.getConnection((err, connection) => {
- if (err) {
- return callback(err);
- }
-
- // campaigns marked as status=5 are paused
- connection.query('UPDATE campaigns SET `status`=6, `status_change`=NOW() WHERE id=? LIMIT 1', [id], err => {
- connection.release();
- if (err) {
- return callback(err);
- }
- return callback(null, true);
- });
- });
- });
-};
-
-module.exports.inactivate = (id, callback) => {
- module.exports.get(id, false, (err, campaign) => {
- if (err) {
- return callback(err);
- }
-
- if (campaign.status !== 6) {
- return callback(null, false);
- }
-
- db.getConnection((err, connection) => {
- if (err) {
- return callback(err);
- }
-
- // campaigns marked as status=6 are paused
- connection.query('UPDATE campaigns SET `status`=5, `status_change`=NOW() WHERE id=? LIMIT 1', [id], err => {
- connection.release();
- if (err) {
- return callback(err);
- }
- return callback(null, true);
- });
- });
- });
-};
-
module.exports.getMail = (campaignId, listId, subscriptionId, callback) => {
campaignId = Number(campaignId) || 0;
listId = Number(listId) || 0;
subscriptionId = Number(subscriptionId) || 0;
if (campaignId < 1 || listId < 1 || subscriptionId < 1) {
- return callback(new Error(_('Invalid or missing message ID')));
+ return callback(new Error('Invalid or missing message ID'));
}
db.getConnection((err, connection) => {
@@ -956,13 +424,13 @@ module.exports.getMail = (campaignId, listId, subscriptionId, callback) => {
});
};
-module.exports.findMailByResponse = (responseId, callback) => {
+module.exports.findMail = (responseId, callback) => {
db.getConnection((err, connection) => {
if (err) {
return callback(err);
}
- connection.query('SELECT id FROM campaigns ORDER BY id DESC', [], (err, campaignList) => {
+ connection.query('SELECT id FROM campaigns', [], (err, campaignList) => {
if (err) {
connection.release();
return callback(err);
@@ -998,123 +466,6 @@ module.exports.findMailByResponse = (responseId, callback) => {
});
};
-module.exports.findMailByCampaign = (campaignHeader, callback) => {
- if (!campaignHeader) {
- return callback(null, false);
- }
-
- let parts = campaignHeader.split('.');
- let cCid = parts.shift();
- let sCid = parts.pop();
-
- db.getConnection((err, connection) => {
- if (err) {
- return callback(err);
- }
- let query = 'SELECT `id`, `list`, `segment` FROM `campaigns` WHERE `cid`=? LIMIT 1';
- connection.query(query, [cCid], (err, rows) => {
- if (err) {
- connection.release();
- return callback(err);
- }
- if (!rows || !rows.length) {
- connection.release();
- return callback(null, false);
- }
-
- let campaignId = rows[0].id;
- let listId = rows[0].list;
- let segmentId = rows[0].segment;
-
- let query = 'SELECT id FROM `subscription__' + listId + '` WHERE cid=? LIMIT 1';
- connection.query(query, [sCid], (err, rows) => {
- if (err) {
- connection.release();
- return callback(err);
- }
- if (!rows || !rows.length) {
- connection.release();
- return callback(null, false);
- }
-
- let subscriptionId = rows[0].id;
-
- let query = 'SELECT `id`, `list`, `segment`, `subscription` FROM `campaign__' + campaignId + '` WHERE `list`=? AND `segment`=? AND `subscription`=? LIMIT 1';
- connection.query(query, [listId, segmentId, subscriptionId], (err, rows) => {
- connection.release();
- if (err) {
- return callback(err);
- }
- if (!rows || !rows.length) {
- return callback(null, false);
- }
-
- let message = rows[0];
- message.campaign = campaignId;
-
- return callback(null, message);
- });
- });
- });
- });
-};
-
-module.exports.updateMessage = (message, status, updateSubscription, callback) => {
- db.getConnection((err, connection) => {
- if (err) {
- return callback(err);
- }
-
- let statusCode;
- if (status === 'unsubscribed') {
- statusCode = subscriptions.Status.UNSUBSCRIBED;
- } else if (status === 'bounced') {
- statusCode = subscriptions.Status.BOUNCED;
- } else if (status === 'complained') {
- statusCode = subscriptions.Status.COMPLAINED;
- } else {
- return callback(new Error(_('Unrecognized message status')));
- }
-
- let query = 'UPDATE `campaigns` SET `' + status + '`=`' + status + '`+1 WHERE id=? LIMIT 1';
- connection.query(query, [message.campaign], () => {
-
- let query = 'UPDATE `campaign__' + message.campaign + '` SET status=?, updated=NOW() WHERE id=? LIMIT 1';
- connection.query(query, [statusCode, message.id], err => {
- connection.release();
- if (err) {
- return callback(err);
- }
-
- if (updateSubscription) {
- subscriptions.changeStatus(message.list, message.subscription, statusCode === subscriptions.Status.UNSUBSCRIBED ? message.campaign : false, statusCode, callback);
- } else {
- return callback(null, true);
- }
- });
- });
-
- });
-};
-
-module.exports.updateMessageResponse = (message, response, response_id, callback) => {
- db.getConnection((err, connection) => {
- if (err) {
- return callback(err);
- }
-
- let query = 'UPDATE `campaign__' + message.campaign + '` SET `response`=?, `response_id`=? WHERE id=? LIMIT 1';
- connection.query(query, [response, response_id, message.id], err => {
- connection.release();
- if (err) {
- return callback(err);
- }
- return callback(null, true);
- });
-
- });
-};
-
function createCampaignTables(id, callback) {
let query = 'CREATE TABLE `campaign__' + id + '` LIKE campaign';
db.getConnection((err, connection) => {
diff --git a/lib/models/confirmations.js b/lib/models/confirmations.js
deleted file mode 100644
index 9cbceee6..00000000
--- a/lib/models/confirmations.js
+++ /dev/null
@@ -1,91 +0,0 @@
-'use strict';
-
-let db = require('../db');
-let shortid = require('shortid');
-let helpers = require('../helpers');
-let _ = require('../translate')._;
-
-/*
- Adds new entry to the confirmations tables. Generates confirmation cid, which it returns.
- */
-module.exports.addConfirmation = (listId, action, ip, data, callback) => {
- let cid = shortid.generate();
-
- db.getConnection((err, connection) => {
- if (err) {
- return callback(err);
- }
-
- let query = 'INSERT INTO confirmations (cid, list, action, ip, data) VALUES (?,?,?,?,?)';
- connection.query(query, [cid, listId, action, ip, JSON.stringify(data || {})], (err, result) => {
- connection.release();
- if (err) {
- return callback(err);
- }
-
- if (!result || !result.affectedRows) {
- return callback(new Error(_('Could not store confirmation data')));
- }
-
- return callback(null, cid);
- });
- });
-};
-
-/*
- Atomically retrieves confirmation from the database, removes it from the database and returns it.
- */
-module.exports.takeConfirmation = (cid, callback) => {
- db.getConnection((err, connection) => {
- if (err) {
- return callback(err);
- }
-
- connection.beginTransaction(err => {
- if (err) {
- connection.release();
- return callback(err);
- }
-
- let query = 'SELECT cid, list, action, ip, data FROM confirmations WHERE cid=? LIMIT 1';
- connection.query(query, [cid], (err, rows) => {
- if (err) {
- return helpers.rollbackAndReleaseConnection(connection, () => callback(err));
- }
-
- if (!rows || !rows.length) {
- return helpers.rollbackAndReleaseConnection(connection, () => callback(null, false));
- }
-
- connection.query('DELETE FROM confirmations WHERE `cid`=? LIMIT 1', [cid], () => {
- if (err) {
- return helpers.rollbackAndReleaseConnection(connection, () => callback(err));
- }
-
- connection.commit(err => {
- if (err) {
- return helpers.rollbackAndReleaseConnection(connection, () => callback(err));
- }
- connection.release();
-
- let data;
- try {
- data = JSON.parse(rows[0].data);
- } catch (E) {
- data = {};
- }
-
- const result = {
- listId: rows[0].list,
- action: rows[0].action,
- ip: rows[0].ip,
- data
- };
-
- return callback(null, result);
- });
- });
- });
- });
- });
-};
diff --git a/lib/models/fields.js b/lib/models/fields.js
index 1b3dbe2b..10857885 100644
--- a/lib/models/fields.js
+++ b/lib/models/fields.js
@@ -5,39 +5,27 @@ let tools = require('../tools');
let slugify = require('slugify');
let lists = require('./lists');
let shortid = require('shortid');
-let Handlebars = require('handlebars');
-let _ = require('../translate')._;
-let util = require('util');
-let allowedKeys = ['name', 'description', 'key', 'default_value', 'group', 'group_template', 'visible'];
-let allowedTypes;
+let allowedKeys = ['name', 'key', 'default_value', 'group', 'visible'];
module.exports.grouped = ['radio', 'checkbox', 'dropdown'];
module.exports.types = {
- text: _('Text'),
- website: _('Website'),
- longtext: _('Multi-line text'),
- gpg: _('GPG Public Key'),
- number: _('Number'),
- radio: _('Radio Buttons'),
- checkbox: _('Checkboxes'),
- dropdown: _('Drop Down'),
- 'date-us': _('Date (MM/DD/YYY)'),
- 'date-eur': _('Date (DD/MM/YYYY)'),
- 'birthday-us': _('Birthday (MM/DD)'),
- 'birthday-eur': _('Birthday (DD/MM)'),
- json: _('JSON value for custom rendering'),
- option: _('Option')
+ text: 'Text',
+ website: 'Website',
+ number: 'Number',
+ radio: 'Radio Buttons',
+ checkbox: 'Checkboxes',
+ dropdown: 'Drop Down',
+ 'date-us': 'Date (MM/DD/YYY)',
+ 'date-eur': 'Date (DD/MM/YYYY)',
+ 'birthday-us': 'Birthday (MM/DD)',
+ 'birthday-eur': 'Birthday (DD/MM)',
+ option: 'Option'
};
-module.exports.allowedTypes = allowedTypes = Object.keys(module.exports.types);
-
module.exports.genericTypes = {
text: 'string',
website: 'string',
- longtext: 'textarea',
- gpg: 'textarea',
- json: 'textarea',
number: 'number',
'date-us': 'date',
'date-eur': 'date',
@@ -50,7 +38,7 @@ module.exports.list = (listId, callback) => {
listId = Number(listId) || 0;
if (listId < 1) {
- return callback(new Error(_('Missing List ID')));
+ return callback(new Error('Missing List ID'));
}
db.getConnection((err, connection) => {
@@ -58,7 +46,7 @@ module.exports.list = (listId, callback) => {
return callback(err);
}
- let query = 'SELECT * FROM custom_fields WHERE list=? ORDER BY id';
+ let query = 'SELECT * FROM custom_fields WHERE list=?';
connection.query(query, [listId], (err, rows) => {
connection.release();
if (err) {
@@ -95,7 +83,7 @@ module.exports.get = (id, callback) => {
id = Number(id) || 0;
if (id < 1) {
- return callback(new Error(_('Missing List ID')));
+ return callback(new Error('Missing List ID'));
}
db.getConnection((err, connection) => {
@@ -109,9 +97,7 @@ module.exports.get = (id, callback) => {
if (err) {
return callback(err);
}
- let field = rows && rows[0] && tools.convertKeys(rows[0]) || false;
- field.isGroup = module.exports.grouped.indexOf(field.type) >= 0 || field.type === 'json';
- return callback(null, field);
+ return callback(null, rows && rows[0] && tools.convertKeys(rows[0]) || false);
});
});
};
@@ -120,24 +106,20 @@ module.exports.create = (listId, field, callback) => {
listId = Number(listId) || 0;
if (listId < 1) {
- return callback(new Error(_('Missing List ID')));
+ return callback(new Error('Missing List ID'));
}
field = tools.convertKeys(field);
if (field.type === 'option' && !field.group) {
- return callback(new Error(_('Option field requires a group to be selected')));
+ return callback(new Error('Option field requires a group to be selected'));
}
if (field.type !== 'option') {
field.group = null;
}
- field.description = (field.description || '').toString().trim() || null;
- field.defaultValue = (field.defaultValue || '').toString().trim() || null;
- field.groupTemplate = (field.groupTemplate || '').toString().trim() || null;
-
- addCustomField(listId, field.name, field.description, field.defaultValue, field.type, field.group, field.groupTemplate, field.visible, callback);
+ addCustomField(listId, field.name, field.defaultValue, field.type, field.group, field.visible, callback);
};
module.exports.update = (id, updates, callback) => {
@@ -147,21 +129,17 @@ module.exports.update = (id, updates, callback) => {
updates = tools.convertKeys(updates);
if (id < 1) {
- return callback(new Error(_('Missing Field ID')));
+ return callback(new Error('Missing Field ID'));
}
if (!(updates.name || '').toString().trim()) {
- return callback(new Error(_('Field Name must be set')));
+ return callback(new Error('Field Name must be set'));
}
if (updates.key) {
updates.key = slugify(updates.key, '_').toUpperCase();
}
- updates.description = (updates.description || '').toString().trim() || null;
- updates.defaultValue = (updates.defaultValue || '').toString().trim() || null;
- updates.groupTemplate = (updates.groupTemplate || '').toString().trim() || null;
-
updates.visible = updates.visible ? 1 : 0;
let name = (updates.name || '').toString().trim();
@@ -198,7 +176,7 @@ module.exports.delete = (fieldId, callback) => {
fieldId = Number(fieldId) || 0;
if (fieldId < 1) {
- return callback(new Error(_('Missing Field ID')));
+ return callback(new Error('Missing Field ID'));
}
db.getConnection((err, connection) => {
@@ -215,7 +193,7 @@ module.exports.delete = (fieldId, callback) => {
if (!rows || !rows.length) {
connection.release();
- return callback(new Error(_('Custom field not found')));
+ return callback(new Error('Custom field not found'));
}
let field = tools.convertKeys(rows[0]);
@@ -279,24 +257,25 @@ module.exports.delete = (fieldId, callback) => {
});
};
-function addCustomField(listId, name, description, defaultValue, type, group, groupTemplate, visible, callback) {
+function addCustomField(listId, name, defaultValue, type, group, visible, callback) {
type = (type || '').toString().trim().toLowerCase();
group = Number(group) || null;
listId = Number(listId) || 0;
let column = null;
let key = slugify('merge ' + name, '_').toUpperCase();
+ let allowedTypes = ['text', 'number', 'radio', 'checkbox', 'dropdown', 'date-us', 'date-eur', 'birthday-us', 'birthday-eur', 'website', 'option'];
if (allowedTypes.indexOf(type) < 0) {
- return callback(new Error(util.format(_('Unknown column type %s'), type)));
+ return callback(new Error('Unknown column type ' + type));
}
if (!name) {
- return callback(new Error(_('Missing column name')));
+ return callback(new Error('Missing column name'));
}
if (listId <= 0) {
- return callback(new Error(_('Missing list ID')));
+ return callback(new Error('Missing list ID'));
}
lists.get(listId, (err, list) => {
@@ -304,7 +283,7 @@ function addCustomField(listId, name, description, defaultValue, type, group, gr
return callback(err);
}
if (!list) {
- return callback(_('Provided List ID not found'));
+ return callback('Provided List ID not found');
}
db.getConnection((err, connection) => {
@@ -313,11 +292,11 @@ function addCustomField(listId, name, description, defaultValue, type, group, gr
}
if (module.exports.grouped.indexOf(type) < 0) {
- column = ('custom_' + slugify(name, '_') + '_' + shortid.generate()).toLowerCase().replace(/[^a-z0-9_]/g, '');
+ column = ('custom_' + slugify(name, '_') + '_' + shortid.generate()).toLowerCase().replace(/[^a-z0-9\_]/g, '');
}
- let query = 'INSERT INTO custom_fields (`list`, `name`, `description`, `key`,`default_value`, `type`, `group`, `group_template`, `column`, `visible`) VALUES(?,?,?,?,?,?,?,?,?,?)';
- connection.query(query, [listId, name, description, key, defaultValue, type, group, groupTemplate, column, visible ? 1 : 0], (err, result) => {
+ let query = 'INSERT INTO custom_fields (`list`, `name`, `key`,`default_value`, `type`, `group`, `column`, `visible`) VALUES(?,?,?,?,?,?,?,?)';
+ connection.query(query, [listId, name, key, defaultValue, type, group, column, visible ? 1 : 0], (err, result) => {
if (err) {
connection.release();
@@ -325,37 +304,27 @@ function addCustomField(listId, name, description, defaultValue, type, group, gr
}
let fieldId = result && result.insertId;
- let indexQuery;
switch (type) {
case 'text':
case 'website':
query = 'ALTER TABLE `subscription__' + listId + '` ADD COLUMN `' + column + '` VARCHAR(255) DEFAULT NULL';
- indexQuery = 'CREATE INDEX ' + column + '_index ON `subscription__' + listId + '` (`column`);';
- break;
- case 'gpg':
- case 'longtext':
- case 'json':
- query = 'ALTER TABLE `subscription__' + listId + '` ADD COLUMN `' + column + '` TEXT DEFAULT NULL';
break;
case 'number':
- query = 'ALTER TABLE `subscription__' + listId + '` ADD COLUMN `' + column + '` INT(11) DEFAULT NULL';
- indexQuery = 'CREATE INDEX ' + column + '_index ON `subscription__' + listId + '` (`column`);';
+ query = 'ALTER TABLE `subscription__' + listId + '` ADD COLUMN `' + column + '` INT(11) DEFAULT NULL, ADD INDEX (' + column + ')';
break;
case 'option':
- query = 'ALTER TABLE `subscription__' + listId + '` ADD COLUMN `' + column + '` TINYINT(4) UNSIGNED NOT NULL DEFAULT \'0\'';
- indexQuery = 'CREATE INDEX ' + column + '_index ON `subscription__' + listId + '` (`column`);';
+ query = 'ALTER TABLE `subscription__' + listId + '` ADD COLUMN `' + column + '` TINYINT(4) UNSIGNED NOT NULL DEFAULT \'0\', ADD INDEX (' + column + ')';
break;
case 'date-us':
case 'date-eur':
case 'birthday-us':
case 'birthday-eur':
- query = 'ALTER TABLE `subscription__' + listId + '` ADD COLUMN `' + column + '` DATETIME NULL DEFAULT NULL';
- indexQuery = 'CREATE INDEX ' + column + '_index ON `subscription__' + listId + '` (`column`);';
+ query = 'ALTER TABLE `subscription__' + listId + '` ADD COLUMN `' + column + '` TIMESTAMP NULL DEFAULT NULL, ADD INDEX (' + column + ')';
break;
default:
connection.release();
- return callback(null, fieldId, key);
+ return callback(null, true);
}
connection.query(query, err => {
@@ -363,25 +332,15 @@ function addCustomField(listId, name, description, defaultValue, type, group, gr
connection.query('DELETE FROM custom_fields WHERE id=? LIMIT 1', [fieldId], () => connection.release());
return callback(err);
}
- if (!indexQuery) {
- connection.release();
- return callback(null, fieldId, key);
- } else {
- connection.query(query, err => {
- if (err) {
- // ignore index errors
- }
- connection.release();
- return callback(null, fieldId, key);
- });
- }
+ connection.release();
+ return callback(null, fieldId);
});
});
});
});
}
-module.exports.getRow = (fieldList, values, useDate, showAll, onlyExisting) => {
+module.exports.getRow = (fieldList, values, useDate, showAll) => {
let valueList = {};
let row = [];
@@ -396,59 +355,19 @@ module.exports.getRow = (fieldList, values, useDate, showAll, onlyExisting) => {
});
fieldList.filter(field => showAll || field.visible).forEach(field => {
- if (onlyExisting && field.column && !valueList.hasOwnProperty(field.column)) {
- // ignore missing values
- return;
- }
- /* eslint-disable indent */
switch (field.type) {
case 'text':
case 'website':
- case 'gpg':
- case 'longtext':
{
let item = {
- id: field.id,
type: field.type,
name: field.name,
- description: field.description,
column: field.column,
value: (valueList[field.column] || '').toString().trim(),
visible: !!field.visible,
mergeTag: field.key,
mergeValue: (valueList[field.column] || '').toString().trim() || field.defaultValue,
- ['type' + (field.type || '').toString().trim().replace(/(?:^|-)([a-z])/g, (m, c) => c.toUpperCase())]: true
- };
- row.push(item);
- break;
- }
- case 'json':
- {
- let value;
- let json = (valueList[field.column] || '').toString().trim();
- try {
- let parsed = JSON.parse(json);
- if (Array.isArray(parsed)) {
- parsed = {
- values: parsed
- };
- }
- value = json ? render(field.groupTemplate, parsed) : '';
- } catch (E) {
- value = E.message;
- }
-
- let item = {
- id: field.id,
- type: field.type,
- name: field.name,
- description: field.description,
- column: field.column,
- value: (valueList[field.column] || '').toString().trim(),
- visible: !!field.visible,
- mergeTag: field.key,
- mergeValue: value || field.defaultValue,
- ['type' + (field.type || '').toString().trim().replace(/(?:^|-)([a-z])/g, (m, c) => c.toUpperCase())]: true
+ ['type' + (field.type || '').toString().trim().replace(/(?:^|\-)([a-z])/g, (m, c) => c.toUpperCase())]: true
};
row.push(item);
break;
@@ -456,16 +375,14 @@ module.exports.getRow = (fieldList, values, useDate, showAll, onlyExisting) => {
case 'number':
{
let item = {
- id: field.id,
type: field.type,
name: field.name,
- description: field.description,
column: field.column,
value: Number(valueList[field.column]) || 0,
visible: !!field.visible,
mergeTag: field.key,
- mergeValue: (Number(valueList[field.column]) || Number(field.defaultValue) || 0).toString(),
- ['type' + (field.type || '').toString().trim().replace(/(?:^|-)([a-z])/g, (m, c) => c.toUpperCase())]: true
+ mergeValue: Number(valueList[field.column]) || field.defaultValue || 0,
+ ['type' + (field.type || '').toString().trim().replace(/(?:^|\-)([a-z])/g, (m, c) => c.toUpperCase())]: true
};
row.push(item);
break;
@@ -474,46 +391,25 @@ module.exports.getRow = (fieldList, values, useDate, showAll, onlyExisting) => {
case 'radio':
case 'checkbox':
{
- let hasSelectedOption = (field.options || []).some(subField => subField.column && valueList[subField.column]);
let item = {
- id: field.id,
type: field.type,
name: field.name,
- description: field.description,
visible: !!field.visible,
key: 'group-g' + field.id,
mergeTag: field.key,
mergeValue: field.defaultValue,
- ['type' + (field.type || '').toString().trim().replace(/(?:^|-)([a-z])/g, (m, c) => c.toUpperCase())]: true,
- groupTemplate: field.groupTemplate,
- options: (field.options || []).map(subField => {
- if (onlyExisting && subField.column && !valueList.hasOwnProperty(subField.column)) {
- if (hasSelectedOption && field.type !== 'checkbox') {
- // Set all radio or dropdown options if a selection for the group is present
- } else if (field.type === 'checkbox' && values['originGroupG' + field.id] === 'webform') {
- // Set all checkbox options if origin is webform (subscribe, manage, or admin edit) #333
- // Atomic updates via API call or CSV import still possible
- } else {
- // ignore missing values
- return false;
- }
- }
- return {
- type: subField.type,
- name: subField.name,
- description: subField.description,
- column: subField.column,
- value: valueList[subField.column] ? 1 : 0,
- visible: !!subField.visible,
- mergeTag: subField.key,
- mergeValue: valueList[subField.column] ? subField.name : subField.defaultValue
- };
- }).filter(subField => subField)
+ ['type' + (field.type || '').toString().trim().replace(/(?:^|\-)([a-z])/g, (m, c) => c.toUpperCase())]: true,
+ options: (field.options || []).map(subField => ({
+ type: subField.type,
+ name: subField.name,
+ column: subField.column,
+ value: valueList[subField.column] ? 1 : 0,
+ visible: !!subField.visible,
+ mergeTag: subField.key,
+ mergeValue: valueList[subField.column] ? subField.name : subField.defaultValue
+ }))
};
- let subItems = item.options.filter(subField => (showAll || subField.visible) && subField.value).map(subField => subField.name);
- item.value = field.groupTemplate ? render(field.groupTemplate, {
- values: subItems
- }) : subItems.join(', ');
+ item.value = item.options.filter(subField => showAll || subField.visible && subField.value).map(subField => subField.name).join(', ');
item.mergeValue = item.value || field.defaultValue;
row.push(item);
break;
@@ -523,7 +419,7 @@ module.exports.getRow = (fieldList, values, useDate, showAll, onlyExisting) => {
case 'date-us':
case 'birthday-us':
{
- let isUs = /-us$/.test(field.type);
+ let isUs = /\-us$/.test(field.type);
let isYear = field.type.indexOf('date-') === 0;
let value = valueList[field.column];
let day, month, year;
@@ -536,27 +432,18 @@ module.exports.getRow = (fieldList, values, useDate, showAll, onlyExisting) => {
} else {
value = (value || '').toString().trim();
- // try international format first YYYY-MM-DD
- let parts = value.match(/(\d{4})\D+(\d{2})(?:\D+(\d{2})\b)?/);
- if (parts) {
- year = Number(parts[1]) || 2000;
- month = Number(parts[2]) || 0;
- day = Number(parts[3]) || 0;
- value = new Date(Date.UTC(year, month - 1, day));
+ let parts = value.match(/(\d+)\D+(\d+)(?:\D+(\d+))?/);
+ if (!parts) {
+ value = null;
} else {
- parts = value.match(/(\d+)\D+(\d+)(?:\D+(\d+)\b)?/);
- if (!parts) {
+ day = Number(parts[isUs ? 2 : 1]) || 0;
+ month = Number(parts[isUs ? 1 : 2]) || 0;
+ year = Number(parts[3]) || 2000;
+
+ if (!day || !month) {
value = null;
} else {
- day = Number(parts[isUs ? 2 : 1]) || 0;
- month = Number(parts[isUs ? 1 : 2]) || 0;
- year = Number(parts[3]) || 2000;
-
- if (!day || !month) {
- value = null;
- } else {
- value = new Date(Date.UTC(year, month - 1, day));
- }
+ value = new Date(Date.UTC(year, month - 1, day));
}
}
}
@@ -576,22 +463,19 @@ module.exports.getRow = (fieldList, values, useDate, showAll, onlyExisting) => {
}
let item = {
- id: field.id,
type: field.type,
name: field.name,
- description: field.description,
column: field.column,
value: useDate ? value : formatted,
visible: !!field.visible,
mergeTag: field.key,
mergeValue: (useDate ? value : formatted) || field.defaultValue,
- ['type' + (field.type || '').toString().trim().replace(/(?:^|-)([a-z])/g, (m, c) => c.toUpperCase())]: true
+ ['type' + (field.type || '').toString().trim().replace(/(?:^|\-)([a-z])/g, (m, c) => c.toUpperCase())]: true
};
row.push(item);
break;
}
}
- /* eslint-enable indent */
});
return row;
@@ -617,9 +501,3 @@ module.exports.getValues = (row, showAll) => {
return result;
};
-
-
-function render(template, options) {
- let renderer = Handlebars.compile(template);
- return renderer(options);
-}
diff --git a/lib/models/forms.js b/lib/models/forms.js
deleted file mode 100644
index 9550077b..00000000
--- a/lib/models/forms.js
+++ /dev/null
@@ -1,418 +0,0 @@
-'use strict';
-
-let db = require('../db');
-let fs = require('fs');
-let path = require('path');
-let tools = require('../tools');
-let mjml = require('mjml');
-let _ = require('../translate')._;
-
-let allowedKeys = [
- 'name',
- 'description',
- 'fields_shown_on_subscribe',
- 'fields_shown_on_manage',
- 'layout',
- 'form_input_style',
- 'web_subscribe',
- 'web_confirm_subscription_notice',
- 'mail_confirm_subscription_html',
- 'mail_confirm_subscription_text',
- 'mail_already_subscribed_html',
- 'mail_already_subscribed_text',
- 'web_subscribed_notice',
- 'mail_subscription_confirmed_html',
- 'mail_subscription_confirmed_text',
- 'web_manage',
- 'web_manage_address',
- 'web_updated_notice',
- 'web_unsubscribe',
- 'web_confirm_unsubscription_notice',
- 'mail_confirm_unsubscription_html',
- 'mail_confirm_unsubscription_text',
- 'mail_confirm_address_change_html',
- 'mail_confirm_address_change_text',
- 'web_unsubscribed_notice',
- 'mail_unsubscription_confirmed_html',
- 'mail_unsubscription_confirmed_text',
- 'web_manual_unsubscribe_notice'
-];
-
-
-module.exports.list = (listId, callback) => {
- listId = Number(listId) || 0;
-
- if (listId < 1) {
- return callback(new Error(_('Missing List ID')));
- }
-
- db.getConnection((err, connection) => {
- if (err) {
- return callback(err);
- }
-
- connection.query('SELECT * FROM custom_forms WHERE list=? ORDER BY id', [listId], (err, rows) => {
- connection.release();
- if (err) {
- return callback(err);
- }
-
- let formList = rows && rows.map(row => tools.convertKeys(row)) || [];
- return callback(null, formList);
- });
- });
-};
-
-module.exports.get = (id, callback) => {
- id = Number(id) || 0;
-
- if (id < 1) {
- return callback(new Error(_('Missing Form ID')));
- }
-
- db.getConnection((err, connection) => {
- if (err) {
- return callback(err);
- }
-
- connection.query('SELECT * FROM custom_forms WHERE id=? LIMIT 1', [id], (err, rows) => {
- if (err) {
- connection.release();
- return callback(err);
- }
-
- let form = rows && rows[0] && tools.convertKeys(rows[0]) || false;
-
- if (!form) {
- connection.release();
- return callback(new Error('Selected form not found'));
- }
-
- connection.query('SELECT * FROM custom_forms_data WHERE form=?', [id], (err, data_rows = []) => {
- connection.release();
- if (err) {
- return callback(err);
- }
-
- data_rows.forEach(data_row => {
- let modelKey = tools.fromDbKey(data_row.data_key);
- form[modelKey] = data_row.data_value;
- });
-
- return callback(null, form);
- });
- });
- });
-};
-
-
-module.exports.create = (listId, form, callback) => {
- listId = Number(listId) || 0;
-
- if (listId < 1) {
- return callback(new Error(_('Missing Form ID')));
- }
-
- form = tools.convertKeys(form);
- form = setDefaultValues(form);
- form.name = (form.name || '').toString().trim();
-
- if (!form.name) {
- return callback(new Error(_('Form Name must be set')));
- }
-
- let keys = ['list'];
- let values = [listId];
-
- Object.keys(form).forEach(key => {
- let value = form[key].trim();
- key = tools.toDbKey(key);
- if (key === 'description') {
- value = tools.purifyHTML(value);
- }
- if (allowedKeys.indexOf(key) >= 0) {
- keys.push(key);
- values.push(value);
- }
- });
-
- db.getConnection((err, connection) => {
- if (err) {
- return callback(err);
- }
-
- let filtered = filterKeysAndValues(keys, values, 'exclude', ['mail_', 'web_']);
- let query = 'INSERT INTO custom_forms (' + filtered.keys.join(', ') + ') VALUES (' + filtered.values.map(() => '?').join(',') + ')';
-
- connection.query(query, filtered.values, (err, result) => {
- connection.release();
- if (err) {
- return callback(err);
- }
-
- let formId = result && result.insertId;
-
- if (!formId) {
- return callback(new Error('Invalid custom_forms insertId'));
- }
-
- let jobs = 1;
- let error = null;
-
- let done = err => {
- jobs--;
- error = err ? err : error; // One's enough
- jobs === 0 && callback(error, formId);
- };
-
- filtered = filterKeysAndValues(keys, values, 'include', ['mail_', 'web_']);
-
- filtered.keys.forEach((key, index) => {
- jobs++;
-
- db.getConnection((err, connection) => {
- if (err) {
- return done(err);
- }
-
- connection.query('INSERT INTO custom_forms_data (form, data_key, data_value) VALUES (?, ?, ?)', [formId, key, filtered.values[index]], err => {
- connection.release();
- if (err) {
- return done(err);
- }
-
- return done(null);
- });
- });
- });
-
- done(null);
- });
- });
-};
-
-module.exports.update = (id, updates, callback) => {
- updates = updates || {};
- id = Number(id) || 0;
-
- updates = tools.convertKeys(updates);
-
- if (id < 1) {
- return callback(new Error(_('Missing Form ID')));
- }
-
- if (!(updates.name || '').toString().trim()) {
- return callback(new Error(_('Form Name must be set')));
- }
-
- let keys = [];
- let values = [];
-
- Object.keys(updates).forEach(key => {
- let value = typeof updates[key] === 'string' ? updates[key].trim() : updates[key];
- key = tools.toDbKey(key);
- if (key === 'description') {
- value = tools.purifyHTML(value);
- }
- if (allowedKeys.indexOf(key) >= 0) {
- keys.push(key);
- values.push(value);
- }
- });
-
- db.getConnection((err, connection) => {
- if (err) {
- return callback(err);
- }
-
- let filtered = filterKeysAndValues(keys, values, 'exclude', ['mail_', 'web_']);
- let query = 'UPDATE custom_forms SET ' + filtered.keys.map(key => '`' + key + '`=?').join(', ') + ' WHERE id=? LIMIT 1';
-
- connection.query(query, filtered.values.concat(id), (err, result) => {
- connection.release();
- if (err) {
- return callback(err);
- }
-
- let affectedRows = result && result.affectedRows;
-
- let jobs = 1;
- let error = null;
-
- let done = err => {
- jobs--;
- error = err ? err : error; // One's enough
-
- if (jobs === 0) {
- if (error) {
- return callback(error);
- }
-
- // Save then validate, as otherwise their work get's lost ...
- err = testForMjmlErrors(keys, values);
- if (err) {
- return callback(err);
- }
-
- return callback(null, affectedRows);
- }
- };
-
- filtered = filterKeysAndValues(keys, values, 'include', ['mail_', 'web_']);
-
- filtered.keys.forEach((key, index) => {
- jobs++;
-
- db.getConnection((err, connection) => {
- if (err) {
- return done(err);
- }
-
- connection.query('UPDATE custom_forms_data SET data_value=? WHERE data_key=? AND form=?', [filtered.values[index], key, id], err => {
- connection.release();
- if (err) {
- return done(err);
- }
-
- return done(null);
- });
- });
- });
-
- done(null);
- });
- });
-};
-
-module.exports.delete = (formId, callback) => {
- formId = Number(formId) || 0;
-
- if (formId < 1) {
- return callback(new Error(_('Missing Form ID')));
- }
-
- db.getConnection((err, connection) => {
- if (err) {
- return callback(err);
- }
-
- connection.query('SELECT * FROM custom_forms WHERE id=? LIMIT 1', [formId], (err, rows) => {
- if (err) {
- connection.release();
- return callback(err);
- }
-
- if (!rows || !rows.length) {
- connection.release();
- return callback(new Error(_('Custom form not found')));
- }
-
- connection.query('DELETE FROM custom_forms WHERE id=? LIMIT 1', [formId], err => {
- connection.release();
- if (err) {
- return callback(err);
- }
- return callback(null, true);
- });
- });
- });
-};
-
-function setDefaultValues(form) {
- let getContents = fileName => {
- try {
- let basePath = path.join(__dirname, '..', '..');
- let template = fs.readFileSync(path.join(basePath, fileName), 'utf8');
- return template.replace(/\{\{#translate\}\}(.*?)\{\{\/translate\}\}/g, (m, s) => _(s));
- } catch (err) {
- return false;
- }
- };
-
- allowedKeys.forEach(key => {
- let modelKey = tools.fromDbKey(key);
- let base = 'views/subscription/' + key.replace(/_/g, '-');
-
- if (key.startsWith('mail') || key.startsWith('web')) {
- form[modelKey] = getContents(base + '.mjml.hbs') || getContents(base + '.hbs') || '';
- }
- });
-
- form.layout = getContents('views/subscription/layout.mjml.hbs') || '';
- form.formInputStyle = getContents('public/subscription/form-input-style.css') || '@import url(/subscription/form-input-style.css);';
-
- return form;
-}
-
-function filterKeysAndValues(keysIn, valuesIn, method = 'include', prefixes = []) {
- let values = [];
-
- let prefixMatch = key => (
- prefixes.some(prefix => key.startsWith(prefix))
- );
-
- let keys = keysIn.filter((key, index) => {
- if ((method === 'include' && prefixMatch(key)) || (method === 'exclude' && !prefixMatch(key))) {
- values.push(valuesIn[index]);
- return true;
- }
- return false;
- });
-
- return {
- keys,
- values
- };
-}
-
-function testForMjmlErrors(keys, values) {
-
- let errors = [];
- let testLayout = '{{{body}}} ';
-
- let hasMjmlError = (template, layout = testLayout) => {
- let source = layout.replace(/\{\{\{body\}\}\}/g, template);
- let compiled;
-
- try {
- compiled = mjml.mjml2html(source);
- } catch (err) {
- return err;
- }
-
- if (compiled.errors.length) {
- return compiled.errors[0].message || compiled.errors[0];
- }
-
- return null;
- };
-
- keys.forEach((key, index) => {
- if (key.startsWith('mail_') || key.startsWith('web_')) {
-
- let template = values[index];
- let err = hasMjmlError(template);
-
- err && errors.push(key + ': ' + (err.message || err));
- key === 'mail_confirm_html' && !template.includes('{{confirmUrl}}') && errors.push(key + ': Missing {{confirmUrl}}');
-
- } else if (key === 'layout') {
-
- let layout = values[index];
- let err = hasMjmlError('', layout);
-
- err && errors.push('layout: ' + (err.message || err));
- !layout.includes('{{{body}}}') && errors.push('layout: {{{body}}} not found');
- }
- });
-
-
- if (errors.length) {
- errors.forEach((err, index) => {
- errors[index] = (index + 1) + ') ' + err;
- });
- return 'Please fix these MJML errors:\n\n' + errors.join('\n');
- }
-
- return null;
-}
diff --git a/lib/models/links.js b/lib/models/links.js
index e7ce5591..7beeecd3 100644
--- a/lib/models/links.js
+++ b/lib/models/links.js
@@ -3,7 +3,6 @@
let db = require('../db');
let shortid = require('shortid');
let util = require('util');
-let _ = require('../translate')._;
let geoip = require('geoip-ultralight');
let campaigns = require('./campaigns');
@@ -12,40 +11,41 @@ let lists = require('./lists');
let log = require('npmlog');
let urllib = require('url');
-let he = require('he');
-let ua_parser = require('device');
-module.exports.resolve = (linkCid, callback) => {
- db.getConnection((err, connection) => {
+module.exports.resolve = (campaignCid, linkCid, callback) => {
+ campaigns.getByCid(campaignCid, (err, campaign) => {
if (err) {
return callback(err);
}
- let query = 'SELECT id, url FROM links WHERE `cid`=? LIMIT 1';
- connection.query(query, [linkCid], (err, rows) => {
- connection.release();
+ if (!campaign) {
+ return callback('Campaign not found');
+ }
+ db.getConnection((err, connection) => {
if (err) {
return callback(err);
}
+ let query = 'SELECT id, url FROM links WHERE `campaign`=? AND `cid`=? LIMIT 1';
+ connection.query(query, [campaign.id, linkCid], (err, rows) => {
+ connection.release();
+ if (err) {
+ return callback(err);
+ }
- if (rows && rows.length) {
- return callback(null, rows[0].id, rows[0].url);
- }
+ if (rows && rows.length) {
+ return callback(null, rows[0].id, rows[0].url);
+ }
- return callback(null, false);
+ return callback(null, false);
+ });
});
});
};
-module.exports.countClick = (remoteIp, useragent, campaignCid, listCid, subscriptionCid, linkId, callback) => {
+module.exports.countClick = (remoteIp, campaignCid, listCid, subscriptionCid, linkId, callback) => {
getSubscriptionData(campaignCid, listCid, subscriptionCid, (err, data) => {
if (err) {
return callback(err);
}
-
- if (!data || data.campaign.clickTrackingDisabled) {
- return callback(null, false);
- }
-
db.getConnection((err, connection) => {
if (err) {
return callback(err);
@@ -53,14 +53,13 @@ module.exports.countClick = (remoteIp, useragent, campaignCid, listCid, subscrip
connection.beginTransaction(err => {
if (err) {
- connection.release();
return callback(err);
}
let country = geoip.lookupCountry(remoteIp) || null;
- let device = ua_parser(useragent, { unknownUserAgentDeviceType: 'desktop', emptyUserAgentDeviceType: 'desktop' });
- let query = 'INSERT INTO `campaign_tracker__' + data.campaign.id + '` (`list`, `subscriber`, `link`, `ip`, `device_type`, `country`) VALUES (?,?,?,?,?,?) ON DUPLICATE KEY UPDATE `count`=`count`+1';
- connection.query(query, [data.list.id, data.subscription.id, linkId, remoteIp, device.type, country], (err, result) => {
+
+ let query = 'INSERT INTO `campaign_tracker__' + data.campaign.id + '` (`list`, `subscriber`, `link`, `ip`, `country`) VALUES (?,?,?,?,?) ON DUPLICATE KEY UPDATE `count`=`count`+1';
+ connection.query(query, [data.list.id, data.subscription.id, linkId, remoteIp, country], (err, result) => {
if (err && err.code !== 'ER_DUP_ENTRY') {
return connection.rollback(() => {
connection.release();
@@ -99,8 +98,8 @@ module.exports.countClick = (remoteIp, useragent, campaignCid, listCid, subscrip
});
}
- let query = 'INSERT INTO `campaign_tracker__' + data.campaign.id + '` (`list`, `subscriber`, `link`, `ip`, `device_type`, `country`) VALUES (?,?,?,?,?,?)';
- connection.query(query, [data.list.id, data.subscription.id, 0, remoteIp, device.type, country], err => {
+ let query = 'INSERT INTO `campaign_tracker__' + data.campaign.id + '` (`list`, `subscriber`, `link`, `ip`, `country`) VALUES (?,?,?,?,?)';
+ connection.query(query, [data.list.id, data.subscription.id, 0, remoteIp, country], err => {
if (err && err.code !== 'ER_DUP_ENTRY') {
return connection.rollback(() => {
connection.release();
@@ -142,7 +141,7 @@ module.exports.countClick = (remoteIp, useragent, campaignCid, listCid, subscrip
});
// also count clicks as open events in case beacon image was blocked
- module.exports.countOpen(remoteIp, useragent, campaignCid, listCid, subscriptionCid, () => false);
+ module.exports.countOpen(remoteIp, campaignCid, listCid, subscriptionCid, () => false);
});
});
});
@@ -152,16 +151,12 @@ module.exports.countClick = (remoteIp, useragent, campaignCid, listCid, subscrip
});
};
-module.exports.countOpen = (remoteIp, useragent, campaignCid, listCid, subscriptionCid, callback) => {
+module.exports.countOpen = (remoteIp, campaignCid, listCid, subscriptionCid, callback) => {
getSubscriptionData(campaignCid, listCid, subscriptionCid, (err, data) => {
if (err) {
return callback(err);
}
- if (!data || data.campaign.openTrackingDisabled) {
- return callback(null, false);
- }
-
db.getConnection((err, connection) => {
if (err) {
return callback(err);
@@ -169,14 +164,13 @@ module.exports.countOpen = (remoteIp, useragent, campaignCid, listCid, subscript
connection.beginTransaction(err => {
if (err) {
- connection.release();
return callback(err);
}
let country = geoip.lookupCountry(remoteIp) || null;
- let device = ua_parser(useragent, { unknownUserAgentDeviceType: 'desktop', emptyUserAgentDeviceType: 'desktop' });
- let query = 'INSERT INTO `campaign_tracker__' + data.campaign.id + '` (`list`, `subscriber`, `link`, `ip`, `device_type`, `country`) VALUES (?,?,?,?,?,?) ON DUPLICATE KEY UPDATE `count`=`count`+1';
- connection.query(query, [data.list.id, data.subscription.id, -1, remoteIp, device.type, country], (err, result) => {
+
+ let query = 'INSERT INTO `campaign_tracker__' + data.campaign.id + '` (`list`, `subscriber`, `link`, `ip`, `country`) VALUES (?,?,?,?,?) ON DUPLICATE KEY UPDATE `count`=`count`+1';
+ connection.query(query, [data.list.id, data.subscription.id, -1, remoteIp, country], (err, result) => {
if (err && err.code !== 'ER_DUP_ENTRY') {
return connection.rollback(() => {
connection.release();
@@ -268,64 +262,50 @@ module.exports.add = (url, campaignId, callback) => {
};
module.exports.updateLinks = (campaign, list, subscription, serviceUrl, message, callback) => {
- if ((campaign.openTrackingDisabled && campaign.clickTrackingDisabled) || !message || !message.trim()) {
- // tracking is disabled, do not modify the message
- return setImmediate(() => callback(null, message));
- }
-
+ let re = /(]* href\s*=[\s"']*)(http[^"'>\s]+)/gi;
+ let urls = new Set();
+ message.replace(re, (match, prefix, url) => {
+ urls.add(url);
+ });
+
+ let map = new Map();
+ let vals = urls.values();
+
// insert tracking image
- if (!campaign.openTrackingDisabled) {
- let inserted = false;
- let imgUrl = urllib.resolve(serviceUrl, util.format('/links/%s/%s/%s', campaign.cid, list.cid, encodeURIComponent(subscription.cid)));
- let img = '
';
- message = message.replace(/<\/body\b/i, match => {
- inserted = true;
- return img + match;
- });
- if (!inserted) {
- message = message + img;
- }
- if (campaign.clickTrackingDisabled) {
- return callback(null, message);
- }
+ let inserted = false;
+ let imgUrl = urllib.resolve(serviceUrl, util.format('/links/%s/%s/%s', campaign.cid, list.cid, encodeURIComponent(subscription.cid)));
+ let img = '
';
+ message = message.replace(/<\/body\b/i, match => {
+ inserted = true;
+ return img + match;
+ });
+ if (!inserted) {
+ message = message + img;
}
-
- if (!campaign.clickTrackingDisabled) {
- let re = /(]* href\s*=[\s"']*)(http[^"'>\s]+)/gi;
- let urls = new Set();
- (message || '').replace(re, (match, prefix, url) => {
- urls.add(url);
- });
- let map = new Map();
- let vals = urls.values();
+ let replaceUrls = () => {
+ callback(null,
+ message.replace(re, (match, prefix, url) =>
+ prefix + (map.has(url) ? urllib.resolve(serviceUrl, util.format('/links/%s/%s/%s/%s', campaign.cid, list.cid, encodeURIComponent(subscription.cid), encodeURIComponent(map.get(url)))) : url)));
+ };
- let replaceUrls = () => {
- callback(null,
- message.replace(re, (match, prefix, url) =>
- prefix + (map.has(url) ? urllib.resolve(serviceUrl, util.format('/links/%s/%s/%s/%s', campaign.cid, list.cid, encodeURIComponent(subscription.cid), encodeURIComponent(map.get(url)))) : url)));
- };
+ let storeNext = () => {
+ let urlItem = vals.next();
+ if (urlItem.done) {
+ return replaceUrls();
+ }
- let storeNext = () => {
- let urlItem = vals.next();
- if (urlItem.done) {
- return replaceUrls();
- }
-
- module.exports.add(he.decode(urlItem.value, {
- isAttributeValue: true
- }), campaign.id, (err, linkId, cid) => {
- if (err) {
- log.error('Link', err);
- return storeNext();
- }
- map.set(urlItem.value, cid);
+ module.exports.add(urlItem.value, campaign.id, (err, linkId, cid) => {
+ if (err) {
+ log.error('Link', err.stack);
return storeNext();
- });
- };
+ }
+ map.set(urlItem.value, cid);
+ return storeNext();
+ });
+ };
- storeNext();
- }
+ storeNext();
};
function getSubscriptionData(campaignCid, listCid, subscriptionCid, callback) {
@@ -334,7 +314,7 @@ function getSubscriptionData(campaignCid, listCid, subscriptionCid, callback) {
return callback(err);
}
if (!campaign) {
- return callback(new Error(_('Campaign not found')));
+ return callback(new Error('Campaign not found'));
}
lists.getByCid(listCid, (err, list) => {
@@ -342,7 +322,7 @@ function getSubscriptionData(campaignCid, listCid, subscriptionCid, callback) {
return callback(err);
}
if (!list) {
- return callback(new Error(_('List not found')));
+ return callback(new Error('Campaign not found'));
}
subscriptions.get(list.id, subscriptionCid, (err, subscription) => {
@@ -350,7 +330,7 @@ function getSubscriptionData(campaignCid, listCid, subscriptionCid, callback) {
return callback(err);
}
if (!subscription) {
- return callback(new Error(_('Subscription not found')));
+ return callback(new Error('Subscription not found'));
}
return callback(null, {
diff --git a/lib/models/lists.js b/lib/models/lists.js
index 6c0a498a..c464b702 100644
--- a/lib/models/lists.js
+++ b/lib/models/lists.js
@@ -4,33 +4,29 @@ let db = require('../db');
let tools = require('../tools');
let shortid = require('shortid');
let segments = require('./segments');
-let subscriptions = require('./subscriptions');
-let _ = require('../translate')._;
-let tableHelpers = require('../table-helpers');
-const UnsubscriptionMode = {
- ONE_STEP: 0,
- ONE_STEP_WITH_FORM: 1,
- TWO_STEP: 2,
- TWO_STEP_WITH_FORM: 3,
- MANUAL: 4,
- MAX: 5
-};
-
-module.exports.UnsubscriptionMode = UnsubscriptionMode;
-
-let allowedKeys = ['description', 'default_form', 'public_subscribe', 'unsubscription_mode', 'listunsubscribe_disabled'];
+let allowedKeys = ['description'];
module.exports.list = (start, limit, callback) => {
- tableHelpers.list('lists', ['*'], 'name', null, start, limit, callback);
-};
+ db.getConnection((err, connection) => {
+ if (err) {
+ return callback(err);
+ }
-module.exports.filter = (request, parent, callback) => {
- tableHelpers.filter('lists', ['*'], request, ['#', 'name', 'cid', 'subscribers', 'description'], ['name'], 'name ASC', null, callback);
-};
-
-module.exports.filterQuicklist = (request, callback) => {
- tableHelpers.filter('lists', ['id', 'name', 'subscribers'], request, ['#', 'name', 'subscribers'], ['name'], 'name ASC', null, callback);
+ connection.query('SELECT SQL_CALC_FOUND_ROWS * FROM lists ORDER BY name LIMIT ? OFFSET ?', [limit, start], (err, rows) => {
+ if (err) {
+ connection.release();
+ return callback(err);
+ }
+ connection.query('SELECT FOUND_ROWS() AS total', (err, total) => {
+ connection.release();
+ if (err) {
+ return callback(err);
+ }
+ return callback(null, rows, total && total[0] && total[0].total);
+ });
+ });
+ });
};
module.exports.quicklist = callback => {
@@ -65,37 +61,6 @@ module.exports.quicklist = callback => {
});
};
-module.exports.getListsWithEmail = (email, callback) => {
- db.getConnection((err, connection) => {
- if (err) {
- return callback(err);
- }
-
- connection.query('SELECT id, name FROM lists', (err, rows) => {
- connection.release();
- if (err) {
- return callback(err);
- }
-
- let lists = (rows || []).map(tools.convertKeys);
- const results = [];
- lists.forEach((list, index, arr) => {
- subscriptions.getByEmail(list.id, email, (err, sub) => {
- if (err) {
- return callback(err);
- }
- if (sub) {
- results.push(list.id);
- }
- if (index === arr.length - 1) {
- return callback(null, lists.filter(list => results.includes(list.id)));
- }
- });
- });
- });
- });
-};
-
module.exports.getByCid = (cid, callback) => {
resolveCid(cid, (err, id) => {
if (err) {
@@ -112,7 +77,7 @@ module.exports.get = (id, callback) => {
id = Number(id) || 0;
if (id < 1) {
- return callback(new Error(_('Missing List ID')));
+ return callback(new Error('Missing List ID'));
}
db.getConnection((err, connection) => {
@@ -142,84 +107,21 @@ module.exports.get = (id, callback) => {
});
};
-module.exports.update = (id, updates, callback) => {
- updates = updates || {};
- id = Number(id) || 0;
-
- if (id < 1) {
- return callback(new Error(_('Missing List ID')));
- }
-
- const data = tools.convertKeys(updates);
-
- const keys = [];
- const values = [];
-
- // The update can be only partial when executed from forms/:list
- if (!data.customFormChangeOnly) {
- data.publicSubscribe = data.publicSubscribe ? 1 : 0;
- data.listunsubscribeDisabled = data.listunsubscribeDisabled ? 1 : 0;
- data.unsubscriptionMode = Number(data.unsubscriptionMode);
-
- let name = (data.name || '').toString().trim();
-
- if (!name) {
- return callback(new Error(_('List Name must be set')));
- }
-
- keys.push('name');
- values.push(name);
- }
-
- Object.keys(data).forEach(key => {
- let value = data[key].toString().trim();
- key = tools.toDbKey(key);
- if (key === 'description') {
- value = tools.purifyHTML(value);
- }
- if (allowedKeys.indexOf(key) >= 0) {
- keys.push(key);
- values.push(value);
- }
- });
-
- db.getConnection((err, connection) => {
- if (err) {
- return callback(err);
- }
-
- values.push(id);
-
- connection.query('UPDATE lists SET ' + keys.map(key => key + '=?').join(', ') + ' WHERE id=? LIMIT 1', values, (err, result) => {
- connection.release();
- if (err) {
- return callback(err);
- }
- return callback(null, result && result.affectedRows || false);
- });
- });
-};
-
module.exports.create = (list, callback) => {
let data = tools.convertKeys(list);
- data.publicSubscribe = data.publicSubscribe ? 1 : 0;
-
let name = (data.name || '').toString().trim();
if (!data) {
- return callback(new Error(_('List Name must be set')));
+ return callback(new Error('List Name must be set'));
}
let keys = ['name'];
let values = [name];
- Object.keys(data).forEach(key => {
- let value = data[key].toString().trim();
+ Object.keys(list).forEach(key => {
+ let value = list[key].trim();
key = tools.toDbKey(key);
- if (key === 'description') {
- value = tools.purifyHTML(value);
- }
if (allowedKeys.indexOf(key) >= 0) {
keys.push(key);
values.push(value);
@@ -258,11 +160,55 @@ module.exports.create = (list, callback) => {
});
};
+module.exports.update = (id, updates, callback) => {
+ updates = updates || {};
+ id = Number(id) || 0;
+
+ let data = tools.convertKeys(updates);
+
+ let name = (data.name || '').toString().trim();
+ let keys = ['name'];
+ let values = [name];
+
+ if (id < 1) {
+ return callback(new Error('Missing List ID'));
+ }
+
+ if (!name) {
+ return callback(new Error('List Name must be set'));
+ }
+
+ Object.keys(updates).forEach(key => {
+ let value = updates[key].trim();
+ key = tools.toDbKey(key);
+ if (allowedKeys.indexOf(key) >= 0) {
+ keys.push(key);
+ values.push(value);
+ }
+ });
+
+ db.getConnection((err, connection) => {
+ if (err) {
+ return callback(err);
+ }
+
+ values.push(id);
+
+ connection.query('UPDATE lists SET ' + keys.map(key => key + '=?').join(', ') + ' WHERE id=? LIMIT 1', values, (err, result) => {
+ connection.release();
+ if (err) {
+ return callback(err);
+ }
+ return callback(null, result && result.affectedRows || false);
+ });
+ });
+};
+
module.exports.delete = (id, callback) => {
id = Number(id) || 0;
if (id < 1) {
- return callback(new Error(_('Missing List ID')));
+ return callback(new Error('Missing List ID'));
}
db.getConnection((err, connection) => {
@@ -291,7 +237,7 @@ module.exports.delete = (id, callback) => {
function resolveCid(cid, callback) {
cid = (cid || '').toString().trim();
if (!cid) {
- return callback(new Error(_('Missing List CID')));
+ return callback(new Error('Missing List CID'));
}
db.getConnection((err, connection) => {
diff --git a/lib/models/report-templates.js b/lib/models/report-templates.js
deleted file mode 100644
index 6dcb2c70..00000000
--- a/lib/models/report-templates.js
+++ /dev/null
@@ -1,161 +0,0 @@
-'use strict';
-
-const db = require('../db');
-const tableHelpers = require('../table-helpers');
-const tools = require('../tools');
-const _ = require('../translate')._;
-
-const allowedKeys = ['name', 'description', 'mime_type', 'user_fields', 'js', 'hbs'];
-
-module.exports.list = (start, limit, callback) => {
- tableHelpers.list('report_templates', ['*'], 'name', null, start, limit, callback);
-};
-
-module.exports.quicklist = callback => {
- tableHelpers.quicklist('report_templates', ['id', 'name'], 'name', callback);
-};
-
-module.exports.filter = (request, callback) => {
- tableHelpers.filter('report_templates', ['*'], request, ['#', 'name', 'description', 'created'], ['name'], 'created DESC', null, callback);
-};
-
-module.exports.get = (id, callback) => {
- id = Number(id) || 0;
-
- if (id < 1) {
- return callback(new Error(_('Missing report template ID')));
- }
-
- db.getConnection((err, connection) => {
- if (err) {
- return callback(err);
- }
-
- connection.query('SELECT * FROM report_templates WHERE id=?', [id], (err, rows) => {
- connection.release();
- if (err) {
- return callback(err);
- }
-
- if (!rows || !rows.length) {
- return callback(null, false);
- }
-
- const template = tools.convertKeys(rows[0]);
-
- const userFields = template.userFields.trim();
- if (userFields !== '') {
- try {
- template.userFieldsObject = JSON.parse(userFields);
- } catch (err) {
- // This is to handle situation when for some reason we get corrupted JSON in the DB.
- template.userFieldsObject = {};
- template.userFields = '{}';
- }
- } else {
- template.userFieldsObject = {};
- }
-
- return callback(null, template);
- });
- });
-};
-
-module.exports.createOrUpdate = (createMode, data, callback) => {
- data = data || {};
-
- const id = 'id' in data ? Number(data.id) : 0;
-
- if (!createMode && id < 1) {
- return callback(new Error(_('Missing report template ID')));
- }
-
- const template = tools.convertKeys(data);
- const name = (template.name || '').toString().trim();
-
- if (!name) {
- return callback(new Error(_('Report template name must be set')));
- }
-
- const keys = ['name'];
- const values = [name];
-
- Object.keys(template).forEach(key => {
- let value = typeof template[key] === 'number' ? template[key] : (template[key] || '').toString().trim();
- key = tools.toDbKey(key);
-
- if (key === 'description') {
- value = tools.purifyHTML(value);
- }
-
- if (key === 'user_fields') {
- value = value.trim();
-
- if (value !== '') {
- try {
- JSON.parse(value);
- } catch (err) {
- return callback(err);
- }
- }
- }
-
- if (allowedKeys.indexOf(key) >= 0 && keys.indexOf(key) < 0) {
- keys.push(key);
- values.push(value);
- }
- });
-
- db.getConnection((err, connection) => {
- if (err) {
- return callback(err);
- }
-
- let query;
-
- if (createMode) {
- query = 'INSERT INTO report_templates (`' + keys.join('`, `') + '`) VALUES (' + values.map(() => '?').join(',') + ')';
- } else {
- query = 'UPDATE report_templates SET ' + keys.map(key => '`' + key + '`=?').join(', ') + ' WHERE id=? LIMIT 1';
- values.push(id);
- }
-
- connection.query(query, values, (err, result) => {
- connection.release();
- if (err) {
- return callback(err);
- }
-
- if (createMode) {
- return callback(null, result && result.insertId || false);
- } else {
- return callback(null, result && result.affectedRows || false);
- }
- });
- });
-};
-
-module.exports.delete = (id, callback) => {
- id = Number(id) || 0;
-
- if (id < 1) {
- return callback(new Error(_('Missing report template ID')));
- }
-
- db.getConnection((err, connection) => {
- if (err) {
- return callback(err);
- }
-
- connection.query('DELETE FROM report_templates WHERE id=? LIMIT 1', [id], (err, result) => {
- connection.release();
- if (err) {
- return callback(err);
- }
-
- const affected = result && result.affectedRows || 0;
- return callback(err, affected);
- });
- });
-};
-
diff --git a/lib/models/reports.js b/lib/models/reports.js
deleted file mode 100644
index edfe665f..00000000
--- a/lib/models/reports.js
+++ /dev/null
@@ -1,262 +0,0 @@
-'use strict';
-
-const db = require('../db');
-const tableHelpers = require('../table-helpers');
-const fields = require('./fields');
-const reportTemplates = require('./report-templates');
-const tools = require('../tools');
-const _ = require('../translate')._;
-
-const allowedKeys = ['name', 'description', 'report_template', 'params'];
-
-const ReportState = {
- SCHEDULED: 0,
- PROCESSING: 1,
- FINISHED: 2,
- FAILED: 3,
- MAX: 4
-};
-
-module.exports.ReportState = ReportState;
-
-module.exports.list = (start, limit, callback) => {
- tableHelpers.list('reports', ['*'], 'name', null, start, limit, callback);
-};
-
-module.exports.listWithState = (state, start, limit, callback) => {
- tableHelpers.list('reports', ['*'], 'name', { where: 'state=?', values: [state] }, start, limit, callback);
-};
-
-module.exports.filter = (request, callback) => {
- tableHelpers.filter('reports JOIN report_templates ON reports.report_template = report_templates.id',
- ['reports.id AS id', 'reports.name AS name', 'reports.description AS description', 'reports.state AS state', 'reports.report_template AS report_template', 'reports.params AS params', 'reports.last_run AS last_run', 'report_templates.name AS report_template_name', 'report_templates.mime_type AS mime_type' ],
- request, ['#', 'name', 'report_templates.name', 'description', 'last_run'], ['name'], 'name ASC', null, callback);
-};
-
-module.exports.get = (id, callback) => {
- id = Number(id) || 0;
-
- if (id < 1) {
- return callback(new Error(_('Missing report ID')));
- }
-
- db.getConnection((err, connection) => {
- if (err) {
- return callback(err);
- }
-
- connection.query('SELECT * FROM reports WHERE id=?', [id], (err, rows) => {
- connection.release();
- if (err) {
- return callback(err);
- }
-
- if (!rows || !rows.length) {
- return callback(null, false);
- }
-
- const template = tools.convertKeys(rows[0]);
-
- const params = template.params.trim();
- if (params !== '') {
- try {
- template.paramsObject = JSON.parse(params);
- } catch (err) {
- return callback(err);
- }
- } else {
- template.params = {};
- }
-
- return callback(null, template);
- });
- });
-};
-
-// This method is not supposed to be used for unsanitized inputs. It does not do any checks.
-module.exports.updateFields = (id, fieldValueMap, callback) => {
- db.getConnection((err, connection) => {
- if (err) {
- return callback(err);
- }
-
- const clauses = [];
- const values = [];
- for (let key of Object.keys(fieldValueMap)) {
- clauses.push(tools.toDbKey(key) + '=?');
- values.push(fieldValueMap[key]);
- }
-
- values.push(id);
-
- const query = 'UPDATE reports SET ' + clauses.join(', ') + ' WHERE id=? LIMIT 1';
- connection.query(query, values, (err, result) => {
- connection.release();
- if (err) {
- return callback(err);
- }
-
- return callback(null, result && result.affectedRows || false);
- });
- });
-};
-
-module.exports.createOrUpdate = (createMode, report, callback) => {
- report = report || {};
-
- const id = 'id' in report ? Number(report.id) : 0;
-
- if (!createMode && id < 1) {
- return callback(new Error(_('Missing report ID')));
- }
-
- const name = (report.name || '').toString().trim();
-
- if (!name) {
- return callback(new Error(_('Report name must be set')));
- }
-
- const reportTemplateId = Number(report.reportTemplate);
- reportTemplates.get(reportTemplateId, (err, reportTemplate) => {
- if (err) {
- return callback(err);
- }
-
- const params = report.paramsObject;
- for (const spec of reportTemplate.userFieldsObject) {
- if (params[spec.id].length < spec.minOccurences) {
- return callback(new Error(_('At least ' + spec.minOccurences + ' rows in "' + spec.name + '" have to be selected.')));
- }
-
- if (params[spec.id].length > spec.maxOccurences) {
- return callback(new Error(_('At most ' + spec.minOccurences + ' rows in "' + spec.name + '" can be selected.')));
- }
- }
-
- const keys = ['name', 'params'];
- const values = [name, JSON.stringify(params)];
-
-
- Object.keys(report).forEach(key => {
- let value = typeof report[key] === 'number' ? report[key] : (report[key] || '').toString().trim();
- key = tools.toDbKey(key);
-
- if (key === 'description') {
- value = tools.purifyHTML(value);
- }
-
- if (allowedKeys.indexOf(key) >= 0 && keys.indexOf(key) < 0) {
- keys.push(key);
- values.push(value);
- }
- });
-
- db.getConnection((err, connection) => {
- if (err) {
- return callback(err);
- }
-
- let query;
-
- if (createMode) {
- query = 'INSERT INTO reports (`' + keys.join('`, `') + '`) VALUES (' + values.map(() => '?').join(',') + ')';
- } else {
- query = 'UPDATE reports SET ' + keys.map(key => '`' + key + '`=?').join(', ') + ' WHERE id=? LIMIT 1';
- values.push(id);
- }
-
- connection.query(query, values, (err, result) => {
- connection.release();
- if (err) {
- return callback(err);
- }
-
- if (createMode) {
- return callback(null, result && result.insertId || false);
- } else {
- return callback(null, result && result.affectedRows || false);
- }
- });
- });
- });
-};
-
-module.exports.delete = (id, callback) => {
- id = Number(id) || 0;
-
- if (id < 1) {
- return callback(new Error(_('Missing report ID')));
- }
-
- db.getConnection((err, connection) => {
- if (err) {
- return callback(err);
- }
-
- connection.query('DELETE FROM reports WHERE id=? LIMIT 1', [id], (err, result) => {
- connection.release();
- if (err) {
- return callback(err);
- }
-
- const affected = result && result.affectedRows || 0;
- return callback(err, affected);
- });
- });
-};
-
-const campaignFieldsMapping = {
- tracker_count: 'tracker.count',
- country: 'tracker.country',
- device_type: 'tracker.device_type',
- status: 'campaign.status',
- first_name: 'subscribers.first_name',
- last_name: 'subscribers.last_name',
- email: 'subscribers.email'
-};
-
-module.exports.getCampaignResults = (campaign, select, clause, callback) => {
- db.getConnection((err, connection) => {
- if (err) {
- return callback(err);
- }
-
- fields.list(campaign.list, (err, fieldList) => {
- if (err) {
- return callback(err);
- }
-
- const fieldsMapping = fieldList.reduce((map, field) => {
- map[customFieldName(field.key)] = 'subscribers.' + field.column;
- return map;
- }, Object.assign({}, campaignFieldsMapping));
-
- let selFields = [];
- for (let idx = 0; idx < select.length; idx++) {
- const item = select[idx];
- if (item in fieldsMapping) {
- selFields.push(fieldsMapping[item] + ' AS ' + item);
- } else if (item === '*') {
- selFields = selFields.concat(Object.keys(fieldsMapping).map(item => fieldsMapping[item] + ' AS ' + item));
- } else {
- selFields.push(item);
- }
- }
-
- const query = 'SELECT ' + selFields.join(', ') + ' FROM `subscription__' + campaign.list + '` subscribers INNER JOIN `campaign__' + campaign.id + '` campaign on subscribers.id=campaign.subscription LEFT JOIN `campaign_tracker__' + campaign.id + '` tracker on subscribers.id=tracker.subscriber ' + clause;
-
- connection.query(query, (err, results) => {
- connection.release();
- if (err) {
- return callback(err);
- }
-
- return callback(null, results);
- });
- });
- });
-};
-
-function customFieldName(id) {
- return id.replace(/MERGE_/, 'CUSTOM_').toLowerCase();
-}
diff --git a/lib/models/segments.js b/lib/models/segments.js
index a2e891f9..edd28e17 100644
--- a/lib/models/segments.js
+++ b/lib/models/segments.js
@@ -3,36 +3,34 @@
let tools = require('../tools');
let db = require('../db');
let fields = require('./fields');
-let util = require('util');
-let _ = require('../translate')._;
module.exports.defaultColumns = [{
column: 'email',
- name: _('Email address'),
+ name: 'Email address',
type: 'string'
}, {
column: 'opt_in_country',
- name: _('Signup country'),
+ name: 'Signup country',
type: 'string'
}, {
column: 'created',
- name: _('Sign up date'),
+ name: 'Sign up date',
type: 'date'
}, {
column: 'latest_open',
- name: _('Latest open'),
+ name: 'Latest open',
type: 'date'
}, {
column: 'latest_click',
- name: _('Latest click'),
+ name: 'Latest click',
type: 'date'
}, {
column: 'first_name',
- name: _('First name'),
+ name: 'First name',
type: 'string'
}, {
column: 'last_name',
- name: _('Last name'),
+ name: 'Last name',
type: 'string'
}];
@@ -40,7 +38,7 @@ module.exports.list = (listId, callback) => {
listId = Number(listId) || 0;
if (listId < 1) {
- return callback(new Error(_('Missing List ID')));
+ return callback(new Error('Missing List ID'));
}
@@ -66,7 +64,7 @@ module.exports.get = (id, callback) => {
id = Number(id) || 0;
if (id < 1) {
- return callback(new Error(_('Missing Segment ID')));
+ return callback(new Error('Missing Segment ID'));
}
db.getConnection((err, connection) => {
@@ -82,7 +80,7 @@ module.exports.get = (id, callback) => {
}
if (!rows || !rows.length) {
connection.release();
- return callback(new Error(_('Segment not found')));
+ return callback(new Error('Segment not found'));
}
let segment = tools.convertKeys(rows[0]);
@@ -101,9 +99,6 @@ module.exports.get = (id, callback) => {
segment.columns = [].concat(module.exports.defaultColumns);
fieldList.forEach(field => {
- if (fields.genericTypes[field.type] === 'textarea') {
- return;
- }
if (field.column) {
segment.columns.push({
column: field.column,
@@ -142,21 +137,17 @@ module.exports.get = (id, callback) => {
case 'number':
case 'date':
case 'birthday':
- if (rule.value.relativeRange) {
- let startString = rule.value.startDirection ? util.format(_('%s days after today'), rule.value.start) : util.format(_('%s days before today'), rule.value.start);
- let endString = rule.value.endDirection ? util.format(_('%s days after today'), rule.value.end) : util.format(_('%s days before today'), rule.value.end);
- rule.formatted = (rule.value.start ? startString : _('today')) + ' … ' + (rule.value.end ? endString : _('today'));
- } else if (rule.value.range) {
+ if (rule.value.range) {
rule.formatted = (rule.value.start || '') + ' … ' + (rule.value.end || '');
} else {
rule.formatted = rule.value.value || '';
}
break;
case 'boolean':
- rule.formatted = rule.value.value ? _('Selected') : _('Not selected');
+ rule.formatted = rule.value.value ? 'Selected' : 'Not selected';
break;
default:
- rule.formatted = (rule.value.negate ? '!= ' : '') + (rule.value.value || '');
+ rule.formatted = rule.value.value || '';
}
return rule;
@@ -173,7 +164,7 @@ module.exports.create = (listId, segment, callback) => {
listId = Number(listId) || 0;
if (listId < 1) {
- return callback(new Error(_('Missing List ID')));
+ return callback(new Error('Missing List ID'));
}
segment = tools.convertKeys(segment);
@@ -182,11 +173,11 @@ module.exports.create = (listId, segment, callback) => {
segment.type = Number(segment.type) || 0;
if (!segment.name) {
- return callback(new Error(_('Field Name must be set')));
+ return callback(new Error('Field Name must be set'));
}
if (segment.type <= 0) {
- return callback(new Error(_('Invalid segment rule type')));
+ return callback(new Error('Invalid segment rule type'));
}
let keys = ['list', 'name', 'type'];
@@ -213,7 +204,7 @@ module.exports.update = (id, updates, callback) => {
id = Number(id) || 0;
if (id < 1) {
- return callback(new Error(_('Missing Segment ID')));
+ return callback(new Error('Missing Segment ID'));
}
let segment = tools.convertKeys(updates);
@@ -222,11 +213,11 @@ module.exports.update = (id, updates, callback) => {
segment.type = Number(segment.type) || 0;
if (!segment.name) {
- return callback(new Error(_('Field Name must be set')));
+ return callback(new Error('Field Name must be set'));
}
if (segment.type <= 0) {
- return callback(new Error(_('Invalid segment rule type')));
+ return callback(new Error('Invalid segment rule type'));
}
let keys = ['name', 'type'];
@@ -253,7 +244,7 @@ module.exports.delete = (id, callback) => {
id = Number(id) || 0;
if (id < 1) {
- return callback(new Error(_('Missing Segment ID')));
+ return callback(new Error('Missing Segment ID'));
}
db.getConnection((err, connection) => {
@@ -275,7 +266,7 @@ module.exports.createRule = (segmentId, rule, callback) => {
segmentId = Number(segmentId) || 0;
if (segmentId < 1) {
- return callback(new Error(_('Missing Segment ID')));
+ return callback(new Error('Missing Segment ID'));
}
rule = tools.convertKeys(rule);
@@ -286,12 +277,12 @@ module.exports.createRule = (segmentId, rule, callback) => {
}
if (!segment) {
- return callback(new Error(_('Selected segment not found')));
+ return callback(new Error('Selected segment not found'));
}
let column = segment.columns.filter(column => column.column === rule.column).pop();
if (!column) {
- return callback(new Error(_('Invalid rule type')));
+ return callback(new Error('Invalid rule type'));
}
let value;
@@ -300,15 +291,7 @@ module.exports.createRule = (segmentId, rule, callback) => {
case 'date':
case 'birthday':
case 'number':
- if (column.type === 'date' && rule.range === 'relative') {
- value = {
- relativeRange: true,
- start: Number(rule.startRelative) || 0,
- startDirection: Number(rule.startDirection) ? 1 : 0,
- end: Number(rule.endRelative) || 0,
- endDirection: Number(rule.endDirection) ? 1 : 0
- };
- } else if (rule.range === 'yes') {
+ if (rule.range) {
value = {
range: true,
start: rule.start,
@@ -327,7 +310,6 @@ module.exports.createRule = (segmentId, rule, callback) => {
break;
default:
value = {
- negate: Number(rule.negate) ? 1 : 0,
value: rule.value
};
}
@@ -356,7 +338,7 @@ module.exports.getRule = (id, callback) => {
id = Number(id) || 0;
if (id < 1) {
- return callback(new Error(_('Missing Rule ID')));
+ return callback(new Error('Missing Rule ID'));
}
db.getConnection((err, connection) => {
@@ -372,7 +354,7 @@ module.exports.getRule = (id, callback) => {
}
if (!rows || !rows.length) {
- return callback(new Error(_('Specified rule not found')));
+ return callback(new Error('Specified rule not found'));
}
let rule = tools.convertKeys(rows[0]);
@@ -383,7 +365,7 @@ module.exports.getRule = (id, callback) => {
}
if (!segment) {
- return callback(new Error(_('Specified segment not found')));
+ return callback(new Error('Specified segment not found'));
}
if (rule.value) {
@@ -404,22 +386,17 @@ module.exports.getRule = (id, callback) => {
case 'number':
case 'date':
case 'birthday':
- if (rule.value.relativeRange) {
-
- let startString = rule.value.startDirection ? util.format(_('%s days after today'), rule.value.start) : util.format(_('%s days before today'), rule.value.start);
- let endString = rule.value.endDirection ? util.format(_('%s days after today'), rule.value.end) : util.format(_('%s days before today'), rule.value.end);
- rule.formatted = (rule.value.start ? startString : _('today')) + ' … ' + (rule.value.end ? endString : _('today'));
- } else if (rule.value.range) {
+ if (rule.value.range) {
rule.formatted = (rule.value.start || '') + ' … ' + (rule.value.end || '');
} else {
rule.formatted = rule.value.value || '';
}
break;
case 'boolean':
- rule.formatted = rule.value.value ? _('Selected') : _('Not selected');
+ rule.formatted = rule.value.value ? 'Selected' : 'Not selected';
break;
default:
- rule.formatted = (rule.value.negate ? '!= ' : '') + (rule.value.value || '');
+ rule.formatted = rule.value.value || '';
}
return callback(null, rule);
@@ -432,7 +409,7 @@ module.exports.updateRule = (id, rule, callback) => {
id = Number(id) || 0;
if (id < 1) {
- return callback(new Error(_('Missing Rule ID')));
+ return callback(new Error('Missing Rule ID'));
}
rule = tools.convertKeys(rule);
@@ -443,7 +420,7 @@ module.exports.updateRule = (id, rule, callback) => {
}
if (!existingRule) {
- return callback(new Error(_('Selected rule not found')));
+ return callback(new Error('Selected rule not found'));
}
module.exports.get(existingRule.segment, (err, segment) => {
@@ -452,12 +429,12 @@ module.exports.updateRule = (id, rule, callback) => {
}
if (!segment) {
- return callback(new Error(_('Selected segment not found')));
+ return callback(new Error('Selected segment not found'));
}
let column = segment.columns.filter(column => column.column === existingRule.column).pop();
if (!column) {
- return callback(new Error(_('Invalid rule type')));
+ return callback(new Error('Invalid rule type'));
}
let value;
@@ -465,15 +442,7 @@ module.exports.updateRule = (id, rule, callback) => {
case 'date':
case 'birthday':
case 'number':
- if (column.type === 'date' && rule.range === 'relative') {
- value = {
- relativeRange: true,
- start: Number(rule.startRelative) || 0,
- startDirection: Number(rule.startDirection) ? 1 : 0,
- end: Number(rule.endRelative) || 0,
- endDirection: Number(rule.endDirection) ? 1 : 0
- };
- } else if (rule.range === 'yes') {
+ if (rule.range) {
value = {
range: true,
start: rule.start,
@@ -492,7 +461,6 @@ module.exports.updateRule = (id, rule, callback) => {
break;
default:
value = {
- negate: Number(rule.negate) ? 1 : 0,
value: rule.value
};
}
@@ -523,7 +491,7 @@ module.exports.deleteRule = (id, callback) => {
id = Number(id) || 0;
if (id < 1) {
- return callback(new Error(_('Missing Rule ID')));
+ return callback(new Error('Missing Rule ID'));
}
db.getConnection((err, connection) => {
@@ -541,26 +509,19 @@ module.exports.deleteRule = (id, callback) => {
});
};
-module.exports.getQuery = (id, prefix, callback) => {
+module.exports.getQuery = (id, callback) => {
module.exports.get(id, (err, segment) => {
if (err) {
return callback(err);
}
if (!segment) {
- return callback(new Error(_('Segment not found')));
+ return callback(new Error('Segment not found'));
}
- prefix = prefix ? prefix + '.' : '';
-
let query = [];
let values = [];
- let getRelativeDate = (days, direction) => {
- let date = new Date(Date.now() + (direction ? 1 : -1) * days * 24 * 3600 * 1000);
- return date.toISOString().substr(0, 10);
- };
-
let getDate = (value, nextDay) => {
let parts = value.trim().split(/\D/);
let year = Number(parts.shift()) || 0;
@@ -574,70 +535,47 @@ module.exports.getQuery = (id, prefix, callback) => {
segment.rules.forEach(rule => {
switch (rule.columnType.type) {
- case 'string': {
- let condition = rule.value.negate ? 'NOT LIKE' : 'LIKE';
- query.push(prefix + '`' + rule.columnType.column + '` ' + condition + ' ?');
+ case 'string':
+ query.push('`' + rule.columnType.column + '` LIKE ?');
values.push(rule.value.value);
break;
- }
case 'boolean':
- query.push(prefix + '`' + rule.columnType.column + '` = ?');
+ query.push('`' + rule.columnType.column + '` = ?');
values.push(rule.value.value);
break;
case 'number':
if (rule.value.range) {
- let ruleval = '';
- if (rule.value.start) {
- ruleval = prefix + '`' + rule.columnType.column + '` >= ?';
- values.push(rule.value.start);
- }
- if (rule.value.end) {
- ruleval = (ruleval ? '(' + ruleval + ' AND ' : '') + prefix + '`' + rule.columnType.column + '` < ?' + (ruleval ? ')' : '');
- values.push(rule.value.end);
- }
- if (ruleval) {
- query.push(ruleval);
- }
+ query.push('`' + rule.columnType.column + '` >= ?');
+ query.push('`' + rule.columnType.column + '` < ?');
+ values.push(rule.value.start);
+ values.push(rule.value.end);
} else {
- query.push(prefix + '`' + rule.columnType.column + '` = ?');
+ query.push('`' + rule.columnType.column + '` = ?');
values.push(rule.value.value);
}
break;
case 'birthday':
if (rule.value.range) {
- let start = rule.value.start || '01-01';
- let end = rule.value.end || '12-31';
- query.push('(' + prefix + '`' + rule.columnType.column + '` >= ? AND ' + prefix + '`' + rule.columnType.column + '` < ?)');
- values.push(getDate('2000-' + start));
- values.push(getDate('2000-' + end, true));
+ query.push('`' + rule.columnType.column + '` >= ?');
+ query.push('`' + rule.columnType.column + '` < ?');
+ values.push(getDate('2000-' + rule.value.start));
+ values.push(getDate('2000-' + rule.value.end, true));
} else {
- query.push('(' + prefix + '`' + rule.columnType.column + '` >= ? AND ' + prefix + '`' + rule.columnType.column + '` < ?)');
+ query.push('`' + rule.columnType.column + '` >= ?');
+ query.push('`' + rule.columnType.column + '` < ?');
values.push(getDate('2000-' + rule.value.value));
values.push(getDate('2000-' + rule.value.value, true));
}
break;
case 'date':
- if (rule.value.relativeRange) {
- query.push('(' + prefix + '`' + rule.columnType.column + '` >= ? AND ' + prefix + '`' + rule.columnType.column + '` < ?)');
- // start
- values.push(getDate(getRelativeDate(rule.value.start, rule.value.startDirection)));
- // end
- values.push(getDate(getRelativeDate(rule.value.end, rule.value.endDirection), true));
- } else if (rule.value.range) {
- let ruleval = '';
- if (rule.value.start) {
- ruleval = prefix + '`' + rule.columnType.column + '` >= ?';
- values.push(getDate(rule.value.start));
- }
- if (rule.value.end) {
- ruleval = (ruleval ? '(' + ruleval + ' AND ' : '') + prefix + '`' + rule.columnType.column + '` < ?' + (ruleval ? ')' : '');
- values.push(getDate(rule.value.end, true));
- }
- if (ruleval) {
- query.push(ruleval);
- }
+ if (rule.value.range) {
+ query.push('`' + rule.columnType.column + '` >= ?');
+ query.push('`' + rule.columnType.column + '` < ?');
+ values.push(getDate(rule.value.start));
+ values.push(getDate(rule.value.end, true));
} else {
- query.push('(' + prefix + '`' + rule.columnType.column + '` >= ? AND ' + prefix + '`' + rule.columnType.column + '` < ?)');
+ query.push('`' + rule.columnType.column + '` >= ?');
+ query.push('`' + rule.columnType.column + '` < ?');
values.push(getDate(rule.value.value));
values.push(getDate(rule.value.value, true));
}
@@ -659,9 +597,9 @@ module.exports.subscribers = (id, onlySubscribed, callback) => {
return callback(err);
}
if (!segment) {
- return callback(new Error(_('Segment not found')));
+ return callback(new Error('Segment not found'));
}
- module.exports.getQuery(id, false, (err, queryData) => {
+ module.exports.getQuery(id, (err, queryData) => {
if (err) {
return callback(err);
}
diff --git a/lib/models/settings.js b/lib/models/settings.js
index 9655ebd7..77b9f391 100644
--- a/lib/models/settings.js
+++ b/lib/models/settings.js
@@ -15,8 +15,6 @@ function listValues(filter, callback) {
filter = false;
}
- // TODO: It would be good to cache the settings. It feels awkward to always go to DB to retrieve something what is essentially a constant
-
filter = [].concat(filter || []).map(key => tools.toDbKey(key));
db.getConnection((err, connection) => {
diff --git a/lib/models/subscriptions.js b/lib/models/subscriptions.js
index 3a9a7f58..f30b0980 100644
--- a/lib/models/subscriptions.js
+++ b/lib/models/subscriptions.js
@@ -2,23 +2,10 @@
let db = require('../db');
let shortid = require('shortid');
-let striptags = require('striptags');
let tools = require('../tools');
-let helpers = require('../helpers');
let fields = require('./fields');
+let geoip = require('geoip-ultralight');
let segments = require('./segments');
-let _ = require('../translate')._;
-let tableHelpers = require('../table-helpers');
-
-const Status = {
- SUBSCRIBED: 1,
- UNSUBSCRIBED: 2,
- BOUNCED: 3,
- COMPLAINED: 4,
- MAX: 5
-};
-
-module.exports.Status = Status;
module.exports.list = (listId, start, limit, callback) => {
listId = Number(listId) || 0;
@@ -26,47 +13,25 @@ module.exports.list = (listId, start, limit, callback) => {
return callback(new Error('Missing List ID'));
}
- tableHelpers.list('subscription__' + listId, ['*'], 'email', null, start, limit, (err, rows, total) => {
- if (!err) {
- rows = rows.map(row => tools.convertKeys(row));
- }
- return callback(err, rows, total);
- });
-};
-
-module.exports.listTestUsers = (listId, callback) => {
- listId = Number(listId) || 0;
-
- if (listId < 1) {
- return callback(new Error('Missing List ID'));
- }
-
db.getConnection((err, connection) => {
if (err) {
return callback(err);
}
- connection.query('SELECT id, cid, email, first_name, last_name FROM `subscription__' + listId + '` WHERE is_test=1 LIMIT 100', (err, rows) => {
- connection.release();
+ connection.query('SELECT SQL_CALC_FOUND_ROWS * FROM `subscription__' + listId + '` ORDER BY email LIMIT ? OFFSET ?', [limit, start], (err, rows) => {
if (err) {
+ connection.release();
return callback(err);
}
-
- if (!rows || !rows.length) {
- return callback(null, []);
- }
-
- let subscribers = rows.map(subscriber => {
- subscriber = tools.convertKeys(subscriber);
- let fullName = [].concat(subscriber.firstName || []).concat(subscriber.lastName || []).join(' ');
- if (fullName) {
- subscriber.displayName = fullName + ' <' + subscriber.email + '>';
- } else {
- subscriber.displayName = subscriber.email;
+ connection.query('SELECT FOUND_ROWS() AS total', (err, total) => {
+ connection.release();
+ if (err) {
+ return callback(err);
}
- return subscriber;
+
+ let subscriptions = rows.map(row => tools.convertKeys(row));
+ return callback(null, subscriptions, total && total[0] && total[0].total);
});
- return callback(null, subscribers);
});
});
};
@@ -76,34 +41,182 @@ module.exports.filter = (listId, request, columns, segmentId, callback) => {
segmentId = Number(segmentId) || 0;
if (!listId) {
- return callback(new Error(_('Missing List ID')));
+ return callback(new Error('Missing List ID'));
}
- if (segmentId) {
- segments.getQuery(segmentId, false, (err, queryData) => {
+ let processQuery = queryData => {
+
+ db.getConnection((err, connection) => {
if (err) {
return callback(err);
}
- tableHelpers.filter('subscription__' + listId, ['*'], request, columns, ['email', 'first_name', 'last_name'], 'email ASC', queryData, callback);
+ let query = 'SELECT COUNT(id) AS total FROM `subscription__' + listId + '`';
+ let values = [];
+
+ if (queryData.where) {
+ query += ' WHERE ' + queryData.where;
+ values = values.concat(queryData.values || []);
+ }
+
+ connection.query(query, values, (err, total) => {
+ if (err) {
+ connection.release();
+ return callback(err);
+ }
+ total = total && total[0] && total[0].total || 0;
+
+ let ordering = [];
+
+ if (request.order && request.order.length) {
+
+ request.order.forEach(order => {
+ let orderField = columns[Number(order.column)];
+ let orderDirection = (order.dir || '').toString().toLowerCase() === 'desc' ? 'DESC' : 'ASC';
+ if (orderField) {
+ ordering.push('`' + orderField + '` ' + orderDirection);
+ }
+ });
+ }
+
+ if (!ordering.length) {
+ ordering.push('`email` ASC');
+ }
+
+ let args = [Number(request.length) || 50, Number(request.start) || 0];
+ let query;
+
+ if (request.search && request.search.value) {
+ query = 'SELECT SQL_CALC_FOUND_ROWS * FROM `subscription__' + listId + '` WHERE email LIKE ? OR first_name LIKE ? OR last_name LIKE ? ' + (queryData.where ? ' AND (' + queryData.where + ')' : '') + ' ORDER BY ' + ordering.join(', ') + ' LIMIT ? OFFSET ?';
+
+ let searchVal = '%' + request.search.value.replace(/\\/g, '\\\\').replace(/([%_])/g, '\\$1') + '%';
+ args = [searchVal, searchVal, searchVal].concat(queryData.values || []).concat(args);
+ } else {
+ query = 'SELECT SQL_CALC_FOUND_ROWS * FROM `subscription__' + listId + '` WHERE 1 ' + (queryData.where ? ' AND (' + queryData.where + ')' : '') + ' ORDER BY ' + ordering.join(', ') + ' LIMIT ? OFFSET ?';
+ args = [].concat(queryData.values || []).concat(args);
+ }
+
+ connection.query(query, args, (err, rows) => {
+ if (err) {
+ connection.release();
+ return callback(err);
+ }
+ connection.query('SELECT FOUND_ROWS() AS total', (err, filteredTotal) => {
+ connection.release();
+ if (err) {
+ return callback(err);
+ }
+
+ let subscriptions = rows.map(row => tools.convertKeys(row));
+
+ filteredTotal = filteredTotal && filteredTotal[0] && filteredTotal[0].total || 0;
+ return callback(null, subscriptions, total, filteredTotal);
+ });
+ });
+ });
+ });
+ };
+
+ if (segmentId) {
+ segments.getQuery(segmentId, (err, queryData) => {
+ if (err) {
+ return callback(err);
+ }
+ processQuery(queryData);
});
} else {
- tableHelpers.filter('subscription__' + listId, ['*'], request, columns, ['email', 'first_name', 'last_name'], 'email ASC', null, callback);
+ processQuery(false);
}
};
-/*
- Adds a new subscription. Returns error if a subscription with the same email address is already present and is not unsubscribed.
- If it is unsubscribed, the existing subscription is changed based on the provided data.
- If meta.partial is true, it updates even an active subscription.
- */
-module.exports.insert = (listId, meta, subscriptionData, callback) => {
- meta = tools.convertKeys(meta);
- subscriptionData = tools.convertKeys(subscriptionData);
+module.exports.addConfirmation = (listId, email, data, callback) => {
+ let cid = shortid.generate();
- meta.email = meta.email || subscriptionData.email;
+ tools.validateEmail(email, false, err => {
+ if (err) {
+ return callback(err);
+ }
+
+ db.getConnection((err, connection) => {
+ if (err) {
+ return callback(err);
+ }
+
+ let query = 'INSERT INTO confirmations (cid, list, email, data) VALUES (?,?,?,?)';
+ connection.query(query, [cid, listId, email, JSON.stringify(data || {})], (err, result) => {
+ connection.release();
+ if (err) {
+ return callback(err);
+ }
+ return callback(null, result && cid || false);
+ });
+ });
+ });
+};
+
+module.exports.subscribe = (cid, optInIp, callback) => {
+ db.getConnection((err, connection) => {
+ if (err) {
+ return callback(err);
+ }
+
+ let query = 'SELECT * FROM confirmations WHERE cid=? LIMIT 1';
+ connection.query(query, [cid], (err, rows) => {
+ connection.release();
+ if (err) {
+ return callback(err);
+ }
+
+ if (!rows || !rows.length) {
+ return callback(null, false);
+ }
+
+ let subscription;
+ let listId = rows[0].list;
+ let email = rows[0].email;
+ try {
+ subscription = JSON.parse(rows[0].data);
+ } catch (E) {
+ subscription = {};
+ }
+
+ let optInCountry = geoip.lookupCountry(optInIp) || null;
+ module.exports.insert(listId, {
+ email,
+ cid,
+ optInIp,
+ optInCountry,
+ status: 1
+ }, subscription, err => {
+ if (err) {
+ return callback(err);
+ }
+
+ db.getConnection((err, connection) => {
+ if (err) {
+ return callback(err);
+ }
+ connection.query('DELETE FROM confirmations WHERE `cid`=? LIMIT 1', [cid], () => {
+ connection.release();
+ callback(null, {
+ list: listId,
+ email
+ });
+ });
+ });
+ });
+ });
+ });
+};
+
+module.exports.insert = (listId, meta, subscription, callback) => {
+
+ meta = tools.convertKeys(meta);
+ subscription = tools.convertKeys(subscription);
+
+ meta.email = meta.email || subscription.email;
meta.cid = meta.cid || shortid.generate();
fields.list(listId, (err, fieldList) => {
@@ -116,29 +229,21 @@ module.exports.insert = (listId, meta, subscriptionData, callback) => {
let keys = [];
let values = [];
- let allowedKeys = ['first_name', 'last_name', 'tz', 'is_test'];
- Object.keys(subscriptionData).forEach(key => {
- let value = subscriptionData[key];
+ let allowedKeys = ['first_name', 'last_name'];
+ Object.keys(subscription).forEach(key => {
+ let value = subscription[key];
key = tools.toDbKey(key);
- if (key === 'tz') {
- value = (value || '').toString().toLowerCase().trim();
- }
- if (key === 'is_test') {
- value = value ? '1' : '0';
- }
if (allowedKeys.indexOf(key) >= 0) {
keys.push(key);
values.push(value);
}
});
- fields.getValues(fields.getRow(fieldList, subscriptionData, true, true, !!meta.partial), true).forEach(field => {
+ fields.getValues(fields.getRow(fieldList, subscription, true, true), true).forEach(field => {
keys.push(field.key);
values.push(field.value);
});
- values = values.map(v => typeof v === 'string' ? striptags(v) : v);
-
db.getConnection((err, connection) => {
if (err) {
return callback(err);
@@ -146,14 +251,16 @@ module.exports.insert = (listId, meta, subscriptionData, callback) => {
connection.beginTransaction(err => {
if (err) {
- connection.release();
return callback(err);
}
- let query = 'SELECT `id`, `status`, `cid` FROM `subscription__' + listId + '` WHERE `email`=? OR `cid`=? LIMIT 1';
+ let query = 'SELECT id, status FROM `subscription__' + listId + '` WHERE email=? OR cid=? LIMIT 1';
connection.query(query, [meta.email, meta.cid], (err, rows) => {
if (err) {
- return helpers.rollbackAndReleaseConnection(connection, () => callback(err));
+ return connection.rollback(() => {
+ connection.release();
+ return callback(err);
+ });
}
let query;
@@ -161,38 +268,15 @@ module.exports.insert = (listId, meta, subscriptionData, callback) => {
let existing = rows && rows[0] || false;
let entryId = existing ? existing.id : false;
- meta.cid = existing ? rows[0].cid : meta.cid;
-
- // meta.status may be 'undefined' or '0' when adding a subscription via API call or CSV import. In both cases meta.partial is 'true'.
- // This must either update an existing subscription without changing its status or insert a new subscription with status SUBSCRIBED.
- meta.status = meta.status || (existing ? existing.status : Status.SUBSCRIBED);
+ meta.status = meta.status || (existing ? existing.status : 1);
let statusChange = !existing || existing.status !== meta.status;
let statusDirection;
- if (existing && existing.status === Status.SUBSCRIBED && !meta.partial) {
- return helpers.rollbackAndReleaseConnection(connection, () => callback(new Error(_('Email address already registered'))));
- }
-
if (statusChange) {
keys.push('status', 'status_change');
values.push(meta.status, new Date());
- statusDirection = !existing ? (meta.status === Status.SUBSCRIBED ? '+' : false) : (existing.status === Status.SUBSCRIBED ? '-' : '+');
- }
-
- if (!keys.length) {
- // nothing to update
- return connection.commit(err => {
- if (err) {
- return helpers.rollbackAndReleaseConnection(connection, () => callback(err));
- }
- connection.release();
- return callback(null, {
- entryId,
- cid: meta.cid,
- inserted: !existing
- });
- });
+ statusDirection = !existing ? (meta.status === 1 ? '+' : '-') : (existing.status === 1 ? '-' : '+');
}
if (!existing) {
@@ -208,39 +292,43 @@ module.exports.insert = (listId, meta, subscriptionData, callback) => {
connection.query(query, queryArgs, (err, result) => {
if (err) {
- return helpers.rollbackAndReleaseConnection(connection, () => callback(err));
+ return connection.rollback(() => {
+ connection.release();
+ return callback(err);
+ });
}
entryId = result.insertId || entryId;
- if (statusChange && statusDirection) {
+ if (statusChange) {
connection.query('UPDATE lists SET `subscribers`=`subscribers`' + statusDirection + '1 WHERE id=?', [listId], err => {
if (err) {
- return helpers.rollbackAndReleaseConnection(connection, () => callback(err));
+ return connection.rollback(() => {
+ connection.release();
+ return callback(err);
+ });
}
connection.commit(err => {
if (err) {
- return helpers.rollbackAndReleaseConnection(connection, () => callback(err));
+ return connection.rollback(() => {
+ connection.release();
+ return callback(err);
+ });
}
connection.release();
- return callback(null, {
- entryId,
- cid: meta.cid,
- inserted: !existing
- });
+ return callback(null, entryId);
});
});
} else {
connection.commit(err => {
if (err) {
- return helpers.rollbackAndReleaseConnection(connection, () => callback(err));
+ return connection.rollback(() => {
+ connection.release();
+ return callback(err);
+ });
}
connection.release();
- return callback(null, {
- entryId,
- cid: meta.cid,
- inserted: !existing
- });
+ return callback(null, entryId);
});
}
});
@@ -254,7 +342,7 @@ module.exports.get = (listId, cid, callback) => {
cid = (cid || '').toString().trim();
if (!cid) {
- return callback(new Error(_('Missing Subscription ID')));
+ return callback(new Error('Missing Subbscription ID'));
}
db.getConnection((err, connection) => {
@@ -272,108 +360,8 @@ module.exports.get = (listId, cid, callback) => {
return callback(null, false);
}
- let subscription = tools.convertKeys(rows[0]);
- // ensure list id in response
- subscription.list = subscription.list || listId;
- return callback(null, subscription);
- });
- });
-};
-
-module.exports.getById = (listId, id, callback) => {
- id = Number(id) || 0;
-
- if (!id) {
- return callback(new Error(_('Missing Subscription ID')));
- }
-
- db.getConnection((err, connection) => {
- if (err) {
- return callback(err);
- }
-
- connection.query('SELECT * FROM `subscription__' + listId + '` WHERE id=?', [id], (err, rows) => {
- connection.release();
- if (err) {
- return callback(err);
- }
-
- if (!rows || !rows.length) {
- return callback(null, false);
- }
-
- let subscription = tools.convertKeys(rows[0]);
- // ensure list id in response
- subscription.list = subscription.list || listId;
- return callback(null, subscription);
- });
- });
-};
-
-module.exports.getByEmail = (listId, email, callback) => {
- if (!email) {
- return callback(new Error(_('Missing Subscription email address')));
- }
-
- db.getConnection((err, connection) => {
- if (err) {
- return callback(err);
- }
-
- connection.query('SELECT * FROM `subscription__' + listId + '` WHERE email=?', [email], (err, rows) => {
- connection.release();
- if (err) {
- return callback(err);
- }
-
- if (!rows || !rows.length) {
- return callback(null, false);
- }
-
- let subscription = tools.convertKeys(rows[0]);
- // ensure list id in response
- subscription.list = subscription.list || listId;
- return callback(null, subscription);
- });
- });
-};
-
-module.exports.getWithMergeTags = (listId, cid, callback) => {
- module.exports.get(listId, cid, (err, subscription) => {
- if (err) {
- return callback(err);
- }
-
- if (!subscription) {
- return callback(null, false);
- }
-
- fields.list(listId, (err, fieldList) => {
- if (err || !fieldList) {
- return fieldList = [];
- }
-
- subscription.mergeTags = {
- EMAIL: subscription.email,
- FIRST_NAME: subscription.firstName,
- LAST_NAME: subscription.lastName,
- FULL_NAME: [].concat(subscription.firstName || []).concat(subscription.lastName || []).join(' '),
- TIMEZONE: subscription.tz || ''
- };
-
- fields.getRow(fieldList, subscription, false, true).forEach(field => {
- if (field.mergeTag) {
- subscription.mergeTags[field.mergeTag] = field.mergeValue || '';
- }
- if (field.options) {
- field.options.forEach(subField => {
- if (subField.mergeTag) {
- subscription.mergeTags[subField.mergeTag] = subField.mergeValue || '';
- }
- });
- }
- });
- return callback(null, subscription);
+ let list = tools.convertKeys(rows[0]);
+ return callback(null, list);
});
});
};
@@ -387,11 +375,11 @@ module.exports.update = (listId, cid, updates, allowEmail, callback) => {
let values = [];
if (listId < 1) {
- return callback(new Error(_('Missing List ID')));
+ return callback(new Error('Missing List ID'));
}
if (!cid) {
- return callback(new Error(_('Missing Subscription ID')));
+ return callback(new Error('Missing subscription ID'));
}
fields.list(listId, (err, fieldList) => {
@@ -399,7 +387,7 @@ module.exports.update = (listId, cid, updates, allowEmail, callback) => {
return callback(err);
}
- let allowedKeys = ['first_name', 'last_name', 'tz', 'is_test'];
+ let allowedKeys = ['first_name', 'last_name'];
if (allowEmail) {
allowedKeys.unshift('email');
@@ -408,16 +396,13 @@ module.exports.update = (listId, cid, updates, allowEmail, callback) => {
Object.keys(updates).forEach(key => {
let value = updates[key];
key = tools.toDbKey(key);
- if (key === 'tz') {
- value = (value || '').toString().toLowerCase().trim();
- }
if (allowedKeys.indexOf(key) >= 0) {
keys.push(key);
values.push(value);
}
});
- fields.getValues(fields.getRow(fieldList, updates, true, true, true), true).forEach(field => {
+ fields.getValues(fields.getRow(fieldList, updates, true, true), true).forEach(field => {
keys.push(field.key);
values.push(field.value);
});
@@ -426,8 +411,6 @@ module.exports.update = (listId, cid, updates, allowEmail, callback) => {
return callback(null, false);
}
- values = values.map(v => typeof v === 'string' ? striptags(v) : v);
-
db.getConnection((err, connection) => {
if (err) {
return callback(err);
@@ -445,24 +428,63 @@ module.exports.update = (listId, cid, updates, allowEmail, callback) => {
});
};
-module.exports.changeStatus = (listId, id, campaignId, status, callback) => {
+module.exports.unsubscribe = (listId, email, campaignId, callback) => {
+ listId = Number(listId) || 0;
+ email = (email || '').toString().trim();
+
+ campaignId = (campaignId || '').toString().trim() || false;
+
+ if (listId < 1) {
+ return callback(new Error('Missing List ID'));
+ }
+
+ if (!email) {
+ return callback(new Error('Missing email address'));
+ }
+
+ db.getConnection((err, connection) => {
+ if (err) {
+ return callback(err);
+ }
+
+ connection.query('SELECT id, status FROM `subscription__' + listId + '` WHERE `email`=?', [email], (err, rows) => {
+ connection.release();
+ if (err) {
+ return callback(err);
+ }
+ if (!rows || !rows.length || rows[0].status !== 1) {
+ return callback(null, false);
+ }
+
+ let id = rows[0].id;
+ module.exports.changeStatus(id, listId, campaignId, 2, callback);
+ });
+ });
+};
+
+module.exports.changeStatus = (id, listId, campaignId, status, callback) => {
db.getConnection((err, connection) => {
if (err) {
return callback(err);
}
connection.beginTransaction(err => {
if (err) {
- connection.release();
return callback(err);
}
connection.query('SELECT `status` FROM `subscription__' + listId + '` WHERE id=? LIMIT 1', [id], (err, rows) => {
if (err) {
- return helpers.rollbackAndReleaseConnection(connection, () => callback(err));
+ return connection.rollback(() => {
+ connection.release();
+ return callback(err);
+ });
}
if (!rows || !rows.length) {
- return helpers.rollbackAndReleaseConnection(connection, () => callback(null, false));
+ return connection.rollback(() => {
+ connection.release();
+ return callback(null, false);
+ });
}
let oldStatus = rows[0].status;
@@ -470,22 +492,31 @@ module.exports.changeStatus = (listId, id, campaignId, status, callback) => {
let statusDirection;
if (!statusChange) {
- return helpers.rollbackAndReleaseConnection(connection, () => callback(null, true));
+ return connection.rollback(() => {
+ connection.release();
+ return callback(null, true);
+ });
}
- if (statusChange && oldStatus === Status.SUBSCRIBED || status === Status.SUBSCRIBED) {
- statusDirection = status === Status.SUBSCRIBED ? '+' : '-';
+ if (statusChange && oldStatus === 1 || status === 1) {
+ statusDirection = status === 1 ? '+' : '-';
}
connection.query('UPDATE `subscription__' + listId + '` SET `status`=?, `status_change`=NOW() WHERE id=? LIMIT 1', [status, id], err => {
if (err) {
- return helpers.rollbackAndReleaseConnection(connection, () => callback(err));
+ return connection.rollback(() => {
+ connection.release();
+ return callback(err);
+ });
}
if (!statusDirection) {
return connection.commit(err => {
if (err) {
- return helpers.rollbackAndReleaseConnection(connection, () => callback(err));
+ return connection.rollback(() => {
+ connection.release();
+ return callback(err);
+ });
}
connection.release();
return callback(null, true);
@@ -494,61 +525,41 @@ module.exports.changeStatus = (listId, id, campaignId, status, callback) => {
connection.query('UPDATE `lists` SET `subscribers`=`subscribers`' + statusDirection + '1 WHERE id=? LIMIT 1', [listId], err => {
if (err) {
- return helpers.rollbackAndReleaseConnection(connection, () => callback(err));
+ return connection.rollback(() => {
+ connection.release();
+ return callback(err);
+ });
}
- // status change is not related to a campaign or it marks message as bounced etc.
- if (!campaignId || status !== Status.SUBSCRIBED && status !== Status.UNSUBSCRIBED) {
+ if (!campaignId) {
return connection.commit(err => {
if (err) {
- return helpers.rollbackAndReleaseConnection(connection, () => callback(err));
+ return connection.rollback(() => {
+ connection.release();
+ return callback(err);
+ });
}
connection.release();
return callback(null, true);
});
}
- connection.query('SELECT `id` FROM `campaigns` WHERE `cid`=? LIMIT 1', [campaignId], (err, rows) => {
+ connection.query('UPDATE `campaigns` SET `unsubscribed`=`unsubscribed`+1 WHERE `cid`=? LIMIT 1', [campaignId], err => {
if (err) {
- return helpers.rollbackAndReleaseConnection(connection, () => callback(err));
- }
-
- let campaign = rows && rows[0] || false;
-
- if (!campaign) {
- // should not happend
- return connection.commit(err => {
- if (err) {
- return helpers.rollbackAndReleaseConnection(connection, () => callback(err));
- }
+ return connection.rollback(() => {
connection.release();
- return callback(null, true);
+ return callback(err);
});
}
-
- // we should see only unsubscribe events here but you never know
- connection.query('UPDATE `campaigns` SET `unsubscribed`=`unsubscribed`' + (status === Status.UNSUBSCRIBED ? '+' : '-') + '1 WHERE `cid`=? LIMIT 1', [campaignId], err => {
+ return connection.commit(err => {
if (err) {
- return helpers.rollbackAndReleaseConnection(connection, () => callback(err));
- }
-
- let query = 'UPDATE `campaign__' + campaign.id + '` SET `status`=? WHERE `list`=? AND `subscription`=? LIMIT 1';
- let values = [status, listId, id];
-
- // Updated tracker status
- connection.query(query, values, err => {
- if (err) {
- return helpers.rollbackAndReleaseConnection(connection, () => callback(err));
- }
-
- return connection.commit(err => {
- if (err) {
- return helpers.rollbackAndReleaseConnection(connection, () => callback(err));
- }
+ return connection.rollback(() => {
connection.release();
- return callback(null, true);
+ return callback(err);
});
- });
+ }
+ connection.release();
+ return callback(null, true);
});
});
});
@@ -563,11 +574,11 @@ module.exports.delete = (listId, cid, callback) => {
cid = (cid || '').toString().trim();
if (listId < 1) {
- return callback(new Error(_('Missing List ID')));
+ return callback(new Error('Missing List ID'));
}
if (!cid) {
- return callback(new Error(_('Missing subscription ID')));
+ return callback(new Error('Missing subscription ID'));
}
db.getConnection((err, connection) => {
@@ -589,19 +600,24 @@ module.exports.delete = (listId, cid, callback) => {
connection.beginTransaction(err => {
if (err) {
- connection.release();
return callback(err);
}
connection.query('DELETE FROM `subscription__' + listId + '` WHERE cid=? LIMIT 1', [cid], err => {
if (err) {
- return helpers.rollbackAndReleaseConnection(connection, () => callback(err));
+ return connection.rollback(() => {
+ connection.release();
+ return callback(err);
+ });
}
- if (subscription.status !== Status.SUBSCRIBED) {
+ if (subscription.status !== 1) {
return connection.commit(err => {
if (err) {
- return helpers.rollbackAndReleaseConnection(connection, () => callback(err));
+ return connection.rollback(() => {
+ connection.release();
+ return callback(err);
+ });
}
connection.release();
return callback(null, subscription.email);
@@ -610,11 +626,17 @@ module.exports.delete = (listId, cid, callback) => {
connection.query('UPDATE lists SET subscribers=subscribers-1 WHERE id=? LIMIT 1', [listId], err => {
if (err) {
- return helpers.rollbackAndReleaseConnection(connection, () => callback(err));
+ return connection.rollback(() => {
+ connection.release();
+ return callback(err);
+ });
}
connection.commit(err => {
if (err) {
- return helpers.rollbackAndReleaseConnection(connection, () => callback(err));
+ return connection.rollback(() => {
+ connection.release();
+ return callback(err);
+ });
}
connection.release();
return callback(null, subscription.email);
@@ -626,9 +648,9 @@ module.exports.delete = (listId, cid, callback) => {
});
};
-module.exports.createImport = (listId, type, path, size, delimiter, emailcheck, mapping, callback) => {
+module.exports.createImport = (listId, type, path, size, delimiter, mapping, callback) => {
listId = Number(listId) || 0;
- type = Number(type) || 0;
+ type = Number(type) || 1;
if (listId < 1) {
return callback(new Error('Missing List ID'));
@@ -638,8 +660,8 @@ module.exports.createImport = (listId, type, path, size, delimiter, emailcheck,
if (err) {
return callback(err);
}
- let query = 'INSERT INTO importer (`list`, `type`, `path`, `size`, `delimiter`, `emailcheck`, `mapping`) VALUES(?,?,?,?,?,?,?)';
- connection.query(query, [listId, type, path, size, delimiter, emailcheck, JSON.stringify(mapping)], (err, result) => {
+ let query = 'INSERT INTO importer (`list`, `type`, `path`, `size`, `delimiter`, `mapping`) VALUES(?,?,?,?,?,?)';
+ connection.query(query, [listId, type, path, size, delimiter, JSON.stringify(mapping)], (err, result) => {
connection.release();
if (err) {
return callback(err);
@@ -654,17 +676,17 @@ module.exports.updateImport = (listId, importId, data, callback) => {
importId = Number(importId) || 0;
if (listId < 1) {
- return callback(new Error(_('Missing List ID')));
+ return callback(new Error('Missing List ID'));
}
if (importId < 1) {
- return callback(new Error(_('Missing Import ID')));
+ return callback(new Error('Missing Import ID'));
}
let keys = [];
let values = [];
- let allowedKeys = ['type', 'path', 'size', 'delimiter', 'status', 'error', 'processed', 'new', 'failed', 'mapping', 'finished'];
+ let allowedKeys = ['type', 'path', 'size', 'delimiter', 'status', 'error', 'processed', 'mapping', 'finished'];
Object.keys(data).forEach(key => {
let value = data[key];
key = tools.toDbKey(key);
@@ -680,24 +702,11 @@ module.exports.updateImport = (listId, importId, data, callback) => {
}
let query = 'UPDATE importer SET ' + keys.map(key => '`' + key + '`=?') + ' WHERE id=? AND list=? LIMIT 1';
connection.query(query, values.concat([importId, listId]), (err, result) => {
+ connection.release();
if (err) {
- connection.release();
return callback(err);
}
-
- let affected = result && result.affectedRows || false;
-
- if (data.failed === 0) {
- // remove entries from import_failed table
- let query = 'DELETE FROM `import_failed` WHERE `import`=?';
- connection.query(query, [importId], () => {
- connection.release();
- return callback(null, affected);
- });
- } else {
- connection.release();
- return callback(null, affected);
- }
+ return callback(null, result && result.affectedRows || false);
});
});
};
@@ -707,11 +716,11 @@ module.exports.getImport = (listId, importId, callback) => {
importId = Number(importId) || 0;
if (listId < 1) {
- return callback(new Error(_('Missing List ID')));
+ return callback(new Error('Missing List ID'));
}
if (importId < 1) {
- return callback(new Error(_('Missing Import ID')));
+ return callback(new Error('Missing Import ID'));
}
db.getConnection((err, connection) => {
@@ -743,34 +752,11 @@ module.exports.getImport = (listId, importId, callback) => {
});
};
-module.exports.getFailedImports = (importId, callback) => {
- importId = Number(importId) || 0;
-
- if (importId < 1) {
- return callback(new Error(_('Missing Import ID')));
- }
-
- db.getConnection((err, connection) => {
- if (err) {
- return callback(err);
- }
- let query = 'SELECT * FROM import_failed WHERE import=? LIMIT 1000';
- connection.query(query, [importId], (err, rows) => {
- connection.release();
- if (err) {
- return callback(err);
- }
-
- return callback(null, (rows || []).map(tools.convertKeys));
- });
- });
-};
-
module.exports.listImports = (listId, callback) => {
listId = Number(listId) || 0;
if (listId < 1) {
- return callback(new Error(_('Missing List ID')));
+ return callback(new Error('Missing List ID'));
}
db.getConnection((err, connection) => {
@@ -804,130 +790,3 @@ module.exports.listImports = (listId, callback) => {
});
});
};
-
-/*
-Performs checks before update of an address. This includes finding the existing subscriber, validating the new email
-and checking whether the new email does not conflict with other subscribers.
- */
-module.exports.updateAddressCheck = (list, cid, emailNew, ip, callback) => {
- cid = (cid || '').toString().trim();
-
- if (!list || !list.id) {
- return callback(new Error(_('Missing List ID')));
- }
-
- if (!cid) {
- return callback(new Error(_('Missing subscription ID')));
- }
-
- tools.validateEmail(emailNew, false, err => {
- if (err) {
- return callback(err);
- }
-
- db.getConnection((err, connection) => {
- if (err) {
- return callback(err);
- }
-
- let query = 'SELECT * FROM `subscription__' + list.id + '` WHERE `cid`=? AND `status`=' + Status.SUBSCRIBED + ' LIMIT 1';
- let args = [cid];
- connection.query(query, args, (err, rows) => {
- if (err) {
- connection.release();
- return callback(err);
- }
- if (!rows || !rows.length) {
- connection.release();
- return callback(new Error(_('Unknown subscription ID')));
- }
-
- if (rows[0].email === emailNew) {
- connection.release();
- return callback(new Error(_('Nothing seems to be changed')));
- }
-
- let old = rows[0];
-
- let query = 'SELECT `id` FROM `subscription__' + list.id + '` WHERE `email`=? AND `cid`<>? AND `status`=' + Status.SUBSCRIBED + ' LIMIT 1';
- let args = [emailNew, cid];
- connection.query(query, args, (err, rows) => {
- connection.release();
- if (err) {
- return callback(err);
- }
-
- if (rows && rows.length > 0) {
- return callback(null, old, false);
- } else {
- return callback(null, old, true);
- }
- });
- });
- });
- });
-};
-
-
-/*
- Updates address in subscription__xxx
- */
-module.exports.updateAddress = (listId, subscriptionId, emailNew, callback) => {
- // update email address instead of adding new
- db.getConnection((err, connection) => {
- if (err) {
- return callback(err);
- }
- connection.beginTransaction(err => {
- if (err) {
- connection.release();
- return callback(err);
- }
-
- let query = 'SELECT `id` FROM `subscription__' + listId + '` WHERE `email`=? AND `id`<>? AND `status`=' + Status.SUBSCRIBED + ' LIMIT 1';
- let args = [emailNew, subscriptionId];
- connection.query(query, args, (err, rows) => {
- if (err) {
- return helpers.rollbackAndReleaseConnection(connection, () => callback(err));
- }
-
- if (rows && rows.length > 0) {
- return helpers.rollbackAndReleaseConnection(connection, () => callback(new Error(_('Email address already registered'))));
- }
-
- let query = 'DELETE FROM `subscription__' + listId + '` WHERE `email`=? AND `id`<>?';
- let args = [emailNew, subscriptionId];
- connection.query(query, args, err => {
- if (err) {
- return helpers.rollbackAndReleaseConnection(connection, () => callback(err));
- }
-
- let query = 'UPDATE `subscription__' + listId + '` SET `email`=? WHERE `id`=? AND `status`=' + Status.SUBSCRIBED + ' LIMIT 1';
- let args = [emailNew, subscriptionId];
- connection.query(query, args, (err, result) => {
- if (err) {
- return helpers.rollbackAndReleaseConnection(connection, () => callback(err));
- }
-
- if (!result || !result.affectedRows) {
- return helpers.rollbackAndReleaseConnection(connection, () => callback(new Error(_('Subscription not found in this list'))));
- }
-
- return connection.commit(err => {
- if (err) {
- return helpers.rollbackAndReleaseConnection(connection, () => callback(err));
- }
- connection.release();
-
- return callback();
- });
- });
- });
- });
- });
- });
-
-};
-
-module.exports.getUnsubscriptionMode = (list, subscriptionId) => list.unsubscriptionMode; // eslint-disable-line no-unused-vars
-// TODO: Once the unsubscription mode is customizable per segment, then this will be a good place to process it.
diff --git a/lib/models/templates.js b/lib/models/templates.js
index b0f0099e..ea54cac3 100644
--- a/lib/models/templates.js
+++ b/lib/models/templates.js
@@ -2,28 +2,52 @@
let db = require('../db');
let tools = require('../tools');
-let _ = require('../translate')._;
-let tableHelpers = require('../table-helpers');
-let allowedKeys = ['description', 'editor_name', 'editor_data', 'html', 'text'];
+let allowedKeys = ['description', 'html', 'text'];
module.exports.list = (start, limit, callback) => {
- tableHelpers.list('templates', ['*'], 'name', null, start, limit, callback);
-};
+ db.getConnection((err, connection) => {
+ if (err) {
+ return callback(err);
+ }
-module.exports.filter = (request, parent, callback) => {
- tableHelpers.filter('templates', ['*'], request, ['#', 'name', 'description'], ['name'], 'name ASC', null, callback);
+ connection.query('SELECT SQL_CALC_FOUND_ROWS * FROM templates ORDER BY name LIMIT ? OFFSET ?', [limit, start], (err, rows) => {
+ if (err) {
+ connection.release();
+ return callback(err);
+ }
+ connection.query('SELECT FOUND_ROWS() AS total', (err, total) => {
+ connection.release();
+ if (err) {
+ return callback(err);
+ }
+ return callback(null, rows, total && total[0] && total[0].total);
+ });
+ });
+ });
};
module.exports.quicklist = callback => {
- tableHelpers.quicklist('templates', ['id', 'name'], 'name', callback);
+ db.getConnection((err, connection) => {
+ if (err) {
+ return callback(err);
+ }
+
+ connection.query('SELECT id, name FROM templates ORDER BY name LIMIT 1000', (err, rows) => {
+ connection.release();
+ if (err) {
+ return callback(err);
+ }
+ return callback(null, (rows || []).map(tools.convertKeys));
+ });
+ });
};
module.exports.get = (id, callback) => {
id = Number(id) || 0;
if (id < 1) {
- return callback(new Error(_('Missing Template ID')));
+ return callback(new Error('Missing Template ID'));
}
db.getConnection((err, connection) => {
@@ -52,7 +76,7 @@ module.exports.create = (template, callback) => {
let data = tools.convertKeys(template);
if (!(data.name || '').toString().trim()) {
- return callback(new Error(_('Template Name must be set')));
+ return callback(new Error('Template Name must be set'));
}
let name = (template.name || '').toString().trim();
@@ -61,17 +85,12 @@ module.exports.create = (template, callback) => {
let values = [name];
Object.keys(template).forEach(key => {
- let value = template[key];
+ let value = template[key].trim();
key = tools.toDbKey(key);
- if (!allowedKeys.includes(key)) {
- return;
+ if (allowedKeys.indexOf(key) >= 0) {
+ keys.push(key);
+ values.push(value);
}
- value = value.trim();
- if (key === 'description') {
- value = tools.purifyHTML(value);
- }
- keys.push(key);
- values.push(value);
});
db.getConnection((err, connection) => {
@@ -99,11 +118,11 @@ module.exports.update = (id, updates, callback) => {
let data = tools.convertKeys(updates);
if (id < 1) {
- return callback(new Error(_('Missing Template ID')));
+ return callback(new Error('Missing Template ID'));
}
if (!(data.name || '').toString().trim()) {
- return callback(new Error(_('Template Name must be set')));
+ return callback(new Error('Template Name must be set'));
}
let name = (updates.name || '').toString().trim();
@@ -113,9 +132,6 @@ module.exports.update = (id, updates, callback) => {
Object.keys(updates).forEach(key => {
let value = updates[key].trim();
key = tools.toDbKey(key);
- if (key === 'description') {
- value = tools.purifyHTML(value);
- }
if (allowedKeys.indexOf(key) >= 0) {
keys.push(key);
values.push(value);
@@ -139,22 +155,11 @@ module.exports.update = (id, updates, callback) => {
});
};
-module.exports.duplicate = (id, callback) => module.exports.get(id, (err, template) => {
- if (err) {
- return callback(err);
- }
- if (!template) {
- return callback(new Error(_('Template does not exist')));
- }
- template.name = template.name + ' Copy';
- return module.exports.create(template, callback);
-});
-
module.exports.delete = (id, callback) => {
id = Number(id) || 0;
if (id < 1) {
- return callback(new Error(_('Missing Template ID')));
+ return callback(new Error('Missing Template ID'));
}
db.getConnection((err, connection) => {
diff --git a/lib/models/triggers.js b/lib/models/triggers.js
deleted file mode 100644
index b87125c4..00000000
--- a/lib/models/triggers.js
+++ /dev/null
@@ -1,427 +0,0 @@
-'use strict';
-
-let log = require('npmlog');
-let tools = require('../tools');
-let db = require('../db');
-let lists = require('./lists');
-let segments = require('./segments');
-let util = require('util');
-let _ = require('../translate')._;
-let tableHelpers = require('../table-helpers');
-
-module.exports.defaultColumns = [{
- column: 'created',
- name: _('Sign up date'),
- type: 'date'
-}, {
- column: 'latest_open',
- name: _('Latest open'),
- type: 'date'
-}, {
- column: 'latest_click',
- name: _('Latest click'),
- type: 'date'
-}];
-
-module.exports.defaultCampaignEvents = [{
- option: 'delivered',
- name: _('Delivered')
-}, {
- option: 'opened',
- name: _('Has Opened')
-}, {
- option: 'clicked',
- name: _('Has Clicked')
-}, {
- option: 'not_opened',
- name: _('Not Opened')
-}, {
- option: 'not_clicked',
- name: _('Not Clicked')
-}];
-
-let defaultColumnMap = {};
-let defaultEventMap = {};
-module.exports.defaultColumns.forEach(col => defaultColumnMap[col.column] = col.name);
-module.exports.defaultCampaignEvents.forEach(evt => defaultEventMap[evt.option] = evt.name);
-
-module.exports.list = callback => {
- db.getConnection((err, connection) => {
- if (err) {
- return callback(err);
- }
-
- let tableFields = [
- '`triggers`.`id` AS `id`',
- '`triggers`.`name` AS `name`',
- '`triggers`.`description` AS `description`',
- '`triggers`.`enabled` AS `enabled`',
- '`triggers`.`list` AS `list`',
- '`triggers`.`segment` AS `segment`',
- '`lists`.`name` AS `list_name`',
- '`segments`.`name` AS `segment_name`',
- '`source`.`id` AS `source_campaign`',
- '`source`.`name` AS `source_campaign_name`',
- '`dest`.`id` AS `dest_campaign`',
- '`dest`.`name` AS `dest_campaign_name`',
- '`triggers`.`count` AS `count`',
- '`custom_fields`.`id` AS `column_id`',
- '`triggers`.`column` AS `column`',
- '`custom_fields`.`name` AS `column_name`',
- '`triggers`.`rule` AS `rule`',
- '`triggers`.`seconds` AS `seconds`',
- '`triggers`.`created` AS `created`'
- ];
-
- let query = 'SELECT ' + tableFields.join(', ') + ' FROM `triggers` LEFT JOIN `campaigns` `source` ON `source`.`id`=`triggers`.`source_campaign` LEFT JOIN `campaigns` `dest` ON `dest`.`id`=`triggers`.`dest_campaign` LEFT JOIN `lists` ON `lists`.`id`=`triggers`.`list` LEFT JOIN `segments` ON `segments`.`id`=`triggers`.`segment` LEFT JOIN `custom_fields` ON `custom_fields`.`list` = `triggers`.`list` AND `custom_fields`.`column`=`triggers`.`column` ORDER BY `triggers`.`name`';
- connection.query(query, (err, rows) => {
- connection.release();
- if (err) {
- return callback(err);
- }
-
- let triggers = (rows || []).map(tools.convertKeys).map(row => {
- if (row.rule === 'subscription' && row.column && !row.columnName) {
- row.columnName = defaultColumnMap[row.column];
- }
-
- let days = Math.round(row.seconds / (24 * 3600));
- row.formatted = util.format('%s days after %s', days, row.rule === 'subscription' ? row.columnName : (util.format('%s %s', defaultEventMap[row.column], row.sourceCampaign, row.sourceCampaignName)));
-
- return row;
- });
- return callback(null, triggers);
- });
- });
-};
-
-module.exports.getQuery = (id, callback) => {
- module.exports.get(id, (err, trigger) => {
- if (err) {
- return callback(err);
- }
-
- let limit = 300;
-
- // time..NOW..time + 24h, 24 hour window after trigger target to detect it
- //We need a 24 hour window for triggers as the format for dates added via the API are stored as 00:00:00
- let treshold = 3600 * 24;
-
- let intervalQuery = (column, seconds, treshold) => column + ' <= NOW() - INTERVAL ' + seconds + ' SECOND AND ' + column + ' >= NOW() - INTERVAL ' + (treshold + seconds) + ' SECOND';
-
-
- let getSegmentQuery = (segmentId, next) => {
- segmentId = Number(segmentId);
- if (!segmentId) {
- return next(null, {
- where: '',
- values: []
- });
- }
-
- segments.getQuery(segmentId, 'subscription', next);
- };
-
- getSegmentQuery(trigger.segment, (err, queryData) => {
- if (err) {
- log.err('Triggers', err);
- return null;
- }
-
- let query = false;
- let querySegmentSubscription = '';
- let querySegmentTriggertable = '';
- if (trigger.segment > 0)
- {
- querySegmentSubscription = (queryData.where ? ' AND (' + queryData.where + ')' : '');
- querySegmentTriggertable = ' AND triggertable.`segment` = ' + trigger.segment;
- }
-
- switch (trigger.rule) {
- case 'subscription':
- query = 'SELECT id FROM `subscription__' + trigger.list + '` subscription WHERE status=1 AND ' + intervalQuery('`' + trigger.column + '`', trigger.seconds, treshold) + ' ' + querySegmentSubscription + ' AND id NOT IN (SELECT subscription FROM `trigger__' + id + '` triggertable WHERE triggertable.`list` = ' + trigger.list + ' ' + querySegmentTriggertable + ' AND triggertable.`subscription` = subscription.`id`) LIMIT ' + limit;
- break;
- case 'campaign':
- switch (trigger.column) {
- case 'delivered':
- query = 'SELECT subscription.id AS id FROM `subscription__' + trigger.list + '` subscription LEFT JOIN `campaign__' + trigger.sourceCampaign + '` campaign ON campaign.list=' + trigger.list + ' AND subscription.id=campaign.subscription WHERE campaign.status=1 AND ' + intervalQuery('`campaign`.`created`', trigger.seconds, treshold) + ' ' + querySegmentSubscription + ' AND subscription.id NOT IN (SELECT subscription FROM `trigger__' + id + '` triggertable WHERE triggertable.`list` = ' + trigger.list + ' ' + querySegmentTriggertable + ' AND triggertable.`subscription` = subscription.`id`) LIMIT ' + limit;
- break;
- case 'not_clicked':
- query = 'SELECT subscription.id AS id FROM `subscription__' + trigger.list + '` subscription LEFT JOIN `campaign__' + trigger.sourceCampaign + '` campaign ON campaign.list=' + trigger.list + ' AND subscription.id=campaign.subscription LEFT JOIN `campaign_tracker__' + trigger.sourceCampaign + '` tracker ON tracker.list=campaign.list AND tracker.subscriber=subscription.id AND tracker.link=0 WHERE campaign.status=1 AND ' + intervalQuery('`campaign`.`created`', trigger.seconds, treshold) + ' AND tracker.created IS NULL ' + querySegmentSubscription + ' AND subscription.id NOT IN (SELECT subscription FROM `trigger__' + id + '` triggertable WHERE triggertable.`list` = ' + trigger.list + ' ' + querySegmentTriggertable + ' AND triggertable.`subscription` = subscription.`id`) LIMIT ' + limit;
- break;
- case 'not_opened':
- query = 'SELECT subscription.id AS id FROM `subscription__' + trigger.list + '` subscription LEFT JOIN `campaign__' + trigger.sourceCampaign + '` campaign ON campaign.list=' + trigger.list + ' AND subscription.id=campaign.subscription LEFT JOIN `campaign_tracker__' + trigger.sourceCampaign + '` tracker ON tracker.list=campaign.list AND tracker.subscriber=subscription.id AND tracker.link=-1 WHERE campaign.status=1 AND ' + intervalQuery('`campaign`.`created`', trigger.seconds, treshold) + ' AND tracker.created IS NULL ' + querySegmentSubscription + ' AND subscription.id NOT IN (SELECT subscription FROM `trigger__' + id + '` triggertable WHERE triggertable.`list` = ' + trigger.list + ' ' + querySegmentTriggertable + ' AND triggertable.`subscription` = subscription.`id`) LIMIT ' + limit;
- break;
- case 'clicked':
- query = 'SELECT subscription.id AS id FROM `subscription__' + trigger.list + '` subscription LEFT JOIN `campaign__' + trigger.sourceCampaign + '` campaign ON campaign.list=' + trigger.list + ' AND subscription.id=campaign.subscription LEFT JOIN `campaign_tracker__' + trigger.sourceCampaign + '` tracker ON tracker.list=campaign.list AND tracker.subscriber=subscription.id AND tracker.link=0 WHERE campaign.status=1 AND ' + intervalQuery('`tracker`.`created`', trigger.seconds, treshold) + ' ' + querySegmentSubscription + ' AND subscription.id NOT IN (SELECT subscription FROM `trigger__' + id + '` triggertable WHERE triggertable.`list` = ' + trigger.list + ' ' + querySegmentTriggertable + ' AND triggertable.`subscription` = subscription.`id`) LIMIT ' + limit;
- break;
- case 'opened':
- query = 'SELECT subscription.id AS id FROM `subscription__' + trigger.list + '` subscription LEFT JOIN `campaign__' + trigger.sourceCampaign + '` campaign ON campaign.list=' + trigger.list + ' AND subscription.id=campaign.subscription LEFT JOIN `campaign_tracker__' + trigger.sourceCampaign + '` tracker ON tracker.list=campaign.list AND tracker.subscriber=subscription.id AND tracker.link=-1 WHERE campaign.status=1 AND ' + intervalQuery('`tracker`.`created`', trigger.seconds, treshold) + ' ' + querySegmentSubscription + ' AND subscription.id NOT IN (SELECT subscription FROM `trigger__' + id + '` triggertable WHERE triggertable.`list` = ' + trigger.list + ' ' + querySegmentTriggertable + ' AND triggertable.`subscription` = subscription.`id`) LIMIT ' + limit;
- break;
- }
- break;
- }
-
- if (trigger.segment > 0) {
- let values = queryData.values.concat([trigger.list, trigger.segment]);
- for (let i = 0; i < values.length; i++) {
- query = query.replace('?', db.escape(values[i]));
- }
- }
-
- callback(null, query);
-
- });
-
- });
-};
-
-module.exports.get = (id, callback) => {
- id = Number(id) || 0;
-
- if (id < 1) {
- return callback(new Error('Missing Trigger ID'));
- }
-
- db.getConnection((err, connection) => {
- if (err) {
- return callback(err);
- }
-
- connection.query('SELECT * FROM triggers WHERE id=?', [id], (err, rows) => {
- connection.release();
- if (err) {
- return callback(err);
- }
-
- if (!rows || !rows.length) {
- return callback(null, false);
- }
-
- let trigger = tools.convertKeys(rows[0]);
- return callback(null, trigger);
- });
- });
-};
-
-module.exports.create = (trigger, callback) => {
-
- trigger = tools.convertKeys(trigger);
- let name = (trigger.name || '').toString().trim();
- let description = (trigger.description || '').toString().trim();
- let listId = Number(trigger.list) || 0;
- let segmentId = Number(trigger.segmentId) || 0;
- let seconds = (Number(trigger.days) || 0) * 24 * 3600;
- let rule = (trigger.rule || '').toString().toLowerCase().trim();
- let destCampaign = Number(trigger.destCampaign) || 0;
- let sourceCampaign = null;
- let column;
-
- if (!listId) {
- return callback(new Error(_('Missing or invalid list ID')));
- }
-
- if (seconds < 0) {
- return callback(new Error(_('Days in the past are not allowed')));
- }
-
- if (!rule || ['campaign', 'subscription'].indexOf(rule) < 0) {
- return callback(new Error(_('Missing or invalid trigger rule')));
- }
-
- switch (rule) {
- case 'subscription':
- column = (trigger.column || '').toString().toLowerCase().trim();
- if (!column) {
- return callback(new Error(_('Invalid subscription configuration')));
- }
- break;
- case 'campaign':
- column = (trigger.campaignOption || '').toString().toLowerCase().trim();
- sourceCampaign = Number(trigger.sourceCampaign) || 0;
- if (!column || !sourceCampaign) {
- return callback(new Error(_('Invalid campaign configuration')));
- }
- if (sourceCampaign === destCampaign) {
- return callback(new Error(_('A campaing can not be a target for itself')));
- }
- break;
- default:
- return callback(new Error(_('Missing or invalid trigger rule')));
- }
-
- lists.get(listId, (err, list) => {
- if (err) {
- return callback(err);
- }
- if (!list) {
- return callback(new Error(_('Missing or invalid list ID')));
- }
-
- db.getConnection((err, connection) => {
- if (err) {
- return callback(err);
- }
-
- let keys = ['name', 'description', 'list', 'segment', 'source_campaign', 'rule', 'column', 'seconds', 'dest_campaign', 'last_check'];
- let values = [name, description, list.id, segmentId, sourceCampaign, rule, column, seconds, destCampaign];
-
- let query = 'INSERT INTO `triggers` (`' + keys.join('`, `') + '`) VALUES (' + values.map(() => '?').join(', ') + ', NOW())';
-
- connection.query(query, values, (err, result) => {
- connection.release();
- if (err) {
- return callback(err);
- }
-
- let id = result && result.insertId;
- if (!id) {
- return callback(new Error(_('Could not store trigger row')));
- }
-
- createTriggerTable(id, err => {
- if (err) {
- return callback(err);
- }
- return callback(null, id);
- });
- });
- });
- });
-};
-
-module.exports.update = (id, trigger, callback) => {
- id = Number(id) || 0;
- if (id < 1) {
- return callback(new Error(_('Missing or invalid Trigger ID')));
- }
-
- trigger = tools.convertKeys(trigger);
- let name = (trigger.name || '').toString().trim();
- let description = (trigger.description || '').toString().trim();
- let enabled = trigger.enabled ? 1 : 0;
- let seconds = (Number(trigger.days) || 0) * 24 * 3600;
- let rule = (trigger.rule || '').toString().toLowerCase().trim();
- let destCampaign = Number(trigger.destCampaign) || 0;
- let sourceCampaign = null;
- let column;
-
- if (seconds < 0) {
- return callback(new Error(_('Days in the past are not allowed')));
- }
-
- if (!rule || ['campaign', 'subscription'].indexOf(rule) < 0) {
- return callback(new Error(_('Missing or invalid trigger rule')));
- }
-
- switch (rule) {
- case 'subscription':
- column = (trigger.column || '').toString().toLowerCase().trim();
- if (!column) {
- return callback(new Error(_('Invalid subscription configuration')));
- }
- break;
- case 'campaign':
- column = (trigger.campaignOption || '').toString().toLowerCase().trim();
- sourceCampaign = Number(trigger.sourceCampaign) || 0;
- if (!column || !sourceCampaign) {
- return callback(new Error(_('Invalid campaign configuration')));
- }
- if (sourceCampaign === destCampaign) {
- return callback(new Error(_('A campaing can not be a target for itself')));
- }
- break;
- default:
- return callback(new Error(_('Missing or invalid trigger rule')));
- }
-
- db.getConnection((err, connection) => {
- if (err) {
- return callback(err);
- }
-
- let keys = ['name', 'description', 'enabled', 'source_campaign', 'rule', 'column', 'seconds', 'dest_campaign'];
- let values = [name, description, enabled, sourceCampaign, rule, column, seconds, destCampaign];
-
- let query = 'UPDATE `triggers` SET ' + keys.map(key => '`' + key + '`=?').join(', ') + ' WHERE `id`=? LIMIT 1';
-
- connection.query(query, values.concat(id), (err, result) => {
- connection.release();
- if (err) {
- return callback(err);
- }
-
- return callback(null, result && result.affectedRows);
- });
- });
-};
-
-module.exports.delete = (id, callback) => {
- id = Number(id) || 0;
-
- if (id < 1) {
- return callback(new Error(_('Missing Trigger ID')));
- }
-
- db.getConnection((err, connection) => {
- if (err) {
- return callback(err);
- }
-
- connection.query('DELETE FROM triggers WHERE id=? LIMIT 1', [id], (err, result) => {
- connection.release();
- if (err) {
- return callback(err);
- }
-
- let affected = result && result.affectedRows || 0;
- removeTriggerTable(id, err => {
- if (err) {
- return callback(err);
- }
- return callback(null, affected);
- });
- });
- });
-};
-
-module.exports.filterSubscribers = (trigger, request, columns, callback) => {
- let queryData = {
- where: 'trigger__' + trigger.id + '.list=?',
- values: [trigger.list]
- };
-
- tableHelpers.filter('subscription__' + trigger.list + ' JOIN trigger__' + trigger.id + ' ON trigger__' + trigger.id + '.subscription=subscription__' + trigger.list + '.id', ['*'], request, columns, ['email', 'first_name', 'last_name'], 'email ASC', queryData, callback);
-};
-
-function createTriggerTable(id, callback) {
- db.getConnection((err, connection) => {
- if (err) {
- return callback(err);
- }
- let query = 'CREATE TABLE `trigger__' + id + '` LIKE `trigger`';
- connection.query(query, err => {
- connection.release();
- if (err) {
- return callback(err);
- }
- return callback(null, true);
- });
- });
-}
-
-function removeTriggerTable(id, callback) {
- db.getConnection((err, connection) => {
- if (err) {
- return callback(err);
- }
- let query = 'DROP TABLE IF EXISTS `trigger__' + id + '`';
- connection.query(query, err => {
- connection.release();
- if (err) {
- return callback(err);
- }
- return callback(null, true);
- });
- });
-}
diff --git a/lib/models/users.js b/lib/models/users.js
index b16106c9..6631d292 100644
--- a/lib/models/users.js
+++ b/lib/models/users.js
@@ -9,7 +9,6 @@ let mailer = require('../mailer');
let settings = require('./settings');
let crypto = require('crypto');
let urllib = require('url');
-let _ = require('../translate')._;
/**
* Fetches user by ID value
@@ -22,7 +21,7 @@ module.exports.get = (id, callback) => {
if (err) {
return callback(err);
}
- connection.query('SELECT `id`, `username`, `email`, `access_token` FROM `users` WHERE `id`=? LIMIT 1', [id], (err, rows) => {
+ connection.query('SELECT id, username, email FROM users WHERE id=? LIMIT 1', [id], (err, rows) => {
connection.release();
if (err) {
@@ -39,75 +38,6 @@ module.exports.get = (id, callback) => {
});
};
-module.exports.findByAccessToken = (accessToken, callback) => {
- db.getConnection((err, connection) => {
- if (err) {
- return callback(err);
- }
-
- connection.query('SELECT `id`, `username`, `email`, `access_token` FROM `users` WHERE `access_token`=? LIMIT 1', [accessToken], (err, rows) => {
- connection.release();
-
- if (err) {
- return callback(err);
- }
-
- if (!rows.length) {
- return callback(null, false);
- }
-
- let user = tools.convertKeys(rows[0]);
- return callback(null, user);
- });
- });
-};
-
-module.exports.findByUsername = (username, callback) => {
- db.getConnection((err, connection) => {
- if (err) {
- return callback(err);
- }
-
- connection.query('SELECT `id`, `username`, `email`, `access_token` FROM `users` WHERE `username`=? LIMIT 1', [username], (err, rows) => {
- connection.release();
-
- if (err) {
- return callback(err);
- }
-
- if (!rows.length) {
- return callback(null, false);
- }
-
- let user = tools.convertKeys(rows[0]);
- return callback(null, user);
- });
- });
-};
-
-module.exports.add = (username, password, email, callback) => {
- db.getConnection((err, connection) => {
- if (err) {
- return callback(err);
- }
-
- connection.query('INSERT INTO `users` (`username`, `password`, `email`, `created`) VALUES (?, ?, ?, NOW())', [username, password, email], (err, result) => {
- connection.release();
-
- if (err) {
- return callback(err);
- }
-
- let id = result && result.insertId;
- if (!id) {
- return callback(new Error(_('Could not store user row')));
- }
-
- return callback(null, id);
- });
- });
-};
-
/**
* Fetches user by username and password
*
@@ -117,12 +47,8 @@ module.exports.add = (username, password, email, callback) => {
*/
module.exports.authenticate = (username, password, callback) => {
- if (password === '') {
- return callback(null, false);
- }
-
let login = (connection, callback) => {
- connection.query('SELECT `id`, `password`, `access_token` FROM `users` WHERE `username`=? OR email=? LIMIT 1', [username, username], (err, rows) => {
+ connection.query('SELECT id, password FROM users WHERE username=? OR email=? LIMIT 1', [username, username], (err, rows) => {
if (err) {
return callback(err);
}
@@ -138,10 +64,8 @@ module.exports.authenticate = (username, password, callback) => {
if (!result) {
return callback(null, false);
}
-
- let user = tools.convertKeys(rows[0]);
return callback(null, {
- id: user.id,
+ id: rows[0].id,
username
});
});
@@ -170,7 +94,7 @@ module.exports.authenticate = (username, password, callback) => {
module.exports.update = (id, updates, callback) => {
if (!updates.email) {
- return callback(new Error(_('Email Address must be set')));
+ return callback(new Error('Email Address must be set'));
}
let update = (connection, callback) => {
@@ -181,7 +105,7 @@ module.exports.update = (id, updates, callback) => {
}
if (!rows.length) {
- return callback(_('Failed to check user data'));
+ return callback('Failed to check user data');
}
let keys = ['email'];
@@ -192,7 +116,7 @@ module.exports.update = (id, updates, callback) => {
connection.query('UPDATE users SET ' + keys.map(key => key + '=?').join(', ') + ' WHERE id=? LIMIT 1', values, (err, result) => {
if (err) {
if (err.code === 'ER_DUP_ENTRY') {
- err = new Error(_('Can\'t change email as another user with the same email address already exists'));
+ err = new Error('Can\'t change email as another user with the same email address already exists');
}
return callback(err);
}
@@ -209,15 +133,15 @@ module.exports.update = (id, updates, callback) => {
return callback(err);
}
if (!result) {
- return callback(_('Incorrect current password'));
+ return callback('Incorrect current password');
}
if (!updates.password) {
- return callback(new Error(_('New password not set')));
+ return callback(new Error('New password not set'));
}
if (updates.password !== updates.password2) {
- return callback(new Error(_('Passwords do not match')));
+ return callback(new Error('Passwords do not match'));
}
bcrypt.hash(updates.password, null, null, (err, hash) => {
@@ -251,39 +175,11 @@ module.exports.update = (id, updates, callback) => {
});
};
-module.exports.resetToken = (id, callback) => {
- id = Number(id) || 0;
-
- if (!id) {
- return callback(new Error(_('User ID not set')));
- }
-
- db.getConnection((err, connection) => {
- if (err) {
- return callback(err);
- }
-
- let token = crypto.randomBytes(20).toString('hex').toLowerCase();
- let query = 'UPDATE users SET `access_token`=? WHERE id=? LIMIT 1';
- let values = [token, id];
-
- connection.query(query, values, (err, result) => {
- connection.release();
- if (err) {
- return callback(err);
- }
- return callback(null, result.affectedRows);
- });
- });
-
-};
-
-
module.exports.sendReset = (username, callback) => {
username = (username || '').toString().trim();
if (!username) {
- return callback(new Error(_('Username must be set')));
+ return callback(new Error('Username must be set'));
}
db.getConnection((err, connection) => {
@@ -320,7 +216,7 @@ module.exports.sendReset = (username, callback) => {
to: {
address: rows[0].email
},
- subject: _('Mailer password change request')
+ subject: 'Mailer password change request'
}, {
html: 'emails/password-reset-html.hbs',
text: 'emails/password-reset-text.hbs',
@@ -331,7 +227,7 @@ module.exports.sendReset = (username, callback) => {
}
}, err => {
if (err) {
- log.error('Mail', err); // eslint-disable-line no-console
+ log.error('Mail', err.stack); // eslint-disable-line no-console
}
});
@@ -344,7 +240,7 @@ module.exports.sendReset = (username, callback) => {
module.exports.checkResetToken = (username, resetToken, callback) => {
if (!username || !resetToken) {
- return callback(new Error(_('Missing username or reset token')));
+ return callback(new Error('Missing username or reset token'));
}
db.getConnection((err, connection) => {
if (err) {
@@ -364,11 +260,11 @@ module.exports.resetPassword = (data, callback) => {
let updates = tools.convertKeys(data);
if (!updates.username || !updates.resetToken) {
- return callback(new Error(_('Missing username or reset token')));
+ return callback(new Error('Missing username or reset token'));
}
if (!updates.password || !updates.password2 || updates.password !== updates.password2) {
- return callback(new Error(_('Invalid new password')));
+ return callback(new Error('Invalid new password'));
}
bcrypt.hash(updates.password, null, null, (err, hash) => {
diff --git a/lib/passport.js b/lib/passport.js
index 364d34fe..d3882d64 100644
--- a/lib/passport.js
+++ b/lib/passport.js
@@ -1,43 +1,17 @@
'use strict';
-let config = require('config');
-let log = require('npmlog');
-let _ = require('./translate')._;
-let util = require('util');
-
let passport = require('passport');
-let fs = require('fs');
let LocalStrategy = require('passport-local').Strategy;
-
let csrf = require('csurf');
let bodyParser = require('body-parser');
let users = require('./models/users');
-let LdapStrategy;
-try {
- LdapStrategy = require('passport-ldapjs').Strategy; // eslint-disable-line global-require
-} catch (E) {
- if (config.ldap.enabled) {
- log.info('LDAP', 'Module "passport-ldapjs" not installed. It will not be used for LDAP auth.');
- }
-}
-
-let LdapAuthStrategy;
-try {
- LdapAuthStrategy = require('passport-ldapauth').Strategy; // eslint-disable-line global-require
-} catch (E) {
- if (config.ldapauth.enabled) {
- log.info('LDAP', 'Module "passport-ldapauth" not installed. It will not be used for LDAP auth.');
- }
-}
-
module.exports.csrfProtection = csrf({
cookie: true
});
module.exports.parseForm = bodyParser.urlencoded({
- extended: false,
- limit: config.www.postsize
+ extended: false
});
module.exports.setup = app => {
@@ -47,22 +21,20 @@ module.exports.setup = app => {
module.exports.logout = (req, res) => {
if (req.user) {
- req.flash('info', util.format(_('%s logged out'), req.user.username));
+ req.flash('info', req.user.username + ' logged out');
req.logout();
}
res.redirect('/');
};
module.exports.login = (req, res, next) => {
- let authMode = config.ldapauth.enabled ? 'ldapauth' : config.ldap.enabled ? 'ldap' : 'local';
- passport.authenticate(authMode, (err, user, info) => {
+ passport.authenticate('local', (err, user, info) => {
if (err) {
req.flash('danger', err.message);
return next(err);
}
if (!user) {
- log.warn('auth', `[client ${req.ip}] authentication failure`);
- req.flash('danger', info && info.message || _('Failed to authenticate user'));
+ req.flash('danger', info && info.message || 'Failed to authenticate user');
return res.redirect('/users/login' + (req.body.next ? '?next=' + encodeURIComponent(req.body.next) : ''));
}
req.logIn(user, err => {
@@ -78,124 +50,27 @@ module.exports.login = (req, res, next) => {
req.session.cookie.expires = false;
}
- req.flash('success', util.format(_('Logged in as %s'), user.username));
+ req.flash('success', 'Logged in as ' + user.username);
return res.redirect(req.body.next || '/');
});
})(req, res, next);
};
-if (config.ldap.enabled && LdapStrategy) {
- log.info('Using LDAP auth (passport-ldapjs)');
-
- let opts = {
- server: {
- url: config.ldap.url,
- tlsOptions: {
- ca: config.ldap.ca ? [
- fs.readFileSync(config.ldap.ca)
- ] : undefined
- }
- },
- base: config.ldap.baseDN,
- search: {
- filter: config.ldap.filter,
- attributes: [config.ldap.uidTag, 'mail'],
- scope: 'sub'
- },
- uidTag: config.ldap.uidTag,
- bindUser: config.ldap.bindUser,
- bindPassword: config.ldap.bindPassword
- };
-
- passport.use(new LdapStrategy(opts, (profile, done) => {
- users.findByUsername(profile[config.ldap.uidTag], (err, user) => {
- if (err) {
- return done(err);
- }
-
- if (!user) {
- // password is empty for ldap
- users.add(profile[config.ldap.uidTag], '', profile.mail, (err, id) => {
- if (err) {
- return done(err);
- }
-
- return done(null, {
- id,
- username: profile[config.ldap.uidTag]
- });
- });
- } else {
- return done(null, {
- id: user.id,
- username: user.username
- });
- }
- });
- }));
-} else if (config.ldapauth.enabled && LdapAuthStrategy) {
- log.info('Using LDAP auth (passport-ldapauth)');
- let opts = {
- server: {
- url: config.ldapauth.url,
- searchBase: config.ldapauth.baseDN,
- searchFilter: config.ldapauth.filter,
- searchAttributes: [config.ldapauth.uidTag, 'mail'],
- bindDN: config.ldapauth.bindUser,
- bindCredentials: config.ldapauth.bindPassword,
- tlsOptions: {
- ca: config.ldapauth.ca ? [
- fs.readFileSync(config.ldapauth.ca)
- ] : undefined
- }
+passport.use(new LocalStrategy((username, password, done) => {
+ users.authenticate(username, password, (err, user) => {
+ if (err) {
+ return done(err);
}
- };
- passport.use(new LdapAuthStrategy(opts, (profile, done) => {
- users.findByUsername(profile[config.ldapauth.uidTag], (err, user) => {
- if (err) {
- return done(err);
- }
+ if (!user) {
+ return done(null, false, {
+ message: 'Incorrect username or password'
+ });
+ }
- if (!user) {
- // password is empty for ldap
- users.add(profile[config.ldapauth.uidTag], '', profile.mail, (err, id) => {
- if (err) {
- return done(err);
- }
-
- return done(null, {
- id,
- username: profile[config.ldapauth.uidTag]
- });
- });
- } else {
- return done(null, {
- id: user.id,
- username: user.username
- });
- }
- });
- }));
-} else {
- log.info('Using local auth');
-
- passport.use(new LocalStrategy((username, password, done) => {
- users.authenticate(username, password, (err, user) => {
- if (err) {
- return done(err);
- }
-
- if (!user) {
- return done(null, false, {
- message: _('Incorrect username or password')
- });
- }
-
- return done(null, user);
- });
- }));
-}
+ return done(null, user);
+ });
+}));
passport.serializeUser((user, done) => {
done(null, user.id);
diff --git a/lib/privilege-helpers.js b/lib/privilege-helpers.js
deleted file mode 100644
index 07d39844..00000000
--- a/lib/privilege-helpers.js
+++ /dev/null
@@ -1,77 +0,0 @@
-'use strict';
-
-const log = require('npmlog');
-const config = require('config');
-
-const fs = require('fs');
-
-const tryRequire = require('try-require');
-const posix = tryRequire('posix');
-
-function _getConfigUidGid(prefix, defaultUid, defaultGid) {
- let uid = defaultUid;
- let gid = defaultGid;
-
- if (posix) {
- try {
- if (config.user) {
- uid = posix.getpwnam(config[prefix + 'user']).uid;
- }
- } catch (err) {
- log.info('PrivilegeHelpers', 'Failed to resolve user id "%s"', config[prefix + 'user']);
- }
-
- try {
- if (config.user) {
- gid = posix.getpwnam(config[prefix + 'group']).gid;
- }
- } catch (err) {
- log.info('PrivilegeHelpers', 'Failed to resolve group id "%s"', config[prefix + 'group']);
- }
- } else {
- log.info('PrivilegeHelpers', 'Posix module not installed. Cannot resolve uid/gid');
- }
-
- return { uid, gid };
-}
-
-function getConfigUidGid() {
- return _getConfigUidGid('', process.getuid(), process.getgid());
-}
-
-function getConfigROUidGid() {
- let rwIds = getConfigUidGid();
- return _getConfigUidGid('ro', rwIds.uid, rwIds.gid);
-}
-
-function ensureMailtrainOwner(file, callback) {
- const ids = getConfigUidGid();
- fs.chown(file, ids.uid, ids.gid, callback);
-}
-
-function dropRootPrivileges() {
- if (config.group) {
- try {
- process.setgid(config.group);
- log.info('PrivilegeHelpers', 'Changed group to "%s" (%s)', config.group, process.getgid());
- } catch (E) {
- log.info('PrivilegeHelpers', 'Failed to change group to "%s" (%s)', config.group, E.message);
- }
- }
-
- if (config.user) {
- try {
- process.setuid(config.user);
- log.info('PrivilegeHelpers', 'Changed user to "%s" (%s)', config.user, process.getuid());
- } catch (E) {
- log.info('PrivilegeHelpers', 'Failed to change user to "%s" (%s)', config.user, E.message);
- }
- }
-}
-
-module.exports = {
- dropRootPrivileges,
- ensureMailtrainOwner,
- getConfigUidGid,
- getConfigROUidGid
-};
diff --git a/lib/report-processor.js b/lib/report-processor.js
deleted file mode 100644
index 82653849..00000000
--- a/lib/report-processor.js
+++ /dev/null
@@ -1,147 +0,0 @@
-'use strict';
-
-const log = require('npmlog');
-const reports = require('./models/reports');
-const executor = require('./executor');
-
-let runningWorkersCount = 0;
-let maxWorkersCount = 1;
-
-let workers = {};
-
-function startWorker(report) {
-
- function onStarted(tid) {
- log.info('ReportProcessor', 'Worker process for "%s" started with tid %s. Current worker count is %s.', report.name, tid, runningWorkersCount);
- workers[report.id] = tid;
- }
-
- function onFinished(code, signal) {
- runningWorkersCount--;
- log.info('ReportProcessor', 'Worker process for "%s" (tid %s) exited with code %s signal %s. Current worker count is %s.', report.name, workers[report.id], code, signal, runningWorkersCount);
- delete workers[report.id];
-
- const fields = {};
- if (code === 0) {
- fields.state = reports.ReportState.FINISHED;
- fields.lastRun = new Date();
- } else {
- fields.state = reports.ReportState.FAILED;
- }
-
- reports.updateFields(report.id, fields, err => {
- if (err) {
- log.error('ReportProcessor', err);
- }
-
- setImmediate(startWorkers);
- });
- }
-
- function onFailed(msg) {
- runningWorkersCount--;
- log.error('ReportProcessor', 'Executing worker process for "%s" (tid %s) failed with message "%s". Current worker count is %s.', report.name, workers[report.id], msg, runningWorkersCount);
- delete workers[report.id];
-
- const fields = {
- state: reports.ReportState.FAILED
- };
-
- reports.updateFields(report.id, fields, err => {
- if (err) {
- log.error('ReportProcessor', err);
- }
-
- setImmediate(startWorkers);
- });
- }
-
- const reportData = {
- id: report.id,
- name: report.name
- };
-
- runningWorkersCount++;
- executor.start('report-processor-worker', reportData, onStarted, onFinished, onFailed);
-}
-
-function startWorkers() {
- reports.listWithState(reports.ReportState.SCHEDULED, 0, maxWorkersCount - runningWorkersCount, (err, reportList) => {
- if (err) {
- log.error('ReportProcessor', err);
- return;
- }
-
- for (let report of reportList) {
- reports.updateFields(report.id, { state: reports.ReportState.PROCESSING }, err => {
- if (err) {
- log.error('ReportProcessor', err);
- return;
- }
-
- startWorker(report);
- });
- }
- });
-}
-
-module.exports.start = (reportId, callback) => {
- if (!workers[reportId]) {
- log.info('ReportProcessor', 'Scheduling report id: %s', reportId);
- reports.updateFields(reportId, { state: reports.ReportState.SCHEDULED, lastRun: null}, err => {
- if (err) {
- return callback(err);
- }
-
- if (runningWorkersCount < maxWorkersCount) {
- log.info('ReportProcessor', 'Starting worker because runningWorkersCount=%s maxWorkersCount=%s', runningWorkersCount, maxWorkersCount);
-
- startWorkers();
- } else {
- log.info('ReportProcessor', 'Not starting worker because runningWorkersCount=%s maxWorkersCount=%s', runningWorkersCount, maxWorkersCount);
- }
-
- callback(null);
- });
- } else {
- log.info('ReportProcessor', 'Worker for report id: %s is already running.', reportId);
- }
-};
-
-module.exports.stop = (reportId, callback) => {
- const tid = workers[reportId];
- if (tid) {
- log.info('ReportProcessor', 'Killing worker for report id: %s', reportId);
- executor.stop(tid);
- reports.updateFields(reportId, { state: reports.ReportState.FAILED}, callback);
- } else {
- log.info('ReportProcessor', 'No running worker found for report id: %s', reportId);
- }
-};
-
-module.exports.init = callback => {
- reports.listWithState(reports.ReportState.PROCESSING, 0, 0, (err, reportList) => {
- if (err) {
- log.error('ReportProcessor', err);
- }
-
- function scheduleReport() {
- if (reportList.length > 0) {
- const report = reportList.shift();
-
- reports.updateFields(report.id, { state: reports.ReportState.SCHEDULED}, err => {
- if (err) {
- log.error('ReportProcessor', err);
- }
-
- scheduleReport();
- });
- }
-
- startWorkers();
- return callback();
- }
-
- scheduleReport();
- });
-};
diff --git a/lib/subscription-mail-helpers.js b/lib/subscription-mail-helpers.js
deleted file mode 100644
index 71ed13af..00000000
--- a/lib/subscription-mail-helpers.js
+++ /dev/null
@@ -1,155 +0,0 @@
-'use strict';
-
-const log = require('npmlog');
-let fields = require('./models/fields');
-let settings = require('./models/settings');
-let mailer = require('./mailer');
-let urllib = require('url');
-let helpers = require('./helpers');
-let _ = require('./translate')._;
-let util = require('util');
-
-
-module.exports = {
- sendAlreadySubscribed,
- sendConfirmAddressChange,
- sendConfirmSubscription,
- sendConfirmUnsubscription,
- sendSubscriptionConfirmed,
- sendUnsubscriptionConfirmed
-};
-
-function sendSubscriptionConfirmed(list, email, subscription, callback) {
- const relativeUrls = {
- preferencesUrl: '/subscription/' + list.cid + '/manage/' + subscription.cid,
- unsubscribeUrl: '/subscription/' + list.cid + '/unsubscribe/' + subscription.cid
- };
-
- sendMail(list, email, 'subscription-confirmed', _('%s: Subscription Confirmed'), relativeUrls, {}, subscription, callback);
-}
-
-function sendAlreadySubscribed(list, email, subscription, callback) {
- const mailOpts = {
- ignoreDisableConfirmations: true
- };
- const relativeUrls = {
- preferencesUrl: '/subscription/' + list.cid + '/manage/' + subscription.cid,
- unsubscribeUrl: '/subscription/' + list.cid + '/unsubscribe/' + subscription.cid
- };
- sendMail(list, email, 'already-subscribed', _('%s: Email Address Already Registered'), relativeUrls, mailOpts, subscription, callback);
-}
-
-function sendConfirmAddressChange(list, email, cid, subscription, callback) {
- const mailOpts = {
- ignoreDisableConfirmations: true
- };
- const relativeUrls = {
- confirmUrl: '/subscription/confirm/change-address/' + cid
- };
- sendMail(list, email, 'confirm-address-change', _('%s: Please Confirm Email Change in Subscription'), relativeUrls, mailOpts, subscription, callback);
-}
-
-function sendConfirmSubscription(list, email, cid, subscription, callback) {
- const mailOpts = {
- ignoreDisableConfirmations: true
- };
- const relativeUrls = {
- confirmUrl: '/subscription/confirm/subscribe/' + cid
- };
- sendMail(list, email, 'confirm-subscription', _('%s: Please Confirm Subscription'), relativeUrls, mailOpts, subscription, callback);
-}
-
-function sendConfirmUnsubscription(list, email, cid, subscription, callback) {
- const mailOpts = {
- ignoreDisableConfirmations: true
- };
- const relativeUrls = {
- confirmUrl: '/subscription/confirm/unsubscribe/' + cid
- };
- sendMail(list, email, 'confirm-unsubscription', _('%s: Please Confirm Unsubscription'), relativeUrls, mailOpts, subscription, callback);
-}
-
-function sendUnsubscriptionConfirmed(list, email, subscription, callback) {
- const relativeUrls = {
- subscribeUrl: '/subscription/' + list.cid + '?cid=' + subscription.cid
- };
- sendMail(list, email, 'unsubscription-confirmed', _('%s: Unsubscription Confirmed'), relativeUrls, {}, subscription, callback);
-}
-
-
-function sendMail(list, email, template, subject, relativeUrls, mailOpts, subscription, callback) {
- fields.list(list.id, (err, fieldList) => {
- if (err) {
- return callback(err);
- }
-
- let encryptionKeys = [];
- fields.getRow(fieldList, subscription).forEach(field => {
- if (field.type === 'gpg' && field.value) {
- encryptionKeys.push(field.value.trim());
- }
- });
-
- settings.list(['defaultHomepage', 'defaultFrom', 'defaultAddress', 'defaultPostaddress', 'serviceUrl', 'disableConfirmations'], (err, configItems) => {
- if (err) {
- return callback(err);
- }
-
- if (!mailOpts.ignoreDisableConfirmations && configItems.disableConfirmations) {
- return callback();
- }
-
- const data = {
- title: list.name,
- homepage: configItems.defaultHomepage || configItems.serviceUrl,
- contactAddress: configItems.defaultAddress,
- defaultPostaddress: configItems.defaultPostaddress
- };
-
- for (let relativeUrlKey in relativeUrls) {
- data[relativeUrlKey] = urllib.resolve(configItems.serviceUrl, relativeUrls[relativeUrlKey]);
- }
-
- let text = {
- template: 'subscription/mail-' + template + '-text.hbs'
- };
-
- let html = {
- template: 'subscription/mail-' + template + '-html.mjml.hbs',
- layout: 'subscription/layout.mjml.hbs',
- type: 'mjml'
- };
-
- helpers.injectCustomFormTemplates(list.defaultForm, { text, html }, (err, tmpl) => {
- if (!err && tmpl) {
- text = tmpl.text || text;
- html = tmpl.html || html;
- }
-
- mailer.sendMail({
- from: {
- name: configItems.defaultFrom,
- address: configItems.defaultAddress
- },
- to: {
- name: [].concat(subscription.firstName || []).concat(subscription.lastName || []).join(' '),
- address: email
- },
- subject: util.format(subject, list.name),
- encryptionKeys
- }, {
- html,
- text,
- data
- }, err => {
- if (err) {
- log.error('Subscription', err);
- }
- });
-
- callback();
-
- });
- });
- });
-}
diff --git a/lib/table-helpers.js b/lib/table-helpers.js
deleted file mode 100644
index 1176eba2..00000000
--- a/lib/table-helpers.js
+++ /dev/null
@@ -1,134 +0,0 @@
-'use strict';
-
-const db = require('./db');
-const tools = require('./tools');
-
-module.exports.list = (source, fields, orderBy, queryData, start, limit, callback) => {
- db.getConnection((err, connection) => {
- if (err) {
- return callback(err);
- }
-
- let limitQuery = '';
- let limitValues = [];
- if (limit) {
- limitQuery = ' LIMIT ?';
- limitValues.push(limit);
-
- if (start) {
- limitQuery += ' OFFSET ?';
- limitValues.push(start);
- }
- }
-
- let whereClause = '';
- let whereValues = [];
-
- if (queryData) {
- whereClause = ' WHERE ' + queryData.where;
- whereValues = queryData.values;
- }
-
- connection.query('SELECT SQL_CALC_FOUND_ROWS ' + fields.join(', ') + ' FROM ' + source + whereClause + ' ORDER BY ' + orderBy + ' DESC' + limitQuery, whereValues.concat(limitValues), (err, rows) => {
- if (err) {
- connection.release();
- return callback(err);
- }
- connection.query('SELECT FOUND_ROWS() AS total', (err, total) => {
- connection.release();
- if (err) {
- return callback(err);
- }
- return callback(null, rows, total && total[0] && total[0].total);
- });
- });
- });
-};
-
-module.exports.quicklist = (source, fields, orderBy, callback) => {
- db.getConnection((err, connection) => {
- if (err) {
- return callback(err);
- }
-
- connection.query('SELECT ' + fields.join(', ') + ' FROM ' + source + ' ORDER BY ' + orderBy + ' LIMIT 1000', (err, rows) => {
- connection.release();
- if (err) {
- return callback(err);
- }
- return callback(null, (rows || []).map(tools.convertKeys));
- });
- });
-};
-
-module.exports.filter = (source, fields, request, columns, searchFields, defaultOrdering, queryData, callback) => {
- db.getConnection((err, connection) => {
- if (err) {
- return callback(err);
- }
-
- let query = 'SELECT COUNT(*) AS total FROM ' + source;
- let values = [];
-
- if (queryData) {
- query += ' WHERE ' + queryData.where;
- values = values.concat(queryData.values || []);
- }
-
- connection.query(query, values, (err, total) => {
- if (err) {
- connection.release();
- return callback(err);
- }
- total = total && total[0] && total[0].total || 0;
-
- let ordering = [];
-
- if (request.order && request.order.length) {
-
- request.order.forEach(order => {
- let orderField = columns[Number(order.column)];
- let orderDirection = (order.dir || '').toString().toLowerCase() === 'desc' ? 'DESC' : 'ASC';
- if (orderField) {
- ordering.push(orderField + ' ' + orderDirection);
- }
- });
- }
-
- if (!ordering.length) {
- ordering.push(defaultOrdering);
- }
-
- let searchWhere = '';
- let searchArgs = [];
-
- if (request.search && request.search.value) {
- let searchVal = '%' + request.search.value.replace(/\\/g, '\\\\').replace(/([%_])/g, '\\$1') + '%';
-
- searchWhere = searchFields.map(field => field + ' LIKE ?').join(' OR ');
- searchArgs = searchFields.map(() => searchVal);
- }
-
- let query = 'SELECT SQL_CALC_FOUND_ROWS ' + fields.join(', ') + ' FROM ' + source +' WHERE ' + (searchWhere ? '(' + searchWhere + ')': '1') + (queryData ? ' AND (' + queryData.where + ')' : '') + ' ORDER BY ' + ordering.join(', ') + ' LIMIT ? OFFSET ?';
- let args = searchArgs.concat(queryData ? queryData.values : []).concat([Number(request.length) || 50, Number(request.start) || 0]);
-
- connection.query(query, args, (err, rows) => {
- if (err) {
- connection.release();
- return callback(err);
- }
- connection.query('SELECT FOUND_ROWS() AS total', (err, filteredTotal) => {
- connection.release();
- if (err) {
- return callback(err);
- }
-
- rows = rows.map(row => tools.convertKeys(row));
-
- filteredTotal = filteredTotal && filteredTotal[0] && filteredTotal[0].total || 0;
- return callback(null, rows, total, filteredTotal);
- });
- });
- });
- });
-};
diff --git a/lib/tools.js b/lib/tools.js
index b0d16822..a67791b6 100644
--- a/lib/tools.js
+++ b/lib/tools.js
@@ -1,19 +1,9 @@
'use strict';
-const config = require('config');
-let fs = require('fs');
-let path = require('path');
let db = require('./db');
let slugify = require('slugify');
let Isemail = require('isemail');
let urllib = require('url');
-let juice = require('juice');
-let jsdom = require('jsdom');
-let he = require('he');
-let _ = require('./translate')._;
-let util = require('util');
-let createDOMPurify = require('dompurify');
-let htmlToText = require('html-to-text');
let blockedUsers = ['abuse', 'admin', 'billing', 'compliance', 'devnull', 'dns', 'ftp', 'hostmaster', 'inoc', 'ispfeedback', 'ispsupport', 'listrequest', 'list', 'maildaemon', 'noc', 'noreply', 'noreply', 'null', 'phish', 'phishing', 'postmaster', 'privacy', 'registrar', 'root', 'security', 'spam', 'support', 'sysadmin', 'tech', 'undisclosedrecipients', 'unsubscribe', 'usenet', 'uucp', 'webmaster', 'www'];
@@ -25,32 +15,21 @@ module.exports = {
createSlug,
updateMenu,
validateEmail,
- formatMessage,
- getMessageLinks,
- prepareHtml,
- purifyHTML,
- mergeTemplateIntoLayout,
- workers: new Set()
+ formatMessage
};
function toDbKey(key) {
return key.
- replace(/[^a-z0-9\-_]/gi, '').
- replace(/-+/g, '_').
- replace(/[A-Z]/g, c => '_' + c.toLowerCase()).
- replace(/^_+|_+$/g, '').
- replace(/_+/g, '_').
- trim();
+ replace(/[^a-z0-9\-_]/gi, '').
+ replace(/\-+/g, '_').
+ replace(/[A-Z]+/g, c => '_' + c.toLowerCase()).
+ replace(/^_+|_+$/g, '').
+ replace(/_+/g, '_').
+ trim();
}
function fromDbKey(key) {
- let prefix = '';
- if (key.startsWith('_')) {
- key = key.substring(1);
- prefix = '_';
-
- }
- return prefix + key.replace(/[_-]([a-z])/g, (m, c) => c.toUpperCase());
+ return key.replace(/[_\-]([a-z])/g, (m, c) => c.toUpperCase());
}
function convertKeys(obj, options) {
@@ -61,7 +40,7 @@ function convertKeys(obj, options) {
if (options.skip && options.skip.indexOf(lKey) >= 0) {
return;
}
- if (options.keep && options.keep.indexOf(lKey) < 0) {
+ if (options.keep && options.skip.indexOf(lKey) < 0) {
return;
}
response[lKey] = obj[key];
@@ -71,9 +50,9 @@ function convertKeys(obj, options) {
function queryParams(obj) {
return Object.keys(obj).
- filter(key => key !== '_csrf').
- map(key => encodeURIComponent(key) + '=' + encodeURIComponent(obj[key])).
- join('&');
+ filter(key => key !== '_csrf').
+ map(key => encodeURIComponent(key) + '=' + encodeURIComponent(obj[key])).
+ join('&');
}
function createSlug(table, name, callback) {
@@ -122,36 +101,25 @@ function updateMenu(res) {
}
res.locals.menu.push({
- title: _('Lists'),
+ title: 'Lists',
url: '/lists',
key: 'lists'
}, {
- title: _('Templates'),
+ title: 'Templates',
url: '/templates',
key: 'templates'
}, {
- title: _('Campaigns'),
+ title: 'Campaigns',
url: '/campaigns',
key: 'campaigns'
- }, {
- title: _('Automation'),
- url: '/triggers',
- key: 'triggers'
});
-
- if (config.reports && config.reports.enabled === true) {
- res.locals.menu.push({
- title: _('Reports'),
- url: '/reports',
- key: 'reports'
- });
- }
}
function validateEmail(address, checkBlocked, callback) {
+
let user = (address || '').toString().split('@').shift().toLowerCase().replace(/[^a-z0-9]/g, '');
if (checkBlocked && blockedUsers.indexOf(user) >= 0) {
- return callback(new Error(util.format(_('Blocked email address "%s"'), address)));
+ return callback(new Error('Blocked email address "' + address + '"'));
}
Isemail.validate(address, {
@@ -160,16 +128,16 @@ function validateEmail(address, checkBlocked, callback) {
}, result => {
if (result !== 0) {
- let message = util.format(_('Invalid email address "%s".'), address);
+ let message = 'Invalid email address "' + address + '"';
switch (result) {
case 5:
- message += ' ' + _('MX record not found for domain');
+ message += '. MX record not found for domain';
break;
case 6:
- message += ' ' + _('Address domain not found');
+ message += '. Address domain not found';
break;
case 12:
- message += ' ' + _('Address domain name is required');
+ message += '. Address domain name is required';
break;
}
return callback(new Error(message));
@@ -179,145 +147,25 @@ function validateEmail(address, checkBlocked, callback) {
});
}
-function getMessageLinks(serviceUrl, campaign, list, subscription) {
- return {
- LINK_UNSUBSCRIBE: campaign.unsubscribe ? campaign.unsubscribe : urllib.resolve(serviceUrl, '/subscription/' + list.cid + '/unsubscribe/' + subscription.cid + '?c=' + campaign.cid),
- LINK_PREFERENCES: urllib.resolve(serviceUrl, '/subscription/' + list.cid + '/manage/' + subscription.cid),
- LINK_BROWSER: urllib.resolve(serviceUrl, '/archive/' + campaign.cid + '/' + list.cid + '/' + subscription.cid),
- CAMPAIGN_ID: campaign.cid,
- LIST_ID: list.cid,
- SUBSCRIPTION_ID: subscription.cid
- };
-}
+function formatMessage(serviceUrl, campaign, list, subscription, message) {
-function formatMessage(serviceUrl, campaign, list, subscription, message, filter, isHTML) {
- filter = typeof filter === 'function' ? filter : (str => str);
-
- let links = getMessageLinks(serviceUrl, campaign, list, subscription);
-
- let getTagValue = key => {
- key = (key || '').toString().toUpperCase().trim();
- if (links.hasOwnProperty(key)) {
- return links[key];
+ let getValue = key => {
+ switch ((key || '').toString().toUpperCase().trim()) {
+ case 'LINK_UNSUBSCRIBE':
+ return urllib.resolve(serviceUrl, '/subscription/' + list.cid + '/unsubscribe/' + subscription.cid + '?auto=yes&c=' + campaign.cid);
+ case 'LINK_PREFERENCES':
+ return urllib.resolve(serviceUrl, '/subscription/' + list.cid + '/manage/' + subscription.cid);
+ case 'LINK_BROWSER':
+ return urllib.resolve(serviceUrl, '/archive/' + campaign.cid + '/' + list.cid + '/' + subscription.cid);
}
if (subscription.mergeTags.hasOwnProperty(key)) {
- let value = (subscription.mergeTags[key] || '').toString();
- let containsHTML = /<[a-z][\s\S]*>/.test(value);
- return isHTML ? he.encode((containsHTML ? value : value.replace(/(?:\r\n|\r|\n)/g, '
')), {
- useNamedReferences: true,
- allowUnsafeSymbols: true
- }) : (containsHTML ? htmlToText.fromString(value) : value);
+ return subscription.mergeTags[key];
}
return false;
};
- let tagReplace = message =>
- message.replace(/\[([a-z0-9_]+)(?:\/([^\]]+))?\]/ig, (match, identifier, fallback) => {
- identifier = identifier.toUpperCase();
- let value = getTagValue(identifier);
- if (value === false) {
- return match;
- }
- value = (value || fallback || '').trim();
- return filter(value);
- });
-
- return tagReplace(tagReplace(message));
-}
-
-function prepareHtml(html, callback) {
- if (!(html || '').toString().trim()) {
- return callback(null, false);
- }
- jsdom.env(false, false, {
- html,
- features: {
- FetchExternalResources: false, // disables resource loading over HTTP / filesystem
- ProcessExternalResources: false // do not execute JS within script blocks
- }
- }, (err, win) => {
- if (err) {
- return callback(err);
- }
-
- let head = win.document.querySelector('head');
- let hasCharsetTag = false;
- let metaTags = win.document.querySelectorAll('meta');
- if (metaTags) {
- for (let i = 0; i < metaTags.length; i++) {
- if (metaTags[i].hasAttribute('charset')) {
- metaTags[i].setAttribute('charset', 'utf-8');
- hasCharsetTag = true;
- break;
- }
- }
- }
- if (!hasCharsetTag) {
- let charsetTag = win.document.createElement('meta');
- charsetTag.setAttribute('charset', 'utf-8');
- head.appendChild(charsetTag);
- }
- let preparedHtml = '' + win.document.documentElement.innerHTML + '';
-
- return callback(null, juice(preparedHtml));
+ return message.replace(/\[([a-z0-9_]+)(?:\/([^\]]+))?\]/ig, (match, identifier, fallback) => {
+ identifier = identifier.toUpperCase();
+ return (getValue(identifier) || fallback || '').trim() || match;
});
}
-
-function purifyHTML(html) {
- let win = jsdom.jsdom('', {
- features: {
- FetchExternalResources: false, // disables resource loading over HTTP / filesystem
- ProcessExternalResources: false // do not execute JS within script blocks
- }
- }).defaultView;
- let DOMPurify = createDOMPurify(win);
- return DOMPurify.sanitize(html);
-}
-
-// TODO Simplify!
-function mergeTemplateIntoLayout(template, layout, callback) {
-
- layout = layout || '{{{body}}}';
-
- let readFile = (relPath, callback) => {
- fs.readFile(path.join(__dirname, '..', 'views', relPath), 'utf-8', (err, source) => {
- if (err) {
- return callback(err);
- }
- callback(null, source);
- });
- };
-
- let done = (template, layout) => {
- let source = layout.replace(/\{\{\{body\}\}\}/g, template);
- return callback(null, source);
- };
-
- if (layout.endsWith('.hbs')) {
- readFile(layout, (err, layout) => {
- if (err) {
- return callback(err);
- }
- // Please dont end your custom messages with .hbs ...
- if (template.endsWith('.hbs')) {
- readFile(template, (err, template) => {
- if (err) {
- return callback(err);
- }
- return done(template, layout);
- });
- } else {
- return done(template, layout);
- }
- });
- } else if (template.endsWith('.hbs')) {
- readFile(template, (err, template) => {
- if (err) {
- return callback(err);
- }
- return done(template, layout);
- });
- } else {
- return done(template, layout);
- }
-}
diff --git a/lib/translate.js b/lib/translate.js
deleted file mode 100644
index 9abd9a6f..00000000
--- a/lib/translate.js
+++ /dev/null
@@ -1,41 +0,0 @@
-'use strict';
-
-const config = require('config');
-
-const Gettext = require('node-gettext');
-const gt = new Gettext();
-const fs = require('fs');
-const path = require('path');
-const log = require('npmlog');
-const gettextParser = require('gettext-parser');
-const fakelang = require('./fakelang');
-
-const language = config.language || 'en';
-
-[].concat(config.language || []).forEach(lang => {
- let data;
- let file = path.join(__dirname, '..', 'languages', lang + '.mo');
- try {
- data = gettextParser.mo.parse(fs.readFileSync(file));
- } catch (E) {
- // ignore
- }
- if (data) {
- gt.addTranslations(lang, lang, data);
- gt.setTextDomain(lang);
- gt.setLocale(lang);
- log.info('LANG', 'Loaded language file for %s', lang);
- }
-});
-
-module.exports._ = str => {
- if (typeof str !== 'string') {
- str = String(str);
- }
-
- if (language === 'zz') {
- return fakelang(str);
- }
-
- return gt.dgettext(language, str);
-};
diff --git a/meta.json b/meta.json
deleted file mode 100644
index f48d12cd..00000000
--- a/meta.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "schemaVersion": 34
-}
diff --git a/package.json b/package.json
index 20f988c6..36b48a6d 100644
--- a/package.json
+++ b/package.json
@@ -1,123 +1,61 @@
{
"name": "mailtrain",
"private": true,
- "version": "1.24.0",
+ "version": "1.0.0",
"description": "Self hosted email newsletter app",
"main": "index.js",
"scripts": {
"test": "grunt",
- "start": "node index.js",
- "sqlinit": "node setup/sql/init.js",
- "sqldump": "node setup/sql/dump.js | sed -e '/^\\/\\*.*\\*\\/;$/d' -e 's/.[0-9]\\{4\\}-[0-9][0-9]-[0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9]./NOW()/g' > setup/sql/mailtrain${DUMP_NAME_SUFFIX}.sql",
- "sqldrop": "node setup/sql/drop.js",
- "sqlgen": "npm run sqldrop && DB_FROM_START=Y npm run sqlinit && npm run sqldump",
- "langs:hbs": "jsxgettext -L handlebars -k translate -o langs/hbs.pot views/layout.hbs views/index.hbs",
- "langs:js": "jsxgettext -o languages/js.pot routes/index.js",
- "langs": "npm run langs:hbs && npm run langs:js",
- "sqldumptest": "NODE_ENV=test DUMP_NAME_SUFFIX=-test npm run sqldump",
- "sqlresettest": "NODE_ENV=test npm run sqldrop && NODE_ENV=test npm run sqlinit",
- "starttest": "NODE_ENV=test node index.js",
- "_e2e": "NODE_ENV=test node test/e2e/index.js",
- "e2e": "npm run sqlresettest && npm run _e2e"
+ "start": "node index.js"
},
"repository": {
"type": "git",
- "url": "git://github.com/Mailtrain-org/mailtrain.git"
+ "url": "git://github.com/andris9/mailtrain.git"
},
"author": "Andris Reinman",
"license": "GPL-3.0",
- "homepage": "https://mailtrain.org/",
- "engines": {
- "node": ">=5.0.0"
+ "homepage": "http://mailtrain.org",
+ "engines" : {
+ "node" : ">=5.0.0"
},
"devDependencies": {
- "babel-eslint": "^8.0.0",
- "bluebird": "^3.5.0",
- "chai": "^4.1.2",
- "eslint-config-nodemailer": "^1.2.0",
"grunt": "^1.0.1",
"grunt-cli": "^1.2.0",
"grunt-contrib-nodeunit": "^1.0.0",
- "grunt-eslint": "^20.1.0",
- "jsxgettext-andris": "^0.9.0-patch.1",
- "lodash": "^4.17.4",
- "mocha": "^3.5.3",
- "phantomjs-prebuilt": "^2.1.15",
- "selenium-webdriver": "^3.5.0",
- "url-pattern": "^1.0.3"
- },
- "optionalDependencies": {
- "posix": "^4.1.1"
+ "grunt-eslint": "^18.0.0"
},
"dependencies": {
- "async": "^2.5.0",
- "aws-sdk": "^2.122.0",
"bcrypt-nodejs": "0.0.3",
- "body-parser": "^1.18.2",
- "bounce-handler": "^7.3.2-fork.2",
- "compression": "^1.7.0",
- "config": "^1.26.2",
+ "body-parser": "^1.15.0",
+ "compression": "^1.6.1",
+ "config": "^1.20.0",
"connect-flash": "^0.1.1",
- "connect-redis": "^3.3.0",
- "cookie-parser": "^1.4.3",
- "cors": "^2.8.4",
- "csurf": "^1.9.0",
- "csv-parse": "^1.2.3",
- "device": "^0.3.8",
- "dompurify": "^1.0.2",
+ "connect-redis": "^3.0.2",
+ "content-security-policy": "^0.2.0",
+ "cookie-parser": "^1.4.1",
+ "csurf": "^1.8.3",
+ "csv-parse": "^1.0.4",
"escape-html": "^1.0.3",
- "escape-string-regexp": "^1.0.5",
- "express": "^4.15.5",
- "express-session": "^1.15.5",
- "faker": "^4.1.0",
- "feedparser": "^2.2.1",
- "fs-extra": "^4.0.2",
- "geoip-ultralight": "^0.1.5",
- "gettext-parser": "^1.3.0",
- "gm": "^1.23.0",
- "handlebars": "^4.0.10",
- "hbs": "^4.0.1",
- "he": "^1.1.1",
- "html-to-text": "^3.3.0",
+ "express": "^4.13.4",
+ "express-session": "^1.13.0",
+ "geoip-ultralight": "^0.1.3",
+ "handlebars": "^4.0.5",
+ "hbs": "^4.0.0",
"humanize": "0.0.9",
- "is-url": "^1.2.2",
- "isemail": "^2.2.1",
- "jquery-file-upload-middleware": "^0.1.8",
- "jsdom": "^9.12.0",
- "json-stringify-date": "^0.1.4",
- "juice": "^4.1.1",
- "libmime": "^3.1.0",
- "mailparser": "^2.0.5",
- "marked": "^0.3.6",
- "memory-cache": "^0.2.0",
- "mjml": "3.3.5",
- "mkdirp": "^0.5.1",
- "moment-timezone": "^0.5.13",
- "morgan": "^1.8.2",
- "multer": "^1.3.0",
- "multiparty": "^4.1.3",
- "mysql": "^2.14.1",
- "node-gettext": "^2.0.0",
- "node-mocks-http": "^1.6.5",
- "nodemailer": "^4.1.1",
- "nodemailer-openpgp": "^1.1.0",
- "npmlog": "^4.1.2",
- "object-hash": "^1.1.8",
- "openpgp": "^2.5.11",
- "passport": "^0.4.0",
+ "isemail": "^2.1.0",
+ "morgan": "^1.7.0",
+ "multer": "^1.1.0",
+ "mysql": "^2.10.2",
+ "nodemailer": "^2.3.1",
+ "npmlog": "^2.0.3",
+ "passport": "^0.3.2",
"passport-local": "^1.0.0",
- "passport-ldapauth": "^2.0.0",
- "premailer-api": "^1.0.4",
- "redfour": "^1.0.2",
- "redis": "^2.8.0",
- "request": "^2.82.0",
- "request-promise": "^4.2.2",
- "serve-favicon": "^2.4.4",
- "shortid": "^2.2.8",
- "slugify": "^1.2.1",
- "smtp-server": "^3.1.0",
- "striptags": "^3.1.0",
- "toml": "^2.3.3",
- "try-require": "^1.2.1"
+ "request": "^2.70.0",
+ "serve-favicon": "^2.3.0",
+ "shortid": "^2.2.6",
+ "slugify": "^0.1.1",
+ "smtp-server": "^1.9.0",
+ "striptags": "^2.1.1",
+ "toml": "^2.3.0"
}
}
diff --git a/protected/reports/.gitignore b/protected/reports/.gitignore
deleted file mode 100644
index d5b76284..00000000
--- a/protected/reports/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-*
-!.gitignore
-!README.md
\ No newline at end of file
diff --git a/protected/reports/README.md b/protected/reports/README.md
deleted file mode 100644
index 0420f4d0..00000000
--- a/protected/reports/README.md
+++ /dev/null
@@ -1 +0,0 @@
-This directory serves for generated reports.
\ No newline at end of file
diff --git a/public/ace/ace.js b/public/ace/ace.js
deleted file mode 100644
index 2923ef0c..00000000
--- a/public/ace/ace.js
+++ /dev/null
@@ -1,11 +0,0 @@
-(function(){function o(n){var i=e;n&&(e[n]||(e[n]={}),i=e[n]);if(!i.define||!i.define.packaged)t.original=i.define,i.define=t,i.define.packaged=!0;if(!i.require||!i.require.packaged)r.original=i.require,i.require=r,i.require.packaged=!0}var ACE_NAMESPACE = "ace",e=function(){return this}();!e&&typeof window!="undefined"&&(e=window);if(!ACE_NAMESPACE&&typeof requirejs!="undefined")return;var t=function(e,n,r){if(typeof e!="string"){t.original?t.original.apply(this,arguments):(console.error("dropping module because define wasn't a string."),console.trace());return}arguments.length==2&&(r=n),t.modules[e]||(t.payloads[e]=r,t.modules[e]=null)};t.modules={},t.payloads={};var n=function(e,t,n){if(typeof t=="string"){var i=s(e,t);if(i!=undefined)return n&&n(),i}else if(Object.prototype.toString.call(t)==="[object Array]"){var o=[];for(var u=0,a=t.length;u1&&u(t,"")>-1&&(a=RegExp(this.source,r.replace.call(o(this),"g","")),r.replace.call(e.slice(t.index),a,function(){for(var e=1;et.index&&this.lastIndex--}return t},s||(RegExp.prototype.test=function(e){var t=r.exec.call(this,e);return t&&this.global&&!t[0].length&&this.lastIndex>t.index&&this.lastIndex--,!!t})}),ace.define("ace/lib/es5-shim",["require","exports","module"],function(e,t,n){function r(){}function w(e){try{return Object.defineProperty(e,"sentinel",{}),"sentinel"in e}catch(t){}}function H(e){return e=+e,e!==e?e=0:e!==0&&e!==1/0&&e!==-1/0&&(e=(e>0||-1)*Math.floor(Math.abs(e))),e}function B(e){var t=typeof e;return e===null||t==="undefined"||t==="boolean"||t==="number"||t==="string"}function j(e){var t,n,r;if(B(e))return e;n=e.valueOf;if(typeof n=="function"){t=n.call(e);if(B(t))return t}r=e.toString;if(typeof r=="function"){t=r.call(e);if(B(t))return t}throw new TypeError}Function.prototype.bind||(Function.prototype.bind=function(t){var n=this;if(typeof n!="function")throw new TypeError("Function.prototype.bind called on incompatible "+n);var i=u.call(arguments,1),s=function(){if(this instanceof s){var e=n.apply(this,i.concat(u.call(arguments)));return Object(e)===e?e:this}return n.apply(t,i.concat(u.call(arguments)))};return n.prototype&&(r.prototype=n.prototype,s.prototype=new r,r.prototype=null),s});var i=Function.prototype.call,s=Array.prototype,o=Object.prototype,u=s.slice,a=i.bind(o.toString),f=i.bind(o.hasOwnProperty),l,c,h,p,d;if(d=f(o,"__defineGetter__"))l=i.bind(o.__defineGetter__),c=i.bind(o.__defineSetter__),h=i.bind(o.__lookupGetter__),p=i.bind(o.__lookupSetter__);if([1,2].splice(0).length!=2)if(!function(){function e(e){var t=new Array(e+2);return t[0]=t[1]=0,t}var t=[],n;t.splice.apply(t,e(20)),t.splice.apply(t,e(26)),n=t.length,t.splice(5,0,"XXX"),n+1==t.length;if(n+1==t.length)return!0}())Array.prototype.splice=function(e,t){var n=this.length;e>0?e>n&&(e=n):e==void 0?e=0:e<0&&(e=Math.max(n+e,0)),e+ta)for(h=l;h--;)this[f+h]=this[a+h];if(s&&e===c)this.length=c,this.push.apply(this,i);else{this.length=c+s;for(h=0;h>>0;if(a(t)!="[object Function]")throw new TypeError;while(++s>>0,s=Array(i),o=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var u=0;u>>0,s=[],o,u=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var f=0;f>>0,s=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var o=0;o>>0,s=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var o=0;o>>0;if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");if(!i&&arguments.length==1)throw new TypeError("reduce of empty array with no initial value");var s=0,o;if(arguments.length>=2)o=arguments[1];else do{if(s in r){o=r[s++];break}if(++s>=i)throw new TypeError("reduce of empty array with no initial value")}while(!0);for(;s>>0;if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");if(!i&&arguments.length==1)throw new TypeError("reduceRight of empty array with no initial value");var s,o=i-1;if(arguments.length>=2)s=arguments[1];else do{if(o in r){s=r[o--];break}if(--o<0)throw new TypeError("reduceRight of empty array with no initial value")}while(!0);do o in this&&(s=t.call(void 0,s,r[o],o,n));while(o--);return s});if(!Array.prototype.indexOf||[0,1].indexOf(1,2)!=-1)Array.prototype.indexOf=function(t){var n=g&&a(this)=="[object String]"?this.split(""):F(this),r=n.length>>>0;if(!r)return-1;var i=0;arguments.length>1&&(i=H(arguments[1])),i=i>=0?i:Math.max(0,r+i);for(;i>>0;if(!r)return-1;var i=r-1;arguments.length>1&&(i=Math.min(i,H(arguments[1]))),i=i>=0?i:r-Math.abs(i);for(;i>=0;i--)if(i in n&&t===n[i])return i;return-1};Object.getPrototypeOf||(Object.getPrototypeOf=function(t){return t.__proto__||(t.constructor?t.constructor.prototype:o)});if(!Object.getOwnPropertyDescriptor){var y="Object.getOwnPropertyDescriptor called on a non-object: ";Object.getOwnPropertyDescriptor=function(t,n){if(typeof t!="object"&&typeof t!="function"||t===null)throw new TypeError(y+t);if(!f(t,n))return;var r,i,s;r={enumerable:!0,configurable:!0};if(d){var u=t.__proto__;t.__proto__=o;var i=h(t,n),s=p(t,n);t.__proto__=u;if(i||s)return i&&(r.get=i),s&&(r.set=s),r}return r.value=t[n],r}}Object.getOwnPropertyNames||(Object.getOwnPropertyNames=function(t){return Object.keys(t)});if(!Object.create){var b;Object.prototype.__proto__===null?b=function(){return{__proto__:null}}:b=function(){var e={};for(var t in e)e[t]=null;return e.constructor=e.hasOwnProperty=e.propertyIsEnumerable=e.isPrototypeOf=e.toLocaleString=e.toString=e.valueOf=e.__proto__=null,e},Object.create=function(t,n){var r;if(t===null)r=b();else{if(typeof t!="object")throw new TypeError("typeof prototype["+typeof t+"] != 'object'");var i=function(){};i.prototype=t,r=new i,r.__proto__=t}return n!==void 0&&Object.defineProperties(r,n),r}}if(Object.defineProperty){var E=w({}),S=typeof document=="undefined"||w(document.createElement("div"));if(!E||!S)var x=Object.defineProperty}if(!Object.defineProperty||x){var T="Property description must be an object: ",N="Object.defineProperty called on non-object: ",C="getters & setters can not be defined on this javascript engine";Object.defineProperty=function(t,n,r){if(typeof t!="object"&&typeof t!="function"||t===null)throw new TypeError(N+t);if(typeof r!="object"&&typeof r!="function"||r===null)throw new TypeError(T+r);if(x)try{return x.call(Object,t,n,r)}catch(i){}if(f(r,"value"))if(d&&(h(t,n)||p(t,n))){var s=t.__proto__;t.__proto__=o,delete t[n],t[n]=r.value,t.__proto__=s}else t[n]=r.value;else{if(!d)throw new TypeError(C);f(r,"get")&&l(t,n,r.get),f(r,"set")&&c(t,n,r.set)}return t}}Object.defineProperties||(Object.defineProperties=function(t,n){for(var r in n)f(n,r)&&Object.defineProperty(t,r,n[r]);return t}),Object.seal||(Object.seal=function(t){return t}),Object.freeze||(Object.freeze=function(t){return t});try{Object.freeze(function(){})}catch(k){Object.freeze=function(t){return function(n){return typeof n=="function"?n:t(n)}}(Object.freeze)}Object.preventExtensions||(Object.preventExtensions=function(t){return t}),Object.isSealed||(Object.isSealed=function(t){return!1}),Object.isFrozen||(Object.isFrozen=function(t){return!1}),Object.isExtensible||(Object.isExtensible=function(t){if(Object(t)===t)throw new TypeError;var n="";while(f(t,n))n+="?";t[n]=!0;var r=f(t,n);return delete t[n],r});if(!Object.keys){var L=!0,A=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],O=A.length;for(var M in{toString:null})L=!1;Object.keys=function I(e){if(typeof e!="object"&&typeof e!="function"||e===null)throw new TypeError("Object.keys called on a non-object");var I=[];for(var t in e)f(e,t)&&I.push(t);if(L)for(var n=0,r=O;n=0?parseFloat((i.match(/(?:MSIE |Trident\/[0-9]+[\.0-9]+;.*rv:)([0-9]+[\.0-9]+)/)||[])[1]):parseFloat((i.match(/(?:Trident\/[0-9]+[\.0-9]+;.*rv:)([0-9]+[\.0-9]+)/)||[])[1]),t.isOldIE=t.isIE&&t.isIE<9,t.isGecko=t.isMozilla=(window.Controllers||window.controllers)&&window.navigator.product==="Gecko",t.isOldGecko=t.isGecko&&parseInt((i.match(/rv\:(\d+)/)||[])[1],10)<4,t.isOpera=window.opera&&Object.prototype.toString.call(window.opera)=="[object Opera]",t.isWebKit=parseFloat(i.split("WebKit/")[1])||undefined,t.isChrome=parseFloat(i.split(" Chrome/")[1])||undefined,t.isAIR=i.indexOf("AdobeAIR")>=0,t.isIPad=i.indexOf("iPad")>=0,t.isTouchPad=i.indexOf("TouchPad")>=0,t.isChromeOS=i.indexOf(" CrOS ")>=0}),ace.define("ace/lib/event",["require","exports","module","ace/lib/keys","ace/lib/useragent"],function(e,t,n){"use strict";function a(e,t,n){var a=u(t);if(!i.isMac&&s){s.OSKey&&(a|=8);if(s.altGr){if((3&a)==3)return;s.altGr=0}if(n===18||n===17){var f="location"in t?t.location:t.keyLocation;if(n===17&&f===1)s[n]==1&&(o=t.timeStamp);else if(n===18&&a===3&&f===2){var l=t.timeStamp-o;l<50&&(s.altGr=!0)}}}n in r.MODIFIER_KEYS&&(n=-1),a&8&&n>=91&&n<=93&&(n=-1);if(!a&&n===13){var f="location"in t?t.location:t.keyLocation;if(f===3){e(t,a,-n);if(t.defaultPrevented)return}}if(i.isChromeOS&&a&8){e(t,a,n);if(t.defaultPrevented)return;a&=-9}return!!a||n in r.FUNCTION_KEYS||n in r.PRINTABLE_KEYS?e(t,a,n):!1}function f(){s=Object.create(null),s.count=0,s.lastT=0}var r=e("./keys"),i=e("./useragent"),s=null,o=0;t.addListener=function(e,t,n){if(e.addEventListener)return e.addEventListener(t,n,!1);if(e.attachEvent){var r=function(){n.call(e,window.event)};n._wrapper=r,e.attachEvent("on"+t,r)}},t.removeListener=function(e,t,n){if(e.removeEventListener)return e.removeEventListener(t,n,!1);e.detachEvent&&e.detachEvent("on"+t,n._wrapper||n)},t.stopEvent=function(e){return t.stopPropagation(e),t.preventDefault(e),!1},t.stopPropagation=function(e){e.stopPropagation?e.stopPropagation():e.cancelBubble=!0},t.preventDefault=function(e){e.preventDefault?e.preventDefault():e.returnValue=!1},t.getButton=function(e){return e.type=="dblclick"?0:e.type=="contextmenu"||i.isMac&&e.ctrlKey&&!e.altKey&&!e.shiftKey?2:e.preventDefault?e.button:{1:0,2:2,4:1}[e.button]},t.capture=function(e,n,r){function i(e){n&&n(e),r&&r(e),t.removeListener(document,"mousemove",n,!0),t.removeListener(document,"mouseup",i,!0),t.removeListener(document,"dragstart",i,!0)}return t.addListener(document,"mousemove",n,!0),t.addListener(document,"mouseup",i,!0),t.addListener(document,"dragstart",i,!0),i},t.addTouchMoveListener=function(e,n){if("ontouchmove"in e){var r,i;t.addListener(e,"touchstart",function(e){var t=e.changedTouches[0];r=t.clientX,i=t.clientY}),t.addListener(e,"touchmove",function(e){var t=1,s=e.changedTouches[0];e.wheelX=-(s.clientX-r)/t,e.wheelY=-(s.clientY-i)/t,r=s.clientX,i=s.clientY,n(e)})}},t.addMouseWheelListener=function(e,n){"onmousewheel"in e?t.addListener(e,"mousewheel",function(e){var t=8;e.wheelDeltaX!==undefined?(e.wheelX=-e.wheelDeltaX/t,e.wheelY=-e.wheelDeltaY/t):(e.wheelX=0,e.wheelY=-e.wheelDelta/t),n(e)}):"onwheel"in e?t.addListener(e,"wheel",function(e){var t=.35;switch(e.deltaMode){case e.DOM_DELTA_PIXEL:e.wheelX=e.deltaX*t||0,e.wheelY=e.deltaY*t||0;break;case e.DOM_DELTA_LINE:case e.DOM_DELTA_PAGE:e.wheelX=(e.deltaX||0)*5,e.wheelY=(e.deltaY||0)*5}n(e)}):t.addListener(e,"DOMMouseScroll",function(e){e.axis&&e.axis==e.HORIZONTAL_AXIS?(e.wheelX=(e.detail||0)*5,e.wheelY=0):(e.wheelX=0,e.wheelY=(e.detail||0)*5),n(e)})},t.addMultiMouseDownListener=function(e,n,r,s){function c(e){t.getButton(e)!==0?o=0:e.detail>1?(o++,o>4&&(o=1)):o=1;if(i.isIE){var c=Math.abs(e.clientX-u)>5||Math.abs(e.clientY-a)>5;if(!f||c)o=1;f&&clearTimeout(f),f=setTimeout(function(){f=null},n[o-1]||600),o==1&&(u=e.clientX,a=e.clientY)}e._clicks=o,r[s]("mousedown",e);if(o>4)o=0;else if(o>1)return r[s](l[o],e)}function h(e){o=2,f&&clearTimeout(f),f=setTimeout(function(){f=null},n[o-1]||600),r[s]("mousedown",e),r[s](l[o],e)}var o=0,u,a,f,l={2:"dblclick",3:"tripleclick",4:"quadclick"};Array.isArray(e)||(e=[e]),e.forEach(function(e){t.addListener(e,"mousedown",c),i.isOldIE&&t.addListener(e,"dblclick",h)})};var u=!i.isMac||!i.isOpera||"KeyboardEvent"in window?function(e){return 0|(e.ctrlKey?1:0)|(e.altKey?2:0)|(e.shiftKey?4:0)|(e.metaKey?8:0)}:function(e){return 0|(e.metaKey?1:0)|(e.altKey?2:0)|(e.shiftKey?4:0)|(e.ctrlKey?8:0)};t.getModifierString=function(e){return r.KEY_MODS[u(e)]},t.addCommandKeyListener=function(e,n){var r=t.addListener;if(i.isOldGecko||i.isOpera&&!("KeyboardEvent"in window)){var o=null;r(e,"keydown",function(e){o=e.keyCode}),r(e,"keypress",function(e){return a(n,e,o)})}else{var u=null;r(e,"keydown",function(e){var t=e.keyCode;s[t]=(s[t]||0)+1,t==91||t==92?s.OSKey=!0:s.OSKey&&e.timeStamp-s.lastT>200&&s.count==1&&f(),s[t]==1&&s.count++,s.lastT=e.timeStamp;var r=a(n,e,t);return u=e.defaultPrevented,r}),r(e,"keypress",function(e){u&&(e.ctrlKey||e.altKey||e.shiftKey||e.metaKey)&&(t.stopEvent(e),u=null)}),r(e,"keyup",function(e){var t=e.keyCode;s[t]?s.count=Math.max(s.count-1,0):f();if(t==91||t==92)s.OSKey=!1;s[t]=null}),s||(f(),r(window,"focus",f))}};if(typeof window=="object"&&window.postMessage&&!i.isOldIE){var l=1;t.nextTick=function(e,n){n=n||window;var r="zero-timeout-message-"+l;t.addListener(n,"message",function i(s){s.data==r&&(t.stopPropagation(s),t.removeListener(n,"message",i),e())}),n.postMessage(r,"*")}}t.nextFrame=typeof window=="object"&&(window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame||window.oRequestAnimationFrame),t.nextFrame?t.nextFrame=t.nextFrame.bind(window):t.nextFrame=function(e){setTimeout(e,17)}}),ace.define("ace/lib/lang",["require","exports","module"],function(e,t,n){"use strict";t.last=function(e){return e[e.length-1]},t.stringReverse=function(e){return e.split("").reverse().join("")},t.stringRepeat=function(e,t){var n="";while(t>0){t&1&&(n+=e);if(t>>=1)e+=e}return n};var r=/^\s\s*/,i=/\s\s*$/;t.stringTrimLeft=function(e){return e.replace(r,"")},t.stringTrimRight=function(e){return e.replace(i,"")},t.copyObject=function(e){var t={};for(var n in e)t[n]=e[n];return t},t.copyArray=function(e){var t=[];for(var n=0,r=e.length;n1),e.preventDefault()},this.startSelect=function(e,t){e=e||this.editor.renderer.screenToTextCoordinates(this.x,this.y);var n=this.editor;n.$blockScrolling++,this.mousedownEvent.getShiftKey()?n.selection.selectToPosition(e):t||n.selection.moveToPosition(e),t||this.select(),n.renderer.scroller.setCapture&&n.renderer.scroller.setCapture(),n.setStyle("ace_selecting"),this.setState("select"),n.$blockScrolling--},this.select=function(){var e,t=this.editor,n=t.renderer.screenToTextCoordinates(this.x,this.y);t.$blockScrolling++;if(this.$clickSelection){var r=this.$clickSelection.comparePoint(n);if(r==-1)e=this.$clickSelection.end;else if(r==1)e=this.$clickSelection.start;else{var i=f(this.$clickSelection,n);n=i.cursor,e=i.anchor}t.selection.setSelectionAnchor(e.row,e.column)}t.selection.selectToPosition(n),t.$blockScrolling--,t.renderer.scrollCursorIntoView()},this.extendSelectionBy=function(e){var t,n=this.editor,r=n.renderer.screenToTextCoordinates(this.x,this.y),i=n.selection[e](r.row,r.column);n.$blockScrolling++;if(this.$clickSelection){var s=this.$clickSelection.comparePoint(i.start),o=this.$clickSelection.comparePoint(i.end);if(s==-1&&o<=0){t=this.$clickSelection.end;if(i.end.row!=r.row||i.end.column!=r.column)r=i.start}else if(o==1&&s>=0){t=this.$clickSelection.start;if(i.start.row!=r.row||i.start.column!=r.column)r=i.end}else if(s==-1&&o==1)r=i.end,t=i.start;else{var u=f(this.$clickSelection,r);r=u.cursor,t=u.anchor}n.selection.setSelectionAnchor(t.row,t.column)}n.selection.selectToPosition(r),n.$blockScrolling--,n.renderer.scrollCursorIntoView()},this.selectEnd=this.selectAllEnd=this.selectByWordsEnd=this.selectByLinesEnd=function(){this.$clickSelection=null,this.editor.unsetStyle("ace_selecting"),this.editor.renderer.scroller.releaseCapture&&this.editor.renderer.scroller.releaseCapture()},this.focusWait=function(){var e=a(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y),t=Date.now();(e>o||t-this.mousedownEvent.time>this.$focusTimout)&&this.startSelect(this.mousedownEvent.getDocumentPosition())},this.onDoubleClick=function(e){var t=e.getDocumentPosition(),n=this.editor,r=n.session,i=r.getBracketRange(t);i?(i.isEmpty()&&(i.start.column--,i.end.column++),this.setState("select")):(i=n.selection.getWordRange(t.row,t.column),this.setState("selectByWords")),this.$clickSelection=i,this.select()},this.onTripleClick=function(e){var t=e.getDocumentPosition(),n=this.editor;this.setState("selectByLines");var r=n.getSelectionRange();r.isMultiLine()&&r.contains(t.row,t.column)?(this.$clickSelection=n.selection.getLineRange(r.start.row),this.$clickSelection.end=n.selection.getLineRange(r.end.row).end):this.$clickSelection=n.selection.getLineRange(t.row),this.select()},this.onQuadClick=function(e){var t=this.editor;t.selectAll(),this.$clickSelection=t.getSelectionRange(),this.setState("selectAll")},this.onMouseWheel=function(e){if(e.getAccelKey())return;e.getShiftKey()&&e.wheelY&&!e.wheelX&&(e.wheelX=e.wheelY,e.wheelY=0);var t=e.domEvent.timeStamp,n=t-(this.$lastScrollTime||0),r=this.editor,i=r.renderer.isScrollableBy(e.wheelX*e.speed,e.wheelY*e.speed);if(i||n<200)return this.$lastScrollTime=t,r.renderer.scrollBy(e.wheelX*e.speed,e.wheelY*e.speed),e.stop()},this.onTouchMove=function(e){var t=e.domEvent.timeStamp,n=t-(this.$lastScrollTime||0),r=this.editor,i=r.renderer.isScrollableBy(e.wheelX*e.speed,e.wheelY*e.speed);if(i||n<200)return this.$lastScrollTime=t,r.renderer.scrollBy(e.wheelX*e.speed,e.wheelY*e.speed),e.stop()}}).call(u.prototype),t.DefaultHandlers=u}),ace.define("ace/tooltip",["require","exports","module","ace/lib/oop","ace/lib/dom"],function(e,t,n){"use strict";function s(e){this.isOpen=!1,this.$element=null,this.$parentNode=e}var r=e("./lib/oop"),i=e("./lib/dom");(function(){this.$init=function(){return this.$element=i.createElement("div"),this.$element.className="ace_tooltip",this.$element.style.display="none",this.$parentNode.appendChild(this.$element),this.$element},this.getElement=function(){return this.$element||this.$init()},this.setText=function(e){i.setInnerText(this.getElement(),e)},this.setHtml=function(e){this.getElement().innerHTML=e},this.setPosition=function(e,t){this.getElement().style.left=e+"px",this.getElement().style.top=t+"px"},this.setClassName=function(e){i.addCssClass(this.getElement(),e)},this.show=function(e,t,n){e!=null&&this.setText(e),t!=null&&n!=null&&this.setPosition(t,n),this.isOpen||(this.getElement().style.display="block",this.isOpen=!0)},this.hide=function(){this.isOpen&&(this.getElement().style.display="none",this.isOpen=!1)},this.getHeight=function(){return this.getElement().offsetHeight},this.getWidth=function(){return this.getElement().offsetWidth}}).call(s.prototype),t.Tooltip=s}),ace.define("ace/mouse/default_gutter_handler",["require","exports","module","ace/lib/dom","ace/lib/oop","ace/lib/event","ace/tooltip"],function(e,t,n){"use strict";function u(e){function l(){var r=u.getDocumentPosition().row,s=n.$annotations[r];if(!s)return c();var o=t.session.getLength();if(r==o){var a=t.renderer.pixelToScreenCoordinates(0,u.y).row,l=u.$pos;if(a>t.session.documentToScreenRow(l.row,l.column))return c()}if(f==s)return;f=s.text.join("
"),i.setHtml(f),i.show(),t.on("mousewheel",c);if(e.$tooltipFollowsMouse)h(u);else{var p=u.domEvent.target,d=p.getBoundingClientRect(),v=i.getElement().style;v.left=d.right+"px",v.top=d.bottom+"px"}}function c(){o&&(o=clearTimeout(o)),f&&(i.hide(),f=null,t.removeEventListener("mousewheel",c))}function h(e){i.setPosition(e.x,e.y)}var t=e.editor,n=t.renderer.$gutterLayer,i=new a(t.container);e.editor.setDefaultHandler("guttermousedown",function(r){if(!t.isFocused()||r.getButton()!=0)return;var i=n.getRegion(r);if(i=="foldWidgets")return;var s=r.getDocumentPosition().row,o=t.session.selection;if(r.getShiftKey())o.selectTo(s,0);else{if(r.domEvent.detail==2)return t.selectAll(),r.preventDefault();e.$clickSelection=t.selection.getLineRange(s)}return e.setState("selectByLines"),e.captureMouse(r),r.preventDefault()});var o,u,f;e.editor.setDefaultHandler("guttermousemove",function(t){var n=t.domEvent.target||t.domEvent.srcElement;if(r.hasCssClass(n,"ace_fold-widget"))return c();f&&e.$tooltipFollowsMouse&&h(t),u=t;if(o)return;o=setTimeout(function(){o=null,u&&!e.isMousePressed?l():c()},50)}),s.addListener(t.renderer.$gutter,"mouseout",function(e){u=null;if(!f||o)return;o=setTimeout(function(){o=null,c()},50)}),t.on("changeSession",c)}function a(e){o.call(this,e)}var r=e("../lib/dom"),i=e("../lib/oop"),s=e("../lib/event"),o=e("../tooltip").Tooltip;i.inherits(a,o),function(){this.setPosition=function(e,t){var n=window.innerWidth||document.documentElement.clientWidth,r=window.innerHeight||document.documentElement.clientHeight,i=this.getWidth(),s=this.getHeight();e+=15,t+=15,e+i>n&&(e-=e+i-n),t+s>r&&(t-=20+s),o.prototype.setPosition.call(this,e,t)}}.call(a.prototype),t.GutterHandler=u}),ace.define("ace/mouse/mouse_event",["require","exports","module","ace/lib/event","ace/lib/useragent"],function(e,t,n){"use strict";var r=e("../lib/event"),i=e("../lib/useragent"),s=t.MouseEvent=function(e,t){this.domEvent=e,this.editor=t,this.x=this.clientX=e.clientX,this.y=this.clientY=e.clientY,this.$pos=null,this.$inSelection=null,this.propagationStopped=!1,this.defaultPrevented=!1};(function(){this.stopPropagation=function(){r.stopPropagation(this.domEvent),this.propagationStopped=!0},this.preventDefault=function(){r.preventDefault(this.domEvent),this.defaultPrevented=!0},this.stop=function(){this.stopPropagation(),this.preventDefault()},this.getDocumentPosition=function(){return this.$pos?this.$pos:(this.$pos=this.editor.renderer.screenToTextCoordinates(this.clientX,this.clientY),this.$pos)},this.inSelection=function(){if(this.$inSelection!==null)return this.$inSelection;var e=this.editor,t=e.getSelectionRange();if(t.isEmpty())this.$inSelection=!1;else{var n=this.getDocumentPosition();this.$inSelection=t.contains(n.row,n.column)}return this.$inSelection},this.getButton=function(){return r.getButton(this.domEvent)},this.getShiftKey=function(){return this.domEvent.shiftKey},this.getAccelKey=i.isMac?function(){return this.domEvent.metaKey}:function(){return this.domEvent.ctrlKey}}).call(s.prototype)}),ace.define("ace/mouse/dragdrop_handler",["require","exports","module","ace/lib/dom","ace/lib/event","ace/lib/useragent"],function(e,t,n){"use strict";function f(e){function T(e,n){var r=Date.now(),i=!n||e.row!=n.row,s=!n||e.column!=n.column;if(!S||i||s)t.$blockScrolling+=1,t.moveCursorToPosition(e),t.$blockScrolling-=1,S=r,x={x:p,y:d};else{var o=l(x.x,x.y,p,d);o>a?S=null:r-S>=u&&(t.renderer.scrollCursorIntoView(),S=null)}}function N(e,n){var r=Date.now(),i=t.renderer.layerConfig.lineHeight,s=t.renderer.layerConfig.characterWidth,u=t.renderer.scroller.getBoundingClientRect(),a={x:{left:p-u.left,right:u.right-p},y:{top:d-u.top,bottom:u.bottom-d}},f=Math.min(a.x.left,a.x.right),l=Math.min(a.y.top,a.y.bottom),c={row:e.row,column:e.column};f/s<=2&&(c.column+=a.x.left=o&&t.renderer.scrollCursorIntoView(c):E=r:E=null}function C(){var e=g;g=t.renderer.screenToTextCoordinates(p,d),T(g,e),N(g,e)}function k(){m=t.selection.toOrientedRange(),h=t.session.addMarker(m,"ace_selection",t.getSelectionStyle()),t.clearSelection(),t.isFocused()&&t.renderer.$cursorLayer.setBlinking(!1),clearInterval(v),C(),v=setInterval(C,20),y=0,i.addListener(document,"mousemove",O)}function L(){clearInterval(v),t.session.removeMarker(h),h=null,t.$blockScrolling+=1,t.selection.fromOrientedRange(m),t.$blockScrolling-=1,t.isFocused()&&!w&&t.renderer.$cursorLayer.setBlinking(!t.getReadOnly()),m=null,g=null,y=0,E=null,S=null,i.removeListener(document,"mousemove",O)}function O(){A==null&&(A=setTimeout(function(){A!=null&&h&&L()},20))}function M(e){var t=e.types;return!t||Array.prototype.some.call(t,function(e){return e=="text/plain"||e=="Text"})}function _(e){var t=["copy","copymove","all","uninitialized"],n=["move","copymove","linkmove","all","uninitialized"],r=s.isMac?e.altKey:e.ctrlKey,i="uninitialized";try{i=e.dataTransfer.effectAllowed.toLowerCase()}catch(e){}var o="none";return r&&t.indexOf(i)>=0?o="copy":n.indexOf(i)>=0?o="move":t.indexOf(i)>=0&&(o="copy"),o}var t=e.editor,n=r.createElement("img");n.src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==",s.isOpera&&(n.style.cssText="width:1px;height:1px;position:fixed;top:0;left:0;z-index:2147483647;opacity:0;");var f=["dragWait","dragWaitEnd","startDrag","dragReadyEnd","onMouseDrag"];f.forEach(function(t){e[t]=this[t]},this),t.addEventListener("mousedown",this.onMouseDown.bind(e));var c=t.container,h,p,d,v,m,g,y=0,b,w,E,S,x;this.onDragStart=function(e){if(this.cancelDrag||!c.draggable){var r=this;return setTimeout(function(){r.startSelect(),r.captureMouse(e)},0),e.preventDefault()}m=t.getSelectionRange();var i=e.dataTransfer;i.effectAllowed=t.getReadOnly()?"copy":"copyMove",s.isOpera&&(t.container.appendChild(n),n.scrollTop=0),i.setDragImage&&i.setDragImage(n,0,0),s.isOpera&&t.container.removeChild(n),i.clearData(),i.setData("Text",t.session.getTextRange()),w=!0,this.setState("drag")},this.onDragEnd=function(e){c.draggable=!1,w=!1,this.setState(null);if(!t.getReadOnly()){var n=e.dataTransfer.dropEffect;!b&&n=="move"&&t.session.remove(t.getSelectionRange()),t.renderer.$cursorLayer.setBlinking(!0)}this.editor.unsetStyle("ace_dragging"),this.editor.renderer.setCursorStyle("")},this.onDragEnter=function(e){if(t.getReadOnly()||!M(e.dataTransfer))return;return p=e.clientX,d=e.clientY,h||k(),y++,e.dataTransfer.dropEffect=b=_(e),i.preventDefault(e)},this.onDragOver=function(e){if(t.getReadOnly()||!M(e.dataTransfer))return;return p=e.clientX,d=e.clientY,h||(k(),y++),A!==null&&(A=null),e.dataTransfer.dropEffect=b=_(e),i.preventDefault(e)},this.onDragLeave=function(e){y--;if(y<=0&&h)return L(),b=null,i.preventDefault(e)},this.onDrop=function(e){if(!g)return;var n=e.dataTransfer;if(w)switch(b){case"move":m.contains(g.row,g.column)?m={start:g,end:g}:m=t.moveText(m,g);break;case"copy":m=t.moveText(m,g,!0)}else{var r=n.getData("Text");m={start:g,end:t.session.insert(g,r)},t.focus(),b=null}return L(),i.preventDefault(e)},i.addListener(c,"dragstart",this.onDragStart.bind(e)),i.addListener(c,"dragend",this.onDragEnd.bind(e)),i.addListener(c,"dragenter",this.onDragEnter.bind(e)),i.addListener(c,"dragover",this.onDragOver.bind(e)),i.addListener(c,"dragleave",this.onDragLeave.bind(e)),i.addListener(c,"drop",this.onDrop.bind(e));var A=null}function l(e,t,n,r){return Math.sqrt(Math.pow(n-e,2)+Math.pow(r-t,2))}var r=e("../lib/dom"),i=e("../lib/event"),s=e("../lib/useragent"),o=200,u=200,a=5;(function(){this.dragWait=function(){var e=Date.now()-this.mousedownEvent.time;e>this.editor.getDragDelay()&&this.startDrag()},this.dragWaitEnd=function(){var e=this.editor.container;e.draggable=!1,this.startSelect(this.mousedownEvent.getDocumentPosition()),this.selectEnd()},this.dragReadyEnd=function(e){this.editor.renderer.$cursorLayer.setBlinking(!this.editor.getReadOnly()),this.editor.unsetStyle("ace_dragging"),this.editor.renderer.setCursorStyle(""),this.dragWaitEnd()},this.startDrag=function(){this.cancelDrag=!1;var e=this.editor,t=e.container;t.draggable=!0,e.renderer.$cursorLayer.setBlinking(!1),e.setStyle("ace_dragging");var n=s.isWin?"default":"move";e.renderer.setCursorStyle(n),this.setState("dragReady")},this.onMouseDrag=function(e){var t=this.editor.container;if(s.isIE&&this.state=="dragReady"){var n=l(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y);n>3&&t.dragDrop()}if(this.state==="dragWait"){var n=l(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y);n>0&&(t.draggable=!1,this.startSelect(this.mousedownEvent.getDocumentPosition()))}},this.onMouseDown=function(e){if(!this.$dragEnabled)return;this.mousedownEvent=e;var t=this.editor,n=e.inSelection(),r=e.getButton(),i=e.domEvent.detail||1;if(i===1&&r===0&&n){if(e.editor.inMultiSelectMode&&(e.getAccelKey()||e.getShiftKey()))return;this.mousedownEvent.time=Date.now();var o=e.domEvent.target||e.domEvent.srcElement;"unselectable"in o&&(o.unselectable="on");if(t.getDragDelay()){if(s.isWebKit){this.cancelDrag=!0;var u=t.container;u.draggable=!0}this.setState("dragWait")}else this.startDrag();this.captureMouse(e,this.onMouseDrag.bind(this)),e.defaultPrevented=!0}}}).call(f.prototype),t.DragdropHandler=f}),ace.define("ace/lib/net",["require","exports","module","ace/lib/dom"],function(e,t,n){"use strict";var r=e("./dom");t.get=function(e,t){var n=new XMLHttpRequest;n.open("GET",e,!0),n.onreadystatechange=function(){n.readyState===4&&t(n.responseText)},n.send(null)},t.loadScript=function(e,t){var n=r.getDocumentHead(),i=document.createElement("script");i.src=e,n.appendChild(i),i.onload=i.onreadystatechange=function(e,n){if(n||!i.readyState||i.readyState=="loaded"||i.readyState=="complete")i=i.onload=i.onreadystatechange=null,n||t()}},t.qualifyURL=function(e){var t=document.createElement("a");return t.href=e,t.href}}),ace.define("ace/lib/event_emitter",["require","exports","module"],function(e,t,n){"use strict";var r={},i=function(){this.propagationStopped=!0},s=function(){this.defaultPrevented=!0};r._emit=r._dispatchEvent=function(e,t){this._eventRegistry||(this._eventRegistry={}),this._defaultHandlers||(this._defaultHandlers={});var n=this._eventRegistry[e]||[],r=this._defaultHandlers[e];if(!n.length&&!r)return;if(typeof t!="object"||!t)t={};t.type||(t.type=e),t.stopPropagation||(t.stopPropagation=i),t.preventDefault||(t.preventDefault=s),n=n.slice();for(var o=0;o1&&(i=n[n.length-2]);var o=a[t+"Path"];return o==null?o=a.basePath:r=="/"&&(t=r=""),o&&o.slice(-1)!="/"&&(o+="/"),o+t+r+i+this.get("suffix")},t.setModuleUrl=function(e,t){return a.$moduleUrls[e]=t},t.$loading={},t.loadModule=function(n,r){var i,o;Array.isArray(n)&&(o=n[0],n=n[1]);try{i=e(n)}catch(u){}if(i&&!t.$loading[n])return r&&r(i);t.$loading[n]||(t.$loading[n]=[]),t.$loading[n].push(r);if(t.$loading[n].length>1)return;var a=function(){e([n],function(e){t._emit("load.module",{name:n,module:e});var r=t.$loading[n];t.$loading[n]=null,r.forEach(function(t){t&&t(e)})})};if(!t.get("packaged"))return a();s.loadScript(t.moduleUrl(n,o),a)},t.init=f}),ace.define("ace/mouse/mouse_handler",["require","exports","module","ace/lib/event","ace/lib/useragent","ace/mouse/default_handlers","ace/mouse/default_gutter_handler","ace/mouse/mouse_event","ace/mouse/dragdrop_handler","ace/config"],function(e,t,n){"use strict";var r=e("../lib/event"),i=e("../lib/useragent"),s=e("./default_handlers").DefaultHandlers,o=e("./default_gutter_handler").GutterHandler,u=e("./mouse_event").MouseEvent,a=e("./dragdrop_handler").DragdropHandler,f=e("../config"),l=function(e){var t=this;this.editor=e,new s(this),new o(this),new a(this);var n=function(t){var n=!document.hasFocus||!document.hasFocus()||!e.isFocused()&&document.activeElement==(e.textInput&&e.textInput.getElement());n&&window.focus(),e.focus()},u=e.renderer.getMouseEventTarget();r.addListener(u,"click",this.onMouseEvent.bind(this,"click")),r.addListener(u,"mousemove",this.onMouseMove.bind(this,"mousemove")),r.addMultiMouseDownListener([u,e.renderer.scrollBarV&&e.renderer.scrollBarV.inner,e.renderer.scrollBarH&&e.renderer.scrollBarH.inner,e.textInput&&e.textInput.getElement()].filter(Boolean),[400,300,250],this,"onMouseEvent"),r.addMouseWheelListener(e.container,this.onMouseWheel.bind(this,"mousewheel")),r.addTouchMoveListener(e.container,this.onTouchMove.bind(this,"touchmove"));var f=e.renderer.$gutter;r.addListener(f,"mousedown",this.onMouseEvent.bind(this,"guttermousedown")),r.addListener(f,"click",this.onMouseEvent.bind(this,"gutterclick")),r.addListener(f,"dblclick",this.onMouseEvent.bind(this,"gutterdblclick")),r.addListener(f,"mousemove",this.onMouseEvent.bind(this,"guttermousemove")),r.addListener(u,"mousedown",n),r.addListener(f,"mousedown",n),i.isIE&&e.renderer.scrollBarV&&(r.addListener(e.renderer.scrollBarV.element,"mousedown",n),r.addListener(e.renderer.scrollBarH.element,"mousedown",n)),e.on("mousemove",function(n){if(t.state||t.$dragDelay||!t.$dragEnabled)return;var r=e.renderer.screenToTextCoordinates(n.x,n.y),i=e.session.selection.getRange(),s=e.renderer;!i.isEmpty()&&i.insideStart(r.row,r.column)?s.setCursorStyle("default"):s.setCursorStyle("")})};(function(){this.onMouseEvent=function(e,t){this.editor._emit(e,new u(t,this.editor))},this.onMouseMove=function(e,t){var n=this.editor._eventRegistry&&this.editor._eventRegistry.mousemove;if(!n||!n.length)return;this.editor._emit(e,new u(t,this.editor))},this.onMouseWheel=function(e,t){var n=new u(t,this.editor);n.speed=this.$scrollSpeed*2,n.wheelX=t.wheelX,n.wheelY=t.wheelY,this.editor._emit(e,n)},this.onTouchMove=function(e,t){var n=new u(t,this.editor);n.speed=1,n.wheelX=t.wheelX,n.wheelY=t.wheelY,this.editor._emit(e,n)},this.setState=function(e){this.state=e},this.captureMouse=function(e,t){this.x=e.x,this.y=e.y,this.isMousePressed=!0;var n=this.editor.renderer;n.$keepTextAreaAtCursor&&(n.$keepTextAreaAtCursor=null);var s=this,o=function(e){if(!e)return;if(i.isWebKit&&!e.which&&s.releaseMouse)return s.releaseMouse();s.x=e.clientX,s.y=e.clientY,t&&t(e),s.mouseEvent=new u(e,s.editor),s.$mouseMoved=!0},a=function(e){clearInterval(l),f(),s[s.state+"End"]&&s[s.state+"End"](e),s.state="",n.$keepTextAreaAtCursor==null&&(n.$keepTextAreaAtCursor=!0,n.$moveTextAreaToCursor()),s.isMousePressed=!1,s.$onCaptureMouseMove=s.releaseMouse=null,e&&s.onMouseEvent("mouseup",e)},f=function(){s[s.state]&&s[s.state](),s.$mouseMoved=!1};if(i.isOldIE&&e.domEvent.type=="dblclick")return setTimeout(function(){a(e)});s.$onCaptureMouseMove=o,s.releaseMouse=r.capture(this.editor.container,o,a);var l=setInterval(f,20)},this.releaseMouse=null,this.cancelContextMenu=function(){var e=function(t){if(t&&t.domEvent&&t.domEvent.type!="contextmenu")return;this.editor.off("nativecontextmenu",e),t&&t.domEvent&&r.stopEvent(t.domEvent)}.bind(this);setTimeout(e,10),this.editor.on("nativecontextmenu",e)}}).call(l.prototype),f.defineOptions(l.prototype,"mouseHandler",{scrollSpeed:{initialValue:2},dragDelay:{initialValue:i.isMac?150:0},dragEnabled:{initialValue:!0},focusTimout:{initialValue:0},tooltipFollowsMouse:{initialValue:!0}}),t.MouseHandler=l}),ace.define("ace/mouse/fold_handler",["require","exports","module"],function(e,t,n){"use strict";function r(e){e.on("click",function(t){var n=t.getDocumentPosition(),r=e.session,i=r.getFoldAt(n.row,n.column,1);i&&(t.getAccelKey()?r.removeFold(i):r.expandFold(i),t.stop())}),e.on("gutterclick",function(t){var n=e.renderer.$gutterLayer.getRegion(t);if(n=="foldWidgets"){var r=t.getDocumentPosition().row,i=e.session;i.foldWidgets&&i.foldWidgets[r]&&e.session.onFoldWidgetClick(r,t),e.isFocused()||e.focus(),t.stop()}}),e.on("gutterdblclick",function(t){var n=e.renderer.$gutterLayer.getRegion(t);if(n=="foldWidgets"){var r=t.getDocumentPosition().row,i=e.session,s=i.getParentFoldRangeData(r,!0),o=s.range||s.firstRange;if(o){r=o.start.row;var u=i.getFoldAt(r,i.getLine(r).length,1);u?i.removeFold(u):(i.addFold("...",o),e.renderer.scrollCursorIntoView({row:o.start.row,column:0}))}t.stop()}})}t.FoldHandler=r}),ace.define("ace/keyboard/keybinding",["require","exports","module","ace/lib/keys","ace/lib/event"],function(e,t,n){"use strict";var r=e("../lib/keys"),i=e("../lib/event"),s=function(e){this.$editor=e,this.$data={editor:e},this.$handlers=[],this.setDefaultHandler(e.commands)};(function(){this.setDefaultHandler=function(e){this.removeKeyboardHandler(this.$defaultHandler),this.$defaultHandler=e,this.addKeyboardHandler(e,0)},this.setKeyboardHandler=function(e){var t=this.$handlers;if(t[t.length-1]==e)return;while(t[t.length-1]&&t[t.length-1]!=this.$defaultHandler)this.removeKeyboardHandler(t[t.length-1]);this.addKeyboardHandler(e,1)},this.addKeyboardHandler=function(e,t){if(!e)return;typeof e=="function"&&!e.handleKeyboard&&(e.handleKeyboard=e);var n=this.$handlers.indexOf(e);n!=-1&&this.$handlers.splice(n,1),t==undefined?this.$handlers.push(e):this.$handlers.splice(t,0,e),n==-1&&e.attach&&e.attach(this.$editor)},this.removeKeyboardHandler=function(e){var t=this.$handlers.indexOf(e);return t==-1?!1:(this.$handlers.splice(t,1),e.detach&&e.detach(this.$editor),!0)},this.getKeyboardHandler=function(){return this.$handlers[this.$handlers.length-1]},this.getStatusText=function(){var e=this.$data,t=e.editor;return this.$handlers.map(function(n){return n.getStatusText&&n.getStatusText(t,e)||""}).filter(Boolean).join(" ")},this.$callKeyboardHandlers=function(e,t,n,r){var s,o=!1,u=this.$editor.commands;for(var a=this.$handlers.length;a--;){s=this.$handlers[a].handleKeyboard(this.$data,e,t,n,r);if(!s||!s.command)continue;s.command=="null"?o=!0:o=u.exec(s.command,this.$editor,s.args,r),o&&r&&e!=-1&&s.passEvent!=1&&s.command.passEvent!=1&&i.stopEvent(r);if(o)break}return!o&&e==-1&&(s={command:"insertstring"},o=u.exec("insertstring",this.$editor,t)),o&&this.$editor._signal("keyboardActivity",s),o},this.onCommandKey=function(e,t,n){var i=r.keyCodeToString(n);this.$callKeyboardHandlers(t,i,n,e)},this.onTextInput=function(e){this.$callKeyboardHandlers(-1,e)}}).call(s.prototype),t.KeyBinding=s}),ace.define("ace/range",["require","exports","module"],function(e,t,n){"use strict";var r=function(e,t){return e.row-t.row||e.column-t.column},i=function(e,t,n,r){this.start={row:e,column:t},this.end={row:n,column:r}};(function(){this.isEqual=function(e){return this.start.row===e.start.row&&this.end.row===e.end.row&&this.start.column===e.start.column&&this.end.column===e.end.column},this.toString=function(){return"Range: ["+this.start.row+"/"+this.start.column+"] -> ["+this.end.row+"/"+this.end.column+"]"},this.contains=function(e,t){return this.compare(e,t)==0},this.compareRange=function(e){var t,n=e.end,r=e.start;return t=this.compare(n.row,n.column),t==1?(t=this.compare(r.row,r.column),t==1?2:t==0?1:0):t==-1?-2:(t=this.compare(r.row,r.column),t==-1?-1:t==1?42:0)},this.comparePoint=function(e){return this.compare(e.row,e.column)},this.containsRange=function(e){return this.comparePoint(e.start)==0&&this.comparePoint(e.end)==0},this.intersects=function(e){var t=this.compareRange(e);return t==-1||t==0||t==1},this.isEnd=function(e,t){return this.end.row==e&&this.end.column==t},this.isStart=function(e,t){return this.start.row==e&&this.start.column==t},this.setStart=function(e,t){typeof e=="object"?(this.start.column=e.column,this.start.row=e.row):(this.start.row=e,this.start.column=t)},this.setEnd=function(e,t){typeof e=="object"?(this.end.column=e.column,this.end.row=e.row):(this.end.row=e,this.end.column=t)},this.inside=function(e,t){return this.compare(e,t)==0?this.isEnd(e,t)||this.isStart(e,t)?!1:!0:!1},this.insideStart=function(e,t){return this.compare(e,t)==0?this.isEnd(e,t)?!1:!0:!1},this.insideEnd=function(e,t){return this.compare(e,t)==0?this.isStart(e,t)?!1:!0:!1},this.compare=function(e,t){return!this.isMultiLine()&&e===this.start.row?tthis.end.column?1:0:ethis.end.row?1:this.start.row===e?t>=this.start.column?0:-1:this.end.row===e?t<=this.end.column?0:1:0},this.compareStart=function(e,t){return this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.compareEnd=function(e,t){return this.end.row==e&&this.end.column==t?1:this.compare(e,t)},this.compareInside=function(e,t){return this.end.row==e&&this.end.column==t?1:this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.clipRows=function(e,t){if(this.end.row>t)var n={row:t+1,column:0};else if(this.end.rowt)var r={row:t+1,column:0};else if(this.start.rowt.row||e.row==t.row&&e.column>t.column},this.getRange=function(){var e=this.anchor,t=this.lead;return this.isEmpty()?o.fromPoints(t,t):this.isBackwards()?o.fromPoints(t,e):o.fromPoints(e,t)},this.clearSelection=function(){this.$isEmpty||(this.$isEmpty=!0,this._emit("changeSelection"))},this.selectAll=function(){var e=this.doc.getLength()-1;this.setSelectionAnchor(0,0),this.moveCursorTo(e,this.doc.getLine(e).length)},this.setRange=this.setSelectionRange=function(e,t){t?(this.setSelectionAnchor(e.end.row,e.end.column),this.selectTo(e.start.row,e.start.column)):(this.setSelectionAnchor(e.start.row,e.start.column),this.selectTo(e.end.row,e.end.column)),this.getRange().isEmpty()&&(this.$isEmpty=!0),this.$desiredColumn=null},this.$moveSelection=function(e){var t=this.lead;this.$isEmpty&&this.setSelectionAnchor(t.row,t.column),e.call(this)},this.selectTo=function(e,t){this.$moveSelection(function(){this.moveCursorTo(e,t)})},this.selectToPosition=function(e){this.$moveSelection(function(){this.moveCursorToPosition(e)})},this.moveTo=function(e,t){this.clearSelection(),this.moveCursorTo(e,t)},this.moveToPosition=function(e){this.clearSelection(),this.moveCursorToPosition(e)},this.selectUp=function(){this.$moveSelection(this.moveCursorUp)},this.selectDown=function(){this.$moveSelection(this.moveCursorDown)},this.selectRight=function(){this.$moveSelection(this.moveCursorRight)},this.selectLeft=function(){this.$moveSelection(this.moveCursorLeft)},this.selectLineStart=function(){this.$moveSelection(this.moveCursorLineStart)},this.selectLineEnd=function(){this.$moveSelection(this.moveCursorLineEnd)},this.selectFileEnd=function(){this.$moveSelection(this.moveCursorFileEnd)},this.selectFileStart=function(){this.$moveSelection(this.moveCursorFileStart)},this.selectWordRight=function(){this.$moveSelection(this.moveCursorWordRight)},this.selectWordLeft=function(){this.$moveSelection(this.moveCursorWordLeft)},this.getWordRange=function(e,t){if(typeof t=="undefined"){var n=e||this.lead;e=n.row,t=n.column}return this.session.getWordRange(e,t)},this.selectWord=function(){this.setSelectionRange(this.getWordRange())},this.selectAWord=function(){var e=this.getCursor(),t=this.session.getAWordRange(e.row,e.column);this.setSelectionRange(t)},this.getLineRange=function(e,t){var n=typeof e=="number"?e:this.lead.row,r,i=this.session.getFoldLine(n);return i?(n=i.start.row,r=i.end.row):r=n,t===!0?new o(n,0,r,this.session.getLine(r).length):new o(n,0,r+1,0)},this.selectLine=function(){this.setSelectionRange(this.getLineRange())},this.moveCursorUp=function(){this.moveCursorBy(-1,0)},this.moveCursorDown=function(){this.moveCursorBy(1,0)},this.moveCursorLeft=function(){var e=this.lead.getPosition(),t;if(t=this.session.getFoldAt(e.row,e.column,-1))this.moveCursorTo(t.start.row,t.start.column);else if(e.column===0)e.row>0&&this.moveCursorTo(e.row-1,this.doc.getLine(e.row-1).length);else{var n=this.session.getTabSize();this.session.isTabStop(e)&&this.doc.getLine(e.row).slice(e.column-n,e.column).split(" ").length-1==n?this.moveCursorBy(0,-n):this.moveCursorBy(0,-1)}},this.moveCursorRight=function(){var e=this.lead.getPosition(),t;if(t=this.session.getFoldAt(e.row,e.column,1))this.moveCursorTo(t.end.row,t.end.column);else if(this.lead.column==this.doc.getLine(this.lead.row).length)this.lead.row0&&(t.column=r)}}this.moveCursorTo(t.row,t.column)},this.moveCursorFileEnd=function(){var e=this.doc.getLength()-1,t=this.doc.getLine(e).length;this.moveCursorTo(e,t)},this.moveCursorFileStart=function(){this.moveCursorTo(0,0)},this.moveCursorLongWordRight=function(){var e=this.lead.row,t=this.lead.column,n=this.doc.getLine(e),r=n.substring(t),i;this.session.nonTokenRe.lastIndex=0,this.session.tokenRe.lastIndex=0;var s=this.session.getFoldAt(e,t,1);if(s){this.moveCursorTo(s.end.row,s.end.column);return}if(i=this.session.nonTokenRe.exec(r))t+=this.session.nonTokenRe.lastIndex,this.session.nonTokenRe.lastIndex=0,r=n.substring(t);if(t>=n.length){this.moveCursorTo(e,n.length),this.moveCursorRight(),e0&&this.moveCursorWordLeft();return}if(o=this.session.tokenRe.exec(s))t-=this.session.tokenRe.lastIndex,this.session.tokenRe.lastIndex=0;this.moveCursorTo(e,t)},this.$shortWordEndIndex=function(e){var t,n=0,r,i=/\s/,s=this.session.tokenRe;s.lastIndex=0;if(t=this.session.tokenRe.exec(e))n=this.session.tokenRe.lastIndex;else{while((r=e[n])&&i.test(r))n++;if(n<1){s.lastIndex=0;while((r=e[n])&&!s.test(r)){s.lastIndex=0,n++;if(i.test(r)){if(n>2){n--;break}while((r=e[n])&&i.test(r))n++;if(n>2)break}}}}return s.lastIndex=0,n},this.moveCursorShortWordRight=function(){var e=this.lead.row,t=this.lead.column,n=this.doc.getLine(e),r=n.substring(t),i=this.session.getFoldAt(e,t,1);if(i)return this.moveCursorTo(i.end.row,i.end.column);if(t==n.length){var s=this.doc.getLength();do e++,r=this.doc.getLine(e);while(e0&&/^\s*$/.test(r));t=r.length,/\s+$/.test(r)||(r="")}var s=i.stringReverse(r),o=this.$shortWordEndIndex(s);return this.moveCursorTo(e,t-o)},this.moveCursorWordRight=function(){this.session.$selectLongWords?this.moveCursorLongWordRight():this.moveCursorShortWordRight()},this.moveCursorWordLeft=function(){this.session.$selectLongWords?this.moveCursorLongWordLeft():this.moveCursorShortWordLeft()},this.moveCursorBy=function(e,t){var n=this.session.documentToScreenPosition(this.lead.row,this.lead.column);t===0&&(this.$desiredColumn?n.column=this.$desiredColumn:this.$desiredColumn=n.column);var r=this.session.screenToDocumentPosition(n.row+e,n.column);e!==0&&t===0&&r.row===this.lead.row&&r.column===this.lead.column&&this.session.lineWidgets&&this.session.lineWidgets[r.row]&&(r.row>0||e>0)&&r.row++,this.moveCursorTo(r.row,r.column+t,t===0)},this.moveCursorToPosition=function(e){this.moveCursorTo(e.row,e.column)},this.moveCursorTo=function(e,t,n){var r=this.session.getFoldAt(e,t,1);r&&(e=r.start.row,t=r.start.column),this.$keepDesiredColumnOnChange=!0,this.lead.setPosition(e,t),this.$keepDesiredColumnOnChange=!1,n||(this.$desiredColumn=null)},this.moveCursorToScreen=function(e,t,n){var r=this.session.screenToDocumentPosition(e,t);this.moveCursorTo(r.row,r.column,n)},this.detach=function(){this.lead.detach(),this.anchor.detach(),this.session=this.doc=null},this.fromOrientedRange=function(e){this.setSelectionRange(e,e.cursor==e.start),this.$desiredColumn=e.desiredColumn||this.$desiredColumn},this.toOrientedRange=function(e){var t=this.getRange();return e?(e.start.column=t.start.column,e.start.row=t.start.row,e.end.column=t.end.column,e.end.row=t.end.row):e=t,e.cursor=this.isBackwards()?e.start:e.end,e.desiredColumn=this.$desiredColumn,e},this.getRangeOfMovements=function(e){var t=this.getCursor();try{e(this);var n=this.getCursor();return o.fromPoints(t,n)}catch(r){return o.fromPoints(t,t)}finally{this.moveCursorToPosition(t)}},this.toJSON=function(){if(this.rangeCount)var e=this.ranges.map(function(e){var t=e.clone();return t.isBackwards=e.cursor==e.start,t});else{var e=this.getRange();e.isBackwards=this.isBackwards()}return e},this.fromJSON=function(e){if(e.start==undefined){if(this.rangeList){this.toSingleRange(e[0]);for(var t=e.length;t--;){var n=o.fromPoints(e[t].start,e[t].end);e[t].isBackwards&&(n.cursor=n.start),this.addRange(n,!0)}return}e=e[0]}this.rangeList&&this.toSingleRange(e),this.setSelectionRange(e,e.isBackwards)},this.isEqual=function(e){if((e.length||this.rangeCount)&&e.length!=this.rangeCount)return!1;if(!e.length||!this.ranges)return this.getRange().isEqual(e);for(var t=this.ranges.length;t--;)if(!this.ranges[t].isEqual(e[t]))return!1;return!0}}).call(u.prototype),t.Selection=u}),ace.define("ace/tokenizer",["require","exports","module","ace/config"],function(e,t,n){"use strict";var r=e("./config"),i=2e3,s=function(e){this.states=e,this.regExps={},this.matchMappings={};for(var t in this.states){var n=this.states[t],r=[],i=0,s=this.matchMappings[t]={defaultToken:"text"},o="g",u=[];for(var a=0;a1?f.onMatch=this.$applyToken:f.onMatch=f.token),c>1&&(/\\\d/.test(f.regex)?l=f.regex.replace(/\\([0-9]+)/g,function(e,t){return"\\"+(parseInt(t,10)+i+1)}):(c=1,l=this.removeCapturingGroups(f.regex)),!f.splitRegex&&typeof f.token!="string"&&u.push(f)),s[i]=a,i+=c,r.push(l),f.onMatch||(f.onMatch=null)}r.length||(s[0]=0,r.push("$")),u.forEach(function(e){e.splitRegex=this.createSplitterRegexp(e.regex,o)},this),this.regExps[t]=new RegExp("("+r.join(")|(")+")|($)",o)}};(function(){this.$setMaxTokenCount=function(e){i=e|0},this.$applyToken=function(e){var t=this.splitRegex.exec(e).slice(1),n=this.token.apply(this,t);if(typeof n=="string")return[{type:n,value:e}];var r=[];for(var i=0,s=n.length;il){var g=e.substring(l,m-v.length);h.type==p?h.value+=g:(h.type&&f.push(h),h={type:p,value:g})}for(var y=0;yi){c>2*e.length&&this.reportError("infinite loop with in ace tokenizer",{startState:t,line:e});while(l1&&n[0]!==r&&n.unshift("#tmp",r),{tokens:f,state:n.length?n:r}},this.reportError=r.reportError}).call(s.prototype),t.Tokenizer=s}),ace.define("ace/mode/text_highlight_rules",["require","exports","module","ace/lib/lang"],function(e,t,n){"use strict";var r=e("../lib/lang"),i=function(){this.$rules={start:[{token:"empty_line",regex:"^$"},{defaultToken:"text"}]}};(function(){this.addRules=function(e,t){if(!t){for(var n in e)this.$rules[n]=e[n];return}for(var n in e){var r=e[n];for(var i=0;i=this.$rowTokens.length){this.$row+=1,e||(e=this.$session.getLength());if(this.$row>=e)return this.$row=e-1,null;this.$rowTokens=this.$session.getTokens(this.$row),this.$tokenIndex=0}return this.$rowTokens[this.$tokenIndex]},this.getCurrentToken=function(){return this.$rowTokens[this.$tokenIndex]},this.getCurrentTokenRow=function(){return this.$row},this.getCurrentTokenColumn=function(){var e=this.$rowTokens,t=this.$tokenIndex,n=e[t].start;if(n!==undefined)return n;n=0;while(t>0)t-=1,n+=e[t].value.length;return n},this.getCurrentTokenPosition=function(){return{row:this.$row,column:this.getCurrentTokenColumn()}}}).call(r.prototype),t.TokenIterator=r}),ace.define("ace/mode/text",["require","exports","module","ace/tokenizer","ace/mode/text_highlight_rules","ace/mode/behaviour","ace/unicode","ace/lib/lang","ace/token_iterator","ace/range"],function(e,t,n){"use strict";var r=e("../tokenizer").Tokenizer,i=e("./text_highlight_rules").TextHighlightRules,s=e("./behaviour").Behaviour,o=e("../unicode"),u=e("../lib/lang"),a=e("../token_iterator").TokenIterator,f=e("../range").Range,l=function(){this.HighlightRules=i,this.$behaviour=new s};(function(){this.tokenRe=new RegExp("^["+o.packages.L+o.packages.Mn+o.packages.Mc+o.packages.Nd+o.packages.Pc+"\\$_]+","g"),this.nonTokenRe=new RegExp("^(?:[^"+o.packages.L+o.packages.Mn+o.packages.Mc+o.packages.Nd+o.packages.Pc+"\\$_]|\\s])+","g"),this.getTokenizer=function(){return this.$tokenizer||(this.$highlightRules=this.$highlightRules||new this.HighlightRules,this.$tokenizer=new r(this.$highlightRules.getRules())),this.$tokenizer},this.lineCommentStart="",this.blockComment="",this.toggleCommentLines=function(e,t,n,r){function w(e){for(var t=n;t<=r;t++)e(i.getLine(t),t)}var i=t.doc,s=!0,o=!0,a=Infinity,f=t.getTabSize(),l=!1;if(!this.lineCommentStart){if(!this.blockComment)return!1;var c=this.blockComment.start,h=this.blockComment.end,p=new RegExp("^(\\s*)(?:"+u.escapeRegExp(c)+")"),d=new RegExp("(?:"+u.escapeRegExp(h)+")\\s*$"),v=function(e,t){if(g(e,t))return;if(!s||/\S/.test(e))i.insertInLine({row:t,column:e.length},h),i.insertInLine({row:t,column:a},c)},m=function(e,t){var n;(n=e.match(d))&&i.removeInLine(t,e.length-n[0].length,e.length),(n=e.match(p))&&i.removeInLine(t,n[1].length,n[0].length)},g=function(e,n){if(p.test(e))return!0;var r=t.getTokens(n);for(var i=0;i2?r%f!=f-1:r%f==0}}var E=Infinity;w(function(e,t){var n=e.search(/\S/);n!==-1?(ne.length&&(E=e.length)}),a==Infinity&&(a=E,s=!1,o=!1),l&&a%f!=0&&(a=Math.floor(a/f)*f),w(o?m:v)},this.toggleBlockComment=function(e,t,n,r){var i=this.blockComment;if(!i)return;!i.start&&i[0]&&(i=i[0]);var s=new a(t,r.row,r.column),o=s.getCurrentToken(),u=t.selection,l=t.selection.toOrientedRange(),c,h;if(o&&/comment/.test(o.type)){var p,d;while(o&&/comment/.test(o.type)){var v=o.value.indexOf(i.start);if(v!=-1){var m=s.getCurrentTokenRow(),g=s.getCurrentTokenColumn()+v;p=new f(m,g,m,g+i.start.length);break}o=s.stepBackward()}var s=new a(t,r.row,r.column),o=s.getCurrentToken();while(o&&/comment/.test(o.type)){var v=o.value.indexOf(i.end);if(v!=-1){var m=s.getCurrentTokenRow(),g=s.getCurrentTokenColumn()+v;d=new f(m,g,m,g+i.end.length);break}o=s.stepForward()}d&&t.remove(d),p&&(t.remove(p),c=p.start.row,h=-i.start.length)}else h=i.start.length,c=n.start.row,t.insert(n.end,i.end),t.insert(n.start,i.start);l.start.row==c&&(l.start.column+=h),l.end.row==c&&(l.end.column+=h),t.selection.fromOrientedRange(l)},this.getNextLineIndent=function(e,t,n){return this.$getIndent(t)},this.checkOutdent=function(e,t,n){return!1},this.autoOutdent=function(e,t,n){},this.$getIndent=function(e){return e.match(/^\s*/)[0]},this.createWorker=function(e){return null},this.createModeDelegates=function(e){this.$embeds=[],this.$modes={};for(var t in e)e[t]&&(this.$embeds.push(t),this.$modes[t]=new e[t]);var n=["toggleBlockComment","toggleCommentLines","getNextLineIndent","checkOutdent","autoOutdent","transformAction","getCompletions"];for(var t=0;t=0&&t.row=0&&t.column<=e[t.row].length}function s(e,t){t.action!="insert"&&t.action!="remove"&&r(t,"delta.action must be 'insert' or 'remove'"),t.lines instanceof Array||r(t,"delta.lines must be an Array"),(!t.start||!t.end)&&r(t,"delta.start/end must be an present");var n=t.start;i(e,t.start)||r(t,"delta.start must be contained in document");var s=t.end;t.action=="remove"&&!i(e,s)&&r(t,"delta.end must contained in document for 'remove' actions");var o=s.row-n.row,u=s.column-(o==0?n.column:0);(o!=t.lines.length-1||t.lines[o].length!=u)&&r(t,"delta.range must match delta lines")}t.applyDelta=function(e,t,n){var r=t.start.row,i=t.start.column,s=e[r]||"";switch(t.action){case"insert":var o=t.lines;if(o.length===1)e[r]=s.substring(0,i)+t.lines[0]+s.substring(i);else{var u=[r,1].concat(t.lines);e.splice.apply(e,u),e[r]=s.substring(0,i)+e[r],e[r+t.lines.length-1]+=s.substring(i)}break;case"remove":var a=t.end.column,f=t.end.row;r===f?e[r]=s.substring(0,i)+s.substring(a):e.splice(r,f-r+1,s.substring(0,i)+e[f].substring(a))}}}),ace.define("ace/anchor",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./lib/event_emitter").EventEmitter,s=t.Anchor=function(e,t,n){this.$onChange=this.onChange.bind(this),this.attach(e),typeof n=="undefined"?this.setPosition(t.row,t.column):this.setPosition(t,n)};(function(){function e(e,t,n){var r=n?e.column<=t.column:e.columnthis.row)return;var n=t(e,{row:this.row,column:this.column},this.$insertRight);this.setPosition(n.row,n.column,!0)},this.setPosition=function(e,t,n){var r;n?r={row:e,column:t}:r=this.$clipPositionToDocument(e,t);if(this.row==r.row&&this.column==r.column)return;var i={row:this.row,column:this.column};this.row=r.row,this.column=r.column,this._signal("change",{old:i,value:r})},this.detach=function(){this.document.removeEventListener("change",this.$onChange)},this.attach=function(e){this.document=e||this.document,this.document.on("change",this.$onChange)},this.$clipPositionToDocument=function(e,t){var n={};return e>=this.document.getLength()?(n.row=Math.max(0,this.document.getLength()-1),n.column=this.document.getLine(n.row).length):e<0?(n.row=0,n.column=0):(n.row=e,n.column=Math.min(this.document.getLine(n.row).length,Math.max(0,t))),t<0&&(n.column=0),n}}).call(s.prototype)}),ace.define("ace/document",["require","exports","module","ace/lib/oop","ace/apply_delta","ace/lib/event_emitter","ace/range","ace/anchor"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./apply_delta").applyDelta,s=e("./lib/event_emitter").EventEmitter,o=e("./range").Range,u=e("./anchor").Anchor,a=function(e){this.$lines=[""],e.length===0?this.$lines=[""]:Array.isArray(e)?this.insertMergedLines({row:0,column:0},e):this.insert({row:0,column:0},e)};(function(){r.implement(this,s),this.setValue=function(e){var t=this.getLength()-1;this.remove(new o(0,0,t,this.getLine(t).length)),this.insert({row:0,column:0},e)},this.getValue=function(){return this.getAllLines().join(this.getNewLineCharacter())},this.createAnchor=function(e,t){return new u(this,e,t)},"aaa".split(/a/).length===0?this.$split=function(e){return e.replace(/\r\n|\r/g,"\n").split("\n")}:this.$split=function(e){return e.split(/\r\n|\r|\n/)},this.$detectNewLine=function(e){var t=e.match(/^.*?(\r\n|\r|\n)/m);this.$autoNewLine=t?t[1]:"\n",this._signal("changeNewLineMode")},this.getNewLineCharacter=function(){switch(this.$newLineMode){case"windows":return"\r\n";case"unix":return"\n";default:return this.$autoNewLine||"\n"}},this.$autoNewLine="",this.$newLineMode="auto",this.setNewLineMode=function(e){if(this.$newLineMode===e)return;this.$newLineMode=e,this._signal("changeNewLineMode")},this.getNewLineMode=function(){return this.$newLineMode},this.isNewLine=function(e){return e=="\r\n"||e=="\r"||e=="\n"},this.getLine=function(e){return this.$lines[e]||""},this.getLines=function(e,t){return this.$lines.slice(e,t+1)},this.getAllLines=function(){return this.getLines(0,this.getLength())},this.getLength=function(){return this.$lines.length},this.getTextRange=function(e){return this.getLinesForRange(e).join(this.getNewLineCharacter())},this.getLinesForRange=function(e){var t;if(e.start.row===e.end.row)t=[this.getLine(e.start.row).substring(e.start.column,e.end.column)];else{t=this.getLines(e.start.row,e.end.row),t[0]=(t[0]||"").substring(e.start.column);var n=t.length-1;e.end.row-e.start.row==n&&(t[n]=t[n].substring(0,e.end.column))}return t},this.insertLines=function(e,t){return console.warn("Use of document.insertLines is deprecated. Use the insertFullLines method instead."),this.insertFullLines(e,t)},this.removeLines=function(e,t){return console.warn("Use of document.removeLines is deprecated. Use the removeFullLines method instead."),this.removeFullLines(e,t)},this.insertNewLine=function(e){return console.warn("Use of document.insertNewLine is deprecated. Use insertMergedLines(position, ['', '']) instead."),this.insertMergedLines(e,["",""])},this.insert=function(e,t){return this.getLength()<=1&&this.$detectNewLine(t),this.insertMergedLines(e,this.$split(t))},this.insertInLine=function(e,t){var n=this.clippedPos(e.row,e.column),r=this.pos(e.row,e.column+t.length);return this.applyDelta({start:n,end:r,action:"insert",lines:[t]},!0),this.clonePos(r)},this.clippedPos=function(e,t){var n=this.getLength();e===undefined?e=n:e<0?e=0:e>=n&&(e=n-1,t=undefined);var r=this.getLine(e);return t==undefined&&(t=r.length),t=Math.min(Math.max(t,0),r.length),{row:e,column:t}},this.clonePos=function(e){return{row:e.row,column:e.column}},this.pos=function(e,t){return{row:e,column:t}},this.$clipPosition=function(e){var t=this.getLength();return e.row>=t?(e.row=Math.max(0,t-1),e.column=this.getLine(t-1).length):(e.row=Math.max(0,e.row),e.column=Math.min(Math.max(e.column,0),this.getLine(e.row).length)),e},this.insertFullLines=function(e,t){e=Math.min(Math.max(e,0),this.getLength());var n=0;e0,r=t=0&&this.applyDelta({start:this.pos(e,this.getLine(e).length),end:this.pos(e+1,0),action:"remove",lines:["",""]})},this.replace=function(e,t){e instanceof o||(e=o.fromPoints(e.start,e.end));if(t.length===0&&e.isEmpty())return e.start;if(t==this.getTextRange(e))return e.end;this.remove(e);var n;return t?n=this.insert(e.start,t):n=e.start,n},this.applyDeltas=function(e){for(var t=0;t=0;t--)this.revertDelta(e[t])},this.applyDelta=function(e,t){var n=e.action=="insert";if(n?e.lines.length<=1&&!e.lines[0]:!o.comparePoints(e.start,e.end))return;n&&e.lines.length>2e4&&this.$splitAndapplyLargeDelta(e,2e4),i(this.$lines,e,t),this._signal("change",e)},this.$splitAndapplyLargeDelta=function(e,t){var n=e.lines,r=n.length,i=e.start.row,s=e.start.column,o=0,u=0;do{o=u,u+=t-1;var a=n.slice(o,u);if(u>r){e.lines=a,e.start.row=i+o,e.start.column=s;break}a.push(""),this.applyDelta({start:this.pos(i+o,s),end:this.pos(i+u,s=0),action:e.action,lines:a},!0)}while(!0)},this.revertDelta=function(e){this.applyDelta({start:this.clonePos(e.start),end:this.clonePos(e.end),action:e.action=="insert"?"remove":"insert",lines:e.lines.slice()})},this.indexToPosition=function(e,t){var n=this.$lines||this.getAllLines(),r=this.getNewLineCharacter().length;for(var i=t||0,s=n.length;i20){n.running=setTimeout(n.$worker,20);break}}n.currentLine=t,s<=r&&n.fireUpdateEvent(s,r)}};(function(){r.implement(this,i),this.setTokenizer=function(e){this.tokenizer=e,this.lines=[],this.states=[],this.start(0)},this.setDocument=function(e){this.doc=e,this.lines=[],this.states=[],this.stop()},this.fireUpdateEvent=function(e,t){var n={first:e,last:t};this._signal("update",{data:n})},this.start=function(e){this.currentLine=Math.min(e||0,this.currentLine,this.doc.getLength()),this.lines.splice(this.currentLine,this.lines.length),this.states.splice(this.currentLine,this.states.length),this.stop(),this.running=setTimeout(this.$worker,700)},this.scheduleStart=function(){this.running||(this.running=setTimeout(this.$worker,700))},this.$updateOnChange=function(e){var t=e.start.row,n=e.end.row-t;if(n===0)this.lines[t]=null;else if(e.action=="remove")this.lines.splice(t,n+1,null),this.states.splice(t,n+1,null);else{var r=Array(n+1);r.unshift(t,1),this.lines.splice.apply(this.lines,r),this.states.splice.apply(this.states,r)}this.currentLine=Math.min(t,this.currentLine,this.doc.getLength()),this.stop()},this.stop=function(){this.running&&clearTimeout(this.running),this.running=!1},this.getTokens=function(e){return this.lines[e]||this.$tokenizeRow(e)},this.getState=function(e){return this.currentLine==e&&this.$tokenizeRow(e),this.states[e]||"start"},this.$tokenizeRow=function(e){var t=this.doc.getLine(e),n=this.states[e-1],r=this.tokenizer.getLineTokens(t,n,e);return this.states[e]+""!=r.state+""?(this.states[e]=r.state,this.lines[e+1]=null,this.currentLine>e+1&&(this.currentLine=e+1)):this.currentLine==e&&(this.currentLine=e+1),this.lines[e]=r.tokens}}).call(s.prototype),t.BackgroundTokenizer=s}),ace.define("ace/search_highlight",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/range"],function(e,t,n){"use strict";var r=e("./lib/lang"),i=e("./lib/oop"),s=e("./range").Range,o=function(e,t,n){this.setRegexp(e),this.clazz=t,this.type=n||"text"};(function(){this.MAX_RANGES=500,this.setRegexp=function(e){if(this.regExp+""==e+"")return;this.regExp=e,this.cache=[]},this.update=function(e,t,n,i){if(!this.regExp)return;var o=i.firstRow,u=i.lastRow;for(var a=o;a<=u;a++){var f=this.cache[a];f==null&&(f=r.getMatchOffsets(n.getLine(a),this.regExp),f.length>this.MAX_RANGES&&(f=f.slice(0,this.MAX_RANGES)),f=f.map(function(e){return new s(a,e.offset,a,e.offset+e.length)}),this.cache[a]=f.length?f:"");for(var l=f.length;l--;)t.drawSingleLineMarker(e,f[l].toScreenRange(n),this.clazz,i)}}}).call(o.prototype),t.SearchHighlight=o}),ace.define("ace/edit_session/fold_line",["require","exports","module","ace/range"],function(e,t,n){"use strict";function i(e,t){this.foldData=e,Array.isArray(t)?this.folds=t:t=this.folds=[t];var n=t[t.length-1];this.range=new r(t[0].start.row,t[0].start.column,n.end.row,n.end.column),this.start=this.range.start,this.end=this.range.end,this.folds.forEach(function(e){e.setFoldLine(this)},this)}var r=e("../range").Range;(function(){this.shiftRow=function(e){this.start.row+=e,this.end.row+=e,this.folds.forEach(function(t){t.start.row+=e,t.end.row+=e})},this.addFold=function(e){if(e.sameRow){if(e.start.rowthis.endRow)throw new Error("Can't add a fold to this FoldLine as it has no connection");this.folds.push(e),this.folds.sort(function(e,t){return-e.range.compareEnd(t.start.row,t.start.column)}),this.range.compareEnd(e.start.row,e.start.column)>0?(this.end.row=e.end.row,this.end.column=e.end.column):this.range.compareStart(e.end.row,e.end.column)<0&&(this.start.row=e.start.row,this.start.column=e.start.column)}else if(e.start.row==this.end.row)this.folds.push(e),this.end.row=e.end.row,this.end.column=e.end.column;else{if(e.end.row!=this.start.row)throw new Error("Trying to add fold to FoldRow that doesn't have a matching row");this.folds.unshift(e),this.start.row=e.start.row,this.start.column=e.start.column}e.foldLine=this},this.containsRow=function(e){return e>=this.start.row&&e<=this.end.row},this.walk=function(e,t,n){var r=0,i=this.folds,s,o,u,a=!0;t==null&&(t=this.end.row,n=this.end.column);for(var f=0;f0)continue;var a=i(e,o.start);return u===0?t&&a!==0?-s-2:s:a>0||a===0&&!t?s:-s-1}return-s-1},this.add=function(e){var t=!e.isEmpty(),n=this.pointIndex(e.start,t);n<0&&(n=-n-1);var r=this.pointIndex(e.end,t,n);return r<0?r=-r-1:r++,this.ranges.splice(n,r-n,e)},this.addList=function(e){var t=[];for(var n=e.length;n--;)t.push.apply(t,this.add(e[n]));return t},this.substractPoint=function(e){var t=this.pointIndex(e);if(t>=0)return this.ranges.splice(t,1)},this.merge=function(){var e=[],t=this.ranges;t=t.sort(function(e,t){return i(e.start,t.start)});var n=t[0],r;for(var s=1;s=0},this.containsPoint=function(e){return this.pointIndex(e)>=0},this.rangeAtPoint=function(e){var t=this.pointIndex(e);if(t>=0)return this.ranges[t]},this.clipRows=function(e,t){var n=this.ranges;if(n[0].start.row>t||n[n.length-1].start.rowr)break;l.start.row==r&&l.start.column>=t.column&&(l.start.column!=t.column||!this.$insertRight)&&(l.start.column+=o,l.start.row+=s);if(l.end.row==r&&l.end.column>=t.column){if(l.end.column==t.column&&this.$insertRight)continue;l.end.column==t.column&&o>0&&al.start.column&&l.end.column==u[a+1].start.column&&(l.end.column-=o),l.end.column+=o,l.end.row+=s}}if(s!=0&&a=e)return i;if(i.end.row>e)return null}return null},this.getNextFoldLine=function(e,t){var n=this.$foldData,r=0;t&&(r=n.indexOf(t)),r==-1&&(r=0);for(r;r=e)return i}return null},this.getFoldedRowCount=function(e,t){var n=this.$foldData,r=t-e+1;for(var i=0;i=t){u=e?r-=t-u:r=0);break}o>=e&&(u>=e?r-=o-u:r-=o-e+1)}return r},this.$addFoldLine=function(e){return this.$foldData.push(e),this.$foldData.sort(function(e,t){return e.start.row-t.start.row}),e},this.addFold=function(e,t){var n=this.$foldData,r=!1,o;e instanceof s?o=e:(o=new s(t,e),o.collapseChildren=t.collapseChildren),this.$clipRangeToDocument(o.range);var u=o.start.row,a=o.start.column,f=o.end.row,l=o.end.column;if(u0&&(this.removeFolds(p),p.forEach(function(e){o.addSubFold(e)}));for(var d=0;d0&&this.foldAll(e.start.row+1,e.end.row,e.collapseChildren-1),e.subFolds=[]},this.expandFolds=function(e){e.forEach(function(e){this.expandFold(e)},this)},this.unfold=function(e,t){var n,i;e==null?(n=new r(0,0,this.getLength(),0),t=!0):typeof e=="number"?n=new r(e,0,e,this.getLine(e).length):"row"in e?n=r.fromPoints(e,e):n=e,i=this.getFoldsInRangeList(n);if(t)this.removeFolds(i);else{var s=i;while(s.length)this.expandFolds(s),s=this.getFoldsInRangeList(n)}if(i.length)return i},this.isRowFolded=function(e,t){return!!this.getFoldLine(e,t)},this.getRowFoldEnd=function(e,t){var n=this.getFoldLine(e,t);return n?n.end.row:e},this.getRowFoldStart=function(e,t){var n=this.getFoldLine(e,t);return n?n.start.row:e},this.getFoldDisplayLine=function(e,t,n,r,i){r==null&&(r=e.start.row),i==null&&(i=0),t==null&&(t=e.end.row),n==null&&(n=this.getLine(t).length);var s=this.doc,o="";return e.walk(function(e,t,n,u){if(t=e){i=s.end.row;try{var o=this.addFold("...",s);o&&(o.collapseChildren=n)}catch(u){}}}},this.$foldStyles={manual:1,markbegin:1,markbeginend:1},this.$foldStyle="markbegin",this.setFoldStyle=function(e){if(!this.$foldStyles[e])throw new Error("invalid fold style: "+e+"["+Object.keys(this.$foldStyles).join(", ")+"]");if(this.$foldStyle==e)return;this.$foldStyle=e,e=="manual"&&this.unfold();var t=this.$foldMode;this.$setFolding(null),this.$setFolding(t)},this.$setFolding=function(e){if(this.$foldMode==e)return;this.$foldMode=e,this.off("change",this.$updateFoldWidgets),this.off("tokenizerUpdate",this.$tokenizerUpdateFoldWidgets),this._signal("changeAnnotation");if(!e||this.$foldStyle=="manual"){this.foldWidgets=null;return}this.foldWidgets=[],this.getFoldWidget=e.getFoldWidget.bind(e,this,this.$foldStyle),this.getFoldWidgetRange=e.getFoldWidgetRange.bind(e,this,this.$foldStyle),this.$updateFoldWidgets=this.updateFoldWidgets.bind(this),this.$tokenizerUpdateFoldWidgets=this.tokenizerUpdateFoldWidgets.bind(this),this.on("change",this.$updateFoldWidgets),this.on("tokenizerUpdate",this.$tokenizerUpdateFoldWidgets)},this.getParentFoldRangeData=function(e,t){var n=this.foldWidgets;if(!n||t&&n[e])return{};var r=e-1,i;while(r>=0){var s=n[r];s==null&&(s=n[r]=this.getFoldWidget(r));if(s=="start"){var o=this.getFoldWidgetRange(r);i||(i=o);if(o&&o.end.row>=e)break}r--}return{range:r!==-1&&o,firstRange:i}},this.onFoldWidgetClick=function(e,t){t=t.domEvent;var n={children:t.shiftKey,all:t.ctrlKey||t.metaKey,siblings:t.altKey},r=this.$toggleFoldWidget(e,n);if(!r){var i=t.target||t.srcElement;i&&/ace_fold-widget/.test(i.className)&&(i.className+=" ace_invalid")}},this.$toggleFoldWidget=function(e,t){if(!this.getFoldWidget)return;var n=this.getFoldWidget(e),r=this.getLine(e),i=n==="end"?-1:1,s=this.getFoldAt(e,i===-1?0:r.length,i);if(s){t.children||t.all?this.removeFold(s):this.expandFold(s);return}var o=this.getFoldWidgetRange(e,!0);if(o&&!o.isMultiLine()){s=this.getFoldAt(o.start.row,o.start.column,1);if(s&&o.isEqual(s.range)){this.removeFold(s);return}}if(t.siblings){var u=this.getParentFoldRangeData(e);if(u.range)var a=u.range.start.row+1,f=u.range.end.row;this.foldAll(a,f,t.all?1e4:0)}else t.children?(f=o?o.end.row:this.getLength(),this.foldAll(e+1,f,t.all?1e4:0)):o&&(t.all&&(o.collapseChildren=1e4),this.addFold("...",o));return o},this.toggleFoldWidget=function(e){var t=this.selection.getCursor().row;t=this.getRowFoldStart(t);var n=this.$toggleFoldWidget(t,{});if(n)return;var r=this.getParentFoldRangeData(t,!0);n=r.range||r.firstRange;if(n){t=n.start.row;var i=this.getFoldAt(t,this.getLine(t).length,1);i?this.removeFold(i):this.addFold("...",n)}},this.updateFoldWidgets=function(e){var t=e.start.row,n=e.end.row-t;if(n===0)this.foldWidgets[t]=null;else if(e.action=="remove")this.foldWidgets.splice(t,n+1,null);else{var r=Array(n+1);r.unshift(t,1),this.foldWidgets.splice.apply(this.foldWidgets,r)}},this.tokenizerUpdateFoldWidgets=function(e){var t=e.data;t.first!=t.last&&this.foldWidgets.length>t.first&&this.foldWidgets.splice(t.first,this.foldWidgets.length)}}var r=e("../range").Range,i=e("./fold_line").FoldLine,s=e("./fold").Fold,o=e("../token_iterator").TokenIterator;t.Folding=u}),ace.define("ace/edit_session/bracket_match",["require","exports","module","ace/token_iterator","ace/range"],function(e,t,n){"use strict";function s(){this.findMatchingBracket=function(e,t){if(e.column==0)return null;var n=t||this.getLine(e.row).charAt(e.column-1);if(n=="")return null;var r=n.match(/([\(\[\{])|([\)\]\}])/);return r?r[1]?this.$findClosingBracket(r[1],e):this.$findOpeningBracket(r[2],e):null},this.getBracketRange=function(e){var t=this.getLine(e.row),n=!0,r,s=t.charAt(e.column-1),o=s&&s.match(/([\(\[\{])|([\)\]\}])/);o||(s=t.charAt(e.column),e={row:e.row,column:e.column+1},o=s&&s.match(/([\(\[\{])|([\)\]\}])/),n=!1);if(!o)return null;if(o[1]){var u=this.$findClosingBracket(o[1],e);if(!u)return null;r=i.fromPoints(e,u),n||(r.end.column++,r.start.column--),r.cursor=r.end}else{var u=this.$findOpeningBracket(o[2],e);if(!u)return null;r=i.fromPoints(u,e),n||(r.start.column++,r.end.column--),r.cursor=r.start}return r},this.$brackets={")":"(","(":")","]":"[","[":"]","{":"}","}":"{"},this.$findOpeningBracket=function(e,t,n){var i=this.$brackets[e],s=1,o=new r(this,t.row,t.column),u=o.getCurrentToken();u||(u=o.stepForward());if(!u)return;n||(n=new RegExp("(\\.?"+u.type.replace(".","\\.").replace("rparen",".paren").replace(/\b(?:end)\b/,"(?:start|begin|end)")+")+"));var a=t.column-o.getCurrentTokenColumn()-2,f=u.value;for(;;){while(a>=0){var l=f.charAt(a);if(l==i){s-=1;if(s==0)return{row:o.getCurrentTokenRow(),column:a+o.getCurrentTokenColumn()}}else l==e&&(s+=1);a-=1}do u=o.stepBackward();while(u&&!n.test(u.type));if(u==null)break;f=u.value,a=f.length-1}return null},this.$findClosingBracket=function(e,t,n){var i=this.$brackets[e],s=1,o=new r(this,t.row,t.column),u=o.getCurrentToken();u||(u=o.stepForward());if(!u)return;n||(n=new RegExp("(\\.?"+u.type.replace(".","\\.").replace("lparen",".paren").replace(/\b(?:start|begin)\b/,"(?:start|begin|end)")+")+"));var a=t.column-o.getCurrentTokenColumn();for(;;){var f=u.value,l=f.length;while(a=4352&&e<=4447||e>=4515&&e<=4519||e>=4602&&e<=4607||e>=9001&&e<=9002||e>=11904&&e<=11929||e>=11931&&e<=12019||e>=12032&&e<=12245||e>=12272&&e<=12283||e>=12288&&e<=12350||e>=12353&&e<=12438||e>=12441&&e<=12543||e>=12549&&e<=12589||e>=12593&&e<=12686||e>=12688&&e<=12730||e>=12736&&e<=12771||e>=12784&&e<=12830||e>=12832&&e<=12871||e>=12880&&e<=13054||e>=13056&&e<=19903||e>=19968&&e<=42124||e>=42128&&e<=42182||e>=43360&&e<=43388||e>=44032&&e<=55203||e>=55216&&e<=55238||e>=55243&&e<=55291||e>=63744&&e<=64255||e>=65040&&e<=65049||e>=65072&&e<=65106||e>=65108&&e<=65126||e>=65128&&e<=65131||e>=65281&&e<=65376||e>=65504&&e<=65510}r.implement(this,o),this.setDocument=function(e){this.doc&&this.doc.removeListener("change",this.$onChange),this.doc=e,e.on("change",this.$onChange),this.bgTokenizer&&this.bgTokenizer.setDocument(this.getDocument()),this.resetCaches()},this.getDocument=function(){return this.doc},this.$resetRowCache=function(e){if(!e){this.$docRowCache=[],this.$screenRowCache=[];return}var t=this.$docRowCache.length,n=this.$getRowCacheIndex(this.$docRowCache,e)+1;t>n&&(this.$docRowCache.splice(n,t),this.$screenRowCache.splice(n,t))},this.$getRowCacheIndex=function(e,t){var n=0,r=e.length-1;while(n<=r){var i=n+r>>1,s=e[i];if(t>s)n=i+1;else{if(!(t=t)break}return r=n[s],r?(r.index=s,r.start=i-r.value.length,r):null},this.setUndoManager=function(e){this.$undoManager=e,this.$deltas=[],this.$deltasDoc=[],this.$deltasFold=[],this.$informUndoManager&&this.$informUndoManager.cancel();if(e){var t=this;this.$syncInformUndoManager=function(){t.$informUndoManager.cancel(),t.$deltasFold.length&&(t.$deltas.push({group:"fold",deltas:t.$deltasFold}),t.$deltasFold=[]),t.$deltasDoc.length&&(t.$deltas.push({group:"doc",deltas:t.$deltasDoc}),t.$deltasDoc=[]),t.$deltas.length>0&&e.execute({action:"aceupdate",args:[t.$deltas,t],merge:t.mergeUndoDeltas}),t.mergeUndoDeltas=!1,t.$deltas=[]},this.$informUndoManager=i.delayedCall(this.$syncInformUndoManager)}},this.markUndoGroup=function(){this.$syncInformUndoManager&&this.$syncInformUndoManager()},this.$defaultUndoManager={undo:function(){},redo:function(){},reset:function(){}},this.getUndoManager=function(){return this.$undoManager||this.$defaultUndoManager},this.getTabString=function(){return this.getUseSoftTabs()?i.stringRepeat(" ",this.getTabSize()):" "},this.setUseSoftTabs=function(e){this.setOption("useSoftTabs",e)},this.getUseSoftTabs=function(){return this.$useSoftTabs&&!this.$mode.$indentWithTabs},this.setTabSize=function(e){this.setOption("tabSize",e)},this.getTabSize=function(){return this.$tabSize},this.isTabStop=function(e){return this.$useSoftTabs&&e.column%this.$tabSize===0},this.$overwrite=!1,this.setOverwrite=function(e){this.setOption("overwrite",e)},this.getOverwrite=function(){return this.$overwrite},this.toggleOverwrite=function(){this.setOverwrite(!this.$overwrite)},this.addGutterDecoration=function(e,t){this.$decorations[e]||(this.$decorations[e]=""),this.$decorations[e]+=" "+t,this._signal("changeBreakpoint",{})},this.removeGutterDecoration=function(e,t){this.$decorations[e]=(this.$decorations[e]||"").replace(" "+t,""),this._signal("changeBreakpoint",{})},this.getBreakpoints=function(){return this.$breakpoints},this.setBreakpoints=function(e){this.$breakpoints=[];for(var t=0;t0&&(r=!!n.charAt(t-1).match(this.tokenRe)),r||(r=!!n.charAt(t).match(this.tokenRe));if(r)var i=this.tokenRe;else if(/^\s+$/.test(n.slice(t-1,t+1)))var i=/\s/;else var i=this.nonTokenRe;var s=t;if(s>0){do s--;while(s>=0&&n.charAt(s).match(i));s++}var o=t;while(oe&&(e=t.screenWidth)}),this.lineWidgetWidth=e},this.$computeWidth=function(e){if(this.$modified||e){this.$modified=!1;if(this.$useWrapMode)return this.screenWidth=this.$wrapLimit;var t=this.doc.getAllLines(),n=this.$rowLengthCache,r=0,i=0,s=this.$foldData[i],o=s?s.start.row:Infinity,u=t.length;for(var a=0;ao){a=s.end.row+1;if(a>=u)break;s=this.$foldData[i++],o=s?s.start.row:Infinity}n[a]==null&&(n[a]=this.$getStringScreenWidth(t[a])[0]),n[a]>r&&(r=n[a])}this.screenWidth=r}},this.getLine=function(e){return this.doc.getLine(e)},this.getLines=function(e,t){return this.doc.getLines(e,t)},this.getLength=function(){return this.doc.getLength()},this.getTextRange=function(e){return this.doc.getTextRange(e||this.selection.getRange())},this.insert=function(e,t){return this.doc.insert(e,t)},this.remove=function(e){return this.doc.remove(e)},this.removeFullLines=function(e,t){return this.doc.removeFullLines(e,t)},this.undoChanges=function(e,t){if(!e.length)return;this.$fromUndo=!0;var n=null;for(var r=e.length-1;r!=-1;r--){var i=e[r];i.group=="doc"?(this.doc.revertDeltas(i.deltas),n=this.$getUndoSelection(i.deltas,!0,n)):i.deltas.forEach(function(e){this.addFolds(e.folds)},this)}return this.$fromUndo=!1,n&&this.$undoSelect&&!t&&this.selection.setSelectionRange(n),n},this.redoChanges=function(e,t){if(!e.length)return;this.$fromUndo=!0;var n=null;for(var r=0;re.end.column&&(s.start.column+=u),s.end.row==e.end.row&&s.end.column>e.end.column&&(s.end.column+=u)),o&&s.start.row>=e.end.row&&(s.start.row+=o,s.end.row+=o)}s.end=this.insert(s.start,r);if(i.length){var a=e.start,l=s.start,o=l.row-a.row,u=l.column-a.column;this.addFolds(i.map(function(e){return e=e.clone(),e.start.row==a.row&&(e.start.column+=u),e.end.row==a.row&&(e.end.column+=u),e.start.row+=o,e.end.row+=o,e}))}return s},this.indentRows=function(e,t,n){n=n.replace(/\t/g,this.getTabString());for(var r=e;r<=t;r++)this.doc.insertInLine({row:r,column:0},n)},this.outdentRows=function(e){var t=e.collapseRows(),n=new f(0,0,0,0),r=this.getTabSize();for(var i=t.start.row;i<=t.end.row;++i){var s=this.getLine(i);n.start.row=i,n.end.row=i;for(var o=0;o0){var r=this.getRowFoldEnd(t+n);if(r>this.doc.getLength()-1)return 0;var i=r-t}else{e=this.$clipRowToDocument(e),t=this.$clipRowToDocument(t);var i=t-e+1}var s=new f(e,0,t,Number.MAX_VALUE),o=this.getFoldsInRange(s).map(function(e){return e=e.clone(),e.start.row+=i,e.end.row+=i,e}),u=n==0?this.doc.getLines(e,t):this.doc.removeFullLines(e,t);return this.doc.insertFullLines(e+i,u),o.length&&this.addFolds(o),i},this.moveLinesUp=function(e,t){return this.$moveLines(e,t,-1)},this.moveLinesDown=function(e,t){return this.$moveLines(e,t,1)},this.duplicateLines=function(e,t){return this.$moveLines(e,t,0)},this.$clipRowToDocument=function(e){return Math.max(0,Math.min(e,this.doc.getLength()-1))},this.$clipColumnToRow=function(e,t){return t<0?0:Math.min(this.doc.getLine(e).length,t)},this.$clipPositionToDocument=function(e,t){t=Math.max(0,t);if(e<0)e=0,t=0;else{var n=this.doc.getLength();e>=n?(e=n-1,t=this.doc.getLine(n-1).length):t=Math.min(this.doc.getLine(e).length,t)}return{row:e,column:t}},this.$clipRangeToDocument=function(e){e.start.row<0?(e.start.row=0,e.start.column=0):e.start.column=this.$clipColumnToRow(e.start.row,e.start.column);var t=this.doc.getLength()-1;return e.end.row>t?(e.end.row=t,e.end.column=this.doc.getLine(t).length):e.end.column=this.$clipColumnToRow(e.end.row,e.end.column),e},this.$wrapLimit=80,this.$useWrapMode=!1,this.$wrapLimitRange={min:null,max:null},this.setUseWrapMode=function(e){if(e!=this.$useWrapMode){this.$useWrapMode=e,this.$modified=!0,this.$resetRowCache(0);if(e){var t=this.getLength();this.$wrapData=Array(t),this.$updateWrapData(0,t-1)}this._signal("changeWrapMode")}},this.getUseWrapMode=function(){return this.$useWrapMode},this.setWrapLimitRange=function(e,t){if(this.$wrapLimitRange.min!==e||this.$wrapLimitRange.max!==t)this.$wrapLimitRange={min:e,max:t},this.$modified=!0,this.$useWrapMode&&this._signal("changeWrapMode")},this.adjustWrapLimit=function(e,t){var n=this.$wrapLimitRange;n.max<0&&(n={min:t,max:t});var r=this.$constrainWrapLimit(e,n.min,n.max);return r!=this.$wrapLimit&&r>1?(this.$wrapLimit=r,this.$modified=!0,this.$useWrapMode&&(this.$updateWrapData(0,this.getLength()-1),this.$resetRowCache(0),this._signal("changeWrapLimit")),!0):!1},this.$constrainWrapLimit=function(e,t,n){return t&&(e=Math.max(t,e)),n&&(e=Math.min(n,e)),e},this.getWrapLimit=function(){return this.$wrapLimit},this.setWrapLimit=function(e){this.setWrapLimitRange(e,e)},this.getWrapLimitRange=function(){return{min:this.$wrapLimitRange.min,max:this.$wrapLimitRange.max}},this.$updateInternalDataOnChange=function(e){var t=this.$useWrapMode,n=e.action,r=e.start,i=e.end,s=r.row,o=i.row,u=o-s,a=null;this.$updating=!0;if(u!=0)if(n==="remove"){this[t?"$wrapData":"$rowLengthCache"].splice(s,u);var f=this.$foldData;a=this.getFoldsInRange(e),this.removeFolds(a);var l=this.getFoldLine(i.row),c=0;if(l){l.addRemoveChars(i.row,i.column,r.column-i.column),l.shiftRow(-u);var h=this.getFoldLine(s);h&&h!==l&&(h.merge(l),l=h),c=f.indexOf(l)+1}for(c;c=i.row&&l.shiftRow(-u)}o=s}else{var p=Array(u);p.unshift(s,0);var d=t?this.$wrapData:this.$rowLengthCache;d.splice.apply(d,p);var f=this.$foldData,l=this.getFoldLine(s),c=0;if(l){var v=l.range.compareInside(r.row,r.column);v==0?(l=l.split(r.row,r.column),l&&(l.shiftRow(u),l.addRemoveChars(o,0,i.column-r.column))):v==-1&&(l.addRemoveChars(s,0,i.column-r.column),l.shiftRow(u)),c=f.indexOf(l)+1}for(c;c=s&&l.shiftRow(u)}}else{u=Math.abs(e.start.column-e.end.column),n==="remove"&&(a=this.getFoldsInRange(e),this.removeFolds(a),u=-u);var l=this.getFoldLine(s);l&&l.addRemoveChars(s,r.column,u)}return t&&this.$wrapData.length!=this.doc.getLength()&&console.error("doc.getLength() and $wrapData.length have to be the same!"),this.$updating=!1,t?this.$updateWrapData(s,o):this.$updateRowLengthCache(s,o),a},this.$updateRowLengthCache=function(e,t,n){this.$rowLengthCache[e]=null,this.$rowLengthCache[t]=null},this.$updateWrapData=function(e,t){var r=this.doc.getAllLines(),i=this.getTabSize(),s=this.$wrapData,o=this.$wrapLimit,a,f,l=e;t=Math.min(t,r.length-1);while(l<=t)f=this.getFoldLine(l,f),f?(a=[],f.walk(function(e,t,i,s){var o;if(e!=null){o=this.$getDisplayTokens(e,a.length),o[0]=n;for(var f=1;fr-b){var w=a+r-b;if(e[w-1]>=p&&e[w]>=p){y(w);continue}if(e[w]==n||e[w]==u){for(w;w!=a-1;w--)if(e[w]==n)break;if(w>a){y(w);continue}w=a+r;for(w;w>2)),a-1);while(w>E&&e[w]E&&e[w]E&&e[w]==l)w--}else while(w>E&&e[w]E){y(++w);continue}w=a+r,e[w]==t&&w--,y(w-b)}return s},this.$getDisplayTokens=function(n,r){var i=[],s;r=r||0;for(var o=0;o39&&u<48||u>57&&u<64?i.push(l):u>=4352&&m(u)?i.push(e,t):i.push(e)}return i},this.$getStringScreenWidth=function(e,t,n){if(t==0)return[0,0];t==null&&(t=Infinity),n=n||0;var r,i;for(i=0;i=4352&&m(r)?n+=2:n+=1;if(n>t)break}return[n,i]},this.lineWidgets=null,this.getRowLength=function(e){if(this.lineWidgets)var t=this.lineWidgets[e]&&this.lineWidgets[e].rowCount||0;else t=0;return!this.$useWrapMode||!this.$wrapData[e]?1+t:this.$wrapData[e].length+1+t},this.getRowLineCount=function(e){return!this.$useWrapMode||!this.$wrapData[e]?1:this.$wrapData[e].length+1},this.getRowWrapIndent=function(e){if(this.$useWrapMode){var t=this.screenToDocumentPosition(e,Number.MAX_VALUE),n=this.$wrapData[t.row];return n.length&&n[0]=0)var o=a[f],r=this.$docRowCache[f],c=e>a[l-1];else var c=!l;var h=this.getLength()-1,p=this.getNextFoldLine(r),d=p?p.start.row:Infinity;while(o<=e){u=this.getRowLength(r);if(o+u>e||r>=h)break;o+=u,r++,r>d&&(r=p.end.row+1,p=this.getNextFoldLine(r,p),d=p?p.start.row:Infinity),c&&(this.$docRowCache.push(r),this.$screenRowCache.push(o))}if(p&&p.start.row<=r)n=this.getFoldDisplayLine(p),r=p.start.row;else{if(o+u<=e||r>h)return{row:h,column:this.getLine(h).length};n=this.getLine(r),p=null}var v=0;if(this.$useWrapMode){var m=this.$wrapData[r];if(m){var g=Math.floor(e-o);s=m[g],g>0&&m.length&&(v=m.indent,i=m[g-1]||m[m.length-1],n=n.substring(i))}}return i+=this.$getStringScreenWidth(n,t-v)[1],this.$useWrapMode&&i>=s&&(i=s-1),p?p.idxToPosition(i):{row:r,column:i}},this.documentToScreenPosition=function(e,t){if(typeof t=="undefined")var n=this.$clipPositionToDocument(e.row,e.column);else n=this.$clipPositionToDocument(e,t);e=n.row,t=n.column;var r=0,i=null,s=null;s=this.getFoldAt(e,t,1),s&&(e=s.start.row,t=s.start.column);var o,u=0,a=this.$docRowCache,f=this.$getRowCacheIndex(a,e),l=a.length;if(l&&f>=0)var u=a[f],r=this.$screenRowCache[f],c=e>a[l-1];else var c=!l;var h=this.getNextFoldLine(u),p=h?h.start.row:Infinity;while(u=p){o=h.end.row+1;if(o>e)break;h=this.getNextFoldLine(o,h),p=h?h.start.row:Infinity}else o=u+1;r+=this.getRowLength(u),u=o,c&&(this.$docRowCache.push(u),this.$screenRowCache.push(r))}var d="";h&&u>=p?(d=this.getFoldDisplayLine(h,e,t),i=h.start.row):(d=this.getLine(e).substring(0,t),i=e);var v=0;if(this.$useWrapMode){var m=this.$wrapData[i];if(m){var g=0;while(d.length>=m[g])r++,g++;d=d.substring(m[g-1]||0,d.length),v=g>0?m.indent:0}}return{row:r,column:v+this.$getStringScreenWidth(d)[0]}},this.documentToScreenColumn=function(e,t){return this.documentToScreenPosition(e,t).column},this.documentToScreenRow=function(e,t){return this.documentToScreenPosition(e,t).row},this.getScreenLength=function(){var e=0,t=null;if(!this.$useWrapMode){e=this.getLength();var n=this.$foldData;for(var r=0;ro&&(s=t.end.row+1,t=this.$foldData[r++],o=t?t.start.row:Infinity)}}return this.lineWidgets&&(e+=this.$getWidgetScreenLength()),e},this.$setFontMetrics=function(e){if(!this.$enableVarChar)return;this.$getStringScreenWidth=function(t,n,r){if(n===0)return[0,0];n||(n=Infinity),r=r||0;var i,s;for(s=0;sn)break}return[r,s]}},this.destroy=function(){this.bgTokenizer&&(this.bgTokenizer.setDocument(null),this.bgTokenizer=null),this.$stopWorker()}}).call(p.prototype),e("./edit_session/folding").Folding.call(p.prototype),e("./edit_session/bracket_match").BracketMatch.call(p.prototype),s.defineOptions(p.prototype,"session",{wrap:{set:function(e){!e||e=="off"?e=!1:e=="free"?e=!0:e=="printMargin"?e=-1:typeof e=="string"&&(e=parseInt(e,10)||!1);if(this.$wrap==e)return;this.$wrap=e;if(!e)this.setUseWrapMode(!1);else{var t=typeof e=="number"?e:null;this.setWrapLimitRange(t,t),this.setUseWrapMode(!0)}},get:function(){return this.getUseWrapMode()?this.$wrap==-1?"printMargin":this.getWrapLimitRange().min?this.$wrap:"free":"off"},handlesSet:!0},wrapMethod:{set:function(e){e=e=="auto"?this.$mode.type!="text":e!="text",e!=this.$wrapAsCode&&(this.$wrapAsCode=e,this.$useWrapMode&&(this.$modified=!0,this.$resetRowCache(0),this.$updateWrapData(0,this.getLength()-1)))},initialValue:"auto"},indentedSoftWrap:{initialValue:!0},firstLineNumber:{set:function(){this._signal("changeBreakpoint")},initialValue:1},useWorker:{set:function(e){this.$useWorker=e,this.$stopWorker(),e&&this.$startWorker()},initialValue:!0},useSoftTabs:{initialValue:!0},tabSize:{set:function(e){if(isNaN(e)||this.$tabSize===e)return;this.$modified=!0,this.$rowLengthCache=[],this.$tabSize=e,this._signal("changeTabSize")},initialValue:4,handlesSet:!0},overwrite:{set:function(e){this._signal("changeOverwrite")},initialValue:!1},newLineMode:{set:function(e){this.doc.setNewLineMode(e)},get:function(){return this.doc.getNewLineMode()},handlesSet:!0},mode:{set:function(e){this.setMode(e)},get:function(){return this.$modeId}}}),t.EditSession=p}),ace.define("ace/search",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/range"],function(e,t,n){"use strict";var r=e("./lib/lang"),i=e("./lib/oop"),s=e("./range").Range,o=function(){this.$options={}};(function(){this.set=function(e){return i.mixin(this.$options,e),this},this.getOptions=function(){return r.copyObject(this.$options)},this.setOptions=function(e){this.$options=e},this.find=function(e){var t=this.$options,n=this.$matchIterator(e,t);if(!n)return!1;var r=null;return n.forEach(function(e,n,i){if(!e.start){var o=e.offset+(i||0);r=new s(n,o,n,o+e.length);if(!e.length&&t.start&&t.start.start&&t.skipCurrent!=0&&r.isEqual(t.start))return r=null,!1}else r=e;return!0}),r},this.findAll=function(e){var t=this.$options;if(!t.needle)return[];this.$assembleRegExp(t);var n=t.range,i=n?e.getLines(n.start.row,n.end.row):e.doc.getAllLines(),o=[],u=t.re;if(t.$isMultiLine){var a=u.length,f=i.length-a,l;e:for(var c=u.offset||0;c<=f;c++){for(var h=0;hv)continue;o.push(l=new s(c,v,c+a-1,m)),a>2&&(c=c+a-2)}}else for(var g=0;gE&&o[h].end.row==n.end.row)h--;o=o.slice(g,h+1);for(g=0,h=o.length;g=0;u--)if(i(o[u],t,s))return!0};else var u=function(e,t,s){var o=r.getMatchOffsets(e,n);for(var u=0;u=o;r--)if(n(e.getLine(r),r))return;if(t.wrap==0)return;for(r=u,o=s.row;r>=o;r--)if(n(e.getLine(r),r))return}:function(n){var r=s.row,i=e.getLine(r).substr(s.column);if(n(i,r,s.column))return;for(r+=1;r<=u;r++)if(n(e.getLine(r),r))return;if(t.wrap==0)return;for(r=o,u=s.row;r<=u;r++)if(n(e.getLine(r),r))return};return{forEach:a}}}).call(o.prototype),t.Search=o}),ace.define("ace/keyboard/hash_handler",["require","exports","module","ace/lib/keys","ace/lib/useragent"],function(e,t,n){"use strict";function o(e,t){this.platform=t||(i.isMac?"mac":"win"),this.commands={},this.commandKeyBinding={},this.addCommands(e),this.$singleCommand=!0}function u(e,t){o.call(this,e,t),this.$singleCommand=!1}var r=e("../lib/keys"),i=e("../lib/useragent"),s=r.KEY_MODS;u.prototype=o.prototype,function(){function e(e){return typeof e=="object"&&e.bindKey&&e.bindKey.position||0}this.addCommand=function(e){this.commands[e.name]&&this.removeCommand(e),this.commands[e.name]=e,e.bindKey&&this._buildKeyHash(e)},this.removeCommand=function(e,t){var n=e&&(typeof e=="string"?e:e.name);e=this.commands[n],t||delete this.commands[n];var r=this.commandKeyBinding;for(var i in r){var s=r[i];if(s==e)delete r[i];else if(Array.isArray(s)){var o=s.indexOf(e);o!=-1&&(s.splice(o,1),s.length==1&&(r[i]=s[0]))}}},this.bindKey=function(e,t,n){typeof e=="object"&&e&&(n==undefined&&(n=e.position),e=e[this.platform]);if(!e)return;if(typeof t=="function")return this.addCommand({exec:t,bindKey:e,name:t.name||e});e.split("|").forEach(function(e){var r="";if(e.indexOf(" ")!=-1){var i=e.split(/\s+/);e=i.pop(),i.forEach(function(e){var t=this.parseKeys(e),n=s[t.hashId]+t.key;r+=(r?" ":"")+n,this._addCommandToBinding(r,"chainKeys")},this),r+=" "}var o=this.parseKeys(e),u=s[o.hashId]+o.key;this._addCommandToBinding(r+u,t,n)},this)},this._addCommandToBinding=function(t,n,r){var i=this.commandKeyBinding,s;if(!n)delete i[t];else if(!i[t]||this.$singleCommand)i[t]=n;else{Array.isArray(i[t])?(s=i[t].indexOf(n))!=-1&&i[t].splice(s,1):i[t]=[i[t]],typeof r!="number"&&(r||n.isDefault?r=-100:r=e(n));var o=i[t];for(s=0;sr)break}o.splice(s,0,n)}},this.addCommands=function(e){e&&Object.keys(e).forEach(function(t){var n=e[t];if(!n)return;if(typeof n=="string")return this.bindKey(n,t);typeof n=="function"&&(n={exec:n});if(typeof n!="object")return;n.name||(n.name=t),this.addCommand(n)},this)},this.removeCommands=function(e){Object.keys(e).forEach(function(t){this.removeCommand(e[t])},this)},this.bindKeys=function(e){Object.keys(e).forEach(function(t){this.bindKey(t,e[t])},this)},this._buildKeyHash=function(e){this.bindKey(e.bindKey,e)},this.parseKeys=function(e){var t=e.toLowerCase().split(/[\-\+]([\-\+])?/).filter(function(e){return e}),n=t.pop(),i=r[n];if(r.FUNCTION_KEYS[i])n=r.FUNCTION_KEYS[i].toLowerCase();else{if(!t.length)return{key:n,hashId:-1};if(t.length==1&&t[0]=="shift")return{key:n.toUpperCase(),hashId:-1}}var s=0;for(var o=t.length;o--;){var u=r.KEY_MODS[t[o]];if(u==null)return typeof console!="undefined"&&console.error("invalid modifier "+t[o]+" in "+e),!1;s|=u}return{key:n,hashId:s}},this.findKeyCommand=function(t,n){var r=s[t]+n;return this.commandKeyBinding[r]},this.handleKeyboard=function(e,t,n,r){if(r<0)return;var i=s[t]+n,o=this.commandKeyBinding[i];e.$keyChain&&(e.$keyChain+=" "+i,o=this.commandKeyBinding[e.$keyChain]||o);if(o)if(o=="chainKeys"||o[o.length-1]=="chainKeys")return e.$keyChain=e.$keyChain||i,{command:"null"};if(e.$keyChain)if(!!t&&t!=4||n.length!=1){if(t==-1||r>0)e.$keyChain=""}else e.$keyChain=e.$keyChain.slice(0,-i.length-1);return{command:o}},this.getStatusText=function(e,t){return t.$keyChain||""}}.call(o.prototype),t.HashHandler=o,t.MultiHashHandler=u}),ace.define("ace/commands/command_manager",["require","exports","module","ace/lib/oop","ace/keyboard/hash_handler","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../keyboard/hash_handler").MultiHashHandler,s=e("../lib/event_emitter").EventEmitter,o=function(e,t){i.call(this,t,e),this.byName=this.commands,this.setDefaultHandler("exec",function(e){return e.command.exec(e.editor,e.args||{})})};r.inherits(o,i),function(){r.implement(this,s),this.exec=function(e,t,n){if(Array.isArray(e)){for(var r=e.length;r--;)if(this.exec(e[r],t,n))return!0;return!1}typeof e=="string"&&(e=this.commands[e]);if(!e)return!1;if(t&&t.$readOnly&&!e.readOnly)return!1;var i={editor:t,command:e,args:n};return i.returnValue=this._emit("exec",i),this._signal("afterExec",i),i.returnValue===!1?!1:!0},this.toggleRecording=function(e){if(this.$inReplay)return;return e&&e._emit("changeStatus"),this.recording?(this.macro.pop(),this.removeEventListener("exec",this.$addCommandToMacro),this.macro.length||(this.macro=this.oldMacro),this.recording=!1):(this.$addCommandToMacro||(this.$addCommandToMacro=function(e){this.macro.push([e.command,e.args])}.bind(this)),this.oldMacro=this.macro,this.macro=[],this.on("exec",this.$addCommandToMacro),this.recording=!0)},this.replay=function(e){if(this.$inReplay||!this.macro)return;if(this.recording)return this.toggleRecording(e);try{this.$inReplay=!0,this.macro.forEach(function(t){typeof t=="string"?this.exec(t,e):this.exec(t[0],e,t[1])},this)}finally{this.$inReplay=!1}},this.trimMacro=function(e){return e.map(function(e){return typeof e[0]!="string"&&(e[0]=e[0].name),e[1]||(e=e[0]),e})}}.call(o.prototype),t.CommandManager=o}),ace.define("ace/commands/default_commands",["require","exports","module","ace/lib/lang","ace/config","ace/range"],function(e,t,n){"use strict";function o(e,t){return{win:e,mac:t}}var r=e("../lib/lang"),i=e("../config"),s=e("../range").Range;t.commands=[{name:"showSettingsMenu",bindKey:o("Ctrl-,","Command-,"),exec:function(e){i.loadModule("ace/ext/settings_menu",function(t){t.init(e),e.showSettingsMenu()})},readOnly:!0},{name:"goToNextError",bindKey:o("Alt-E","Ctrl-E"),exec:function(e){i.loadModule("ace/ext/error_marker",function(t){t.showErrorMarker(e,1)})},scrollIntoView:"animate",readOnly:!0},{name:"goToPreviousError",bindKey:o("Alt-Shift-E","Ctrl-Shift-E"),exec:function(e){i.loadModule("ace/ext/error_marker",function(t){t.showErrorMarker(e,-1)})},scrollIntoView:"animate",readOnly:!0},{name:"selectall",bindKey:o("Ctrl-A","Command-A"),exec:function(e){e.selectAll()},readOnly:!0},{name:"centerselection",bindKey:o(null,"Ctrl-L"),exec:function(e){e.centerSelection()},readOnly:!0},{name:"gotoline",bindKey:o("Ctrl-L","Command-L"),exec:function(e){var t=parseInt(prompt("Enter line number:"),10);isNaN(t)||e.gotoLine(t)},readOnly:!0},{name:"fold",bindKey:o("Alt-L|Ctrl-F1","Command-Alt-L|Command-F1"),exec:function(e){e.session.toggleFold(!1)},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"unfold",bindKey:o("Alt-Shift-L|Ctrl-Shift-F1","Command-Alt-Shift-L|Command-Shift-F1"),exec:function(e){e.session.toggleFold(!0)},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"toggleFoldWidget",bindKey:o("F2","F2"),exec:function(e){e.session.toggleFoldWidget()},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"toggleParentFoldWidget",bindKey:o("Alt-F2","Alt-F2"),exec:function(e){e.session.toggleFoldWidget(!0)},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"foldall",bindKey:o(null,"Ctrl-Command-Option-0"),exec:function(e){e.session.foldAll()},scrollIntoView:"center",readOnly:!0},{name:"foldOther",bindKey:o("Alt-0","Command-Option-0"),exec:function(e){e.session.foldAll(),e.session.unfold(e.selection.getAllRanges())},scrollIntoView:"center",readOnly:!0},{name:"unfoldall",bindKey:o("Alt-Shift-0","Command-Option-Shift-0"),exec:function(e){e.session.unfold()},scrollIntoView:"center",readOnly:!0},{name:"findnext",bindKey:o("Ctrl-K","Command-G"),exec:function(e){e.findNext()},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"findprevious",bindKey:o("Ctrl-Shift-K","Command-Shift-G"),exec:function(e){e.findPrevious()},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"selectOrFindNext",bindKey:o("Alt-K","Ctrl-G"),exec:function(e){e.selection.isEmpty()?e.selection.selectWord():e.findNext()},readOnly:!0},{name:"selectOrFindPrevious",bindKey:o("Alt-Shift-K","Ctrl-Shift-G"),exec:function(e){e.selection.isEmpty()?e.selection.selectWord():e.findPrevious()},readOnly:!0},{name:"find",bindKey:o("Ctrl-F","Command-F"),exec:function(e){i.loadModule("ace/ext/searchbox",function(t){t.Search(e)})},readOnly:!0},{name:"overwrite",bindKey:"Insert",exec:function(e){e.toggleOverwrite()},readOnly:!0},{name:"selecttostart",bindKey:o("Ctrl-Shift-Home","Command-Shift-Up"),exec:function(e){e.getSelection().selectFileStart()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"gotostart",bindKey:o("Ctrl-Home","Command-Home|Command-Up"),exec:function(e){e.navigateFileStart()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"selectup",bindKey:o("Shift-Up","Shift-Up"),exec:function(e){e.getSelection().selectUp()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"golineup",bindKey:o("Up","Up|Ctrl-P"),exec:function(e,t){e.navigateUp(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selecttoend",bindKey:o("Ctrl-Shift-End","Command-Shift-Down"),exec:function(e){e.getSelection().selectFileEnd()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"gotoend",bindKey:o("Ctrl-End","Command-End|Command-Down"),exec:function(e){e.navigateFileEnd()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"selectdown",bindKey:o("Shift-Down","Shift-Down"),exec:function(e){e.getSelection().selectDown()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"golinedown",bindKey:o("Down","Down|Ctrl-N"),exec:function(e,t){e.navigateDown(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectwordleft",bindKey:o("Ctrl-Shift-Left","Option-Shift-Left"),exec:function(e){e.getSelection().selectWordLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotowordleft",bindKey:o("Ctrl-Left","Option-Left"),exec:function(e){e.navigateWordLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selecttolinestart",bindKey:o("Alt-Shift-Left","Command-Shift-Left"),exec:function(e){e.getSelection().selectLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotolinestart",bindKey:o("Alt-Left|Home","Command-Left|Home|Ctrl-A"),exec:function(e){e.navigateLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectleft",bindKey:o("Shift-Left","Shift-Left"),exec:function(e){e.getSelection().selectLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotoleft",bindKey:o("Left","Left|Ctrl-B"),exec:function(e,t){e.navigateLeft(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectwordright",bindKey:o("Ctrl-Shift-Right","Option-Shift-Right"),exec:function(e){e.getSelection().selectWordRight()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotowordright",bindKey:o("Ctrl-Right","Option-Right"),exec:function(e){e.navigateWordRight()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selecttolineend",bindKey:o("Alt-Shift-Right","Command-Shift-Right"),exec:function(e){e.getSelection().selectLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotolineend",bindKey:o("Alt-Right|End","Command-Right|End|Ctrl-E"),exec:function(e){e.navigateLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectright",bindKey:o("Shift-Right","Shift-Right"),exec:function(e){e.getSelection().selectRight()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotoright",bindKey:o("Right","Right|Ctrl-F"),exec:function(e,t){e.navigateRight(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectpagedown",bindKey:"Shift-PageDown",exec:function(e){e.selectPageDown()},readOnly:!0},{name:"pagedown",bindKey:o(null,"Option-PageDown"),exec:function(e){e.scrollPageDown()},readOnly:!0},{name:"gotopagedown",bindKey:o("PageDown","PageDown|Ctrl-V"),exec:function(e){e.gotoPageDown()},readOnly:!0},{name:"selectpageup",bindKey:"Shift-PageUp",exec:function(e){e.selectPageUp()},readOnly:!0},{name:"pageup",bindKey:o(null,"Option-PageUp"),exec:function(e){e.scrollPageUp()},readOnly:!0},{name:"gotopageup",bindKey:"PageUp",exec:function(e){e.gotoPageUp()},readOnly:!0},{name:"scrollup",bindKey:o("Ctrl-Up",null),exec:function(e){e.renderer.scrollBy(0,-2*e.renderer.layerConfig.lineHeight)},readOnly:!0},{name:"scrolldown",bindKey:o("Ctrl-Down",null),exec:function(e){e.renderer.scrollBy(0,2*e.renderer.layerConfig.lineHeight)},readOnly:!0},{name:"selectlinestart",bindKey:"Shift-Home",exec:function(e){e.getSelection().selectLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectlineend",bindKey:"Shift-End",exec:function(e){e.getSelection().selectLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"togglerecording",bindKey:o("Ctrl-Alt-E","Command-Option-E"),exec:function(e){e.commands.toggleRecording(e)},readOnly:!0},{name:"replaymacro",bindKey:o("Ctrl-Shift-E","Command-Shift-E"),exec:function(e){e.commands.replay(e)},readOnly:!0},{name:"jumptomatching",bindKey:o("Ctrl-P","Ctrl-P"),exec:function(e){e.jumpToMatching()},multiSelectAction:"forEach",scrollIntoView:"animate",readOnly:!0},{name:"selecttomatching",bindKey:o("Ctrl-Shift-P","Ctrl-Shift-P"),exec:function(e){e.jumpToMatching(!0)},multiSelectAction:"forEach",scrollIntoView:"animate",readOnly:!0},{name:"expandToMatching",bindKey:o("Ctrl-Shift-M","Ctrl-Shift-M"),exec:function(e){e.jumpToMatching(!0,!0)},multiSelectAction:"forEach",scrollIntoView:"animate",readOnly:!0},{name:"passKeysToBrowser",bindKey:o(null,null),exec:function(){},passEvent:!0,readOnly:!0},{name:"copy",exec:function(e){},readOnly:!0},{name:"cut",exec:function(e){var t=e.getSelectionRange();e._emit("cut",t),e.selection.isEmpty()||(e.session.remove(t),e.clearSelection())},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"paste",exec:function(e,t){e.$handlePaste(t)},scrollIntoView:"cursor"},{name:"removeline",bindKey:o("Ctrl-D","Command-D"),exec:function(e){e.removeLines()},scrollIntoView:"cursor",multiSelectAction:"forEachLine"},{name:"duplicateSelection",bindKey:o("Ctrl-Shift-D","Command-Shift-D"),exec:function(e){e.duplicateSelection()},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"sortlines",bindKey:o("Ctrl-Alt-S","Command-Alt-S"),exec:function(e){e.sortLines()},scrollIntoView:"selection",multiSelectAction:"forEachLine"},{name:"togglecomment",bindKey:o("Ctrl-/","Command-/"),exec:function(e){e.toggleCommentLines()},multiSelectAction:"forEachLine",scrollIntoView:"selectionPart"},{name:"toggleBlockComment",bindKey:o("Ctrl-Shift-/","Command-Shift-/"),exec:function(e){e.toggleBlockComment()},multiSelectAction:"forEach",scrollIntoView:"selectionPart"},{name:"modifyNumberUp",bindKey:o("Ctrl-Shift-Up","Alt-Shift-Up"),exec:function(e){e.modifyNumber(1)},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"modifyNumberDown",bindKey:o("Ctrl-Shift-Down","Alt-Shift-Down"),exec:function(e){e.modifyNumber(-1)},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"replace",bindKey:o("Ctrl-H","Command-Option-F"),exec:function(e){i.loadModule("ace/ext/searchbox",function(t){t.Search(e,!0)})}},{name:"undo",bindKey:o("Ctrl-Z","Command-Z"),exec:function(e){e.undo()}},{name:"redo",bindKey:o("Ctrl-Shift-Z|Ctrl-Y","Command-Shift-Z|Command-Y"),exec:function(e){e.redo()}},{name:"copylinesup",bindKey:o("Alt-Shift-Up","Command-Option-Up"),exec:function(e){e.copyLinesUp()},scrollIntoView:"cursor"},{name:"movelinesup",bindKey:o("Alt-Up","Option-Up"),exec:function(e){e.moveLinesUp()},scrollIntoView:"cursor"},{name:"copylinesdown",bindKey:o("Alt-Shift-Down","Command-Option-Down"),exec:function(e){e.copyLinesDown()},scrollIntoView:"cursor"},{name:"movelinesdown",bindKey:o("Alt-Down","Option-Down"),exec:function(e){e.moveLinesDown()},scrollIntoView:"cursor"},{name:"del",bindKey:o("Delete","Delete|Ctrl-D|Shift-Delete"),exec:function(e){e.remove("right")},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"backspace",bindKey:o("Shift-Backspace|Backspace","Ctrl-Backspace|Shift-Backspace|Backspace|Ctrl-H"),exec:function(e){e.remove("left")},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"cut_or_delete",bindKey:o("Shift-Delete",null),exec:function(e){if(!e.selection.isEmpty())return!1;e.remove("left")},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removetolinestart",bindKey:o("Alt-Backspace","Command-Backspace"),exec:function(e){e.removeToLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removetolineend",bindKey:o("Alt-Delete","Ctrl-K"),exec:function(e){e.removeToLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removewordleft",bindKey:o("Ctrl-Backspace","Alt-Backspace|Ctrl-Alt-Backspace"),exec:function(e){e.removeWordLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removewordright",bindKey:o("Ctrl-Delete","Alt-Delete"),exec:function(e){e.removeWordRight()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"outdent",bindKey:o("Shift-Tab","Shift-Tab"),exec:function(e){e.blockOutdent()},multiSelectAction:"forEach",scrollIntoView:"selectionPart"},{name:"indent",bindKey:o("Tab","Tab"),exec:function(e){e.indent()},multiSelectAction:"forEach",scrollIntoView:"selectionPart"},{name:"blockoutdent",bindKey:o("Ctrl-[","Ctrl-["),exec:function(e){e.blockOutdent()},multiSelectAction:"forEachLine",scrollIntoView:"selectionPart"},{name:"blockindent",bindKey:o("Ctrl-]","Ctrl-]"),exec:function(e){e.blockIndent()},multiSelectAction:"forEachLine",scrollIntoView:"selectionPart"},{name:"insertstring",exec:function(e,t){e.insert(t)},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"inserttext",exec:function(e,t){e.insert(r.stringRepeat(t.text||"",t.times||1))},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"splitline",bindKey:o(null,"Ctrl-O"),exec:function(e){e.splitLine()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"transposeletters",bindKey:o("Ctrl-T","Ctrl-T"),exec:function(e){e.transposeLetters()},multiSelectAction:function(e){e.transposeSelections(1)},scrollIntoView:"cursor"},{name:"touppercase",bindKey:o("Ctrl-U","Ctrl-U"),exec:function(e){e.toUpperCase()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"tolowercase",bindKey:o("Ctrl-Shift-U","Ctrl-Shift-U"),exec:function(e){e.toLowerCase()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"expandtoline",bindKey:o("Ctrl-Shift-L","Command-Shift-L"),exec:function(e){var t=e.selection.getRange();t.start.column=t.end.column=0,t.end.row++,e.selection.setRange(t,!1)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"joinlines",bindKey:o(null,null),exec:function(e){var t=e.selection.isBackwards(),n=t?e.selection.getSelectionLead():e.selection.getSelectionAnchor(),i=t?e.selection.getSelectionAnchor():e.selection.getSelectionLead(),o=e.session.doc.getLine(n.row).length,u=e.session.doc.getTextRange(e.selection.getRange()),a=u.replace(/\n\s*/," ").length,f=e.session.doc.getLine(n.row);for(var l=n.row+1;l<=i.row+1;l++){var c=r.stringTrimLeft(r.stringTrimRight(e.session.doc.getLine(l)));c.length!==0&&(c=" "+c),f+=c}i.row+10?(e.selection.moveCursorTo(n.row,n.column),e.selection.selectTo(n.row,n.column+a)):(o=e.session.doc.getLine(n.row).length>o?o+1:o,e.selection.moveCursorTo(n.row,o))},multiSelectAction:"forEach",readOnly:!0},{name:"invertSelection",bindKey:o(null,null),exec:function(e){var t=e.session.doc.getLength()-1,n=e.session.doc.getLine(t).length,r=e.selection.rangeList.ranges,i=[];r.length<1&&(r=[e.selection.getRange()]);for(var o=0;o0&&this.$blockScrolling--;var n=t&&t.scrollIntoView;if(n){switch(n){case"center-animate":n="animate";case"center":this.renderer.scrollCursorIntoView(null,.5);break;case"animate":case"cursor":this.renderer.scrollCursorIntoView();break;case"selectionPart":var r=this.selection.getRange(),i=this.renderer.layerConfig;(r.start.row>=i.lastRow||r.end.row<=i.firstRow)&&this.renderer.scrollSelectionIntoView(this.selection.anchor,this.selection.lead);break;default:}n=="animate"&&this.renderer.animateScrolling(this.curOp.scrollTop)}this.prevOp=this.curOp,this.curOp=null}},this.$mergeableCommands=["backspace","del","insertstring"],this.$historyTracker=function(e){if(!this.$mergeUndoDeltas)return;var t=this.prevOp,n=this.$mergeableCommands,r=t.command&&e.command.name==t.command.name;if(e.command.name=="insertstring"){var i=e.args;this.mergeNextCommand===undefined&&(this.mergeNextCommand=!0),r=r&&this.mergeNextCommand&&(!/\s/.test(i)||/\s/.test(t.args)),this.mergeNextCommand=!0}else r=r&&n.indexOf(e.command.name)!==-1;this.$mergeUndoDeltas!="always"&&Date.now()-this.sequenceStartTime>2e3&&(r=!1),r?this.session.mergeUndoDeltas=!0:n.indexOf(e.command.name)!==-1&&(this.sequenceStartTime=Date.now())},this.setKeyboardHandler=function(e,t){if(e&&typeof e=="string"){this.$keybindingId=e;var n=this;g.loadModule(["keybinding",e],function(r){n.$keybindingId==e&&n.keyBinding.setKeyboardHandler(r&&r.handler),t&&t()})}else this.$keybindingId=null,this.keyBinding.setKeyboardHandler(e),t&&t()},this.getKeyboardHandler=function(){return this.keyBinding.getKeyboardHandler()},this.setSession=function(e){if(this.session==e)return;this.curOp&&this.endOperation(),this.curOp={};var t=this.session;if(t){this.session.off("change",this.$onDocumentChange),this.session.off("changeMode",this.$onChangeMode),this.session.off("tokenizerUpdate",this.$onTokenizerUpdate),this.session.off("changeTabSize",this.$onChangeTabSize),this.session.off("changeWrapLimit",this.$onChangeWrapLimit),this.session.off("changeWrapMode",this.$onChangeWrapMode),this.session.off("changeFold",this.$onChangeFold),this.session.off("changeFrontMarker",this.$onChangeFrontMarker),this.session.off("changeBackMarker",this.$onChangeBackMarker),this.session.off("changeBreakpoint",this.$onChangeBreakpoint),this.session.off("changeAnnotation",this.$onChangeAnnotation),this.session.off("changeOverwrite",this.$onCursorChange),this.session.off("changeScrollTop",this.$onScrollTopChange),this.session.off("changeScrollLeft",this.$onScrollLeftChange);var n=this.session.getSelection();n.off("changeCursor",this.$onCursorChange),n.off("changeSelection",this.$onSelectionChange)}this.session=e,e?(this.$onDocumentChange=this.onDocumentChange.bind(this),e.on("change",this.$onDocumentChange),this.renderer.setSession(e),this.$onChangeMode=this.onChangeMode.bind(this),e.on("changeMode",this.$onChangeMode),this.$onTokenizerUpdate=this.onTokenizerUpdate.bind(this),e.on("tokenizerUpdate",this.$onTokenizerUpdate),this.$onChangeTabSize=this.renderer.onChangeTabSize.bind(this.renderer),e.on("changeTabSize",this.$onChangeTabSize),this.$onChangeWrapLimit=this.onChangeWrapLimit.bind(this),e.on("changeWrapLimit",this.$onChangeWrapLimit),this.$onChangeWrapMode=this.onChangeWrapMode.bind(this),e.on("changeWrapMode",this.$onChangeWrapMode),this.$onChangeFold=this.onChangeFold.bind(this),e.on("changeFold",this.$onChangeFold),this.$onChangeFrontMarker=this.onChangeFrontMarker.bind(this),this.session.on("changeFrontMarker",this.$onChangeFrontMarker),this.$onChangeBackMarker=this.onChangeBackMarker.bind(this),this.session.on("changeBackMarker",this.$onChangeBackMarker),this.$onChangeBreakpoint=this.onChangeBreakpoint.bind(this),this.session.on("changeBreakpoint",this.$onChangeBreakpoint),this.$onChangeAnnotation=this.onChangeAnnotation.bind(this),this.session.on("changeAnnotation",this.$onChangeAnnotation),this.$onCursorChange=this.onCursorChange.bind(this),this.session.on("changeOverwrite",this.$onCursorChange),this.$onScrollTopChange=this.onScrollTopChange.bind(this),this.session.on("changeScrollTop",this.$onScrollTopChange),this.$onScrollLeftChange=this.onScrollLeftChange.bind(this),this.session.on("changeScrollLeft",this.$onScrollLeftChange),this.selection=e.getSelection(),this.selection.on("changeCursor",this.$onCursorChange),this.$onSelectionChange=this.onSelectionChange.bind(this),this.selection.on("changeSelection",this.$onSelectionChange),this.onChangeMode(),this.$blockScrolling+=1,this.onCursorChange(),this.$blockScrolling-=1,this.onScrollTopChange(),this.onScrollLeftChange(),this.onSelectionChange(),this.onChangeFrontMarker(),this.onChangeBackMarker(),this.onChangeBreakpoint(),this.onChangeAnnotation(),this.session.getUseWrapMode()&&this.renderer.adjustWrapLimit(),this.renderer.updateFull()):(this.selection=null,this.renderer.setSession(e)),this._signal("changeSession",{session:e,oldSession:t}),this.curOp=null,t&&t._signal("changeEditor",{oldEditor:this}),e&&e._signal("changeEditor",{editor:this})},this.getSession=function(){return this.session},this.setValue=function(e,t){return this.session.doc.setValue(e),t?t==1?this.navigateFileEnd():t==-1&&this.navigateFileStart():this.selectAll(),e},this.getValue=function(){return this.session.getValue()},this.getSelection=function(){return this.selection},this.resize=function(e){this.renderer.onResize(e)},this.setTheme=function(e,t){this.renderer.setTheme(e,t)},this.getTheme=function(){return this.renderer.getTheme()},this.setStyle=function(e){this.renderer.setStyle(e)},this.unsetStyle=function(e){this.renderer.unsetStyle(e)},this.getFontSize=function(){return this.getOption("fontSize")||i.computedStyle(this.container,"fontSize")},this.setFontSize=function(e){this.setOption("fontSize",e)},this.$highlightBrackets=function(){this.session.$bracketHighlight&&(this.session.removeMarker(this.session.$bracketHighlight),this.session.$bracketHighlight=null);if(this.$highlightPending)return;var e=this;this.$highlightPending=!0,setTimeout(function(){e.$highlightPending=!1;var t=e.session;if(!t||!t.bgTokenizer)return;var n=t.findMatchingBracket(e.getCursorPosition());if(n)var r=new p(n.row,n.column,n.row,n.column+1);else if(t.$mode.getMatching)var r=t.$mode.getMatching(e.session);r&&(t.$bracketHighlight=t.addMarker(r,"ace_bracket","text"))},50)},this.$highlightTags=function(){if(this.$highlightTagPending)return;var e=this;this.$highlightTagPending=!0,setTimeout(function(){e.$highlightTagPending=!1;var t=e.session;if(!t||!t.bgTokenizer)return;var n=e.getCursorPosition(),r=new y(e.session,n.row,n.column),i=r.getCurrentToken();if(!i||!/\b(?:tag-open|tag-name)/.test(i.type)){t.removeMarker(t.$tagHighlight),t.$tagHighlight=null;return}if(i.type.indexOf("tag-open")!=-1){i=r.stepForward();if(!i)return}var s=i.value,o=0,u=r.stepBackward();if(u.value=="<"){do u=i,i=r.stepForward(),i&&i.value===s&&i.type.indexOf("tag-name")!==-1&&(u.value==="<"?o++:u.value===""&&o--);while(i&&o>=0)}else{do i=u,u=r.stepBackward(),i&&i.value===s&&i.type.indexOf("tag-name")!==-1&&(u.value==="<"?o++:u.value===""&&o--);while(u&&o<=0);r.stepForward()}if(!i){t.removeMarker(t.$tagHighlight),t.$tagHighlight=null;return}var a=r.getCurrentTokenRow(),f=r.getCurrentTokenColumn(),l=new p(a,f,a,f+i.value.length);t.$tagHighlight&&l.compareRange(t.$backMarkers[t.$tagHighlight].range)!==0&&(t.removeMarker(t.$tagHighlight),t.$tagHighlight=null),l&&!t.$tagHighlight&&(t.$tagHighlight=t.addMarker(l,"ace_bracket","text"))},50)},this.focus=function(){var e=this;setTimeout(function(){e.textInput.focus()}),this.textInput.focus()},this.isFocused=function(){return this.textInput.isFocused()},this.blur=function(){this.textInput.blur()},this.onFocus=function(e){if(this.$isFocused)return;this.$isFocused=!0,this.renderer.showCursor(),this.renderer.visualizeFocus(),this._emit("focus",e)},this.onBlur=function(e){if(!this.$isFocused)return;this.$isFocused=!1,this.renderer.hideCursor(),this.renderer.visualizeBlur(),this._emit("blur",e)},this.$cursorChange=function(){this.renderer.updateCursor()},this.onDocumentChange=function(e){var t=this.session.$useWrapMode,n=e.start.row==e.end.row?e.end.row:Infinity;this.renderer.updateLines(e.start.row,n,t),this._signal("change",e),this.$cursorChange(),this.$updateHighlightActiveLine()},this.onTokenizerUpdate=function(e){var t=e.data;this.renderer.updateLines(t.first,t.last)},this.onScrollTopChange=function(){this.renderer.scrollToY(this.session.getScrollTop())},this.onScrollLeftChange=function(){this.renderer.scrollToX(this.session.getScrollLeft())},this.onCursorChange=function(){this.$cursorChange(),this.$blockScrolling||(g.warn("Automatically scrolling cursor into view after selection change","this will be disabled in the next version","set editor.$blockScrolling = Infinity to disable this message"),this.renderer.scrollCursorIntoView()),this.$highlightBrackets(),this.$highlightTags(),this.$updateHighlightActiveLine(),this._signal("changeSelection")},this.$updateHighlightActiveLine=function(){var e=this.getSession(),t;if(this.$highlightActiveLine){if(this.$selectionStyle!="line"||!this.selection.isMultiLine())t=this.getCursorPosition();this.renderer.$maxLines&&this.session.getLength()===1&&!(this.renderer.$minLines>1)&&(t=!1)}if(e.$highlightLineMarker&&!t)e.removeMarker(e.$highlightLineMarker.id),e.$highlightLineMarker=null;else if(!e.$highlightLineMarker&&t){var n=new p(t.row,t.column,t.row,Infinity);n.id=e.addMarker(n,"ace_active-line","screenLine"),e.$highlightLineMarker=n}else t&&(e.$highlightLineMarker.start.row=t.row,e.$highlightLineMarker.end.row=t.row,e.$highlightLineMarker.start.column=t.column,e._signal("changeBackMarker"))},this.onSelectionChange=function(e){var t=this.session;t.$selectionMarker&&t.removeMarker(t.$selectionMarker),t.$selectionMarker=null;if(!this.selection.isEmpty()){var n=this.selection.getRange(),r=this.getSelectionStyle();t.$selectionMarker=t.addMarker(n,"ace_selection",r)}else this.$updateHighlightActiveLine();var i=this.$highlightSelectedWord&&this.$getSelectionHighLightRegexp();this.session.highlight(i),this._signal("changeSelection")},this.$getSelectionHighLightRegexp=function(){var e=this.session,t=this.getSelectionRange();if(t.isEmpty()||t.isMultiLine())return;var n=t.start.column-1,r=t.end.column+1,i=e.getLine(t.start.row),s=i.length,o=i.substring(Math.max(n,0),Math.min(r,s));if(n>=0&&/^[\w\d]/.test(o)||r<=s&&/[\w\d]$/.test(o))return;o=i.substring(t.start.column,t.end.column);if(!/^[\w\d]+$/.test(o))return;var u=this.$search.$assembleRegExp({wholeWord:!0,caseSensitive:!0,needle:o});return u},this.onChangeFrontMarker=function(){this.renderer.updateFrontMarkers()},this.onChangeBackMarker=function(){this.renderer.updateBackMarkers()},this.onChangeBreakpoint=function(){this.renderer.updateBreakpoints()},this.onChangeAnnotation=function(){this.renderer.setAnnotations(this.session.getAnnotations())},this.onChangeMode=function(e){this.renderer.updateText(),this._emit("changeMode",e)},this.onChangeWrapLimit=function(){this.renderer.updateFull()},this.onChangeWrapMode=function(){this.renderer.onResize(!0)},this.onChangeFold=function(){this.$updateHighlightActiveLine(),this.renderer.updateFull()},this.getSelectedText=function(){return this.session.getTextRange(this.getSelectionRange())},this.getCopyText=function(){var e=this.getSelectedText();return this._signal("copy",e),e},this.onCopy=function(){this.commands.exec("copy",this)},this.onCut=function(){this.commands.exec("cut",this)},this.onPaste=function(e,t){var n={text:e,event:t};this.commands.exec("paste",this,n)},this.$handlePaste=function(e){typeof e=="string"&&(e={text:e}),this._signal("paste",e);var t=e.text;if(!this.inMultiSelectMode||this.inVirtualSelectionMode)this.insert(t);else{var n=t.split(/\r\n|\r|\n/),r=this.selection.rangeList.ranges;if(n.length>r.length||n.length<2||!n[1])return this.commands.exec("insertstring",this,t);for(var i=r.length;i--;){var s=r[i];s.isEmpty()||this.session.remove(s),this.session.insert(s.start,n[i])}}},this.execCommand=function(e,t){return this.commands.exec(e,this,t)},this.insert=function(e,t){var n=this.session,r=n.getMode(),i=this.getCursorPosition();if(this.getBehavioursEnabled()&&!t){var s=r.transformAction(n.getState(i.row),"insertion",this,n,e);s&&(e!==s.text&&(this.session.mergeUndoDeltas=!1,this.$mergeNextCommand=!1),e=s.text)}e==" "&&(e=this.session.getTabString());if(!this.selection.isEmpty()){var o=this.getSelectionRange();i=this.session.remove(o),this.clearSelection()}else if(this.session.getOverwrite()){var o=new p.fromPoints(i,i);o.end.column+=e.length,this.session.remove(o)}if(e=="\n"||e=="\r\n"){var u=n.getLine(i.row);if(i.column>u.search(/\S|$/)){var a=u.substr(i.column).search(/\S|$/);n.doc.removeInLine(i.row,i.column,i.column+a)}}this.clearSelection();var f=i.column,l=n.getState(i.row),u=n.getLine(i.row),c=r.checkOutdent(l,u,e),h=n.insert(i,e);s&&s.selection&&(s.selection.length==2?this.selection.setSelectionRange(new p(i.row,f+s.selection[0],i.row,f+s.selection[1])):this.selection.setSelectionRange(new p(i.row+s.selection[0],s.selection[1],i.row+s.selection[2],s.selection[3])));if(n.getDocument().isNewLine(e)){var d=r.getNextLineIndent(l,u.slice(0,i.column),n.getTabString());n.insert({row:i.row+1,column:0},d)}c&&r.autoOutdent(l,n,i.row)},this.onTextInput=function(e){this.keyBinding.onTextInput(e)},this.onCommandKey=function(e,t,n){this.keyBinding.onCommandKey(e,t,n)},this.setOverwrite=function(e){this.session.setOverwrite(e)},this.getOverwrite=function(){return this.session.getOverwrite()},this.toggleOverwrite=function(){this.session.toggleOverwrite()},this.setScrollSpeed=function(e){this.setOption("scrollSpeed",e)},this.getScrollSpeed=function(){return this.getOption("scrollSpeed")},this.setDragDelay=function(e){this.setOption("dragDelay",e)},this.getDragDelay=function(){return this.getOption("dragDelay")},this.setSelectionStyle=function(e){this.setOption("selectionStyle",e)},this.getSelectionStyle=function(){return this.getOption("selectionStyle")},this.setHighlightActiveLine=function(e){this.setOption("highlightActiveLine",e)},this.getHighlightActiveLine=function(){return this.getOption("highlightActiveLine")},this.setHighlightGutterLine=function(e){this.setOption("highlightGutterLine",e)},this.getHighlightGutterLine=function(){return this.getOption("highlightGutterLine")},this.setHighlightSelectedWord=function(e){this.setOption("highlightSelectedWord",e)},this.getHighlightSelectedWord=function(){return this.$highlightSelectedWord},this.setAnimatedScroll=function(e){this.renderer.setAnimatedScroll(e)},this.getAnimatedScroll=function(){return this.renderer.getAnimatedScroll()},this.setShowInvisibles=function(e){this.renderer.setShowInvisibles(e)},this.getShowInvisibles=function(){return this.renderer.getShowInvisibles()},this.setDisplayIndentGuides=function(e){this.renderer.setDisplayIndentGuides(e)},this.getDisplayIndentGuides=function(){return this.renderer.getDisplayIndentGuides()},this.setShowPrintMargin=function(e){this.renderer.setShowPrintMargin(e)},this.getShowPrintMargin=function(){return this.renderer.getShowPrintMargin()},this.setPrintMarginColumn=function(e){this.renderer.setPrintMarginColumn(e)},this.getPrintMarginColumn=function(){return this.renderer.getPrintMarginColumn()},this.setReadOnly=function(e){this.setOption("readOnly",e)},this.getReadOnly=function(){return this.getOption("readOnly")},this.setBehavioursEnabled=function(e){this.setOption("behavioursEnabled",e)},this.getBehavioursEnabled=function(){return this.getOption("behavioursEnabled")},this.setWrapBehavioursEnabled=function(e){this.setOption("wrapBehavioursEnabled",e)},this.getWrapBehavioursEnabled=function(){return this.getOption("wrapBehavioursEnabled")},this.setShowFoldWidgets=function(e){this.setOption("showFoldWidgets",e)},this.getShowFoldWidgets=function(){return this.getOption("showFoldWidgets")},this.setFadeFoldWidgets=function(e){this.setOption("fadeFoldWidgets",e)},this.getFadeFoldWidgets=function(){return this.getOption("fadeFoldWidgets")},this.remove=function(e){this.selection.isEmpty()&&(e=="left"?this.selection.selectLeft():this.selection.selectRight());var t=this.getSelectionRange();if(this.getBehavioursEnabled()){var n=this.session,r=n.getState(t.start.row),i=n.getMode().transformAction(r,"deletion",this,n,t);if(t.end.column===0){var s=n.getTextRange(t);if(s[s.length-1]=="\n"){var o=n.getLine(t.end.row);/^\s+$/.test(o)&&(t.end.column=o.length)}}i&&(t=i)}this.session.remove(t),this.clearSelection()},this.removeWordRight=function(){this.selection.isEmpty()&&this.selection.selectWordRight(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeWordLeft=function(){this.selection.isEmpty()&&this.selection.selectWordLeft(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeToLineStart=function(){this.selection.isEmpty()&&this.selection.selectLineStart(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeToLineEnd=function(){this.selection.isEmpty()&&this.selection.selectLineEnd();var e=this.getSelectionRange();e.start.column==e.end.column&&e.start.row==e.end.row&&(e.end.column=0,e.end.row++),this.session.remove(e),this.clearSelection()},this.splitLine=function(){this.selection.isEmpty()||(this.session.remove(this.getSelectionRange()),this.clearSelection());var e=this.getCursorPosition();this.insert("\n"),this.moveCursorToPosition(e)},this.transposeLetters=function(){if(!this.selection.isEmpty())return;var e=this.getCursorPosition(),t=e.column;if(t===0)return;var n=this.session.getLine(e.row),r,i;tt.toLowerCase()?1:0});var r=new p(0,0,0,0);for(var i=e.first;i<=e.last;i++){var s=t.getLine(i);r.start.row=i,r.end.row=i,r.end.column=s.length,t.replace(r,n[i-e.first])}},this.toggleCommentLines=function(){var e=this.session.getState(this.getCursorPosition().row),t=this.$getSelectedRows();this.session.getMode().toggleCommentLines(e,this.session,t.first,t.last)},this.toggleBlockComment=function(){var e=this.getCursorPosition(),t=this.session.getState(e.row),n=this.getSelectionRange();this.session.getMode().toggleBlockComment(t,this.session,n,e)},this.getNumberAt=function(e,t){var n=/[\-]?[0-9]+(?:\.[0-9]+)?/g;n.lastIndex=0;var r=this.session.getLine(e);while(n.lastIndex=t){var s={value:i[0],start:i.index,end:i.index+i[0].length};return s}}return null},this.modifyNumber=function(e){var t=this.selection.getCursor().row,n=this.selection.getCursor().column,r=new p(t,n-1,t,n),i=this.session.getTextRange(r);if(!isNaN(parseFloat(i))&&isFinite(i)){var s=this.getNumberAt(t,n);if(s){var o=s.value.indexOf(".")>=0?s.start+s.value.indexOf(".")+1:s.end,u=s.start+s.value.length-o,a=parseFloat(s.value);a*=Math.pow(10,u),o!==s.end&&np+1)break;p=d.last}l--,u=this.session.$moveLines(h,p,t?0:e),t&&e==-1&&(c=l+1);while(c<=l)o[c].moveBy(u,0),c++;t||(u=0),a+=u}i.fromOrientedRange(i.ranges[0]),i.rangeList.attach(this.session),this.inVirtualSelectionMode=!1}},this.$getSelectedRows=function(e){return e=(e||this.getSelectionRange()).collapseRows(),{first:this.session.getRowFoldStart(e.start.row),last:this.session.getRowFoldEnd(e.end.row)}},this.onCompositionStart=function(e){this.renderer.showComposition(this.getCursorPosition())},this.onCompositionUpdate=function(e){this.renderer.setCompositionText(e)},this.onCompositionEnd=function(){this.renderer.hideComposition()},this.getFirstVisibleRow=function(){return this.renderer.getFirstVisibleRow()},this.getLastVisibleRow=function(){return this.renderer.getLastVisibleRow()},this.isRowVisible=function(e){return e>=this.getFirstVisibleRow()&&e<=this.getLastVisibleRow()},this.isRowFullyVisible=function(e){return e>=this.renderer.getFirstFullyVisibleRow()&&e<=this.renderer.getLastFullyVisibleRow()},this.$getVisibleRowCount=function(){return this.renderer.getScrollBottomRow()-this.renderer.getScrollTopRow()+1},this.$moveByPage=function(e,t){var n=this.renderer,r=this.renderer.layerConfig,i=e*Math.floor(r.height/r.lineHeight);this.$blockScrolling++,t===!0?this.selection.$moveSelection(function(){this.moveCursorBy(i,0)}):t===!1&&(this.selection.moveCursorBy(i,0),this.selection.clearSelection()),this.$blockScrolling--;var s=n.scrollTop;n.scrollBy(0,i*r.lineHeight),t!=null&&n.scrollCursorIntoView(null,.5),n.animateScrolling(s)},this.selectPageDown=function(){this.$moveByPage(1,!0)},this.selectPageUp=function(){this.$moveByPage(-1,!0)},this.gotoPageDown=function(){this.$moveByPage(1,!1)},this.gotoPageUp=function(){this.$moveByPage(-1,!1)},this.scrollPageDown=function(){this.$moveByPage(1)},this.scrollPageUp=function(){this.$moveByPage(-1)},this.scrollToRow=function(e){this.renderer.scrollToRow(e)},this.scrollToLine=function(e,t,n,r){this.renderer.scrollToLine(e,t,n,r)},this.centerSelection=function(){var e=this.getSelectionRange(),t={row:Math.floor(e.start.row+(e.end.row-e.start.row)/2),column:Math.floor(e.start.column+(e.end.column-e.start.column)/2)};this.renderer.alignCursor(t,.5)},this.getCursorPosition=function(){return this.selection.getCursor()},this.getCursorPositionScreen=function(){return this.session.documentToScreenPosition(this.getCursorPosition())},this.getSelectionRange=function(){return this.selection.getRange()},this.selectAll=function(){this.$blockScrolling+=1,this.selection.selectAll(),this.$blockScrolling-=1},this.clearSelection=function(){this.selection.clearSelection()},this.moveCursorTo=function(e,t){this.selection.moveCursorTo(e,t)},this.moveCursorToPosition=function(e){this.selection.moveCursorToPosition(e)},this.jumpToMatching=function(e,t){var n=this.getCursorPosition(),r=new y(this.session,n.row,n.column),i=r.getCurrentToken(),s=i||r.stepForward();if(!s)return;var o,u=!1,a={},f=n.column-s.start,l,c={")":"(","(":"(","]":"[","[":"[","{":"{","}":"{"};do{if(s.value.match(/[{}()\[\]]/g))for(;f=0;--s)this.$tryReplace(n[s],e)&&r++;return this.selection.setSelectionRange(i),this.$blockScrolling-=1,r},this.$tryReplace=function(e,t){var n=this.session.getTextRange(e);return t=this.$search.replace(n,t),t!==null?(e.end=this.session.replace(e,t),e):null},this.getLastSearchOptions=function(){return this.$search.getOptions()},this.find=function(e,t,n){t||(t={}),typeof e=="string"||e instanceof RegExp?t.needle=e:typeof e=="object"&&r.mixin(t,e);var i=this.selection.getRange();t.needle==null&&(e=this.session.getTextRange(i)||this.$search.$options.needle,e||(i=this.session.getWordRange(i.start.row,i.start.column),e=this.session.getTextRange(i)),this.$search.set({needle:e})),this.$search.set(t),t.start||this.$search.set({start:i});var s=this.$search.find(this.session);if(t.preventScroll)return s;if(s)return this.revealRange(s,n),s;t.backwards?i.start=i.end:i.end=i.start,this.selection.setRange(i)},this.findNext=function(e,t){this.find({skipCurrent:!0,backwards:!1},e,t)},this.findPrevious=function(e,t){this.find(e,{skipCurrent:!0,backwards:!0},t)},this.revealRange=function(e,t){this.$blockScrolling+=1,this.session.unfold(e),this.selection.setSelectionRange(e),this.$blockScrolling-=1;var n=this.renderer.scrollTop;this.renderer.scrollSelectionIntoView(e.start,e.end,.5),t!==!1&&this.renderer.animateScrolling(n)},this.undo=function(){this.$blockScrolling++,this.session.getUndoManager().undo(),this.$blockScrolling--,this.renderer.scrollCursorIntoView(null,.5)},this.redo=function(){this.$blockScrolling++,this.session.getUndoManager().redo(),this.$blockScrolling--,this.renderer.scrollCursorIntoView(null,.5)},this.destroy=function(){this.renderer.destroy(),this._signal("destroy",this),this.session&&this.session.destroy()},this.setAutoScrollEditorIntoView=function(e){if(!e)return;var t,n=this,r=!1;this.$scrollAnchor||(this.$scrollAnchor=document.createElement("div"));var i=this.$scrollAnchor;i.style.cssText="position:absolute",this.container.insertBefore(i,this.container.firstChild);var s=this.on("changeSelection",function(){r=!0}),o=this.renderer.on("beforeRender",function(){r&&(t=n.renderer.container.getBoundingClientRect())}),u=this.renderer.on("afterRender",function(){if(r&&t&&(n.isFocused()||n.searchBox&&n.searchBox.isFocused())){var e=n.renderer,s=e.$cursorLayer.$pixelPos,o=e.layerConfig,u=s.top-o.offset;s.top>=0&&u+t.top<0?r=!0:s.topwindow.innerHeight?r=!1:r=null,r!=null&&(i.style.top=u+"px",i.style.left=s.left+"px",i.style.height=o.lineHeight+"px",i.scrollIntoView(r)),r=t=null}});this.setAutoScrollEditorIntoView=function(e){if(e)return;delete this.setAutoScrollEditorIntoView,this.off("changeSelection",s),this.renderer.off("afterRender",u),this.renderer.off("beforeRender",o)}},this.$resetCursorStyle=function(){var e=this.$cursorStyle||"ace",t=this.renderer.$cursorLayer;if(!t)return;t.setSmoothBlinking(/smooth/.test(e)),t.isBlinking=!this.$readOnly&&e!="wide",i.setCssClass(t.element,"ace_slim-cursors",/slim/.test(e))}}).call(b.prototype),g.defineOptions(b.prototype,"editor",{selectionStyle:{set:function(e){this.onSelectionChange(),this._signal("changeSelectionStyle",{data:e})},initialValue:"line"},highlightActiveLine:{set:function(){this.$updateHighlightActiveLine()},initialValue:!0},highlightSelectedWord:{set:function(e){this.$onSelectionChange()},initialValue:!0},readOnly:{set:function(e){this.$resetCursorStyle()},initialValue:!1},cursorStyle:{set:function(e){this.$resetCursorStyle()},values:["ace","slim","smooth","wide"],initialValue:"ace"},mergeUndoDeltas:{values:[!1,!0,"always"],initialValue:!0},behavioursEnabled:{initialValue:!0},wrapBehavioursEnabled:{initialValue:!0},autoScrollEditorIntoView:{set:function(e){this.setAutoScrollEditorIntoView(e)}},keyboardHandler:{set:function(e){this.setKeyboardHandler(e)},get:function(){return this.keybindingId},handlesSet:!0},hScrollBarAlwaysVisible:"renderer",vScrollBarAlwaysVisible:"renderer",highlightGutterLine:"renderer",animatedScroll:"renderer",showInvisibles:"renderer",showPrintMargin:"renderer",printMarginColumn:"renderer",printMargin:"renderer",fadeFoldWidgets:"renderer",showFoldWidgets:"renderer",showLineNumbers:"renderer",showGutter:"renderer",displayIndentGuides:"renderer",fontSize:"renderer",fontFamily:"renderer",maxLines:"renderer",minLines:"renderer",scrollPastEnd:"renderer",fixedWidthGutter:"renderer",theme:"renderer",scrollSpeed:"$mouseHandler",dragDelay:"$mouseHandler",dragEnabled:"$mouseHandler",focusTimout:"$mouseHandler",tooltipFollowsMouse:"$mouseHandler",firstLineNumber:"session",overwrite:"session",newLineMode:"session",useWorker:"session",useSoftTabs:"session",tabSize:"session",wrap:"session",indentedSoftWrap:"session",foldStyle:"session",mode:"session"}),t.Editor=b}),ace.define("ace/undomanager",["require","exports","module"],function(e,t,n){"use strict";var r=function(){this.reset()};(function(){function e(e){return{action:e.action,start:e.start,end:e.end,lines:e.lines.length==1?null:e.lines,text:e.lines.length==1?e.lines[0]:null}}function t(e){return{action:e.action,start:e.start,end:e.end,lines:e.lines||[e.text]}}function n(e,t){var n=new Array(e.length);for(var r=0;r0},this.hasRedo=function(){return this.$redoStack.length>0},this.markClean=function(){this.dirtyCounter=0},this.isClean=function(){return this.dirtyCounter===0},this.$serializeDeltas=function(t){return n(t,e)},this.$deserializeDeltas=function(e){return n(e,t)}}).call(r.prototype),t.UndoManager=r}),ace.define("ace/layer/gutter",["require","exports","module","ace/lib/dom","ace/lib/oop","ace/lib/lang","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("../lib/dom"),i=e("../lib/oop"),s=e("../lib/lang"),o=e("../lib/event_emitter").EventEmitter,u=function(e){this.element=r.createElement("div"),this.element.className="ace_layer ace_gutter-layer",e.appendChild(this.element),this.setShowFoldWidgets(this.$showFoldWidgets),this.gutterWidth=0,this.$annotations=[],this.$updateAnnotations=this.$updateAnnotations.bind(this),this.$cells=[]};(function(){i.implement(this,o),this.setSession=function(e){this.session&&this.session.removeEventListener("change",this.$updateAnnotations),this.session=e,e&&e.on("change",this.$updateAnnotations)},this.addGutterDecoration=function(e,t){window.console&&console.warn&&console.warn("deprecated use session.addGutterDecoration"),this.session.addGutterDecoration(e,t)},this.removeGutterDecoration=function(e,t){window.console&&console.warn&&console.warn("deprecated use session.removeGutterDecoration"),this.session.removeGutterDecoration(e,t)},this.setAnnotations=function(e){this.$annotations=[];for(var t=0;to&&(v=s.end.row+1,s=t.getNextFoldLine(v,s),o=s?s.start.row:Infinity);if(v>i){while(this.$cells.length>d+1)p=this.$cells.pop(),this.element.removeChild(p.element);break}p=this.$cells[++d],p||(p={element:null,textNode:null,foldWidget:null},p.element=r.createElement("div"),p.textNode=document.createTextNode(""),p.element.appendChild(p.textNode),this.element.appendChild(p.element),this.$cells[d]=p);var m="ace_gutter-cell ";a[v]&&(m+=a[v]),f[v]&&(m+=f[v]),this.$annotations[v]&&(m+=this.$annotations[v].className),p.element.className!=m&&(p.element.className=m);var g=t.getRowLength(v)*e.lineHeight+"px";g!=p.element.style.height&&(p.element.style.height=g);if(u){var y=u[v];y==null&&(y=u[v]=t.getFoldWidget(v))}if(y){p.foldWidget||(p.foldWidget=r.createElement("span"),p.element.appendChild(p.foldWidget));var m="ace_fold-widget ace_"+y;y=="start"&&v==o&&vn.right-t.right)return"foldWidgets"}}).call(u.prototype),t.Gutter=u}),ace.define("ace/layer/marker",["require","exports","module","ace/range","ace/lib/dom"],function(e,t,n){"use strict";var r=e("../range").Range,i=e("../lib/dom"),s=function(e){this.element=i.createElement("div"),this.element.className="ace_layer ace_marker-layer",e.appendChild(this.element)};(function(){function e(e,t,n,r){return(e?1:0)|(t?2:0)|(n?4:0)|(r?8:0)}this.$padding=0,this.setPadding=function(e){this.$padding=e},this.setSession=function(e){this.session=e},this.setMarkers=function(e){this.markers=e},this.update=function(e){var e=e||this.config;if(!e)return;this.config=e;var t=[];for(var n in this.markers){var r=this.markers[n];if(!r.range){r.update(t,this,this.session,e);continue}var i=r.range.clipRows(e.firstRow,e.lastRow);if(i.isEmpty())continue;i=i.toScreenRange(this.session);if(r.renderer){var s=this.$getTop(i.start.row,e),o=this.$padding+i.start.column*e.characterWidth;r.renderer(t,i,o,s,e)}else r.type=="fullLine"?this.drawFullLineMarker(t,i,r.clazz,e):r.type=="screenLine"?this.drawScreenLineMarker(t,i,r.clazz,e):i.isMultiLine()?r.type=="text"?this.drawTextMarker(t,i,r.clazz,e):this.drawMultiLineMarker(t,i,r.clazz,e):this.drawSingleLineMarker(t,i,r.clazz+" ace_start"+" ace_br15",e)}this.element.innerHTML=t.join("")},this.$getTop=function(e,t){return(e-t.firstRowScreen)*t.lineHeight},this.drawTextMarker=function(t,n,i,s,o){var u=this.session,a=n.start.row,f=n.end.row,l=a,c=0,h=0,p=u.getScreenLastRowColumn(l),d=new r(l,n.start.column,l,h);for(;l<=f;l++)d.start.row=d.end.row=l,d.start.column=l==a?n.start.column:u.getRowWrapIndent(l),d.end.column=p,c=h,h=p,p=l+1p,l==f),s,l==f?0:1,o)},this.drawMultiLineMarker=function(e,t,n,r,i){var s=this.$padding,o=r.lineHeight,u=this.$getTop(t.start.row,r),a=s+t.start.column*r.characterWidth;i=i||"",e.push(""),u=this.$getTop(t.end.row,r);var f=t.end.column*r.characterWidth;e.push(""),o=(t.end.row-t.start.row-1)*r.lineHeight;if(o<=0)return;u=this.$getTop(t.start.row+1,r);var l=(t.start.column?1:0)|(t.end.column?0:8);e.push("")},this.drawSingleLineMarker=function(e,t,n,r,i,s){var o=r.lineHeight,u=(t.end.column+(i||0)-t.start.column)*r.characterWidth,a=this.$getTop(t.start.row,r),f=this.$padding+t.start.column*r.characterWidth;e.push("")},this.drawFullLineMarker=function(e,t,n,r,i){var s=this.$getTop(t.start.row,r),o=r.lineHeight;t.start.row!=t.end.row&&(o+=this.$getTop(t.end.row,r)-s),e.push("")},this.drawScreenLineMarker=function(e,t,n,r,i){var s=this.$getTop(t.start.row,r),o=r.lineHeight;e.push("")}}).call(s.prototype),t.Marker=s}),ace.define("ace/layer/text",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/useragent","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/dom"),s=e("../lib/lang"),o=e("../lib/useragent"),u=e("../lib/event_emitter").EventEmitter,a=function(e){this.element=i.createElement("div"),this.element.className="ace_layer ace_text-layer",e.appendChild(this.element),this.$updateEolChar=this.$updateEolChar.bind(this)};(function(){r.implement(this,u),this.EOF_CHAR="\u00b6",this.EOL_CHAR_LF="\u00ac",this.EOL_CHAR_CRLF="\u00a4",this.EOL_CHAR=this.EOL_CHAR_LF,this.TAB_CHAR="\u2014",this.SPACE_CHAR="\u00b7",this.$padding=0,this.$updateEolChar=function(){var e=this.session.doc.getNewLineCharacter()=="\n"?this.EOL_CHAR_LF:this.EOL_CHAR_CRLF;if(this.EOL_CHAR!=e)return this.EOL_CHAR=e,!0},this.setPadding=function(e){this.$padding=e,this.element.style.padding="0 "+e+"px"},this.getLineHeight=function(){return this.$fontMetrics.$characterSize.height||0},this.getCharacterWidth=function(){return this.$fontMetrics.$characterSize.width||0},this.$setFontMetrics=function(e){this.$fontMetrics=e,this.$fontMetrics.on("changeCharacterSize",function(e){this._signal("changeCharacterSize",e)}.bind(this)),this.$pollSizeChanges()},this.checkForSizeChanges=function(){this.$fontMetrics.checkForSizeChanges()},this.$pollSizeChanges=function(){return this.$pollSizeChangesTimer=this.$fontMetrics.$pollSizeChanges()},this.setSession=function(e){this.session=e,e&&this.$computeTabString()},this.showInvisibles=!1,this.setShowInvisibles=function(e){return this.showInvisibles==e?!1:(this.showInvisibles=e,this.$computeTabString(),!0)},this.displayIndentGuides=!0,this.setDisplayIndentGuides=function(e){return this.displayIndentGuides==e?!1:(this.displayIndentGuides=e,this.$computeTabString(),!0)},this.$tabStrings=[],this.onChangeTabSize=this.$computeTabString=function(){var e=this.session.getTabSize();this.tabSize=e;var t=this.$tabStrings=[0];for(var n=1;n"+s.stringRepeat(this.TAB_CHAR,n)+""):t.push(s.stringRepeat(" ",n));if(this.displayIndentGuides){this.$indentGuideRe=/\s\S| \t|\t |\s$/;var r="ace_indent-guide",i="",o="";if(this.showInvisibles){r+=" ace_invisible",i=" ace_invisible_space",o=" ace_invisible_tab";var u=s.stringRepeat(this.SPACE_CHAR,this.tabSize),a=s.stringRepeat(this.TAB_CHAR,this.tabSize)}else var u=s.stringRepeat(" ",this.tabSize),a=u;this.$tabStrings[" "]=""+u+"",this.$tabStrings[" "]=""+a+""}},this.updateLines=function(e,t,n){(this.config.lastRow!=e.lastRow||this.config.firstRow!=e.firstRow)&&this.scrollLines(e),this.config=e;var r=Math.max(t,e.firstRow),i=Math.min(n,e.lastRow),s=this.element.childNodes,o=0;for(var u=e.firstRow;uf&&(u=a.end.row+1,a=this.session.getNextFoldLine(u,a),f=a?a.start.row:Infinity);if(u>i)break;var l=s[o++];if(l){var c=[];this.$renderLine(c,u,!this.$useLineGroups(),u==f?a:!1),l.style.height=e.lineHeight*this.session.getRowLength(u)+"px",l.innerHTML=c.join("")}u++}},this.scrollLines=function(e){var t=this.config;this.config=e;if(!t||t.lastRow0;r--)n.removeChild(n.firstChild);if(t.lastRow>e.lastRow)for(var r=this.session.getFoldedRowCount(e.lastRow+1,t.lastRow);r>0;r--)n.removeChild(n.lastChild);if(e.firstRowt.lastRow){var i=this.$renderLinesFragment(e,t.lastRow+1,e.lastRow);n.appendChild(i)}},this.$renderLinesFragment=function(e,t,n){var r=this.element.ownerDocument.createDocumentFragment(),s=t,o=this.session.getNextFoldLine(s),u=o?o.start.row:Infinity;for(;;){s>u&&(s=o.end.row+1,o=this.session.getNextFoldLine(s,o),u=o?o.start.row:Infinity);if(s>n)break;var a=i.createElement("div"),f=[];this.$renderLine(f,s,!1,s==u?o:!1),a.innerHTML=f.join("");if(this.$useLineGroups())a.className="ace_line_group",r.appendChild(a),a.style.height=e.lineHeight*this.session.getRowLength(s)+"px";else while(a.firstChild)r.appendChild(a.firstChild);s++}return r},this.update=function(e){this.config=e;var t=[],n=e.firstRow,r=e.lastRow,i=n,s=this.session.getNextFoldLine(i),o=s?s.start.row:Infinity;for(;;){i>o&&(i=s.end.row+1,s=this.session.getNextFoldLine(i,s),o=s?s.start.row:Infinity);if(i>r)break;this.$useLineGroups()&&t.push(""),this.$renderLine(t,i,!1,i==o?s:!1),this.$useLineGroups()&&t.push(""),i++}this.element.innerHTML=t.join("")},this.$textToken={text:!0,rparen:!0,lparen:!0},this.$renderToken=function(e,t,n,r){var i=this,o=/\t|&|<|>|( +)|([\x00-\x1f\x80-\xa0\xad\u1680\u180E\u2000-\u200f\u2028\u2029\u202F\u205F\u3000\uFEFF\uFFF9-\uFFFC])|[\u1100-\u115F\u11A3-\u11A7\u11FA-\u11FF\u2329-\u232A\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFB\u3000-\u303E\u3041-\u3096\u3099-\u30FF\u3105-\u312D\u3131-\u318E\u3190-\u31BA\u31C0-\u31E3\u31F0-\u321E\u3220-\u3247\u3250-\u32FE\u3300-\u4DBF\u4E00-\uA48C\uA490-\uA4C6\uA960-\uA97C\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFAFF\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE66\uFE68-\uFE6B\uFF01-\uFF60\uFFE0-\uFFE6]/g,u=function(e,n,r,o,u){if(n)return i.showInvisibles?""+s.stringRepeat(i.SPACE_CHAR,e.length)+"":e;if(e=="&")return"&";if(e=="<")return"<";if(e==">")return">";if(e==" "){var a=i.session.getScreenTabSize(t+o);return t+=a-1,i.$tabStrings[a]}if(e=="\u3000"){var f=i.showInvisibles?"ace_cjk ace_invisible ace_invisible_space":"ace_cjk",l=i.showInvisibles?i.SPACE_CHAR:"";return t+=1,""+l+""}return r?""+i.SPACE_CHAR+"":(t+=1,""+e+"")},a=r.replace(o,u);if(!this.$textToken[n.type]){var f="ace_"+n.type.replace(/\./g," ace_"),l="";n.type=="fold"&&(l=" style='width:"+n.value.length*this.config.characterWidth+"px;' "),e.push("",a,"")}else e.push(a);return t+r.length},this.renderIndentGuide=function(e,t,n){var r=t.search(this.$indentGuideRe);return r<=0||r>=n?t:t[0]==" "?(r-=r%this.tabSize,e.push(s.stringRepeat(this.$tabStrings[" "],r/this.tabSize)),t.substr(r)):t[0]==" "?(e.push(s.stringRepeat(this.$tabStrings[" "],r)),t.substr(r)):t},this.$renderWrappedLine=function(e,t,n,r){var i=0,o=0,u=n[0],a=0;for(var f=0;f=u)a=this.$renderToken(e,a,l,c.substring(0,u-i)),c=c.substring(u-i),i=u,r||e.push("",""),e.push(s.stringRepeat("\u00a0",n.indent)),o++,a=0,u=n[o]||Number.MAX_VALUE;c.length!=0&&(i+=c.length,a=this.$renderToken(e,a,l,c))}}},this.$renderSimpleLine=function(e,t){var n=0,r=t[0],i=r.value;this.displayIndentGuides&&(i=this.renderIndentGuide(e,i)),i&&(n=this.$renderToken(e,n,r,i));for(var s=1;s");if(i.length){var s=this.session.getRowSplitData(t);s&&s.length?this.$renderWrappedLine(e,i,s,n):this.$renderSimpleLine(e,i)}this.showInvisibles&&(r&&(t=r.end.row),e.push("",t==this.session.getLength()-1?this.EOF_CHAR:this.EOL_CHAR,"")),n||e.push(" ")},this.$getFoldLineTokens=function(e,t){function i(e,t,n){var i=0,s=0;while(s+e[i].value.lengthn-t&&(o=o.substring(0,n-t)),r.push({type:e[i].type,value:o}),s=t+o.length,i+=1}while(sn?r.push({type:e[i].type,value:o.substring(0,n-s)}):r.push(e[i]),s+=o.length,i+=1}}var n=this.session,r=[],s=n.getTokens(e);return t.walk(function(e,t,o,u,a){e!=null?r.push({type:"fold",value:e}):(a&&(s=n.getTokens(t)),s.length&&i(s,u,o))},t.end.row,this.session.getLine(t.end.row).length),r},this.$useLineGroups=function(){return this.session.getUseWrapMode()},this.destroy=function(){clearInterval(this.$pollSizeChangesTimer),this.$measureNode&&this.$measureNode.parentNode.removeChild(this.$measureNode),delete this.$measureNode}}).call(a.prototype),t.Text=a}),ace.define("ace/layer/cursor",["require","exports","module","ace/lib/dom"],function(e,t,n){"use strict";var r=e("../lib/dom"),i,s=function(e){this.element=r.createElement("div"),this.element.className="ace_layer ace_cursor-layer",e.appendChild(this.element),i===undefined&&(i=!("opacity"in this.element.style)),this.isVisible=!1,this.isBlinking=!0,this.blinkInterval=1e3,this.smoothBlinking=!1,this.cursors=[],this.cursor=this.addCursor(),r.addCssClass(this.element,"ace_hidden-cursors"),this.$updateCursors=(i?this.$updateVisibility:this.$updateOpacity).bind(this)};(function(){this.$updateVisibility=function(e){var t=this.cursors;for(var n=t.length;n--;)t[n].style.visibility=e?"":"hidden"},this.$updateOpacity=function(e){var t=this.cursors;for(var n=t.length;n--;)t[n].style.opacity=e?"":"0"},this.$padding=0,this.setPadding=function(e){this.$padding=e},this.setSession=function(e){this.session=e},this.setBlinking=function(e){e!=this.isBlinking&&(this.isBlinking=e,this.restartTimer())},this.setBlinkInterval=function(e){e!=this.blinkInterval&&(this.blinkInterval=e,this.restartTimer())},this.setSmoothBlinking=function(e){e!=this.smoothBlinking&&!i&&(this.smoothBlinking=e,r.setCssClass(this.element,"ace_smooth-blinking",e),this.$updateCursors(!0),this.$updateCursors=this.$updateOpacity.bind(this),this.restartTimer())},this.addCursor=function(){var e=r.createElement("div");return e.className="ace_cursor",this.element.appendChild(e),this.cursors.push(e),e},this.removeCursor=function(){if(this.cursors.length>1){var e=this.cursors.pop();return e.parentNode.removeChild(e),e}},this.hideCursor=function(){this.isVisible=!1,r.addCssClass(this.element,"ace_hidden-cursors"),this.restartTimer()},this.showCursor=function(){this.isVisible=!0,r.removeCssClass(this.element,"ace_hidden-cursors"),this.restartTimer()},this.restartTimer=function(){var e=this.$updateCursors;clearInterval(this.intervalId),clearTimeout(this.timeoutId),this.smoothBlinking&&r.removeCssClass(this.element,"ace_smooth-blinking"),e(!0);if(!this.isBlinking||!this.blinkInterval||!this.isVisible)return;this.smoothBlinking&&setTimeout(function(){r.addCssClass(this.element,"ace_smooth-blinking")}.bind(this));var t=function(){this.timeoutId=setTimeout(function(){e(!1)},.6*this.blinkInterval)}.bind(this);this.intervalId=setInterval(function(){e(!0),t()},this.blinkInterval),t()},this.getPixelPosition=function(e,t){if(!this.config||!this.session)return{left:0,top:0};e||(e=this.session.selection.getCursor());var n=this.session.documentToScreenPosition(e),r=this.$padding+n.column*this.config.characterWidth,i=(n.row-(t?this.config.firstRowScreen:0))*this.config.lineHeight;return{left:r,top:i}},this.update=function(e){this.config=e;var t=this.session.$selectionMarkers,n=0,r=0;if(t===undefined||t.length===0)t=[{cursor:null}];for(var n=0,i=t.length;ne.height+e.offset||s.top<0)&&n>1)continue;var o=(this.cursors[r++]||this.addCursor()).style;this.drawCursor?this.drawCursor(o,s,e,t[n],this.session):(o.left=s.left+"px",o.top=s.top+"px",o.width=e.characterWidth+"px",o.height=e.lineHeight+"px")}while(this.cursors.length>r)this.removeCursor();var u=this.session.getOverwrite();this.$setOverwrite(u),this.$pixelPos=s,this.restartTimer()},this.drawCursor=null,this.$setOverwrite=function(e){e!=this.overwrite&&(this.overwrite=e,e?r.addCssClass(this.element,"ace_overwrite-cursors"):r.removeCssClass(this.element,"ace_overwrite-cursors"))},this.destroy=function(){clearInterval(this.intervalId),clearTimeout(this.timeoutId)}}).call(s.prototype),t.Cursor=s}),ace.define("ace/scrollbar",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/event","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./lib/dom"),s=e("./lib/event"),o=e("./lib/event_emitter").EventEmitter,u=function(e){this.element=i.createElement("div"),this.element.className="ace_scrollbar ace_scrollbar"+this.classSuffix,this.inner=i.createElement("div"),this.inner.className="ace_scrollbar-inner",this.element.appendChild(this.inner),e.appendChild(this.element),this.setVisible(!1),this.skipEvent=!1,s.addListener(this.element,"scroll",this.onScroll.bind(this)),s.addListener(this.element,"mousedown",s.preventDefault)};(function(){r.implement(this,o),this.setVisible=function(e){this.element.style.display=e?"":"none",this.isVisible=e}}).call(u.prototype);var a=function(e,t){u.call(this,e),this.scrollTop=0,t.$scrollbarWidth=this.width=i.scrollbarWidth(e.ownerDocument),this.inner.style.width=this.element.style.width=(this.width||15)+5+"px"};r.inherits(a,u),function(){this.classSuffix="-v",this.onScroll=function(){this.skipEvent||(this.scrollTop=this.element.scrollTop,this._emit("scroll",{data:this.scrollTop})),this.skipEvent=!1},this.getWidth=function(){return this.isVisible?this.width:0},this.setHeight=function(e){this.element.style.height=e+"px"},this.setInnerHeight=function(e){this.inner.style.height=e+"px"},this.setScrollHeight=function(e){this.inner.style.height=e+"px"},this.setScrollTop=function(e){this.scrollTop!=e&&(this.skipEvent=!0,this.scrollTop=this.element.scrollTop=e)}}.call(a.prototype);var f=function(e,t){u.call(this,e),this.scrollLeft=0,this.height=t.$scrollbarWidth,this.inner.style.height=this.element.style.height=(this.height||15)+5+"px"};r.inherits(f,u),function(){this.classSuffix="-h",this.onScroll=function(){this.skipEvent||(this.scrollLeft=this.element.scrollLeft,this._emit("scroll",{data:this.scrollLeft})),this.skipEvent=!1},this.getHeight=function(){return this.isVisible?this.height:0},this.setWidth=function(e){this.element.style.width=e+"px"},this.setInnerWidth=function(e){this.inner.style.width=e+"px"},this.setScrollWidth=function(e){this.inner.style.width=e+"px"},this.setScrollLeft=function(e){this.scrollLeft!=e&&(this.skipEvent=!0,this.scrollLeft=this.element.scrollLeft=e)}}.call(f.prototype),t.ScrollBar=a,t.ScrollBarV=a,t.ScrollBarH=f,t.VScrollBar=a,t.HScrollBar=f}),ace.define("ace/renderloop",["require","exports","module","ace/lib/event"],function(e,t,n){"use strict";var r=e("./lib/event"),i=function(e,t){this.onRender=e,this.pending=!1,this.changes=0,this.window=t||window};(function(){this.schedule=function(e){this.changes=this.changes|e;if(!this.pending&&this.changes){this.pending=!0;var t=this;r.nextFrame(function(){t.pending=!1;var e;while(e=t.changes)t.changes=0,t.onRender(e)},this.window)}}}).call(i.prototype),t.RenderLoop=i}),ace.define("ace/layer/font_metrics",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/useragent","ace/lib/event_emitter"],function(e,t,n){var r=e("../lib/oop"),i=e("../lib/dom"),s=e("../lib/lang"),o=e("../lib/useragent"),u=e("../lib/event_emitter").EventEmitter,a=0,f=t.FontMetrics=function(e){this.el=i.createElement("div"),this.$setMeasureNodeStyles(this.el.style,!0),this.$main=i.createElement("div"),this.$setMeasureNodeStyles(this.$main.style),this.$measureNode=i.createElement("div"),this.$setMeasureNodeStyles(this.$measureNode.style),this.el.appendChild(this.$main),this.el.appendChild(this.$measureNode),e.appendChild(this.el),a||this.$testFractionalRect(),this.$measureNode.innerHTML=s.stringRepeat("X",a),this.$characterSize={width:0,height:0},this.checkForSizeChanges()};(function(){r.implement(this,u),this.$characterSize={width:0,height:0},this.$testFractionalRect=function(){var e=i.createElement("div");this.$setMeasureNodeStyles(e.style),e.style.width="0.2px",document.documentElement.appendChild(e);var t=e.getBoundingClientRect().width;t>0&&t<1?a=50:a=100,e.parentNode.removeChild(e)},this.$setMeasureNodeStyles=function(e,t){e.width=e.height="auto",e.left=e.top="0px",e.visibility="hidden",e.position="absolute",e.whiteSpace="pre",o.isIE<8?e["font-family"]="inherit":e.font="inherit",e.overflow=t?"hidden":"visible"},this.checkForSizeChanges=function(){var e=this.$measureSizes();if(e&&(this.$characterSize.width!==e.width||this.$characterSize.height!==e.height)){this.$measureNode.style.fontWeight="bold";var t=this.$measureSizes();this.$measureNode.style.fontWeight="",this.$characterSize=e,this.charSizes=Object.create(null),this.allowBoldFonts=t&&t.width===e.width&&t.height===e.height,this._emit("changeCharacterSize",{data:e})}},this.$pollSizeChanges=function(){if(this.$pollSizeChangesTimer)return this.$pollSizeChangesTimer;var e=this;return this.$pollSizeChangesTimer=setInterval(function(){e.checkForSizeChanges()},500)},this.setPolling=function(e){e?this.$pollSizeChanges():this.$pollSizeChangesTimer&&(clearInterval(this.$pollSizeChangesTimer),this.$pollSizeChangesTimer=0)},this.$measureSizes=function(){if(a===50){var e=null;try{e=this.$measureNode.getBoundingClientRect()}catch(t){e={width:0,height:0}}var n={height:e.height,width:e.width/a}}else var n={height:this.$measureNode.clientHeight,width:this.$measureNode.clientWidth/a};return n.width===0||n.height===0?null:n},this.$measureCharWidth=function(e){this.$main.innerHTML=s.stringRepeat(e,a);var t=this.$main.getBoundingClientRect();return t.width/a},this.getCharacterWidth=function(e){var t=this.charSizes[e];return t===undefined&&(t=this.charSizes[e]=this.$measureCharWidth(e)/this.$characterSize.width),t},this.destroy=function(){clearInterval(this.$pollSizeChangesTimer),this.el&&this.el.parentNode&&this.el.parentNode.removeChild(this.el)}}).call(f.prototype)}),ace.define("ace/virtual_renderer",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/config","ace/lib/useragent","ace/layer/gutter","ace/layer/marker","ace/layer/text","ace/layer/cursor","ace/scrollbar","ace/scrollbar","ace/renderloop","ace/layer/font_metrics","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./lib/dom"),s=e("./config"),o=e("./lib/useragent"),u=e("./layer/gutter").Gutter,a=e("./layer/marker").Marker,f=e("./layer/text").Text,l=e("./layer/cursor").Cursor,c=e("./scrollbar").HScrollBar,h=e("./scrollbar").VScrollBar,p=e("./renderloop").RenderLoop,d=e("./layer/font_metrics").FontMetrics,v=e("./lib/event_emitter").EventEmitter,m='.ace_editor {position: relative;overflow: hidden;font: 12px/normal \'Monaco\', \'Menlo\', \'Ubuntu Mono\', \'Consolas\', \'source-code-pro\', monospace;direction: ltr;}.ace_scroller {position: absolute;overflow: hidden;top: 0;bottom: 0;background-color: inherit;-ms-user-select: none;-moz-user-select: none;-webkit-user-select: none;user-select: none;cursor: text;}.ace_content {position: absolute;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;min-width: 100%;}.ace_dragging .ace_scroller:before{position: absolute;top: 0;left: 0;right: 0;bottom: 0;content: \'\';background: rgba(250, 250, 250, 0.01);z-index: 1000;}.ace_dragging.ace_dark .ace_scroller:before{background: rgba(0, 0, 0, 0.01);}.ace_selecting, .ace_selecting * {cursor: text !important;}.ace_gutter {position: absolute;overflow : hidden;width: auto;top: 0;bottom: 0;left: 0;cursor: default;z-index: 4;-ms-user-select: none;-moz-user-select: none;-webkit-user-select: none;user-select: none;}.ace_gutter-active-line {position: absolute;left: 0;right: 0;}.ace_scroller.ace_scroll-left {box-shadow: 17px 0 16px -16px rgba(0, 0, 0, 0.4) inset;}.ace_gutter-cell {padding-left: 19px;padding-right: 6px;background-repeat: no-repeat;}.ace_gutter-cell.ace_error {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABOFBMVEX/////////QRswFAb/Ui4wFAYwFAYwFAaWGAfDRymzOSH/PxswFAb/SiUwFAYwFAbUPRvjQiDllog5HhHdRybsTi3/Tyv9Tir+Syj/UC3////XurebMBIwFAb/RSHbPx/gUzfdwL3kzMivKBAwFAbbvbnhPx66NhowFAYwFAaZJg8wFAaxKBDZurf/RB6mMxb/SCMwFAYwFAbxQB3+RB4wFAb/Qhy4Oh+4QifbNRcwFAYwFAYwFAb/QRzdNhgwFAYwFAbav7v/Uy7oaE68MBK5LxLewr/r2NXewLswFAaxJw4wFAbkPRy2PyYwFAaxKhLm1tMwFAazPiQwFAaUGAb/QBrfOx3bvrv/VC/maE4wFAbRPBq6MRO8Qynew8Dp2tjfwb0wFAbx6eju5+by6uns4uH9/f36+vr/GkHjAAAAYnRSTlMAGt+64rnWu/bo8eAA4InH3+DwoN7j4eLi4xP99Nfg4+b+/u9B/eDs1MD1mO7+4PHg2MXa347g7vDizMLN4eG+Pv7i5evs/v79yu7S3/DV7/498Yv24eH+4ufQ3Ozu/v7+y13sRqwAAADLSURBVHjaZc/XDsFgGIBhtDrshlitmk2IrbHFqL2pvXf/+78DPokj7+Fz9qpU/9UXJIlhmPaTaQ6QPaz0mm+5gwkgovcV6GZzd5JtCQwgsxoHOvJO15kleRLAnMgHFIESUEPmawB9ngmelTtipwwfASilxOLyiV5UVUyVAfbG0cCPHig+GBkzAENHS0AstVF6bacZIOzgLmxsHbt2OecNgJC83JERmePUYq8ARGkJx6XtFsdddBQgZE2nPR6CICZhawjA4Fb/chv+399kfR+MMMDGOQAAAABJRU5ErkJggg==");background-repeat: no-repeat;background-position: 2px center;}.ace_gutter-cell.ace_warning {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAmVBMVEX///8AAAD///8AAAAAAABPSzb/5sAAAAB/blH/73z/ulkAAAAAAAD85pkAAAAAAAACAgP/vGz/rkDerGbGrV7/pkQICAf////e0IsAAAD/oED/qTvhrnUAAAD/yHD/njcAAADuv2r/nz//oTj/p064oGf/zHAAAAA9Nir/tFIAAAD/tlTiuWf/tkIAAACynXEAAAAAAAAtIRW7zBpBAAAAM3RSTlMAABR1m7RXO8Ln31Z36zT+neXe5OzooRDfn+TZ4p3h2hTf4t3k3ucyrN1K5+Xaks52Sfs9CXgrAAAAjklEQVR42o3PbQ+CIBQFYEwboPhSYgoYunIqqLn6/z8uYdH8Vmdnu9vz4WwXgN/xTPRD2+sgOcZjsge/whXZgUaYYvT8QnuJaUrjrHUQreGczuEafQCO/SJTufTbroWsPgsllVhq3wJEk2jUSzX3CUEDJC84707djRc5MTAQxoLgupWRwW6UB5fS++NV8AbOZgnsC7BpEAAAAABJRU5ErkJggg==");background-position: 2px center;}.ace_gutter-cell.ace_info {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAJ0Uk5TAAB2k804AAAAPklEQVQY02NgIB68QuO3tiLznjAwpKTgNyDbMegwisCHZUETUZV0ZqOquBpXj2rtnpSJT1AEnnRmL2OgGgAAIKkRQap2htgAAAAASUVORK5CYII=");background-position: 2px center;}.ace_dark .ace_gutter-cell.ace_info {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAJFBMVEUAAAChoaGAgIAqKiq+vr6tra1ZWVmUlJSbm5s8PDxubm56enrdgzg3AAAAAXRSTlMAQObYZgAAAClJREFUeNpjYMAPdsMYHegyJZFQBlsUlMFVCWUYKkAZMxZAGdxlDMQBAG+TBP4B6RyJAAAAAElFTkSuQmCC");}.ace_scrollbar {position: absolute;right: 0;bottom: 0;z-index: 6;}.ace_scrollbar-inner {position: absolute;cursor: text;left: 0;top: 0;}.ace_scrollbar-v{overflow-x: hidden;overflow-y: scroll;top: 0;}.ace_scrollbar-h {overflow-x: scroll;overflow-y: hidden;left: 0;}.ace_print-margin {position: absolute;height: 100%;}.ace_text-input {position: absolute;z-index: 0;width: 0.5em;height: 1em;opacity: 0;background: transparent;-moz-appearance: none;appearance: none;border: none;resize: none;outline: none;overflow: hidden;font: inherit;padding: 0 1px;margin: 0 -1px;text-indent: -1em;-ms-user-select: text;-moz-user-select: text;-webkit-user-select: text;user-select: text;white-space: pre!important;}.ace_text-input.ace_composition {background: inherit;color: inherit;z-index: 1000;opacity: 1;text-indent: 0;}.ace_layer {z-index: 1;position: absolute;overflow: hidden;word-wrap: normal;white-space: pre;height: 100%;width: 100%;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;pointer-events: none;}.ace_gutter-layer {position: relative;width: auto;text-align: right;pointer-events: auto;}.ace_text-layer {font: inherit !important;}.ace_cjk {display: inline-block;text-align: center;}.ace_cursor-layer {z-index: 4;}.ace_cursor {z-index: 4;position: absolute;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;border-left: 2px solid;transform: translatez(0);}.ace_slim-cursors .ace_cursor {border-left-width: 1px;}.ace_overwrite-cursors .ace_cursor {border-left-width: 0;border-bottom: 1px solid;}.ace_hidden-cursors .ace_cursor {opacity: 0.2;}.ace_smooth-blinking .ace_cursor {-webkit-transition: opacity 0.18s;transition: opacity 0.18s;}.ace_editor.ace_multiselect .ace_cursor {border-left-width: 1px;}.ace_marker-layer .ace_step, .ace_marker-layer .ace_stack {position: absolute;z-index: 3;}.ace_marker-layer .ace_selection {position: absolute;z-index: 5;}.ace_marker-layer .ace_bracket {position: absolute;z-index: 6;}.ace_marker-layer .ace_active-line {position: absolute;z-index: 2;}.ace_marker-layer .ace_selected-word {position: absolute;z-index: 4;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;}.ace_line .ace_fold {-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;display: inline-block;height: 11px;margin-top: -2px;vertical-align: middle;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII="),url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACJJREFUeNpi+P//fxgTAwPDBxDxD078RSX+YeEyDFMCIMAAI3INmXiwf2YAAAAASUVORK5CYII=");background-repeat: no-repeat, repeat-x;background-position: center center, top left;color: transparent;border: 1px solid black;border-radius: 2px;cursor: pointer;pointer-events: auto;}.ace_dark .ace_fold {}.ace_fold:hover{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII="),url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACBJREFUeNpi+P//fz4TAwPDZxDxD5X4i5fLMEwJgAADAEPVDbjNw87ZAAAAAElFTkSuQmCC");}.ace_tooltip {background-color: #FFF;background-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.1));background-image: linear-gradient(to bottom, transparent, rgba(0, 0, 0, 0.1));border: 1px solid gray;border-radius: 1px;box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);color: black;max-width: 100%;padding: 3px 4px;position: fixed;z-index: 999999;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;cursor: default;white-space: pre;word-wrap: break-word;line-height: normal;font-style: normal;font-weight: normal;letter-spacing: normal;pointer-events: none;}.ace_folding-enabled > .ace_gutter-cell {padding-right: 13px;}.ace_fold-widget {-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;margin: 0 -12px 0 1px;display: none;width: 11px;vertical-align: top;background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg==");background-repeat: no-repeat;background-position: center;border-radius: 3px;border: 1px solid transparent;cursor: pointer;}.ace_folding-enabled .ace_fold-widget {display: inline-block; }.ace_fold-widget.ace_end {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42m3HwQkAMAhD0YzsRchFKI7sAikeWkrxwScEB0nh5e7KTPWimZki4tYfVbX+MNl4pyZXejUO1QAAAABJRU5ErkJggg==");}.ace_fold-widget.ace_closed {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAGCAYAAAAG5SQMAAAAOUlEQVR42jXKwQkAMAgDwKwqKD4EwQ26sSOkVWjgIIHAzPiCgaqiqnJHZnKICBERHN194O5b9vbLuAVRL+l0YWnZAAAAAElFTkSuQmCCXA==");}.ace_fold-widget:hover {border: 1px solid rgba(0, 0, 0, 0.3);background-color: rgba(255, 255, 255, 0.2);box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);}.ace_fold-widget:active {border: 1px solid rgba(0, 0, 0, 0.4);background-color: rgba(0, 0, 0, 0.05);box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);}.ace_dark .ace_fold-widget {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHklEQVQIW2P4//8/AzoGEQ7oGCaLLAhWiSwB146BAQCSTPYocqT0AAAAAElFTkSuQmCC");}.ace_dark .ace_fold-widget.ace_end {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAH0lEQVQIW2P4//8/AxQ7wNjIAjDMgC4AxjCVKBirIAAF0kz2rlhxpAAAAABJRU5ErkJggg==");}.ace_dark .ace_fold-widget.ace_closed {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAFCAYAAACAcVaiAAAAHElEQVQIW2P4//+/AxAzgDADlOOAznHAKgPWAwARji8UIDTfQQAAAABJRU5ErkJggg==");}.ace_dark .ace_fold-widget:hover {box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);background-color: rgba(255, 255, 255, 0.1);}.ace_dark .ace_fold-widget:active {box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);}.ace_fold-widget.ace_invalid {background-color: #FFB4B4;border-color: #DE5555;}.ace_fade-fold-widgets .ace_fold-widget {-webkit-transition: opacity 0.4s ease 0.05s;transition: opacity 0.4s ease 0.05s;opacity: 0;}.ace_fade-fold-widgets:hover .ace_fold-widget {-webkit-transition: opacity 0.05s ease 0.05s;transition: opacity 0.05s ease 0.05s;opacity:1;}.ace_underline {text-decoration: underline;}.ace_bold {font-weight: bold;}.ace_nobold .ace_bold {font-weight: normal;}.ace_italic {font-style: italic;}.ace_error-marker {background-color: rgba(255, 0, 0,0.2);position: absolute;z-index: 9;}.ace_highlight-marker {background-color: rgba(255, 255, 0,0.2);position: absolute;z-index: 8;}.ace_br1 {border-top-left-radius : 3px;}.ace_br2 {border-top-right-radius : 3px;}.ace_br3 {border-top-left-radius : 3px; border-top-right-radius: 3px;}.ace_br4 {border-bottom-right-radius: 3px;}.ace_br5 {border-top-left-radius : 3px; border-bottom-right-radius: 3px;}.ace_br6 {border-top-right-radius : 3px; border-bottom-right-radius: 3px;}.ace_br7 {border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px;}.ace_br8 {border-bottom-left-radius : 3px;}.ace_br9 {border-top-left-radius : 3px; border-bottom-left-radius: 3px;}.ace_br10{border-top-right-radius : 3px; border-bottom-left-radius: 3px;}.ace_br11{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br12{border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br13{border-top-left-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br14{border-top-right-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br15{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}';i.importCssString(m,"ace_editor.css");var g=function(e,t){var n=this;this.container=e||i.createElement("div"),this.$keepTextAreaAtCursor=!o.isOldIE,i.addCssClass(this.container,"ace_editor"),this.setTheme(t),this.$gutter=i.createElement("div"),this.$gutter.className="ace_gutter",this.container.appendChild(this.$gutter),this.scroller=i.createElement("div"),this.scroller.className="ace_scroller",this.container.appendChild(this.scroller),this.content=i.createElement("div"),this.content.className="ace_content",this.scroller.appendChild(this.content),this.$gutterLayer=new u(this.$gutter),this.$gutterLayer.on("changeGutterWidth",this.onGutterResize.bind(this)),this.$markerBack=new a(this.content);var r=this.$textLayer=new f(this.content);this.canvas=r.element,this.$markerFront=new a(this.content),this.$cursorLayer=new l(this.content),this.$horizScroll=!1,this.$vScroll=!1,this.scrollBar=this.scrollBarV=new h(this.container,this),this.scrollBarH=new c(this.container,this),this.scrollBarV.addEventListener("scroll",function(e){n.$scrollAnimation||n.session.setScrollTop(e.data-n.scrollMargin.top)}),this.scrollBarH.addEventListener("scroll",function(e){n.$scrollAnimation||n.session.setScrollLeft(e.data-n.scrollMargin.left)}),this.scrollTop=0,this.scrollLeft=0,this.cursorPos={row:0,column:0},this.$fontMetrics=new d(this.container),this.$textLayer.$setFontMetrics(this.$fontMetrics),this.$textLayer.addEventListener("changeCharacterSize",function(e){n.updateCharacterSize(),n.onResize(!0,n.gutterWidth,n.$size.width,n.$size.height),n._signal("changeCharacterSize",e)}),this.$size={width:0,height:0,scrollerHeight:0,scrollerWidth:0,$dirty:!0},this.layerConfig={width:1,padding:0,firstRow:0,firstRowScreen:0,lastRow:0,lineHeight:0,characterWidth:0,minHeight:1,maxHeight:1,offset:0,height:1,gutterOffset:1},this.scrollMargin={left:0,right:0,top:0,bottom:0,v:0,h:0},this.$loop=new p(this.$renderChanges.bind(this),this.container.ownerDocument.defaultView),this.$loop.schedule(this.CHANGE_FULL),this.updateCharacterSize(),this.setPadding(4),s.resetOptions(this),s._emit("renderer",this)};(function(){this.CHANGE_CURSOR=1,this.CHANGE_MARKER=2,this.CHANGE_GUTTER=4,this.CHANGE_SCROLL=8,this.CHANGE_LINES=16,this.CHANGE_TEXT=32,this.CHANGE_SIZE=64,this.CHANGE_MARKER_BACK=128,this.CHANGE_MARKER_FRONT=256,this.CHANGE_FULL=512,this.CHANGE_H_SCROLL=1024,r.implement(this,v),this.updateCharacterSize=function(){this.$textLayer.allowBoldFonts!=this.$allowBoldFonts&&(this.$allowBoldFonts=this.$textLayer.allowBoldFonts,this.setStyle("ace_nobold",!this.$allowBoldFonts)),this.layerConfig.characterWidth=this.characterWidth=this.$textLayer.getCharacterWidth(),this.layerConfig.lineHeight=this.lineHeight=this.$textLayer.getLineHeight(),this.$updatePrintMargin()},this.setSession=function(e){this.session&&this.session.doc.off("changeNewLineMode",this.onChangeNewLineMode),this.session=e,e&&this.scrollMargin.top&&e.getScrollTop()<=0&&e.setScrollTop(-this.scrollMargin.top),this.$cursorLayer.setSession(e),this.$markerBack.setSession(e),this.$markerFront.setSession(e),this.$gutterLayer.setSession(e),this.$textLayer.setSession(e);if(!e)return;this.$loop.schedule(this.CHANGE_FULL),this.session.$setFontMetrics(this.$fontMetrics),this.onChangeNewLineMode=this.onChangeNewLineMode.bind(this),this.onChangeNewLineMode(),this.session.doc.on("changeNewLineMode",this.onChangeNewLineMode)},this.updateLines=function(e,t,n){t===undefined&&(t=Infinity),this.$changedLines?(this.$changedLines.firstRow>e&&(this.$changedLines.firstRow=e),this.$changedLines.lastRowthis.layerConfig.lastRow)return;this.$loop.schedule(this.CHANGE_LINES)},this.onChangeNewLineMode=function(){this.$loop.schedule(this.CHANGE_TEXT),this.$textLayer.$updateEolChar()},this.onChangeTabSize=function(){this.$loop.schedule(this.CHANGE_TEXT|this.CHANGE_MARKER),this.$textLayer.onChangeTabSize()},this.updateText=function(){this.$loop.schedule(this.CHANGE_TEXT)},this.updateFull=function(e){e?this.$renderChanges(this.CHANGE_FULL,!0):this.$loop.schedule(this.CHANGE_FULL)},this.updateFontSize=function(){this.$textLayer.checkForSizeChanges()},this.$changes=0,this.$updateSizeAsync=function(){this.$loop.pending?this.$size.$dirty=!0:this.onResize()},this.onResize=function(e,t,n,r){if(this.resizing>2)return;this.resizing>0?this.resizing++:this.resizing=e?1:0;var i=this.container;r||(r=i.clientHeight||i.scrollHeight),n||(n=i.clientWidth||i.scrollWidth);var s=this.$updateCachedSize(e,t,n,r);if(!this.$size.scrollerHeight||!n&&!r)return this.resizing=0;e&&(this.$gutterLayer.$padding=null),e?this.$renderChanges(s|this.$changes,!0):this.$loop.schedule(s|this.$changes),this.resizing&&(this.resizing=0),this.scrollBarV.scrollLeft=this.scrollBarV.scrollTop=null},this.$updateCachedSize=function(e,t,n,r){r-=this.$extraHeight||0;var i=0,s=this.$size,o={width:s.width,height:s.height,scrollerHeight:s.scrollerHeight,scrollerWidth:s.scrollerWidth};r&&(e||s.height!=r)&&(s.height=r,i|=this.CHANGE_SIZE,s.scrollerHeight=s.height,this.$horizScroll&&(s.scrollerHeight-=this.scrollBarH.getHeight()),this.scrollBarV.element.style.bottom=this.scrollBarH.getHeight()+"px",i|=this.CHANGE_SCROLL);if(n&&(e||s.width!=n)){i|=this.CHANGE_SIZE,s.width=n,t==null&&(t=this.$showGutter?this.$gutter.offsetWidth:0),this.gutterWidth=t,this.scrollBarH.element.style.left=this.scroller.style.left=t+"px",s.scrollerWidth=Math.max(0,n-t-this.scrollBarV.getWidth()),this.scrollBarH.element.style.right=this.scroller.style.right=this.scrollBarV.getWidth()+"px",this.scroller.style.bottom=this.scrollBarH.getHeight()+"px";if(this.session&&this.session.getUseWrapMode()&&this.adjustWrapLimit()||e)i|=this.CHANGE_FULL}return s.$dirty=!n||!r,i&&this._signal("resize",o),i},this.onGutterResize=function(){var e=this.$showGutter?this.$gutter.offsetWidth:0;e!=this.gutterWidth&&(this.$changes|=this.$updateCachedSize(!0,e,this.$size.width,this.$size.height)),this.session.getUseWrapMode()&&this.adjustWrapLimit()?this.$loop.schedule(this.CHANGE_FULL):this.$size.$dirty?this.$loop.schedule(this.CHANGE_FULL):(this.$computeLayerConfig(),this.$loop.schedule(this.CHANGE_MARKER))},this.adjustWrapLimit=function(){var e=this.$size.scrollerWidth-this.$padding*2,t=Math.floor(e/this.characterWidth);return this.session.adjustWrapLimit(t,this.$showPrintMargin&&this.$printMarginColumn)},this.setAnimatedScroll=function(e){this.setOption("animatedScroll",e)},this.getAnimatedScroll=function(){return this.$animatedScroll},this.setShowInvisibles=function(e){this.setOption("showInvisibles",e)},this.getShowInvisibles=function(){return this.getOption("showInvisibles")},this.getDisplayIndentGuides=function(){return this.getOption("displayIndentGuides")},this.setDisplayIndentGuides=function(e){this.setOption("displayIndentGuides",e)},this.setShowPrintMargin=function(e){this.setOption("showPrintMargin",e)},this.getShowPrintMargin=function(){return this.getOption("showPrintMargin")},this.setPrintMarginColumn=function(e){this.setOption("printMarginColumn",e)},this.getPrintMarginColumn=function(){return this.getOption("printMarginColumn")},this.getShowGutter=function(){return this.getOption("showGutter")},this.setShowGutter=function(e){return this.setOption("showGutter",e)},this.getFadeFoldWidgets=function(){return this.getOption("fadeFoldWidgets")},this.setFadeFoldWidgets=function(e){this.setOption("fadeFoldWidgets",e)},this.setHighlightGutterLine=function(e){this.setOption("highlightGutterLine",e)},this.getHighlightGutterLine=function(){return this.getOption("highlightGutterLine")},this.$updateGutterLineHighlight=function(){var e=this.$cursorLayer.$pixelPos,t=this.layerConfig.lineHeight;if(this.session.getUseWrapMode()){var n=this.session.selection.getCursor();n.column=0,e=this.$cursorLayer.getPixelPosition(n,!0),t*=this.session.getRowLength(n.row)}this.$gutterLineHighlight.style.top=e.top-this.layerConfig.offset+"px",this.$gutterLineHighlight.style.height=t+"px"},this.$updatePrintMargin=function(){if(!this.$showPrintMargin&&!this.$printMarginEl)return;if(!this.$printMarginEl){var e=i.createElement("div");e.className="ace_layer ace_print-margin-layer",this.$printMarginEl=i.createElement("div"),this.$printMarginEl.className="ace_print-margin",e.appendChild(this.$printMarginEl),this.content.insertBefore(e,this.content.firstChild)}var t=this.$printMarginEl.style;t.left=this.characterWidth*this.$printMarginColumn+this.$padding+"px",t.visibility=this.$showPrintMargin?"visible":"hidden",this.session&&this.session.$wrap==-1&&this.adjustWrapLimit()},this.getContainerElement=function(){return this.container},this.getMouseEventTarget=function(){return this.scroller},this.getTextAreaContainer=function(){return this.container},this.$moveTextAreaToCursor=function(){if(!this.$keepTextAreaAtCursor)return;var e=this.layerConfig,t=this.$cursorLayer.$pixelPos.top,n=this.$cursorLayer.$pixelPos.left;t-=e.offset;var r=this.textarea.style,i=this.lineHeight;if(t<0||t>e.height-i){r.top=r.left="0";return}var s=this.characterWidth;if(this.$composition){var o=this.textarea.value.replace(/^\x01+/,"");s*=this.session.$getStringScreenWidth(o)[0]+2,i+=2}n-=this.scrollLeft,n>this.$size.scrollerWidth-s&&(n=this.$size.scrollerWidth-s),n+=this.gutterWidth,r.height=i+"px",r.width=s+"px",r.left=Math.min(n,this.$size.scrollerWidth-s)+"px",r.top=Math.min(t,this.$size.height-i)+"px"},this.getFirstVisibleRow=function(){return this.layerConfig.firstRow},this.getFirstFullyVisibleRow=function(){return this.layerConfig.firstRow+(this.layerConfig.offset===0?0:1)},this.getLastFullyVisibleRow=function(){var e=this.layerConfig,t=e.lastRow,n=this.session.documentToScreenRow(t,0)*e.lineHeight;return n-this.session.getScrollTop()>e.height-e.lineHeight?t-1:t},this.getLastVisibleRow=function(){return this.layerConfig.lastRow},this.$padding=null,this.setPadding=function(e){this.$padding=e,this.$textLayer.setPadding(e),this.$cursorLayer.setPadding(e),this.$markerFront.setPadding(e),this.$markerBack.setPadding(e),this.$loop.schedule(this.CHANGE_FULL),this.$updatePrintMargin()},this.setScrollMargin=function(e,t,n,r){var i=this.scrollMargin;i.top=e|0,i.bottom=t|0,i.right=r|0,i.left=n|0,i.v=i.top+i.bottom,i.h=i.left+i.right,i.top&&this.scrollTop<=0&&this.session&&this.session.setScrollTop(-i.top),this.updateFull()},this.getHScrollBarAlwaysVisible=function(){return this.$hScrollBarAlwaysVisible},this.setHScrollBarAlwaysVisible=function(e){this.setOption("hScrollBarAlwaysVisible",e)},this.getVScrollBarAlwaysVisible=function(){return this.$vScrollBarAlwaysVisible},this.setVScrollBarAlwaysVisible=function(e){this.setOption("vScrollBarAlwaysVisible",e)},this.$updateScrollBarV=function(){var e=this.layerConfig.maxHeight,t=this.$size.scrollerHeight;!this.$maxLines&&this.$scrollPastEnd&&(e-=(t-this.lineHeight)*this.$scrollPastEnd,this.scrollTop>e-t&&(e=this.scrollTop+t,this.scrollBarV.scrollTop=null)),this.scrollBarV.setScrollHeight(e+this.scrollMargin.v),this.scrollBarV.setScrollTop(this.scrollTop+this.scrollMargin.top)},this.$updateScrollBarH=function(){this.scrollBarH.setScrollWidth(this.layerConfig.width+2*this.$padding+this.scrollMargin.h),this.scrollBarH.setScrollLeft(this.scrollLeft+this.scrollMargin.left)},this.$frozen=!1,this.freeze=function(){this.$frozen=!0},this.unfreeze=function(){this.$frozen=!1},this.$renderChanges=function(e,t){this.$changes&&(e|=this.$changes,this.$changes=0);if(!this.session||!this.container.offsetWidth||this.$frozen||!e&&!t){this.$changes|=e;return}if(this.$size.$dirty)return this.$changes|=e,this.onResize(!0);this.lineHeight||this.$textLayer.checkForSizeChanges(),this._signal("beforeRender");var n=this.layerConfig;if(e&this.CHANGE_FULL||e&this.CHANGE_SIZE||e&this.CHANGE_TEXT||e&this.CHANGE_LINES||e&this.CHANGE_SCROLL||e&this.CHANGE_H_SCROLL){e|=this.$computeLayerConfig();if(n.firstRow!=this.layerConfig.firstRow&&n.firstRowScreen==this.layerConfig.firstRowScreen){var r=this.scrollTop+(n.firstRow-this.layerConfig.firstRow)*this.lineHeight;r>0&&(this.scrollTop=r,e|=this.CHANGE_SCROLL,e|=this.$computeLayerConfig())}n=this.layerConfig,this.$updateScrollBarV(),e&this.CHANGE_H_SCROLL&&this.$updateScrollBarH(),this.$gutterLayer.element.style.marginTop=-n.offset+"px",this.content.style.marginTop=-n.offset+"px",this.content.style.width=n.width+2*this.$padding+"px",this.content.style.height=n.minHeight+"px"}e&this.CHANGE_H_SCROLL&&(this.content.style.marginLeft=-this.scrollLeft+"px",this.scroller.className=this.scrollLeft<=0?"ace_scroller":"ace_scroller ace_scroll-left");if(e&this.CHANGE_FULL){this.$textLayer.update(n),this.$showGutter&&this.$gutterLayer.update(n),this.$markerBack.update(n),this.$markerFront.update(n),this.$cursorLayer.update(n),this.$moveTextAreaToCursor(),this.$highlightGutterLine&&this.$updateGutterLineHighlight(),this._signal("afterRender");return}if(e&this.CHANGE_SCROLL){e&this.CHANGE_TEXT||e&this.CHANGE_LINES?this.$textLayer.update(n):this.$textLayer.scrollLines(n),this.$showGutter&&this.$gutterLayer.update(n),this.$markerBack.update(n),this.$markerFront.update(n),this.$cursorLayer.update(n),this.$highlightGutterLine&&this.$updateGutterLineHighlight(),this.$moveTextAreaToCursor(),this._signal("afterRender");return}e&this.CHANGE_TEXT?(this.$textLayer.update(n),this.$showGutter&&this.$gutterLayer.update(n)):e&this.CHANGE_LINES?(this.$updateLines()||e&this.CHANGE_GUTTER&&this.$showGutter)&&this.$gutterLayer.update(n):(e&this.CHANGE_TEXT||e&this.CHANGE_GUTTER)&&this.$showGutter&&this.$gutterLayer.update(n),e&this.CHANGE_CURSOR&&(this.$cursorLayer.update(n),this.$moveTextAreaToCursor(),this.$highlightGutterLine&&this.$updateGutterLineHighlight()),e&(this.CHANGE_MARKER|this.CHANGE_MARKER_FRONT)&&this.$markerFront.update(n),e&(this.CHANGE_MARKER|this.CHANGE_MARKER_BACK)&&this.$markerBack.update(n),this._signal("afterRender")},this.$autosize=function(){var e=this.session.getScreenLength()*this.lineHeight,t=this.$maxLines*this.lineHeight,n=Math.min(t,Math.max((this.$minLines||1)*this.lineHeight,e))+this.scrollMargin.v+(this.$extraHeight||0);this.$horizScroll&&(n+=this.scrollBarH.getHeight()),this.$maxPixelHeight&&n>this.$maxPixelHeight&&(n=this.$maxPixelHeight);var r=e>t;if(n!=this.desiredHeight||this.$size.height!=this.desiredHeight||r!=this.$vScroll){r!=this.$vScroll&&(this.$vScroll=r,this.scrollBarV.setVisible(r));var i=this.container.clientWidth;this.container.style.height=n+"px",this.$updateCachedSize(!0,this.$gutterWidth,i,n),this.desiredHeight=n,this._signal("autosize")}},this.$computeLayerConfig=function(){var e=this.session,t=this.$size,n=t.height<=2*this.lineHeight,r=this.session.getScreenLength(),i=r*this.lineHeight,s=this.$getLongestLine(),o=!n&&(this.$hScrollBarAlwaysVisible||t.scrollerWidth-s-2*this.$padding<0),u=this.$horizScroll!==o;u&&(this.$horizScroll=o,this.scrollBarH.setVisible(o));var a=this.$vScroll;this.$maxLines&&this.lineHeight>1&&this.$autosize();var f=this.scrollTop%this.lineHeight,l=t.scrollerHeight+this.lineHeight,c=!this.$maxLines&&this.$scrollPastEnd?(t.scrollerHeight-this.lineHeight)*this.$scrollPastEnd:0;i+=c;var h=this.scrollMargin;this.session.setScrollTop(Math.max(-h.top,Math.min(this.scrollTop,i-t.scrollerHeight+h.bottom))),this.session.setScrollLeft(Math.max(-h.left,Math.min(this.scrollLeft,s+2*this.$padding-t.scrollerWidth+h.right)));var p=!n&&(this.$vScrollBarAlwaysVisible||t.scrollerHeight-i+c<0||this.scrollTop>h.top),d=a!==p;d&&(this.$vScroll=p,this.scrollBarV.setVisible(p));var v=Math.ceil(l/this.lineHeight)-1,m=Math.max(0,Math.round((this.scrollTop-f)/this.lineHeight)),g=m+v,y,b,w=this.lineHeight;m=e.screenToDocumentRow(m,0);var E=e.getFoldLine(m);E&&(m=E.start.row),y=e.documentToScreenRow(m,0),b=e.getRowLength(m)*w,g=Math.min(e.screenToDocumentRow(g,0),e.getLength()-1),l=t.scrollerHeight+e.getRowLength(g)*w+b,f=this.scrollTop-y*w;var S=0;this.layerConfig.width!=s&&(S=this.CHANGE_H_SCROLL);if(u||d)S=this.$updateCachedSize(!0,this.gutterWidth,t.width,t.height),this._signal("scrollbarVisibilityChanged"),d&&(s=this.$getLongestLine());return this.layerConfig={width:s,padding:this.$padding,firstRow:m,firstRowScreen:y,lastRow:g,lineHeight:w,characterWidth:this.characterWidth,minHeight:l,maxHeight:i,offset:f,gutterOffset:Math.max(0,Math.ceil((f+t.height-t.scrollerHeight)/w)),height:this.$size.scrollerHeight},S},this.$updateLines=function(){var e=this.$changedLines.firstRow,t=this.$changedLines.lastRow;this.$changedLines=null;var n=this.layerConfig;if(e>n.lastRow+1)return;if(ts?(t&&a+o>s+this.lineHeight&&(s-=t*this.$size.scrollerHeight),s===0&&(s=-this.scrollMargin.top),this.session.setScrollTop(s)):a+this.$size.scrollerHeight-ui?(i=1-this.scrollMargin.top)return!0;if(t>0&&this.session.getScrollTop()+this.$size.scrollerHeight-this.layerConfig.maxHeight<-1+this.scrollMargin.bottom)return!0;if(e<0&&this.session.getScrollLeft()>=1-this.scrollMargin.left)return!0;if(e>0&&this.session.getScrollLeft()+this.$size.scrollerWidth-this.layerConfig.width<-1+this.scrollMargin.right)return!0},this.pixelToScreenCoordinates=function(e,t){var n=this.scroller.getBoundingClientRect(),r=(e+this.scrollLeft-n.left-this.$padding)/this.characterWidth,i=Math.floor((t+this.scrollTop-n.top)/this.lineHeight),s=Math.round(r);return{row:i,column:s,side:r-s>0?1:-1}},this.screenToTextCoordinates=function(e,t){var n=this.scroller.getBoundingClientRect(),r=Math.round((e+this.scrollLeft-n.left-this.$padding)/this.characterWidth),i=(t+this.scrollTop-n.top)/this.lineHeight;return this.session.screenToDocumentPosition(i,Math.max(r,0))},this.textToScreenCoordinates=function(e,t){var n=this.scroller.getBoundingClientRect(),r=this.session.documentToScreenPosition(e,t),i=this.$padding+Math.round(r.column*this.characterWidth),s=r.row*this.lineHeight;return{pageX:n.left+i-this.scrollLeft,pageY:n.top+s-this.scrollTop}},this.visualizeFocus=function(){i.addCssClass(this.container,"ace_focus")},this.visualizeBlur=function(){i.removeCssClass(this.container,"ace_focus")},this.showComposition=function(e){this.$composition||(this.$composition={keepTextAreaAtCursor:this.$keepTextAreaAtCursor,cssText:this.textarea.style.cssText}),this.$keepTextAreaAtCursor=!0,i.addCssClass(this.textarea,"ace_composition"),this.textarea.style.cssText="",this.$moveTextAreaToCursor()},this.setCompositionText=function(e){this.$moveTextAreaToCursor()},this.hideComposition=function(){if(!this.$composition)return;i.removeCssClass(this.textarea,"ace_composition"),this.$keepTextAreaAtCursor=this.$composition.keepTextAreaAtCursor,this.textarea.style.cssText=this.$composition.cssText,this.$composition=null},this.setTheme=function(e,t){function o(r){if(n.$themeId!=e)return t&&t();if(!r.cssClass)return;i.importCssString(r.cssText,r.cssClass,n.container.ownerDocument),n.theme&&i.removeCssClass(n.container,n.theme.cssClass);var s="padding"in r?r.padding:"padding"in(n.theme||{})?4:n.$padding;n.$padding&&s!=n.$padding&&n.setPadding(s),n.$theme=r.cssClass,n.theme=r,i.addCssClass(n.container,r.cssClass),i.setCssClass(n.container,"ace_dark",r.isDark),n.$size&&(n.$size.width=0,n.$updateSizeAsync()),n._dispatchEvent("themeLoaded",{theme:r}),t&&t()}var n=this;this.$themeId=e,n._dispatchEvent("themeChange",{theme:e});if(!e||typeof e=="string"){var r=e||this.$options.theme.initialValue;s.loadModule(["theme",r],o)}else o(e)},this.getTheme=function(){return this.$themeId},this.setStyle=function(e,t){i.setCssClass(this.container,e,t!==!1)},this.unsetStyle=function(e){i.removeCssClass(this.container,e)},this.setCursorStyle=function(e){this.scroller.style.cursor!=e&&(this.scroller.style.cursor=e)},this.setMouseCursor=function(e){this.scroller.style.cursor=e},this.destroy=function(){this.$textLayer.destroy(),this.$cursorLayer.destroy()}}).call(g.prototype),s.defineOptions(g.prototype,"renderer",{animatedScroll:{initialValue:!1},showInvisibles:{set:function(e){this.$textLayer.setShowInvisibles(e)&&this.$loop.schedule(this.CHANGE_TEXT)},initialValue:!1},showPrintMargin:{set:function(){this.$updatePrintMargin()},initialValue:!0},printMarginColumn:{set:function(){this.$updatePrintMargin()},initialValue:80},printMargin:{set:function(e){typeof e=="number"&&(this.$printMarginColumn=e),this.$showPrintMargin=!!e,this.$updatePrintMargin()},get:function(){return this.$showPrintMargin&&this.$printMarginColumn}},showGutter:{set:function(e){this.$gutter.style.display=e?"block":"none",this.$loop.schedule(this.CHANGE_FULL),this.onGutterResize()},initialValue:!0},fadeFoldWidgets:{set:function(e){i.setCssClass(this.$gutter,"ace_fade-fold-widgets",e)},initialValue:!1},showFoldWidgets:{set:function(e){this.$gutterLayer.setShowFoldWidgets(e)},initialValue:!0},showLineNumbers:{set:function(e){this.$gutterLayer.setShowLineNumbers(e),this.$loop.schedule(this.CHANGE_GUTTER)},initialValue:!0},displayIndentGuides:{set:function(e){this.$textLayer.setDisplayIndentGuides(e)&&this.$loop.schedule(this.CHANGE_TEXT)},initialValue:!0},highlightGutterLine:{set:function(e){if(!this.$gutterLineHighlight){this.$gutterLineHighlight=i.createElement("div"),this.$gutterLineHighlight.className="ace_gutter-active-line",this.$gutter.appendChild(this.$gutterLineHighlight);return}this.$gutterLineHighlight.style.display=e?"":"none",this.$cursorLayer.$pixelPos&&this.$updateGutterLineHighlight()},initialValue:!1,value:!0},hScrollBarAlwaysVisible:{set:function(e){(!this.$hScrollBarAlwaysVisible||!this.$horizScroll)&&this.$loop.schedule(this.CHANGE_SCROLL)},initialValue:!1},vScrollBarAlwaysVisible:{set:function(e){(!this.$vScrollBarAlwaysVisible||!this.$vScroll)&&this.$loop.schedule(this.CHANGE_SCROLL)},initialValue:!1},fontSize:{set:function(e){typeof e=="number"&&(e+="px"),this.container.style.fontSize=e,this.updateFontSize()},initialValue:12},fontFamily:{set:function(e){this.container.style.fontFamily=e,this.updateFontSize()}},maxLines:{set:function(e){this.updateFull()}},minLines:{set:function(e){this.updateFull()}},maxPixelHeight:{set:function(e){this.updateFull()},initialValue:0},scrollPastEnd:{set:function(e){e=+e||0;if(this.$scrollPastEnd==e)return;this.$scrollPastEnd=e,this.$loop.schedule(this.CHANGE_SCROLL)},initialValue:0,handlesSet:!0},fixedWidthGutter:{set:function(e){this.$gutterLayer.$fixedWidth=!!e,this.$loop.schedule(this.CHANGE_GUTTER)}},theme:{set:function(e){this.setTheme(e)},get:function(){return this.$themeId||this.theme},initialValue:"./theme/textmate",handlesSet:!0}}),t.VirtualRenderer=g}),ace.define("ace/worker/worker_client",["require","exports","module","ace/lib/oop","ace/lib/net","ace/lib/event_emitter","ace/config"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/net"),s=e("../lib/event_emitter").EventEmitter,o=e("../config"),u=function(t,n,r,i){this.$sendDeltaQueue=this.$sendDeltaQueue.bind(this),this.changeListener=this.changeListener.bind(this),this.onMessage=this.onMessage.bind(this),e.nameToUrl&&!e.toUrl&&(e.toUrl=e.nameToUrl);if(o.get("packaged")||!e.toUrl)i=i||o.moduleUrl(n,"worker");else{var s=this.$normalizePath;i=i||s(e.toUrl("ace/worker/worker.js",null,"_"));var u={};t.forEach(function(t){u[t]=s(e.toUrl(t,null,"_").replace(/(\.js)?(\?.*)?$/,""))})}try{this.$worker=new Worker(i)}catch(a){if(!(a instanceof window.DOMException))throw a;var f=this.$workerBlob(i),l=window.URL||window.webkitURL,c=l.createObjectURL(f);this.$worker=new Worker(c),l.revokeObjectURL(c)}this.$worker.postMessage({init:!0,tlns:u,module:n,classname:r}),this.callbackId=1,this.callbacks={},this.$worker.onmessage=this.onMessage};(function(){r.implement(this,s),this.onMessage=function(e){var t=e.data;switch(t.type){case"event":this._signal(t.name,{data:t.data});break;case"call":var n=this.callbacks[t.id];n&&(n(t.data),delete this.callbacks[t.id]);break;case"error":this.reportError(t.data);break;case"log":window.console&&console.log&&console.log.apply(console,t.data)}},this.reportError=function(e){window.console&&console.error&&console.error(e)},this.$normalizePath=function(e){return i.qualifyURL(e)},this.terminate=function(){this._signal("terminate",{}),this.deltaQueue=null,this.$worker.terminate(),this.$worker=null,this.$doc&&this.$doc.off("change",this.changeListener),this.$doc=null},this.send=function(e,t){this.$worker.postMessage({command:e,args:t})},this.call=function(e,t,n){if(n){var r=this.callbackId++;this.callbacks[r]=n,t.push(r)}this.send(e,t)},this.emit=function(e,t){try{this.$worker.postMessage({event:e,data:{data:t.data}})}catch(n){console.error(n.stack)}},this.attachToDocument=function(e){this.$doc&&this.terminate(),this.$doc=e,this.call("setValue",[e.getValue()]),e.on("change",this.changeListener)},this.changeListener=function(e){this.deltaQueue||(this.deltaQueue=[],setTimeout(this.$sendDeltaQueue,0)),e.action=="insert"?this.deltaQueue.push(e.start,e.lines):this.deltaQueue.push(e.start,e.end)},this.$sendDeltaQueue=function(){var e=this.deltaQueue;if(!e)return;this.deltaQueue=null,e.length>50&&e.length>this.$doc.getLength()>>1?this.call("setValue",[this.$doc.getValue()]):this.emit("change",{data:e})},this.$workerBlob=function(e){var t="importScripts('"+i.qualifyURL(e)+"');";try{return new Blob([t],{type:"application/javascript"})}catch(n){var r=window.BlobBuilder||window.WebKitBlobBuilder||window.MozBlobBuilder,s=new r;return s.append(t),s.getBlob("application/javascript")}}}).call(u.prototype);var a=function(e,t,n){this.$sendDeltaQueue=this.$sendDeltaQueue.bind(this),this.changeListener=this.changeListener.bind(this),this.callbackId=1,this.callbacks={},this.messageBuffer=[];var r=null,i=!1,u=Object.create(s),a=this;this.$worker={},this.$worker.terminate=function(){},this.$worker.postMessage=function(e){a.messageBuffer.push(e),r&&(i?setTimeout(f):f())},this.setEmitSync=function(e){i=e};var f=function(){var e=a.messageBuffer.shift();e.command?r[e.command].apply(r,e.args):e.event&&u._signal(e.event,e.data)};u.postMessage=function(e){a.onMessage({data:e})},u.callback=function(e,t){this.postMessage({type:"call",id:t,data:e})},u.emit=function(e,t){this.postMessage({type:"event",name:e,data:t})},o.loadModule(["worker",t],function(e){r=new e[n](u);while(a.messageBuffer.length)f()})};a.prototype=u.prototype,t.UIWorkerClient=a,t.WorkerClient=u}),ace.define("ace/placeholder",["require","exports","module","ace/range","ace/lib/event_emitter","ace/lib/oop"],function(e,t,n){"use strict";var r=e("./range").Range,i=e("./lib/event_emitter").EventEmitter,s=e("./lib/oop"),o=function(e,t,n,r,i,s){var o=this;this.length=t,this.session=e,this.doc=e.getDocument(),this.mainClass=i,this.othersClass=s,this.$onUpdate=this.onUpdate.bind(this),this.doc.on("change",this.$onUpdate),this.$others=r,this.$onCursorChange=function(){setTimeout(function(){o.onCursorChange()})},this.$pos=n;var u=e.getUndoManager().$undoStack||e.getUndoManager().$undostack||{length:-1};this.$undoStackDepth=u.length,this.setup(),e.selection.on("changeCursor",this.$onCursorChange)};(function(){s.implement(this,i),this.setup=function(){var e=this,t=this.doc,n=this.session;this.selectionBefore=n.selection.toJSON(),n.selection.inMultiSelectMode&&n.selection.toSingleRange(),this.pos=t.createAnchor(this.$pos.row,this.$pos.column);var i=this.pos;i.$insertRight=!0,i.detach(),i.markerId=n.addMarker(new r(i.row,i.column,i.row,i.column+this.length),this.mainClass,null,!1),this.others=[],this.$others.forEach(function(n){var r=t.createAnchor(n.row,n.column);r.$insertRight=!0,r.detach(),e.others.push(r)}),n.setUndoSelect(!1)},this.showOtherMarkers=function(){if(this.othersActive)return;var e=this.session,t=this;this.othersActive=!0,this.others.forEach(function(n){n.markerId=e.addMarker(new r(n.row,n.column,n.row,n.column+t.length),t.othersClass,null,!1)})},this.hideOtherMarkers=function(){if(!this.othersActive)return;this.othersActive=!1;for(var e=0;e=this.pos.column&&t.start.column<=this.pos.column+this.length+1,s=t.start.column-this.pos.column;this.updateAnchors(e),i&&(this.length+=n);if(i&&!this.session.$fromUndo)if(e.action==="insert")for(var o=this.others.length-1;o>=0;o--){var u=this.others[o],a={row:u.row,column:u.column+s};this.doc.insertMergedLines(a,e.lines)}else if(e.action==="remove")for(var o=this.others.length-1;o>=0;o--){var u=this.others[o],a={row:u.row,column:u.column+s};this.doc.remove(new r(a.row,a.column,a.row,a.column-n))}this.$updating=!1,this.updateMarkers()},this.updateAnchors=function(e){this.pos.onChange(e);for(var t=this.others.length;t--;)this.others[t].onChange(e);this.updateMarkers()},this.updateMarkers=function(){if(this.$updating)return;var e=this,t=this.session,n=function(n,i){t.removeMarker(n.markerId),n.markerId=t.addMarker(new r(n.row,n.column,n.row,n.column+e.length),i,null,!1)};n(this.pos,this.mainClass);for(var i=this.others.length;i--;)n(this.others[i],this.othersClass)},this.onCursorChange=function(e){if(this.$updating||!this.session)return;var t=this.session.selection.getCursor();t.row===this.pos.row&&t.column>=this.pos.column&&t.column<=this.pos.column+this.length?(this.showOtherMarkers(),this._emit("cursorEnter",e)):(this.hideOtherMarkers(),this._emit("cursorLeave",e))},this.detach=function(){this.session.removeMarker(this.pos&&this.pos.markerId),this.hideOtherMarkers(),this.doc.removeEventListener("change",this.$onUpdate),this.session.selection.removeEventListener("changeCursor",this.$onCursorChange),this.session.setUndoSelect(!0),this.session=null},this.cancel=function(){if(this.$undoStackDepth===-1)return;var e=this.session.getUndoManager(),t=(e.$undoStack||e.$undostack).length-this.$undoStackDepth;for(var n=0;n1&&!this.inMultiSelectMode&&(this._signal("multiSelect"),this.inMultiSelectMode=!0,this.session.$undoSelect=!1,this.rangeList.attach(this.session)),t||this.fromOrientedRange(e)},this.toSingleRange=function(e){e=e||this.ranges[0];var t=this.rangeList.removeAll();t.length&&this.$onRemoveRange(t),e&&this.fromOrientedRange(e)},this.substractPoint=function(e){var t=this.rangeList.substractPoint(e);if(t)return this.$onRemoveRange(t),t[0]},this.mergeOverlappingRanges=function(){var e=this.rangeList.merge();e.length?this.$onRemoveRange(e):this.ranges[0]&&this.fromOrientedRange(this.ranges[0])},this.$onAddRange=function(e){this.rangeCount=this.rangeList.ranges.length,this.ranges.unshift(e),this._signal("addRange",{range:e})},this.$onRemoveRange=function(e){this.rangeCount=this.rangeList.ranges.length;if(this.rangeCount==1&&this.inMultiSelectMode){var t=this.rangeList.ranges.pop();e.push(t),this.rangeCount=0}for(var n=e.length;n--;){var r=this.ranges.indexOf(e[n]);this.ranges.splice(r,1)}this._signal("removeRange",{ranges:e}),this.rangeCount===0&&this.inMultiSelectMode&&(this.inMultiSelectMode=!1,this._signal("singleSelect"),this.session.$undoSelect=!0,this.rangeList.detach(this.session)),t=t||this.ranges[0],t&&!t.isEqual(this.getRange())&&this.fromOrientedRange(t)},this.$initRangeList=function(){if(this.rangeList)return;this.rangeList=new r,this.ranges=[],this.rangeCount=0},this.getAllRanges=function(){return this.rangeCount?this.rangeList.ranges.concat():[this.getRange()]},this.splitIntoLines=function(){if(this.rangeCount>1){var e=this.rangeList.ranges,t=e[e.length-1],n=i.fromPoints(e[0].start,t.end);this.toSingleRange(),this.setSelectionRange(n,t.cursor==t.start)}else{var n=this.getRange(),r=this.isBackwards(),s=n.start.row,o=n.end.row;if(s==o){if(r)var u=n.end,a=n.start;else var u=n.start,a=n.end;this.addRange(i.fromPoints(a,a)),this.addRange(i.fromPoints(u,u));return}var f=[],l=this.getLineRange(s,!0);l.start.column=n.start.column,f.push(l);for(var c=s+1;c1){var e=this.rangeList.ranges,t=e[e.length-1],n=i.fromPoints(e[0].start,t.end);this.toSingleRange(),this.setSelectionRange(n,t.cursor==t.start)}else{var r=this.session.documentToScreenPosition(this.selectionLead),s=this.session.documentToScreenPosition(this.selectionAnchor),o=this.rectangularRangeBlock(r,s);o.forEach(this.addRange,this)}},this.rectangularRangeBlock=function(e,t,n){var r=[],s=e.column0)d--;if(d>0){var m=0;while(r[m].isEmpty())m++}for(var g=d;g>=m;g--)r[g].isEmpty()&&r.splice(g,1)}return r}}.call(s.prototype);var d=e("./editor").Editor;(function(){this.updateSelectionMarkers=function(){this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.addSelectionMarker=function(e){e.cursor||(e.cursor=e.end);var t=this.getSelectionStyle();return e.marker=this.session.addMarker(e,"ace_selection",t),this.session.$selectionMarkers.push(e),this.session.selectionMarkerCount=this.session.$selectionMarkers.length,e},this.removeSelectionMarker=function(e){if(!e.marker)return;this.session.removeMarker(e.marker);var t=this.session.$selectionMarkers.indexOf(e);t!=-1&&this.session.$selectionMarkers.splice(t,1),this.session.selectionMarkerCount=this.session.$selectionMarkers.length},this.removeSelectionMarkers=function(e){var t=this.session.$selectionMarkers;for(var n=e.length;n--;){var r=e[n];if(!r.marker)continue;this.session.removeMarker(r.marker);var i=t.indexOf(r);i!=-1&&t.splice(i,1)}this.session.selectionMarkerCount=t.length},this.$onAddRange=function(e){this.addSelectionMarker(e.range),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onRemoveRange=function(e){this.removeSelectionMarkers(e.ranges),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onMultiSelect=function(e){if(this.inMultiSelectMode)return;this.inMultiSelectMode=!0,this.setStyle("ace_multiselect"),this.keyBinding.addKeyboardHandler(f.keyboardHandler),this.commands.setDefaultHandler("exec",this.$onMultiSelectExec),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onSingleSelect=function(e){if(this.session.multiSelect.inVirtualMode)return;this.inMultiSelectMode=!1,this.unsetStyle("ace_multiselect"),this.keyBinding.removeKeyboardHandler(f.keyboardHandler),this.commands.removeDefaultHandler("exec",this.$onMultiSelectExec),this.renderer.updateCursor(),this.renderer.updateBackMarkers(),this._emit("changeSelection")},this.$onMultiSelectExec=function(e){var t=e.command,n=e.editor;if(!n.multiSelect)return;if(!t.multiSelectAction){var r=t.exec(n,e.args||{});n.multiSelect.addRange(n.multiSelect.toOrientedRange()),n.multiSelect.mergeOverlappingRanges()}else t.multiSelectAction=="forEach"?r=n.forEachSelection(t,e.args):t.multiSelectAction=="forEachLine"?r=n.forEachSelection(t,e.args,!0):t.multiSelectAction=="single"?(n.exitMultiSelectMode(),r=t.exec(n,e.args||{})):r=t.multiSelectAction(n,e.args||{});return r},this.forEachSelection=function(e,t,n){if(this.inVirtualSelectionMode)return;var r=n&&n.keepOrder,i=n==1||n&&n.$byLines,o=this.session,u=this.selection,a=u.rangeList,f=(r?u:a).ranges,l;if(!f.length)return e.exec?e.exec(this,t||{}):e(this,t||{});var c=u._eventRegistry;u._eventRegistry={};var h=new s(o);this.inVirtualSelectionMode=!0;for(var p=f.length;p--;){if(i)while(p>0&&f[p].start.row==f[p-1].end.row)p--;h.fromOrientedRange(f[p]),h.index=p,this.selection=o.selection=h;var d=e.exec?e.exec(this,t||{}):e(this,t||{});!l&&d!==undefined&&(l=d),h.toOrientedRange(f[p])}h.detach(),this.selection=o.selection=u,this.inVirtualSelectionMode=!1,u._eventRegistry=c,u.mergeOverlappingRanges();var v=this.renderer.$scrollAnimation;return this.onCursorChange(),this.onSelectionChange(),v&&v.from==v.to&&this.renderer.animateScrolling(v.from),l},this.exitMultiSelectMode=function(){if(!this.inMultiSelectMode||this.inVirtualSelectionMode)return;this.multiSelect.toSingleRange()},this.getSelectedText=function(){var e="";if(this.inMultiSelectMode&&!this.inVirtualSelectionMode){var t=this.multiSelect.rangeList.ranges,n=[];for(var r=0;r0);u<0&&(u=0),f>=c&&(f=c-1)}var p=this.session.removeFullLines(u,f);p=this.$reAlignText(p,l),this.session.insert({row:u,column:0},p.join("\n")+"\n"),l||(o.start.column=0,o.end.column=p[p.length-1].length),this.selection.setRange(o)}else{s.forEach(function(e){t.substractPoint(e.cursor)});var d=0,v=Infinity,m=n.map(function(t){var n=t.cursor,r=e.getLine(n.row),i=r.substr(n.column).search(/\S/g);return i==-1&&(i=0),n.column>d&&(d=n.column),io?e.insert(r,a.stringRepeat(" ",s-o)):e.remove(new i(r.row,r.column,r.row,r.column-s+o)),t.start.column=t.end.column=d,t.start.row=t.end.row=r.row,t.cursor=t.end}),t.fromOrientedRange(n[0]),this.renderer.updateCursor(),this.renderer.updateBackMarkers()}},this.$reAlignText=function(e,t){function u(e){return a.stringRepeat(" ",e)}function f(e){return e[2]?u(i)+e[2]+u(s-e[2].length+o)+e[4].replace(/^([=:])\s+/,"$1 "):e[0]}function l(e){return e[2]?u(i+s-e[2].length)+e[2]+u(o," ")+e[4].replace(/^([=:])\s+/,"$1 "):e[0]}function c(e){return e[2]?u(i)+e[2]+u(o)+e[4].replace(/^([=:])\s+/,"$1 "):e[0]}var n=!0,r=!0,i,s,o;return e.map(function(e){var t=e.match(/(\s*)(.*?)(\s*)([=:].*)/);return t?i==null?(i=t[1].length,s=t[2].length,o=t[3].length,t):(i+s+o!=t[1].length+t[2].length+t[3].length&&(r=!1),i!=t[1].length&&(n=!1),i>t[1].length&&(i=t[1].length),st[3].length&&(o=t[3].length),t):[e]}).map(t?f:n?r?l:f:c)}}).call(d.prototype),t.onSessionChange=function(e){var t=e.session;t&&!t.multiSelect&&(t.$selectionMarkers=[],t.selection.$initRangeList(),t.multiSelect=t.selection),this.multiSelect=t&&t.multiSelect;var n=e.oldSession;n&&(n.multiSelect.off("addRange",this.$onAddRange),n.multiSelect.off("removeRange",this.$onRemoveRange),n.multiSelect.off("multiSelect",this.$onMultiSelect),n.multiSelect.off("singleSelect",this.$onSingleSelect),n.multiSelect.lead.off("change",this.$checkMultiselectChange),n.multiSelect.anchor.off("change",this.$checkMultiselectChange)),t&&(t.multiSelect.on("addRange",this.$onAddRange),t.multiSelect.on("removeRange",this.$onRemoveRange),t.multiSelect.on("multiSelect",this.$onMultiSelect),t.multiSelect.on("singleSelect",this.$onSingleSelect),t.multiSelect.lead.on("change",this.$checkMultiselectChange),t.multiSelect.anchor.on("change",this.$checkMultiselectChange)),t&&this.inMultiSelectMode!=t.selection.inMultiSelectMode&&(t.selection.inMultiSelectMode?this.$onMultiSelect():this.$onSingleSelect())},t.MultiSelect=m,e("./config").defineOptions(d.prototype,"editor",{enableMultiselect:{set:function(e){m(this),e?(this.on("changeSession",this.$multiselectOnSessionChange),this.on("mousedown",o)):(this.off("changeSession",this.$multiselectOnSessionChange),this.off("mousedown",o))},value:!0},enableBlockSelect:{set:function(e){this.$blockSelectEnabled=e},value:!0}})}),ace.define("ace/mode/folding/fold_mode",["require","exports","module","ace/range"],function(e,t,n){"use strict";var r=e("../../range").Range,i=t.FoldMode=function(){};(function(){this.foldingStartMarker=null,this.foldingStopMarker=null,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);return this.foldingStartMarker.test(r)?"start":t=="markbeginend"&&this.foldingStopMarker&&this.foldingStopMarker.test(r)?"end":""},this.getFoldWidgetRange=function(e,t,n){return null},this.indentationBlock=function(e,t,n){var i=/\S/,s=e.getLine(t),o=s.search(i);if(o==-1)return;var u=n||s.length,a=e.getLength(),f=t,l=t;while(++tf){var h=e.getLine(l).length;return new r(f,u,l,h)}},this.openingBracketBlock=function(e,t,n,i,s){var o={row:n,column:i+1},u=e.$findClosingBracket(t,o,s);if(!u)return;var a=e.foldWidgets[u.row];return a==null&&(a=e.getFoldWidget(u.row)),a=="start"&&u.row>o.row&&(u.row--,u.column=e.getLine(u.row).length),r.fromPoints(o,u)},this.closingBracketBlock=function(e,t,n,i,s){var o={row:n,column:i},u=e.$findOpeningBracket(t,o);if(!u)return;return u.column++,o.column--,r.fromPoints(u,o)}}).call(i.prototype)}),ace.define("ace/theme/textmate",["require","exports","module","ace/lib/dom"],function(e,t,n){"use strict";t.isDark=!1,t.cssClass="ace-tm",t.cssText='.ace-tm .ace_gutter {background: #f0f0f0;color: #333;}.ace-tm .ace_print-margin {width: 1px;background: #e8e8e8;}.ace-tm .ace_fold {background-color: #6B72E6;}.ace-tm {background-color: #FFFFFF;color: black;}.ace-tm .ace_cursor {color: black;}.ace-tm .ace_invisible {color: rgb(191, 191, 191);}.ace-tm .ace_storage,.ace-tm .ace_keyword {color: blue;}.ace-tm .ace_constant {color: rgb(197, 6, 11);}.ace-tm .ace_constant.ace_buildin {color: rgb(88, 72, 246);}.ace-tm .ace_constant.ace_language {color: rgb(88, 92, 246);}.ace-tm .ace_constant.ace_library {color: rgb(6, 150, 14);}.ace-tm .ace_invalid {background-color: rgba(255, 0, 0, 0.1);color: red;}.ace-tm .ace_support.ace_function {color: rgb(60, 76, 114);}.ace-tm .ace_support.ace_constant {color: rgb(6, 150, 14);}.ace-tm .ace_support.ace_type,.ace-tm .ace_support.ace_class {color: rgb(109, 121, 222);}.ace-tm .ace_keyword.ace_operator {color: rgb(104, 118, 135);}.ace-tm .ace_string {color: rgb(3, 106, 7);}.ace-tm .ace_comment {color: rgb(76, 136, 107);}.ace-tm .ace_comment.ace_doc {color: rgb(0, 102, 255);}.ace-tm .ace_comment.ace_doc.ace_tag {color: rgb(128, 159, 191);}.ace-tm .ace_constant.ace_numeric {color: rgb(0, 0, 205);}.ace-tm .ace_variable {color: rgb(49, 132, 149);}.ace-tm .ace_xml-pe {color: rgb(104, 104, 91);}.ace-tm .ace_entity.ace_name.ace_function {color: #0000A2;}.ace-tm .ace_heading {color: rgb(12, 7, 255);}.ace-tm .ace_list {color:rgb(185, 6, 144);}.ace-tm .ace_meta.ace_tag {color:rgb(0, 22, 142);}.ace-tm .ace_string.ace_regex {color: rgb(255, 0, 0)}.ace-tm .ace_marker-layer .ace_selection {background: rgb(181, 213, 255);}.ace-tm.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px white;}.ace-tm .ace_marker-layer .ace_step {background: rgb(252, 255, 0);}.ace-tm .ace_marker-layer .ace_stack {background: rgb(164, 229, 101);}.ace-tm .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgb(192, 192, 192);}.ace-tm .ace_marker-layer .ace_active-line {background: rgba(0, 0, 0, 0.07);}.ace-tm .ace_gutter-active-line {background-color : #dcdcdc;}.ace-tm .ace_marker-layer .ace_selected-word {background: rgb(250, 250, 255);border: 1px solid rgb(200, 200, 250);}.ace-tm .ace_indent-guide {background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y;}';var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass)}),ace.define("ace/line_widgets",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/range"],function(e,t,n){"use strict";function o(e){this.session=e,this.session.widgetManager=this,this.session.getRowLength=this.getRowLength,this.session.$getWidgetScreenLength=this.$getWidgetScreenLength,this.updateOnChange=this.updateOnChange.bind(this),this.renderWidgets=this.renderWidgets.bind(this),this.measureWidgets=this.measureWidgets.bind(this),this.session._changedWidgets=[],this.$onChangeEditor=this.$onChangeEditor.bind(this),this.session.on("change",this.updateOnChange),this.session.on("changeFold",this.updateOnFold),this.session.on("changeEditor",this.$onChangeEditor)}var r=e("./lib/oop"),i=e("./lib/dom"),s=e("./range").Range;(function(){this.getRowLength=function(e){var t;return this.lineWidgets?t=this.lineWidgets[e]&&this.lineWidgets[e].rowCount||0:t=0,!this.$useWrapMode||!this.$wrapData[e]?1+t:this.$wrapData[e].length+1+t},this.$getWidgetScreenLength=function(){var e=0;return this.lineWidgets.forEach(function(t){t&&t.rowCount&&!t.hidden&&(e+=t.rowCount)}),e},this.$onChangeEditor=function(e){this.attach(e.editor)},this.attach=function(e){e&&e.widgetManager&&e.widgetManager!=this&&e.widgetManager.detach();if(this.editor==e)return;this.detach(),this.editor=e,e&&(e.widgetManager=this,e.renderer.on("beforeRender",this.measureWidgets),e.renderer.on("afterRender",this.renderWidgets))},this.detach=function(e){var t=this.editor;if(!t)return;this.editor=null,t.widgetManager=null,t.renderer.off("beforeRender",this.measureWidgets),t.renderer.off("afterRender",this.renderWidgets);var n=this.session.lineWidgets;n&&n.forEach(function(e){e&&e.el&&e.el.parentNode&&(e._inDocument=!1,e.el.parentNode.removeChild(e.el))})},this.updateOnFold=function(e,t){var n=t.lineWidgets;if(!n||!e.action)return;var r=e.data,i=r.start.row,s=r.end.row,o=e.action=="add";for(var u=i+1;u0&&!r[i])i--;this.firstRow=n.firstRow,this.lastRow=n.lastRow,t.$cursorLayer.config=n;for(var o=i;o<=s;o++){var u=r[o];if(!u||!u.el)continue;if(u.hidden){u.el.style.top=-100-(u.pixelHeight||0)+"px";continue}u._inDocument||(u._inDocument=!0,t.container.appendChild(u.el));var a=t.$cursorLayer.getPixelPosition({row:o,column:0},!0).top;u.coverLine||(a+=n.lineHeight*this.session.getRowLineCount(u.row)),u.el.style.top=a-n.offset+"px";var f=u.coverGutter?0:t.gutterWidth;u.fixedWidth||(f-=t.scrollLeft),u.el.style.left=f+"px",u.fullWidth&&u.screenWidth&&(u.el.style.minWidth=n.width+2*n.padding+"px"),u.fixedWidth?u.el.style.right=t.scrollBar.getWidth()+"px":u.el.style.right=""}}}).call(o.prototype),t.LineWidgets=o}),ace.define("ace/ext/error_marker",["require","exports","module","ace/line_widgets","ace/lib/dom","ace/range"],function(e,t,n){"use strict";function o(e,t,n){var r=0,i=e.length-1;while(r<=i){var s=r+i>>1,o=n(t,e[s]);if(o>0)r=s+1;else{if(!(o<0))return s;i=s-1}}return-(r+1)}function u(e,t,n){var r=e.getAnnotations().sort(s.comparePoints);if(!r.length)return;var i=o(r,{row:t,column:-1},s.comparePoints);i<0&&(i=-i-1),i>=r.length?i=n>0?0:r.length-1:i===0&&n<0&&(i=r.length-1);var u=r[i];if(!u||!n)return;if(u.row===t){do u=r[i+=n];while(u&&u.row===t);if(!u)return r.slice()}var a=[];t=u.row;do a[n<0?"unshift":"push"](u),u=r[i+=n];while(u&&u.row==t);return a.length&&a}var r=e("../line_widgets").LineWidgets,i=e("../lib/dom"),s=e("../range").Range;t.showErrorMarker=function(e,t){var n=e.session;n.widgetManager||(n.widgetManager=new r(n),n.widgetManager.attach(e));var s=e.getCursorPosition(),o=s.row,a=n.widgetManager.getWidgetsAtRow(o).filter(function(e){return e.type=="errorMarker"})[0];a?a.destroy():o-=t;var f=u(n,o,t),l;if(f){var c=f[0];s.column=(c.pos&&typeof c.column!="number"?c.pos.sc:c.column)||0,s.row=c.row,l=e.renderer.$gutterLayer.$annotations[s.row]}else{if(a)return;l={text:["Looks good!"],className:"ace_ok"}}e.session.unfold(s.row),e.selection.moveToPosition(s);var h={row:s.row,fixedWidth:!0,coverGutter:!0,el:i.createElement("div"),type:"errorMarker"},p=h.el.appendChild(i.createElement("div")),d=h.el.appendChild(i.createElement("div"));d.className="error_widget_arrow "+l.className;var v=e.renderer.$cursorLayer.getPixelPosition(s).left;d.style.left=v+e.renderer.gutterWidth-5+"px",h.el.className="error_widget_wrapper",p.className="error_widget "+l.className,p.innerHTML=l.text.join("
"),p.appendChild(i.createElement("div"));var m=function(e,t,n){if(t===0&&(n==="esc"||n==="return"))return h.destroy(),{command:"null"}};h.destroy=function(){if(e.$mouseHandler.isMousePressed)return;e.keyBinding.removeKeyboardHandler(m),n.widgetManager.removeLineWidget(h),e.off("changeSelection",h.destroy),e.off("changeSession",h.destroy),e.off("mouseup",h.destroy),e.off("change",h.destroy)},e.keyBinding.addKeyboardHandler(m),e.on("changeSelection",h.destroy),e.on("changeSession",h.destroy),e.on("mouseup",h.destroy),e.on("change",h.destroy),e.session.widgetManager.addLineWidget(h),h.el.onmousedown=e.focus.bind(e),e.renderer.scrollCursorIntoView(null,.5,{bottom:h.el.offsetHeight})},i.importCssString(" .error_widget_wrapper { background: inherit; color: inherit; border:none } .error_widget { border-top: solid 2px; border-bottom: solid 2px; margin: 5px 0; padding: 10px 40px; white-space: pre-wrap; } .error_widget.ace_error, .error_widget_arrow.ace_error{ border-color: #ff5a5a } .error_widget.ace_warning, .error_widget_arrow.ace_warning{ border-color: #F1D817 } .error_widget.ace_info, .error_widget_arrow.ace_info{ border-color: #5a5a5a } .error_widget.ace_ok, .error_widget_arrow.ace_ok{ border-color: #5aaa5a } .error_widget_arrow { position: absolute; border: solid 5px; border-top-color: transparent!important; border-right-color: transparent!important; border-left-color: transparent!important; top: -5px; }","")}),ace.define("ace/ace",["require","exports","module","ace/lib/fixoldbrowsers","ace/lib/dom","ace/lib/event","ace/editor","ace/edit_session","ace/undomanager","ace/virtual_renderer","ace/worker/worker_client","ace/keyboard/hash_handler","ace/placeholder","ace/multi_select","ace/mode/folding/fold_mode","ace/theme/textmate","ace/ext/error_marker","ace/config"],function(e,t,n){"use strict";e("./lib/fixoldbrowsers");var r=e("./lib/dom"),i=e("./lib/event"),s=e("./editor").Editor,o=e("./edit_session").EditSession,u=e("./undomanager").UndoManager,a=e("./virtual_renderer").VirtualRenderer;e("./worker/worker_client"),e("./keyboard/hash_handler"),e("./placeholder"),e("./multi_select"),e("./mode/folding/fold_mode"),e("./theme/textmate"),e("./ext/error_marker"),t.config=e("./config"),t.require=e,t.edit=function(e){if(typeof e=="string"){var n=e;e=document.getElementById(n);if(!e)throw new Error("ace.edit can't find div #"+n)}if(e&&e.env&&e.env.editor instanceof s)return e.env.editor;var o="";if(e&&/input|textarea/i.test(e.tagName)){var u=e;o=u.value,e=r.createElement("pre"),u.parentNode.replaceChild(e,u)}else e&&(o=r.getInnerText(e),e.innerHTML="");var f=t.createEditSession(o),l=new s(new a(e));l.setSession(f);var c={document:f,editor:l,onResize:l.resize.bind(l,null)};return u&&(c.textarea=u),i.addListener(window,"resize",c.onResize),l.on("destroy",function(){i.removeListener(window,"resize",c.onResize),c.editor.container.env=null}),l.container.env=l.env=c,l},t.createEditSession=function(e,t){var n=new o(e,t);return n.setUndoManager(new u),n},t.EditSession=o,t.UndoManager=u,t.version="1.2.3"});
- (function() {
- ace.require(["ace/ace"], function(a) {
- a && a.config.init(true);
- if (!window.ace)
- window.ace = a;
- for (var key in a) if (a.hasOwnProperty(key))
- window.ace[key] = a[key];
- });
- })();
-
\ No newline at end of file
diff --git a/public/ace/mode-css.js b/public/ace/mode-css.js
deleted file mode 100644
index 84cd16c6..00000000
--- a/public/ace/mode-css.js
+++ /dev/null
@@ -1 +0,0 @@
-ace.define("ace/mode/css_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/lang"),s=e("./text_highlight_rules").TextHighlightRules,o=t.supportType="align-content|align-items|align-self|all|animation|animation-delay|animation-direction|animation-duration|animation-fill-mode|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|backface-visibility|background|background-attachment|background-blend-mode|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|border|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|bottom|box-shadow|box-sizing|caption-side|clear|clip|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|cursor|direction|display|empty-cells|filter|flex|flex-basis|flex-direction|flex-flow|flex-grow|flex-shrink|flex-wrap|float|font|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|hanging-punctuation|height|justify-content|left|letter-spacing|line-height|list-style|list-style-image|list-style-position|list-style-type|margin|margin-bottom|margin-left|margin-right|margin-top|max-height|max-width|min-height|min-width|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|order|outline|outline-color|outline-offset|outline-style|outline-width|overflow|overflow-x|overflow-y|padding|padding-bottom|padding-left|padding-right|padding-top|page-break-after|page-break-before|page-break-inside|perspective|perspective-origin|position|quotes|resize|right|tab-size|table-layout|text-align|text-align-last|text-decoration|text-decoration-color|text-decoration-line|text-decoration-style|text-indent|text-justify|text-overflow|text-shadow|text-transform|top|transform|transform-origin|transform-style|transition|transition-delay|transition-duration|transition-property|transition-timing-function|unicode-bidi|vertical-align|visibility|white-space|width|word-break|word-spacing|word-wrap|z-index",u=t.supportFunction="rgb|rgba|url|attr|counter|counters",a=t.supportConstant="absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero",f=t.supportConstantColor="aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow",l=t.supportConstantFonts="arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace",c=t.numRe="\\-?(?:(?:[0-9]+)|(?:[0-9]*\\.[0-9]+))",h=t.pseudoElements="(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b",p=t.pseudoClasses="(:)\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\b",d=function(){var e=this.createKeywordMapper({"support.function":u,"support.constant":a,"support.type":o,"support.constant.color":f,"support.constant.fonts":l},"text",!0);this.$rules={start:[{token:"comment",regex:"\\/\\*",push:"comment"},{token:"paren.lparen",regex:"\\{",push:"ruleset"},{token:"string",regex:"@.*?{",push:"media"},{token:"keyword",regex:"#[a-z0-9-_]+"},{token:"variable",regex:"\\.[a-z0-9-_]+"},{token:"string",regex:":[a-z0-9-_]+"},{token:"constant",regex:"[a-z0-9-_]+"},{caseInsensitive:!0}],media:[{token:"comment",regex:"\\/\\*",push:"comment"},{token:"paren.lparen",regex:"\\{",push:"ruleset"},{token:"string",regex:"\\}",next:"pop"},{token:"keyword",regex:"#[a-z0-9-_]+"},{token:"variable",regex:"\\.[a-z0-9-_]+"},{token:"string",regex:":[a-z0-9-_]+"},{token:"constant",regex:"[a-z0-9-_]+"},{caseInsensitive:!0}],comment:[{token:"comment",regex:"\\*\\/",next:"pop"},{defaultToken:"comment"}],ruleset:[{token:"paren.rparen",regex:"\\}",next:"pop"},{token:"comment",regex:"\\/\\*",push:"comment"},{token:"string",regex:'["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'},{token:"string",regex:"['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"},{token:["constant.numeric","keyword"],regex:"("+c+")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)"},{token:"constant.numeric",regex:c},{token:"constant.numeric",regex:"#[a-f0-9]{6}"},{token:"constant.numeric",regex:"#[a-f0-9]{3}"},{token:["punctuation","entity.other.attribute-name.pseudo-element.css"],regex:h},{token:["punctuation","entity.other.attribute-name.pseudo-class.css"],regex:p},{token:["support.function","string","support.function"],regex:"(url\\()(.*)(\\))"},{token:e,regex:"\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*"},{caseInsensitive:!0}]},this.normalizeRules()};r.inherits(d,s),t.CssHighlightRules=d}),ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(e,t,n){"use strict";var r=e("../range").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\s+$/.test(e)?/^\s*\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\s*\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),ace.define("ace/mode/css_completions",["require","exports","module"],function(e,t,n){"use strict";var r={background:{"#$0":1},"background-color":{"#$0":1,transparent:1,fixed:1},"background-image":{"url('/$0')":1},"background-repeat":{repeat:1,"repeat-x":1,"repeat-y":1,"no-repeat":1,inherit:1},"background-position":{bottom:2,center:2,left:2,right:2,top:2,inherit:2},"background-attachment":{scroll:1,fixed:1},"background-size":{cover:1,contain:1},"background-clip":{"border-box":1,"padding-box":1,"content-box":1},"background-origin":{"border-box":1,"padding-box":1,"content-box":1},border:{"solid $0":1,"dashed $0":1,"dotted $0":1,"#$0":1},"border-color":{"#$0":1},"border-style":{solid:2,dashed:2,dotted:2,"double":2,groove:2,hidden:2,inherit:2,inset:2,none:2,outset:2,ridged:2},"border-collapse":{collapse:1,separate:1},bottom:{px:1,em:1,"%":1},clear:{left:1,right:1,both:1,none:1},color:{"#$0":1,"rgb(#$00,0,0)":1},cursor:{"default":1,pointer:1,move:1,text:1,wait:1,help:1,progress:1,"n-resize":1,"ne-resize":1,"e-resize":1,"se-resize":1,"s-resize":1,"sw-resize":1,"w-resize":1,"nw-resize":1},display:{none:1,block:1,inline:1,"inline-block":1,"table-cell":1},"empty-cells":{show:1,hide:1},"float":{left:1,right:1,none:1},"font-family":{Arial:2,"Comic Sans MS":2,Consolas:2,"Courier New":2,Courier:2,Georgia:2,Monospace:2,"Sans-Serif":2,"Segoe UI":2,Tahoma:2,"Times New Roman":2,"Trebuchet MS":2,Verdana:1},"font-size":{px:1,em:1,"%":1},"font-weight":{bold:1,normal:1},"font-style":{italic:1,normal:1},"font-variant":{normal:1,"small-caps":1},height:{px:1,em:1,"%":1},left:{px:1,em:1,"%":1},"letter-spacing":{normal:1},"line-height":{normal:1},"list-style-type":{none:1,disc:1,circle:1,square:1,decimal:1,"decimal-leading-zero":1,"lower-roman":1,"upper-roman":1,"lower-greek":1,"lower-latin":1,"upper-latin":1,georgian:1,"lower-alpha":1,"upper-alpha":1},margin:{px:1,em:1,"%":1},"margin-right":{px:1,em:1,"%":1},"margin-left":{px:1,em:1,"%":1},"margin-top":{px:1,em:1,"%":1},"margin-bottom":{px:1,em:1,"%":1},"max-height":{px:1,em:1,"%":1},"max-width":{px:1,em:1,"%":1},"min-height":{px:1,em:1,"%":1},"min-width":{px:1,em:1,"%":1},overflow:{hidden:1,visible:1,auto:1,scroll:1},"overflow-x":{hidden:1,visible:1,auto:1,scroll:1},"overflow-y":{hidden:1,visible:1,auto:1,scroll:1},padding:{px:1,em:1,"%":1},"padding-top":{px:1,em:1,"%":1},"padding-right":{px:1,em:1,"%":1},"padding-bottom":{px:1,em:1,"%":1},"padding-left":{px:1,em:1,"%":1},"page-break-after":{auto:1,always:1,avoid:1,left:1,right:1},"page-break-before":{auto:1,always:1,avoid:1,left:1,right:1},position:{absolute:1,relative:1,fixed:1,"static":1},right:{px:1,em:1,"%":1},"table-layout":{fixed:1,auto:1},"text-decoration":{none:1,underline:1,"line-through":1,blink:1},"text-align":{left:1,right:1,center:1,justify:1},"text-transform":{capitalize:1,uppercase:1,lowercase:1,none:1},top:{px:1,em:1,"%":1},"vertical-align":{top:1,bottom:1},visibility:{hidden:1,visible:1},"white-space":{nowrap:1,normal:1,pre:1,"pre-line":1,"pre-wrap":1},width:{px:1,em:1,"%":1},"word-spacing":{normal:1},filter:{"alpha(opacity=$0100)":1},"text-shadow":{"$02px 2px 2px #777":1},"text-overflow":{"ellipsis-word":1,clip:1,ellipsis:1},"-moz-border-radius":1,"-moz-border-radius-topright":1,"-moz-border-radius-bottomright":1,"-moz-border-radius-topleft":1,"-moz-border-radius-bottomleft":1,"-webkit-border-radius":1,"-webkit-border-top-right-radius":1,"-webkit-border-top-left-radius":1,"-webkit-border-bottom-right-radius":1,"-webkit-border-bottom-left-radius":1,"-moz-box-shadow":1,"-webkit-box-shadow":1,transform:{"rotate($00deg)":1,"skew($00deg)":1},"-moz-transform":{"rotate($00deg)":1,"skew($00deg)":1},"-webkit-transform":{"rotate($00deg)":1,"skew($00deg)":1}},i=function(){};(function(){this.completionsDefined=!1,this.defineCompletions=function(){if(document){var e=document.createElement("c").style;for(var t in e){if(typeof e[t]!="string")continue;var n=t.replace(/[A-Z]/g,function(e){return"-"+e.toLowerCase()});r.hasOwnProperty(n)||(r[n]=1)}}this.completionsDefined=!0},this.getCompletions=function(e,t,n,r){this.completionsDefined||this.defineCompletions();var i=t.getTokenAt(n.row,n.column);if(!i)return[];if(e==="ruleset"){var s=t.getLine(n.row).substr(0,n.column);return/:[^;]+$/.test(s)?(/([\w\-]+):[^:]*$/.test(s),this.getPropertyValueCompletions(e,t,n,r)):this.getPropertyCompletions(e,t,n,r)}return[]},this.getPropertyCompletions=function(e,t,n,i){var s=Object.keys(r);return s.map(function(e){return{caption:e,snippet:e+": $0",meta:"property",score:Number.MAX_VALUE}})},this.getPropertyValueCompletions=function(e,t,n,i){var s=t.getLine(n.row).substr(0,n.column),o=(/([\w\-]+):[^:]*$/.exec(s)||{})[1];if(!o)return[];var u=[];return o in r&&typeof r[o]=="object"&&(u=Object.keys(r[o])),u.map(function(e){return{caption:e,snippet:e,meta:"property value",score:Number.MAX_VALUE}})}}).call(i.prototype),t.CssCompletions=i}),ace.define("ace/mode/behaviour/cstyle",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../behaviour").Behaviour,s=e("../../token_iterator").TokenIterator,o=e("../../lib/lang"),u=["text","paren.rparen","punctuation.operator"],a=["text","paren.rparen","punctuation.operator","comment"],f,l={},c=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:"",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:"",maybeInsertedLineEnd:""}},h=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},p=function(){this.add("braces","insertion",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i=="{"){c(n);var a=n.getSelectionRange(),l=r.doc.getTextRange(a);if(l!==""&&l!=="{"&&n.getWrapBehavioursEnabled())return h(a,l,"{","}");if(p.isSaneInsertion(n,r))return/[\]\}\)]/.test(u[s.column])||n.inMultiSelectMode?(p.recordAutoInsert(n,r,"}"),{text:"{}",selection:[1,1]}):(p.recordMaybeInsert(n,r,"{"),{text:"{",selection:[1,1]})}else if(i=="}"){c(n);var d=u.substring(s.column,s.column+1);if(d=="}"){var v=r.$findOpeningBracket("}",{column:s.column+1,row:s.row});if(v!==null&&p.isAutoInsertedClosing(s,u,i))return p.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}else{if(i=="\n"||i=="\r\n"){c(n);var m="";p.isMaybeInsertedClosing(s,u)&&(m=o.stringRepeat("}",f.maybeInsertedBrackets),p.clearMaybeInsertedClosing());var d=u.substring(s.column,s.column+1);if(d==="}"){var g=r.findMatchingBracket({row:s.row,column:s.column+1},"}");if(!g)return null;var y=this.$getIndent(r.getLine(g.row))}else{if(!m){p.clearMaybeInsertedClosing();return}var y=this.$getIndent(u)}var b=y+r.getTabString();return{text:"\n"+b+"\n"+y+m,selection:[1,b.length,1,b.length]}}p.clearMaybeInsertedClosing()}}),this.add("braces","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="{"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u=="}")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add("parens","insertion",function(e,t,n,r,i){if(i=="("){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==""&&n.getWrapBehavioursEnabled())return h(s,o,"(",")");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,")"),{text:"()",selection:[1,1]}}else if(i==")"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==")"){var l=r.$findOpeningBracket(")",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}}),this.add("parens","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="("){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==")")return i.end.column++,i}}),this.add("brackets","insertion",function(e,t,n,r,i){if(i=="["){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==""&&n.getWrapBehavioursEnabled())return h(s,o,"[","]");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,"]"),{text:"[]",selection:[1,1]}}else if(i=="]"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f=="]"){var l=r.$findOpeningBracket("]",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}}),this.add("brackets","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="["){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u=="]")return i.end.column++,i}}),this.add("string_dquotes","insertion",function(e,t,n,r,i){if(i=='"'||i=="'"){c(n);var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==""&&u!=="'"&&u!='"'&&n.getWrapBehavioursEnabled())return h(o,u,s,s);if(!u){var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column),p=f.substring(a.column,a.column+1),d=r.getTokenAt(a.row,a.column),v=r.getTokenAt(a.row,a.column+1);if(l=="\\"&&d&&/escape/.test(d.type))return null;var m=d&&/string|escape/.test(d.type),g=!v||/string|escape/.test(v.type),y;if(p==s)y=m!==g;else{if(m&&!g)return null;if(m&&g)return null;var b=r.$mode.tokenRe;b.lastIndex=0;var w=b.test(l);b.lastIndex=0;var E=b.test(l);if(w||E)return null;if(p&&!/[\s;,.})\]\\]/.test(p))return null;y=!0}return{text:y?s+s:"",selection:[1,1]}}}}),this.add("string_dquotes","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='"'||s=="'")){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||"text",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||"text",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||"text",a)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(p,i),t.CstyleBehaviour=p}),ace.define("ace/mode/behaviour/css",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/mode/behaviour/cstyle","ace/token_iterator"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../behaviour").Behaviour,s=e("./cstyle").CstyleBehaviour,o=e("../../token_iterator").TokenIterator,u=function(){this.inherit(s),this.add("colon","insertion",function(e,t,n,r,i){if(i===":"){var s=n.getCursorPosition(),u=new o(r,s.row,s.column),a=u.getCurrentToken();a&&a.value.match(/\s+/)&&(a=u.stepBackward());if(a&&a.type==="support.type"){var f=r.doc.getLine(s.row),l=f.substring(s.column,s.column+1);if(l===":")return{text:"",selection:[1,1]};if(!f.substring(s.column).match(/^\s*;/))return{text:":;",selection:[1,1]}}}}),this.add("colon","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s===":"){var u=n.getCursorPosition(),a=new o(r,u.row,u.column),f=a.getCurrentToken();f&&f.value.match(/\s+/)&&(f=a.stepBackward());if(f&&f.type==="support.type"){var l=r.doc.getLine(i.start.row),c=l.substring(i.end.column,i.end.column+1);if(c===";")return i.end.column++,i}}}),this.add("semicolon","insertion",function(e,t,n,r,i){if(i===";"){var s=n.getCursorPosition(),o=r.doc.getLine(s.row),u=o.substring(s.column,s.column+1);if(u===";")return{text:"",selection:[1,1]}}})};r.inherits(u,s),t.CssBehaviour=u}),ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../../range").Range,s=e("./fold_mode").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\|[^|]*?$/,"|"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\|[^|]*?$/,"|"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\{|\[)[^\}\]]*$|^\s*(\/\*)/,this.foldingStopMarker=/^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/,this.singleLineBlockCommentRe=/^\s*(\/\*).*\*\/\s*$/,this.tripleStarBlockCommentRe=/^\s*(\/\*\*\*).*\*\/\s*$/,this.startRegionRe=/^\s*(\/\*|\/\/)#?region\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return"";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?"start":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!="all"&&(u=null)),u}if(t==="markbegin")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++tf)break;var l=this.getFoldWidgetRange(e,"all",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\s*$/),s=e.getLength(),o=n,u=/^\s*(?:\/\*|\/\/|--)#?(end)?region\b/,a=1;while(++no)return new i(o,r,l,t.length)}}.call(o.prototype)}),ace.define("ace/mode/css",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/css_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/css_completions","ace/mode/behaviour/css","ace/mode/folding/cstyle"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./css_highlight_rules").CssHighlightRules,o=e("./matching_brace_outdent").MatchingBraceOutdent,u=e("../worker/worker_client").WorkerClient,a=e("./css_completions").CssCompletions,f=e("./behaviour/css").CssBehaviour,l=e("./folding/cstyle").FoldMode,c=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new f,this.$completer=new a,this.foldingRules=new l};r.inherits(c,i),function(){this.foldingRules="cStyle",this.blockComment={start:"/*",end:"*/"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e).tokens;if(i.length&&i[i.length-1].type=="comment")return r;var s=t.match(/^.*\{\s*$/);return s&&(r+=n),r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.getCompletions=function(e,t,n,r){return this.$completer.getCompletions(e,t,n,r)},this.createWorker=function(e){var t=new u(["ace"],"ace/mode/css_worker","Worker");return t.attachToDocument(e.getDocument()),t.on("annotate",function(t){e.setAnnotations(t.data)}),t.on("terminate",function(){e.clearAnnotations()}),t},this.$id="ace/mode/css"}.call(c.prototype),t.Mode=c})
\ No newline at end of file
diff --git a/public/ace/mode-handlebars.js b/public/ace/mode-handlebars.js
deleted file mode 100644
index bd345d55..00000000
--- a/public/ace/mode-handlebars.js
+++ /dev/null
@@ -1 +0,0 @@
-ace.define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(){this.$rules={start:[{token:"comment.doc.tag",regex:"@[\\w\\d_]+"},s.getTagRule(),{defaultToken:"comment.doc",caseInsensitive:!0}]}};r.inherits(s,i),s.getTagRule=function(e){return{token:"comment.doc.tag.storage.type",regex:"\\b(?:TODO|FIXME|XXX|HACK)\\b"}},s.getStartRule=function(e){return{token:"comment.doc",regex:"\\/\\*(?=\\*)",next:e}},s.getEndRule=function(e){return{token:"comment.doc",regex:"\\*\\/",next:e}},t.DocCommentHighlightRules=s}),ace.define("ace/mode/javascript_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";function a(){var e=o.replace("\\d","\\d\\-"),t={onMatch:function(e,t,n){var r=e.charAt(1)=="/"?2:1;if(r==1)t!=this.nextState?n.unshift(this.next,this.nextState,0):n.unshift(this.next),n[2]++;else if(r==2&&t==this.nextState){n[1]--;if(!n[1]||n[1]<0)n.shift(),n.shift()}return[{type:"meta.tag.punctuation."+(r==1?"":"end-")+"tag-open.xml",value:e.slice(0,r)},{type:"meta.tag.tag-name.xml",value:e.substr(r)}]},regex:"?"+e+"",next:"jsxAttributes",nextState:"jsx"};this.$rules.start.unshift(t);var n={regex:"{",token:"paren.quasi.start",push:"start"};this.$rules.jsx=[n,t,{include:"reference"},{defaultToken:"string"}],this.$rules.jsxAttributes=[{token:"meta.tag.punctuation.tag-close.xml",regex:"/?>",onMatch:function(e,t,n){return t==n[0]&&n.shift(),e.length==2&&(n[0]==this.nextState&&n[1]--,(!n[1]||n[1]<0)&&n.splice(0,2)),this.next=n[0]||"start",[{type:this.token,value:e}]},nextState:"jsx"},n,f("jsxAttributes"),{token:"entity.other.attribute-name.xml",regex:e},{token:"keyword.operator.attribute-equals.xml",regex:"="},{token:"text.tag-whitespace.xml",regex:"\\s+"},{token:"string.attribute-value.xml",regex:"'",stateName:"jsx_attr_q",push:[{token:"string.attribute-value.xml",regex:"'",next:"pop"},{include:"reference"},{defaultToken:"string.attribute-value.xml"}]},{token:"string.attribute-value.xml",regex:'"',stateName:"jsx_attr_qq",push:[{token:"string.attribute-value.xml",regex:'"',next:"pop"},{include:"reference"},{defaultToken:"string.attribute-value.xml"}]},t],this.$rules.reference=[{token:"constant.language.escape.reference.xml",regex:"(?:[0-9]+;)|(?:[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"}]}function f(e){return[{token:"comment",regex:/\/\*/,next:[i.getTagRule(),{token:"comment",regex:"\\*\\/",next:e||"pop"},{defaultToken:"comment",caseInsensitive:!0}]},{token:"comment",regex:"\\/\\/",next:[i.getTagRule(),{token:"comment",regex:"$|^",next:e||"pop"},{defaultToken:"comment",caseInsensitive:!0}]}]}var r=e("../lib/oop"),i=e("./doc_comment_highlight_rules").DocCommentHighlightRules,s=e("./text_highlight_rules").TextHighlightRules,o="[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*\\b",u=function(e){var t=this.createKeywordMapper({"variable.language":"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|Namespace|QName|XML|XMLList|ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|SyntaxError|TypeError|URIError|decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|isNaN|parseFloat|parseInt|JSON|Math|this|arguments|prototype|window|document",keyword:"const|yield|import|get|set|break|case|catch|continue|default|delete|do|else|finally|for|function|if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|__parent__|__count__|escape|unescape|with|__proto__|class|enum|extends|super|export|implements|private|public|interface|package|protected|static","storage.type":"const|let|var|function","constant.language":"null|Infinity|NaN|undefined","support.function":"alert","constant.language.boolean":"true|false"},"identifier"),n="case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void",r="\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|u{[0-9a-fA-F]{1,6}}|[0-2][0-7]{0,2}|3[0-7][0-7]?|[4-7][0-7]?|.)";this.$rules={no_regex:[i.getStartRule("doc-start"),f("no_regex"),{token:"string",regex:"'(?=.)",next:"qstring"},{token:"string",regex:'"(?=.)',next:"qqstring"},{token:"constant.numeric",regex:/0(?:[xX][0-9a-fA-F]+|[bB][01]+)\b/},{token:"constant.numeric",regex:/[+-]?\d[\d_]*(?:(?:\.\d*)?(?:[eE][+-]?\d+)?)?\b/},{token:["storage.type","punctuation.operator","support.function","punctuation.operator","entity.name.function","text","keyword.operator"],regex:"("+o+")(\\.)(prototype)(\\.)("+o+")(\\s*)(=)",next:"function_arguments"},{token:["storage.type","punctuation.operator","entity.name.function","text","keyword.operator","text","storage.type","text","paren.lparen"],regex:"("+o+")(\\.)("+o+")(\\s*)(=)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:["entity.name.function","text","keyword.operator","text","storage.type","text","paren.lparen"],regex:"("+o+")(\\s*)(=)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:["storage.type","punctuation.operator","entity.name.function","text","keyword.operator","text","storage.type","text","entity.name.function","text","paren.lparen"],regex:"("+o+")(\\.)("+o+")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()",next:"function_arguments"},{token:["storage.type","text","entity.name.function","text","paren.lparen"],regex:"(function)(\\s+)("+o+")(\\s*)(\\()",next:"function_arguments"},{token:["entity.name.function","text","punctuation.operator","text","storage.type","text","paren.lparen"],regex:"("+o+")(\\s*)(:)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:["text","text","storage.type","text","paren.lparen"],regex:"(:)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:"keyword",regex:"(?:"+n+")\\b",next:"start"},{token:["support.constant"],regex:/that\b/},{token:["storage.type","punctuation.operator","support.function.firebug"],regex:/(console)(\.)(warn|info|log|error|time|trace|timeEnd|assert)\b/},{token:t,regex:o},{token:"punctuation.operator",regex:/[.](?![.])/,next:"property"},{token:"keyword.operator",regex:/--|\+\+|\.{3}|===|==|=|!=|!==|<+=?|>+=?|!|&&|\|\||\?\:|[!$%&*+\-~\/^]=?/,next:"start"},{token:"punctuation.operator",regex:/[?:,;.]/,next:"start"},{token:"paren.lparen",regex:/[\[({]/,next:"start"},{token:"paren.rparen",regex:/[\])}]/},{token:"comment",regex:/^#!.*$/}],property:[{token:"text",regex:"\\s+"},{token:["storage.type","punctuation.operator","entity.name.function","text","keyword.operator","text","storage.type","text","entity.name.function","text","paren.lparen"],regex:"("+o+")(\\.)("+o+")(\\s*)(=)(\\s*)(function)(?:(\\s+)(\\w+))?(\\s*)(\\()",next:"function_arguments"},{token:"punctuation.operator",regex:/[.](?![.])/},{token:"support.function",regex:/(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/},{token:"support.function.dom",regex:/(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/},{token:"support.constant",regex:/(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\b/},{token:"identifier",regex:o},{regex:"",token:"empty",next:"no_regex"}],start:[i.getStartRule("doc-start"),f("start"),{token:"string.regexp",regex:"\\/",next:"regex"},{token:"text",regex:"\\s+|^$",next:"start"},{token:"empty",regex:"",next:"no_regex"}],regex:[{token:"regexp.keyword.operator",regex:"\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"},{token:"string.regexp",regex:"/[sxngimy]*",next:"no_regex"},{token:"invalid",regex:/\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/},{token:"constant.language.escape",regex:/\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/},{token:"constant.language.delimiter",regex:/\|/},{token:"constant.language.escape",regex:/\[\^?/,next:"regex_character_class"},{token:"empty",regex:"$",next:"no_regex"},{defaultToken:"string.regexp"}],regex_character_class:[{token:"regexp.charclass.keyword.operator",regex:"\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"},{token:"constant.language.escape",regex:"]",next:"regex"},{token:"constant.language.escape",regex:"-"},{token:"empty",regex:"$",next:"no_regex"},{defaultToken:"string.regexp.charachterclass"}],function_arguments:[{token:"variable.parameter",regex:o},{token:"punctuation.operator",regex:"[, ]+"},{token:"punctuation.operator",regex:"$"},{token:"empty",regex:"",next:"no_regex"}],qqstring:[{token:"constant.language.escape",regex:r},{token:"string",regex:"\\\\$",next:"qqstring"},{token:"string",regex:'"|$',next:"no_regex"},{defaultToken:"string"}],qstring:[{token:"constant.language.escape",regex:r},{token:"string",regex:"\\\\$",next:"qstring"},{token:"string",regex:"'|$",next:"no_regex"},{defaultToken:"string"}]};if(!e||!e.noES6)this.$rules.no_regex.unshift({regex:"[{}]",onMatch:function(e,t,n){this.next=e=="{"?this.nextState:"";if(e=="{"&&n.length)n.unshift("start",t);else if(e=="}"&&n.length){n.shift(),this.next=n.shift();if(this.next.indexOf("string")!=-1||this.next.indexOf("jsx")!=-1)return"paren.quasi.end"}return e=="{"?"paren.lparen":"paren.rparen"},nextState:"start"},{token:"string.quasi.start",regex:/`/,push:[{token:"constant.language.escape",regex:r},{token:"paren.quasi.start",regex:/\${/,push:"start"},{token:"string.quasi.end",regex:/`/,next:"pop"},{defaultToken:"string.quasi"}]}),(!e||!e.noJSX)&&a.call(this);this.embedRules(i,"doc-",[i.getEndRule("no_regex")]),this.normalizeRules()};r.inherits(u,s),t.JavaScriptHighlightRules=u}),ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(e,t,n){"use strict";var r=e("../range").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\s+$/.test(e)?/^\s*\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\s*\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),ace.define("ace/mode/behaviour/cstyle",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../behaviour").Behaviour,s=e("../../token_iterator").TokenIterator,o=e("../../lib/lang"),u=["text","paren.rparen","punctuation.operator"],a=["text","paren.rparen","punctuation.operator","comment"],f,l={},c=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:"",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:"",maybeInsertedLineEnd:""}},h=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},p=function(){this.add("braces","insertion",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i=="{"){c(n);var a=n.getSelectionRange(),l=r.doc.getTextRange(a);if(l!==""&&l!=="{"&&n.getWrapBehavioursEnabled())return h(a,l,"{","}");if(p.isSaneInsertion(n,r))return/[\]\}\)]/.test(u[s.column])||n.inMultiSelectMode?(p.recordAutoInsert(n,r,"}"),{text:"{}",selection:[1,1]}):(p.recordMaybeInsert(n,r,"{"),{text:"{",selection:[1,1]})}else if(i=="}"){c(n);var d=u.substring(s.column,s.column+1);if(d=="}"){var v=r.$findOpeningBracket("}",{column:s.column+1,row:s.row});if(v!==null&&p.isAutoInsertedClosing(s,u,i))return p.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}else{if(i=="\n"||i=="\r\n"){c(n);var m="";p.isMaybeInsertedClosing(s,u)&&(m=o.stringRepeat("}",f.maybeInsertedBrackets),p.clearMaybeInsertedClosing());var d=u.substring(s.column,s.column+1);if(d==="}"){var g=r.findMatchingBracket({row:s.row,column:s.column+1},"}");if(!g)return null;var y=this.$getIndent(r.getLine(g.row))}else{if(!m){p.clearMaybeInsertedClosing();return}var y=this.$getIndent(u)}var b=y+r.getTabString();return{text:"\n"+b+"\n"+y+m,selection:[1,b.length,1,b.length]}}p.clearMaybeInsertedClosing()}}),this.add("braces","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="{"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u=="}")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add("parens","insertion",function(e,t,n,r,i){if(i=="("){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==""&&n.getWrapBehavioursEnabled())return h(s,o,"(",")");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,")"),{text:"()",selection:[1,1]}}else if(i==")"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==")"){var l=r.$findOpeningBracket(")",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}}),this.add("parens","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="("){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==")")return i.end.column++,i}}),this.add("brackets","insertion",function(e,t,n,r,i){if(i=="["){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==""&&n.getWrapBehavioursEnabled())return h(s,o,"[","]");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,"]"),{text:"[]",selection:[1,1]}}else if(i=="]"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f=="]"){var l=r.$findOpeningBracket("]",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}}),this.add("brackets","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="["){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u=="]")return i.end.column++,i}}),this.add("string_dquotes","insertion",function(e,t,n,r,i){if(i=='"'||i=="'"){c(n);var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==""&&u!=="'"&&u!='"'&&n.getWrapBehavioursEnabled())return h(o,u,s,s);if(!u){var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column),p=f.substring(a.column,a.column+1),d=r.getTokenAt(a.row,a.column),v=r.getTokenAt(a.row,a.column+1);if(l=="\\"&&d&&/escape/.test(d.type))return null;var m=d&&/string|escape/.test(d.type),g=!v||/string|escape/.test(v.type),y;if(p==s)y=m!==g;else{if(m&&!g)return null;if(m&&g)return null;var b=r.$mode.tokenRe;b.lastIndex=0;var w=b.test(l);b.lastIndex=0;var E=b.test(l);if(w||E)return null;if(p&&!/[\s;,.})\]\\]/.test(p))return null;y=!0}return{text:y?s+s:"",selection:[1,1]}}}}),this.add("string_dquotes","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='"'||s=="'")){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||"text",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||"text",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||"text",a)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(p,i),t.CstyleBehaviour=p}),ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../../range").Range,s=e("./fold_mode").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\|[^|]*?$/,"|"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\|[^|]*?$/,"|"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\{|\[)[^\}\]]*$|^\s*(\/\*)/,this.foldingStopMarker=/^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/,this.singleLineBlockCommentRe=/^\s*(\/\*).*\*\/\s*$/,this.tripleStarBlockCommentRe=/^\s*(\/\*\*\*).*\*\/\s*$/,this.startRegionRe=/^\s*(\/\*|\/\/)#?region\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return"";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?"start":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!="all"&&(u=null)),u}if(t==="markbegin")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++tf)break;var l=this.getFoldWidgetRange(e,"all",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\s*$/),s=e.getLength(),o=n,u=/^\s*(?:\/\*|\/\/|--)#?(end)?region\b/,a=1;while(++no)return new i(o,r,l,t.length)}}.call(o.prototype)}),ace.define("ace/mode/javascript",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/range","ace/worker/worker_client","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./javascript_highlight_rules").JavaScriptHighlightRules,o=e("./matching_brace_outdent").MatchingBraceOutdent,u=e("../range").Range,a=e("../worker/worker_client").WorkerClient,f=e("./behaviour/cstyle").CstyleBehaviour,l=e("./folding/cstyle").FoldMode,c=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new f,this.foldingRules=new l};r.inherits(c,i),function(){this.lineCommentStart="//",this.blockComment={start:"/*",end:"*/"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens,o=i.state;if(s.length&&s[s.length-1].type=="comment")return r;if(e=="start"||e=="no_regex"){var u=t.match(/^.*(?:\bcase\b.*\:|[\{\(\[])\s*$/);u&&(r+=n)}else if(e=="doc-start"){if(o=="start"||o=="no_regex")return"";var u=t.match(/^\s*(\/?)\*/);u&&(u[1]&&(r+=" "),r+="* ")}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.createWorker=function(e){var t=new a(["ace"],"ace/mode/javascript_worker","JavaScriptWorker");return t.attachToDocument(e.getDocument()),t.on("annotate",function(t){e.setAnnotations(t.data)}),t.on("terminate",function(){e.clearAnnotations()}),t},this.$id="ace/mode/javascript"}.call(c.prototype),t.Mode=c}),ace.define("ace/mode/css_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/lang"),s=e("./text_highlight_rules").TextHighlightRules,o=t.supportType="align-content|align-items|align-self|all|animation|animation-delay|animation-direction|animation-duration|animation-fill-mode|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|backface-visibility|background|background-attachment|background-blend-mode|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|border|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|bottom|box-shadow|box-sizing|caption-side|clear|clip|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|cursor|direction|display|empty-cells|filter|flex|flex-basis|flex-direction|flex-flow|flex-grow|flex-shrink|flex-wrap|float|font|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|hanging-punctuation|height|justify-content|left|letter-spacing|line-height|list-style|list-style-image|list-style-position|list-style-type|margin|margin-bottom|margin-left|margin-right|margin-top|max-height|max-width|min-height|min-width|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|order|outline|outline-color|outline-offset|outline-style|outline-width|overflow|overflow-x|overflow-y|padding|padding-bottom|padding-left|padding-right|padding-top|page-break-after|page-break-before|page-break-inside|perspective|perspective-origin|position|quotes|resize|right|tab-size|table-layout|text-align|text-align-last|text-decoration|text-decoration-color|text-decoration-line|text-decoration-style|text-indent|text-justify|text-overflow|text-shadow|text-transform|top|transform|transform-origin|transform-style|transition|transition-delay|transition-duration|transition-property|transition-timing-function|unicode-bidi|vertical-align|visibility|white-space|width|word-break|word-spacing|word-wrap|z-index",u=t.supportFunction="rgb|rgba|url|attr|counter|counters",a=t.supportConstant="absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero",f=t.supportConstantColor="aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow",l=t.supportConstantFonts="arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace",c=t.numRe="\\-?(?:(?:[0-9]+)|(?:[0-9]*\\.[0-9]+))",h=t.pseudoElements="(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b",p=t.pseudoClasses="(:)\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\b",d=function(){var e=this.createKeywordMapper({"support.function":u,"support.constant":a,"support.type":o,"support.constant.color":f,"support.constant.fonts":l},"text",!0);this.$rules={start:[{token:"comment",regex:"\\/\\*",push:"comment"},{token:"paren.lparen",regex:"\\{",push:"ruleset"},{token:"string",regex:"@.*?{",push:"media"},{token:"keyword",regex:"#[a-z0-9-_]+"},{token:"variable",regex:"\\.[a-z0-9-_]+"},{token:"string",regex:":[a-z0-9-_]+"},{token:"constant",regex:"[a-z0-9-_]+"},{caseInsensitive:!0}],media:[{token:"comment",regex:"\\/\\*",push:"comment"},{token:"paren.lparen",regex:"\\{",push:"ruleset"},{token:"string",regex:"\\}",next:"pop"},{token:"keyword",regex:"#[a-z0-9-_]+"},{token:"variable",regex:"\\.[a-z0-9-_]+"},{token:"string",regex:":[a-z0-9-_]+"},{token:"constant",regex:"[a-z0-9-_]+"},{caseInsensitive:!0}],comment:[{token:"comment",regex:"\\*\\/",next:"pop"},{defaultToken:"comment"}],ruleset:[{token:"paren.rparen",regex:"\\}",next:"pop"},{token:"comment",regex:"\\/\\*",push:"comment"},{token:"string",regex:'["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'},{token:"string",regex:"['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"},{token:["constant.numeric","keyword"],regex:"("+c+")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)"},{token:"constant.numeric",regex:c},{token:"constant.numeric",regex:"#[a-f0-9]{6}"},{token:"constant.numeric",regex:"#[a-f0-9]{3}"},{token:["punctuation","entity.other.attribute-name.pseudo-element.css"],regex:h},{token:["punctuation","entity.other.attribute-name.pseudo-class.css"],regex:p},{token:["support.function","string","support.function"],regex:"(url\\()(.*)(\\))"},{token:e,regex:"\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*"},{caseInsensitive:!0}]},this.normalizeRules()};r.inherits(d,s),t.CssHighlightRules=d}),ace.define("ace/mode/css_completions",["require","exports","module"],function(e,t,n){"use strict";var r={background:{"#$0":1},"background-color":{"#$0":1,transparent:1,fixed:1},"background-image":{"url('/$0')":1},"background-repeat":{repeat:1,"repeat-x":1,"repeat-y":1,"no-repeat":1,inherit:1},"background-position":{bottom:2,center:2,left:2,right:2,top:2,inherit:2},"background-attachment":{scroll:1,fixed:1},"background-size":{cover:1,contain:1},"background-clip":{"border-box":1,"padding-box":1,"content-box":1},"background-origin":{"border-box":1,"padding-box":1,"content-box":1},border:{"solid $0":1,"dashed $0":1,"dotted $0":1,"#$0":1},"border-color":{"#$0":1},"border-style":{solid:2,dashed:2,dotted:2,"double":2,groove:2,hidden:2,inherit:2,inset:2,none:2,outset:2,ridged:2},"border-collapse":{collapse:1,separate:1},bottom:{px:1,em:1,"%":1},clear:{left:1,right:1,both:1,none:1},color:{"#$0":1,"rgb(#$00,0,0)":1},cursor:{"default":1,pointer:1,move:1,text:1,wait:1,help:1,progress:1,"n-resize":1,"ne-resize":1,"e-resize":1,"se-resize":1,"s-resize":1,"sw-resize":1,"w-resize":1,"nw-resize":1},display:{none:1,block:1,inline:1,"inline-block":1,"table-cell":1},"empty-cells":{show:1,hide:1},"float":{left:1,right:1,none:1},"font-family":{Arial:2,"Comic Sans MS":2,Consolas:2,"Courier New":2,Courier:2,Georgia:2,Monospace:2,"Sans-Serif":2,"Segoe UI":2,Tahoma:2,"Times New Roman":2,"Trebuchet MS":2,Verdana:1},"font-size":{px:1,em:1,"%":1},"font-weight":{bold:1,normal:1},"font-style":{italic:1,normal:1},"font-variant":{normal:1,"small-caps":1},height:{px:1,em:1,"%":1},left:{px:1,em:1,"%":1},"letter-spacing":{normal:1},"line-height":{normal:1},"list-style-type":{none:1,disc:1,circle:1,square:1,decimal:1,"decimal-leading-zero":1,"lower-roman":1,"upper-roman":1,"lower-greek":1,"lower-latin":1,"upper-latin":1,georgian:1,"lower-alpha":1,"upper-alpha":1},margin:{px:1,em:1,"%":1},"margin-right":{px:1,em:1,"%":1},"margin-left":{px:1,em:1,"%":1},"margin-top":{px:1,em:1,"%":1},"margin-bottom":{px:1,em:1,"%":1},"max-height":{px:1,em:1,"%":1},"max-width":{px:1,em:1,"%":1},"min-height":{px:1,em:1,"%":1},"min-width":{px:1,em:1,"%":1},overflow:{hidden:1,visible:1,auto:1,scroll:1},"overflow-x":{hidden:1,visible:1,auto:1,scroll:1},"overflow-y":{hidden:1,visible:1,auto:1,scroll:1},padding:{px:1,em:1,"%":1},"padding-top":{px:1,em:1,"%":1},"padding-right":{px:1,em:1,"%":1},"padding-bottom":{px:1,em:1,"%":1},"padding-left":{px:1,em:1,"%":1},"page-break-after":{auto:1,always:1,avoid:1,left:1,right:1},"page-break-before":{auto:1,always:1,avoid:1,left:1,right:1},position:{absolute:1,relative:1,fixed:1,"static":1},right:{px:1,em:1,"%":1},"table-layout":{fixed:1,auto:1},"text-decoration":{none:1,underline:1,"line-through":1,blink:1},"text-align":{left:1,right:1,center:1,justify:1},"text-transform":{capitalize:1,uppercase:1,lowercase:1,none:1},top:{px:1,em:1,"%":1},"vertical-align":{top:1,bottom:1},visibility:{hidden:1,visible:1},"white-space":{nowrap:1,normal:1,pre:1,"pre-line":1,"pre-wrap":1},width:{px:1,em:1,"%":1},"word-spacing":{normal:1},filter:{"alpha(opacity=$0100)":1},"text-shadow":{"$02px 2px 2px #777":1},"text-overflow":{"ellipsis-word":1,clip:1,ellipsis:1},"-moz-border-radius":1,"-moz-border-radius-topright":1,"-moz-border-radius-bottomright":1,"-moz-border-radius-topleft":1,"-moz-border-radius-bottomleft":1,"-webkit-border-radius":1,"-webkit-border-top-right-radius":1,"-webkit-border-top-left-radius":1,"-webkit-border-bottom-right-radius":1,"-webkit-border-bottom-left-radius":1,"-moz-box-shadow":1,"-webkit-box-shadow":1,transform:{"rotate($00deg)":1,"skew($00deg)":1},"-moz-transform":{"rotate($00deg)":1,"skew($00deg)":1},"-webkit-transform":{"rotate($00deg)":1,"skew($00deg)":1}},i=function(){};(function(){this.completionsDefined=!1,this.defineCompletions=function(){if(document){var e=document.createElement("c").style;for(var t in e){if(typeof e[t]!="string")continue;var n=t.replace(/[A-Z]/g,function(e){return"-"+e.toLowerCase()});r.hasOwnProperty(n)||(r[n]=1)}}this.completionsDefined=!0},this.getCompletions=function(e,t,n,r){this.completionsDefined||this.defineCompletions();var i=t.getTokenAt(n.row,n.column);if(!i)return[];if(e==="ruleset"){var s=t.getLine(n.row).substr(0,n.column);return/:[^;]+$/.test(s)?(/([\w\-]+):[^:]*$/.test(s),this.getPropertyValueCompletions(e,t,n,r)):this.getPropertyCompletions(e,t,n,r)}return[]},this.getPropertyCompletions=function(e,t,n,i){var s=Object.keys(r);return s.map(function(e){return{caption:e,snippet:e+": $0",meta:"property",score:Number.MAX_VALUE}})},this.getPropertyValueCompletions=function(e,t,n,i){var s=t.getLine(n.row).substr(0,n.column),o=(/([\w\-]+):[^:]*$/.exec(s)||{})[1];if(!o)return[];var u=[];return o in r&&typeof r[o]=="object"&&(u=Object.keys(r[o])),u.map(function(e){return{caption:e,snippet:e,meta:"property value",score:Number.MAX_VALUE}})}}).call(i.prototype),t.CssCompletions=i}),ace.define("ace/mode/behaviour/css",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/mode/behaviour/cstyle","ace/token_iterator"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../behaviour").Behaviour,s=e("./cstyle").CstyleBehaviour,o=e("../../token_iterator").TokenIterator,u=function(){this.inherit(s),this.add("colon","insertion",function(e,t,n,r,i){if(i===":"){var s=n.getCursorPosition(),u=new o(r,s.row,s.column),a=u.getCurrentToken();a&&a.value.match(/\s+/)&&(a=u.stepBackward());if(a&&a.type==="support.type"){var f=r.doc.getLine(s.row),l=f.substring(s.column,s.column+1);if(l===":")return{text:"",selection:[1,1]};if(!f.substring(s.column).match(/^\s*;/))return{text:":;",selection:[1,1]}}}}),this.add("colon","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s===":"){var u=n.getCursorPosition(),a=new o(r,u.row,u.column),f=a.getCurrentToken();f&&f.value.match(/\s+/)&&(f=a.stepBackward());if(f&&f.type==="support.type"){var l=r.doc.getLine(i.start.row),c=l.substring(i.end.column,i.end.column+1);if(c===";")return i.end.column++,i}}}),this.add("semicolon","insertion",function(e,t,n,r,i){if(i===";"){var s=n.getCursorPosition(),o=r.doc.getLine(s.row),u=o.substring(s.column,s.column+1);if(u===";")return{text:"",selection:[1,1]}}})};r.inherits(u,s),t.CssBehaviour=u}),ace.define("ace/mode/css",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/css_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/css_completions","ace/mode/behaviour/css","ace/mode/folding/cstyle"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./css_highlight_rules").CssHighlightRules,o=e("./matching_brace_outdent").MatchingBraceOutdent,u=e("../worker/worker_client").WorkerClient,a=e("./css_completions").CssCompletions,f=e("./behaviour/css").CssBehaviour,l=e("./folding/cstyle").FoldMode,c=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new f,this.$completer=new a,this.foldingRules=new l};r.inherits(c,i),function(){this.foldingRules="cStyle",this.blockComment={start:"/*",end:"*/"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e).tokens;if(i.length&&i[i.length-1].type=="comment")return r;var s=t.match(/^.*\{\s*$/);return s&&(r+=n),r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.getCompletions=function(e,t,n,r){return this.$completer.getCompletions(e,t,n,r)},this.createWorker=function(e){var t=new u(["ace"],"ace/mode/css_worker","Worker");return t.attachToDocument(e.getDocument()),t.on("annotate",function(t){e.setAnnotations(t.data)}),t.on("terminate",function(){e.clearAnnotations()}),t},this.$id="ace/mode/css"}.call(c.prototype),t.Mode=c}),ace.define("ace/mode/xml_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(e){var t="[_:a-zA-Z\u00c0-\uffff][-_:.a-zA-Z0-9\u00c0-\uffff]*";this.$rules={start:[{token:"string.cdata.xml",regex:"<\\!\\[CDATA\\[",next:"cdata"},{token:["punctuation.xml-decl.xml","keyword.xml-decl.xml"],regex:"(<\\?)(xml)(?=[\\s])",next:"xml_decl",caseInsensitive:!0},{token:["punctuation.instruction.xml","keyword.instruction.xml"],regex:"(<\\?)("+t+")",next:"processing_instruction"},{token:"comment.xml",regex:"<\\!--",next:"comment"},{token:["xml-pe.doctype.xml","xml-pe.doctype.xml"],regex:"(<\\!)(DOCTYPE)(?=[\\s])",next:"doctype",caseInsensitive:!0},{include:"tag"},{token:"text.end-tag-open.xml",regex:""},{token:"text.tag-open.xml",regex:"<"},{include:"reference"},{defaultToken:"text.xml"}],xml_decl:[{token:"entity.other.attribute-name.decl-attribute-name.xml",regex:"(?:"+t+":)?"+t+""},{token:"keyword.operator.decl-attribute-equals.xml",regex:"="},{include:"whitespace"},{include:"string"},{token:"punctuation.xml-decl.xml",regex:"\\?>",next:"start"}],processing_instruction:[{token:"punctuation.instruction.xml",regex:"\\?>",next:"start"},{defaultToken:"instruction.xml"}],doctype:[{include:"whitespace"},{include:"string"},{token:"xml-pe.doctype.xml",regex:">",next:"start"},{token:"xml-pe.xml",regex:"[-_a-zA-Z0-9:]+"},{token:"punctuation.int-subset",regex:"\\[",push:"int_subset"}],int_subset:[{token:"text.xml",regex:"\\s+"},{token:"punctuation.int-subset.xml",regex:"]",next:"pop"},{token:["punctuation.markup-decl.xml","keyword.markup-decl.xml"],regex:"(<\\!)("+t+")",push:[{token:"text",regex:"\\s+"},{token:"punctuation.markup-decl.xml",regex:">",next:"pop"},{include:"string"}]}],cdata:[{token:"string.cdata.xml",regex:"\\]\\]>",next:"start"},{token:"text.xml",regex:"\\s+"},{token:"text.xml",regex:"(?:[^\\]]|\\](?!\\]>))+"}],comment:[{token:"comment.xml",regex:"-->",next:"start"},{defaultToken:"comment.xml"}],reference:[{token:"constant.language.escape.reference.xml",regex:"(?:[0-9]+;)|(?:[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"}],attr_reference:[{token:"constant.language.escape.reference.attribute-value.xml",regex:"(?:[0-9]+;)|(?:[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"}],tag:[{token:["meta.tag.punctuation.tag-open.xml","meta.tag.punctuation.end-tag-open.xml","meta.tag.tag-name.xml"],regex:"(?:(<)|())((?:"+t+":)?"+t+")",next:[{include:"attributes"},{token:"meta.tag.punctuation.tag-close.xml",regex:"/?>",next:"start"}]}],tag_whitespace:[{token:"text.tag-whitespace.xml",regex:"\\s+"}],whitespace:[{token:"text.whitespace.xml",regex:"\\s+"}],string:[{token:"string.xml",regex:"'",push:[{token:"string.xml",regex:"'",next:"pop"},{defaultToken:"string.xml"}]},{token:"string.xml",regex:'"',push:[{token:"string.xml",regex:'"',next:"pop"},{defaultToken:"string.xml"}]}],attributes:[{token:"entity.other.attribute-name.xml",regex:"(?:"+t+":)?"+t+""},{token:"keyword.operator.attribute-equals.xml",regex:"="},{include:"tag_whitespace"},{include:"attribute_value"}],attribute_value:[{token:"string.attribute-value.xml",regex:"'",push:[{token:"string.attribute-value.xml",regex:"'",next:"pop"},{include:"attr_reference"},{defaultToken:"string.attribute-value.xml"}]},{token:"string.attribute-value.xml",regex:'"',push:[{token:"string.attribute-value.xml",regex:'"',next:"pop"},{include:"attr_reference"},{defaultToken:"string.attribute-value.xml"}]}]},this.constructor===s&&this.normalizeRules()};(function(){this.embedTagRules=function(e,t,n){this.$rules.tag.unshift({token:["meta.tag.punctuation.tag-open.xml","meta.tag."+n+".tag-name.xml"],regex:"(<)("+n+"(?=\\s|>|$))",next:[{include:"attributes"},{token:"meta.tag.punctuation.tag-close.xml",regex:"/?>",next:t+"start"}]}),this.$rules[n+"-end"]=[{include:"attributes"},{token:"meta.tag.punctuation.tag-close.xml",regex:"/?>",next:"start",onMatch:function(e,t,n){return n.splice(0),this.token}}],this.embedRules(e,t,[{token:["meta.tag.punctuation.end-tag-open.xml","meta.tag."+n+".tag-name.xml"],regex:"()("+n+"(?=\\s|>|$))",next:n+"-end"},{token:"string.cdata.xml",regex:"<\\!\\[CDATA\\["},{token:"string.cdata.xml",regex:"\\]\\]>"}])}}).call(i.prototype),r.inherits(s,i),t.XmlHighlightRules=s}),ace.define("ace/mode/html_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/css_highlight_rules","ace/mode/javascript_highlight_rules","ace/mode/xml_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/lang"),s=e("./css_highlight_rules").CssHighlightRules,o=e("./javascript_highlight_rules").JavaScriptHighlightRules,u=e("./xml_highlight_rules").XmlHighlightRules,a=i.createMap({a:"anchor",button:"form",form:"form",img:"image",input:"form",label:"form",option:"form",script:"script",select:"form",textarea:"form",style:"style",table:"table",tbody:"table",td:"table",tfoot:"table",th:"table",tr:"table"}),f=function(){u.call(this),this.addRules({attributes:[{include:"tag_whitespace"},{token:"entity.other.attribute-name.xml",regex:"[-_a-zA-Z0-9:.]+"},{token:"keyword.operator.attribute-equals.xml",regex:"=",push:[{include:"tag_whitespace"},{token:"string.unquoted.attribute-value.html",regex:"[^<>='\"`\\s]+",next:"pop"},{token:"empty",regex:"",next:"pop"}]},{include:"attribute_value"}],tag:[{token:function(e,t){var n=a[t];return["meta.tag.punctuation."+(e=="<"?"":"end-")+"tag-open.xml","meta.tag"+(n?"."+n:"")+".tag-name.xml"]},regex:"(?)([-_a-zA-Z0-9:.]+)",next:"tag_stuff"}],tag_stuff:[{include:"attributes"},{token:"meta.tag.punctuation.tag-close.xml",regex:"/?>",next:"start"}]}),this.embedTagRules(s,"css-","style"),this.embedTagRules((new o({noJSX:!0})).getRules(),"js-","script"),this.constructor===f&&this.normalizeRules()};r.inherits(f,u),t.HtmlHighlightRules=f}),ace.define("ace/mode/behaviour/xml",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"],function(e,t,n){"use strict";function u(e,t){return e.type.lastIndexOf(t+".xml")>-1}var r=e("../../lib/oop"),i=e("../behaviour").Behaviour,s=e("../../token_iterator").TokenIterator,o=e("../../lib/lang"),a=function(){this.add("string_dquotes","insertion",function(e,t,n,r,i){if(i=='"'||i=="'"){var o=i,a=r.doc.getTextRange(n.getSelectionRange());if(a!==""&&a!=="'"&&a!='"'&&n.getWrapBehavioursEnabled())return{text:o+a+o,selection:!1};var f=n.getCursorPosition(),l=r.doc.getLine(f.row),c=l.substring(f.column,f.column+1),h=new s(r,f.row,f.column),p=h.getCurrentToken();if(c==o&&(u(p,"attribute-value")||u(p,"string")))return{text:"",selection:[1,1]};p||(p=h.stepBackward());if(!p)return;while(u(p,"tag-whitespace")||u(p,"whitespace"))p=h.stepBackward();var d=!c||c.match(/\s/);if(u(p,"attribute-equals")&&(d||c==">")||u(p,"decl-attribute-equals")&&(d||c=="?"))return{text:o+o,selection:[1,1]}}}),this.add("string_dquotes","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='"'||s=="'")){var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}}),this.add("autoclosing","insertion",function(e,t,n,r,i){if(i==">"){var o=n.getCursorPosition(),a=new s(r,o.row,o.column),f=a.getCurrentToken()||a.stepBackward();if(!f||!(u(f,"tag-name")||u(f,"tag-whitespace")||u(f,"attribute-name")||u(f,"attribute-equals")||u(f,"attribute-value")))return;if(u(f,"reference.attribute-value"))return;if(u(f,"attribute-value")){var l=f.value.charAt(0);if(l=='"'||l=="'"){var c=f.value.charAt(f.value.length-1),h=a.getCurrentTokenColumn()+f.value.length;if(h>o.column||h==o.column&&l!=c)return}}while(!u(f,"tag-name"))f=a.stepBackward();var p=a.getCurrentTokenRow(),d=a.getCurrentTokenColumn();if(u(a.stepBackward(),"end-tag-open"))return;var v=f.value;p==o.row&&(v=v.substring(0,o.column-d));if(this.voidElements.hasOwnProperty(v.toLowerCase()))return;return{text:">"+v+">",selection:[1,1]}}}),this.add("autoindent","insertion",function(e,t,n,r,i){if(i=="\n"){var o=n.getCursorPosition(),u=r.getLine(o.row),a=new s(r,o.row,o.column),f=a.getCurrentToken();if(f&&f.type.indexOf("tag-close")!==-1){if(f.value=="/>")return;while(f&&f.type.indexOf("tag-name")===-1)f=a.stepBackward();if(!f)return;var l=f.value,c=a.getCurrentTokenRow();f=a.stepBackward();if(!f||f.type.indexOf("end-tag")!==-1)return;if(this.voidElements&&!this.voidElements[l]){var h=r.getTokenAt(o.row,o.column+1),u=r.getLine(c),p=this.$getIndent(u),d=p+r.getTabString();return h&&h.value===""?{text:"\n"+d+"\n"+p,selection:[1,d.length,1,d.length]}:{text:"\n"+d}}}}})};r.inherits(a,i),t.XmlBehaviour=a}),ace.define("ace/mode/folding/mixed",["require","exports","module","ace/lib/oop","ace/mode/folding/fold_mode"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("./fold_mode").FoldMode,s=t.FoldMode=function(e,t){this.defaultMode=e,this.subModes=t};r.inherits(s,i),function(){this.$getMode=function(e){typeof e!="string"&&(e=e[0]);for(var t in this.subModes)if(e.indexOf(t)===0)return this.subModes[t];return null},this.$tryMode=function(e,t,n,r){var i=this.$getMode(e);return i?i.getFoldWidget(t,n,r):""},this.getFoldWidget=function(e,t,n){return this.$tryMode(e.getState(n-1),e,t,n)||this.$tryMode(e.getState(n),e,t,n)||this.defaultMode.getFoldWidget(e,t,n)},this.getFoldWidgetRange=function(e,t,n){var r=this.$getMode(e.getState(n-1));if(!r||!r.getFoldWidget(e,t,n))r=this.$getMode(e.getState(n));if(!r||!r.getFoldWidget(e,t,n))r=this.defaultMode;return r.getFoldWidgetRange(e,t,n)}}.call(s.prototype)}),ace.define("ace/mode/folding/xml",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/range","ace/mode/folding/fold_mode","ace/token_iterator"],function(e,t,n){"use strict";function l(e,t){return e.type.lastIndexOf(t+".xml")>-1}var r=e("../../lib/oop"),i=e("../../lib/lang"),s=e("../../range").Range,o=e("./fold_mode").FoldMode,u=e("../../token_iterator").TokenIterator,a=t.FoldMode=function(e,t){o.call(this),this.voidElements=e||{},this.optionalEndTags=r.mixin({},this.voidElements),t&&r.mixin(this.optionalEndTags,t)};r.inherits(a,o);var f=function(){this.tagName="",this.closing=!1,this.selfClosing=!1,this.start={row:0,column:0},this.end={row:0,column:0}};(function(){this.getFoldWidget=function(e,t,n){var r=this._getFirstTagInLine(e,n);return r?r.closing||!r.tagName&&r.selfClosing?t=="markbeginend"?"end":"":!r.tagName||r.selfClosing||this.voidElements.hasOwnProperty(r.tagName.toLowerCase())?"":this._findEndTagInLine(e,n,r.tagName,r.end.column)?"":"start":""},this._getFirstTagInLine=function(e,t){var n=e.getTokens(t),r=new f;for(var i=0;i ";break}}return r}if(l(s,"tag-close"))return r.selfClosing=s.value=="/>",r;r.start.column+=s.value.length}return null},this._findEndTagInLine=function(e,t,n,r){var i=e.getTokens(t),s=0;for(var o=0;o",n.end.row=e.getCurrentTokenRow(),n.end.column=e.getCurrentTokenColumn()+t.value.length,e.stepForward(),n;while(t=e.stepForward());return null},this._readTagBackward=function(e){var t=e.getCurrentToken();if(!t)return null;var n=new f;do{if(l(t,"tag-open"))return n.closing=l(t,"end-tag-open"),n.start.row=e.getCurrentTokenRow(),n.start.column=e.getCurrentTokenColumn(),e.stepBackward(),n;l(t,"tag-name")?n.tagName=t.value:l(t,"tag-close")&&(n.selfClosing=t.value=="/>",n.end.row=e.getCurrentTokenRow(),n.end.column=e.getCurrentTokenColumn()+t.value.length)}while(t=e.stepBackward());return null},this._pop=function(e,t){while(e.length){var n=e[e.length-1];if(!t||n.tagName==t.tagName)return e.pop();if(this.optionalEndTags.hasOwnProperty(n.tagName)){e.pop();continue}return null}},this.getFoldWidgetRange=function(e,t,n){var r=this._getFirstTagInLine(e,n);if(!r)return null;var i=r.closing||r.selfClosing,o=[],a;if(!i){var f=new u(e,n,r.start.column),l={row:n,column:r.start.column+r.tagName.length+2};r.start.row==r.end.row&&(l.column=r.end.column);while(a=this._readTagForward(f)){if(a.selfClosing){if(!o.length)return a.start.column+=a.tagName.length+2,a.end.column-=2,s.fromPoints(a.start,a.end);continue}if(a.closing){this._pop(o,a);if(o.length==0)return s.fromPoints(l,a.start)}else o.push(a)}}else{var f=new u(e,n,r.end.column),c={row:n,column:r.start.column};while(a=this._readTagBackward(f)){if(a.selfClosing){if(!o.length)return a.start.column+=a.tagName.length+2,a.end.column-=2,s.fromPoints(a.start,a.end);continue}if(!a.closing){this._pop(o,a);if(o.length==0)return a.start.column+=a.tagName.length+2,a.start.row==a.end.row&&a.start.column-1}function l(e,t){var n=new r(e,t.row,t.column),i=n.getCurrentToken();while(i&&!f(i,"tag-name"))i=n.stepBackward();if(i)return i.value}function c(e,t){var n=new r(e,t.row,t.column),i=n.getCurrentToken();while(i&&!f(i,"attribute-name"))i=n.stepBackward();if(i)return i.value}var r=e("../token_iterator").TokenIterator,i=["accesskey","class","contenteditable","contextmenu","dir","draggable","dropzone","hidden","id","inert","itemid","itemprop","itemref","itemscope","itemtype","lang","spellcheck","style","tabindex","title","translate"],s=["onabort","onblur","oncancel","oncanplay","oncanplaythrough","onchange","onclick","onclose","oncontextmenu","oncuechange","ondblclick","ondrag","ondragend","ondragenter","ondragleave","ondragover","ondragstart","ondrop","ondurationchange","onemptied","onended","onerror","onfocus","oninput","oninvalid","onkeydown","onkeypress","onkeyup","onload","onloadeddata","onloadedmetadata","onloadstart","onmousedown","onmousemove","onmouseout","onmouseover","onmouseup","onmousewheel","onpause","onplay","onplaying","onprogress","onratechange","onreset","onscroll","onseeked","onseeking","onselect","onshow","onstalled","onsubmit","onsuspend","ontimeupdate","onvolumechange","onwaiting"],o=i.concat(s),u={html:{manifest:1},head:{},title:{},base:{href:1,target:1},link:{href:1,hreflang:1,rel:{stylesheet:1,icon:1},media:{all:1,screen:1,print:1},type:{"text/css":1,"image/png":1,"image/jpeg":1,"image/gif":1},sizes:1},meta:{"http-equiv":{"content-type":1},name:{description:1,keywords:1},content:{"text/html; charset=UTF-8":1},charset:1},style:{type:1,media:{all:1,screen:1,print:1},scoped:1},script:{charset:1,type:{"text/javascript":1},src:1,defer:1,async:1},noscript:{href:1},body:{onafterprint:1,onbeforeprint:1,onbeforeunload:1,onhashchange:1,onmessage:1,onoffline:1,onpopstate:1,onredo:1,onresize:1,onstorage:1,onundo:1,onunload:1},section:{},nav:{},article:{pubdate:1},aside:{},h1:{},h2:{},h3:{},h4:{},h5:{},h6:{},header:{},footer:{},address:{},main:{},p:{},hr:{},pre:{},blockquote:{cite:1},ol:{start:1,reversed:1},ul:{},li:{value:1},dl:{},dt:{},dd:{},figure:{},figcaption:{},div:{},a:{href:1,target:{_blank:1,top:1},ping:1,rel:{nofollow:1,alternate:1,author:1,bookmark:1,help:1,license:1,next:1,noreferrer:1,prefetch:1,prev:1,search:1,tag:1},media:1,hreflang:1,type:1},em:{},strong:{},small:{},s:{},cite:{},q:{cite:1},dfn:{},abbr:{},data:{},time:{datetime:1},code:{},"var":{},samp:{},kbd:{},sub:{},sup:{},i:{},b:{},u:{},mark:{},ruby:{},rt:{},rp:{},bdi:{},bdo:{},span:{},br:{},wbr:{},ins:{cite:1,datetime:1},del:{cite:1,datetime:1},img:{alt:1,src:1,height:1,width:1,usemap:1,ismap:1},iframe:{name:1,src:1,height:1,width:1,sandbox:{"allow-same-origin":1,"allow-top-navigation":1,"allow-forms":1,"allow-scripts":1},seamless:{seamless:1}},embed:{src:1,height:1,width:1,type:1},object:{param:1,data:1,type:1,height:1,width:1,usemap:1,name:1,form:1,classid:1},param:{name:1,value:1},video:{src:1,autobuffer:1,autoplay:{autoplay:1},loop:{loop:1},controls:{controls:1},width:1,height:1,poster:1,muted:{muted:1},preload:{auto:1,metadata:1,none:1}},audio:{src:1,autobuffer:1,autoplay:{autoplay:1},loop:{loop:1},controls:{controls:1},muted:{muted:1},preload:{auto:1,metadata:1,none:1}},source:{src:1,type:1,media:1},track:{kind:1,src:1,srclang:1,label:1,"default":1},canvas:{width:1,height:1},map:{name:1},area:{shape:1,coords:1,href:1,hreflang:1,alt:1,target:1,media:1,rel:1,ping:1,type:1},svg:{},math:{},table:{summary:1},caption:{},colgroup:{span:1},col:{span:1},tbody:{},thead:{},tfoot:{},tr:{},td:{headers:1,rowspan:1,colspan:1},th:{headers:1,rowspan:1,colspan:1,scope:1},form:{"accept-charset":1,action:1,autocomplete:1,enctype:{"multipart/form-data":1,"application/x-www-form-urlencoded":1},method:{get:1,post:1},name:1,novalidate:1,target:{_blank:1,top:1}},fieldset:{disabled:1,form:1,name:1},legend:{},label:{form:1,"for":1},input:{type:{text:1,password:1,hidden:1,checkbox:1,submit:1,radio:1,file:1,button:1,reset:1,image:31,color:1,date:1,datetime:1,"datetime-local":1,email:1,month:1,number:1,range:1,search:1,tel:1,time:1,url:1,week:1},accept:1,alt:1,autocomplete:{on:1,off:1},autofocus:{autofocus:1},checked:{checked:1},disabled:{disabled:1},form:1,formaction:1,formenctype:{"application/x-www-form-urlencoded":1,"multipart/form-data":1,"text/plain":1},formmethod:{get:1,post:1},formnovalidate:{formnovalidate:1},formtarget:{_blank:1,_self:1,_parent:1,_top:1},height:1,list:1,max:1,maxlength:1,min:1,multiple:{multiple:1},pattern:1,placeholder:1,readonly:{readonly:1},required:{required:1},size:1,src:1,step:1,width:1,files:1,value:1},button:{autofocus:1,disabled:{disabled:1},form:1,formaction:1,formenctype:1,formmethod:1,formnovalidate:1,formtarget:1,name:1,value:1,type:{button:1,submit:1}},select:{autofocus:1,disabled:1,form:1,multiple:{multiple:1},name:1,size:1,readonly:{readonly:1}},datalist:{},optgroup:{disabled:1,label:1},option:{disabled:1,selected:1,label:1,value:1},textarea:{autofocus:{autofocus:1},disabled:{disabled:1},form:1,maxlength:1,name:1,placeholder:1,readonly:{readonly:1},required:{required:1},rows:1,cols:1,wrap:{on:1,off:1,hard:1,soft:1}},keygen:{autofocus:1,challenge:{challenge:1},disabled:{disabled:1},form:1,keytype:{rsa:1,dsa:1,ec:1},name:1},output:{"for":1,form:1,name:1},progress:{value:1,max:1},meter:{value:1,min:1,max:1,low:1,high:1,optimum:1},details:{open:1},summary:{},command:{type:1,label:1,icon:1,disabled:1,checked:1,radiogroup:1,command:1},menu:{type:1,label:1},dialog:{open:1}},a=Object.keys(u),h=function(){};(function(){this.getCompletions=function(e,t,n,r){var i=t.getTokenAt(n.row,n.column);if(!i)return[];if(f(i,"tag-name")||f(i,"tag-open")||f(i,"end-tag-open"))return this.getTagCompletions(e,t,n,r);if(f(i,"tag-whitespace")||f(i,"attribute-name"))return this.getAttributeCompletions(e,t,n,r);if(f(i,"attribute-value"))return this.getAttributeValueCompletions(e,t,n,r);var s=t.getLine(n.row).substr(0,n.column);return/&[A-z]*$/i.test(s)?this.getHTMLEntityCompletions(e,t,n,r):[]},this.getTagCompletions=function(e,t,n,r){return a.map(function(e){return{value:e,meta:"tag",score:Number.MAX_VALUE}})},this.getAttributeCompletions=function(e,t,n,r){var i=l(t,n);if(!i)return[];var s=o;return i in u&&(s=s.concat(Object.keys(u[i]))),s.map(function(e){return{caption:e,snippet:e+'="$0"',meta:"attribute",score:Number.MAX_VALUE}})},this.getAttributeValueCompletions=function(e,t,n,r){var i=l(t,n),s=c(t,n);if(!i)return[];var o=[];return i in u&&s in u[i]&&typeof u[i][s]=="object"&&(o=Object.keys(u[i][s])),o.map(function(e){return{caption:e,snippet:e,meta:"attribute value",score:Number.MAX_VALUE}})},this.getHTMLEntityCompletions=function(e,t,n,r){var i=["Aacute;","aacute;","Acirc;","acirc;","acute;","AElig;","aelig;","Agrave;","agrave;","alefsym;","Alpha;","alpha;","amp;","and;","ang;","Aring;","aring;","asymp;","Atilde;","atilde;","Auml;","auml;","bdquo;","Beta;","beta;","brvbar;","bull;","cap;","Ccedil;","ccedil;","cedil;","cent;","Chi;","chi;","circ;","clubs;","cong;","copy;","crarr;","cup;","curren;","Dagger;","dagger;","dArr;","darr;","deg;","Delta;","delta;","diams;","divide;","Eacute;","eacute;","Ecirc;","ecirc;","Egrave;","egrave;","empty;","emsp;","ensp;","Epsilon;","epsilon;","equiv;","Eta;","eta;","ETH;","eth;","Euml;","euml;","euro;","exist;","fnof;","forall;","frac12;","frac14;","frac34;","frasl;","Gamma;","gamma;","ge;","gt;","hArr;","harr;","hearts;","hellip;","Iacute;","iacute;","Icirc;","icirc;","iexcl;","Igrave;","igrave;","image;","infin;","int;","Iota;","iota;","iquest;","isin;","Iuml;","iuml;","Kappa;","kappa;","Lambda;","lambda;","lang;","laquo;","lArr;","larr;","lceil;","ldquo;","le;","lfloor;","lowast;","loz;","lrm;","lsaquo;","lsquo;","lt;","macr;","mdash;","micro;","middot;","minus;","Mu;","mu;","nabla;","nbsp;","ndash;","ne;","ni;","not;","notin;","nsub;","Ntilde;","ntilde;","Nu;","nu;","Oacute;","oacute;","Ocirc;","ocirc;","OElig;","oelig;","Ograve;","ograve;","oline;","Omega;","omega;","Omicron;","omicron;","oplus;","or;","ordf;","ordm;","Oslash;","oslash;","Otilde;","otilde;","otimes;","Ouml;","ouml;","para;","part;","permil;","perp;","Phi;","phi;","Pi;","pi;","piv;","plusmn;","pound;","Prime;","prime;","prod;","prop;","Psi;","psi;","quot;","radic;","rang;","raquo;","rArr;","rarr;","rceil;","rdquo;","real;","reg;","rfloor;","Rho;","rho;","rlm;","rsaquo;","rsquo;","sbquo;","Scaron;","scaron;","sdot;","sect;","shy;","Sigma;","sigma;","sigmaf;","sim;","spades;","sub;","sube;","sum;","sup;","sup1;","sup2;","sup3;","supe;","szlig;","Tau;","tau;","there4;","Theta;","theta;","thetasym;","thinsp;","THORN;","thorn;","tilde;","times;","trade;","Uacute;","uacute;","uArr;","uarr;","Ucirc;","ucirc;","Ugrave;","ugrave;","uml;","upsih;","Upsilon;","upsilon;","Uuml;","uuml;","weierp;","Xi;","xi;","Yacute;","yacute;","yen;","Yuml;","yuml;","Zeta;","zeta;","zwj;","zwnj;"];return i.map(function(e){return{caption:e,snippet:e,meta:"html entity",score:Number.MAX_VALUE}})}}).call(h.prototype),t.HtmlCompletions=h}),ace.define("ace/mode/html",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text","ace/mode/javascript","ace/mode/css","ace/mode/html_highlight_rules","ace/mode/behaviour/xml","ace/mode/folding/html","ace/mode/html_completions","ace/worker/worker_client"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/lang"),s=e("./text").Mode,o=e("./javascript").Mode,u=e("./css").Mode,a=e("./html_highlight_rules").HtmlHighlightRules,f=e("./behaviour/xml").XmlBehaviour,l=e("./folding/html").FoldMode,c=e("./html_completions").HtmlCompletions,h=e("../worker/worker_client").WorkerClient,p=["area","base","br","col","embed","hr","img","input","keygen","link","meta","menuitem","param","source","track","wbr"],d=["li","dt","dd","p","rt","rp","optgroup","option","colgroup","td","th"],v=function(e){this.fragmentContext=e&&e.fragmentContext,this.HighlightRules=a,this.$behaviour=new f,this.$completer=new c,this.createModeDelegates({"js-":o,"css-":u}),this.foldingRules=new l(this.voidElements,i.arrayToMap(d))};r.inherits(v,s),function(){this.blockComment={start:""},this.voidElements=i.arrayToMap(p),this.getNextLineIndent=function(e,t,n){return this.$getIndent(t)},this.checkOutdent=function(e,t,n){return!1},this.getCompletions=function(e,t,n,r){return this.$completer.getCompletions(e,t,n,r)},this.createWorker=function(e){if(this.constructor!=v)return;var t=new h(["ace"],"ace/mode/html_worker","Worker");return t.attachToDocument(e.getDocument()),this.fragmentContext&&t.call("setOptions",[{context:this.fragmentContext}]),t.on("error",function(t){e.setAnnotations(t.data)}),t.on("terminate",function(){e.clearAnnotations()}),t},this.$id="ace/mode/html"}.call(v.prototype),t.Mode=v}),ace.define("ace/mode/handlebars_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/html_highlight_rules"],function(e,t,n){"use strict";function s(e,t){return t.splice(0,3),t.shift()||"start"}var r=e("../lib/oop"),i=e("./html_highlight_rules").HtmlHighlightRules,o=function(){i.call(this);var e={regex:"(?={{)",push:"handlebars"};for(var t in this.$rules)this.$rules[t].unshift(e);this.$rules.handlebars=[{token:"comment.start",regex:"{{!--",push:[{token:"comment.end",regex:"--}}",next:s},{defaultToken:"comment"}]},{token:"comment.start",regex:"{{!",push:[{token:"comment.end",regex:"}}",next:s},{defaultToken:"comment"}]},{token:"support.function",regex:"{{{",push:[{token:"support.function",regex:"}}}",next:s},{token:"variable.parameter",regex:"[a-zA-Z_$][a-zA-Z0-9_$]*"}]},{token:"storage.type.start",regex:"{{[#\\^/&]?",push:[{token:"storage.type.end",regex:"}}",next:s},{token:"variable.parameter",regex:"[a-zA-Z_$][a-zA-Z0-9_$]*"}]}],this.normalizeRules()};r.inherits(o,i),t.HandlebarsHighlightRules=o}),ace.define("ace/mode/behaviour/html",["require","exports","module","ace/lib/oop","ace/mode/behaviour/xml"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../behaviour/xml").XmlBehaviour,s=function(){i.call(this)};r.inherits(s,i),t.HtmlBehaviour=s}),ace.define("ace/mode/handlebars",["require","exports","module","ace/lib/oop","ace/mode/html","ace/mode/handlebars_highlight_rules","ace/mode/behaviour/html","ace/mode/folding/html"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./html").Mode,s=e("./handlebars_highlight_rules").HandlebarsHighlightRules,o=e("./behaviour/html").HtmlBehaviour,u=e("./folding/html").FoldMode,a=function(){i.call(this),this.HighlightRules=s,this.$behaviour=new o,this.foldingRules=new u};r.inherits(a,i),function(){this.blockComment={start:"{{!--",end:"--}}"},this.$id="ace/mode/handlebars"}.call(a.prototype),t.Mode=a})
\ No newline at end of file
diff --git a/public/ace/mode-html.js b/public/ace/mode-html.js
deleted file mode 100644
index ec4be71a..00000000
--- a/public/ace/mode-html.js
+++ /dev/null
@@ -1 +0,0 @@
-ace.define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(){this.$rules={start:[{token:"comment.doc.tag",regex:"@[\\w\\d_]+"},s.getTagRule(),{defaultToken:"comment.doc",caseInsensitive:!0}]}};r.inherits(s,i),s.getTagRule=function(e){return{token:"comment.doc.tag.storage.type",regex:"\\b(?:TODO|FIXME|XXX|HACK)\\b"}},s.getStartRule=function(e){return{token:"comment.doc",regex:"\\/\\*(?=\\*)",next:e}},s.getEndRule=function(e){return{token:"comment.doc",regex:"\\*\\/",next:e}},t.DocCommentHighlightRules=s}),ace.define("ace/mode/javascript_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";function a(){var e=o.replace("\\d","\\d\\-"),t={onMatch:function(e,t,n){var r=e.charAt(1)=="/"?2:1;if(r==1)t!=this.nextState?n.unshift(this.next,this.nextState,0):n.unshift(this.next),n[2]++;else if(r==2&&t==this.nextState){n[1]--;if(!n[1]||n[1]<0)n.shift(),n.shift()}return[{type:"meta.tag.punctuation."+(r==1?"":"end-")+"tag-open.xml",value:e.slice(0,r)},{type:"meta.tag.tag-name.xml",value:e.substr(r)}]},regex:"?"+e+"",next:"jsxAttributes",nextState:"jsx"};this.$rules.start.unshift(t);var n={regex:"{",token:"paren.quasi.start",push:"start"};this.$rules.jsx=[n,t,{include:"reference"},{defaultToken:"string"}],this.$rules.jsxAttributes=[{token:"meta.tag.punctuation.tag-close.xml",regex:"/?>",onMatch:function(e,t,n){return t==n[0]&&n.shift(),e.length==2&&(n[0]==this.nextState&&n[1]--,(!n[1]||n[1]<0)&&n.splice(0,2)),this.next=n[0]||"start",[{type:this.token,value:e}]},nextState:"jsx"},n,f("jsxAttributes"),{token:"entity.other.attribute-name.xml",regex:e},{token:"keyword.operator.attribute-equals.xml",regex:"="},{token:"text.tag-whitespace.xml",regex:"\\s+"},{token:"string.attribute-value.xml",regex:"'",stateName:"jsx_attr_q",push:[{token:"string.attribute-value.xml",regex:"'",next:"pop"},{include:"reference"},{defaultToken:"string.attribute-value.xml"}]},{token:"string.attribute-value.xml",regex:'"',stateName:"jsx_attr_qq",push:[{token:"string.attribute-value.xml",regex:'"',next:"pop"},{include:"reference"},{defaultToken:"string.attribute-value.xml"}]},t],this.$rules.reference=[{token:"constant.language.escape.reference.xml",regex:"(?:[0-9]+;)|(?:[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"}]}function f(e){return[{token:"comment",regex:/\/\*/,next:[i.getTagRule(),{token:"comment",regex:"\\*\\/",next:e||"pop"},{defaultToken:"comment",caseInsensitive:!0}]},{token:"comment",regex:"\\/\\/",next:[i.getTagRule(),{token:"comment",regex:"$|^",next:e||"pop"},{defaultToken:"comment",caseInsensitive:!0}]}]}var r=e("../lib/oop"),i=e("./doc_comment_highlight_rules").DocCommentHighlightRules,s=e("./text_highlight_rules").TextHighlightRules,o="[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*",u=function(e){var t=this.createKeywordMapper({"variable.language":"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|Namespace|QName|XML|XMLList|ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|SyntaxError|TypeError|URIError|decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|isNaN|parseFloat|parseInt|JSON|Math|this|arguments|prototype|window|document",keyword:"const|yield|import|get|set|async|await|break|case|catch|continue|default|delete|do|else|finally|for|function|if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|__parent__|__count__|escape|unescape|with|__proto__|class|enum|extends|super|export|implements|private|public|interface|package|protected|static","storage.type":"const|let|var|function","constant.language":"null|Infinity|NaN|undefined","support.function":"alert","constant.language.boolean":"true|false"},"identifier"),n="case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void",r="\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|u{[0-9a-fA-F]{1,6}}|[0-2][0-7]{0,2}|3[0-7][0-7]?|[4-7][0-7]?|.)";this.$rules={no_regex:[i.getStartRule("doc-start"),f("no_regex"),{token:"string",regex:"'(?=.)",next:"qstring"},{token:"string",regex:'"(?=.)',next:"qqstring"},{token:"constant.numeric",regex:/0(?:[xX][0-9a-fA-F]+|[bB][01]+)\b/},{token:"constant.numeric",regex:/[+-]?\d[\d_]*(?:(?:\.\d*)?(?:[eE][+-]?\d+)?)?\b/},{token:["storage.type","punctuation.operator","support.function","punctuation.operator","entity.name.function","text","keyword.operator"],regex:"("+o+")(\\.)(prototype)(\\.)("+o+")(\\s*)(=)",next:"function_arguments"},{token:["storage.type","punctuation.operator","entity.name.function","text","keyword.operator","text","storage.type","text","paren.lparen"],regex:"("+o+")(\\.)("+o+")(\\s*)(=)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:["entity.name.function","text","keyword.operator","text","storage.type","text","paren.lparen"],regex:"("+o+")(\\s*)(=)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:["storage.type","punctuation.operator","entity.name.function","text","keyword.operator","text","storage.type","text","entity.name.function","text","paren.lparen"],regex:"("+o+")(\\.)("+o+")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()",next:"function_arguments"},{token:["storage.type","text","entity.name.function","text","paren.lparen"],regex:"(function)(\\s+)("+o+")(\\s*)(\\()",next:"function_arguments"},{token:["entity.name.function","text","punctuation.operator","text","storage.type","text","paren.lparen"],regex:"("+o+")(\\s*)(:)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:["text","text","storage.type","text","paren.lparen"],regex:"(:)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:"keyword",regex:"(?:"+n+")\\b",next:"start"},{token:["support.constant"],regex:/that\b/},{token:["storage.type","punctuation.operator","support.function.firebug"],regex:/(console)(\.)(warn|info|log|error|time|trace|timeEnd|assert)\b/},{token:t,regex:o},{token:"punctuation.operator",regex:/[.](?![.])/,next:"property"},{token:"keyword.operator",regex:/--|\+\+|\.{3}|===|==|=|!=|!==|<+=?|>+=?|!|&&|\|\||\?\:|[!$%&*+\-~\/^]=?/,next:"start"},{token:"punctuation.operator",regex:/[?:,;.]/,next:"start"},{token:"paren.lparen",regex:/[\[({]/,next:"start"},{token:"paren.rparen",regex:/[\])}]/},{token:"comment",regex:/^#!.*$/}],property:[{token:"text",regex:"\\s+"},{token:["storage.type","punctuation.operator","entity.name.function","text","keyword.operator","text","storage.type","text","entity.name.function","text","paren.lparen"],regex:"("+o+")(\\.)("+o+")(\\s*)(=)(\\s*)(function)(?:(\\s+)(\\w+))?(\\s*)(\\()",next:"function_arguments"},{token:"punctuation.operator",regex:/[.](?![.])/},{token:"support.function",regex:/(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/},{token:"support.function.dom",regex:/(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/},{token:"support.constant",regex:/(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\b/},{token:"identifier",regex:o},{regex:"",token:"empty",next:"no_regex"}],start:[i.getStartRule("doc-start"),f("start"),{token:"string.regexp",regex:"\\/",next:"regex"},{token:"text",regex:"\\s+|^$",next:"start"},{token:"empty",regex:"",next:"no_regex"}],regex:[{token:"regexp.keyword.operator",regex:"\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"},{token:"string.regexp",regex:"/[sxngimy]*",next:"no_regex"},{token:"invalid",regex:/\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/},{token:"constant.language.escape",regex:/\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/},{token:"constant.language.delimiter",regex:/\|/},{token:"constant.language.escape",regex:/\[\^?/,next:"regex_character_class"},{token:"empty",regex:"$",next:"no_regex"},{defaultToken:"string.regexp"}],regex_character_class:[{token:"regexp.charclass.keyword.operator",regex:"\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"},{token:"constant.language.escape",regex:"]",next:"regex"},{token:"constant.language.escape",regex:"-"},{token:"empty",regex:"$",next:"no_regex"},{defaultToken:"string.regexp.charachterclass"}],function_arguments:[{token:"variable.parameter",regex:o},{token:"punctuation.operator",regex:"[, ]+"},{token:"punctuation.operator",regex:"$"},{token:"empty",regex:"",next:"no_regex"}],qqstring:[{token:"constant.language.escape",regex:r},{token:"string",regex:"\\\\$",next:"qqstring"},{token:"string",regex:'"|$',next:"no_regex"},{defaultToken:"string"}],qstring:[{token:"constant.language.escape",regex:r},{token:"string",regex:"\\\\$",next:"qstring"},{token:"string",regex:"'|$",next:"no_regex"},{defaultToken:"string"}]};if(!e||!e.noES6)this.$rules.no_regex.unshift({regex:"[{}]",onMatch:function(e,t,n){this.next=e=="{"?this.nextState:"";if(e=="{"&&n.length)n.unshift("start",t);else if(e=="}"&&n.length){n.shift(),this.next=n.shift();if(this.next.indexOf("string")!=-1||this.next.indexOf("jsx")!=-1)return"paren.quasi.end"}return e=="{"?"paren.lparen":"paren.rparen"},nextState:"start"},{token:"string.quasi.start",regex:/`/,push:[{token:"constant.language.escape",regex:r},{token:"paren.quasi.start",regex:/\${/,push:"start"},{token:"string.quasi.end",regex:/`/,next:"pop"},{defaultToken:"string.quasi"}]}),(!e||!e.noJSX)&&a.call(this);this.embedRules(i,"doc-",[i.getEndRule("no_regex")]),this.normalizeRules()};r.inherits(u,s),t.JavaScriptHighlightRules=u}),ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(e,t,n){"use strict";var r=e("../range").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\s+$/.test(e)?/^\s*\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\s*\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),ace.define("ace/mode/behaviour/cstyle",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../behaviour").Behaviour,s=e("../../token_iterator").TokenIterator,o=e("../../lib/lang"),u=["text","paren.rparen","punctuation.operator"],a=["text","paren.rparen","punctuation.operator","comment"],f,l={},c=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:"",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:"",maybeInsertedLineEnd:""}},h=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},p=function(){this.add("braces","insertion",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i=="{"){c(n);var a=n.getSelectionRange(),l=r.doc.getTextRange(a);if(l!==""&&l!=="{"&&n.getWrapBehavioursEnabled())return h(a,l,"{","}");if(p.isSaneInsertion(n,r))return/[\]\}\)]/.test(u[s.column])||n.inMultiSelectMode?(p.recordAutoInsert(n,r,"}"),{text:"{}",selection:[1,1]}):(p.recordMaybeInsert(n,r,"{"),{text:"{",selection:[1,1]})}else if(i=="}"){c(n);var d=u.substring(s.column,s.column+1);if(d=="}"){var v=r.$findOpeningBracket("}",{column:s.column+1,row:s.row});if(v!==null&&p.isAutoInsertedClosing(s,u,i))return p.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}else{if(i=="\n"||i=="\r\n"){c(n);var m="";p.isMaybeInsertedClosing(s,u)&&(m=o.stringRepeat("}",f.maybeInsertedBrackets),p.clearMaybeInsertedClosing());var d=u.substring(s.column,s.column+1);if(d==="}"){var g=r.findMatchingBracket({row:s.row,column:s.column+1},"}");if(!g)return null;var y=this.$getIndent(r.getLine(g.row))}else{if(!m){p.clearMaybeInsertedClosing();return}var y=this.$getIndent(u)}var b=y+r.getTabString();return{text:"\n"+b+"\n"+y+m,selection:[1,b.length,1,b.length]}}p.clearMaybeInsertedClosing()}}),this.add("braces","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="{"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u=="}")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add("parens","insertion",function(e,t,n,r,i){if(i=="("){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==""&&n.getWrapBehavioursEnabled())return h(s,o,"(",")");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,")"),{text:"()",selection:[1,1]}}else if(i==")"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==")"){var l=r.$findOpeningBracket(")",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}}),this.add("parens","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="("){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==")")return i.end.column++,i}}),this.add("brackets","insertion",function(e,t,n,r,i){if(i=="["){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==""&&n.getWrapBehavioursEnabled())return h(s,o,"[","]");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,"]"),{text:"[]",selection:[1,1]}}else if(i=="]"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f=="]"){var l=r.$findOpeningBracket("]",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}}),this.add("brackets","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="["){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u=="]")return i.end.column++,i}}),this.add("string_dquotes","insertion",function(e,t,n,r,i){if(i=='"'||i=="'"){c(n);var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==""&&u!=="'"&&u!='"'&&n.getWrapBehavioursEnabled())return h(o,u,s,s);if(!u){var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column),p=f.substring(a.column,a.column+1),d=r.getTokenAt(a.row,a.column),v=r.getTokenAt(a.row,a.column+1);if(l=="\\"&&d&&/escape/.test(d.type))return null;var m=d&&/string|escape/.test(d.type),g=!v||/string|escape/.test(v.type),y;if(p==s)y=m!==g;else{if(m&&!g)return null;if(m&&g)return null;var b=r.$mode.tokenRe;b.lastIndex=0;var w=b.test(l);b.lastIndex=0;var E=b.test(l);if(w||E)return null;if(p&&!/[\s;,.})\]\\]/.test(p))return null;y=!0}return{text:y?s+s:"",selection:[1,1]}}}}),this.add("string_dquotes","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='"'||s=="'")){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||"text",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||"text",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||"text",a)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(p,i),t.CstyleBehaviour=p}),ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../../range").Range,s=e("./fold_mode").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\|[^|]*?$/,"|"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\|[^|]*?$/,"|"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\{|\[)[^\}\]]*$|^\s*(\/\*)/,this.foldingStopMarker=/^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/,this.singleLineBlockCommentRe=/^\s*(\/\*).*\*\/\s*$/,this.tripleStarBlockCommentRe=/^\s*(\/\*\*\*).*\*\/\s*$/,this.startRegionRe=/^\s*(\/\*|\/\/)#?region\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return"";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?"start":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!="all"&&(u=null)),u}if(t==="markbegin")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++tf)break;var l=this.getFoldWidgetRange(e,"all",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\s*$/),s=e.getLength(),o=n,u=/^\s*(?:\/\*|\/\/|--)#?(end)?region\b/,a=1;while(++no)return new i(o,r,l,t.length)}}.call(o.prototype)}),ace.define("ace/mode/javascript",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/range","ace/worker/worker_client","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./javascript_highlight_rules").JavaScriptHighlightRules,o=e("./matching_brace_outdent").MatchingBraceOutdent,u=e("../range").Range,a=e("../worker/worker_client").WorkerClient,f=e("./behaviour/cstyle").CstyleBehaviour,l=e("./folding/cstyle").FoldMode,c=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new f,this.foldingRules=new l};r.inherits(c,i),function(){this.lineCommentStart="//",this.blockComment={start:"/*",end:"*/"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens,o=i.state;if(s.length&&s[s.length-1].type=="comment")return r;if(e=="start"||e=="no_regex"){var u=t.match(/^.*(?:\bcase\b.*\:|[\{\(\[])\s*$/);u&&(r+=n)}else if(e=="doc-start"){if(o=="start"||o=="no_regex")return"";var u=t.match(/^\s*(\/?)\*/);u&&(u[1]&&(r+=" "),r+="* ")}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.createWorker=function(e){var t=new a(["ace"],"ace/mode/javascript_worker","JavaScriptWorker");return t.attachToDocument(e.getDocument()),t.on("annotate",function(t){e.setAnnotations(t.data)}),t.on("terminate",function(){e.clearAnnotations()}),t},this.$id="ace/mode/javascript"}.call(c.prototype),t.Mode=c}),ace.define("ace/mode/css_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/lang"),s=e("./text_highlight_rules").TextHighlightRules,o=t.supportType="align-content|align-items|align-self|all|animation|animation-delay|animation-direction|animation-duration|animation-fill-mode|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|backface-visibility|background|background-attachment|background-blend-mode|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|border|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|bottom|box-shadow|box-sizing|caption-side|clear|clip|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|cursor|direction|display|empty-cells|filter|flex|flex-basis|flex-direction|flex-flow|flex-grow|flex-shrink|flex-wrap|float|font|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|hanging-punctuation|height|justify-content|left|letter-spacing|line-height|list-style|list-style-image|list-style-position|list-style-type|margin|margin-bottom|margin-left|margin-right|margin-top|max-height|max-width|min-height|min-width|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|order|outline|outline-color|outline-offset|outline-style|outline-width|overflow|overflow-x|overflow-y|padding|padding-bottom|padding-left|padding-right|padding-top|page-break-after|page-break-before|page-break-inside|perspective|perspective-origin|position|quotes|resize|right|tab-size|table-layout|text-align|text-align-last|text-decoration|text-decoration-color|text-decoration-line|text-decoration-style|text-indent|text-justify|text-overflow|text-shadow|text-transform|top|transform|transform-origin|transform-style|transition|transition-delay|transition-duration|transition-property|transition-timing-function|unicode-bidi|vertical-align|visibility|white-space|width|word-break|word-spacing|word-wrap|z-index",u=t.supportFunction="rgb|rgba|url|attr|counter|counters",a=t.supportConstant="absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero",f=t.supportConstantColor="aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow",l=t.supportConstantFonts="arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace",c=t.numRe="\\-?(?:(?:[0-9]+)|(?:[0-9]*\\.[0-9]+))",h=t.pseudoElements="(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b",p=t.pseudoClasses="(:)\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\b",d=function(){var e=this.createKeywordMapper({"support.function":u,"support.constant":a,"support.type":o,"support.constant.color":f,"support.constant.fonts":l},"text",!0);this.$rules={start:[{token:"comment",regex:"\\/\\*",push:"comment"},{token:"paren.lparen",regex:"\\{",push:"ruleset"},{token:"string",regex:"@.*?{",push:"media"},{token:"keyword",regex:"#[a-z0-9-_]+"},{token:"variable",regex:"\\.[a-z0-9-_]+"},{token:"string",regex:":[a-z0-9-_]+"},{token:"constant",regex:"[a-z0-9-_]+"},{caseInsensitive:!0}],media:[{token:"comment",regex:"\\/\\*",push:"comment"},{token:"paren.lparen",regex:"\\{",push:"ruleset"},{token:"string",regex:"\\}",next:"pop"},{token:"keyword",regex:"#[a-z0-9-_]+"},{token:"variable",regex:"\\.[a-z0-9-_]+"},{token:"string",regex:":[a-z0-9-_]+"},{token:"constant",regex:"[a-z0-9-_]+"},{caseInsensitive:!0}],comment:[{token:"comment",regex:"\\*\\/",next:"pop"},{defaultToken:"comment"}],ruleset:[{token:"paren.rparen",regex:"\\}",next:"pop"},{token:"comment",regex:"\\/\\*",push:"comment"},{token:"string",regex:'["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'},{token:"string",regex:"['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"},{token:["constant.numeric","keyword"],regex:"("+c+")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)"},{token:"constant.numeric",regex:c},{token:"constant.numeric",regex:"#[a-f0-9]{6}"},{token:"constant.numeric",regex:"#[a-f0-9]{3}"},{token:["punctuation","entity.other.attribute-name.pseudo-element.css"],regex:h},{token:["punctuation","entity.other.attribute-name.pseudo-class.css"],regex:p},{token:["support.function","string","support.function"],regex:"(url\\()(.*)(\\))"},{token:e,regex:"\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*"},{caseInsensitive:!0}]},this.normalizeRules()};r.inherits(d,s),t.CssHighlightRules=d}),ace.define("ace/mode/css_completions",["require","exports","module"],function(e,t,n){"use strict";var r={background:{"#$0":1},"background-color":{"#$0":1,transparent:1,fixed:1},"background-image":{"url('/$0')":1},"background-repeat":{repeat:1,"repeat-x":1,"repeat-y":1,"no-repeat":1,inherit:1},"background-position":{bottom:2,center:2,left:2,right:2,top:2,inherit:2},"background-attachment":{scroll:1,fixed:1},"background-size":{cover:1,contain:1},"background-clip":{"border-box":1,"padding-box":1,"content-box":1},"background-origin":{"border-box":1,"padding-box":1,"content-box":1},border:{"solid $0":1,"dashed $0":1,"dotted $0":1,"#$0":1},"border-color":{"#$0":1},"border-style":{solid:2,dashed:2,dotted:2,"double":2,groove:2,hidden:2,inherit:2,inset:2,none:2,outset:2,ridged:2},"border-collapse":{collapse:1,separate:1},bottom:{px:1,em:1,"%":1},clear:{left:1,right:1,both:1,none:1},color:{"#$0":1,"rgb(#$00,0,0)":1},cursor:{"default":1,pointer:1,move:1,text:1,wait:1,help:1,progress:1,"n-resize":1,"ne-resize":1,"e-resize":1,"se-resize":1,"s-resize":1,"sw-resize":1,"w-resize":1,"nw-resize":1},display:{none:1,block:1,inline:1,"inline-block":1,"table-cell":1},"empty-cells":{show:1,hide:1},"float":{left:1,right:1,none:1},"font-family":{Arial:2,"Comic Sans MS":2,Consolas:2,"Courier New":2,Courier:2,Georgia:2,Monospace:2,"Sans-Serif":2,"Segoe UI":2,Tahoma:2,"Times New Roman":2,"Trebuchet MS":2,Verdana:1},"font-size":{px:1,em:1,"%":1},"font-weight":{bold:1,normal:1},"font-style":{italic:1,normal:1},"font-variant":{normal:1,"small-caps":1},height:{px:1,em:1,"%":1},left:{px:1,em:1,"%":1},"letter-spacing":{normal:1},"line-height":{normal:1},"list-style-type":{none:1,disc:1,circle:1,square:1,decimal:1,"decimal-leading-zero":1,"lower-roman":1,"upper-roman":1,"lower-greek":1,"lower-latin":1,"upper-latin":1,georgian:1,"lower-alpha":1,"upper-alpha":1},margin:{px:1,em:1,"%":1},"margin-right":{px:1,em:1,"%":1},"margin-left":{px:1,em:1,"%":1},"margin-top":{px:1,em:1,"%":1},"margin-bottom":{px:1,em:1,"%":1},"max-height":{px:1,em:1,"%":1},"max-width":{px:1,em:1,"%":1},"min-height":{px:1,em:1,"%":1},"min-width":{px:1,em:1,"%":1},overflow:{hidden:1,visible:1,auto:1,scroll:1},"overflow-x":{hidden:1,visible:1,auto:1,scroll:1},"overflow-y":{hidden:1,visible:1,auto:1,scroll:1},padding:{px:1,em:1,"%":1},"padding-top":{px:1,em:1,"%":1},"padding-right":{px:1,em:1,"%":1},"padding-bottom":{px:1,em:1,"%":1},"padding-left":{px:1,em:1,"%":1},"page-break-after":{auto:1,always:1,avoid:1,left:1,right:1},"page-break-before":{auto:1,always:1,avoid:1,left:1,right:1},position:{absolute:1,relative:1,fixed:1,"static":1},right:{px:1,em:1,"%":1},"table-layout":{fixed:1,auto:1},"text-decoration":{none:1,underline:1,"line-through":1,blink:1},"text-align":{left:1,right:1,center:1,justify:1},"text-transform":{capitalize:1,uppercase:1,lowercase:1,none:1},top:{px:1,em:1,"%":1},"vertical-align":{top:1,bottom:1},visibility:{hidden:1,visible:1},"white-space":{nowrap:1,normal:1,pre:1,"pre-line":1,"pre-wrap":1},width:{px:1,em:1,"%":1},"word-spacing":{normal:1},filter:{"alpha(opacity=$0100)":1},"text-shadow":{"$02px 2px 2px #777":1},"text-overflow":{"ellipsis-word":1,clip:1,ellipsis:1},"-moz-border-radius":1,"-moz-border-radius-topright":1,"-moz-border-radius-bottomright":1,"-moz-border-radius-topleft":1,"-moz-border-radius-bottomleft":1,"-webkit-border-radius":1,"-webkit-border-top-right-radius":1,"-webkit-border-top-left-radius":1,"-webkit-border-bottom-right-radius":1,"-webkit-border-bottom-left-radius":1,"-moz-box-shadow":1,"-webkit-box-shadow":1,transform:{"rotate($00deg)":1,"skew($00deg)":1},"-moz-transform":{"rotate($00deg)":1,"skew($00deg)":1},"-webkit-transform":{"rotate($00deg)":1,"skew($00deg)":1}},i=function(){};(function(){this.completionsDefined=!1,this.defineCompletions=function(){if(document){var e=document.createElement("c").style;for(var t in e){if(typeof e[t]!="string")continue;var n=t.replace(/[A-Z]/g,function(e){return"-"+e.toLowerCase()});r.hasOwnProperty(n)||(r[n]=1)}}this.completionsDefined=!0},this.getCompletions=function(e,t,n,r){this.completionsDefined||this.defineCompletions();var i=t.getTokenAt(n.row,n.column);if(!i)return[];if(e==="ruleset"){var s=t.getLine(n.row).substr(0,n.column);return/:[^;]+$/.test(s)?(/([\w\-]+):[^:]*$/.test(s),this.getPropertyValueCompletions(e,t,n,r)):this.getPropertyCompletions(e,t,n,r)}return[]},this.getPropertyCompletions=function(e,t,n,i){var s=Object.keys(r);return s.map(function(e){return{caption:e,snippet:e+": $0",meta:"property",score:Number.MAX_VALUE}})},this.getPropertyValueCompletions=function(e,t,n,i){var s=t.getLine(n.row).substr(0,n.column),o=(/([\w\-]+):[^:]*$/.exec(s)||{})[1];if(!o)return[];var u=[];return o in r&&typeof r[o]=="object"&&(u=Object.keys(r[o])),u.map(function(e){return{caption:e,snippet:e,meta:"property value",score:Number.MAX_VALUE}})}}).call(i.prototype),t.CssCompletions=i}),ace.define("ace/mode/behaviour/css",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/mode/behaviour/cstyle","ace/token_iterator"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../behaviour").Behaviour,s=e("./cstyle").CstyleBehaviour,o=e("../../token_iterator").TokenIterator,u=function(){this.inherit(s),this.add("colon","insertion",function(e,t,n,r,i){if(i===":"){var s=n.getCursorPosition(),u=new o(r,s.row,s.column),a=u.getCurrentToken();a&&a.value.match(/\s+/)&&(a=u.stepBackward());if(a&&a.type==="support.type"){var f=r.doc.getLine(s.row),l=f.substring(s.column,s.column+1);if(l===":")return{text:"",selection:[1,1]};if(!f.substring(s.column).match(/^\s*;/))return{text:":;",selection:[1,1]}}}}),this.add("colon","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s===":"){var u=n.getCursorPosition(),a=new o(r,u.row,u.column),f=a.getCurrentToken();f&&f.value.match(/\s+/)&&(f=a.stepBackward());if(f&&f.type==="support.type"){var l=r.doc.getLine(i.start.row),c=l.substring(i.end.column,i.end.column+1);if(c===";")return i.end.column++,i}}}),this.add("semicolon","insertion",function(e,t,n,r,i){if(i===";"){var s=n.getCursorPosition(),o=r.doc.getLine(s.row),u=o.substring(s.column,s.column+1);if(u===";")return{text:"",selection:[1,1]}}})};r.inherits(u,s),t.CssBehaviour=u}),ace.define("ace/mode/css",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/css_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/css_completions","ace/mode/behaviour/css","ace/mode/folding/cstyle"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./css_highlight_rules").CssHighlightRules,o=e("./matching_brace_outdent").MatchingBraceOutdent,u=e("../worker/worker_client").WorkerClient,a=e("./css_completions").CssCompletions,f=e("./behaviour/css").CssBehaviour,l=e("./folding/cstyle").FoldMode,c=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new f,this.$completer=new a,this.foldingRules=new l};r.inherits(c,i),function(){this.foldingRules="cStyle",this.blockComment={start:"/*",end:"*/"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e).tokens;if(i.length&&i[i.length-1].type=="comment")return r;var s=t.match(/^.*\{\s*$/);return s&&(r+=n),r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.getCompletions=function(e,t,n,r){return this.$completer.getCompletions(e,t,n,r)},this.createWorker=function(e){var t=new u(["ace"],"ace/mode/css_worker","Worker");return t.attachToDocument(e.getDocument()),t.on("annotate",function(t){e.setAnnotations(t.data)}),t.on("terminate",function(){e.clearAnnotations()}),t},this.$id="ace/mode/css"}.call(c.prototype),t.Mode=c}),ace.define("ace/mode/xml_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(e){var t="[_:a-zA-Z\u00c0-\uffff][-_:.a-zA-Z0-9\u00c0-\uffff]*";this.$rules={start:[{token:"string.cdata.xml",regex:"<\\!\\[CDATA\\[",next:"cdata"},{token:["punctuation.xml-decl.xml","keyword.xml-decl.xml"],regex:"(<\\?)(xml)(?=[\\s])",next:"xml_decl",caseInsensitive:!0},{token:["punctuation.instruction.xml","keyword.instruction.xml"],regex:"(<\\?)("+t+")",next:"processing_instruction"},{token:"comment.xml",regex:"<\\!--",next:"comment"},{token:["xml-pe.doctype.xml","xml-pe.doctype.xml"],regex:"(<\\!)(DOCTYPE)(?=[\\s])",next:"doctype",caseInsensitive:!0},{include:"tag"},{token:"text.end-tag-open.xml",regex:""},{token:"text.tag-open.xml",regex:"<"},{include:"reference"},{defaultToken:"text.xml"}],xml_decl:[{token:"entity.other.attribute-name.decl-attribute-name.xml",regex:"(?:"+t+":)?"+t+""},{token:"keyword.operator.decl-attribute-equals.xml",regex:"="},{include:"whitespace"},{include:"string"},{token:"punctuation.xml-decl.xml",regex:"\\?>",next:"start"}],processing_instruction:[{token:"punctuation.instruction.xml",regex:"\\?>",next:"start"},{defaultToken:"instruction.xml"}],doctype:[{include:"whitespace"},{include:"string"},{token:"xml-pe.doctype.xml",regex:">",next:"start"},{token:"xml-pe.xml",regex:"[-_a-zA-Z0-9:]+"},{token:"punctuation.int-subset",regex:"\\[",push:"int_subset"}],int_subset:[{token:"text.xml",regex:"\\s+"},{token:"punctuation.int-subset.xml",regex:"]",next:"pop"},{token:["punctuation.markup-decl.xml","keyword.markup-decl.xml"],regex:"(<\\!)("+t+")",push:[{token:"text",regex:"\\s+"},{token:"punctuation.markup-decl.xml",regex:">",next:"pop"},{include:"string"}]}],cdata:[{token:"string.cdata.xml",regex:"\\]\\]>",next:"start"},{token:"text.xml",regex:"\\s+"},{token:"text.xml",regex:"(?:[^\\]]|\\](?!\\]>))+"}],comment:[{token:"comment.xml",regex:"-->",next:"start"},{defaultToken:"comment.xml"}],reference:[{token:"constant.language.escape.reference.xml",regex:"(?:[0-9]+;)|(?:[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"}],attr_reference:[{token:"constant.language.escape.reference.attribute-value.xml",regex:"(?:[0-9]+;)|(?:[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"}],tag:[{token:["meta.tag.punctuation.tag-open.xml","meta.tag.punctuation.end-tag-open.xml","meta.tag.tag-name.xml"],regex:"(?:(<)|())((?:"+t+":)?"+t+")",next:[{include:"attributes"},{token:"meta.tag.punctuation.tag-close.xml",regex:"/?>",next:"start"}]}],tag_whitespace:[{token:"text.tag-whitespace.xml",regex:"\\s+"}],whitespace:[{token:"text.whitespace.xml",regex:"\\s+"}],string:[{token:"string.xml",regex:"'",push:[{token:"string.xml",regex:"'",next:"pop"},{defaultToken:"string.xml"}]},{token:"string.xml",regex:'"',push:[{token:"string.xml",regex:'"',next:"pop"},{defaultToken:"string.xml"}]}],attributes:[{token:"entity.other.attribute-name.xml",regex:"(?:"+t+":)?"+t+""},{token:"keyword.operator.attribute-equals.xml",regex:"="},{include:"tag_whitespace"},{include:"attribute_value"}],attribute_value:[{token:"string.attribute-value.xml",regex:"'",push:[{token:"string.attribute-value.xml",regex:"'",next:"pop"},{include:"attr_reference"},{defaultToken:"string.attribute-value.xml"}]},{token:"string.attribute-value.xml",regex:'"',push:[{token:"string.attribute-value.xml",regex:'"',next:"pop"},{include:"attr_reference"},{defaultToken:"string.attribute-value.xml"}]}]},this.constructor===s&&this.normalizeRules()};(function(){this.embedTagRules=function(e,t,n){this.$rules.tag.unshift({token:["meta.tag.punctuation.tag-open.xml","meta.tag."+n+".tag-name.xml"],regex:"(<)("+n+"(?=\\s|>|$))",next:[{include:"attributes"},{token:"meta.tag.punctuation.tag-close.xml",regex:"/?>",next:t+"start"}]}),this.$rules[n+"-end"]=[{include:"attributes"},{token:"meta.tag.punctuation.tag-close.xml",regex:"/?>",next:"start",onMatch:function(e,t,n){return n.splice(0),this.token}}],this.embedRules(e,t,[{token:["meta.tag.punctuation.end-tag-open.xml","meta.tag."+n+".tag-name.xml"],regex:"()("+n+"(?=\\s|>|$))",next:n+"-end"},{token:"string.cdata.xml",regex:"<\\!\\[CDATA\\["},{token:"string.cdata.xml",regex:"\\]\\]>"}])}}).call(i.prototype),r.inherits(s,i),t.XmlHighlightRules=s}),ace.define("ace/mode/html_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/css_highlight_rules","ace/mode/javascript_highlight_rules","ace/mode/xml_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/lang"),s=e("./css_highlight_rules").CssHighlightRules,o=e("./javascript_highlight_rules").JavaScriptHighlightRules,u=e("./xml_highlight_rules").XmlHighlightRules,a=i.createMap({a:"anchor",button:"form",form:"form",img:"image",input:"form",label:"form",option:"form",script:"script",select:"form",textarea:"form",style:"style",table:"table",tbody:"table",td:"table",tfoot:"table",th:"table",tr:"table"}),f=function(){u.call(this),this.addRules({attributes:[{include:"tag_whitespace"},{token:"entity.other.attribute-name.xml",regex:"[-_a-zA-Z0-9:.]+"},{token:"keyword.operator.attribute-equals.xml",regex:"=",push:[{include:"tag_whitespace"},{token:"string.unquoted.attribute-value.html",regex:"[^<>='\"`\\s]+",next:"pop"},{token:"empty",regex:"",next:"pop"}]},{include:"attribute_value"}],tag:[{token:function(e,t){var n=a[t];return["meta.tag.punctuation."+(e=="<"?"":"end-")+"tag-open.xml","meta.tag"+(n?"."+n:"")+".tag-name.xml"]},regex:"(?)([-_a-zA-Z0-9:.]+)",next:"tag_stuff"}],tag_stuff:[{include:"attributes"},{token:"meta.tag.punctuation.tag-close.xml",regex:"/?>",next:"start"}]}),this.embedTagRules(s,"css-","style"),this.embedTagRules((new o({noJSX:!0})).getRules(),"js-","script"),this.constructor===f&&this.normalizeRules()};r.inherits(f,u),t.HtmlHighlightRules=f}),ace.define("ace/mode/behaviour/xml",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"],function(e,t,n){"use strict";function u(e,t){return e.type.lastIndexOf(t+".xml")>-1}var r=e("../../lib/oop"),i=e("../behaviour").Behaviour,s=e("../../token_iterator").TokenIterator,o=e("../../lib/lang"),a=function(){this.add("string_dquotes","insertion",function(e,t,n,r,i){if(i=='"'||i=="'"){var o=i,a=r.doc.getTextRange(n.getSelectionRange());if(a!==""&&a!=="'"&&a!='"'&&n.getWrapBehavioursEnabled())return{text:o+a+o,selection:!1};var f=n.getCursorPosition(),l=r.doc.getLine(f.row),c=l.substring(f.column,f.column+1),h=new s(r,f.row,f.column),p=h.getCurrentToken();if(c==o&&(u(p,"attribute-value")||u(p,"string")))return{text:"",selection:[1,1]};p||(p=h.stepBackward());if(!p)return;while(u(p,"tag-whitespace")||u(p,"whitespace"))p=h.stepBackward();var d=!c||c.match(/\s/);if(u(p,"attribute-equals")&&(d||c==">")||u(p,"decl-attribute-equals")&&(d||c=="?"))return{text:o+o,selection:[1,1]}}}),this.add("string_dquotes","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='"'||s=="'")){var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}}),this.add("autoclosing","insertion",function(e,t,n,r,i){if(i==">"){var o=n.getCursorPosition(),a=new s(r,o.row,o.column),f=a.getCurrentToken()||a.stepBackward();if(!f||!(u(f,"tag-name")||u(f,"tag-whitespace")||u(f,"attribute-name")||u(f,"attribute-equals")||u(f,"attribute-value")))return;if(u(f,"reference.attribute-value"))return;if(u(f,"attribute-value")){var l=f.value.charAt(0);if(l=='"'||l=="'"){var c=f.value.charAt(f.value.length-1),h=a.getCurrentTokenColumn()+f.value.length;if(h>o.column||h==o.column&&l!=c)return}}while(!u(f,"tag-name"))f=a.stepBackward();var p=a.getCurrentTokenRow(),d=a.getCurrentTokenColumn();if(u(a.stepBackward(),"end-tag-open"))return;var v=f.value;p==o.row&&(v=v.substring(0,o.column-d));if(this.voidElements.hasOwnProperty(v.toLowerCase()))return;return{text:">"+v+">",selection:[1,1]}}}),this.add("autoindent","insertion",function(e,t,n,r,i){if(i=="\n"){var o=n.getCursorPosition(),u=r.getLine(o.row),a=new s(r,o.row,o.column),f=a.getCurrentToken();if(f&&f.type.indexOf("tag-close")!==-1){if(f.value=="/>")return;while(f&&f.type.indexOf("tag-name")===-1)f=a.stepBackward();if(!f)return;var l=f.value,c=a.getCurrentTokenRow();f=a.stepBackward();if(!f||f.type.indexOf("end-tag")!==-1)return;if(this.voidElements&&!this.voidElements[l]){var h=r.getTokenAt(o.row,o.column+1),u=r.getLine(c),p=this.$getIndent(u),d=p+r.getTabString();return h&&h.value===""?{text:"\n"+d+"\n"+p,selection:[1,d.length,1,d.length]}:{text:"\n"+d}}}}})};r.inherits(a,i),t.XmlBehaviour=a}),ace.define("ace/mode/folding/mixed",["require","exports","module","ace/lib/oop","ace/mode/folding/fold_mode"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("./fold_mode").FoldMode,s=t.FoldMode=function(e,t){this.defaultMode=e,this.subModes=t};r.inherits(s,i),function(){this.$getMode=function(e){typeof e!="string"&&(e=e[0]);for(var t in this.subModes)if(e.indexOf(t)===0)return this.subModes[t];return null},this.$tryMode=function(e,t,n,r){var i=this.$getMode(e);return i?i.getFoldWidget(t,n,r):""},this.getFoldWidget=function(e,t,n){return this.$tryMode(e.getState(n-1),e,t,n)||this.$tryMode(e.getState(n),e,t,n)||this.defaultMode.getFoldWidget(e,t,n)},this.getFoldWidgetRange=function(e,t,n){var r=this.$getMode(e.getState(n-1));if(!r||!r.getFoldWidget(e,t,n))r=this.$getMode(e.getState(n));if(!r||!r.getFoldWidget(e,t,n))r=this.defaultMode;return r.getFoldWidgetRange(e,t,n)}}.call(s.prototype)}),ace.define("ace/mode/folding/xml",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/range","ace/mode/folding/fold_mode","ace/token_iterator"],function(e,t,n){"use strict";function l(e,t){return e.type.lastIndexOf(t+".xml")>-1}var r=e("../../lib/oop"),i=e("../../lib/lang"),s=e("../../range").Range,o=e("./fold_mode").FoldMode,u=e("../../token_iterator").TokenIterator,a=t.FoldMode=function(e,t){o.call(this),this.voidElements=e||{},this.optionalEndTags=r.mixin({},this.voidElements),t&&r.mixin(this.optionalEndTags,t)};r.inherits(a,o);var f=function(){this.tagName="",this.closing=!1,this.selfClosing=!1,this.start={row:0,column:0},this.end={row:0,column:0}};(function(){this.getFoldWidget=function(e,t,n){var r=this._getFirstTagInLine(e,n);return r?r.closing||!r.tagName&&r.selfClosing?t=="markbeginend"?"end":"":!r.tagName||r.selfClosing||this.voidElements.hasOwnProperty(r.tagName.toLowerCase())?"":this._findEndTagInLine(e,n,r.tagName,r.end.column)?"":"start":""},this._getFirstTagInLine=function(e,t){var n=e.getTokens(t),r=new f;for(var i=0;i ";break}}return r}if(l(s,"tag-close"))return r.selfClosing=s.value=="/>",r;r.start.column+=s.value.length}return null},this._findEndTagInLine=function(e,t,n,r){var i=e.getTokens(t),s=0;for(var o=0;o",n.end.row=e.getCurrentTokenRow(),n.end.column=e.getCurrentTokenColumn()+t.value.length,e.stepForward(),n;while(t=e.stepForward());return null},this._readTagBackward=function(e){var t=e.getCurrentToken();if(!t)return null;var n=new f;do{if(l(t,"tag-open"))return n.closing=l(t,"end-tag-open"),n.start.row=e.getCurrentTokenRow(),n.start.column=e.getCurrentTokenColumn(),e.stepBackward(),n;l(t,"tag-name")?n.tagName=t.value:l(t,"tag-close")&&(n.selfClosing=t.value=="/>",n.end.row=e.getCurrentTokenRow(),n.end.column=e.getCurrentTokenColumn()+t.value.length)}while(t=e.stepBackward());return null},this._pop=function(e,t){while(e.length){var n=e[e.length-1];if(!t||n.tagName==t.tagName)return e.pop();if(this.optionalEndTags.hasOwnProperty(n.tagName)){e.pop();continue}return null}},this.getFoldWidgetRange=function(e,t,n){var r=this._getFirstTagInLine(e,n);if(!r)return null;var i=r.closing||r.selfClosing,o=[],a;if(!i){var f=new u(e,n,r.start.column),l={row:n,column:r.start.column+r.tagName.length+2};r.start.row==r.end.row&&(l.column=r.end.column);while(a=this._readTagForward(f)){if(a.selfClosing){if(!o.length)return a.start.column+=a.tagName.length+2,a.end.column-=2,s.fromPoints(a.start,a.end);continue}if(a.closing){this._pop(o,a);if(o.length==0)return s.fromPoints(l,a.start)}else o.push(a)}}else{var f=new u(e,n,r.end.column),c={row:n,column:r.start.column};while(a=this._readTagBackward(f)){if(a.selfClosing){if(!o.length)return a.start.column+=a.tagName.length+2,a.end.column-=2,s.fromPoints(a.start,a.end);continue}if(!a.closing){this._pop(o,a);if(o.length==0)return a.start.column+=a.tagName.length+2,a.start.row==a.end.row&&a.start.column-1}function l(e,t){var n=new r(e,t.row,t.column),i=n.getCurrentToken();while(i&&!f(i,"tag-name"))i=n.stepBackward();if(i)return i.value}function c(e,t){var n=new r(e,t.row,t.column),i=n.getCurrentToken();while(i&&!f(i,"attribute-name"))i=n.stepBackward();if(i)return i.value}var r=e("../token_iterator").TokenIterator,i=["accesskey","class","contenteditable","contextmenu","dir","draggable","dropzone","hidden","id","inert","itemid","itemprop","itemref","itemscope","itemtype","lang","spellcheck","style","tabindex","title","translate"],s=["onabort","onblur","oncancel","oncanplay","oncanplaythrough","onchange","onclick","onclose","oncontextmenu","oncuechange","ondblclick","ondrag","ondragend","ondragenter","ondragleave","ondragover","ondragstart","ondrop","ondurationchange","onemptied","onended","onerror","onfocus","oninput","oninvalid","onkeydown","onkeypress","onkeyup","onload","onloadeddata","onloadedmetadata","onloadstart","onmousedown","onmousemove","onmouseout","onmouseover","onmouseup","onmousewheel","onpause","onplay","onplaying","onprogress","onratechange","onreset","onscroll","onseeked","onseeking","onselect","onshow","onstalled","onsubmit","onsuspend","ontimeupdate","onvolumechange","onwaiting"],o=i.concat(s),u={html:{manifest:1},head:{},title:{},base:{href:1,target:1},link:{href:1,hreflang:1,rel:{stylesheet:1,icon:1},media:{all:1,screen:1,print:1},type:{"text/css":1,"image/png":1,"image/jpeg":1,"image/gif":1},sizes:1},meta:{"http-equiv":{"content-type":1},name:{description:1,keywords:1},content:{"text/html; charset=UTF-8":1},charset:1},style:{type:1,media:{all:1,screen:1,print:1},scoped:1},script:{charset:1,type:{"text/javascript":1},src:1,defer:1,async:1},noscript:{href:1},body:{onafterprint:1,onbeforeprint:1,onbeforeunload:1,onhashchange:1,onmessage:1,onoffline:1,onpopstate:1,onredo:1,onresize:1,onstorage:1,onundo:1,onunload:1},section:{},nav:{},article:{pubdate:1},aside:{},h1:{},h2:{},h3:{},h4:{},h5:{},h6:{},header:{},footer:{},address:{},main:{},p:{},hr:{},pre:{},blockquote:{cite:1},ol:{start:1,reversed:1},ul:{},li:{value:1},dl:{},dt:{},dd:{},figure:{},figcaption:{},div:{},a:{href:1,target:{_blank:1,top:1},ping:1,rel:{nofollow:1,alternate:1,author:1,bookmark:1,help:1,license:1,next:1,noreferrer:1,prefetch:1,prev:1,search:1,tag:1},media:1,hreflang:1,type:1},em:{},strong:{},small:{},s:{},cite:{},q:{cite:1},dfn:{},abbr:{},data:{},time:{datetime:1},code:{},"var":{},samp:{},kbd:{},sub:{},sup:{},i:{},b:{},u:{},mark:{},ruby:{},rt:{},rp:{},bdi:{},bdo:{},span:{},br:{},wbr:{},ins:{cite:1,datetime:1},del:{cite:1,datetime:1},img:{alt:1,src:1,height:1,width:1,usemap:1,ismap:1},iframe:{name:1,src:1,height:1,width:1,sandbox:{"allow-same-origin":1,"allow-top-navigation":1,"allow-forms":1,"allow-scripts":1},seamless:{seamless:1}},embed:{src:1,height:1,width:1,type:1},object:{param:1,data:1,type:1,height:1,width:1,usemap:1,name:1,form:1,classid:1},param:{name:1,value:1},video:{src:1,autobuffer:1,autoplay:{autoplay:1},loop:{loop:1},controls:{controls:1},width:1,height:1,poster:1,muted:{muted:1},preload:{auto:1,metadata:1,none:1}},audio:{src:1,autobuffer:1,autoplay:{autoplay:1},loop:{loop:1},controls:{controls:1},muted:{muted:1},preload:{auto:1,metadata:1,none:1}},source:{src:1,type:1,media:1},track:{kind:1,src:1,srclang:1,label:1,"default":1},canvas:{width:1,height:1},map:{name:1},area:{shape:1,coords:1,href:1,hreflang:1,alt:1,target:1,media:1,rel:1,ping:1,type:1},svg:{},math:{},table:{summary:1},caption:{},colgroup:{span:1},col:{span:1},tbody:{},thead:{},tfoot:{},tr:{},td:{headers:1,rowspan:1,colspan:1},th:{headers:1,rowspan:1,colspan:1,scope:1},form:{"accept-charset":1,action:1,autocomplete:1,enctype:{"multipart/form-data":1,"application/x-www-form-urlencoded":1},method:{get:1,post:1},name:1,novalidate:1,target:{_blank:1,top:1}},fieldset:{disabled:1,form:1,name:1},legend:{},label:{form:1,"for":1},input:{type:{text:1,password:1,hidden:1,checkbox:1,submit:1,radio:1,file:1,button:1,reset:1,image:31,color:1,date:1,datetime:1,"datetime-local":1,email:1,month:1,number:1,range:1,search:1,tel:1,time:1,url:1,week:1},accept:1,alt:1,autocomplete:{on:1,off:1},autofocus:{autofocus:1},checked:{checked:1},disabled:{disabled:1},form:1,formaction:1,formenctype:{"application/x-www-form-urlencoded":1,"multipart/form-data":1,"text/plain":1},formmethod:{get:1,post:1},formnovalidate:{formnovalidate:1},formtarget:{_blank:1,_self:1,_parent:1,_top:1},height:1,list:1,max:1,maxlength:1,min:1,multiple:{multiple:1},name:1,pattern:1,placeholder:1,readonly:{readonly:1},required:{required:1},size:1,src:1,step:1,width:1,files:1,value:1},button:{autofocus:1,disabled:{disabled:1},form:1,formaction:1,formenctype:1,formmethod:1,formnovalidate:1,formtarget:1,name:1,value:1,type:{button:1,submit:1}},select:{autofocus:1,disabled:1,form:1,multiple:{multiple:1},name:1,size:1,readonly:{readonly:1}},datalist:{},optgroup:{disabled:1,label:1},option:{disabled:1,selected:1,label:1,value:1},textarea:{autofocus:{autofocus:1},disabled:{disabled:1},form:1,maxlength:1,name:1,placeholder:1,readonly:{readonly:1},required:{required:1},rows:1,cols:1,wrap:{on:1,off:1,hard:1,soft:1}},keygen:{autofocus:1,challenge:{challenge:1},disabled:{disabled:1},form:1,keytype:{rsa:1,dsa:1,ec:1},name:1},output:{"for":1,form:1,name:1},progress:{value:1,max:1},meter:{value:1,min:1,max:1,low:1,high:1,optimum:1},details:{open:1},summary:{},command:{type:1,label:1,icon:1,disabled:1,checked:1,radiogroup:1,command:1},menu:{type:1,label:1},dialog:{open:1}},a=Object.keys(u),h=function(){};(function(){this.getCompletions=function(e,t,n,r){var i=t.getTokenAt(n.row,n.column);if(!i)return[];if(f(i,"tag-name")||f(i,"tag-open")||f(i,"end-tag-open"))return this.getTagCompletions(e,t,n,r);if(f(i,"tag-whitespace")||f(i,"attribute-name"))return this.getAttributeCompletions(e,t,n,r);if(f(i,"attribute-value"))return this.getAttributeValueCompletions(e,t,n,r);var s=t.getLine(n.row).substr(0,n.column);return/&[A-z]*$/i.test(s)?this.getHTMLEntityCompletions(e,t,n,r):[]},this.getTagCompletions=function(e,t,n,r){return a.map(function(e){return{value:e,meta:"tag",score:Number.MAX_VALUE}})},this.getAttributeCompletions=function(e,t,n,r){var i=l(t,n);if(!i)return[];var s=o;return i in u&&(s=s.concat(Object.keys(u[i]))),s.map(function(e){return{caption:e,snippet:e+'="$0"',meta:"attribute",score:Number.MAX_VALUE}})},this.getAttributeValueCompletions=function(e,t,n,r){var i=l(t,n),s=c(t,n);if(!i)return[];var o=[];return i in u&&s in u[i]&&typeof u[i][s]=="object"&&(o=Object.keys(u[i][s])),o.map(function(e){return{caption:e,snippet:e,meta:"attribute value",score:Number.MAX_VALUE}})},this.getHTMLEntityCompletions=function(e,t,n,r){var i=["Aacute;","aacute;","Acirc;","acirc;","acute;","AElig;","aelig;","Agrave;","agrave;","alefsym;","Alpha;","alpha;","amp;","and;","ang;","Aring;","aring;","asymp;","Atilde;","atilde;","Auml;","auml;","bdquo;","Beta;","beta;","brvbar;","bull;","cap;","Ccedil;","ccedil;","cedil;","cent;","Chi;","chi;","circ;","clubs;","cong;","copy;","crarr;","cup;","curren;","Dagger;","dagger;","dArr;","darr;","deg;","Delta;","delta;","diams;","divide;","Eacute;","eacute;","Ecirc;","ecirc;","Egrave;","egrave;","empty;","emsp;","ensp;","Epsilon;","epsilon;","equiv;","Eta;","eta;","ETH;","eth;","Euml;","euml;","euro;","exist;","fnof;","forall;","frac12;","frac14;","frac34;","frasl;","Gamma;","gamma;","ge;","gt;","hArr;","harr;","hearts;","hellip;","Iacute;","iacute;","Icirc;","icirc;","iexcl;","Igrave;","igrave;","image;","infin;","int;","Iota;","iota;","iquest;","isin;","Iuml;","iuml;","Kappa;","kappa;","Lambda;","lambda;","lang;","laquo;","lArr;","larr;","lceil;","ldquo;","le;","lfloor;","lowast;","loz;","lrm;","lsaquo;","lsquo;","lt;","macr;","mdash;","micro;","middot;","minus;","Mu;","mu;","nabla;","nbsp;","ndash;","ne;","ni;","not;","notin;","nsub;","Ntilde;","ntilde;","Nu;","nu;","Oacute;","oacute;","Ocirc;","ocirc;","OElig;","oelig;","Ograve;","ograve;","oline;","Omega;","omega;","Omicron;","omicron;","oplus;","or;","ordf;","ordm;","Oslash;","oslash;","Otilde;","otilde;","otimes;","Ouml;","ouml;","para;","part;","permil;","perp;","Phi;","phi;","Pi;","pi;","piv;","plusmn;","pound;","Prime;","prime;","prod;","prop;","Psi;","psi;","quot;","radic;","rang;","raquo;","rArr;","rarr;","rceil;","rdquo;","real;","reg;","rfloor;","Rho;","rho;","rlm;","rsaquo;","rsquo;","sbquo;","Scaron;","scaron;","sdot;","sect;","shy;","Sigma;","sigma;","sigmaf;","sim;","spades;","sub;","sube;","sum;","sup;","sup1;","sup2;","sup3;","supe;","szlig;","Tau;","tau;","there4;","Theta;","theta;","thetasym;","thinsp;","THORN;","thorn;","tilde;","times;","trade;","Uacute;","uacute;","uArr;","uarr;","Ucirc;","ucirc;","Ugrave;","ugrave;","uml;","upsih;","Upsilon;","upsilon;","Uuml;","uuml;","weierp;","Xi;","xi;","Yacute;","yacute;","yen;","Yuml;","yuml;","Zeta;","zeta;","zwj;","zwnj;"];return i.map(function(e){return{caption:e,snippet:e,meta:"html entity",score:Number.MAX_VALUE}})}}).call(h.prototype),t.HtmlCompletions=h}),ace.define("ace/mode/html",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text","ace/mode/javascript","ace/mode/css","ace/mode/html_highlight_rules","ace/mode/behaviour/xml","ace/mode/folding/html","ace/mode/html_completions","ace/worker/worker_client"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/lang"),s=e("./text").Mode,o=e("./javascript").Mode,u=e("./css").Mode,a=e("./html_highlight_rules").HtmlHighlightRules,f=e("./behaviour/xml").XmlBehaviour,l=e("./folding/html").FoldMode,c=e("./html_completions").HtmlCompletions,h=e("../worker/worker_client").WorkerClient,p=["area","base","br","col","embed","hr","img","input","keygen","link","meta","menuitem","param","source","track","wbr"],d=["li","dt","dd","p","rt","rp","optgroup","option","colgroup","td","th"],v=function(e){this.fragmentContext=e&&e.fragmentContext,this.HighlightRules=a,this.$behaviour=new f,this.$completer=new c,this.createModeDelegates({"js-":o,"css-":u}),this.foldingRules=new l(this.voidElements,i.arrayToMap(d))};r.inherits(v,s),function(){this.blockComment={start:""},this.voidElements=i.arrayToMap(p),this.getNextLineIndent=function(e,t,n){return this.$getIndent(t)},this.checkOutdent=function(e,t,n){return!1},this.getCompletions=function(e,t,n,r){return this.$completer.getCompletions(e,t,n,r)},this.createWorker=function(e){if(this.constructor!=v)return;var t=new h(["ace"],"ace/mode/html_worker","Worker");return t.attachToDocument(e.getDocument()),this.fragmentContext&&t.call("setOptions",[{context:this.fragmentContext}]),t.on("error",function(t){e.setAnnotations(t.data)}),t.on("terminate",function(){e.clearAnnotations()}),t},this.$id="ace/mode/html"}.call(v.prototype),t.Mode=v})
\ No newline at end of file
diff --git a/public/ace/mode-javascript.js b/public/ace/mode-javascript.js
deleted file mode 100644
index 26a8bdc8..00000000
--- a/public/ace/mode-javascript.js
+++ /dev/null
@@ -1 +0,0 @@
-ace.define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(){this.$rules={start:[{token:"comment.doc.tag",regex:"@[\\w\\d_]+"},s.getTagRule(),{defaultToken:"comment.doc",caseInsensitive:!0}]}};r.inherits(s,i),s.getTagRule=function(e){return{token:"comment.doc.tag.storage.type",regex:"\\b(?:TODO|FIXME|XXX|HACK)\\b"}},s.getStartRule=function(e){return{token:"comment.doc",regex:"\\/\\*(?=\\*)",next:e}},s.getEndRule=function(e){return{token:"comment.doc",regex:"\\*\\/",next:e}},t.DocCommentHighlightRules=s}),ace.define("ace/mode/javascript_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";function a(){var e=o.replace("\\d","\\d\\-"),t={onMatch:function(e,t,n){var r=e.charAt(1)=="/"?2:1;if(r==1)t!=this.nextState?n.unshift(this.next,this.nextState,0):n.unshift(this.next),n[2]++;else if(r==2&&t==this.nextState){n[1]--;if(!n[1]||n[1]<0)n.shift(),n.shift()}return[{type:"meta.tag.punctuation."+(r==1?"":"end-")+"tag-open.xml",value:e.slice(0,r)},{type:"meta.tag.tag-name.xml",value:e.substr(r)}]},regex:"?"+e+"",next:"jsxAttributes",nextState:"jsx"};this.$rules.start.unshift(t);var n={regex:"{",token:"paren.quasi.start",push:"start"};this.$rules.jsx=[n,t,{include:"reference"},{defaultToken:"string"}],this.$rules.jsxAttributes=[{token:"meta.tag.punctuation.tag-close.xml",regex:"/?>",onMatch:function(e,t,n){return t==n[0]&&n.shift(),e.length==2&&(n[0]==this.nextState&&n[1]--,(!n[1]||n[1]<0)&&n.splice(0,2)),this.next=n[0]||"start",[{type:this.token,value:e}]},nextState:"jsx"},n,f("jsxAttributes"),{token:"entity.other.attribute-name.xml",regex:e},{token:"keyword.operator.attribute-equals.xml",regex:"="},{token:"text.tag-whitespace.xml",regex:"\\s+"},{token:"string.attribute-value.xml",regex:"'",stateName:"jsx_attr_q",push:[{token:"string.attribute-value.xml",regex:"'",next:"pop"},{include:"reference"},{defaultToken:"string.attribute-value.xml"}]},{token:"string.attribute-value.xml",regex:'"',stateName:"jsx_attr_qq",push:[{token:"string.attribute-value.xml",regex:'"',next:"pop"},{include:"reference"},{defaultToken:"string.attribute-value.xml"}]},t],this.$rules.reference=[{token:"constant.language.escape.reference.xml",regex:"(?:[0-9]+;)|(?:[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"}]}function f(e){return[{token:"comment",regex:/\/\*/,next:[i.getTagRule(),{token:"comment",regex:"\\*\\/",next:e||"pop"},{defaultToken:"comment",caseInsensitive:!0}]},{token:"comment",regex:"\\/\\/",next:[i.getTagRule(),{token:"comment",regex:"$|^",next:e||"pop"},{defaultToken:"comment",caseInsensitive:!0}]}]}var r=e("../lib/oop"),i=e("./doc_comment_highlight_rules").DocCommentHighlightRules,s=e("./text_highlight_rules").TextHighlightRules,o="[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*\\b",u=function(e){var t=this.createKeywordMapper({"variable.language":"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|Namespace|QName|XML|XMLList|ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|SyntaxError|TypeError|URIError|decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|isNaN|parseFloat|parseInt|JSON|Math|this|arguments|prototype|window|document",keyword:"const|yield|import|get|set|break|case|catch|continue|default|delete|do|else|finally|for|function|if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|__parent__|__count__|escape|unescape|with|__proto__|class|enum|extends|super|export|implements|private|public|interface|package|protected|static","storage.type":"const|let|var|function","constant.language":"null|Infinity|NaN|undefined","support.function":"alert","constant.language.boolean":"true|false"},"identifier"),n="case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void",r="\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|u{[0-9a-fA-F]{1,6}}|[0-2][0-7]{0,2}|3[0-7][0-7]?|[4-7][0-7]?|.)";this.$rules={no_regex:[i.getStartRule("doc-start"),f("no_regex"),{token:"string",regex:"'(?=.)",next:"qstring"},{token:"string",regex:'"(?=.)',next:"qqstring"},{token:"constant.numeric",regex:/0(?:[xX][0-9a-fA-F]+|[bB][01]+)\b/},{token:"constant.numeric",regex:/[+-]?\d[\d_]*(?:(?:\.\d*)?(?:[eE][+-]?\d+)?)?\b/},{token:["storage.type","punctuation.operator","support.function","punctuation.operator","entity.name.function","text","keyword.operator"],regex:"("+o+")(\\.)(prototype)(\\.)("+o+")(\\s*)(=)",next:"function_arguments"},{token:["storage.type","punctuation.operator","entity.name.function","text","keyword.operator","text","storage.type","text","paren.lparen"],regex:"("+o+")(\\.)("+o+")(\\s*)(=)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:["entity.name.function","text","keyword.operator","text","storage.type","text","paren.lparen"],regex:"("+o+")(\\s*)(=)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:["storage.type","punctuation.operator","entity.name.function","text","keyword.operator","text","storage.type","text","entity.name.function","text","paren.lparen"],regex:"("+o+")(\\.)("+o+")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()",next:"function_arguments"},{token:["storage.type","text","entity.name.function","text","paren.lparen"],regex:"(function)(\\s+)("+o+")(\\s*)(\\()",next:"function_arguments"},{token:["entity.name.function","text","punctuation.operator","text","storage.type","text","paren.lparen"],regex:"("+o+")(\\s*)(:)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:["text","text","storage.type","text","paren.lparen"],regex:"(:)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:"keyword",regex:"(?:"+n+")\\b",next:"start"},{token:["support.constant"],regex:/that\b/},{token:["storage.type","punctuation.operator","support.function.firebug"],regex:/(console)(\.)(warn|info|log|error|time|trace|timeEnd|assert)\b/},{token:t,regex:o},{token:"punctuation.operator",regex:/[.](?![.])/,next:"property"},{token:"keyword.operator",regex:/--|\+\+|\.{3}|===|==|=|!=|!==|<+=?|>+=?|!|&&|\|\||\?\:|[!$%&*+\-~\/^]=?/,next:"start"},{token:"punctuation.operator",regex:/[?:,;.]/,next:"start"},{token:"paren.lparen",regex:/[\[({]/,next:"start"},{token:"paren.rparen",regex:/[\])}]/},{token:"comment",regex:/^#!.*$/}],property:[{token:"text",regex:"\\s+"},{token:["storage.type","punctuation.operator","entity.name.function","text","keyword.operator","text","storage.type","text","entity.name.function","text","paren.lparen"],regex:"("+o+")(\\.)("+o+")(\\s*)(=)(\\s*)(function)(?:(\\s+)(\\w+))?(\\s*)(\\()",next:"function_arguments"},{token:"punctuation.operator",regex:/[.](?![.])/},{token:"support.function",regex:/(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/},{token:"support.function.dom",regex:/(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/},{token:"support.constant",regex:/(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\b/},{token:"identifier",regex:o},{regex:"",token:"empty",next:"no_regex"}],start:[i.getStartRule("doc-start"),f("start"),{token:"string.regexp",regex:"\\/",next:"regex"},{token:"text",regex:"\\s+|^$",next:"start"},{token:"empty",regex:"",next:"no_regex"}],regex:[{token:"regexp.keyword.operator",regex:"\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"},{token:"string.regexp",regex:"/[sxngimy]*",next:"no_regex"},{token:"invalid",regex:/\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/},{token:"constant.language.escape",regex:/\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/},{token:"constant.language.delimiter",regex:/\|/},{token:"constant.language.escape",regex:/\[\^?/,next:"regex_character_class"},{token:"empty",regex:"$",next:"no_regex"},{defaultToken:"string.regexp"}],regex_character_class:[{token:"regexp.charclass.keyword.operator",regex:"\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"},{token:"constant.language.escape",regex:"]",next:"regex"},{token:"constant.language.escape",regex:"-"},{token:"empty",regex:"$",next:"no_regex"},{defaultToken:"string.regexp.charachterclass"}],function_arguments:[{token:"variable.parameter",regex:o},{token:"punctuation.operator",regex:"[, ]+"},{token:"punctuation.operator",regex:"$"},{token:"empty",regex:"",next:"no_regex"}],qqstring:[{token:"constant.language.escape",regex:r},{token:"string",regex:"\\\\$",next:"qqstring"},{token:"string",regex:'"|$',next:"no_regex"},{defaultToken:"string"}],qstring:[{token:"constant.language.escape",regex:r},{token:"string",regex:"\\\\$",next:"qstring"},{token:"string",regex:"'|$",next:"no_regex"},{defaultToken:"string"}]};if(!e||!e.noES6)this.$rules.no_regex.unshift({regex:"[{}]",onMatch:function(e,t,n){this.next=e=="{"?this.nextState:"";if(e=="{"&&n.length)n.unshift("start",t);else if(e=="}"&&n.length){n.shift(),this.next=n.shift();if(this.next.indexOf("string")!=-1||this.next.indexOf("jsx")!=-1)return"paren.quasi.end"}return e=="{"?"paren.lparen":"paren.rparen"},nextState:"start"},{token:"string.quasi.start",regex:/`/,push:[{token:"constant.language.escape",regex:r},{token:"paren.quasi.start",regex:/\${/,push:"start"},{token:"string.quasi.end",regex:/`/,next:"pop"},{defaultToken:"string.quasi"}]}),(!e||!e.noJSX)&&a.call(this);this.embedRules(i,"doc-",[i.getEndRule("no_regex")]),this.normalizeRules()};r.inherits(u,s),t.JavaScriptHighlightRules=u}),ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(e,t,n){"use strict";var r=e("../range").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\s+$/.test(e)?/^\s*\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\s*\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),ace.define("ace/mode/behaviour/cstyle",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../behaviour").Behaviour,s=e("../../token_iterator").TokenIterator,o=e("../../lib/lang"),u=["text","paren.rparen","punctuation.operator"],a=["text","paren.rparen","punctuation.operator","comment"],f,l={},c=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:"",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:"",maybeInsertedLineEnd:""}},h=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},p=function(){this.add("braces","insertion",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i=="{"){c(n);var a=n.getSelectionRange(),l=r.doc.getTextRange(a);if(l!==""&&l!=="{"&&n.getWrapBehavioursEnabled())return h(a,l,"{","}");if(p.isSaneInsertion(n,r))return/[\]\}\)]/.test(u[s.column])||n.inMultiSelectMode?(p.recordAutoInsert(n,r,"}"),{text:"{}",selection:[1,1]}):(p.recordMaybeInsert(n,r,"{"),{text:"{",selection:[1,1]})}else if(i=="}"){c(n);var d=u.substring(s.column,s.column+1);if(d=="}"){var v=r.$findOpeningBracket("}",{column:s.column+1,row:s.row});if(v!==null&&p.isAutoInsertedClosing(s,u,i))return p.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}else{if(i=="\n"||i=="\r\n"){c(n);var m="";p.isMaybeInsertedClosing(s,u)&&(m=o.stringRepeat("}",f.maybeInsertedBrackets),p.clearMaybeInsertedClosing());var d=u.substring(s.column,s.column+1);if(d==="}"){var g=r.findMatchingBracket({row:s.row,column:s.column+1},"}");if(!g)return null;var y=this.$getIndent(r.getLine(g.row))}else{if(!m){p.clearMaybeInsertedClosing();return}var y=this.$getIndent(u)}var b=y+r.getTabString();return{text:"\n"+b+"\n"+y+m,selection:[1,b.length,1,b.length]}}p.clearMaybeInsertedClosing()}}),this.add("braces","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="{"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u=="}")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add("parens","insertion",function(e,t,n,r,i){if(i=="("){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==""&&n.getWrapBehavioursEnabled())return h(s,o,"(",")");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,")"),{text:"()",selection:[1,1]}}else if(i==")"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==")"){var l=r.$findOpeningBracket(")",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}}),this.add("parens","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="("){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==")")return i.end.column++,i}}),this.add("brackets","insertion",function(e,t,n,r,i){if(i=="["){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==""&&n.getWrapBehavioursEnabled())return h(s,o,"[","]");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,"]"),{text:"[]",selection:[1,1]}}else if(i=="]"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f=="]"){var l=r.$findOpeningBracket("]",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}}),this.add("brackets","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="["){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u=="]")return i.end.column++,i}}),this.add("string_dquotes","insertion",function(e,t,n,r,i){if(i=='"'||i=="'"){c(n);var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==""&&u!=="'"&&u!='"'&&n.getWrapBehavioursEnabled())return h(o,u,s,s);if(!u){var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column),p=f.substring(a.column,a.column+1),d=r.getTokenAt(a.row,a.column),v=r.getTokenAt(a.row,a.column+1);if(l=="\\"&&d&&/escape/.test(d.type))return null;var m=d&&/string|escape/.test(d.type),g=!v||/string|escape/.test(v.type),y;if(p==s)y=m!==g;else{if(m&&!g)return null;if(m&&g)return null;var b=r.$mode.tokenRe;b.lastIndex=0;var w=b.test(l);b.lastIndex=0;var E=b.test(l);if(w||E)return null;if(p&&!/[\s;,.})\]\\]/.test(p))return null;y=!0}return{text:y?s+s:"",selection:[1,1]}}}}),this.add("string_dquotes","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='"'||s=="'")){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||"text",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||"text",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||"text",a)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(p,i),t.CstyleBehaviour=p}),ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../../range").Range,s=e("./fold_mode").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\|[^|]*?$/,"|"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\|[^|]*?$/,"|"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\{|\[)[^\}\]]*$|^\s*(\/\*)/,this.foldingStopMarker=/^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/,this.singleLineBlockCommentRe=/^\s*(\/\*).*\*\/\s*$/,this.tripleStarBlockCommentRe=/^\s*(\/\*\*\*).*\*\/\s*$/,this.startRegionRe=/^\s*(\/\*|\/\/)#?region\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return"";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?"start":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!="all"&&(u=null)),u}if(t==="markbegin")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++tf)break;var l=this.getFoldWidgetRange(e,"all",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\s*$/),s=e.getLength(),o=n,u=/^\s*(?:\/\*|\/\/|--)#?(end)?region\b/,a=1;while(++no)return new i(o,r,l,t.length)}}.call(o.prototype)}),ace.define("ace/mode/javascript",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/range","ace/worker/worker_client","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./javascript_highlight_rules").JavaScriptHighlightRules,o=e("./matching_brace_outdent").MatchingBraceOutdent,u=e("../range").Range,a=e("../worker/worker_client").WorkerClient,f=e("./behaviour/cstyle").CstyleBehaviour,l=e("./folding/cstyle").FoldMode,c=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new f,this.foldingRules=new l};r.inherits(c,i),function(){this.lineCommentStart="//",this.blockComment={start:"/*",end:"*/"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens,o=i.state;if(s.length&&s[s.length-1].type=="comment")return r;if(e=="start"||e=="no_regex"){var u=t.match(/^.*(?:\bcase\b.*\:|[\{\(\[])\s*$/);u&&(r+=n)}else if(e=="doc-start"){if(o=="start"||o=="no_regex")return"";var u=t.match(/^\s*(\/?)\*/);u&&(u[1]&&(r+=" "),r+="* ")}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.createWorker=function(e){var t=new a(["ace"],"ace/mode/javascript_worker","JavaScriptWorker");return t.attachToDocument(e.getDocument()),t.on("annotate",function(t){e.setAnnotations(t.data)}),t.on("terminate",function(){e.clearAnnotations()}),t},this.$id="ace/mode/javascript"}.call(c.prototype),t.Mode=c})
\ No newline at end of file
diff --git a/public/ace/mode-json.js b/public/ace/mode-json.js
deleted file mode 100644
index f6226b80..00000000
--- a/public/ace/mode-json.js
+++ /dev/null
@@ -1 +0,0 @@
-ace.define("ace/mode/json_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(){this.$rules={start:[{token:"variable",regex:'["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]\\s*(?=:)'},{token:"string",regex:'"',next:"string"},{token:"constant.numeric",regex:"0[xX][0-9a-fA-F]+\\b"},{token:"constant.numeric",regex:"[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"},{token:"constant.language.boolean",regex:"(?:true|false)\\b"},{token:"invalid.illegal",regex:"['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"},{token:"invalid.illegal",regex:"\\/\\/.*$"},{token:"paren.lparen",regex:"[[({]"},{token:"paren.rparen",regex:"[\\])}]"},{token:"text",regex:"\\s+"}],string:[{token:"constant.language.escape",regex:/\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|["\\\/bfnrt])/},{token:"string",regex:'[^"\\\\]+'},{token:"string",regex:'"',next:"start"},{token:"string",regex:"",next:"start"}]}};r.inherits(s,i),t.JsonHighlightRules=s}),ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(e,t,n){"use strict";var r=e("../range").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\s+$/.test(e)?/^\s*\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\s*\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),ace.define("ace/mode/behaviour/cstyle",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../behaviour").Behaviour,s=e("../../token_iterator").TokenIterator,o=e("../../lib/lang"),u=["text","paren.rparen","punctuation.operator"],a=["text","paren.rparen","punctuation.operator","comment"],f,l={},c=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:"",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:"",maybeInsertedLineEnd:""}},h=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},p=function(){this.add("braces","insertion",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i=="{"){c(n);var a=n.getSelectionRange(),l=r.doc.getTextRange(a);if(l!==""&&l!=="{"&&n.getWrapBehavioursEnabled())return h(a,l,"{","}");if(p.isSaneInsertion(n,r))return/[\]\}\)]/.test(u[s.column])||n.inMultiSelectMode?(p.recordAutoInsert(n,r,"}"),{text:"{}",selection:[1,1]}):(p.recordMaybeInsert(n,r,"{"),{text:"{",selection:[1,1]})}else if(i=="}"){c(n);var d=u.substring(s.column,s.column+1);if(d=="}"){var v=r.$findOpeningBracket("}",{column:s.column+1,row:s.row});if(v!==null&&p.isAutoInsertedClosing(s,u,i))return p.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}else{if(i=="\n"||i=="\r\n"){c(n);var m="";p.isMaybeInsertedClosing(s,u)&&(m=o.stringRepeat("}",f.maybeInsertedBrackets),p.clearMaybeInsertedClosing());var d=u.substring(s.column,s.column+1);if(d==="}"){var g=r.findMatchingBracket({row:s.row,column:s.column+1},"}");if(!g)return null;var y=this.$getIndent(r.getLine(g.row))}else{if(!m){p.clearMaybeInsertedClosing();return}var y=this.$getIndent(u)}var b=y+r.getTabString();return{text:"\n"+b+"\n"+y+m,selection:[1,b.length,1,b.length]}}p.clearMaybeInsertedClosing()}}),this.add("braces","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="{"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u=="}")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add("parens","insertion",function(e,t,n,r,i){if(i=="("){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==""&&n.getWrapBehavioursEnabled())return h(s,o,"(",")");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,")"),{text:"()",selection:[1,1]}}else if(i==")"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==")"){var l=r.$findOpeningBracket(")",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}}),this.add("parens","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="("){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==")")return i.end.column++,i}}),this.add("brackets","insertion",function(e,t,n,r,i){if(i=="["){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==""&&n.getWrapBehavioursEnabled())return h(s,o,"[","]");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,"]"),{text:"[]",selection:[1,1]}}else if(i=="]"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f=="]"){var l=r.$findOpeningBracket("]",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}}),this.add("brackets","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="["){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u=="]")return i.end.column++,i}}),this.add("string_dquotes","insertion",function(e,t,n,r,i){if(i=='"'||i=="'"){c(n);var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==""&&u!=="'"&&u!='"'&&n.getWrapBehavioursEnabled())return h(o,u,s,s);if(!u){var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column),p=f.substring(a.column,a.column+1),d=r.getTokenAt(a.row,a.column),v=r.getTokenAt(a.row,a.column+1);if(l=="\\"&&d&&/escape/.test(d.type))return null;var m=d&&/string|escape/.test(d.type),g=!v||/string|escape/.test(v.type),y;if(p==s)y=m!==g;else{if(m&&!g)return null;if(m&&g)return null;var b=r.$mode.tokenRe;b.lastIndex=0;var w=b.test(l);b.lastIndex=0;var E=b.test(l);if(w||E)return null;if(p&&!/[\s;,.})\]\\]/.test(p))return null;y=!0}return{text:y?s+s:"",selection:[1,1]}}}}),this.add("string_dquotes","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='"'||s=="'")){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||"text",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||"text",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||"text",a)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(p,i),t.CstyleBehaviour=p}),ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../../range").Range,s=e("./fold_mode").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\|[^|]*?$/,"|"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\|[^|]*?$/,"|"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\{|\[)[^\}\]]*$|^\s*(\/\*)/,this.foldingStopMarker=/^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/,this.singleLineBlockCommentRe=/^\s*(\/\*).*\*\/\s*$/,this.tripleStarBlockCommentRe=/^\s*(\/\*\*\*).*\*\/\s*$/,this.startRegionRe=/^\s*(\/\*|\/\/)#?region\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return"";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?"start":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!="all"&&(u=null)),u}if(t==="markbegin")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++tf)break;var l=this.getFoldWidgetRange(e,"all",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\s*$/),s=e.getLength(),o=n,u=/^\s*(?:\/\*|\/\/|--)#?(end)?region\b/,a=1;while(++no)return new i(o,r,l,t.length)}}.call(o.prototype)}),ace.define("ace/mode/json",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/json_highlight_rules","ace/mode/matching_brace_outdent","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle","ace/worker/worker_client"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./json_highlight_rules").JsonHighlightRules,o=e("./matching_brace_outdent").MatchingBraceOutdent,u=e("./behaviour/cstyle").CstyleBehaviour,a=e("./folding/cstyle").FoldMode,f=e("../worker/worker_client").WorkerClient,l=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new u,this.foldingRules=new a};r.inherits(l,i),function(){this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t);if(e=="start"){var i=t.match(/^.*[\{\(\[]\s*$/);i&&(r+=n)}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.createWorker=function(e){var t=new f(["ace"],"ace/mode/json_worker","JsonWorker");return t.attachToDocument(e.getDocument()),t.on("annotate",function(t){e.setAnnotations(t.data)}),t.on("terminate",function(){e.clearAnnotations()}),t},this.$id="ace/mode/json"}.call(l.prototype),t.Mode=l})
\ No newline at end of file
diff --git a/public/ace/mode-plain_text.js b/public/ace/mode-plain_text.js
deleted file mode 100644
index 21cf21da..00000000
--- a/public/ace/mode-plain_text.js
+++ /dev/null
@@ -1 +0,0 @@
-ace.define("ace/mode/plain_text",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/text_highlight_rules","ace/mode/behaviour"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./text_highlight_rules").TextHighlightRules,o=e("./behaviour").Behaviour,u=function(){this.HighlightRules=s,this.$behaviour=new o};r.inherits(u,i),function(){this.type="text",this.getNextLineIndent=function(e,t,n){return""},this.$id="ace/mode/plain_text"}.call(u.prototype),t.Mode=u})
diff --git a/public/ace/theme-chrome.js b/public/ace/theme-chrome.js
deleted file mode 100644
index 29b01c7a..00000000
--- a/public/ace/theme-chrome.js
+++ /dev/null
@@ -1 +0,0 @@
-ace.define("ace/theme/chrome",["require","exports","module","ace/lib/dom"],function(e,t,n){t.isDark=!1,t.cssClass="ace-chrome",t.cssText='.ace-chrome .ace_gutter {background: #ebebeb;color: #333;overflow : hidden;}.ace-chrome .ace_print-margin {width: 1px;background: #e8e8e8;}.ace-chrome {background-color: #FFFFFF;color: black;}.ace-chrome .ace_cursor {color: black;}.ace-chrome .ace_invisible {color: rgb(191, 191, 191);}.ace-chrome .ace_constant.ace_buildin {color: rgb(88, 72, 246);}.ace-chrome .ace_constant.ace_language {color: rgb(88, 92, 246);}.ace-chrome .ace_constant.ace_library {color: rgb(6, 150, 14);}.ace-chrome .ace_invalid {background-color: rgb(153, 0, 0);color: white;}.ace-chrome .ace_fold {}.ace-chrome .ace_support.ace_function {color: rgb(60, 76, 114);}.ace-chrome .ace_support.ace_constant {color: rgb(6, 150, 14);}.ace-chrome .ace_support.ace_type,.ace-chrome .ace_support.ace_class.ace-chrome .ace_support.ace_other {color: rgb(109, 121, 222);}.ace-chrome .ace_variable.ace_parameter {font-style:italic;color:#FD971F;}.ace-chrome .ace_keyword.ace_operator {color: rgb(104, 118, 135);}.ace-chrome .ace_comment {color: #236e24;}.ace-chrome .ace_comment.ace_doc {color: #236e24;}.ace-chrome .ace_comment.ace_doc.ace_tag {color: #236e24;}.ace-chrome .ace_constant.ace_numeric {color: rgb(0, 0, 205);}.ace-chrome .ace_variable {color: rgb(49, 132, 149);}.ace-chrome .ace_xml-pe {color: rgb(104, 104, 91);}.ace-chrome .ace_entity.ace_name.ace_function {color: #0000A2;}.ace-chrome .ace_heading {color: rgb(12, 7, 255);}.ace-chrome .ace_list {color:rgb(185, 6, 144);}.ace-chrome .ace_marker-layer .ace_selection {background: rgb(181, 213, 255);}.ace-chrome .ace_marker-layer .ace_step {background: rgb(252, 255, 0);}.ace-chrome .ace_marker-layer .ace_stack {background: rgb(164, 229, 101);}.ace-chrome .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgb(192, 192, 192);}.ace-chrome .ace_marker-layer .ace_active-line {background: rgba(0, 0, 0, 0.07);}.ace-chrome .ace_gutter-active-line {background-color : #dcdcdc;}.ace-chrome .ace_marker-layer .ace_selected-word {background: rgb(250, 250, 255);border: 1px solid rgb(200, 200, 250);}.ace-chrome .ace_storage,.ace-chrome .ace_keyword,.ace-chrome .ace_meta.ace_tag {color: rgb(147, 15, 128);}.ace-chrome .ace_string.ace_regex {color: rgb(255, 0, 0)}.ace-chrome .ace_string {color: #1A1AA6;}.ace-chrome .ace_entity.ace_other.ace_attribute-name {color: #994409;}.ace-chrome .ace_indent-guide {background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y;}';var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass)})
\ No newline at end of file
diff --git a/public/ace/worker-css.js b/public/ace/worker-css.js
deleted file mode 100644
index 408c6bd0..00000000
--- a/public/ace/worker-css.js
+++ /dev/null
@@ -1 +0,0 @@
-"no use strict";(function(e){function t(e,t){var n=e,r="";while(n){var i=t[n];if(typeof i=="string")return i+r;if(i)return i.location.replace(/\/*$/,"/")+(r||i.main||i.name);if(i===!1)return"";var s=n.lastIndexOf("/");if(s===-1)break;r=n.substr(s)+r,n=n.slice(0,s)}return e}if(typeof e.window!="undefined"&&e.document)return;if(e.require&&e.define)return;e.console||(e.console=function(){var e=Array.prototype.slice.call(arguments,0);postMessage({type:"log",data:e})},e.console.error=e.console.warn=e.console.log=e.console.trace=e.console),e.window=e,e.ace=e,e.onerror=function(e,t,n,r,i){postMessage({type:"error",data:{message:e,data:i.data,file:t,line:n,col:r,stack:i.stack}})},e.normalizeModule=function(t,n){if(n.indexOf("!")!==-1){var r=n.split("!");return e.normalizeModule(t,r[0])+"!"+e.normalizeModule(t,r[1])}if(n.charAt(0)=="."){var i=t.split("/").slice(0,-1).join("/");n=(i?i+"/":"")+n;while(n.indexOf(".")!==-1&&s!=n){var s=n;n=n.replace(/^\.\//,"").replace(/\/\.\//,"/").replace(/[^\/]+\/\.\.\//,"")}}return n},e.require=function(r,i){i||(i=r,r=null);if(!i.charAt)throw new Error("worker.js require() accepts only (parentId, id) as arguments");i=e.normalizeModule(r,i);var s=e.require.modules[i];if(s)return s.initialized||(s.initialized=!0,s.exports=s.factory().exports),s.exports;if(!e.require.tlns)return console.log("unable to load "+i);var o=t(i,e.require.tlns);return o.slice(-3)!=".js"&&(o+=".js"),e.require.id=i,e.require.modules[i]={},importScripts(o),e.require(r,i)},e.require.modules={},e.require.tlns={},e.define=function(t,n,r){arguments.length==2?(r=n,typeof t!="string"&&(n=t,t=e.require.id)):arguments.length==1&&(r=t,n=[],t=e.require.id);if(typeof r!="function"){e.require.modules[t]={exports:r,initialized:!0};return}n.length||(n=["require","exports","module"]);var i=function(n){return e.require(t,n)};e.require.modules[t]={exports:{},factory:function(){var e=this,t=r.apply(this,n.map(function(t){switch(t){case"require":return i;case"exports":return e.exports;case"module":return e;default:return i(t)}}));return t&&(e.exports=t),e}}},e.define.amd={},require.tlns={},e.initBaseUrls=function(t){for(var n in t)require.tlns[n]=t[n]},e.initSender=function(){var n=e.require("ace/lib/event_emitter").EventEmitter,r=e.require("ace/lib/oop"),i=function(){};return function(){r.implement(this,n),this.callback=function(e,t){postMessage({type:"call",id:t,data:e})},this.emit=function(e,t){postMessage({type:"event",name:e,data:t})}}.call(i.prototype),new i};var n=e.main=null,r=e.sender=null;e.onmessage=function(t){var i=t.data;if(i.event&&r)r._signal(i.event,i.data);else if(i.command)if(n[i.command])n[i.command].apply(n,i.args);else{if(!e[i.command])throw new Error("Unknown command:"+i.command);e[i.command].apply(e,i.args)}else if(i.init){e.initBaseUrls(i.tlns),require("ace/lib/es5-shim"),r=e.sender=e.initSender();var s=require(i.module)[i.classname];n=e.main=new s(r)}}})(this),ace.define("ace/lib/oop",["require","exports","module"],function(e,t,n){"use strict";t.inherits=function(e,t){e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})},t.mixin=function(e,t){for(var n in t)e[n]=t[n];return e},t.implement=function(e,n){t.mixin(e,n)}}),ace.define("ace/lib/lang",["require","exports","module"],function(e,t,n){"use strict";t.last=function(e){return e[e.length-1]},t.stringReverse=function(e){return e.split("").reverse().join("")},t.stringRepeat=function(e,t){var n="";while(t>0){t&1&&(n+=e);if(t>>=1)e+=e}return n};var r=/^\s\s*/,i=/\s\s*$/;t.stringTrimLeft=function(e){return e.replace(r,"")},t.stringTrimRight=function(e){return e.replace(i,"")},t.copyObject=function(e){var t={};for(var n in e)t[n]=e[n];return t},t.copyArray=function(e){var t=[];for(var n=0,r=e.length;n ["+this.end.row+"/"+this.end.column+"]"},this.contains=function(e,t){return this.compare(e,t)==0},this.compareRange=function(e){var t,n=e.end,r=e.start;return t=this.compare(n.row,n.column),t==1?(t=this.compare(r.row,r.column),t==1?2:t==0?1:0):t==-1?-2:(t=this.compare(r.row,r.column),t==-1?-1:t==1?42:0)},this.comparePoint=function(e){return this.compare(e.row,e.column)},this.containsRange=function(e){return this.comparePoint(e.start)==0&&this.comparePoint(e.end)==0},this.intersects=function(e){var t=this.compareRange(e);return t==-1||t==0||t==1},this.isEnd=function(e,t){return this.end.row==e&&this.end.column==t},this.isStart=function(e,t){return this.start.row==e&&this.start.column==t},this.setStart=function(e,t){typeof e=="object"?(this.start.column=e.column,this.start.row=e.row):(this.start.row=e,this.start.column=t)},this.setEnd=function(e,t){typeof e=="object"?(this.end.column=e.column,this.end.row=e.row):(this.end.row=e,this.end.column=t)},this.inside=function(e,t){return this.compare(e,t)==0?this.isEnd(e,t)||this.isStart(e,t)?!1:!0:!1},this.insideStart=function(e,t){return this.compare(e,t)==0?this.isEnd(e,t)?!1:!0:!1},this.insideEnd=function(e,t){return this.compare(e,t)==0?this.isStart(e,t)?!1:!0:!1},this.compare=function(e,t){return!this.isMultiLine()&&e===this.start.row?tthis.end.column?1:0:ethis.end.row?1:this.start.row===e?t>=this.start.column?0:-1:this.end.row===e?t<=this.end.column?0:1:0},this.compareStart=function(e,t){return this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.compareEnd=function(e,t){return this.end.row==e&&this.end.column==t?1:this.compare(e,t)},this.compareInside=function(e,t){return this.end.row==e&&this.end.column==t?1:this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.clipRows=function(e,t){if(this.end.row>t)var n={row:t+1,column:0};else if(this.end.rowt)var r={row:t+1,column:0};else if(this.start.row=0&&t.row=0&&t.column<=e[t.row].length}function s(e,t){t.action!="insert"&&t.action!="remove"&&r(t,"delta.action must be 'insert' or 'remove'"),t.lines instanceof Array||r(t,"delta.lines must be an Array"),(!t.start||!t.end)&&r(t,"delta.start/end must be an present");var n=t.start;i(e,t.start)||r(t,"delta.start must be contained in document");var s=t.end;t.action=="remove"&&!i(e,s)&&r(t,"delta.end must contained in document for 'remove' actions");var o=s.row-n.row,u=s.column-(o==0?n.column:0);(o!=t.lines.length-1||t.lines[o].length!=u)&&r(t,"delta.range must match delta lines")}t.applyDelta=function(e,t,n){var r=t.start.row,i=t.start.column,s=e[r]||"";switch(t.action){case"insert":var o=t.lines;if(o.length===1)e[r]=s.substring(0,i)+t.lines[0]+s.substring(i);else{var u=[r,1].concat(t.lines);e.splice.apply(e,u),e[r]=s.substring(0,i)+e[r],e[r+t.lines.length-1]+=s.substring(i)}break;case"remove":var a=t.end.column,f=t.end.row;r===f?e[r]=s.substring(0,i)+s.substring(a):e.splice(r,f-r+1,s.substring(0,i)+e[f].substring(a))}}}),ace.define("ace/lib/event_emitter",["require","exports","module"],function(e,t,n){"use strict";var r={},i=function(){this.propagationStopped=!0},s=function(){this.defaultPrevented=!0};r._emit=r._dispatchEvent=function(e,t){this._eventRegistry||(this._eventRegistry={}),this._defaultHandlers||(this._defaultHandlers={});var n=this._eventRegistry[e]||[],r=this._defaultHandlers[e];if(!n.length&&!r)return;if(typeof t!="object"||!t)t={};t.type||(t.type=e),t.stopPropagation||(t.stopPropagation=i),t.preventDefault||(t.preventDefault=s),n=n.slice();for(var o=0;othis.row)return;var n=t(e,{row:this.row,column:this.column},this.$insertRight);this.setPosition(n.row,n.column,!0)},this.setPosition=function(e,t,n){var r;n?r={row:e,column:t}:r=this.$clipPositionToDocument(e,t);if(this.row==r.row&&this.column==r.column)return;var i={row:this.row,column:this.column};this.row=r.row,this.column=r.column,this._signal("change",{old:i,value:r})},this.detach=function(){this.document.removeEventListener("change",this.$onChange)},this.attach=function(e){this.document=e||this.document,this.document.on("change",this.$onChange)},this.$clipPositionToDocument=function(e,t){var n={};return e>=this.document.getLength()?(n.row=Math.max(0,this.document.getLength()-1),n.column=this.document.getLine(n.row).length):e<0?(n.row=0,n.column=0):(n.row=e,n.column=Math.min(this.document.getLine(n.row).length,Math.max(0,t))),t<0&&(n.column=0),n}}).call(s.prototype)}),ace.define("ace/document",["require","exports","module","ace/lib/oop","ace/apply_delta","ace/lib/event_emitter","ace/range","ace/anchor"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./apply_delta").applyDelta,s=e("./lib/event_emitter").EventEmitter,o=e("./range").Range,u=e("./anchor").Anchor,a=function(e){this.$lines=[""],e.length===0?this.$lines=[""]:Array.isArray(e)?this.insertMergedLines({row:0,column:0},e):this.insert({row:0,column:0},e)};(function(){r.implement(this,s),this.setValue=function(e){var t=this.getLength()-1;this.remove(new o(0,0,t,this.getLine(t).length)),this.insert({row:0,column:0},e)},this.getValue=function(){return this.getAllLines().join(this.getNewLineCharacter())},this.createAnchor=function(e,t){return new u(this,e,t)},"aaa".split(/a/).length===0?this.$split=function(e){return e.replace(/\r\n|\r/g,"\n").split("\n")}:this.$split=function(e){return e.split(/\r\n|\r|\n/)},this.$detectNewLine=function(e){var t=e.match(/^.*?(\r\n|\r|\n)/m);this.$autoNewLine=t?t[1]:"\n",this._signal("changeNewLineMode")},this.getNewLineCharacter=function(){switch(this.$newLineMode){case"windows":return"\r\n";case"unix":return"\n";default:return this.$autoNewLine||"\n"}},this.$autoNewLine="",this.$newLineMode="auto",this.setNewLineMode=function(e){if(this.$newLineMode===e)return;this.$newLineMode=e,this._signal("changeNewLineMode")},this.getNewLineMode=function(){return this.$newLineMode},this.isNewLine=function(e){return e=="\r\n"||e=="\r"||e=="\n"},this.getLine=function(e){return this.$lines[e]||""},this.getLines=function(e,t){return this.$lines.slice(e,t+1)},this.getAllLines=function(){return this.getLines(0,this.getLength())},this.getLength=function(){return this.$lines.length},this.getTextRange=function(e){return this.getLinesForRange(e).join(this.getNewLineCharacter())},this.getLinesForRange=function(e){var t;if(e.start.row===e.end.row)t=[this.getLine(e.start.row).substring(e.start.column,e.end.column)];else{t=this.getLines(e.start.row,e.end.row),t[0]=(t[0]||"").substring(e.start.column);var n=t.length-1;e.end.row-e.start.row==n&&(t[n]=t[n].substring(0,e.end.column))}return t},this.insertLines=function(e,t){return console.warn("Use of document.insertLines is deprecated. Use the insertFullLines method instead."),this.insertFullLines(e,t)},this.removeLines=function(e,t){return console.warn("Use of document.removeLines is deprecated. Use the removeFullLines method instead."),this.removeFullLines(e,t)},this.insertNewLine=function(e){return console.warn("Use of document.insertNewLine is deprecated. Use insertMergedLines(position, ['', '']) instead."),this.insertMergedLines(e,["",""])},this.insert=function(e,t){return this.getLength()<=1&&this.$detectNewLine(t),this.insertMergedLines(e,this.$split(t))},this.insertInLine=function(e,t){var n=this.clippedPos(e.row,e.column),r=this.pos(e.row,e.column+t.length);return this.applyDelta({start:n,end:r,action:"insert",lines:[t]},!0),this.clonePos(r)},this.clippedPos=function(e,t){var n=this.getLength();e===undefined?e=n:e<0?e=0:e>=n&&(e=n-1,t=undefined);var r=this.getLine(e);return t==undefined&&(t=r.length),t=Math.min(Math.max(t,0),r.length),{row:e,column:t}},this.clonePos=function(e){return{row:e.row,column:e.column}},this.pos=function(e,t){return{row:e,column:t}},this.$clipPosition=function(e){var t=this.getLength();return e.row>=t?(e.row=Math.max(0,t-1),e.column=this.getLine(t-1).length):(e.row=Math.max(0,e.row),e.column=Math.min(Math.max(e.column,0),this.getLine(e.row).length)),e},this.insertFullLines=function(e,t){e=Math.min(Math.max(e,0),this.getLength());var n=0;e0,r=t=0&&this.applyDelta({start:this.pos(e,this.getLine(e).length),end:this.pos(e+1,0),action:"remove",lines:["",""]})},this.replace=function(e,t){e instanceof o||(e=o.fromPoints(e.start,e.end));if(t.length===0&&e.isEmpty())return e.start;if(t==this.getTextRange(e))return e.end;this.remove(e);var n;return t?n=this.insert(e.start,t):n=e.start,n},this.applyDeltas=function(e){for(var t=0;t=0;t--)this.revertDelta(e[t])},this.applyDelta=function(e,t){var n=e.action=="insert";if(n?e.lines.length<=1&&!e.lines[0]:!o.comparePoints(e.start,e.end))return;n&&e.lines.length>2e4&&this.$splitAndapplyLargeDelta(e,2e4),i(this.$lines,e,t),this._signal("change",e)},this.$splitAndapplyLargeDelta=function(e,t){var n=e.lines,r=n.length,i=e.start.row,s=e.start.column,o=0,u=0;do{o=u,u+=t-1;var a=n.slice(o,u);if(u>r){e.lines=a,e.start.row=i+o,e.start.column=s;break}a.push(""),this.applyDelta({start:this.pos(i+o,s),end:this.pos(i+u,s=0),action:e.action,lines:a},!0)}while(!0)},this.revertDelta=function(e){this.applyDelta({start:this.clonePos(e.start),end:this.clonePos(e.end),action:e.action=="insert"?"remove":"insert",lines:e.lines.slice()})},this.indexToPosition=function(e,t){var n=this.$lines||this.getAllLines(),r=this.getNewLineCharacter().length;for(var i=t||0,s=n.length;i=0&&this._ltIndex-1&&!t[u.type].hide&&(u.channel=t[u.type].channel,this._token=u,this._lt.push(u),this._ltIndexCache.push(this._lt.length-this._ltIndex+i),this._lt.length>5&&this._lt.shift(),this._ltIndexCache.length>5&&this._ltIndexCache.shift(),this._ltIndex=this._lt.length),a=t[u.type],a&&(a.hide||a.channel!==undefined&&e!==a.channel)?this.get(e):u.type},LA:function(e){var t=e,n;if(e>0){if(e>5)throw new Error("Too much lookahead.");while(t)n=this.get(),t--;while(tthis._tokenData.length?"UNKNOWN_TOKEN":this._tokenData[e].name},tokenType:function(e){return this._tokenData[e]||-1},unget:function(){if(!this._ltIndexCache.length)throw new Error("Too much lookahead.");this._ltIndex-=this._ltIndexCache.pop(),this._token=this._lt[this._ltIndex-1]}},parserlib.util={StringReader:t,SyntaxError:n,SyntaxUnit:r,EventTarget:e,TokenStreamBase:i}})(),function(){function Combinator(e,t,n){SyntaxUnit.call(this,e,t,n,Parser.COMBINATOR_TYPE),this.type="unknown",/^\s+$/.test(e)?this.type="descendant":e==">"?this.type="child":e=="+"?this.type="adjacent-sibling":e=="~"&&(this.type="sibling")}function MediaFeature(e,t){SyntaxUnit.call(this,"("+e+(t!==null?":"+t:"")+")",e.startLine,e.startCol,Parser.MEDIA_FEATURE_TYPE),this.name=e,this.value=t}function MediaQuery(e,t,n,r,i){SyntaxUnit.call(this,(e?e+" ":"")+(t?t:"")+(t&&n.length>0?" and ":"")+n.join(" and "),r,i,Parser.MEDIA_QUERY_TYPE),this.modifier=e,this.mediaType=t,this.features=n}function Parser(e){EventTarget.call(this),this.options=e||{},this._tokenStream=null}function PropertyName(e,t,n,r){SyntaxUnit.call(this,e,n,r,Parser.PROPERTY_NAME_TYPE),this.hack=t}function PropertyValue(e,t,n){SyntaxUnit.call(this,e.join(" "),t,n,Parser.PROPERTY_VALUE_TYPE),this.parts=e}function PropertyValueIterator(e){this._i=0,this._parts=e.parts,this._marks=[],this.value=e}function PropertyValuePart(text,line,col){SyntaxUnit.call(this,text,line,col,Parser.PROPERTY_VALUE_PART_TYPE),this.type="unknown";var temp;if(/^([+\-]?[\d\.]+)([a-z]+)$/i.test(text)){this.type="dimension",this.value=+RegExp.$1,this.units=RegExp.$2;switch(this.units.toLowerCase()){case"em":case"rem":case"ex":case"px":case"cm":case"mm":case"in":case"pt":case"pc":case"ch":case"vh":case"vw":case"vmax":case"vmin":this.type="length";break;case"deg":case"rad":case"grad":this.type="angle";break;case"ms":case"s":this.type="time";break;case"hz":case"khz":this.type="frequency";break;case"dpi":case"dpcm":this.type="resolution"}}else/^([+\-]?[\d\.]+)%$/i.test(text)?(this.type="percentage",this.value=+RegExp.$1):/^([+\-]?\d+)$/i.test(text)?(this.type="integer",this.value=+RegExp.$1):/^([+\-]?[\d\.]+)$/i.test(text)?(this.type="number",this.value=+RegExp.$1):/^#([a-f0-9]{3,6})/i.test(text)?(this.type="color",temp=RegExp.$1,temp.length==3?(this.red=parseInt(temp.charAt(0)+temp.charAt(0),16),this.green=parseInt(temp.charAt(1)+temp.charAt(1),16),this.blue=parseInt(temp.charAt(2)+temp.charAt(2),16)):(this.red=parseInt(temp.substring(0,2),16),this.green=parseInt(temp.substring(2,4),16),this.blue=parseInt(temp.substring(4,6),16))):/^rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/i.test(text)?(this.type="color",this.red=+RegExp.$1,this.green=+RegExp.$2,this.blue=+RegExp.$3):/^rgb\(\s*(\d+)%\s*,\s*(\d+)%\s*,\s*(\d+)%\s*\)/i.test(text)?(this.type="color",this.red=+RegExp.$1*255/100,this.green=+RegExp.$2*255/100,this.blue=+RegExp.$3*255/100):/^rgba\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*([\d\.]+)\s*\)/i.test(text)?(this.type="color",this.red=+RegExp.$1,this.green=+RegExp.$2,this.blue=+RegExp.$3,this.alpha=+RegExp.$4):/^rgba\(\s*(\d+)%\s*,\s*(\d+)%\s*,\s*(\d+)%\s*,\s*([\d\.]+)\s*\)/i.test(text)?(this.type="color",this.red=+RegExp.$1*255/100,this.green=+RegExp.$2*255/100,this.blue=+RegExp.$3*255/100,this.alpha=+RegExp.$4):/^hsl\(\s*(\d+)\s*,\s*(\d+)%\s*,\s*(\d+)%\s*\)/i.test(text)?(this.type="color",this.hue=+RegExp.$1,this.saturation=+RegExp.$2/100,this.lightness=+RegExp.$3/100):/^hsla\(\s*(\d+)\s*,\s*(\d+)%\s*,\s*(\d+)%\s*,\s*([\d\.]+)\s*\)/i.test(text)?(this.type="color",this.hue=+RegExp.$1,this.saturation=+RegExp.$2/100,this.lightness=+RegExp.$3/100,this.alpha=+RegExp.$4):/^url\(["']?([^\)"']+)["']?\)/i.test(text)?(this.type="uri",this.uri=RegExp.$1):/^([^\(]+)\(/i.test(text)?(this.type="function",this.name=RegExp.$1,this.value=text):/^["'][^"']*["']/.test(text)?(this.type="string",this.value=eval(text)):Colors[text.toLowerCase()]?(this.type="color",temp=Colors[text.toLowerCase()].substring(1),this.red=parseInt(temp.substring(0,2),16),this.green=parseInt(temp.substring(2,4),16),this.blue=parseInt(temp.substring(4,6),16)):/^[\,\/]$/.test(text)?(this.type="operator",this.value=text):/^[a-z\-_\u0080-\uFFFF][a-z0-9\-_\u0080-\uFFFF]*$/i.test(text)&&(this.type="identifier",this.value=text)}function Selector(e,t,n){SyntaxUnit.call(this,e.join(" "),t,n,Parser.SELECTOR_TYPE),this.parts=e,this.specificity=Specificity.calculate(this)}function SelectorPart(e,t,n,r,i){SyntaxUnit.call(this,n,r,i,Parser.SELECTOR_PART_TYPE),this.elementName=e,this.modifiers=t}function SelectorSubPart(e,t,n,r){SyntaxUnit.call(this,e,n,r,Parser.SELECTOR_SUB_PART_TYPE),this.type=t,this.args=[]}function Specificity(e,t,n,r){this.a=e,this.b=t,this.c=n,this.d=r}function isHexDigit(e){return e!==null&&h.test(e)}function isDigit(e){return e!==null&&/\d/.test(e)}function isWhitespace(e){return e!==null&&/\s/.test(e)}function isNewLine(e){return e!==null&&nl.test(e)}function isNameStart(e){return e!==null&&/[a-z_\u0080-\uFFFF\\]/i.test(e)}function isNameChar(e){return e!==null&&(isNameStart(e)||/[0-9\-\\]/.test(e))}function isIdentStart(e){return e!==null&&(isNameStart(e)||/\-\\/.test(e))}function mix(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}function TokenStream(e){TokenStreamBase.call(this,e,Tokens)}function ValidationError(e,t,n){this.col=n,this.line=t,this.message=e}var EventTarget=parserlib.util.EventTarget,TokenStreamBase=parserlib.util.TokenStreamBase,StringReader=parserlib.util.StringReader,SyntaxError=parserlib.util.SyntaxError,SyntaxUnit=parserlib.util.SyntaxUnit,Colors={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgrey:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",grey:"#808080",green:"#008000",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgrey:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32",activeBorder:"Active window border.",activecaption:"Active window caption.",appworkspace:"Background color of multiple document interface.",background:"Desktop background.",buttonface:"The face background color for 3-D elements that appear 3-D due to one layer of surrounding border.",buttonhighlight:"The color of the border facing the light source for 3-D elements that appear 3-D due to one layer of surrounding border.",buttonshadow:"The color of the border away from the light source for 3-D elements that appear 3-D due to one layer of surrounding border.",buttontext:"Text on push buttons.",captiontext:"Text in caption, size box, and scrollbar arrow box.",graytext:"Grayed (disabled) text. This color is set to #000 if the current display driver does not support a solid gray color.",greytext:"Greyed (disabled) text. This color is set to #000 if the current display driver does not support a solid grey color.",highlight:"Item(s) selected in a control.",highlighttext:"Text of item(s) selected in a control.",inactiveborder:"Inactive window border.",inactivecaption:"Inactive window caption.",inactivecaptiontext:"Color of text in an inactive caption.",infobackground:"Background color for tooltip controls.",infotext:"Text color for tooltip controls.",menu:"Menu background.",menutext:"Text in menus.",scrollbar:"Scroll bar gray area.",threeddarkshadow:"The color of the darker (generally outer) of the two borders away from the light source for 3-D elements that appear 3-D due to two concentric layers of surrounding border.",threedface:"The face background color for 3-D elements that appear 3-D due to two concentric layers of surrounding border.",threedhighlight:"The color of the lighter (generally outer) of the two borders facing the light source for 3-D elements that appear 3-D due to two concentric layers of surrounding border.",threedlightshadow:"The color of the darker (generally inner) of the two borders facing the light source for 3-D elements that appear 3-D due to two concentric layers of surrounding border.",threedshadow:"The color of the lighter (generally inner) of the two borders away from the light source for 3-D elements that appear 3-D due to two concentric layers of surrounding border.",window:"Window background.",windowframe:"Window frame.",windowtext:"Text in windows."};Combinator.prototype=new SyntaxUnit,Combinator.prototype.constructor=Combinator,MediaFeature.prototype=new SyntaxUnit,MediaFeature.prototype.constructor=MediaFeature,MediaQuery.prototype=new SyntaxUnit,MediaQuery.prototype.constructor=MediaQuery,Parser.DEFAULT_TYPE=0,Parser.COMBINATOR_TYPE=1,Parser.MEDIA_FEATURE_TYPE=2,Parser.MEDIA_QUERY_TYPE=3,Parser.PROPERTY_NAME_TYPE=4,Parser.PROPERTY_VALUE_TYPE=5,Parser.PROPERTY_VALUE_PART_TYPE=6,Parser.SELECTOR_TYPE=7,Parser.SELECTOR_PART_TYPE=8,Parser.SELECTOR_SUB_PART_TYPE=9,Parser.prototype=function(){var e=new EventTarget,t,n={constructor:Parser,DEFAULT_TYPE:0,COMBINATOR_TYPE:1,MEDIA_FEATURE_TYPE:2,MEDIA_QUERY_TYPE:3,PROPERTY_NAME_TYPE:4,PROPERTY_VALUE_TYPE:5,PROPERTY_VALUE_PART_TYPE:6,SELECTOR_TYPE:7,SELECTOR_PART_TYPE:8,SELECTOR_SUB_PART_TYPE:9,_stylesheet:function(){var e=this._tokenStream,t=null,n,r,i;this.fire("startstylesheet"),this._charset(),this._skipCruft();while(e.peek()==Tokens.IMPORT_SYM)this._import(),this._skipCruft();while(e.peek()==Tokens.NAMESPACE_SYM)this._namespace(),this._skipCruft();i=e.peek();while(i>Tokens.EOF){try{switch(i){case Tokens.MEDIA_SYM:this._media(),this._skipCruft();break;case Tokens.PAGE_SYM:this._page(),this._skipCruft();break;case Tokens.FONT_FACE_SYM:this._font_face(),this._skipCruft();break;case Tokens.KEYFRAMES_SYM:this._keyframes(),this._skipCruft();break;case Tokens.VIEWPORT_SYM:this._viewport(),this._skipCruft();break;case Tokens.UNKNOWN_SYM:e.get();if(!!this.options.strict)throw new SyntaxError("Unknown @ rule.",e.LT(0).startLine,e.LT(0).startCol);this.fire({type:"error",error:null,message:"Unknown @ rule: "+e.LT(0).value+".",line:e.LT(0).startLine,col:e.LT(0).startCol}),n=0;while(e.advance([Tokens.LBRACE,Tokens.RBRACE])==Tokens.LBRACE)n++;while(n)e.advance([Tokens.RBRACE]),n--;break;case Tokens.S:this._readWhitespace();break;default:if(!this._ruleset())switch(i){case Tokens.CHARSET_SYM:throw r=e.LT(1),this._charset(!1),new SyntaxError("@charset not allowed here.",r.startLine,r.startCol);case Tokens.IMPORT_SYM:throw r=e.LT(1),this._import(!1),new SyntaxError("@import not allowed here.",r.startLine,r.startCol);case Tokens.NAMESPACE_SYM:throw r=e.LT(1),this._namespace(!1),new SyntaxError("@namespace not allowed here.",r.startLine,r.startCol);default:e.get(),this._unexpectedToken(e.token())}}}catch(s){if(!(s instanceof SyntaxError&&!this.options.strict))throw s;this.fire({type:"error",error:s,message:s.message,line:s.line,col:s.col})}i=e.peek()}i!=Tokens.EOF&&this._unexpectedToken(e.token()),this.fire("endstylesheet")},_charset:function(e){var t=this._tokenStream,n,r,i,s;t.match(Tokens.CHARSET_SYM)&&(i=t.token().startLine,s=t.token().startCol,this._readWhitespace(),t.mustMatch(Tokens.STRING),r=t.token(),n=r.value,this._readWhitespace(),t.mustMatch(Tokens.SEMICOLON),e!==!1&&this.fire({type:"charset",charset:n,line:i,col:s}))},_import:function(e){var t=this._tokenStream,n,r,i,s=[];t.mustMatch(Tokens.IMPORT_SYM),i=t.token(),this._readWhitespace(),t.mustMatch([Tokens.STRING,Tokens.URI]),r=t.token().value.replace(/^(?:url\()?["']?([^"']+?)["']?\)?$/,"$1"),this._readWhitespace(),s=this._media_query_list(),t.mustMatch(Tokens.SEMICOLON),this._readWhitespace(),e!==!1&&this.fire({type:"import",uri:r,media:s,line:i.startLine,col:i.startCol})},_namespace:function(e){var t=this._tokenStream,n,r,i,s;t.mustMatch(Tokens.NAMESPACE_SYM),n=t.token().startLine,r=t.token().startCol,this._readWhitespace(),t.match(Tokens.IDENT)&&(i=t.token().value,this._readWhitespace()),t.mustMatch([Tokens.STRING,Tokens.URI]),s=t.token().value.replace(/(?:url\()?["']([^"']+)["']\)?/,"$1"),this._readWhitespace(),t.mustMatch(Tokens.SEMICOLON),this._readWhitespace(),e!==!1&&this.fire({type:"namespace",prefix:i,uri:s,line:n,col:r})},_media:function(){var e=this._tokenStream,t,n,r;e.mustMatch(Tokens.MEDIA_SYM),t=e.token().startLine,n=e.token().startCol,this._readWhitespace(),r=this._media_query_list(),e.mustMatch(Tokens.LBRACE),this._readWhitespace(),this.fire({type:"startmedia",media:r,line:t,col:n});for(;;)if(e.peek()==Tokens.PAGE_SYM)this._page();else if(e.peek()==Tokens.FONT_FACE_SYM)this._font_face();else if(e.peek()==Tokens.VIEWPORT_SYM)this._viewport();else if(!this._ruleset())break;e.mustMatch(Tokens.RBRACE),this._readWhitespace(),this.fire({type:"endmedia",media:r,line:t,col:n})},_media_query_list:function(){var e=this._tokenStream,t=[];this._readWhitespace(),(e.peek()==Tokens.IDENT||e.peek()==Tokens.LPAREN)&&t.push(this._media_query());while(e.match(Tokens.COMMA))this._readWhitespace(),t.push(this._media_query());return t},_media_query:function(){var e=this._tokenStream,t=null,n=null,r=null,i=[];e.match(Tokens.IDENT)&&(n=e.token().value.toLowerCase(),n!="only"&&n!="not"?(e.unget(),n=null):r=e.token()),this._readWhitespace(),e.peek()==Tokens.IDENT?(t=this._media_type(),r===null&&(r=e.token())):e.peek()==Tokens.LPAREN&&(r===null&&(r=e.LT(1)),i.push(this._media_expression()));if(t===null&&i.length===0)return null;this._readWhitespace();while(e.match(Tokens.IDENT))e.token().value.toLowerCase()!="and"&&this._unexpectedToken(e.token()),this._readWhitespace(),i.push(this._media_expression());return new MediaQuery(n,t,i,r.startLine,r.startCol)},_media_type:function(){return this._media_feature()},_media_expression:function(){var e=this._tokenStream,t=null,n,r=null;return e.mustMatch(Tokens.LPAREN),t=this._media_feature(),this._readWhitespace(),e.match(Tokens.COLON)&&(this._readWhitespace(),n=e.LT(1),r=this._expression()),e.mustMatch(Tokens.RPAREN),this._readWhitespace(),new MediaFeature(t,r?new SyntaxUnit(r,n.startLine,n.startCol):null)},_media_feature:function(){var e=this._tokenStream;return e.mustMatch(Tokens.IDENT),SyntaxUnit.fromToken(e.token())},_page:function(){var e=this._tokenStream,t,n,r=null,i=null;e.mustMatch(Tokens.PAGE_SYM),t=e.token().startLine,n=e.token().startCol,this._readWhitespace(),e.match(Tokens.IDENT)&&(r=e.token().value,r.toLowerCase()==="auto"&&this._unexpectedToken(e.token())),e.peek()==Tokens.COLON&&(i=this._pseudo_page()),this._readWhitespace(),this.fire({type:"startpage",id:r,pseudo:i,line:t,col:n}),this._readDeclarations(!0,!0),this.fire({type:"endpage",id:r,pseudo:i,line:t,col:n})},_margin:function(){var e=this._tokenStream,t,n,r=this._margin_sym();return r?(t=e.token().startLine,n=e.token().startCol,this.fire({type:"startpagemargin",margin:r,line:t,col:n}),this._readDeclarations(!0),this.fire({type:"endpagemargin",margin:r,line:t,col:n}),!0):!1},_margin_sym:function(){var e=this._tokenStream;return e.match([Tokens.TOPLEFTCORNER_SYM,Tokens.TOPLEFT_SYM,Tokens.TOPCENTER_SYM,Tokens.TOPRIGHT_SYM,Tokens.TOPRIGHTCORNER_SYM,Tokens.BOTTOMLEFTCORNER_SYM,Tokens.BOTTOMLEFT_SYM,Tokens.BOTTOMCENTER_SYM,Tokens.BOTTOMRIGHT_SYM,Tokens.BOTTOMRIGHTCORNER_SYM,Tokens.LEFTTOP_SYM,Tokens.LEFTMIDDLE_SYM,Tokens.LEFTBOTTOM_SYM,Tokens.RIGHTTOP_SYM,Tokens.RIGHTMIDDLE_SYM,Tokens.RIGHTBOTTOM_SYM])?SyntaxUnit.fromToken(e.token()):null},_pseudo_page:function(){var e=this._tokenStream;return e.mustMatch(Tokens.COLON),e.mustMatch(Tokens.IDENT),e.token().value},_font_face:function(){var e=this._tokenStream,t,n;e.mustMatch(Tokens.FONT_FACE_SYM),t=e.token().startLine,n=e.token().startCol,this._readWhitespace(),this.fire({type:"startfontface",line:t,col:n}),this._readDeclarations(!0),this.fire({type:"endfontface",line:t,col:n})},_viewport:function(){var e=this._tokenStream,t,n;e.mustMatch(Tokens.VIEWPORT_SYM),t=e.token().startLine,n=e.token().startCol,this._readWhitespace(),this.fire({type:"startviewport",line:t,col:n}),this._readDeclarations(!0),this.fire({type:"endviewport",line:t,col:n})},_operator:function(e){var t=this._tokenStream,n=null;if(t.match([Tokens.SLASH,Tokens.COMMA])||e&&t.match([Tokens.PLUS,Tokens.STAR,Tokens.MINUS]))n=t.token(),this._readWhitespace();return n?PropertyValuePart.fromToken(n):null},_combinator:function(){var e=this._tokenStream,t=null,n;return e.match([Tokens.PLUS,Tokens.GREATER,Tokens.TILDE])&&(n=e.token(),t=new Combinator(n.value,n.startLine,n.startCol),this._readWhitespace()),t},_unary_operator:function(){var e=this._tokenStream;return e.match([Tokens.MINUS,Tokens.PLUS])?e.token().value:null},_property:function(){var e=this._tokenStream,t=null,n=null,r,i,s,o;return e.peek()==Tokens.STAR&&this.options.starHack&&(e.get(),i=e.token(),n=i.value,s=i.startLine,o=i.startCol),e.match(Tokens.IDENT)&&(i=e.token(),r=i.value,r.charAt(0)=="_"&&this.options.underscoreHack&&(n="_",r=r.substring(1)),t=new PropertyName(r,n,s||i.startLine,o||i.startCol),this._readWhitespace()),t},_ruleset:function(){var e=this._tokenStream,t,n;try{n=this._selectors_group()}catch(r){if(r instanceof SyntaxError&&!this.options.strict){this.fire({type:"error",error:r,message:r.message,line:r.line,col:r.col}),t=e.advance([Tokens.RBRACE]);if(t!=Tokens.RBRACE)throw r;return!0}throw r}return n&&(this.fire({type:"startrule",selectors:n,line:n[0].line,col:n[0].col}),this._readDeclarations(!0),this.fire({type:"endrule",selectors:n,line:n[0].line,col:n[0].col})),n},_selectors_group:function(){var e=this._tokenStream,t=[],n;n=this._selector();if(n!==null){t.push(n);while(e.match(Tokens.COMMA))this._readWhitespace(),n=this._selector(),n!==null?t.push(n):this._unexpectedToken(e.LT(1))}return t.length?t:null},_selector:function(){var e=this._tokenStream,t=[],n=null,r=null,i=null;n=this._simple_selector_sequence();if(n===null)return null;t.push(n);do{r=this._combinator();if(r!==null)t.push(r),n=this._simple_selector_sequence(),n===null?this._unexpectedToken(e.LT(1)):t.push(n);else{if(!this._readWhitespace())break;i=new Combinator(e.token().value,e.token().startLine,e.token().startCol),r=this._combinator(),n=this._simple_selector_sequence(),n===null?r!==null&&this._unexpectedToken(e.LT(1)):(r!==null?t.push(r):t.push(i),t.push(n))}}while(!0);return new Selector(t,t[0].line,t[0].col)},_simple_selector_sequence:function(){var e=this._tokenStream,t=null,n=[],r="",i=[function(){return e.match(Tokens.HASH)?new SelectorSubPart(e.token().value,"id",e.token().startLine,e.token().startCol):null},this._class,this._attrib,this._pseudo,this._negation],s=0,o=i.length,u=null,a=!1,f,l;f=e.LT(1).startLine,l=e.LT(1).startCol,t=this._type_selector(),t||(t=this._universal()),t!==null&&(r+=t);for(;;){if(e.peek()===Tokens.S)break;while(s1&&e.unget()),null)},_class:function(){var e=this._tokenStream,t;return e.match(Tokens.DOT)?(e.mustMatch(Tokens.IDENT),t=e.token(),new SelectorSubPart("."+t.value,"class",t.startLine,t.startCol-1)):null},_element_name:function(){var e=this._tokenStream,t;return e.match(Tokens.IDENT)?(t=e.token(),new SelectorSubPart(t.value,"elementName",t.startLine,t.startCol)):null},_namespace_prefix:function(){var e=this._tokenStream,t="";if(e.LA(1)===Tokens.PIPE||e.LA(2)===Tokens.PIPE)e.match([Tokens.IDENT,Tokens.STAR])&&(t+=e.token().value),e.mustMatch(Tokens.PIPE),t+="|";return t.length?t:null},_universal:function(){var e=this._tokenStream,t="",n;return n=this._namespace_prefix(),n&&(t+=n),e.match(Tokens.STAR)&&(t+="*"),t.length?t:null},_attrib:function(){var e=this._tokenStream,t=null,n,r;return e.match(Tokens.LBRACKET)?(r=e.token(),t=r.value,t+=this._readWhitespace(),n=this._namespace_prefix(),n&&(t+=n),e.mustMatch(Tokens.IDENT),t+=e.token().value,t+=this._readWhitespace(),e.match([Tokens.PREFIXMATCH,Tokens.SUFFIXMATCH,Tokens.SUBSTRINGMATCH,Tokens.EQUALS,Tokens.INCLUDES,Tokens.DASHMATCH])&&(t+=e.token().value,t+=this._readWhitespace(),e.mustMatch([Tokens.IDENT,Tokens.STRING]),t+=e.token().value,t+=this._readWhitespace()),e.mustMatch(Tokens.RBRACKET),new SelectorSubPart(t+"]","attribute",r.startLine,r.startCol)):null},_pseudo:function(){var e=this._tokenStream,t=null,n=":",r,i;return e.match(Tokens.COLON)&&(e.match(Tokens.COLON)&&(n+=":"),e.match(Tokens.IDENT)?(t=e.token().value,r=e.token().startLine,i=e.token().startCol-n.length):e.peek()==Tokens.FUNCTION&&(r=e.LT(1).startLine,i=e.LT(1).startCol-n.length,t=this._functional_pseudo()),t&&(t=new SelectorSubPart(n+t,"pseudo",r,i))),t},_functional_pseudo:function(){var e=this._tokenStream,t=null;return e.match(Tokens.FUNCTION)&&(t=e.token().value,t+=this._readWhitespace(),t+=this._expression(),e.mustMatch(Tokens.RPAREN),t+=")"),t},_expression:function(){var e=this._tokenStream,t="";while(e.match([Tokens.PLUS,Tokens.MINUS,Tokens.DIMENSION,Tokens.NUMBER,Tokens.STRING,Tokens.IDENT,Tokens.LENGTH,Tokens.FREQ,Tokens.ANGLE,Tokens.TIME,Tokens.RESOLUTION,Tokens.SLASH]))t+=e.token().value,t+=this._readWhitespace();return t.length?t:null},_negation:function(){var e=this._tokenStream,t,n,r="",i,s=null;return e.match(Tokens.NOT)&&(r=e.token().value,t=e.token().startLine,n=e.token().startCol,r+=this._readWhitespace(),i=this._negation_arg(),r+=i,r+=this._readWhitespace(),e.match(Tokens.RPAREN),r+=e.token().value,s=new SelectorSubPart(r,"not",t,n),s.args.push(i)),s},_negation_arg:function(){var e=this._tokenStream,t=[this._type_selector,this._universal,function(){return e.match(Tokens.HASH)?new SelectorSubPart(e.token().value,"id",e.token().startLine,e.token().startCol):null},this._class,this._attrib,this._pseudo],n=null,r=0,i=t.length,s,o,u,a;o=e.LT(1).startLine,u=e.LT(1).startCol;while(r0?new PropertyValue(n,n[0].line,n[0].col):null},_term:function(e){var t=this._tokenStream,n=null,r=null,i=null,s,o,u;return n=this._unary_operator(),n!==null&&(o=t.token().startLine,u=t.token().startCol),t.peek()==Tokens.IE_FUNCTION&&this.options.ieFilters?(r=this._ie_function(),n===null&&(o=t.token().startLine,u=t.token().startCol)):e&&t.match([Tokens.LPAREN,Tokens.LBRACE,Tokens.LBRACKET])?(s=t.token(),i=s.endChar,r=s.value+this._expr(e).text,n===null&&(o=t.token().startLine,u=t.token().startCol),t.mustMatch(Tokens.type(i)),r+=i,this._readWhitespace()):t.match([Tokens.NUMBER,Tokens.PERCENTAGE,Tokens.LENGTH,Tokens.ANGLE,Tokens.TIME,Tokens.FREQ,Tokens.STRING,Tokens.IDENT,Tokens.URI,Tokens.UNICODE_RANGE])?(r=t.token().value,n===null&&(o=t.token().startLine,u=t.token().startCol),this._readWhitespace()):(s=this._hexcolor(),s===null?(n===null&&(o=t.LT(1).startLine,u=t.LT(1).startCol),r===null&&(t.LA(3)==Tokens.EQUALS&&this.options.ieFilters?r=this._ie_function():r=this._function())):(r=s.value,n===null&&(o=s.startLine,u=s.startCol))),r!==null?new PropertyValuePart(n!==null?n+r:r,o,u):null},_function:function(){var e=this._tokenStream,t=null,n=null,r;if(e.match(Tokens.FUNCTION)){t=e.token().value,this._readWhitespace(),n=this._expr(!0),t+=n;if(this.options.ieFilters&&e.peek()==Tokens.EQUALS)do{this._readWhitespace()&&(t+=e.token().value),e.LA(0)==Tokens.COMMA&&(t+=e.token().value),e.match(Tokens.IDENT),t+=e.token().value,e.match(Tokens.EQUALS),t+=e.token().value,r=e.peek();while(r!=Tokens.COMMA&&r!=Tokens.S&&r!=Tokens.RPAREN)e.get(),t+=e.token().value,r=e.peek()}while(e.match([Tokens.COMMA,Tokens.S]));e.match(Tokens.RPAREN),t+=")",this._readWhitespace()}return t},_ie_function:function(){var e=this._tokenStream,t=null,n=null,r;if(e.match([Tokens.IE_FUNCTION,Tokens.FUNCTION])){t=e.token().value;do{this._readWhitespace()&&(t+=e.token().value),e.LA(0)==Tokens.COMMA&&(t+=e.token().value),e.match(Tokens.IDENT),t+=e.token().value,e.match(Tokens.EQUALS),t+=e.token().value,r=e.peek();while(r!=Tokens.COMMA&&r!=Tokens.S&&r!=Tokens.RPAREN)e.get(),t+=e.token().value,r=e.peek()}while(e.match([Tokens.COMMA,Tokens.S]));e.match(Tokens.RPAREN),t+=")",this._readWhitespace()}return t},_hexcolor:function(){var e=this._tokenStream,t=null,n;if(e.match(Tokens.HASH)){t=e.token(),n=t.value;if(!/#[a-f0-9]{3,6}/i.test(n))throw new SyntaxError("Expected a hex color but found '"+n+"' at line "+t.startLine+", col "+t.startCol+".",t.startLine,t.startCol);this._readWhitespace()}return t},_keyframes:function(){var e=this._tokenStream,t,n,r,i="";e.mustMatch(Tokens.KEYFRAMES_SYM),t=e.token(),/^@\-([^\-]+)\-/.test(t.value)&&(i=RegExp.$1),this._readWhitespace(),r=this._keyframe_name(),this._readWhitespace(),e.mustMatch(Tokens.LBRACE),this.fire({type:"startkeyframes",name:r,prefix:i,line:t.startLine,col:t.startCol}),this._readWhitespace(),n=e.peek();while(n==Tokens.IDENT||n==Tokens.PERCENTAGE)this._keyframe_rule(),this._readWhitespace(),n=e.peek();this.fire({type:"endkeyframes",name:r,prefix:i,line:t.startLine,col:t.startCol}),this._readWhitespace(),e.mustMatch(Tokens.RBRACE)},_keyframe_name:function(){var e=this._tokenStream,t;return e.mustMatch([Tokens.IDENT,Tokens.STRING]),SyntaxUnit.fromToken(e.token())},_keyframe_rule:function(){var e=this._tokenStream,t,n=this._key_list();this.fire({type:"startkeyframerule",keys:n,line:n[0].line,col:n[0].col}),this._readDeclarations(!0),this.fire({type:"endkeyframerule",keys:n,line:n[0].line,col:n[0].col})},_key_list:function(){var e=this._tokenStream,t,n,r=[];r.push(this._key()),this._readWhitespace();while(e.match(Tokens.COMMA))this._readWhitespace(),r.push(this._key()),this._readWhitespace();return r},_key:function(){var e=this._tokenStream,t;if(e.match(Tokens.PERCENTAGE))return SyntaxUnit.fromToken(e.token());if(e.match(Tokens.IDENT)){t=e.token();if(/from|to/i.test(t.value))return SyntaxUnit.fromToken(t);e.unget()}this._unexpectedToken(e.LT(1))},_skipCruft:function(){while(this._tokenStream.match([Tokens.S,Tokens.CDO,Tokens.CDC]));},_readDeclarations:function(e,t){var n=this._tokenStream,r;this._readWhitespace(),e&&n.mustMatch(Tokens.LBRACE),this._readWhitespace();try{for(;;){if(!(n.match(Tokens.SEMICOLON)||t&&this._margin())){if(!this._declaration())break;if(!n.match(Tokens.SEMICOLON))break}this._readWhitespace()}n.mustMatch(Tokens.RBRACE),this._readWhitespace()}catch(i){if(!(i instanceof SyntaxError&&!this.options.strict))throw i;this.fire({type:"error",error:i,message:i.message,line:i.line,col:i.col}),r=n.advance([Tokens.SEMICOLON,Tokens.RBRACE]);if(r==Tokens.SEMICOLON)this._readDeclarations(!1,t);else if(r!=Tokens.RBRACE)throw i}},_readWhitespace:function(){var e=this._tokenStream,t="";while(e.match(Tokens.S))t+=e.token().value;return t},_unexpectedToken:function(e){throw new SyntaxError("Unexpected token '"+e.value+"' at line "+e.startLine+", col "+e.startCol+".",e.startLine,e.startCol)},_verifyEnd:function(){this._tokenStream.LA(1)!=Tokens.EOF&&this._unexpectedToken(this._tokenStream.LT(1))},_validateProperty:function(e,t){Validation.validate(e,t)},parse:function(e){this._tokenStream=new TokenStream(e,Tokens),this._stylesheet()},parseStyleSheet:function(e){return this.parse(e)},parseMediaQuery:function(e){this._tokenStream=new TokenStream(e,Tokens);var t=this._media_query();return this._verifyEnd(),t},parsePropertyValue:function(e){this._tokenStream=new TokenStream(e,Tokens),this._readWhitespace();var t=this._expr();return this._readWhitespace(),this._verifyEnd(),t},parseRule:function(e){this._tokenStream=new TokenStream(e,Tokens),this._readWhitespace();var t=this._ruleset();return this._readWhitespace(),this._verifyEnd(),t},parseSelector:function(e){this._tokenStream=new TokenStream(e,Tokens),this._readWhitespace();var t=this._selector();return this._readWhitespace(),this._verifyEnd(),t},parseStyleAttribute:function(e){e+="}",this._tokenStream=new TokenStream(e,Tokens),this._readDeclarations()}};for(t in n)n.hasOwnProperty(t)&&(e[t]=n[t]);return e}();var Properties={"align-items":"flex-start | flex-end | center | baseline | stretch","align-content":"flex-start | flex-end | center | space-between | space-around | stretch","align-self":"auto | flex-start | flex-end | center | baseline | stretch","-webkit-align-items":"flex-start | flex-end | center | baseline | stretch","-webkit-align-content":"flex-start | flex-end | center | space-between | space-around | stretch","-webkit-align-self":"auto | flex-start | flex-end | center | baseline | stretch","alignment-adjust":"auto | baseline | before-edge | text-before-edge | middle | central | after-edge | text-after-edge | ideographic | alphabetic | hanging | mathematical | | ","alignment-baseline":"baseline | use-script | before-edge | text-before-edge | after-edge | text-after-edge | central | middle | ideographic | alphabetic | hanging | mathematical",animation:1,"animation-delay":{multi:"