├── LICENSE.md
├── archive
├── electron-boilerplate
│ ├── gulpfile.js
│ ├── resources
│ │ ├── icon.png
│ │ ├── osx
│ │ │ ├── icon.icns
│ │ │ ├── dmg-icon.icns
│ │ │ ├── dmg-background.png
│ │ │ ├── dmg-background@2x.png
│ │ │ ├── appdmg.json
│ │ │ ├── helper_apps
│ │ │ │ ├── Info.plist
│ │ │ │ ├── Info EH.plist
│ │ │ │ └── Info NP.plist
│ │ │ └── Info.plist
│ │ ├── windows
│ │ │ ├── icon.ico
│ │ │ ├── setup-icon.ico
│ │ │ ├── setup-banner.bmp
│ │ │ └── installer.nsi
│ │ └── linux
│ │ │ ├── DEBIAN
│ │ │ └── control
│ │ │ └── app.desktop
│ ├── config
│ │ ├── env_test.json
│ │ ├── env_production.json
│ │ └── env_development.json
│ ├── .gitignore
│ ├── app
│ │ ├── fonts
│ │ │ ├── glyphicons-halflings-regular.eot
│ │ │ ├── glyphicons-halflings-regular.ttf
│ │ │ ├── glyphicons-halflings-regular.woff
│ │ │ └── glyphicons-halflings-regular.woff2
│ │ ├── env.js
│ │ ├── stylesheets
│ │ │ ├── main.less
│ │ │ └── simple-sidebar.css
│ │ ├── package.json
│ │ ├── spec.html
│ │ ├── app.js
│ │ ├── vendor
│ │ │ ├── electron_boilerplate
│ │ │ │ ├── dev_helper.js
│ │ │ │ ├── context_menu.js
│ │ │ │ ├── window_state.js
│ │ │ │ └── external_links.js
│ │ │ ├── jasmine
│ │ │ │ ├── boot.js
│ │ │ │ ├── jasmine-html.js
│ │ │ │ └── jasmine.css
│ │ │ └── bootstrap.min.js
│ │ ├── background.js
│ │ └── app.html
│ ├── README.md
│ ├── .editorconfig
│ ├── tasks
│ │ ├── release.js
│ │ ├── generate_specs_import.js
│ │ ├── utils.js
│ │ ├── rebuild_native.js
│ │ ├── start.js
│ │ ├── release_linux.js
│ │ ├── release_windows.js
│ │ ├── build.js
│ │ └── release_osx.js
│ ├── package.json
│ └── BOILERPLATE.md
└── chrome-app-prototype
│ ├── icon128.png
│ ├── icon16.png
│ ├── icon48.png
│ ├── fonts
│ ├── glyphicons-halflings-regular.eot
│ ├── glyphicons-halflings-regular.ttf
│ ├── glyphicons-halflings-regular.woff
│ └── glyphicons-halflings-regular.woff2
│ ├── manifest.json
│ ├── background.js
│ ├── css
│ └── simple-sidebar.css
│ ├── index.html
│ └── js
│ └── bootstrap.min.js
├── README.md
└── npm-debug.log
/LICENSE.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/archive/electron-boilerplate/gulpfile.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | require('./tasks/build');
4 | require('./tasks/release');
5 |
--------------------------------------------------------------------------------
/archive/chrome-app-prototype/icon128.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sup/taskmeter/master/archive/chrome-app-prototype/icon128.png
--------------------------------------------------------------------------------
/archive/chrome-app-prototype/icon16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sup/taskmeter/master/archive/chrome-app-prototype/icon16.png
--------------------------------------------------------------------------------
/archive/chrome-app-prototype/icon48.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sup/taskmeter/master/archive/chrome-app-prototype/icon48.png
--------------------------------------------------------------------------------
/archive/electron-boilerplate/resources/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sup/taskmeter/master/archive/electron-boilerplate/resources/icon.png
--------------------------------------------------------------------------------
/archive/electron-boilerplate/config/env_test.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "test",
3 | "description": "Add here any environment specific stuff you like."
4 | }
5 |
--------------------------------------------------------------------------------
/archive/electron-boilerplate/resources/osx/icon.icns:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sup/taskmeter/master/archive/electron-boilerplate/resources/osx/icon.icns
--------------------------------------------------------------------------------
/archive/electron-boilerplate/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | *.log
3 | .DS_Store
4 | Thumbs.db
5 |
6 | /app/spec.js
7 | /build/
8 | /releases/
9 | /tmp/
10 |
--------------------------------------------------------------------------------
/archive/electron-boilerplate/resources/osx/dmg-icon.icns:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sup/taskmeter/master/archive/electron-boilerplate/resources/osx/dmg-icon.icns
--------------------------------------------------------------------------------
/archive/electron-boilerplate/resources/windows/icon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sup/taskmeter/master/archive/electron-boilerplate/resources/windows/icon.ico
--------------------------------------------------------------------------------
/archive/electron-boilerplate/config/env_production.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "production",
3 | "description": "Add here any environment specific stuff you like."
4 | }
5 |
--------------------------------------------------------------------------------
/archive/electron-boilerplate/config/env_development.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "development",
3 | "description": "Add here any environment specific stuff you like."
4 | }
5 |
--------------------------------------------------------------------------------
/archive/electron-boilerplate/resources/osx/dmg-background.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sup/taskmeter/master/archive/electron-boilerplate/resources/osx/dmg-background.png
--------------------------------------------------------------------------------
/archive/electron-boilerplate/resources/windows/setup-icon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sup/taskmeter/master/archive/electron-boilerplate/resources/windows/setup-icon.ico
--------------------------------------------------------------------------------
/archive/electron-boilerplate/resources/windows/setup-banner.bmp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sup/taskmeter/master/archive/electron-boilerplate/resources/windows/setup-banner.bmp
--------------------------------------------------------------------------------
/archive/electron-boilerplate/resources/osx/dmg-background@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sup/taskmeter/master/archive/electron-boilerplate/resources/osx/dmg-background@2x.png
--------------------------------------------------------------------------------
/archive/chrome-app-prototype/fonts/glyphicons-halflings-regular.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sup/taskmeter/master/archive/chrome-app-prototype/fonts/glyphicons-halflings-regular.eot
--------------------------------------------------------------------------------
/archive/chrome-app-prototype/fonts/glyphicons-halflings-regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sup/taskmeter/master/archive/chrome-app-prototype/fonts/glyphicons-halflings-regular.ttf
--------------------------------------------------------------------------------
/archive/chrome-app-prototype/fonts/glyphicons-halflings-regular.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sup/taskmeter/master/archive/chrome-app-prototype/fonts/glyphicons-halflings-regular.woff
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # taskmeter
2 | Arbitrary progress based todo list
3 |
4 | ## Feature Lists
5 | * Progress Bars
6 | * Automatic increments for comparison
7 | * Todoist/Google/Apple integrations
8 |
--------------------------------------------------------------------------------
/archive/chrome-app-prototype/fonts/glyphicons-halflings-regular.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sup/taskmeter/master/archive/chrome-app-prototype/fonts/glyphicons-halflings-regular.woff2
--------------------------------------------------------------------------------
/archive/electron-boilerplate/app/fonts/glyphicons-halflings-regular.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sup/taskmeter/master/archive/electron-boilerplate/app/fonts/glyphicons-halflings-regular.eot
--------------------------------------------------------------------------------
/archive/electron-boilerplate/app/fonts/glyphicons-halflings-regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sup/taskmeter/master/archive/electron-boilerplate/app/fonts/glyphicons-halflings-regular.ttf
--------------------------------------------------------------------------------
/archive/electron-boilerplate/app/fonts/glyphicons-halflings-regular.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sup/taskmeter/master/archive/electron-boilerplate/app/fonts/glyphicons-halflings-regular.woff
--------------------------------------------------------------------------------
/archive/electron-boilerplate/app/fonts/glyphicons-halflings-regular.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sup/taskmeter/master/archive/electron-boilerplate/app/fonts/glyphicons-halflings-regular.woff2
--------------------------------------------------------------------------------
/archive/electron-boilerplate/resources/linux/DEBIAN/control:
--------------------------------------------------------------------------------
1 | Package: {{name}}
2 | Version: {{version}}
3 | Maintainer: {{author}}
4 | Priority: optional
5 | Architecture: amd64
6 | Installed-Size: {{size}}
7 | Description: {{description}}
8 |
--------------------------------------------------------------------------------
/archive/electron-boilerplate/README.md:
--------------------------------------------------------------------------------
1 | ## Product
2 | Electron app based off electron-boilerplate. A more mature dev/prod environment dichotomy, tests, and more.
3 |
4 | ## Resources
5 | * http://www.dontpaniclabs.com/blog/post/2015/08/04/github-electron-tutorial-using-electron-boilerplate/
6 |
--------------------------------------------------------------------------------
/archive/electron-boilerplate/resources/linux/app.desktop:
--------------------------------------------------------------------------------
1 | [Desktop Entry]
2 | Version=1.0
3 | Type=Application
4 | Encoding=UTF-8
5 | Name={{productName}}
6 | Comment={{description}}
7 | Exec=/opt/{{name}}/{{name}}
8 | Path=/opt/{{name}}/
9 | Icon=/opt/{{name}}/icon.png
10 | Terminal=false
11 | Categories=Application;
12 |
--------------------------------------------------------------------------------
/archive/electron-boilerplate/.editorconfig:
--------------------------------------------------------------------------------
1 | # editorconfig.org
2 | root = true
3 |
4 | [*]
5 | indent_style = space
6 | indent_size = 4
7 | end_of_line = lf
8 | charset = utf-8
9 | trim_trailing_whitespace = true
10 | insert_final_newline = true
11 |
12 | [*.json]
13 | indent_size = 2
14 |
15 | [*.md]
16 | trim_trailing_whitespace = false
17 |
--------------------------------------------------------------------------------
/archive/chrome-app-prototype/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Sample App",
3 | "version": "1",
4 | "manifest_version": 2,
5 | "minimum_chrome_version": "23",
6 | "icons": {
7 | "128": "icon128.png"
8 | },
9 | "app": {
10 | "background": {
11 | "scripts": ["background.js"]
12 | }
13 | },
14 | "permissions": [
15 | ]
16 | }
--------------------------------------------------------------------------------
/archive/electron-boilerplate/resources/osx/appdmg.json:
--------------------------------------------------------------------------------
1 | {
2 | "title": "{{productName}}",
3 | "icon": "{{dmgIcon}}",
4 | "background": "{{dmgBackground}}",
5 | "icon-size": 128,
6 | "contents": [
7 | { "x": 410, "y": 220, "type": "link", "path": "/Applications" },
8 | { "x": 130, "y": 220, "type": "file", "path": "{{appPath}}" }
9 | ]
10 | }
11 |
--------------------------------------------------------------------------------
/archive/electron-boilerplate/tasks/release.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | var gulp = require('gulp');
4 | var utils = require('./utils');
5 |
6 | var releaseForOs = {
7 | osx: require('./release_osx'),
8 | linux: require('./release_linux'),
9 | windows: require('./release_windows'),
10 | };
11 |
12 | gulp.task('release', ['build'], function () {
13 | return releaseForOs[utils.os()]();
14 | });
15 |
--------------------------------------------------------------------------------
/archive/chrome-app-prototype/background.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Listens for the app launching then creates the window
3 | *
4 | * @see http://developer.chrome.com/trunk/apps/app.runtime.html
5 | * @see http://developer.chrome.com/trunk/apps/app.window.html
6 | */
7 | chrome.app.runtime.onLaunched.addListener(function() {
8 | chrome.app.window.create('index.html', {
9 | bounds: {
10 | width: 1280,
11 | height: 800
12 | }
13 | });
14 | });
--------------------------------------------------------------------------------
/archive/electron-boilerplate/app/env.js:
--------------------------------------------------------------------------------
1 | // Simple module exposes environment variables to rest of the code.
2 |
3 | import jetpack from 'fs-jetpack';
4 |
5 | var app;
6 | if (process.type === 'renderer') {
7 | app = require('electron').remote.app;
8 | } else {
9 | app = require('electron').app;
10 | }
11 | var appDir = jetpack.cwd(app.getAppPath());
12 |
13 | var manifest = appDir.read('package.json', 'json');
14 |
15 | export default manifest.env;
16 |
--------------------------------------------------------------------------------
/archive/electron-boilerplate/app/stylesheets/main.less:
--------------------------------------------------------------------------------
1 | html, body {
2 | width: 100%;
3 | height: 100%;
4 | margin: 0;
5 | padding: 0;
6 | }
7 |
8 | body {
9 | display: flex;
10 | justify-content: center;
11 | align-items: center;
12 | font-family: sans-serif;
13 | }
14 |
15 | a {
16 | text-decoration: none;
17 | }
18 |
19 | .container {
20 | text-align: center;
21 | }
22 |
23 | .subtitle {
24 | color: gray;
25 | }
26 |
--------------------------------------------------------------------------------
/archive/electron-boilerplate/app/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "electron-boilerplate",
3 | "productName": "Electron Boilerplate",
4 | "identifier": "com.example.electron-boilerplate",
5 | "description": "Starter for your Electron application. Out of the box ready for serious stuff.",
6 | "version": "0.1.0",
7 | "author": "Mr Gumby",
8 | "copyright": "© 2016, your company here",
9 | "main": "background.js",
10 | "dependencies": {
11 | "fs-jetpack": "^0.7.0"
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/archive/electron-boilerplate/app/spec.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Jasmine Spec Runner
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/archive/electron-boilerplate/resources/osx/helper_apps/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleIdentifier
6 | {{identifier}}.helper
7 | CFBundleName
8 | {{productName}} Helper
9 | CFBundlePackageType
10 | APPL
11 | DTSDKName
12 | macosx
13 | LSUIElement
14 |
15 | NSSupportsAutomaticGraphicsSwitching
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/archive/electron-boilerplate/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "devDependencies": {
3 | "asar": "^0.7.2",
4 | "electron-prebuilt": "^0.36.0",
5 | "fs-jetpack": "^0.7.0",
6 | "gulp": "^3.9.0",
7 | "gulp-less": "^3.0.3",
8 | "gulp-util": "^3.0.6",
9 | "q": "^1.4.1",
10 | "rollup": "^0.21.0",
11 | "tree-kill": "^0.1.1",
12 | "yargs": "^3.15.0"
13 | },
14 | "optionalDependencies": {
15 | "appdmg": "^0.3.2",
16 | "rcedit": "^0.3.0"
17 | },
18 | "scripts": {
19 | "postinstall": "cd app && npm install",
20 | "build": "gulp build",
21 | "release": "gulp release --env=production",
22 | "start": "node ./tasks/start",
23 | "test": "node ./tasks/start --env=test"
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/archive/electron-boilerplate/app/app.js:
--------------------------------------------------------------------------------
1 | // Here is the starting point for your application code.
2 | // All stuff below is just to show you how it works. You can delete all of it.
3 |
4 | // Use new ES6 modules syntax for everything.
5 | import os from 'os'; // native node.js module
6 | import { remote } from 'electron'; // native electron module
7 | import jetpack from 'fs-jetpack'; // module loaded from npm
8 | import env from './env';
9 |
10 | console.log('Loaded environment variables:', env);
11 |
12 | var app = remote.app;
13 | var appDir = jetpack.cwd(app.getAppPath());
14 |
15 | // Holy crap! This is browser window with HTML and stuff, but I can read
16 | // here files like it is node.js! Welcome to Electron world :)
17 | console.log('The author of this app is:', appDir.read('package.json', 'json').author);
18 |
--------------------------------------------------------------------------------
/archive/electron-boilerplate/resources/osx/helper_apps/Info EH.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDisplayName
6 | {{productName}} Helper EH
7 | CFBundleExecutable
8 | {{productName}} Helper EH
9 | CFBundleIdentifier
10 | {{identifier}}.helper.EH
11 | CFBundleName
12 | {{productName}} Helper EH
13 | CFBundlePackageType
14 | APPL
15 | DTSDKName
16 | macosx
17 | LSUIElement
18 |
19 | NSSupportsAutomaticGraphicsSwitching
20 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/archive/electron-boilerplate/resources/osx/helper_apps/Info NP.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDisplayName
6 | {{productName}} Helper NP
7 | CFBundleExecutable
8 | {{productName}} Helper NP
9 | CFBundleIdentifier
10 | {{identifier}}.helper.NP
11 | CFBundleName
12 | {{productName}} Helper NP
13 | CFBundlePackageType
14 | APPL
15 | DTSDKName
16 | macosx
17 | LSUIElement
18 |
19 | NSSupportsAutomaticGraphicsSwitching
20 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/npm-debug.log:
--------------------------------------------------------------------------------
1 | 0 info it worked if it ends with ok
2 | 1 verbose cli [ 'node', '/usr/local/bin/npm', 'start' ]
3 | 2 info using npm@3.7.2
4 | 3 info using node@v0.10.24
5 | 4 verbose stack Error: ENOENT, open '/Users/charleslai/Documents/Programming/other-projects/taskmeter/package.json'
6 | 5 verbose cwd /Users/charleslai/Documents/Programming/other-projects/taskmeter
7 | 6 error Darwin 15.2.0
8 | 7 error argv "node" "/usr/local/bin/npm" "start"
9 | 8 error node v0.10.24
10 | 9 error npm v3.7.2
11 | 10 error path /Users/charleslai/Documents/Programming/other-projects/taskmeter/package.json
12 | 11 error code ENOENT
13 | 12 error errno 34
14 | 13 error enoent ENOENT, open '/Users/charleslai/Documents/Programming/other-projects/taskmeter/package.json'
15 | 14 error enoent ENOENT, open '/Users/charleslai/Documents/Programming/other-projects/taskmeter/package.json'
16 | 14 error enoent This is most likely not a problem with npm itself
17 | 14 error enoent and is related to npm not being able to find a file.
18 | 15 verbose exit [ 34, true ]
19 |
--------------------------------------------------------------------------------
/archive/electron-boilerplate/app/vendor/electron_boilerplate/dev_helper.js:
--------------------------------------------------------------------------------
1 | import { app, Menu, BrowserWindow } from 'electron';
2 |
3 | var setDevMenu = function () {
4 | var devMenu = Menu.buildFromTemplate([{
5 | label: 'Development',
6 | submenu: [{
7 | label: 'Reload',
8 | accelerator: 'CmdOrCtrl+R',
9 | click: function () {
10 | BrowserWindow.getFocusedWindow().webContents.reloadIgnoringCache();
11 | }
12 | },{
13 | label: 'Toggle DevTools',
14 | accelerator: 'Alt+CmdOrCtrl+I',
15 | click: function () {
16 | BrowserWindow.getFocusedWindow().toggleDevTools();
17 | }
18 | },{
19 | label: 'Quit',
20 | accelerator: 'CmdOrCtrl+Q',
21 | click: function () {
22 | app.quit();
23 | }
24 | }]
25 | }]);
26 | Menu.setApplicationMenu(devMenu);
27 | };
28 |
29 | export default {
30 | setDevMenu: setDevMenu,
31 | }
32 |
--------------------------------------------------------------------------------
/archive/electron-boilerplate/tasks/generate_specs_import.js:
--------------------------------------------------------------------------------
1 | // Spec files are scattered through the whole project. Here we're searching
2 | // for them and generate one entry file which will run all the tests.
3 |
4 | 'use strict';
5 |
6 | var jetpack = require('fs-jetpack');
7 | var srcDir = jetpack.cwd('app');
8 |
9 | var fileName = 'spec.js';
10 | var fileBanner = "// This file is generated automatically.\n"
11 | + "// All your modifications to it will be lost (so don't do it).\n";
12 | var whatToInclude = [
13 | '*.spec.js',
14 | '!node_modules/**',
15 | ];
16 |
17 | module.exports = function () {
18 | return srcDir.findAsync('.', { matching: whatToInclude }, 'relativePath')
19 | .then(function (specPaths) {
20 | var fileContent = specPaths.map(function (path) {
21 | return 'import "' + path + '";';
22 | }).join('\n');
23 | return srcDir.writeAsync(fileName, fileBanner + fileContent);
24 | })
25 | .then(function () {
26 | return srcDir.path(fileName);
27 | });
28 | };
29 |
--------------------------------------------------------------------------------
/archive/electron-boilerplate/tasks/utils.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | var argv = require('yargs').argv;
4 | var os = require('os');
5 | var jetpack = require('fs-jetpack');
6 |
7 | module.exports.os = function () {
8 | switch (os.platform()) {
9 | case 'darwin':
10 | return 'osx';
11 | case 'linux':
12 | return 'linux';
13 | case 'win32':
14 | return 'windows';
15 | }
16 | return 'unsupported';
17 | };
18 |
19 | module.exports.replace = function (str, patterns) {
20 | Object.keys(patterns).forEach(function (pattern) {
21 | var matcher = new RegExp('{{' + pattern + '}}', 'g');
22 | str = str.replace(matcher, patterns[pattern]);
23 | });
24 | return str;
25 | };
26 |
27 | module.exports.getEnvName = function () {
28 | return argv.env || 'development';
29 | };
30 |
31 | module.exports.getSigningId = function () {
32 | return argv.sign;
33 | };
34 |
35 | module.exports.getElectronVersion = function () {
36 | var manifest = jetpack.read(__dirname + '/../package.json', 'json');
37 | return manifest.devDependencies['electron-prebuilt'].substring(1);
38 | };
39 |
--------------------------------------------------------------------------------
/archive/electron-boilerplate/resources/osx/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDisplayName
6 | {{productName}}
7 | CFBundleExecutable
8 | {{productName}}
9 | CFBundleIconFile
10 | icon.icns
11 | CFBundleIdentifier
12 | {{identifier}}
13 | CFBundleInfoDictionaryVersion
14 | 6.0
15 | CFBundleName
16 | {{productName}}
17 | CFBundlePackageType
18 | APPL
19 | CFBundleVersion
20 | {{version}}
21 | CFBundleGetInfoString
22 | {{version}}
23 | LSMinimumSystemVersion
24 | 10.8.0
25 | NSMainNibFile
26 | MainMenu
27 | NSPrincipalClass
28 | AtomApplication
29 | NSSupportsAutomaticGraphicsSwitching
30 |
31 | NSHumanReadableCopyright
32 | {{copyright}}
33 |
34 |
35 |
--------------------------------------------------------------------------------
/archive/electron-boilerplate/app/vendor/electron_boilerplate/context_menu.js:
--------------------------------------------------------------------------------
1 | // This gives you default context menu (cut, copy, paste)
2 | // in all input fields and textareas across your app.
3 |
4 | (function () {
5 | 'use strict';
6 |
7 | var remote = require('electron').remote;
8 | var Menu = remote.Menu;
9 | var MenuItem = remote.MenuItem;
10 |
11 | var cut = new MenuItem({
12 | label: "Cut",
13 | click: function () {
14 | document.execCommand("cut");
15 | }
16 | });
17 |
18 | var copy = new MenuItem({
19 | label: "Copy",
20 | click: function () {
21 | document.execCommand("copy");
22 | }
23 | });
24 |
25 | var paste = new MenuItem({
26 | label: "Paste",
27 | click: function () {
28 | document.execCommand("paste");
29 | }
30 | });
31 |
32 | var textMenu = new Menu();
33 | textMenu.append(cut);
34 | textMenu.append(copy);
35 | textMenu.append(paste);
36 |
37 | document.addEventListener('contextmenu', function (e) {
38 |
39 | switch (e.target.nodeName) {
40 | case 'TEXTAREA':
41 | case 'INPUT':
42 | e.preventDefault();
43 | textMenu.popup(remote.getCurrentWindow());
44 | break;
45 | }
46 |
47 | }, false);
48 |
49 | }());
50 |
--------------------------------------------------------------------------------
/archive/electron-boilerplate/app/vendor/electron_boilerplate/window_state.js:
--------------------------------------------------------------------------------
1 | // Simple module to help you remember the size and position of windows.
2 | // Can be used for more than one window, just construct many
3 | // instances of it and give each different name.
4 |
5 | import { app } from 'electron';
6 | import jetpack from 'fs-jetpack';
7 |
8 | export default function (name, defaults) {
9 |
10 | var userDataDir = jetpack.cwd(app.getPath('userData'));
11 | var stateStoreFile = 'window-state-' + name +'.json';
12 |
13 | var state = userDataDir.read(stateStoreFile, 'json') || {
14 | width: defaults.width,
15 | height: defaults.height
16 | };
17 |
18 | var saveState = function (win) {
19 | if (!win.isMaximized() && !win.isMinimized()) {
20 | var position = win.getPosition();
21 | var size = win.getSize();
22 | state.x = position[0];
23 | state.y = position[1];
24 | state.width = size[0];
25 | state.height = size[1];
26 | }
27 | state.isMaximized = win.isMaximized();
28 | userDataDir.write(stateStoreFile, state, { atomic: true });
29 | };
30 |
31 | return {
32 | get x() { return state.x; },
33 | get y() { return state.y; },
34 | get width() { return state.width; },
35 | get height() { return state.height; },
36 | get isMaximized() { return state.isMaximized; },
37 | saveState: saveState
38 | };
39 | }
40 |
--------------------------------------------------------------------------------
/archive/electron-boilerplate/app/vendor/electron_boilerplate/external_links.js:
--------------------------------------------------------------------------------
1 | // Convenient way for opening links in external browser, not in the app.
2 | // Useful especially if you have a lot of links to deal with.
3 | //
4 | // Usage:
5 | //
6 | // Every link with class ".js-external-link" will be opened in external browser.
7 | // google
8 | //
9 | // The same behaviour for many links can be achieved by adding
10 | // this class to any parent tag of an anchor tag.
11 | //
12 | // google
13 | // bing
14 | //
15 |
16 | (function () {
17 | 'use strict';
18 |
19 | var shell = require('electron').shell;
20 |
21 | var supportExternalLinks = function (e) {
22 | var href;
23 | var isExternal = false;
24 |
25 | var checkDomElement = function (element) {
26 | if (element.nodeName === 'A') {
27 | href = element.getAttribute('href');
28 | }
29 | if (element.classList.contains('js-external-link')) {
30 | isExternal = true;
31 | }
32 | if (href && isExternal) {
33 | shell.openExternal(href);
34 | e.preventDefault();
35 | } else if (element.parentElement) {
36 | checkDomElement(element.parentElement);
37 | }
38 | }
39 |
40 | checkDomElement(e.target);
41 | }
42 |
43 | document.addEventListener('click', supportExternalLinks, false);
44 | }());
45 |
--------------------------------------------------------------------------------
/archive/electron-boilerplate/app/background.js:
--------------------------------------------------------------------------------
1 | // This is main process of Electron, started as first thing when your
2 | // app starts. This script is running through entire life of your application.
3 | // It doesn't have any windows which you can see on screen, but we can open
4 | // window from here.
5 |
6 | import { app, BrowserWindow } from 'electron';
7 | import devHelper from './vendor/electron_boilerplate/dev_helper';
8 | import windowStateKeeper from './vendor/electron_boilerplate/window_state';
9 |
10 | // Special module holding environment variables which you declared
11 | // in config/env_xxx.json file.
12 | import env from './env';
13 |
14 | var mainWindow;
15 |
16 | // Preserver of the window size and position between app launches.
17 | var mainWindowState = windowStateKeeper('main', {
18 | width: 1000,
19 | height: 600
20 | });
21 |
22 | app.on('ready', function () {
23 |
24 | mainWindow = new BrowserWindow({
25 | x: mainWindowState.x,
26 | y: mainWindowState.y,
27 | width: mainWindowState.width,
28 | height: mainWindowState.height
29 | });
30 |
31 | if (mainWindowState.isMaximized) {
32 | mainWindow.maximize();
33 | }
34 |
35 | if (env.name === 'test') {
36 | mainWindow.loadURL('file://' + __dirname + '/spec.html');
37 | } else {
38 | mainWindow.loadURL('file://' + __dirname + '/app.html');
39 | }
40 |
41 | if (env.name !== 'production') {
42 | devHelper.setDevMenu();
43 | mainWindow.openDevTools();
44 | }
45 |
46 | mainWindow.on('close', function () {
47 | mainWindowState.saveState(mainWindow);
48 | });
49 | });
50 |
51 | app.on('window-all-closed', function () {
52 | app.quit();
53 | });
54 |
--------------------------------------------------------------------------------
/archive/electron-boilerplate/tasks/rebuild_native.js:
--------------------------------------------------------------------------------
1 | /*
2 | This script compiles native modules for Electron.
3 | If you don't plan to use native modules you can delete this file.
4 |
5 | But if you'd like to use them do those steps...
6 |
7 | 1. Go to main project's directory and run:
8 | npm install electron-rebuild --save-dev
9 |
10 | 2. Then go to app folder:
11 | cd app
12 |
13 | 3. Add to app/package.json lines:
14 | "scripts": {
15 | "postinstall": "node ../tasks/rebuild_native"
16 | }
17 |
18 | 4. Now install your native module:
19 | npm install my_native_module --save
20 |
21 | 5. Trigger once again full npm install so electron-rebuild can do it's job:
22 | npm install
23 |
24 | 6. Enjoy your native module!
25 | */
26 |
27 | 'use strict';
28 |
29 | var childProcess = require('child_process');
30 | var path = require('path');
31 | var Q = require('q');
32 | var electron = require('electron-prebuilt');
33 | var electronPackage = require('electron-prebuilt/package.json');
34 | var rebuild = require('electron-rebuild');
35 |
36 | var pathToElectronNativeModules = path.join(__dirname, '../app/node_modules');
37 |
38 | rebuild.shouldRebuildNativeModules(electron)
39 | .then(function (shouldBuild) {
40 | if (!shouldBuild) {
41 | return true;
42 | }
43 |
44 | console.log('Rebuilding native modules for Electron...');
45 |
46 | return rebuild.installNodeHeaders(electronPackage.version)
47 | .then(function () {
48 | return rebuild.rebuildNativeModules(electronPackage.version, pathToElectronNativeModules);
49 | });
50 | })
51 | .then(function () {
52 | console.log('Rebuilding complete.');
53 | })
54 | .catch(function (err) {
55 | console.error("Rebuilding error!");
56 | console.error(err);
57 | });
58 |
--------------------------------------------------------------------------------
/archive/electron-boilerplate/tasks/start.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | var Q = require('q');
4 | var electron = require('electron-prebuilt');
5 | var pathUtil = require('path');
6 | var childProcess = require('child_process');
7 | var kill = require('tree-kill');
8 | var utils = require('./utils');
9 | var watch;
10 |
11 | var gulpPath = pathUtil.resolve('./node_modules/.bin/gulp');
12 | if (process.platform === 'win32') {
13 | gulpPath += '.cmd';
14 | }
15 |
16 | var runBuild = function () {
17 | var deferred = Q.defer();
18 |
19 | var build = childProcess.spawn(gulpPath, [
20 | 'build',
21 | '--env=' + utils.getEnvName(),
22 | '--color'
23 | ], {
24 | stdio: 'inherit'
25 | });
26 |
27 | build.on('close', function (code) {
28 | deferred.resolve();
29 | });
30 |
31 | return deferred.promise;
32 | };
33 |
34 | var runGulpWatch = function () {
35 | watch = childProcess.spawn(gulpPath, [
36 | 'watch',
37 | '--env=' + utils.getEnvName(),
38 | '--color'
39 | ], {
40 | stdio: 'inherit'
41 | });
42 |
43 | watch.on('close', function (code) {
44 | // Gulp watch exits when error occured during build.
45 | // Just respawn it then.
46 | runGulpWatch();
47 | });
48 | };
49 |
50 | var runApp = function () {
51 | var app = childProcess.spawn(electron, ['./build'], {
52 | stdio: 'inherit'
53 | });
54 |
55 | app.on('close', function (code) {
56 | // User closed the app. Kill the host process.
57 | kill(watch.pid, 'SIGKILL', function () {
58 | process.exit();
59 | });
60 | });
61 | };
62 |
63 | runBuild()
64 | .then(function () {
65 | runGulpWatch();
66 | runApp();
67 | });
68 |
--------------------------------------------------------------------------------
/archive/chrome-app-prototype/css/simple-sidebar.css:
--------------------------------------------------------------------------------
1 | /*!
2 | * Start Bootstrap - Simple Sidebar HTML Template (http://startbootstrap.com)
3 | * Code licensed under the Apache License v2.0.
4 | * For details, see http://www.apache.org/licenses/LICENSE-2.0.
5 | */
6 |
7 | /* Toggle Styles */
8 |
9 | #wrapper {
10 | padding-left: 0;
11 | -webkit-transition: all 0.5s ease;
12 | -moz-transition: all 0.5s ease;
13 | -o-transition: all 0.5s ease;
14 | transition: all 0.5s ease;
15 | }
16 |
17 | #wrapper.toggled {
18 | padding-left: 250px;
19 | }
20 |
21 | #sidebar-wrapper {
22 | z-index: 1000;
23 | position: fixed;
24 | left: 250px;
25 | width: 0;
26 | height: 100%;
27 | margin-left: -250px;
28 | overflow-y: auto;
29 | background: #000;
30 | -webkit-transition: all 0.5s ease;
31 | -moz-transition: all 0.5s ease;
32 | -o-transition: all 0.5s ease;
33 | transition: all 0.5s ease;
34 | }
35 |
36 | #wrapper.toggled #sidebar-wrapper {
37 | width: 250px;
38 | }
39 |
40 | #page-content-wrapper {
41 | width: 100%;
42 | position: absolute;
43 | padding: 15px;
44 | }
45 |
46 | #wrapper.toggled #page-content-wrapper {
47 | position: absolute;
48 | margin-right: -250px;
49 | }
50 |
51 | /* Sidebar Styles */
52 |
53 | .sidebar-nav {
54 | position: absolute;
55 | top: 0;
56 | width: 250px;
57 | margin: 0;
58 | padding: 0;
59 | list-style: none;
60 | }
61 |
62 | .sidebar-nav li {
63 | text-indent: 20px;
64 | line-height: 40px;
65 | }
66 |
67 | .sidebar-nav li a {
68 | display: block;
69 | text-decoration: none;
70 | color: #999999;
71 | }
72 |
73 | .sidebar-nav li a:hover {
74 | text-decoration: none;
75 | color: #fff;
76 | background: rgba(255,255,255,0.2);
77 | }
78 |
79 | .sidebar-nav li a:active,
80 | .sidebar-nav li a:focus {
81 | text-decoration: none;
82 | }
83 |
84 | .sidebar-nav > .sidebar-brand {
85 | height: 65px;
86 | font-size: 18px;
87 | line-height: 60px;
88 | }
89 |
90 | .sidebar-nav > .sidebar-brand a {
91 | color: #999999;
92 | }
93 |
94 | .sidebar-nav > .sidebar-brand a:hover {
95 | color: #fff;
96 | background: none;
97 | }
98 |
99 | @media(min-width:768px) {
100 | #wrapper {
101 | padding-left: 250px;
102 | }
103 |
104 | #wrapper.toggled {
105 | padding-left: 0;
106 | }
107 |
108 | #sidebar-wrapper {
109 | width: 250px;
110 | }
111 |
112 | #wrapper.toggled #sidebar-wrapper {
113 | width: 0;
114 | }
115 |
116 | #page-content-wrapper {
117 | padding: 20px;
118 | position: relative;
119 | }
120 |
121 | #wrapper.toggled #page-content-wrapper {
122 | position: relative;
123 | margin-right: 0;
124 | }
125 | }
--------------------------------------------------------------------------------
/archive/electron-boilerplate/app/stylesheets/simple-sidebar.css:
--------------------------------------------------------------------------------
1 | /*!
2 | * Start Bootstrap - Simple Sidebar HTML Template (http://startbootstrap.com)
3 | * Code licensed under the Apache License v2.0.
4 | * For details, see http://www.apache.org/licenses/LICENSE-2.0.
5 | */
6 |
7 | /* Toggle Styles */
8 |
9 | #wrapper {
10 | padding-left: 0;
11 | -webkit-transition: all 0.5s ease;
12 | -moz-transition: all 0.5s ease;
13 | -o-transition: all 0.5s ease;
14 | transition: all 0.5s ease;
15 | }
16 |
17 | #wrapper.toggled {
18 | padding-left: 250px;
19 | }
20 |
21 | #sidebar-wrapper {
22 | z-index: 1000;
23 | position: fixed;
24 | left: 250px;
25 | width: 0;
26 | height: 100%;
27 | margin-left: -250px;
28 | overflow-y: auto;
29 | background: #000;
30 | -webkit-transition: all 0.5s ease;
31 | -moz-transition: all 0.5s ease;
32 | -o-transition: all 0.5s ease;
33 | transition: all 0.5s ease;
34 | }
35 |
36 | #wrapper.toggled #sidebar-wrapper {
37 | width: 250px;
38 | }
39 |
40 | #page-content-wrapper {
41 | width: 100%;
42 | position: absolute;
43 | padding: 15px;
44 | }
45 |
46 | #wrapper.toggled #page-content-wrapper {
47 | position: absolute;
48 | margin-right: -250px;
49 | }
50 |
51 | /* Sidebar Styles */
52 |
53 | .sidebar-nav {
54 | position: absolute;
55 | top: 0;
56 | width: 250px;
57 | margin: 0;
58 | padding: 0;
59 | list-style: none;
60 | }
61 |
62 | .sidebar-nav li {
63 | text-indent: 20px;
64 | line-height: 40px;
65 | }
66 |
67 | .sidebar-nav li a {
68 | display: block;
69 | text-decoration: none;
70 | color: #999999;
71 | }
72 |
73 | .sidebar-nav li a:hover {
74 | text-decoration: none;
75 | color: #fff;
76 | background: rgba(255,255,255,0.2);
77 | }
78 |
79 | .sidebar-nav li a:active,
80 | .sidebar-nav li a:focus {
81 | text-decoration: none;
82 | }
83 |
84 | .sidebar-nav > .sidebar-brand {
85 | height: 65px;
86 | font-size: 18px;
87 | line-height: 60px;
88 | }
89 |
90 | .sidebar-nav > .sidebar-brand a {
91 | color: #999999;
92 | }
93 |
94 | .sidebar-nav > .sidebar-brand a:hover {
95 | color: #fff;
96 | background: none;
97 | }
98 |
99 | @media(min-width:768px) {
100 | #wrapper {
101 | padding-left: 250px;
102 | }
103 |
104 | #wrapper.toggled {
105 | padding-left: 0;
106 | }
107 |
108 | #sidebar-wrapper {
109 | width: 250px;
110 | }
111 |
112 | #wrapper.toggled #sidebar-wrapper {
113 | width: 0;
114 | }
115 |
116 | #page-content-wrapper {
117 | padding: 20px;
118 | position: relative;
119 | }
120 |
121 | #wrapper.toggled #page-content-wrapper {
122 | position: relative;
123 | margin-right: 0;
124 | }
125 | }
--------------------------------------------------------------------------------
/archive/electron-boilerplate/app/app.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 | Simple Sidebar - Start Bootstrap Template
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
Simple Sidebar
79 |
This template has a responsive menu toggling system. The menu will appear collapsed on smaller screens, and will appear non-collapsed on larger screens. When toggled using the button below, the menu will appear/disappear. On small screens, the page content will be pushed off canvas.
80 |
Make sure to keep all page content within the #page-content-wrapper.
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
98 |
99 |
100 |
101 |
102 |
--------------------------------------------------------------------------------
/archive/chrome-app-prototype/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 | Simple Sidebar - Start Bootstrap Template
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
Simple Sidebar
72 |
This template has a responsive menu toggling system. The menu will appear collapsed on smaller screens, and will appear non-collapsed on larger screens. When toggled using the button below, the menu will appear/disappear. On small screens, the page content will be pushed off canvas.
73 |
Make sure to keep all page content within the #page-content-wrapper.
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
97 |
98 |
99 |
100 |
101 |
--------------------------------------------------------------------------------
/archive/electron-boilerplate/tasks/release_linux.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | var Q = require('q');
4 | var gulpUtil = require('gulp-util');
5 | var childProcess = require('child_process');
6 | var jetpack = require('fs-jetpack');
7 | var asar = require('asar');
8 | var utils = require('./utils');
9 |
10 | var projectDir;
11 | var releasesDir;
12 | var packName;
13 | var packDir;
14 | var tmpDir;
15 | var readyAppDir;
16 | var manifest;
17 |
18 | var init = function () {
19 | projectDir = jetpack;
20 | tmpDir = projectDir.dir('./tmp', { empty: true });
21 | releasesDir = projectDir.dir('./releases');
22 | manifest = projectDir.read('app/package.json', 'json');
23 | packName = manifest.name + '_' + manifest.version;
24 | packDir = tmpDir.dir(packName);
25 | readyAppDir = packDir.cwd('opt', manifest.name);
26 |
27 | return Q();
28 | };
29 |
30 | var copyRuntime = function () {
31 | return projectDir.copyAsync('node_modules/electron-prebuilt/dist', readyAppDir.path(), { overwrite: true });
32 | };
33 |
34 | var packageBuiltApp = function () {
35 | var deferred = Q.defer();
36 |
37 | asar.createPackage(projectDir.path('build'), readyAppDir.path('resources/app.asar'), function () {
38 | deferred.resolve();
39 | });
40 |
41 | return deferred.promise;
42 | };
43 |
44 | var finalize = function () {
45 | // Create .desktop file from the template
46 | var desktop = projectDir.read('resources/linux/app.desktop');
47 | desktop = utils.replace(desktop, {
48 | name: manifest.name,
49 | productName: manifest.productName,
50 | description: manifest.description,
51 | version: manifest.version,
52 | author: manifest.author
53 | });
54 | packDir.write('usr/share/applications/' + manifest.name + '.desktop', desktop);
55 |
56 | // Copy icon
57 | projectDir.copy('resources/icon.png', readyAppDir.path('icon.png'));
58 |
59 | return Q();
60 | };
61 |
62 | var renameApp = function () {
63 | return readyAppDir.renameAsync("electron", manifest.name);
64 | };
65 |
66 | var packToDebFile = function () {
67 | var deferred = Q.defer();
68 |
69 | var debFileName = packName + '_amd64.deb';
70 | var debPath = releasesDir.path(debFileName);
71 |
72 | gulpUtil.log('Creating DEB package...');
73 |
74 | // Counting size of the app in KiB
75 | var appSize = Math.round(readyAppDir.inspectTree('.').size / 1024);
76 |
77 | // Preparing debian control file
78 | var control = projectDir.read('resources/linux/DEBIAN/control');
79 | control = utils.replace(control, {
80 | name: manifest.name,
81 | description: manifest.description,
82 | version: manifest.version,
83 | author: manifest.author,
84 | size: appSize
85 | });
86 | packDir.write('DEBIAN/control', control);
87 |
88 | // Build the package...
89 | childProcess.exec('fakeroot dpkg-deb -Zxz --build ' + packDir.path().replace(/\s/g, '\\ ') + ' ' + debPath.replace(/\s/g, '\\ '),
90 | function (error, stdout, stderr) {
91 | if (error || stderr) {
92 | console.log("ERROR while building DEB package:");
93 | console.log(error);
94 | console.log(stderr);
95 | } else {
96 | gulpUtil.log('DEB package ready!', debPath);
97 | }
98 | deferred.resolve();
99 | });
100 |
101 | return deferred.promise;
102 | };
103 |
104 | var cleanClutter = function () {
105 | return tmpDir.removeAsync('.');
106 | };
107 |
108 | module.exports = function () {
109 | return init()
110 | .then(copyRuntime)
111 | .then(packageBuiltApp)
112 | .then(finalize)
113 | .then(renameApp)
114 | .then(packToDebFile)
115 | .then(cleanClutter)
116 | .catch(console.error);
117 | };
118 |
--------------------------------------------------------------------------------
/archive/electron-boilerplate/tasks/release_windows.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | var Q = require('q');
4 | var gulpUtil = require('gulp-util');
5 | var childProcess = require('child_process');
6 | var jetpack = require('fs-jetpack');
7 | var asar = require('asar');
8 | var utils = require('./utils');
9 |
10 | var projectDir;
11 | var tmpDir;
12 | var releasesDir;
13 | var readyAppDir;
14 | var manifest;
15 |
16 | var init = function () {
17 | projectDir = jetpack;
18 | tmpDir = projectDir.dir('./tmp', { empty: true });
19 | releasesDir = projectDir.dir('./releases');
20 | manifest = projectDir.read('app/package.json', 'json');
21 | readyAppDir = tmpDir.cwd(manifest.name);
22 |
23 | return Q();
24 | };
25 |
26 | var copyRuntime = function () {
27 | return projectDir.copyAsync('node_modules/electron-prebuilt/dist', readyAppDir.path(), { overwrite: true });
28 | };
29 |
30 | var cleanupRuntime = function () {
31 | return readyAppDir.removeAsync('resources/default_app');
32 | };
33 |
34 | var packageBuiltApp = function () {
35 | var deferred = Q.defer();
36 |
37 | asar.createPackage(projectDir.path('build'), readyAppDir.path('resources/app.asar'), function () {
38 | deferred.resolve();
39 | });
40 |
41 | return deferred.promise;
42 | };
43 |
44 | var finalize = function () {
45 | var deferred = Q.defer();
46 |
47 | projectDir.copy('resources/windows/icon.ico', readyAppDir.path('icon.ico'));
48 |
49 | // Replace Electron icon for your own.
50 | var rcedit = require('rcedit');
51 | rcedit(readyAppDir.path('electron.exe'), {
52 | 'icon': projectDir.path('resources/windows/icon.ico'),
53 | 'version-string': {
54 | 'ProductName': manifest.productName,
55 | 'FileDescription': manifest.description,
56 | 'ProductVersion': manifest.version,
57 | 'CompanyName': manifest.author, // it might be better to add another field to package.json for this
58 | 'LegalCopyright': manifest.copyright,
59 | 'OriginalFilename': manifest.productName + '.exe'
60 | }
61 | }, function (err) {
62 | if (!err) {
63 | deferred.resolve();
64 | }
65 | });
66 |
67 | return deferred.promise;
68 | };
69 |
70 | var renameApp = function () {
71 | return readyAppDir.renameAsync('electron.exe', manifest.productName + '.exe');
72 | };
73 |
74 | var createInstaller = function () {
75 | var deferred = Q.defer();
76 |
77 | var finalPackageName = manifest.name + '_' + manifest.version + '.exe';
78 | var installScript = projectDir.read('resources/windows/installer.nsi');
79 |
80 | installScript = utils.replace(installScript, {
81 | name: manifest.name,
82 | productName: manifest.productName,
83 | author: manifest.author,
84 | version: manifest.version,
85 | src: readyAppDir.path(),
86 | dest: releasesDir.path(finalPackageName),
87 | icon: readyAppDir.path('icon.ico'),
88 | setupIcon: projectDir.path('resources/windows/setup-icon.ico'),
89 | banner: projectDir.path('resources/windows/setup-banner.bmp'),
90 | });
91 | tmpDir.write('installer.nsi', installScript);
92 |
93 | gulpUtil.log('Building installer with NSIS...');
94 |
95 | // Remove destination file if already exists.
96 | releasesDir.remove(finalPackageName);
97 |
98 | // Note: NSIS have to be added to PATH (environment variables).
99 | var nsis = childProcess.spawn('makensis', [
100 | tmpDir.path('installer.nsi')
101 | ], {
102 | stdio: 'inherit'
103 | });
104 | nsis.on('error', function (err) {
105 | if (err.message === 'spawn makensis ENOENT') {
106 | throw "Can't find NSIS. Are you sure you've installed it and"
107 | + " added to PATH environment variable?";
108 | } else {
109 | throw err;
110 | }
111 | });
112 | nsis.on('close', function () {
113 | gulpUtil.log('Installer ready!', releasesDir.path(finalPackageName));
114 | deferred.resolve();
115 | });
116 |
117 | return deferred.promise;
118 | };
119 |
120 | var cleanClutter = function () {
121 | return tmpDir.removeAsync('.');
122 | };
123 |
124 | module.exports = function () {
125 | return init()
126 | .then(copyRuntime)
127 | .then(cleanupRuntime)
128 | .then(packageBuiltApp)
129 | .then(finalize)
130 | .then(renameApp)
131 | .then(createInstaller)
132 | .then(cleanClutter)
133 | .catch(console.error);
134 | };
135 |
--------------------------------------------------------------------------------
/archive/electron-boilerplate/tasks/build.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | var pathUtil = require('path');
4 | var Q = require('q');
5 | var gulp = require('gulp');
6 | var rollup = require('rollup');
7 | var less = require('gulp-less');
8 | var jetpack = require('fs-jetpack');
9 |
10 | var utils = require('./utils');
11 | var generateSpecsImportFile = require('./generate_specs_import');
12 |
13 | var projectDir = jetpack;
14 | var srcDir = projectDir.cwd('./app');
15 | var destDir = projectDir.cwd('./build');
16 |
17 | var paths = {
18 | copyFromAppDir: [
19 | './node_modules/**',
20 | './vendor/**',
21 | './**/*.html',
22 | './**/*.+(jpg|png|svg)',
23 | './stylesheets/*.css'
24 | ],
25 | }
26 |
27 | // -------------------------------------
28 | // Tasks
29 | // -------------------------------------
30 |
31 | gulp.task('clean', function (callback) {
32 | return destDir.dirAsync('.', { empty: true });
33 | });
34 |
35 |
36 | var copyTask = function () {
37 | return projectDir.copyAsync('app', destDir.path(), {
38 | overwrite: true,
39 | matching: paths.copyFromAppDir
40 | });
41 | };
42 | gulp.task('copy', ['clean'], copyTask);
43 | gulp.task('copy-watch', copyTask);
44 |
45 |
46 | var bundle = function (src, dest) {
47 | var deferred = Q.defer();
48 |
49 | rollup.rollup({
50 | entry: src,
51 | }).then(function (bundle) {
52 | var jsFile = pathUtil.basename(dest);
53 | var result = bundle.generate({
54 | format: 'cjs',
55 | sourceMap: true,
56 | sourceMapFile: jsFile,
57 | });
58 | // Wrap code in self invoking function so the variables don't
59 | // pollute the global namespace.
60 | var isolatedCode = '(function () {' + result.code + '\n}());';
61 | return Q.all([
62 | destDir.writeAsync(dest, isolatedCode + '\n//# sourceMappingURL=' + jsFile + '.map'),
63 | destDir.writeAsync(dest + '.map', result.map.toString()),
64 | ]);
65 | }).then(function () {
66 | deferred.resolve();
67 | }).catch(function (err) {
68 | console.error('Build: Error during rollup', err.stack);
69 | });
70 |
71 | return deferred.promise;
72 | };
73 |
74 | var bundleApplication = function () {
75 | return Q.all([
76 | bundle(srcDir.path('background.js'), destDir.path('background.js')),
77 | bundle(srcDir.path('app.js'), destDir.path('app.js')),
78 | ]);
79 | };
80 |
81 | var bundleSpecs = function () {
82 | generateSpecsImportFile().then(function (specEntryPointPath) {
83 | return Q.all([
84 | bundle(srcDir.path('background.js'), destDir.path('background.js')),
85 | bundle(specEntryPointPath, destDir.path('spec.js')),
86 | ]);
87 | });
88 | };
89 |
90 | var bundleTask = function () {
91 | if (utils.getEnvName() === 'test') {
92 | return bundleSpecs();
93 | }
94 | return bundleApplication();
95 | };
96 | gulp.task('bundle', ['clean'], bundleTask);
97 | gulp.task('bundle-watch', bundleTask);
98 |
99 |
100 | var lessTask = function () {
101 | return gulp.src('app/stylesheets/main.less')
102 | .pipe(less())
103 | .pipe(gulp.dest(destDir.path('stylesheets')));
104 | };
105 | gulp.task('less', ['clean'], lessTask);
106 | gulp.task('less-watch', lessTask);
107 |
108 |
109 | gulp.task('finalize', ['clean'], function () {
110 | var manifest = srcDir.read('package.json', 'json');
111 |
112 | // Add "dev" or "test" suffix to name, so Electron will write all data
113 | // like cookies and localStorage in separate places for each environment.
114 | switch (utils.getEnvName()) {
115 | case 'development':
116 | manifest.name += '-dev';
117 | manifest.productName += ' Dev';
118 | break;
119 | case 'test':
120 | manifest.name += '-test';
121 | manifest.productName += ' Test';
122 | break;
123 | }
124 |
125 | // Copy environment variables to package.json file for easy use
126 | // in the running application. This is not official way of doing
127 | // things, but also isn't prohibited ;)
128 | manifest.env = projectDir.read('config/env_' + utils.getEnvName() + '.json', 'json');
129 |
130 | destDir.write('package.json', manifest);
131 | });
132 |
133 |
134 | gulp.task('watch', function () {
135 | gulp.watch('app/**/*.js', ['bundle-watch']);
136 | gulp.watch(paths.copyFromAppDir, { cwd: 'app' }, ['copy-watch']);
137 | gulp.watch('app/**/*.less', ['less-watch']);
138 | });
139 |
140 |
141 | gulp.task('build', ['bundle', 'less', 'copy', 'finalize']);
142 |
--------------------------------------------------------------------------------
/archive/electron-boilerplate/resources/windows/installer.nsi:
--------------------------------------------------------------------------------
1 | ; NSIS packaging/install script
2 | ; Docs: http://nsis.sourceforge.net/Docs/Contents.html
3 |
4 | !include LogicLib.nsh
5 | !include nsDialogs.nsh
6 |
7 | ; --------------------------------
8 | ; Variables
9 | ; --------------------------------
10 |
11 | !define dest "{{dest}}"
12 | !define src "{{src}}"
13 | !define name "{{name}}"
14 | !define productName "{{productName}}"
15 | !define author "{{author}}"
16 | !define version "{{version}}"
17 | !define icon "{{icon}}"
18 | !define setupIcon "{{setupIcon}}"
19 | !define banner "{{banner}}"
20 |
21 | !define exec "{{productName}}.exe"
22 |
23 | !define regkey "Software\${productName}"
24 | !define uninstkey "Software\Microsoft\Windows\CurrentVersion\Uninstall\${productName}"
25 |
26 | !define uninstaller "uninstall.exe"
27 |
28 | ; --------------------------------
29 | ; Installation
30 | ; --------------------------------
31 |
32 | Unicode true
33 | SetCompressor /SOLID lzma
34 |
35 | Name "${productName}"
36 | Icon "${setupIcon}"
37 | OutFile "${dest}"
38 | InstallDir "$PROGRAMFILES\${productName}"
39 | InstallDirRegKey HKLM "${regkey}" ""
40 |
41 | RequestExecutionLevel admin
42 | CRCCheck on
43 | SilentInstall normal
44 |
45 | XPStyle on
46 | ShowInstDetails nevershow
47 | AutoCloseWindow false
48 | WindowIcon off
49 |
50 | Caption "${productName} Setup"
51 | ; Don't add sub-captions to title bar
52 | SubCaption 3 " "
53 | SubCaption 4 " "
54 |
55 | Page custom welcome
56 | Page instfiles
57 |
58 | Var Image
59 | Var ImageHandle
60 |
61 | Function .onInit
62 |
63 | ; Extract banner image for welcome page
64 | InitPluginsDir
65 | ReserveFile "${banner}"
66 | File /oname=$PLUGINSDIR\banner.bmp "${banner}"
67 |
68 | FunctionEnd
69 |
70 | ; Custom welcome page
71 | Function welcome
72 |
73 | nsDialogs::Create 1018
74 |
75 | ${NSD_CreateLabel} 185 1u 210 100% "Welcome to ${productName} version ${version} installer.$\r$\n$\r$\nClick install to begin."
76 |
77 | ${NSD_CreateBitmap} 0 0 170 210 ""
78 | Pop $Image
79 | ${NSD_SetImage} $Image $PLUGINSDIR\banner.bmp $ImageHandle
80 |
81 | nsDialogs::Show
82 |
83 | ${NSD_FreeImage} $ImageHandle
84 |
85 | FunctionEnd
86 |
87 | ; Installation declarations
88 | Section "Install"
89 |
90 | WriteRegStr HKLM "${regkey}" "Install_Dir" "$INSTDIR"
91 | WriteRegStr HKLM "${uninstkey}" "DisplayName" "${productName}"
92 | WriteRegStr HKLM "${uninstkey}" "DisplayIcon" '"$INSTDIR\icon.ico"'
93 | WriteRegStr HKLM "${uninstkey}" "UninstallString" '"$INSTDIR\${uninstaller}"'
94 | WriteRegStr HKLM "${uninstkey}" "Publisher" "${author}"
95 | WriteRegStr HKLM "${uninstkey}" "DisplayVersion" "${version}"
96 |
97 | ; Remove all application files copied by previous installation
98 | RMDir /r "$INSTDIR"
99 |
100 | SetOutPath $INSTDIR
101 |
102 | ; Include all files from /build directory
103 | File /r "${src}\*"
104 |
105 | ; Create start menu shortcut
106 | SetShellVarContext all
107 | CreateShortCut "$SMPROGRAMS\${productName}.lnk" "$INSTDIR\${exec}" "" "$INSTDIR\icon.ico"
108 | ; Create desktop shortcut
109 | CreateShortCut "$DESKTOP\${productName}.lnk" "$INSTDIR\${exec}" "" "$INSTDIR\icon.ico"
110 |
111 | WriteUninstaller "${uninstaller}"
112 |
113 | SectionEnd
114 |
115 | ; --------------------------------
116 | ; Uninstaller
117 | ; --------------------------------
118 |
119 | ShowUninstDetails nevershow
120 |
121 | UninstallCaption "Uninstall ${productName}"
122 | UninstallText "Don't like ${productName} anymore? Hit uninstall button."
123 | UninstallIcon "${icon}"
124 |
125 | UninstPage custom un.confirm un.confirmOnLeave
126 | UninstPage instfiles
127 |
128 | Var RemoveAppDataCheckbox
129 | Var RemoveAppDataCheckbox_State
130 |
131 | ; Custom uninstall confirm page
132 | Function un.confirm
133 |
134 | nsDialogs::Create 1018
135 |
136 | ${NSD_CreateLabel} 1u 1u 100% 24u "If you really want to remove ${productName} from your computer press uninstall button."
137 |
138 | ${NSD_CreateCheckbox} 1u 35u 100% 10u "Remove also my ${productName} personal data"
139 | Pop $RemoveAppDataCheckbox
140 |
141 | nsDialogs::Show
142 |
143 | FunctionEnd
144 |
145 | Function un.confirmOnLeave
146 |
147 | ; Save checkbox state on page leave
148 | ${NSD_GetState} $RemoveAppDataCheckbox $RemoveAppDataCheckbox_State
149 |
150 | FunctionEnd
151 |
152 | ; Uninstall declarations
153 | Section "Uninstall"
154 |
155 | DeleteRegKey HKLM "${uninstkey}"
156 | DeleteRegKey HKLM "${regkey}"
157 |
158 | SetShellVarContext all
159 | Delete "$SMPROGRAMS\${productName}.lnk"
160 | ; Remove desktop shortcut
161 | Delete "$DESKTOP\${productName}.lnk"
162 | ; Remove whole directory from Program Files
163 | RMDir /r "$INSTDIR"
164 |
165 | ; Remove also appData directory generated by your app if user checked this option
166 | ${If} $RemoveAppDataCheckbox_State == ${BST_CHECKED}
167 | RMDir /r "$APPDATA\${productName}"
168 | ${EndIf}
169 |
170 | SectionEnd
171 |
--------------------------------------------------------------------------------
/archive/electron-boilerplate/tasks/release_osx.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | var Q = require('q');
4 | var gulpUtil = require('gulp-util');
5 | var jetpack = require('fs-jetpack');
6 | var asar = require('asar');
7 | var utils = require('./utils');
8 | var child_process = require('child_process');
9 |
10 | var projectDir;
11 | var releasesDir;
12 | var tmpDir;
13 | var finalAppDir;
14 | var manifest;
15 |
16 | var init = function () {
17 | projectDir = jetpack;
18 | tmpDir = projectDir.dir('./tmp', { empty: true });
19 | releasesDir = projectDir.dir('./releases');
20 | manifest = projectDir.read('app/package.json', 'json');
21 | finalAppDir = tmpDir.cwd(manifest.productName + '.app');
22 |
23 | return Q();
24 | };
25 |
26 | var copyRuntime = function () {
27 | return projectDir.copyAsync('node_modules/electron-prebuilt/dist/Electron.app', finalAppDir.path());
28 | };
29 |
30 | var cleanupRuntime = function () {
31 | finalAppDir.remove('Contents/Resources/default_app');
32 | finalAppDir.remove('Contents/Resources/atom.icns');
33 | return Q();
34 | };
35 |
36 | var packageBuiltApp = function () {
37 | var deferred = Q.defer();
38 |
39 | asar.createPackage(projectDir.path('build'), finalAppDir.path('Contents/Resources/app.asar'), function () {
40 | deferred.resolve();
41 | });
42 |
43 | return deferred.promise;
44 | };
45 |
46 | var finalize = function () {
47 | // Prepare main Info.plist
48 | var info = projectDir.read('resources/osx/Info.plist');
49 | info = utils.replace(info, {
50 | productName: manifest.productName,
51 | identifier: manifest.identifier,
52 | version: manifest.version,
53 | copyright: manifest.copyright
54 | });
55 | finalAppDir.write('Contents/Info.plist', info);
56 |
57 | // Prepare Info.plist of Helper apps
58 | [' EH', ' NP', ''].forEach(function (helper_suffix) {
59 | info = projectDir.read('resources/osx/helper_apps/Info' + helper_suffix + '.plist');
60 | info = utils.replace(info, {
61 | productName: manifest.productName,
62 | identifier: manifest.identifier
63 | });
64 | finalAppDir.write('Contents/Frameworks/Electron Helper' + helper_suffix + '.app/Contents/Info.plist', info);
65 | });
66 |
67 | // Copy icon
68 | projectDir.copy('resources/osx/icon.icns', finalAppDir.path('Contents/Resources/icon.icns'));
69 |
70 | return Q();
71 | };
72 |
73 | var renameApp = function () {
74 | // Rename helpers
75 | [' Helper EH', ' Helper NP', ' Helper'].forEach(function (helper_suffix) {
76 | finalAppDir.rename('Contents/Frameworks/Electron' + helper_suffix + '.app/Contents/MacOS/Electron' + helper_suffix, manifest.productName + helper_suffix );
77 | finalAppDir.rename('Contents/Frameworks/Electron' + helper_suffix + '.app', manifest.productName + helper_suffix + '.app');
78 | });
79 | // Rename application
80 | finalAppDir.rename('Contents/MacOS/Electron', manifest.productName);
81 | return Q();
82 | };
83 |
84 | var signApp = function () {
85 | var identity = utils.getSigningId();
86 | if (identity) {
87 | var cmd = 'codesign --deep --force --sign "' + identity + '" "' + finalAppDir.path() + '"';
88 | gulpUtil.log('Signing with:', cmd);
89 | return Q.nfcall(child_process.exec, cmd);
90 | } else {
91 | return Q();
92 | }
93 | };
94 |
95 | var packToDmgFile = function () {
96 | var deferred = Q.defer();
97 |
98 | var appdmg = require('appdmg');
99 | var dmgName = manifest.name + '_' + manifest.version + '.dmg';
100 |
101 | // Prepare appdmg config
102 | var dmgManifest = projectDir.read('resources/osx/appdmg.json');
103 | dmgManifest = utils.replace(dmgManifest, {
104 | productName: manifest.productName,
105 | appPath: finalAppDir.path(),
106 | dmgIcon: projectDir.path("resources/osx/dmg-icon.icns"),
107 | dmgBackground: projectDir.path("resources/osx/dmg-background.png")
108 | });
109 | tmpDir.write('appdmg.json', dmgManifest);
110 |
111 | // Delete DMG file with this name if already exists
112 | releasesDir.remove(dmgName);
113 |
114 | gulpUtil.log('Packaging to DMG file...');
115 |
116 | var readyDmgPath = releasesDir.path(dmgName);
117 | appdmg({
118 | source: tmpDir.path('appdmg.json'),
119 | target: readyDmgPath
120 | })
121 | .on('error', function (err) {
122 | console.error(err);
123 | })
124 | .on('finish', function () {
125 | gulpUtil.log('DMG file ready!', readyDmgPath);
126 | deferred.resolve();
127 | });
128 |
129 | return deferred.promise;
130 | };
131 |
132 | var cleanClutter = function () {
133 | return tmpDir.removeAsync('.');
134 | };
135 |
136 | module.exports = function () {
137 | return init()
138 | .then(copyRuntime)
139 | .then(cleanupRuntime)
140 | .then(packageBuiltApp)
141 | .then(finalize)
142 | .then(renameApp)
143 | .then(signApp)
144 | .then(packToDmgFile)
145 | .then(cleanClutter)
146 | .catch(console.error);
147 | };
148 |
--------------------------------------------------------------------------------
/archive/electron-boilerplate/app/vendor/jasmine/boot.js:
--------------------------------------------------------------------------------
1 | /**
2 | Starting with version 2.0, this file "boots" Jasmine, performing all of the necessary initialization before executing the loaded environment and all of a project's specs. This file should be loaded after `jasmine.js` and `jasmine_html.js`, but before any project source files or spec files are loaded. Thus this file can also be used to customize Jasmine for a project.
3 |
4 | If a project is using Jasmine via the standalone distribution, this file can be customized directly. If a project is using Jasmine via the [Ruby gem][jasmine-gem], this file can be copied into the support directory via `jasmine copy_boot_js`. Other environments (e.g., Python) will have different mechanisms.
5 |
6 | The location of `boot.js` can be specified and/or overridden in `jasmine.yml`.
7 |
8 | [jasmine-gem]: http://github.com/pivotal/jasmine-gem
9 | */
10 |
11 | (function() {
12 |
13 | /**
14 | * ## Require & Instantiate
15 | *
16 | * Require Jasmine's core files. Specifically, this requires and attaches all of Jasmine's code to the `jasmine` reference.
17 | */
18 | window.jasmine = jasmineRequire.core(jasmineRequire);
19 |
20 | /**
21 | * Since this is being run in a browser and the results should populate to an HTML page, require the HTML-specific Jasmine code, injecting the same reference.
22 | */
23 | jasmineRequire.html(jasmine);
24 |
25 | /**
26 | * Create the Jasmine environment. This is used to run all specs in a project.
27 | */
28 | var env = jasmine.getEnv();
29 |
30 | /**
31 | * ## The Global Interface
32 | *
33 | * Build up the functions that will be exposed as the Jasmine public interface. A project can customize, rename or alias any of these functions as desired, provided the implementation remains unchanged.
34 | */
35 | var jasmineInterface = jasmineRequire.interface(jasmine, env);
36 |
37 | /**
38 | * Add all of the Jasmine global/public interface to the proper global, so a project can use the public interface directly. For example, calling `describe` in specs instead of `jasmine.getEnv().describe`.
39 | */
40 | if (typeof window == "undefined" && typeof exports == "object") {
41 | extend(exports, jasmineInterface);
42 | } else {
43 | extend(window, jasmineInterface);
44 | }
45 |
46 | /**
47 | * ## Runner Parameters
48 | *
49 | * More browser specific code - wrap the query string in an object and to allow for getting/setting parameters from the runner user interface.
50 | */
51 |
52 | var queryString = new jasmine.QueryString({
53 | getWindowLocation: function() { return window.location; }
54 | });
55 |
56 | var catchingExceptions = queryString.getParam("catch");
57 | env.catchExceptions(typeof catchingExceptions === "undefined" ? true : catchingExceptions);
58 |
59 | /**
60 | * ## Reporters
61 | * The `HtmlReporter` builds all of the HTML UI for the runner page. This reporter paints the dots, stars, and x's for specs, as well as all spec names and all failures (if any).
62 | */
63 | var htmlReporter = new jasmine.HtmlReporter({
64 | env: env,
65 | onRaiseExceptionsClick: function() { queryString.navigateWithNewParam("catch", !env.catchingExceptions()); },
66 | addToExistingQueryString: function(key, value) { return queryString.fullStringWithNewParam(key, value); },
67 | getContainer: function() { return document.body; },
68 | createElement: function() { return document.createElement.apply(document, arguments); },
69 | createTextNode: function() { return document.createTextNode.apply(document, arguments); },
70 | timer: new jasmine.Timer()
71 | });
72 |
73 | /**
74 | * The `jsApiReporter` also receives spec results, and is used by any environment that needs to extract the results from JavaScript.
75 | */
76 | env.addReporter(jasmineInterface.jsApiReporter);
77 | env.addReporter(htmlReporter);
78 |
79 | /**
80 | * Filter which specs will be run by matching the start of the full name against the `spec` query param.
81 | */
82 | var specFilter = new jasmine.HtmlSpecFilter({
83 | filterString: function() { return queryString.getParam("spec"); }
84 | });
85 |
86 | env.specFilter = function(spec) {
87 | return specFilter.matches(spec.getFullName());
88 | };
89 |
90 | /**
91 | * Setting up timing functions to be able to be overridden. Certain browsers (Safari, IE 8, phantomjs) require this hack.
92 | */
93 | window.setTimeout = window.setTimeout;
94 | window.setInterval = window.setInterval;
95 | window.clearTimeout = window.clearTimeout;
96 | window.clearInterval = window.clearInterval;
97 |
98 | /**
99 | * ## Execution
100 | *
101 | * Replace the browser window's `onload`, ensure it's called, and then run all of the loaded specs. This includes initializing the `HtmlReporter` instance and then executing the loaded Jasmine environment. All of this will happen after all of the specs are loaded.
102 | */
103 | var currentWindowOnload = window.onload;
104 |
105 | window.onload = function() {
106 | if (currentWindowOnload) {
107 | currentWindowOnload();
108 | }
109 | htmlReporter.initialize();
110 | env.execute();
111 | };
112 |
113 | /**
114 | * Helper function for readability above.
115 | */
116 | function extend(destination, source) {
117 | for (var property in source) destination[property] = source[property];
118 | return destination;
119 | }
120 |
121 | }());
122 |
--------------------------------------------------------------------------------
/archive/electron-boilerplate/BOILERPLATE.md:
--------------------------------------------------------------------------------
1 | electron-boilerplate
2 | ==============
3 | Comprehensive boilerplate application for [Electron runtime](http://electron.atom.io).
4 |
5 | Scope of this project:
6 |
7 | - Provide basic structure of the application so you can much easier grasp what should go where.
8 | - Give you cross-platform development environment, which works the same way on OSX, Windows and Linux.
9 | - Generate ready for distribution installers of your app for all three operating systems.
10 |
11 | Not in the scope:
12 |
13 | - Imposing on you any framework (e.g. Angular, React). You can integrate the one which makes most sense for you.
14 |
15 | # Quick start
16 | The only development dependency of this project is [Node.js](https://nodejs.org). So just make sure you have it installed.
17 | Then type few commands known to every Node developer...
18 | ```
19 | git clone https://github.com/szwacz/electron-boilerplate.git
20 | cd electron-boilerplate
21 | npm install
22 | npm start
23 | ```
24 | ... and boom! You have running desktop application on your screen.
25 |
26 | # Structure of the project
27 |
28 | There are **two** `package.json` files:
29 |
30 | #### 1. For development
31 | Sits on path: `electron-boilerplate/package.json`. Here you declare dependencies for your development environment and build scripts. **This file is not distributed with real application!**
32 |
33 | Also here you declare the version of Electron runtime you want to use:
34 | ```json
35 | "devDependencies": {
36 | "electron-prebuilt": "^0.34.0"
37 | }
38 | ```
39 |
40 | #### 2. For your application
41 | Sits on path: `electron-boilerplate/app/package.json`. This is **real** manifest of your application. Declare your app dependencies here.
42 |
43 | #### OMG, but seriously why there are two `package.json`?
44 | 1. Native npm modules (those written in C, not JavaScript) need to be compiled, and here we have two different compilation targets for them. Those used in application need to be compiled against electron runtime, and all `devDependencies` need to be compiled against your locally installed node.js. Thanks to having two files this is trivial.
45 | 2. When you package the app for distribution there is no need to add up to size of the app with your `devDependencies`. Here those are always not included (because reside outside the `app` directory).
46 |
47 | ### Project's folders
48 |
49 | - `app` - code of your application goes here.
50 | - `config` - place where you can declare environment specific stuff for your app.
51 | - `build` - in this folder lands built, runnable application.
52 | - `releases` - ready for distribution installers will land here.
53 | - `resources` - resources needed for particular operating system.
54 | - `tasks` - build and development environment scripts.
55 |
56 |
57 | # Development
58 |
59 | #### Installation
60 |
61 | ```
62 | npm install
63 | ```
64 | It will also download Electron runtime, and install dependencies for second `package.json` file inside `app` folder.
65 |
66 | #### Starting the app
67 |
68 | ```
69 | npm start
70 | ```
71 |
72 | #### Adding npm modules to your app
73 |
74 | Remember to add your dependency to `app/package.json` file, so do:
75 | ```
76 | cd app
77 | npm install name_of_npm_module --save
78 | ```
79 |
80 | #### Native npm modules
81 |
82 | Want to use them? See [this file](./tasks/rebuild_native.js) for instructions.
83 |
84 | #### Working with modules
85 |
86 | How about being future proof and using ES6 modules all the time in your app? Thanks to [rollup](https://github.com/rollup/rollup) you can do that. It will transpile the imports to proper `require()` statements, so even though ES6 modules aren't natively supported yet you can start using them today.
87 |
88 | You can use it on those kinds of modules:
89 | ```js
90 | // Modules authored by you
91 | import { myStuff } from './my_lib/my_stuff';
92 | // Node.js native
93 | import fs from 'fs';
94 | // Electron native
95 | import { app } from 'electron';
96 | // Loaded from npm
97 | import moment from 'moment';
98 | ```
99 |
100 | #### Including files to your project
101 |
102 | The build script copies files from `app` to `build` directory and the application is started from `build`. Therefore if you want to use any special file/folder in your app make sure it will be copied via some of glob patterns in `tasks/build.js`:
103 |
104 | ```js
105 | var paths = {
106 | copyFromAppDir: [
107 | './node_modules/**',
108 | './vendor/**',
109 | './**/*.html',
110 | './**/*.+(jpg|png|svg)'
111 | ],
112 | }
113 | ```
114 |
115 | #### Unit tests
116 |
117 | electron-boilerplate has preconfigured [jasmine](http://jasmine.github.io/2.0/introduction.html) test runner. To run the tests go with standard:
118 | ```
119 | npm test
120 | ```
121 | You don't have to declare paths to spec files in any particular place. The runner will search through the project for all `*.spec.js` files and include them automatically.
122 |
123 |
124 | # Making a release
125 |
126 | **Note:** There are various icon and bitmap files in `resources` directory. Those are used in installers and are intended to be replaced by your own graphics.
127 |
128 | To make ready for distribution installer use command:
129 | ```
130 | npm run release
131 | ```
132 | It will start the packaging process for operating system you are running this command on. Ready for distribution file will be outputted to `releases` directory.
133 |
134 | You can create Windows installer only when running on Windows, the same is true for Linux and OSX. So to generate all three installers you need all three operating systems.
135 |
136 | ## Mac only
137 |
138 | #### App signing
139 |
140 | The Mac release supports [code signing](https://developer.apple.com/library/mac/documentation/Security/Conceptual/CodeSigningGuide/Procedures/Procedures.html). To sign the `.app` in the release image, include the certificate ID in the command as so,
141 | ```
142 | npm run release -- --sign A123456789
143 | ```
144 |
145 | ## Windows only
146 |
147 | #### Installer
148 |
149 | The installer is built using [NSIS](http://nsis.sourceforge.net). You have to install NSIS version 3.0, and add its folder to PATH in Environment Variables, so it is reachable to scripts in this project. For example, `C:\Program Files (x86)\NSIS`.
150 |
151 | #### 32-bit build on 64-bit Windows
152 |
153 | There are still a lot of 32-bit Windows installations in use. If you want to support those systems and have 64-bit OS make sure you've installed 32-bit (instead of 64-bit) Node version. There are [versions managers](https://github.com/coreybutler/nvm-windows) if you feel the need for both architectures on the same machine.
154 |
155 | # License
156 |
157 | The MIT License (MIT)
158 |
159 | Copyright (c) 2015-2016 Jakub Szwacz
160 |
161 | Permission is hereby granted, free of charge, to any person obtaining a copy
162 | of this software and associated documentation files (the "Software"), to deal
163 | in the Software without restriction, including without limitation the rights
164 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
165 | copies of the Software, and to permit persons to whom the Software is
166 | furnished to do so, subject to the following conditions:
167 |
168 | The above copyright notice and this permission notice shall be included in all
169 | copies or substantial portions of the Software.
170 |
171 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
172 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
173 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
174 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
175 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
176 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
177 | SOFTWARE.
178 |
--------------------------------------------------------------------------------
/archive/electron-boilerplate/app/vendor/jasmine/jasmine-html.js:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright (c) 2008-2015 Pivotal Labs
3 |
4 | Permission is hereby granted, free of charge, to any person obtaining
5 | a copy of this software and associated documentation files (the
6 | "Software"), to deal in the Software without restriction, including
7 | without limitation the rights to use, copy, modify, merge, publish,
8 | distribute, sublicense, and/or sell copies of the Software, and to
9 | permit persons to whom the Software is furnished to do so, subject to
10 | the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be
13 | included in all copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22 | */
23 | jasmineRequire.html = function(j$) {
24 | j$.ResultsNode = jasmineRequire.ResultsNode();
25 | j$.HtmlReporter = jasmineRequire.HtmlReporter(j$);
26 | j$.QueryString = jasmineRequire.QueryString();
27 | j$.HtmlSpecFilter = jasmineRequire.HtmlSpecFilter();
28 | };
29 |
30 | jasmineRequire.HtmlReporter = function(j$) {
31 |
32 | var noopTimer = {
33 | start: function() {},
34 | elapsed: function() { return 0; }
35 | };
36 |
37 | function HtmlReporter(options) {
38 | var env = options.env || {},
39 | getContainer = options.getContainer,
40 | createElement = options.createElement,
41 | createTextNode = options.createTextNode,
42 | onRaiseExceptionsClick = options.onRaiseExceptionsClick || function() {},
43 | addToExistingQueryString = options.addToExistingQueryString || defaultQueryString,
44 | timer = options.timer || noopTimer,
45 | results = [],
46 | specsExecuted = 0,
47 | failureCount = 0,
48 | pendingSpecCount = 0,
49 | htmlReporterMain,
50 | symbols,
51 | failedSuites = [];
52 |
53 | this.initialize = function() {
54 | clearPrior();
55 | htmlReporterMain = createDom('div', {className: 'jasmine_html-reporter'},
56 | createDom('div', {className: 'banner'},
57 | createDom('a', {className: 'title', href: 'http://jasmine.github.io/', target: '_blank'}),
58 | createDom('span', {className: 'version'}, j$.version)
59 | ),
60 | createDom('ul', {className: 'symbol-summary'}),
61 | createDom('div', {className: 'alert'}),
62 | createDom('div', {className: 'results'},
63 | createDom('div', {className: 'failures'})
64 | )
65 | );
66 | getContainer().appendChild(htmlReporterMain);
67 |
68 | symbols = find('.symbol-summary');
69 | };
70 |
71 | var totalSpecsDefined;
72 | this.jasmineStarted = function(options) {
73 | totalSpecsDefined = options.totalSpecsDefined || 0;
74 | timer.start();
75 | };
76 |
77 | var summary = createDom('div', {className: 'summary'});
78 |
79 | var topResults = new j$.ResultsNode({}, '', null),
80 | currentParent = topResults;
81 |
82 | this.suiteStarted = function(result) {
83 | currentParent.addChild(result, 'suite');
84 | currentParent = currentParent.last();
85 | };
86 |
87 | this.suiteDone = function(result) {
88 | if (result.status == 'failed') {
89 | failedSuites.push(result);
90 | }
91 |
92 | if (currentParent == topResults) {
93 | return;
94 | }
95 |
96 | currentParent = currentParent.parent;
97 | };
98 |
99 | this.specStarted = function(result) {
100 | currentParent.addChild(result, 'spec');
101 | };
102 |
103 | var failures = [];
104 | this.specDone = function(result) {
105 | if(noExpectations(result) && typeof console !== 'undefined' && typeof console.error !== 'undefined') {
106 | console.error('Spec \'' + result.fullName + '\' has no expectations.');
107 | }
108 |
109 | if (result.status != 'disabled') {
110 | specsExecuted++;
111 | }
112 |
113 | symbols.appendChild(createDom('li', {
114 | className: noExpectations(result) ? 'empty' : result.status,
115 | id: 'spec_' + result.id,
116 | title: result.fullName
117 | }
118 | ));
119 |
120 | if (result.status == 'failed') {
121 | failureCount++;
122 |
123 | var failure =
124 | createDom('div', {className: 'spec-detail failed'},
125 | createDom('div', {className: 'description'},
126 | createDom('a', {title: result.fullName, href: specHref(result)}, result.fullName)
127 | ),
128 | createDom('div', {className: 'messages'})
129 | );
130 | var messages = failure.childNodes[1];
131 |
132 | for (var i = 0; i < result.failedExpectations.length; i++) {
133 | var expectation = result.failedExpectations[i];
134 | messages.appendChild(createDom('div', {className: 'result-message'}, expectation.message));
135 | messages.appendChild(createDom('div', {className: 'stack-trace'}, expectation.stack));
136 | }
137 |
138 | failures.push(failure);
139 | }
140 |
141 | if (result.status == 'pending') {
142 | pendingSpecCount++;
143 | }
144 | };
145 |
146 | this.jasmineDone = function() {
147 | var banner = find('.banner');
148 | banner.appendChild(createDom('span', {className: 'duration'}, 'finished in ' + timer.elapsed() / 1000 + 's'));
149 |
150 | var alert = find('.alert');
151 |
152 | alert.appendChild(createDom('span', { className: 'exceptions' },
153 | createDom('label', { className: 'label', 'for': 'raise-exceptions' }, 'raise exceptions'),
154 | createDom('input', {
155 | className: 'raise',
156 | id: 'raise-exceptions',
157 | type: 'checkbox'
158 | })
159 | ));
160 | var checkbox = find('#raise-exceptions');
161 |
162 | checkbox.checked = !env.catchingExceptions();
163 | checkbox.onclick = onRaiseExceptionsClick;
164 |
165 | if (specsExecuted < totalSpecsDefined) {
166 | var skippedMessage = 'Ran ' + specsExecuted + ' of ' + totalSpecsDefined + ' specs - run all';
167 | alert.appendChild(
168 | createDom('span', {className: 'bar skipped'},
169 | createDom('a', {href: '?', title: 'Run all specs'}, skippedMessage)
170 | )
171 | );
172 | }
173 | var statusBarMessage = '';
174 | var statusBarClassName = 'bar ';
175 |
176 | if (totalSpecsDefined > 0) {
177 | statusBarMessage += pluralize('spec', specsExecuted) + ', ' + pluralize('failure', failureCount);
178 | if (pendingSpecCount) { statusBarMessage += ', ' + pluralize('pending spec', pendingSpecCount); }
179 | statusBarClassName += (failureCount > 0) ? 'failed' : 'passed';
180 | } else {
181 | statusBarClassName += 'skipped';
182 | statusBarMessage += 'No specs found';
183 | }
184 |
185 | alert.appendChild(createDom('span', {className: statusBarClassName}, statusBarMessage));
186 |
187 | for(i = 0; i < failedSuites.length; i++) {
188 | var failedSuite = failedSuites[i];
189 | for(var j = 0; j < failedSuite.failedExpectations.length; j++) {
190 | var errorBarMessage = 'AfterAll ' + failedSuite.failedExpectations[j].message;
191 | var errorBarClassName = 'bar errored';
192 | alert.appendChild(createDom('span', {className: errorBarClassName}, errorBarMessage));
193 | }
194 | }
195 |
196 | var results = find('.results');
197 | results.appendChild(summary);
198 |
199 | summaryList(topResults, summary);
200 |
201 | function summaryList(resultsTree, domParent) {
202 | var specListNode;
203 | for (var i = 0; i < resultsTree.children.length; i++) {
204 | var resultNode = resultsTree.children[i];
205 | if (resultNode.type == 'suite') {
206 | var suiteListNode = createDom('ul', {className: 'suite', id: 'suite-' + resultNode.result.id},
207 | createDom('li', {className: 'suite-detail'},
208 | createDom('a', {href: specHref(resultNode.result)}, resultNode.result.description)
209 | )
210 | );
211 |
212 | summaryList(resultNode, suiteListNode);
213 | domParent.appendChild(suiteListNode);
214 | }
215 | if (resultNode.type == 'spec') {
216 | if (domParent.getAttribute('class') != 'specs') {
217 | specListNode = createDom('ul', {className: 'specs'});
218 | domParent.appendChild(specListNode);
219 | }
220 | var specDescription = resultNode.result.description;
221 | if(noExpectations(resultNode.result)) {
222 | specDescription = 'SPEC HAS NO EXPECTATIONS ' + specDescription;
223 | }
224 | if(resultNode.result.status === 'pending' && resultNode.result.pendingReason !== '') {
225 | specDescription = specDescription + ' PENDING WITH MESSAGE: ' + resultNode.result.pendingReason;
226 | }
227 | specListNode.appendChild(
228 | createDom('li', {
229 | className: resultNode.result.status,
230 | id: 'spec-' + resultNode.result.id
231 | },
232 | createDom('a', {href: specHref(resultNode.result)}, specDescription)
233 | )
234 | );
235 | }
236 | }
237 | }
238 |
239 | if (failures.length) {
240 | alert.appendChild(
241 | createDom('span', {className: 'menu bar spec-list'},
242 | createDom('span', {}, 'Spec List | '),
243 | createDom('a', {className: 'failures-menu', href: '#'}, 'Failures')));
244 | alert.appendChild(
245 | createDom('span', {className: 'menu bar failure-list'},
246 | createDom('a', {className: 'spec-list-menu', href: '#'}, 'Spec List'),
247 | createDom('span', {}, ' | Failures ')));
248 |
249 | find('.failures-menu').onclick = function() {
250 | setMenuModeTo('failure-list');
251 | };
252 | find('.spec-list-menu').onclick = function() {
253 | setMenuModeTo('spec-list');
254 | };
255 |
256 | setMenuModeTo('failure-list');
257 |
258 | var failureNode = find('.failures');
259 | for (var i = 0; i < failures.length; i++) {
260 | failureNode.appendChild(failures[i]);
261 | }
262 | }
263 | };
264 |
265 | return this;
266 |
267 | function find(selector) {
268 | return getContainer().querySelector('.jasmine_html-reporter ' + selector);
269 | }
270 |
271 | function clearPrior() {
272 | // return the reporter
273 | var oldReporter = find('');
274 |
275 | if(oldReporter) {
276 | getContainer().removeChild(oldReporter);
277 | }
278 | }
279 |
280 | function createDom(type, attrs, childrenVarArgs) {
281 | var el = createElement(type);
282 |
283 | for (var i = 2; i < arguments.length; i++) {
284 | var child = arguments[i];
285 |
286 | if (typeof child === 'string') {
287 | el.appendChild(createTextNode(child));
288 | } else {
289 | if (child) {
290 | el.appendChild(child);
291 | }
292 | }
293 | }
294 |
295 | for (var attr in attrs) {
296 | if (attr == 'className') {
297 | el[attr] = attrs[attr];
298 | } else {
299 | el.setAttribute(attr, attrs[attr]);
300 | }
301 | }
302 |
303 | return el;
304 | }
305 |
306 | function pluralize(singular, count) {
307 | var word = (count == 1 ? singular : singular + 's');
308 |
309 | return '' + count + ' ' + word;
310 | }
311 |
312 | function specHref(result) {
313 | return addToExistingQueryString('spec', result.fullName);
314 | }
315 |
316 | function defaultQueryString(key, value) {
317 | return '?' + key + '=' + value;
318 | }
319 |
320 | function setMenuModeTo(mode) {
321 | htmlReporterMain.setAttribute('class', 'jasmine_html-reporter ' + mode);
322 | }
323 |
324 | function noExpectations(result) {
325 | return (result.failedExpectations.length + result.passedExpectations.length) === 0 &&
326 | result.status === 'passed';
327 | }
328 | }
329 |
330 | return HtmlReporter;
331 | };
332 |
333 | jasmineRequire.HtmlSpecFilter = function() {
334 | function HtmlSpecFilter(options) {
335 | var filterString = options && options.filterString() && options.filterString().replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
336 | var filterPattern = new RegExp(filterString);
337 |
338 | this.matches = function(specName) {
339 | return filterPattern.test(specName);
340 | };
341 | }
342 |
343 | return HtmlSpecFilter;
344 | };
345 |
346 | jasmineRequire.ResultsNode = function() {
347 | function ResultsNode(result, type, parent) {
348 | this.result = result;
349 | this.type = type;
350 | this.parent = parent;
351 |
352 | this.children = [];
353 |
354 | this.addChild = function(result, type) {
355 | this.children.push(new ResultsNode(result, type, this));
356 | };
357 |
358 | this.last = function() {
359 | return this.children[this.children.length - 1];
360 | };
361 | }
362 |
363 | return ResultsNode;
364 | };
365 |
366 | jasmineRequire.QueryString = function() {
367 | function QueryString(options) {
368 |
369 | this.navigateWithNewParam = function(key, value) {
370 | options.getWindowLocation().search = this.fullStringWithNewParam(key, value);
371 | };
372 |
373 | this.fullStringWithNewParam = function(key, value) {
374 | var paramMap = queryStringToParamMap();
375 | paramMap[key] = value;
376 | return toQueryString(paramMap);
377 | };
378 |
379 | this.getParam = function(key) {
380 | return queryStringToParamMap()[key];
381 | };
382 |
383 | return this;
384 |
385 | function toQueryString(paramMap) {
386 | var qStrPairs = [];
387 | for (var prop in paramMap) {
388 | qStrPairs.push(encodeURIComponent(prop) + '=' + encodeURIComponent(paramMap[prop]));
389 | }
390 | return '?' + qStrPairs.join('&');
391 | }
392 |
393 | function queryStringToParamMap() {
394 | var paramStr = options.getWindowLocation().search.substring(1),
395 | params = [],
396 | paramMap = {};
397 |
398 | if (paramStr.length > 0) {
399 | params = paramStr.split('&');
400 | for (var i = 0; i < params.length; i++) {
401 | var p = params[i].split('=');
402 | var value = decodeURIComponent(p[1]);
403 | if (value === 'true' || value === 'false') {
404 | value = JSON.parse(value);
405 | }
406 | paramMap[decodeURIComponent(p[0])] = value;
407 | }
408 | }
409 |
410 | return paramMap;
411 | }
412 |
413 | }
414 |
415 | return QueryString;
416 | };
417 |
--------------------------------------------------------------------------------
/archive/electron-boilerplate/app/vendor/jasmine/jasmine.css:
--------------------------------------------------------------------------------
1 | body { overflow-y: scroll; }
2 |
3 | .jasmine_html-reporter { background-color: #eee; padding: 5px; margin: -8px; font-size: 11px; font-family: Monaco, "Lucida Console", monospace; line-height: 14px; color: #333; }
4 | .jasmine_html-reporter a { text-decoration: none; }
5 | .jasmine_html-reporter a:hover { text-decoration: underline; }
6 | .jasmine_html-reporter p, .jasmine_html-reporter h1, .jasmine_html-reporter h2, .jasmine_html-reporter h3, .jasmine_html-reporter h4, .jasmine_html-reporter h5, .jasmine_html-reporter h6 { margin: 0; line-height: 14px; }
7 | .jasmine_html-reporter .banner, .jasmine_html-reporter .symbol-summary, .jasmine_html-reporter .summary, .jasmine_html-reporter .result-message, .jasmine_html-reporter .spec .description, .jasmine_html-reporter .spec-detail .description, .jasmine_html-reporter .alert .bar, .jasmine_html-reporter .stack-trace { padding-left: 9px; padding-right: 9px; }
8 | .jasmine_html-reporter .banner { position: relative; }
9 | .jasmine_html-reporter .banner .title { background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFoAAAAZCAMAAACGusnyAAACdlBMVEX/////AP+AgICqVaqAQICZM5mAVYCSSZKAQICOOY6ATYCLRouAQICJO4mSSYCIRIiPQICHPIeOR4CGQ4aMQICGPYaLRoCFQ4WKQICPPYWJRYCOQoSJQICNPoSIRICMQoSHQICHRICKQoOHQICKPoOJO4OJQYOMQICMQ4CIQYKLQICIPoKLQ4CKQICNPoKJQISMQ4KJQoSLQYKJQISLQ4KIQoSKQYKIQICIQISMQoSKQYKLQIOLQoOJQYGLQIOKQIOMQoGKQYOLQYGKQIOLQoGJQYOJQIOKQYGJQIOKQoGKQIGLQIKLQ4KKQoGLQYKJQIGKQYKJQIGKQIKJQoGKQYKLQIGKQYKLQIOJQoKKQoOJQYKKQIOJQoKKQoOKQIOLQoKKQYOLQYKJQIOKQoKKQYKKQoKJQYOKQYKLQIOKQoKLQYOKQYKLQIOJQoGKQYKJQYGJQoGKQYKLQoGLQYGKQoGJQYKKQYGJQIKKQoGJQYKLQIKKQYGLQYKKQYGKQYGKQYKJQYOKQoKJQYOKQYKLQYOLQYOKQYKLQYOKQoKKQYKKQYOKQYOJQYKKQYKLQYKKQIKKQoKKQYKKQYKKQoKJQIKKQYKLQYKKQYKKQIKKQYKKQYKKQYKKQIKKQYKJQYGLQYGKQYKKQYKKQYGKQIKKQYGKQYOJQoKKQYOLQYKKQYOKQoKKQYKKQoKKQYKKQYKJQYKLQYKKQYKKQYKKQYKKQYKKQYKKQYKKQYKKQYKJQYKKQYKKQYKKQYKKQYKKQYKKQYKKQYKKQYKKQYKKQYKKQYKLQYKKQYKKQYKKQYKKQYKKQYKKQYKKQYKKQYKKQYKKQYKKQYKKQYKmIDpEAAAA0XRSTlMAAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAiIyQlJycoKissLS4wMTQ1Njc4OTo7PDw+P0BCQ0RISUpLTE1OUFNUVVdYWFlaW15fYGFiY2ZnaGlqa2xtb3BxcnN0dnh5ent8fX5/gIGChIWIioyNjo+QkZOUlZaYmZqbnJ2eoKGio6WmqKmsra6vsLGztre4ubq7vL2+wMHDxMjJysvNzs/Q0dLU1tfY2dvc3t/g4eLj5ebn6Onq6+zt7u/w8vP09fb3+Pn6+/z9/vkVQXAAAAMaSURBVHhe5dXxV1N1GMfxz2ABbDgIAm5VDJOyVDIJLUMaVpBWUZUaGbmqoGpZRSiGiRWp6KoZ5AB0ZY50RImZQIlahKkMYXv/R90dBvET/rJfOr3Ouc8v99zPec59zvf56j+vYKlViSf7250X4Mr3O29Tgq08BdGB4DhcekEJ5YkQKFsgWZdtj9JpV+I8xPjLFqkrsEIqO8PHSpis36jWazcqjEsfJjkvRssVU37SdIOu4XCf5vEJPsnwJpnRNU9JmxhMk8l1gehIrq7hTFjzOD+Vf88629qKMJVNltInFeRexRQyJlNeqd1iGDlSzrIUIyXbyFfm3RYprcQRe7lqtWyGYbfc6dT0R2vmdOOkX3u55C1rP37ftiH+tDby4r/RBT0w8TyEkr+epB9XgPDmSYYWbrhCuFYaIyw3fDQAXTnSkh+ANofiHmWf9l+FY1I90FdQTetstO00o23novzVsJ7uB3/C5TkbjRwZ5JerwV4iRWq9HFbFMaK/d0TYqayRiQPuIxxS3Bu8JWU90/60tKi7vkhaznez0a/TbVOKj5CaOZh6fWG6/Lyv9B/ZLR1gw/S/fpbeVD3MCW1li6SvWDOn65tr99/uvWtBS0XDm4s1t+sOHpG0kpBKx/l77wOSnxLpcx6TXmXLTPQOKYOf9Q1dfr8/SJ2mFdCvl1Yl93DiHUZvXeLJbGSzYu5gVJ2slbSakOR8dxCq5adQ2oFLqsE9Ex3L4qQO0eOPeU5x56bypXp4onSEb5OkICX6lDat55TeoztNKQcJaakrz9KCb95oD69IKq+yKW4XPjknaS52V0TZqE2cTtXjcHSCRmUO88e+85hj3EP74i9p8pylw7lxgMDyyl6OV7ZejnjNMfatu87LxRbH0IS35gt2a4ZjmGpVBdKK3Wr6INk8jWWSGqbA55CKgjBRC6E9w78ydTg3ABS3AFV1QN0Y4Aa2pgEjWnQURj9L0ayK6R2ysEqxHUKzYnLvvyU+i9KM2JHJzE4vyZOyDcOwOsySajeLPc8sNvPJkFlyJd20wpqAzZeAfZ3oWybxd+P/3j+SG3uSBdf2VQAAAABJRU5ErkJggg==') no-repeat; background: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgdmVyc2lvbj0iMS4xIgogICB3aWR0aD0iNjgxLjk2MjUyIgogICBoZWlnaHQ9IjE4Ny41IgogICBpZD0ic3ZnMiIKICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhOCI+PHJkZjpSREY+PGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPjxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PjxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz48L2NjOldvcms+PC9yZGY6UkRGPjwvbWV0YWRhdGE+PGRlZnMKICAgICBpZD0iZGVmczYiPjxjbGlwUGF0aAogICAgICAgaWQ9ImNsaXBQYXRoMTgiPjxwYXRoCiAgICAgICAgIGQ9Ik0gMCwxNTAwIDAsMCBsIDU0NTUuNzQsMCAwLDE1MDAgTCAwLDE1MDAgeiIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgaWQ9InBhdGgyMCIgLz48L2NsaXBQYXRoPjwvZGVmcz48ZwogICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMjUsMCwwLC0xLjI1LDAsMTg3LjUpIgogICAgIGlkPSJnMTAiPjxnCiAgICAgICB0cmFuc2Zvcm09InNjYWxlKDAuMSwwLjEpIgogICAgICAgaWQ9ImcxMiI+PGcKICAgICAgICAgaWQ9ImcxNCI+PGcKICAgICAgICAgICBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgxOCkiCiAgICAgICAgICAgaWQ9ImcxNiI+PHBhdGgKICAgICAgICAgICAgIGQ9Im0gMTU0NCw1OTkuNDM0IGMgMC45MiwtNDAuMzUyIDI1LjY4LC04MS42MDIgNzEuNTMsLTgxLjYwMiAyNy41MSwwIDQ3LjY4LDEyLjgzMiA2MS40NCwzNS43NTQgMTIuODMsMjIuOTMgMTIuODMsNTYuODUyIDEyLjgzLDgyLjUyNyBsIDAsMzI5LjE4NCAtNzEuNTIsMCAwLDEwNC41NDMgMjY2LjgzLDAgMCwtMTA0LjU0MyAtNzAuNiwwIDAsLTM0NC43NyBjIDAsLTU4LjY5MSAtMy42OCwtMTA0LjUzMSAtNDQuOTMsLTE1Mi4yMTggLTM2LjY4LC00Mi4xOCAtOTYuMjgsLTY2LjAyIC0xNTMuMTQsLTY2LjAyIC0xMTcuMzcsMCAtMjA3LjI0LDc3Ljk0MSAtMjAyLjY0LDE5Ny4xNDUgbCAxMzAuMiwwIgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoMjIiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjxwYXRoCiAgICAgICAgICAgICBkPSJtIDIzMDEuNCw2NjIuNjk1IGMgMCw4MC43MDMgLTY2Ljk0LDE0NS44MTMgLTE0Ny42MywxNDUuODEzIC04My40NCwwIC0xNDcuNjMsLTY4Ljc4MSAtMTQ3LjYzLC0xNTEuMzAxIDAsLTc5Ljc4NSA2Ni45NCwtMTQ1LjgwMSAxNDUuOCwtMTQ1LjgwMSA4NC4zNSwwIDE0OS40Niw2Ny44NTIgMTQ5LjQ2LDE1MS4yODkgeiBtIC0xLjgzLC0xODEuNTQ3IGMgLTM1Ljc3LC01NC4wOTcgLTkzLjUzLC03OC44NTkgLTE1Ny43MiwtNzguODU5IC0xNDAuMywwIC0yNTEuMjQsMTE2LjQ0OSAtMjUxLjI0LDI1NC45MTggMCwxNDIuMTI5IDExMy43LDI2MC40MSAyNTYuNzQsMjYwLjQxIDYzLjI3LDAgMTE4LjI5LC0yOS4zMzYgMTUyLjIyLC04Mi41MjMgbCAwLDY5LjY4NyAxNzUuMTQsMCAwLC0xMDQuNTI3IC02MS40NCwwIDAsLTI4MC41OTggNjEuNDQsMCAwLC0xMDQuNTI3IC0xNzUuMTQsMCAwLDY2LjAxOSIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDI0IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0ibSAyNjIyLjMzLDU1Ny4yNTggYyAzLjY3LC00NC4wMTYgMzMuMDEsLTczLjM0OCA3OC44NiwtNzMuMzQ4IDMzLjkzLDAgNjYuOTMsMjMuODI0IDY2LjkzLDYwLjUwNCAwLDQ4LjYwNiAtNDUuODQsNTYuODU2IC04My40NCw2Ni45NDEgLTg1LjI4LDIyLjAwNCAtMTc4LjgxLDQ4LjYwNiAtMTc4LjgxLDE1NS44NzkgMCw5My41MzYgNzguODYsMTQ3LjYzMyAxNjUuOTgsMTQ3LjYzMyA0NCwwIDgzLjQzLC05LjE3NiAxMTAuOTQsLTQ0LjAwOCBsIDAsMzMuOTIyIDgyLjUzLDAgMCwtMTMyLjk2NSAtMTA4LjIxLDAgYyAtMS44MywzNC44NTYgLTI4LjQyLDU3Ljc3NCAtNjMuMjYsNTcuNzc0IC0zMC4yNiwwIC02Mi4zNSwtMTcuNDIyIC02Mi4zNSwtNTEuMzQ4IDAsLTQ1Ljg0NyA0NC45MywtNTUuOTMgODAuNjksLTY0LjE4IDg4LjAyLC0yMC4xNzUgMTgyLjQ3LC00Ny42OTUgMTgyLjQ3LC0xNTcuNzM0IDAsLTk5LjAyNyAtODMuNDQsLTE1NC4wMzkgLTE3NS4xMywtMTU0LjAzOSAtNDkuNTMsMCAtOTQuNDYsMTUuNTgyIC0xMjYuNTUsNTMuMTggbCAwLC00MC4zNCAtODUuMjcsMCAwLDE0Mi4xMjkgMTE0LjYyLDAiCiAgICAgICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICAgICAgaWQ9InBhdGgyNiIKICAgICAgICAgICAgIHN0eWxlPSJmaWxsOiM4YTQxODI7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIC8+PHBhdGgKICAgICAgICAgICAgIGQ9Im0gMjk4OC4xOCw4MDAuMjU0IC02My4yNiwwIDAsMTA0LjUyNyAxNjUuMDUsMCAwLC03My4zNTUgYyAzMS4xOCw1MS4zNDcgNzguODYsODUuMjc3IDE0MS4yMSw4NS4yNzcgNjcuODUsMCAxMjQuNzEsLTQxLjI1OCAxNTIuMjEsLTEwMi42OTkgMjYuNiw2Mi4zNTEgOTIuNjIsMTAyLjY5OSAxNjAuNDcsMTAyLjY5OSA1My4xOSwwIDEwNS40NiwtMjIgMTQxLjIxLC02Mi4zNTEgMzguNTIsLTQ0LjkzOCAzOC41MiwtOTMuNTMyIDM4LjUyLC0xNDkuNDU3IGwgMCwtMTg1LjIzOSA2My4yNywwIDAsLTEwNC41MjcgLTIzOC40MiwwIDAsMTA0LjUyNyA2My4yOCwwIDAsMTU3LjcxNSBjIDAsMzIuMTAyIDAsNjAuNTI3IC0xNC42Nyw4OC45NTcgLTE4LjM0LDI2LjU4MiAtNDguNjEsNDAuMzQ0IC03OS43Nyw0MC4zNDQgLTMwLjI2LDAgLTYzLjI4LC0xMi44NDQgLTgyLjUzLC0zNi42NzIgLTIyLjkzLC0yOS4zNTUgLTIyLjkzLC01Ni44NjMgLTIyLjkzLC05Mi42MjkgbCAwLC0xNTcuNzE1IDYzLjI3LDAgMCwtMTA0LjUyNyAtMjM4LjQxLDAgMCwxMDQuNTI3IDYzLjI4LDAgMCwxNTAuMzgzIGMgMCwyOS4zNDggMCw2Ni4wMjMgLTE0LjY3LDkxLjY5OSAtMTUuNTksMjkuMzM2IC00Ny42OSw0NC45MzQgLTgwLjcsNDQuOTM0IC0zMS4xOCwwIC01Ny43NywtMTEuMDA4IC03Ny45NCwtMzUuNzc0IC0yNC43NywtMzAuMjUzIC0yNi42LC02Mi4zNDMgLTI2LjYsLTk5Ljk0MSBsIDAsLTE1MS4zMDEgNjMuMjcsMCAwLC0xMDQuNTI3IC0yMzguNCwwIDAsMTA0LjUyNyA2My4yNiwwIDAsMjgwLjU5OCIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDI4IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0ibSAzOTk4LjY2LDk1MS41NDcgLTExMS44NywwIDAsMTE4LjI5MyAxMTEuODcsMCAwLC0xMTguMjkzIHogbSAwLC00MzEuODkxIDYzLjI3LDAgMCwtMTA0LjUyNyAtMjM5LjMzLDAgMCwxMDQuNTI3IDY0LjE5LDAgMCwyODAuNTk4IC02My4yNywwIDAsMTA0LjUyNyAxNzUuMTQsMCAwLC0zODUuMTI1IgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoMzAiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjxwYXRoCiAgICAgICAgICAgICBkPSJtIDQxNTkuMTIsODAwLjI1NCAtNjMuMjcsMCAwLDEwNC41MjcgMTc1LjE0LDAgMCwtNjkuNjg3IGMgMjkuMzUsNTQuMTAxIDg0LjM2LDgwLjY5OSAxNDQuODcsODAuNjk5IDUzLjE5LDAgMTA1LjQ1LC0yMi4wMTYgMTQxLjIyLC02MC41MjcgNDAuMzQsLTQ0LjkzNCA0MS4yNiwtODguMDMyIDQxLjI2LC0xNDMuOTU3IGwgMCwtMTkxLjY1MyA2My4yNywwIDAsLTEwNC41MjcgLTIzOC40LDAgMCwxMDQuNTI3IDYzLjI2LDAgMCwxNTguNjM3IGMgMCwzMC4yNjIgMCw2MS40MzQgLTE5LjI2LDg4LjAzNSAtMjAuMTcsMjYuNTgyIC01My4xOCwzOS40MTQgLTg2LjE5LDM5LjQxNCAtMzMuOTMsMCAtNjguNzcsLTEzLjc1IC04OC45NCwtNDEuMjUgLTIxLjA5LC0yNy41IC0yMS4wOSwtNjkuNjg3IC0yMS4wOSwtMTAyLjcwNyBsIDAsLTE0Mi4xMjkgNjMuMjYsMCAwLC0xMDQuNTI3IC0yMzguNCwwIDAsMTA0LjUyNyA2My4yNywwIDAsMjgwLjU5OCIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDMyIgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0ibSA1MDgyLjQ4LDcwMy45NjUgYyAtMTkuMjQsNzAuNjA1IC04MS42LDExNS41NDcgLTE1NC4wNCwxMTUuNTQ3IC02Ni4wNCwwIC0xMjkuMywtNTEuMzQ4IC0xNDMuMDUsLTExNS41NDcgbCAyOTcuMDksMCB6IG0gODUuMjcsLTE0NC44ODMgYyAtMzguNTEsLTkzLjUyMyAtMTI5LjI3LC0xNTYuNzkzIC0yMzEuMDUsLTE1Ni43OTMgLTE0My4wNywwIC0yNTcuNjgsMTExLjg3MSAtMjU3LjY4LDI1NS44MzYgMCwxNDQuODgzIDEwOS4xMiwyNjEuMzI4IDI1NC45MSwyNjEuMzI4IDY3Ljg3LDAgMTM1LjcyLC0zMC4yNTggMTgzLjM5LC03OC44NjMgNDguNjIsLTUxLjM0NCA2OC43OSwtMTEzLjY5NSA2OC43OSwtMTgzLjM4MyBsIC0zLjY3LC0zOS40MzQgLTM5Ni4xMywwIGMgMTQuNjcsLTY3Ljg2MyA3Ny4wMywtMTE3LjM2MyAxNDYuNzIsLTExNy4zNjMgNDguNTksMCA5MC43NiwxOC4zMjggMTE4LjI4LDU4LjY3MiBsIDExNi40NCwwIgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoMzQiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjxwYXRoCiAgICAgICAgICAgICBkPSJtIDY5MC44OTUsODUwLjcwMyA5MC43NSwwIDIyLjU0MywzMS4wMzUgMCwyNDMuMTIyIC0xMzUuODI5LDAgMCwtMjQzLjE0MSAyMi41MzYsLTMxLjAxNiIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDM2IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0ibSA2MzIuMzk1LDc0Mi4yNTggMjguMDM5LDg2LjMwNCAtMjIuNTUxLDMxLjA0IC0yMzEuMjIzLDc1LjEyOCAtNDEuOTc2LC0xMjkuMTgzIDIzMS4yNTcsLTc1LjEzNyAzNi40NTQsMTEuODQ4IgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoMzgiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjxwYXRoCiAgICAgICAgICAgICBkPSJtIDcxNy40NDksNjUzLjEwNSAtNzMuNDEsNTMuMzYgLTM2LjQ4OCwtMTEuODc1IC0xNDIuOTAzLC0xOTYuNjkyIDEwOS44ODMsLTc5LjgyOCAxNDIuOTE4LDE5Ni43MDMgMCwzOC4zMzIiCiAgICAgICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICAgICAgaWQ9InBhdGg0MCIKICAgICAgICAgICAgIHN0eWxlPSJmaWxsOiM4YTQxODI7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIC8+PHBhdGgKICAgICAgICAgICAgIGQ9Im0gODI4LjUyLDcwNi40NjUgLTczLjQyNiwtNTMuMzQgMC4wMTEsLTM4LjM1OSBMIDg5OC4wMDQsNDE4LjA3IDEwMDcuOSw0OTcuODk4IDg2NC45NzMsNjk0LjYwOSA4MjguNTIsNzA2LjQ2NSIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDQyIgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0ibSA4MTIuMDg2LDgyOC41ODYgMjguMDU1LC04Ni4zMiAzNi40ODQsLTExLjgzNiAyMzEuMjI1LDc1LjExNyAtNDEuOTcsMTI5LjE4MyAtMjMxLjIzOSwtNzUuMTQgLTIyLjU1NSwtMzEuMDA0IgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoNDQiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjxwYXRoCiAgICAgICAgICAgICBkPSJtIDczNi4zMDEsMTMzNS44OCBjIC0zMjMuMDQ3LDAgLTU4NS44NzUsLTI2Mi43OCAtNTg1Ljg3NSwtNTg1Ljc4MiAwLC0zMjMuMTE4IDI2Mi44MjgsLTU4NS45NzcgNTg1Ljg3NSwtNTg1Ljk3NyAzMjMuMDE5LDAgNTg1LjgwOSwyNjIuODU5IDU4NS44MDksNTg1Ljk3NyAwLDMyMy4wMDIgLTI2Mi43OSw1ODUuNzgyIC01ODUuODA5LDU4NS43ODIgbCAwLDAgeiBtIDAsLTExOC42MSBjIDI1Ny45NzIsMCA0NjcuMTg5LC0yMDkuMTMgNDY3LjE4OSwtNDY3LjE3MiAwLC0yNTguMTI5IC0yMDkuMjE3LC00NjcuMzQ4IC00NjcuMTg5LC00NjcuMzQ4IC0yNTguMDc0LDAgLTQ2Ny4yNTQsMjA5LjIxOSAtNDY3LjI1NCw0NjcuMzQ4IDAsMjU4LjA0MiAyMDkuMTgsNDY3LjE3MiA0NjcuMjU0LDQ2Ny4xNzIiCiAgICAgICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICAgICAgaWQ9InBhdGg0NiIKICAgICAgICAgICAgIHN0eWxlPSJmaWxsOiM4YTQxODI7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIC8+PHBhdGgKICAgICAgICAgICAgIGQ9Im0gMTA5MS4xMyw2MTkuODgzIC0xNzUuNzcxLDU3LjEyMSAxMS42MjksMzUuODA4IDE3NS43NjIsLTU3LjEyMSAtMTEuNjIsLTM1LjgwOCIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDQ4IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0iTSA4NjYuOTU3LDkwMi4wNzQgODM2LjUsOTI0LjE5OSA5NDUuMTIxLDEwNzMuNzMgOTc1LjU4NiwxMDUxLjYxIDg2Ni45NTcsOTAyLjA3NCIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDUwIgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0iTSA2MDcuNDY1LDkwMy40NDUgNDk4Ljg1NSwxMDUyLjk3IDUyOS4zMiwxMDc1LjEgNjM3LjkzLDkyNS41NjYgNjA3LjQ2NSw5MDMuNDQ1IgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoNTIiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjxwYXRoCiAgICAgICAgICAgICBkPSJtIDM4MC42ODgsNjIyLjEyOSAtMTEuNjI2LDM1LjgwMSAxNzUuNzU4LDU3LjA5IDExLjYyMSwtMzUuODAxIC0xNzUuNzUzLC01Ny4wOSIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDU0IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0ibSA3MTYuMjg5LDM3Ni41OSAzNy42NDA2LDAgMCwxODQuODE2IC0zNy42NDA2LDAgMCwtMTg0LjgxNiB6IgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoNTYiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjwvZz48L2c+PC9nPjwvZz48L3N2Zz4=') no-repeat, none; -moz-background-size: 100%; -o-background-size: 100%; -webkit-background-size: 100%; background-size: 100%; display: block; float: left; width: 90px; height: 25px; }
10 | .jasmine_html-reporter .banner .version { margin-left: 14px; position: relative; top: 6px; }
11 | .jasmine_html-reporter .banner .duration { position: absolute; right: 14px; top: 6px; }
12 | .jasmine_html-reporter #jasmine_content { position: fixed; right: 100%; }
13 | .jasmine_html-reporter .version { color: #aaa; }
14 | .jasmine_html-reporter .banner { margin-top: 14px; }
15 | .jasmine_html-reporter .duration { color: #aaa; float: right; }
16 | .jasmine_html-reporter .symbol-summary { overflow: hidden; *zoom: 1; margin: 14px 0; }
17 | .jasmine_html-reporter .symbol-summary li { display: inline-block; height: 8px; width: 14px; font-size: 16px; }
18 | .jasmine_html-reporter .symbol-summary li.passed { font-size: 14px; }
19 | .jasmine_html-reporter .symbol-summary li.passed:before { color: #007069; content: "\02022"; }
20 | .jasmine_html-reporter .symbol-summary li.failed { line-height: 9px; }
21 | .jasmine_html-reporter .symbol-summary li.failed:before { color: #ca3a11; content: "\d7"; font-weight: bold; margin-left: -1px; }
22 | .jasmine_html-reporter .symbol-summary li.disabled { font-size: 14px; }
23 | .jasmine_html-reporter .symbol-summary li.disabled:before { color: #bababa; content: "\02022"; }
24 | .jasmine_html-reporter .symbol-summary li.pending { line-height: 17px; }
25 | .jasmine_html-reporter .symbol-summary li.pending:before { color: #ba9d37; content: "*"; }
26 | .jasmine_html-reporter .symbol-summary li.empty { font-size: 14px; }
27 | .jasmine_html-reporter .symbol-summary li.empty:before { color: #ba9d37; content: "\02022"; }
28 | .jasmine_html-reporter .exceptions { color: #fff; float: right; margin-top: 5px; margin-right: 5px; }
29 | .jasmine_html-reporter .bar { line-height: 28px; font-size: 14px; display: block; color: #eee; }
30 | .jasmine_html-reporter .bar.failed { background-color: #ca3a11; }
31 | .jasmine_html-reporter .bar.passed { background-color: #007069; }
32 | .jasmine_html-reporter .bar.skipped { background-color: #bababa; }
33 | .jasmine_html-reporter .bar.errored { background-color: #ca3a11; }
34 | .jasmine_html-reporter .bar.menu { background-color: #fff; color: #aaa; }
35 | .jasmine_html-reporter .bar.menu a { color: #333; }
36 | .jasmine_html-reporter .bar a { color: white; }
37 | .jasmine_html-reporter.spec-list .bar.menu.failure-list, .jasmine_html-reporter.spec-list .results .failures { display: none; }
38 | .jasmine_html-reporter.failure-list .bar.menu.spec-list, .jasmine_html-reporter.failure-list .summary { display: none; }
39 | .jasmine_html-reporter .running-alert { background-color: #666; }
40 | .jasmine_html-reporter .results { margin-top: 14px; }
41 | .jasmine_html-reporter.showDetails .summaryMenuItem { font-weight: normal; text-decoration: inherit; }
42 | .jasmine_html-reporter.showDetails .summaryMenuItem:hover { text-decoration: underline; }
43 | .jasmine_html-reporter.showDetails .detailsMenuItem { font-weight: bold; text-decoration: underline; }
44 | .jasmine_html-reporter.showDetails .summary { display: none; }
45 | .jasmine_html-reporter.showDetails #details { display: block; }
46 | .jasmine_html-reporter .summaryMenuItem { font-weight: bold; text-decoration: underline; }
47 | .jasmine_html-reporter .summary { margin-top: 14px; }
48 | .jasmine_html-reporter .summary ul { list-style-type: none; margin-left: 14px; padding-top: 0; padding-left: 0; }
49 | .jasmine_html-reporter .summary ul.suite { margin-top: 7px; margin-bottom: 7px; }
50 | .jasmine_html-reporter .summary li.passed a { color: #007069; }
51 | .jasmine_html-reporter .summary li.failed a { color: #ca3a11; }
52 | .jasmine_html-reporter .summary li.empty a { color: #ba9d37; }
53 | .jasmine_html-reporter .summary li.pending a { color: #ba9d37; }
54 | .jasmine_html-reporter .description + .suite { margin-top: 0; }
55 | .jasmine_html-reporter .suite { margin-top: 14px; }
56 | .jasmine_html-reporter .suite a { color: #333; }
57 | .jasmine_html-reporter .failures .spec-detail { margin-bottom: 28px; }
58 | .jasmine_html-reporter .failures .spec-detail .description { background-color: #ca3a11; }
59 | .jasmine_html-reporter .failures .spec-detail .description a { color: white; }
60 | .jasmine_html-reporter .result-message { padding-top: 14px; color: #333; white-space: pre; }
61 | .jasmine_html-reporter .result-message span.result { display: block; }
62 | .jasmine_html-reporter .stack-trace { margin: 5px 0 0 0; max-height: 224px; overflow: auto; line-height: 18px; color: #666; border: 1px solid #ddd; background: white; white-space: pre; }
63 |
--------------------------------------------------------------------------------
/archive/chrome-app-prototype/js/bootstrap.min.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap v3.3.6 (http://getbootstrap.com)
3 | * Copyright 2011-2015 Twitter, Inc.
4 | * Licensed under the MIT license
5 | */
6 | if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1||b[0]>2)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 3")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.6",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.6",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")?(c.prop("checked")&&(a=!1),b.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==c.prop("type")&&(c.prop("checked")!==this.$element.hasClass("active")&&(a=!1),this.$element.toggleClass("active")),c.prop("checked",this.$element.hasClass("active")),a&&c.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),a(c.target).is('input[type="radio"]')||a(c.target).is('input[type="checkbox"]')||c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.6",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.6",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function c(c){c&&3===c.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=b(d),f={relatedTarget:this};e.hasClass("open")&&(c&&"click"==c.type&&/input|textarea/i.test(c.target.tagName)&&a.contains(e[0],c.target)||(e.trigger(c=a.Event("hide.bs.dropdown",f)),c.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger(a.Event("hidden.bs.dropdown",f)))))}))}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.6",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=b(e),g=f.hasClass("open");if(c(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click",c);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger(a.Event("shown.bs.dropdown",h))}return!1}},g.prototype.keydown=function(c){if(/(38|40|27|32)/.test(c.which)&&!/input|textarea/i.test(c.target.tagName)){var d=a(this);if(c.preventDefault(),c.stopPropagation(),!d.is(".disabled, :disabled")){var e=b(d),g=e.hasClass("open");if(!g&&27!=c.which||g&&27==c.which)return 27==c.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find(".dropdown-menu"+h);if(i.length){var j=i.index(c.target);38==c.which&&j>0&&j--,40==c.which&&jdocument.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth
',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(a.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusin"==b.type?"focus":"hover"]=!0),c.tip().hasClass("in")||"in"==c.hoverState?void(c.hoverState="in"):(clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.isInStateTrue=function(){for(var a in this.inState)if(this.inState[a])return!0;return!1},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusout"==b.type?"focus":"hover"]=!1),c.isInStateTrue()?void 0:(clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide())},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.getPosition(this.$viewport);h="bottom"==h&&k.bottom+m>o.bottom?"top":"top"==h&&k.top-mo.width?"left":"left"==h&&k.left-lg.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;jg.right&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){if(!this.$tip&&(this.$tip=a(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),b?(c.inState.click=!c.inState.click,c.isInStateTrue()?c.enter(c):c.leave(c)):c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type),a.$tip&&a.$tip.detach(),a.$tip=null,a.$arrow=null,a.$viewport=null})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.6",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.6",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b=e[a]&&(void 0===e[a+1]||b .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.6",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return c>e?"top":!1;if("bottom"==this.affixed)return null!=c?e+this.unpin<=f.top?!1:"bottom":a-d>=e+g?!1:"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&c>=e?"top":null!=d&&i+j>=a-d?"bottom":!1},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=Math.max(a(document).height(),a(document.body).height());"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery);
--------------------------------------------------------------------------------
/archive/electron-boilerplate/app/vendor/bootstrap.min.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap v3.3.6 (http://getbootstrap.com)
3 | * Copyright 2011-2015 Twitter, Inc.
4 | * Licensed under the MIT license
5 | */
6 | if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1||b[0]>2)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 3")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.6",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.6",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")?(c.prop("checked")&&(a=!1),b.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==c.prop("type")&&(c.prop("checked")!==this.$element.hasClass("active")&&(a=!1),this.$element.toggleClass("active")),c.prop("checked",this.$element.hasClass("active")),a&&c.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),a(c.target).is('input[type="radio"]')||a(c.target).is('input[type="checkbox"]')||c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.6",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.6",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function c(c){c&&3===c.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=b(d),f={relatedTarget:this};e.hasClass("open")&&(c&&"click"==c.type&&/input|textarea/i.test(c.target.tagName)&&a.contains(e[0],c.target)||(e.trigger(c=a.Event("hide.bs.dropdown",f)),c.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger(a.Event("hidden.bs.dropdown",f)))))}))}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.6",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=b(e),g=f.hasClass("open");if(c(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click",c);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger(a.Event("shown.bs.dropdown",h))}return!1}},g.prototype.keydown=function(c){if(/(38|40|27|32)/.test(c.which)&&!/input|textarea/i.test(c.target.tagName)){var d=a(this);if(c.preventDefault(),c.stopPropagation(),!d.is(".disabled, :disabled")){var e=b(d),g=e.hasClass("open");if(!g&&27!=c.which||g&&27==c.which)return 27==c.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find(".dropdown-menu"+h);if(i.length){var j=i.index(c.target);38==c.which&&j>0&&j--,40==c.which&&jdocument.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth
',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(a.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusin"==b.type?"focus":"hover"]=!0),c.tip().hasClass("in")||"in"==c.hoverState?void(c.hoverState="in"):(clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.isInStateTrue=function(){for(var a in this.inState)if(this.inState[a])return!0;return!1},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusout"==b.type?"focus":"hover"]=!1),c.isInStateTrue()?void 0:(clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide())},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.getPosition(this.$viewport);h="bottom"==h&&k.bottom+m>o.bottom?"top":"top"==h&&k.top-mo.width?"left":"left"==h&&k.left-lg.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;jg.right&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){if(!this.$tip&&(this.$tip=a(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),b?(c.inState.click=!c.inState.click,c.isInStateTrue()?c.enter(c):c.leave(c)):c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type),a.$tip&&a.$tip.detach(),a.$tip=null,a.$arrow=null,a.$viewport=null})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.6",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.6",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b=e[a]&&(void 0===e[a+1]||b .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.6",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return c>e?"top":!1;if("bottom"==this.affixed)return null!=c?e+this.unpin<=f.top?!1:"bottom":a-d>=e+g?!1:"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&c>=e?"top":null!=d&&i+j>=a-d?"bottom":!1},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=Math.max(a(document).height(),a(document.body).height());"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery);
--------------------------------------------------------------------------------