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 @@ + +

+ +[![Twitter](https://img.shields.io/twitter/url/https/github.com/equinusocio/vsc-material-theme.svg?style=flat-square)](https://twitter.com/intent/tweet?text=This%20is%20the%20most%20epic%20theme:&url=https%3A%2F%2Fgithub.com%2Fequinusocio%2Fvsc-material-theme) +[![GitHub tag](https://img.shields.io/github/release/equinusocio/vsc-material-theme.svg?style=flat-square)](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