diff --git a/.DS_Store b/.DS_Store
index d56ec1c..1f9c928 100644
Binary files a/.DS_Store and b/.DS_Store differ
diff --git a/.babelrc b/.babelrc
new file mode 100644
index 0000000..02f08fb
--- /dev/null
+++ b/.babelrc
@@ -0,0 +1,5 @@
+{
+ "presets": [
+ "es2015"
+ ]
+}
\ No newline at end of file
diff --git a/.eslintrc b/.eslintrc
new file mode 100644
index 0000000..3710412
--- /dev/null
+++ b/.eslintrc
@@ -0,0 +1,19 @@
+env:
+ node: true
+ shared-node-browser: true
+extends: 'eslint:recommended'
+rules:
+ indent:
+ - warn
+ - 2
+ quotes:
+ - error
+ - single
+ semi:
+ - error
+ - always
+ no-console: 0
+ no-unused-vars:
+ - warn
+plugins:
+ - standard
\ No newline at end of file
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..17e9fcf
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,9 @@
+# Default for those who don't have core.autocrlf set
+* text=auto
+
+src/**/*.* filter=git-crypt diff=git-crypt
+.gulp/**/*.* filter=git-crypt diff=git-crypt
+extensions/**/*.ts filter=git-crypt diff=git-crypt
+
+# Fix for GitHub Linguist to avoid treating this project as C++ repo
+test/* linguist-vendored
diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md
new file mode 100644
index 0000000..62bad1c
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE.md
@@ -0,0 +1,2 @@
+
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..2287f0c
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,10 @@
+*.log
+*.~lock
+*.js
+**/*.map
+*.gulp/**.js
+dist/
+node_modules/
+.DS_Store
+/themes
+/icons
diff --git a/.gulp/consts/log.ts b/.gulp/consts/log.ts
new file mode 100644
index 0000000..b9f0c07
Binary files /dev/null and b/.gulp/consts/log.ts differ
diff --git a/.gulp/index.ts b/.gulp/index.ts
new file mode 100644
index 0000000..0be9432
Binary files /dev/null and b/.gulp/index.ts differ
diff --git a/.gulp/interfaces/iicon.ts b/.gulp/interfaces/iicon.ts
new file mode 100644
index 0000000..d61122d
Binary files /dev/null and b/.gulp/interfaces/iicon.ts differ
diff --git a/.gulp/interfaces/itheme-icons-accents.ts b/.gulp/interfaces/itheme-icons-accents.ts
new file mode 100644
index 0000000..b52217e
Binary files /dev/null and b/.gulp/interfaces/itheme-icons-accents.ts differ
diff --git a/.gulp/interfaces/itheme-icons-item.ts b/.gulp/interfaces/itheme-icons-item.ts
new file mode 100644
index 0000000..de671ba
Binary files /dev/null and b/.gulp/interfaces/itheme-icons-item.ts differ
diff --git a/.gulp/interfaces/itheme-icons-variants.ts b/.gulp/interfaces/itheme-icons-variants.ts
new file mode 100644
index 0000000..e5c2e36
Binary files /dev/null and b/.gulp/interfaces/itheme-icons-variants.ts differ
diff --git a/.gulp/interfaces/itheme-variant.ts b/.gulp/interfaces/itheme-variant.ts
new file mode 100644
index 0000000..e9c7c4a
Binary files /dev/null and b/.gulp/interfaces/itheme-variant.ts differ
diff --git a/.gulp/tasks/changelog-title.ts b/.gulp/tasks/changelog-title.ts
new file mode 100644
index 0000000..ad86e36
Binary files /dev/null and b/.gulp/tasks/changelog-title.ts differ
diff --git a/.gulp/tasks/icons-accents.ts b/.gulp/tasks/icons-accents.ts
new file mode 100644
index 0000000..cc7b0f8
Binary files /dev/null and b/.gulp/tasks/icons-accents.ts differ
diff --git a/.gulp/tasks/icons-variants.ts b/.gulp/tasks/icons-variants.ts
new file mode 100644
index 0000000..751269f
Binary files /dev/null and b/.gulp/tasks/icons-variants.ts differ
diff --git a/.gulp/tasks/icons.ts b/.gulp/tasks/icons.ts
new file mode 100644
index 0000000..3d46697
Binary files /dev/null and b/.gulp/tasks/icons.ts differ
diff --git a/.gulp/tasks/themes.ts b/.gulp/tasks/themes.ts
new file mode 100644
index 0000000..65f161b
Binary files /dev/null and b/.gulp/tasks/themes.ts differ
diff --git a/.gulp/tasks/watcher.ts b/.gulp/tasks/watcher.ts
new file mode 100644
index 0000000..2a98c28
Binary files /dev/null and b/.gulp/tasks/watcher.ts differ
diff --git a/.npmrc b/.npmrc
new file mode 100644
index 0000000..aea17fd
--- /dev/null
+++ b/.npmrc
@@ -0,0 +1,4 @@
+git-tag-version = false
+tag-version-prefix =
+save-exact = true
+progress = true
\ No newline at end of file
diff --git a/.vscode/launch.json b/.vscode/launch.json
new file mode 100644
index 0000000..acc9440
--- /dev/null
+++ b/.vscode/launch.json
@@ -0,0 +1,56 @@
+{
+ // Use IntelliSense to learn about possible Node.js debug attributes.
+ // Hover to view descriptions of existing attributes.
+ // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
+ "version": "0.2.0",
+ "configurations": [
+ {
+ "type": "node",
+ "request": "launch",
+ "name": "Gulp build-icons-variants",
+ "program": "${workspaceRoot}/node_modules/gulp/bin/gulp.js",
+ "args": [
+ "build:icons.variants"
+ ]
+ },
+ {
+ "type": "node",
+ "request": "launch",
+ "name": "Gulp build-icons",
+ "program": "${workspaceRoot}/node_modules/gulp/bin/gulp.js",
+ "args": [
+ "build:icons.accents"
+ ]
+ },
+ {
+ "name": "Launch Extension",
+ "type": "extensionHost",
+ "request": "launch",
+ "runtimeExecutable": "${execPath}",
+ "args": [
+ "--extensionDevelopmentPath=${workspaceRoot}"
+ ],
+ "stopOnEntry": false,
+ "sourceMaps": true,
+ "outFiles": [
+ "${workspaceRoot}/out/src/**/*.js"
+ ]
+ },
+ {
+ "name": "Launch Tests",
+ "type": "extensionHost",
+ "request": "launch",
+ "runtimeExecutable": "${execPath}",
+ "args": [
+ "--extensionDevelopmentPath=${workspaceRoot}",
+ "--extensionTestsPath=${workspaceRoot}/out/test"
+ ],
+ "stopOnEntry": false,
+ "sourceMaps": true,
+ "outFiles": [
+ "${workspaceRoot}/out/test/**/*.js"
+ ],
+ "preLaunchTask": "npm"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000..e3fc186
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,29 @@
+{
+ "editor.tabSize": 2,
+ "editor.insertSpaces": true,
+ "files.exclude": {
+ "**/.git": true,
+ ".git-crypt": true,
+ "**/.svn": true,
+ "**/.hg": true,
+ "**/CVS": true,
+ "**/.DS_Store": true,
+ "**/*.js": {
+ "when": "$(basename).ts"
+ },
+ "**/*.js.map": true
+ },
+ "files.associations": {
+ "*.template": "json"
+ },
+ "html.format.preserveNewLines": true,
+ "files.trimTrailingWhitespace": true,
+ "[markdown]": {
+ "diffEditor.ignoreTrimWhitespace": false,
+ "editor.tabSize": 4,
+ "editor.wordWrap": "on",
+ "editor.quickSuggestions": false
+ },
+ "gulp.autoDetect": "off",
+ "npm.autoDetect": "off"
+}
\ No newline at end of file
diff --git a/.vscode/tasks.json b/.vscode/tasks.json
new file mode 100644
index 0000000..97c75a8
--- /dev/null
+++ b/.vscode/tasks.json
@@ -0,0 +1,89 @@
+// Available variables which can be used inside of strings.
+// ${workspaceRoot}: the root folder of the team
+// ${file}: the current opened file
+// ${fileBasename}: the current opened file's basename
+// ${fileDirname}: the current opened file's dirname
+// ${fileExtname}: the current opened file's extension
+// ${cwd}: the current working directory of the spawned process
+// A task runner that calls a custom npm script that compiles the extension.
+{
+ "version": "2.0.0",
+ // tasks list (build, build-theme, semver etc)
+ "tasks": [
+ {
+ "args": [
+ "run",
+ "build"
+ ],
+ "command": "npm",
+ "dependsOn": "tsc",
+ "taskName": "build",
+ "group": {
+ "kind": "build",
+ "isDefault": true
+ },
+ "problemMatcher": []
+ },
+ {
+ "linux": {
+ "args": [
+ ".",
+ "-name",
+ "\"*.js\"",
+ "-not",
+ "-path",
+ "\"./node_modules/*\"",
+ "-not",
+ "-path",
+ "\"./src/*\"",
+ "-not",
+ "-path",
+ "\"./test/*\"",
+ "-type",
+ "f",
+ "-delete"
+ ],
+ "command": "find"
+ },
+ "osx": {
+ "args": [
+ ".",
+ "-name",
+ "\"*.js\"",
+ "-not",
+ "-path",
+ "\"./node_modules/*\"",
+ "-not",
+ "-path",
+ "\"./src/*\"",
+ "-not",
+ "-path",
+ "\"./test/*\"",
+ "-type",
+ "f",
+ "-delete"
+ ],
+ "command": "find"
+ },
+ "command": "",
+ "taskName": "clean project"
+ },
+ {
+ "args": [
+ "run",
+ "changelog"
+ ],
+ "command": "npm",
+ "taskName": "changelog"
+ },
+ {
+ "args": [
+ "-p",
+ "."
+ ],
+ "command": "tsc",
+ "dependsOn": "clean project",
+ "taskName": "tsc"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/.vscodeignore b/.vscodeignore
new file mode 100644
index 0000000..420a7ae
--- /dev/null
+++ b/.vscodeignore
@@ -0,0 +1,17 @@
+*.log
+*.ts
+**/*.map
+.github
+.gitignore
+.gulp
+.vscode/**
+assets/
+gulpfile.babel.ts
+node_modules
+out/test/**
+src/**
+test/**
+tsconfig.json
+typings/**
+vsc-extension-quickstart.md
+yarn.lock
\ No newline at end of file
diff --git a/.yarnrc b/.yarnrc
new file mode 100644
index 0000000..1b2af90
--- /dev/null
+++ b/.yarnrc
@@ -0,0 +1,2 @@
+save-exact true
+save-prefix false
\ No newline at end of file
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000..d6c4a4e
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,352 @@
+# Material Theme Changelog
+
+All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
+
+
+# [1.6.0](https://github.com/equinusocio/vsc-material-theme/compare/v1.5.1...v1.6.0) (2018-04-15)
+
+
+### Bug Fixes
+
+* Add babel icon to .babelrc.json files ([41fe77c](https://github.com/equinusocio/vsc-material-theme/commit/41fe77c)), closes [#154](https://github.com/equinusocio/vsc-material-theme/issues/154)
+
+
+### Features
+
+* Add .gitlab-ci.yml file icon ([5b5c9ec](https://github.com/equinusocio/vsc-material-theme/commit/5b5c9ec)), closes [#155](https://github.com/equinusocio/vsc-material-theme/issues/155)
+
+
+
+
+## [1.5.1](https://github.com/equinusocio/vsc-material-theme/compare/v1.5.0...v1.5.1) (2018-03-10)
+
+
+### Bug Fixes
+
+* Fix notifications background. Close [#143](https://github.com/equinusocio/vsc-material-theme/issues/143) ([8981088](https://github.com/equinusocio/vsc-material-theme/commit/8981088)), closes [#142](https://github.com/equinusocio/vsc-material-theme/issues/142)
+
+
+
+
+# [1.5.0](https://github.com/equinusocio/vsc-material-theme/compare/v1.4.0...v1.5.0) (2018-03-08)
+
+
+### Bug Fixes
+
+* Add support for the new notifications UX ([008bac1](https://github.com/equinusocio/vsc-material-theme/commit/008bac1))
+
+
+### Features
+
+* Highlight line number on selected line ([cf69a74](https://github.com/equinusocio/vsc-material-theme/commit/cf69a74))
+
+
+
+
+# [1.4.0](https://github.com/equinusocio/vsc-material-theme/compare/v1.3.0...v1.4.0) (2018-02-19)
+
+
+### Bug Fixes
+
+* Fix constants color in php language ([444cf9a](https://github.com/equinusocio/vsc-material-theme/commit/444cf9a)), closes [#138](https://github.com/equinusocio/vsc-material-theme/issues/138)
+* Fix input validation colors contrast ([30df0a6](https://github.com/equinusocio/vsc-material-theme/commit/30df0a6))
+
+
+### Features
+
+* Add a subtle highlight on tab hover ([405000e](https://github.com/equinusocio/vsc-material-theme/commit/405000e))
+
+
+
+
+## [1.4.3](https://github.com/equinusocio/vsc-material-theme/compare/v1.4.0...v1.4.3) (2018-02-19)
+
+
+
+
+# [1.4.0](https://github.com/equinusocio/vsc-material-theme/compare/v1.3.0...v1.4.0) (2018-02-19)
+
+
+### Bug Fixes
+
+* Fix constants color in php language ([444cf9a](https://github.com/equinusocio/vsc-material-theme/commit/444cf9a)), closes [#138](https://github.com/equinusocio/vsc-material-theme/issues/138)
+* Fix input validation colors contrast ([30df0a6](https://github.com/equinusocio/vsc-material-theme/commit/30df0a6))
+
+
+### Features
+
+* Add a subtle highlight on tab hover ([405000e](https://github.com/equinusocio/vsc-material-theme/commit/405000e))
+
+
+
+
+# [1.3.0](https://github.com/equinusocio/vsc-material-theme/compare/v1.2.0...v1.3.0) (2018-01-21)
+
+
+### Bug Fixes
+
+* Fix editor rule color ([2732da4](https://github.com/equinusocio/vsc-material-theme/commit/2732da4))
+* Fix highlight backgrounds in PeekView ([b66e88e](https://github.com/equinusocio/vsc-material-theme/commit/b66e88e))
+* Temporary fix to git edited file background when list is inactive ([6b1925e](https://github.com/equinusocio/vsc-material-theme/commit/6b1925e))
+* Update main field of package.json ([#130](https://github.com/equinusocio/vsc-material-theme/issues/130)) ([40dd529](https://github.com/equinusocio/vsc-material-theme/commit/40dd529))
+
+
+### Features
+
+* Add gulp icon to gulp-config.js files ([83c058f](https://github.com/equinusocio/vsc-material-theme/commit/83c058f)), closes [#128](https://github.com/equinusocio/vsc-material-theme/issues/128)
+* Add zephyr file icon ([9e64343](https://github.com/equinusocio/vsc-material-theme/commit/9e64343)), closes [#124](https://github.com/equinusocio/vsc-material-theme/issues/124)
+
+
+
+
+# [1.2.0](https://github.com/equinusocio/vsc-material-theme/compare/v1.1.2...v1.2.0) (2017-12-29)
+
+
+### Features
+
+* Add ci folder icon ([a2ba7f8](https://github.com/equinusocio/vsc-material-theme/commit/a2ba7f8)), closes [#119](https://github.com/equinusocio/vsc-material-theme/issues/119)
+* Add laravel blade file icon ([f7070f4](https://github.com/equinusocio/vsc-material-theme/commit/f7070f4)), closes [#114](https://github.com/equinusocio/vsc-material-theme/issues/114)
+* Add reason (.re, .rei) file icon ([384d8d2](https://github.com/equinusocio/vsc-material-theme/commit/384d8d2))
+
+
+
+
+## [1.1.2](https://github.com/equinusocio/vsc-material-theme/compare/v1.1.0...v1.1.2) (2017-11-14)
+
+
+### Bug Fixes
+
+* Add dist folder icon ([a6600d2](https://github.com/equinusocio/vsc-material-theme/commit/a6600d2))
+* Add test folder icon ([0a73ce4](https://github.com/equinusocio/vsc-material-theme/commit/0a73ce4))
+* Improve markdown highlight ([dc9a6fa](https://github.com/equinusocio/vsc-material-theme/commit/dc9a6fa)), closes [#113](https://github.com/equinusocio/vsc-material-theme/issues/113)
+* Improve src folder icon ([e06b881](https://github.com/equinusocio/vsc-material-theme/commit/e06b881))
+* New bower_components folder icon ([adcb304](https://github.com/equinusocio/vsc-material-theme/commit/adcb304))
+* Update .git folder icon ([2f37966](https://github.com/equinusocio/vsc-material-theme/commit/2f37966))
+* Update .github folder icon ([d371804](https://github.com/equinusocio/vsc-material-theme/commit/d371804))
+* Update package-lock.json and yarn.lock file icons ([7136700](https://github.com/equinusocio/vsc-material-theme/commit/7136700)), closes [#108](https://github.com/equinusocio/vsc-material-theme/issues/108)
+
+
+### Features
+
+* Add Rollup js file icon ([5755813](https://github.com/equinusocio/vsc-material-theme/commit/5755813))
+
+
+
+
+# [1.1.0](https://github.com/equinusocio/vsc-material-theme/compare/v1.0.5...v1.1.0) (2017-11-04)
+
+
+### Bug Fixes
+
+* Add babel icon to .babelrc files ([f2a64ab](https://github.com/equinusocio/vsc-material-theme/commit/f2a64ab)), closes [#101](https://github.com/equinusocio/vsc-material-theme/issues/101)
+* Add postcss icon to .pcss files ([9eac9c4](https://github.com/equinusocio/vsc-material-theme/commit/9eac9c4)), closes [#107](https://github.com/equinusocio/vsc-material-theme/issues/107)
+* Minor UI fixes ([65a18e8](https://github.com/equinusocio/vsc-material-theme/commit/65a18e8))
+
+
+### Features
+
+* Add set italic style for keyword operators ([ea9b755](https://github.com/equinusocio/vsc-material-theme/commit/ea9b755)), closes [#99](https://github.com/equinusocio/vsc-material-theme/issues/99)
+* Add sidebar git colors support ([0cf2007](https://github.com/equinusocio/vsc-material-theme/commit/0cf2007))
+* New folder icons ([2dfbaaa](https://github.com/equinusocio/vsc-material-theme/commit/2dfbaaa))
+* New High Contrast theme variants. ([79d68b3](https://github.com/equinusocio/vsc-material-theme/commit/79d68b3))
+* Remove arrow icons beside folders in explorer view ([28006e5](https://github.com/equinusocio/vsc-material-theme/commit/28006e5))
+
+
+
+
+## [1.0.5](https://github.com/equinusocio/vsc-material-theme/compare/v1.0.4...v1.0.5) (2017-10-12)
+
+
+### Bug Fixes
+
+* Fix show changelog command ([370a4d9](https://github.com/equinusocio/vsc-material-theme/commit/370a4d9))
+* Improve tab inactive foreground contrast ([c3d0b82](https://github.com/equinusocio/vsc-material-theme/commit/c3d0b82))
+
+
+### Features
+
+* Add .asp, .aspx and .ascx file icon ([f7d4af0](https://github.com/equinusocio/vsc-material-theme/commit/f7d4af0)), closes [#96](https://github.com/equinusocio/vsc-material-theme/issues/96)
+* Add .mjs file icon ([605b8bf](https://github.com/equinusocio/vsc-material-theme/commit/605b8bf)), closes [#93](https://github.com/equinusocio/vsc-material-theme/issues/93)
+* Add .yarnrc and .npmrc file icon ([f715cd0](https://github.com/equinusocio/vsc-material-theme/commit/f715cd0))
+* Add colors for sidebar git.untracked and git.modified files ([3f1077d](https://github.com/equinusocio/vsc-material-theme/commit/3f1077d))
+
+
+
+
+## [1.0.3](https://github.com/equinusocio/vsc-material-theme/compare/v1.0.2...v1.0.3) (2017-09-27)
+
+
+### Bug Fixes
+
+* Fix brackets color (punctuation.class...). Fix [#76](https://github.com/equinusocio/vsc-material-theme/issues/76) ([02d20b7](https://github.com/equinusocio/vsc-material-theme/commit/02d20b7))
+* Fix wrong gutter indicator for add line. Close 89 ([83df9f9](https://github.com/equinusocio/vsc-material-theme/commit/83df9f9))
+* Update gutter line colors. Fix [#79](https://github.com/equinusocio/vsc-material-theme/issues/79) ([0298a59](https://github.com/equinusocio/vsc-material-theme/commit/0298a59))
+
+
+### Features
+
+* Add tab active bottom border ([5bd1934](https://github.com/equinusocio/vsc-material-theme/commit/5bd1934)), closes [#88](https://github.com/equinusocio/vsc-material-theme/issues/88)
+* Adds "show changelog" command. ([038ded7](https://github.com/equinusocio/vsc-material-theme/commit/038ded7))
+
+
+
+
+## [1.0.2](https://github.com/equinusocio/vsc-material-theme/compare/v1.0.1...v1.0.2) (2017-07-25)
+
+
+### Bug Fixes
+
+* Fix squiggles visibility ([0900c30](https://github.com/equinusocio/vsc-material-theme/commit/0900c30)), closes [#70](https://github.com/equinusocio/vsc-material-theme/issues/70)
+* Fixes an issues with the old settings "materialTheme.cache.workbench.accent". ([6c2ce83](https://github.com/equinusocio/vsc-material-theme/commit/6c2ce83))
+* Fixes an unhandled undefined, which causes theme to break (issue [#69](https://github.com/equinusocio/vsc-material-theme/issues/69)). ([14a471f](https://github.com/equinusocio/vsc-material-theme/commit/14a471f))
+
+
+
+
+## [1.0.1](https://github.com/equinusocio/vsc-material-theme/compare/v1.0.0...v1.0.1) (2017-07-24)
+
+
+### Bug Fixes
+
+* Add .ex file icon ([b6eb130](https://github.com/equinusocio/vsc-material-theme/commit/b6eb130)), closes [#60](https://github.com/equinusocio/vsc-material-theme/issues/60)
+* Add accent color to progressbar ([4758c45](https://github.com/equinusocio/vsc-material-theme/commit/4758c45))
+* Add squigglies color ([8502a39](https://github.com/equinusocio/vsc-material-theme/commit/8502a39))
+* Fix editor marker navigation color ([16230f2](https://github.com/equinusocio/vsc-material-theme/commit/16230f2))
+* Fix notification bar badge colors ([a3428ab](https://github.com/equinusocio/vsc-material-theme/commit/a3428ab))
+* Fix python special var parameter color ([027b342](https://github.com/equinusocio/vsc-material-theme/commit/027b342)), closes [#57](https://github.com/equinusocio/vsc-material-theme/issues/57)
+* Fix theme variants and settings reload ([ada03ed](https://github.com/equinusocio/vsc-material-theme/commit/ada03ed))
+* Improve workbench theme and colors ([4798102](https://github.com/equinusocio/vsc-material-theme/commit/4798102))
+
+
+
+
+# [1.0.0](https://github.com/equinusocio/vsc-material-theme/compare/v0.0.17...v1.0.0) (2017-06-19)
+
+
+### Bug Fixes
+
+* Add and update file icons ([ef9abab](https://github.com/equinusocio/vsc-material-theme/commit/ef9abab))
+* Fix inputs placeholder color ([6d5cef6](https://github.com/equinusocio/vsc-material-theme/commit/6d5cef6))
+* Fix tree selected foreground when sidebar is inactive ([351cd20](https://github.com/equinusocio/vsc-material-theme/commit/351cd20))
+* Improve sidebar tree coloring ([4993587](https://github.com/equinusocio/vsc-material-theme/commit/4993587))
+* Style welcome page links ([e873530](https://github.com/equinusocio/vsc-material-theme/commit/e873530))
+
+
+### Features
+
+* adds theme accents config. ([c648ab8](https://github.com/equinusocio/vsc-material-theme/commit/c648ab8))
+* Adds theme changer command ([cb68fdc](https://github.com/equinusocio/vsc-material-theme/commit/cb68fdc))
+
+
+
+
+## [0.0.17](https://github.com/equinusocio/vsc-material-theme/compare/v0.0.16...v0.0.17) (2017-05-22)
+
+
+### Bug Fixes
+
+* Fix inactive group inactive tab foreground ([2d52311](https://github.com/equinusocio/vsc-material-theme/commit/2d52311)), closes [#47](https://github.com/equinusocio/vsc-material-theme/issues/47)
+* Improve sidebar colorization ([9cf9f34](https://github.com/equinusocio/vsc-material-theme/commit/9cf9f34))
+
+
+### Features
+
+* Add puppet (.pp) file icon ([d2dc180](https://github.com/equinusocio/vsc-material-theme/commit/d2dc180))
+
+
+
+
+## [0.0.16](https://github.com/equinusocio/vsc-material-theme/compare/v0.0.15...v0.0.16) (2017-05-18)
+
+
+### Bug Fixes
+
+* Fix C file icon ([8a5a331](https://github.com/equinusocio/vsc-material-theme/commit/8a5a331)), closes [#46](https://github.com/equinusocio/vsc-material-theme/issues/46)
+* Fix the waterfall of bleed words ([6d001c4](https://github.com/equinusocio/vsc-material-theme/commit/6d001c4)), closes [#44](https://github.com/equinusocio/vsc-material-theme/issues/44)
+* Fix the waterfall of blooding words ([8b62470](https://github.com/equinusocio/vsc-material-theme/commit/8b62470)), closes [#44](https://github.com/equinusocio/vsc-material-theme/issues/44)
+* Improve tree colors (wip) ([d9a1f2c](https://github.com/equinusocio/vsc-material-theme/commit/d9a1f2c))
+* Panel hover borders ([a83dfcb](https://github.com/equinusocio/vsc-material-theme/commit/a83dfcb))
+
+
+
+
+## [0.0.15](https://github.com/equinusocio/vsc-material-theme/compare/v0.0.14...v0.0.15) (2017-05-17)
+
+
+
+
+## [0.0.14](https://github.com/equinusocio/vsc-material-theme/compare/v0.0.13...v0.0.14) (2017-05-16)
+
+
+### Bug Fixes
+
+* Fix bracket match border color ([4f778f1](https://github.com/equinusocio/vsc-material-theme/commit/4f778f1))
+* Fix invalids color highlight ([100397c](https://github.com/equinusocio/vsc-material-theme/commit/100397c)), closes [#40](https://github.com/equinusocio/vsc-material-theme/issues/40)
+* Fix notification bar foreground on Lighter ([c177e46](https://github.com/equinusocio/vsc-material-theme/commit/c177e46)), closes [#34](https://github.com/equinusocio/vsc-material-theme/issues/34)
+* Fix selectionHighlightBackground color ([9578f38](https://github.com/equinusocio/vsc-material-theme/commit/9578f38)), closes [#38](https://github.com/equinusocio/vsc-material-theme/issues/38)
+* improve C# highlight ([c72c314](https://github.com/equinusocio/vsc-material-theme/commit/c72c314)), closes [#26](https://github.com/equinusocio/vsc-material-theme/issues/26)
+* Improve c++ syntax highlight ([1a927d6](https://github.com/equinusocio/vsc-material-theme/commit/1a927d6))
+* Temporary fix buttons background ([f97d06a](https://github.com/equinusocio/vsc-material-theme/commit/f97d06a)), closes [#37](https://github.com/equinusocio/vsc-material-theme/issues/37)
+
+
+
+
+## [0.0.13](https://github.com/equinusocio/vsc-material-theme/compare/v0.0.12...v0.0.13) (2017-05-10)
+
+
+### Bug Fixes
+
+* Fix statusbar background when no project opened ([d0a7cbc](https://github.com/equinusocio/vsc-material-theme/commit/d0a7cbc)), closes [#27](https://github.com/equinusocio/vsc-material-theme/issues/27)
+* Improve ansi colors (integrated terminal) ([d1fa94f](https://github.com/equinusocio/vsc-material-theme/commit/d1fa94f))
+
+
+### Features
+
+* Add build/dist folder icon ([668db44](https://github.com/equinusocio/vsc-material-theme/commit/668db44)), closes [#6](https://github.com/equinusocio/vsc-material-theme/issues/6)
+* Improve worckbench theme ([caff8ce](https://github.com/equinusocio/vsc-material-theme/commit/caff8ce))
+
+
+
+
+## [0.0.12](https://github.com/equinusocio/vsc-material-theme/compare/v0.0.8...v0.0.12) (2017-05-04)
+
+
+### Bug Fixes
+
+* Fix folder icon color ([81c03e6](https://github.com/equinusocio/vsc-material-theme/commit/81c03e6))
+* Update workbench theme ([232d1e3](https://github.com/equinusocio/vsc-material-theme/commit/232d1e3))
+
+
+### Features
+
+* Add graphql file icon ([ba18877](https://github.com/equinusocio/vsc-material-theme/commit/ba18877))
+* Improve workbench theme ([c7c8038](https://github.com/equinusocio/vsc-material-theme/commit/c7c8038))
+* Update workbench theme ([6ddfaa9](https://github.com/equinusocio/vsc-material-theme/commit/6ddfaa9))
+
+
+
+
+## [0.0.8](https://github.com/equinusocio/vsc-material-theme/compare/v0.0.7...v0.0.8) (2017-04-11)
+
+
+### Bug Fixes
+
+* Add bower icon ([3e73e1f](https://github.com/equinusocio/vsc-material-theme/commit/3e73e1f))
+* Fix background color for highlighted searched string ([060d24d](https://github.com/equinusocio/vsc-material-theme/commit/060d24d)), closes [#4](https://github.com/equinusocio/vsc-material-theme/issues/4)
+* fix lighter scheme colors ([2ba1c0d](https://github.com/equinusocio/vsc-material-theme/commit/2ba1c0d))
+* Fix opened folder icon ([40700ca](https://github.com/equinusocio/vsc-material-theme/commit/40700ca)), closes [#1](https://github.com/equinusocio/vsc-material-theme/issues/1)
+* Fix some file and folder icons ([b927646](https://github.com/equinusocio/vsc-material-theme/commit/b927646))
+* Fix var hover background ([a8fee8c](https://github.com/equinusocio/vsc-material-theme/commit/a8fee8c))
+* Update json icon ([ce30ff7](https://github.com/equinusocio/vsc-material-theme/commit/ce30ff7))
+* Update some file icons ([cf2a1ee](https://github.com/equinusocio/vsc-material-theme/commit/cf2a1ee))
+* **Icons:** Fix .ts and def ts icons ([4c0cf00](https://github.com/equinusocio/vsc-material-theme/commit/4c0cf00)), closes [#10](https://github.com/equinusocio/vsc-material-theme/issues/10)
+
+
+### Features
+
+* Add lighter theme (wip) ([0f7d3c2](https://github.com/equinusocio/vsc-material-theme/commit/0f7d3c2))
+* Add Material Theme icon-theme ([7d3b7bd](https://github.com/equinusocio/vsc-material-theme/commit/7d3b7bd))
+* first beta release ([b4dead1](https://github.com/equinusocio/vsc-material-theme/commit/b4dead1))
+* **Icons:** Add new filetype icons ([5bc8002](https://github.com/equinusocio/vsc-material-theme/commit/5bc8002))
+* **Icons:** Add new icons ([3921218](https://github.com/equinusocio/vsc-material-theme/commit/3921218))
+* first full theme implementation (wip) ([c3c42d4](https://github.com/equinusocio/vsc-material-theme/commit/c3c42d4))
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
new file mode 100644
index 0000000..059647c
--- /dev/null
+++ b/CODE_OF_CONDUCT.md
@@ -0,0 +1,46 @@
+# Contributor Covenant Code of Conduct
+
+## Our Pledge
+
+In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
+
+## Our Standards
+
+Examples of behavior that contributes to creating a positive environment include:
+
+* Using welcoming and inclusive language
+* Being respectful of differing viewpoints and experiences
+* Gracefully accepting constructive criticism
+* Focusing on what is best for the community
+* Showing empathy towards other community members
+
+Examples of unacceptable behavior by participants include:
+
+* The use of sexualized language or imagery and unwelcome sexual attention or advances
+* Trolling, insulting/derogatory comments, and personal or political attacks
+* Public or private harassment
+* Publishing others' private information, such as a physical or electronic address, without explicit permission
+* Other conduct which could reasonably be considered inappropriate in a professional setting
+
+## Our Responsibilities
+
+Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
+
+Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
+
+## Scope
+
+This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
+
+## Enforcement
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at astorino.design@gmail.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
+
+Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
+
+## Attribution
+
+This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
+
+[homepage]: http://contributor-covenant.org
+[version]: http://contributor-covenant.org/version/1/4/
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000..3e296f9
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,104 @@
+# Contributing guidelines
+
+> Note: this document is intended as a draft, it will be updated soon
+
+## Requirements:
+
+* Nodejs ^6.x
+* Visual Studio Code
+* GPG Tool
+
+- [Contributing guidelines](#contributing-guidelines)
+ - [Requirements:](#requirements)
+ - [Decrypt content](#decrypt-content)
+ - [Installing and compiling source](#installing-and-compiling-source)
+ - [Testing the theme](#testing-the-theme)
+ - [Adding new Material Theme commands](#adding-new-material-theme-commands)
+ - [Adding new icons](#adding-new-icons)
+ - [Financial contributions](#financial-contributions)
+ - [Credits](#credits)
+ - [Contributors](#contributors)
+ - [Backers](#backers)
+ - [Sponsors](#sponsors)
+
+## Decrypt content
+We use git-crypt to encrypt compiler files. To contribute you need a GPG key public/private associated with your github email.
+
+1. Export your public key by running
+
+```gpg --output PATH/FILENAME.gpg --export ASSOCIATEDEMAIL```
+
+2. Send the exported `.gpg` file to a contributor that will add you to the trusted people.
+3. Fetch and pull then decrypt files with `git-crypt unlock` entering your key password.
+
+## Installing and compiling source
+
+First you will have to install node_modules through npm or yarn
+
+```shell
+npm install
+# or
+yarn install
+```
+
+To compile to the source code, you have to execute the build task through visual studio code.
+First you need to invoke to quick command (on MacOS `⌘P`, while on Linux/windows is `ctrl+p`)
+then type `task build` and wait until vsc will have finished the task.
+
+### Testing the theme
+
+To test the theme, you will have to go to the debug section, select the *Launch Extension* from debug and execute it.
+
+### Adding new Material Theme commands
+
+Soon(ish)®
+
+### Adding new icons
+
+* Add your icon to the `~/src/icons/svgs` directory.
+
+* Add the reference to that icon to the `~/src/icons/partials/fileNames.js` or if your icon is referred to a directory adds the reference to the `~/src/icons/partials/folderNames.js` file, otherwise to `~/src/icons/partials/fileExtensions.js` if is referred to a file extension.
+
+* If you want to make the icon sensitive to be accented, modify the `~/extensions/defaults.json` file, adding the icon definition to the `accentableIcons` array (e.g. ["_folder_open", "_folder_open_build"]) and the path to the `icons.theme.iconDefinitions` object. The same applies to variants (the variant icons array is called "variantsIcons")
+
+* Execute the build command.
+
+* Enjoy your new icons in Material Theme, and don't forget to pull request!
+
+
+## Financial contributions
+
+We also welcome financial contributions in full transparency on our [open collective](https://opencollective.com/vsc-material-theme).
+Anyone can file an expense. If the expense makes sense for the development of the community, it will be "merged" in the ledger of our open collective by the core contributors and the person who filed the expense will be reimbursed.
+
+
+## Credits
+
+
+### Contributors
+
+Thank you to all the people who have already contributed to vsc-material-theme!
+
+
+
+### Backers
+
+Thank you to all our backers! [[Become a backer](https://opencollective.com/vsc-material-theme#backer)]
+
+
+
+
+### Sponsors
+
+Thank you to all our sponsors! (please ask your company to also support this open source project by [becoming a sponsor](https://opencollective.com/vsc-material-theme#sponsor))
+
+
+
+
+
+
+
+
+
+
+
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..f83691d
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,201 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "{}"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright 2017 Mattia Astorino
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
\ No newline at end of file
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..7423c7e
--- /dev/null
+++ b/README.md
@@ -0,0 +1,185 @@
+
+

+
+[](https://twitter.com/intent/tweet?text=This%20is%20the%20most%20epic%20theme:&url=https%3A%2F%2Fgithub.com%2Fequinusocio%2Fvsc-material-theme)
+[](https://github.com/equinusocio/vsc-material-theme/releases)
+
+
+
+
+The most epic theme meets Visual Studio Code. You can help by reporting issues [here](https://github.com/equinusocio/vsc-material-theme/issues)
+
+
+
+- [Getting started](#getting-started)
+ - [Installation](#installation)
+ - [Packaged VSIX Extension](#packaged-vsix-extension)
+ - [GitHub Repository Clone](#github-repository-clone)
+ - [Activate theme](#activate-theme)
+ - [Activate File Icons](#activate-file-icons)
+ - [Set the accent color](#set-the-accent-color)
+ - [Override theme colors](#override-theme-colors)
+- [Recommended settings for a better experience](#recommended-settings-for-a-better-experience)
+- [Other resources](#other-resources)
+ - [Contributors](#contributors)
+ - [Backers](#backers)
+ - [Sponsors](#sponsors)
+
+
+
+
+ Screenshots
+
+
+
+
+
+
+
+
+# Getting started
+
+You can install this awesome theme through the [Visual Studio Code Marketplace](https://marketplace.visualstudio.com/items?itemName=Equinusocio.vsc-material-theme).
+
+## Installation
+
+Launch *Quick Open*
+ -
Linux `Ctrl+P`
+ -
macOS `⌘P`
+ -
Windows `Ctrl+P`
+
+Paste the following command and press `Enter`:
+
+```shell
+ext install vsc-material-theme
+```
+
+#### Packaged VSIX Extension
+
+[Download the latest .vsix release](https://github.com/equinusocio/vsc-material-theme/releases/latest) file from the GitHub repository and install it from the command line
+
+```shell
+code --install-extension vsc-material-theme-*.*.*.vsix
+```
+
+or from within VS Code by launching *Quick Open* and running the *Install from VSIX...* command.
+
+##### GitHub Repository Clone
+
+Change to your `.vscode/extensions` [VS Code extensions directory](https://code.visualstudio.com/docs/extensions/install-extension#_side-loading).
+Depending on your platform it is located in the following folders:
+
+ -
**Linux** `~/.vscode/extensions`
+ -
**macOs** `~/.vscode/extensions`
+ -
**Windows** `%USERPROFILE%\.vscode\extensions`
+
+Clone the Material Theme repository as `Equinusocio.vsc-material-theme`:
+
+```shell
+git clone https://github.com/equinusocio/vsc-material-theme.git Equinusocio.vsc-material-theme
+```
+
+
+## Activate theme
+
+Launch *Quick Open*,
+
+ -
Linux `Ctrl + Shift + P`
+ -
macOS `⌘ + Shift + P`
+ -
Windows `Ctrl + Shift + P`
+
+Type `theme` and choose `Preferences: Color Theme`, then select Material Theme from the list.
+
+This theme provides different color variants, to change the active theme variant type `Material Theme` and choose `Material Theme: Settings`, then select `Change color variant` and pick one theme from the list.
+
+## Activate File Icons
+
+Launch *Quick Open*,
+
+ -
Linux `Ctrl + Shift + P`
+ -
macOS `⌘ + Shift + P`
+ -
Windows `Ctrl + Shift + P`
+
+type `icon theme` and select `Material Theme Icons` from the drop-down menu.
+
+## Set the accent color
+
+Launch *Quick Open*,
+
+ -
Linux `Ctrl + Shift + P`
+ -
macOS `⌘ + Shift + P`
+ -
Windows `Ctrl + Shift + P`
+
+Type `Material Theme` and choose `Material Theme: Settings`, then select `Change accent color` and pick one color from the list.
+
+## Override theme colors
+You can override the material theme ui and schemes colors by adding these theme-specific settings to your configuration.
+
+```js
+"editor.tokenColorCustomizations": {
+ "[Material Theme]": {
+ "comments": "#229977"
+ },
+ "..."
+},
+"workbench.colorCustomizations": {
+ "[Material Theme]": {
+ "sideBar.background": "#347890"
+ },
+ "..."
+}
+```
+
+# Recommended settings for a better experience
+
+```js
+{
+ // Controls the font family.
+ "editor.fontFamily": "Operator Mono",
+ // Controls the line height. Use 0 to compute the lineHeight from the fontSize.
+ "editor.lineHeight": 24,
+ // Enables font ligatures
+ "editor.fontLigatures": true,
+ // Controls if file decorations should use badges.
+ "explorer.decorations.badges": false
+}
+```
+
+# Other resources
+- **AppIcon:** [Download](https://github.com/equinusocio/vsc-material-theme/files/989048/vsc-material-theme-appicon.zip) the official Material Theme app icon for Visual Studio code
+
+
+## Contributors
+
+This project exists thanks to all the people who contribute. [[Contribute]](CONTRIBUTING.md).
+
+
+
+## Backers
+
+Thank you to all our backers! 🙏 [[Become a backer](https://opencollective.com/vsc-material-theme#backer)]
+
+
+
+
+## Sponsors
+
+Support this project by becoming a sponsor. Your logo will show up here with a link to your website. [[Become a sponsor](https://opencollective.com/vsc-material-theme#sponsor)]
+
+
+
+
+
+
+
+
+
+
+
+
+---
+
+
Copyright © 2017 Mattia Astorino
+
+

diff --git a/assets/header.jpg b/assets/header.jpg
new file mode 100644
index 0000000..8a95742
Binary files /dev/null and b/assets/header.jpg differ
diff --git a/assets/screen.jpg b/assets/screen.jpg
new file mode 100644
index 0000000..e43f02d
Binary files /dev/null and b/assets/screen.jpg differ
diff --git a/extensions/commands/accents-setter/index.ts b/extensions/commands/accents-setter/index.ts
new file mode 100644
index 0000000..88bec88
Binary files /dev/null and b/extensions/commands/accents-setter/index.ts differ
diff --git a/extensions/commands/theme-icons/index.ts b/extensions/commands/theme-icons/index.ts
new file mode 100644
index 0000000..66b4b71
Binary files /dev/null and b/extensions/commands/theme-icons/index.ts differ
diff --git a/extensions/commands/theme-variant/index.ts b/extensions/commands/theme-variant/index.ts
new file mode 100644
index 0000000..70fd4f6
Binary files /dev/null and b/extensions/commands/theme-variant/index.ts differ
diff --git a/extensions/consts/files.ts b/extensions/consts/files.ts
new file mode 100644
index 0000000..a41ab0b
Binary files /dev/null and b/extensions/consts/files.ts differ
diff --git a/extensions/consts/paths.ts b/extensions/consts/paths.ts
new file mode 100644
index 0000000..2638bf8
Binary files /dev/null and b/extensions/consts/paths.ts differ
diff --git a/extensions/defaults.json b/extensions/defaults.json
new file mode 100644
index 0000000..99e91e8
--- /dev/null
+++ b/extensions/defaults.json
@@ -0,0 +1,197 @@
+{
+ "accents": {
+ "Acid Lime": "#C6FF00",
+ "Blue": "#2979FF",
+ "Breaking Bad": "#388E3C",
+ "Bright Teal": "#64FFDA",
+ "Cyan": "#00BCD4",
+ "Graphite": "#616161",
+ "Indigo": "#5C6BC0",
+ "Lime": "#7CB342",
+ "Orange": "#FF7042",
+ "Pink": "#FF4081",
+ "Purple": "#AB47BC",
+ "Red": "#E57373",
+ "Sky": "#84FFFF",
+ "Tomato": "#F44336",
+ "Teal": "#80CBC4",
+ "Yellow": "#FFA000"
+ },
+ "accentableIcons": [
+ "_folder_open",
+ "_folder_open_build",
+ "_folder_vscode_open",
+ "_folder_gulp_open",
+ "_folder_node_open",
+ "_folder_images_open",
+ "_folder_js_open",
+ "_folder_src_open",
+ "_folder_assets_open",
+ "_folder_bower_open",
+ "_folder_git_open",
+ "_folder_github_open",
+ "_folder_test_open",
+ "_folder_dist_open",
+ "_folder_ci_open"
+ ],
+ "changelog": {
+ "lastversion": "1.5.1"
+ },
+ "icons": {
+ "theme": {
+ "iconDefinitions": {
+ "_folder_ci": {
+ "iconPath": "../icons/folder_ci.svg"
+ },
+ "_folder_ci_open": {
+ "iconPath": "../icons/folder_ci_open.svg"
+ },
+ "_folder_dist": {
+ "iconPath": "../icons/folder_dist.svg"
+ },
+ "_folder_dist_open": {
+ "iconPath": "../icons/folder_dist_open.svg"
+ },
+ "_folder_test": {
+ "iconPath": "../icons/folder_test.svg"
+ },
+ "_folder_test_open": {
+ "iconPath": "../icons/folder_test_open.svg"
+ },
+ "_folder_github": {
+ "iconPath": "../icons/folder_github.svg"
+ },
+ "_folder_github_open": {
+ "iconPath": "../icons/folder_github_open.svg"
+ },
+ "_folder_git": {
+ "iconPath": "../icons/folder_git.svg"
+ },
+ "_folder_git_open": {
+ "iconPath": "../icons/folder_git_open.svg"
+ },
+ "_folder_bower": {
+ "iconPath": "../icons/folder_bower.svg"
+ },
+ "_folder_bower_open": {
+ "iconPath": "../icons/folder_bower_open.svg"
+ },
+ "_folder_assets": {
+ "iconPath": "../icons/folder_assets.svg"
+ },
+ "_folder_assets_open": {
+ "iconPath": "../icons/folder_assets_open.svg"
+ },
+ "_folder_src": {
+ "iconPath": "../icons/folder_src.svg"
+ },
+ "_folder_src_open": {
+ "iconPath": "../icons/folder_src_open.svg"
+ },
+ "_folder_js": {
+ "iconPath": "../icons/folder_js.svg"
+ },
+ "_folder_js_open": {
+ "iconPath": "../icons/folder_js_open.svg"
+ },
+ "_folder_images": {
+ "iconPath": "../icons/folder_images.svg"
+ },
+ "_folder_images_open": {
+ "iconPath": "../icons/folder_images_open.svg"
+ },
+ "_folder_gulp": {
+ "iconPath": "../icons/folder_gulp.svg"
+ },
+ "_folder_gulp_open": {
+ "iconPath": "../icons/folder_gulp_open.svg"
+ },
+ "_folder_node": {
+ "iconPath": "../icons/folder_node.svg"
+ },
+ "_folder_node_open": {
+ "iconPath": "../icons/folder_node_open.svg"
+ },
+ "_folder_vscode": {
+ "iconPath": "../icons/folder_vscode.svg"
+ },
+ "_folder_vscode_open": {
+ "iconPath": "../icons/folder_vscode_open.svg"
+ },
+ "_folder_dark": {
+ "iconPath": "../icons/folder_dark.svg"
+ },
+ "_folder_dark_build": {
+ "iconPath": "../icons/folder_dark_build.svg"
+ },
+ "_folder_light": {
+ "iconPath": "../icons/folder_light.svg"
+ },
+ "_folder_light_build": {
+ "iconPath": "../icons/folder_light_build.svg"
+ },
+ "_file_folder": {
+ "iconPath": "../icons/file_folder.svg"
+ },
+ "_file_folder_build": {
+ "iconPath": "../icons/file_folder_build.svg"
+ },
+ "_folder_open": {
+ "iconPath": "../icons/folder_open.svg"
+ },
+ "_folder_open_build": {
+ "iconPath": "../icons/folder_open_build.svg"
+ }
+ }
+ }
+ },
+ "themeVariants": {
+ "Darker": "./themes/Material-Theme-Darker.json",
+ "Darker High Contrast": "./themes/Material-Theme-Darker-High-Contrast.json",
+ "Default": "./themes/Material-Theme-Default.json",
+ "Default High Contrast": "./themes/Material-Theme-Default-High-Contrast.json",
+ "Light": "./themes/Material-Theme-Lighter.json",
+ "Light High Contrast": "./themes/Material-Theme-Lighter-High-Contrast.json",
+ "Palenight": "./themes/Material-Theme-Palenight.json",
+ "Palenight High Contrast": "./themes/Material-Theme-Palenight-High-Contrast.json"
+ },
+ "themeVariantsColours": {
+ "Darker": "#424242",
+ "Darker High Contrast": "#424242",
+ "Default": "#4A616C",
+ "Default High Contrast": "#4A616C",
+ "Light": "#90A4AE",
+ "Light High Contrast": "#90A4AE",
+ "Palenight": "#4E5579",
+ "Palenight High Contrast": "#4E5579"
+ },
+ "themeVariantsUITheme": {
+ "Darker": "vs-dark",
+ "Darker High Contrast": "vs-dark",
+ "Default": "vs-dark",
+ "Default High Contrast": "vs-dark",
+ "Light": "vs",
+ "Light High Contrast": "vs",
+ "Palenight": "vs-dark",
+ "Palenight High Contrast": "vs-dark"
+ },
+ "variantsIcons": [
+ "_folder_dark_build",
+ "_folder_dark",
+ "_folder_light_build",
+ "_folder_light",
+ "_folder_vscode",
+ "_folder_gulp",
+ "_folder_node",
+ "_folder_images",
+ "_folder_js",
+ "_folder_src",
+ "_folder_assets",
+ "_folder_bower",
+ "_folder_git",
+ "_folder_github",
+ "_folder_test",
+ "_folder_dist",
+ "_folder_ci"
+ ]
+}
\ No newline at end of file
diff --git a/extensions/helpers/changelog.ts b/extensions/helpers/changelog.ts
new file mode 100644
index 0000000..d5a13aa
Binary files /dev/null and b/extensions/helpers/changelog.ts differ
diff --git a/extensions/helpers/fs.ts b/extensions/helpers/fs.ts
new file mode 100644
index 0000000..674a82e
Binary files /dev/null and b/extensions/helpers/fs.ts differ
diff --git a/extensions/helpers/settings.ts b/extensions/helpers/settings.ts
new file mode 100644
index 0000000..673405f
Binary files /dev/null and b/extensions/helpers/settings.ts differ
diff --git a/extensions/helpers/vscode.ts b/extensions/helpers/vscode.ts
new file mode 100644
index 0000000..650dd51
Binary files /dev/null and b/extensions/helpers/vscode.ts differ
diff --git a/extensions/interfaces/iaccent-custom-property.ts b/extensions/interfaces/iaccent-custom-property.ts
new file mode 100644
index 0000000..3fe0b31
Binary files /dev/null and b/extensions/interfaces/iaccent-custom-property.ts differ
diff --git a/extensions/interfaces/idefaults.ts b/extensions/interfaces/idefaults.ts
new file mode 100644
index 0000000..a23e4ff
Binary files /dev/null and b/extensions/interfaces/idefaults.ts differ
diff --git a/extensions/interfaces/igeneric-object.ts b/extensions/interfaces/igeneric-object.ts
new file mode 100644
index 0000000..7f97a2c
Binary files /dev/null and b/extensions/interfaces/igeneric-object.ts differ
diff --git a/extensions/interfaces/ipackage.json.ts b/extensions/interfaces/ipackage.json.ts
new file mode 100644
index 0000000..8b035e5
Binary files /dev/null and b/extensions/interfaces/ipackage.json.ts differ
diff --git a/extensions/interfaces/ipaths.ts b/extensions/interfaces/ipaths.ts
new file mode 100644
index 0000000..d5282d7
Binary files /dev/null and b/extensions/interfaces/ipaths.ts differ
diff --git a/extensions/interfaces/itheme-custom-properties.ts b/extensions/interfaces/itheme-custom-properties.ts
new file mode 100644
index 0000000..e7f1159
Binary files /dev/null and b/extensions/interfaces/itheme-custom-properties.ts differ
diff --git a/extensions/interfaces/itheme-icons.ts b/extensions/interfaces/itheme-icons.ts
new file mode 100644
index 0000000..8bbb976
Binary files /dev/null and b/extensions/interfaces/itheme-icons.ts differ
diff --git a/extensions/material.theme.config.ts b/extensions/material.theme.config.ts
new file mode 100644
index 0000000..8e78d65
Binary files /dev/null and b/extensions/material.theme.config.ts differ
diff --git a/gulpfile.babel.ts b/gulpfile.babel.ts
new file mode 100644
index 0000000..40ab315
--- /dev/null
+++ b/gulpfile.babel.ts
@@ -0,0 +1,9 @@
+import * as Gulp from 'gulp';
+import * as GulpStats from 'gulp-stats';
+import * as tasks from './.gulp';
+
+// Use gulp-stats
+GulpStats(Gulp);
+
+// set default task
+Gulp.task('default', tasks.default as any);
\ No newline at end of file
diff --git a/iconlist.json b/iconlist.json
new file mode 100644
index 0000000..83ccbc5
--- /dev/null
+++ b/iconlist.json
@@ -0,0 +1,113 @@
+[
+ "actionscript",
+ "ai",
+ "android",
+ "angular",
+ "arduino",
+ "assembly",
+ "autohotkey",
+ "bower",
+ "c-lang",
+ "certificate",
+ "changelog",
+ "clojure",
+ "cmake",
+ "cmd",
+ "coffee",
+ "console",
+ "contributing",
+ "cpp",
+ "credits",
+ "csharp",
+ "css-map",
+ "css",
+ "dart",
+ "database",
+ "dlang",
+ "docker",
+ "document",
+ "email",
+ "exe",
+ "favicon",
+ "file",
+ "flash",
+ "flow",
+ "folder-light",
+ "folder-outline",
+ "folder",
+ "font",
+ "fsharp",
+ "git",
+ "github",
+ "gopher",
+ "gradle",
+ "groovy",
+ "grunt",
+ "gulp",
+ "haskell",
+ "html",
+ "image",
+ "ionic",
+ "java",
+ "javascript-map",
+ "js",
+ "json",
+ "key",
+ "kotlin",
+ "less",
+ "lib",
+ "license",
+ "lua",
+ "markdown",
+ "markup",
+ "movie",
+ "music",
+ "mustache",
+ "mxml",
+ "nodejs",
+ "npm",
+ "ocaml",
+ "pdf",
+ "php",
+ "polymer",
+ "postcss",
+ "powerpoint",
+ "procfile",
+ "pug",
+ "python",
+ "r",
+ "rails",
+ "raml",
+ "react",
+ "readme",
+ "ruby",
+ "rust",
+ "sass",
+ "settings",
+ "sketch",
+ "star",
+ "stylus",
+ "sublime",
+ "svg",
+ "swc",
+ "swift",
+ "swig",
+ "table",
+ "tex",
+ "todo",
+ "tune",
+ "twig",
+ "typescript",
+ "typescript_def",
+ "url",
+ "virtual",
+ "visualstudio",
+ "vue",
+ "webpack",
+ "word",
+ "xaml",
+ "xml",
+ "yaml",
+ "yarn",
+ "zip"
+]
\ No newline at end of file
diff --git a/logo.png b/logo.png
new file mode 100644
index 0000000..c30b64f
Binary files /dev/null and b/logo.png differ
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..3bd6035
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,9623 @@
+{
+ "name": "vsc-material-theme",
+ "version": "1.6.0",
+ "lockfileVersion": 1,
+ "requires": true,
+ "dependencies": {
+ "@types/chalk": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-2.2.0.tgz",
+ "integrity": "sha512-1zzPV9FDe1I/WHhRkf9SNgqtRJWZqrBWgu7JGveuHmmyR9CnAPCie2N/x+iHrgnpYBIcCJWHBoMRv2TRWktsvw==",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3"
+ }
+ },
+ "@types/chokidar": {
+ "version": "1.7.4",
+ "resolved": "https://registry.npmjs.org/@types/chokidar/-/chokidar-1.7.4.tgz",
+ "integrity": "sha512-QVuksEzbvU22DJg9vFW9O++u0yT6aXnn64qq/KzaUUWuf+E2IAEzAM90qGlgWpLq3pPHbUfvmlJz1TZnUePQUg==",
+ "dev": true,
+ "requires": {
+ "@types/events": "1.1.0",
+ "@types/node": "9.4.5"
+ }
+ },
+ "@types/events": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@types/events/-/events-1.1.0.tgz",
+ "integrity": "sha512-y3bR98mzYOo0pAZuiLari+cQyiKk3UXRuT45h1RjhfeCzqkjaVsfZJNaxdgtk7/3tzOm1ozLTqEqMP3VbI48jw==",
+ "dev": true
+ },
+ "@types/glob": {
+ "version": "5.0.35",
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.35.tgz",
+ "integrity": "sha512-wc+VveszMLyMWFvXLkloixT4n0harUIVZjnpzztaZ0nKLuul7Z32iMt2fUFGAaZ4y1XWjFRMtCI5ewvyh4aIeg==",
+ "dev": true,
+ "requires": {
+ "@types/events": "1.1.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "9.4.5"
+ }
+ },
+ "@types/glob-stream": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/@types/glob-stream/-/glob-stream-6.1.0.tgz",
+ "integrity": "sha512-RHv6ZQjcTncXo3thYZrsbAVwoy4vSKosSWhuhuQxLOTv74OJuFQxXkmUuZCr3q9uNBEVCvIzmZL/FeRNbHZGUg==",
+ "dev": true,
+ "requires": {
+ "@types/glob": "5.0.35",
+ "@types/node": "9.4.5"
+ }
+ },
+ "@types/gulp": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/@types/gulp/-/gulp-4.0.5.tgz",
+ "integrity": "sha512-nx1QjPTiRpvLfYsZ7MBu7bT6Cm7tAXyLbY0xbdx2IEMxCK2v2urIhJMQZHW0iV1TskM71Xl6p2uRRuWDbk+/7g==",
+ "dev": true,
+ "requires": {
+ "@types/chokidar": "1.7.4",
+ "@types/undertaker": "1.1.4",
+ "@types/vinyl-fs": "2.4.8"
+ }
+ },
+ "@types/gulp-if": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmjs.org/@types/gulp-if/-/gulp-if-0.0.33.tgz",
+ "integrity": "sha512-J5lzff21X7r1x/4hSzn02GgIUEyjCqYIXZ9GgGBLhbsD3RiBdqwnkFWgF16/0jO5rcVZ52Zp+6MQMQdvIsWuKg==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.4.5",
+ "@types/vinyl": "2.0.2"
+ }
+ },
+ "@types/gulp-util": {
+ "version": "3.0.34",
+ "resolved": "https://registry.npmjs.org/@types/gulp-util/-/gulp-util-3.0.34.tgz",
+ "integrity": "sha512-E06WN1OfqL5UsMwJ1T7ClgnaXgaPipb7Ee8euMc3KRHLNqxdvWrDir9KA6uevgzBgT7XbjgmzZA2pkzDqBBX7A==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.4.5",
+ "@types/through2": "2.0.33",
+ "@types/vinyl": "2.0.2",
+ "chalk": "2.3.1"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz",
+ "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "chalk": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz",
+ "integrity": "sha512-QUU4ofkDoMIVO7hcx1iPTISs88wsO8jA92RQIm4JAwZvFGGAV2hSAA1NX7oVj2Ej2Q6NDTcRDjPTFrMCRZoJ6g==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.0",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.2.0"
+ }
+ },
+ "supports-color": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.2.0.tgz",
+ "integrity": "sha512-F39vS48la4YvTZUPVeTqsjsFNrvcMwrV3RLZINsmHo+7djCvuUzSIeXOnZ5hmjef4bajL1dNccN+tg5XAliO5Q==",
+ "dev": true,
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ }
+ }
+ },
+ "@types/minimatch": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
+ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+ "dev": true
+ },
+ "@types/mustache": {
+ "version": "0.8.30",
+ "resolved": "https://registry.npmjs.org/@types/mustache/-/mustache-0.8.30.tgz",
+ "integrity": "sha512-z80ZxL9CwGlyyuZ7fz3RBtsxzSasf8R8LeSQYF5xrdFVlkV4fsdJ51U1F1lSFAL+Xwk9Jxe7aueeeBedAi52Eg==",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "9.4.5",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-9.4.5.tgz",
+ "integrity": "sha512-DvC7bzO5797bkApgukxouHmkOdYN2D0yL5olw0RncDpXUa6n39qTVsUi/5g2QJjPgl8qn4zh+4h0sofNoWGLRg==",
+ "dev": true
+ },
+ "@types/run-sequence": {
+ "version": "0.0.30",
+ "resolved": "https://registry.npmjs.org/@types/run-sequence/-/run-sequence-0.0.30.tgz",
+ "integrity": "sha512-XwGr1b4yCGUILKeBkzmeWcxmGHQ0vFFFpA6D6y1yLO6gKmYorF+PHqdU5KG+nWt38OvtrkDptmrSmlHX/XtpLw==",
+ "dev": true,
+ "requires": {
+ "@types/gulp": "4.0.5",
+ "@types/node": "9.4.5"
+ }
+ },
+ "@types/through2": {
+ "version": "2.0.33",
+ "resolved": "https://registry.npmjs.org/@types/through2/-/through2-2.0.33.tgz",
+ "integrity": "sha1-H/LoihAN+1sUDnu5h5HxGUQA0TE=",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.4.5"
+ }
+ },
+ "@types/undertaker": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/@types/undertaker/-/undertaker-1.1.4.tgz",
+ "integrity": "sha512-LhkjHZmh7zDJm4SRn59+LN7rYMy41s+GkKmMiaoXpnsWijkYTLPnOG4z8s2SLS5PE/fEZrQXhLBTR+iImM3feA==",
+ "dev": true,
+ "requires": {
+ "@types/events": "1.1.0",
+ "@types/undertaker-registry": "1.0.1"
+ }
+ },
+ "@types/undertaker-registry": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@types/undertaker-registry/-/undertaker-registry-1.0.1.tgz",
+ "integrity": "sha512-Z4TYuEKn9+RbNVk1Ll2SS4x1JeLHecolIbM/a8gveaHsW0Hr+RQMraZACwTO2VD7JvepgA6UO1A1VrbktQrIbQ==",
+ "dev": true
+ },
+ "@types/vinyl": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/@types/vinyl/-/vinyl-2.0.2.tgz",
+ "integrity": "sha512-2iYpNuOl98SrLPBZfEN9Mh2JCJ2EI9HU35SfgBEb51DcmaHkhp8cKMblYeBqMQiwXMgAD3W60DbQ4i/UdLiXhw==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.4.5"
+ }
+ },
+ "@types/vinyl-fs": {
+ "version": "2.4.8",
+ "resolved": "https://registry.npmjs.org/@types/vinyl-fs/-/vinyl-fs-2.4.8.tgz",
+ "integrity": "sha512-yE2pN9OOrxJVeO7IZLHAHrh5R4Q0osbn5WQRuQU6GdXoK7dNFrMK3K7YhATkzf3z0yQBkol3+gafs7Rp0s7dDg==",
+ "dev": true,
+ "requires": {
+ "@types/glob-stream": "6.1.0",
+ "@types/node": "9.4.5",
+ "@types/vinyl": "2.0.2"
+ }
+ },
+ "@types/yamljs": {
+ "version": "0.2.30",
+ "resolved": "https://registry.npmjs.org/@types/yamljs/-/yamljs-0.2.30.tgz",
+ "integrity": "sha1-0DTh0ynkbo0Pc3yajbl/aPgbU4I=",
+ "dev": true
+ },
+ "@types/yargs": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-10.0.1.tgz",
+ "integrity": "sha512-EvK+v8864qaRCjtqcJa7iUKWYTIvbdSZ4MJd99QTcBpq2FbVllwW7ldRBesBYINgj2Mn0yMQ2yZZJPej1DcJFA==",
+ "dev": true
+ },
+ "JSONStream": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.2.tgz",
+ "integrity": "sha1-wQI3G27Dp887hHygDCC7D85Mbeo=",
+ "dev": true,
+ "requires": {
+ "jsonparse": "1.3.1",
+ "through": "2.3.8"
+ }
+ },
+ "acorn": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.4.1.tgz",
+ "integrity": "sha512-XLmq3H/BVvW6/GbxKryGxWORz1ebilSsUDlyC27bXhWGWAZWkGwS6FLHjOlwFXNFoWFQEO/Df4u0YYd0K3BQgQ==",
+ "dev": true
+ },
+ "acorn-jsx": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz",
+ "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=",
+ "dev": true,
+ "requires": {
+ "acorn": "3.3.0"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz",
+ "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=",
+ "dev": true
+ }
+ }
+ },
+ "add-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz",
+ "integrity": "sha1-anmQQ3ynNtXhKI25K9MmbV9csqo=",
+ "dev": true
+ },
+ "ajv": {
+ "version": "5.5.2",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
+ "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
+ "dev": true,
+ "requires": {
+ "co": "4.6.0",
+ "fast-deep-equal": "1.0.0",
+ "fast-json-stable-stringify": "2.0.0",
+ "json-schema-traverse": "0.3.1"
+ }
+ },
+ "ajv-keywords": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz",
+ "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=",
+ "dev": true
+ },
+ "align-text": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz",
+ "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2",
+ "longest": "1.0.1",
+ "repeat-string": "1.6.1"
+ }
+ },
+ "amdefine": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
+ "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
+ "dev": true
+ },
+ "ansi-colors": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz",
+ "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==",
+ "dev": true,
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-cyan": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz",
+ "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=",
+ "dev": true,
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-escapes": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz",
+ "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4="
+ },
+ "ansi-gray": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz",
+ "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=",
+ "dev": true,
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-red": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz",
+ "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=",
+ "dev": true,
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
+ },
+ "ansi-wrap": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz",
+ "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=",
+ "dev": true
+ },
+ "anymatch": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz",
+ "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==",
+ "dev": true,
+ "requires": {
+ "micromatch": "2.3.11",
+ "normalize-path": "2.1.1"
+ }
+ },
+ "archy": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz",
+ "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=",
+ "dev": true
+ },
+ "argparse": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz",
+ "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=",
+ "dev": true,
+ "requires": {
+ "sprintf-js": "1.0.3"
+ }
+ },
+ "arr-diff": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
+ "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "1.1.0"
+ }
+ },
+ "arr-flatten": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
+ "dev": true
+ },
+ "arr-union": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
+ "dev": true
+ },
+ "array-differ": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz",
+ "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=",
+ "dev": true
+ },
+ "array-each": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz",
+ "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=",
+ "dev": true
+ },
+ "array-filter": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz",
+ "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=",
+ "dev": true
+ },
+ "array-find-index": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
+ "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
+ "dev": true
+ },
+ "array-ify": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz",
+ "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=",
+ "dev": true
+ },
+ "array-map": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz",
+ "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=",
+ "dev": true
+ },
+ "array-reduce": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz",
+ "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=",
+ "dev": true
+ },
+ "array-slice": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz",
+ "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==",
+ "dev": true
+ },
+ "array-union": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
+ "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
+ "dev": true,
+ "requires": {
+ "array-uniq": "1.0.3"
+ }
+ },
+ "array-uniq": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
+ "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
+ "dev": true
+ },
+ "array-unique": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
+ "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=",
+ "dev": true
+ },
+ "arrify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
+ "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
+ "dev": true
+ },
+ "asn1": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz",
+ "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=",
+ "dev": true
+ },
+ "assert-plus": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz",
+ "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=",
+ "dev": true
+ },
+ "assign-symbols": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
+ "dev": true
+ },
+ "async": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
+ "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
+ "dev": true
+ },
+ "async-each": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz",
+ "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=",
+ "dev": true
+ },
+ "asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
+ "dev": true
+ },
+ "atob": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/atob/-/atob-2.0.3.tgz",
+ "integrity": "sha1-GcenYEc3dEaPILLS0DNyrX1Mv10=",
+ "dev": true
+ },
+ "aws-sign2": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz",
+ "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=",
+ "dev": true
+ },
+ "aws4": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz",
+ "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=",
+ "dev": true
+ },
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-core": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz",
+ "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-generator": "6.26.1",
+ "babel-helpers": "6.24.1",
+ "babel-messages": "6.23.0",
+ "babel-register": "6.26.0",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "convert-source-map": "1.5.1",
+ "debug": "2.6.9",
+ "json5": "0.5.1",
+ "lodash": "4.17.5",
+ "minimatch": "3.0.4",
+ "path-is-absolute": "1.0.1",
+ "private": "0.1.8",
+ "slash": "1.0.0",
+ "source-map": "0.5.7"
+ }
+ },
+ "babel-generator": {
+ "version": "6.26.1",
+ "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
+ "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
+ "dev": true,
+ "requires": {
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "detect-indent": "4.0.0",
+ "jsesc": "1.3.0",
+ "lodash": "4.17.5",
+ "source-map": "0.5.7",
+ "trim-right": "1.0.1"
+ }
+ },
+ "babel-helper-call-delegate": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz",
+ "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=",
+ "dev": true,
+ "requires": {
+ "babel-helper-hoist-variables": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-helper-define-map": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz",
+ "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=",
+ "dev": true,
+ "requires": {
+ "babel-helper-function-name": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "lodash": "4.17.5"
+ }
+ },
+ "babel-helper-function-name": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz",
+ "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=",
+ "dev": true,
+ "requires": {
+ "babel-helper-get-function-arity": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-helper-get-function-arity": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz",
+ "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-helper-hoist-variables": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz",
+ "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-helper-optimise-call-expression": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz",
+ "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-helper-regex": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz",
+ "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "lodash": "4.17.5"
+ }
+ },
+ "babel-helper-replace-supers": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz",
+ "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=",
+ "dev": true,
+ "requires": {
+ "babel-helper-optimise-call-expression": "6.24.1",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-helpers": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz",
+ "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0"
+ }
+ },
+ "babel-messages": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-check-es2015-constants": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz",
+ "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-arrow-functions": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz",
+ "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-block-scoped-functions": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz",
+ "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-block-scoping": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz",
+ "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "lodash": "4.17.5"
+ }
+ },
+ "babel-plugin-transform-es2015-classes": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz",
+ "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=",
+ "dev": true,
+ "requires": {
+ "babel-helper-define-map": "6.26.0",
+ "babel-helper-function-name": "6.24.1",
+ "babel-helper-optimise-call-expression": "6.24.1",
+ "babel-helper-replace-supers": "6.24.1",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-computed-properties": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz",
+ "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-destructuring": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz",
+ "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-duplicate-keys": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz",
+ "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-for-of": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz",
+ "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-function-name": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz",
+ "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=",
+ "dev": true,
+ "requires": {
+ "babel-helper-function-name": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-literals": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz",
+ "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-modules-amd": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz",
+ "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=",
+ "dev": true,
+ "requires": {
+ "babel-plugin-transform-es2015-modules-commonjs": "6.26.0",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-modules-commonjs": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz",
+ "integrity": "sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo=",
+ "dev": true,
+ "requires": {
+ "babel-plugin-transform-strict-mode": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-modules-systemjs": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz",
+ "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=",
+ "dev": true,
+ "requires": {
+ "babel-helper-hoist-variables": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-modules-umd": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz",
+ "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=",
+ "dev": true,
+ "requires": {
+ "babel-plugin-transform-es2015-modules-amd": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-object-super": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz",
+ "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=",
+ "dev": true,
+ "requires": {
+ "babel-helper-replace-supers": "6.24.1",
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-parameters": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz",
+ "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=",
+ "dev": true,
+ "requires": {
+ "babel-helper-call-delegate": "6.24.1",
+ "babel-helper-get-function-arity": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-shorthand-properties": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz",
+ "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-spread": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz",
+ "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-sticky-regex": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz",
+ "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=",
+ "dev": true,
+ "requires": {
+ "babel-helper-regex": "6.26.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-template-literals": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz",
+ "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-typeof-symbol": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz",
+ "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-unicode-regex": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz",
+ "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=",
+ "dev": true,
+ "requires": {
+ "babel-helper-regex": "6.26.0",
+ "babel-runtime": "6.26.0",
+ "regexpu-core": "2.0.0"
+ }
+ },
+ "babel-plugin-transform-regenerator": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz",
+ "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=",
+ "dev": true,
+ "requires": {
+ "regenerator-transform": "0.10.1"
+ }
+ },
+ "babel-plugin-transform-strict-mode": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz",
+ "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-polyfill": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.23.0.tgz",
+ "integrity": "sha1-g2TKYt+Or7gwSZ9pkXdGbDsDSZ0=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "core-js": "2.5.3",
+ "regenerator-runtime": "0.10.5"
+ }
+ },
+ "babel-preset-es2015": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz",
+ "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=",
+ "dev": true,
+ "requires": {
+ "babel-plugin-check-es2015-constants": "6.22.0",
+ "babel-plugin-transform-es2015-arrow-functions": "6.22.0",
+ "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0",
+ "babel-plugin-transform-es2015-block-scoping": "6.26.0",
+ "babel-plugin-transform-es2015-classes": "6.24.1",
+ "babel-plugin-transform-es2015-computed-properties": "6.24.1",
+ "babel-plugin-transform-es2015-destructuring": "6.23.0",
+ "babel-plugin-transform-es2015-duplicate-keys": "6.24.1",
+ "babel-plugin-transform-es2015-for-of": "6.23.0",
+ "babel-plugin-transform-es2015-function-name": "6.24.1",
+ "babel-plugin-transform-es2015-literals": "6.22.0",
+ "babel-plugin-transform-es2015-modules-amd": "6.24.1",
+ "babel-plugin-transform-es2015-modules-commonjs": "6.26.0",
+ "babel-plugin-transform-es2015-modules-systemjs": "6.24.1",
+ "babel-plugin-transform-es2015-modules-umd": "6.24.1",
+ "babel-plugin-transform-es2015-object-super": "6.24.1",
+ "babel-plugin-transform-es2015-parameters": "6.24.1",
+ "babel-plugin-transform-es2015-shorthand-properties": "6.24.1",
+ "babel-plugin-transform-es2015-spread": "6.22.0",
+ "babel-plugin-transform-es2015-sticky-regex": "6.24.1",
+ "babel-plugin-transform-es2015-template-literals": "6.22.0",
+ "babel-plugin-transform-es2015-typeof-symbol": "6.23.0",
+ "babel-plugin-transform-es2015-unicode-regex": "6.24.1",
+ "babel-plugin-transform-regenerator": "6.26.0"
+ }
+ },
+ "babel-register": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz",
+ "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=",
+ "dev": true,
+ "requires": {
+ "babel-core": "6.26.0",
+ "babel-runtime": "6.26.0",
+ "core-js": "2.5.3",
+ "home-or-tmp": "2.0.0",
+ "lodash": "4.17.5",
+ "mkdirp": "0.5.1",
+ "source-map-support": "0.4.18"
+ }
+ },
+ "babel-root-import": {
+ "version": "4.1.8",
+ "resolved": "https://registry.npmjs.org/babel-root-import/-/babel-root-import-4.1.8.tgz",
+ "integrity": "sha1-E1u4OYbVfW91upt3crMWM+Ivvaw=",
+ "dev": true,
+ "requires": {
+ "slash": "1.0.0"
+ }
+ },
+ "babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+ "requires": {
+ "core-js": "2.5.3",
+ "regenerator-runtime": "0.11.1"
+ },
+ "dependencies": {
+ "regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
+ }
+ }
+ },
+ "babel-template": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
+ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "lodash": "4.17.5"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.2",
+ "lodash": "4.17.5"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.5",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "base": {
+ "version": "0.11.2",
+ "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
+ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+ "dev": true,
+ "requires": {
+ "cache-base": "1.0.1",
+ "class-utils": "0.3.6",
+ "component-emitter": "1.2.1",
+ "define-property": "1.0.0",
+ "isobject": "3.0.1",
+ "mixin-deep": "1.3.1",
+ "pascalcase": "0.1.1"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ }
+ }
+ },
+ "bcrypt-pbkdf": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz",
+ "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "tweetnacl": "0.14.5"
+ }
+ },
+ "beeper": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz",
+ "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=",
+ "dev": true
+ },
+ "binary-extensions": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz",
+ "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=",
+ "dev": true
+ },
+ "block-stream": {
+ "version": "0.0.9",
+ "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz",
+ "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.3"
+ }
+ },
+ "boolbase": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+ "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=",
+ "dev": true
+ },
+ "boom": {
+ "version": "2.10.1",
+ "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz",
+ "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=",
+ "dev": true,
+ "requires": {
+ "hoek": "2.16.3"
+ }
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "braces": {
+ "version": "1.8.5",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
+ "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
+ "dev": true,
+ "requires": {
+ "expand-range": "1.8.2",
+ "preserve": "0.2.0",
+ "repeat-element": "1.1.2"
+ }
+ },
+ "browser-stdout": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz",
+ "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=",
+ "dev": true
+ },
+ "buffer-crc32": {
+ "version": "0.2.13",
+ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
+ "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=",
+ "dev": true
+ },
+ "builtin-modules": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
+ "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
+ "dev": true
+ },
+ "bump-regex": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/bump-regex/-/bump-regex-3.1.0.tgz",
+ "integrity": "sha512-pgiPDUHh6bT/MDBU/nA1dU67337qD4MbrpQHmpDMiBChEsPEZwNelO25GenJrRYUXbWZuvsIZGLBChtN8Nxb+g==",
+ "dev": true,
+ "requires": {
+ "semver": "5.5.0",
+ "xtend": "4.0.1"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
+ "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==",
+ "dev": true
+ }
+ }
+ },
+ "cache-base": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
+ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+ "dev": true,
+ "requires": {
+ "collection-visit": "1.0.0",
+ "component-emitter": "1.2.1",
+ "get-value": "2.0.6",
+ "has-value": "1.0.0",
+ "isobject": "3.0.1",
+ "set-value": "2.0.0",
+ "to-object-path": "0.3.0",
+ "union-value": "1.0.0",
+ "unset-value": "1.0.0"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ }
+ }
+ },
+ "caller-path": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz",
+ "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=",
+ "dev": true,
+ "requires": {
+ "callsites": "0.2.0"
+ }
+ },
+ "callsites": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz",
+ "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=",
+ "dev": true
+ },
+ "camelcase": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
+ "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
+ "dev": true
+ },
+ "camelcase-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
+ "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
+ "dev": true,
+ "requires": {
+ "camelcase": "2.1.1",
+ "map-obj": "1.0.1"
+ }
+ },
+ "caseless": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz",
+ "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=",
+ "dev": true
+ },
+ "center-align": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
+ "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "align-text": "0.1.4",
+ "lazy-cache": "1.0.4"
+ },
+ "dependencies": {
+ "lazy-cache": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
+ "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "chardet": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz",
+ "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I="
+ },
+ "chokidar": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz",
+ "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=",
+ "dev": true,
+ "requires": {
+ "anymatch": "1.3.2",
+ "async-each": "1.0.1",
+ "fsevents": "1.1.3",
+ "glob-parent": "2.0.0",
+ "inherits": "2.0.3",
+ "is-binary-path": "1.0.1",
+ "is-glob": "2.0.1",
+ "path-is-absolute": "1.0.1",
+ "readdirp": "2.1.0"
+ }
+ },
+ "circular-json": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz",
+ "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==",
+ "dev": true
+ },
+ "class-utils": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
+ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+ "dev": true,
+ "requires": {
+ "arr-union": "3.1.0",
+ "define-property": "0.2.5",
+ "isobject": "3.0.1",
+ "static-extend": "0.1.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
+ }
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "cli-cursor": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
+ "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
+ "requires": {
+ "restore-cursor": "2.0.0"
+ }
+ },
+ "cli-width": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
+ "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk="
+ },
+ "cliui": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz",
+ "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "center-align": "0.1.3",
+ "right-align": "0.1.3",
+ "wordwrap": "0.0.2"
+ },
+ "dependencies": {
+ "wordwrap": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
+ "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "clone": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.3.tgz",
+ "integrity": "sha1-KY1+IjFmD0DAA8LtMUDezz9TCF8=",
+ "dev": true
+ },
+ "clone-buffer": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz",
+ "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=",
+ "dev": true
+ },
+ "clone-stats": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz",
+ "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=",
+ "dev": true
+ },
+ "cloneable-readable": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.0.0.tgz",
+ "integrity": "sha1-pikNQT8hemEjL5XkWP84QYz7ARc=",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "process-nextick-args": "1.0.7",
+ "through2": "2.0.3"
+ },
+ "dependencies": {
+ "process-nextick-args": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
+ "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=",
+ "dev": true
+ }
+ }
+ },
+ "co": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+ "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
+ "dev": true
+ },
+ "coa": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.1.tgz",
+ "integrity": "sha512-5wfTTO8E2/ja4jFSxePXlG5nRu5bBtL/r1HCIpJW/lzT6yDtKl0u0Z4o/Vpz32IpKmBn7HerheEZQgA9N2DarQ==",
+ "dev": true,
+ "requires": {
+ "q": "1.5.1"
+ }
+ },
+ "code-point-at": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
+ "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
+ "dev": true
+ },
+ "collection-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
+ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+ "dev": true,
+ "requires": {
+ "map-visit": "1.0.0",
+ "object-visit": "1.0.1"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz",
+ "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "color-support": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
+ "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
+ "dev": true
+ },
+ "colors": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz",
+ "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=",
+ "dev": true
+ },
+ "combined-stream": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz",
+ "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=",
+ "dev": true,
+ "requires": {
+ "delayed-stream": "1.0.0"
+ }
+ },
+ "commander": {
+ "version": "2.14.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.14.1.tgz",
+ "integrity": "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw==",
+ "dev": true
+ },
+ "compare-func": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-1.3.2.tgz",
+ "integrity": "sha1-md0LpFfh+bxyKxLAjsM+6rMfpkg=",
+ "dev": true,
+ "requires": {
+ "array-ify": "1.0.0",
+ "dot-prop": "3.0.0"
+ }
+ },
+ "component-emitter": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
+ "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "concat-stream": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz",
+ "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.4",
+ "typedarray": "0.0.6"
+ }
+ },
+ "conventional-changelog": {
+ "version": "1.1.15",
+ "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-1.1.15.tgz",
+ "integrity": "sha512-nBHfdoIfm78Bh/8KAEKVjAfr6jT6+uAoayj8EpEIEpjXBwoB74FlC7hUDwbxbAA/WKZout8SuqnpPH0cX4/aqw==",
+ "dev": true,
+ "requires": {
+ "conventional-changelog-angular": "1.6.4",
+ "conventional-changelog-atom": "0.2.2",
+ "conventional-changelog-codemirror": "0.3.2",
+ "conventional-changelog-core": "2.0.3",
+ "conventional-changelog-ember": "0.3.4",
+ "conventional-changelog-eslint": "1.0.2",
+ "conventional-changelog-express": "0.3.2",
+ "conventional-changelog-jquery": "0.1.0",
+ "conventional-changelog-jscs": "0.1.0",
+ "conventional-changelog-jshint": "0.3.2",
+ "conventional-changelog-preset-loader": "1.1.4"
+ }
+ },
+ "conventional-changelog-angular": {
+ "version": "1.6.4",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-1.6.4.tgz",
+ "integrity": "sha512-CGtgqRBYOYYwP/FGBZ+NydolVv0+9bFcQZYMqw8YPKms1n6QlKguaqO0bfBLRChWZjDXjTI3Spd/bNineVtAqA==",
+ "dev": true,
+ "requires": {
+ "compare-func": "1.3.2",
+ "q": "1.5.1"
+ }
+ },
+ "conventional-changelog-atom": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-0.2.2.tgz",
+ "integrity": "sha512-NhQcqCMfHTIlnglX4lMskqU6NC9rSqbT7razVHZ/Fq21iEHkrWx5dhjTonRB5BAAUSowBURCczqUILZ612xFrQ==",
+ "dev": true,
+ "requires": {
+ "q": "1.5.1"
+ }
+ },
+ "conventional-changelog-codemirror": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-0.3.2.tgz",
+ "integrity": "sha512-z/ZmaSSigCw7Te6ozncLww6DmwCYGXvSbi3S7kkVvPKPRYGkKdWJI6Nmyx3AAqzzt6W420sMVOSJGX6dyEQDKw==",
+ "dev": true,
+ "requires": {
+ "q": "1.5.1"
+ }
+ },
+ "conventional-changelog-core": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-2.0.3.tgz",
+ "integrity": "sha512-yLnwThgG5M7k4ZuG87sWXQBEQPTijcB4TpUrSzJcH6Jk7vkZR4ej7GJgY5TqKKiVwALWzyAGd6GenzGbNZvYnw==",
+ "dev": true,
+ "requires": {
+ "conventional-changelog-writer": "3.0.2",
+ "conventional-commits-parser": "2.1.3",
+ "dateformat": "1.0.12",
+ "get-pkg-repo": "1.4.0",
+ "git-raw-commits": "1.3.2",
+ "git-remote-origin-url": "2.0.0",
+ "git-semver-tags": "1.3.2",
+ "lodash": "4.17.5",
+ "normalize-package-data": "2.4.0",
+ "q": "1.5.1",
+ "read-pkg": "1.1.0",
+ "read-pkg-up": "1.0.1",
+ "through2": "2.0.3"
+ },
+ "dependencies": {
+ "dateformat": {
+ "version": "1.0.12",
+ "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz",
+ "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=",
+ "dev": true,
+ "requires": {
+ "get-stdin": "4.0.1",
+ "meow": "3.7.0"
+ }
+ }
+ }
+ },
+ "conventional-changelog-ember": {
+ "version": "0.3.4",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-0.3.4.tgz",
+ "integrity": "sha512-PfwI9tvVJFn95of/g4mMBHtXZDPVNuYzi+hDyl9ZZe6/7WyUc90gj+cEgg+8gcrZwUFaZpliWavTYp6tfbBg1A==",
+ "dev": true,
+ "requires": {
+ "q": "1.5.1"
+ }
+ },
+ "conventional-changelog-eslint": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-1.0.2.tgz",
+ "integrity": "sha512-WDs2etoKFNRv3rFgbg3LqPbVWn89OL8bsRbU1NNAnpPVmWcQEGkg/Tny9BjJl++JjxmWqYY+xtPPdnvd63WIYw==",
+ "dev": true,
+ "requires": {
+ "q": "1.5.1"
+ }
+ },
+ "conventional-changelog-express": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-0.3.2.tgz",
+ "integrity": "sha512-QQU7t/Ec5bgRSoJL5gHmTfsRCrJOZHfVkbX2NNWl+EU91nAT28HgOAlD6ymH5EYMP/skpVkIwQyT9myVjxcJew==",
+ "dev": true,
+ "requires": {
+ "q": "1.5.1"
+ }
+ },
+ "conventional-changelog-jquery": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-0.1.0.tgz",
+ "integrity": "sha1-Agg5cWLjhGmG5xJztsecW1+A9RA=",
+ "dev": true,
+ "requires": {
+ "q": "1.5.1"
+ }
+ },
+ "conventional-changelog-jscs": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-jscs/-/conventional-changelog-jscs-0.1.0.tgz",
+ "integrity": "sha1-BHnrRDzH1yxYvwvPDvHURKkvDlw=",
+ "dev": true,
+ "requires": {
+ "q": "1.5.1"
+ }
+ },
+ "conventional-changelog-jshint": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-0.3.2.tgz",
+ "integrity": "sha512-b3cx1n6QyE5czpZTAEBFZxPj0aQ3vxjmdNrP+E83b+FBxh9cYZQrUXeC5rnIRvSj8rLkYAJJ07oG8PyevAxhtw==",
+ "dev": true,
+ "requires": {
+ "compare-func": "1.3.2",
+ "q": "1.5.1"
+ }
+ },
+ "conventional-changelog-preset-loader": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-1.1.4.tgz",
+ "integrity": "sha512-KY9sGPKnKlW542FpNN4++GkijXnND69/MgMa6EDibnyYXO6gV/NPwQwDTH6MOVVIjhspMgEM69H3yFVHo5Ud5g==",
+ "dev": true
+ },
+ "conventional-changelog-writer": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-3.0.2.tgz",
+ "integrity": "sha512-eYXmYxT1IUuzzfpQuFA2/t3ex+7rFBbJchDIWyDTAs7OFkPBAfAs3EG04cDkEAG6Tn3wnwrtDKVZL9sMfA3kIw==",
+ "dev": true,
+ "requires": {
+ "compare-func": "1.3.2",
+ "conventional-commits-filter": "1.1.3",
+ "dateformat": "1.0.12",
+ "handlebars": "4.0.11",
+ "json-stringify-safe": "5.0.1",
+ "lodash": "4.17.5",
+ "meow": "3.7.0",
+ "semver": "5.5.0",
+ "split": "1.0.1",
+ "through2": "2.0.3"
+ },
+ "dependencies": {
+ "dateformat": {
+ "version": "1.0.12",
+ "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz",
+ "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=",
+ "dev": true,
+ "requires": {
+ "get-stdin": "4.0.1",
+ "meow": "3.7.0"
+ }
+ },
+ "semver": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
+ "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==",
+ "dev": true
+ }
+ }
+ },
+ "conventional-commits-filter": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-1.1.3.tgz",
+ "integrity": "sha512-kwGGg0xCHR51YIVjtoCTNgx9I1qEMETerTdSK4XsH2OxNLigDn6XKXnPMFZ+gfoUxaqbnpFSJqs4jYVpuJ1XAg==",
+ "dev": true,
+ "requires": {
+ "is-subset": "0.1.1",
+ "modify-values": "1.0.0"
+ }
+ },
+ "conventional-commits-parser": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-2.1.3.tgz",
+ "integrity": "sha512-j5nXna/snJtrzFtPbDm+9R5UsjteJkXn+cG1kGEi4+4e25U57CZBB6DiUdxOCnM9LOIHeLDBF61e9MtjPsZthw==",
+ "dev": true,
+ "requires": {
+ "JSONStream": "1.3.2",
+ "is-text-path": "1.0.1",
+ "lodash": "4.17.5",
+ "meow": "3.7.0",
+ "split2": "2.2.0",
+ "through2": "2.0.3",
+ "trim-off-newlines": "1.0.1"
+ }
+ },
+ "conventional-recommended-bump": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-1.2.1.tgz",
+ "integrity": "sha512-oJjG6DkRgtnr/t/VrPdzmf4XZv8c4xKVJrVT4zrSHd92KEL+EYxSbYoKq8lQ7U5yLMw7130wrcQTLRjM/T+d4w==",
+ "dev": true,
+ "requires": {
+ "concat-stream": "1.6.0",
+ "conventional-commits-filter": "1.1.3",
+ "conventional-commits-parser": "2.1.3",
+ "git-raw-commits": "1.3.2",
+ "git-semver-tags": "1.3.2",
+ "meow": "3.7.0",
+ "object-assign": "4.1.1"
+ }
+ },
+ "convert-source-map": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz",
+ "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=",
+ "dev": true
+ },
+ "copy-descriptor": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
+ "dev": true
+ },
+ "core-js": {
+ "version": "2.5.3",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz",
+ "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4="
+ },
+ "core-util-is": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
+ "dev": true
+ },
+ "cpx": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/cpx/-/cpx-1.5.0.tgz",
+ "integrity": "sha1-GFvgGFEdhycN7czCkxceN2VauI8=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "chokidar": "1.7.0",
+ "duplexer": "0.1.1",
+ "glob": "7.1.2",
+ "glob2base": "0.0.12",
+ "minimatch": "3.0.4",
+ "mkdirp": "0.5.1",
+ "resolve": "1.5.0",
+ "safe-buffer": "5.1.1",
+ "shell-quote": "1.6.1",
+ "subarg": "1.0.0"
+ }
+ },
+ "cross-spawn": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
+ "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
+ "dev": true,
+ "requires": {
+ "lru-cache": "4.1.1",
+ "shebang-command": "1.2.0",
+ "which": "1.3.0"
+ },
+ "dependencies": {
+ "lru-cache": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz",
+ "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==",
+ "dev": true,
+ "requires": {
+ "pseudomap": "1.0.2",
+ "yallist": "2.1.2"
+ }
+ }
+ }
+ },
+ "cryptiles": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz",
+ "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=",
+ "dev": true,
+ "requires": {
+ "boom": "2.10.1"
+ }
+ },
+ "css-select": {
+ "version": "1.3.0-rc0",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.3.0-rc0.tgz",
+ "integrity": "sha1-b5MZaqrnN2ZuoQNqjLFKj8t6kjE=",
+ "dev": true,
+ "requires": {
+ "boolbase": "1.0.0",
+ "css-what": "2.1.0",
+ "domutils": "1.5.1",
+ "nth-check": "1.0.1"
+ }
+ },
+ "css-select-base-adapter": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.0.tgz",
+ "integrity": "sha1-AQKz0UYw34bD65+p9UVicBBs+ZA=",
+ "dev": true
+ },
+ "css-tree": {
+ "version": "1.0.0-alpha25",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha25.tgz",
+ "integrity": "sha512-XC6xLW/JqIGirnZuUWHXCHRaAjje2b3OIB0Vj5RIJo6mIi/AdJo30quQl5LxUl0gkXDIrTrFGbMlcZjyFplz1A==",
+ "dev": true,
+ "requires": {
+ "mdn-data": "1.1.0",
+ "source-map": "0.5.7"
+ }
+ },
+ "css-url-regex": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/css-url-regex/-/css-url-regex-1.1.0.tgz",
+ "integrity": "sha1-g4NCMMyfdMRX3lnuvRVD/uuDt+w=",
+ "dev": true
+ },
+ "css-what": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz",
+ "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=",
+ "dev": true
+ },
+ "csso": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/csso/-/csso-3.5.0.tgz",
+ "integrity": "sha512-WtJjFP3ZsSdWhiZr4/k1B9uHPgYjFYnDxfbaJxk1hz5PDLIJ5BCRWkJqaztZ0DbP8d2ZIVwUPIJb2YmCwkPaMw==",
+ "dev": true,
+ "requires": {
+ "css-tree": "1.0.0-alpha.27"
+ },
+ "dependencies": {
+ "css-tree": {
+ "version": "1.0.0-alpha.27",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.27.tgz",
+ "integrity": "sha512-BAYp9FyN4jLXjfvRpTDchBllDptqlK9I7OsagXCG9Am5C+5jc8eRZHgqb9x500W2OKS14MMlpQc/nmh/aA7TEQ==",
+ "dev": true,
+ "requires": {
+ "mdn-data": "1.1.0",
+ "source-map": "0.5.7"
+ }
+ }
+ }
+ },
+ "currently-unhandled": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
+ "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
+ "dev": true,
+ "requires": {
+ "array-find-index": "1.0.2"
+ }
+ },
+ "dargs": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/dargs/-/dargs-4.1.0.tgz",
+ "integrity": "sha1-A6nbtLXC8Tm/FK5T8LiipqhvThc=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "dashdash": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+ "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "1.0.0"
+ },
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+ "dev": true
+ }
+ }
+ },
+ "dateformat": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz",
+ "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=",
+ "dev": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
+ "dev": true
+ },
+ "decode-uri-component": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
+ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
+ "dev": true
+ },
+ "deep-assign": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/deep-assign/-/deep-assign-1.0.0.tgz",
+ "integrity": "sha1-sJJ0O+hCfcYh6gBnzex+cN0Z83s=",
+ "dev": true,
+ "requires": {
+ "is-obj": "1.0.1"
+ }
+ },
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+ "dev": true
+ },
+ "defaults": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz",
+ "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=",
+ "dev": true,
+ "requires": {
+ "clone": "1.0.3"
+ }
+ },
+ "define-properties": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz",
+ "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=",
+ "dev": true,
+ "requires": {
+ "foreach": "2.0.5",
+ "object-keys": "1.0.11"
+ }
+ },
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "del": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz",
+ "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=",
+ "dev": true,
+ "requires": {
+ "globby": "5.0.0",
+ "is-path-cwd": "1.0.0",
+ "is-path-in-cwd": "1.0.0",
+ "object-assign": "4.1.1",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1",
+ "rimraf": "2.6.2"
+ }
+ },
+ "delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
+ "dev": true
+ },
+ "deprecated": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/deprecated/-/deprecated-0.0.1.tgz",
+ "integrity": "sha1-+cmvVGSvoeepcUWKi97yqpTVuxk=",
+ "dev": true
+ },
+ "detect-file": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz",
+ "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=",
+ "dev": true
+ },
+ "detect-indent": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+ "dev": true,
+ "requires": {
+ "repeating": "2.0.1"
+ }
+ },
+ "diff": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz",
+ "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==",
+ "dev": true
+ },
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2"
+ }
+ },
+ "dom-serializer": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz",
+ "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=",
+ "dev": true,
+ "requires": {
+ "domelementtype": "1.1.3",
+ "entities": "1.1.1"
+ },
+ "dependencies": {
+ "domelementtype": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz",
+ "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=",
+ "dev": true
+ }
+ }
+ },
+ "domelementtype": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz",
+ "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=",
+ "dev": true
+ },
+ "domutils": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz",
+ "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=",
+ "dev": true,
+ "requires": {
+ "dom-serializer": "0.1.0",
+ "domelementtype": "1.3.0"
+ }
+ },
+ "dot-prop": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-3.0.0.tgz",
+ "integrity": "sha1-G3CK8JSknJoOfbyteQq6U52sEXc=",
+ "dev": true,
+ "requires": {
+ "is-obj": "1.0.1"
+ }
+ },
+ "dotgitignore": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/dotgitignore/-/dotgitignore-1.0.3.tgz",
+ "integrity": "sha512-eu5XjSstm0WXQsARgo6kPjkINYZlOUW+z/KtAAIBjHa5mUpMPrxJytbPIndWz6GubBuuuH5ljtVcXKnVnH5q8w==",
+ "dev": true,
+ "requires": {
+ "find-up": "2.1.0",
+ "minimatch": "3.0.4"
+ },
+ "dependencies": {
+ "find-up": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
+ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
+ "dev": true,
+ "requires": {
+ "locate-path": "2.0.0"
+ }
+ }
+ }
+ },
+ "duplexer": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz",
+ "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=",
+ "dev": true
+ },
+ "duplexer2": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz",
+ "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "1.1.14"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "1.1.14",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+ "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "0.0.1",
+ "string_decoder": "0.10.31"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ }
+ }
+ },
+ "duplexify": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.3.tgz",
+ "integrity": "sha512-g8ID9OroF9hKt2POf8YLayy+9594PzmM3scI00/uBXocX3TWNgoB67hjzkFe9ITAbQOne/lLdBxHXvYUM4ZgGA==",
+ "dev": true,
+ "requires": {
+ "end-of-stream": "1.4.1",
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.4",
+ "stream-shift": "1.0.0"
+ },
+ "dependencies": {
+ "end-of-stream": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
+ "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==",
+ "dev": true,
+ "requires": {
+ "once": "1.4.0"
+ }
+ }
+ }
+ },
+ "ecc-jsbn": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz",
+ "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "jsbn": "0.1.1"
+ }
+ },
+ "encoding": {
+ "version": "0.1.12",
+ "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz",
+ "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=",
+ "requires": {
+ "iconv-lite": "0.4.19"
+ }
+ },
+ "end-of-stream": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-0.1.5.tgz",
+ "integrity": "sha1-jhdyBsPICDfYVjLouTWd/osvbq8=",
+ "dev": true,
+ "requires": {
+ "once": "1.3.3"
+ },
+ "dependencies": {
+ "once": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz",
+ "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ }
+ }
+ },
+ "entities": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz",
+ "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=",
+ "dev": true
+ },
+ "error-ex": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz",
+ "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=",
+ "dev": true,
+ "requires": {
+ "is-arrayish": "0.2.1"
+ }
+ },
+ "es-abstract": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.10.0.tgz",
+ "integrity": "sha512-/uh/DhdqIOSkAWifU+8nG78vlQxdLckUdI/sPgy0VhuXi2qJ7T8czBmqIYtLQVpCIFYafChnsRsB5pyb1JdmCQ==",
+ "dev": true,
+ "requires": {
+ "es-to-primitive": "1.1.1",
+ "function-bind": "1.1.1",
+ "has": "1.0.1",
+ "is-callable": "1.1.3",
+ "is-regex": "1.0.4"
+ }
+ },
+ "es-to-primitive": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz",
+ "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=",
+ "dev": true,
+ "requires": {
+ "is-callable": "1.1.3",
+ "is-date-object": "1.0.1",
+ "is-symbol": "1.0.1"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
+ },
+ "eslint": {
+ "version": "4.17.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.17.0.tgz",
+ "integrity": "sha512-AyxBUCANU/o/xC0ijGMKavo5Ls3oK6xykiOITlMdjFjrKOsqLrA7Nf5cnrDgcKrHzBirclAZt63XO7YZlVUPwA==",
+ "dev": true,
+ "requires": {
+ "ajv": "5.5.2",
+ "babel-code-frame": "6.26.0",
+ "chalk": "2.3.1",
+ "concat-stream": "1.6.0",
+ "cross-spawn": "5.1.0",
+ "debug": "3.1.0",
+ "doctrine": "2.1.0",
+ "eslint-scope": "3.7.1",
+ "eslint-visitor-keys": "1.0.0",
+ "espree": "3.5.3",
+ "esquery": "1.0.0",
+ "esutils": "2.0.2",
+ "file-entry-cache": "2.0.0",
+ "functional-red-black-tree": "1.0.1",
+ "glob": "7.1.2",
+ "globals": "11.3.0",
+ "ignore": "3.3.7",
+ "imurmurhash": "0.1.4",
+ "inquirer": "3.0.6",
+ "is-resolvable": "1.1.0",
+ "js-yaml": "3.10.0",
+ "json-stable-stringify-without-jsonify": "1.0.1",
+ "levn": "0.3.0",
+ "lodash": "4.17.5",
+ "minimatch": "3.0.4",
+ "mkdirp": "0.5.1",
+ "natural-compare": "1.4.0",
+ "optionator": "0.8.2",
+ "path-is-inside": "1.0.2",
+ "pluralize": "7.0.0",
+ "progress": "2.0.0",
+ "require-uncached": "1.0.3",
+ "semver": "5.5.0",
+ "strip-ansi": "4.0.0",
+ "strip-json-comments": "2.0.1",
+ "table": "4.0.2",
+ "text-table": "0.2.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz",
+ "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "chalk": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz",
+ "integrity": "sha512-QUU4ofkDoMIVO7hcx1iPTISs88wsO8jA92RQIm4JAwZvFGGAV2hSAA1NX7oVj2Ej2Q6NDTcRDjPTFrMCRZoJ6g==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.0",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.2.0"
+ }
+ },
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "globals": {
+ "version": "11.3.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.3.0.tgz",
+ "integrity": "sha512-kkpcKNlmQan9Z5ZmgqKH/SMbSmjxQ7QjyNqfXVc8VJcoBV2UEg+sxQD15GQofGRh2hfpwUb70VC31DR7Rq5Hdw==",
+ "dev": true
+ },
+ "semver": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
+ "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "3.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.2.0.tgz",
+ "integrity": "sha512-F39vS48la4YvTZUPVeTqsjsFNrvcMwrV3RLZINsmHo+7djCvuUzSIeXOnZ5hmjef4bajL1dNccN+tg5XAliO5Q==",
+ "dev": true,
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ }
+ }
+ },
+ "eslint-plugin-standard": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-3.0.1.tgz",
+ "integrity": "sha1-NNDJFbRe3G8BA5PH7vOCOwhWXPI=",
+ "dev": true
+ },
+ "eslint-scope": {
+ "version": "3.7.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz",
+ "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=",
+ "dev": true,
+ "requires": {
+ "esrecurse": "4.2.0",
+ "estraverse": "4.2.0"
+ }
+ },
+ "eslint-visitor-keys": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz",
+ "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==",
+ "dev": true
+ },
+ "espree": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.3.tgz",
+ "integrity": "sha512-Zy3tAJDORxQZLl2baguiRU1syPERAIg0L+JB2MWorORgTu/CplzvxS9WWA7Xh4+Q+eOQihNs/1o1Xep8cvCxWQ==",
+ "dev": true,
+ "requires": {
+ "acorn": "5.4.1",
+ "acorn-jsx": "3.0.1"
+ }
+ },
+ "esprima": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz",
+ "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==",
+ "dev": true
+ },
+ "esquery": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz",
+ "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=",
+ "dev": true,
+ "requires": {
+ "estraverse": "4.2.0"
+ }
+ },
+ "esrecurse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz",
+ "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=",
+ "dev": true,
+ "requires": {
+ "estraverse": "4.2.0",
+ "object-assign": "4.1.1"
+ }
+ },
+ "estraverse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
+ },
+ "event-stream": {
+ "version": "3.3.4",
+ "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz",
+ "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=",
+ "dev": true,
+ "requires": {
+ "duplexer": "0.1.1",
+ "from": "0.1.7",
+ "map-stream": "0.1.0",
+ "pause-stream": "0.0.11",
+ "split": "0.3.3",
+ "stream-combiner": "0.0.4",
+ "through": "2.3.8"
+ },
+ "dependencies": {
+ "split": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz",
+ "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=",
+ "dev": true,
+ "requires": {
+ "through": "2.3.8"
+ }
+ }
+ }
+ },
+ "execa": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz",
+ "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
+ "dev": true,
+ "requires": {
+ "cross-spawn": "5.1.0",
+ "get-stream": "3.0.0",
+ "is-stream": "1.1.0",
+ "npm-run-path": "2.0.2",
+ "p-finally": "1.0.0",
+ "signal-exit": "3.0.2",
+ "strip-eof": "1.0.0"
+ }
+ },
+ "expand-brackets": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
+ "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
+ "dev": true,
+ "requires": {
+ "is-posix-bracket": "0.1.1"
+ }
+ },
+ "expand-range": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
+ "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
+ "dev": true,
+ "requires": {
+ "fill-range": "2.2.3"
+ }
+ },
+ "expand-tilde": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
+ "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=",
+ "dev": true,
+ "requires": {
+ "homedir-polyfill": "1.0.1"
+ }
+ },
+ "extend": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz",
+ "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=",
+ "dev": true
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "external-editor": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.1.0.tgz",
+ "integrity": "sha512-E44iT5QVOUJBKij4IIV3uvxuNlbKS38Tw1HiupxEIHPv9qtC2PrDYohbXV5U+1jnfIXttny8gUhj+oZvflFlzA==",
+ "requires": {
+ "chardet": "0.4.2",
+ "iconv-lite": "0.4.19",
+ "tmp": "0.0.33"
+ }
+ },
+ "extglob": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
+ "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "1.0.0"
+ }
+ },
+ "extsprintf": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
+ "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
+ "dev": true
+ },
+ "fancy-log": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.2.tgz",
+ "integrity": "sha1-9BEl49hPLn2JpD0G2VjI94vha+E=",
+ "dev": true,
+ "requires": {
+ "ansi-gray": "0.1.1",
+ "color-support": "1.1.3",
+ "time-stamp": "1.1.0"
+ }
+ },
+ "fast-deep-equal": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz",
+ "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=",
+ "dev": true
+ },
+ "fast-json-stable-stringify": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
+ "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
+ "dev": true
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "fd-slicer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz",
+ "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=",
+ "dev": true,
+ "requires": {
+ "pend": "1.2.0"
+ }
+ },
+ "figures": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
+ "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
+ "requires": {
+ "escape-string-regexp": "1.0.5"
+ }
+ },
+ "file-entry-cache": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz",
+ "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=",
+ "dev": true,
+ "requires": {
+ "flat-cache": "1.3.0",
+ "object-assign": "4.1.1"
+ }
+ },
+ "filename-regex": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz",
+ "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=",
+ "dev": true
+ },
+ "fill-range": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz",
+ "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=",
+ "dev": true,
+ "requires": {
+ "is-number": "2.1.0",
+ "isobject": "2.1.0",
+ "randomatic": "1.1.7",
+ "repeat-element": "1.1.2",
+ "repeat-string": "1.6.1"
+ }
+ },
+ "find-index": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz",
+ "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=",
+ "dev": true
+ },
+ "find-up": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
+ "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
+ "dev": true,
+ "requires": {
+ "path-exists": "2.1.0",
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "findup-sync": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz",
+ "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=",
+ "dev": true,
+ "requires": {
+ "detect-file": "1.0.0",
+ "is-glob": "3.1.0",
+ "micromatch": "3.1.5",
+ "resolve-dir": "1.0.1"
+ },
+ "dependencies": {
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+ "dev": true
+ },
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+ "dev": true
+ },
+ "braces": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.0.tgz",
+ "integrity": "sha512-P4O8UQRdGiMLWSizsApmXVQDBS6KCt7dSexgLKBmH5Hr1CZq7vsnscFh8oR1sP1ab1Zj0uCHCEzZeV6SfUf3rA==",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "1.1.0",
+ "array-unique": "0.3.2",
+ "define-property": "1.0.0",
+ "extend-shallow": "2.0.1",
+ "fill-range": "4.0.0",
+ "isobject": "3.0.1",
+ "repeat-element": "1.1.2",
+ "snapdragon": "0.8.1",
+ "snapdragon-node": "2.1.1",
+ "split-string": "3.1.0",
+ "to-regex": "3.0.1"
+ }
+ },
+ "expand-brackets": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "posix-character-classes": "0.1.1",
+ "regex-not": "1.0.0",
+ "snapdragon": "0.8.1",
+ "to-regex": "3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ }
+ }
+ },
+ "extglob": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+ "dev": true,
+ "requires": {
+ "array-unique": "0.3.2",
+ "define-property": "1.0.0",
+ "expand-brackets": "2.1.4",
+ "extend-shallow": "2.0.1",
+ "fragment-cache": "0.2.1",
+ "regex-not": "1.0.0",
+ "snapdragon": "0.8.1",
+ "to-regex": "3.0.1"
+ }
+ },
+ "fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1",
+ "to-regex-range": "2.1.1"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ },
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+ "dev": true
+ },
+ "micromatch": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.5.tgz",
+ "integrity": "sha512-ykttrLPQrz1PUJcXjwsTUjGoPJ64StIGNE2lGVD1c9CuguJ+L7/navsE8IcDNndOoCMvYV0qc/exfVbMHkUhvA==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "braces": "2.3.0",
+ "define-property": "1.0.0",
+ "extend-shallow": "2.0.1",
+ "extglob": "2.0.4",
+ "fragment-cache": "0.2.1",
+ "kind-of": "6.0.2",
+ "nanomatch": "1.2.7",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.0",
+ "snapdragon": "0.8.1",
+ "to-regex": "3.0.1"
+ }
+ }
+ }
+ },
+ "fined": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fined/-/fined-1.1.0.tgz",
+ "integrity": "sha1-s33IRLdqL15wgeiE98CuNE8VNHY=",
+ "dev": true,
+ "requires": {
+ "expand-tilde": "2.0.2",
+ "is-plain-object": "2.0.4",
+ "object.defaults": "1.1.0",
+ "object.pick": "1.3.0",
+ "parse-filepath": "1.0.2"
+ }
+ },
+ "first-chunk-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz",
+ "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=",
+ "dev": true
+ },
+ "flagged-respawn": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.0.tgz",
+ "integrity": "sha1-Tnmumy6zi/hrO7Vr8+ClaqX8q9c=",
+ "dev": true
+ },
+ "flat-cache": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz",
+ "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=",
+ "dev": true,
+ "requires": {
+ "circular-json": "0.3.3",
+ "del": "2.2.2",
+ "graceful-fs": "4.1.11",
+ "write": "0.2.1"
+ }
+ },
+ "for-in": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
+ "dev": true
+ },
+ "for-own": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
+ "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
+ "dev": true,
+ "requires": {
+ "for-in": "1.0.2"
+ }
+ },
+ "foreach": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz",
+ "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=",
+ "dev": true
+ },
+ "forever-agent": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+ "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
+ "dev": true
+ },
+ "fork-stream": {
+ "version": "0.0.4",
+ "resolved": "https://registry.npmjs.org/fork-stream/-/fork-stream-0.0.4.tgz",
+ "integrity": "sha1-24Sfznf2cIpfjzhq5TOgkHtUrnA=",
+ "dev": true
+ },
+ "form-data": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz",
+ "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=",
+ "dev": true,
+ "requires": {
+ "asynckit": "0.4.0",
+ "combined-stream": "1.0.6",
+ "mime-types": "2.1.18"
+ }
+ },
+ "fragment-cache": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
+ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+ "dev": true,
+ "requires": {
+ "map-cache": "0.2.2"
+ }
+ },
+ "from": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz",
+ "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=",
+ "dev": true
+ },
+ "fs-access": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz",
+ "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=",
+ "dev": true,
+ "requires": {
+ "null-check": "1.0.0"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "fsevents": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz",
+ "integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "nan": "2.8.0",
+ "node-pre-gyp": "0.6.39"
+ },
+ "dependencies": {
+ "abbrev": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.0.tgz",
+ "integrity": "sha1-0FVMIlZjbi9W58LlrRg/hZQo2B8=",
+ "dev": true,
+ "optional": true
+ },
+ "ajv": {
+ "version": "4.11.8",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz",
+ "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "co": "4.6.0",
+ "json-stable-stringify": "1.0.1"
+ }
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ },
+ "aproba": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.1.1.tgz",
+ "integrity": "sha1-ldNgDwdxCqDpKYxyatXs8urLq6s=",
+ "dev": true,
+ "optional": true
+ },
+ "are-we-there-yet": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz",
+ "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "delegates": "1.0.0",
+ "readable-stream": "2.2.9"
+ }
+ },
+ "asn1": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz",
+ "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=",
+ "dev": true,
+ "optional": true
+ },
+ "assert-plus": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz",
+ "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=",
+ "dev": true,
+ "optional": true
+ },
+ "asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
+ "dev": true,
+ "optional": true
+ },
+ "aws-sign2": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz",
+ "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=",
+ "dev": true,
+ "optional": true
+ },
+ "aws4": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz",
+ "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=",
+ "dev": true,
+ "optional": true
+ },
+ "balanced-match": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz",
+ "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=",
+ "dev": true
+ },
+ "bcrypt-pbkdf": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz",
+ "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "tweetnacl": "0.14.5"
+ }
+ },
+ "block-stream": {
+ "version": "0.0.9",
+ "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz",
+ "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.3"
+ }
+ },
+ "boom": {
+ "version": "2.10.1",
+ "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz",
+ "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=",
+ "dev": true,
+ "requires": {
+ "hoek": "2.16.3"
+ }
+ },
+ "brace-expansion": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.7.tgz",
+ "integrity": "sha1-Pv/DxQ4ABTH7cg6v+A8K6O8jz1k=",
+ "dev": true,
+ "requires": {
+ "balanced-match": "0.4.2",
+ "concat-map": "0.0.1"
+ }
+ },
+ "buffer-shims": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz",
+ "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=",
+ "dev": true
+ },
+ "caseless": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
+ "dev": true,
+ "optional": true
+ },
+ "co": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+ "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
+ "dev": true,
+ "optional": true
+ },
+ "code-point-at": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
+ "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
+ "dev": true
+ },
+ "combined-stream": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz",
+ "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=",
+ "dev": true,
+ "requires": {
+ "delayed-stream": "1.0.0"
+ }
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "console-control-strings": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
+ "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=",
+ "dev": true
+ },
+ "core-util-is": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
+ "dev": true
+ },
+ "cryptiles": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz",
+ "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=",
+ "dev": true,
+ "requires": {
+ "boom": "2.10.1"
+ }
+ },
+ "dashdash": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+ "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "assert-plus": "1.0.0"
+ },
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "debug": {
+ "version": "2.6.8",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz",
+ "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "deep-extend": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz",
+ "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=",
+ "dev": true,
+ "optional": true
+ },
+ "delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
+ "dev": true
+ },
+ "delegates": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
+ "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
+ "dev": true,
+ "optional": true
+ },
+ "detect-libc": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.2.tgz",
+ "integrity": "sha1-ca1dIEvxempsqPRQxhRUBm70YeE=",
+ "dev": true,
+ "optional": true
+ },
+ "ecc-jsbn": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz",
+ "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "jsbn": "0.1.1"
+ }
+ },
+ "extend": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz",
+ "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=",
+ "dev": true,
+ "optional": true
+ },
+ "extsprintf": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz",
+ "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=",
+ "dev": true
+ },
+ "forever-agent": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+ "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
+ "dev": true,
+ "optional": true
+ },
+ "form-data": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz",
+ "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "asynckit": "0.4.0",
+ "combined-stream": "1.0.5",
+ "mime-types": "2.1.15"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "fstream": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz",
+ "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "inherits": "2.0.3",
+ "mkdirp": "0.5.1",
+ "rimraf": "2.6.1"
+ }
+ },
+ "fstream-ignore": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz",
+ "integrity": "sha1-nDHa40dnAY/h0kmyTa2mfQktoQU=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "fstream": "1.0.11",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4"
+ }
+ },
+ "gauge": {
+ "version": "2.7.4",
+ "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
+ "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "aproba": "1.1.1",
+ "console-control-strings": "1.1.0",
+ "has-unicode": "2.0.1",
+ "object-assign": "4.1.1",
+ "signal-exit": "3.0.2",
+ "string-width": "1.0.2",
+ "strip-ansi": "3.0.1",
+ "wide-align": "1.1.2"
+ }
+ },
+ "getpass": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
+ "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "assert-plus": "1.0.0"
+ },
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+ "dev": true
+ },
+ "har-schema": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz",
+ "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=",
+ "dev": true,
+ "optional": true
+ },
+ "har-validator": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz",
+ "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ajv": "4.11.8",
+ "har-schema": "1.0.5"
+ }
+ },
+ "has-unicode": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
+ "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=",
+ "dev": true,
+ "optional": true
+ },
+ "hawk": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz",
+ "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=",
+ "dev": true,
+ "requires": {
+ "boom": "2.10.1",
+ "cryptiles": "2.0.5",
+ "hoek": "2.16.3",
+ "sntp": "1.0.9"
+ }
+ },
+ "hoek": {
+ "version": "2.16.3",
+ "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz",
+ "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=",
+ "dev": true
+ },
+ "http-signature": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz",
+ "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "assert-plus": "0.2.0",
+ "jsprim": "1.4.0",
+ "sshpk": "1.13.0"
+ }
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "ini": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz",
+ "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=",
+ "dev": true,
+ "optional": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "is-typedarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
+ "dev": true,
+ "optional": true
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+ "dev": true,
+ "optional": true
+ },
+ "jodid25519": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz",
+ "integrity": "sha1-BtSRIlUJNBlHfUJWM2BuDpB4KWc=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "jsbn": "0.1.1"
+ }
+ },
+ "jsbn": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+ "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
+ "dev": true,
+ "optional": true
+ },
+ "json-schema": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
+ "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
+ "dev": true,
+ "optional": true
+ },
+ "json-stable-stringify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz",
+ "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "jsonify": "0.0.0"
+ }
+ },
+ "json-stringify-safe": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
+ "dev": true,
+ "optional": true
+ },
+ "jsonify": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
+ "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=",
+ "dev": true,
+ "optional": true
+ },
+ "jsprim": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.0.tgz",
+ "integrity": "sha1-o7h+QCmNjDgFUtjMdiigu5WiKRg=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "assert-plus": "1.0.0",
+ "extsprintf": "1.0.2",
+ "json-schema": "0.2.3",
+ "verror": "1.3.6"
+ },
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "mime-db": {
+ "version": "1.27.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.27.0.tgz",
+ "integrity": "sha1-gg9XIpa70g7CXtVeW13oaeVDbrE=",
+ "dev": true
+ },
+ "mime-types": {
+ "version": "2.1.15",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.15.tgz",
+ "integrity": "sha1-pOv1BkCUVpI3uM9wBGd20J/JKu0=",
+ "dev": true,
+ "requires": {
+ "mime-db": "1.27.0"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.7"
+ }
+ },
+ "minimist": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
+ "dev": true
+ },
+ "mkdirp": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+ "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+ "dev": true,
+ "requires": {
+ "minimist": "0.0.8"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true,
+ "optional": true
+ },
+ "node-pre-gyp": {
+ "version": "0.6.39",
+ "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz",
+ "integrity": "sha512-OsJV74qxnvz/AMGgcfZoDaeDXKD3oY3QVIbBmwszTFkRisTSXbMQyn4UWzUMOtA5SVhrBZOTp0wcoSBgfMfMmQ==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "detect-libc": "1.0.2",
+ "hawk": "3.1.3",
+ "mkdirp": "0.5.1",
+ "nopt": "4.0.1",
+ "npmlog": "4.1.0",
+ "rc": "1.2.1",
+ "request": "2.81.0",
+ "rimraf": "2.6.1",
+ "semver": "5.3.0",
+ "tar": "2.2.1",
+ "tar-pack": "3.4.0"
+ }
+ },
+ "nopt": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz",
+ "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "abbrev": "1.1.0",
+ "osenv": "0.1.4"
+ }
+ },
+ "npmlog": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.0.tgz",
+ "integrity": "sha512-ocolIkZYZt8UveuiDS0yAkkIjid1o7lPG8cYm05yNYzBn8ykQtaiPMEGp8fY9tKdDgm8okpdKzkvu1y9hUYugA==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "are-we-there-yet": "1.1.4",
+ "console-control-strings": "1.1.0",
+ "gauge": "2.7.4",
+ "set-blocking": "2.0.0"
+ }
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+ "dev": true
+ },
+ "oauth-sign": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz",
+ "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=",
+ "dev": true,
+ "optional": true
+ },
+ "object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+ "dev": true,
+ "optional": true
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "os-homedir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
+ "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
+ "dev": true,
+ "optional": true
+ },
+ "os-tmpdir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
+ "dev": true,
+ "optional": true
+ },
+ "osenv": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz",
+ "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "os-homedir": "1.0.2",
+ "os-tmpdir": "1.0.2"
+ }
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "performance-now": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz",
+ "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=",
+ "dev": true,
+ "optional": true
+ },
+ "process-nextick-args": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
+ "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=",
+ "dev": true
+ },
+ "punycode": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+ "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
+ "dev": true,
+ "optional": true
+ },
+ "qs": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz",
+ "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=",
+ "dev": true,
+ "optional": true
+ },
+ "rc": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz",
+ "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "deep-extend": "0.4.2",
+ "ini": "1.3.4",
+ "minimist": "1.2.0",
+ "strip-json-comments": "2.0.1"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "readable-stream": {
+ "version": "2.2.9",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz",
+ "integrity": "sha1-z3jsb0ptHrQ9JkiMrJfwQudLf8g=",
+ "dev": true,
+ "requires": {
+ "buffer-shims": "1.0.0",
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "1.0.7",
+ "string_decoder": "1.0.1",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "request": {
+ "version": "2.81.0",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz",
+ "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "aws-sign2": "0.6.0",
+ "aws4": "1.6.0",
+ "caseless": "0.12.0",
+ "combined-stream": "1.0.5",
+ "extend": "3.0.1",
+ "forever-agent": "0.6.1",
+ "form-data": "2.1.4",
+ "har-validator": "4.2.1",
+ "hawk": "3.1.3",
+ "http-signature": "1.1.1",
+ "is-typedarray": "1.0.0",
+ "isstream": "0.1.2",
+ "json-stringify-safe": "5.0.1",
+ "mime-types": "2.1.15",
+ "oauth-sign": "0.8.2",
+ "performance-now": "0.2.0",
+ "qs": "6.4.0",
+ "safe-buffer": "5.0.1",
+ "stringstream": "0.0.5",
+ "tough-cookie": "2.3.2",
+ "tunnel-agent": "0.6.0",
+ "uuid": "3.0.1"
+ }
+ },
+ "rimraf": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz",
+ "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=",
+ "dev": true,
+ "requires": {
+ "glob": "7.1.2"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz",
+ "integrity": "sha1-0mPKVGls2KMGtcplUekt5XkY++c=",
+ "dev": true
+ },
+ "semver": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
+ "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=",
+ "dev": true,
+ "optional": true
+ },
+ "set-blocking": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
+ "dev": true,
+ "optional": true
+ },
+ "signal-exit": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
+ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
+ "dev": true,
+ "optional": true
+ },
+ "sntp": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz",
+ "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=",
+ "dev": true,
+ "requires": {
+ "hoek": "2.16.3"
+ }
+ },
+ "sshpk": {
+ "version": "1.13.0",
+ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.0.tgz",
+ "integrity": "sha1-/yo+T9BEl1Vf7Zezmg/YL6+zozw=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "asn1": "0.2.3",
+ "assert-plus": "1.0.0",
+ "bcrypt-pbkdf": "1.0.1",
+ "dashdash": "1.14.1",
+ "ecc-jsbn": "0.1.1",
+ "getpass": "0.1.7",
+ "jodid25519": "1.0.2",
+ "jsbn": "0.1.1",
+ "tweetnacl": "0.14.5"
+ },
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "string-width": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+ "dev": true,
+ "requires": {
+ "code-point-at": "1.1.0",
+ "is-fullwidth-code-point": "1.0.0",
+ "strip-ansi": "3.0.1"
+ }
+ },
+ "string_decoder": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.1.tgz",
+ "integrity": "sha1-YuIA8DmVWmgQ2N8KM//A8BNmLZg=",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.0.1"
+ }
+ },
+ "stringstream": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz",
+ "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=",
+ "dev": true,
+ "optional": true
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "strip-json-comments": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+ "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
+ "dev": true,
+ "optional": true
+ },
+ "tar": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz",
+ "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=",
+ "dev": true,
+ "requires": {
+ "block-stream": "0.0.9",
+ "fstream": "1.0.11",
+ "inherits": "2.0.3"
+ }
+ },
+ "tar-pack": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.4.0.tgz",
+ "integrity": "sha1-I74tf2cagzk3bL2wuP4/3r8xeYQ=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "debug": "2.6.8",
+ "fstream": "1.0.11",
+ "fstream-ignore": "1.0.5",
+ "once": "1.4.0",
+ "readable-stream": "2.2.9",
+ "rimraf": "2.6.1",
+ "tar": "2.2.1",
+ "uid-number": "0.0.6"
+ }
+ },
+ "tough-cookie": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz",
+ "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "punycode": "1.4.1"
+ }
+ },
+ "tunnel-agent": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+ "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "safe-buffer": "5.0.1"
+ }
+ },
+ "tweetnacl": {
+ "version": "0.14.5",
+ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
+ "dev": true,
+ "optional": true
+ },
+ "uid-number": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz",
+ "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=",
+ "dev": true,
+ "optional": true
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+ "dev": true
+ },
+ "uuid": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.1.tgz",
+ "integrity": "sha1-ZUS7ot/ajBzxfmKaOjBeK7H+5sE=",
+ "dev": true,
+ "optional": true
+ },
+ "verror": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz",
+ "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "extsprintf": "1.0.2"
+ }
+ },
+ "wide-align": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz",
+ "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "string-width": "1.0.2"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ }
+ }
+ },
+ "fstream": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz",
+ "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "inherits": "2.0.3",
+ "mkdirp": "0.5.1",
+ "rimraf": "2.6.2"
+ }
+ },
+ "function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+ "dev": true
+ },
+ "functional-red-black-tree": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
+ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
+ "dev": true
+ },
+ "gaze": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz",
+ "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=",
+ "dev": true,
+ "requires": {
+ "globule": "0.1.0"
+ }
+ },
+ "generate-function": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz",
+ "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=",
+ "dev": true
+ },
+ "generate-object-property": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz",
+ "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=",
+ "dev": true,
+ "requires": {
+ "is-property": "1.0.2"
+ }
+ },
+ "get-caller-file": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz",
+ "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=",
+ "dev": true
+ },
+ "get-pkg-repo": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz",
+ "integrity": "sha1-xztInAbYDMVTbCyFP54FIyBWly0=",
+ "dev": true,
+ "requires": {
+ "hosted-git-info": "2.5.0",
+ "meow": "3.7.0",
+ "normalize-package-data": "2.4.0",
+ "parse-github-repo-url": "1.4.1",
+ "through2": "2.0.3"
+ }
+ },
+ "get-stdin": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
+ "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
+ "dev": true
+ },
+ "get-stream": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
+ "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
+ "dev": true
+ },
+ "get-value": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
+ "dev": true
+ },
+ "getpass": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
+ "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "1.0.0"
+ },
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+ "dev": true
+ }
+ }
+ },
+ "git-raw-commits": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-1.3.2.tgz",
+ "integrity": "sha512-ojMbErvEIPXaqNNwomSp/DYLhhbU+BEcCOyPZ26U8VNaQjBRN9lZ7E3vfjIkTA8JLWYc5zsSxuVXut6bczKhrg==",
+ "dev": true,
+ "requires": {
+ "dargs": "4.1.0",
+ "lodash.template": "4.4.0",
+ "meow": "3.7.0",
+ "split2": "2.2.0",
+ "through2": "2.0.3"
+ },
+ "dependencies": {
+ "lodash.template": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz",
+ "integrity": "sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=",
+ "dev": true,
+ "requires": {
+ "lodash._reinterpolate": "3.0.0",
+ "lodash.templatesettings": "4.1.0"
+ }
+ },
+ "lodash.templatesettings": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz",
+ "integrity": "sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=",
+ "dev": true,
+ "requires": {
+ "lodash._reinterpolate": "3.0.0"
+ }
+ }
+ }
+ },
+ "git-remote-origin-url": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz",
+ "integrity": "sha1-UoJlna4hBxRaERJhEq0yFuxfpl8=",
+ "dev": true,
+ "requires": {
+ "gitconfiglocal": "1.0.0",
+ "pify": "2.3.0"
+ }
+ },
+ "git-semver-tags": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-1.3.2.tgz",
+ "integrity": "sha512-CXQJ4GdxkUya1YQaEKGcYIJ9RiuX4RTWnRIhiMlTItl8czRix4akE0CpoUSLmljuxEnUM/pFpd2FFwo+nV0SPA==",
+ "dev": true,
+ "requires": {
+ "meow": "3.7.0",
+ "semver": "5.5.0"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
+ "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==",
+ "dev": true
+ }
+ }
+ },
+ "gitconfiglocal": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz",
+ "integrity": "sha1-QdBF84UaXqiPA/JMocYXgRRGS5s=",
+ "dev": true,
+ "requires": {
+ "ini": "1.3.5"
+ }
+ },
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "glob-base": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz",
+ "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
+ "dev": true,
+ "requires": {
+ "glob-parent": "2.0.0",
+ "is-glob": "2.0.1"
+ }
+ },
+ "glob-parent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
+ "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
+ "dev": true,
+ "requires": {
+ "is-glob": "2.0.1"
+ }
+ },
+ "glob-stream": {
+ "version": "3.1.18",
+ "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.18.tgz",
+ "integrity": "sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs=",
+ "dev": true,
+ "requires": {
+ "glob": "4.5.3",
+ "glob2base": "0.0.12",
+ "minimatch": "2.0.10",
+ "ordered-read-streams": "0.1.0",
+ "through2": "0.6.5",
+ "unique-stream": "1.0.0"
+ },
+ "dependencies": {
+ "glob": {
+ "version": "4.5.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz",
+ "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=",
+ "dev": true,
+ "requires": {
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "2.0.10",
+ "once": "1.4.0"
+ }
+ },
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "minimatch": {
+ "version": "2.0.10",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz",
+ "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.11"
+ }
+ },
+ "readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "0.0.1",
+ "string_decoder": "0.10.31"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ },
+ "through2": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
+ "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "1.0.34",
+ "xtend": "4.0.1"
+ }
+ }
+ }
+ },
+ "glob-watcher": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.6.tgz",
+ "integrity": "sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs=",
+ "dev": true,
+ "requires": {
+ "gaze": "0.5.2"
+ }
+ },
+ "glob2base": {
+ "version": "0.0.12",
+ "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz",
+ "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=",
+ "dev": true,
+ "requires": {
+ "find-index": "0.1.1"
+ }
+ },
+ "global-modules": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz",
+ "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==",
+ "dev": true,
+ "requires": {
+ "global-prefix": "1.0.2",
+ "is-windows": "1.0.1",
+ "resolve-dir": "1.0.1"
+ }
+ },
+ "global-prefix": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz",
+ "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=",
+ "dev": true,
+ "requires": {
+ "expand-tilde": "2.0.2",
+ "homedir-polyfill": "1.0.1",
+ "ini": "1.3.5",
+ "is-windows": "1.0.1",
+ "which": "1.3.0"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "dev": true
+ },
+ "globby": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz",
+ "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=",
+ "dev": true,
+ "requires": {
+ "array-union": "1.0.2",
+ "arrify": "1.0.1",
+ "glob": "7.1.2",
+ "object-assign": "4.1.1",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "globule": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz",
+ "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=",
+ "dev": true,
+ "requires": {
+ "glob": "3.1.21",
+ "lodash": "1.0.2",
+ "minimatch": "0.2.14"
+ },
+ "dependencies": {
+ "glob": {
+ "version": "3.1.21",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz",
+ "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "1.2.3",
+ "inherits": "1.0.2",
+ "minimatch": "0.2.14"
+ }
+ },
+ "graceful-fs": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz",
+ "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=",
+ "dev": true
+ },
+ "inherits": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz",
+ "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=",
+ "dev": true
+ },
+ "lodash": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz",
+ "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=",
+ "dev": true
+ },
+ "minimatch": {
+ "version": "0.2.14",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz",
+ "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=",
+ "dev": true,
+ "requires": {
+ "lru-cache": "2.7.3",
+ "sigmund": "1.0.1"
+ }
+ }
+ }
+ },
+ "glogg": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.1.tgz",
+ "integrity": "sha512-ynYqXLoluBKf9XGR1gA59yEJisIL7YHEH4xr3ZziHB5/yl4qWfaK8Js9jGe6gBGCSCKVqiyO30WnRZADvemUNw==",
+ "dev": true,
+ "requires": {
+ "sparkles": "1.0.0"
+ }
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+ "dev": true
+ },
+ "growl": {
+ "version": "1.10.3",
+ "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz",
+ "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==",
+ "dev": true
+ },
+ "gulp": {
+ "version": "3.9.1",
+ "resolved": "https://registry.npmjs.org/gulp/-/gulp-3.9.1.tgz",
+ "integrity": "sha1-VxzkWSjdQK9lFPxAEYZgFsE4RbQ=",
+ "dev": true,
+ "requires": {
+ "archy": "1.0.0",
+ "chalk": "1.1.3",
+ "deprecated": "0.0.1",
+ "gulp-util": "3.0.8",
+ "interpret": "1.1.0",
+ "liftoff": "2.5.0",
+ "minimist": "1.2.0",
+ "orchestrator": "0.3.8",
+ "pretty-hrtime": "1.0.3",
+ "semver": "4.3.6",
+ "tildify": "1.2.0",
+ "v8flags": "2.1.1",
+ "vinyl-fs": "0.3.14"
+ }
+ },
+ "gulp-bump": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/gulp-bump/-/gulp-bump-3.1.0.tgz",
+ "integrity": "sha512-v5FN3TGstRqkqWTPrp1jcUyCM4YbUIvYzJy/lG2YWFXk5HvFgTucBcVhhpH1nJcnI9Y3skPnpTzYoaBQO1qBzA==",
+ "dev": true,
+ "requires": {
+ "bump-regex": "3.1.0",
+ "plugin-error": "0.1.2",
+ "plugin-log": "0.1.0",
+ "semver": "5.5.0",
+ "through2": "2.0.3"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
+ "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==",
+ "dev": true
+ }
+ }
+ },
+ "gulp-chmod": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/gulp-chmod/-/gulp-chmod-2.0.0.tgz",
+ "integrity": "sha1-AMOQuSigeZslGsz2MaoJ4BzGKZw=",
+ "dev": true,
+ "requires": {
+ "deep-assign": "1.0.0",
+ "stat-mode": "0.2.2",
+ "through2": "2.0.3"
+ }
+ },
+ "gulp-conventional-changelog": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/gulp-conventional-changelog/-/gulp-conventional-changelog-1.1.11.tgz",
+ "integrity": "sha512-1squYUFPUO1oyesPVNlvcPzytFL0CH9R7y6q1vnVvs3SCBXdNokbxdxM2OyKfkGzqh9KDJdruLCp6jKpQLAhTA==",
+ "dev": true,
+ "requires": {
+ "add-stream": "1.0.0",
+ "concat-stream": "1.6.0",
+ "conventional-changelog": "1.1.15",
+ "fancy-log": "1.3.2",
+ "object-assign": "4.1.1",
+ "plugin-error": "1.0.1",
+ "through2": "2.0.3"
+ },
+ "dependencies": {
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+ "dev": true
+ },
+ "extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "dev": true,
+ "requires": {
+ "assign-symbols": "1.0.0",
+ "is-extendable": "1.0.1"
+ }
+ },
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ },
+ "plugin-error": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz",
+ "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==",
+ "dev": true,
+ "requires": {
+ "ansi-colors": "1.1.0",
+ "arr-diff": "4.0.0",
+ "arr-union": "3.1.0",
+ "extend-shallow": "3.0.2"
+ }
+ }
+ }
+ },
+ "gulp-filter": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/gulp-filter/-/gulp-filter-5.1.0.tgz",
+ "integrity": "sha1-oF4Rr/sHz33PQafeHLe2OsN4PnM=",
+ "dev": true,
+ "requires": {
+ "multimatch": "2.1.0",
+ "plugin-error": "0.1.2",
+ "streamfilter": "1.0.7"
+ }
+ },
+ "gulp-gunzip": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/gulp-gunzip/-/gulp-gunzip-1.0.0.tgz",
+ "integrity": "sha1-FbdBFF6Dqcb1CIYkG1fMWHHxUak=",
+ "dev": true,
+ "requires": {
+ "through2": "0.6.5",
+ "vinyl": "0.4.6"
+ },
+ "dependencies": {
+ "clone": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz",
+ "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=",
+ "dev": true
+ },
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "0.0.1",
+ "string_decoder": "0.10.31"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ },
+ "through2": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
+ "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "1.0.34",
+ "xtend": "4.0.1"
+ }
+ },
+ "vinyl": {
+ "version": "0.4.6",
+ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz",
+ "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=",
+ "dev": true,
+ "requires": {
+ "clone": "0.2.0",
+ "clone-stats": "0.0.1"
+ }
+ }
+ }
+ },
+ "gulp-if": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/gulp-if/-/gulp-if-2.0.2.tgz",
+ "integrity": "sha1-pJe351cwBQQcqivIt92jyARE1ik=",
+ "dev": true,
+ "requires": {
+ "gulp-match": "1.0.3",
+ "ternary-stream": "2.0.1",
+ "through2": "2.0.3"
+ }
+ },
+ "gulp-match": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/gulp-match/-/gulp-match-1.0.3.tgz",
+ "integrity": "sha1-kcfA1/Kb7NZgbVfYCn+Hdqh6uo4=",
+ "dev": true,
+ "requires": {
+ "minimatch": "3.0.4"
+ }
+ },
+ "gulp-remote-src": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/gulp-remote-src/-/gulp-remote-src-0.4.3.tgz",
+ "integrity": "sha1-VyjP1kNDPdSEXd7wlp8PlxoqtKE=",
+ "dev": true,
+ "requires": {
+ "event-stream": "3.3.4",
+ "node.extend": "1.1.6",
+ "request": "2.79.0",
+ "through2": "2.0.3",
+ "vinyl": "2.0.2"
+ },
+ "dependencies": {
+ "clone-stats": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz",
+ "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=",
+ "dev": true
+ },
+ "replace-ext": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz",
+ "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=",
+ "dev": true
+ },
+ "request": {
+ "version": "2.79.0",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz",
+ "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=",
+ "dev": true,
+ "requires": {
+ "aws-sign2": "0.6.0",
+ "aws4": "1.6.0",
+ "caseless": "0.11.0",
+ "combined-stream": "1.0.6",
+ "extend": "3.0.1",
+ "forever-agent": "0.6.1",
+ "form-data": "2.1.4",
+ "har-validator": "2.0.6",
+ "hawk": "3.1.3",
+ "http-signature": "1.1.1",
+ "is-typedarray": "1.0.0",
+ "isstream": "0.1.2",
+ "json-stringify-safe": "5.0.1",
+ "mime-types": "2.1.18",
+ "oauth-sign": "0.8.2",
+ "qs": "6.3.2",
+ "stringstream": "0.0.5",
+ "tough-cookie": "2.3.3",
+ "tunnel-agent": "0.4.3",
+ "uuid": "3.2.1"
+ }
+ },
+ "vinyl": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.0.2.tgz",
+ "integrity": "sha1-CjcT2NTpIhxY8QyhbAEWyeJe2nw=",
+ "dev": true,
+ "requires": {
+ "clone": "1.0.3",
+ "clone-buffer": "1.0.0",
+ "clone-stats": "1.0.0",
+ "cloneable-readable": "1.0.0",
+ "is-stream": "1.1.0",
+ "remove-trailing-separator": "1.1.0",
+ "replace-ext": "1.0.0"
+ }
+ }
+ }
+ },
+ "gulp-sourcemaps": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz",
+ "integrity": "sha1-uG/zSdgBzrVuHZ59x7vLS33uYAw=",
+ "dev": true,
+ "requires": {
+ "convert-source-map": "1.5.1",
+ "graceful-fs": "4.1.11",
+ "strip-bom": "2.0.0",
+ "through2": "2.0.3",
+ "vinyl": "1.2.0"
+ },
+ "dependencies": {
+ "strip-bom": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
+ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+ "dev": true,
+ "requires": {
+ "is-utf8": "0.2.1"
+ }
+ },
+ "vinyl": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz",
+ "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=",
+ "dev": true,
+ "requires": {
+ "clone": "1.0.3",
+ "clone-stats": "0.0.1",
+ "replace-ext": "0.0.1"
+ }
+ }
+ }
+ },
+ "gulp-stats": {
+ "version": "0.0.4",
+ "resolved": "https://registry.npmjs.org/gulp-stats/-/gulp-stats-0.0.4.tgz",
+ "integrity": "sha1-8hbCvAecuJDOv11qqjses5fRK6s=",
+ "dev": true,
+ "requires": {
+ "chalk": "0.5.1",
+ "pretty-hrtime": "1.0.3",
+ "text-table": "0.2.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz",
+ "integrity": "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz",
+ "integrity": "sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz",
+ "integrity": "sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "1.1.0",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "0.1.0",
+ "strip-ansi": "0.3.0",
+ "supports-color": "0.2.0"
+ }
+ },
+ "has-ansi": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz",
+ "integrity": "sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "0.2.1"
+ }
+ },
+ "strip-ansi": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz",
+ "integrity": "sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "0.2.1"
+ }
+ },
+ "supports-color": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz",
+ "integrity": "sha1-2S3iaU6z9nMjlz1649i1W0wiGQo=",
+ "dev": true
+ }
+ }
+ },
+ "gulp-symdest": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/gulp-symdest/-/gulp-symdest-1.1.0.tgz",
+ "integrity": "sha1-wWUyBzLRks5W/ZQnH/oSMjS/KuA=",
+ "dev": true,
+ "requires": {
+ "event-stream": "3.3.4",
+ "mkdirp": "0.5.1",
+ "queue": "3.1.0",
+ "vinyl-fs": "2.4.4"
+ },
+ "dependencies": {
+ "glob": {
+ "version": "5.0.15",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
+ "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
+ "dev": true,
+ "requires": {
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "glob-parent": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+ "dev": true,
+ "requires": {
+ "is-glob": "3.1.0",
+ "path-dirname": "1.0.2"
+ }
+ },
+ "glob-stream": {
+ "version": "5.3.5",
+ "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-5.3.5.tgz",
+ "integrity": "sha1-pVZlqajM3EGRWofHAeMtTgFvrSI=",
+ "dev": true,
+ "requires": {
+ "extend": "3.0.1",
+ "glob": "5.0.15",
+ "glob-parent": "3.1.0",
+ "micromatch": "2.3.11",
+ "ordered-read-streams": "0.3.0",
+ "through2": "0.6.5",
+ "to-absolute-glob": "0.1.1",
+ "unique-stream": "2.2.1"
+ },
+ "dependencies": {
+ "readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "0.0.1",
+ "string_decoder": "0.10.31"
+ }
+ },
+ "through2": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
+ "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "1.0.34",
+ "xtend": "4.0.1"
+ }
+ }
+ }
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ },
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "ordered-read-streams": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz",
+ "integrity": "sha1-cTfmmzKYuzQiR6G77jiByA4v14s=",
+ "dev": true,
+ "requires": {
+ "is-stream": "1.1.0",
+ "readable-stream": "2.3.4"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ },
+ "strip-bom": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
+ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+ "dev": true,
+ "requires": {
+ "is-utf8": "0.2.1"
+ }
+ },
+ "unique-stream": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz",
+ "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=",
+ "dev": true,
+ "requires": {
+ "json-stable-stringify": "1.0.1",
+ "through2-filter": "2.0.0"
+ }
+ },
+ "vinyl": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz",
+ "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=",
+ "dev": true,
+ "requires": {
+ "clone": "1.0.3",
+ "clone-stats": "0.0.1",
+ "replace-ext": "0.0.1"
+ }
+ },
+ "vinyl-fs": {
+ "version": "2.4.4",
+ "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-2.4.4.tgz",
+ "integrity": "sha1-vm/zJwy1Xf19MGNkDegfJddTIjk=",
+ "dev": true,
+ "requires": {
+ "duplexify": "3.5.3",
+ "glob-stream": "5.3.5",
+ "graceful-fs": "4.1.11",
+ "gulp-sourcemaps": "1.6.0",
+ "is-valid-glob": "0.3.0",
+ "lazystream": "1.0.0",
+ "lodash.isequal": "4.5.0",
+ "merge-stream": "1.0.1",
+ "mkdirp": "0.5.1",
+ "object-assign": "4.1.1",
+ "readable-stream": "2.3.4",
+ "strip-bom": "2.0.0",
+ "strip-bom-stream": "1.0.0",
+ "through2": "2.0.3",
+ "through2-filter": "2.0.0",
+ "vali-date": "1.0.0",
+ "vinyl": "1.2.0"
+ }
+ }
+ }
+ },
+ "gulp-untar": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/gulp-untar/-/gulp-untar-0.0.6.tgz",
+ "integrity": "sha1-1r3v3n6ajgVMnxYjhaB4LEvnQAA=",
+ "dev": true,
+ "requires": {
+ "event-stream": "3.3.4",
+ "gulp-util": "3.0.8",
+ "streamifier": "0.1.1",
+ "tar": "2.2.1",
+ "through2": "2.0.3"
+ }
+ },
+ "gulp-util": {
+ "version": "3.0.8",
+ "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz",
+ "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=",
+ "dev": true,
+ "requires": {
+ "array-differ": "1.0.0",
+ "array-uniq": "1.0.3",
+ "beeper": "1.1.1",
+ "chalk": "1.1.3",
+ "dateformat": "2.2.0",
+ "fancy-log": "1.3.2",
+ "gulplog": "1.0.0",
+ "has-gulplog": "0.1.0",
+ "lodash._reescape": "3.0.0",
+ "lodash._reevaluate": "3.0.0",
+ "lodash._reinterpolate": "3.0.0",
+ "lodash.template": "3.6.2",
+ "minimist": "1.2.0",
+ "multipipe": "0.1.2",
+ "object-assign": "3.0.0",
+ "replace-ext": "0.0.1",
+ "through2": "2.0.3",
+ "vinyl": "0.5.3"
+ },
+ "dependencies": {
+ "object-assign": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz",
+ "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=",
+ "dev": true
+ }
+ }
+ },
+ "gulp-vinyl-zip": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/gulp-vinyl-zip/-/gulp-vinyl-zip-2.1.0.tgz",
+ "integrity": "sha1-JOQGhdwFtxSZlSRQmeBZAmO+ja0=",
+ "dev": true,
+ "requires": {
+ "event-stream": "3.3.4",
+ "queue": "4.4.2",
+ "through2": "2.0.3",
+ "vinyl": "2.1.0",
+ "vinyl-fs": "2.4.4",
+ "yauzl": "2.9.1",
+ "yazl": "2.4.3"
+ },
+ "dependencies": {
+ "clone": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz",
+ "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=",
+ "dev": true
+ },
+ "clone-stats": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz",
+ "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=",
+ "dev": true
+ },
+ "glob": {
+ "version": "5.0.15",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
+ "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
+ "dev": true,
+ "requires": {
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "glob-parent": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+ "dev": true,
+ "requires": {
+ "is-glob": "3.1.0",
+ "path-dirname": "1.0.2"
+ }
+ },
+ "glob-stream": {
+ "version": "5.3.5",
+ "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-5.3.5.tgz",
+ "integrity": "sha1-pVZlqajM3EGRWofHAeMtTgFvrSI=",
+ "dev": true,
+ "requires": {
+ "extend": "3.0.1",
+ "glob": "5.0.15",
+ "glob-parent": "3.1.0",
+ "micromatch": "2.3.11",
+ "ordered-read-streams": "0.3.0",
+ "through2": "0.6.5",
+ "to-absolute-glob": "0.1.1",
+ "unique-stream": "2.2.1"
+ },
+ "dependencies": {
+ "readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "0.0.1",
+ "string_decoder": "0.10.31"
+ }
+ },
+ "through2": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
+ "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "1.0.34",
+ "xtend": "4.0.1"
+ }
+ }
+ }
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ },
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "ordered-read-streams": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz",
+ "integrity": "sha1-cTfmmzKYuzQiR6G77jiByA4v14s=",
+ "dev": true,
+ "requires": {
+ "is-stream": "1.1.0",
+ "readable-stream": "2.3.4"
+ }
+ },
+ "queue": {
+ "version": "4.4.2",
+ "resolved": "https://registry.npmjs.org/queue/-/queue-4.4.2.tgz",
+ "integrity": "sha512-fSMRXbwhMwipcDZ08enW2vl+YDmAmhcNcr43sCJL8DIg+CFOsoRLG23ctxA+fwNk1w55SePSiS7oqQQSgQoVJQ==",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.3"
+ }
+ },
+ "replace-ext": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz",
+ "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=",
+ "dev": true
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ },
+ "strip-bom": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
+ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+ "dev": true,
+ "requires": {
+ "is-utf8": "0.2.1"
+ }
+ },
+ "unique-stream": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz",
+ "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=",
+ "dev": true,
+ "requires": {
+ "json-stable-stringify": "1.0.1",
+ "through2-filter": "2.0.0"
+ }
+ },
+ "vinyl": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.1.0.tgz",
+ "integrity": "sha1-Ah+cLPlR1rk5lDyJ617lrdT9kkw=",
+ "dev": true,
+ "requires": {
+ "clone": "2.1.1",
+ "clone-buffer": "1.0.0",
+ "clone-stats": "1.0.0",
+ "cloneable-readable": "1.0.0",
+ "remove-trailing-separator": "1.1.0",
+ "replace-ext": "1.0.0"
+ }
+ },
+ "vinyl-fs": {
+ "version": "2.4.4",
+ "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-2.4.4.tgz",
+ "integrity": "sha1-vm/zJwy1Xf19MGNkDegfJddTIjk=",
+ "dev": true,
+ "requires": {
+ "duplexify": "3.5.3",
+ "glob-stream": "5.3.5",
+ "graceful-fs": "4.1.11",
+ "gulp-sourcemaps": "1.6.0",
+ "is-valid-glob": "0.3.0",
+ "lazystream": "1.0.0",
+ "lodash.isequal": "4.5.0",
+ "merge-stream": "1.0.1",
+ "mkdirp": "0.5.1",
+ "object-assign": "4.1.1",
+ "readable-stream": "2.3.4",
+ "strip-bom": "2.0.0",
+ "strip-bom-stream": "1.0.0",
+ "through2": "2.0.3",
+ "through2-filter": "2.0.0",
+ "vali-date": "1.0.0",
+ "vinyl": "1.2.0"
+ },
+ "dependencies": {
+ "clone": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.3.tgz",
+ "integrity": "sha1-KY1+IjFmD0DAA8LtMUDezz9TCF8=",
+ "dev": true
+ },
+ "clone-stats": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz",
+ "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=",
+ "dev": true
+ },
+ "replace-ext": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz",
+ "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=",
+ "dev": true
+ },
+ "vinyl": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz",
+ "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=",
+ "dev": true,
+ "requires": {
+ "clone": "1.0.3",
+ "clone-stats": "0.0.1",
+ "replace-ext": "0.0.1"
+ }
+ }
+ }
+ }
+ }
+ },
+ "gulplog": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz",
+ "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=",
+ "dev": true,
+ "requires": {
+ "glogg": "1.0.1"
+ }
+ },
+ "handlebars": {
+ "version": "4.0.11",
+ "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz",
+ "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=",
+ "dev": true,
+ "requires": {
+ "async": "1.5.2",
+ "optimist": "0.6.1",
+ "source-map": "0.4.4",
+ "uglify-js": "2.8.29"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
+ "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
+ "dev": true,
+ "requires": {
+ "amdefine": "1.0.1"
+ }
+ }
+ }
+ },
+ "har-schema": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
+ "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
+ "dev": true
+ },
+ "har-validator": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz",
+ "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "commander": "2.14.1",
+ "is-my-json-valid": "2.17.2",
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "has": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz",
+ "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=",
+ "dev": true,
+ "requires": {
+ "function-bind": "1.1.1"
+ }
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "has-gulplog": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz",
+ "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=",
+ "dev": true,
+ "requires": {
+ "sparkles": "1.0.0"
+ }
+ },
+ "has-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
+ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+ "dev": true,
+ "requires": {
+ "get-value": "2.0.6",
+ "has-values": "1.0.0",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ }
+ }
+ },
+ "has-values": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
+ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+ "dev": true,
+ "requires": {
+ "is-number": "3.0.0",
+ "kind-of": "4.0.0"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "kind-of": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "hawk": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz",
+ "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=",
+ "dev": true,
+ "requires": {
+ "boom": "2.10.1",
+ "cryptiles": "2.0.5",
+ "hoek": "2.16.3",
+ "sntp": "1.0.9"
+ }
+ },
+ "he": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz",
+ "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=",
+ "dev": true
+ },
+ "hoek": {
+ "version": "2.16.3",
+ "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz",
+ "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=",
+ "dev": true
+ },
+ "home-or-tmp": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz",
+ "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=",
+ "dev": true,
+ "requires": {
+ "os-homedir": "1.0.2",
+ "os-tmpdir": "1.0.2"
+ }
+ },
+ "homedir-polyfill": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz",
+ "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=",
+ "dev": true,
+ "requires": {
+ "parse-passwd": "1.0.0"
+ }
+ },
+ "hosted-git-info": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz",
+ "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==",
+ "dev": true
+ },
+ "http-signature": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz",
+ "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "0.2.0",
+ "jsprim": "1.4.1",
+ "sshpk": "1.13.1"
+ }
+ },
+ "iconv-lite": {
+ "version": "0.4.19",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz",
+ "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ=="
+ },
+ "ignore": {
+ "version": "3.3.7",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz",
+ "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==",
+ "dev": true
+ },
+ "imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+ "dev": true
+ },
+ "indent-string": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
+ "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
+ "dev": true,
+ "requires": {
+ "repeating": "2.0.1"
+ }
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "ini": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
+ "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
+ "dev": true
+ },
+ "inquirer": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.0.6.tgz",
+ "integrity": "sha1-4EqqnQW3o8ubD0B9BDdfBEcZA0c=",
+ "requires": {
+ "ansi-escapes": "1.4.0",
+ "chalk": "1.1.3",
+ "cli-cursor": "2.1.0",
+ "cli-width": "2.2.0",
+ "external-editor": "2.1.0",
+ "figures": "2.0.0",
+ "lodash": "4.17.5",
+ "mute-stream": "0.0.7",
+ "run-async": "2.3.0",
+ "rx": "4.1.0",
+ "string-width": "2.1.1",
+ "strip-ansi": "3.0.1",
+ "through": "2.3.8"
+ }
+ },
+ "interpret": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz",
+ "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=",
+ "dev": true
+ },
+ "invariant": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz",
+ "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=",
+ "dev": true,
+ "requires": {
+ "loose-envify": "1.3.1"
+ }
+ },
+ "invert-kv": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
+ "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=",
+ "dev": true
+ },
+ "is": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/is/-/is-3.2.1.tgz",
+ "integrity": "sha1-0Kwq1V63sL7JJqUmb2xmKqqD3KU=",
+ "dev": true
+ },
+ "is-absolute": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz",
+ "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==",
+ "dev": true,
+ "requires": {
+ "is-relative": "1.0.0",
+ "is-windows": "1.0.1"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+ "dev": true
+ }
+ }
+ },
+ "is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
+ "dev": true
+ },
+ "is-binary-path": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
+ "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
+ "dev": true,
+ "requires": {
+ "binary-extensions": "1.11.0"
+ }
+ },
+ "is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+ "dev": true
+ },
+ "is-builtin-module": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
+ "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=",
+ "dev": true,
+ "requires": {
+ "builtin-modules": "1.1.1"
+ }
+ },
+ "is-callable": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz",
+ "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=",
+ "dev": true
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+ "dev": true
+ }
+ }
+ },
+ "is-date-object": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz",
+ "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=",
+ "dev": true
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+ "dev": true
+ }
+ }
+ },
+ "is-dotfile": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz",
+ "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=",
+ "dev": true
+ },
+ "is-equal-shallow": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz",
+ "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=",
+ "dev": true,
+ "requires": {
+ "is-primitive": "2.0.0"
+ }
+ },
+ "is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+ "dev": true
+ },
+ "is-extglob": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
+ "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
+ "dev": true
+ },
+ "is-finite": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
+ },
+ "is-glob": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
+ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "1.0.0"
+ }
+ },
+ "is-my-ip-valid": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz",
+ "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==",
+ "dev": true
+ },
+ "is-my-json-valid": {
+ "version": "2.17.2",
+ "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.17.2.tgz",
+ "integrity": "sha512-IBhBslgngMQN8DDSppmgDv7RNrlFotuuDsKcrCP3+HbFaVivIBU7u9oiiErw8sH4ynx3+gOGQ3q2otkgiSi6kg==",
+ "dev": true,
+ "requires": {
+ "generate-function": "2.0.0",
+ "generate-object-property": "1.2.0",
+ "is-my-ip-valid": "1.0.0",
+ "jsonpointer": "4.0.1",
+ "xtend": "4.0.1"
+ }
+ },
+ "is-number": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
+ "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ }
+ },
+ "is-obj": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
+ "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
+ "dev": true
+ },
+ "is-odd": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-1.0.0.tgz",
+ "integrity": "sha1-O4qTLrAos3dcObsJ6RdnrM22kIg=",
+ "dev": true,
+ "requires": {
+ "is-number": "3.0.0"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ }
+ }
+ }
+ },
+ "is-path-cwd": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz",
+ "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=",
+ "dev": true
+ },
+ "is-path-in-cwd": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz",
+ "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=",
+ "dev": true,
+ "requires": {
+ "is-path-inside": "1.0.1"
+ }
+ },
+ "is-path-inside": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz",
+ "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
+ "dev": true,
+ "requires": {
+ "path-is-inside": "1.0.2"
+ }
+ },
+ "is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ }
+ }
+ },
+ "is-posix-bracket": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz",
+ "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=",
+ "dev": true
+ },
+ "is-primitive": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz",
+ "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=",
+ "dev": true
+ },
+ "is-promise": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
+ "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o="
+ },
+ "is-property": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz",
+ "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=",
+ "dev": true
+ },
+ "is-regex": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz",
+ "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=",
+ "dev": true,
+ "requires": {
+ "has": "1.0.1"
+ }
+ },
+ "is-relative": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz",
+ "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==",
+ "dev": true,
+ "requires": {
+ "is-unc-path": "1.0.0"
+ }
+ },
+ "is-resolvable": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz",
+ "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==",
+ "dev": true
+ },
+ "is-stream": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
+ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
+ },
+ "is-subset": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz",
+ "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=",
+ "dev": true
+ },
+ "is-symbol": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz",
+ "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=",
+ "dev": true
+ },
+ "is-text-path": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz",
+ "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=",
+ "dev": true,
+ "requires": {
+ "text-extensions": "1.7.0"
+ }
+ },
+ "is-typedarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
+ "dev": true
+ },
+ "is-unc-path": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz",
+ "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==",
+ "dev": true,
+ "requires": {
+ "unc-path-regex": "0.1.2"
+ }
+ },
+ "is-utf8": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
+ "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
+ "dev": true
+ },
+ "is-valid-glob": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-0.3.0.tgz",
+ "integrity": "sha1-1LVcafUYhvm2XHDWwmItN+KfSP4=",
+ "dev": true
+ },
+ "is-windows": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.1.tgz",
+ "integrity": "sha1-MQ23D3QtJZoWo2kgK1GvhCMzENk=",
+ "dev": true
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+ "dev": true
+ },
+ "isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "dev": true,
+ "requires": {
+ "isarray": "1.0.0"
+ }
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+ "dev": true
+ },
+ "js-yaml": {
+ "version": "3.10.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz",
+ "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==",
+ "dev": true,
+ "requires": {
+ "argparse": "1.0.9",
+ "esprima": "4.0.0"
+ }
+ },
+ "jsbn": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+ "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
+ "dev": true,
+ "optional": true
+ },
+ "jsesc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+ "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
+ "dev": true
+ },
+ "json-minify": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-minify/-/json-minify-1.0.0.tgz",
+ "integrity": "sha1-Q5fnbxloiYM1L8+9Xi5SQ/wKB8g=",
+ "dev": true
+ },
+ "json-schema": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
+ "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
+ "dev": true
+ },
+ "json-schema-traverse": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
+ "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=",
+ "dev": true
+ },
+ "json-stable-stringify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz",
+ "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=",
+ "dev": true,
+ "requires": {
+ "jsonify": "0.0.0"
+ }
+ },
+ "json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
+ "dev": true
+ },
+ "json-stringify-safe": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
+ "dev": true
+ },
+ "json5": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
+ "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
+ "dev": true
+ },
+ "jsonify": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
+ "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=",
+ "dev": true
+ },
+ "jsonparse": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
+ "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=",
+ "dev": true
+ },
+ "jsonpointer": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz",
+ "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=",
+ "dev": true
+ },
+ "jsprim": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
+ "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "1.0.0",
+ "extsprintf": "1.3.0",
+ "json-schema": "0.2.3",
+ "verror": "1.10.0"
+ },
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+ "dev": true
+ }
+ }
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ },
+ "lazy-cache": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz",
+ "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=",
+ "dev": true,
+ "requires": {
+ "set-getter": "0.1.0"
+ }
+ },
+ "lazystream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz",
+ "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "2.3.4"
+ }
+ },
+ "lcid": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
+ "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
+ "dev": true,
+ "requires": {
+ "invert-kv": "1.0.0"
+ }
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2"
+ }
+ },
+ "liftoff": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz",
+ "integrity": "sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=",
+ "dev": true,
+ "requires": {
+ "extend": "3.0.1",
+ "findup-sync": "2.0.0",
+ "fined": "1.1.0",
+ "flagged-respawn": "1.0.0",
+ "is-plain-object": "2.0.4",
+ "object.map": "1.0.1",
+ "rechoir": "0.6.2",
+ "resolve": "1.5.0"
+ }
+ },
+ "load-json-file": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
+ "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "parse-json": "2.2.0",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1",
+ "strip-bom": "2.0.0"
+ },
+ "dependencies": {
+ "strip-bom": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
+ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+ "dev": true,
+ "requires": {
+ "is-utf8": "0.2.1"
+ }
+ }
+ }
+ },
+ "locate-path": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
+ "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
+ "dev": true,
+ "requires": {
+ "p-locate": "2.0.0",
+ "path-exists": "3.0.0"
+ },
+ "dependencies": {
+ "path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+ "dev": true
+ }
+ }
+ },
+ "lodash": {
+ "version": "4.17.5",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
+ "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw=="
+ },
+ "lodash._basecopy": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz",
+ "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=",
+ "dev": true
+ },
+ "lodash._basetostring": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz",
+ "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=",
+ "dev": true
+ },
+ "lodash._basevalues": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz",
+ "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=",
+ "dev": true
+ },
+ "lodash._getnative": {
+ "version": "3.9.1",
+ "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz",
+ "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=",
+ "dev": true
+ },
+ "lodash._isiterateecall": {
+ "version": "3.0.9",
+ "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz",
+ "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=",
+ "dev": true
+ },
+ "lodash._reescape": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz",
+ "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=",
+ "dev": true
+ },
+ "lodash._reevaluate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz",
+ "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=",
+ "dev": true
+ },
+ "lodash._reinterpolate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz",
+ "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=",
+ "dev": true
+ },
+ "lodash._root": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz",
+ "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=",
+ "dev": true
+ },
+ "lodash.escape": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz",
+ "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=",
+ "dev": true,
+ "requires": {
+ "lodash._root": "3.0.1"
+ }
+ },
+ "lodash.isarguments": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz",
+ "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=",
+ "dev": true
+ },
+ "lodash.isarray": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz",
+ "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=",
+ "dev": true
+ },
+ "lodash.isequal": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
+ "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=",
+ "dev": true
+ },
+ "lodash.keys": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz",
+ "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=",
+ "dev": true,
+ "requires": {
+ "lodash._getnative": "3.9.1",
+ "lodash.isarguments": "3.1.0",
+ "lodash.isarray": "3.0.4"
+ }
+ },
+ "lodash.restparam": {
+ "version": "3.6.1",
+ "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz",
+ "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=",
+ "dev": true
+ },
+ "lodash.template": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz",
+ "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=",
+ "dev": true,
+ "requires": {
+ "lodash._basecopy": "3.0.1",
+ "lodash._basetostring": "3.0.1",
+ "lodash._basevalues": "3.0.0",
+ "lodash._isiterateecall": "3.0.9",
+ "lodash._reinterpolate": "3.0.0",
+ "lodash.escape": "3.2.0",
+ "lodash.keys": "3.1.2",
+ "lodash.restparam": "3.6.1",
+ "lodash.templatesettings": "3.1.1"
+ }
+ },
+ "lodash.templatesettings": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz",
+ "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=",
+ "dev": true,
+ "requires": {
+ "lodash._reinterpolate": "3.0.0",
+ "lodash.escape": "3.2.0"
+ }
+ },
+ "longest": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
+ "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=",
+ "dev": true
+ },
+ "loose-envify": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
+ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
+ "dev": true,
+ "requires": {
+ "js-tokens": "3.0.2"
+ }
+ },
+ "loud-rejection": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
+ "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
+ "dev": true,
+ "requires": {
+ "currently-unhandled": "0.4.1",
+ "signal-exit": "3.0.2"
+ }
+ },
+ "lru-cache": {
+ "version": "2.7.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz",
+ "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=",
+ "dev": true
+ },
+ "make-iterator": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.0.tgz",
+ "integrity": "sha1-V7713IXSOSO6I3ZzJNjo+PPZaUs=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ }
+ },
+ "map-cache": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
+ "dev": true
+ },
+ "map-obj": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
+ "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
+ "dev": true
+ },
+ "map-stream": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz",
+ "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=",
+ "dev": true
+ },
+ "map-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
+ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+ "dev": true,
+ "requires": {
+ "object-visit": "1.0.1"
+ }
+ },
+ "mdn-data": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-1.1.0.tgz",
+ "integrity": "sha512-jC6B3BFC07cCOU8xx1d+sQtDkVIpGKWv4TzK7pN7PyObdbwlIFJbHYk8ofvr0zrU8SkV1rSi87KAHhWCdLGw1Q==",
+ "dev": true
+ },
+ "mem": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz",
+ "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=",
+ "dev": true,
+ "requires": {
+ "mimic-fn": "1.2.0"
+ }
+ },
+ "meow": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
+ "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
+ "dev": true,
+ "requires": {
+ "camelcase-keys": "2.1.0",
+ "decamelize": "1.2.0",
+ "loud-rejection": "1.6.0",
+ "map-obj": "1.0.1",
+ "minimist": "1.2.0",
+ "normalize-package-data": "2.4.0",
+ "object-assign": "4.1.1",
+ "read-pkg-up": "1.0.1",
+ "redent": "1.0.0",
+ "trim-newlines": "1.0.0"
+ }
+ },
+ "merge-stream": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz",
+ "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "2.3.4"
+ }
+ },
+ "micromatch": {
+ "version": "2.3.11",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
+ "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
+ "dev": true,
+ "requires": {
+ "arr-diff": "2.0.0",
+ "array-unique": "0.2.1",
+ "braces": "1.8.5",
+ "expand-brackets": "0.1.5",
+ "extglob": "0.3.2",
+ "filename-regex": "2.0.1",
+ "is-extglob": "1.0.0",
+ "is-glob": "2.0.1",
+ "kind-of": "3.2.2",
+ "normalize-path": "2.1.1",
+ "object.omit": "2.0.1",
+ "parse-glob": "3.0.4",
+ "regex-cache": "0.4.4"
+ }
+ },
+ "mime-db": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz",
+ "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==",
+ "dev": true
+ },
+ "mime-types": {
+ "version": "2.1.18",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz",
+ "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==",
+ "dev": true,
+ "requires": {
+ "mime-db": "1.33.0"
+ }
+ },
+ "mimic-fn": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
+ "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ=="
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.11"
+ }
+ },
+ "minimist": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
+ },
+ "mixin-deep": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz",
+ "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==",
+ "dev": true,
+ "requires": {
+ "for-in": "1.0.2",
+ "is-extendable": "1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
+ },
+ "mkdirp": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+ "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+ "dev": true,
+ "requires": {
+ "minimist": "0.0.8"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
+ "dev": true
+ }
+ }
+ },
+ "mocha": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz",
+ "integrity": "sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==",
+ "dev": true,
+ "requires": {
+ "browser-stdout": "1.3.0",
+ "commander": "2.11.0",
+ "debug": "3.1.0",
+ "diff": "3.3.1",
+ "escape-string-regexp": "1.0.5",
+ "glob": "7.1.2",
+ "growl": "1.10.3",
+ "he": "1.1.1",
+ "mkdirp": "0.5.1",
+ "supports-color": "4.4.0"
+ },
+ "dependencies": {
+ "commander": {
+ "version": "2.11.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz",
+ "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==",
+ "dev": true
+ },
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "has-flag": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz",
+ "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz",
+ "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==",
+ "dev": true,
+ "requires": {
+ "has-flag": "2.0.0"
+ }
+ }
+ }
+ },
+ "modify-values": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.0.tgz",
+ "integrity": "sha1-4rbN65zhn5kxelNyLz2/XfXqqrI=",
+ "dev": true
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "multimatch": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz",
+ "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=",
+ "dev": true,
+ "requires": {
+ "array-differ": "1.0.0",
+ "array-union": "1.0.2",
+ "arrify": "1.0.1",
+ "minimatch": "3.0.4"
+ }
+ },
+ "multipipe": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz",
+ "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=",
+ "dev": true,
+ "requires": {
+ "duplexer2": "0.0.2"
+ }
+ },
+ "mustache": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/mustache/-/mustache-2.3.0.tgz",
+ "integrity": "sha1-QCj3d4sXcIpImTCm5SrDvKDaQdA=",
+ "dev": true
+ },
+ "mute-stream": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
+ "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s="
+ },
+ "nan": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/nan/-/nan-2.8.0.tgz",
+ "integrity": "sha1-7XFfP+neArV6XmJS2QqWZ14fCFo=",
+ "dev": true,
+ "optional": true
+ },
+ "nanomatch": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.7.tgz",
+ "integrity": "sha512-/5ldsnyurvEw7wNpxLFgjVvBLMta43niEYOy0CJ4ntcYSbx6bugRUTQeFb4BR/WanEL1o3aQgHuVLHQaB6tOqg==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "define-property": "1.0.0",
+ "extend-shallow": "2.0.1",
+ "fragment-cache": "0.2.1",
+ "is-odd": "1.0.0",
+ "kind-of": "5.1.0",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.0",
+ "snapdragon": "0.8.1",
+ "to-regex": "3.0.1"
+ },
+ "dependencies": {
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+ "dev": true
+ },
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "natives": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.1.tgz",
+ "integrity": "sha512-8eRaxn8u/4wN8tGkhlc2cgwwvOLMLUMUn4IYTexMgWd+LyUDfeXVkk2ygQR0hvIHbJQXgHujia3ieUUDwNGkEA==",
+ "dev": true
+ },
+ "natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
+ "dev": true
+ },
+ "node-fetch": {
+ "version": "1.6.3",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.6.3.tgz",
+ "integrity": "sha1-3CNO3WSJmC1Y6PDbT2lQKavNjAQ=",
+ "requires": {
+ "encoding": "0.1.12",
+ "is-stream": "1.1.0"
+ }
+ },
+ "node.extend": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/node.extend/-/node.extend-1.1.6.tgz",
+ "integrity": "sha1-p7iCyC1sk6SGOlUEvV3o7IYli5Y=",
+ "dev": true,
+ "requires": {
+ "is": "3.2.1"
+ }
+ },
+ "normalize-package-data": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
+ "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==",
+ "dev": true,
+ "requires": {
+ "hosted-git-info": "2.5.0",
+ "is-builtin-module": "1.0.0",
+ "semver": "4.3.6",
+ "validate-npm-package-license": "3.0.1"
+ }
+ },
+ "normalize-path": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
+ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
+ "dev": true,
+ "requires": {
+ "remove-trailing-separator": "1.1.0"
+ }
+ },
+ "npm-run-path": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
+ "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
+ "dev": true,
+ "requires": {
+ "path-key": "2.0.1"
+ }
+ },
+ "nth-check": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz",
+ "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=",
+ "dev": true,
+ "requires": {
+ "boolbase": "1.0.0"
+ }
+ },
+ "null-check": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz",
+ "integrity": "sha1-l33/1xdgErnsMNKjnbXPcqBDnt0=",
+ "dev": true
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+ "dev": true
+ },
+ "oauth-sign": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz",
+ "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=",
+ "dev": true
+ },
+ "object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
+ },
+ "object-copy": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+ "dev": true,
+ "requires": {
+ "copy-descriptor": "0.1.1",
+ "define-property": "0.2.5",
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ }
+ }
+ },
+ "object-keys": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz",
+ "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=",
+ "dev": true
+ },
+ "object-visit": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ }
+ }
+ },
+ "object.defaults": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz",
+ "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=",
+ "dev": true,
+ "requires": {
+ "array-each": "1.0.1",
+ "array-slice": "1.1.0",
+ "for-own": "1.0.0",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "for-own": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz",
+ "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=",
+ "dev": true,
+ "requires": {
+ "for-in": "1.0.2"
+ }
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ }
+ }
+ },
+ "object.getownpropertydescriptors": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz",
+ "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=",
+ "dev": true,
+ "requires": {
+ "define-properties": "1.1.2",
+ "es-abstract": "1.10.0"
+ }
+ },
+ "object.map": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz",
+ "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=",
+ "dev": true,
+ "requires": {
+ "for-own": "1.0.0",
+ "make-iterator": "1.0.0"
+ },
+ "dependencies": {
+ "for-own": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz",
+ "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=",
+ "dev": true,
+ "requires": {
+ "for-in": "1.0.2"
+ }
+ }
+ }
+ },
+ "object.omit": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz",
+ "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=",
+ "dev": true,
+ "requires": {
+ "for-own": "0.1.5",
+ "is-extendable": "0.1.1"
+ }
+ },
+ "object.pick": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ }
+ }
+ },
+ "object.values": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.0.4.tgz",
+ "integrity": "sha1-5STaCbT2b/Bd9FdUbscqyZ8TBpo=",
+ "dev": true,
+ "requires": {
+ "define-properties": "1.1.2",
+ "es-abstract": "1.10.0",
+ "function-bind": "1.1.1",
+ "has": "1.0.1"
+ }
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "onetime": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
+ "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
+ "requires": {
+ "mimic-fn": "1.2.0"
+ }
+ },
+ "opencollective": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/opencollective/-/opencollective-1.0.3.tgz",
+ "integrity": "sha1-ruY3K8KBRFg2kMPKja7PwSDdDvE=",
+ "requires": {
+ "babel-polyfill": "6.23.0",
+ "chalk": "1.1.3",
+ "inquirer": "3.0.6",
+ "minimist": "1.2.0",
+ "node-fetch": "1.6.3",
+ "opn": "4.0.2"
+ }
+ },
+ "opn": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/opn/-/opn-4.0.2.tgz",
+ "integrity": "sha1-erwi5kTf9jsKltWrfyeQwPAavJU=",
+ "requires": {
+ "object-assign": "4.1.1",
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "optimist": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
+ "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
+ "dev": true,
+ "requires": {
+ "minimist": "0.0.10",
+ "wordwrap": "0.0.3"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
+ "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=",
+ "dev": true
+ },
+ "wordwrap": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
+ "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=",
+ "dev": true
+ }
+ }
+ },
+ "optionator": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
+ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+ "dev": true,
+ "requires": {
+ "deep-is": "0.1.3",
+ "fast-levenshtein": "2.0.6",
+ "levn": "0.3.0",
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2",
+ "wordwrap": "1.0.0"
+ }
+ },
+ "orchestrator": {
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.8.tgz",
+ "integrity": "sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4=",
+ "dev": true,
+ "requires": {
+ "end-of-stream": "0.1.5",
+ "sequencify": "0.0.7",
+ "stream-consume": "0.1.0"
+ }
+ },
+ "ordered-read-streams": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz",
+ "integrity": "sha1-/VZamvjrRHO6abbtijQ1LLVS8SY=",
+ "dev": true
+ },
+ "os-homedir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
+ "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
+ "dev": true
+ },
+ "os-locale": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz",
+ "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==",
+ "dev": true,
+ "requires": {
+ "execa": "0.7.0",
+ "lcid": "1.0.0",
+ "mem": "1.1.0"
+ }
+ },
+ "os-tmpdir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
+ },
+ "p-finally": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
+ "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
+ "dev": true
+ },
+ "p-limit": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz",
+ "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==",
+ "dev": true,
+ "requires": {
+ "p-try": "1.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
+ "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
+ "dev": true,
+ "requires": {
+ "p-limit": "1.2.0"
+ }
+ },
+ "p-try": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
+ "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
+ "dev": true
+ },
+ "parse-filepath": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz",
+ "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=",
+ "dev": true,
+ "requires": {
+ "is-absolute": "1.0.0",
+ "map-cache": "0.2.2",
+ "path-root": "0.1.1"
+ }
+ },
+ "parse-github-repo-url": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz",
+ "integrity": "sha1-nn2LslKmy2ukJZUGC3v23z28H1A=",
+ "dev": true
+ },
+ "parse-glob": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz",
+ "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=",
+ "dev": true,
+ "requires": {
+ "glob-base": "0.3.0",
+ "is-dotfile": "1.0.3",
+ "is-extglob": "1.0.0",
+ "is-glob": "2.0.1"
+ }
+ },
+ "parse-json": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
+ "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
+ "dev": true,
+ "requires": {
+ "error-ex": "1.3.1"
+ }
+ },
+ "parse-passwd": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
+ "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=",
+ "dev": true
+ },
+ "pascalcase": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
+ "dev": true
+ },
+ "path-dirname": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
+ "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
+ "dev": true
+ },
+ "path-exists": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
+ "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
+ "dev": true,
+ "requires": {
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "path-is-inside": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
+ "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
+ "dev": true
+ },
+ "path-key": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+ "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
+ "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=",
+ "dev": true
+ },
+ "path-root": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz",
+ "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=",
+ "dev": true,
+ "requires": {
+ "path-root-regex": "0.1.2"
+ }
+ },
+ "path-root-regex": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz",
+ "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=",
+ "dev": true
+ },
+ "path-type": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
+ "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "pause-stream": {
+ "version": "0.0.11",
+ "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz",
+ "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=",
+ "dev": true,
+ "requires": {
+ "through": "2.3.8"
+ }
+ },
+ "pend": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
+ "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=",
+ "dev": true
+ },
+ "performance-now": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
+ "dev": true
+ },
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+ "dev": true
+ },
+ "pinkie": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
+ "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA="
+ },
+ "pinkie-promise": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
+ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
+ "requires": {
+ "pinkie": "2.0.4"
+ }
+ },
+ "plugin-error": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz",
+ "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=",
+ "dev": true,
+ "requires": {
+ "ansi-cyan": "0.1.1",
+ "ansi-red": "0.1.1",
+ "arr-diff": "1.1.0",
+ "arr-union": "2.1.0",
+ "extend-shallow": "1.1.4"
+ },
+ "dependencies": {
+ "arr-diff": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz",
+ "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "1.1.0",
+ "array-slice": "0.2.3"
+ }
+ },
+ "arr-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz",
+ "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=",
+ "dev": true
+ },
+ "array-slice": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz",
+ "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=",
+ "dev": true
+ },
+ "extend-shallow": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz",
+ "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=",
+ "dev": true,
+ "requires": {
+ "kind-of": "1.1.0"
+ }
+ },
+ "kind-of": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz",
+ "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=",
+ "dev": true
+ }
+ }
+ },
+ "plugin-log": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/plugin-log/-/plugin-log-0.1.0.tgz",
+ "integrity": "sha1-hgSc9qsQgzOYqTHzaJy67nteEzM=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "dateformat": "1.0.12"
+ },
+ "dependencies": {
+ "dateformat": {
+ "version": "1.0.12",
+ "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz",
+ "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=",
+ "dev": true,
+ "requires": {
+ "get-stdin": "4.0.1",
+ "meow": "3.7.0"
+ }
+ }
+ }
+ },
+ "pluralize": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz",
+ "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==",
+ "dev": true
+ },
+ "posix-character-classes": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
+ "dev": true
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+ "dev": true
+ },
+ "preserve": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz",
+ "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=",
+ "dev": true
+ },
+ "pretty-hrtime": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz",
+ "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=",
+ "dev": true
+ },
+ "private": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
+ "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==",
+ "dev": true
+ },
+ "process-nextick-args": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
+ "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==",
+ "dev": true
+ },
+ "progress": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz",
+ "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=",
+ "dev": true
+ },
+ "pseudomap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
+ "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
+ "dev": true
+ },
+ "punycode": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+ "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
+ "dev": true
+ },
+ "q": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
+ "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=",
+ "dev": true
+ },
+ "qs": {
+ "version": "6.3.2",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz",
+ "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=",
+ "dev": true
+ },
+ "querystringify": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-1.0.0.tgz",
+ "integrity": "sha1-YoYkIRLFtxL6ZU5SZlK/ahP/Bcs=",
+ "dev": true
+ },
+ "queue": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/queue/-/queue-3.1.0.tgz",
+ "integrity": "sha1-bEnQHwCeIlZ4h4nyv/rGuLmZBYU=",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.3"
+ }
+ },
+ "randomatic": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz",
+ "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==",
+ "dev": true,
+ "requires": {
+ "is-number": "3.0.0",
+ "kind-of": "4.0.0"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "kind-of": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "read-pkg": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
+ "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
+ "dev": true,
+ "requires": {
+ "load-json-file": "1.1.0",
+ "normalize-package-data": "2.4.0",
+ "path-type": "1.1.0"
+ }
+ },
+ "read-pkg-up": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
+ "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
+ "dev": true,
+ "requires": {
+ "find-up": "1.1.2",
+ "read-pkg": "1.1.0"
+ }
+ },
+ "readable-stream": {
+ "version": "2.3.4",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.4.tgz",
+ "integrity": "sha512-vuYxeWYM+fde14+rajzqgeohAI7YoJcHE7kXDAc4Nk0EbuKnJfqtY9YtRkLo/tqkuF7MsBQRhPnPeyjYITp3ZQ==",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "2.0.0",
+ "safe-buffer": "5.1.1",
+ "string_decoder": "1.0.3",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "readdirp": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz",
+ "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "minimatch": "3.0.4",
+ "readable-stream": "2.3.4",
+ "set-immediate-shim": "1.0.1"
+ }
+ },
+ "rechoir": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
+ "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=",
+ "dev": true,
+ "requires": {
+ "resolve": "1.5.0"
+ }
+ },
+ "redent": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
+ "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
+ "dev": true,
+ "requires": {
+ "indent-string": "2.1.0",
+ "strip-indent": "1.0.1"
+ }
+ },
+ "regenerate": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz",
+ "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==",
+ "dev": true
+ },
+ "regenerator-runtime": {
+ "version": "0.10.5",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz",
+ "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg="
+ },
+ "regenerator-transform": {
+ "version": "0.10.1",
+ "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz",
+ "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "private": "0.1.8"
+ }
+ },
+ "regex-cache": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz",
+ "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==",
+ "dev": true,
+ "requires": {
+ "is-equal-shallow": "0.1.3"
+ }
+ },
+ "regex-not": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.0.tgz",
+ "integrity": "sha1-Qvg+OXcWIt+CawKvF2Ul1qXxV/k=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1"
+ }
+ },
+ "regexpu-core": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz",
+ "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=",
+ "dev": true,
+ "requires": {
+ "regenerate": "1.3.3",
+ "regjsgen": "0.2.0",
+ "regjsparser": "0.1.5"
+ }
+ },
+ "regjsgen": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz",
+ "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=",
+ "dev": true
+ },
+ "regjsparser": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz",
+ "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=",
+ "dev": true,
+ "requires": {
+ "jsesc": "0.5.0"
+ },
+ "dependencies": {
+ "jsesc": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
+ "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
+ "dev": true
+ }
+ }
+ },
+ "remove-trailing-separator": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
+ "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
+ "dev": true
+ },
+ "repeat-element": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
+ "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=",
+ "dev": true
+ },
+ "repeat-string": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
+ "dev": true
+ },
+ "repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "dev": true,
+ "requires": {
+ "is-finite": "1.0.2"
+ }
+ },
+ "replace-ext": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz",
+ "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=",
+ "dev": true
+ },
+ "request": {
+ "version": "2.83.0",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz",
+ "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==",
+ "dev": true,
+ "requires": {
+ "aws-sign2": "0.7.0",
+ "aws4": "1.6.0",
+ "caseless": "0.12.0",
+ "combined-stream": "1.0.6",
+ "extend": "3.0.1",
+ "forever-agent": "0.6.1",
+ "form-data": "2.3.2",
+ "har-validator": "5.0.3",
+ "hawk": "6.0.2",
+ "http-signature": "1.2.0",
+ "is-typedarray": "1.0.0",
+ "isstream": "0.1.2",
+ "json-stringify-safe": "5.0.1",
+ "mime-types": "2.1.18",
+ "oauth-sign": "0.8.2",
+ "performance-now": "2.1.0",
+ "qs": "6.5.1",
+ "safe-buffer": "5.1.1",
+ "stringstream": "0.0.5",
+ "tough-cookie": "2.3.3",
+ "tunnel-agent": "0.6.0",
+ "uuid": "3.2.1"
+ },
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+ "dev": true
+ },
+ "aws-sign2": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
+ "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
+ "dev": true
+ },
+ "boom": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz",
+ "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=",
+ "dev": true,
+ "requires": {
+ "hoek": "4.2.1"
+ }
+ },
+ "caseless": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
+ "dev": true
+ },
+ "cryptiles": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz",
+ "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=",
+ "dev": true,
+ "requires": {
+ "boom": "5.2.0"
+ },
+ "dependencies": {
+ "boom": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz",
+ "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==",
+ "dev": true,
+ "requires": {
+ "hoek": "4.2.1"
+ }
+ }
+ }
+ },
+ "form-data": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz",
+ "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=",
+ "dev": true,
+ "requires": {
+ "asynckit": "0.4.0",
+ "combined-stream": "1.0.6",
+ "mime-types": "2.1.18"
+ }
+ },
+ "har-validator": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz",
+ "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=",
+ "dev": true,
+ "requires": {
+ "ajv": "5.5.2",
+ "har-schema": "2.0.0"
+ }
+ },
+ "hawk": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz",
+ "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==",
+ "dev": true,
+ "requires": {
+ "boom": "4.3.1",
+ "cryptiles": "3.1.2",
+ "hoek": "4.2.1",
+ "sntp": "2.1.0"
+ }
+ },
+ "hoek": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz",
+ "integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==",
+ "dev": true
+ },
+ "http-signature": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
+ "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "1.0.0",
+ "jsprim": "1.4.1",
+ "sshpk": "1.13.1"
+ }
+ },
+ "qs": {
+ "version": "6.5.1",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz",
+ "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==",
+ "dev": true
+ },
+ "sntp": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz",
+ "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==",
+ "dev": true,
+ "requires": {
+ "hoek": "4.2.1"
+ }
+ },
+ "tunnel-agent": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+ "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.1.1"
+ }
+ }
+ }
+ },
+ "require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
+ "dev": true
+ },
+ "require-main-filename": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
+ "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
+ "dev": true
+ },
+ "require-uncached": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz",
+ "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=",
+ "dev": true,
+ "requires": {
+ "caller-path": "0.1.0",
+ "resolve-from": "1.0.1"
+ }
+ },
+ "requires-port": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
+ "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
+ "dev": true
+ },
+ "resolve": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz",
+ "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==",
+ "dev": true,
+ "requires": {
+ "path-parse": "1.0.5"
+ }
+ },
+ "resolve-dir": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz",
+ "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=",
+ "dev": true,
+ "requires": {
+ "expand-tilde": "2.0.2",
+ "global-modules": "1.0.0"
+ }
+ },
+ "resolve-from": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz",
+ "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=",
+ "dev": true
+ },
+ "resolve-url": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
+ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
+ "dev": true
+ },
+ "restore-cursor": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
+ "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
+ "requires": {
+ "onetime": "2.0.1",
+ "signal-exit": "3.0.2"
+ }
+ },
+ "right-align": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz",
+ "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "align-text": "0.1.4"
+ }
+ },
+ "rimraf": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
+ "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
+ "dev": true,
+ "requires": {
+ "glob": "7.1.2"
+ }
+ },
+ "run-async": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz",
+ "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=",
+ "requires": {
+ "is-promise": "2.1.0"
+ }
+ },
+ "run-sequence": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/run-sequence/-/run-sequence-2.2.1.tgz",
+ "integrity": "sha512-qkzZnQWMZjcKbh3CNly2srtrkaO/2H/SI5f2eliMCapdRD3UhMrwjfOAZJAnZ2H8Ju4aBzFZkBGXUqFs9V0yxw==",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "fancy-log": "1.3.2",
+ "plugin-error": "0.1.2"
+ }
+ },
+ "rx": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz",
+ "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I="
+ },
+ "safe-buffer": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
+ "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==",
+ "dev": true
+ },
+ "sax": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
+ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
+ "dev": true
+ },
+ "semver": {
+ "version": "4.3.6",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz",
+ "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=",
+ "dev": true
+ },
+ "sequencify": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/sequencify/-/sequencify-0.0.7.tgz",
+ "integrity": "sha1-kM/xnQLgcCf9dn9erT57ldHnOAw=",
+ "dev": true
+ },
+ "set-blocking": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
+ "dev": true
+ },
+ "set-getter": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.0.tgz",
+ "integrity": "sha1-12nBgsnVpR9AkUXy+6guXoboA3Y=",
+ "dev": true,
+ "requires": {
+ "to-object-path": "0.3.0"
+ }
+ },
+ "set-immediate-shim": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz",
+ "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=",
+ "dev": true
+ },
+ "set-value": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
+ "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-extendable": "0.1.1",
+ "is-plain-object": "2.0.4",
+ "split-string": "3.1.0"
+ }
+ },
+ "shebang-command": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+ "dev": true,
+ "requires": {
+ "shebang-regex": "1.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
+ "dev": true
+ },
+ "shell-quote": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz",
+ "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=",
+ "dev": true,
+ "requires": {
+ "array-filter": "0.0.1",
+ "array-map": "0.0.0",
+ "array-reduce": "0.0.0",
+ "jsonify": "0.0.0"
+ }
+ },
+ "sigmund": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz",
+ "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=",
+ "dev": true
+ },
+ "signal-exit": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
+ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
+ },
+ "slash": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
+ "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
+ "dev": true
+ },
+ "slice-ansi": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz",
+ "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==",
+ "dev": true,
+ "requires": {
+ "is-fullwidth-code-point": "2.0.0"
+ }
+ },
+ "snapdragon": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.1.tgz",
+ "integrity": "sha1-4StUh/re0+PeoKyR6UAL91tAE3A=",
+ "dev": true,
+ "requires": {
+ "base": "0.11.2",
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "map-cache": "0.2.2",
+ "source-map": "0.5.7",
+ "source-map-resolve": "0.5.1",
+ "use": "2.0.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
+ }
+ },
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "snapdragon-node": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+ "dev": true,
+ "requires": {
+ "define-property": "1.0.0",
+ "isobject": "3.0.1",
+ "snapdragon-util": "3.0.1"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ }
+ }
+ },
+ "snapdragon-util": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ }
+ },
+ "sntp": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz",
+ "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=",
+ "dev": true,
+ "requires": {
+ "hoek": "2.16.3"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ },
+ "source-map-resolve": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz",
+ "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==",
+ "dev": true,
+ "requires": {
+ "atob": "2.0.3",
+ "decode-uri-component": "0.2.0",
+ "resolve-url": "0.2.1",
+ "source-map-url": "0.4.0",
+ "urix": "0.1.0"
+ }
+ },
+ "source-map-support": {
+ "version": "0.4.18",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz",
+ "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==",
+ "dev": true,
+ "requires": {
+ "source-map": "0.5.7"
+ }
+ },
+ "source-map-url": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
+ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
+ "dev": true
+ },
+ "sparkles": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz",
+ "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=",
+ "dev": true
+ },
+ "spdx-correct": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz",
+ "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=",
+ "dev": true,
+ "requires": {
+ "spdx-license-ids": "1.2.2"
+ }
+ },
+ "spdx-expression-parse": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz",
+ "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=",
+ "dev": true
+ },
+ "spdx-license-ids": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz",
+ "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=",
+ "dev": true
+ },
+ "split": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz",
+ "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==",
+ "dev": true,
+ "requires": {
+ "through": "2.3.8"
+ }
+ },
+ "split-string": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
+ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "3.0.2"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "dev": true,
+ "requires": {
+ "assign-symbols": "1.0.0",
+ "is-extendable": "1.0.1"
+ }
+ },
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
+ },
+ "split2": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz",
+ "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==",
+ "dev": true,
+ "requires": {
+ "through2": "2.0.3"
+ }
+ },
+ "sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+ "dev": true
+ },
+ "sshpk": {
+ "version": "1.13.1",
+ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz",
+ "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=",
+ "dev": true,
+ "requires": {
+ "asn1": "0.2.3",
+ "assert-plus": "1.0.0",
+ "bcrypt-pbkdf": "1.0.1",
+ "dashdash": "1.14.1",
+ "ecc-jsbn": "0.1.1",
+ "getpass": "0.1.7",
+ "jsbn": "0.1.1",
+ "tweetnacl": "0.14.5"
+ },
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+ "dev": true
+ }
+ }
+ },
+ "stable": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.6.tgz",
+ "integrity": "sha1-kQ9dKu17Ugxud3SZwfMuE5/eyxA=",
+ "dev": true
+ },
+ "standard-version": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/standard-version/-/standard-version-4.3.0.tgz",
+ "integrity": "sha512-2UJ2BIUNa7+41PH4FvYicSQED2LCt2RXjmNFis+JZlxZtwzNnGn4uuL8WBUqHoC9b+bJ0AHIAX/bilzm+pGPeA==",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "conventional-changelog": "1.1.15",
+ "conventional-recommended-bump": "1.2.1",
+ "dotgitignore": "1.0.3",
+ "figures": "1.7.0",
+ "fs-access": "1.0.1",
+ "semver": "5.5.0",
+ "yargs": "8.0.2"
+ },
+ "dependencies": {
+ "camelcase": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
+ "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
+ "dev": true
+ },
+ "cliui": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
+ "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
+ "dev": true,
+ "requires": {
+ "string-width": "1.0.2",
+ "strip-ansi": "3.0.1",
+ "wrap-ansi": "2.1.0"
+ },
+ "dependencies": {
+ "string-width": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+ "dev": true,
+ "requires": {
+ "code-point-at": "1.1.0",
+ "is-fullwidth-code-point": "1.0.0",
+ "strip-ansi": "3.0.1"
+ }
+ }
+ }
+ },
+ "figures": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz",
+ "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=",
+ "dev": true,
+ "requires": {
+ "escape-string-regexp": "1.0.5",
+ "object-assign": "4.1.1"
+ }
+ },
+ "find-up": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
+ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
+ "dev": true,
+ "requires": {
+ "locate-path": "2.0.0"
+ }
+ },
+ "is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "load-json-file": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
+ "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "parse-json": "2.2.0",
+ "pify": "2.3.0",
+ "strip-bom": "3.0.0"
+ }
+ },
+ "path-type": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz",
+ "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
+ "dev": true,
+ "requires": {
+ "pify": "2.3.0"
+ }
+ },
+ "read-pkg": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
+ "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
+ "dev": true,
+ "requires": {
+ "load-json-file": "2.0.0",
+ "normalize-package-data": "2.4.0",
+ "path-type": "2.0.0"
+ }
+ },
+ "read-pkg-up": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz",
+ "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=",
+ "dev": true,
+ "requires": {
+ "find-up": "2.1.0",
+ "read-pkg": "2.0.0"
+ }
+ },
+ "semver": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
+ "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==",
+ "dev": true
+ },
+ "strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
+ "dev": true
+ },
+ "yargs": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz",
+ "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=",
+ "dev": true,
+ "requires": {
+ "camelcase": "4.1.0",
+ "cliui": "3.2.0",
+ "decamelize": "1.2.0",
+ "get-caller-file": "1.0.2",
+ "os-locale": "2.1.0",
+ "read-pkg-up": "2.0.0",
+ "require-directory": "2.1.1",
+ "require-main-filename": "1.0.1",
+ "set-blocking": "2.0.0",
+ "string-width": "2.1.1",
+ "which-module": "2.0.0",
+ "y18n": "3.2.1",
+ "yargs-parser": "7.0.0"
+ }
+ }
+ }
+ },
+ "stat-mode": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-0.2.2.tgz",
+ "integrity": "sha1-5sgLYjEj19gM8TLOU480YokHJQI=",
+ "dev": true
+ },
+ "static-extend": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
+ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+ "dev": true,
+ "requires": {
+ "define-property": "0.2.5",
+ "object-copy": "0.1.0"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
+ }
+ },
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "stream-combiner": {
+ "version": "0.0.4",
+ "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz",
+ "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=",
+ "dev": true,
+ "requires": {
+ "duplexer": "0.1.1"
+ }
+ },
+ "stream-consume": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.0.tgz",
+ "integrity": "sha1-pB6tGm1ggc63n2WwYZAbbY89HQ8=",
+ "dev": true
+ },
+ "stream-shift": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz",
+ "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=",
+ "dev": true
+ },
+ "streamfilter": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/streamfilter/-/streamfilter-1.0.7.tgz",
+ "integrity": "sha512-Gk6KZM+yNA1JpW0KzlZIhjo3EaBJDkYfXtYSbOwNIQ7Zd6006E6+sCFlW1NDvFG/vnXhKmw6TJJgiEQg/8lXfQ==",
+ "dev": true,
+ "requires": {
+ "readable-stream": "2.3.4"
+ }
+ },
+ "streamifier": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/streamifier/-/streamifier-0.1.1.tgz",
+ "integrity": "sha1-l+mNj6TRBdYqJpHR3AfoINuN/E8=",
+ "dev": true
+ },
+ "string-width": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+ "requires": {
+ "is-fullwidth-code-point": "2.0.0",
+ "strip-ansi": "4.0.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "requires": {
+ "ansi-regex": "3.0.0"
+ }
+ }
+ }
+ },
+ "string_decoder": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
+ "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.1.1"
+ }
+ },
+ "stringstream": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz",
+ "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "strip-bom": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-1.0.0.tgz",
+ "integrity": "sha1-hbiGLzhEtabV7IRnqTWYFzo295Q=",
+ "dev": true,
+ "requires": {
+ "first-chunk-stream": "1.0.0",
+ "is-utf8": "0.2.1"
+ }
+ },
+ "strip-bom-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz",
+ "integrity": "sha1-5xRDmFd9Uaa+0PoZlPoF9D/ZiO4=",
+ "dev": true,
+ "requires": {
+ "first-chunk-stream": "1.0.0",
+ "strip-bom": "2.0.0"
+ },
+ "dependencies": {
+ "strip-bom": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
+ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+ "dev": true,
+ "requires": {
+ "is-utf8": "0.2.1"
+ }
+ }
+ }
+ },
+ "strip-eof": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
+ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
+ "dev": true
+ },
+ "strip-indent": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
+ "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
+ "dev": true,
+ "requires": {
+ "get-stdin": "4.0.1"
+ }
+ },
+ "strip-json-comments": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+ "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
+ "dev": true
+ },
+ "subarg": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz",
+ "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=",
+ "dev": true,
+ "requires": {
+ "minimist": "1.2.0"
+ }
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
+ },
+ "svgo": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.0.4.tgz",
+ "integrity": "sha512-DR9ieoaBoeySY4pnIJMM3Hez6kcVj+Uzj8AUJkr3435qstozP9i+mZ9yzcbq64A44i9YKh3I1Laex+mAyc69Rg==",
+ "dev": true,
+ "requires": {
+ "coa": "2.0.1",
+ "colors": "1.1.2",
+ "css-select": "1.3.0-rc0",
+ "css-select-base-adapter": "0.1.0",
+ "css-tree": "1.0.0-alpha25",
+ "css-url-regex": "1.1.0",
+ "csso": "3.5.0",
+ "js-yaml": "3.10.0",
+ "mkdirp": "0.5.1",
+ "object.values": "1.0.4",
+ "sax": "1.2.4",
+ "stable": "0.1.6",
+ "unquote": "1.1.1",
+ "util.promisify": "1.0.0"
+ }
+ },
+ "table": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz",
+ "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==",
+ "dev": true,
+ "requires": {
+ "ajv": "5.5.2",
+ "ajv-keywords": "2.1.1",
+ "chalk": "2.3.1",
+ "lodash": "4.17.5",
+ "slice-ansi": "1.0.0",
+ "string-width": "2.1.1"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz",
+ "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "chalk": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz",
+ "integrity": "sha512-QUU4ofkDoMIVO7hcx1iPTISs88wsO8jA92RQIm4JAwZvFGGAV2hSAA1NX7oVj2Ej2Q6NDTcRDjPTFrMCRZoJ6g==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.0",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.2.0"
+ }
+ },
+ "supports-color": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.2.0.tgz",
+ "integrity": "sha512-F39vS48la4YvTZUPVeTqsjsFNrvcMwrV3RLZINsmHo+7djCvuUzSIeXOnZ5hmjef4bajL1dNccN+tg5XAliO5Q==",
+ "dev": true,
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ }
+ }
+ },
+ "tar": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz",
+ "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=",
+ "dev": true,
+ "requires": {
+ "block-stream": "0.0.9",
+ "fstream": "1.0.11",
+ "inherits": "2.0.3"
+ }
+ },
+ "ternary-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/ternary-stream/-/ternary-stream-2.0.1.tgz",
+ "integrity": "sha1-Bk5Im0tb9gumpre8fy9cJ07Pgmk=",
+ "dev": true,
+ "requires": {
+ "duplexify": "3.5.3",
+ "fork-stream": "0.0.4",
+ "merge-stream": "1.0.1",
+ "through2": "2.0.3"
+ }
+ },
+ "text-extensions": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.7.0.tgz",
+ "integrity": "sha512-AKXZeDq230UaSzaO5s3qQUZOaC7iKbzq0jOFL614R7d9R593HLqAOL0cYoqLdkNrjBSOdmoQI06yigq1TSBXAg==",
+ "dev": true
+ },
+ "text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
+ "dev": true
+ },
+ "through": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
+ },
+ "through2": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
+ "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "2.3.4",
+ "xtend": "4.0.1"
+ }
+ },
+ "through2-filter": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz",
+ "integrity": "sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=",
+ "dev": true,
+ "requires": {
+ "through2": "2.0.3",
+ "xtend": "4.0.1"
+ }
+ },
+ "tildify": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz",
+ "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=",
+ "dev": true,
+ "requires": {
+ "os-homedir": "1.0.2"
+ }
+ },
+ "time-stamp": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz",
+ "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=",
+ "dev": true
+ },
+ "tmp": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
+ "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
+ "requires": {
+ "os-tmpdir": "1.0.2"
+ }
+ },
+ "to-absolute-glob": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz",
+ "integrity": "sha1-HN+kcqnvUMI57maZm2YsoOs5k38=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1"
+ }
+ },
+ "to-fast-properties": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
+ "dev": true
+ },
+ "to-object-path": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ }
+ },
+ "to-regex": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.1.tgz",
+ "integrity": "sha1-FTWL7kosg712N3uh3ASdDxiDeq4=",
+ "dev": true,
+ "requires": {
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "regex-not": "1.0.0"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
+ }
+ },
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "to-regex-range": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+ "dev": true,
+ "requires": {
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ }
+ }
+ }
+ },
+ "tough-cookie": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz",
+ "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=",
+ "dev": true,
+ "requires": {
+ "punycode": "1.4.1"
+ }
+ },
+ "trim-newlines": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
+ "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
+ "dev": true
+ },
+ "trim-off-newlines": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz",
+ "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=",
+ "dev": true
+ },
+ "trim-right": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+ "dev": true
+ },
+ "tunnel-agent": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz",
+ "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=",
+ "dev": true
+ },
+ "tweetnacl": {
+ "version": "0.14.5",
+ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
+ "dev": true,
+ "optional": true
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2"
+ }
+ },
+ "typedarray": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
+ "dev": true
+ },
+ "typescript": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.7.1.tgz",
+ "integrity": "sha512-bqB1yS6o9TNA9ZC/MJxM0FZzPnZdtHj0xWK/IZ5khzVqdpGul/R/EIiHRgFXlwTD7PSIaYVnGKq1QgMCu2mnqw==",
+ "dev": true
+ },
+ "uglify-js": {
+ "version": "2.8.29",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz",
+ "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "source-map": "0.5.7",
+ "uglify-to-browserify": "1.0.2",
+ "yargs": "3.10.0"
+ },
+ "dependencies": {
+ "camelcase": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
+ "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=",
+ "dev": true,
+ "optional": true
+ },
+ "yargs": {
+ "version": "3.10.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
+ "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "camelcase": "1.2.1",
+ "cliui": "2.1.0",
+ "decamelize": "1.2.0",
+ "window-size": "0.1.0"
+ }
+ }
+ }
+ },
+ "uglify-to-browserify": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz",
+ "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=",
+ "dev": true,
+ "optional": true
+ },
+ "unc-path-regex": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz",
+ "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=",
+ "dev": true
+ },
+ "union-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
+ "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
+ "dev": true,
+ "requires": {
+ "arr-union": "3.1.0",
+ "get-value": "2.0.6",
+ "is-extendable": "0.1.1",
+ "set-value": "0.4.3"
+ },
+ "dependencies": {
+ "set-value": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
+ "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-extendable": "0.1.1",
+ "is-plain-object": "2.0.4",
+ "to-object-path": "0.3.0"
+ }
+ }
+ }
+ },
+ "unique-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-1.0.0.tgz",
+ "integrity": "sha1-1ZpKdUJ0R9mqbJHnAmP40mpLEEs=",
+ "dev": true
+ },
+ "unquote": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz",
+ "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=",
+ "dev": true
+ },
+ "unset-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
+ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+ "dev": true,
+ "requires": {
+ "has-value": "0.3.1",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "has-value": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
+ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+ "dev": true,
+ "requires": {
+ "get-value": "2.0.6",
+ "has-values": "0.1.4",
+ "isobject": "2.1.0"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "dev": true,
+ "requires": {
+ "isarray": "1.0.0"
+ }
+ }
+ }
+ },
+ "has-values": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
+ "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
+ "dev": true
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ }
+ }
+ },
+ "urix": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
+ "dev": true
+ },
+ "url-parse": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.2.0.tgz",
+ "integrity": "sha512-DT1XbYAfmQP65M/mE6OALxmXzZ/z1+e5zk2TcSKe/KiYbNGZxgtttzC0mR/sjopbpOXcbniq7eIKmocJnUWlEw==",
+ "dev": true,
+ "requires": {
+ "querystringify": "1.0.0",
+ "requires-port": "1.0.0"
+ }
+ },
+ "use": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/use/-/use-2.0.2.tgz",
+ "integrity": "sha1-riig1y+TvyJCKhii43mZMRLeyOg=",
+ "dev": true,
+ "requires": {
+ "define-property": "0.2.5",
+ "isobject": "3.0.1",
+ "lazy-cache": "2.0.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
+ }
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "user-home": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz",
+ "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=",
+ "dev": true
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+ "dev": true
+ },
+ "util.promisify": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz",
+ "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==",
+ "dev": true,
+ "requires": {
+ "define-properties": "1.1.2",
+ "object.getownpropertydescriptors": "2.0.3"
+ }
+ },
+ "uuid": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz",
+ "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==",
+ "dev": true
+ },
+ "v8flags": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz",
+ "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=",
+ "dev": true,
+ "requires": {
+ "user-home": "1.1.1"
+ }
+ },
+ "vali-date": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz",
+ "integrity": "sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY=",
+ "dev": true
+ },
+ "validate-npm-package-license": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz",
+ "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=",
+ "dev": true,
+ "requires": {
+ "spdx-correct": "1.0.2",
+ "spdx-expression-parse": "1.0.4"
+ }
+ },
+ "verror": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
+ "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "1.0.0",
+ "core-util-is": "1.0.2",
+ "extsprintf": "1.3.0"
+ },
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+ "dev": true
+ }
+ }
+ },
+ "vinyl": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz",
+ "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=",
+ "dev": true,
+ "requires": {
+ "clone": "1.0.3",
+ "clone-stats": "0.0.1",
+ "replace-ext": "0.0.1"
+ }
+ },
+ "vinyl-fs": {
+ "version": "0.3.14",
+ "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.3.14.tgz",
+ "integrity": "sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY=",
+ "dev": true,
+ "requires": {
+ "defaults": "1.0.3",
+ "glob-stream": "3.1.18",
+ "glob-watcher": "0.0.6",
+ "graceful-fs": "3.0.11",
+ "mkdirp": "0.5.1",
+ "strip-bom": "1.0.0",
+ "through2": "0.6.5",
+ "vinyl": "0.4.6"
+ },
+ "dependencies": {
+ "clone": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz",
+ "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=",
+ "dev": true
+ },
+ "graceful-fs": {
+ "version": "3.0.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz",
+ "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=",
+ "dev": true,
+ "requires": {
+ "natives": "1.1.1"
+ }
+ },
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "0.0.1",
+ "string_decoder": "0.10.31"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ },
+ "through2": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
+ "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "1.0.34",
+ "xtend": "4.0.1"
+ }
+ },
+ "vinyl": {
+ "version": "0.4.6",
+ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz",
+ "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=",
+ "dev": true,
+ "requires": {
+ "clone": "0.2.0",
+ "clone-stats": "0.0.1"
+ }
+ }
+ }
+ },
+ "vinyl-source-stream": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vinyl-source-stream/-/vinyl-source-stream-1.1.2.tgz",
+ "integrity": "sha1-YrU6E1YQqJbpjKlr7jqH8Aio54A=",
+ "dev": true,
+ "requires": {
+ "through2": "2.0.3",
+ "vinyl": "0.4.6"
+ },
+ "dependencies": {
+ "clone": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz",
+ "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=",
+ "dev": true
+ },
+ "vinyl": {
+ "version": "0.4.6",
+ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz",
+ "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=",
+ "dev": true,
+ "requires": {
+ "clone": "0.2.0",
+ "clone-stats": "0.0.1"
+ }
+ }
+ }
+ },
+ "vscode": {
+ "version": "1.1.10",
+ "resolved": "https://registry.npmjs.org/vscode/-/vscode-1.1.10.tgz",
+ "integrity": "sha512-MvFXXSGuhw0Q6GC6dQrnRc0ES+63wpttGIoYGBMQnoS9JFCCNC/rWfX0lBCHJyuKL2Q8CYg0ROsMEHbHVwEtVw==",
+ "dev": true,
+ "requires": {
+ "glob": "7.1.2",
+ "gulp-chmod": "2.0.0",
+ "gulp-filter": "5.1.0",
+ "gulp-gunzip": "1.0.0",
+ "gulp-remote-src": "0.4.3",
+ "gulp-symdest": "1.1.0",
+ "gulp-untar": "0.0.6",
+ "gulp-vinyl-zip": "2.1.0",
+ "mocha": "4.1.0",
+ "request": "2.83.0",
+ "semver": "5.5.0",
+ "source-map-support": "0.5.3",
+ "url-parse": "1.2.0",
+ "vinyl-source-stream": "1.1.2"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
+ "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ },
+ "source-map-support": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.3.tgz",
+ "integrity": "sha512-eKkTgWYeBOQqFGXRfKabMFdnWepo51vWqEdoeikaEPFiJC7MCU5j2h4+6Q8npkZTeLGbSyecZvRxiSoWl3rh+w==",
+ "dev": true,
+ "requires": {
+ "source-map": "0.6.1"
+ }
+ }
+ }
+ },
+ "which": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz",
+ "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==",
+ "dev": true,
+ "requires": {
+ "isexe": "2.0.0"
+ }
+ },
+ "which-module": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
+ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
+ "dev": true
+ },
+ "window-size": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
+ "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=",
+ "dev": true,
+ "optional": true
+ },
+ "wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+ "dev": true
+ },
+ "wrap-ansi": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
+ "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
+ "dev": true,
+ "requires": {
+ "string-width": "1.0.2",
+ "strip-ansi": "3.0.1"
+ },
+ "dependencies": {
+ "is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "string-width": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+ "dev": true,
+ "requires": {
+ "code-point-at": "1.1.0",
+ "is-fullwidth-code-point": "1.0.0",
+ "strip-ansi": "3.0.1"
+ }
+ }
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ },
+ "write": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz",
+ "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=",
+ "dev": true,
+ "requires": {
+ "mkdirp": "0.5.1"
+ }
+ },
+ "xtend": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
+ "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=",
+ "dev": true
+ },
+ "y18n": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
+ "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
+ "dev": true
+ },
+ "yallist": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
+ "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
+ "dev": true
+ },
+ "yamljs": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/yamljs/-/yamljs-0.3.0.tgz",
+ "integrity": "sha512-C/FsVVhht4iPQYXOInoxUM/1ELSf9EsgKH34FofQOp6hwCPrW4vG4w5++TED3xRUo8gD7l0P1J1dLlDYzODsTQ==",
+ "dev": true,
+ "requires": {
+ "argparse": "1.0.9",
+ "glob": "7.1.2"
+ }
+ },
+ "yargs": {
+ "version": "11.0.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.0.0.tgz",
+ "integrity": "sha512-Rjp+lMYQOWtgqojx1dEWorjCofi1YN7AoFvYV7b1gx/7dAAeuI4kN5SZiEvr0ZmsZTOpDRcCqrpI10L31tFkBw==",
+ "dev": true,
+ "requires": {
+ "cliui": "4.0.0",
+ "decamelize": "1.2.0",
+ "find-up": "2.1.0",
+ "get-caller-file": "1.0.2",
+ "os-locale": "2.1.0",
+ "require-directory": "2.1.1",
+ "require-main-filename": "1.0.1",
+ "set-blocking": "2.0.0",
+ "string-width": "2.1.1",
+ "which-module": "2.0.0",
+ "y18n": "3.2.1",
+ "yargs-parser": "9.0.2"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "dev": true
+ },
+ "camelcase": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
+ "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
+ "dev": true
+ },
+ "cliui": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.0.0.tgz",
+ "integrity": "sha512-nY3W5Gu2racvdDk//ELReY+dHjb9PlIcVDFXP72nVIhq2Gy3LuVXYwJoPVudwQnv1shtohpgkdCKT2YaKY0CKw==",
+ "dev": true,
+ "requires": {
+ "string-width": "2.1.1",
+ "strip-ansi": "4.0.0",
+ "wrap-ansi": "2.1.0"
+ }
+ },
+ "find-up": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
+ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
+ "dev": true,
+ "requires": {
+ "locate-path": "2.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "3.0.0"
+ }
+ },
+ "yargs-parser": {
+ "version": "9.0.2",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz",
+ "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=",
+ "dev": true,
+ "requires": {
+ "camelcase": "4.1.0"
+ }
+ }
+ }
+ },
+ "yargs-parser": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz",
+ "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=",
+ "dev": true,
+ "requires": {
+ "camelcase": "4.1.0"
+ },
+ "dependencies": {
+ "camelcase": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
+ "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
+ "dev": true
+ }
+ }
+ },
+ "yauzl": {
+ "version": "2.9.1",
+ "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.9.1.tgz",
+ "integrity": "sha1-qBmB6nCleUYTOIPwKcWCGok1mn8=",
+ "dev": true,
+ "requires": {
+ "buffer-crc32": "0.2.13",
+ "fd-slicer": "1.0.1"
+ }
+ },
+ "yazl": {
+ "version": "2.4.3",
+ "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.4.3.tgz",
+ "integrity": "sha1-7CblzIfVYBud+EMtvdPNLlFzoHE=",
+ "dev": true,
+ "requires": {
+ "buffer-crc32": "0.2.13"
+ }
+ }
+ }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..395d870
--- /dev/null
+++ b/package.json
@@ -0,0 +1,142 @@
+{
+ "name": "vsc-material-theme",
+ "displayName": "Material Theme",
+ "description": "The most epic theme now for Visual Studio Code",
+ "version": "1.6.0",
+ "publisher": "Equinusocio",
+ "license": "Apache-2.0",
+ "author": "Mattia Astorino [@equinusocio]",
+ "icon": "logo.png",
+ "galleryBanner": {
+ "color": "#263238",
+ "theme": "dark"
+ },
+ "homepage": "https://github.com/equinusocio/vsc-material-theme",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/equinusocio/vsc-material-theme.git"
+ },
+ "bugs": {
+ "url": "https://github.com/equinusocio/vsc-material-theme/issues"
+ },
+ "engines": {
+ "vscode": "^1.19.0"
+ },
+ "standard-version": {
+ "scripts": {
+ "postchangelog": "yarn gulp changelog-title"
+ }
+ },
+ "scripts": {
+ "build": "yarn build-icons && yarn build-themes && yarn build-icons-accents && yarn build-icons-variants",
+ "minimize-icons": "svgo -f src/icons/svgs -o icons/",
+ "minimize-json": "json-minify themes/.material-theme-icons.tmp > themes/Material-Theme-Icons.json && yarn remove-icons-tmp",
+ "remove-icons": "rimraf icons/* && rimraf themes/Material-Theme-Icons.json",
+ "remove-icons-tmp": "rimraf themes/.material-theme-icons.tmp",
+ "build-icons": "yarn remove-icons && yarn minimize-icons && yarn gulp build:icons && yarn minimize-json",
+ "build-icons-accents": "yarn gulp build:icons.accents",
+ "build-icons-variants": "yarn gulp build:icons.variants",
+ "build-themes": "yarn gulp build:themes",
+ "release": "standard-version",
+ "postinstall": "node ./node_modules/vscode/bin/install && opencollective postinstall"
+ },
+ "categories": [
+ "Themes",
+ "Other"
+ ],
+ "activationEvents": [
+ "*"
+ ],
+ "main": "./extensions/material.theme.config.js",
+ "contributes": {
+ "commands": [
+ {
+ "category": "🎨 Material theme",
+ "command": "material.theme.config",
+ "title": "Settings"
+ }
+ ],
+ "configuration": {
+ "properties": {
+ "materialTheme.cache.workbench.accent": {
+ "type": "string",
+ "title": "[DEPRECATED] This is an old property.",
+ "description": "This property is intended only for migrating old settings system to a new one. It will be removed in new versions. Don't use it, use \"materialTheme.cache.workbench.settings\" instead."
+ },
+ "materialTheme.cache.workbench.settings": {
+ "default": {},
+ "type": "object",
+ "title": "Custom material theme settings",
+ "description": "Material theme settings object."
+ }
+ }
+ },
+ "themes": [
+ {
+ "label": "Material Theme",
+ "path": "./themes/Material-Theme-Palenight.json",
+ "uiTheme": "vs-dark"
+ }
+ ],
+ "iconThemes": [
+ {
+ "id": "eq-material-theme-icons",
+ "label": "Material Theme Icons",
+ "path": "./themes/Material-Theme-Icons.json"
+ }
+ ]
+ },
+ "badges": [
+ {
+ "url": "https://camo.githubusercontent.com/d3c6e53aa66426dead24cdedab0e83082103bea6/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6973737565732f657175696e75736f63696f2f7673632d6d6174657269616c2d7468656d652e7376673f7374796c653d666c61742d737175617265",
+ "href": "https://github.com/equinusocio/vsc-material-theme/issues",
+ "description": "Open issues"
+ }
+ ],
+ "devDependencies": {
+ "@types/chalk": "2.2.0",
+ "@types/gulp": "4.0.5",
+ "@types/gulp-if": "0.0.33",
+ "@types/gulp-util": "3.0.34",
+ "@types/mustache": "0.8.30",
+ "@types/run-sequence": "0.0.30",
+ "@types/through2": "2.0.33",
+ "@types/yamljs": "0.2.30",
+ "@types/yargs": "10.0.1",
+ "babel-core": "6.26.0",
+ "babel-preset-es2015": "6.24.1",
+ "babel-root-import": "4.1.8",
+ "cpx": "1.5.0",
+ "eslint": "4.17.0",
+ "eslint-plugin-standard": "3.0.1",
+ "gulp": "3.9.1",
+ "gulp-bump": "3.1.0",
+ "gulp-conventional-changelog": "1.1.11",
+ "gulp-if": "2.0.2",
+ "gulp-stats": "0.0.4",
+ "gulp-util": "3.0.8",
+ "json-minify": "1.0.0",
+ "mustache": "2.3.0",
+ "rimraf": "2.6.2",
+ "run-sequence": "2.2.1",
+ "standard-version": "4.3.0",
+ "svgo": "1.0.4",
+ "typescript": "2.7.1",
+ "vscode": "1.1.10",
+ "yamljs": "0.3.0",
+ "yargs": "11.0.0"
+ },
+ "__metadata": {
+ "id": "dffaf5a1-2219-434b-9d87-cb586fd59260",
+ "publisherDisplayName": "Mattia Astorino",
+ "publisherId": "e41388a1-a892-4c1e-940b-1e7c1bf43c97"
+ },
+ "dependencies": {
+ "opencollective": "1.0.3"
+ },
+ "collective": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/vsc-material-theme",
+ "logo": "https://opencollective.com/opencollective/logo.txt"
+ }
+}
diff --git a/src/icons/icons-theme.json b/src/icons/icons-theme.json
new file mode 100644
index 0000000..02b2cd7
Binary files /dev/null and b/src/icons/icons-theme.json differ
diff --git a/src/icons/svgs/actionscript.svg b/src/icons/svgs/actionscript.svg
new file mode 100755
index 0000000..5127f54
Binary files /dev/null and b/src/icons/svgs/actionscript.svg differ
diff --git a/src/icons/svgs/ai.svg b/src/icons/svgs/ai.svg
new file mode 100644
index 0000000..c983461
Binary files /dev/null and b/src/icons/svgs/ai.svg differ
diff --git a/src/icons/svgs/android.svg b/src/icons/svgs/android.svg
new file mode 100755
index 0000000..4a8eddc
Binary files /dev/null and b/src/icons/svgs/android.svg differ
diff --git a/src/icons/svgs/angular.svg b/src/icons/svgs/angular.svg
new file mode 100755
index 0000000..37cfd06
Binary files /dev/null and b/src/icons/svgs/angular.svg differ
diff --git a/src/icons/svgs/applescript.svg b/src/icons/svgs/applescript.svg
new file mode 100644
index 0000000..c6b5b44
Binary files /dev/null and b/src/icons/svgs/applescript.svg differ
diff --git a/src/icons/svgs/arduino.svg b/src/icons/svgs/arduino.svg
new file mode 100755
index 0000000..239a668
Binary files /dev/null and b/src/icons/svgs/arduino.svg differ
diff --git a/src/icons/svgs/assembly.svg b/src/icons/svgs/assembly.svg
new file mode 100755
index 0000000..e883a19
Binary files /dev/null and b/src/icons/svgs/assembly.svg differ
diff --git a/src/icons/svgs/autohotkey.svg b/src/icons/svgs/autohotkey.svg
new file mode 100755
index 0000000..4f03492
Binary files /dev/null and b/src/icons/svgs/autohotkey.svg differ
diff --git a/src/icons/svgs/babel.svg b/src/icons/svgs/babel.svg
new file mode 100644
index 0000000..444a3e3
Binary files /dev/null and b/src/icons/svgs/babel.svg differ
diff --git a/src/icons/svgs/blade.svg b/src/icons/svgs/blade.svg
new file mode 100644
index 0000000..aac7583
Binary files /dev/null and b/src/icons/svgs/blade.svg differ
diff --git a/src/icons/svgs/bower.svg b/src/icons/svgs/bower.svg
new file mode 100644
index 0000000..85b223a
Binary files /dev/null and b/src/icons/svgs/bower.svg differ
diff --git a/src/icons/svgs/c.svg b/src/icons/svgs/c.svg
new file mode 100644
index 0000000..140b795
Binary files /dev/null and b/src/icons/svgs/c.svg differ
diff --git a/src/icons/svgs/certificate.svg b/src/icons/svgs/certificate.svg
new file mode 100755
index 0000000..c9e9a00
Binary files /dev/null and b/src/icons/svgs/certificate.svg differ
diff --git a/src/icons/svgs/changelog.svg b/src/icons/svgs/changelog.svg
new file mode 100755
index 0000000..520a46c
Binary files /dev/null and b/src/icons/svgs/changelog.svg differ
diff --git a/src/icons/svgs/clojure.svg b/src/icons/svgs/clojure.svg
new file mode 100755
index 0000000..618f70f
Binary files /dev/null and b/src/icons/svgs/clojure.svg differ
diff --git a/src/icons/svgs/cmake.svg b/src/icons/svgs/cmake.svg
new file mode 100755
index 0000000..d12f2a3
Binary files /dev/null and b/src/icons/svgs/cmake.svg differ
diff --git a/src/icons/svgs/cmd.svg b/src/icons/svgs/cmd.svg
new file mode 100644
index 0000000..596b901
Binary files /dev/null and b/src/icons/svgs/cmd.svg differ
diff --git a/src/icons/svgs/coffee.svg b/src/icons/svgs/coffee.svg
new file mode 100755
index 0000000..476d64a
Binary files /dev/null and b/src/icons/svgs/coffee.svg differ
diff --git a/src/icons/svgs/console.svg b/src/icons/svgs/console.svg
new file mode 100755
index 0000000..9d2ea2a
Binary files /dev/null and b/src/icons/svgs/console.svg differ
diff --git a/src/icons/svgs/contributing.svg b/src/icons/svgs/contributing.svg
new file mode 100755
index 0000000..1f6e9b9
Binary files /dev/null and b/src/icons/svgs/contributing.svg differ
diff --git a/src/icons/svgs/cpp.svg b/src/icons/svgs/cpp.svg
new file mode 100755
index 0000000..1bf7d8c
Binary files /dev/null and b/src/icons/svgs/cpp.svg differ
diff --git a/src/icons/svgs/credits.svg b/src/icons/svgs/credits.svg
new file mode 100755
index 0000000..24b75b4
Binary files /dev/null and b/src/icons/svgs/credits.svg differ
diff --git a/src/icons/svgs/csharp.svg b/src/icons/svgs/csharp.svg
new file mode 100755
index 0000000..7236c8f
Binary files /dev/null and b/src/icons/svgs/csharp.svg differ
diff --git a/src/icons/svgs/css-map.svg b/src/icons/svgs/css-map.svg
new file mode 100755
index 0000000..efdb59a
Binary files /dev/null and b/src/icons/svgs/css-map.svg differ
diff --git a/src/icons/svgs/css.svg b/src/icons/svgs/css.svg
new file mode 100755
index 0000000..bb6a958
Binary files /dev/null and b/src/icons/svgs/css.svg differ
diff --git a/src/icons/svgs/dart.svg b/src/icons/svgs/dart.svg
new file mode 100755
index 0000000..5522e07
Binary files /dev/null and b/src/icons/svgs/dart.svg differ
diff --git a/src/icons/svgs/database.svg b/src/icons/svgs/database.svg
new file mode 100755
index 0000000..cebdd66
Binary files /dev/null and b/src/icons/svgs/database.svg differ
diff --git a/src/icons/svgs/dlang.svg b/src/icons/svgs/dlang.svg
new file mode 100644
index 0000000..739c9ab
Binary files /dev/null and b/src/icons/svgs/dlang.svg differ
diff --git a/src/icons/svgs/docker.svg b/src/icons/svgs/docker.svg
new file mode 100644
index 0000000..bf748a6
Binary files /dev/null and b/src/icons/svgs/docker.svg differ
diff --git a/src/icons/svgs/document.svg b/src/icons/svgs/document.svg
new file mode 100755
index 0000000..7775cd2
Binary files /dev/null and b/src/icons/svgs/document.svg differ
diff --git a/src/icons/svgs/dotnet.svg b/src/icons/svgs/dotnet.svg
new file mode 100644
index 0000000..6042049
Binary files /dev/null and b/src/icons/svgs/dotnet.svg differ
diff --git a/src/icons/svgs/email.svg b/src/icons/svgs/email.svg
new file mode 100755
index 0000000..1a16fc1
Binary files /dev/null and b/src/icons/svgs/email.svg differ
diff --git a/src/icons/svgs/eslint.svg b/src/icons/svgs/eslint.svg
new file mode 100644
index 0000000..da87ad5
Binary files /dev/null and b/src/icons/svgs/eslint.svg differ
diff --git a/src/icons/svgs/ex.svg b/src/icons/svgs/ex.svg
new file mode 100644
index 0000000..35e77c6
Binary files /dev/null and b/src/icons/svgs/ex.svg differ
diff --git a/src/icons/svgs/exe.svg b/src/icons/svgs/exe.svg
new file mode 100755
index 0000000..c3a6fc2
Binary files /dev/null and b/src/icons/svgs/exe.svg differ
diff --git a/src/icons/svgs/favicon.svg b/src/icons/svgs/favicon.svg
new file mode 100755
index 0000000..82a5437
Binary files /dev/null and b/src/icons/svgs/favicon.svg differ
diff --git a/src/icons/svgs/file_dark.svg b/src/icons/svgs/file_dark.svg
new file mode 100755
index 0000000..9c15ee9
Binary files /dev/null and b/src/icons/svgs/file_dark.svg differ
diff --git a/src/icons/svgs/flash.svg b/src/icons/svgs/flash.svg
new file mode 100755
index 0000000..5d83204
Binary files /dev/null and b/src/icons/svgs/flash.svg differ
diff --git a/src/icons/svgs/flow.svg b/src/icons/svgs/flow.svg
new file mode 100755
index 0000000..b137445
Binary files /dev/null and b/src/icons/svgs/flow.svg differ
diff --git a/src/icons/svgs/folder_assets.svg b/src/icons/svgs/folder_assets.svg
new file mode 100644
index 0000000..284fc40
Binary files /dev/null and b/src/icons/svgs/folder_assets.svg differ
diff --git a/src/icons/svgs/folder_assets_open.svg b/src/icons/svgs/folder_assets_open.svg
new file mode 100644
index 0000000..d2df96f
Binary files /dev/null and b/src/icons/svgs/folder_assets_open.svg differ
diff --git a/src/icons/svgs/folder_bower.svg b/src/icons/svgs/folder_bower.svg
new file mode 100644
index 0000000..9345c32
Binary files /dev/null and b/src/icons/svgs/folder_bower.svg differ
diff --git a/src/icons/svgs/folder_bower_open.svg b/src/icons/svgs/folder_bower_open.svg
new file mode 100644
index 0000000..1d7bc0d
Binary files /dev/null and b/src/icons/svgs/folder_bower_open.svg differ
diff --git a/src/icons/svgs/folder_ci.svg b/src/icons/svgs/folder_ci.svg
new file mode 100644
index 0000000..6aca331
Binary files /dev/null and b/src/icons/svgs/folder_ci.svg differ
diff --git a/src/icons/svgs/folder_ci_open.svg b/src/icons/svgs/folder_ci_open.svg
new file mode 100644
index 0000000..c76922f
Binary files /dev/null and b/src/icons/svgs/folder_ci_open.svg differ
diff --git a/src/icons/svgs/folder_dark.svg b/src/icons/svgs/folder_dark.svg
new file mode 100644
index 0000000..1d846ec
Binary files /dev/null and b/src/icons/svgs/folder_dark.svg differ
diff --git a/src/icons/svgs/folder_dark_build.svg b/src/icons/svgs/folder_dark_build.svg
new file mode 100644
index 0000000..98f320e
Binary files /dev/null and b/src/icons/svgs/folder_dark_build.svg differ
diff --git a/src/icons/svgs/folder_dist.svg b/src/icons/svgs/folder_dist.svg
new file mode 100644
index 0000000..ff74186
Binary files /dev/null and b/src/icons/svgs/folder_dist.svg differ
diff --git a/src/icons/svgs/folder_dist_open.svg b/src/icons/svgs/folder_dist_open.svg
new file mode 100644
index 0000000..9275731
Binary files /dev/null and b/src/icons/svgs/folder_dist_open.svg differ
diff --git a/src/icons/svgs/folder_git.svg b/src/icons/svgs/folder_git.svg
new file mode 100644
index 0000000..85c74f7
Binary files /dev/null and b/src/icons/svgs/folder_git.svg differ
diff --git a/src/icons/svgs/folder_git_open.svg b/src/icons/svgs/folder_git_open.svg
new file mode 100644
index 0000000..9cbbdb0
Binary files /dev/null and b/src/icons/svgs/folder_git_open.svg differ
diff --git a/src/icons/svgs/folder_github.svg b/src/icons/svgs/folder_github.svg
new file mode 100644
index 0000000..3831d1c
Binary files /dev/null and b/src/icons/svgs/folder_github.svg differ
diff --git a/src/icons/svgs/folder_github_open.svg b/src/icons/svgs/folder_github_open.svg
new file mode 100644
index 0000000..52e29ed
Binary files /dev/null and b/src/icons/svgs/folder_github_open.svg differ
diff --git a/src/icons/svgs/folder_gulp.svg b/src/icons/svgs/folder_gulp.svg
new file mode 100644
index 0000000..e3c7c9c
Binary files /dev/null and b/src/icons/svgs/folder_gulp.svg differ
diff --git a/src/icons/svgs/folder_gulp_open.svg b/src/icons/svgs/folder_gulp_open.svg
new file mode 100644
index 0000000..fb29736
Binary files /dev/null and b/src/icons/svgs/folder_gulp_open.svg differ
diff --git a/src/icons/svgs/folder_images.svg b/src/icons/svgs/folder_images.svg
new file mode 100644
index 0000000..853f0db
Binary files /dev/null and b/src/icons/svgs/folder_images.svg differ
diff --git a/src/icons/svgs/folder_images_open.svg b/src/icons/svgs/folder_images_open.svg
new file mode 100644
index 0000000..47cf9c7
Binary files /dev/null and b/src/icons/svgs/folder_images_open.svg differ
diff --git a/src/icons/svgs/folder_js.svg b/src/icons/svgs/folder_js.svg
new file mode 100644
index 0000000..1ff69ca
Binary files /dev/null and b/src/icons/svgs/folder_js.svg differ
diff --git a/src/icons/svgs/folder_js_open.svg b/src/icons/svgs/folder_js_open.svg
new file mode 100644
index 0000000..c6c0ae1
Binary files /dev/null and b/src/icons/svgs/folder_js_open.svg differ
diff --git a/src/icons/svgs/folder_light.svg b/src/icons/svgs/folder_light.svg
new file mode 100644
index 0000000..3d25cd3
Binary files /dev/null and b/src/icons/svgs/folder_light.svg differ
diff --git a/src/icons/svgs/folder_light_build.svg b/src/icons/svgs/folder_light_build.svg
new file mode 100644
index 0000000..3bda084
Binary files /dev/null and b/src/icons/svgs/folder_light_build.svg differ
diff --git a/src/icons/svgs/folder_node.svg b/src/icons/svgs/folder_node.svg
new file mode 100644
index 0000000..562dc0e
Binary files /dev/null and b/src/icons/svgs/folder_node.svg differ
diff --git a/src/icons/svgs/folder_node_open.svg b/src/icons/svgs/folder_node_open.svg
new file mode 100644
index 0000000..1711e95
Binary files /dev/null and b/src/icons/svgs/folder_node_open.svg differ
diff --git a/src/icons/svgs/folder_open.svg b/src/icons/svgs/folder_open.svg
new file mode 100644
index 0000000..dc74800
Binary files /dev/null and b/src/icons/svgs/folder_open.svg differ
diff --git a/src/icons/svgs/folder_open_build.svg b/src/icons/svgs/folder_open_build.svg
new file mode 100644
index 0000000..0592cf1
Binary files /dev/null and b/src/icons/svgs/folder_open_build.svg differ
diff --git a/src/icons/svgs/folder_src.svg b/src/icons/svgs/folder_src.svg
new file mode 100644
index 0000000..7b6e45f
Binary files /dev/null and b/src/icons/svgs/folder_src.svg differ
diff --git a/src/icons/svgs/folder_src_open.svg b/src/icons/svgs/folder_src_open.svg
new file mode 100644
index 0000000..4c39f62
Binary files /dev/null and b/src/icons/svgs/folder_src_open.svg differ
diff --git a/src/icons/svgs/folder_test.svg b/src/icons/svgs/folder_test.svg
new file mode 100644
index 0000000..3879d1f
Binary files /dev/null and b/src/icons/svgs/folder_test.svg differ
diff --git a/src/icons/svgs/folder_test_open.svg b/src/icons/svgs/folder_test_open.svg
new file mode 100644
index 0000000..0c5ae44
Binary files /dev/null and b/src/icons/svgs/folder_test_open.svg differ
diff --git a/src/icons/svgs/folder_vscode.svg b/src/icons/svgs/folder_vscode.svg
new file mode 100644
index 0000000..21345e6
Binary files /dev/null and b/src/icons/svgs/folder_vscode.svg differ
diff --git a/src/icons/svgs/folder_vscode_open.svg b/src/icons/svgs/folder_vscode_open.svg
new file mode 100644
index 0000000..d9cecf9
Binary files /dev/null and b/src/icons/svgs/folder_vscode_open.svg differ
diff --git a/src/icons/svgs/font.svg b/src/icons/svgs/font.svg
new file mode 100755
index 0000000..8b42ee3
Binary files /dev/null and b/src/icons/svgs/font.svg differ
diff --git a/src/icons/svgs/fsharp.svg b/src/icons/svgs/fsharp.svg
new file mode 100755
index 0000000..2b5012c
Binary files /dev/null and b/src/icons/svgs/fsharp.svg differ
diff --git a/src/icons/svgs/git.svg b/src/icons/svgs/git.svg
new file mode 100755
index 0000000..5f7beef
Binary files /dev/null and b/src/icons/svgs/git.svg differ
diff --git a/src/icons/svgs/github.svg b/src/icons/svgs/github.svg
new file mode 100644
index 0000000..df1f192
Binary files /dev/null and b/src/icons/svgs/github.svg differ
diff --git a/src/icons/svgs/gitlab.svg b/src/icons/svgs/gitlab.svg
new file mode 100644
index 0000000..04debe0
Binary files /dev/null and b/src/icons/svgs/gitlab.svg differ
diff --git a/src/icons/svgs/go.svg b/src/icons/svgs/go.svg
new file mode 100644
index 0000000..e304a7a
Binary files /dev/null and b/src/icons/svgs/go.svg differ
diff --git a/src/icons/svgs/gopher.svg b/src/icons/svgs/gopher.svg
new file mode 100755
index 0000000..57726ee
Binary files /dev/null and b/src/icons/svgs/gopher.svg differ
diff --git a/src/icons/svgs/gradle.svg b/src/icons/svgs/gradle.svg
new file mode 100755
index 0000000..fa17831
Binary files /dev/null and b/src/icons/svgs/gradle.svg differ
diff --git a/src/icons/svgs/graphql.svg b/src/icons/svgs/graphql.svg
new file mode 100644
index 0000000..3613bf7
Binary files /dev/null and b/src/icons/svgs/graphql.svg differ
diff --git a/src/icons/svgs/groovy.svg b/src/icons/svgs/groovy.svg
new file mode 100755
index 0000000..3a70833
Binary files /dev/null and b/src/icons/svgs/groovy.svg differ
diff --git a/src/icons/svgs/grunt.svg b/src/icons/svgs/grunt.svg
new file mode 100644
index 0000000..832d1b3
Binary files /dev/null and b/src/icons/svgs/grunt.svg differ
diff --git a/src/icons/svgs/gulp.svg b/src/icons/svgs/gulp.svg
new file mode 100755
index 0000000..3952687
Binary files /dev/null and b/src/icons/svgs/gulp.svg differ
diff --git a/src/icons/svgs/haml.svg b/src/icons/svgs/haml.svg
new file mode 100644
index 0000000..4411c7f
Binary files /dev/null and b/src/icons/svgs/haml.svg differ
diff --git a/src/icons/svgs/haskell.svg b/src/icons/svgs/haskell.svg
new file mode 100755
index 0000000..740bc2a
Binary files /dev/null and b/src/icons/svgs/haskell.svg differ
diff --git a/src/icons/svgs/html.svg b/src/icons/svgs/html.svg
new file mode 100755
index 0000000..80ace64
Binary files /dev/null and b/src/icons/svgs/html.svg differ
diff --git a/src/icons/svgs/image.svg b/src/icons/svgs/image.svg
new file mode 100755
index 0000000..1201c04
Binary files /dev/null and b/src/icons/svgs/image.svg differ
diff --git a/src/icons/svgs/ionic.svg b/src/icons/svgs/ionic.svg
new file mode 100755
index 0000000..0432295
Binary files /dev/null and b/src/icons/svgs/ionic.svg differ
diff --git a/src/icons/svgs/java.svg b/src/icons/svgs/java.svg
new file mode 100755
index 0000000..c9f1119
Binary files /dev/null and b/src/icons/svgs/java.svg differ
diff --git a/src/icons/svgs/javascript-map.svg b/src/icons/svgs/javascript-map.svg
new file mode 100755
index 0000000..1bdf3c3
Binary files /dev/null and b/src/icons/svgs/javascript-map.svg differ
diff --git a/src/icons/svgs/js.svg b/src/icons/svgs/js.svg
new file mode 100644
index 0000000..cd5e57d
Binary files /dev/null and b/src/icons/svgs/js.svg differ
diff --git a/src/icons/svgs/json.svg b/src/icons/svgs/json.svg
new file mode 100755
index 0000000..352d2a3
Binary files /dev/null and b/src/icons/svgs/json.svg differ
diff --git a/src/icons/svgs/key.svg b/src/icons/svgs/key.svg
new file mode 100755
index 0000000..4a461d4
Binary files /dev/null and b/src/icons/svgs/key.svg differ
diff --git a/src/icons/svgs/kotlin.svg b/src/icons/svgs/kotlin.svg
new file mode 100755
index 0000000..a1dfd4a
Binary files /dev/null and b/src/icons/svgs/kotlin.svg differ
diff --git a/src/icons/svgs/less.svg b/src/icons/svgs/less.svg
new file mode 100644
index 0000000..13c6e1b
Binary files /dev/null and b/src/icons/svgs/less.svg differ
diff --git a/src/icons/svgs/lib.svg b/src/icons/svgs/lib.svg
new file mode 100755
index 0000000..2615f5f
Binary files /dev/null and b/src/icons/svgs/lib.svg differ
diff --git a/src/icons/svgs/license.svg b/src/icons/svgs/license.svg
new file mode 100644
index 0000000..5d6290c
Binary files /dev/null and b/src/icons/svgs/license.svg differ
diff --git a/src/icons/svgs/lua.svg b/src/icons/svgs/lua.svg
new file mode 100755
index 0000000..4b7794d
Binary files /dev/null and b/src/icons/svgs/lua.svg differ
diff --git a/src/icons/svgs/markdown.svg b/src/icons/svgs/markdown.svg
new file mode 100755
index 0000000..4626f14
Binary files /dev/null and b/src/icons/svgs/markdown.svg differ
diff --git a/src/icons/svgs/markup.svg b/src/icons/svgs/markup.svg
new file mode 100644
index 0000000..3659bc8
Binary files /dev/null and b/src/icons/svgs/markup.svg differ
diff --git a/src/icons/svgs/movie.svg b/src/icons/svgs/movie.svg
new file mode 100755
index 0000000..d8b768d
Binary files /dev/null and b/src/icons/svgs/movie.svg differ
diff --git a/src/icons/svgs/music.svg b/src/icons/svgs/music.svg
new file mode 100755
index 0000000..b98ae22
Binary files /dev/null and b/src/icons/svgs/music.svg differ
diff --git a/src/icons/svgs/mustache.svg b/src/icons/svgs/mustache.svg
new file mode 100644
index 0000000..55610d7
Binary files /dev/null and b/src/icons/svgs/mustache.svg differ
diff --git a/src/icons/svgs/mxml.svg b/src/icons/svgs/mxml.svg
new file mode 100755
index 0000000..d590e1c
Binary files /dev/null and b/src/icons/svgs/mxml.svg differ
diff --git a/src/icons/svgs/node.svg b/src/icons/svgs/node.svg
new file mode 100644
index 0000000..9dbdf66
Binary files /dev/null and b/src/icons/svgs/node.svg differ
diff --git a/src/icons/svgs/nodejs.svg b/src/icons/svgs/nodejs.svg
new file mode 100644
index 0000000..146b1b8
Binary files /dev/null and b/src/icons/svgs/nodejs.svg differ
diff --git a/src/icons/svgs/npm.svg b/src/icons/svgs/npm.svg
new file mode 100644
index 0000000..8c1d8cc
Binary files /dev/null and b/src/icons/svgs/npm.svg differ
diff --git a/src/icons/svgs/ocaml.svg b/src/icons/svgs/ocaml.svg
new file mode 100755
index 0000000..99b0126
Binary files /dev/null and b/src/icons/svgs/ocaml.svg differ
diff --git a/src/icons/svgs/package-lock.svg b/src/icons/svgs/package-lock.svg
new file mode 100644
index 0000000..8bfd7a3
Binary files /dev/null and b/src/icons/svgs/package-lock.svg differ
diff --git a/src/icons/svgs/pdf.svg b/src/icons/svgs/pdf.svg
new file mode 100755
index 0000000..ebc9468
Binary files /dev/null and b/src/icons/svgs/pdf.svg differ
diff --git a/src/icons/svgs/php.svg b/src/icons/svgs/php.svg
new file mode 100755
index 0000000..4b16151
Binary files /dev/null and b/src/icons/svgs/php.svg differ
diff --git a/src/icons/svgs/polymer.svg b/src/icons/svgs/polymer.svg
new file mode 100644
index 0000000..3cc4715
Binary files /dev/null and b/src/icons/svgs/polymer.svg differ
diff --git a/src/icons/svgs/postcss.svg b/src/icons/svgs/postcss.svg
new file mode 100644
index 0000000..a297057
Binary files /dev/null and b/src/icons/svgs/postcss.svg differ
diff --git a/src/icons/svgs/powerpoint.svg b/src/icons/svgs/powerpoint.svg
new file mode 100755
index 0000000..4664dc7
Binary files /dev/null and b/src/icons/svgs/powerpoint.svg differ
diff --git a/src/icons/svgs/pp.svg b/src/icons/svgs/pp.svg
new file mode 100644
index 0000000..dec524a
Binary files /dev/null and b/src/icons/svgs/pp.svg differ
diff --git a/src/icons/svgs/procfile.svg b/src/icons/svgs/procfile.svg
new file mode 100644
index 0000000..f9217f3
Binary files /dev/null and b/src/icons/svgs/procfile.svg differ
diff --git a/src/icons/svgs/pug.svg b/src/icons/svgs/pug.svg
new file mode 100755
index 0000000..3fd8fcb
Binary files /dev/null and b/src/icons/svgs/pug.svg differ
diff --git a/src/icons/svgs/python.svg b/src/icons/svgs/python.svg
new file mode 100755
index 0000000..905529d
Binary files /dev/null and b/src/icons/svgs/python.svg differ
diff --git a/src/icons/svgs/r.svg b/src/icons/svgs/r.svg
new file mode 100755
index 0000000..f7762fa
Binary files /dev/null and b/src/icons/svgs/r.svg differ
diff --git a/src/icons/svgs/rails.svg b/src/icons/svgs/rails.svg
new file mode 100644
index 0000000..4df7199
Binary files /dev/null and b/src/icons/svgs/rails.svg differ
diff --git a/src/icons/svgs/raml.svg b/src/icons/svgs/raml.svg
new file mode 100755
index 0000000..ab0b582
Binary files /dev/null and b/src/icons/svgs/raml.svg differ
diff --git a/src/icons/svgs/react.svg b/src/icons/svgs/react.svg
new file mode 100755
index 0000000..3aaab22
Binary files /dev/null and b/src/icons/svgs/react.svg differ
diff --git a/src/icons/svgs/readme.svg b/src/icons/svgs/readme.svg
new file mode 100755
index 0000000..02237ec
Binary files /dev/null and b/src/icons/svgs/readme.svg differ
diff --git a/src/icons/svgs/reason.svg b/src/icons/svgs/reason.svg
new file mode 100644
index 0000000..8ee0dd7
Binary files /dev/null and b/src/icons/svgs/reason.svg differ
diff --git a/src/icons/svgs/rollup.svg b/src/icons/svgs/rollup.svg
new file mode 100644
index 0000000..2d531c9
Binary files /dev/null and b/src/icons/svgs/rollup.svg differ
diff --git a/src/icons/svgs/ruby.svg b/src/icons/svgs/ruby.svg
new file mode 100755
index 0000000..4cee533
Binary files /dev/null and b/src/icons/svgs/ruby.svg differ
diff --git a/src/icons/svgs/rust.svg b/src/icons/svgs/rust.svg
new file mode 100755
index 0000000..dc142c1
Binary files /dev/null and b/src/icons/svgs/rust.svg differ
diff --git a/src/icons/svgs/sass.svg b/src/icons/svgs/sass.svg
new file mode 100755
index 0000000..9f8b784
Binary files /dev/null and b/src/icons/svgs/sass.svg differ
diff --git a/src/icons/svgs/scala.svg b/src/icons/svgs/scala.svg
new file mode 100644
index 0000000..30da17b
Binary files /dev/null and b/src/icons/svgs/scala.svg differ
diff --git a/src/icons/svgs/settings.svg b/src/icons/svgs/settings.svg
new file mode 100755
index 0000000..aa29584
Binary files /dev/null and b/src/icons/svgs/settings.svg differ
diff --git a/src/icons/svgs/sketch.svg b/src/icons/svgs/sketch.svg
new file mode 100644
index 0000000..514bfab
Binary files /dev/null and b/src/icons/svgs/sketch.svg differ
diff --git a/src/icons/svgs/star.svg b/src/icons/svgs/star.svg
new file mode 100755
index 0000000..42efe7d
Binary files /dev/null and b/src/icons/svgs/star.svg differ
diff --git a/src/icons/svgs/stylelint.svg b/src/icons/svgs/stylelint.svg
new file mode 100644
index 0000000..5826e33
Binary files /dev/null and b/src/icons/svgs/stylelint.svg differ
diff --git a/src/icons/svgs/stylus.svg b/src/icons/svgs/stylus.svg
new file mode 100644
index 0000000..67576fc
Binary files /dev/null and b/src/icons/svgs/stylus.svg differ
diff --git a/src/icons/svgs/sublime.svg b/src/icons/svgs/sublime.svg
new file mode 100644
index 0000000..3a0a78c
Binary files /dev/null and b/src/icons/svgs/sublime.svg differ
diff --git a/src/icons/svgs/svg.svg b/src/icons/svgs/svg.svg
new file mode 100644
index 0000000..86670ef
Binary files /dev/null and b/src/icons/svgs/svg.svg differ
diff --git a/src/icons/svgs/swc.svg b/src/icons/svgs/swc.svg
new file mode 100755
index 0000000..1a8f76f
Binary files /dev/null and b/src/icons/svgs/swc.svg differ
diff --git a/src/icons/svgs/swift.svg b/src/icons/svgs/swift.svg
new file mode 100755
index 0000000..b806584
Binary files /dev/null and b/src/icons/svgs/swift.svg differ
diff --git a/src/icons/svgs/swig.svg b/src/icons/svgs/swig.svg
new file mode 100644
index 0000000..fd80d42
Binary files /dev/null and b/src/icons/svgs/swig.svg differ
diff --git a/src/icons/svgs/table.svg b/src/icons/svgs/table.svg
new file mode 100755
index 0000000..45af79d
Binary files /dev/null and b/src/icons/svgs/table.svg differ
diff --git a/src/icons/svgs/tex.svg b/src/icons/svgs/tex.svg
new file mode 100755
index 0000000..5c59000
Binary files /dev/null and b/src/icons/svgs/tex.svg differ
diff --git a/src/icons/svgs/todo.svg b/src/icons/svgs/todo.svg
new file mode 100644
index 0000000..fff1c95
Binary files /dev/null and b/src/icons/svgs/todo.svg differ
diff --git a/src/icons/svgs/tune.svg b/src/icons/svgs/tune.svg
new file mode 100755
index 0000000..602cb9f
Binary files /dev/null and b/src/icons/svgs/tune.svg differ
diff --git a/src/icons/svgs/twig.svg b/src/icons/svgs/twig.svg
new file mode 100644
index 0000000..eda1e46
Binary files /dev/null and b/src/icons/svgs/twig.svg differ
diff --git a/src/icons/svgs/typescript.svg b/src/icons/svgs/typescript.svg
new file mode 100755
index 0000000..1b4b2b3
Binary files /dev/null and b/src/icons/svgs/typescript.svg differ
diff --git a/src/icons/svgs/typescript_def.svg b/src/icons/svgs/typescript_def.svg
new file mode 100755
index 0000000..4b1563a
Binary files /dev/null and b/src/icons/svgs/typescript_def.svg differ
diff --git a/src/icons/svgs/url.svg b/src/icons/svgs/url.svg
new file mode 100755
index 0000000..31c2140
Binary files /dev/null and b/src/icons/svgs/url.svg differ
diff --git a/src/icons/svgs/virtual.svg b/src/icons/svgs/virtual.svg
new file mode 100755
index 0000000..2afc3d1
Binary files /dev/null and b/src/icons/svgs/virtual.svg differ
diff --git a/src/icons/svgs/visualstudio.svg b/src/icons/svgs/visualstudio.svg
new file mode 100755
index 0000000..7b7e27b
Binary files /dev/null and b/src/icons/svgs/visualstudio.svg differ
diff --git a/src/icons/svgs/vue.svg b/src/icons/svgs/vue.svg
new file mode 100755
index 0000000..5193e2b
Binary files /dev/null and b/src/icons/svgs/vue.svg differ
diff --git a/src/icons/svgs/webpack.svg b/src/icons/svgs/webpack.svg
new file mode 100755
index 0000000..b9ac701
Binary files /dev/null and b/src/icons/svgs/webpack.svg differ
diff --git a/src/icons/svgs/word.svg b/src/icons/svgs/word.svg
new file mode 100755
index 0000000..808de75
Binary files /dev/null and b/src/icons/svgs/word.svg differ
diff --git a/src/icons/svgs/xaml.svg b/src/icons/svgs/xaml.svg
new file mode 100755
index 0000000..ed0106c
Binary files /dev/null and b/src/icons/svgs/xaml.svg differ
diff --git a/src/icons/svgs/xml.svg b/src/icons/svgs/xml.svg
new file mode 100755
index 0000000..1fac1d6
Binary files /dev/null and b/src/icons/svgs/xml.svg differ
diff --git a/src/icons/svgs/yaml.svg b/src/icons/svgs/yaml.svg
new file mode 100755
index 0000000..5d9e937
Binary files /dev/null and b/src/icons/svgs/yaml.svg differ
diff --git a/src/icons/svgs/yarn-lock.svg b/src/icons/svgs/yarn-lock.svg
new file mode 100644
index 0000000..006e1e3
Binary files /dev/null and b/src/icons/svgs/yarn-lock.svg differ
diff --git a/src/icons/svgs/yarn.svg b/src/icons/svgs/yarn.svg
new file mode 100755
index 0000000..df707b2
Binary files /dev/null and b/src/icons/svgs/yarn.svg differ
diff --git a/src/icons/svgs/zephyr.svg b/src/icons/svgs/zephyr.svg
new file mode 100644
index 0000000..8d44f3c
Binary files /dev/null and b/src/icons/svgs/zephyr.svg differ
diff --git a/src/icons/svgs/zip.svg b/src/icons/svgs/zip.svg
new file mode 100755
index 0000000..ad5b058
Binary files /dev/null and b/src/icons/svgs/zip.svg differ
diff --git a/src/themes/settings/specific/darker-hc.json b/src/themes/settings/specific/darker-hc.json
new file mode 100644
index 0000000..9ea9feb
Binary files /dev/null and b/src/themes/settings/specific/darker-hc.json differ
diff --git a/src/themes/settings/specific/darker.json b/src/themes/settings/specific/darker.json
new file mode 100644
index 0000000..6c8f87c
Binary files /dev/null and b/src/themes/settings/specific/darker.json differ
diff --git a/src/themes/settings/specific/default-hc.json b/src/themes/settings/specific/default-hc.json
new file mode 100644
index 0000000..ca45046
Binary files /dev/null and b/src/themes/settings/specific/default-hc.json differ
diff --git a/src/themes/settings/specific/default.json b/src/themes/settings/specific/default.json
new file mode 100644
index 0000000..c315e17
Binary files /dev/null and b/src/themes/settings/specific/default.json differ
diff --git a/src/themes/settings/specific/lighter-hc.json b/src/themes/settings/specific/lighter-hc.json
new file mode 100644
index 0000000..b961d48
Binary files /dev/null and b/src/themes/settings/specific/lighter-hc.json differ
diff --git a/src/themes/settings/specific/lighter.json b/src/themes/settings/specific/lighter.json
new file mode 100644
index 0000000..c6f1324
Binary files /dev/null and b/src/themes/settings/specific/lighter.json differ
diff --git a/src/themes/settings/specific/palenight-hc.json b/src/themes/settings/specific/palenight-hc.json
new file mode 100644
index 0000000..f5b1650
Binary files /dev/null and b/src/themes/settings/specific/palenight-hc.json differ
diff --git a/src/themes/settings/specific/palenight.json b/src/themes/settings/specific/palenight.json
new file mode 100644
index 0000000..2398280
Binary files /dev/null and b/src/themes/settings/specific/palenight.json differ
diff --git a/src/themes/theme-template-color-theme.json b/src/themes/theme-template-color-theme.json
new file mode 100644
index 0000000..ec044da
Binary files /dev/null and b/src/themes/theme-template-color-theme.json differ
diff --git a/test/--.tmcolor b/test/--.tmcolor
new file mode 100644
index 0000000..885b2b2
--- /dev/null
+++ b/test/--.tmcolor
@@ -0,0 +1,79 @@
+comment — for comments.
+comment.line — line comments, we specialize further so that the type of comment start character(s) can be extracted from the scope.
+comment.line.double-slash — // comment
+comment.line.double-dash — -- comment
+comment.line.number-sign — # comment
+comment.line.percentage — % comment
+comment.line.character — other types of line comments.
+comment.block — multi-line comments like /* … */ and .
+comment.block.documentation — embedded documentation.
+
+constant — various forms of constants.
+constant.numeric — those which represent numbers, e.g. 42, 1.3f, 0x4AB1U.
+constant.character — those which represent characters, e.g. <, \e, \031.
+constant.escape — escape sequences like \e would be constant.character.escape.
+constant.language — constants (generally) provided by the language which are “special” like true, false, nil, YES, NO, etc.
+constant.other — other constants, e.g. colors in CSS.
+
+entity — an entity refers to a larger part of the document, for example a chapter, class, function, or tag. We do not scope the entire entity as entity.* (we use meta.* for that). But we do use entity.* for the “placeholders” in the larger entity, e.g. if the entity is a chapter, we would use entity.name.section for the chapter title.
+entity.name — we are naming the larger entity.
+entity.name.function — the name of a function.
+entity.name.type — the name of a type declaration or class.
+entity.name.tag — a tag name.
+entity.name.section — the name is the name of a section/heading.
+entity.other — other entities.
+entity.other.inherited-class — the superclass/baseclass name.
+entity.other.attribute-name — the name of an attribute (mainly in tags).
+
+invalid — stuff which is “invalid”.
+invalid.illegal — illegal, e.g. an ampersand or lower-than character in HTML (which is not part of an entity/tag).
+invalid.deprecated — for deprecated stuff e.g. using an API function which is deprecated or using styling with strict HTML.
+
+keyword — keywords (when these do not fall into the other groups).
+keyword.control — mainly related to flow control like continue, while, return, etc.
+keyword.operator — operators can either be textual (e.g. or) or be characters.
+keyword.other — other keywords.
+
+markup — this is for markup languages and generally applies to larger subsets of the text.
+markup.underline — underlined text.
+markup.underline.link — this is for links, as a convenience this is derived from markup.underline so that if there is no theme rule which specifically targets markup.underline.link then it will inherit the underline style.
+markup.bold — bold text (text which is strong and similar should preferably be derived from this name).
+markup.heading — a section header. Optionally provide the heading level as the next element, for example markup.heading.2.html for …
in HTML.
+markup.italic — italic text (text which is emphasized and similar should preferably be derived from this name).
+markup.list — list items.
+markup.list.numbered — numbered list items.
+markup.list.unnumbered — unnumbered list items.
+markup.quote — quoted (sometimes block quoted) text.
+markup.raw — text which is verbatim, e.g. code listings. Normally spell checking is disabled for markup.raw.
+markup.inline.raw
+markup.other — other markup constructs.
+
+meta - the meta scope is generally used to markup larger parts of the document. For example the entire line which declares a function would be meta.function and the subsets would be storage.type, entity.name.function, variable.parameter etc. and only the latter would be styled. Sometimes the meta part of the scope will be used only to limit the more general element that is styled, most of the time meta scopes are however used in scope selectors for activation of bundle items. For example in Objective-C there is a meta scope for the interface declaration of a class and the implementation, allowing the same tab-triggers to expand differently, depending on context.
+
+storage — things relating to “storage”.
+storage.type — the type of something, class, function, int, var, etc.
+storage.modifier — a storage modifier like static, final, abstract, etc.
+
+string — strings.
+string.quoted — quoted strings.
+string.quoted.single — single quoted strings: 'foo'.
+string.quoted.double — double quoted strings: "foo".
+string.quoted.triple — triple quoted strings: """Python""".
+string.quoted.other — other types of quoting: $'shell', %s{...}.
+string.unquoted — for things like here-docs and here-strings.
+string.interpolated — strings which are “evaluated”: `date`, $(pwd).
+string.regexp — regular expressions: /(\w+)/.
+string.other — other types of strings (should rarely be used).
+
+support — things provided by a framework or library should be below support.
+support.function — functions provided by the framework/library. For example NSLog in Objective-C is support.function.
+support.class — when the framework/library provides classes.
+support.type — types provided by the framework/library, this is probably only used for languages derived from C, which has typedef (and struct). Most other languages would introduce new types as classes.
+support.constant — constants (magic values) provided by the framework/library.
+support.variable — variables provided by the framework/library. For example NSApp in AppKit.
+support.other — the above should be exhaustive, but for everything else use support.other.
+
+variable — variables. Not all languages allow easy identification (and thus markup) of these.
+variable.parameter — when the variable is declared as the parameter.
+variable.language — reserved language variables like this, super, self, etc.
+variable.other — other variables, like $some_variables.
diff --git a/test/.gitignore b/test/.gitignore
new file mode 100755
index 0000000..e69de29
diff --git a/test/COMMIT_EDITMSG b/test/COMMIT_EDITMSG
new file mode 100644
index 0000000..e69de29
diff --git a/test/Dockerfile b/test/Dockerfile
new file mode 100644
index 0000000..e69de29
diff --git a/test/LICENSE b/test/LICENSE
new file mode 100644
index 0000000..e69de29
diff --git a/test/Procfile b/test/Procfile
new file mode 100644
index 0000000..e69de29
diff --git a/test/TODO b/test/TODO
new file mode 100644
index 0000000..e69de29
diff --git a/test/adobe.ai b/test/adobe.ai
new file mode 100644
index 0000000..e69de29
diff --git a/test/adobe.as b/test/adobe.as
new file mode 100644
index 0000000..e69de29
diff --git a/test/adobe.cfc b/test/adobe.cfc
new file mode 100644
index 0000000..e69de29
diff --git a/test/adobe.cfm b/test/adobe.cfm
new file mode 100644
index 0000000..e69de29
diff --git a/test/adobe.pdf b/test/adobe.pdf
new file mode 100644
index 0000000..e69de29
diff --git a/test/adobe.psb b/test/adobe.psb
new file mode 100644
index 0000000..e69de29
diff --git a/test/adobe.psd b/test/adobe.psd
new file mode 100644
index 0000000..e69de29
diff --git a/test/angular.ng.html b/test/angular.ng.html
new file mode 100644
index 0000000..e69de29
diff --git a/test/archive.7z b/test/archive.7z
new file mode 100644
index 0000000..e69de29
diff --git a/test/archive.7zip b/test/archive.7zip
new file mode 100644
index 0000000..e69de29
diff --git a/test/archive.gz b/test/archive.gz
new file mode 100644
index 0000000..e69de29
diff --git a/test/archive.pzip b/test/archive.pzip
new file mode 100644
index 0000000..e69de29
diff --git a/test/archive.rar b/test/archive.rar
new file mode 100644
index 0000000..e69de29
diff --git a/test/archive.tar b/test/archive.tar
new file mode 100644
index 0000000..e69de29
diff --git a/test/archive.tgz b/test/archive.tgz
new file mode 100644
index 0000000..e69de29
diff --git a/test/archive.wim b/test/archive.wim
new file mode 100644
index 0000000..e69de29
diff --git a/test/archive.zip b/test/archive.zip
new file mode 100644
index 0000000..e69de29
diff --git a/test/binary.tga b/test/binary.tga
new file mode 100644
index 0000000..e69de29
diff --git a/test/bower.json b/test/bower.json
new file mode 100644
index 0000000..e69de29
diff --git a/test/conf b/test/conf
new file mode 100644
index 0000000..e69de29
diff --git a/test/default b/test/default
new file mode 100644
index 0000000..e69de29
diff --git a/test/font.eot b/test/font.eot
new file mode 100644
index 0000000..e69de29
diff --git a/test/font.otf b/test/font.otf
new file mode 100644
index 0000000..e69de29
diff --git a/test/font.ttf b/test/font.ttf
new file mode 100644
index 0000000..e69de29
diff --git a/test/font.woff b/test/font.woff
new file mode 100644
index 0000000..e69de29
diff --git a/test/git-blame b/test/git-blame
new file mode 100644
index 0000000..e69de29
diff --git a/test/git-rebase-todo b/test/git-rebase-todo
new file mode 100644
index 0000000..e69de29
diff --git a/test/image.jpg b/test/image.jpg
new file mode 100644
index 0000000..e69de29
diff --git a/test/image.svg b/test/image.svg
new file mode 100644
index 0000000..e69de29
diff --git a/test/package-lock.json b/test/package-lock.json
new file mode 100644
index 0000000..e69de29
diff --git a/test/package.json b/test/package.json
new file mode 100644
index 0000000..e69de29
diff --git a/test/settings.ini b/test/settings.ini
new file mode 100644
index 0000000..e69de29
diff --git a/test/shell.bash b/test/shell.bash
new file mode 100644
index 0000000..957abd2
--- /dev/null
+++ b/test/shell.bash
@@ -0,0 +1,2 @@
+#!/bin/bash
+echo "$RANDOM" # Supported in bash. No warnings.
diff --git a/test/shell.fish b/test/shell.fish
new file mode 100644
index 0000000..e69de29
diff --git a/test/shell.sh b/test/shell.sh
new file mode 100644
index 0000000..b3d23a0
--- /dev/null
+++ b/test/shell.sh
@@ -0,0 +1,2 @@
+#!/bin/sh
+echo "$RANDOM" # Unsupported in sh. Produces warning.
diff --git a/test/sketch.sketch b/test/sketch.sketch
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.applescript b/test/source.applescript
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.asa b/test/source.asa
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.ascx b/test/source.ascx
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.asp b/test/source.asp
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.aspx b/test/source.aspx
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.blade b/test/source.blade
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.blade.php b/test/source.blade.php
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.c b/test/source.c
new file mode 100644
index 0000000..f0094b3
--- /dev/null
+++ b/test/source.c
@@ -0,0 +1,1573 @@
+#include "ccv.h"
+#include "ccv_internal.h"
+#include
+#ifdef HAVE_GSL
+#include
+#include
+#endif
+#ifdef USE_OPENMP
+#include
+#endif
+
+const ccv_bbf_param_t ccv_bbf_default_params = {
+ .interval = 5,
+ .min_neighbors = 2,
+ .accurate = 1,
+ .flags = 0,
+ .size = {
+ 24,
+ 24,
+ },
+};
+
+#define _ccv_width_padding(x) (((x) + 3) & -4)
+
+static inline int _ccv_run_bbf_feature(ccv_bbf_feature_t *feature, int *step, unsigned char **u8)
+{
+#define pf_at(i) (*(u8[feature->pz[i]] + feature->px[i] + feature->py[i] * step[feature->pz[i]]))
+#define nf_at(i) (*(u8[feature->nz[i]] + feature->nx[i] + feature->ny[i] * step[feature->nz[i]]))
+ unsigned char pmin = pf_at(0), nmax = nf_at(0);
+ /* check if every point in P > every point in N, and take a shortcut */
+ if (pmin <= nmax)
+ return 0;
+ int i;
+ for (i = 1; i < feature->size; i++)
+ {
+ if (feature->pz[i] >= 0)
+ {
+ int p = pf_at(i);
+ if (p < pmin)
+ {
+ if (p <= nmax)
+ return 0;
+ pmin = p;
+ }
+ }
+ if (feature->nz[i] >= 0)
+ {
+ int n = nf_at(i);
+ if (n > nmax)
+ {
+ if (pmin <= n)
+ return 0;
+ nmax = n;
+ }
+ }
+ }
+#undef pf_at
+#undef nf_at
+ return 1;
+}
+
+static int _ccv_read_bbf_stage_classifier(const char *file, ccv_bbf_stage_classifier_t *classifier)
+{
+ FILE *r = fopen(file, "r");
+ if (r == 0)
+ return -1;
+ int stat = 0;
+ stat |= fscanf(r, "%d", &classifier->count);
+ union {
+ float fl;
+ int i;
+ } fli;
+ stat |= fscanf(r, "%d", &fli.i);
+ classifier->threshold = fli.fl;
+ classifier->feature = (ccv_bbf_feature_t *)ccmalloc(classifier->count * sizeof(ccv_bbf_feature_t));
+ classifier->alpha = (float *)ccmalloc(classifier->count * 2 * sizeof(float));
+ int i, j;
+ for (i = 0; i < classifier->count; i++)
+ {
+ stat |= fscanf(r, "%d", &classifier->feature[i].size);
+ for (j = 0; j < classifier->feature[i].size; j++)
+ {
+ stat |= fscanf(r, "%d %d %d", &classifier->feature[i].px[j], &classifier->feature[i].py[j], &classifier->feature[i].pz[j]);
+ stat |= fscanf(r, "%d %d %d", &classifier->feature[i].nx[j], &classifier->feature[i].ny[j], &classifier->feature[i].nz[j]);
+ }
+ union {
+ float fl;
+ int i;
+ } flia, flib;
+ stat |= fscanf(r, "%d %d", &flia.i, &flib.i);
+ classifier->alpha[i * 2] = flia.fl;
+ classifier->alpha[i * 2 + 1] = flib.fl;
+ }
+ fclose(r);
+ return 0;
+}
+
+#ifdef HAVE_GSL
+
+static unsigned int _ccv_bbf_time_measure()
+{
+ struct timeval tv;
+ gettimeofday(&tv, 0);
+ return tv.tv_sec * 1000000 + tv.tv_usec;
+}
+
+#define less_than(a, b, aux) ((a) < (b))
+CCV_IMPLEMENT_QSORT(_ccv_sort_32f, float, less_than)
+#undef less_than
+
+static void _ccv_bbf_eval_data(ccv_bbf_stage_classifier_t *classifier, unsigned char **posdata, int posnum, unsigned char **negdata, int negnum, ccv_size_t size, float *peval, float *neval)
+{
+ int i, j;
+ int steps[] = {_ccv_width_padding(size.width),
+ _ccv_width_padding(size.width >> 1),
+ _ccv_width_padding(size.width >> 2)};
+ int isizs0 = steps[0] * size.height;
+ int isizs01 = isizs0 + steps[1] * (size.height >> 1);
+ for (i = 0; i < posnum; i++)
+ {
+ unsigned char *u8[] = {posdata[i], posdata[i] + isizs0, posdata[i] + isizs01};
+ float sum = 0;
+ float *alpha = classifier->alpha;
+ ccv_bbf_feature_t *feature = classifier->feature;
+ for (j = 0; j < classifier->count; ++j, alpha += 2, ++feature)
+ sum += alpha[_ccv_run_bbf_feature(feature, steps, u8)];
+ peval[i] = sum;
+ }
+ for (i = 0; i < negnum; i++)
+ {
+ unsigned char *u8[] = {negdata[i], negdata[i] + isizs0, negdata[i] + isizs01};
+ float sum = 0;
+ float *alpha = classifier->alpha;
+ ccv_bbf_feature_t *feature = classifier->feature;
+ for (j = 0; j < classifier->count; ++j, alpha += 2, ++feature)
+ sum += alpha[_ccv_run_bbf_feature(feature, steps, u8)];
+ neval[i] = sum;
+ }
+}
+
+static int _ccv_prune_positive_data(ccv_bbf_classifier_cascade_t *cascade, unsigned char **posdata, int posnum, ccv_size_t size)
+{
+ float *peval = (float *)ccmalloc(posnum * sizeof(float));
+ int i, j, k, rpos = posnum;
+ for (i = 0; i < cascade->count; i++)
+ {
+ _ccv_bbf_eval_data(cascade->stage_classifier + i, posdata, rpos, 0, 0, size, peval, 0);
+ k = 0;
+ for (j = 0; j < rpos; j++)
+ if (peval[j] >= cascade->stage_classifier[i].threshold)
+ {
+ posdata[k] = posdata[j];
+ ++k;
+ }
+ else
+ {
+ ccfree(posdata[j]);
+ }
+ rpos = k;
+ }
+ ccfree(peval);
+ return rpos;
+}
+
+static int _ccv_prepare_background_data(ccv_bbf_classifier_cascade_t *cascade, char **bgfiles, int bgnum, unsigned char **negdata, int negnum)
+{
+ int t, i, j, k, q;
+ int negperbg;
+ int negtotal = 0;
+ int steps[] = {_ccv_width_padding(cascade->size.width),
+ _ccv_width_padding(cascade->size.width >> 1),
+ _ccv_width_padding(cascade->size.width >> 2)};
+ int isizs0 = steps[0] * cascade->size.height;
+ int isizs1 = steps[1] * (cascade->size.height >> 1);
+ int isizs2 = steps[2] * (cascade->size.height >> 2);
+ int *idcheck = (int *)ccmalloc(negnum * sizeof(int));
+
+ gsl_rng_env_setup();
+
+ gsl_rng *rng = gsl_rng_alloc(gsl_rng_default);
+ gsl_rng_set(rng, (unsigned long int)idcheck);
+
+ ccv_size_t imgsz = cascade->size;
+ int rneg = negtotal;
+ for (t = 0; negtotal < negnum; t++)
+ {
+ PRINT(CCV_CLI_INFO, "preparing negative data ... 0%%");
+ for (i = 0; i < bgnum; i++)
+ {
+ negperbg = (t < 2) ? (negnum - negtotal) / (bgnum - i) + 1 : negnum - negtotal;
+ ccv_dense_matrix_t *image = 0;
+ ccv_read(bgfiles[i], &image, CCV_IO_GRAY | CCV_IO_ANY_FILE);
+ assert((image->type & CCV_C1) && (image->type & CCV_8U));
+ if (image == 0)
+ {
+ PRINT(CCV_CLI_ERROR, "\n%s file corrupted\n", bgfiles[i]);
+ continue;
+ }
+ if (t % 2 != 0)
+ ccv_flip(image, 0, 0, CCV_FLIP_X);
+ if (t % 4 >= 2)
+ ccv_flip(image, 0, 0, CCV_FLIP_Y);
+ ccv_bbf_param_t params = {.interval = 3, .min_neighbors = 0, .accurate = 1, .flags = 0, .size = cascade->size};
+ ccv_array_t *detected = ccv_bbf_detect_objects(image, &cascade, 1, params);
+ memset(idcheck, 0, ccv_min(detected->rnum, negperbg) * sizeof(int));
+ for (j = 0; j < ccv_min(detected->rnum, negperbg); j++)
+ {
+ int r = gsl_rng_uniform_int(rng, detected->rnum);
+ int flag = 1;
+ ccv_rect_t *rect = (ccv_rect_t *)ccv_array_get(detected, r);
+ while (flag)
+ {
+ flag = 0;
+ for (k = 0; k < j; k++)
+ if (r == idcheck[k])
+ {
+ flag = 1;
+ r = gsl_rng_uniform_int(rng, detected->rnum);
+ break;
+ }
+ rect = (ccv_rect_t *)ccv_array_get(detected, r);
+ if ((rect->x < 0) || (rect->y < 0) || (rect->width + rect->x > image->cols) || (rect->height + rect->y > image->rows))
+ {
+ flag = 1;
+ r = gsl_rng_uniform_int(rng, detected->rnum);
+ }
+ }
+ idcheck[j] = r;
+ ccv_dense_matrix_t *temp = 0;
+ ccv_dense_matrix_t *imgs0 = 0;
+ ccv_dense_matrix_t *imgs1 = 0;
+ ccv_dense_matrix_t *imgs2 = 0;
+ ccv_slice(image, (ccv_matrix_t **)&temp, 0, rect->y, rect->x, rect->height, rect->width);
+ ccv_resample(temp, &imgs0, 0, imgsz.height, imgsz.width, CCV_INTER_AREA);
+ assert(imgs0->step == steps[0]);
+ ccv_matrix_free(temp);
+ ccv_sample_down(imgs0, &imgs1, 0, 0, 0);
+ assert(imgs1->step == steps[1]);
+ ccv_sample_down(imgs1, &imgs2, 0, 0, 0);
+ assert(imgs2->step == steps[2]);
+
+ negdata[negtotal] = (unsigned char *)ccmalloc(isizs0 + isizs1 + isizs2);
+ unsigned char *u8s0 = negdata[negtotal];
+ unsigned char *u8s1 = negdata[negtotal] + isizs0;
+ unsigned char *u8s2 = negdata[negtotal] + isizs0 + isizs1;
+ unsigned char *u8[] = {u8s0, u8s1, u8s2};
+ memcpy(u8s0, imgs0->data.u8, imgs0->rows * imgs0->step);
+ ccv_matrix_free(imgs0);
+ memcpy(u8s1, imgs1->data.u8, imgs1->rows * imgs1->step);
+ ccv_matrix_free(imgs1);
+ memcpy(u8s2, imgs2->data.u8, imgs2->rows * imgs2->step);
+ ccv_matrix_free(imgs2);
+
+ flag = 1;
+ ccv_bbf_stage_classifier_t *classifier = cascade->stage_classifier;
+ for (k = 0; k < cascade->count; ++k, ++classifier)
+ {
+ float sum = 0;
+ float *alpha = classifier->alpha;
+ ccv_bbf_feature_t *feature = classifier->feature;
+ for (q = 0; q < classifier->count; ++q, alpha += 2, ++feature)
+ sum += alpha[_ccv_run_bbf_feature(feature, steps, u8)];
+ if (sum < classifier->threshold)
+ {
+ flag = 0;
+ break;
+ }
+ }
+ if (!flag)
+ ccfree(negdata[negtotal]);
+ else
+ {
+ ++negtotal;
+ if (negtotal >= negnum)
+ break;
+ }
+ }
+ ccv_array_free(detected);
+ ccv_matrix_free(image);
+ ccv_drain_cache();
+ PRINT(CCV_CLI_INFO, "\rpreparing negative data ... %2d%%", 100 * negtotal / negnum);
+ fflush(0);
+ if (negtotal >= negnum)
+ break;
+ }
+ if (rneg == negtotal)
+ break;
+ rneg = negtotal;
+ PRINT(CCV_CLI_INFO, "\nentering additional round %d\n", t + 1);
+ }
+ gsl_rng_free(rng);
+ ccfree(idcheck);
+ ccv_drain_cache();
+ PRINT(CCV_CLI_INFO, "\n");
+ return negtotal;
+}
+
+static void _ccv_prepare_positive_data(ccv_dense_matrix_t **posimg, unsigned char **posdata, ccv_size_t size, int posnum)
+{
+ PRINT(CCV_CLI_INFO, "preparing positive data ... 0%%");
+ int i;
+ for (i = 0; i < posnum; i++)
+ {
+ ccv_dense_matrix_t *imgs0 = posimg[i];
+ ccv_dense_matrix_t *imgs1 = 0;
+ ccv_dense_matrix_t *imgs2 = 0;
+ assert((imgs0->type & CCV_C1) && (imgs0->type & CCV_8U) && imgs0->rows == size.height && imgs0->cols == size.width);
+ ccv_sample_down(imgs0, &imgs1, 0, 0, 0);
+ ccv_sample_down(imgs1, &imgs2, 0, 0, 0);
+ int isizs0 = imgs0->rows * imgs0->step;
+ int isizs1 = imgs1->rows * imgs1->step;
+ int isizs2 = imgs2->rows * imgs2->step;
+
+ posdata[i] = (unsigned char *)ccmalloc(isizs0 + isizs1 + isizs2);
+ memcpy(posdata[i], imgs0->data.u8, isizs0);
+ memcpy(posdata[i] + isizs0, imgs1->data.u8, isizs1);
+ memcpy(posdata[i] + isizs0 + isizs1, imgs2->data.u8, isizs2);
+
+ PRINT(CCV_CLI_INFO, "\rpreparing positive data ... %2d%%", 100 * (i + 1) / posnum);
+ fflush(0);
+
+ ccv_matrix_free(imgs1);
+ ccv_matrix_free(imgs2);
+ }
+ ccv_drain_cache();
+ PRINT(CCV_CLI_INFO, "\n");
+}
+
+typedef struct
+{
+ double fitness;
+ int pk, nk;
+ int age;
+ double error;
+ ccv_bbf_feature_t feature;
+} ccv_bbf_gene_t;
+
+static inline void _ccv_bbf_genetic_fitness(ccv_bbf_gene_t *gene)
+{
+ gene->fitness = (1 - gene->error) * exp(-0.01 * gene->age) * exp((gene->pk + gene->nk) * log(1.015));
+}
+
+static inline int _ccv_bbf_exist_gene_feature(ccv_bbf_gene_t *gene, int x, int y, int z)
+{
+ int i;
+ for (i = 0; i < gene->pk; i++)
+ if (z == gene->feature.pz[i] && x == gene->feature.px[i] && y == gene->feature.py[i])
+ return 1;
+ for (i = 0; i < gene->nk; i++)
+ if (z == gene->feature.nz[i] && x == gene->feature.nx[i] && y == gene->feature.ny[i])
+ return 1;
+ return 0;
+}
+
+static inline void _ccv_bbf_randomize_gene(gsl_rng *rng, ccv_bbf_gene_t *gene, int *rows, int *cols)
+{
+ int i;
+ do
+ {
+ gene->pk = gsl_rng_uniform_int(rng, CCV_BBF_POINT_MAX - 1) + 1;
+ gene->nk = gsl_rng_uniform_int(rng, CCV_BBF_POINT_MAX - 1) + 1;
+ } while (gene->pk + gene->nk < CCV_BBF_POINT_MIN); /* a hard restriction of at least 3 points have to be examed */
+ gene->feature.size = ccv_max(gene->pk, gene->nk);
+ gene->age = 0;
+ for (i = 0; i < CCV_BBF_POINT_MAX; i++)
+ {
+ gene->feature.pz[i] = -1;
+ gene->feature.nz[i] = -1;
+ }
+ int x, y, z;
+ for (i = 0; i < gene->pk; i++)
+ {
+ do
+ {
+ z = gsl_rng_uniform_int(rng, 3);
+ x = gsl_rng_uniform_int(rng, cols[z]);
+ y = gsl_rng_uniform_int(rng, rows[z]);
+ } while (_ccv_bbf_exist_gene_feature(gene, x, y, z));
+ gene->feature.pz[i] = z;
+ gene->feature.px[i] = x;
+ gene->feature.py[i] = y;
+ }
+ for (i = 0; i < gene->nk; i++)
+ {
+ do
+ {
+ z = gsl_rng_uniform_int(rng, 3);
+ x = gsl_rng_uniform_int(rng, cols[z]);
+ y = gsl_rng_uniform_int(rng, rows[z]);
+ } while (_ccv_bbf_exist_gene_feature(gene, x, y, z));
+ gene->feature.nz[i] = z;
+ gene->feature.nx[i] = x;
+ gene->feature.ny[i] = y;
+ }
+}
+
+static inline double _ccv_bbf_error_rate(ccv_bbf_feature_t *feature, unsigned char **posdata, int posnum, unsigned char **negdata, int negnum, ccv_size_t size, double *pw, double *nw)
+{
+ int i;
+ int steps[] = {_ccv_width_padding(size.width),
+ _ccv_width_padding(size.width >> 1),
+ _ccv_width_padding(size.width >> 2)};
+ int isizs0 = steps[0] * size.height;
+ int isizs01 = isizs0 + steps[1] * (size.height >> 1);
+ double error = 0;
+ for (i = 0; i < posnum; i++)
+ {
+ unsigned char *u8[] = {posdata[i], posdata[i] + isizs0, posdata[i] + isizs01};
+ if (!_ccv_run_bbf_feature(feature, steps, u8))
+ error += pw[i];
+ }
+ for (i = 0; i < negnum; i++)
+ {
+ unsigned char *u8[] = {negdata[i], negdata[i] + isizs0, negdata[i] + isizs01};
+ if (_ccv_run_bbf_feature(feature, steps, u8))
+ error += nw[i];
+ }
+ return error;
+}
+
+#define less_than(fit1, fit2, aux) ((fit1).fitness >= (fit2).fitness)
+static CCV_IMPLEMENT_QSORT(_ccv_bbf_genetic_qsort, ccv_bbf_gene_t, less_than)
+#undef less_than
+
+ static ccv_bbf_feature_t _ccv_bbf_genetic_optimize(unsigned char **posdata, int posnum, unsigned char **negdata, int negnum, int ftnum, ccv_size_t size, double *pw, double *nw)
+{
+ ccv_bbf_feature_t best;
+ /* seed (random method) */
+ gsl_rng_env_setup();
+ gsl_rng *rng = gsl_rng_alloc(gsl_rng_default);
+ union {
+ unsigned long int li;
+ double db;
+ } dbli;
+ dbli.db = pw[0] + nw[0];
+ gsl_rng_set(rng, dbli.li);
+ int i, j;
+ int pnum = ftnum * 100;
+ assert(pnum > 0);
+ ccv_bbf_gene_t *gene = (ccv_bbf_gene_t *)ccmalloc(pnum * sizeof(ccv_bbf_gene_t));
+ int rows[] = {size.height, size.height >> 1, size.height >> 2};
+ int cols[] = {size.width, size.width >> 1, size.width >> 2};
+ for (i = 0; i < pnum; i++)
+ _ccv_bbf_randomize_gene(rng, &gene[i], rows, cols);
+ unsigned int timer = _ccv_bbf_time_measure();
+#ifdef USE_OPENMP
+#pragma omp parallel for private(i) schedule(dynamic)
+#endif
+ for (i = 0; i < pnum; i++)
+ gene[i].error = _ccv_bbf_error_rate(&gene[i].feature, posdata, posnum, negdata, negnum, size, pw, nw);
+ timer = _ccv_bbf_time_measure() - timer;
+ for (i = 0; i < pnum; i++)
+ _ccv_bbf_genetic_fitness(&gene[i]);
+ double best_err = 1;
+ int rnum = ftnum * 39; /* number of randomize */
+ int mnum = ftnum * 40; /* number of mutation */
+ int hnum = ftnum * 20; /* number of hybrid */
+ /* iteration stop crit : best no change in 40 iterations */
+ int it = 0, t;
+ for (t = 0; it < 40; ++it, ++t)
+ {
+ int min_id = 0;
+ double min_err = gene[0].error;
+ for (i = 1; i < pnum; i++)
+ if (gene[i].error < min_err)
+ {
+ min_id = i;
+ min_err = gene[i].error;
+ }
+ min_err = gene[min_id].error = _ccv_bbf_error_rate(&gene[min_id].feature, posdata, posnum, negdata, negnum, size, pw, nw);
+ if (min_err < best_err)
+ {
+ best_err = min_err;
+ memcpy(&best, &gene[min_id].feature, sizeof(best));
+ PRINT(CCV_CLI_INFO, "best bbf feature with error %f\n|-size: %d\n|-positive point: ", best_err, best.size);
+ for (i = 0; i < best.size; i++)
+ PRINT(CCV_CLI_INFO, "(%d %d %d), ", best.px[i], best.py[i], best.pz[i]);
+ PRINT(CCV_CLI_INFO, "\n|-negative point: ");
+ for (i = 0; i < best.size; i++)
+ PRINT(CCV_CLI_INFO, "(%d %d %d), ", best.nx[i], best.ny[i], best.nz[i]);
+ PRINT(CCV_CLI_INFO, "\n");
+ it = 0;
+ }
+ PRINT(CCV_CLI_INFO, "minimum error achieved in round %d(%d) : %f with %d ms\n", t, it, min_err, timer / 1000);
+ _ccv_bbf_genetic_qsort(gene, pnum, 0);
+ for (i = 0; i < ftnum; i++)
+ ++gene[i].age;
+ for (i = ftnum; i < ftnum + mnum; i++)
+ {
+ int parent = gsl_rng_uniform_int(rng, ftnum);
+ memcpy(gene + i, gene + parent, sizeof(ccv_bbf_gene_t));
+ /* three mutation strategy : 1. add, 2. remove, 3. refine */
+ int pnm, pn = gsl_rng_uniform_int(rng, 2);
+ int *pnk[] = {&gene[i].pk, &gene[i].nk};
+ int *pnx[] = {gene[i].feature.px, gene[i].feature.nx};
+ int *pny[] = {gene[i].feature.py, gene[i].feature.ny};
+ int *pnz[] = {gene[i].feature.pz, gene[i].feature.nz};
+ int x, y, z;
+ int victim, decay = 1;
+ do
+ {
+ switch (gsl_rng_uniform_int(rng, 3))
+ {
+ case 0: /* add */
+ if (gene[i].pk == CCV_BBF_POINT_MAX && gene[i].nk == CCV_BBF_POINT_MAX)
+ break;
+ while (*pnk[pn] + 1 > CCV_BBF_POINT_MAX)
+ pn = gsl_rng_uniform_int(rng, 2);
+ do
+ {
+ z = gsl_rng_uniform_int(rng, 3);
+ x = gsl_rng_uniform_int(rng, cols[z]);
+ y = gsl_rng_uniform_int(rng, rows[z]);
+ } while (_ccv_bbf_exist_gene_feature(&gene[i], x, y, z));
+ pnz[pn][*pnk[pn]] = z;
+ pnx[pn][*pnk[pn]] = x;
+ pny[pn][*pnk[pn]] = y;
+ ++(*pnk[pn]);
+ gene[i].feature.size = ccv_max(gene[i].pk, gene[i].nk);
+ decay = gene[i].age = 0;
+ break;
+ case 1: /* remove */
+ if (gene[i].pk + gene[i].nk <= CCV_BBF_POINT_MIN) /* at least 3 points have to be examed */
+ break;
+ while (*pnk[pn] - 1 <= 0) // || *pnk[pn] + *pnk[!pn] - 1 < CCV_BBF_POINT_MIN)
+ pn = gsl_rng_uniform_int(rng, 2);
+ victim = gsl_rng_uniform_int(rng, *pnk[pn]);
+ for (j = victim; j < *pnk[pn] - 1; j++)
+ {
+ pnz[pn][j] = pnz[pn][j + 1];
+ pnx[pn][j] = pnx[pn][j + 1];
+ pny[pn][j] = pny[pn][j + 1];
+ }
+ pnz[pn][*pnk[pn] - 1] = -1;
+ --(*pnk[pn]);
+ gene[i].feature.size = ccv_max(gene[i].pk, gene[i].nk);
+ decay = gene[i].age = 0;
+ break;
+ case 2: /* refine */
+ pnm = gsl_rng_uniform_int(rng, *pnk[pn]);
+ do
+ {
+ z = gsl_rng_uniform_int(rng, 3);
+ x = gsl_rng_uniform_int(rng, cols[z]);
+ y = gsl_rng_uniform_int(rng, rows[z]);
+ } while (_ccv_bbf_exist_gene_feature(&gene[i], x, y, z));
+ pnz[pn][pnm] = z;
+ pnx[pn][pnm] = x;
+ pny[pn][pnm] = y;
+ decay = gene[i].age = 0;
+ break;
+ }
+ } while (decay);
+ }
+ for (i = ftnum + mnum; i < ftnum + mnum + hnum; i++)
+ {
+ /* hybrid strategy: taking positive points from dad, negative points from mum */
+ int dad, mum;
+ do
+ {
+ dad = gsl_rng_uniform_int(rng, ftnum);
+ mum = gsl_rng_uniform_int(rng, ftnum);
+ } while (dad == mum || gene[dad].pk + gene[mum].nk < CCV_BBF_POINT_MIN); /* at least 3 points have to be examed */
+ for (j = 0; j < CCV_BBF_POINT_MAX; j++)
+ {
+ gene[i].feature.pz[j] = -1;
+ gene[i].feature.nz[j] = -1;
+ }
+ gene[i].pk = gene[dad].pk;
+ for (j = 0; j < gene[i].pk; j++)
+ {
+ gene[i].feature.pz[j] = gene[dad].feature.pz[j];
+ gene[i].feature.px[j] = gene[dad].feature.px[j];
+ gene[i].feature.py[j] = gene[dad].feature.py[j];
+ }
+ gene[i].nk = gene[mum].nk;
+ for (j = 0; j < gene[i].nk; j++)
+ {
+ gene[i].feature.nz[j] = gene[mum].feature.nz[j];
+ gene[i].feature.nx[j] = gene[mum].feature.nx[j];
+ gene[i].feature.ny[j] = gene[mum].feature.ny[j];
+ }
+ gene[i].feature.size = ccv_max(gene[i].pk, gene[i].nk);
+ gene[i].age = 0;
+ }
+ for (i = ftnum + mnum + hnum; i < ftnum + mnum + hnum + rnum; i++)
+ _ccv_bbf_randomize_gene(rng, &gene[i], rows, cols);
+ timer = _ccv_bbf_time_measure();
+#ifdef USE_OPENMP
+#pragma omp parallel for private(i) schedule(dynamic)
+#endif
+ for (i = 0; i < pnum; i++)
+ gene[i].error = _ccv_bbf_error_rate(&gene[i].feature, posdata, posnum, negdata, negnum, size, pw, nw);
+ timer = _ccv_bbf_time_measure() - timer;
+ for (i = 0; i < pnum; i++)
+ _ccv_bbf_genetic_fitness(&gene[i]);
+ }
+ ccfree(gene);
+ gsl_rng_free(rng);
+ return best;
+}
+
+#define less_than(fit1, fit2, aux) ((fit1).error < (fit2).error)
+static CCV_IMPLEMENT_QSORT(_ccv_bbf_best_qsort, ccv_bbf_gene_t, less_than)
+#undef less_than
+
+ static ccv_bbf_gene_t _ccv_bbf_best_gene(ccv_bbf_gene_t *gene, int pnum, int point_min, unsigned char **posdata, int posnum, unsigned char **negdata, int negnum, ccv_size_t size, double *pw, double *nw)
+{
+ int i;
+ unsigned int timer = _ccv_bbf_time_measure();
+#ifdef USE_OPENMP
+#pragma omp parallel for private(i) schedule(dynamic)
+#endif
+ for (i = 0; i < pnum; i++)
+ gene[i].error = _ccv_bbf_error_rate(&gene[i].feature, posdata, posnum, negdata, negnum, size, pw, nw);
+ timer = _ccv_bbf_time_measure() - timer;
+ _ccv_bbf_best_qsort(gene, pnum, 0);
+ int min_id = 0;
+ double min_err = gene[0].error;
+ for (i = 0; i < pnum; i++)
+ if (gene[i].nk + gene[i].pk >= point_min)
+ {
+ min_id = i;
+ min_err = gene[i].error;
+ break;
+ }
+ PRINT(CCV_CLI_INFO, "local best bbf feature with error %f\n|-size: %d\n|-positive point: ", min_err, gene[min_id].feature.size);
+ for (i = 0; i < gene[min_id].feature.size; i++)
+ PRINT(CCV_CLI_INFO, "(%d %d %d), ", gene[min_id].feature.px[i], gene[min_id].feature.py[i], gene[min_id].feature.pz[i]);
+ PRINT(CCV_CLI_INFO, "\n|-negative point: ");
+ for (i = 0; i < gene[min_id].feature.size; i++)
+ PRINT(CCV_CLI_INFO, "(%d %d %d), ", gene[min_id].feature.nx[i], gene[min_id].feature.ny[i], gene[min_id].feature.nz[i]);
+ PRINT(CCV_CLI_INFO, "\nthe computation takes %d ms\n", timer / 1000);
+ return gene[min_id];
+}
+
+static ccv_bbf_feature_t _ccv_bbf_convex_optimize(unsigned char **posdata, int posnum, unsigned char **negdata, int negnum, ccv_bbf_feature_t *best_feature, ccv_size_t size, double *pw, double *nw)
+{
+ ccv_bbf_gene_t best_gene;
+ /* seed (random method) */
+ gsl_rng_env_setup();
+ gsl_rng *rng = gsl_rng_alloc(gsl_rng_default);
+ union {
+ unsigned long int li;
+ double db;
+ } dbli;
+ dbli.db = pw[0] + nw[0];
+ gsl_rng_set(rng, dbli.li);
+ int i, j, k, q, p, g, t;
+ int rows[] = {size.height, size.height >> 1, size.height >> 2};
+ int cols[] = {size.width, size.width >> 1, size.width >> 2};
+ int pnum = rows[0] * cols[0] + rows[1] * cols[1] + rows[2] * cols[2];
+ ccv_bbf_gene_t *gene = (ccv_bbf_gene_t *)ccmalloc((pnum * (CCV_BBF_POINT_MAX * 2 + 1) * 2 + CCV_BBF_POINT_MAX * 2 + 1) * sizeof(ccv_bbf_gene_t));
+ if (best_feature == 0)
+ {
+ /* bootstrapping the best feature, start from two pixels, one for positive, one for negative
+ * the bootstrapping process go like this: first, it will assign a random pixel as positive
+ * and enumerate every possible pixel as negative, and pick the best one. Then, enumerate every
+ * possible pixel as positive, and pick the best one, until it converges */
+ memset(&best_gene, 0, sizeof(ccv_bbf_gene_t));
+ for (i = 0; i < CCV_BBF_POINT_MAX; i++)
+ best_gene.feature.pz[i] = best_gene.feature.nz[i] = -1;
+ best_gene.pk = 1;
+ best_gene.nk = 0;
+ best_gene.feature.size = 1;
+ best_gene.feature.pz[0] = gsl_rng_uniform_int(rng, 3);
+ best_gene.feature.px[0] = gsl_rng_uniform_int(rng, cols[best_gene.feature.pz[0]]);
+ best_gene.feature.py[0] = gsl_rng_uniform_int(rng, rows[best_gene.feature.pz[0]]);
+ for (t = 0;; ++t)
+ {
+ g = 0;
+ if (t % 2 == 0)
+ {
+ for (i = 0; i < 3; i++)
+ for (j = 0; j < cols[i]; j++)
+ for (k = 0; k < rows[i]; k++)
+ if (i != best_gene.feature.pz[0] || j != best_gene.feature.px[0] || k != best_gene.feature.py[0])
+ {
+ gene[g] = best_gene;
+ gene[g].pk = gene[g].nk = 1;
+ gene[g].feature.nz[0] = i;
+ gene[g].feature.nx[0] = j;
+ gene[g].feature.ny[0] = k;
+ g++;
+ }
+ }
+ else
+ {
+ for (i = 0; i < 3; i++)
+ for (j = 0; j < cols[i]; j++)
+ for (k = 0; k < rows[i]; k++)
+ if (i != best_gene.feature.nz[0] || j != best_gene.feature.nx[0] || k != best_gene.feature.ny[0])
+ {
+ gene[g] = best_gene;
+ gene[g].pk = gene[g].nk = 1;
+ gene[g].feature.pz[0] = i;
+ gene[g].feature.px[0] = j;
+ gene[g].feature.py[0] = k;
+ g++;
+ }
+ }
+ PRINT(CCV_CLI_INFO, "bootstrapping round : %d\n", t);
+ ccv_bbf_gene_t local_gene = _ccv_bbf_best_gene(gene, g, 2, posdata, posnum, negdata, negnum, size, pw, nw);
+ if (local_gene.error >= best_gene.error - 1e-10)
+ break;
+ best_gene = local_gene;
+ }
+ }
+ else
+ {
+ best_gene.feature = *best_feature;
+ best_gene.pk = best_gene.nk = best_gene.feature.size;
+ for (i = 0; i < CCV_BBF_POINT_MAX; i++)
+ if (best_feature->pz[i] == -1)
+ {
+ best_gene.pk = i;
+ break;
+ }
+ for (i = 0; i < CCV_BBF_POINT_MAX; i++)
+ if (best_feature->nz[i] == -1)
+ {
+ best_gene.nk = i;
+ break;
+ }
+ }
+ /* after bootstrapping, the float search technique will do the following permutations:
+ * a). add a new point to positive or negative
+ * b). remove a point from positive or negative
+ * c). move an existing point in positive or negative to another position
+ * the three rules applied exhaustively, no heuristic used. */
+ for (t = 0;; ++t)
+ {
+ g = 0;
+ for (i = 0; i < 3; i++)
+ for (j = 0; j < cols[i]; j++)
+ for (k = 0; k < rows[i]; k++)
+ if (!_ccv_bbf_exist_gene_feature(&best_gene, j, k, i))
+ {
+ /* add positive point */
+ if (best_gene.pk < CCV_BBF_POINT_MAX - 1)
+ {
+ gene[g] = best_gene;
+ gene[g].feature.pz[gene[g].pk] = i;
+ gene[g].feature.px[gene[g].pk] = j;
+ gene[g].feature.py[gene[g].pk] = k;
+ gene[g].pk++;
+ gene[g].feature.size = ccv_max(gene[g].pk, gene[g].nk);
+ g++;
+ }
+ /* add negative point */
+ if (best_gene.nk < CCV_BBF_POINT_MAX - 1)
+ {
+ gene[g] = best_gene;
+ gene[g].feature.nz[gene[g].nk] = i;
+ gene[g].feature.nx[gene[g].nk] = j;
+ gene[g].feature.ny[gene[g].nk] = k;
+ gene[g].nk++;
+ gene[g].feature.size = ccv_max(gene[g].pk, gene[g].nk);
+ g++;
+ }
+ /* refine positive point */
+ for (q = 0; q < best_gene.pk; q++)
+ {
+ gene[g] = best_gene;
+ gene[g].feature.pz[q] = i;
+ gene[g].feature.px[q] = j;
+ gene[g].feature.py[q] = k;
+ g++;
+ }
+ /* add positive point, remove negative point */
+ if (best_gene.pk < CCV_BBF_POINT_MAX - 1 && best_gene.nk > 1)
+ {
+ for (q = 0; q < best_gene.nk; q++)
+ {
+ gene[g] = best_gene;
+ gene[g].feature.pz[gene[g].pk] = i;
+ gene[g].feature.px[gene[g].pk] = j;
+ gene[g].feature.py[gene[g].pk] = k;
+ gene[g].pk++;
+ for (p = q; p < best_gene.nk - 1; p++)
+ {
+ gene[g].feature.nz[p] = gene[g].feature.nz[p + 1];
+ gene[g].feature.nx[p] = gene[g].feature.nx[p + 1];
+ gene[g].feature.ny[p] = gene[g].feature.ny[p + 1];
+ }
+ gene[g].feature.nz[gene[g].nk - 1] = -1;
+ gene[g].nk--;
+ gene[g].feature.size = ccv_max(gene[g].pk, gene[g].nk);
+ g++;
+ }
+ }
+ /* refine negative point */
+ for (q = 0; q < best_gene.nk; q++)
+ {
+ gene[g] = best_gene;
+ gene[g].feature.nz[q] = i;
+ gene[g].feature.nx[q] = j;
+ gene[g].feature.ny[q] = k;
+ g++;
+ }
+ /* add negative point, remove positive point */
+ if (best_gene.pk > 1 && best_gene.nk < CCV_BBF_POINT_MAX - 1)
+ {
+ for (q = 0; q < best_gene.pk; q++)
+ {
+ gene[g] = best_gene;
+ gene[g].feature.nz[gene[g].nk] = i;
+ gene[g].feature.nx[gene[g].nk] = j;
+ gene[g].feature.ny[gene[g].nk] = k;
+ gene[g].nk++;
+ for (p = q; p < best_gene.pk - 1; p++)
+ {
+ gene[g].feature.pz[p] = gene[g].feature.pz[p + 1];
+ gene[g].feature.px[p] = gene[g].feature.px[p + 1];
+ gene[g].feature.py[p] = gene[g].feature.py[p + 1];
+ }
+ gene[g].feature.pz[gene[g].pk - 1] = -1;
+ gene[g].pk--;
+ gene[g].feature.size = ccv_max(gene[g].pk, gene[g].nk);
+ g++;
+ }
+ }
+ }
+ if (best_gene.pk > 1)
+ for (q = 0; q < best_gene.pk; q++)
+ {
+ gene[g] = best_gene;
+ for (i = q; i < best_gene.pk - 1; i++)
+ {
+ gene[g].feature.pz[i] = gene[g].feature.pz[i + 1];
+ gene[g].feature.px[i] = gene[g].feature.px[i + 1];
+ gene[g].feature.py[i] = gene[g].feature.py[i + 1];
+ }
+ gene[g].feature.pz[gene[g].pk - 1] = -1;
+ gene[g].pk--;
+ gene[g].feature.size = ccv_max(gene[g].pk, gene[g].nk);
+ g++;
+ }
+ if (best_gene.nk > 1)
+ for (q = 0; q < best_gene.nk; q++)
+ {
+ gene[g] = best_gene;
+ for (i = q; i < best_gene.nk - 1; i++)
+ {
+ gene[g].feature.nz[i] = gene[g].feature.nz[i + 1];
+ gene[g].feature.nx[i] = gene[g].feature.nx[i + 1];
+ gene[g].feature.ny[i] = gene[g].feature.ny[i + 1];
+ }
+ gene[g].feature.nz[gene[g].nk - 1] = -1;
+ gene[g].nk--;
+ gene[g].feature.size = ccv_max(gene[g].pk, gene[g].nk);
+ g++;
+ }
+ gene[g] = best_gene;
+ g++;
+ PRINT(CCV_CLI_INFO, "float search round : %d\n", t);
+ ccv_bbf_gene_t local_gene = _ccv_bbf_best_gene(gene, g, CCV_BBF_POINT_MIN, posdata, posnum, negdata, negnum, size, pw, nw);
+ if (local_gene.error >= best_gene.error - 1e-10)
+ break;
+ best_gene = local_gene;
+ }
+ ccfree(gene);
+ gsl_rng_free(rng);
+ return best_gene.feature;
+}
+
+static int _ccv_write_bbf_stage_classifier(const char *file, ccv_bbf_stage_classifier_t *classifier)
+{
+ FILE *w = fopen(file, "wb");
+ if (w == 0)
+ return -1;
+ fprintf(w, "%d\n", classifier->count);
+ union {
+ float fl;
+ int i;
+ } fli;
+ fli.fl = classifier->threshold;
+ fprintf(w, "%d\n", fli.i);
+ int i, j;
+ for (i = 0; i < classifier->count; i++)
+ {
+ fprintf(w, "%d\n", classifier->feature[i].size);
+ for (j = 0; j < classifier->feature[i].size; j++)
+ {
+ fprintf(w, "%d %d %d\n", classifier->feature[i].px[j], classifier->feature[i].py[j], classifier->feature[i].pz[j]);
+ fprintf(w, "%d %d %d\n", classifier->feature[i].nx[j], classifier->feature[i].ny[j], classifier->feature[i].nz[j]);
+ }
+ union {
+ float fl;
+ int i;
+ } flia, flib;
+ flia.fl = classifier->alpha[i * 2];
+ flib.fl = classifier->alpha[i * 2 + 1];
+ fprintf(w, "%d %d\n", flia.i, flib.i);
+ }
+ fclose(w);
+ return 0;
+}
+
+static int _ccv_read_background_data(const char *file, unsigned char **negdata, int *negnum, ccv_size_t size)
+{
+ int stat = 0;
+ FILE *r = fopen(file, "rb");
+ if (r == 0)
+ return -1;
+ stat |= fread(negnum, sizeof(int), 1, r);
+ int i;
+ int isizs012 = _ccv_width_padding(size.width) * size.height +
+ _ccv_width_padding(size.width >> 1) * (size.height >> 1) +
+ _ccv_width_padding(size.width >> 2) * (size.height >> 2);
+ for (i = 0; i < *negnum; i++)
+ {
+ negdata[i] = (unsigned char *)ccmalloc(isizs012);
+ stat |= fread(negdata[i], 1, isizs012, r);
+ }
+ fclose(r);
+ return 0;
+}
+
+static int _ccv_write_background_data(const char *file, unsigned char **negdata, int negnum, ccv_size_t size)
+{
+ FILE *w = fopen(file, "w");
+ if (w == 0)
+ return -1;
+ fwrite(&negnum, sizeof(int), 1, w);
+ int i;
+ int isizs012 = _ccv_width_padding(size.width) * size.height +
+ _ccv_width_padding(size.width >> 1) * (size.height >> 1) +
+ _ccv_width_padding(size.width >> 2) * (size.height >> 2);
+ for (i = 0; i < negnum; i++)
+ fwrite(negdata[i], 1, isizs012, w);
+ fclose(w);
+ return 0;
+}
+
+static int _ccv_resume_bbf_cascade_training_state(const char *file, int *i, int *k, int *bg, double *pw, double *nw, int posnum, int negnum)
+{
+ int stat = 0;
+ FILE *r = fopen(file, "r");
+ if (r == 0)
+ return -1;
+ stat |= fscanf(r, "%d %d %d", i, k, bg);
+ int j;
+ union {
+ double db;
+ int i[2];
+ } dbi;
+ for (j = 0; j < posnum; j++)
+ {
+ stat |= fscanf(r, "%d %d", &dbi.i[0], &dbi.i[1]);
+ pw[j] = dbi.db;
+ }
+ for (j = 0; j < negnum; j++)
+ {
+ stat |= fscanf(r, "%d %d", &dbi.i[0], &dbi.i[1]);
+ nw[j] = dbi.db;
+ }
+ fclose(r);
+ return 0;
+}
+
+static int _ccv_save_bbf_cacade_training_state(const char *file, int i, int k, int bg, double *pw, double *nw, int posnum, int negnum)
+{
+ FILE *w = fopen(file, "w");
+ if (w == 0)
+ return -1;
+ fprintf(w, "%d %d %d\n", i, k, bg);
+ int j;
+ union {
+ double db;
+ int i[2];
+ } dbi;
+ for (j = 0; j < posnum; ++j)
+ {
+ dbi.db = pw[j];
+ fprintf(w, "%d %d ", dbi.i[0], dbi.i[1]);
+ }
+ fprintf(w, "\n");
+ for (j = 0; j < negnum; ++j)
+ {
+ dbi.db = nw[j];
+ fprintf(w, "%d %d ", dbi.i[0], dbi.i[1]);
+ }
+ fprintf(w, "\n");
+ fclose(w);
+ return 0;
+}
+
+void ccv_bbf_classifier_cascade_new(ccv_dense_matrix_t **posimg, int posnum, char **bgfiles, int bgnum, int negnum, ccv_size_t size, const char *dir, ccv_bbf_new_param_t params)
+{
+ int i, j, k;
+ /* allocate memory for usage */
+ ccv_bbf_classifier_cascade_t *cascade = (ccv_bbf_classifier_cascade_t *)ccmalloc(sizeof(ccv_bbf_classifier_cascade_t));
+ cascade->count = 0;
+ cascade->size = size;
+ cascade->stage_classifier = (ccv_bbf_stage_classifier_t *)ccmalloc(sizeof(ccv_bbf_stage_classifier_t));
+ unsigned char **posdata = (unsigned char **)ccmalloc(posnum * sizeof(unsigned char *));
+ unsigned char **negdata = (unsigned char **)ccmalloc(negnum * sizeof(unsigned char *));
+ double *pw = (double *)ccmalloc(posnum * sizeof(double));
+ double *nw = (double *)ccmalloc(negnum * sizeof(double));
+ float *peval = (float *)ccmalloc(posnum * sizeof(float));
+ float *neval = (float *)ccmalloc(negnum * sizeof(float));
+ double inv_balance_k = 1. / params.balance_k;
+ /* balance factor k, and weighted with 0.01 */
+ params.balance_k *= 0.01;
+ inv_balance_k *= 0.01;
+
+ int steps[] = {_ccv_width_padding(cascade->size.width),
+ _ccv_width_padding(cascade->size.width >> 1),
+ _ccv_width_padding(cascade->size.width >> 2)};
+ int isizs0 = steps[0] * cascade->size.height;
+ int isizs01 = isizs0 + steps[1] * (cascade->size.height >> 1);
+
+ i = 0;
+ k = 0;
+ int bg = 0;
+ int cacheK = 10;
+ /* state resume code */
+ char buf[1024];
+ sprintf(buf, "%s/stat.txt", dir);
+ _ccv_resume_bbf_cascade_training_state(buf, &i, &k, &bg, pw, nw, posnum, negnum);
+ if (i > 0)
+ {
+ cascade->count = i;
+ ccfree(cascade->stage_classifier);
+ cascade->stage_classifier = (ccv_bbf_stage_classifier_t *)ccmalloc(i * sizeof(ccv_bbf_stage_classifier_t));
+ for (j = 0; j < i; j++)
+ {
+ sprintf(buf, "%s/stage-%d.txt", dir, j);
+ _ccv_read_bbf_stage_classifier(buf, &cascade->stage_classifier[j]);
+ }
+ }
+ if (k > 0)
+ cacheK = k;
+ int rpos, rneg = 0;
+ if (bg)
+ {
+ sprintf(buf, "%s/negs.txt", dir);
+ _ccv_read_background_data(buf, negdata, &rneg, cascade->size);
+ }
+
+ for (; i < params.layer; i++)
+ {
+ if (!bg)
+ {
+ rneg = _ccv_prepare_background_data(cascade, bgfiles, bgnum, negdata, negnum);
+ /* save state of background data */
+ sprintf(buf, "%s/negs.txt", dir);
+ _ccv_write_background_data(buf, negdata, rneg, cascade->size);
+ bg = 1;
+ }
+ double totalw;
+ /* save state of cascade : level, weight etc. */
+ sprintf(buf, "%s/stat.txt", dir);
+ _ccv_save_bbf_cacade_training_state(buf, i, k, bg, pw, nw, posnum, negnum);
+ ccv_bbf_stage_classifier_t classifier;
+ if (k > 0)
+ {
+ /* resume state of classifier */
+ sprintf(buf, "%s/stage-%d.txt", dir, i);
+ _ccv_read_bbf_stage_classifier(buf, &classifier);
+ }
+ else
+ {
+ /* initialize classifier */
+ for (j = 0; j < posnum; j++)
+ pw[j] = params.balance_k;
+ for (j = 0; j < rneg; j++)
+ nw[j] = inv_balance_k;
+ classifier.count = k;
+ classifier.threshold = 0;
+ classifier.feature = (ccv_bbf_feature_t *)ccmalloc(cacheK * sizeof(ccv_bbf_feature_t));
+ classifier.alpha = (float *)ccmalloc(cacheK * 2 * sizeof(float));
+ }
+ _ccv_prepare_positive_data(posimg, posdata, cascade->size, posnum);
+ rpos = _ccv_prune_positive_data(cascade, posdata, posnum, cascade->size);
+ PRINT(CCV_CLI_INFO, "%d postivie data and %d negative data in training\n", rpos, rneg);
+ /* reweight to 1.00 */
+ totalw = 0;
+ for (j = 0; j < rpos; j++)
+ totalw += pw[j];
+ for (j = 0; j < rneg; j++)
+ totalw += nw[j];
+ for (j = 0; j < rpos; j++)
+ pw[j] = pw[j] / totalw;
+ for (j = 0; j < rneg; j++)
+ nw[j] = nw[j] / totalw;
+ for (;; k++)
+ {
+ /* get overall true-positive, false-positive rate and threshold */
+ double tp = 0, fp = 0, etp = 0, efp = 0;
+ _ccv_bbf_eval_data(&classifier, posdata, rpos, negdata, rneg, cascade->size, peval, neval);
+ _ccv_sort_32f(peval, rpos, 0);
+ classifier.threshold = peval[(int)((1. - params.pos_crit) * rpos)] - 1e-6;
+ for (j = 0; j < rpos; j++)
+ {
+ if (peval[j] >= 0)
+ ++tp;
+ if (peval[j] >= classifier.threshold)
+ ++etp;
+ }
+ tp /= rpos;
+ etp /= rpos;
+ for (j = 0; j < rneg; j++)
+ {
+ if (neval[j] >= 0)
+ ++fp;
+ if (neval[j] >= classifier.threshold)
+ ++efp;
+ }
+ fp /= rneg;
+ efp /= rneg;
+ PRINT(CCV_CLI_INFO, "stage classifier real TP rate : %f, FP rate : %f\n", tp, fp);
+ PRINT(CCV_CLI_INFO, "stage classifier TP rate : %f, FP rate : %f at threshold : %f\n", etp, efp, classifier.threshold);
+ if (k > 0)
+ {
+ /* save classifier state */
+ sprintf(buf, "%s/stage-%d.txt", dir, i);
+ _ccv_write_bbf_stage_classifier(buf, &classifier);
+ sprintf(buf, "%s/stat.txt", dir);
+ _ccv_save_bbf_cacade_training_state(buf, i, k, bg, pw, nw, posnum, negnum);
+ }
+ if (etp > params.pos_crit && efp < params.neg_crit)
+ break;
+ /* TODO: more post-process is needed in here */
+
+ /* select the best feature in current distribution through genetic algorithm optimization */
+ ccv_bbf_feature_t best;
+ if (params.optimizer == CCV_BBF_GENETIC_OPT)
+ {
+ best = _ccv_bbf_genetic_optimize(posdata, rpos, negdata, rneg, params.feature_number, cascade->size, pw, nw);
+ }
+ else if (params.optimizer == CCV_BBF_FLOAT_OPT)
+ {
+ best = _ccv_bbf_convex_optimize(posdata, rpos, negdata, rneg, 0, cascade->size, pw, nw);
+ }
+ else
+ {
+ best = _ccv_bbf_genetic_optimize(posdata, rpos, negdata, rneg, params.feature_number, cascade->size, pw, nw);
+ best = _ccv_bbf_convex_optimize(posdata, rpos, negdata, rneg, &best, cascade->size, pw, nw);
+ }
+ double err = _ccv_bbf_error_rate(&best, posdata, rpos, negdata, rneg, cascade->size, pw, nw);
+ double rw = (1 - err) / err;
+ totalw = 0;
+ /* reweight */
+ for (j = 0; j < rpos; j++)
+ {
+ unsigned char *u8[] = {posdata[j], posdata[j] + isizs0, posdata[j] + isizs01};
+ if (!_ccv_run_bbf_feature(&best, steps, u8))
+ pw[j] *= rw;
+ pw[j] *= params.balance_k;
+ totalw += pw[j];
+ }
+ for (j = 0; j < rneg; j++)
+ {
+ unsigned char *u8[] = {negdata[j], negdata[j] + isizs0, negdata[j] + isizs01};
+ if (_ccv_run_bbf_feature(&best, steps, u8))
+ nw[j] *= rw;
+ nw[j] *= inv_balance_k;
+ totalw += nw[j];
+ }
+ for (j = 0; j < rpos; j++)
+ pw[j] = pw[j] / totalw;
+ for (j = 0; j < rneg; j++)
+ nw[j] = nw[j] / totalw;
+ double c = log(rw);
+ PRINT(CCV_CLI_INFO, "coefficient of feature %d: %f\n", k + 1, c);
+ classifier.count = k + 1;
+ /* resizing classifier */
+ if (k >= cacheK)
+ {
+ ccv_bbf_feature_t *feature = (ccv_bbf_feature_t *)ccmalloc(cacheK * 2 * sizeof(ccv_bbf_feature_t));
+ memcpy(feature, classifier.feature, cacheK * sizeof(ccv_bbf_feature_t));
+ ccfree(classifier.feature);
+ float *alpha = (float *)ccmalloc(cacheK * 4 * sizeof(float));
+ memcpy(alpha, classifier.alpha, cacheK * 2 * sizeof(float));
+ ccfree(classifier.alpha);
+ classifier.feature = feature;
+ classifier.alpha = alpha;
+ cacheK *= 2;
+ }
+ /* setup new feature */
+ classifier.feature[k] = best;
+ classifier.alpha[k * 2] = -c;
+ classifier.alpha[k * 2 + 1] = c;
+ }
+ cascade->count = i + 1;
+ ccv_bbf_stage_classifier_t *stage_classifier = (ccv_bbf_stage_classifier_t *)ccmalloc(cascade->count * sizeof(ccv_bbf_stage_classifier_t));
+ memcpy(stage_classifier, cascade->stage_classifier, i * sizeof(ccv_bbf_stage_classifier_t));
+ ccfree(cascade->stage_classifier);
+ stage_classifier[i] = classifier;
+ cascade->stage_classifier = stage_classifier;
+ k = 0;
+ bg = 0;
+ for (j = 0; j < rpos; j++)
+ ccfree(posdata[j]);
+ for (j = 0; j < rneg; j++)
+ ccfree(negdata[j]);
+ }
+
+ ccfree(neval);
+ ccfree(peval);
+ ccfree(nw);
+ ccfree(pw);
+ ccfree(negdata);
+ ccfree(posdata);
+ ccfree(cascade);
+}
+#else
+void ccv_bbf_classifier_cascade_new(ccv_dense_matrix_t **posimg, int posnum, char **bgfiles, int bgnum, int negnum, ccv_size_t size, const char *dir, ccv_bbf_new_param_t params)
+{
+ fprintf(stderr, " ccv_bbf_classifier_cascade_new requires libgsl support, please compile ccv with libgsl.\n");
+}
+#endif
+
+static int _ccv_is_equal(const void *_r1, const void *_r2, void *data)
+{
+ const ccv_comp_t *r1 = (const ccv_comp_t *)_r1;
+ const ccv_comp_t *r2 = (const ccv_comp_t *)_r2;
+ int distance = (int)(r1->rect.width * 0.25 + 0.5);
+
+ return r2->rect.x <= r1->rect.x + distance &&
+ r2->rect.x >= r1->rect.x - distance &&
+ r2->rect.y <= r1->rect.y + distance &&
+ r2->rect.y >= r1->rect.y - distance &&
+ r2->rect.width <= (int)(r1->rect.width * 1.5 + 0.5) &&
+ (int)(r2->rect.width * 1.5 + 0.5) >= r1->rect.width;
+}
+
+static int _ccv_is_equal_same_class(const void *_r1, const void *_r2, void *data)
+{
+ const ccv_comp_t *r1 = (const ccv_comp_t *)_r1;
+ const ccv_comp_t *r2 = (const ccv_comp_t *)_r2;
+ int distance = (int)(r1->rect.width * 0.25 + 0.5);
+
+ return r2->classification.id == r1->classification.id &&
+ r2->rect.x <= r1->rect.x + distance &&
+ r2->rect.x >= r1->rect.x - distance &&
+ r2->rect.y <= r1->rect.y + distance &&
+ r2->rect.y >= r1->rect.y - distance &&
+ r2->rect.width <= (int)(r1->rect.width * 1.5 + 0.5) &&
+ (int)(r2->rect.width * 1.5 + 0.5) >= r1->rect.width;
+}
+
+ccv_array_t *ccv_bbf_detect_objects(ccv_dense_matrix_t *a, ccv_bbf_classifier_cascade_t **_cascade, int count, ccv_bbf_param_t params)
+{
+ int hr = a->rows / params.size.height;
+ int wr = a->cols / params.size.width;
+ double scale = pow(2., 1. / (params.interval + 1.));
+ int next = params.interval + 1;
+ int scale_upto = (int)(log((double)ccv_min(hr, wr)) / log(scale));
+ ccv_dense_matrix_t **pyr = (ccv_dense_matrix_t **)alloca((scale_upto + next * 2) * 4 * sizeof(ccv_dense_matrix_t *));
+ memset(pyr, 0, (scale_upto + next * 2) * 4 * sizeof(ccv_dense_matrix_t *));
+ if (params.size.height != _cascade[0]->size.height || params.size.width != _cascade[0]->size.width)
+ ccv_resample(a, &pyr[0], 0, a->rows * _cascade[0]->size.height / params.size.height, a->cols * _cascade[0]->size.width / params.size.width, CCV_INTER_AREA);
+ else
+ pyr[0] = a;
+ int i, j, k, t, x, y, q;
+ for (i = 1; i < ccv_min(params.interval + 1, scale_upto + next * 2); i++)
+ ccv_resample(pyr[0], &pyr[i * 4], 0, (int)(pyr[0]->rows / pow(scale, i)), (int)(pyr[0]->cols / pow(scale, i)), CCV_INTER_AREA);
+ for (i = next; i < scale_upto + next * 2; i++)
+ ccv_sample_down(pyr[i * 4 - next * 4], &pyr[i * 4], 0, 0, 0);
+ if (params.accurate)
+ for (i = next * 2; i < scale_upto + next * 2; i++)
+ {
+ ccv_sample_down(pyr[i * 4 - next * 4], &pyr[i * 4 + 1], 0, 1, 0);
+ ccv_sample_down(pyr[i * 4 - next * 4], &pyr[i * 4 + 2], 0, 0, 1);
+ ccv_sample_down(pyr[i * 4 - next * 4], &pyr[i * 4 + 3], 0, 1, 1);
+ }
+ ccv_array_t *idx_seq;
+ ccv_array_t *seq = ccv_array_new(sizeof(ccv_comp_t), 64, 0);
+ ccv_array_t *seq2 = ccv_array_new(sizeof(ccv_comp_t), 64, 0);
+ ccv_array_t *result_seq = ccv_array_new(sizeof(ccv_comp_t), 64, 0);
+ /* detect in multi scale */
+ for (t = 0; t < count; t++)
+ {
+ ccv_bbf_classifier_cascade_t *cascade = _cascade[t];
+ float scale_x = (float)params.size.width / (float)cascade->size.width;
+ float scale_y = (float)params.size.height / (float)cascade->size.height;
+ ccv_array_clear(seq);
+ for (i = 0; i < scale_upto; i++)
+ {
+ int dx[] = {0, 1, 0, 1};
+ int dy[] = {0, 0, 1, 1};
+ int i_rows = pyr[i * 4 + next * 8]->rows - (cascade->size.height >> 2);
+ int steps[] = {pyr[i * 4]->step, pyr[i * 4 + next * 4]->step, pyr[i * 4 + next * 8]->step};
+ int i_cols = pyr[i * 4 + next * 8]->cols - (cascade->size.width >> 2);
+ int paddings[] = {pyr[i * 4]->step * 4 - i_cols * 4,
+ pyr[i * 4 + next * 4]->step * 2 - i_cols * 2,
+ pyr[i * 4 + next * 8]->step - i_cols};
+ for (q = 0; q < (params.accurate ? 4 : 1); q++)
+ {
+ unsigned char *u8[] = {pyr[i * 4]->data.u8 + dx[q] * 2 + dy[q] * pyr[i * 4]->step * 2, pyr[i * 4 + next * 4]->data.u8 + dx[q] + dy[q] * pyr[i * 4 + next * 4]->step, pyr[i * 4 + next * 8 + q]->data.u8};
+ for (y = 0; y < i_rows; y++)
+ {
+ for (x = 0; x < i_cols; x++)
+ {
+ float sum;
+ int flag = 1;
+ ccv_bbf_stage_classifier_t *classifier = cascade->stage_classifier;
+ for (j = 0; j < cascade->count; ++j, ++classifier)
+ {
+ sum = 0;
+ float *alpha = classifier->alpha;
+ ccv_bbf_feature_t *feature = classifier->feature;
+ for (k = 0; k < classifier->count; ++k, alpha += 2, ++feature)
+ sum += alpha[_ccv_run_bbf_feature(feature, steps, u8)];
+ if (sum < classifier->threshold)
+ {
+ flag = 0;
+ break;
+ }
+ }
+ if (flag)
+ {
+ ccv_comp_t comp;
+ comp.rect = ccv_rect((int)((x * 4 + dx[q] * 2) * scale_x + 0.5), (int)((y * 4 + dy[q] * 2) * scale_y + 0.5), (int)(cascade->size.width * scale_x + 0.5), (int)(cascade->size.height * scale_y + 0.5));
+ comp.neighbors = 1;
+ comp.classification.id = t;
+ comp.classification.confidence = sum;
+ ccv_array_push(seq, &comp);
+ }
+ u8[0] += 4;
+ u8[1] += 2;
+ u8[2] += 1;
+ }
+ u8[0] += paddings[0];
+ u8[1] += paddings[1];
+ u8[2] += paddings[2];
+ }
+ }
+ scale_x *= scale;
+ scale_y *= scale;
+ }
+
+ /* the following code from OpenCV's haar feature implementation */
+ if (params.min_neighbors == 0)
+ {
+ for (i = 0; i < seq->rnum; i++)
+ {
+ ccv_comp_t *comp = (ccv_comp_t *)ccv_array_get(seq, i);
+ ccv_array_push(result_seq, comp);
+ }
+ }
+ else
+ {
+ idx_seq = 0;
+ ccv_array_clear(seq2);
+ // group retrieved rectangles in order to filter out noise
+ int ncomp = ccv_array_group(seq, &idx_seq, _ccv_is_equal_same_class, 0);
+ ccv_comp_t *comps = (ccv_comp_t *)ccmalloc((ncomp + 1) * sizeof(ccv_comp_t));
+ memset(comps, 0, (ncomp + 1) * sizeof(ccv_comp_t));
+
+ // count number of neighbors
+ for (i = 0; i < seq->rnum; i++)
+ {
+ ccv_comp_t r1 = *(ccv_comp_t *)ccv_array_get(seq, i);
+ int idx = *(int *)ccv_array_get(idx_seq, i);
+
+ if (comps[idx].neighbors == 0)
+ comps[idx].classification.confidence = r1.classification.confidence;
+
+ ++comps[idx].neighbors;
+
+ comps[idx].rect.x += r1.rect.x;
+ comps[idx].rect.y += r1.rect.y;
+ comps[idx].rect.width += r1.rect.width;
+ comps[idx].rect.height += r1.rect.height;
+ comps[idx].classification.id = r1.classification.id;
+ comps[idx].classification.confidence = ccv_max(comps[idx].classification.confidence, r1.classification.confidence);
+ }
+
+ // calculate average bounding box
+ for (i = 0; i < ncomp; i++)
+ {
+ int n = comps[i].neighbors;
+ if (n >= params.min_neighbors)
+ {
+ ccv_comp_t comp;
+ comp.rect.x = (comps[i].rect.x * 2 + n) / (2 * n);
+ comp.rect.y = (comps[i].rect.y * 2 + n) / (2 * n);
+ comp.rect.width = (comps[i].rect.width * 2 + n) / (2 * n);
+ comp.rect.height = (comps[i].rect.height * 2 + n) / (2 * n);
+ comp.neighbors = comps[i].neighbors;
+ comp.classification.id = comps[i].classification.id;
+ comp.classification.confidence = comps[i].classification.confidence;
+ ccv_array_push(seq2, &comp);
+ }
+ }
+
+ // filter out small face rectangles inside large face rectangles
+ for (i = 0; i < seq2->rnum; i++)
+ {
+ ccv_comp_t r1 = *(ccv_comp_t *)ccv_array_get(seq2, i);
+ int flag = 1;
+
+ for (j = 0; j < seq2->rnum; j++)
+ {
+ ccv_comp_t r2 = *(ccv_comp_t *)ccv_array_get(seq2, j);
+ int distance = (int)(r2.rect.width * 0.25 + 0.5);
+
+ if (i != j &&
+ r1.classification.id == r2.classification.id &&
+ r1.rect.x >= r2.rect.x - distance &&
+ r1.rect.y >= r2.rect.y - distance &&
+ r1.rect.x + r1.rect.width <= r2.rect.x + r2.rect.width + distance &&
+ r1.rect.y + r1.rect.height <= r2.rect.y + r2.rect.height + distance &&
+ (r2.neighbors > ccv_max(3, r1.neighbors) || r1.neighbors < 3))
+ {
+ flag = 0;
+ break;
+ }
+ }
+
+ if (flag)
+ ccv_array_push(result_seq, &r1);
+ }
+ ccv_array_free(idx_seq);
+ ccfree(comps);
+ }
+ }
+
+ ccv_array_free(seq);
+ ccv_array_free(seq2);
+
+ ccv_array_t *result_seq2;
+ /* the following code from OpenCV's haar feature implementation */
+ if (params.flags & CCV_BBF_NO_NESTED)
+ {
+ result_seq2 = ccv_array_new(sizeof(ccv_comp_t), 64, 0);
+ idx_seq = 0;
+ // group retrieved rectangles in order to filter out noise
+ int ncomp = ccv_array_group(result_seq, &idx_seq, _ccv_is_equal, 0);
+ ccv_comp_t *comps = (ccv_comp_t *)ccmalloc((ncomp + 1) * sizeof(ccv_comp_t));
+ memset(comps, 0, (ncomp + 1) * sizeof(ccv_comp_t));
+
+ // count number of neighbors
+ for (i = 0; i < result_seq->rnum; i++)
+ {
+ ccv_comp_t r1 = *(ccv_comp_t *)ccv_array_get(result_seq, i);
+ int idx = *(int *)ccv_array_get(idx_seq, i);
+
+ if (comps[idx].neighbors == 0 || comps[idx].classification.confidence < r1.classification.confidence)
+ {
+ comps[idx].classification.confidence = r1.classification.confidence;
+ comps[idx].neighbors = 1;
+ comps[idx].rect = r1.rect;
+ comps[idx].classification.id = r1.classification.id;
+ }
+ }
+
+ // calculate average bounding box
+ for (i = 0; i < ncomp; i++)
+ if (comps[i].neighbors)
+ ccv_array_push(result_seq2, &comps[i]);
+
+ ccv_array_free(result_seq);
+ ccfree(comps);
+ }
+ else
+ {
+ result_seq2 = result_seq;
+ }
+
+ for (i = 1; i < scale_upto + next * 2; i++)
+ ccv_matrix_free(pyr[i * 4]);
+ if (params.accurate)
+ for (i = next * 2; i < scale_upto + next * 2; i++)
+ {
+ ccv_matrix_free(pyr[i * 4 + 1]);
+ ccv_matrix_free(pyr[i * 4 + 2]);
+ ccv_matrix_free(pyr[i * 4 + 3]);
+ }
+ if (params.size.height != _cascade[0]->size.height || params.size.width != _cascade[0]->size.width)
+ ccv_matrix_free(pyr[0]);
+
+ return result_seq2;
+}
+
+ccv_bbf_classifier_cascade_t *ccv_bbf_read_classifier_cascade(const char *directory)
+{
+ char buf[1024];
+ sprintf(buf, "%s/cascade.txt", directory);
+ int s, i;
+ FILE *r = fopen(buf, "r");
+ if (r == 0)
+ return 0;
+ ccv_bbf_classifier_cascade_t *cascade = (ccv_bbf_classifier_cascade_t *)ccmalloc(sizeof(ccv_bbf_classifier_cascade_t));
+ s = fscanf(r, "%d %d %d", &cascade->count, &cascade->size.width, &cascade->size.height);
+ assert(s > 0);
+ cascade->stage_classifier = (ccv_bbf_stage_classifier_t *)ccmalloc(cascade->count * sizeof(ccv_bbf_stage_classifier_t));
+ for (i = 0; i < cascade->count; i++)
+ {
+ sprintf(buf, "%s/stage-%d.txt", directory, i);
+ if (_ccv_read_bbf_stage_classifier(buf, &cascade->stage_classifier[i]) < 0)
+ {
+ cascade->count = i;
+ break;
+ }
+ }
+ fclose(r);
+ return cascade;
+}
+
+ccv_bbf_classifier_cascade_t *ccv_bbf_classifier_cascade_read_binary(char *s)
+{
+ int i;
+ ccv_bbf_classifier_cascade_t *cascade = (ccv_bbf_classifier_cascade_t *)ccmalloc(sizeof(ccv_bbf_classifier_cascade_t));
+ memcpy(&cascade->count, s, sizeof(cascade->count));
+ s += sizeof(cascade->count);
+ memcpy(&cascade->size.width, s, sizeof(cascade->size.width));
+ s += sizeof(cascade->size.width);
+ memcpy(&cascade->size.height, s, sizeof(cascade->size.height));
+ s += sizeof(cascade->size.height);
+ ccv_bbf_stage_classifier_t *classifier = cascade->stage_classifier = (ccv_bbf_stage_classifier_t *)ccmalloc(cascade->count * sizeof(ccv_bbf_stage_classifier_t));
+ for (i = 0; i < cascade->count; i++, classifier++)
+ {
+ memcpy(&classifier->count, s, sizeof(classifier->count));
+ s += sizeof(classifier->count);
+ memcpy(&classifier->threshold, s, sizeof(classifier->threshold));
+ s += sizeof(classifier->threshold);
+ classifier->feature = (ccv_bbf_feature_t *)ccmalloc(classifier->count * sizeof(ccv_bbf_feature_t));
+ classifier->alpha = (float *)ccmalloc(classifier->count * 2 * sizeof(float));
+ memcpy(classifier->feature, s, classifier->count * sizeof(ccv_bbf_feature_t));
+ s += classifier->count * sizeof(ccv_bbf_feature_t);
+ memcpy(classifier->alpha, s, classifier->count * 2 * sizeof(float));
+ s += classifier->count * 2 * sizeof(float);
+ }
+ return cascade;
+}
+
+int ccv_bbf_classifier_cascade_write_binary(ccv_bbf_classifier_cascade_t *cascade, char *s, int slen)
+{
+ int i;
+ int len = sizeof(cascade->count) + sizeof(cascade->size.width) + sizeof(cascade->size.height);
+ ccv_bbf_stage_classifier_t *classifier = cascade->stage_classifier;
+ for (i = 0; i < cascade->count; i++, classifier++)
+ len += sizeof(classifier->count) + sizeof(classifier->threshold) + classifier->count * sizeof(ccv_bbf_feature_t) + classifier->count * 2 * sizeof(float);
+ if (slen >= len)
+ {
+ memcpy(s, &cascade->count, sizeof(cascade->count));
+ s += sizeof(cascade->count);
+ memcpy(s, &cascade->size.width, sizeof(cascade->size.width));
+ s += sizeof(cascade->size.width);
+ memcpy(s, &cascade->size.height, sizeof(cascade->size.height));
+ s += sizeof(cascade->size.height);
+ classifier = cascade->stage_classifier;
+ for (i = 0; i < cascade->count; i++, classifier++)
+ {
+ memcpy(s, &classifier->count, sizeof(classifier->count));
+ s += sizeof(classifier->count);
+ memcpy(s, &classifier->threshold, sizeof(classifier->threshold));
+ s += sizeof(classifier->threshold);
+ memcpy(s, classifier->feature, classifier->count * sizeof(ccv_bbf_feature_t));
+ s += classifier->count * sizeof(ccv_bbf_feature_t);
+ memcpy(s, classifier->alpha, classifier->count * 2 * sizeof(float));
+ s += classifier->count * 2 * sizeof(float);
+ }
+ }
+ return len;
+}
+
+void ccv_bbf_classifier_cascade_free(ccv_bbf_classifier_cascade_t *cascade)
+{
+ int i;
+ for (i = 0; i < cascade->count; ++i)
+ {
+ ccfree(cascade->stage_classifier[i].feature);
+ ccfree(cascade->stage_classifier[i].alpha);
+ }
+ ccfree(cascade->stage_classifier);
+ ccfree(cascade);
+}
\ No newline at end of file
diff --git a/test/source.c++ b/test/source.c++
new file mode 100644
index 0000000..6a6b390
--- /dev/null
+++ b/test/source.c++
@@ -0,0 +1,1502 @@
+#include "ccv.h"
+#include "ccv_internal.h"
+#include
+#ifdef HAVE_GSL
+#include
+#include
+#endif
+#ifdef USE_OPENMP
+#include
+#endif
+
+const ccv_bbf_param_t ccv_bbf_default_params = {
+ .interval = 5,
+ .min_neighbors = 2,
+ .accurate = 1,
+ .flags = 0,
+ .size = {
+ 24,
+ 24,
+ },
+};
+
+#define _ccv_width_padding(x) (((x) + 3) & -4)
+
+static inline int _ccv_run_bbf_feature(ccv_bbf_feature_t* feature, int* step, unsigned char** u8)
+{
+#define pf_at(i) (*(u8[feature->pz[i]] + feature->px[i] + feature->py[i] * step[feature->pz[i]]))
+#define nf_at(i) (*(u8[feature->nz[i]] + feature->nx[i] + feature->ny[i] * step[feature->nz[i]]))
+ unsigned char pmin = pf_at(0), nmax = nf_at(0);
+ /* check if every point in P > every point in N, and take a shortcut */
+ if (pmin <= nmax)
+ return 0;
+ int i;
+ for (i = 1; i < feature->size; i++)
+ {
+ if (feature->pz[i] >= 0)
+ {
+ int p = pf_at(i);
+ if (p < pmin)
+ {
+ if (p <= nmax)
+ return 0;
+ pmin = p;
+ }
+ }
+ if (feature->nz[i] >= 0)
+ {
+ int n = nf_at(i);
+ if (n > nmax)
+ {
+ if (pmin <= n)
+ return 0;
+ nmax = n;
+ }
+ }
+ }
+#undef pf_at
+#undef nf_at
+ return 1;
+}
+
+static int _ccv_read_bbf_stage_classifier(const char* file, ccv_bbf_stage_classifier_t* classifier)
+{
+ FILE* r = fopen(file, "r");
+ if (r == 0) return -1;
+ int stat = 0;
+ stat |= fscanf(r, "%d", &classifier->count);
+ union { float fl; int i; } fli;
+ stat |= fscanf(r, "%d", &fli.i);
+ classifier->threshold = fli.fl;
+ classifier->feature = (ccv_bbf_feature_t*)ccmalloc(classifier->count * sizeof(ccv_bbf_feature_t));
+ classifier->alpha = (float*)ccmalloc(classifier->count * 2 * sizeof(float));
+ int i, j;
+ for (i = 0; i < classifier->count; i++)
+ {
+ stat |= fscanf(r, "%d", &classifier->feature[i].size);
+ for (j = 0; j < classifier->feature[i].size; j++)
+ {
+ stat |= fscanf(r, "%d %d %d", &classifier->feature[i].px[j], &classifier->feature[i].py[j], &classifier->feature[i].pz[j]);
+ stat |= fscanf(r, "%d %d %d", &classifier->feature[i].nx[j], &classifier->feature[i].ny[j], &classifier->feature[i].nz[j]);
+ }
+ union { float fl; int i; } flia, flib;
+ stat |= fscanf(r, "%d %d", &flia.i, &flib.i);
+ classifier->alpha[i * 2] = flia.fl;
+ classifier->alpha[i * 2 + 1] = flib.fl;
+ }
+ fclose(r);
+ return 0;
+}
+
+#ifdef HAVE_GSL
+
+static unsigned int _ccv_bbf_time_measure()
+{
+ struct timeval tv;
+ gettimeofday(&tv, 0);
+ return tv.tv_sec * 1000000 + tv.tv_usec;
+}
+
+#define less_than(a, b, aux) ((a) < (b))
+CCV_IMPLEMENT_QSORT(_ccv_sort_32f, float, less_than)
+#undef less_than
+
+static void _ccv_bbf_eval_data(ccv_bbf_stage_classifier_t* classifier, unsigned char** posdata, int posnum, unsigned char** negdata, int negnum, ccv_size_t size, float* peval, float* neval)
+{
+ int i, j;
+ int steps[] = { _ccv_width_padding(size.width),
+ _ccv_width_padding(size.width >> 1),
+ _ccv_width_padding(size.width >> 2) };
+ int isizs0 = steps[0] * size.height;
+ int isizs01 = isizs0 + steps[1] * (size.height >> 1);
+ for (i = 0; i < posnum; i++)
+ {
+ unsigned char* u8[] = { posdata[i], posdata[i] + isizs0, posdata[i] + isizs01 };
+ float sum = 0;
+ float* alpha = classifier->alpha;
+ ccv_bbf_feature_t* feature = classifier->feature;
+ for (j = 0; j < classifier->count; ++j, alpha += 2, ++feature)
+ sum += alpha[_ccv_run_bbf_feature(feature, steps, u8)];
+ peval[i] = sum;
+ }
+ for (i = 0; i < negnum; i++)
+ {
+ unsigned char* u8[] = { negdata[i], negdata[i] + isizs0, negdata[i] + isizs01 };
+ float sum = 0;
+ float* alpha = classifier->alpha;
+ ccv_bbf_feature_t* feature = classifier->feature;
+ for (j = 0; j < classifier->count; ++j, alpha += 2, ++feature)
+ sum += alpha[_ccv_run_bbf_feature(feature, steps, u8)];
+ neval[i] = sum;
+ }
+}
+
+static int _ccv_prune_positive_data(ccv_bbf_classifier_cascade_t* cascade, unsigned char** posdata, int posnum, ccv_size_t size)
+{
+ float* peval = (float*)ccmalloc(posnum * sizeof(float));
+ int i, j, k, rpos = posnum;
+ for (i = 0; i < cascade->count; i++)
+ {
+ _ccv_bbf_eval_data(cascade->stage_classifier + i, posdata, rpos, 0, 0, size, peval, 0);
+ k = 0;
+ for (j = 0; j < rpos; j++)
+ if (peval[j] >= cascade->stage_classifier[i].threshold)
+ {
+ posdata[k] = posdata[j];
+ ++k;
+ } else {
+ ccfree(posdata[j]);
+ }
+ rpos = k;
+ }
+ ccfree(peval);
+ return rpos;
+}
+
+static int _ccv_prepare_background_data(ccv_bbf_classifier_cascade_t* cascade, char** bgfiles, int bgnum, unsigned char** negdata, int negnum)
+{
+ int t, i, j, k, q;
+ int negperbg;
+ int negtotal = 0;
+ int steps[] = { _ccv_width_padding(cascade->size.width),
+ _ccv_width_padding(cascade->size.width >> 1),
+ _ccv_width_padding(cascade->size.width >> 2) };
+ int isizs0 = steps[0] * cascade->size.height;
+ int isizs1 = steps[1] * (cascade->size.height >> 1);
+ int isizs2 = steps[2] * (cascade->size.height >> 2);
+ int* idcheck = (int*)ccmalloc(negnum * sizeof(int));
+
+ gsl_rng_env_setup();
+
+ gsl_rng* rng = gsl_rng_alloc(gsl_rng_default);
+ gsl_rng_set(rng, (unsigned long int)idcheck);
+
+ ccv_size_t imgsz = cascade->size;
+ int rneg = negtotal;
+ for (t = 0; negtotal < negnum; t++)
+ {
+ PRINT(CCV_CLI_INFO, "preparing negative data ... 0%%");
+ for (i = 0; i < bgnum; i++)
+ {
+ negperbg = (t < 2) ? (negnum - negtotal) / (bgnum - i) + 1 : negnum - negtotal;
+ ccv_dense_matrix_t* image = 0;
+ ccv_read(bgfiles[i], &image, CCV_IO_GRAY | CCV_IO_ANY_FILE);
+ assert((image->type & CCV_C1) && (image->type & CCV_8U));
+ if (image == 0)
+ {
+ PRINT(CCV_CLI_ERROR, "\n%s file corrupted\n", bgfiles[i]);
+ continue;
+ }
+ if (t % 2 != 0)
+ ccv_flip(image, 0, 0, CCV_FLIP_X);
+ if (t % 4 >= 2)
+ ccv_flip(image, 0, 0, CCV_FLIP_Y);
+ ccv_bbf_param_t params = { .interval = 3, .min_neighbors = 0, .accurate = 1, .flags = 0, .size = cascade->size };
+ ccv_array_t* detected = ccv_bbf_detect_objects(image, &cascade, 1, params);
+ memset(idcheck, 0, ccv_min(detected->rnum, negperbg) * sizeof(int));
+ for (j = 0; j < ccv_min(detected->rnum, negperbg); j++)
+ {
+ int r = gsl_rng_uniform_int(rng, detected->rnum);
+ int flag = 1;
+ ccv_rect_t* rect = (ccv_rect_t*)ccv_array_get(detected, r);
+ while (flag) {
+ flag = 0;
+ for (k = 0; k < j; k++)
+ if (r == idcheck[k])
+ {
+ flag = 1;
+ r = gsl_rng_uniform_int(rng, detected->rnum);
+ break;
+ }
+ rect = (ccv_rect_t*)ccv_array_get(detected, r);
+ if ((rect->x < 0) || (rect->y < 0) || (rect->width + rect->x > image->cols) || (rect->height + rect->y > image->rows))
+ {
+ flag = 1;
+ r = gsl_rng_uniform_int(rng, detected->rnum);
+ }
+ }
+ idcheck[j] = r;
+ ccv_dense_matrix_t* temp = 0;
+ ccv_dense_matrix_t* imgs0 = 0;
+ ccv_dense_matrix_t* imgs1 = 0;
+ ccv_dense_matrix_t* imgs2 = 0;
+ ccv_slice(image, (ccv_matrix_t**)&temp, 0, rect->y, rect->x, rect->height, rect->width);
+ ccv_resample(temp, &imgs0, 0, imgsz.height, imgsz.width, CCV_INTER_AREA);
+ assert(imgs0->step == steps[0]);
+ ccv_matrix_free(temp);
+ ccv_sample_down(imgs0, &imgs1, 0, 0, 0);
+ assert(imgs1->step == steps[1]);
+ ccv_sample_down(imgs1, &imgs2, 0, 0, 0);
+ assert(imgs2->step == steps[2]);
+
+ negdata[negtotal] = (unsigned char*)ccmalloc(isizs0 + isizs1 + isizs2);
+ unsigned char* u8s0 = negdata[negtotal];
+ unsigned char* u8s1 = negdata[negtotal] + isizs0;
+ unsigned char* u8s2 = negdata[negtotal] + isizs0 + isizs1;
+ unsigned char* u8[] = { u8s0, u8s1, u8s2 };
+ memcpy(u8s0, imgs0->data.u8, imgs0->rows * imgs0->step);
+ ccv_matrix_free(imgs0);
+ memcpy(u8s1, imgs1->data.u8, imgs1->rows * imgs1->step);
+ ccv_matrix_free(imgs1);
+ memcpy(u8s2, imgs2->data.u8, imgs2->rows * imgs2->step);
+ ccv_matrix_free(imgs2);
+
+ flag = 1;
+ ccv_bbf_stage_classifier_t* classifier = cascade->stage_classifier;
+ for (k = 0; k < cascade->count; ++k, ++classifier)
+ {
+ float sum = 0;
+ float* alpha = classifier->alpha;
+ ccv_bbf_feature_t* feature = classifier->feature;
+ for (q = 0; q < classifier->count; ++q, alpha += 2, ++feature)
+ sum += alpha[_ccv_run_bbf_feature(feature, steps, u8)];
+ if (sum < classifier->threshold)
+ {
+ flag = 0;
+ break;
+ }
+ }
+ if (!flag)
+ ccfree(negdata[negtotal]);
+ else {
+ ++negtotal;
+ if (negtotal >= negnum)
+ break;
+ }
+ }
+ ccv_array_free(detected);
+ ccv_matrix_free(image);
+ ccv_drain_cache();
+ PRINT(CCV_CLI_INFO, "\rpreparing negative data ... %2d%%", 100 * negtotal / negnum);
+ fflush(0);
+ if (negtotal >= negnum)
+ break;
+ }
+ if (rneg == negtotal)
+ break;
+ rneg = negtotal;
+ PRINT(CCV_CLI_INFO, "\nentering additional round %d\n", t + 1);
+ }
+ gsl_rng_free(rng);
+ ccfree(idcheck);
+ ccv_drain_cache();
+ PRINT(CCV_CLI_INFO, "\n");
+ return negtotal;
+}
+
+static void _ccv_prepare_positive_data(ccv_dense_matrix_t** posimg, unsigned char** posdata, ccv_size_t size, int posnum)
+{
+ PRINT(CCV_CLI_INFO, "preparing positive data ... 0%%");
+ int i;
+ for (i = 0; i < posnum; i++)
+ {
+ ccv_dense_matrix_t* imgs0 = posimg[i];
+ ccv_dense_matrix_t* imgs1 = 0;
+ ccv_dense_matrix_t* imgs2 = 0;
+ assert((imgs0->type & CCV_C1) && (imgs0->type & CCV_8U) && imgs0->rows == size.height && imgs0->cols == size.width);
+ ccv_sample_down(imgs0, &imgs1, 0, 0, 0);
+ ccv_sample_down(imgs1, &imgs2, 0, 0, 0);
+ int isizs0 = imgs0->rows * imgs0->step;
+ int isizs1 = imgs1->rows * imgs1->step;
+ int isizs2 = imgs2->rows * imgs2->step;
+
+ posdata[i] = (unsigned char*)ccmalloc(isizs0 + isizs1 + isizs2);
+ memcpy(posdata[i], imgs0->data.u8, isizs0);
+ memcpy(posdata[i] + isizs0, imgs1->data.u8, isizs1);
+ memcpy(posdata[i] + isizs0 + isizs1, imgs2->data.u8, isizs2);
+
+ PRINT(CCV_CLI_INFO, "\rpreparing positive data ... %2d%%", 100 * (i + 1) / posnum);
+ fflush(0);
+
+ ccv_matrix_free(imgs1);
+ ccv_matrix_free(imgs2);
+ }
+ ccv_drain_cache();
+ PRINT(CCV_CLI_INFO, "\n");
+}
+
+typedef struct {
+ double fitness;
+ int pk, nk;
+ int age;
+ double error;
+ ccv_bbf_feature_t feature;
+} ccv_bbf_gene_t;
+
+static inline void _ccv_bbf_genetic_fitness(ccv_bbf_gene_t* gene)
+{
+ gene->fitness = (1 - gene->error) * exp(-0.01 * gene->age) * exp((gene->pk + gene->nk) * log(1.015));
+}
+
+static inline int _ccv_bbf_exist_gene_feature(ccv_bbf_gene_t* gene, int x, int y, int z)
+{
+ int i;
+ for (i = 0; i < gene->pk; i++)
+ if (z == gene->feature.pz[i] && x == gene->feature.px[i] && y == gene->feature.py[i])
+ return 1;
+ for (i = 0; i < gene->nk; i++)
+ if (z == gene->feature.nz[i] && x == gene->feature.nx[i] && y == gene->feature.ny[i])
+ return 1;
+ return 0;
+}
+
+static inline void _ccv_bbf_randomize_gene(gsl_rng* rng, ccv_bbf_gene_t* gene, int* rows, int* cols)
+{
+ int i;
+ do {
+ gene->pk = gsl_rng_uniform_int(rng, CCV_BBF_POINT_MAX - 1) + 1;
+ gene->nk = gsl_rng_uniform_int(rng, CCV_BBF_POINT_MAX - 1) + 1;
+ } while (gene->pk + gene->nk < CCV_BBF_POINT_MIN); /* a hard restriction of at least 3 points have to be examed */
+ gene->feature.size = ccv_max(gene->pk, gene->nk);
+ gene->age = 0;
+ for (i = 0; i < CCV_BBF_POINT_MAX; i++)
+ {
+ gene->feature.pz[i] = -1;
+ gene->feature.nz[i] = -1;
+ }
+ int x, y, z;
+ for (i = 0; i < gene->pk; i++)
+ {
+ do {
+ z = gsl_rng_uniform_int(rng, 3);
+ x = gsl_rng_uniform_int(rng, cols[z]);
+ y = gsl_rng_uniform_int(rng, rows[z]);
+ } while (_ccv_bbf_exist_gene_feature(gene, x, y, z));
+ gene->feature.pz[i] = z;
+ gene->feature.px[i] = x;
+ gene->feature.py[i] = y;
+ }
+ for (i = 0; i < gene->nk; i++)
+ {
+ do {
+ z = gsl_rng_uniform_int(rng, 3);
+ x = gsl_rng_uniform_int(rng, cols[z]);
+ y = gsl_rng_uniform_int(rng, rows[z]);
+ } while ( _ccv_bbf_exist_gene_feature(gene, x, y, z));
+ gene->feature.nz[i] = z;
+ gene->feature.nx[i] = x;
+ gene->feature.ny[i] = y;
+ }
+}
+
+static inline double _ccv_bbf_error_rate(ccv_bbf_feature_t* feature, unsigned char** posdata, int posnum, unsigned char** negdata, int negnum, ccv_size_t size, double* pw, double* nw)
+{
+ int i;
+ int steps[] = { _ccv_width_padding(size.width),
+ _ccv_width_padding(size.width >> 1),
+ _ccv_width_padding(size.width >> 2) };
+ int isizs0 = steps[0] * size.height;
+ int isizs01 = isizs0 + steps[1] * (size.height >> 1);
+ double error = 0;
+ for (i = 0; i < posnum; i++)
+ {
+ unsigned char* u8[] = { posdata[i], posdata[i] + isizs0, posdata[i] + isizs01 };
+ if (!_ccv_run_bbf_feature(feature, steps, u8))
+ error += pw[i];
+ }
+ for (i = 0; i < negnum; i++)
+ {
+ unsigned char* u8[] = { negdata[i], negdata[i] + isizs0, negdata[i] + isizs01 };
+ if ( _ccv_run_bbf_feature(feature, steps, u8))
+ error += nw[i];
+ }
+ return error;
+}
+
+#define less_than(fit1, fit2, aux) ((fit1).fitness >= (fit2).fitness)
+static CCV_IMPLEMENT_QSORT(_ccv_bbf_genetic_qsort, ccv_bbf_gene_t, less_than)
+#undef less_than
+
+static ccv_bbf_feature_t _ccv_bbf_genetic_optimize(unsigned char** posdata, int posnum, unsigned char** negdata, int negnum, int ftnum, ccv_size_t size, double* pw, double* nw)
+{
+ ccv_bbf_feature_t best;
+ /* seed (random method) */
+ gsl_rng_env_setup();
+ gsl_rng* rng = gsl_rng_alloc(gsl_rng_default);
+ union { unsigned long int li; double db; } dbli;
+ dbli.db = pw[0] + nw[0];
+ gsl_rng_set(rng, dbli.li);
+ int i, j;
+ int pnum = ftnum * 100;
+ assert(pnum > 0);
+ ccv_bbf_gene_t* gene = (ccv_bbf_gene_t*)ccmalloc(pnum * sizeof(ccv_bbf_gene_t));
+ int rows[] = { size.height, size.height >> 1, size.height >> 2 };
+ int cols[] = { size.width, size.width >> 1, size.width >> 2 };
+ for (i = 0; i < pnum; i++)
+ _ccv_bbf_randomize_gene(rng, &gene[i], rows, cols);
+ unsigned int timer = _ccv_bbf_time_measure();
+#ifdef USE_OPENMP
+#pragma omp parallel for private(i) schedule(dynamic)
+#endif
+ for (i = 0; i < pnum; i++)
+ gene[i].error = _ccv_bbf_error_rate(&gene[i].feature, posdata, posnum, negdata, negnum, size, pw, nw);
+ timer = _ccv_bbf_time_measure() - timer;
+ for (i = 0; i < pnum; i++)
+ _ccv_bbf_genetic_fitness(&gene[i]);
+ double best_err = 1;
+ int rnum = ftnum * 39; /* number of randomize */
+ int mnum = ftnum * 40; /* number of mutation */
+ int hnum = ftnum * 20; /* number of hybrid */
+ /* iteration stop crit : best no change in 40 iterations */
+ int it = 0, t;
+ for (t = 0 ; it < 40; ++it, ++t)
+ {
+ int min_id = 0;
+ double min_err = gene[0].error;
+ for (i = 1; i < pnum; i++)
+ if (gene[i].error < min_err)
+ {
+ min_id = i;
+ min_err = gene[i].error;
+ }
+ min_err = gene[min_id].error = _ccv_bbf_error_rate(&gene[min_id].feature, posdata, posnum, negdata, negnum, size, pw, nw);
+ if (min_err < best_err)
+ {
+ best_err = min_err;
+ memcpy(&best, &gene[min_id].feature, sizeof(best));
+ PRINT(CCV_CLI_INFO, "best bbf feature with error %f\n|-size: %d\n|-positive point: ", best_err, best.size);
+ for (i = 0; i < best.size; i++)
+ PRINT(CCV_CLI_INFO, "(%d %d %d), ", best.px[i], best.py[i], best.pz[i]);
+ PRINT(CCV_CLI_INFO, "\n|-negative point: ");
+ for (i = 0; i < best.size; i++)
+ PRINT(CCV_CLI_INFO, "(%d %d %d), ", best.nx[i], best.ny[i], best.nz[i]);
+ PRINT(CCV_CLI_INFO, "\n");
+ it = 0;
+ }
+ PRINT(CCV_CLI_INFO, "minimum error achieved in round %d(%d) : %f with %d ms\n", t, it, min_err, timer / 1000);
+ _ccv_bbf_genetic_qsort(gene, pnum, 0);
+ for (i = 0; i < ftnum; i++)
+ ++gene[i].age;
+ for (i = ftnum; i < ftnum + mnum; i++)
+ {
+ int parent = gsl_rng_uniform_int(rng, ftnum);
+ memcpy(gene + i, gene + parent, sizeof(ccv_bbf_gene_t));
+ /* three mutation strategy : 1. add, 2. remove, 3. refine */
+ int pnm, pn = gsl_rng_uniform_int(rng, 2);
+ int* pnk[] = { &gene[i].pk, &gene[i].nk };
+ int* pnx[] = { gene[i].feature.px, gene[i].feature.nx };
+ int* pny[] = { gene[i].feature.py, gene[i].feature.ny };
+ int* pnz[] = { gene[i].feature.pz, gene[i].feature.nz };
+ int x, y, z;
+ int victim, decay = 1;
+ do {
+ switch (gsl_rng_uniform_int(rng, 3))
+ {
+ case 0: /* add */
+ if (gene[i].pk == CCV_BBF_POINT_MAX && gene[i].nk == CCV_BBF_POINT_MAX)
+ break;
+ while (*pnk[pn] + 1 > CCV_BBF_POINT_MAX)
+ pn = gsl_rng_uniform_int(rng, 2);
+ do {
+ z = gsl_rng_uniform_int(rng, 3);
+ x = gsl_rng_uniform_int(rng, cols[z]);
+ y = gsl_rng_uniform_int(rng, rows[z]);
+ } while (_ccv_bbf_exist_gene_feature(&gene[i], x, y, z));
+ pnz[pn][*pnk[pn]] = z;
+ pnx[pn][*pnk[pn]] = x;
+ pny[pn][*pnk[pn]] = y;
+ ++(*pnk[pn]);
+ gene[i].feature.size = ccv_max(gene[i].pk, gene[i].nk);
+ decay = gene[i].age = 0;
+ break;
+ case 1: /* remove */
+ if (gene[i].pk + gene[i].nk <= CCV_BBF_POINT_MIN) /* at least 3 points have to be examed */
+ break;
+ while (*pnk[pn] - 1 <= 0) // || *pnk[pn] + *pnk[!pn] - 1 < CCV_BBF_POINT_MIN)
+ pn = gsl_rng_uniform_int(rng, 2);
+ victim = gsl_rng_uniform_int(rng, *pnk[pn]);
+ for (j = victim; j < *pnk[pn] - 1; j++)
+ {
+ pnz[pn][j] = pnz[pn][j + 1];
+ pnx[pn][j] = pnx[pn][j + 1];
+ pny[pn][j] = pny[pn][j + 1];
+ }
+ pnz[pn][*pnk[pn] - 1] = -1;
+ --(*pnk[pn]);
+ gene[i].feature.size = ccv_max(gene[i].pk, gene[i].nk);
+ decay = gene[i].age = 0;
+ break;
+ case 2: /* refine */
+ pnm = gsl_rng_uniform_int(rng, *pnk[pn]);
+ do {
+ z = gsl_rng_uniform_int(rng, 3);
+ x = gsl_rng_uniform_int(rng, cols[z]);
+ y = gsl_rng_uniform_int(rng, rows[z]);
+ } while (_ccv_bbf_exist_gene_feature(&gene[i], x, y, z));
+ pnz[pn][pnm] = z;
+ pnx[pn][pnm] = x;
+ pny[pn][pnm] = y;
+ decay = gene[i].age = 0;
+ break;
+ }
+ } while (decay);
+ }
+ for (i = ftnum + mnum; i < ftnum + mnum + hnum; i++)
+ {
+ /* hybrid strategy: taking positive points from dad, negative points from mum */
+ int dad, mum;
+ do {
+ dad = gsl_rng_uniform_int(rng, ftnum);
+ mum = gsl_rng_uniform_int(rng, ftnum);
+ } while (dad == mum || gene[dad].pk + gene[mum].nk < CCV_BBF_POINT_MIN); /* at least 3 points have to be examed */
+ for (j = 0; j < CCV_BBF_POINT_MAX; j++)
+ {
+ gene[i].feature.pz[j] = -1;
+ gene[i].feature.nz[j] = -1;
+ }
+ gene[i].pk = gene[dad].pk;
+ for (j = 0; j < gene[i].pk; j++)
+ {
+ gene[i].feature.pz[j] = gene[dad].feature.pz[j];
+ gene[i].feature.px[j] = gene[dad].feature.px[j];
+ gene[i].feature.py[j] = gene[dad].feature.py[j];
+ }
+ gene[i].nk = gene[mum].nk;
+ for (j = 0; j < gene[i].nk; j++)
+ {
+ gene[i].feature.nz[j] = gene[mum].feature.nz[j];
+ gene[i].feature.nx[j] = gene[mum].feature.nx[j];
+ gene[i].feature.ny[j] = gene[mum].feature.ny[j];
+ }
+ gene[i].feature.size = ccv_max(gene[i].pk, gene[i].nk);
+ gene[i].age = 0;
+ }
+ for (i = ftnum + mnum + hnum; i < ftnum + mnum + hnum + rnum; i++)
+ _ccv_bbf_randomize_gene(rng, &gene[i], rows, cols);
+ timer = _ccv_bbf_time_measure();
+#ifdef USE_OPENMP
+#pragma omp parallel for private(i) schedule(dynamic)
+#endif
+ for (i = 0; i < pnum; i++)
+ gene[i].error = _ccv_bbf_error_rate(&gene[i].feature, posdata, posnum, negdata, negnum, size, pw, nw);
+ timer = _ccv_bbf_time_measure() - timer;
+ for (i = 0; i < pnum; i++)
+ _ccv_bbf_genetic_fitness(&gene[i]);
+ }
+ ccfree(gene);
+ gsl_rng_free(rng);
+ return best;
+}
+
+#define less_than(fit1, fit2, aux) ((fit1).error < (fit2).error)
+static CCV_IMPLEMENT_QSORT(_ccv_bbf_best_qsort, ccv_bbf_gene_t, less_than)
+#undef less_than
+
+static ccv_bbf_gene_t _ccv_bbf_best_gene(ccv_bbf_gene_t* gene, int pnum, int point_min, unsigned char** posdata, int posnum, unsigned char** negdata, int negnum, ccv_size_t size, double* pw, double* nw)
+{
+ int i;
+ unsigned int timer = _ccv_bbf_time_measure();
+#ifdef USE_OPENMP
+#pragma omp parallel for private(i) schedule(dynamic)
+#endif
+ for (i = 0; i < pnum; i++)
+ gene[i].error = _ccv_bbf_error_rate(&gene[i].feature, posdata, posnum, negdata, negnum, size, pw, nw);
+ timer = _ccv_bbf_time_measure() - timer;
+ _ccv_bbf_best_qsort(gene, pnum, 0);
+ int min_id = 0;
+ double min_err = gene[0].error;
+ for (i = 0; i < pnum; i++)
+ if (gene[i].nk + gene[i].pk >= point_min)
+ {
+ min_id = i;
+ min_err = gene[i].error;
+ break;
+ }
+ PRINT(CCV_CLI_INFO, "local best bbf feature with error %f\n|-size: %d\n|-positive point: ", min_err, gene[min_id].feature.size);
+ for (i = 0; i < gene[min_id].feature.size; i++)
+ PRINT(CCV_CLI_INFO, "(%d %d %d), ", gene[min_id].feature.px[i], gene[min_id].feature.py[i], gene[min_id].feature.pz[i]);
+ PRINT(CCV_CLI_INFO, "\n|-negative point: ");
+ for (i = 0; i < gene[min_id].feature.size; i++)
+ PRINT(CCV_CLI_INFO, "(%d %d %d), ", gene[min_id].feature.nx[i], gene[min_id].feature.ny[i], gene[min_id].feature.nz[i]);
+ PRINT(CCV_CLI_INFO, "\nthe computation takes %d ms\n", timer / 1000);
+ return gene[min_id];
+}
+
+static ccv_bbf_feature_t _ccv_bbf_convex_optimize(unsigned char** posdata, int posnum, unsigned char** negdata, int negnum, ccv_bbf_feature_t* best_feature, ccv_size_t size, double* pw, double* nw)
+{
+ ccv_bbf_gene_t best_gene;
+ /* seed (random method) */
+ gsl_rng_env_setup();
+ gsl_rng* rng = gsl_rng_alloc(gsl_rng_default);
+ union { unsigned long int li; double db; } dbli;
+ dbli.db = pw[0] + nw[0];
+ gsl_rng_set(rng, dbli.li);
+ int i, j, k, q, p, g, t;
+ int rows[] = { size.height, size.height >> 1, size.height >> 2 };
+ int cols[] = { size.width, size.width >> 1, size.width >> 2 };
+ int pnum = rows[0] * cols[0] + rows[1] * cols[1] + rows[2] * cols[2];
+ ccv_bbf_gene_t* gene = (ccv_bbf_gene_t*)ccmalloc((pnum * (CCV_BBF_POINT_MAX * 2 + 1) * 2 + CCV_BBF_POINT_MAX * 2 + 1) * sizeof(ccv_bbf_gene_t));
+ if (best_feature == 0)
+ {
+ /* bootstrapping the best feature, start from two pixels, one for positive, one for negative
+ * the bootstrapping process go like this: first, it will assign a random pixel as positive
+ * and enumerate every possible pixel as negative, and pick the best one. Then, enumerate every
+ * possible pixel as positive, and pick the best one, until it converges */
+ memset(&best_gene, 0, sizeof(ccv_bbf_gene_t));
+ for (i = 0; i < CCV_BBF_POINT_MAX; i++)
+ best_gene.feature.pz[i] = best_gene.feature.nz[i] = -1;
+ best_gene.pk = 1;
+ best_gene.nk = 0;
+ best_gene.feature.size = 1;
+ best_gene.feature.pz[0] = gsl_rng_uniform_int(rng, 3);
+ best_gene.feature.px[0] = gsl_rng_uniform_int(rng, cols[best_gene.feature.pz[0]]);
+ best_gene.feature.py[0] = gsl_rng_uniform_int(rng, rows[best_gene.feature.pz[0]]);
+ for (t = 0; ; ++t)
+ {
+ g = 0;
+ if (t % 2 == 0)
+ {
+ for (i = 0; i < 3; i++)
+ for (j = 0; j < cols[i]; j++)
+ for (k = 0; k < rows[i]; k++)
+ if (i != best_gene.feature.pz[0] || j != best_gene.feature.px[0] || k != best_gene.feature.py[0])
+ {
+ gene[g] = best_gene;
+ gene[g].pk = gene[g].nk = 1;
+ gene[g].feature.nz[0] = i;
+ gene[g].feature.nx[0] = j;
+ gene[g].feature.ny[0] = k;
+ g++;
+ }
+ } else {
+ for (i = 0; i < 3; i++)
+ for (j = 0; j < cols[i]; j++)
+ for (k = 0; k < rows[i]; k++)
+ if (i != best_gene.feature.nz[0] || j != best_gene.feature.nx[0] || k != best_gene.feature.ny[0])
+ {
+ gene[g] = best_gene;
+ gene[g].pk = gene[g].nk = 1;
+ gene[g].feature.pz[0] = i;
+ gene[g].feature.px[0] = j;
+ gene[g].feature.py[0] = k;
+ g++;
+ }
+ }
+ PRINT(CCV_CLI_INFO, "bootstrapping round : %d\n", t);
+ ccv_bbf_gene_t local_gene = _ccv_bbf_best_gene(gene, g, 2, posdata, posnum, negdata, negnum, size, pw, nw);
+ if (local_gene.error >= best_gene.error - 1e-10)
+ break;
+ best_gene = local_gene;
+ }
+ } else {
+ best_gene.feature = *best_feature;
+ best_gene.pk = best_gene.nk = best_gene.feature.size;
+ for (i = 0; i < CCV_BBF_POINT_MAX; i++)
+ if (best_feature->pz[i] == -1)
+ {
+ best_gene.pk = i;
+ break;
+ }
+ for (i = 0; i < CCV_BBF_POINT_MAX; i++)
+ if (best_feature->nz[i] == -1)
+ {
+ best_gene.nk = i;
+ break;
+ }
+ }
+ /* after bootstrapping, the float search technique will do the following permutations:
+ * a). add a new point to positive or negative
+ * b). remove a point from positive or negative
+ * c). move an existing point in positive or negative to another position
+ * the three rules applied exhaustively, no heuristic used. */
+ for (t = 0; ; ++t)
+ {
+ g = 0;
+ for (i = 0; i < 3; i++)
+ for (j = 0; j < cols[i]; j++)
+ for (k = 0; k < rows[i]; k++)
+ if (!_ccv_bbf_exist_gene_feature(&best_gene, j, k, i))
+ {
+ /* add positive point */
+ if (best_gene.pk < CCV_BBF_POINT_MAX - 1)
+ {
+ gene[g] = best_gene;
+ gene[g].feature.pz[gene[g].pk] = i;
+ gene[g].feature.px[gene[g].pk] = j;
+ gene[g].feature.py[gene[g].pk] = k;
+ gene[g].pk++;
+ gene[g].feature.size = ccv_max(gene[g].pk, gene[g].nk);
+ g++;
+ }
+ /* add negative point */
+ if (best_gene.nk < CCV_BBF_POINT_MAX - 1)
+ {
+ gene[g] = best_gene;
+ gene[g].feature.nz[gene[g].nk] = i;
+ gene[g].feature.nx[gene[g].nk] = j;
+ gene[g].feature.ny[gene[g].nk] = k;
+ gene[g].nk++;
+ gene[g].feature.size = ccv_max(gene[g].pk, gene[g].nk);
+ g++;
+ }
+ /* refine positive point */
+ for (q = 0; q < best_gene.pk; q++)
+ {
+ gene[g] = best_gene;
+ gene[g].feature.pz[q] = i;
+ gene[g].feature.px[q] = j;
+ gene[g].feature.py[q] = k;
+ g++;
+ }
+ /* add positive point, remove negative point */
+ if (best_gene.pk < CCV_BBF_POINT_MAX - 1 && best_gene.nk > 1)
+ {
+ for (q = 0; q < best_gene.nk; q++)
+ {
+ gene[g] = best_gene;
+ gene[g].feature.pz[gene[g].pk] = i;
+ gene[g].feature.px[gene[g].pk] = j;
+ gene[g].feature.py[gene[g].pk] = k;
+ gene[g].pk++;
+ for (p = q; p < best_gene.nk - 1; p++)
+ {
+ gene[g].feature.nz[p] = gene[g].feature.nz[p + 1];
+ gene[g].feature.nx[p] = gene[g].feature.nx[p + 1];
+ gene[g].feature.ny[p] = gene[g].feature.ny[p + 1];
+ }
+ gene[g].feature.nz[gene[g].nk - 1] = -1;
+ gene[g].nk--;
+ gene[g].feature.size = ccv_max(gene[g].pk, gene[g].nk);
+ g++;
+ }
+ }
+ /* refine negative point */
+ for (q = 0; q < best_gene.nk; q++)
+ {
+ gene[g] = best_gene;
+ gene[g].feature.nz[q] = i;
+ gene[g].feature.nx[q] = j;
+ gene[g].feature.ny[q] = k;
+ g++;
+ }
+ /* add negative point, remove positive point */
+ if (best_gene.pk > 1 && best_gene.nk < CCV_BBF_POINT_MAX - 1)
+ {
+ for (q = 0; q < best_gene.pk; q++)
+ {
+ gene[g] = best_gene;
+ gene[g].feature.nz[gene[g].nk] = i;
+ gene[g].feature.nx[gene[g].nk] = j;
+ gene[g].feature.ny[gene[g].nk] = k;
+ gene[g].nk++;
+ for (p = q; p < best_gene.pk - 1; p++)
+ {
+ gene[g].feature.pz[p] = gene[g].feature.pz[p + 1];
+ gene[g].feature.px[p] = gene[g].feature.px[p + 1];
+ gene[g].feature.py[p] = gene[g].feature.py[p + 1];
+ }
+ gene[g].feature.pz[gene[g].pk - 1] = -1;
+ gene[g].pk--;
+ gene[g].feature.size = ccv_max(gene[g].pk, gene[g].nk);
+ g++;
+ }
+ }
+ }
+ if (best_gene.pk > 1)
+ for (q = 0; q < best_gene.pk; q++)
+ {
+ gene[g] = best_gene;
+ for (i = q; i < best_gene.pk - 1; i++)
+ {
+ gene[g].feature.pz[i] = gene[g].feature.pz[i + 1];
+ gene[g].feature.px[i] = gene[g].feature.px[i + 1];
+ gene[g].feature.py[i] = gene[g].feature.py[i + 1];
+ }
+ gene[g].feature.pz[gene[g].pk - 1] = -1;
+ gene[g].pk--;
+ gene[g].feature.size = ccv_max(gene[g].pk, gene[g].nk);
+ g++;
+ }
+ if (best_gene.nk > 1)
+ for (q = 0; q < best_gene.nk; q++)
+ {
+ gene[g] = best_gene;
+ for (i = q; i < best_gene.nk - 1; i++)
+ {
+ gene[g].feature.nz[i] = gene[g].feature.nz[i + 1];
+ gene[g].feature.nx[i] = gene[g].feature.nx[i + 1];
+ gene[g].feature.ny[i] = gene[g].feature.ny[i + 1];
+ }
+ gene[g].feature.nz[gene[g].nk - 1] = -1;
+ gene[g].nk--;
+ gene[g].feature.size = ccv_max(gene[g].pk, gene[g].nk);
+ g++;
+ }
+ gene[g] = best_gene;
+ g++;
+ PRINT(CCV_CLI_INFO, "float search round : %d\n", t);
+ ccv_bbf_gene_t local_gene = _ccv_bbf_best_gene(gene, g, CCV_BBF_POINT_MIN, posdata, posnum, negdata, negnum, size, pw, nw);
+ if (local_gene.error >= best_gene.error - 1e-10)
+ break;
+ best_gene = local_gene;
+ }
+ ccfree(gene);
+ gsl_rng_free(rng);
+ return best_gene.feature;
+}
+
+static int _ccv_write_bbf_stage_classifier(const char* file, ccv_bbf_stage_classifier_t* classifier)
+{
+ FILE* w = fopen(file, "wb");
+ if (w == 0) return -1;
+ fprintf(w, "%d\n", classifier->count);
+ union { float fl; int i; } fli;
+ fli.fl = classifier->threshold;
+ fprintf(w, "%d\n", fli.i);
+ int i, j;
+ for (i = 0; i < classifier->count; i++)
+ {
+ fprintf(w, "%d\n", classifier->feature[i].size);
+ for (j = 0; j < classifier->feature[i].size; j++)
+ {
+ fprintf(w, "%d %d %d\n", classifier->feature[i].px[j], classifier->feature[i].py[j], classifier->feature[i].pz[j]);
+ fprintf(w, "%d %d %d\n", classifier->feature[i].nx[j], classifier->feature[i].ny[j], classifier->feature[i].nz[j]);
+ }
+ union { float fl; int i; } flia, flib;
+ flia.fl = classifier->alpha[i * 2];
+ flib.fl = classifier->alpha[i * 2 + 1];
+ fprintf(w, "%d %d\n", flia.i, flib.i);
+ }
+ fclose(w);
+ return 0;
+}
+
+static int _ccv_read_background_data(const char* file, unsigned char** negdata, int* negnum, ccv_size_t size)
+{
+ int stat = 0;
+ FILE* r = fopen(file, "rb");
+ if (r == 0) return -1;
+ stat |= fread(negnum, sizeof(int), 1, r);
+ int i;
+ int isizs012 = _ccv_width_padding(size.width) * size.height +
+ _ccv_width_padding(size.width >> 1) * (size.height >> 1) +
+ _ccv_width_padding(size.width >> 2) * (size.height >> 2);
+ for (i = 0; i < *negnum; i++)
+ {
+ negdata[i] = (unsigned char*)ccmalloc(isizs012);
+ stat |= fread(negdata[i], 1, isizs012, r);
+ }
+ fclose(r);
+ return 0;
+}
+
+static int _ccv_write_background_data(const char* file, unsigned char** negdata, int negnum, ccv_size_t size)
+{
+ FILE* w = fopen(file, "w");
+ if (w == 0) return -1;
+ fwrite(&negnum, sizeof(int), 1, w);
+ int i;
+ int isizs012 = _ccv_width_padding(size.width) * size.height +
+ _ccv_width_padding(size.width >> 1) * (size.height >> 1) +
+ _ccv_width_padding(size.width >> 2) * (size.height >> 2);
+ for (i = 0; i < negnum; i++)
+ fwrite(negdata[i], 1, isizs012, w);
+ fclose(w);
+ return 0;
+}
+
+static int _ccv_resume_bbf_cascade_training_state(const char* file, int* i, int* k, int* bg, double* pw, double* nw, int posnum, int negnum)
+{
+ int stat = 0;
+ FILE* r = fopen(file, "r");
+ if (r == 0) return -1;
+ stat |= fscanf(r, "%d %d %d", i, k, bg);
+ int j;
+ union { double db; int i[2]; } dbi;
+ for (j = 0; j < posnum; j++)
+ {
+ stat |= fscanf(r, "%d %d", &dbi.i[0], &dbi.i[1]);
+ pw[j] = dbi.db;
+ }
+ for (j = 0; j < negnum; j++)
+ {
+ stat |= fscanf(r, "%d %d", &dbi.i[0], &dbi.i[1]);
+ nw[j] = dbi.db;
+ }
+ fclose(r);
+ return 0;
+}
+
+static int _ccv_save_bbf_cacade_training_state(const char* file, int i, int k, int bg, double* pw, double* nw, int posnum, int negnum)
+{
+ FILE* w = fopen(file, "w");
+ if (w == 0) return -1;
+ fprintf(w, "%d %d %d\n", i, k, bg);
+ int j;
+ union { double db; int i[2]; } dbi;
+ for (j = 0; j < posnum; ++j)
+ {
+ dbi.db = pw[j];
+ fprintf(w, "%d %d ", dbi.i[0], dbi.i[1]);
+ }
+ fprintf(w, "\n");
+ for (j = 0; j < negnum; ++j)
+ {
+ dbi.db = nw[j];
+ fprintf(w, "%d %d ", dbi.i[0], dbi.i[1]);
+ }
+ fprintf(w, "\n");
+ fclose(w);
+ return 0;
+}
+
+void ccv_bbf_classifier_cascade_new(ccv_dense_matrix_t** posimg, int posnum, char** bgfiles, int bgnum, int negnum, ccv_size_t size, const char* dir, ccv_bbf_new_param_t params)
+{
+ int i, j, k;
+ /* allocate memory for usage */
+ ccv_bbf_classifier_cascade_t* cascade = (ccv_bbf_classifier_cascade_t*)ccmalloc(sizeof(ccv_bbf_classifier_cascade_t));
+ cascade->count = 0;
+ cascade->size = size;
+ cascade->stage_classifier = (ccv_bbf_stage_classifier_t*)ccmalloc(sizeof(ccv_bbf_stage_classifier_t));
+ unsigned char** posdata = (unsigned char**)ccmalloc(posnum * sizeof(unsigned char*));
+ unsigned char** negdata = (unsigned char**)ccmalloc(negnum * sizeof(unsigned char*));
+ double* pw = (double*)ccmalloc(posnum * sizeof(double));
+ double* nw = (double*)ccmalloc(negnum * sizeof(double));
+ float* peval = (float*)ccmalloc(posnum * sizeof(float));
+ float* neval = (float*)ccmalloc(negnum * sizeof(float));
+ double inv_balance_k = 1. / params.balance_k;
+ /* balance factor k, and weighted with 0.01 */
+ params.balance_k *= 0.01;
+ inv_balance_k *= 0.01;
+
+ int steps[] = { _ccv_width_padding(cascade->size.width),
+ _ccv_width_padding(cascade->size.width >> 1),
+ _ccv_width_padding(cascade->size.width >> 2) };
+ int isizs0 = steps[0] * cascade->size.height;
+ int isizs01 = isizs0 + steps[1] * (cascade->size.height >> 1);
+
+ i = 0;
+ k = 0;
+ int bg = 0;
+ int cacheK = 10;
+ /* state resume code */
+ char buf[1024];
+ sprintf(buf, "%s/stat.txt", dir);
+ _ccv_resume_bbf_cascade_training_state(buf, &i, &k, &bg, pw, nw, posnum, negnum);
+ if (i > 0)
+ {
+ cascade->count = i;
+ ccfree(cascade->stage_classifier);
+ cascade->stage_classifier = (ccv_bbf_stage_classifier_t*)ccmalloc(i * sizeof(ccv_bbf_stage_classifier_t));
+ for (j = 0; j < i; j++)
+ {
+ sprintf(buf, "%s/stage-%d.txt", dir, j);
+ _ccv_read_bbf_stage_classifier(buf, &cascade->stage_classifier[j]);
+ }
+ }
+ if (k > 0)
+ cacheK = k;
+ int rpos, rneg = 0;
+ if (bg)
+ {
+ sprintf(buf, "%s/negs.txt", dir);
+ _ccv_read_background_data(buf, negdata, &rneg, cascade->size);
+ }
+
+ for (; i < params.layer; i++)
+ {
+ if (!bg)
+ {
+ rneg = _ccv_prepare_background_data(cascade, bgfiles, bgnum, negdata, negnum);
+ /* save state of background data */
+ sprintf(buf, "%s/negs.txt", dir);
+ _ccv_write_background_data(buf, negdata, rneg, cascade->size);
+ bg = 1;
+ }
+ double totalw;
+ /* save state of cascade : level, weight etc. */
+ sprintf(buf, "%s/stat.txt", dir);
+ _ccv_save_bbf_cacade_training_state(buf, i, k, bg, pw, nw, posnum, negnum);
+ ccv_bbf_stage_classifier_t classifier;
+ if (k > 0)
+ {
+ /* resume state of classifier */
+ sprintf( buf, "%s/stage-%d.txt", dir, i );
+ _ccv_read_bbf_stage_classifier(buf, &classifier);
+ } else {
+ /* initialize classifier */
+ for (j = 0; j < posnum; j++)
+ pw[j] = params.balance_k;
+ for (j = 0; j < rneg; j++)
+ nw[j] = inv_balance_k;
+ classifier.count = k;
+ classifier.threshold = 0;
+ classifier.feature = (ccv_bbf_feature_t*)ccmalloc(cacheK * sizeof(ccv_bbf_feature_t));
+ classifier.alpha = (float*)ccmalloc(cacheK * 2 * sizeof(float));
+ }
+ _ccv_prepare_positive_data(posimg, posdata, cascade->size, posnum);
+ rpos = _ccv_prune_positive_data(cascade, posdata, posnum, cascade->size);
+ PRINT(CCV_CLI_INFO, "%d postivie data and %d negative data in training\n", rpos, rneg);
+ /* reweight to 1.00 */
+ totalw = 0;
+ for (j = 0; j < rpos; j++)
+ totalw += pw[j];
+ for (j = 0; j < rneg; j++)
+ totalw += nw[j];
+ for (j = 0; j < rpos; j++)
+ pw[j] = pw[j] / totalw;
+ for (j = 0; j < rneg; j++)
+ nw[j] = nw[j] / totalw;
+ for (; ; k++)
+ {
+ /* get overall true-positive, false-positive rate and threshold */
+ double tp = 0, fp = 0, etp = 0, efp = 0;
+ _ccv_bbf_eval_data(&classifier, posdata, rpos, negdata, rneg, cascade->size, peval, neval);
+ _ccv_sort_32f(peval, rpos, 0);
+ classifier.threshold = peval[(int)((1. - params.pos_crit) * rpos)] - 1e-6;
+ for (j = 0; j < rpos; j++)
+ {
+ if (peval[j] >= 0)
+ ++tp;
+ if (peval[j] >= classifier.threshold)
+ ++etp;
+ }
+ tp /= rpos; etp /= rpos;
+ for (j = 0; j < rneg; j++)
+ {
+ if (neval[j] >= 0)
+ ++fp;
+ if (neval[j] >= classifier.threshold)
+ ++efp;
+ }
+ fp /= rneg; efp /= rneg;
+ PRINT(CCV_CLI_INFO, "stage classifier real TP rate : %f, FP rate : %f\n", tp, fp);
+ PRINT(CCV_CLI_INFO, "stage classifier TP rate : %f, FP rate : %f at threshold : %f\n", etp, efp, classifier.threshold);
+ if (k > 0)
+ {
+ /* save classifier state */
+ sprintf(buf, "%s/stage-%d.txt", dir, i);
+ _ccv_write_bbf_stage_classifier(buf, &classifier);
+ sprintf(buf, "%s/stat.txt", dir);
+ _ccv_save_bbf_cacade_training_state(buf, i, k, bg, pw, nw, posnum, negnum);
+ }
+ if (etp > params.pos_crit && efp < params.neg_crit)
+ break;
+ /* TODO: more post-process is needed in here */
+
+ /* select the best feature in current distribution through genetic algorithm optimization */
+ ccv_bbf_feature_t best;
+ if (params.optimizer == CCV_BBF_GENETIC_OPT)
+ {
+ best = _ccv_bbf_genetic_optimize(posdata, rpos, negdata, rneg, params.feature_number, cascade->size, pw, nw);
+ } else if (params.optimizer == CCV_BBF_FLOAT_OPT) {
+ best = _ccv_bbf_convex_optimize(posdata, rpos, negdata, rneg, 0, cascade->size, pw, nw);
+ } else {
+ best = _ccv_bbf_genetic_optimize(posdata, rpos, negdata, rneg, params.feature_number, cascade->size, pw, nw);
+ best = _ccv_bbf_convex_optimize(posdata, rpos, negdata, rneg, &best, cascade->size, pw, nw);
+ }
+ double err = _ccv_bbf_error_rate(&best, posdata, rpos, negdata, rneg, cascade->size, pw, nw);
+ double rw = (1 - err) / err;
+ totalw = 0;
+ /* reweight */
+ for (j = 0; j < rpos; j++)
+ {
+ unsigned char* u8[] = { posdata[j], posdata[j] + isizs0, posdata[j] + isizs01 };
+ if (!_ccv_run_bbf_feature(&best, steps, u8))
+ pw[j] *= rw;
+ pw[j] *= params.balance_k;
+ totalw += pw[j];
+ }
+ for (j = 0; j < rneg; j++)
+ {
+ unsigned char* u8[] = { negdata[j], negdata[j] + isizs0, negdata[j] + isizs01 };
+ if (_ccv_run_bbf_feature(&best, steps, u8))
+ nw[j] *= rw;
+ nw[j] *= inv_balance_k;
+ totalw += nw[j];
+ }
+ for (j = 0; j < rpos; j++)
+ pw[j] = pw[j] / totalw;
+ for (j = 0; j < rneg; j++)
+ nw[j] = nw[j] / totalw;
+ double c = log(rw);
+ PRINT(CCV_CLI_INFO, "coefficient of feature %d: %f\n", k + 1, c);
+ classifier.count = k + 1;
+ /* resizing classifier */
+ if (k >= cacheK)
+ {
+ ccv_bbf_feature_t* feature = (ccv_bbf_feature_t*)ccmalloc(cacheK * 2 * sizeof(ccv_bbf_feature_t));
+ memcpy(feature, classifier.feature, cacheK * sizeof(ccv_bbf_feature_t));
+ ccfree(classifier.feature);
+ float* alpha = (float*)ccmalloc(cacheK * 4 * sizeof(float));
+ memcpy(alpha, classifier.alpha, cacheK * 2 * sizeof(float));
+ ccfree(classifier.alpha);
+ classifier.feature = feature;
+ classifier.alpha = alpha;
+ cacheK *= 2;
+ }
+ /* setup new feature */
+ classifier.feature[k] = best;
+ classifier.alpha[k * 2] = -c;
+ classifier.alpha[k * 2 + 1] = c;
+ }
+ cascade->count = i + 1;
+ ccv_bbf_stage_classifier_t* stage_classifier = (ccv_bbf_stage_classifier_t*)ccmalloc(cascade->count * sizeof(ccv_bbf_stage_classifier_t));
+ memcpy(stage_classifier, cascade->stage_classifier, i * sizeof(ccv_bbf_stage_classifier_t));
+ ccfree(cascade->stage_classifier);
+ stage_classifier[i] = classifier;
+ cascade->stage_classifier = stage_classifier;
+ k = 0;
+ bg = 0;
+ for (j = 0; j < rpos; j++)
+ ccfree(posdata[j]);
+ for (j = 0; j < rneg; j++)
+ ccfree(negdata[j]);
+ }
+
+ ccfree(neval);
+ ccfree(peval);
+ ccfree(nw);
+ ccfree(pw);
+ ccfree(negdata);
+ ccfree(posdata);
+ ccfree(cascade);
+}
+#else
+void ccv_bbf_classifier_cascade_new(ccv_dense_matrix_t** posimg, int posnum, char** bgfiles, int bgnum, int negnum, ccv_size_t size, const char* dir, ccv_bbf_new_param_t params)
+{
+ fprintf(stderr, " ccv_bbf_classifier_cascade_new requires libgsl support, please compile ccv with libgsl.\n");
+}
+#endif
+
+static int _ccv_is_equal(const void* _r1, const void* _r2, void* data)
+{
+ const ccv_comp_t* r1 = (const ccv_comp_t*)_r1;
+ const ccv_comp_t* r2 = (const ccv_comp_t*)_r2;
+ int distance = (int)(r1->rect.width * 0.25 + 0.5);
+
+ return r2->rect.x <= r1->rect.x + distance &&
+ r2->rect.x >= r1->rect.x - distance &&
+ r2->rect.y <= r1->rect.y + distance &&
+ r2->rect.y >= r1->rect.y - distance &&
+ r2->rect.width <= (int)(r1->rect.width * 1.5 + 0.5) &&
+ (int)(r2->rect.width * 1.5 + 0.5) >= r1->rect.width;
+}
+
+static int _ccv_is_equal_same_class(const void* _r1, const void* _r2, void* data)
+{
+ const ccv_comp_t* r1 = (const ccv_comp_t*)_r1;
+ const ccv_comp_t* r2 = (const ccv_comp_t*)_r2;
+ int distance = (int)(r1->rect.width * 0.25 + 0.5);
+
+ return r2->classification.id == r1->classification.id &&
+ r2->rect.x <= r1->rect.x + distance &&
+ r2->rect.x >= r1->rect.x - distance &&
+ r2->rect.y <= r1->rect.y + distance &&
+ r2->rect.y >= r1->rect.y - distance &&
+ r2->rect.width <= (int)(r1->rect.width * 1.5 + 0.5) &&
+ (int)(r2->rect.width * 1.5 + 0.5) >= r1->rect.width;
+}
+
+ccv_array_t* ccv_bbf_detect_objects(ccv_dense_matrix_t* a, ccv_bbf_classifier_cascade_t** _cascade, int count, ccv_bbf_param_t params)
+{
+ int hr = a->rows / params.size.height;
+ int wr = a->cols / params.size.width;
+ double scale = pow(2., 1. / (params.interval + 1.));
+ int next = params.interval + 1;
+ int scale_upto = (int)(log((double)ccv_min(hr, wr)) / log(scale));
+ ccv_dense_matrix_t** pyr = (ccv_dense_matrix_t**)alloca((scale_upto + next * 2) * 4 * sizeof(ccv_dense_matrix_t*));
+ memset(pyr, 0, (scale_upto + next * 2) * 4 * sizeof(ccv_dense_matrix_t*));
+ if (params.size.height != _cascade[0]->size.height || params.size.width != _cascade[0]->size.width)
+ ccv_resample(a, &pyr[0], 0, a->rows * _cascade[0]->size.height / params.size.height, a->cols * _cascade[0]->size.width / params.size.width, CCV_INTER_AREA);
+ else
+ pyr[0] = a;
+ int i, j, k, t, x, y, q;
+ for (i = 1; i < ccv_min(params.interval + 1, scale_upto + next * 2); i++)
+ ccv_resample(pyr[0], &pyr[i * 4], 0, (int)(pyr[0]->rows / pow(scale, i)), (int)(pyr[0]->cols / pow(scale, i)), CCV_INTER_AREA);
+ for (i = next; i < scale_upto + next * 2; i++)
+ ccv_sample_down(pyr[i * 4 - next * 4], &pyr[i * 4], 0, 0, 0);
+ if (params.accurate)
+ for (i = next * 2; i < scale_upto + next * 2; i++)
+ {
+ ccv_sample_down(pyr[i * 4 - next * 4], &pyr[i * 4 + 1], 0, 1, 0);
+ ccv_sample_down(pyr[i * 4 - next * 4], &pyr[i * 4 + 2], 0, 0, 1);
+ ccv_sample_down(pyr[i * 4 - next * 4], &pyr[i * 4 + 3], 0, 1, 1);
+ }
+ ccv_array_t* idx_seq;
+ ccv_array_t* seq = ccv_array_new(sizeof(ccv_comp_t), 64, 0);
+ ccv_array_t* seq2 = ccv_array_new(sizeof(ccv_comp_t), 64, 0);
+ ccv_array_t* result_seq = ccv_array_new(sizeof(ccv_comp_t), 64, 0);
+ /* detect in multi scale */
+ for (t = 0; t < count; t++)
+ {
+ ccv_bbf_classifier_cascade_t* cascade = _cascade[t];
+ float scale_x = (float) params.size.width / (float) cascade->size.width;
+ float scale_y = (float) params.size.height / (float) cascade->size.height;
+ ccv_array_clear(seq);
+ for (i = 0; i < scale_upto; i++)
+ {
+ int dx[] = {0, 1, 0, 1};
+ int dy[] = {0, 0, 1, 1};
+ int i_rows = pyr[i * 4 + next * 8]->rows - (cascade->size.height >> 2);
+ int steps[] = { pyr[i * 4]->step, pyr[i * 4 + next * 4]->step, pyr[i * 4 + next * 8]->step };
+ int i_cols = pyr[i * 4 + next * 8]->cols - (cascade->size.width >> 2);
+ int paddings[] = { pyr[i * 4]->step * 4 - i_cols * 4,
+ pyr[i * 4 + next * 4]->step * 2 - i_cols * 2,
+ pyr[i * 4 + next * 8]->step - i_cols };
+ for (q = 0; q < (params.accurate ? 4 : 1); q++)
+ {
+ unsigned char* u8[] = { pyr[i * 4]->data.u8 + dx[q] * 2 + dy[q] * pyr[i * 4]->step * 2, pyr[i * 4 + next * 4]->data.u8 + dx[q] + dy[q] * pyr[i * 4 + next * 4]->step, pyr[i * 4 + next * 8 + q]->data.u8 };
+ for (y = 0; y < i_rows; y++)
+ {
+ for (x = 0; x < i_cols; x++)
+ {
+ float sum;
+ int flag = 1;
+ ccv_bbf_stage_classifier_t* classifier = cascade->stage_classifier;
+ for (j = 0; j < cascade->count; ++j, ++classifier)
+ {
+ sum = 0;
+ float* alpha = classifier->alpha;
+ ccv_bbf_feature_t* feature = classifier->feature;
+ for (k = 0; k < classifier->count; ++k, alpha += 2, ++feature)
+ sum += alpha[_ccv_run_bbf_feature(feature, steps, u8)];
+ if (sum < classifier->threshold)
+ {
+ flag = 0;
+ break;
+ }
+ }
+ if (flag)
+ {
+ ccv_comp_t comp;
+ comp.rect = ccv_rect((int)((x * 4 + dx[q] * 2) * scale_x + 0.5), (int)((y * 4 + dy[q] * 2) * scale_y + 0.5), (int)(cascade->size.width * scale_x + 0.5), (int)(cascade->size.height * scale_y + 0.5));
+ comp.neighbors = 1;
+ comp.classification.id = t;
+ comp.classification.confidence = sum;
+ ccv_array_push(seq, &comp);
+ }
+ u8[0] += 4;
+ u8[1] += 2;
+ u8[2] += 1;
+ }
+ u8[0] += paddings[0];
+ u8[1] += paddings[1];
+ u8[2] += paddings[2];
+ }
+ }
+ scale_x *= scale;
+ scale_y *= scale;
+ }
+
+ /* the following code from OpenCV's haar feature implementation */
+ if(params.min_neighbors == 0)
+ {
+ for (i = 0; i < seq->rnum; i++)
+ {
+ ccv_comp_t* comp = (ccv_comp_t*)ccv_array_get(seq, i);
+ ccv_array_push(result_seq, comp);
+ }
+ } else {
+ idx_seq = 0;
+ ccv_array_clear(seq2);
+ // group retrieved rectangles in order to filter out noise
+ int ncomp = ccv_array_group(seq, &idx_seq, _ccv_is_equal_same_class, 0);
+ ccv_comp_t* comps = (ccv_comp_t*)ccmalloc((ncomp + 1) * sizeof(ccv_comp_t));
+ memset(comps, 0, (ncomp + 1) * sizeof(ccv_comp_t));
+
+ // count number of neighbors
+ for(i = 0; i < seq->rnum; i++)
+ {
+ ccv_comp_t r1 = *(ccv_comp_t*)ccv_array_get(seq, i);
+ int idx = *(int*)ccv_array_get(idx_seq, i);
+
+ if (comps[idx].neighbors == 0)
+ comps[idx].classification.confidence = r1.classification.confidence;
+
+ ++comps[idx].neighbors;
+
+ comps[idx].rect.x += r1.rect.x;
+ comps[idx].rect.y += r1.rect.y;
+ comps[idx].rect.width += r1.rect.width;
+ comps[idx].rect.height += r1.rect.height;
+ comps[idx].classification.id = r1.classification.id;
+ comps[idx].classification.confidence = ccv_max(comps[idx].classification.confidence, r1.classification.confidence);
+ }
+
+ // calculate average bounding box
+ for(i = 0; i < ncomp; i++)
+ {
+ int n = comps[i].neighbors;
+ if(n >= params.min_neighbors)
+ {
+ ccv_comp_t comp;
+ comp.rect.x = (comps[i].rect.x * 2 + n) / (2 * n);
+ comp.rect.y = (comps[i].rect.y * 2 + n) / (2 * n);
+ comp.rect.width = (comps[i].rect.width * 2 + n) / (2 * n);
+ comp.rect.height = (comps[i].rect.height * 2 + n) / (2 * n);
+ comp.neighbors = comps[i].neighbors;
+ comp.classification.id = comps[i].classification.id;
+ comp.classification.confidence = comps[i].classification.confidence;
+ ccv_array_push(seq2, &comp);
+ }
+ }
+
+ // filter out small face rectangles inside large face rectangles
+ for(i = 0; i < seq2->rnum; i++)
+ {
+ ccv_comp_t r1 = *(ccv_comp_t*)ccv_array_get(seq2, i);
+ int flag = 1;
+
+ for(j = 0; j < seq2->rnum; j++)
+ {
+ ccv_comp_t r2 = *(ccv_comp_t*)ccv_array_get(seq2, j);
+ int distance = (int)(r2.rect.width * 0.25 + 0.5);
+
+ if(i != j &&
+ r1.classification.id == r2.classification.id &&
+ r1.rect.x >= r2.rect.x - distance &&
+ r1.rect.y >= r2.rect.y - distance &&
+ r1.rect.x + r1.rect.width <= r2.rect.x + r2.rect.width + distance &&
+ r1.rect.y + r1.rect.height <= r2.rect.y + r2.rect.height + distance &&
+ (r2.neighbors > ccv_max(3, r1.neighbors) || r1.neighbors < 3))
+ {
+ flag = 0;
+ break;
+ }
+ }
+
+ if(flag)
+ ccv_array_push(result_seq, &r1);
+ }
+ ccv_array_free(idx_seq);
+ ccfree(comps);
+ }
+ }
+
+ ccv_array_free(seq);
+ ccv_array_free(seq2);
+
+ ccv_array_t* result_seq2;
+ /* the following code from OpenCV's haar feature implementation */
+ if (params.flags & CCV_BBF_NO_NESTED)
+ {
+ result_seq2 = ccv_array_new(sizeof(ccv_comp_t), 64, 0);
+ idx_seq = 0;
+ // group retrieved rectangles in order to filter out noise
+ int ncomp = ccv_array_group(result_seq, &idx_seq, _ccv_is_equal, 0);
+ ccv_comp_t* comps = (ccv_comp_t*)ccmalloc((ncomp + 1) * sizeof(ccv_comp_t));
+ memset(comps, 0, (ncomp + 1) * sizeof(ccv_comp_t));
+
+ // count number of neighbors
+ for(i = 0; i < result_seq->rnum; i++)
+ {
+ ccv_comp_t r1 = *(ccv_comp_t*)ccv_array_get(result_seq, i);
+ int idx = *(int*)ccv_array_get(idx_seq, i);
+
+ if (comps[idx].neighbors == 0 || comps[idx].classification.confidence < r1.classification.confidence)
+ {
+ comps[idx].classification.confidence = r1.classification.confidence;
+ comps[idx].neighbors = 1;
+ comps[idx].rect = r1.rect;
+ comps[idx].classification.id = r1.classification.id;
+ }
+ }
+
+ // calculate average bounding box
+ for(i = 0; i < ncomp; i++)
+ if(comps[i].neighbors)
+ ccv_array_push(result_seq2, &comps[i]);
+
+ ccv_array_free(result_seq);
+ ccfree(comps);
+ } else {
+ result_seq2 = result_seq;
+ }
+
+ for (i = 1; i < scale_upto + next * 2; i++)
+ ccv_matrix_free(pyr[i * 4]);
+ if (params.accurate)
+ for (i = next * 2; i < scale_upto + next * 2; i++)
+ {
+ ccv_matrix_free(pyr[i * 4 + 1]);
+ ccv_matrix_free(pyr[i * 4 + 2]);
+ ccv_matrix_free(pyr[i * 4 + 3]);
+ }
+ if (params.size.height != _cascade[0]->size.height || params.size.width != _cascade[0]->size.width)
+ ccv_matrix_free(pyr[0]);
+
+ return result_seq2;
+}
+
+ccv_bbf_classifier_cascade_t* ccv_bbf_read_classifier_cascade(const char* directory)
+{
+ char buf[1024];
+ sprintf(buf, "%s/cascade.txt", directory);
+ int s, i;
+ FILE* r = fopen(buf, "r");
+ if (r == 0)
+ return 0;
+ ccv_bbf_classifier_cascade_t* cascade = (ccv_bbf_classifier_cascade_t*)ccmalloc(sizeof(ccv_bbf_classifier_cascade_t));
+ s = fscanf(r, "%d %d %d", &cascade->count, &cascade->size.width, &cascade->size.height);
+ assert(s > 0);
+ cascade->stage_classifier = (ccv_bbf_stage_classifier_t*)ccmalloc(cascade->count * sizeof(ccv_bbf_stage_classifier_t));
+ for (i = 0; i < cascade->count; i++)
+ {
+ sprintf(buf, "%s/stage-%d.txt", directory, i);
+ if (_ccv_read_bbf_stage_classifier(buf, &cascade->stage_classifier[i]) < 0)
+ {
+ cascade->count = i;
+ break;
+ }
+ }
+ fclose(r);
+ return cascade;
+}
+
+ccv_bbf_classifier_cascade_t* ccv_bbf_classifier_cascade_read_binary(char* s)
+{
+ int i;
+ ccv_bbf_classifier_cascade_t* cascade = (ccv_bbf_classifier_cascade_t*)ccmalloc(sizeof(ccv_bbf_classifier_cascade_t));
+ memcpy(&cascade->count, s, sizeof(cascade->count)); s += sizeof(cascade->count);
+ memcpy(&cascade->size.width, s, sizeof(cascade->size.width)); s += sizeof(cascade->size.width);
+ memcpy(&cascade->size.height, s, sizeof(cascade->size.height)); s += sizeof(cascade->size.height);
+ ccv_bbf_stage_classifier_t* classifier = cascade->stage_classifier = (ccv_bbf_stage_classifier_t*)ccmalloc(cascade->count * sizeof(ccv_bbf_stage_classifier_t));
+ for (i = 0; i < cascade->count; i++, classifier++)
+ {
+ memcpy(&classifier->count, s, sizeof(classifier->count)); s += sizeof(classifier->count);
+ memcpy(&classifier->threshold, s, sizeof(classifier->threshold)); s += sizeof(classifier->threshold);
+ classifier->feature = (ccv_bbf_feature_t*)ccmalloc(classifier->count * sizeof(ccv_bbf_feature_t));
+ classifier->alpha = (float*)ccmalloc(classifier->count * 2 * sizeof(float));
+ memcpy(classifier->feature, s, classifier->count * sizeof(ccv_bbf_feature_t)); s += classifier->count * sizeof(ccv_bbf_feature_t);
+ memcpy(classifier->alpha, s, classifier->count * 2 * sizeof(float)); s += classifier->count * 2 * sizeof(float);
+ }
+ return cascade;
+
+}
+
+int ccv_bbf_classifier_cascade_write_binary(ccv_bbf_classifier_cascade_t* cascade, char* s, int slen)
+{
+ int i;
+ int len = sizeof(cascade->count) + sizeof(cascade->size.width) + sizeof(cascade->size.height);
+ ccv_bbf_stage_classifier_t* classifier = cascade->stage_classifier;
+ for (i = 0; i < cascade->count; i++, classifier++)
+ len += sizeof(classifier->count) + sizeof(classifier->threshold) + classifier->count * sizeof(ccv_bbf_feature_t) + classifier->count * 2 * sizeof(float);
+ if (slen >= len)
+ {
+ memcpy(s, &cascade->count, sizeof(cascade->count)); s += sizeof(cascade->count);
+ memcpy(s, &cascade->size.width, sizeof(cascade->size.width)); s += sizeof(cascade->size.width);
+ memcpy(s, &cascade->size.height, sizeof(cascade->size.height)); s += sizeof(cascade->size.height);
+ classifier = cascade->stage_classifier;
+ for (i = 0; i < cascade->count; i++, classifier++)
+ {
+ memcpy(s, &classifier->count, sizeof(classifier->count)); s += sizeof(classifier->count);
+ memcpy(s, &classifier->threshold, sizeof(classifier->threshold)); s += sizeof(classifier->threshold);
+ memcpy(s, classifier->feature, classifier->count * sizeof(ccv_bbf_feature_t)); s += classifier->count * sizeof(ccv_bbf_feature_t);
+ memcpy(s, classifier->alpha, classifier->count * 2 * sizeof(float)); s += classifier->count * 2 * sizeof(float);
+ }
+ }
+ return len;
+}
+
+void ccv_bbf_classifier_cascade_free(ccv_bbf_classifier_cascade_t* cascade)
+{
+ int i;
+ for (i = 0; i < cascade->count; ++i)
+ {
+ ccfree(cascade->stage_classifier[i].feature);
+ ccfree(cascade->stage_classifier[i].alpha);
+ }
+ ccfree(cascade->stage_classifier);
+ ccfree(cascade);
+}
\ No newline at end of file
diff --git a/test/source.cc b/test/source.cc
new file mode 100644
index 0000000..f0094b3
--- /dev/null
+++ b/test/source.cc
@@ -0,0 +1,1573 @@
+#include "ccv.h"
+#include "ccv_internal.h"
+#include
+#ifdef HAVE_GSL
+#include
+#include
+#endif
+#ifdef USE_OPENMP
+#include
+#endif
+
+const ccv_bbf_param_t ccv_bbf_default_params = {
+ .interval = 5,
+ .min_neighbors = 2,
+ .accurate = 1,
+ .flags = 0,
+ .size = {
+ 24,
+ 24,
+ },
+};
+
+#define _ccv_width_padding(x) (((x) + 3) & -4)
+
+static inline int _ccv_run_bbf_feature(ccv_bbf_feature_t *feature, int *step, unsigned char **u8)
+{
+#define pf_at(i) (*(u8[feature->pz[i]] + feature->px[i] + feature->py[i] * step[feature->pz[i]]))
+#define nf_at(i) (*(u8[feature->nz[i]] + feature->nx[i] + feature->ny[i] * step[feature->nz[i]]))
+ unsigned char pmin = pf_at(0), nmax = nf_at(0);
+ /* check if every point in P > every point in N, and take a shortcut */
+ if (pmin <= nmax)
+ return 0;
+ int i;
+ for (i = 1; i < feature->size; i++)
+ {
+ if (feature->pz[i] >= 0)
+ {
+ int p = pf_at(i);
+ if (p < pmin)
+ {
+ if (p <= nmax)
+ return 0;
+ pmin = p;
+ }
+ }
+ if (feature->nz[i] >= 0)
+ {
+ int n = nf_at(i);
+ if (n > nmax)
+ {
+ if (pmin <= n)
+ return 0;
+ nmax = n;
+ }
+ }
+ }
+#undef pf_at
+#undef nf_at
+ return 1;
+}
+
+static int _ccv_read_bbf_stage_classifier(const char *file, ccv_bbf_stage_classifier_t *classifier)
+{
+ FILE *r = fopen(file, "r");
+ if (r == 0)
+ return -1;
+ int stat = 0;
+ stat |= fscanf(r, "%d", &classifier->count);
+ union {
+ float fl;
+ int i;
+ } fli;
+ stat |= fscanf(r, "%d", &fli.i);
+ classifier->threshold = fli.fl;
+ classifier->feature = (ccv_bbf_feature_t *)ccmalloc(classifier->count * sizeof(ccv_bbf_feature_t));
+ classifier->alpha = (float *)ccmalloc(classifier->count * 2 * sizeof(float));
+ int i, j;
+ for (i = 0; i < classifier->count; i++)
+ {
+ stat |= fscanf(r, "%d", &classifier->feature[i].size);
+ for (j = 0; j < classifier->feature[i].size; j++)
+ {
+ stat |= fscanf(r, "%d %d %d", &classifier->feature[i].px[j], &classifier->feature[i].py[j], &classifier->feature[i].pz[j]);
+ stat |= fscanf(r, "%d %d %d", &classifier->feature[i].nx[j], &classifier->feature[i].ny[j], &classifier->feature[i].nz[j]);
+ }
+ union {
+ float fl;
+ int i;
+ } flia, flib;
+ stat |= fscanf(r, "%d %d", &flia.i, &flib.i);
+ classifier->alpha[i * 2] = flia.fl;
+ classifier->alpha[i * 2 + 1] = flib.fl;
+ }
+ fclose(r);
+ return 0;
+}
+
+#ifdef HAVE_GSL
+
+static unsigned int _ccv_bbf_time_measure()
+{
+ struct timeval tv;
+ gettimeofday(&tv, 0);
+ return tv.tv_sec * 1000000 + tv.tv_usec;
+}
+
+#define less_than(a, b, aux) ((a) < (b))
+CCV_IMPLEMENT_QSORT(_ccv_sort_32f, float, less_than)
+#undef less_than
+
+static void _ccv_bbf_eval_data(ccv_bbf_stage_classifier_t *classifier, unsigned char **posdata, int posnum, unsigned char **negdata, int negnum, ccv_size_t size, float *peval, float *neval)
+{
+ int i, j;
+ int steps[] = {_ccv_width_padding(size.width),
+ _ccv_width_padding(size.width >> 1),
+ _ccv_width_padding(size.width >> 2)};
+ int isizs0 = steps[0] * size.height;
+ int isizs01 = isizs0 + steps[1] * (size.height >> 1);
+ for (i = 0; i < posnum; i++)
+ {
+ unsigned char *u8[] = {posdata[i], posdata[i] + isizs0, posdata[i] + isizs01};
+ float sum = 0;
+ float *alpha = classifier->alpha;
+ ccv_bbf_feature_t *feature = classifier->feature;
+ for (j = 0; j < classifier->count; ++j, alpha += 2, ++feature)
+ sum += alpha[_ccv_run_bbf_feature(feature, steps, u8)];
+ peval[i] = sum;
+ }
+ for (i = 0; i < negnum; i++)
+ {
+ unsigned char *u8[] = {negdata[i], negdata[i] + isizs0, negdata[i] + isizs01};
+ float sum = 0;
+ float *alpha = classifier->alpha;
+ ccv_bbf_feature_t *feature = classifier->feature;
+ for (j = 0; j < classifier->count; ++j, alpha += 2, ++feature)
+ sum += alpha[_ccv_run_bbf_feature(feature, steps, u8)];
+ neval[i] = sum;
+ }
+}
+
+static int _ccv_prune_positive_data(ccv_bbf_classifier_cascade_t *cascade, unsigned char **posdata, int posnum, ccv_size_t size)
+{
+ float *peval = (float *)ccmalloc(posnum * sizeof(float));
+ int i, j, k, rpos = posnum;
+ for (i = 0; i < cascade->count; i++)
+ {
+ _ccv_bbf_eval_data(cascade->stage_classifier + i, posdata, rpos, 0, 0, size, peval, 0);
+ k = 0;
+ for (j = 0; j < rpos; j++)
+ if (peval[j] >= cascade->stage_classifier[i].threshold)
+ {
+ posdata[k] = posdata[j];
+ ++k;
+ }
+ else
+ {
+ ccfree(posdata[j]);
+ }
+ rpos = k;
+ }
+ ccfree(peval);
+ return rpos;
+}
+
+static int _ccv_prepare_background_data(ccv_bbf_classifier_cascade_t *cascade, char **bgfiles, int bgnum, unsigned char **negdata, int negnum)
+{
+ int t, i, j, k, q;
+ int negperbg;
+ int negtotal = 0;
+ int steps[] = {_ccv_width_padding(cascade->size.width),
+ _ccv_width_padding(cascade->size.width >> 1),
+ _ccv_width_padding(cascade->size.width >> 2)};
+ int isizs0 = steps[0] * cascade->size.height;
+ int isizs1 = steps[1] * (cascade->size.height >> 1);
+ int isizs2 = steps[2] * (cascade->size.height >> 2);
+ int *idcheck = (int *)ccmalloc(negnum * sizeof(int));
+
+ gsl_rng_env_setup();
+
+ gsl_rng *rng = gsl_rng_alloc(gsl_rng_default);
+ gsl_rng_set(rng, (unsigned long int)idcheck);
+
+ ccv_size_t imgsz = cascade->size;
+ int rneg = negtotal;
+ for (t = 0; negtotal < negnum; t++)
+ {
+ PRINT(CCV_CLI_INFO, "preparing negative data ... 0%%");
+ for (i = 0; i < bgnum; i++)
+ {
+ negperbg = (t < 2) ? (negnum - negtotal) / (bgnum - i) + 1 : negnum - negtotal;
+ ccv_dense_matrix_t *image = 0;
+ ccv_read(bgfiles[i], &image, CCV_IO_GRAY | CCV_IO_ANY_FILE);
+ assert((image->type & CCV_C1) && (image->type & CCV_8U));
+ if (image == 0)
+ {
+ PRINT(CCV_CLI_ERROR, "\n%s file corrupted\n", bgfiles[i]);
+ continue;
+ }
+ if (t % 2 != 0)
+ ccv_flip(image, 0, 0, CCV_FLIP_X);
+ if (t % 4 >= 2)
+ ccv_flip(image, 0, 0, CCV_FLIP_Y);
+ ccv_bbf_param_t params = {.interval = 3, .min_neighbors = 0, .accurate = 1, .flags = 0, .size = cascade->size};
+ ccv_array_t *detected = ccv_bbf_detect_objects(image, &cascade, 1, params);
+ memset(idcheck, 0, ccv_min(detected->rnum, negperbg) * sizeof(int));
+ for (j = 0; j < ccv_min(detected->rnum, negperbg); j++)
+ {
+ int r = gsl_rng_uniform_int(rng, detected->rnum);
+ int flag = 1;
+ ccv_rect_t *rect = (ccv_rect_t *)ccv_array_get(detected, r);
+ while (flag)
+ {
+ flag = 0;
+ for (k = 0; k < j; k++)
+ if (r == idcheck[k])
+ {
+ flag = 1;
+ r = gsl_rng_uniform_int(rng, detected->rnum);
+ break;
+ }
+ rect = (ccv_rect_t *)ccv_array_get(detected, r);
+ if ((rect->x < 0) || (rect->y < 0) || (rect->width + rect->x > image->cols) || (rect->height + rect->y > image->rows))
+ {
+ flag = 1;
+ r = gsl_rng_uniform_int(rng, detected->rnum);
+ }
+ }
+ idcheck[j] = r;
+ ccv_dense_matrix_t *temp = 0;
+ ccv_dense_matrix_t *imgs0 = 0;
+ ccv_dense_matrix_t *imgs1 = 0;
+ ccv_dense_matrix_t *imgs2 = 0;
+ ccv_slice(image, (ccv_matrix_t **)&temp, 0, rect->y, rect->x, rect->height, rect->width);
+ ccv_resample(temp, &imgs0, 0, imgsz.height, imgsz.width, CCV_INTER_AREA);
+ assert(imgs0->step == steps[0]);
+ ccv_matrix_free(temp);
+ ccv_sample_down(imgs0, &imgs1, 0, 0, 0);
+ assert(imgs1->step == steps[1]);
+ ccv_sample_down(imgs1, &imgs2, 0, 0, 0);
+ assert(imgs2->step == steps[2]);
+
+ negdata[negtotal] = (unsigned char *)ccmalloc(isizs0 + isizs1 + isizs2);
+ unsigned char *u8s0 = negdata[negtotal];
+ unsigned char *u8s1 = negdata[negtotal] + isizs0;
+ unsigned char *u8s2 = negdata[negtotal] + isizs0 + isizs1;
+ unsigned char *u8[] = {u8s0, u8s1, u8s2};
+ memcpy(u8s0, imgs0->data.u8, imgs0->rows * imgs0->step);
+ ccv_matrix_free(imgs0);
+ memcpy(u8s1, imgs1->data.u8, imgs1->rows * imgs1->step);
+ ccv_matrix_free(imgs1);
+ memcpy(u8s2, imgs2->data.u8, imgs2->rows * imgs2->step);
+ ccv_matrix_free(imgs2);
+
+ flag = 1;
+ ccv_bbf_stage_classifier_t *classifier = cascade->stage_classifier;
+ for (k = 0; k < cascade->count; ++k, ++classifier)
+ {
+ float sum = 0;
+ float *alpha = classifier->alpha;
+ ccv_bbf_feature_t *feature = classifier->feature;
+ for (q = 0; q < classifier->count; ++q, alpha += 2, ++feature)
+ sum += alpha[_ccv_run_bbf_feature(feature, steps, u8)];
+ if (sum < classifier->threshold)
+ {
+ flag = 0;
+ break;
+ }
+ }
+ if (!flag)
+ ccfree(negdata[negtotal]);
+ else
+ {
+ ++negtotal;
+ if (negtotal >= negnum)
+ break;
+ }
+ }
+ ccv_array_free(detected);
+ ccv_matrix_free(image);
+ ccv_drain_cache();
+ PRINT(CCV_CLI_INFO, "\rpreparing negative data ... %2d%%", 100 * negtotal / negnum);
+ fflush(0);
+ if (negtotal >= negnum)
+ break;
+ }
+ if (rneg == negtotal)
+ break;
+ rneg = negtotal;
+ PRINT(CCV_CLI_INFO, "\nentering additional round %d\n", t + 1);
+ }
+ gsl_rng_free(rng);
+ ccfree(idcheck);
+ ccv_drain_cache();
+ PRINT(CCV_CLI_INFO, "\n");
+ return negtotal;
+}
+
+static void _ccv_prepare_positive_data(ccv_dense_matrix_t **posimg, unsigned char **posdata, ccv_size_t size, int posnum)
+{
+ PRINT(CCV_CLI_INFO, "preparing positive data ... 0%%");
+ int i;
+ for (i = 0; i < posnum; i++)
+ {
+ ccv_dense_matrix_t *imgs0 = posimg[i];
+ ccv_dense_matrix_t *imgs1 = 0;
+ ccv_dense_matrix_t *imgs2 = 0;
+ assert((imgs0->type & CCV_C1) && (imgs0->type & CCV_8U) && imgs0->rows == size.height && imgs0->cols == size.width);
+ ccv_sample_down(imgs0, &imgs1, 0, 0, 0);
+ ccv_sample_down(imgs1, &imgs2, 0, 0, 0);
+ int isizs0 = imgs0->rows * imgs0->step;
+ int isizs1 = imgs1->rows * imgs1->step;
+ int isizs2 = imgs2->rows * imgs2->step;
+
+ posdata[i] = (unsigned char *)ccmalloc(isizs0 + isizs1 + isizs2);
+ memcpy(posdata[i], imgs0->data.u8, isizs0);
+ memcpy(posdata[i] + isizs0, imgs1->data.u8, isizs1);
+ memcpy(posdata[i] + isizs0 + isizs1, imgs2->data.u8, isizs2);
+
+ PRINT(CCV_CLI_INFO, "\rpreparing positive data ... %2d%%", 100 * (i + 1) / posnum);
+ fflush(0);
+
+ ccv_matrix_free(imgs1);
+ ccv_matrix_free(imgs2);
+ }
+ ccv_drain_cache();
+ PRINT(CCV_CLI_INFO, "\n");
+}
+
+typedef struct
+{
+ double fitness;
+ int pk, nk;
+ int age;
+ double error;
+ ccv_bbf_feature_t feature;
+} ccv_bbf_gene_t;
+
+static inline void _ccv_bbf_genetic_fitness(ccv_bbf_gene_t *gene)
+{
+ gene->fitness = (1 - gene->error) * exp(-0.01 * gene->age) * exp((gene->pk + gene->nk) * log(1.015));
+}
+
+static inline int _ccv_bbf_exist_gene_feature(ccv_bbf_gene_t *gene, int x, int y, int z)
+{
+ int i;
+ for (i = 0; i < gene->pk; i++)
+ if (z == gene->feature.pz[i] && x == gene->feature.px[i] && y == gene->feature.py[i])
+ return 1;
+ for (i = 0; i < gene->nk; i++)
+ if (z == gene->feature.nz[i] && x == gene->feature.nx[i] && y == gene->feature.ny[i])
+ return 1;
+ return 0;
+}
+
+static inline void _ccv_bbf_randomize_gene(gsl_rng *rng, ccv_bbf_gene_t *gene, int *rows, int *cols)
+{
+ int i;
+ do
+ {
+ gene->pk = gsl_rng_uniform_int(rng, CCV_BBF_POINT_MAX - 1) + 1;
+ gene->nk = gsl_rng_uniform_int(rng, CCV_BBF_POINT_MAX - 1) + 1;
+ } while (gene->pk + gene->nk < CCV_BBF_POINT_MIN); /* a hard restriction of at least 3 points have to be examed */
+ gene->feature.size = ccv_max(gene->pk, gene->nk);
+ gene->age = 0;
+ for (i = 0; i < CCV_BBF_POINT_MAX; i++)
+ {
+ gene->feature.pz[i] = -1;
+ gene->feature.nz[i] = -1;
+ }
+ int x, y, z;
+ for (i = 0; i < gene->pk; i++)
+ {
+ do
+ {
+ z = gsl_rng_uniform_int(rng, 3);
+ x = gsl_rng_uniform_int(rng, cols[z]);
+ y = gsl_rng_uniform_int(rng, rows[z]);
+ } while (_ccv_bbf_exist_gene_feature(gene, x, y, z));
+ gene->feature.pz[i] = z;
+ gene->feature.px[i] = x;
+ gene->feature.py[i] = y;
+ }
+ for (i = 0; i < gene->nk; i++)
+ {
+ do
+ {
+ z = gsl_rng_uniform_int(rng, 3);
+ x = gsl_rng_uniform_int(rng, cols[z]);
+ y = gsl_rng_uniform_int(rng, rows[z]);
+ } while (_ccv_bbf_exist_gene_feature(gene, x, y, z));
+ gene->feature.nz[i] = z;
+ gene->feature.nx[i] = x;
+ gene->feature.ny[i] = y;
+ }
+}
+
+static inline double _ccv_bbf_error_rate(ccv_bbf_feature_t *feature, unsigned char **posdata, int posnum, unsigned char **negdata, int negnum, ccv_size_t size, double *pw, double *nw)
+{
+ int i;
+ int steps[] = {_ccv_width_padding(size.width),
+ _ccv_width_padding(size.width >> 1),
+ _ccv_width_padding(size.width >> 2)};
+ int isizs0 = steps[0] * size.height;
+ int isizs01 = isizs0 + steps[1] * (size.height >> 1);
+ double error = 0;
+ for (i = 0; i < posnum; i++)
+ {
+ unsigned char *u8[] = {posdata[i], posdata[i] + isizs0, posdata[i] + isizs01};
+ if (!_ccv_run_bbf_feature(feature, steps, u8))
+ error += pw[i];
+ }
+ for (i = 0; i < negnum; i++)
+ {
+ unsigned char *u8[] = {negdata[i], negdata[i] + isizs0, negdata[i] + isizs01};
+ if (_ccv_run_bbf_feature(feature, steps, u8))
+ error += nw[i];
+ }
+ return error;
+}
+
+#define less_than(fit1, fit2, aux) ((fit1).fitness >= (fit2).fitness)
+static CCV_IMPLEMENT_QSORT(_ccv_bbf_genetic_qsort, ccv_bbf_gene_t, less_than)
+#undef less_than
+
+ static ccv_bbf_feature_t _ccv_bbf_genetic_optimize(unsigned char **posdata, int posnum, unsigned char **negdata, int negnum, int ftnum, ccv_size_t size, double *pw, double *nw)
+{
+ ccv_bbf_feature_t best;
+ /* seed (random method) */
+ gsl_rng_env_setup();
+ gsl_rng *rng = gsl_rng_alloc(gsl_rng_default);
+ union {
+ unsigned long int li;
+ double db;
+ } dbli;
+ dbli.db = pw[0] + nw[0];
+ gsl_rng_set(rng, dbli.li);
+ int i, j;
+ int pnum = ftnum * 100;
+ assert(pnum > 0);
+ ccv_bbf_gene_t *gene = (ccv_bbf_gene_t *)ccmalloc(pnum * sizeof(ccv_bbf_gene_t));
+ int rows[] = {size.height, size.height >> 1, size.height >> 2};
+ int cols[] = {size.width, size.width >> 1, size.width >> 2};
+ for (i = 0; i < pnum; i++)
+ _ccv_bbf_randomize_gene(rng, &gene[i], rows, cols);
+ unsigned int timer = _ccv_bbf_time_measure();
+#ifdef USE_OPENMP
+#pragma omp parallel for private(i) schedule(dynamic)
+#endif
+ for (i = 0; i < pnum; i++)
+ gene[i].error = _ccv_bbf_error_rate(&gene[i].feature, posdata, posnum, negdata, negnum, size, pw, nw);
+ timer = _ccv_bbf_time_measure() - timer;
+ for (i = 0; i < pnum; i++)
+ _ccv_bbf_genetic_fitness(&gene[i]);
+ double best_err = 1;
+ int rnum = ftnum * 39; /* number of randomize */
+ int mnum = ftnum * 40; /* number of mutation */
+ int hnum = ftnum * 20; /* number of hybrid */
+ /* iteration stop crit : best no change in 40 iterations */
+ int it = 0, t;
+ for (t = 0; it < 40; ++it, ++t)
+ {
+ int min_id = 0;
+ double min_err = gene[0].error;
+ for (i = 1; i < pnum; i++)
+ if (gene[i].error < min_err)
+ {
+ min_id = i;
+ min_err = gene[i].error;
+ }
+ min_err = gene[min_id].error = _ccv_bbf_error_rate(&gene[min_id].feature, posdata, posnum, negdata, negnum, size, pw, nw);
+ if (min_err < best_err)
+ {
+ best_err = min_err;
+ memcpy(&best, &gene[min_id].feature, sizeof(best));
+ PRINT(CCV_CLI_INFO, "best bbf feature with error %f\n|-size: %d\n|-positive point: ", best_err, best.size);
+ for (i = 0; i < best.size; i++)
+ PRINT(CCV_CLI_INFO, "(%d %d %d), ", best.px[i], best.py[i], best.pz[i]);
+ PRINT(CCV_CLI_INFO, "\n|-negative point: ");
+ for (i = 0; i < best.size; i++)
+ PRINT(CCV_CLI_INFO, "(%d %d %d), ", best.nx[i], best.ny[i], best.nz[i]);
+ PRINT(CCV_CLI_INFO, "\n");
+ it = 0;
+ }
+ PRINT(CCV_CLI_INFO, "minimum error achieved in round %d(%d) : %f with %d ms\n", t, it, min_err, timer / 1000);
+ _ccv_bbf_genetic_qsort(gene, pnum, 0);
+ for (i = 0; i < ftnum; i++)
+ ++gene[i].age;
+ for (i = ftnum; i < ftnum + mnum; i++)
+ {
+ int parent = gsl_rng_uniform_int(rng, ftnum);
+ memcpy(gene + i, gene + parent, sizeof(ccv_bbf_gene_t));
+ /* three mutation strategy : 1. add, 2. remove, 3. refine */
+ int pnm, pn = gsl_rng_uniform_int(rng, 2);
+ int *pnk[] = {&gene[i].pk, &gene[i].nk};
+ int *pnx[] = {gene[i].feature.px, gene[i].feature.nx};
+ int *pny[] = {gene[i].feature.py, gene[i].feature.ny};
+ int *pnz[] = {gene[i].feature.pz, gene[i].feature.nz};
+ int x, y, z;
+ int victim, decay = 1;
+ do
+ {
+ switch (gsl_rng_uniform_int(rng, 3))
+ {
+ case 0: /* add */
+ if (gene[i].pk == CCV_BBF_POINT_MAX && gene[i].nk == CCV_BBF_POINT_MAX)
+ break;
+ while (*pnk[pn] + 1 > CCV_BBF_POINT_MAX)
+ pn = gsl_rng_uniform_int(rng, 2);
+ do
+ {
+ z = gsl_rng_uniform_int(rng, 3);
+ x = gsl_rng_uniform_int(rng, cols[z]);
+ y = gsl_rng_uniform_int(rng, rows[z]);
+ } while (_ccv_bbf_exist_gene_feature(&gene[i], x, y, z));
+ pnz[pn][*pnk[pn]] = z;
+ pnx[pn][*pnk[pn]] = x;
+ pny[pn][*pnk[pn]] = y;
+ ++(*pnk[pn]);
+ gene[i].feature.size = ccv_max(gene[i].pk, gene[i].nk);
+ decay = gene[i].age = 0;
+ break;
+ case 1: /* remove */
+ if (gene[i].pk + gene[i].nk <= CCV_BBF_POINT_MIN) /* at least 3 points have to be examed */
+ break;
+ while (*pnk[pn] - 1 <= 0) // || *pnk[pn] + *pnk[!pn] - 1 < CCV_BBF_POINT_MIN)
+ pn = gsl_rng_uniform_int(rng, 2);
+ victim = gsl_rng_uniform_int(rng, *pnk[pn]);
+ for (j = victim; j < *pnk[pn] - 1; j++)
+ {
+ pnz[pn][j] = pnz[pn][j + 1];
+ pnx[pn][j] = pnx[pn][j + 1];
+ pny[pn][j] = pny[pn][j + 1];
+ }
+ pnz[pn][*pnk[pn] - 1] = -1;
+ --(*pnk[pn]);
+ gene[i].feature.size = ccv_max(gene[i].pk, gene[i].nk);
+ decay = gene[i].age = 0;
+ break;
+ case 2: /* refine */
+ pnm = gsl_rng_uniform_int(rng, *pnk[pn]);
+ do
+ {
+ z = gsl_rng_uniform_int(rng, 3);
+ x = gsl_rng_uniform_int(rng, cols[z]);
+ y = gsl_rng_uniform_int(rng, rows[z]);
+ } while (_ccv_bbf_exist_gene_feature(&gene[i], x, y, z));
+ pnz[pn][pnm] = z;
+ pnx[pn][pnm] = x;
+ pny[pn][pnm] = y;
+ decay = gene[i].age = 0;
+ break;
+ }
+ } while (decay);
+ }
+ for (i = ftnum + mnum; i < ftnum + mnum + hnum; i++)
+ {
+ /* hybrid strategy: taking positive points from dad, negative points from mum */
+ int dad, mum;
+ do
+ {
+ dad = gsl_rng_uniform_int(rng, ftnum);
+ mum = gsl_rng_uniform_int(rng, ftnum);
+ } while (dad == mum || gene[dad].pk + gene[mum].nk < CCV_BBF_POINT_MIN); /* at least 3 points have to be examed */
+ for (j = 0; j < CCV_BBF_POINT_MAX; j++)
+ {
+ gene[i].feature.pz[j] = -1;
+ gene[i].feature.nz[j] = -1;
+ }
+ gene[i].pk = gene[dad].pk;
+ for (j = 0; j < gene[i].pk; j++)
+ {
+ gene[i].feature.pz[j] = gene[dad].feature.pz[j];
+ gene[i].feature.px[j] = gene[dad].feature.px[j];
+ gene[i].feature.py[j] = gene[dad].feature.py[j];
+ }
+ gene[i].nk = gene[mum].nk;
+ for (j = 0; j < gene[i].nk; j++)
+ {
+ gene[i].feature.nz[j] = gene[mum].feature.nz[j];
+ gene[i].feature.nx[j] = gene[mum].feature.nx[j];
+ gene[i].feature.ny[j] = gene[mum].feature.ny[j];
+ }
+ gene[i].feature.size = ccv_max(gene[i].pk, gene[i].nk);
+ gene[i].age = 0;
+ }
+ for (i = ftnum + mnum + hnum; i < ftnum + mnum + hnum + rnum; i++)
+ _ccv_bbf_randomize_gene(rng, &gene[i], rows, cols);
+ timer = _ccv_bbf_time_measure();
+#ifdef USE_OPENMP
+#pragma omp parallel for private(i) schedule(dynamic)
+#endif
+ for (i = 0; i < pnum; i++)
+ gene[i].error = _ccv_bbf_error_rate(&gene[i].feature, posdata, posnum, negdata, negnum, size, pw, nw);
+ timer = _ccv_bbf_time_measure() - timer;
+ for (i = 0; i < pnum; i++)
+ _ccv_bbf_genetic_fitness(&gene[i]);
+ }
+ ccfree(gene);
+ gsl_rng_free(rng);
+ return best;
+}
+
+#define less_than(fit1, fit2, aux) ((fit1).error < (fit2).error)
+static CCV_IMPLEMENT_QSORT(_ccv_bbf_best_qsort, ccv_bbf_gene_t, less_than)
+#undef less_than
+
+ static ccv_bbf_gene_t _ccv_bbf_best_gene(ccv_bbf_gene_t *gene, int pnum, int point_min, unsigned char **posdata, int posnum, unsigned char **negdata, int negnum, ccv_size_t size, double *pw, double *nw)
+{
+ int i;
+ unsigned int timer = _ccv_bbf_time_measure();
+#ifdef USE_OPENMP
+#pragma omp parallel for private(i) schedule(dynamic)
+#endif
+ for (i = 0; i < pnum; i++)
+ gene[i].error = _ccv_bbf_error_rate(&gene[i].feature, posdata, posnum, negdata, negnum, size, pw, nw);
+ timer = _ccv_bbf_time_measure() - timer;
+ _ccv_bbf_best_qsort(gene, pnum, 0);
+ int min_id = 0;
+ double min_err = gene[0].error;
+ for (i = 0; i < pnum; i++)
+ if (gene[i].nk + gene[i].pk >= point_min)
+ {
+ min_id = i;
+ min_err = gene[i].error;
+ break;
+ }
+ PRINT(CCV_CLI_INFO, "local best bbf feature with error %f\n|-size: %d\n|-positive point: ", min_err, gene[min_id].feature.size);
+ for (i = 0; i < gene[min_id].feature.size; i++)
+ PRINT(CCV_CLI_INFO, "(%d %d %d), ", gene[min_id].feature.px[i], gene[min_id].feature.py[i], gene[min_id].feature.pz[i]);
+ PRINT(CCV_CLI_INFO, "\n|-negative point: ");
+ for (i = 0; i < gene[min_id].feature.size; i++)
+ PRINT(CCV_CLI_INFO, "(%d %d %d), ", gene[min_id].feature.nx[i], gene[min_id].feature.ny[i], gene[min_id].feature.nz[i]);
+ PRINT(CCV_CLI_INFO, "\nthe computation takes %d ms\n", timer / 1000);
+ return gene[min_id];
+}
+
+static ccv_bbf_feature_t _ccv_bbf_convex_optimize(unsigned char **posdata, int posnum, unsigned char **negdata, int negnum, ccv_bbf_feature_t *best_feature, ccv_size_t size, double *pw, double *nw)
+{
+ ccv_bbf_gene_t best_gene;
+ /* seed (random method) */
+ gsl_rng_env_setup();
+ gsl_rng *rng = gsl_rng_alloc(gsl_rng_default);
+ union {
+ unsigned long int li;
+ double db;
+ } dbli;
+ dbli.db = pw[0] + nw[0];
+ gsl_rng_set(rng, dbli.li);
+ int i, j, k, q, p, g, t;
+ int rows[] = {size.height, size.height >> 1, size.height >> 2};
+ int cols[] = {size.width, size.width >> 1, size.width >> 2};
+ int pnum = rows[0] * cols[0] + rows[1] * cols[1] + rows[2] * cols[2];
+ ccv_bbf_gene_t *gene = (ccv_bbf_gene_t *)ccmalloc((pnum * (CCV_BBF_POINT_MAX * 2 + 1) * 2 + CCV_BBF_POINT_MAX * 2 + 1) * sizeof(ccv_bbf_gene_t));
+ if (best_feature == 0)
+ {
+ /* bootstrapping the best feature, start from two pixels, one for positive, one for negative
+ * the bootstrapping process go like this: first, it will assign a random pixel as positive
+ * and enumerate every possible pixel as negative, and pick the best one. Then, enumerate every
+ * possible pixel as positive, and pick the best one, until it converges */
+ memset(&best_gene, 0, sizeof(ccv_bbf_gene_t));
+ for (i = 0; i < CCV_BBF_POINT_MAX; i++)
+ best_gene.feature.pz[i] = best_gene.feature.nz[i] = -1;
+ best_gene.pk = 1;
+ best_gene.nk = 0;
+ best_gene.feature.size = 1;
+ best_gene.feature.pz[0] = gsl_rng_uniform_int(rng, 3);
+ best_gene.feature.px[0] = gsl_rng_uniform_int(rng, cols[best_gene.feature.pz[0]]);
+ best_gene.feature.py[0] = gsl_rng_uniform_int(rng, rows[best_gene.feature.pz[0]]);
+ for (t = 0;; ++t)
+ {
+ g = 0;
+ if (t % 2 == 0)
+ {
+ for (i = 0; i < 3; i++)
+ for (j = 0; j < cols[i]; j++)
+ for (k = 0; k < rows[i]; k++)
+ if (i != best_gene.feature.pz[0] || j != best_gene.feature.px[0] || k != best_gene.feature.py[0])
+ {
+ gene[g] = best_gene;
+ gene[g].pk = gene[g].nk = 1;
+ gene[g].feature.nz[0] = i;
+ gene[g].feature.nx[0] = j;
+ gene[g].feature.ny[0] = k;
+ g++;
+ }
+ }
+ else
+ {
+ for (i = 0; i < 3; i++)
+ for (j = 0; j < cols[i]; j++)
+ for (k = 0; k < rows[i]; k++)
+ if (i != best_gene.feature.nz[0] || j != best_gene.feature.nx[0] || k != best_gene.feature.ny[0])
+ {
+ gene[g] = best_gene;
+ gene[g].pk = gene[g].nk = 1;
+ gene[g].feature.pz[0] = i;
+ gene[g].feature.px[0] = j;
+ gene[g].feature.py[0] = k;
+ g++;
+ }
+ }
+ PRINT(CCV_CLI_INFO, "bootstrapping round : %d\n", t);
+ ccv_bbf_gene_t local_gene = _ccv_bbf_best_gene(gene, g, 2, posdata, posnum, negdata, negnum, size, pw, nw);
+ if (local_gene.error >= best_gene.error - 1e-10)
+ break;
+ best_gene = local_gene;
+ }
+ }
+ else
+ {
+ best_gene.feature = *best_feature;
+ best_gene.pk = best_gene.nk = best_gene.feature.size;
+ for (i = 0; i < CCV_BBF_POINT_MAX; i++)
+ if (best_feature->pz[i] == -1)
+ {
+ best_gene.pk = i;
+ break;
+ }
+ for (i = 0; i < CCV_BBF_POINT_MAX; i++)
+ if (best_feature->nz[i] == -1)
+ {
+ best_gene.nk = i;
+ break;
+ }
+ }
+ /* after bootstrapping, the float search technique will do the following permutations:
+ * a). add a new point to positive or negative
+ * b). remove a point from positive or negative
+ * c). move an existing point in positive or negative to another position
+ * the three rules applied exhaustively, no heuristic used. */
+ for (t = 0;; ++t)
+ {
+ g = 0;
+ for (i = 0; i < 3; i++)
+ for (j = 0; j < cols[i]; j++)
+ for (k = 0; k < rows[i]; k++)
+ if (!_ccv_bbf_exist_gene_feature(&best_gene, j, k, i))
+ {
+ /* add positive point */
+ if (best_gene.pk < CCV_BBF_POINT_MAX - 1)
+ {
+ gene[g] = best_gene;
+ gene[g].feature.pz[gene[g].pk] = i;
+ gene[g].feature.px[gene[g].pk] = j;
+ gene[g].feature.py[gene[g].pk] = k;
+ gene[g].pk++;
+ gene[g].feature.size = ccv_max(gene[g].pk, gene[g].nk);
+ g++;
+ }
+ /* add negative point */
+ if (best_gene.nk < CCV_BBF_POINT_MAX - 1)
+ {
+ gene[g] = best_gene;
+ gene[g].feature.nz[gene[g].nk] = i;
+ gene[g].feature.nx[gene[g].nk] = j;
+ gene[g].feature.ny[gene[g].nk] = k;
+ gene[g].nk++;
+ gene[g].feature.size = ccv_max(gene[g].pk, gene[g].nk);
+ g++;
+ }
+ /* refine positive point */
+ for (q = 0; q < best_gene.pk; q++)
+ {
+ gene[g] = best_gene;
+ gene[g].feature.pz[q] = i;
+ gene[g].feature.px[q] = j;
+ gene[g].feature.py[q] = k;
+ g++;
+ }
+ /* add positive point, remove negative point */
+ if (best_gene.pk < CCV_BBF_POINT_MAX - 1 && best_gene.nk > 1)
+ {
+ for (q = 0; q < best_gene.nk; q++)
+ {
+ gene[g] = best_gene;
+ gene[g].feature.pz[gene[g].pk] = i;
+ gene[g].feature.px[gene[g].pk] = j;
+ gene[g].feature.py[gene[g].pk] = k;
+ gene[g].pk++;
+ for (p = q; p < best_gene.nk - 1; p++)
+ {
+ gene[g].feature.nz[p] = gene[g].feature.nz[p + 1];
+ gene[g].feature.nx[p] = gene[g].feature.nx[p + 1];
+ gene[g].feature.ny[p] = gene[g].feature.ny[p + 1];
+ }
+ gene[g].feature.nz[gene[g].nk - 1] = -1;
+ gene[g].nk--;
+ gene[g].feature.size = ccv_max(gene[g].pk, gene[g].nk);
+ g++;
+ }
+ }
+ /* refine negative point */
+ for (q = 0; q < best_gene.nk; q++)
+ {
+ gene[g] = best_gene;
+ gene[g].feature.nz[q] = i;
+ gene[g].feature.nx[q] = j;
+ gene[g].feature.ny[q] = k;
+ g++;
+ }
+ /* add negative point, remove positive point */
+ if (best_gene.pk > 1 && best_gene.nk < CCV_BBF_POINT_MAX - 1)
+ {
+ for (q = 0; q < best_gene.pk; q++)
+ {
+ gene[g] = best_gene;
+ gene[g].feature.nz[gene[g].nk] = i;
+ gene[g].feature.nx[gene[g].nk] = j;
+ gene[g].feature.ny[gene[g].nk] = k;
+ gene[g].nk++;
+ for (p = q; p < best_gene.pk - 1; p++)
+ {
+ gene[g].feature.pz[p] = gene[g].feature.pz[p + 1];
+ gene[g].feature.px[p] = gene[g].feature.px[p + 1];
+ gene[g].feature.py[p] = gene[g].feature.py[p + 1];
+ }
+ gene[g].feature.pz[gene[g].pk - 1] = -1;
+ gene[g].pk--;
+ gene[g].feature.size = ccv_max(gene[g].pk, gene[g].nk);
+ g++;
+ }
+ }
+ }
+ if (best_gene.pk > 1)
+ for (q = 0; q < best_gene.pk; q++)
+ {
+ gene[g] = best_gene;
+ for (i = q; i < best_gene.pk - 1; i++)
+ {
+ gene[g].feature.pz[i] = gene[g].feature.pz[i + 1];
+ gene[g].feature.px[i] = gene[g].feature.px[i + 1];
+ gene[g].feature.py[i] = gene[g].feature.py[i + 1];
+ }
+ gene[g].feature.pz[gene[g].pk - 1] = -1;
+ gene[g].pk--;
+ gene[g].feature.size = ccv_max(gene[g].pk, gene[g].nk);
+ g++;
+ }
+ if (best_gene.nk > 1)
+ for (q = 0; q < best_gene.nk; q++)
+ {
+ gene[g] = best_gene;
+ for (i = q; i < best_gene.nk - 1; i++)
+ {
+ gene[g].feature.nz[i] = gene[g].feature.nz[i + 1];
+ gene[g].feature.nx[i] = gene[g].feature.nx[i + 1];
+ gene[g].feature.ny[i] = gene[g].feature.ny[i + 1];
+ }
+ gene[g].feature.nz[gene[g].nk - 1] = -1;
+ gene[g].nk--;
+ gene[g].feature.size = ccv_max(gene[g].pk, gene[g].nk);
+ g++;
+ }
+ gene[g] = best_gene;
+ g++;
+ PRINT(CCV_CLI_INFO, "float search round : %d\n", t);
+ ccv_bbf_gene_t local_gene = _ccv_bbf_best_gene(gene, g, CCV_BBF_POINT_MIN, posdata, posnum, negdata, negnum, size, pw, nw);
+ if (local_gene.error >= best_gene.error - 1e-10)
+ break;
+ best_gene = local_gene;
+ }
+ ccfree(gene);
+ gsl_rng_free(rng);
+ return best_gene.feature;
+}
+
+static int _ccv_write_bbf_stage_classifier(const char *file, ccv_bbf_stage_classifier_t *classifier)
+{
+ FILE *w = fopen(file, "wb");
+ if (w == 0)
+ return -1;
+ fprintf(w, "%d\n", classifier->count);
+ union {
+ float fl;
+ int i;
+ } fli;
+ fli.fl = classifier->threshold;
+ fprintf(w, "%d\n", fli.i);
+ int i, j;
+ for (i = 0; i < classifier->count; i++)
+ {
+ fprintf(w, "%d\n", classifier->feature[i].size);
+ for (j = 0; j < classifier->feature[i].size; j++)
+ {
+ fprintf(w, "%d %d %d\n", classifier->feature[i].px[j], classifier->feature[i].py[j], classifier->feature[i].pz[j]);
+ fprintf(w, "%d %d %d\n", classifier->feature[i].nx[j], classifier->feature[i].ny[j], classifier->feature[i].nz[j]);
+ }
+ union {
+ float fl;
+ int i;
+ } flia, flib;
+ flia.fl = classifier->alpha[i * 2];
+ flib.fl = classifier->alpha[i * 2 + 1];
+ fprintf(w, "%d %d\n", flia.i, flib.i);
+ }
+ fclose(w);
+ return 0;
+}
+
+static int _ccv_read_background_data(const char *file, unsigned char **negdata, int *negnum, ccv_size_t size)
+{
+ int stat = 0;
+ FILE *r = fopen(file, "rb");
+ if (r == 0)
+ return -1;
+ stat |= fread(negnum, sizeof(int), 1, r);
+ int i;
+ int isizs012 = _ccv_width_padding(size.width) * size.height +
+ _ccv_width_padding(size.width >> 1) * (size.height >> 1) +
+ _ccv_width_padding(size.width >> 2) * (size.height >> 2);
+ for (i = 0; i < *negnum; i++)
+ {
+ negdata[i] = (unsigned char *)ccmalloc(isizs012);
+ stat |= fread(negdata[i], 1, isizs012, r);
+ }
+ fclose(r);
+ return 0;
+}
+
+static int _ccv_write_background_data(const char *file, unsigned char **negdata, int negnum, ccv_size_t size)
+{
+ FILE *w = fopen(file, "w");
+ if (w == 0)
+ return -1;
+ fwrite(&negnum, sizeof(int), 1, w);
+ int i;
+ int isizs012 = _ccv_width_padding(size.width) * size.height +
+ _ccv_width_padding(size.width >> 1) * (size.height >> 1) +
+ _ccv_width_padding(size.width >> 2) * (size.height >> 2);
+ for (i = 0; i < negnum; i++)
+ fwrite(negdata[i], 1, isizs012, w);
+ fclose(w);
+ return 0;
+}
+
+static int _ccv_resume_bbf_cascade_training_state(const char *file, int *i, int *k, int *bg, double *pw, double *nw, int posnum, int negnum)
+{
+ int stat = 0;
+ FILE *r = fopen(file, "r");
+ if (r == 0)
+ return -1;
+ stat |= fscanf(r, "%d %d %d", i, k, bg);
+ int j;
+ union {
+ double db;
+ int i[2];
+ } dbi;
+ for (j = 0; j < posnum; j++)
+ {
+ stat |= fscanf(r, "%d %d", &dbi.i[0], &dbi.i[1]);
+ pw[j] = dbi.db;
+ }
+ for (j = 0; j < negnum; j++)
+ {
+ stat |= fscanf(r, "%d %d", &dbi.i[0], &dbi.i[1]);
+ nw[j] = dbi.db;
+ }
+ fclose(r);
+ return 0;
+}
+
+static int _ccv_save_bbf_cacade_training_state(const char *file, int i, int k, int bg, double *pw, double *nw, int posnum, int negnum)
+{
+ FILE *w = fopen(file, "w");
+ if (w == 0)
+ return -1;
+ fprintf(w, "%d %d %d\n", i, k, bg);
+ int j;
+ union {
+ double db;
+ int i[2];
+ } dbi;
+ for (j = 0; j < posnum; ++j)
+ {
+ dbi.db = pw[j];
+ fprintf(w, "%d %d ", dbi.i[0], dbi.i[1]);
+ }
+ fprintf(w, "\n");
+ for (j = 0; j < negnum; ++j)
+ {
+ dbi.db = nw[j];
+ fprintf(w, "%d %d ", dbi.i[0], dbi.i[1]);
+ }
+ fprintf(w, "\n");
+ fclose(w);
+ return 0;
+}
+
+void ccv_bbf_classifier_cascade_new(ccv_dense_matrix_t **posimg, int posnum, char **bgfiles, int bgnum, int negnum, ccv_size_t size, const char *dir, ccv_bbf_new_param_t params)
+{
+ int i, j, k;
+ /* allocate memory for usage */
+ ccv_bbf_classifier_cascade_t *cascade = (ccv_bbf_classifier_cascade_t *)ccmalloc(sizeof(ccv_bbf_classifier_cascade_t));
+ cascade->count = 0;
+ cascade->size = size;
+ cascade->stage_classifier = (ccv_bbf_stage_classifier_t *)ccmalloc(sizeof(ccv_bbf_stage_classifier_t));
+ unsigned char **posdata = (unsigned char **)ccmalloc(posnum * sizeof(unsigned char *));
+ unsigned char **negdata = (unsigned char **)ccmalloc(negnum * sizeof(unsigned char *));
+ double *pw = (double *)ccmalloc(posnum * sizeof(double));
+ double *nw = (double *)ccmalloc(negnum * sizeof(double));
+ float *peval = (float *)ccmalloc(posnum * sizeof(float));
+ float *neval = (float *)ccmalloc(negnum * sizeof(float));
+ double inv_balance_k = 1. / params.balance_k;
+ /* balance factor k, and weighted with 0.01 */
+ params.balance_k *= 0.01;
+ inv_balance_k *= 0.01;
+
+ int steps[] = {_ccv_width_padding(cascade->size.width),
+ _ccv_width_padding(cascade->size.width >> 1),
+ _ccv_width_padding(cascade->size.width >> 2)};
+ int isizs0 = steps[0] * cascade->size.height;
+ int isizs01 = isizs0 + steps[1] * (cascade->size.height >> 1);
+
+ i = 0;
+ k = 0;
+ int bg = 0;
+ int cacheK = 10;
+ /* state resume code */
+ char buf[1024];
+ sprintf(buf, "%s/stat.txt", dir);
+ _ccv_resume_bbf_cascade_training_state(buf, &i, &k, &bg, pw, nw, posnum, negnum);
+ if (i > 0)
+ {
+ cascade->count = i;
+ ccfree(cascade->stage_classifier);
+ cascade->stage_classifier = (ccv_bbf_stage_classifier_t *)ccmalloc(i * sizeof(ccv_bbf_stage_classifier_t));
+ for (j = 0; j < i; j++)
+ {
+ sprintf(buf, "%s/stage-%d.txt", dir, j);
+ _ccv_read_bbf_stage_classifier(buf, &cascade->stage_classifier[j]);
+ }
+ }
+ if (k > 0)
+ cacheK = k;
+ int rpos, rneg = 0;
+ if (bg)
+ {
+ sprintf(buf, "%s/negs.txt", dir);
+ _ccv_read_background_data(buf, negdata, &rneg, cascade->size);
+ }
+
+ for (; i < params.layer; i++)
+ {
+ if (!bg)
+ {
+ rneg = _ccv_prepare_background_data(cascade, bgfiles, bgnum, negdata, negnum);
+ /* save state of background data */
+ sprintf(buf, "%s/negs.txt", dir);
+ _ccv_write_background_data(buf, negdata, rneg, cascade->size);
+ bg = 1;
+ }
+ double totalw;
+ /* save state of cascade : level, weight etc. */
+ sprintf(buf, "%s/stat.txt", dir);
+ _ccv_save_bbf_cacade_training_state(buf, i, k, bg, pw, nw, posnum, negnum);
+ ccv_bbf_stage_classifier_t classifier;
+ if (k > 0)
+ {
+ /* resume state of classifier */
+ sprintf(buf, "%s/stage-%d.txt", dir, i);
+ _ccv_read_bbf_stage_classifier(buf, &classifier);
+ }
+ else
+ {
+ /* initialize classifier */
+ for (j = 0; j < posnum; j++)
+ pw[j] = params.balance_k;
+ for (j = 0; j < rneg; j++)
+ nw[j] = inv_balance_k;
+ classifier.count = k;
+ classifier.threshold = 0;
+ classifier.feature = (ccv_bbf_feature_t *)ccmalloc(cacheK * sizeof(ccv_bbf_feature_t));
+ classifier.alpha = (float *)ccmalloc(cacheK * 2 * sizeof(float));
+ }
+ _ccv_prepare_positive_data(posimg, posdata, cascade->size, posnum);
+ rpos = _ccv_prune_positive_data(cascade, posdata, posnum, cascade->size);
+ PRINT(CCV_CLI_INFO, "%d postivie data and %d negative data in training\n", rpos, rneg);
+ /* reweight to 1.00 */
+ totalw = 0;
+ for (j = 0; j < rpos; j++)
+ totalw += pw[j];
+ for (j = 0; j < rneg; j++)
+ totalw += nw[j];
+ for (j = 0; j < rpos; j++)
+ pw[j] = pw[j] / totalw;
+ for (j = 0; j < rneg; j++)
+ nw[j] = nw[j] / totalw;
+ for (;; k++)
+ {
+ /* get overall true-positive, false-positive rate and threshold */
+ double tp = 0, fp = 0, etp = 0, efp = 0;
+ _ccv_bbf_eval_data(&classifier, posdata, rpos, negdata, rneg, cascade->size, peval, neval);
+ _ccv_sort_32f(peval, rpos, 0);
+ classifier.threshold = peval[(int)((1. - params.pos_crit) * rpos)] - 1e-6;
+ for (j = 0; j < rpos; j++)
+ {
+ if (peval[j] >= 0)
+ ++tp;
+ if (peval[j] >= classifier.threshold)
+ ++etp;
+ }
+ tp /= rpos;
+ etp /= rpos;
+ for (j = 0; j < rneg; j++)
+ {
+ if (neval[j] >= 0)
+ ++fp;
+ if (neval[j] >= classifier.threshold)
+ ++efp;
+ }
+ fp /= rneg;
+ efp /= rneg;
+ PRINT(CCV_CLI_INFO, "stage classifier real TP rate : %f, FP rate : %f\n", tp, fp);
+ PRINT(CCV_CLI_INFO, "stage classifier TP rate : %f, FP rate : %f at threshold : %f\n", etp, efp, classifier.threshold);
+ if (k > 0)
+ {
+ /* save classifier state */
+ sprintf(buf, "%s/stage-%d.txt", dir, i);
+ _ccv_write_bbf_stage_classifier(buf, &classifier);
+ sprintf(buf, "%s/stat.txt", dir);
+ _ccv_save_bbf_cacade_training_state(buf, i, k, bg, pw, nw, posnum, negnum);
+ }
+ if (etp > params.pos_crit && efp < params.neg_crit)
+ break;
+ /* TODO: more post-process is needed in here */
+
+ /* select the best feature in current distribution through genetic algorithm optimization */
+ ccv_bbf_feature_t best;
+ if (params.optimizer == CCV_BBF_GENETIC_OPT)
+ {
+ best = _ccv_bbf_genetic_optimize(posdata, rpos, negdata, rneg, params.feature_number, cascade->size, pw, nw);
+ }
+ else if (params.optimizer == CCV_BBF_FLOAT_OPT)
+ {
+ best = _ccv_bbf_convex_optimize(posdata, rpos, negdata, rneg, 0, cascade->size, pw, nw);
+ }
+ else
+ {
+ best = _ccv_bbf_genetic_optimize(posdata, rpos, negdata, rneg, params.feature_number, cascade->size, pw, nw);
+ best = _ccv_bbf_convex_optimize(posdata, rpos, negdata, rneg, &best, cascade->size, pw, nw);
+ }
+ double err = _ccv_bbf_error_rate(&best, posdata, rpos, negdata, rneg, cascade->size, pw, nw);
+ double rw = (1 - err) / err;
+ totalw = 0;
+ /* reweight */
+ for (j = 0; j < rpos; j++)
+ {
+ unsigned char *u8[] = {posdata[j], posdata[j] + isizs0, posdata[j] + isizs01};
+ if (!_ccv_run_bbf_feature(&best, steps, u8))
+ pw[j] *= rw;
+ pw[j] *= params.balance_k;
+ totalw += pw[j];
+ }
+ for (j = 0; j < rneg; j++)
+ {
+ unsigned char *u8[] = {negdata[j], negdata[j] + isizs0, negdata[j] + isizs01};
+ if (_ccv_run_bbf_feature(&best, steps, u8))
+ nw[j] *= rw;
+ nw[j] *= inv_balance_k;
+ totalw += nw[j];
+ }
+ for (j = 0; j < rpos; j++)
+ pw[j] = pw[j] / totalw;
+ for (j = 0; j < rneg; j++)
+ nw[j] = nw[j] / totalw;
+ double c = log(rw);
+ PRINT(CCV_CLI_INFO, "coefficient of feature %d: %f\n", k + 1, c);
+ classifier.count = k + 1;
+ /* resizing classifier */
+ if (k >= cacheK)
+ {
+ ccv_bbf_feature_t *feature = (ccv_bbf_feature_t *)ccmalloc(cacheK * 2 * sizeof(ccv_bbf_feature_t));
+ memcpy(feature, classifier.feature, cacheK * sizeof(ccv_bbf_feature_t));
+ ccfree(classifier.feature);
+ float *alpha = (float *)ccmalloc(cacheK * 4 * sizeof(float));
+ memcpy(alpha, classifier.alpha, cacheK * 2 * sizeof(float));
+ ccfree(classifier.alpha);
+ classifier.feature = feature;
+ classifier.alpha = alpha;
+ cacheK *= 2;
+ }
+ /* setup new feature */
+ classifier.feature[k] = best;
+ classifier.alpha[k * 2] = -c;
+ classifier.alpha[k * 2 + 1] = c;
+ }
+ cascade->count = i + 1;
+ ccv_bbf_stage_classifier_t *stage_classifier = (ccv_bbf_stage_classifier_t *)ccmalloc(cascade->count * sizeof(ccv_bbf_stage_classifier_t));
+ memcpy(stage_classifier, cascade->stage_classifier, i * sizeof(ccv_bbf_stage_classifier_t));
+ ccfree(cascade->stage_classifier);
+ stage_classifier[i] = classifier;
+ cascade->stage_classifier = stage_classifier;
+ k = 0;
+ bg = 0;
+ for (j = 0; j < rpos; j++)
+ ccfree(posdata[j]);
+ for (j = 0; j < rneg; j++)
+ ccfree(negdata[j]);
+ }
+
+ ccfree(neval);
+ ccfree(peval);
+ ccfree(nw);
+ ccfree(pw);
+ ccfree(negdata);
+ ccfree(posdata);
+ ccfree(cascade);
+}
+#else
+void ccv_bbf_classifier_cascade_new(ccv_dense_matrix_t **posimg, int posnum, char **bgfiles, int bgnum, int negnum, ccv_size_t size, const char *dir, ccv_bbf_new_param_t params)
+{
+ fprintf(stderr, " ccv_bbf_classifier_cascade_new requires libgsl support, please compile ccv with libgsl.\n");
+}
+#endif
+
+static int _ccv_is_equal(const void *_r1, const void *_r2, void *data)
+{
+ const ccv_comp_t *r1 = (const ccv_comp_t *)_r1;
+ const ccv_comp_t *r2 = (const ccv_comp_t *)_r2;
+ int distance = (int)(r1->rect.width * 0.25 + 0.5);
+
+ return r2->rect.x <= r1->rect.x + distance &&
+ r2->rect.x >= r1->rect.x - distance &&
+ r2->rect.y <= r1->rect.y + distance &&
+ r2->rect.y >= r1->rect.y - distance &&
+ r2->rect.width <= (int)(r1->rect.width * 1.5 + 0.5) &&
+ (int)(r2->rect.width * 1.5 + 0.5) >= r1->rect.width;
+}
+
+static int _ccv_is_equal_same_class(const void *_r1, const void *_r2, void *data)
+{
+ const ccv_comp_t *r1 = (const ccv_comp_t *)_r1;
+ const ccv_comp_t *r2 = (const ccv_comp_t *)_r2;
+ int distance = (int)(r1->rect.width * 0.25 + 0.5);
+
+ return r2->classification.id == r1->classification.id &&
+ r2->rect.x <= r1->rect.x + distance &&
+ r2->rect.x >= r1->rect.x - distance &&
+ r2->rect.y <= r1->rect.y + distance &&
+ r2->rect.y >= r1->rect.y - distance &&
+ r2->rect.width <= (int)(r1->rect.width * 1.5 + 0.5) &&
+ (int)(r2->rect.width * 1.5 + 0.5) >= r1->rect.width;
+}
+
+ccv_array_t *ccv_bbf_detect_objects(ccv_dense_matrix_t *a, ccv_bbf_classifier_cascade_t **_cascade, int count, ccv_bbf_param_t params)
+{
+ int hr = a->rows / params.size.height;
+ int wr = a->cols / params.size.width;
+ double scale = pow(2., 1. / (params.interval + 1.));
+ int next = params.interval + 1;
+ int scale_upto = (int)(log((double)ccv_min(hr, wr)) / log(scale));
+ ccv_dense_matrix_t **pyr = (ccv_dense_matrix_t **)alloca((scale_upto + next * 2) * 4 * sizeof(ccv_dense_matrix_t *));
+ memset(pyr, 0, (scale_upto + next * 2) * 4 * sizeof(ccv_dense_matrix_t *));
+ if (params.size.height != _cascade[0]->size.height || params.size.width != _cascade[0]->size.width)
+ ccv_resample(a, &pyr[0], 0, a->rows * _cascade[0]->size.height / params.size.height, a->cols * _cascade[0]->size.width / params.size.width, CCV_INTER_AREA);
+ else
+ pyr[0] = a;
+ int i, j, k, t, x, y, q;
+ for (i = 1; i < ccv_min(params.interval + 1, scale_upto + next * 2); i++)
+ ccv_resample(pyr[0], &pyr[i * 4], 0, (int)(pyr[0]->rows / pow(scale, i)), (int)(pyr[0]->cols / pow(scale, i)), CCV_INTER_AREA);
+ for (i = next; i < scale_upto + next * 2; i++)
+ ccv_sample_down(pyr[i * 4 - next * 4], &pyr[i * 4], 0, 0, 0);
+ if (params.accurate)
+ for (i = next * 2; i < scale_upto + next * 2; i++)
+ {
+ ccv_sample_down(pyr[i * 4 - next * 4], &pyr[i * 4 + 1], 0, 1, 0);
+ ccv_sample_down(pyr[i * 4 - next * 4], &pyr[i * 4 + 2], 0, 0, 1);
+ ccv_sample_down(pyr[i * 4 - next * 4], &pyr[i * 4 + 3], 0, 1, 1);
+ }
+ ccv_array_t *idx_seq;
+ ccv_array_t *seq = ccv_array_new(sizeof(ccv_comp_t), 64, 0);
+ ccv_array_t *seq2 = ccv_array_new(sizeof(ccv_comp_t), 64, 0);
+ ccv_array_t *result_seq = ccv_array_new(sizeof(ccv_comp_t), 64, 0);
+ /* detect in multi scale */
+ for (t = 0; t < count; t++)
+ {
+ ccv_bbf_classifier_cascade_t *cascade = _cascade[t];
+ float scale_x = (float)params.size.width / (float)cascade->size.width;
+ float scale_y = (float)params.size.height / (float)cascade->size.height;
+ ccv_array_clear(seq);
+ for (i = 0; i < scale_upto; i++)
+ {
+ int dx[] = {0, 1, 0, 1};
+ int dy[] = {0, 0, 1, 1};
+ int i_rows = pyr[i * 4 + next * 8]->rows - (cascade->size.height >> 2);
+ int steps[] = {pyr[i * 4]->step, pyr[i * 4 + next * 4]->step, pyr[i * 4 + next * 8]->step};
+ int i_cols = pyr[i * 4 + next * 8]->cols - (cascade->size.width >> 2);
+ int paddings[] = {pyr[i * 4]->step * 4 - i_cols * 4,
+ pyr[i * 4 + next * 4]->step * 2 - i_cols * 2,
+ pyr[i * 4 + next * 8]->step - i_cols};
+ for (q = 0; q < (params.accurate ? 4 : 1); q++)
+ {
+ unsigned char *u8[] = {pyr[i * 4]->data.u8 + dx[q] * 2 + dy[q] * pyr[i * 4]->step * 2, pyr[i * 4 + next * 4]->data.u8 + dx[q] + dy[q] * pyr[i * 4 + next * 4]->step, pyr[i * 4 + next * 8 + q]->data.u8};
+ for (y = 0; y < i_rows; y++)
+ {
+ for (x = 0; x < i_cols; x++)
+ {
+ float sum;
+ int flag = 1;
+ ccv_bbf_stage_classifier_t *classifier = cascade->stage_classifier;
+ for (j = 0; j < cascade->count; ++j, ++classifier)
+ {
+ sum = 0;
+ float *alpha = classifier->alpha;
+ ccv_bbf_feature_t *feature = classifier->feature;
+ for (k = 0; k < classifier->count; ++k, alpha += 2, ++feature)
+ sum += alpha[_ccv_run_bbf_feature(feature, steps, u8)];
+ if (sum < classifier->threshold)
+ {
+ flag = 0;
+ break;
+ }
+ }
+ if (flag)
+ {
+ ccv_comp_t comp;
+ comp.rect = ccv_rect((int)((x * 4 + dx[q] * 2) * scale_x + 0.5), (int)((y * 4 + dy[q] * 2) * scale_y + 0.5), (int)(cascade->size.width * scale_x + 0.5), (int)(cascade->size.height * scale_y + 0.5));
+ comp.neighbors = 1;
+ comp.classification.id = t;
+ comp.classification.confidence = sum;
+ ccv_array_push(seq, &comp);
+ }
+ u8[0] += 4;
+ u8[1] += 2;
+ u8[2] += 1;
+ }
+ u8[0] += paddings[0];
+ u8[1] += paddings[1];
+ u8[2] += paddings[2];
+ }
+ }
+ scale_x *= scale;
+ scale_y *= scale;
+ }
+
+ /* the following code from OpenCV's haar feature implementation */
+ if (params.min_neighbors == 0)
+ {
+ for (i = 0; i < seq->rnum; i++)
+ {
+ ccv_comp_t *comp = (ccv_comp_t *)ccv_array_get(seq, i);
+ ccv_array_push(result_seq, comp);
+ }
+ }
+ else
+ {
+ idx_seq = 0;
+ ccv_array_clear(seq2);
+ // group retrieved rectangles in order to filter out noise
+ int ncomp = ccv_array_group(seq, &idx_seq, _ccv_is_equal_same_class, 0);
+ ccv_comp_t *comps = (ccv_comp_t *)ccmalloc((ncomp + 1) * sizeof(ccv_comp_t));
+ memset(comps, 0, (ncomp + 1) * sizeof(ccv_comp_t));
+
+ // count number of neighbors
+ for (i = 0; i < seq->rnum; i++)
+ {
+ ccv_comp_t r1 = *(ccv_comp_t *)ccv_array_get(seq, i);
+ int idx = *(int *)ccv_array_get(idx_seq, i);
+
+ if (comps[idx].neighbors == 0)
+ comps[idx].classification.confidence = r1.classification.confidence;
+
+ ++comps[idx].neighbors;
+
+ comps[idx].rect.x += r1.rect.x;
+ comps[idx].rect.y += r1.rect.y;
+ comps[idx].rect.width += r1.rect.width;
+ comps[idx].rect.height += r1.rect.height;
+ comps[idx].classification.id = r1.classification.id;
+ comps[idx].classification.confidence = ccv_max(comps[idx].classification.confidence, r1.classification.confidence);
+ }
+
+ // calculate average bounding box
+ for (i = 0; i < ncomp; i++)
+ {
+ int n = comps[i].neighbors;
+ if (n >= params.min_neighbors)
+ {
+ ccv_comp_t comp;
+ comp.rect.x = (comps[i].rect.x * 2 + n) / (2 * n);
+ comp.rect.y = (comps[i].rect.y * 2 + n) / (2 * n);
+ comp.rect.width = (comps[i].rect.width * 2 + n) / (2 * n);
+ comp.rect.height = (comps[i].rect.height * 2 + n) / (2 * n);
+ comp.neighbors = comps[i].neighbors;
+ comp.classification.id = comps[i].classification.id;
+ comp.classification.confidence = comps[i].classification.confidence;
+ ccv_array_push(seq2, &comp);
+ }
+ }
+
+ // filter out small face rectangles inside large face rectangles
+ for (i = 0; i < seq2->rnum; i++)
+ {
+ ccv_comp_t r1 = *(ccv_comp_t *)ccv_array_get(seq2, i);
+ int flag = 1;
+
+ for (j = 0; j < seq2->rnum; j++)
+ {
+ ccv_comp_t r2 = *(ccv_comp_t *)ccv_array_get(seq2, j);
+ int distance = (int)(r2.rect.width * 0.25 + 0.5);
+
+ if (i != j &&
+ r1.classification.id == r2.classification.id &&
+ r1.rect.x >= r2.rect.x - distance &&
+ r1.rect.y >= r2.rect.y - distance &&
+ r1.rect.x + r1.rect.width <= r2.rect.x + r2.rect.width + distance &&
+ r1.rect.y + r1.rect.height <= r2.rect.y + r2.rect.height + distance &&
+ (r2.neighbors > ccv_max(3, r1.neighbors) || r1.neighbors < 3))
+ {
+ flag = 0;
+ break;
+ }
+ }
+
+ if (flag)
+ ccv_array_push(result_seq, &r1);
+ }
+ ccv_array_free(idx_seq);
+ ccfree(comps);
+ }
+ }
+
+ ccv_array_free(seq);
+ ccv_array_free(seq2);
+
+ ccv_array_t *result_seq2;
+ /* the following code from OpenCV's haar feature implementation */
+ if (params.flags & CCV_BBF_NO_NESTED)
+ {
+ result_seq2 = ccv_array_new(sizeof(ccv_comp_t), 64, 0);
+ idx_seq = 0;
+ // group retrieved rectangles in order to filter out noise
+ int ncomp = ccv_array_group(result_seq, &idx_seq, _ccv_is_equal, 0);
+ ccv_comp_t *comps = (ccv_comp_t *)ccmalloc((ncomp + 1) * sizeof(ccv_comp_t));
+ memset(comps, 0, (ncomp + 1) * sizeof(ccv_comp_t));
+
+ // count number of neighbors
+ for (i = 0; i < result_seq->rnum; i++)
+ {
+ ccv_comp_t r1 = *(ccv_comp_t *)ccv_array_get(result_seq, i);
+ int idx = *(int *)ccv_array_get(idx_seq, i);
+
+ if (comps[idx].neighbors == 0 || comps[idx].classification.confidence < r1.classification.confidence)
+ {
+ comps[idx].classification.confidence = r1.classification.confidence;
+ comps[idx].neighbors = 1;
+ comps[idx].rect = r1.rect;
+ comps[idx].classification.id = r1.classification.id;
+ }
+ }
+
+ // calculate average bounding box
+ for (i = 0; i < ncomp; i++)
+ if (comps[i].neighbors)
+ ccv_array_push(result_seq2, &comps[i]);
+
+ ccv_array_free(result_seq);
+ ccfree(comps);
+ }
+ else
+ {
+ result_seq2 = result_seq;
+ }
+
+ for (i = 1; i < scale_upto + next * 2; i++)
+ ccv_matrix_free(pyr[i * 4]);
+ if (params.accurate)
+ for (i = next * 2; i < scale_upto + next * 2; i++)
+ {
+ ccv_matrix_free(pyr[i * 4 + 1]);
+ ccv_matrix_free(pyr[i * 4 + 2]);
+ ccv_matrix_free(pyr[i * 4 + 3]);
+ }
+ if (params.size.height != _cascade[0]->size.height || params.size.width != _cascade[0]->size.width)
+ ccv_matrix_free(pyr[0]);
+
+ return result_seq2;
+}
+
+ccv_bbf_classifier_cascade_t *ccv_bbf_read_classifier_cascade(const char *directory)
+{
+ char buf[1024];
+ sprintf(buf, "%s/cascade.txt", directory);
+ int s, i;
+ FILE *r = fopen(buf, "r");
+ if (r == 0)
+ return 0;
+ ccv_bbf_classifier_cascade_t *cascade = (ccv_bbf_classifier_cascade_t *)ccmalloc(sizeof(ccv_bbf_classifier_cascade_t));
+ s = fscanf(r, "%d %d %d", &cascade->count, &cascade->size.width, &cascade->size.height);
+ assert(s > 0);
+ cascade->stage_classifier = (ccv_bbf_stage_classifier_t *)ccmalloc(cascade->count * sizeof(ccv_bbf_stage_classifier_t));
+ for (i = 0; i < cascade->count; i++)
+ {
+ sprintf(buf, "%s/stage-%d.txt", directory, i);
+ if (_ccv_read_bbf_stage_classifier(buf, &cascade->stage_classifier[i]) < 0)
+ {
+ cascade->count = i;
+ break;
+ }
+ }
+ fclose(r);
+ return cascade;
+}
+
+ccv_bbf_classifier_cascade_t *ccv_bbf_classifier_cascade_read_binary(char *s)
+{
+ int i;
+ ccv_bbf_classifier_cascade_t *cascade = (ccv_bbf_classifier_cascade_t *)ccmalloc(sizeof(ccv_bbf_classifier_cascade_t));
+ memcpy(&cascade->count, s, sizeof(cascade->count));
+ s += sizeof(cascade->count);
+ memcpy(&cascade->size.width, s, sizeof(cascade->size.width));
+ s += sizeof(cascade->size.width);
+ memcpy(&cascade->size.height, s, sizeof(cascade->size.height));
+ s += sizeof(cascade->size.height);
+ ccv_bbf_stage_classifier_t *classifier = cascade->stage_classifier = (ccv_bbf_stage_classifier_t *)ccmalloc(cascade->count * sizeof(ccv_bbf_stage_classifier_t));
+ for (i = 0; i < cascade->count; i++, classifier++)
+ {
+ memcpy(&classifier->count, s, sizeof(classifier->count));
+ s += sizeof(classifier->count);
+ memcpy(&classifier->threshold, s, sizeof(classifier->threshold));
+ s += sizeof(classifier->threshold);
+ classifier->feature = (ccv_bbf_feature_t *)ccmalloc(classifier->count * sizeof(ccv_bbf_feature_t));
+ classifier->alpha = (float *)ccmalloc(classifier->count * 2 * sizeof(float));
+ memcpy(classifier->feature, s, classifier->count * sizeof(ccv_bbf_feature_t));
+ s += classifier->count * sizeof(ccv_bbf_feature_t);
+ memcpy(classifier->alpha, s, classifier->count * 2 * sizeof(float));
+ s += classifier->count * 2 * sizeof(float);
+ }
+ return cascade;
+}
+
+int ccv_bbf_classifier_cascade_write_binary(ccv_bbf_classifier_cascade_t *cascade, char *s, int slen)
+{
+ int i;
+ int len = sizeof(cascade->count) + sizeof(cascade->size.width) + sizeof(cascade->size.height);
+ ccv_bbf_stage_classifier_t *classifier = cascade->stage_classifier;
+ for (i = 0; i < cascade->count; i++, classifier++)
+ len += sizeof(classifier->count) + sizeof(classifier->threshold) + classifier->count * sizeof(ccv_bbf_feature_t) + classifier->count * 2 * sizeof(float);
+ if (slen >= len)
+ {
+ memcpy(s, &cascade->count, sizeof(cascade->count));
+ s += sizeof(cascade->count);
+ memcpy(s, &cascade->size.width, sizeof(cascade->size.width));
+ s += sizeof(cascade->size.width);
+ memcpy(s, &cascade->size.height, sizeof(cascade->size.height));
+ s += sizeof(cascade->size.height);
+ classifier = cascade->stage_classifier;
+ for (i = 0; i < cascade->count; i++, classifier++)
+ {
+ memcpy(s, &classifier->count, sizeof(classifier->count));
+ s += sizeof(classifier->count);
+ memcpy(s, &classifier->threshold, sizeof(classifier->threshold));
+ s += sizeof(classifier->threshold);
+ memcpy(s, classifier->feature, classifier->count * sizeof(ccv_bbf_feature_t));
+ s += classifier->count * sizeof(ccv_bbf_feature_t);
+ memcpy(s, classifier->alpha, classifier->count * 2 * sizeof(float));
+ s += classifier->count * 2 * sizeof(float);
+ }
+ }
+ return len;
+}
+
+void ccv_bbf_classifier_cascade_free(ccv_bbf_classifier_cascade_t *cascade)
+{
+ int i;
+ for (i = 0; i < cascade->count; ++i)
+ {
+ ccfree(cascade->stage_classifier[i].feature);
+ ccfree(cascade->stage_classifier[i].alpha);
+ }
+ ccfree(cascade->stage_classifier);
+ ccfree(cascade);
+}
\ No newline at end of file
diff --git a/test/source.clj b/test/source.clj
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.coffee b/test/source.coffee
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.cpp b/test/source.cpp
new file mode 100644
index 0000000..793837f
--- /dev/null
+++ b/test/source.cpp
@@ -0,0 +1,1582 @@
+#include "ccv.h"
+#include "ccv_internal.h"
+#include
+#ifdef HAVE_GSL
+#include
+#include
+#endif
+#ifdef USE_OPENMP
+#include
+#endif
+const ;
+
+finitario crear_finitario(info_t i) {
+ finitario nuevo = new rep_finitario;
+ nuevo->dato = i;
+ nuevo->primerio = NULL;
+ return nuevo;
+}
+
+
+const ccv_bbf_param_t ccv_bbf_default_params = {
+ .interval = 5,
+ .min_neighbors = 2,
+ .accurate = 1,
+ .flags = 0,
+ .size = {
+ 24,
+ 24,
+ },
+};
+
+#define _ccv_width_padding(x) (((x) + 3) & -4)
+
+static inline int _ccv_run_bbf_feature(ccv_bbf_feature_t *feature, int *step, unsigned char **u8)
+{
+#define pf_at(i) (*(u8[feature->pz[i]] + feature->px[i] + feature->py[i] * step[feature->pz[i]]))
+#define nf_at(i) (*(u8[feature->nz[i]] + feature->nx[i] + feature->ny[i] * step[feature->nz[i]]))
+ unsigned char pmin = pf_at(0), nmax = nf_at(0);
+ /* check if every point in P > every point in N, and take a shortcut */
+ if (pmin <= nmax)
+ return 0;
+ int i;
+ for (i = 1; i < feature->size; i++)
+ {
+ if (feature->pz[i] >= 0)
+ {
+ int p = pf_at(i);
+ if (p < pmin)
+ {
+ if (p <= nmax)
+ return 0;
+ pmin = p;
+ }
+ }
+ if (feature->nz[i] >= 0)
+ {
+ int n = nf_at(i);
+ if (n > nmax)
+ {
+ if (pmin <= n)
+ return 0;
+ nmax = n;
+ }
+ }
+ }
+#undef pf_at
+#undef nf_at
+ return 1;
+}
+
+static int _ccv_read_bbf_stage_classifier(const char *file, ccv_bbf_stage_classifier_t *classifier)
+{
+ FILE *r = fopen(file, "r");
+ if (r == 0)
+ return -1;
+ int stat = 0;
+ stat |= fscanf(r, "%d", &classifier->count);
+ union {
+ float fl;
+ int i;
+ } fli;
+ stat |= fscanf(r, "%d", &fli.i);
+ classifier->threshold = fli.fl;
+ classifier->feature = (ccv_bbf_feature_t *)ccmalloc(classifier->count * sizeof(ccv_bbf_feature_t));
+ classifier->alpha = (float *)ccmalloc(classifier->count * 2 * sizeof(float));
+ int i, j;
+ for (i = 0; i < classifier->count; i++)
+ {
+ stat |= fscanf(r, "%d", &classifier->feature[i].size);
+ for (j = 0; j < classifier->feature[i].size; j++)
+ {
+ stat |= fscanf(r, "%d %d %d", &classifier->feature[i].px[j], &classifier->feature[i].py[j], &classifier->feature[i].pz[j]);
+ stat |= fscanf(r, "%d %d %d", &classifier->feature[i].nx[j], &classifier->feature[i].ny[j], &classifier->feature[i].nz[j]);
+ }
+ union {
+ float fl;
+ int i;
+ } flia, flib;
+ stat |= fscanf(r, "%d %d", &flia.i, &flib.i);
+ classifier->alpha[i * 2] = flia.fl;
+ classifier->alpha[i * 2 + 1] = flib.fl;
+ }
+ fclose(r);
+ return 0;
+}
+
+#ifdef HAVE_GSL
+
+static unsigned int _ccv_bbf_time_measure()
+{
+ struct timeval tv;
+ gettimeofday(&tv, 0);
+ return tv.tv_sec * 1000000 + tv.tv_usec;
+}
+
+#define less_than(a, b, aux) ((a) < (b))
+CCV_IMPLEMENT_QSORT(_ccv_sort_32f, float, less_than)
+#undef less_than
+
+static void _ccv_bbf_eval_data(ccv_bbf_stage_classifier_t *classifier, unsigned char **posdata, int posnum, unsigned char **negdata, int negnum, ccv_size_t size, float *peval, float *neval)
+{
+ int i, j;
+ int steps[] = {_ccv_width_padding(size.width),
+ _ccv_width_padding(size.width >> 1),
+ _ccv_width_padding(size.width >> 2)};
+ int isizs0 = steps[0] * size.height;
+ int isizs01 = isizs0 + steps[1] * (size.height >> 1);
+ for (i = 0; i < posnum; i++)
+ {
+ unsigned char *u8[] = {posdata[i], posdata[i] + isizs0, posdata[i] + isizs01};
+ float sum = 0;
+ float *alpha = classifier->alpha;
+ ccv_bbf_feature_t *feature = classifier->feature;
+ for (j = 0; j < classifier->count; ++j, alpha += 2, ++feature)
+ sum += alpha[_ccv_run_bbf_feature(feature, steps, u8)];
+ peval[i] = sum;
+ }
+ for (i = 0; i < negnum; i++)
+ {
+ unsigned char *u8[] = {negdata[i], negdata[i] + isizs0, negdata[i] + isizs01};
+ float sum = 0;
+ float *alpha = classifier->alpha;
+ ccv_bbf_feature_t *feature = classifier->feature;
+ for (j = 0; j < classifier->count; ++j, alpha += 2, ++feature)
+ sum += alpha[_ccv_run_bbf_feature(feature, steps, u8)];
+ neval[i] = sum;
+ }
+}
+
+static int _ccv_prune_positive_data(ccv_bbf_classifier_cascade_t *cascade, unsigned char **posdata, int posnum, ccv_size_t size)
+{
+ float *peval = (float *)ccmalloc(posnum * sizeof(float));
+ int i, j, k, rpos = posnum;
+ for (i = 0; i < cascade->count; i++)
+ {
+ _ccv_bbf_eval_data(cascade->stage_classifier + i, posdata, rpos, 0, 0, size, peval, 0);
+ k = 0;
+ for (j = 0; j < rpos; j++)
+ if (peval[j] >= cascade->stage_classifier[i].threshold)
+ {
+ posdata[k] = posdata[j];
+ ++k;
+ }
+ else
+ {
+ ccfree(posdata[j]);
+ }
+ rpos = k;
+ }
+ ccfree(peval);
+ return rpos;
+}
+
+static int _ccv_prepare_background_data(ccv_bbf_classifier_cascade_t *cascade, char **bgfiles, int bgnum, unsigned char **negdata, int negnum)
+{
+ int t, i, j, k, q;
+ int negperbg;
+ int negtotal = 0;
+ int steps[] = {_ccv_width_padding(cascade->size.width),
+ _ccv_width_padding(cascade->size.width >> 1),
+ _ccv_width_padding(cascade->size.width >> 2)};
+ int isizs0 = steps[0] * cascade->size.height;
+ int isizs1 = steps[1] * (cascade->size.height >> 1);
+ int isizs2 = steps[2] * (cascade->size.height >> 2);
+ int *idcheck = (int *)ccmalloc(negnum * sizeof(int));
+
+ gsl_rng_env_setup();
+
+ gsl_rng *rng = gsl_rng_alloc(gsl_rng_default);
+ gsl_rng_set(rng, (unsigned long int)idcheck);
+
+ ccv_size_t imgsz = cascade->size;
+ int rneg = negtotal;
+ for (t = 0; negtotal < negnum; t++)
+ {
+ PRINT(CCV_CLI_INFO, "preparing negative data ... 0%%");
+ for (i = 0; i < bgnum; i++)
+ {
+ negperbg = (t < 2) ? (negnum - negtotal) / (bgnum - i) + 1 : negnum - negtotal;
+ ccv_dense_matrix_t *image = 0;
+ ccv_read(bgfiles[i], &image, CCV_IO_GRAY | CCV_IO_ANY_FILE);
+ assert((image->type & CCV_C1) && (image->type & CCV_8U));
+ if (image == 0)
+ {
+ PRINT(CCV_CLI_ERROR, "\n%s file corrupted\n", bgfiles[i]);
+ continue;
+ }
+ if (t % 2 != 0)
+ ccv_flip(image, 0, 0, CCV_FLIP_X);
+ if (t % 4 >= 2)
+ ccv_flip(image, 0, 0, CCV_FLIP_Y);
+ ccv_bbf_param_t params = {.interval = 3, .min_neighbors = 0, .accurate = 1, .flags = 0, .size = cascade->size};
+ ccv_array_t *detected = ccv_bbf_detect_objects(image, &cascade, 1, params);
+ memset(idcheck, 0, ccv_min(detected->rnum, negperbg) * sizeof(int));
+ for (j = 0; j < ccv_min(detected->rnum, negperbg); j++)
+ {
+ int r = gsl_rng_uniform_int(rng, detected->rnum);
+ int flag = 1;
+ ccv_rect_t *rect = (ccv_rect_t *)ccv_array_get(detected, r);
+ while (flag)
+ {
+ flag = 0;
+ for (k = 0; k < j; k++)
+ if (r == idcheck[k])
+ {
+ flag = 1;
+ r = gsl_rng_uniform_int(rng, detected->rnum);
+ break;
+ }
+ rect = (ccv_rect_t *)ccv_array_get(detected, r);
+ if ((rect->x < 0) || (rect->y < 0) || (rect->width + rect->x > image->cols) || (rect->height + rect->y > image->rows))
+ {
+ flag = 1;
+ r = gsl_rng_uniform_int(rng, detected->rnum);
+ }
+ }
+ idcheck[j] = r;
+ ccv_dense_matrix_t *temp = 0;
+ ccv_dense_matrix_t *imgs0 = 0;
+ ccv_dense_matrix_t *imgs1 = 0;
+ ccv_dense_matrix_t *imgs2 = 0;
+ ccv_slice(image, (ccv_matrix_t **)&temp, 0, rect->y, rect->x, rect->height, rect->width);
+ ccv_resample(temp, &imgs0, 0, imgsz.height, imgsz.width, CCV_INTER_AREA);
+ assert(imgs0->step == steps[0]);
+ ccv_matrix_free(temp);
+ ccv_sample_down(imgs0, &imgs1, 0, 0, 0);
+ assert(imgs1->step == steps[1]);
+ ccv_sample_down(imgs1, &imgs2, 0, 0, 0);
+ assert(imgs2->step == steps[2]);
+
+ negdata[negtotal] = (unsigned char *)ccmalloc(isizs0 + isizs1 + isizs2);
+ unsigned char *u8s0 = negdata[negtotal];
+ unsigned char *u8s1 = negdata[negtotal] + isizs0;
+ unsigned char *u8s2 = negdata[negtotal] + isizs0 + isizs1;
+ unsigned char *u8[] = {u8s0, u8s1, u8s2};
+ memcpy(u8s0, imgs0->data.u8, imgs0->rows * imgs0->step);
+ ccv_matrix_free(imgs0);
+ memcpy(u8s1, imgs1->data.u8, imgs1->rows * imgs1->step);
+ ccv_matrix_free(imgs1);
+ memcpy(u8s2, imgs2->data.u8, imgs2->rows * imgs2->step);
+ ccv_matrix_free(imgs2);
+
+ flag = 1;
+ ccv_bbf_stage_classifier_t *classifier = cascade->stage_classifier;
+ for (k = 0; k < cascade->count; ++k, ++classifier)
+ {
+ float sum = 0;
+ float *alpha = classifier->alpha;
+ ccv_bbf_feature_t *feature = classifier->feature;
+ for (q = 0; q < classifier->count; ++q, alpha += 2, ++feature)
+ sum += alpha[_ccv_run_bbf_feature(feature, steps, u8)];
+ if (sum < classifier->threshold)
+ {
+ flag = 0;
+ break;
+ }
+ }
+ if (!flag)
+ ccfree(negdata[negtotal]);
+ else
+ {
+ ++negtotal;
+ if (negtotal >= negnum)
+ break;
+ }
+ }
+ ccv_array_free(detected);
+ ccv_matrix_free(image);
+ ccv_drain_cache();
+ PRINT(CCV_CLI_INFO, "\rpreparing negative data ... %2d%%", 100 * negtotal / negnum);
+ fflush(0);
+ if (negtotal >= negnum)
+ break;
+ }
+ if (rneg == negtotal)
+ break;
+ rneg = negtotal;
+ PRINT(CCV_CLI_INFO, "\nentering additional round %d\n", t + 1);
+ }
+ gsl_rng_free(rng);
+ ccfree(idcheck);
+ ccv_drain_cache();
+ PRINT(CCV_CLI_INFO, "\n");
+ return negtotal;
+}
+
+static void _ccv_prepare_positive_data(ccv_dense_matrix_t **posimg, unsigned char **posdata, ccv_size_t size, int posnum)
+{
+ PRINT(CCV_CLI_INFO, "preparing positive data ... 0%%");
+ int i;
+ for (i = 0; i < posnum; i++)
+ {
+ ccv_dense_matrix_t *imgs0 = posimg[i];
+ ccv_dense_matrix_t *imgs1 = 0;
+ ccv_dense_matrix_t *imgs2 = 0;
+ assert((imgs0->type & CCV_C1) && (imgs0->type & CCV_8U) && imgs0->rows == size.height && imgs0->cols == size.width);
+ ccv_sample_down(imgs0, &imgs1, 0, 0, 0);
+ ccv_sample_down(imgs1, &imgs2, 0, 0, 0);
+ int isizs0 = imgs0->rows * imgs0->step;
+ int isizs1 = imgs1->rows * imgs1->step;
+ int isizs2 = imgs2->rows * imgs2->step;
+
+ posdata[i] = (unsigned char *)ccmalloc(isizs0 + isizs1 + isizs2);
+ memcpy(posdata[i], imgs0->data.u8, isizs0);
+ memcpy(posdata[i] + isizs0, imgs1->data.u8, isizs1);
+ memcpy(posdata[i] + isizs0 + isizs1, imgs2->data.u8, isizs2);
+
+ PRINT(CCV_CLI_INFO, "\rpreparing positive data ... %2d%%", 100 * (i + 1) / posnum);
+ fflush(0);
+
+ ccv_matrix_free(imgs1);
+ ccv_matrix_free(imgs2);
+ }
+ ccv_drain_cache();
+ PRINT(CCV_CLI_INFO, "\n");
+}
+
+typedef struct
+{
+ double fitness;
+ int pk, nk;
+ int age;
+ double error;
+ ccv_bbf_feature_t feature;
+} ccv_bbf_gene_t;
+
+static inline void _ccv_bbf_genetic_fitness(ccv_bbf_gene_t *gene)
+{
+ gene->fitness = (1 - gene->error) * exp(-0.01 * gene->age) * exp((gene->pk + gene->nk) * log(1.015));
+}
+
+static inline int _ccv_bbf_exist_gene_feature(ccv_bbf_gene_t *gene, int x, int y, int z)
+{
+ int i;
+ for (i = 0; i < gene->pk; i++)
+ if (z == gene->feature.pz[i] && x == gene->feature.px[i] && y == gene->feature.py[i])
+ return 1;
+ for (i = 0; i < gene->nk; i++)
+ if (z == gene->feature.nz[i] && x == gene->feature.nx[i] && y == gene->feature.ny[i])
+ return 1;
+ return 0;
+}
+
+static inline void _ccv_bbf_randomize_gene(gsl_rng *rng, ccv_bbf_gene_t *gene, int *rows, int *cols)
+{
+ int i;
+ do
+ {
+ gene->pk = gsl_rng_uniform_int(rng, CCV_BBF_POINT_MAX - 1) + 1;
+ gene->nk = gsl_rng_uniform_int(rng, CCV_BBF_POINT_MAX - 1) + 1;
+ } while (gene->pk + gene->nk < CCV_BBF_POINT_MIN); /* a hard restriction of at least 3 points have to be examed */
+ gene->feature.size = ccv_max(gene->pk, gene->nk);
+ gene->age = 0;
+ for (i = 0; i < CCV_BBF_POINT_MAX; i++)
+ {
+ gene->feature.pz[i] = -1;
+ gene->feature.nz[i] = -1;
+ }
+ int x, y, z;
+ for (i = 0; i < gene->pk; i++)
+ {
+ do
+ {
+ z = gsl_rng_uniform_int(rng, 3);
+ x = gsl_rng_uniform_int(rng, cols[z]);
+ y = gsl_rng_uniform_int(rng, rows[z]);
+ } while (_ccv_bbf_exist_gene_feature(gene, x, y, z));
+ gene->feature.pz[i] = z;
+ gene->feature.px[i] = x;
+ gene->feature.py[i] = y;
+ }
+ for (i = 0; i < gene->nk; i++)
+ {
+ do
+ {
+ z = gsl_rng_uniform_int(rng, 3);
+ x = gsl_rng_uniform_int(rng, cols[z]);
+ y = gsl_rng_uniform_int(rng, rows[z]);
+ } while (_ccv_bbf_exist_gene_feature(gene, x, y, z));
+ gene->feature.nz[i] = z;
+ gene->feature.nx[i] = x;
+ gene->feature.ny[i] = y;
+ }
+}
+
+static inline double _ccv_bbf_error_rate(ccv_bbf_feature_t *feature, unsigned char **posdata, int posnum, unsigned char **negdata, int negnum, ccv_size_t size, double *pw, double *nw)
+{
+ int i;
+ int steps[] = {_ccv_width_padding(size.width),
+ _ccv_width_padding(size.width >> 1),
+ _ccv_width_padding(size.width >> 2)};
+ int isizs0 = steps[0] * size.height;
+ int isizs01 = isizs0 + steps[1] * (size.height >> 1);
+ double error = 0;
+ for (i = 0; i < posnum; i++)
+ {
+ unsigned char *u8[] = {posdata[i], posdata[i] + isizs0, posdata[i] + isizs01};
+ if (!_ccv_run_bbf_feature(feature, steps, u8))
+ error += pw[i];
+ }
+ for (i = 0; i < negnum; i++)
+ {
+ unsigned char *u8[] = {negdata[i], negdata[i] + isizs0, negdata[i] + isizs01};
+ if (_ccv_run_bbf_feature(feature, steps, u8))
+ error += nw[i];
+ }
+ return error;
+}
+
+#define less_than(fit1, fit2, aux) ((fit1).fitness >= (fit2).fitness)
+static CCV_IMPLEMENT_QSORT(_ccv_bbf_genetic_qsort, ccv_bbf_gene_t, less_than)
+#undef less_than
+
+ static ccv_bbf_feature_t _ccv_bbf_genetic_optimize(unsigned char **posdata, int posnum, unsigned char **negdata, int negnum, int ftnum, ccv_size_t size, double *pw, double *nw)
+{
+ ccv_bbf_feature_t best;
+ /* seed (random method) */
+ gsl_rng_env_setup();
+ gsl_rng *rng = gsl_rng_alloc(gsl_rng_default);
+ union {
+ unsigned long int li;
+ double db;
+ } dbli;
+ dbli.db = pw[0] + nw[0];
+ gsl_rng_set(rng, dbli.li);
+ int i, j;
+ int pnum = ftnum * 100;
+ assert(pnum > 0);
+ ccv_bbf_gene_t *gene = (ccv_bbf_gene_t *)ccmalloc(pnum * sizeof(ccv_bbf_gene_t));
+ int rows[] = {size.height, size.height >> 1, size.height >> 2};
+ int cols[] = {size.width, size.width >> 1, size.width >> 2};
+ for (i = 0; i < pnum; i++)
+ _ccv_bbf_randomize_gene(rng, &gene[i], rows, cols);
+ unsigned int timer = _ccv_bbf_time_measure();
+#ifdef USE_OPENMP
+#pragma omp parallel for private(i) schedule(dynamic)
+#endif
+ for (i = 0; i < pnum; i++)
+ gene[i].error = _ccv_bbf_error_rate(&gene[i].feature, posdata, posnum, negdata, negnum, size, pw, nw);
+ timer = _ccv_bbf_time_measure() - timer;
+ for (i = 0; i < pnum; i++)
+ _ccv_bbf_genetic_fitness(&gene[i]);
+ double best_err = 1;
+ int rnum = ftnum * 39; /* number of randomize */
+ int mnum = ftnum * 40; /* number of mutation */
+ int hnum = ftnum * 20; /* number of hybrid */
+ /* iteration stop crit : best no change in 40 iterations */
+ int it = 0, t;
+ for (t = 0; it < 40; ++it, ++t)
+ {
+ int min_id = 0;
+ double min_err = gene[0].error;
+ for (i = 1; i < pnum; i++)
+ if (gene[i].error < min_err)
+ {
+ min_id = i;
+ min_err = gene[i].error;
+ }
+ min_err = gene[min_id].error = _ccv_bbf_error_rate(&gene[min_id].feature, posdata, posnum, negdata, negnum, size, pw, nw);
+ if (min_err < best_err)
+ {
+ best_err = min_err;
+ memcpy(&best, &gene[min_id].feature, sizeof(best));
+ PRINT(CCV_CLI_INFO, "best bbf feature with error %f\n|-size: %d\n|-positive point: ", best_err, best.size);
+ for (i = 0; i < best.size; i++)
+ PRINT(CCV_CLI_INFO, "(%d %d %d), ", best.px[i], best.py[i], best.pz[i]);
+ PRINT(CCV_CLI_INFO, "\n|-negative point: ");
+ for (i = 0; i < best.size; i++)
+ PRINT(CCV_CLI_INFO, "(%d %d %d), ", best.nx[i], best.ny[i], best.nz[i]);
+ PRINT(CCV_CLI_INFO, "\n");
+ it = 0;
+ }
+ PRINT(CCV_CLI_INFO, "minimum error achieved in round %d(%d) : %f with %d ms\n", t, it, min_err, timer / 1000);
+ _ccv_bbf_genetic_qsort(gene, pnum, 0);
+ for (i = 0; i < ftnum; i++)
+ ++gene[i].age;
+ for (i = ftnum; i < ftnum + mnum; i++)
+ {
+ int parent = gsl_rng_uniform_int(rng, ftnum);
+ memcpy(gene + i, gene + parent, sizeof(ccv_bbf_gene_t));
+ /* three mutation strategy : 1. add, 2. remove, 3. refine */
+ int pnm, pn = gsl_rng_uniform_int(rng, 2);
+ int *pnk[] = {&gene[i].pk, &gene[i].nk};
+ int *pnx[] = {gene[i].feature.px, gene[i].feature.nx};
+ int *pny[] = {gene[i].feature.py, gene[i].feature.ny};
+ int *pnz[] = {gene[i].feature.pz, gene[i].feature.nz};
+ int x, y, z;
+ int victim, decay = 1;
+ do
+ {
+ switch (gsl_rng_uniform_int(rng, 3))
+ {
+ case 0: /* add */
+ if (gene[i].pk == CCV_BBF_POINT_MAX && gene[i].nk == CCV_BBF_POINT_MAX)
+ break;
+ while (*pnk[pn] + 1 > CCV_BBF_POINT_MAX)
+ pn = gsl_rng_uniform_int(rng, 2);
+ do
+ {
+ z = gsl_rng_uniform_int(rng, 3);
+ x = gsl_rng_uniform_int(rng, cols[z]);
+ y = gsl_rng_uniform_int(rng, rows[z]);
+ } while (_ccv_bbf_exist_gene_feature(&gene[i], x, y, z));
+ pnz[pn][*pnk[pn]] = z;
+ pnx[pn][*pnk[pn]] = x;
+ pny[pn][*pnk[pn]] = y;
+ ++(*pnk[pn]);
+ gene[i].feature.size = ccv_max(gene[i].pk, gene[i].nk);
+ decay = gene[i].age = 0;
+ break;
+ case 1: /* remove */
+ if (gene[i].pk + gene[i].nk <= CCV_BBF_POINT_MIN) /* at least 3 points have to be examed */
+ break;
+ while (*pnk[pn] - 1 <= 0) // || *pnk[pn] + *pnk[!pn] - 1 < CCV_BBF_POINT_MIN)
+ pn = gsl_rng_uniform_int(rng, 2);
+ victim = gsl_rng_uniform_int(rng, *pnk[pn]);
+ for (j = victim; j < *pnk[pn] - 1; j++)
+ {
+ pnz[pn][j] = pnz[pn][j + 1];
+ pnx[pn][j] = pnx[pn][j + 1];
+ pny[pn][j] = pny[pn][j + 1];
+ }
+ pnz[pn][*pnk[pn] - 1] = -1;
+ --(*pnk[pn]);
+ gene[i].feature.size = ccv_max(gene[i].pk, gene[i].nk);
+ decay = gene[i].age = 0;
+ break;
+ case 2: /* refine */
+ pnm = gsl_rng_uniform_int(rng, *pnk[pn]);
+ do
+ {
+ z = gsl_rng_uniform_int(rng, 3);
+ x = gsl_rng_uniform_int(rng, cols[z]);
+ y = gsl_rng_uniform_int(rng, rows[z]);
+ } while (_ccv_bbf_exist_gene_feature(&gene[i], x, y, z));
+ pnz[pn][pnm] = z;
+ pnx[pn][pnm] = x;
+ pny[pn][pnm] = y;
+ decay = gene[i].age = 0;
+ break;
+ }
+ } while (decay);
+ }
+ for (i = ftnum + mnum; i < ftnum + mnum + hnum; i++)
+ {
+ /* hybrid strategy: taking positive points from dad, negative points from mum */
+ int dad, mum;
+ do
+ {
+ dad = gsl_rng_uniform_int(rng, ftnum);
+ mum = gsl_rng_uniform_int(rng, ftnum);
+ } while (dad == mum || gene[dad].pk + gene[mum].nk < CCV_BBF_POINT_MIN); /* at least 3 points have to be examed */
+ for (j = 0; j < CCV_BBF_POINT_MAX; j++)
+ {
+ gene[i].feature.pz[j] = -1;
+ gene[i].feature.nz[j] = -1;
+ }
+ gene[i].pk = gene[dad].pk;
+ for (j = 0; j < gene[i].pk; j++)
+ {
+ gene[i].feature.pz[j] = gene[dad].feature.pz[j];
+ gene[i].feature.px[j] = gene[dad].feature.px[j];
+ gene[i].feature.py[j] = gene[dad].feature.py[j];
+ }
+ gene[i].nk = gene[mum].nk;
+ for (j = 0; j < gene[i].nk; j++)
+ {
+ gene[i].feature.nz[j] = gene[mum].feature.nz[j];
+ gene[i].feature.nx[j] = gene[mum].feature.nx[j];
+ gene[i].feature.ny[j] = gene[mum].feature.ny[j];
+ }
+ gene[i].feature.size = ccv_max(gene[i].pk, gene[i].nk);
+ gene[i].age = 0;
+ }
+ for (i = ftnum + mnum + hnum; i < ftnum + mnum + hnum + rnum; i++)
+ _ccv_bbf_randomize_gene(rng, &gene[i], rows, cols);
+ timer = _ccv_bbf_time_measure();
+#ifdef USE_OPENMP
+#pragma omp parallel for private(i) schedule(dynamic)
+#endif
+ for (i = 0; i < pnum; i++)
+ gene[i].error = _ccv_bbf_error_rate(&gene[i].feature, posdata, posnum, negdata, negnum, size, pw, nw);
+ timer = _ccv_bbf_time_measure() - timer;
+ for (i = 0; i < pnum; i++)
+ _ccv_bbf_genetic_fitness(&gene[i]);
+ }
+ ccfree(gene);
+ gsl_rng_free(rng);
+ return best;
+}
+
+#define less_than(fit1, fit2, aux) ((fit1).error < (fit2).error)
+static CCV_IMPLEMENT_QSORT(_ccv_bbf_best_qsort, ccv_bbf_gene_t, less_than)
+#undef less_than
+
+ static ccv_bbf_gene_t _ccv_bbf_best_gene(ccv_bbf_gene_t *gene, int pnum, int point_min, unsigned char **posdata, int posnum, unsigned char **negdata, int negnum, ccv_size_t size, double *pw, double *nw)
+{
+ int i;
+ unsigned int timer = _ccv_bbf_time_measure();
+#ifdef USE_OPENMP
+#pragma omp parallel for private(i) schedule(dynamic)
+#endif
+ for (i = 0; i < pnum; i++)
+ gene[i].error = _ccv_bbf_error_rate(&gene[i].feature, posdata, posnum, negdata, negnum, size, pw, nw);
+ timer = _ccv_bbf_time_measure() - timer;
+ _ccv_bbf_best_qsort(gene, pnum, 0);
+ int min_id = 0;
+ double min_err = gene[0].error;
+ for (i = 0; i < pnum; i++)
+ if (gene[i].nk + gene[i].pk >= point_min)
+ {
+ min_id = i;
+ min_err = gene[i].error;
+ break;
+ }
+ PRINT(CCV_CLI_INFO, "local best bbf feature with error %f\n|-size: %d\n|-positive point: ", min_err, gene[min_id].feature.size);
+ for (i = 0; i < gene[min_id].feature.size; i++)
+ PRINT(CCV_CLI_INFO, "(%d %d %d), ", gene[min_id].feature.px[i], gene[min_id].feature.py[i], gene[min_id].feature.pz[i]);
+ PRINT(CCV_CLI_INFO, "\n|-negative point: ");
+ for (i = 0; i < gene[min_id].feature.size; i++)
+ PRINT(CCV_CLI_INFO, "(%d %d %d), ", gene[min_id].feature.nx[i], gene[min_id].feature.ny[i], gene[min_id].feature.nz[i]);
+ PRINT(CCV_CLI_INFO, "\nthe computation takes %d ms\n", timer / 1000);
+ return gene[min_id];
+}
+
+static ccv_bbf_feature_t _ccv_bbf_convex_optimize(unsigned char **posdata, int posnum, unsigned char **negdata, int negnum, ccv_bbf_feature_t *best_feature, ccv_size_t size, double *pw, double *nw)
+{
+ ccv_bbf_gene_t best_gene;
+ /* seed (random method) */
+ gsl_rng_env_setup();
+ gsl_rng *rng = gsl_rng_alloc(gsl_rng_default);
+ union {
+ unsigned long int li;
+ double db;
+ } dbli;
+ dbli.db = pw[0] + nw[0];
+ gsl_rng_set(rng, dbli.li);
+ int i, j, k, q, p, g, t;
+ int rows[] = {size.height, size.height >> 1, size.height >> 2};
+ int cols[] = {size.width, size.width >> 1, size.width >> 2};
+ int pnum = rows[0] * cols[0] + rows[1] * cols[1] + rows[2] * cols[2];
+ ccv_bbf_gene_t *gene = (ccv_bbf_gene_t *)ccmalloc((pnum * (CCV_BBF_POINT_MAX * 2 + 1) * 2 + CCV_BBF_POINT_MAX * 2 + 1) * sizeof(ccv_bbf_gene_t));
+ if (best_feature == 0)
+ {
+ /* bootstrapping the best feature, start from two pixels, one for positive, one for negative
+ * the bootstrapping process go like this: first, it will assign a random pixel as positive
+ * and enumerate every possible pixel as negative, and pick the best one. Then, enumerate every
+ * possible pixel as positive, and pick the best one, until it converges */
+ memset(&best_gene, 0, sizeof(ccv_bbf_gene_t));
+ for (i = 0; i < CCV_BBF_POINT_MAX; i++)
+ best_gene.feature.pz[i] = best_gene.feature.nz[i] = -1;
+ best_gene.pk = 1;
+ best_gene.nk = 0;
+ best_gene.feature.size = 1;
+ best_gene.feature.pz[0] = gsl_rng_uniform_int(rng, 3);
+ best_gene.feature.px[0] = gsl_rng_uniform_int(rng, cols[best_gene.feature.pz[0]]);
+ best_gene.feature.py[0] = gsl_rng_uniform_int(rng, rows[best_gene.feature.pz[0]]);
+ for (t = 0;; ++t)
+ {
+ g = 0;
+ if (t % 2 == 0)
+ {
+ for (i = 0; i < 3; i++)
+ for (j = 0; j < cols[i]; j++)
+ for (k = 0; k < rows[i]; k++)
+ if (i != best_gene.feature.pz[0] || j != best_gene.feature.px[0] || k != best_gene.feature.py[0])
+ {
+ gene[g] = best_gene;
+ gene[g].pk = gene[g].nk = 1;
+ gene[g].feature.nz[0] = i;
+ gene[g].feature.nx[0] = j;
+ gene[g].feature.ny[0] = k;
+ g++;
+ }
+ }
+ else
+ {
+ for (i = 0; i < 3; i++)
+ for (j = 0; j < cols[i]; j++)
+ for (k = 0; k < rows[i]; k++)
+ if (i != best_gene.feature.nz[0] || j != best_gene.feature.nx[0] || k != best_gene.feature.ny[0])
+ {
+ gene[g] = best_gene;
+ gene[g].pk = gene[g].nk = 1;
+ gene[g].feature.pz[0] = i;
+ gene[g].feature.px[0] = j;
+ gene[g].feature.py[0] = k;
+ g++;
+ }
+ }
+ PRINT(CCV_CLI_INFO, "bootstrapping round : %d\n", t);
+ ccv_bbf_gene_t local_gene = _ccv_bbf_best_gene(gene, g, 2, posdata, posnum, negdata, negnum, size, pw, nw);
+ if (local_gene.error >= best_gene.error - 1e-10)
+ break;
+ best_gene = local_gene;
+ }
+ }
+ else
+ {
+ best_gene.feature = *best_feature;
+ best_gene.pk = best_gene.nk = best_gene.feature.size;
+ for (i = 0; i < CCV_BBF_POINT_MAX; i++)
+ if (best_feature->pz[i] == -1)
+ {
+ best_gene.pk = i;
+ break;
+ }
+ for (i = 0; i < CCV_BBF_POINT_MAX; i++)
+ if (best_feature->nz[i] == -1)
+ {
+ best_gene.nk = i;
+ break;
+ }
+ }
+ /* after bootstrapping, the float search technique will do the following permutations:
+ * a). add a new point to positive or negative
+ * b). remove a point from positive or negative
+ * c). move an existing point in positive or negative to another position
+ * the three rules applied exhaustively, no heuristic used. */
+ for (t = 0;; ++t)
+ {
+ g = 0;
+ for (i = 0; i < 3; i++)
+ for (j = 0; j < cols[i]; j++)
+ for (k = 0; k < rows[i]; k++)
+ if (!_ccv_bbf_exist_gene_feature(&best_gene, j, k, i))
+ {
+ /* add positive point */
+ if (best_gene.pk < CCV_BBF_POINT_MAX - 1)
+ {
+ gene[g] = best_gene;
+ gene[g].feature.pz[gene[g].pk] = i;
+ gene[g].feature.px[gene[g].pk] = j;
+ gene[g].feature.py[gene[g].pk] = k;
+ gene[g].pk++;
+ gene[g].feature.size = ccv_max(gene[g].pk, gene[g].nk);
+ g++;
+ }
+ /* add negative point */
+ if (best_gene.nk < CCV_BBF_POINT_MAX - 1)
+ {
+ gene[g] = best_gene;
+ gene[g].feature.nz[gene[g].nk] = i;
+ gene[g].feature.nx[gene[g].nk] = j;
+ gene[g].feature.ny[gene[g].nk] = k;
+ gene[g].nk++;
+ gene[g].feature.size = ccv_max(gene[g].pk, gene[g].nk);
+ g++;
+ }
+ /* refine positive point */
+ for (q = 0; q < best_gene.pk; q++)
+ {
+ gene[g] = best_gene;
+ gene[g].feature.pz[q] = i;
+ gene[g].feature.px[q] = j;
+ gene[g].feature.py[q] = k;
+ g++;
+ }
+ /* add positive point, remove negative point */
+ if (best_gene.pk < CCV_BBF_POINT_MAX - 1 && best_gene.nk > 1)
+ {
+ for (q = 0; q < best_gene.nk; q++)
+ {
+ gene[g] = best_gene;
+ gene[g].feature.pz[gene[g].pk] = i;
+ gene[g].feature.px[gene[g].pk] = j;
+ gene[g].feature.py[gene[g].pk] = k;
+ gene[g].pk++;
+ for (p = q; p < best_gene.nk - 1; p++)
+ {
+ gene[g].feature.nz[p] = gene[g].feature.nz[p + 1];
+ gene[g].feature.nx[p] = gene[g].feature.nx[p + 1];
+ gene[g].feature.ny[p] = gene[g].feature.ny[p + 1];
+ }
+ gene[g].feature.nz[gene[g].nk - 1] = -1;
+ gene[g].nk--;
+ gene[g].feature.size = ccv_max(gene[g].pk, gene[g].nk);
+ g++;
+ }
+ }
+ /* refine negative point */
+ for (q = 0; q < best_gene.nk; q++)
+ {
+ gene[g] = best_gene;
+ gene[g].feature.nz[q] = i;
+ gene[g].feature.nx[q] = j;
+ gene[g].feature.ny[q] = k;
+ g++;
+ }
+ /* add negative point, remove positive point */
+ if (best_gene.pk > 1 && best_gene.nk < CCV_BBF_POINT_MAX - 1)
+ {
+ for (q = 0; q < best_gene.pk; q++)
+ {
+ gene[g] = best_gene;
+ gene[g].feature.nz[gene[g].nk] = i;
+ gene[g].feature.nx[gene[g].nk] = j;
+ gene[g].feature.ny[gene[g].nk] = k;
+ gene[g].nk++;
+ for (p = q; p < best_gene.pk - 1; p++)
+ {
+ gene[g].feature.pz[p] = gene[g].feature.pz[p + 1];
+ gene[g].feature.px[p] = gene[g].feature.px[p + 1];
+ gene[g].feature.py[p] = gene[g].feature.py[p + 1];
+ }
+ gene[g].feature.pz[gene[g].pk - 1] = -1;
+ gene[g].pk--;
+ gene[g].feature.size = ccv_max(gene[g].pk, gene[g].nk);
+ g++;
+ }
+ }
+ }
+ if (best_gene.pk > 1)
+ for (q = 0; q < best_gene.pk; q++)
+ {
+ gene[g] = best_gene;
+ for (i = q; i < best_gene.pk - 1; i++)
+ {
+ gene[g].feature.pz[i] = gene[g].feature.pz[i + 1];
+ gene[g].feature.px[i] = gene[g].feature.px[i + 1];
+ gene[g].feature.py[i] = gene[g].feature.py[i + 1];
+ }
+ gene[g].feature.pz[gene[g].pk - 1] = -1;
+ gene[g].pk--;
+ gene[g].feature.size = ccv_max(gene[g].pk, gene[g].nk);
+ g++;
+ }
+ if (best_gene.nk > 1)
+ for (q = 0; q < best_gene.nk; q++)
+ {
+ gene[g] = best_gene;
+ for (i = q; i < best_gene.nk - 1; i++)
+ {
+ gene[g].feature.nz[i] = gene[g].feature.nz[i + 1];
+ gene[g].feature.nx[i] = gene[g].feature.nx[i + 1];
+ gene[g].feature.ny[i] = gene[g].feature.ny[i + 1];
+ }
+ gene[g].feature.nz[gene[g].nk - 1] = -1;
+ gene[g].nk--;
+ gene[g].feature.size = ccv_max(gene[g].pk, gene[g].nk);
+ g++;
+ }
+ gene[g] = best_gene;
+ g++;
+ PRINT(CCV_CLI_INFO, "float search round : %d\n", t);
+ ccv_bbf_gene_t local_gene = _ccv_bbf_best_gene(gene, g, CCV_BBF_POINT_MIN, posdata, posnum, negdata, negnum, size, pw, nw);
+ if (local_gene.error >= best_gene.error - 1e-10)
+ break;
+ best_gene = local_gene;
+ }
+ ccfree(gene);
+ gsl_rng_free(rng);
+ return best_gene.feature;
+}
+
+static int _ccv_write_bbf_stage_classifier(const char *file, ccv_bbf_stage_classifier_t *classifier)
+{
+ FILE *w = fopen(file, "wb");
+ if (w == 0)
+ return -1;
+ fprintf(w, "%d\n", classifier->count);
+ union {
+ float fl;
+ int i;
+ } fli;
+ fli.fl = classifier->threshold;
+ fprintf(w, "%d\n", fli.i);
+ int i, j;
+ for (i = 0; i < classifier->count; i++)
+ {
+ fprintf(w, "%d\n", classifier->feature[i].size);
+ for (j = 0; j < classifier->feature[i].size; j++)
+ {
+ fprintf(w, "%d %d %d\n", classifier->feature[i].px[j], classifier->feature[i].py[j], classifier->feature[i].pz[j]);
+ fprintf(w, "%d %d %d\n", classifier->feature[i].nx[j], classifier->feature[i].ny[j], classifier->feature[i].nz[j]);
+ }
+ union {
+ float fl;
+ int i;
+ } flia, flib;
+ flia.fl = classifier->alpha[i * 2];
+ flib.fl = classifier->alpha[i * 2 + 1];
+ fprintf(w, "%d %d\n", flia.i, flib.i);
+ }
+ fclose(w);
+ return 0;
+}
+
+static int _ccv_read_background_data(const char *file, unsigned char **negdata, int *negnum, ccv_size_t size)
+{
+ int stat = 0;
+ FILE *r = fopen(file, "rb");
+ if (r == 0)
+ return -1;
+ stat |= fread(negnum, sizeof(int), 1, r);
+ int i;
+ int isizs012 = _ccv_width_padding(size.width) * size.height +
+ _ccv_width_padding(size.width >> 1) * (size.height >> 1) +
+ _ccv_width_padding(size.width >> 2) * (size.height >> 2);
+ for (i = 0; i < *negnum; i++)
+ {
+ negdata[i] = (unsigned char *)ccmalloc(isizs012);
+ stat |= fread(negdata[i], 1, isizs012, r);
+ }
+ fclose(r);
+ return 0;
+}
+
+static int _ccv_write_background_data(const char *file, unsigned char **negdata, int negnum, ccv_size_t size)
+{
+ FILE *w = fopen(file, "w");
+ if (w == 0)
+ return -1;
+ fwrite(&negnum, sizeof(int), 1, w);
+ int i;
+ int isizs012 = _ccv_width_padding(size.width) * size.height +
+ _ccv_width_padding(size.width >> 1) * (size.height >> 1) +
+ _ccv_width_padding(size.width >> 2) * (size.height >> 2);
+ for (i = 0; i < negnum; i++)
+ fwrite(negdata[i], 1, isizs012, w);
+ fclose(w);
+ return 0;
+}
+
+static int _ccv_resume_bbf_cascade_training_state(const char *file, int *i, int *k, int *bg, double *pw, double *nw, int posnum, int negnum)
+{
+ int stat = 0;
+ FILE *r = fopen(file, "r");
+ if (r == 0)
+ return -1;
+ stat |= fscanf(r, "%d %d %d", i, k, bg);
+ int j;
+ union {
+ double db;
+ int i[2];
+ } dbi;
+ for (j = 0; j < posnum; j++)
+ {
+ stat |= fscanf(r, "%d %d", &dbi.i[0], &dbi.i[1]);
+ pw[j] = dbi.db;
+ }
+ for (j = 0; j < negnum; j++)
+ {
+ stat |= fscanf(r, "%d %d", &dbi.i[0], &dbi.i[1]);
+ nw[j] = dbi.db;
+ }
+ fclose(r);
+ return 0;
+}
+
+static int _ccv_save_bbf_cacade_training_state(const char *file, int i, int k, int bg, double *pw, double *nw, int posnum, int negnum)
+{
+ FILE *w = fopen(file, "w");
+ if (w == 0)
+ return -1;
+ fprintf(w, "%d %d %d\n", i, k, bg);
+ int j;
+ union {
+ double db;
+ int i[2];
+ } dbi;
+ for (j = 0; j < posnum; ++j)
+ {
+ dbi.db = pw[j];
+ fprintf(w, "%d %d ", dbi.i[0], dbi.i[1]);
+ }
+ fprintf(w, "\n");
+ for (j = 0; j < negnum; ++j)
+ {
+ dbi.db = nw[j];
+ fprintf(w, "%d %d ", dbi.i[0], dbi.i[1]);
+ }
+ fprintf(w, "\n");
+ fclose(w);
+ return 0;
+}
+
+void ccv_bbf_classifier_cascade_new(ccv_dense_matrix_t **posimg, int posnum, char **bgfiles, int bgnum, int negnum, ccv_size_t size, const char *dir, ccv_bbf_new_param_t params)
+{
+ int i, j, k;
+ /* allocate memory for usage */
+ ccv_bbf_classifier_cascade_t *cascade = (ccv_bbf_classifier_cascade_t *)ccmalloc(sizeof(ccv_bbf_classifier_cascade_t));
+ cascade->count = 0;
+ cascade->size = size;
+ cascade->stage_classifier = (ccv_bbf_stage_classifier_t *)ccmalloc(sizeof(ccv_bbf_stage_classifier_t));
+ unsigned char **posdata = (unsigned char **)ccmalloc(posnum * sizeof(unsigned char *));
+ unsigned char **negdata = (unsigned char **)ccmalloc(negnum * sizeof(unsigned char *));
+ double *pw = (double *)ccmalloc(posnum * sizeof(double));
+ double *nw = (double *)ccmalloc(negnum * sizeof(double));
+ float *peval = (float *)ccmalloc(posnum * sizeof(float));
+ float *neval = (float *)ccmalloc(negnum * sizeof(float));
+ double inv_balance_k = 1. / params.balance_k;
+ /* balance factor k, and weighted with 0.01 */
+ params.balance_k *= 0.01;
+ inv_balance_k *= 0.01;
+
+ int steps[] = {_ccv_width_padding(cascade->size.width),
+ _ccv_width_padding(cascade->size.width >> 1),
+ _ccv_width_padding(cascade->size.width >> 2)};
+ int isizs0 = steps[0] * cascade->size.height;
+ int isizs01 = isizs0 + steps[1] * (cascade->size.height >> 1);
+
+ i = 0;
+ k = 0;
+ int bg = 0;
+ int cacheK = 10;
+ /* state resume code */
+ char buf[1024];
+ sprintf(buf, "%s/stat.txt", dir);
+ _ccv_resume_bbf_cascade_training_state(buf, &i, &k, &bg, pw, nw, posnum, negnum);
+ if (i > 0)
+ {
+ cascade->count = i;
+ ccfree(cascade->stage_classifier);
+ cascade->stage_classifier = (ccv_bbf_stage_classifier_t *)ccmalloc(i * sizeof(ccv_bbf_stage_classifier_t));
+ for (j = 0; j < i; j++)
+ {
+ sprintf(buf, "%s/stage-%d.txt", dir, j);
+ _ccv_read_bbf_stage_classifier(buf, &cascade->stage_classifier[j]);
+ }
+ }
+ if (k > 0)
+ cacheK = k;
+ int rpos, rneg = 0;
+ if (bg)
+ {
+ sprintf(buf, "%s/negs.txt", dir);
+ _ccv_read_background_data(buf, negdata, &rneg, cascade->size);
+ }
+
+ for (; i < params.layer; i++)
+ {
+ if (!bg)
+ {
+ rneg = _ccv_prepare_background_data(cascade, bgfiles, bgnum, negdata, negnum);
+ /* save state of background data */
+ sprintf(buf, "%s/negs.txt", dir);
+ _ccv_write_background_data(buf, negdata, rneg, cascade->size);
+ bg = 1;
+ }
+ double totalw;
+ /* save state of cascade : level, weight etc. */
+ sprintf(buf, "%s/stat.txt", dir);
+ _ccv_save_bbf_cacade_training_state(buf, i, k, bg, pw, nw, posnum, negnum);
+ ccv_bbf_stage_classifier_t classifier;
+ if (k > 0)
+ {
+ /* resume state of classifier */
+ sprintf(buf, "%s/stage-%d.txt", dir, i);
+ _ccv_read_bbf_stage_classifier(buf, &classifier);
+ }
+ else
+ {
+ /* initialize classifier */
+ for (j = 0; j < posnum; j++)
+ pw[j] = params.balance_k;
+ for (j = 0; j < rneg; j++)
+ nw[j] = inv_balance_k;
+ classifier.count = k;
+ classifier.threshold = 0;
+ classifier.feature = (ccv_bbf_feature_t *)ccmalloc(cacheK * sizeof(ccv_bbf_feature_t));
+ classifier.alpha = (float *)ccmalloc(cacheK * 2 * sizeof(float));
+ }
+ _ccv_prepare_positive_data(posimg, posdata, cascade->size, posnum);
+ rpos = _ccv_prune_positive_data(cascade, posdata, posnum, cascade->size);
+ PRINT(CCV_CLI_INFO, "%d postivie data and %d negative data in training\n", rpos, rneg);
+ /* reweight to 1.00 */
+ totalw = 0;
+ for (j = 0; j < rpos; j++)
+ totalw += pw[j];
+ for (j = 0; j < rneg; j++)
+ totalw += nw[j];
+ for (j = 0; j < rpos; j++)
+ pw[j] = pw[j] / totalw;
+ for (j = 0; j < rneg; j++)
+ nw[j] = nw[j] / totalw;
+ for (;; k++)
+ {
+ /* get overall true-positive, false-positive rate and threshold */
+ double tp = 0, fp = 0, etp = 0, efp = 0;
+ _ccv_bbf_eval_data(&classifier, posdata, rpos, negdata, rneg, cascade->size, peval, neval);
+ _ccv_sort_32f(peval, rpos, 0);
+ classifier.threshold = peval[(int)((1. - params.pos_crit) * rpos)] - 1e-6;
+ for (j = 0; j < rpos; j++)
+ {
+ if (peval[j] >= 0)
+ ++tp;
+ if (peval[j] >= classifier.threshold)
+ ++etp;
+ }
+ tp /= rpos;
+ etp /= rpos;
+ for (j = 0; j < rneg; j++)
+ {
+ if (neval[j] >= 0)
+ ++fp;
+ if (neval[j] >= classifier.threshold)
+ ++efp;
+ }
+ fp /= rneg;
+ efp /= rneg;
+ PRINT(CCV_CLI_INFO, "stage classifier real TP rate : %f, FP rate : %f\n", tp, fp);
+ PRINT(CCV_CLI_INFO, "stage classifier TP rate : %f, FP rate : %f at threshold : %f\n", etp, efp, classifier.threshold);
+ if (k > 0)
+ {
+ /* save classifier state */
+ sprintf(buf, "%s/stage-%d.txt", dir, i);
+ _ccv_write_bbf_stage_classifier(buf, &classifier);
+ sprintf(buf, "%s/stat.txt", dir);
+ _ccv_save_bbf_cacade_training_state(buf, i, k, bg, pw, nw, posnum, negnum);
+ }
+ if (etp > params.pos_crit && efp < params.neg_crit)
+ break;
+ /* TODO: more post-process is needed in here */
+
+ /* select the best feature in current distribution through genetic algorithm optimization */
+ ccv_bbf_feature_t best;
+ if (params.optimizer == CCV_BBF_GENETIC_OPT)
+ {
+ best = _ccv_bbf_genetic_optimize(posdata, rpos, negdata, rneg, params.feature_number, cascade->size, pw, nw);
+ }
+ else if (params.optimizer == CCV_BBF_FLOAT_OPT)
+ {
+ best = _ccv_bbf_convex_optimize(posdata, rpos, negdata, rneg, 0, cascade->size, pw, nw);
+ }
+ else
+ {
+ best = _ccv_bbf_genetic_optimize(posdata, rpos, negdata, rneg, params.feature_number, cascade->size, pw, nw);
+ best = _ccv_bbf_convex_optimize(posdata, rpos, negdata, rneg, &best, cascade->size, pw, nw);
+ }
+ double err = _ccv_bbf_error_rate(&best, posdata, rpos, negdata, rneg, cascade->size, pw, nw);
+ double rw = (1 - err) / err;
+ totalw = 0;
+ /* reweight */
+ for (j = 0; j < rpos; j++)
+ {
+ unsigned char *u8[] = {posdata[j], posdata[j] + isizs0, posdata[j] + isizs01};
+ if (!_ccv_run_bbf_feature(&best, steps, u8))
+ pw[j] *= rw;
+ pw[j] *= params.balance_k;
+ totalw += pw[j];
+ }
+ for (j = 0; j < rneg; j++)
+ {
+ unsigned char *u8[] = {negdata[j], negdata[j] + isizs0, negdata[j] + isizs01};
+ if (_ccv_run_bbf_feature(&best, steps, u8))
+ nw[j] *= rw;
+ nw[j] *= inv_balance_k;
+ totalw += nw[j];
+ }
+ for (j = 0; j < rpos; j++)
+ pw[j] = pw[j] / totalw;
+ for (j = 0; j < rneg; j++)
+ nw[j] = nw[j] / totalw;
+ double c = log(rw);
+ PRINT(CCV_CLI_INFO, "coefficient of feature %d: %f\n", k + 1, c);
+ classifier.count = k + 1;
+ /* resizing classifier */
+ if (k >= cacheK)
+ {
+ ccv_bbf_feature_t *feature = (ccv_bbf_feature_t *)ccmalloc(cacheK * 2 * sizeof(ccv_bbf_feature_t));
+ memcpy(feature, classifier.feature, cacheK * sizeof(ccv_bbf_feature_t));
+ ccfree(classifier.feature);
+ float *alpha = (float *)ccmalloc(cacheK * 4 * sizeof(float));
+ memcpy(alpha, classifier.alpha, cacheK * 2 * sizeof(float));
+ ccfree(classifier.alpha);
+ classifier.feature = feature;
+ classifier.alpha = alpha;
+ cacheK *= 2;
+ }
+ /* setup new feature */
+ classifier.feature[k] = best;
+ classifier.alpha[k * 2] = -c;
+ classifier.alpha[k * 2 + 1] = c;
+ }
+ cascade->count = i + 1;
+ ccv_bbf_stage_classifier_t *stage_classifier = (ccv_bbf_stage_classifier_t *)ccmalloc(cascade->count * sizeof(ccv_bbf_stage_classifier_t));
+ memcpy(stage_classifier, cascade->stage_classifier, i * sizeof(ccv_bbf_stage_classifier_t));
+ ccfree(cascade->stage_classifier);
+ stage_classifier[i] = classifier;
+ cascade->stage_classifier = stage_classifier;
+ k = 0;
+ bg = 0;
+ for (j = 0; j < rpos; j++)
+ ccfree(posdata[j]);
+ for (j = 0; j < rneg; j++)
+ ccfree(negdata[j]);
+ }
+
+ ccfree(neval);
+ ccfree(peval);
+ ccfree(nw);
+ ccfree(pw);
+ ccfree(negdata);
+ ccfree(posdata);
+ ccfree(cascade);
+}
+#else
+void ccv_bbf_classifier_cascade_new(ccv_dense_matrix_t **posimg, int posnum, char **bgfiles, int bgnum, int negnum, ccv_size_t size, const char *dir, ccv_bbf_new_param_t params)
+{
+ fprintf(stderr, " ccv_bbf_classifier_cascade_new requires libgsl support, please compile ccv with libgsl.\n");
+}
+#endif
+
+static int _ccv_is_equal(const void *_r1, const void *_r2, void *data)
+{
+ const ccv_comp_t *r1 = (const ccv_comp_t *)_r1;
+ const ccv_comp_t *r2 = (const ccv_comp_t *)_r2;
+ int distance = (int)(r1->rect.width * 0.25 + 0.5);
+
+ return r2->rect.x <= r1->rect.x + distance &&
+ r2->rect.x >= r1->rect.x - distance &&
+ r2->rect.y <= r1->rect.y + distance &&
+ r2->rect.y >= r1->rect.y - distance &&
+ r2->rect.width <= (int)(r1->rect.width * 1.5 + 0.5) &&
+ (int)(r2->rect.width * 1.5 + 0.5) >= r1->rect.width;
+}
+
+static int _ccv_is_equal_same_class(const void *_r1, const void *_r2, void *data)
+{
+ const ccv_comp_t *r1 = (const ccv_comp_t *)_r1;
+ const ccv_comp_t *r2 = (const ccv_comp_t *)_r2;
+ int distance = (int)(r1->rect.width * 0.25 + 0.5);
+
+ return r2->classification.id == r1->classification.id &&
+ r2->rect.x <= r1->rect.x + distance &&
+ r2->rect.x >= r1->rect.x - distance &&
+ r2->rect.y <= r1->rect.y + distance &&
+ r2->rect.y >= r1->rect.y - distance &&
+ r2->rect.width <= (int)(r1->rect.width * 1.5 + 0.5) &&
+ (int)(r2->rect.width * 1.5 + 0.5) >= r1->rect.width;
+}
+
+ccv_array_t *ccv_bbf_detect_objects(ccv_dense_matrix_t *a, ccv_bbf_classifier_cascade_t **_cascade, int count, ccv_bbf_param_t params)
+{
+ int hr = a->rows / params.size.height;
+ int wr = a->cols / params.size.width;
+ double scale = pow(2., 1. / (params.interval + 1.));
+ int next = params.interval + 1;
+ int scale_upto = (int)(log((double)ccv_min(hr, wr)) / log(scale));
+ ccv_dense_matrix_t **pyr = (ccv_dense_matrix_t **)alloca((scale_upto + next * 2) * 4 * sizeof(ccv_dense_matrix_t *));
+ memset(pyr, 0, (scale_upto + next * 2) * 4 * sizeof(ccv_dense_matrix_t *));
+ if (params.size.height != _cascade[0]->size.height || params.size.width != _cascade[0]->size.width)
+ ccv_resample(a, &pyr[0], 0, a->rows * _cascade[0]->size.height / params.size.height, a->cols * _cascade[0]->size.width / params.size.width, CCV_INTER_AREA);
+ else
+ pyr[0] = a;
+ int i, j, k, t, x, y, q;
+ for (i = 1; i < ccv_min(params.interval + 1, scale_upto + next * 2); i++)
+ ccv_resample(pyr[0], &pyr[i * 4], 0, (int)(pyr[0]->rows / pow(scale, i)), (int)(pyr[0]->cols / pow(scale, i)), CCV_INTER_AREA);
+ for (i = next; i < scale_upto + next * 2; i++)
+ ccv_sample_down(pyr[i * 4 - next * 4], &pyr[i * 4], 0, 0, 0);
+ if (params.accurate)
+ for (i = next * 2; i < scale_upto + next * 2; i++)
+ {
+ ccv_sample_down(pyr[i * 4 - next * 4], &pyr[i * 4 + 1], 0, 1, 0);
+ ccv_sample_down(pyr[i * 4 - next * 4], &pyr[i * 4 + 2], 0, 0, 1);
+ ccv_sample_down(pyr[i * 4 - next * 4], &pyr[i * 4 + 3], 0, 1, 1);
+ }
+ ccv_array_t *idx_seq;
+ ccv_array_t *seq = ccv_array_new(sizeof(ccv_comp_t), 64, 0);
+ ccv_array_t *seq2 = ccv_array_new(sizeof(ccv_comp_t), 64, 0);
+ ccv_array_t *result_seq = ccv_array_new(sizeof(ccv_comp_t), 64, 0);
+ /* detect in multi scale */
+ for (t = 0; t < count; t++)
+ {
+ ccv_bbf_classifier_cascade_t *cascade = _cascade[t];
+ float scale_x = (float)params.size.width / (float)cascade->size.width;
+ float scale_y = (float)params.size.height / (float)cascade->size.height;
+ ccv_array_clear(seq);
+ for (i = 0; i < scale_upto; i++)
+ {
+ int dx[] = {0, 1, 0, 1};
+ int dy[] = {0, 0, 1, 1};
+ int i_rows = pyr[i * 4 + next * 8]->rows - (cascade->size.height >> 2);
+ int steps[] = {pyr[i * 4]->step, pyr[i * 4 + next * 4]->step, pyr[i * 4 + next * 8]->step};
+ int i_cols = pyr[i * 4 + next * 8]->cols - (cascade->size.width >> 2);
+ int paddings[] = {pyr[i * 4]->step * 4 - i_cols * 4,
+ pyr[i * 4 + next * 4]->step * 2 - i_cols * 2,
+ pyr[i * 4 + next * 8]->step - i_cols};
+ for (q = 0; q < (params.accurate ? 4 : 1); q++)
+ {
+ unsigned char *u8[] = {pyr[i * 4]->data.u8 + dx[q] * 2 + dy[q] * pyr[i * 4]->step * 2, pyr[i * 4 + next * 4]->data.u8 + dx[q] + dy[q] * pyr[i * 4 + next * 4]->step, pyr[i * 4 + next * 8 + q]->data.u8};
+ for (y = 0; y < i_rows; y++)
+ {
+ for (x = 0; x < i_cols; x++)
+ {
+ float sum;
+ int flag = 1;
+ ccv_bbf_stage_classifier_t *classifier = cascade->stage_classifier;
+ for (j = 0; j < cascade->count; ++j, ++classifier)
+ {
+ sum = 0;
+ float *alpha = classifier->alpha;
+ ccv_bbf_feature_t *feature = classifier->feature;
+ for (k = 0; k < classifier->count; ++k, alpha += 2, ++feature)
+ sum += alpha[_ccv_run_bbf_feature(feature, steps, u8)];
+ if (sum < classifier->threshold)
+ {
+ flag = 0;
+ break;
+ }
+ }
+ if (flag)
+ {
+ ccv_comp_t comp;
+ comp.rect = ccv_rect((int)((x * 4 + dx[q] * 2) * scale_x + 0.5), (int)((y * 4 + dy[q] * 2) * scale_y + 0.5), (int)(cascade->size.width * scale_x + 0.5), (int)(cascade->size.height * scale_y + 0.5));
+ comp.neighbors = 1;
+ comp.classification.id = t;
+ comp.classification.confidence = sum;
+ ccv_array_push(seq, &comp);
+ }
+ u8[0] += 4;
+ u8[1] += 2;
+ u8[2] += 1;
+ }
+ u8[0] += paddings[0];
+ u8[1] += paddings[1];
+ u8[2] += paddings[2];
+ }
+ }
+ scale_x *= scale;
+ scale_y *= scale;
+ }
+
+ /* the following code from OpenCV's haar feature implementation */
+ if (params.min_neighbors == 0)
+ {
+ for (i = 0; i < seq->rnum; i++)
+ {
+ ccv_comp_t *comp = (ccv_comp_t *)ccv_array_get(seq, i);
+ ccv_array_push(result_seq, comp);
+ }
+ }
+ else
+ {
+ idx_seq = 0;
+ ccv_array_clear(seq2);
+ // group retrieved rectangles in order to filter out noise
+ int ncomp = ccv_array_group(seq, &idx_seq, _ccv_is_equal_same_class, 0);
+ ccv_comp_t *comps = (ccv_comp_t *)ccmalloc((ncomp + 1) * sizeof(ccv_comp_t));
+ memset(comps, 0, (ncomp + 1) * sizeof(ccv_comp_t));
+
+ // count number of neighbors
+ for (i = 0; i < seq->rnum; i++)
+ {
+ ccv_comp_t r1 = *(ccv_comp_t *)ccv_array_get(seq, i);
+ int idx = *(int *)ccv_array_get(idx_seq, i);
+
+ if (comps[idx].neighbors == 0)
+ comps[idx].classification.confidence = r1.classification.confidence;
+
+ ++comps[idx].neighbors;
+
+ comps[idx].rect.x += r1.rect.x;
+ comps[idx].rect.y += r1.rect.y;
+ comps[idx].rect.width += r1.rect.width;
+ comps[idx].rect.height += r1.rect.height;
+ comps[idx].classification.id = r1.classification.id;
+ comps[idx].classification.confidence = ccv_max(comps[idx].classification.confidence, r1.classification.confidence);
+ }
+
+ // calculate average bounding box
+ for (i = 0; i < ncomp; i++)
+ {
+ int n = comps[i].neighbors;
+ if (n >= params.min_neighbors)
+ {
+ ccv_comp_t comp;
+ comp.rect.x = (comps[i].rect.x * 2 + n) / (2 * n);
+ comp.rect.y = (comps[i].rect.y * 2 + n) / (2 * n);
+ comp.rect.width = (comps[i].rect.width * 2 + n) / (2 * n);
+ comp.rect.height = (comps[i].rect.height * 2 + n) / (2 * n);
+ comp.neighbors = comps[i].neighbors;
+ comp.classification.id = comps[i].classification.id;
+ comp.classification.confidence = comps[i].classification.confidence;
+ ccv_array_push(seq2, &comp);
+ }
+ }
+
+ // filter out small face rectangles inside large face rectangles
+ for (i = 0; i < seq2->rnum; i++)
+ {
+ ccv_comp_t r1 = *(ccv_comp_t *)ccv_array_get(seq2, i);
+ int flag = 1;
+
+ for (j = 0; j < seq2->rnum; j++)
+ {
+ ccv_comp_t r2 = *(ccv_comp_t *)ccv_array_get(seq2, j);
+ int distance = (int)(r2.rect.width * 0.25 + 0.5);
+
+ if (i != j &&
+ r1.classification.id == r2.classification.id &&
+ r1.rect.x >= r2.rect.x - distance &&
+ r1.rect.y >= r2.rect.y - distance &&
+ r1.rect.x + r1.rect.width <= r2.rect.x + r2.rect.width + distance &&
+ r1.rect.y + r1.rect.height <= r2.rect.y + r2.rect.height + distance &&
+ (r2.neighbors > ccv_max(3, r1.neighbors) || r1.neighbors < 3))
+ {
+ flag = 0;
+ break;
+ }
+ }
+
+ if (flag)
+ ccv_array_push(result_seq, &r1);
+ }
+ ccv_array_free(idx_seq);
+ ccfree(comps);
+ }
+ }
+
+ ccv_array_free(seq);
+ ccv_array_free(seq2);
+
+ ccv_array_t *result_seq2;
+ /* the following code from OpenCV's haar feature implementation */
+ if (params.flags & CCV_BBF_NO_NESTED)
+ {
+ result_seq2 = ccv_array_new(sizeof(ccv_comp_t), 64, 0);
+ idx_seq = 0;
+ // group retrieved rectangles in order to filter out noise
+ int ncomp = ccv_array_group(result_seq, &idx_seq, _ccv_is_equal, 0);
+ ccv_comp_t *comps = (ccv_comp_t *)ccmalloc((ncomp + 1) * sizeof(ccv_comp_t));
+ memset(comps, 0, (ncomp + 1) * sizeof(ccv_comp_t));
+
+ // count number of neighbors
+ for (i = 0; i < result_seq->rnum; i++)
+ {
+ ccv_comp_t r1 = *(ccv_comp_t *)ccv_array_get(result_seq, i);
+ int idx = *(int *)ccv_array_get(idx_seq, i);
+
+ if (comps[idx].neighbors == 0 || comps[idx].classification.confidence < r1.classification.confidence)
+ {
+ comps[idx].classification.confidence = r1.classification.confidence;
+ comps[idx].neighbors = 1;
+ comps[idx].rect = r1.rect;
+ comps[idx].classification.id = r1.classification.id;
+ }
+ }
+
+ // calculate average bounding box
+ for (i = 0; i < ncomp; i++)
+ if (comps[i].neighbors)
+ ccv_array_push(result_seq2, &comps[i]);
+
+ ccv_array_free(result_seq);
+ ccfree(comps);
+ }
+ else
+ {
+ result_seq2 = result_seq;
+ }
+
+ for (i = 1; i < scale_upto + next * 2; i++)
+ ccv_matrix_free(pyr[i * 4]);
+ if (params.accurate)
+ for (i = next * 2; i < scale_upto + next * 2; i++)
+ {
+ ccv_matrix_free(pyr[i * 4 + 1]);
+ ccv_matrix_free(pyr[i * 4 + 2]);
+ ccv_matrix_free(pyr[i * 4 + 3]);
+ }
+ if (params.size.height != _cascade[0]->size.height || params.size.width != _cascade[0]->size.width)
+ ccv_matrix_free(pyr[0]);
+
+ return result_seq2;
+}
+
+ccv_bbf_classifier_cascade_t *ccv_bbf_read_classifier_cascade(const char *directory)
+{
+ char buf[1024];
+ sprintf(buf, "%s/cascade.txt", directory);
+ int s, i;
+ FILE *r = fopen(buf, "r");
+ if (r == 0)
+ return 0;
+ ccv_bbf_classifier_cascade_t *cascade = (ccv_bbf_classifier_cascade_t *)ccmalloc(sizeof(ccv_bbf_classifier_cascade_t));
+ s = fscanf(r, "%d %d %d", &cascade->count, &cascade->size.width, &cascade->size.height);
+ assert(s > 0);
+ cascade->stage_classifier = (ccv_bbf_stage_classifier_t *)ccmalloc(cascade->count * sizeof(ccv_bbf_stage_classifier_t));
+ for (i = 0; i < cascade->count; i++)
+ {
+ sprintf(buf, "%s/stage-%d.txt", directory, i);
+ if (_ccv_read_bbf_stage_classifier(buf, &cascade->stage_classifier[i]) < 0)
+ {
+ cascade->count = i;
+ break;
+ }
+ }
+ fclose(r);
+ return cascade;
+}
+
+ccv_bbf_classifier_cascade_t *ccv_bbf_classifier_cascade_read_binary(char *s)
+{
+ int i;
+ ccv_bbf_classifier_cascade_t *cascade = (ccv_bbf_classifier_cascade_t *)ccmalloc(sizeof(ccv_bbf_classifier_cascade_t));
+ memcpy(&cascade->count, s, sizeof(cascade->count));
+ s += sizeof(cascade->count);
+ memcpy(&cascade->size.width, s, sizeof(cascade->size.width));
+ s += sizeof(cascade->size.width);
+ memcpy(&cascade->size.height, s, sizeof(cascade->size.height));
+ s += sizeof(cascade->size.height);
+ ccv_bbf_stage_classifier_t *classifier = cascade->stage_classifier = (ccv_bbf_stage_classifier_t *)ccmalloc(cascade->count * sizeof(ccv_bbf_stage_classifier_t));
+ for (i = 0; i < cascade->count; i++, classifier++)
+ {
+ memcpy(&classifier->count, s, sizeof(classifier->count));
+ s += sizeof(classifier->count);
+ memcpy(&classifier->threshold, s, sizeof(classifier->threshold));
+ s += sizeof(classifier->threshold);
+ classifier->feature = (ccv_bbf_feature_t *)ccmalloc(classifier->count * sizeof(ccv_bbf_feature_t));
+ classifier->alpha = (float *)ccmalloc(classifier->count * 2 * sizeof(float));
+ memcpy(classifier->feature, s, classifier->count * sizeof(ccv_bbf_feature_t));
+ s += classifier->count * sizeof(ccv_bbf_feature_t);
+ memcpy(classifier->alpha, s, classifier->count * 2 * sizeof(float));
+ s += classifier->count * 2 * sizeof(float);
+ }
+ return cascade;
+}
+
+int ccv_bbf_classifier_cascade_write_binary(ccv_bbf_classifier_cascade_t *cascade, char *s, int slen)
+{
+ int i;
+ int len = sizeof(cascade->count) + sizeof(cascade->size.width) + sizeof(cascade->size.height);
+ ccv_bbf_stage_classifier_t *classifier = cascade->stage_classifier;
+ for (i = 0; i < cascade->count; i++, classifier++)
+ len += sizeof(classifier->count) + sizeof(classifier->threshold) + classifier->count * sizeof(ccv_bbf_feature_t) + classifier->count * 2 * sizeof(float);
+ if (slen >= len)
+ {
+ memcpy(s, &cascade->count, sizeof(cascade->count));
+ s += sizeof(cascade->count);
+ memcpy(s, &cascade->size.width, sizeof(cascade->size.width));
+ s += sizeof(cascade->size.width);
+ memcpy(s, &cascade->size.height, sizeof(cascade->size.height));
+ s += sizeof(cascade->size.height);
+ classifier = cascade->stage_classifier;
+ for (i = 0; i < cascade->count; i++, classifier++)
+ {
+ memcpy(s, &classifier->count, sizeof(classifier->count));
+ s += sizeof(classifier->count);
+ memcpy(s, &classifier->threshold, sizeof(classifier->threshold));
+ s += sizeof(classifier->threshold);
+ memcpy(s, classifier->feature, classifier->count * sizeof(ccv_bbf_feature_t));
+ s += classifier->count * sizeof(ccv_bbf_feature_t);
+ memcpy(s, classifier->alpha, classifier->count * 2 * sizeof(float));
+ s += classifier->count * 2 * sizeof(float);
+ }
+ }
+ return len;
+}
+
+void ccv_bbf_classifier_cascade_free(ccv_bbf_classifier_cascade_t *cascade)
+{
+ int i;
+ for (i = 0; i < cascade->count; ++i)
+ {
+ ccfree(cascade->stage_classifier[i].feature);
+ ccfree(cascade->stage_classifier[i].alpha);
+ }
+ ccfree(cascade->stage_classifier);
+ ccfree(cascade);
+}
\ No newline at end of file
diff --git a/test/source.cs b/test/source.cs
new file mode 100644
index 0000000..b2aad3b
--- /dev/null
+++ b/test/source.cs
@@ -0,0 +1,259 @@
+using System;
+using System.Diagnostics;
+using System.IO;
+using System.IO.Compression;
+using System.Runtime.InteropServices;
+using System.Windows.Forms;
+using Microsoft.Win32;
+using Shadowsocks.Controller;
+
+namespace Shadowsocks.Util
+{
+ public struct BandwidthScaleInfo
+ {
+ public float value;
+ public string unitName;
+ public long unit;
+
+ public BandwidthScaleInfo(float value, string unitName, long unit)
+ {
+ this.value = value;
+ this.unitName = unitName;
+ this.unit = unit;
+ }
+ }
+
+ public static class Utils
+ {
+ private static string _tempPath = null;
+
+ // return path to store temporary files
+ public static string GetTempPath()
+ {
+ if (_tempPath == null)
+ {
+ try
+ {
+ Directory.CreateDirectory(Path.Combine(Application.StartupPath, "ss_win_temp"));
+ // don't use "/", it will fail when we call explorer /select xxx/ss_win_temp\xxx.log
+ _tempPath = Path.Combine(Application.StartupPath, "ss_win_temp");
+ }
+ catch (Exception e)
+ {
+ Logging.Error(e);
+ throw;
+ }
+ }
+ return _tempPath;
+ }
+
+ // return a full path with filename combined which pointed to the temporary directory
+ public static string GetTempPath(string filename)
+ {
+ return Path.Combine(GetTempPath(), filename);
+ }
+
+ public static void ReleaseMemory(bool removePages)
+ {
+ // release any unused pages
+ // making the numbers look good in task manager
+ // this is totally nonsense in programming
+ // but good for those users who care
+ // making them happier with their everyday life
+ // which is part of user experience
+ GC.Collect(GC.MaxGeneration);
+ GC.WaitForPendingFinalizers();
+ if (removePages)
+ {
+ // as some users have pointed out
+ // removing pages from working set will cause some IO
+ // which lowered user experience for another group of users
+ //
+ // so we do 2 more things here to satisfy them:
+ // 1. only remove pages once when configuration is changed
+ // 2. add more comments here to tell users that calling
+ // this function will not be more frequent than
+ // IM apps writing chat logs, or web browsers writing cache files
+ // if they're so concerned about their disk, they should
+ // uninstall all IM apps and web browsers
+ //
+ // please open an issue if you're worried about anything else in your computer
+ // no matter it's GPU performance, monitor contrast, audio fidelity
+ // or anything else in the task manager
+ // we'll do as much as we can to help you
+ //
+ // just kidding
+ SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle,
+ (UIntPtr)0xFFFFFFFF,
+ (UIntPtr)0xFFFFFFFF);
+ }
+ }
+
+ public static string UnGzip(byte[] buf)
+ {
+ byte[] buffer = new byte[1024];
+ int n;
+ using (MemoryStream sb = new MemoryStream())
+ {
+ using (GZipStream input = new GZipStream(new MemoryStream(buf),
+ CompressionMode.Decompress,
+ false))
+ {
+ while ((n = input.Read(buffer, 0, buffer.Length)) > 0)
+ {
+ sb.Write(buffer, 0, n);
+ }
+ }
+ return System.Text.Encoding.UTF8.GetString(sb.ToArray());
+ }
+ }
+
+ public static string FormatBandwidth(long n)
+ {
+ var result = GetBandwidthScale(n);
+ return $"{result.value:0.##}{result.unitName}";
+ }
+
+ public static string FormatBytes(long bytes)
+ {
+ const long K = 1024L;
+ const long M = K * 1024L;
+ const long G = M * 1024L;
+ const long T = G * 1024L;
+ const long P = T * 1024L;
+ const long E = P * 1024L;
+
+ if (bytes >= P * 990)
+ return (bytes / (double)E).ToString("F5") + "EiB";
+ if (bytes >= T * 990)
+ return (bytes / (double)P).ToString("F5") + "PiB";
+ if (bytes >= G * 990)
+ return (bytes / (double)T).ToString("F5") + "TiB";
+ if (bytes >= M * 990)
+ {
+ return (bytes / (double)G).ToString("F4") + "GiB";
+ }
+ if (bytes >= M * 100)
+ {
+ return (bytes / (double)M).ToString("F1") + "MiB";
+ }
+ if (bytes >= M * 10)
+ {
+ return (bytes / (double)M).ToString("F2") + "MiB";
+ }
+ if (bytes >= K * 990)
+ {
+ return (bytes / (double)M).ToString("F3") + "MiB";
+ }
+ if (bytes > K * 2)
+ {
+ return (bytes / (double)K).ToString("F1") + "KiB";
+ }
+ return bytes.ToString() + "B";
+ }
+
+ ///
+ /// Return scaled bandwidth
+ ///
+ /// Raw bandwidth
+ ///
+ /// The BandwidthScaleInfo struct
+ ///
+ public static BandwidthScaleInfo GetBandwidthScale(long n)
+ {
+ long scale = 1;
+ float f = n;
+ string unit = "B";
+ if (f > 1024)
+ {
+ f = f / 1024;
+ scale <<= 10;
+ unit = "KiB";
+ }
+ if (f > 1024)
+ {
+ f = f / 1024;
+ scale <<= 10;
+ unit = "MiB";
+ }
+ if (f > 1024)
+ {
+ f = f / 1024;
+ scale <<= 10;
+ unit = "GiB";
+ }
+ if (f > 1024)
+ {
+ f = f / 1024;
+ scale <<= 10;
+ unit = "TiB";
+ }
+ return new BandwidthScaleInfo(f, unit, scale);
+ }
+
+ public static RegistryKey OpenRegKey(string name, bool writable, RegistryHive hive = RegistryHive.CurrentUser)
+ {
+ // we are building x86 binary for both x86 and x64, which will
+ // cause problem when opening registry key
+ // detect operating system instead of CPU
+ if (name.IsNullOrEmpty()) throw new ArgumentException(nameof(name));
+ try
+ {
+ RegistryKey userKey = RegistryKey.OpenBaseKey(hive,
+ Environment.Is64BitOperatingSystem ? RegistryView.Registry64 : RegistryView.Registry32)
+ .OpenSubKey(name, writable);
+ return userKey;
+ }
+ catch (ArgumentException ae)
+ {
+ MessageBox.Show("OpenRegKey: " + ae.ToString());
+ return null;
+ }
+ catch (Exception e)
+ {
+ Logging.LogUsefulException(e);
+ return null;
+ }
+ }
+
+ public static bool IsWinVistaOrHigher()
+ {
+ return Environment.OSVersion.Version.Major > 5;
+ }
+
+ [DllImport("kernel32.dll")]
+ [return: MarshalAs(UnmanagedType.Bool)]
+ private static extern bool SetProcessWorkingSetSize(IntPtr process,
+ UIntPtr minimumWorkingSetSize, UIntPtr maximumWorkingSetSize);
+
+
+ // See: https://msdn.microsoft.com/en-us/library/hh925568(v=vs.110).aspx
+ public static bool IsSupportedRuntimeVersion()
+ {
+ /*
+ * +-----------------------------------------------------------------+----------------------------+
+ * | Version | Value of the Release DWORD |
+ * +-----------------------------------------------------------------+----------------------------+
+ * | .NET Framework 4.6.2 installed on Windows 10 Anniversary Update | 394802 |
+ * | .NET Framework 4.6.2 installed on all other Windows OS versions | 394806 |
+ * +-----------------------------------------------------------------+----------------------------+
+ */
+ const int minSupportedRelease = 394802;
+
+ const string subkey = @"SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full\";
+ using (var ndpKey = OpenRegKey(subkey, false, RegistryHive.LocalMachine))
+ {
+ if (ndpKey?.GetValue("Release") != null)
+ {
+ var releaseKey = (int)ndpKey.GetValue("Release");
+
+ if (releaseKey >= minSupportedRelease)
+ {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+ }
+}
\ No newline at end of file
diff --git a/test/source.css b/test/source.css
new file mode 100644
index 0000000..8214563
--- /dev/null
+++ b/test/source.css
@@ -0,0 +1,61 @@
+
+body {
+ font-family: arial;
+}
+
+h1, p, table {
+ background-color:#CCC;
+ border: 1px solid;
+ color:#39F;
+ text-align: center;
+ width: 100%;
+}
+
+.addon-store .pagehead h1
+.addon-store .addon-summary:after { clear: both }
+
+#addon-store .pagehead .electrocat-small {
+ bottom: -7px;
+ position: absolute;
+ right: 0;
+}
+
+.addon-store .addons-nav a.selected {
+ border-bottom-color: #d26911;
+ color: #333;
+ font-weight: bold;
+ padding: 0 0 14px;
+}
+
+.addon-store .addon-icon {
+ background: #fff;
+ border: 1px solid #ddd;
+ box-shadow: 0 1px 2px rgba(0,0,0,0.15);
+ float: left;
+ height: 80px;
+ margin-right: 14px;
+ width: 80px;
+}
+
+.addon-store .developer-callout {
+ background-color: #f1f1f1;
+ background-image: -moz-linear-gradient(#fafafa, #f1f1f1);
+ background-image: -webkit-linear-gradient(#fafafa, #f1f1f1);
+ background-image: linear-gradient(#fafafa, #f1f1f1);
+ background-repeat: repeat-x;
+ border: 1px solid #ddd;
+ border-bottom: 1px solid #ccc;
+ border-radius: 3px;
+ box-shadow: inset 0 1px 0 #fff, 0 1px 5px #f1f1f1;
+ margin-top: 40px;
+ text-shadow: 0 1px 0 #fff;
+}
+
+.addon-field-editor .addon-field-list, .addon-field-editor .addon-new-field {
+ -moz-box-sizing: border-box;
+ border-radius: 3px;
+ box-sizing: border-box;
+ display: inline-block;
+ text-align: center;
+ width: 595px;
+}
\ No newline at end of file
diff --git a/test/source.csx b/test/source.csx
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.d b/test/source.d
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.do b/test/source.do
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.dot b/test/source.dot
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.erl b/test/source.erl
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.ex b/test/source.ex
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.go b/test/source.go
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.gql b/test/source.gql
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.gradle b/test/source.gradle
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.graphql b/test/source.graphql
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.groovy b/test/source.groovy
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.h b/test/source.h
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.haml b/test/source.haml
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.hs b/test/source.hs
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.html b/test/source.html
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.html.eex b/test/source.html.eex
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.hx b/test/source.hx
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.jade b/test/source.jade
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.java b/test/source.java
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.jl b/test/source.jl
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.json b/test/source.json
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.jsp b/test/source.jsp
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.jsx b/test/source.jsx
new file mode 100644
index 0000000..8337712
--- /dev/null
+++ b/test/source.jsx
@@ -0,0 +1 @@
+//
diff --git a/test/source.less b/test/source.less
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.liquid b/test/source.liquid
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.lisp b/test/source.lisp
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.lsl b/test/source.lsl
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.lua b/test/source.lua
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.m b/test/source.m
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.matlab b/test/source.matlab
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.mjs b/test/source.mjs
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.ml b/test/source.ml
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.mustache b/test/source.mustache
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.note b/test/source.note
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.pcss b/test/source.pcss
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.php b/test/source.php
new file mode 100644
index 0000000..c20c54a
--- /dev/null
+++ b/test/source.php
@@ -0,0 +1,57 @@
+edible = $edible;
+ $this->color = $color;
+ }
+
+ function is_edible()
+ {
+ return $this->edible;
+ }
+
+ function what_color()
+ {
+ return $this->color;
+ }
+
+} // end of class Vegetable
+
+// extends the base class
+class Spinach extends Vegetable {
+
+
+ var $cooked = false;
+
+ function Spinach()
+ {
+ $this->Vegetable(true, "green");
+ }
+
+ function cook_it()
+ {
+ $this->cooked = true;
+ }
+
+ function is_cooked()
+ {
+ return $this->cooked;
+ }
+
+} // end of class Spinach
+
+?>
+
diff --git a/test/source.pl b/test/source.pl
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.postcss b/test/source.postcss
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.pp b/test/source.pp
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.pug b/test/source.pug
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.py b/test/source.py
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.r b/test/source.r
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.rails b/test/source.rails
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.rb b/test/source.rb
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.re b/test/source.re
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.rei b/test/source.rei
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.rs b/test/source.rs
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.sass b/test/source.sass
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.scala b/test/source.scala
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.scss b/test/source.scss
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.slim b/test/source.slim
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.sql b/test/source.sql
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.styl b/test/source.styl
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.swift b/test/source.swift
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.swig b/test/source.swig
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.tcl b/test/source.tcl
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.tex b/test/source.tex
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.textile b/test/source.textile
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.ts b/test/source.ts
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.twig b/test/source.twig
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.vue b/test/source.vue
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.xml b/test/source.xml
new file mode 100644
index 0000000..e69de29
diff --git a/test/source.yml b/test/source.yml
new file mode 100644
index 0000000..e69de29
diff --git a/test/sublime.sublime-settings b/test/sublime.sublime-settings
new file mode 100644
index 0000000..e69de29
diff --git a/test/text.md b/test/text.md
new file mode 100644
index 0000000..e69de29
diff --git a/test/text.txt b/test/text.txt
new file mode 100644
index 0000000..e69de29
diff --git a/test/windows.bat b/test/windows.bat
new file mode 100644
index 0000000..e69de29
diff --git a/test/windows.cmd b/test/windows.cmd
new file mode 100644
index 0000000..e69de29
diff --git a/test/yarn.lock b/test/yarn.lock
new file mode 100644
index 0000000..e69de29
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 0000000..7c6e2b7
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,22 @@
+{
+ "compilerOptions": {
+ "lib": [
+ "es2015"
+ ],
+ "module": "commonjs",
+ "allowUnreachableCode": false,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "noImplicitAny": true,
+ "sourceMap": true,
+ "target": "es6"
+ },
+ "include": [
+ "./**/*",
+ "./.gulp/**/*"
+ ],
+ "exclude": [
+ "node_modules",
+ "out"
+ ]
+}
\ No newline at end of file
diff --git a/typings/gulp-bump/gulp-bump.d.ts b/typings/gulp-bump/gulp-bump.d.ts
new file mode 100644
index 0000000..2ddc86a
--- /dev/null
+++ b/typings/gulp-bump/gulp-bump.d.ts
@@ -0,0 +1,7 @@
+declare module "gulp-bump" {
+ function gulpBump (... args: any[]): any;
+
+ namespace gulpBump {}
+
+ export = gulpBump;
+}
\ No newline at end of file
diff --git a/typings/gulp-conventional-changelog/gulp-conventional-changelog.d.ts b/typings/gulp-conventional-changelog/gulp-conventional-changelog.d.ts
new file mode 100644
index 0000000..5718744
--- /dev/null
+++ b/typings/gulp-conventional-changelog/gulp-conventional-changelog.d.ts
@@ -0,0 +1,5 @@
+declare module "gulp-conventional-changelog" {
+ function changelog(... args: any[]): any;
+ namespace changelog {}
+ export = changelog;
+}
\ No newline at end of file
diff --git a/typings/gulp-stats/gulp-stats.d.ts b/typings/gulp-stats/gulp-stats.d.ts
new file mode 100644
index 0000000..4622b92
--- /dev/null
+++ b/typings/gulp-stats/gulp-stats.d.ts
@@ -0,0 +1,5 @@
+declare module "gulp-stats" {
+ function gulpStats(... args: any[]): any;
+ namespace gulpStats {}
+ export = gulpStats;
+}
\ No newline at end of file